{"id":47744685,"url":"https://github.com/kiduyu-klaus/kiduyutv_final","last_synced_at":"2026-07-03T06:05:40.589Z","repository":{"id":345856961,"uuid":"1187512300","full_name":"kiduyu-klaus/KiduyuTv_final","owner":"kiduyu-klaus","description":"- - - - - IN DEVELOPMENT - - - - - Android TV and Fire TV streaming app offering a curated collection of movies and TV shows with a lean-back interface designed for living room entertainment. Features include content browsing, search functionality, and playback controls optimized for remote navigation.","archived":false,"fork":false,"pushed_at":"2026-05-27T22:17:49.000Z","size":32375,"stargazers_count":8,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-05-27T22:22:52.778Z","etag":null,"topics":["android-tv-app","androidtv","androidtv-app","fire-tv","firestick","firetv","java","kiduyutv","leanback-framework","movies-api","movies-app-android","movies-streaming","movies-streaming-app","streaming","streaming-api"],"latest_commit_sha":null,"homepage":"https://kiduyu-klaus.github.io/KiduyuTv_final/","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/kiduyu-klaus.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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":"2026-03-20T20:14:04.000Z","updated_at":"2026-05-27T22:17:53.000Z","dependencies_parsed_at":null,"dependency_job_id":"417b3fb3-100a-4bf5-86a2-92e5924238c7","html_url":"https://github.com/kiduyu-klaus/KiduyuTv_final","commit_stats":null,"previous_names":["kiduyu-klaus/kiduyutv_final"],"tags_count":339,"template":false,"template_full_name":null,"purl":"pkg:github/kiduyu-klaus/KiduyuTv_final","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kiduyu-klaus%2FKiduyuTv_final","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kiduyu-klaus%2FKiduyuTv_final/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kiduyu-klaus%2FKiduyuTv_final/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kiduyu-klaus%2FKiduyuTv_final/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/kiduyu-klaus","download_url":"https://codeload.github.com/kiduyu-klaus/KiduyuTv_final/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kiduyu-klaus%2FKiduyuTv_final/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33739861,"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-31T02:00:06.040Z","response_time":95,"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":["android-tv-app","androidtv","androidtv-app","fire-tv","firestick","firetv","java","kiduyutv","leanback-framework","movies-api","movies-app-android","movies-streaming","movies-streaming-app","streaming","streaming-api"],"created_at":"2026-04-03T00:33:20.400Z","updated_at":"2026-07-03T06:05:40.578Z","avatar_url":"https://github.com/kiduyu-klaus.png","language":"Kotlin","funding_links":[],"categories":[],"sub_categories":[],"readme":"# KiduyuTV\n\n\u003cdiv align=\"center\"\u003e\n\n![KiduyuTV Banner](https://raw.githubusercontent.com/kiduyu-klaus/KiduyuTv_final/main/app/src/main/res/mipmap-xhdpi/ic_banner.png)\n\n**KiduyuTV is a dual-form-factor Android streaming app for Android TV, Fire TV, and mobile devices. The codebase uses one Android app module with `phone` and `tv` product flavors, separate Compose navigation graphs, shared data/repository layers, local Room caching, Firebase sync, Trakt integration, IPTV playback, schedule playback, and a multi-network ads stack.**\n\n[![Android Release CI](https://github.com/kiduyu-klaus/KiduyuTv_final/actions/workflows/kiduyu_final.yml/badge.svg)](https://github.com/kiduyu-klaus/KiduyuTv_final/actions/workflows/kiduyu_final.yml)\n[![License](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)\n[![Platform](https://img.shields.io/badge/Platform-Android%20TV%20%7C%20Fire%20TV%20%7C%20Mobile-FF6B35?style=for-the-badge)](https://developer.android.com/tv)\n[![Kotlin](https://img.shields.io/badge/Kotlin-1.9.24-purple?style=for-the-badge)](https://kotlinlang.org)\n[![Jetpack Compose](https://img.shields.io/badge/Jetpack%20Compose-2024.12.01-61DAFB?style=for-the-badge)](https://developer.android.com/compose)\n[![Target SDK](https://img.shields.io/badge/Target%20SDK-35-red?style=for-the-badge)](https://developer.android.com/guide/topics/manifest/uses-sdk-element)\n[![Build Status](https://img.shields.io/github/actions/workflow/status/kiduyu-klaus/KiduyuTv_final/kiduyu_final.yml?branch=main\u0026style=for-the-badge\u0026label=Build)](https://github.com/kiduyu-klaus/KiduyuTv_final/actions)\n[![Media3 ExoPlayer](https://img.shields.io/badge/Media3%20ExoPlayer-1.5.1-orange?style=for-the-badge)](https://developer.android.com/media/media3/exoplayer)\n[![TMDB API](https://img.shields.io/badge/TMDB%20API-01B4E4?style=for-the-badge\u0026logo=themoviedatabase\u0026logoColor=white)](https://www.themoviedb.org)\n\n\u003c/div\u003e\n\n## Contents\n- [Main Features](#main-features)\n- [Implementation Overview](#implementation-overview)\n- [Screens And Navigation](#screens-and-navigation)\n- [Playback](#playback)\n- [Live TV And Schedule](#live-tv-and-schedule)\n- [Data, Sync, And Storage](#data-sync-and-storage)\n- [Ads And Consent](#ads-and-consent)\n- [Network And Protection](#network-and-protection)\n- [Tech Stack](#tech-stack)\n- [Project Structure](#project-structure)\n- [Build Variants](#build-variants)\n- [Configuration](#configuration)\n- [Development Notes](#development-notes)\n- [License](#license)\n\n## Main Features\n\n- Android TV, Fire TV, phone, and tablet support from one codebase.\n- Dedicated TV UI with D-pad focus handling and dedicated mobile UI with touch-first screens.\n- Home, Movies, TV Shows, My List, Live TV, Search, Settings, and Trakt profile areas.\n- TMDB-powered movie and TV metadata, details, cast, crew, genres, companies, networks, recommendations, videos, seasons, and episodes.\n- Curated GitHub-hosted content rows for themed movie and TV collections.\n- My List with local Room persistence and Firebase sync.\n- Watch history and continue-watching support with playback position tracking.\n- Trakt OAuth login, profile data, watch history, collection, watchlist, recommendations, and scrobbling helpers.\n- Live TV playlist browsing from M3U, EPG loading from XMLTV, category browsing, search, and favorite channels.\n- Schedule tab with expandable events, available channel selection, and schedule-player launch.\n- WebView streaming provider system with Firebase-configurable provider templates and local fallback providers.\n- Dedicated players for WebView streams, IPTV streams, scheduled channels, and YouTube videos.\n- WebView ad blocking, popup suppression, EasyList/EasyPrivacy assets, and schedule-player autoplay injection.\n- Multi-network ads with UMP consent and priority: `StartApp -\u003e AdMob -\u003e Wortise -\u003e Unity`.\n- App-open ads through Wortise where available.\n- Network reachability checks, network state dialogs, VPN/proxy/DNS diagnostics, and ad-blocking DNS detection.\n- Firebase Auth, Analytics, Realtime Database, Firestore, and Cloud Messaging dependencies.\n- In-app update helpers for checking, downloading, and installing APK updates.\n- Notification channel support with deep links into movie and TV detail screens.\n\n## Implementation Overview\n\nThe app starts in `SplashActivity`, resolves consent, initializes Firebase sync, initializes ad SDKs, checks updates/notifications, and then launches `MainActivity`. `MainActivity` chooses the TV or mobile navigation graph based on `UiModeManager`.\n\nCore app initialization happens in `KiduyuTvApp`:\n\n- Initializes Room through `DatabaseManager`.\n- Initializes `MyListManager`.\n- Creates notification channels.\n- Cleans expired Room cache.\n- Initializes Firebase Analytics and Realtime Database persistence.\n- Restores Firebase auth state through `AuthManager`.\n- Initializes `FirebaseManager` using either authenticated UID or a generated device ID.\n- Restores Trakt auth through `TraktAuthManager`.\n- Starts Firebase-backed stream-provider configuration sync.\n- Starts continuous network monitoring through `NetworkConnectivityChecker`.\n\nThe main architecture is MVVM plus repositories:\n\n- Compose screens render state and dispatch UI events.\n- ViewModels expose `StateFlow` UI state.\n- Repositories handle TMDB, Trakt, IPTV, schedule, and local data operations.\n- Room stores saved media, watch history, cached movie/TV rows, cached detail records, and genres.\n- SharedPreferences stores lightweight settings, device ID, IPTV favorites, and provider preferences.\n\n## Screens And Navigation\n\nTV navigation is implemented in `ui/navigation/NavGraph.kt`.\n\nMobile navigation is implemented in `ui/navigation/MobileNavGraph.kt`.\n\nShared routes are declared in `ui/navigation/Screen.kt`.\n\n### TV Screens\n\n- `HomeScreen`: hero content, continue watching, trending rows, curated rows, companies/networks, and top navigation.\n- `MoviesScreen`: movie browsing.\n- `TvShowsScreen`: TV browsing.\n- `MyListScreen`: saved movies, TV shows, companies, networks, and cast shortcuts.\n- `LiveTvScreen`: Live TV, Schedule, and My Channels tabs.\n- `SearchScreen`: movie and TV search.\n- `MovieDetailScreen`: metadata, cast, crew, recommendations, company navigation, and play entry.\n- `TvShowDetailScreen`: show metadata, seasons, episodes, networks, cast, and play entry.\n- `SeasonEpisodesScreen`: episode browsing and playback entry.\n- `StreamLinksScreen`: provider selection before WebView playback.\n- `MediaListScreen`: movies by company or TV shows by network.\n- `CastDetailScreen`, `CastImagesScreen`, `ImageSliderScreen`: cast filmography and profile-image browsing.\n- `SettingsScreen`: providers, cache, sync, updates, Live TV data, ads setting, and Trakt entry.\n- `TraktProfileScreen`: Trakt profile, watch history, collection, and watchlist views.\n\n### Mobile Screens\n\n- `MobileHomeScreen`, `MobileMoviesScreen`, `MobileTvShowsScreen`, `MobileMyListScreen`.\n- `MobileLiveTvScreen`.\n- `MobileSearchScreen`.\n- `MobileMovieDetailScreen`, `MobileTvShowDetailScreen`, `MobileSeasonEpisodesScreen`, `MobileStreamLinksScreen`.\n- `MobileGenresScreen`, `MobileGenreContentScreen`, `SeeAllScreen`.\n- `MobileMediaListScreen`.\n- `MobileCastDetailScreen`.\n- `MobileSettingsScreen`, `MobileTraktProfileScreen`.\n\n## Playback\n\n### WebView Playback\n\n`PlayerActivity` handles movie and TV stream playback using a WebView. It:\n\n- Receives TMDB ID, media type, season/episode, metadata, and optional stream URL/iframe HTML.\n- Resolves provider HTML through `StreamProviderManager`.\n- Uses `AdBlockerWebViewClient`.\n- Blocks popups in `WebChromeClient.onCreateWindow`.\n- Tracks watch progress every 15 seconds.\n- Stores playback position in local watch history.\n- Uses a TV/Fire TV cursor overlay for D-pad navigation when appropriate.\n- Uses mobile/tablet behavior without the cursor.\n\n### Stream Providers\n\n`StreamProviderManager` contains local fallback provider templates and can load provider configuration from Firebase Realtime Database path:\n\n`app_config/stream_providers_Configuration`\n\nProviders define movie and TV URL templates, iframe attributes, provider parameters, and phone-only flags. The manager can generate iframe HTML or direct provider URLs.\n\n### IPTV Playback\n\n`IptvPlayerActivity` plays selected Live TV channels with channel metadata such as name, stream URL, logo, TVG ID/name, and group.\n\n### Schedule Playback\n\n`SchedulePlayerActivity` plays scheduled channels. It:\n\n- Receives channel ID, channel name, event title, optional direct iframe URLs, and selected player index.\n- Fetches `ChannelWatchPage` data through `ScheduleRepository`.\n- Shows a top server/source selector.\n- Uses `AdBlockerWebViewClient` as its base WebView client.\n- Adds schedule-specific autoplay/unmute HTML injection for nested frames.\n- Suppresses overlays and ad iframes that appear after page load.\n- Falls back to the next available player/server on main-frame errors.\n- Provides TV cursor support and a top bar with back/source controls.\n\n### YouTube Playback\n\n`YouTubePlayerActivity` is available for YouTube video playback through the Android YouTube Player dependency.\n\n## Live TV And Schedule\n\n`LiveTvScreen` contains three tabs:\n\n- `Live TV`: category list, channel grid, search, and playback.\n- `Schedule`: event schedule grouped by day/category; expanding an event exposes available channel chips that open `SchedulePlayerActivity`.\n- `My Channels`: favorite IPTV channels.\n\n`LiveTvViewModel` handles:\n\n- Loading and caching the M3U playlist.\n- Loading EPG data.\n- Category selection.\n- Channel search.\n- Favorite channels in local SharedPreferences.\n- Two-way favorite channel sync with Firebase.\n\n`IptvRepository` handles:\n\n- Remote M3U playlist URL:\n  `https://raw.githubusercontent.com/abusaeeidx/IPTV-Scraper-Zilla/main/combined-playlist.m3u`\n- Remote XMLTV EPG URL:\n  `https://raw.githubusercontent.com/JulioCesarXY/EPG-LG-Channels/refs/heads/main/lg_epg_us.xml`\n- Six-hour playlist/EPG cache.\n- Streaming M3U parsing.\n- Channel-to-EPG matching by `tvg-id`, `tvg-name`, or channel name.\n\n`ScheduleRepository` handles:\n\n- Schedule fetching and cache.\n- Upcoming-event helpers.\n- Category/event filtering.\n- Channel watch-page fetching.\n- Iframe HTML generation for scheduled streams.\n\n`ChannelScraper` supports scraping `dlhd.pk` 24/7 channel pages, extracting watch-page URLs and stream iframe/server URLs.\n\n## Data, Sync, And Storage\n\n### TMDB\n\n`TmdbRepository` handles:\n\n- Trending, popular, top-rated, and now-playing movies/TV.\n- Movie, TV, season, and episode details.\n- Genres.\n- Search and multi-search.\n- Recommendations.\n- Companies and networks.\n- Collections.\n- Cast, crew, person details, person credits, and person images.\n- GitHub-hosted curated movie/TV lists.\n- Local watch history and continue-watching flows.\n- Playback position updates.\n- Expired cache cleanup.\n\n### Room\n\n`AppDatabase` version `2` contains:\n\n- `SavedMediaEntity`\n- `WatchHistoryEntity`\n- `CachedMovieEntity`\n- `CachedTvShowEntity`\n- `CachedMovieDetailEntity`\n- `CachedTvShowDetailEntity`\n- `GenreEntity`\n\nDAOs are grouped under `data/local/dao`.\n\n### My List\n\n`MyListManager` and `SavedMediaDao` provide local saved-media persistence. Detail screens use `DetailViewModel.toggleMyList(...)` to add/remove movies and TV shows.\n\n### Firebase\n\nFirebase is used for:\n\n- Analytics.\n- Auth and persisted sign-in state.\n- Realtime Database sync.\n- Firestore dependency support.\n- Cloud Messaging dependency support.\n\n`FirebaseSyncManager` syncs:\n\n- My List.\n- Companies.\n- Networks.\n- Casts.\n- Watch history.\n- Favorite Live TV channels.\n- Default stream provider.\n\nIt exposes sync state, progress, and messages through `StateFlow`.\n\n### Trakt\n\n`TraktAuthManager` supports:\n\n- OAuth URL generation.\n- Code exchange.\n- Token persistence.\n- Token refresh.\n- Valid-token retrieval.\n- User settings/profile fetch.\n- Sign out.\n\n`TraktRepository` supports:\n\n- User settings.\n- Watch history.\n- Collection.\n- Watchlist.\n- Recommendations.\n- Movie and episode scrobbling.\n- Watchlist add/remove helpers.\n\n`TraktSyncManager` contains a full-sync workflow for watch history, collection, and watchlist.\n\n## Ads And Consent\n\nAds are initialized only after UMP consent resolves in `SplashActivity`.\n\nInitialization order:\n\n1. StartApp\n2. AdMob\n3. Wortise\n4. Unity\n\nThe core fallback dispatcher is `AdFallbackDispatcher`.\n\nCore ad priority:\n\n`StartApp -\u003e AdMob -\u003e Wortise -\u003e Unity`\n\nSupported formats:\n\n- Banners\n- Interstitials\n- Rewarded ads\n- StartApp splash helper\n- Wortise app-open ads\n\nImportant classes:\n\n- `StartAppAdManager`\n- `AdManager` for AdMob\n- `WortiseAdManager`\n- `UnityAdManager`\n- `AdFallbackDispatcher`\n- `TvInterstitialManager`\n- `AppOpenAdObserver`\n- `ConsentManager`\n\nGeneric TV/mobile banner surfaces now prefer StartApp. Explicitly named banner composables such as `WortiseBannerAdView` and `UnityBannerAdView` remain network-specific.\n\nUsers can disable ads through settings, and ad managers check that preference before loading or showing ads.\n\n## Network And Protection\n\n### Connectivity Monitoring\n\n`NetworkConnectivityChecker` continuously monitors connectivity using:\n\n- `ConnectivityManager.NetworkCallback`\n- Periodic reachability checks\n- Active test hosts\n- Network diagnostics\n\nDiagnostics include:\n\n- Network type\n- DNS servers\n- VPN state\n- Proxy state\n- Metered state\n\nThe app detects ad-blocking DNS, VPN, and proxy conditions and can show `NetworkStateDialog` from the root UI. The explicit DNS allowlist currently permits:\n\n- `192.168.100.1`\n- `8.8.8.8`\n\n### WebView Ad Blocking\n\n`AdBlockerWebViewClient` blocks common ad domains and injects CSS/DOM cleanup after page load.\n\nAdditional supporting pieces:\n\n- `AdvancedAdBlocker`\n- `FilterListUpdater`\n- `DomainTrie`\n- bundled `easylist.txt`, `easyprivacy.txt`, and `custom_filters.txt`\n\n`PlayerActivity` and `SchedulePlayerActivity` both use `AdBlockerWebViewClient`.\n\n## Tech Stack\n\n| Area | Implementation |\n| --- | --- |\n| Language | Kotlin |\n| Android Gradle Plugin | 8.13.2 |\n| Kotlin Gradle plugin | 2.1.10 |\n| Java target | 17 |\n| Compile SDK | 35 |\n| Min SDK | 24 |\n| Target SDK | 35 |\n| UI | Jetpack Compose, Material 3 |\n| Navigation | Navigation Compose |\n| Async | Kotlin Coroutines, StateFlow |\n| Local DB | Room 2.6.1 |\n| Networking | Retrofit 2.11.0, OkHttp 4.12.0, Volley |\n| DNS | OkHttp DNS-over-HTTPS dependency |\n| Image loading | Coil Compose, Glide |\n| Media | Media3 ExoPlayer 1.5.1 |\n| Web playback | Android WebView, AndroidX WebKit |\n| HTML parsing | Jsoup 1.18.1 |\n| Firebase | Analytics, Auth, Realtime Database, Firestore, Messaging |\n| Ads | StartApp, AdMob, Wortise, Unity, UMP |\n| Animations | Lottie Compose |\n| YouTube | Android YouTube Player |\n\n## Project Structure\n\n```text\nKiduyuTv_final_room/\n|-- app/\n|   |-- build.gradle\n|   |-- google-services.json\n|   |-- proguard-rules.pro\n|   `-- src/main/\n|       |-- AndroidManifest.xml\n|       |-- assets/\n|       |   |-- custom_filters.txt\n|       |   |-- easylist.txt\n|       |   `-- easyprivacy.txt\n|       |-- java/com/kiduyuk/klausk/kiduyutv/\n|       |   |-- activity/\n|       |   |   |-- mainactivity/\n|       |   |   `-- splashactivity/\n|       |   |-- application/\n|       |   |-- data/\n|       |   |   |-- api/\n|       |   |   |-- local/\n|       |   |   |-- model/\n|       |   |   |-- remote/\n|       |   |   |-- repository/\n|       |   |   `-- sync/\n|       |   |-- network/\n|       |   |-- ui/\n|       |   |   |-- components/\n|       |   |   |-- navigation/\n|       |   |   |-- player/\n|       |   |   |-- screens/\n|       |   |   `-- theme/\n|       |   |-- util/\n|       |   `-- viewmodel/\n|       `-- res/\n|-- lists/\n|-- build.gradle\n|-- settings.gradle\n|-- gradle/\n|-- VERSION\n`-- README.md\n```\n\n## Build Variants\n\nThe app uses one flavor dimension: `formfactor`.\n\n### Phone flavor\n\n- Application ID suffix: `.phone`\n- Version name suffix: `-phone`\n- Touch-first mobile navigation graph.\n- Mobile bottom navigation and mobile detail/search/settings screens.\n\n### TV flavor\n\n- Application ID suffix: `.tv`\n- Version name suffix: `-tv`\n- TV navigation graph.\n- D-pad-first focus handling.\n- TV banner overlay support.\n- Leanback/touchscreen-optional manifest support.\n\nCommon default config:\n\n- `applicationId`: `com.kiduyuk.klausk.kiduyutv`\n- `versionCode`: `4`\n- `versionName`: `1.1.71`\n- `minSdk`: `24`\n- `targetSdk`: `35`\n- `compileSdk`: `35`\n- `multiDexEnabled`: `true`\n\n## Configuration\n\n### Firebase\n\nThe app expects `app/google-services.json`.\n\nFirebase-related initialization happens in:\n\n- `KiduyuTvApp`\n- `AuthManager`\n- `FirebaseManager`\n- `FirebaseSyncManager`\n- `StreamProviderManager`\n\n### TMDB\n\nTMDB API access is implemented under:\n\n- `data/api/ApiClient.kt`\n- `data/api/TmdbApiService.kt`\n- `data/repository/TmdbRepository.kt`\n\n### Trakt\n\nTrakt auth and API access are implemented under:\n\n- `util/TraktAuthManager.kt`\n- `data/remote/TraktApiClient.kt`\n- `data/remote/TraktApiService.kt`\n- `data/repository/TraktRepository.kt`\n- `data/sync/TraktSyncManager.kt`\n\n### Ads\n\nAd IDs and manifest placeholders are configured in `app/build.gradle` and `AndroidManifest.xml`.\n\nCurrent ad managers:\n\n- StartApp: `StartAppAdManager`\n- AdMob: `AdManager`\n- Wortise: `WortiseAdManager`\n- Unity: `UnityAdManager`\n\n### Curated Lists\n\nCurated lists live in `/lists` and are fetched from GitHub raw URLs by `HomeViewModel`.\n\nCurrent list files include:\n\n- `oscar_winners_2026.json`\n- `hallmark_movies.json`\n- `true_story_movies.json`\n- `best_sitcoms.json`\n- `best_classics.json`\n- `cia_mossad_spies.json`\n- `jason_statham_movies.json`\n- `time_travel_movies.json`\n- `christian_movies.json`\n- `movies_from_the_bible.json`\n- `christian_tv_shows.json`\n- `doctor_who_specials.json`\n- `companies_networks.json`\n\n## Development Notes\n\nCommon Gradle tasks:\n\n```bash\n./gradlew assemblePhoneDebug\n./gradlew assembleTvDebug\n./gradlew assemblePhoneRelease\n./gradlew assembleTvRelease\n```\n\nDebug APK outputs:\n\n```text\napp/build/outputs/apk/phone/debug/\napp/build/outputs/apk/tv/debug/\n```\n\nRelease APK outputs:\n\n```text\napp/build/outputs/apk/phone/release/\napp/build/outputs/apk/tv/release/\n```\n\nNotes:\n\n- Release signing is configured in Gradle; use project-specific signing material for production.\n- R8 minification and resource shrinking are enabled for release.\n- The app allows cleartext traffic and uses `network_security_config.xml`.\n- The manifest declares storage/media permissions, notification permission, ad ID permission, install-packages permission, TV leanback support, and touchscreen as optional.\n- Gradle wrapper files are included.\n\n## License\n\nThis project is proprietary and all rights are reserved. No part of this codebase, documentation, or associated assets may be used, copied, modified, merged, published, distributed, sublicensed, leased, sold, or otherwise exploited without prior written permission from the copyright holder.\n\nSee [LICENSE](LICENSE) for details.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkiduyu-klaus%2Fkiduyutv_final","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkiduyu-klaus%2Fkiduyutv_final","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkiduyu-klaus%2Fkiduyutv_final/lists"}