b1001e3bb77c9aca3324b863e425065662d159e6
- Rewrite VideoExtractor for dynamic redirect following (no hardcoded domains) - Parse player CONFIG JSON and call stream API directly (vaplayer.ru) - Fallback to HTML scraping for old-style pages (cloudnestra) - Fix subtitle encoding: detect ISO-8859-1, save as UTF-8 for proper ñ/accents - Show up to 10 Spanish subtitle sources from OpenSubtitles - Subtitle picker auto-scrolls to selected option - State-based D-pad navigation for all controls and subtitle picker - Seek mode: DPAD_UP enters, LEFT/RIGHT seeks, CENTER/DOWN applies - Adaptive bitrate: ExoPlayer auto-selects quality based on bandwidth - Reduce buffer sizes for Chromecast (15s/30s instead of 100s) - Fix availableSubtitles stale capture in DisposableEffect key
HorrorTV
A horror movie streaming app for Android TV and Chromecast with Google TV 4K.
Features
- Featured Horror Categories: Browse curated horror movie collections (Scream, Halloween, Conjuring, Exorcist, Nightmare, Insidious, Terrifier, Hereditary, It, Poltergeist, Saw, Paranormal)
- Search Movies: Search by movie name or IMDB ID (e.g.,
tt1234567) - WebView Streaming: Stream movies via playimdb.com integration
- TV-Optimized UI: Built with Jetpack Compose for TV with D-pad navigation support
- Movie Details: View plot, year, rating, and poster information from OMDb API
Tech Stack
| Category | Technology |
|---|---|
| Language | Kotlin |
| UI Framework | Jetpack Compose for TV (tv-foundation, tv-material) |
| Networking | Retrofit + OkHttp + Gson |
| Image Loading | Coil |
| Dependency Injection | Hilt |
| Architecture | MVVM with Clean Architecture layers |
| API | OMDb API |
Project Structure
HorrorTV/
├── app/
│ ├── src/main/
│ │ ├── java/com/horrortv/app/
│ │ │ ├── data/
│ │ │ │ ├── remote/omdb/ # OMDb API service & DTOs
│ │ │ │ └── repository/ # Repository implementations
│ │ │ ├── di/ # Hilt modules
│ │ │ ├── domain/
│ │ │ │ ├── model/ # Domain models (Movie)
│ │ │ │ └ repository/ # Repository interfaces
│ │ │ ├── presentation/
│ │ │ │ ├── home/ # Home screen, rows, cards
│ │ │ │ ├── search/ # Search screen & ViewModel
│ │ │ │ ├── detail/ # Movie detail screen
│ │ │ │ ├── player/ # WebView streaming player
│ │ │ │ └ theme/ # Horror-themed colors, typography
│ │ │ ├── util/ # Constants, utilities
│ │ │ └── MainApplication.kt # Hilt entry point
│ │ ├── res/
│ │ │ ├── drawable/ # Launcher background
│ │ │ ├── mipmap/ # App icons & banner
│ │ │ └ values/strings.xml # App name
│ │ └ AndroidManifest.xml # TV features & activities
│ ├── build.gradle.kts # App dependencies
│ └ proguard-rules.pro
├── gradle/
│ └ wrapper/gradle-wrapper.properties
├── build.gradle.kts # Project config
├── settings.gradle.kts
└ .gitignore
How to Build
Prerequisites
- Android Studio with Android SDK 34
- JDK 17
- Gradle 8.x
Build Commands
# Debug APK
./gradlew assembleDebug
# Release APK
./gradlew assembleRelease
# Clean build
./gradlew clean assembleDebug
# Install on connected device
./gradlew installDebug
On Windows:
gradlew.bat assembleDebug
How to Install on Chromecast 4K
-
Enable Developer Options:
- Go to Settings → System → About
- Click on "Build" 7 times until "Developer options unlocked"
-
Enable ADB Debugging:
- Settings → System → Developer options → ADB debugging → On
-
Connect via ADB:
# Find Chromecast IP in Settings → Network → WiFi adb connect <CHROMECAST_IP>:5555 -
Install APK:
adb install -r app/build/outputs/apk/debug/app-debug.apk -
Launch App:
- The app will appear in your Apps section on Chromecast
- Select "HorrorTV" from the home screen
API Configuration
The app uses the OMDb API to fetch movie metadata:
- API Key:
5854c81e(hardcoded inConstants.kt) - Base URL:
https://www.omdbapi.com/
To use your own API key, modify Constants.kt:
const val OMDB_API_KEY = "your_api_key_here"
Get a free API key at: https://www.omdbapi.com/apikey.aspx
Usage
Navigation
| Action | D-Pad Control |
|---|---|
| Move focus | Arrow keys (Up/Down/Left/Right) |
| Select | Center button (Enter) |
| Back | Back button |
| Search | Search button or menu |
Features
- Browse Categories: Navigate through horror movie rows using Up/Down arrows
- View Movie: Press Select on a movie poster to see details
- Play Movie: Press Play button on detail screen to stream via WebView
- Search: Access search from the top menu, type movie name or IMDB ID
IMDB ID Search
Enter an IMDB ID in the format tt1234567 or tt12345678 to find specific movies.
Architecture
The app follows Clean Architecture principles:
- Presentation Layer: Jetpack Compose TV UI with ViewModels
- Domain Layer: Business models and repository interfaces
- Data Layer: OMDb API implementation and repository
Dependency flow: Presentation → Domain → Data
License
This project is for educational purposes. Movie streaming via playimdb.com may require appropriate licensing in your region.
Description
Languages
Kotlin
100%