#NSP TV = Nvidia Shield Portable / TV app
NSP TV — это бесплатный, лёгкий и оптимизированный Android TV клиент для воспроизведения IPTV каналов. Приложение специально разработано для работы на устройствах с ограниченными ресурсами, таких как NVIDIA Shield TV (Android 5.1).
- 🎬 Воспроизведение IPTV — поддержка HLS, DASH и других форматов
- 📺 Оптимизация для Android TV — интерфейс адаптирован для управления пультом и джойстиком
- ⚡ Минимальное потребление памяти — специально оптимизировано для NVIDIA Shield Portable/TV
- 🖼️ Локальные иконки каналов — все иконки хранятся локально, без загрузки из интернета
- 🎯 Умное отображение иконок — иконки загружаются только для видимых групп каналов (±2 группы)
- 🔊 Звуковые эффекты — тактильная обратная связь при навигации (click.mp3)
- 📋 Поддержка плейлистов — загрузка M3U/M3U8 плейлистов
- 🚀 Быстрый буфер плеера — 1.5s начальный буфер, 0.5s переключение каналов, 8s максимум
| Устройство | Android | Статус |
|---|---|---|
| NVIDIA Shield TV | 5.1 | ✅ Оптимизировано |
| Android TV Box | 5.0+ | ✅ Совместимо |
| Android TV | 5.0+ | ✅ Совместимо |
- Kotlin — основной язык программирования
- Jetpack Compose — современный UI фреймворк
- Media3/ExoPlayer — воспроизведение медиа
- Coil — загрузка и отображение изображений
- Coroutines — асинхронная обработка
- ViewModel — управление состоянием
TV/
├── tv/ # Модуль Android TV
│ └── src/main/
│ ├── java/com/example/tv/
│ │ ├── MainActivity.kt # Главный экран
│ │ ├── MainApplication.kt # Инициализация приложения
│ │ ├── AppContainer.kt # Dependency Injection
│ │ ├── data/
│ │ │ ├── EmbeddedChannels.kt # Встроенные каналы
│ │ │ ├── model/
│ │ │ │ └── Channel.kt # Модель канала
│ │ │ ├── repository/
│ │ │ │ └── PlaylistRepository.kt # Загрузка плейлистов
│ │ │ └── parser/
│ │ │ └── M3UParser.kt # Парсер M3U/M3U8
│ │ ├── ui/
│ │ │ ├── playlist/
│ │ │ │ ├── PlaylistScreen.kt # Экран выбора плейлиста
│ │ │ │ ├── PlaylistViewModel.kt # ViewModel плейлиста
│ │ │ │ └── components/
│ │ │ │ └── ChannelCard.kt # Карточка канала
│ │ │ ├── player/
│ │ │ │ ├── PlayerScreen.kt # Экран плеера
│ │ │ │ └── PlayerViewModel.kt # ViewModel плеера
│ │ │ └── urlinput/
│ │ │ └── UrlInputScreen.kt # Ввод URL плейлиста
│ │ └── utils/
│ │ └── SoundPoolManager.kt # Менеджер звуков
│ └── assets/
│ ├── channels/ # JSON файлы каналов
│ │ ├── General.json
│ │ ├── News.json
│ │ ├── Sports.json
│ │ ├── Movies.json
│ │ └── ...
│ └── logos/ # Иконки каналов
│ ├── channel1.png
│ └── ...
├── mobile/ # Модуль Mobile (опционально)
├── gradle/ # Gradle wrapper
├── build.gradle.kts # Конфигурация сборки
└── settings.gradle.kts # Настройки проекта
- Android Studio Hedgehog или новее
- JDK 17+
- Android SDK 21+ (minSdk)
- Android SDK 34 (targetSdk)
-
Клонируйте репозиторий
git clone https://github.com/yourusername/russian-iptv-player.git cd russian-iptv-player -
Откройте в Android Studio
- Запустите Android Studio
- File → Open → выберите папку проекта
- Дождитесь синхронизации Gradle
-
Соберите приложение (Debug)
./gradlew assembleDebug
Или через Android Studio: Build → Make Project
-
Соберите приложение (Release)
./gradlew assembleRelease
# Проверьте подключение устройства
adb devices
# Установите APK
adb install -r tv/build/outputs/apk/debug/tv-debug.apk
# Или для Release версии
adb install -r tv/build/outputs/apk/release/tv-release.apk- Включите режим отладки на Shield Portable / TV
- Settings → Device Preferences → About → нажмите Build Number 7 раз
- Включите USB-отладку
- Settings → Device Preferences → Developer Options → USB Debugging
- Подключите Shield TV к компьютеру по USB или через сеть
- Выполните команду
adb install
| Кнопка на пульте | Действие |
|---|---|
| ← → ↑ ↓ | Навигация по меню |
| OK / Enter | Выбор элемента |
| Back | Возврат назад |
| Play/Pause | Воспроизведение/Пауза |
| Stop | Остановка воспроизведения |
| Rewind/Fast Forward | Перемотка (если поддерживается) |
Каналы хранятся в формате JSON в папке assets/channels/:
[
{
"name": "Канал 1",
"url": "http://example.com/stream.m3u8",
"logoUrl": "logos/channel1.png",
"group": "General",
"tvgId": "channel1.id",
"language": "ru"
}
]Поля:
name— название каналаurl— URL потока (M3U8, HLS, DASH)logoUrl— путь к иконке (относительный)group— группа каналовtvgId— идентификатор для EPGlanguage— язык канала (опционально)
Звук клика при навигации хранится в assets/click.mp3:
- Громкость: 25% (0.25f)
- Формат: MP3
- Длительность: короткая
-
Кэширование изображений
- LRU Cache: 4MB
- Максимальный размер иконки: 256×256px
- Формат: RGB_565 (2 байта на пиксель)
-
Кэширование звука
- SoundPool: 1MB
- Максимум потоков: 2
- Громкость: 0.25f (25%)
-
Буфер плеера
- Начальный буфер: 1.5 секунды
- Переключение каналов: 0.5 секунды
- Максимальный буфер: 8 секунд
-
Умное отображение иконок
- Загружаются только для текущей ±2 групп
- Экономия ~80% памяти при отображении
- Placeholder с первой буквой для скрытых групп
-
Очистка кэша при запуске
- Автоматическая очистка при старте приложения
- Предотвращение утечек памяти
| Ресурс | Значение |
|---|---|
| APK размер | ~30 MB |
| RAM (idle) | ~150 MB |
| RAM (плеер) | ~250 MB |
| Диск | ~50 MB (с иконками) |
| Кэш изображений | 4 MB |
| Кэш звука | 1 MB |
- SIGSEGV краши при скролле — исправлено ограничением рендеринга иконок
- ANR при загрузке плейлистов — исправлено загрузкой в фоновом потоке
- Задержка переключения каналов — оптимизировано до 0.5 секунд
- Удалены часть каналов — убрал 4 канала "Смотрим", ".black", "Просвещение", "TV PRO", так как не прогружались корректно
- ✅ Базовый функционал IPTV плеера
- ✅ Оптимизация для NVIDIA Shield TV
- ✅ Умное отображение иконок каналов
- ✅ Локальные иконки без загрузки из интернета
- ✅ Звуковые эффекты навигации
- ✅ Поддержка M3U/M3U8 плейлистов
MIT License — свободно для личного использования.
Pull Requests приветствуются! Пожалуйста:
- Forkните репозиторий
- Создайте ветку для фичи (
git checkout -b feature/AmazingFeature) - Закоммитьте изменения (
git commit -m 'Add some AmazingFeature') - Pushните в ветку (
git push origin feature/AmazingFeature) - Откройте Pull Request
- Автор: [Витяев Михаил Павлович]
- Email: [postavil.rakom.youtub@gmail.com]
- GitHub: [mihailvityaev] - [NvidiaShieldPortable1]
- NVIDIA — за Shield TV
- Команда Android
- Open Source сообщество
Протестировано на Nvidia Shield Portable
#NSP TV = Nvidia Shield Portable/TV app (Russian IPTV Player for Android TV)
NSP TV is a free, lightweight and optimized Android TV client for playing IPTV channels. The application is specifically designed to work on devices with limited resources, such as NVIDIA Shield TV (Android 5.1).
- 🎬 IPTV Playback — supports HLS, DASH and other formats
- 📺 Android TV Optimized — interface adapted for remote control
- ⚡ Minimal Memory Usage — specifically optimized for NVIDIA Shield Portable/TV
- 🖼️ Local Channel Icons — all icons stored locally, no internet download
- 🎯 Smart Icon Display — icons loaded only for visible channel groups (±2 groups)
- 🔊 Sound Effects — tactile feedback during navigation (click.mp3)
- 📋 Playlist Support — load M3U/M3U8 playlists
- 🚀 Fast Player Buffer — 1.5s initial buffer, 0.5s channel switch, 8s max
| Device | Android | Status |
|---|---|---|
| NVIDIA Shield TV | 5.1 | ✅ Optimized |
| Android TV Box | 5.0+ | ✅ Compatible |
| Android TV | 5.0+ | ✅ Compatible |
- Kotlin — main programming language
- Jetpack Compose — modern UI framework
- Media3/ExoPlayer — media playback
- Coil — image loading and display
- Coroutines — asynchronous processing
- ViewModel — state management
TV/
├── tv/ # Android TV Module
│ └── src/main/
│ ├── java/com/example/tv/
│ │ ├── MainActivity.kt # Main screen
│ │ ├── MainApplication.kt # App initialization
│ │ ├── AppContainer.kt # Dependency Injection
│ │ ├── data/
│ │ │ ├── EmbeddedChannels.kt # Embedded channels
│ │ │ ├── model/
│ │ │ │ └── Channel.kt # Channel model
│ │ │ ├── repository/
│ │ │ │ └── PlaylistRepository.kt # Playlist loading
│ │ │ └── parser/
│ │ │ └── M3UParser.kt # M3U/M3U8 parser
│ │ ├── ui/
│ │ │ ├── playlist/
│ │ │ │ ├── PlaylistScreen.kt # Playlist selection screen
│ │ │ │ ├── PlaylistViewModel.kt # Playlist ViewModel
│ │ │ │ └── components/
│ │ │ │ └── ChannelCard.kt # Channel card component
│ │ │ ├── player/
│ │ │ │ ├── PlayerScreen.kt # Player screen
│ │ │ │ └── PlayerViewModel.kt # Player ViewModel
│ │ │ └── urlinput/
│ │ │ └── UrlInputScreen.kt # URL input screen
│ │ └── utils/
│ │ └── SoundPoolManager.kt # Sound manager
│ └── assets/
│ ├── channels/ # Channel JSON files
│ │ ├── General.json
│ │ ├── News.json
│ │ ├── Sports.json
│ │ ├── Movies.json
│ │ └── ...
│ └── logos/ # Channel icons
│ ├── channel1.png
│ └── ...
├── mobile/ # Mobile module (optional)
├── gradle/ # Gradle wrapper
├── build.gradle.kts # Build configuration
└── settings.gradle.kts # Project settings
- Android Studio Hedgehog or newer
- JDK 17+
- Android SDK 21+ (minSdk)
- Android SDK 34 (targetSdk)
-
Clone the repository
git clone https://github.com/yourusername/russian-iptv-player.git cd russian-iptv-player -
Open in Android Studio
- Launch Android Studio
- File → Open → select project folder
- Wait for Gradle sync to complete
-
Build Debug Version
./gradlew assembleDebug
Or via Android Studio: Build → Make Project
-
Build Release Version
./gradlew assembleRelease
# Check device connection
adb devices
# Install APK
adb install -r tv/build/outputs/apk/debug/tv-debug.apk
# Or for Release version
adb install -r tv/build/outputs/apk/release/tv-release.apk- Enable debug mode on Shield Portable / TV
- Settings → Device Preferences → About → click Build Number 7 times
- Enable USB debugging
- Settings → Device Preferences → Developer Options → USB Debugging
- Connect Shield TV to computer via USB or network
- Execute
adb installcommand
| Remote Button | Action |
|---|---|
| ← → ↑ ↓ | Menu navigation |
| OK / Enter | Select item |
| Back | Go back |
| Play/Pause | Play/Pause |
| Stop | Stop playback |
| Rewind/Fast Forward | Seek (if supported) |
Channels are stored in JSON format in assets/channels/:
[
{
"name": "Channel 1",
"url": "http://example.com/stream.m3u8",
"logoUrl": "logos/channel1.png",
"group": "General",
"tvgId": "channel1.id",
"language": "ru"
}
]Fields:
name— channel nameurl— stream URL (M3U8, HLS, DASH)logoUrl— icon path (relative)group— channel grouptvgId— EPG identifierlanguage— channel language (optional)
Click sound during navigation stored in assets/click.mp3:
- Volume: 25% (0.25f)
- Format: MP3
- Duration: short
-
Image Caching
- LRU Cache: 4MB
- Max icon size: 256×256px
- Format: RGB_565 (2 bytes per pixel)
-
Sound Caching
- SoundPool: 1MB
- Max streams: 2
- Volume: 0.25f (25%)
-
Player Buffer
- Initial buffer: 1.5 seconds
- Channel switch: 0.5 seconds
- Max buffer: 8 seconds
-
Smart Icon Display
- Loaded only for current ±2 groups
- Saves ~80% memory when displaying
- Placeholder with first letter for hidden groups
-
Cache Clear on Launch
- Automatic cleanup on app start
- Prevents memory leaks
| Resource | Value |
|---|---|
| APK Size | ~30 MB |
| RAM (idle) | ~150 MB |
| RAM (player) | ~250 MB |
| Disk | ~50 MB (with icons) |
| Image Cache | 4 MB |
| Sound Cache | 1 MB |
- SIGSEGV crashes on scroll — fixed by limiting icon rendering
- ANR on playlist loading — fixed by loading in background thread
- Channel switch delay — optimized to 0.5 seconds
- Deleted few channels — deleted 4 channels "Смотрим", ".black", "Просвещение", "TV PRO", which isn't loaded correctly
- ✅ Basic IPTV player functionality
- ✅ NVIDIA Shield TV optimization
- ✅ Smart channel icon display
- ✅ Local icons without internet download
- ✅ Navigation sound effects
- ✅ M3U/M3U8 playlist support
MIT License — free for personal use.
Pull Requests are welcome! Please:
- Fork the repository
- Create a feature branch (
git checkout -b feature/AmazingFeature) - Commit changes (
git commit -m 'Add some AmazingFeature') - Push to the branch (
git push origin feature/AmazingFeature) - Open a Pull Request
- Author: [Vityaev Mikhail Pavlovich]
- Email: [postavil.rakom.youtub@gmail.com]
- GitHub: [mihailvityaev] - [NvidiaShieldPortable1]
- NVIDIA — for Shield TV
- Android Team
- Open Source Community
Tested on Nvidia Shield Portable
Write me message if you need same project for your region - EU, US, etc...
