{"id":49829486,"url":"https://github.com/Cxsmo-ai/Ascend-Media-RPC","last_synced_at":"2026-05-30T10:00:38.729Z","repository":{"id":329675099,"uuid":"1120347849","full_name":"Cxsmo-ai/Ascend-Media-RPC","owner":"Cxsmo-ai","description":"Ascend Media RPC is a Discord RPC and Auto Intro Skip Windows GUI for Stremio/Wako Android TV","archived":false,"fork":false,"pushed_at":"2026-05-16T01:28:49.000Z","size":32774,"stargazers_count":14,"open_issues_count":0,"forks_count":1,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-16T02:53:19.400Z","etag":null,"topics":["adb","android-tv","automation","discord-presence","discord-rpc","media-tracking","python","rich-presence","stremio","wako"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Cxsmo-ai.png","metadata":{"files":{"readme":"README.md","changelog":"History.png","contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-12-21T02:34:33.000Z","updated_at":"2026-05-16T01:28:53.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/Cxsmo-ai/Ascend-Media-RPC","commit_stats":null,"previous_names":["cxsmo-ai/stremio-ascend"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/Cxsmo-ai/Ascend-Media-RPC","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Cxsmo-ai%2FAscend-Media-RPC","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Cxsmo-ai%2FAscend-Media-RPC/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Cxsmo-ai%2FAscend-Media-RPC/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Cxsmo-ai%2FAscend-Media-RPC/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Cxsmo-ai","download_url":"https://codeload.github.com/Cxsmo-ai/Ascend-Media-RPC/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Cxsmo-ai%2FAscend-Media-RPC/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33687722,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-05-30T02:00:06.278Z","response_time":92,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["adb","android-tv","automation","discord-presence","discord-rpc","media-tracking","python","rich-presence","stremio","wako"],"created_at":"2026-05-13T20:00:48.386Z","updated_at":"2026-05-30T10:00:38.716Z","avatar_url":"https://github.com/Cxsmo-ai.png","language":"Python","funding_links":[],"categories":["automation"],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n# Ascend Media RPC\n\n### Discord Rich Presence, Android TV ADB telemetry, desktop client support, Smart Skip, and premium artwork for Stremio \u0026 Wako\n\n![Ascend Media RPC Logo](src/web/static/logo.png)\n\n![Platform](https://img.shields.io/badge/platform-Windows%20%7C%20Linux%20%7C%20Docker-blue)\n![Python](https://img.shields.io/badge/python-3.x-yellow)\n![Android TV](https://img.shields.io/badge/Android%20TV-supported-green)\n![Discord RPC](https://img.shields.io/badge/Discord-Rich%20Presence-5865F2)\n![Dashboard](https://img.shields.io/badge/dashboard-localhost%3A5466-purple)\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://www.deepbrid.com/aff/go/pickymarker4906?i=4\"\u003e\n    \u003cimg src=\"https://www.deepbrid.com/file/get/path/banners.5ea0998723b53/i/236387\" alt=\"Deepbrid Banner\" width=\"728\"\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\n\n**Ascend Media RPC** connects Android TV playback over built-in ADB tooling, plus supported desktop clients, to Discord Rich Presence.\n\nShow what you are watching from **Stremio** or **Wako** directly on Discord with live titles, artwork, playback progress, timestamps, custom branding, Smart Skip status, and a real-time local telemetry dashboard.\n\n## \u003ca name=\"dashboard-showcase\"\u003e\u003c/a\u003e🖥️ Dashboard Showcase\n\n| **Main Dashboard** | **Device Connections** | **Global Settings** |\n|:---:|:---:|:---:|\n| ![Dashboard](./Dashboard.png) | ![Connections](./Connections.png) | ![Settings](./Settings.png) |\n\n| **Playback History** | **Live Analytics** | **Trakt Integration** |\n|:---:|:---:|:---:|\n| ![History](./History.png) | ![Analytics](./Analytics.png) | ![Trakt](./Trakt.png) |\n\n\u003e [!TIP]\n\u003e The dashboard is fully responsive and can be accessed from any device on your network to control your RPC in real-time.\n\n\u003c/div\u003e\n\n---\n\n## Table of Contents\n\n- [What Is Ascend Media RPC?](#what-is-ascend-media-rpc)\n- [Dashboard Showcase](#dashboard-showcase)\n- [Discord Community](#discord-community)\n- [What Does RPC Mean?](#what-does-rpc-mean)\n- [Core Features](#core-features)\n- [How It Works](#how-it-works)\n- [Artwork Examples](#artwork-examples)\n- [Animated Network Icons with Nuvio](#animated-network-icons-with-nuvio)\n- [Requirements](#requirements)\n- [Quick Start](#quick-start)\n- [Installation](#installation)\n- [What run.bat Does](#what-runbat-does)\n- [CLI and Headless Mode](#cli-and-headless-mode)\n- [Best Discord Visuals with Vencord](#best-discord-visuals-with-vencord)\n- [Docker Deployment](#docker-deployment)\n- [Remote Setup (Tailscale)](#remote-setup-tailscale)\n- [Android TV Setup](#android-tv-setup)\n- [Connection Methods](#connection-methods)\n- [Configuration](#configuration)\n- [Example config.json](#example-configjson)\n- [API Keys and Providers](#api-keys-and-providers)\n- [API Integrations](#api-integrations)\n- [Using with Stremio](#using-with-stremio)\n- [Using with Wako](#using-with-wako)\n- [Dashboard](#dashboard)\n- [Smart Skip Pipeline](#smart-skip-pipeline-1)\n- [Skipit Setup Guide](#skipit-setup-guide)\n- [Analytics](#analytics-1)\n- [Plugin System](#plugin-system)\n- [Privacy and Security](#privacy-and-security)\n- [Customization](#customization)\n- [Troubleshooting](#troubleshooting)\n- [API Reference](#api-reference)\n- [Built With](#built-with)\n- [Credits](#credits)\n- [Disclaimer](#disclaimer)\n- [Support](#support)\n\n---\n\n## Best Discord Visuals with Vencord\n\nAscend Media RPC can update normal Discord Rich Presence on the standard Discord desktop app, but the richest and cleanest activity layout is designed for the bundled Ascend Vencord/Equicord build.\n\nUse this when you want the activity to look its best:\n\n- Correct Stremio/Wako activity naming instead of generic app labels\n- Cleaner pause/play state display\n- Better visual formatting for details, state, and timestamps\n- Support for Discord Stable, PTB, Canary, Development, or a custom Discord install folder\n- Easy custom plugin management through `plugins.txt` and `local_plugins`\n\n### Install the Ascend Vencord build\n\n1. Install **Git** and **Node.js LTS** if you do not already have them.\n2. Open the bundled installer:\n\n```bat\nvencord_installer\\run.bat\n```\n\n3. Click **Check Requirements**.\n4. If pnpm is missing, click **Install / Repair pnpm**.\n5. Select the Discord client you use: Stable, PTB, Canary, Development, or a custom folder.\n6. Click **Build + Inject**.\n7. Restart Discord with `Ctrl+R` after the installer finishes.\n\n### Enable BetterStremioActivity\n\nAfter Discord restarts:\n\n1. Open Discord **User Settings**.\n2. Open **Vencord/Equicord Plugins**.\n3. Search for `BetterStremioActivity`.\n4. Enable it.\n5. Make sure Discord **Activity Sharing** / **Display current activity as a status message** is enabled.\n\n\u003e [!IMPORTANT]\n\u003e Ascend Media RPC will still work without this plugin, but the RPC may not look correct. For the intended rich layout, install the bundled Vencord/Equicord build and enable `BetterStremioActivity`.\n\n### Add your own plugins\n\nThe installer supports custom plugins without editing the Python GUI:\n\n- Add Git plugin URLs to `vencord_installer\\plugins.txt`, one URL per line.\n- Put local plugin folders in `vencord_installer\\local_plugins\\`.\n- Rerun `vencord_installer\\run.bat`, then click **Build + Inject** again.\n\nThe bundled `BetterStremioActivity` plugin is always copied from:\n\n```txt\nvencord_installer\\bundled_plugins\\betterStremioActivity\n```\n\n---\n\n## What Is Ascend Media RPC?\n\n**Ascend Media RPC** is a local application that bridges Android TV ADB playback telemetry and supported desktop clients with **Discord Rich Presence**.\n\nWhen you play something in **Stremio** or **Wako** on Android TV, or a supported local desktop client, Ascend Media RPC detects the playback activity, enriches it with metadata and artwork, and updates your Discord status in real time.\n\nIt can display:\n\n- Movie, show, season, and episode information\n- Playback state\n- Elapsed or remaining time\n- Posters, backdrops, season art, and episode thumbnails\n- Custom Discord branding text\n- Small playback, app, network, or device icons\n- Smart Skip status with 8 skip providers\n- Real-time telemetry in a local browser dashboard\n- Watch history and analytics\n- Integration status for 9+ connected services\n\nAscend Media RPC runs on **Windows** natively, and on **Linux** or any platform via **Docker** or **headless mode**.\n\n---\n\n## Discord Community\n\nNeed help, want updates, or want to hang out around the broader Cxsmo-ai projects?\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://DeepAscension.net\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/Main%20Site-DeepAscension.net-00D4FF?style=for-the-badge\u0026logo=googlechrome\u0026logoColor=white\" alt=\"Visit DeepAscension.net\"\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://discord.gg/njSKPUQtFa\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/Discord-Share%20Your%20DFM%20Live-5865F2?style=for-the-badge\u0026logo=discord\u0026logoColor=white\" alt=\"Join the Share Your DFM Live Discord server\"\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://throne.com/cxsmo\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/Support-throne.com%2Fcxsmo-1F8ACB?style=for-the-badge\u0026logo=githubsponsors\u0026logoColor=white\" alt=\"Support through throne.com/cxsmo\"\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\nMain site:\n\n```txt\nhttps://DeepAscension.net\n```\n\nSupport site:\n\n```txt\nhttps://throne.com/cxsmo\n```\n\nJoin the Discord for project support, release updates, setup help, and community discussion:\n\n```txt\nhttps://discord.gg/njSKPUQtFa\n```\n\n---\n\n## What Does RPC Mean?\n\nIn this project, **RPC** means:\n\n```txt\nRich Presence Client\n```\n\nA Rich Presence Client connects to Discord and updates your profile activity with live, detailed information.\n\nInstead of Discord only showing that you are online, Ascend Media RPC can show what you are currently watching.\n\nExample Discord status:\n\n```txt\nWatching Interstellar\n1h 12m remaining\non Stremio\n```\n\nFlow:\n\n```txt\nStremio / Wako\n      |\nAscend Media RPC\n      |\nDiscord Rich Presence\n```\n\nOfficial Discord Rich Presence documentation:\n\n```txt\nhttps://docs.discord.com/developers/platform/rich-presence\n```\n\n---\n\n## Core Features\n\n### Android TV Telemetry\n\n- Built-in ADB tooling — no manual ADB installation required\n- Auto IP scanning and mDNS/Zeroconf device discovery\n- Dashboard-based device scanner with manual IP fallback\n- Android TV, Google TV, NVIDIA Shield, and Chromecast with Google TV support\n- Stremio and Wako playback detection\n- Playback state and progress tracking\n- Device reconnect support\n- Multi-device management\n- ADB command deduplication and retry logic\n- First-time debugging permission support\n\n---\n\n### Desktop Client Support\n\n- Supported local desktop clients can feed playback state without an Android TV\n- Stremio desktop/enhanced detection for local playback workflows\n- Desktop mode can run alongside Android TV ADB mode, so users can choose the source that fits their setup\n\n---\n\n### Discord Rich Presence\n\n- Live Discord activity updates for movies and TV shows\n- Season and episode display\n- Custom branding text\n- Elapsed or remaining time display\n- Poster, backdrop, season, and episode thumbnail artwork\n- Best visual layout with the Ascend Vencord/Equicord build and bundled BetterStremioActivity plugin\n- Small icon modes: playback state, app, network, device, animated Nuvio GIFs\n- Status message cycling with configurable interval\n- Dynamic button URLs\n- Multi-activity support\n- Privacy mode (hides what you are watching)\n- RPC history logging\n- Profanity filter\n- Multi-Discord account support\n\n\u003e [!IMPORTANT]\n\u003e Ascend Media RPC can send normal Discord Rich Presence, but the activity is designed to look correct with the Ascend Vencord/Equicord build. Use the bundled installer in `vencord_installer\\run.bat` and enable `BetterStremioActivity` for the intended Stremio/Wako activity naming, pause state, and rich visual layout.\n\n---\n\n### Real-Time Local Dashboard\n\nAscend Media RPC includes a local web dashboard with 7 tabs for monitoring and control.\n\nDefault URL:\n\n```txt\nhttp://localhost:5466\n```\n\n**Dashboard tabs:**\n\n| Tab | Description |\n| :--- | :--- |\n| **Dashboard** | Connection status, playback info, artwork preview, live log, skip HUD |\n| **Connections** | API keys, skip sources with priority reordering, pipeline sandbox, 9 integration cards |\n| **Settings** | Appearance, RPC customization, privacy, config management, device management, setup wizard |\n| **History** | Watch history and session log |\n| **Analytics** | Watch stats, top genres, peak hours heatmap, streaks, search |\n| **Debug** | Audit log viewer, skip cache stats, system health, plugins |\n| **Trakt** | Trakt OAuth login and scrobbling status |\n\nDashboard features:\n\n- Toast notification system (replaces alert dialogs)\n- Sidebar navigation with icon tooltips\n- Config export and import (JSON)\n- Multi-step onboarding wizard (6 steps: Welcome, ADB, Discord, TMDB, Artwork, Skip)\n- Dark/light/OLED theme toggle with custom accent colors\n- Optional PIN-based authentication\n- Optional HTTPS support\n- Live SSE event stream with real-time UI updates\n- Browser push notifications\n- Glassmorphism UI with gradient accents and staggered animations\n\n---\n\n### Artwork Engine\n\nMulti-source artwork system for Discord and dashboard visuals.\n\nSupported artwork types:\n\n- Movie and TV show posters\n- Season posters and episode thumbnails\n- Backdrops and logos\n- Rating badges and provider-enhanced posters\n\nArtwork providers:\n\n- **EasyRatingsDB** — rating overlays, generated posters\n- **Top Posters** — modern streaming-style posters\n- **TMDB** — fallback artwork\n- **FanArt.tv** — high-quality fan-made artwork (posters, backgrounds, logos)\n- **Nuvio** — animated network GIF icons\n\nConfigurable fallback chain with drag-and-drop reordering in the dashboard:\n\n```json\n\"artwork_fallback_chain\": [\"tmdb\", \"fanart\", \"tvdb\"]\n```\n\n---\n\n### \u003ca name=\"smart-skip-pipeline-1\"\u003e\u003c/a\u003eSmart Skip Pipeline\n\n9-provider skip segment pipeline with priority ordering, category-aware conflict resolution, and TTL caching.\n\n**Supported skip providers:**\n\n| # | Provider | Description |\n| :--- | :--- | :--- |\n| 1 | **IntroDB.app** | Intro and outro timestamps |\n| 2 | **TheIntroDB.org (TIDB)** | Intro, recap, credits, preview, filler segments |\n| 3 | **Remote JSON** | Custom skip database from a remote URL |\n| 4 | **VideoSkip.org** | Mature content filters (sex, violence, profanity) |\n| 5 | **NotScare.me (Major)** | Major jump scare timestamps |\n| 6 | **NotScare.me (Minor)** | Minor jump scare timestamps |\n| 7 | **AniSkip** | Anime opening and ending skip segments |\n| 8 | **SkipMe.db** | Community skip database |\n| 9 | **Skipit (getskipit.com)** | Premium community-driven skip database with auto-refreshing authentication |\n\nFeatures:\n\n- Individual enable/disable toggles per provider\n- Drag-to-reorder priority in the dashboard\n- Cloudflare bypass via cloudscraper for TIDB and NotScare\n- Category-aware conflict resolution\n- TTL-based skip segment cache (thread-safe)\n- Pipeline Sandbox in dashboard for testing\n\n---\n\n### Skipit Setup Guide\n\n**Skip Me** (Skipit) requires specific authentication tokens that must be retrieved from your browser while logged in to their website.\n\n#### **How to get your Skipit Credentials:**\n\n1.  **Login:** Go to [getskipit.com](https://getskipit.com) and log in to your account.\n2.  **Open DevTools:** Press `F12` (or `Ctrl+Shift+I`) to open your browser's Developer Tools.\n3.  **Find the Frontend API:**\n    *   Go to the **Network** tab.\n    *   Refresh the page.\n    *   Look for a request starting with `clerk.` (e.g., `clerk.getskipit.com`).\n    *   The domain you see here is your **`skipit_frontend_api`**.\n4.  **Find the Tokens:**\n    *   Go to the **Application** tab (Chrome/Edge) or **Storage** tab (Firefox).\n    *   In the sidebar, look under **Cookies** -\u003e `https://getskipit.com`.\n    *   Copy the value of the **`__client_uat`** cookie. This is your **`skipit_token`**.\n    *   Copy the value of the **`__session`** cookie. This is your **`skipit_session_cookie`**.\n5.  **Find the Session ID:**\n    *   Go back to the **Network** tab in DevTools.\n    *   Look for any request to the clerk API (e.g. `clerk.getskipit.com/v1/client`).\n    *   In the **Response** (JSON), look for the `\"last_active_session_id\"` field.\n    *   This string (starting with `sess_`) is your **`skipit_session_id`**.\n\n**Enter these 4 values into the Ascend RPC Dashboard or `config.json` to enable high-priority community skips!**\n\n---\n\n### NotScare Support\n\nJump scare detection for horror content via notscare.me.\n\n- Major and Minor severity levels\n- Episode slicing from full season pages\n- Cloudflare bypass via cloudscraper\n- Dashboard HUD alerts\n\n---\n\n### 9 API Integrations\n\nAll manageable from the dashboard Connections tab. Integrations auto-scrobble and sync during active playback — toggling an integration ON actually calls its API methods in the main playback loop.\n\n| Integration | Description |\n| :--- | :--- |\n| **AniList** | Track anime progress and sync watchlist |\n| **Simkl** | Sync watch history across platforms |\n| **Kitsu** | Connect to the Kitsu anime community |\n| **Letterboxd** | Log movies to your diary as you watch |\n| **Last.fm** | Scrobble soundtrack info |\n| **JustWatch** | Find where content is streaming |\n| **OpenSubtitles** | Find and fetch subtitles |\n| **Plex / Jellyfin / Emby** | Media server connections |\n| **Notion / Obsidian** | Watch journals and note logging |\n\n---\n\n### Trakt Social\n\nExtended Trakt features beyond basic scrobbling:\n\n- **Collection Sync** — auto-add watched content to your Trakt collection\n- **Friends Watching** — see what your Trakt friends are watching right now\n- **Calendar** — upcoming episodes from your watchlist\n- **Check-In** — auto check-in to Trakt when watching\n- **Recommendations** — get personalized recommendations\n- **Ratings** — rate content during or after watching\n- **Stats** — view your Trakt watch statistics\n\n---\n\n### Analytics\n\nLocal SQLite-backed watch analytics:\n\n- Total watch time, session counts, average session duration\n- Top genres breakdown\n- Peak watch hours (24-hour heatmap)\n- Watch streak tracking\n- Total skips count\n- Session search\n- Auto-migration from legacy JSON format\n- **Skip provider analytics** — per-provider success rates and hit counts\n- **Skip category breakdown** — stats per category (intro, outro, recap, etc.)\n- **Weekly reports** — aggregated watch statistics for the past 7 days\n- **Monthly reports** — aggregated watch statistics for the past 30 days\n- **Shareable stats cards** — generate PNG images of your watch statistics (Spotify Wrapped style)\n- **Watch history filter** — filter by status (all, completed, in progress, abandoned)\n- **Per-show grouping** — group watch history entries by show title\n\n---\n\n### Core Modules\n\n| Module | Description |\n| :--- | :--- |\n| audit_log.py | Config change and auth event logging with sensitive key masking |\n| skip_cache.py | Thread-safe TTL cache for skip segments |\n| rpc_history.py | RPC activity history with SQLite storage |\n| api_validator.py | API key validation against provider endpoints |\n| config_watcher.py | File system watcher for config hot-reload |\n| plugin_system.py | Abstract base classes and registry for extending functionality |\n| stats_card_generator.py | Shareable PNG stats card generation (requires Pillow, optional) |\n| integrations/fanart.py | FanArt.tv high-quality artwork client |\n\n---\n\n## How It Works\n\n```txt\nAndroid TV / Google TV\n        |\nStremio or Wako playback\n        |\nAscend Media RPC built-in ADB tooling\n        |\nPlayback and app telemetry\n        |\nMetadata, artwork, ratings, and skip providers\n        |\nDiscord Rich Presence + Dashboard + Analytics + Integrations\n```\n\nAscend Media RPC runs locally on your PC and communicates with your Android TV over your local network using built-in ADB tooling. You do **not** need to manually install ADB or run ADB commands.\n\nAscend Media RPC can:\n\n1. Scan your local network for Android TV devices (IP scan + mDNS/Zeroconf)\n2. Connect automatically using Auto IP mode\n3. Detect Stremio or Wako playback\n4. Fetch metadata and artwork from supported providers\n5. Fetch skip segments from 8 providers simultaneously\n6. Update Discord Rich Presence\n7. Display live telemetry in the local dashboard\n8. Log watch history and analytics\n9. Sync with connected integrations (Trakt, AniList, Last.fm, etc.)\n\n---\n\n## Artwork Examples\n\nAscend Media RPC can use premium artwork providers to create cleaner, richer visuals for Discord Rich Presence and the local dashboard.\n\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003ctd align=\"center\"\u003e\n      \u003cstrong\u003eEasyRatingsDB Example\u003c/strong\u003e\n    \u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\n      \u003cstrong\u003eTop Posters Example\u003c/strong\u003e\n    \u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=\"center\"\u003e\n      \u003cimg src=\"./ERDB%20Example.png\" alt=\"EasyRatingsDB artwork example\" width=\"550\"\u003e\n    \u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\n      \u003cimg src=\"./Top%20Poster%20Example.png\" alt=\"Top Posters artwork example\" width=\"550\"\u003e\n    \u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n---\n\n## Animated Network Icons with Nuvio\n\nAscend Media RPC can use Nuvio community GIF covers as animated Discord small icons for streaming networks (Netflix, Paramount+, Prime Video, Hulu, Disney+, HBO Max, etc.).\n\nDemo animated WebP:\n\n\u003cimg src=\"./Animated%20network%20icons.webp\" alt=\"Animated network icons demo\" width=\"720\"\u003e\n\nLinks:\n\n```txt\nhttps://nuvioapp.space/\nhttps://nuvioapp.space/covers?format=gif\u0026sort=popular\n```\n\nSetup:\n\n1. Sign up or sign in at Nuvio.\n2. Open the Ascend Media RPC dashboard.\n3. Set the small icon mode to the Nuvio network GIF option.\n4. Enable Nuvio Network GIFs.\n5. Enter your Nuvio email and password.\n6. Save settings.\n\nNotes:\n\n- 401 in the log means the Nuvio login failed or expired.\n- If no animated GIF is found, Ascend Media RPC falls back to a static network logo.\n- wsrv.nl is used for static PNG resizing only. Animated GIFs are handled without wsrv.nl.\n\n---\n\n## Requirements\n\n- Windows PC, Linux machine, or Docker environment\n- Discord desktop app installed and running (for RPC features)\n- Android TV, Google TV, NVIDIA Shield, Chromecast with Google TV, or another Android-based streaming device\n- Stremio or Wako installed on the Android TV, or a supported desktop client on the host machine\n- PC and Android TV on the same local network\n- Developer Options and ADB/Network/Wireless Debugging enabled on the Android TV\n- Python 3.x (if running without Docker)\n- Optional API keys for artwork, metadata, ratings, and skip features\n\n\u003e You do **not** need to manually install ADB. Ascend Media RPC includes its own ADB tooling.\n\n---\n\n## Quick Start\n\n1. Download or clone this repository.\n2. Install dependencies:\n\n```bash\npip install -r requirements.txt\n```\n\n3. Enable Developer Options on your Android TV.\n4. Enable ADB, Network Debugging, or Wireless Debugging.\n5. Open config.json and configure your settings.\n6. Run the app:\n\n**Windows:**\n\n```\nrun.bat\n```\n\n**Any platform (headless):**\n\n```bash\npython start_gui.py --headless\n```\n\n**Docker:**\n\n```bash\ndocker compose up -d\n```\n\n7. Open the dashboard:\n\n```\nhttp://localhost:5466\n```\n\n8. Connect to your Android TV and start playback.\n\n---\n\n## Installation\n\n### Option 1: Download ZIP\n\n1. Click **Code** then **Download ZIP**\n2. Extract the ZIP\n3. Install dependencies:\n\n```bash\npip install -r requirements.txt\n```\n\n4. Edit config.json\n5. Double-click run.bat\n\n### Option 2: Clone with Git\n\n```bash\ngit clone https://github.com/Cxsmo-ai/Ascend-Media-RPC.git\ncd Ascend-Media-RPC\npip install -r requirements.txt\n```\n\nEdit config.json, then run run.bat or python start_gui.py --headless.\n\n### Option 3: Docker\n\nSee the [Docker](#docker) section below.\n\n---\n\n## What run.bat Does\n\nrun.bat is the main launcher for Ascend Media RPC on Windows. It prepares the local environment, installs dependencies, starts the controller, connects to your Android TV via built-in ADB tooling, starts Discord Rich Presence updates, and serves the local dashboard.\n\n---\n\n## CLI and Headless Mode\n\nAscend Media RPC supports CLI arguments and a headless mode for running without a GUI.\n\n```bash\npython start_gui.py [options]\n```\n\n| Flag | Description | Example |\n| :--- | :--- | :--- |\n| --headless | Run without GUI (Flask API only) | python start_gui.py --headless |\n| --config PATH | Use a custom config file | python start_gui.py --config /path/to/config.json |\n| --port PORT | Override dashboard port | python start_gui.py --port 8080 |\n| --host HOST | Override ADB host address | python start_gui.py --host 192.168.1.50 |\n\nHeadless mode is useful for Linux servers, Docker containers, and environments without a display.\n\nEnvironment variables also work:\n\n```bash\nHEADLESS=1 python start_gui.py\n```\n\n---\n\n## Docker\n\nAscend Media RPC includes Docker support for containerized deployment. Published images are available at:\n\n```txt\nghcr.io/cxsmo-ai/ascend-media-rpc:latest\n```\n\n### Docker Compose (recommended)\n\n```bash\ndocker compose up -d\n```\n\nThe docker-compose.yml includes:\n\n- Health checks every 30 seconds\n- Automatic restart on failure\n- Host network mode (required for ADB and Discord IPC)\n- Volume mount for persistent config\n- The GHCR image URL plus a local build fallback for development\n\n### Manual Docker build\n\n```bash\ndocker build -t ascend-media-rpc .\ndocker run -d --network host --name ascend-rpc ascend-media-rpc\n```\n\nThe container uses Python 3.11 slim, runs in headless mode by default, serves the dashboard on port 5466, and includes a health check at /api/health.\n\n### Docker environment variables\n\n| Variable | Description | Default |\n| :--- | :--- | :--- |\n| HEADLESS | Run in headless mode | 1 |\n| GUI_MODE | UI mode | browser |\n| ASCEND_PORT | Dashboard port override | — |\n| DASHBOARD_PORT | Compose-friendly dashboard port override | 5466 |\n| ASCEND_ADB_HOST | ADB host override | — |\n| ADB_HOST | Compose-friendly ADB host override | — |\n| ASCEND_CONFIG_PATH | Config file path override | — |\n| DASHBOARD_PUBLIC_BASE_URL | Public dashboard URL shown to integrations | http://localhost:5466 |\n\n\u003e **Note:** `network_mode: host` is required for ADB device communication and Discord IPC on Linux hosts. Open `http://localhost:5466` after the container starts, or change `DASHBOARD_PORT`/`ASCEND_PORT` if you need another port.\n\n---\n\n## Android TV Setup\n\nAscend Media RPC needs Android TV debugging enabled so it can communicate with your device locally. You do **not** need to type ADB commands manually.\n\n### Step 1: Enable Developer Options\n\nOn your Android TV:\n\n1. Open **Settings**\n2. Go to **System**, **Device Preferences**, or **About**\n3. Find **Android TV OS build** or **Build number**\n4. Click it about **7 times**\n5. You should see: You are now a developer!\n\n### Step 2: Enable Debugging\n\nGo to Settings then System then Developer options and enable whichever debugging option your device provides (ADB debugging, Network debugging, or Wireless debugging).\n\n### Step 3: Accept the First-Time Permission Prompt\n\nThe first time Ascend Media RPC connects, your Android TV will show a permission prompt. Select **Always allow from this computer**, then **Allow**.\n\n---\n\n## Connection Methods\n\nAscend Media RPC can connect to your Android TV in four ways:\n\n### Method 1: Auto IP Mode\n\n```json\n\"auto_ip\": true\n```\n\nScans your local network for compatible Android TV devices and connects automatically. Easiest option for most setups.\n\n### Method 2: mDNS/Zeroconf Discovery\n\n```json\n\"mdns_discovery_enabled\": true\n```\n\nUses Zeroconf to find Android TV devices broadcasting _adb._tcp services. Faster and more reliable than IP scanning on some networks.\n\n### Method 3: Dashboard Device Scanner\n\nOpen the dashboard at http://localhost:5466 and use the built-in scanner to find and select your device.\n\n### Method 4: Manual IP Fallback\n\nFind your Android TV IP in Settings then Network \u0026 Internet, then set:\n\n```json\n\"adb_host\": \"192.168.1.50\"\n```\n\n---\n\n## Configuration\n\nAscend Media RPC uses a single **config.json** file in the project root. All settings are managed from this one file — there is no second config file. The Python module src/core/config.py is the code that loads, saves, and validates config.json.\n\nThe config is organized into 12 labeled sections:\n\n1. **ADB / Device Connection** — host, port, retry, mDNS, multi-device\n2. **Metadata Providers** — TMDB, MAL API keys and rate limits\n3. **Discord RPC** — branding, icons, buttons, cycling, history, privacy\n4. **Skip Providers** — provider toggles, priority order, cache settings\n5. **Artwork \u0026 Covers** — provider, fallback chain, Top Posters, ERDB, Nuvio\n6. **Wako Mode** — Wako-specific detection settings\n7. **API Integrations — Tracking** — AniList, Simkl, Kitsu, Letterboxd, Last.fm\n8. **API Integrations — Discovery** — JustWatch, OpenSubtitles\n9. **API Integrations — Media Servers** — Plex, Jellyfin, Emby\n10. **API Integrations — Journals** — Notion, Obsidian\n11. **Privacy \u0026 Security** — privacy mode, dashboard auth, blacklist\n12. **Dashboard \u0026 System** — port, HTTPS, headless, rate limiting, audit log, health check\n\nConfig features:\n\n- **Validation** — warns about invalid values and unknown keys\n- **Export** — export config as JSON (sensitive keys excluded)\n- **Import** — import config from JSON, merged with current config\n- **Hot-reload** — watch config file for changes and reload automatically (config_hot_reload: true)\n- **Schema validation** — validates config keys against the default schema\n- **Migration** — automatically migrates legacy key names\n\n---\n\n## Example config.json\n\n```json\n{\n    \"auto_ip\": true,\n    \"adb_host\": \"\",\n    \"adb_port\": 5555,\n    \"dashboard_port\": 5466,\n\n    \"tmdb_api_key\": \"YOUR_TMDB_API_KEY\",\n    \"mal_client_id\": \"YOUR_MAL_CLIENT_ID\",\n    \"erdb_token\": \"YOUR_ERDB_TOKEN\",\n    \"top_posters_api_key\": \"YOUR_TOP_POSTERS_API_KEY\",\n\n    \"discord_client_id\": \"\",\n    \"rpc_branding\": \"on Stremio\",\n    \"rpc_large_image_mode\": \"season\",\n    \"rpc_small_icon_mode\": \"content_network_gif\",\n    \"rpc_time_display\": \"remaining\",\n\n    \"nuvio_covers_enabled\": true,\n    \"nuvio_covers_email\": \"you@example.com\",\n    \"nuvio_covers_password\": \"YOUR_NUVIO_PASSWORD\",\n\n    \"introdb_enabled\": true,\n    \"tidb_enabled\": true,\n    \"videoskip_enabled\": true,\n    \"notscare_major_enabled\": true,\n    \"notscare_minor_enabled\": true,\n    \"aniskip_enabled\": false,\n    \"skipme_enabled\": true,\n\n    \"wako_mode\": false,\n\n    \"anilist_enabled\": false,\n    \"simkl_enabled\": false,\n    \"kitsu_enabled\": false,\n    \"letterboxd_enabled\": false,\n    \"lastfm_enabled\": false,\n    \"justwatch_enabled\": false,\n    \"opensubtitles_enabled\": false,\n    \"plex_enabled\": false,\n    \"jellyfin_enabled\": false,\n    \"emby_enabled\": false,\n    \"notion_enabled\": false,\n    \"obsidian_enabled\": false,\n\n    \"privacy_mode\": false,\n    \"dashboard_auth_enabled\": false,\n    \"audit_log_enabled\": true,\n    \"config_hot_reload\": false\n}\n```\n\n---\n\n## API Keys and Providers\n\nAPI keys are optional but unlock better artwork, metadata, ratings, and skip features. You do not need every key for Ascend Media RPC to launch.\n\n### TMDB API Key\n\nTMDB provides movie/show metadata and fallback artwork.\n\n```json\n\"tmdb_api_key\": \"YOUR_TMDB_API_KEY\"\n```\n\nGet your key at: https://www.themoviedb.org/settings/api\n\n### EasyRatingsDB Token\n\nEasyRatingsDB provides generated artwork with rating overlays.\n\n```json\n\"erdb_token\": \"YOUR_ERDB_TOKEN\"\n```\n\nGet your token at: https://easyratingsdb.com/configurator\n\n### Top Posters API Key\n\nTop Posters provides modern streaming-style posters with rating badges.\n\n```json\n\"top_posters_api_key\": \"YOUR_TOP_POSTERS_API_KEY\"\n```\n\nGet your key at: https://api.top-streaming.stream/user/register\n\n### Nuvio (Animated Network Icons)\n\nNuvio provides community GIF covers for animated Discord network badges.\n\n```json\n\"nuvio_covers_enabled\": true,\n\"nuvio_covers_email\": \"you@example.com\",\n\"nuvio_covers_password\": \"YOUR_NUVIO_PASSWORD\"\n```\n\nSign up at: https://nuvioapp.space/\n\n### Trakt\n\nTrakt provides metadata and scrobbling with automatic token refresh.\n\n```json\n\"trakt_client_id\": \"YOUR_TRAKT_CLIENT_ID\",\n\"trakt_client_secret\": \"YOUR_TRAKT_CLIENT_SECRET\"\n```\n\nCreate an app at: https://trakt.tv/oauth/applications\n\n### MyAnimeList\n\nMyAnimeList provides anime metadata.\n\n```json\n\"mal_client_id\": \"YOUR_MAL_CLIENT_ID\"\n```\n\nGet your key at: https://myanimelist.net/apiconfig\n\n---\n\n## API Integrations\n\n### AniList\n\nTrack anime progress and sync your watchlist automatically via the AniList GraphQL API.\n\n```json\n\"anilist_enabled\": true,\n\"anilist_access_token\": \"YOUR_ANILIST_TOKEN\"\n```\n\nGet your token at: https://anilist.co/settings/developer\n\n### Simkl\n\nSync watch history across TV, movies, and anime platforms.\n\n```json\n\"simkl_enabled\": true,\n\"simkl_client_id\": \"YOUR_SIMKL_CLIENT_ID\",\n\"simkl_access_token\": \"YOUR_SIMKL_TOKEN\"\n```\n\nGet your key at: https://simkl.com/settings/developer/\n\n### Kitsu\n\nConnect to the Kitsu anime community and library.\n\n```json\n\"kitsu_enabled\": true,\n\"kitsu_access_token\": \"YOUR_KITSU_TOKEN\"\n```\n\n### Letterboxd\n\nLog movies to your Letterboxd diary as you watch.\n\n```json\n\"letterboxd_enabled\": true,\n\"letterboxd_api_key\": \"YOUR_LETTERBOXD_KEY\",\n\"letterboxd_api_secret\": \"YOUR_LETTERBOXD_SECRET\"\n```\n\n### Last.fm\n\nScrobble soundtrack and score info to Last.fm.\n\n```json\n\"lastfm_enabled\": true,\n\"lastfm_api_key\": \"YOUR_LASTFM_KEY\",\n\"lastfm_api_secret\": \"YOUR_LASTFM_SECRET\"\n```\n\nGet your key at: https://www.last.fm/api/account/create\n\n### JustWatch\n\nFind where movies and shows are streaming in your country.\n\n```json\n\"justwatch_enabled\": true,\n\"justwatch_country\": \"US\"\n```\n\nNo API key required — uses public data.\n\n### OpenSubtitles\n\nFind and fetch subtitles for your media.\n\n```json\n\"opensubtitles_enabled\": true,\n\"opensubtitles_api_key\": \"YOUR_OPENSUBTITLES_KEY\",\n\"opensubtitles_username\": \"YOUR_USERNAME\",\n\"opensubtitles_password\": \"YOUR_PASSWORD\"\n```\n\nGet your key at: https://www.opensubtitles.com/en/consumers\n\n### Plex / Jellyfin / Emby\n\nConnect to your media server for playback sync.\n\n**Plex:**\n\n```json\n\"plex_enabled\": true,\n\"plex_url\": \"http://192.168.1.100:32400\",\n\"plex_token\": \"YOUR_PLEX_TOKEN\"\n```\n\n**Jellyfin:**\n\n```json\n\"jellyfin_enabled\": true,\n\"jellyfin_url\": \"http://192.168.1.100:8096\",\n\"jellyfin_api_key\": \"YOUR_JELLYFIN_KEY\"\n```\n\n**Emby:**\n\n```json\n\"emby_enabled\": true,\n\"emby_url\": \"http://192.168.1.100:8096\",\n\"emby_api_key\": \"YOUR_EMBY_KEY\"\n```\n\n### Notion\n\nLog watch activity to a Notion database.\n\n```json\n\"notion_enabled\": true,\n\"notion_api_key\": \"YOUR_NOTION_KEY\",\n\"notion_database_id\": \"YOUR_DATABASE_ID\"\n```\n\n### Obsidian\n\nWrite watch notes to an Obsidian vault folder.\n\n```json\n\"obsidian_enabled\": true,\n\"obsidian_vault_path\": \"/path/to/your/vault\"\n```\n\n### FanArt.tv\n\nHigh-quality fan-made artwork for movies and TV shows.\n\n```json\n\"fanart_enabled\": true,\n\"fanart_api_key\": \"YOUR_FANART_API_KEY\"\n```\n\nGet your key at: https://fanart.tv/get-an-api-key/\n\nAll integrations can be enabled/disabled from the dashboard Connections tab. They initialize lazily in a background thread only when their enabled flag is true.\n\n---\n\n## Using with Stremio\n\n```json\n\"wako_mode\": false\n```\n\n1. Enable debugging on your Android TV.\n2. Start Ascend Media RPC (run.bat or python start_gui.py --headless).\n3. Open the dashboard at http://localhost:5466.\n4. Connect to your Android TV.\n5. Start playing in Stremio.\n6. Discord Rich Presence updates automatically.\n\n---\n\n## Using with Wako\n\n```json\n\"wako_mode\": true\n```\n\n1. Enable debugging on your Android TV.\n2. Start Ascend Media RPC.\n3. Open the dashboard.\n4. Connect to your Android TV.\n5. Start playback in Wako.\n6. Discord Rich Presence updates automatically.\n\nWako-specific config options:\n\n| Config Key | Description |\n| :--- | :--- |\n| wako_player_only | Only detect player activity |\n| wako_stay_awake_on_pause | Keep device awake when paused |\n| wako_focus_lock | Lock focus to Wako app |\n| wako_title_overrides | Manual title corrections |\n| wako_title_cache_enabled | Cache parsed titles |\n| wako_focus_lock_whitelist | Apps allowed when focus lock is on |\n| wako_focus_lock_cooldown | Cooldown between focus checks (seconds) |\n\n---\n\n## Dashboard\n\nThe dashboard is the local control center for Ascend Media RPC at http://localhost:5466.\n\n### Dashboard Tab\n\nConnection status, device scanner, playback info (app, title, state, progress), artwork preview, Discord RPC status, Smart Skip HUD, and live log.\n\n### Connections Tab\n\n- **Core APIs** — TMDB, MAL, Trakt, Discord credential inputs\n- **Skip Sources** — Provider priority list with reorder arrows and toggles, provider config (API keys, URLs, TMDB/MAL ID overrides), Pipeline Sandbox for testing\n- **Tracking \u0026 Scrobbling** — AniList, Simkl, Kitsu, Letterboxd, Last.fm cards with toggles and descriptions\n- **Discovery \u0026 Utilities** — JustWatch, OpenSubtitles cards\n- **Media Servers** — Plex, Jellyfin, Emby cards\n- **Watch Journals** — Notion, Obsidian cards\n- **Trakt Social** — collection sync, friends watching, calendar, check-in cards with toggles\n- **Integration Status** — overview grid showing connected/disconnected status\n\n### Settings Tab\n\nAppearance and theme (dark/light/OLED mode, accent color picker), RPC customization, skip category per-category toggles (8 categories: intro, outro, recap, preview, credits, filler, mature content, jump scares), artwork fallback chain configuration with drag reordering, FanArt.tv settings (enable toggle, API key), device health monitoring (battery, CPU, memory, storage), ADB Wi-Fi pairing wizard, push notification toggle, privacy mode, dashboard PIN authentication, config export/import, and multi-step setup wizard.\n\n### History Tab\n\nWatch history entries and session log with filter buttons (All, Completed, In Progress, Abandoned) and per-show grouping view.\n\n### Analytics Tab\n\nTotal watch time, top genres, peak watch hours heatmap, watch streak, total skips, average session duration, session search, skip provider stats (per-provider success rates), skip category breakdown, weekly and monthly reports, and shareable stats card generator (PNG).\n\n### Debug Tab\n\nAudit log viewer (searchable, filterable), skip cache statistics (hit rate, size, clear button), system health (uptime, status), plugin list, and log export (last 50, last 200, or all logs as JSON download).\n\n### Trakt Tab\n\nTrakt OAuth login flow and scrobbling status.\n\n---\n\n## Smart Skip Pipeline\n\nThe Smart Skip pipeline fetches skip segments from up to 8 providers simultaneously using a thread pool executor.\n\n### How It Works\n\n1. When playback starts, Ascend Media RPC resolves the media IMDB ID (via TMDB lookup or manual override).\n2. All enabled providers are queried in parallel.\n3. Results are merged using category-aware conflict resolution:\n   - Segments of **different categories** (e.g. structure vs mature content) are all kept.\n   - Segments of the **same category** that overlap are resolved by provider priority order.\n4. Results are cached using a TTL-based cache (default 1 hour, configurable).\n\n### Pipeline Sandbox\n\nThe dashboard includes a Pipeline Sandbox for testing skip providers without active playback:\n\n1. Go to the **Connections** tab.\n2. Scroll to **Pipeline Sandbox**.\n3. Enter a title (e.g. Stranger Things), season, and episode.\n4. Click **Run Pipeline Test**.\n5. View color-coded results grouped by source.\n\n### Provider Details\n\n| Provider | Notes |\n| :--- | :--- |\n| **IntroDB.app** | Intro/outro timestamps for TV episodes |\n| **TheIntroDB.org (TIDB)** | Cloudflare-protected; uses cloudscraper for bypass |\n| **Remote JSON** | Custom URL for your own skip database |\n| **VideoSkip.org** | Mature content markers (sex, violence, profanity) |\n| **NotScare.me** | Cloudflare-protected; uses cloudscraper. Supports episode slicing from season pages |\n| **AniSkip** | Requires MAL ID for anime lookups |\n| **SkipMe.db** | Community skip segment database |\n\n---\n\n## \u003ca name=\"analytics-1\"\u003e\u003c/a\u003eAnalytics\n\nAscend Media RPC stores watch analytics in a local SQLite database (analytics.db).\n\n- **SQLite backend** with WAL mode and indexed columns\n- **Automatic migration** from legacy JSON format\n- **Watch stats** — total sessions, total watch time, average session\n- **Top genres** — genre breakdown from TMDB metadata\n- **Peak hours** — 24-hour heatmap\n- **Watch streak** — consecutive days of watching\n- **Total skips** — count of all skipped segments\n- **Search** — search sessions by title, genre, or date\n\nView analytics in the **Analytics** tab of the dashboard.\n\n---\n\n## Plugin System\n\nAscend Media RPC includes a plugin system for extending functionality.\n\n| Plugin Type | Base Class | Description |\n| :--- | :--- | :--- |\n| Metadata | MetadataProvider | Custom metadata sources |\n| Skip | SkipProvider | Custom skip segment sources |\n| Scrobble | ScrobbleProvider | Custom scrobbling destinations |\n| Artwork | ArtworkProvider | Custom artwork sources |\n\nPlugins are loaded from a configurable directory via the PluginRegistry. The plugin list is visible in the **Debug** tab.\n\n\u003e The plugin system provides the base classes and registry. No concrete plugins are bundled — this is scaffolding for community extensions.\n\n---\n\n## Privacy and Security\n\n### Privacy Mode\n\nHide what you are watching from Discord:\n\n```json\n\"privacy_mode\": true,\n\"privacy_hidden_text\": \"Watching something\"\n```\n\nPrivacy mode can also blacklist specific titles, pause analytics, and pause Trakt scrobbling.\n\n### Dashboard Authentication\n\nProtect your dashboard with a PIN:\n\n```json\n\"dashboard_auth_enabled\": true,\n\"dashboard_auth_pin\": \"1234\"\n```\n\n### HTTPS Support\n\nEnable HTTPS for the dashboard:\n\n```json\n\"dashboard_https_enabled\": true,\n\"dashboard_cert_path\": \"/path/to/cert.pem\",\n\"dashboard_key_path\": \"/path/to/key.pem\"\n```\n\n### Audit Log\n\nTrack config changes and auth events with sensitive key masking:\n\n```json\n\"audit_log_enabled\": true,\n\"audit_log_max_entries\": 1000\n```\n\nView the audit log in the **Debug** tab.\n\n### API Rate Limiting\n\n```json\n\"rate_limit_enabled\": true,\n\"rate_limit_default\": \"60/minute\"\n```\n\n### General Safety\n\n- Only enable debugging on trusted home networks\n- Do not expose Android TV debugging ports to the internet\n- Do not publicly expose the dashboard port\n- Do not share API keys or tokens publicly\n\n---\n\n## Customization\n\n### Discord Branding\n\n```json\n\"rpc_branding\": \"on Stremio\"\n```\n\n### Large Image Mode\n\n```json\n\"rpc_large_image_mode\": \"season\"\n```\n\nOptions: show, season, episode\n\n### Time Display\n\n```json\n\"rpc_time_display\": \"remaining\"\n```\n\nOptions: remaining, elapsed\n\n### Dashboard Port\n\n```json\n\"dashboard_port\": 5466\n```\n\n### Status Message Cycling\n\n```json\n\"rpc_status_cycling_enabled\": true,\n\"rpc_cycling_messages\": [\"Chilling\", \"Binge watching\", \"Movie night\"],\n\"rpc_cycling_interval\": 30\n```\n\n### Dynamic Buttons\n\n```json\n\"rpc_dynamic_buttons\": [\n  {\"label\": \"My Profile\", \"url\": \"https://example.com\"}\n]\n```\n\n---\n\n## Troubleshooting\n\n### Android TV does not appear in the dashboard scanner\n\n- Android TV is turned on and awake\n- PC and Android TV are on the same network\n- Developer Options and debugging are enabled\n- VPN/firewall is not blocking local discovery\n- Try enabling mDNS discovery (mdns_discovery_enabled: true)\n- Try manual IP fallback\n\n### Auto IP mode does not connect\n\n- Confirm auto_ip: true\n- Debugging is enabled on the TV\n- First-time debugging prompt was accepted\n- Try mDNS discovery or manual IP\n\n### Discord Rich Presence does not show\n\n- Discord desktop app is open and logged in\n- Activity Status is enabled in Discord settings (User Settings then Activity Privacy)\n- Ascend Media RPC is running\n- Stremio or Wako is actively playing\n- Another Discord RPC app is not overriding the status\n\n### Dashboard does not open\n\n- Check run.bat or start_gui.py is still running\n- Try http://localhost:5466 (or your custom port)\n- No other app is using the same port\n\n### Playback does not update\n\n- Correct Android TV device is selected\n- wako_mode matches the app you are using (false for Stremio, true for Wako)\n- TV is awake\n\n### Artwork is missing\n\n- API keys are correct in config.json\n- Internet connection is working\n- Media exists in TMDB or selected artwork provider\n- Try TMDB as fallback\n\n### Skip providers returning 0 segments\n\n- Provider is enabled in config or dashboard\n- Media has data in that provider database\n- For TIDB/NotScare: cloudscraper is installed (pip install cloudscraper)\n- For TIDB: Cloudflare may IP-block certain networks\n- For AniSkip: valid MAL ID is required\n- Check server logs for errors\n\n---\n\n## API Reference\n\nAscend Media RPC exposes a REST API for the dashboard and external integrations.\n\n### Core\n\n| Method | Endpoint | Description |\n| :--- | :--- | :--- |\n| GET | /api/health | Health check (uptime, version, status) |\n| GET | /api/state | Current app state (playback, config, metadata) |\n| POST | /api/update_settings | Update config values |\n| GET | /api/events | SSE event stream for live updates |\n\n### Config Management\n\n| Method | Endpoint | Description |\n| :--- | :--- | :--- |\n| GET | /api/config/export | Export config as JSON (sensitive keys excluded) |\n| POST | /api/config/import | Import config from JSON |\n| GET | /api/config/validate | Validate current config |\n| GET | /api/config/schema | Get config schema with types |\n\n### Skip Pipeline\n\n| Method | Endpoint | Description |\n| :--- | :--- | :--- |\n| POST | /api/test/skip_pipeline | Test skip pipeline (title, season, episode) |\n| GET | /api/skip/cache | Skip cache statistics |\n| DELETE | /api/skip/cache | Clear skip cache |\n\n### Analytics\n\n| Method | Endpoint | Description |\n| :--- | :--- | :--- |\n| GET | /api/analytics/advanced | Full analytics (genres, hours, streaks, stats) |\n| GET | /api/analytics/search?q=QUERY | Search watch sessions |\n\n### System\n\n| Method | Endpoint | Description |\n| :--- | :--- | :--- |\n| GET | /api/audit | Audit log entries |\n| GET | /api/rpc/history | RPC activity history |\n| POST | /api/validate/keys | Validate API keys |\n| GET | /api/plugins | List loaded plugins |\n| GET | /api/integrations/status | Integration connection status |\n| GET | /api/devices | List discovered devices |\n| POST | /api/devices/switch | Switch active device |\n\n### Authentication\n\n| Method | Endpoint | Description |\n| :--- | :--- | :--- |\n| POST | /api/auth/login | Dashboard PIN login |\n| POST | /api/auth/logout | Dashboard logout |\n\n### Onboarding\n\n| Method | Endpoint | Description |\n| :--- | :--- | :--- |\n| GET | /api/onboarding/status | Onboarding progress |\n| POST | /api/onboarding/start | Start setup wizard |\n| POST | /api/onboarding/complete | Mark onboarding complete |\n\n### Trakt Social\n\n| Method | Endpoint | Description |\n| :--- | :--- | :--- |\n| GET | /api/trakt/collection | Get Trakt collection |\n| POST | /api/trakt/collection | Add to Trakt collection |\n| POST | /api/trakt/checkin | Check in to Trakt |\n| GET | /api/trakt/friends | Friends watching now |\n| GET | /api/trakt/calendar | Upcoming episodes |\n| GET | /api/trakt/recommendations | Personalized recommendations |\n| POST | /api/trakt/rate | Rate content |\n| GET | /api/trakt/stats | Trakt watch stats |\n\n### Skip Analytics\n\n| Method | Endpoint | Description |\n| :--- | :--- | :--- |\n| GET | /api/analytics/skip/providers | Per-provider skip stats |\n| GET | /api/analytics/skip/categories | Per-category skip breakdown |\n| GET | /api/analytics/report/weekly | Weekly watch report |\n| GET | /api/analytics/report/monthly | Monthly watch report |\n\n### Watch History\n\n| Method | Endpoint | Description |\n| :--- | :--- | :--- |\n| GET | /api/history/filter?status=STATUS | Filter history (completed/in_progress/abandoned) |\n| GET | /api/history/grouped | History grouped by show |\n\n### Device Management\n\n| Method | Endpoint | Description |\n| :--- | :--- | :--- |\n| GET | /api/device/health | Device health (battery, CPU, memory, storage) |\n| POST | /api/device/adb-pair | ADB Wi-Fi pairing (IP:port + code) |\n\n### Remote Control\n\n| Method | Endpoint | Description |\n| :--- | :--- | :--- |\n| POST | /api/remote/text | Send text input to device |\n| POST | /api/remote/launch | Launch app on device |\n| GET | /api/remote/apps | List installed apps |\n\n### Artwork \u0026 Theme\n\n| Method | Endpoint | Description |\n| :--- | :--- | :--- |\n| GET | /api/fanart/images | Fetch FanArt.tv images for a title |\n| GET | /api/artwork/chain | Get artwork fallback chain order |\n| POST | /api/artwork/chain | Set artwork fallback chain order |\n| GET | /api/theme | Get current theme settings |\n| POST | /api/theme | Update theme (mode, accent, OLED) |\n\n### Stats \u0026 Logs\n\n| Method | Endpoint | Description |\n| :--- | :--- | :--- |\n| POST | /api/stats-card | Generate shareable stats card (PNG) |\n| GET | /api/logs?limit=N | Get recent logs |\n| GET | /api/logs/export?limit=N | Export logs as JSON download |\n\n---\n\n## \u003ca name=\"remote-setup-tailscale\"\u003e\u003c/a\u003e🌍 Remote Setup (Tailscale)\n\nYou can control your Android TV and update Discord from anywhere in the world using **Tailscale**. This creates a secure, private tunnel between your PC and your TV.\n\n1.  **Install Tailscale** on both your PC and your Android TV.\n2.  **Enable ADB TCP/IP** on your TV (run `adb tcpip 5555` while on the same WiFi).\n3.  **Find the TV's Tailscale IP** (starts with `100.x.y.z`).\n4.  **Connect:** In Ascend Media RPC, use the Tailscale IP as your **ADB Host**.\n\n\u003e [!TIP]\n\u003e Run `adb shell settings put secure always_on_vpn_app com.tailscale.ipn` on your TV to keep Tailscale alive forever.\n\n---\n\n## \u003ca name=\"docker-deployment\"\u003e\u003c/a\u003e🐳 Docker Deployment\n\nAscend Media RPC is fully containerized and can run headlessly on a home server or VPS.\n\n### **Quick Start (One-Liner)**\n```bash\ndocker run -d \\\n  --name ascend-rpc \\\n  --network host \\\n  --restart unless-stopped \\\n  -v $(pwd)/config.json:/app/config.json \\\n  -v $(pwd)/data:/app/data \\\n  -v $(pwd)/rpc_artwork_cache:/app/rpc_artwork_cache \\\n  -e ASCEND_PORT=5466 \\\n  -e ADB_HOST=100.x.y.z \\\n  ghcr.io/cxsmo-ai/ascend-media-rpc:latest\n```\n\nOpen the dashboard at:\n\n```txt\nhttp://localhost:5466\n```\n\n### **Docker Compose**\n```yaml\nservices:\n  ascend-rpc:\n    image: ghcr.io/cxsmo-ai/ascend-media-rpc:latest\n    network_mode: host\n    volumes:\n      - ./config.json:/app/config.json\n      - ./data:/app/data\n      - ./rpc_artwork_cache:/app/rpc_artwork_cache\n    environment:\n      - HEADLESS=1\n      - ASCEND_PORT=5466\n      - ADB_HOST=100.x.y.z\n```\n\n---\n\n## Built With\n\n- Python\n- Flask\n- pypresence\n- cloudscraper\n- guessit\n- anitopy\n- SQLite\n- Zeroconf\n- Pillow (optional, for stats card PNG generation)\n- Built-in ADB tooling\n- Discord Rich Presence\n- TMDB, EasyRatingsDB, Top Posters, FanArt.tv, Nuvio\n- Trakt, MyAnimeList\n- AniList, Simkl, Kitsu, Letterboxd, Last.fm, JustWatch, OpenSubtitles\n- Plex, Jellyfin, Emby\n- Notion, Obsidian\n- IntroDB, TheIntroDB.org, VideoSkip, NotScare, AniSkip, SkipMe, Skipit\n\n---\n\n## Credits\n\nDeveloped by **Cxsmo-ai**.\n\n---\n\n## Disclaimer\n\nThis project is not affiliated with Discord, Stremio, Wako, TMDB, Trakt, MyAnimeList, EasyRatingsDB, Top Posters, FanArt.tv, Nuvio, AniSkip, IntroDB, TheIntroDB.org, SkipMe, VideoSkip, NotScare, AniList, Simkl, Kitsu, Letterboxd, Last.fm, JustWatch, OpenSubtitles, Plex, Jellyfin, Emby, Notion, Obsidian, or Skipit.\n\nAll trademarks, names, logos, and brands belong to their respective owners.\n\nAscend Media RPC does not provide, host, index, distribute, or stream media content. It only detects local playback activity and updates Discord Rich Presence.\n\n---\n\n## Support\n\nIf you like this project, consider starring the repository.\n\n```txt\nAscend Media RPC\nRich Presence Client + Smart Skip + Android TV Telemetry + Analytics + Integrations\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FCxsmo-ai%2FAscend-Media-RPC","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FCxsmo-ai%2FAscend-Media-RPC","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FCxsmo-ai%2FAscend-Media-RPC/lists"}