Skip to content

Releases

Версия 0.2.26

Choose a tag to compare

@spacesarmat spacesarmat released this 12 Nov 14:25
54ad1a1

Какой APK скачать: arm - подходит любому телефону и ТВ (рекомендуется). arm64-v8a / armeabi-v7a - поменьше, под одну архитектуру; universal - для всего, включая x86.

Плеер

  • Полоса перемотки на всю доступную ширину. Слева и справа один и тот же отступ: больший из 16 dp и бокового safe-отступа (вырез или системная панель). В портрете, в альбоме и на ТВ края совпадают. Раньше вырез только с одной стороны оставлял полосу короче с другого края, и пока длина была неизвестна, справа под ней было пусто. Если хост уже применил safeDrawingPadding(), вырез не добавляется второй раз.
  • Под полосой строка времени: прошедшее слева, остаток справа. Пока длина неизвестна, обе стороны показывают --:--, и появление длины не меняет ширину полосы. Если позиция уже не ноль, слева по-прежнему полное прошедшее (3:29, а не 3:2). Главы остаются между подписями и не сдвигают время. У телеканала по-прежнему плашка «Эфир» и нет полосы.
  • Индикатор буферизации больше не рисует дугу поверх залитого жёлтого круга play. На его месте спиннер; если фокус пульта на центральной кнопке, вокруг спиннера кольцо. Сама кнопка не подменяется, и фокус при буферизации не прыгает.

Библиотека: tv.p2160:player-core:0.2.26 (versionCode 38).

English: The seek bar spans the full available width. The left and right insets are equal: the larger of the 16 dp gutter and the side safe inset (display cutout or system bar), in portrait, landscape and on TV. A one-sided cutout no longer leaves the bar short on the other side. A host that already applied safe-drawing padding does not get that inset a second time. While duration is unknown, both elapsed and remaining time show --:-- under the bar, so the bar does not change width when the length arrives. A position during buffering still shows the full elapsed time. Chapters stay between the labels. Live TV still shows the on-air badge and no seek bar. The buffering indicator is a spinner in place of the filled play circle; a focused centre button draws a ring around that spinner. The button node and D-pad focus behaviour are unchanged. Library: tv.p2160:player-core:0.2.26 (versionCode 38).

2160 Player Desktop 0.2.26 beta 1

Pre-release

Choose a tag to compare

@spacesarmat spacesarmat released this 11 Nov 03:56
e42ee97

Первая бета десктопной версии 2160 Player для Windows, macOS и Linux. Это предварительная сборка из PR #42, он ещё не слит в main. Android-версия этим релизом не меняется: стабильной остаётся v0.2.25, и автообновление Android эту бету не предлагает.

Установка

  • Windows: 2160player-0.2.26.msi (x64).
  • macOS: 2160player-2.26.0.dmg, только Apple Silicon (M1 и новее). Сборка без подписи: первый запуск через правый клик по приложению и «Открыть». Образ назван 2.26.0, потому что упаковщик jpackage не принимает версию, начинающуюся с нуля; в самом приложении версия 0.2.26.
  • Linux: p2160player_0.2.26_amd64.deb для Debian и Ubuntu или архив 2160player-0.2.26-linux-x64.tar.gz (x64).

Что умеет

  • Воспроизведение через встроенный libmpv, видео прямо в окне.
  • Локальные файлы.
  • Выбор звуковых дорожек и субтитров, внешние субтитры.
  • Запоминание позиции и продолжение просмотра.
  • SMB (сетевые папки) и DLNA.
  • IPTV-плейлисты M3U.
  • Сетевые потоки HLS, RTSP, RTMP и SRT.
  • Торренты с просмотром во время загрузки.
  • Полноэкранный режим, интерфейс в стиле Android-версии.

Ограничения беты

  • Видео декодируется программно, рассчитано на файлы до 1080p.
  • NDI пока нет.
  • На реальном компьютере сборки ещё не проверялись, звук тоже не проверен. Пишите в Issues, если что-то не работает.

SHA-256

2031e4b7905c9983893e78be0382fdae9e15d364da113b2a939b73e7bf39bb67  2160player-0.2.26.msi
c69a0d4454d21bf360023168be5fe45643d40e9111da694529e5060028e6daa7  2160player-2.26.0.dmg
0c4bf11ed09000cd3905db4a233c784d6e3a10fe20a202f4e0d45ac0bcc30a7e  p2160player_0.2.26_amd64.deb
e90c05b3eb3da22e3b8324b93da7c47c75900277d49c24d61ad863d114c3cfcc  2160player-0.2.26-linux-x64.tar.gz

Версия 0.2.25

Choose a tag to compare

@spacesarmat spacesarmat released this 10 Nov 21:14
cae50cf

Какой APK скачать: arm - подходит любому телефону и ТВ (рекомендуется). arm64-v8a / armeabi-v7a - поменьше, под одну архитектуру; universal - для всего, включая x86.

Звук на Realtek с Android 9

  • Исправлен рассинхрон при открытии файла и смене аудиодорожки: на этих устройствах AC3 passthrough использует позицию playback head вместо ошибочных временных меток AudioTrack.
  • PCM, offload, туннелирование и остальные устройства работают как раньше. Корректно обрабатываются переполнение 32-битного счётчика кадров и доигрыш конца файла.

Библиотека: tv.p2160:player-core:0.2.25 (versionCode 37).

English: Fixed audio/video desync when opening a file and switching audio tracks on Realtek devices running Android 9. AC3 passthrough now uses the playback head position instead of incorrect AudioTrack timestamps. PCM, offload, tunneling and other devices are unchanged. 32-bit frame counter wrap and end-of-stream drain are covered. Library: tv.p2160:player-core:0.2.25 (versionCode 37).

Версия 0.2.24

Choose a tag to compare

@spacesarmat spacesarmat released this 08 Nov 18:37
2225cad

Какой APK скачать: arm - подходит любому телефону и ТВ (рекомендуется). arm64-v8a / armeabi-v7a - поменьше, под одну архитектуру; universal - для всего, включая x86.

Настройки: порядок и единый стиль

  • Настройки торрентов переехали в главный экран настроек, раздел «Торренты» (кэш, хранение файлов, возраст, соединения, сеть, политика раздачи, зарядка, лимиты). Диалог по шестерёнке на экране торрентов убран - все настройки приложения теперь в одном месте.
  • Все строки настроек выглядят одинаково: заголовок слева и значение справа в одну строку, подсказка - строкой ниже. Длинные значения (например, несколько языков субтитров) больше не вытесняют заголовок.
  • «Очистить историю» переехала в «О приложении».

Библиотека: tv.p2160:player-core:0.2.24 (versionCode 36).

English: Torrent settings moved into the main Settings screen as a «Torrents» section (cache, keep files, max age, connections, network, seed policy, charging, limits); the gear dialog on the torrent screen is gone. All settings rows now share one style: title on the left, value on the right in a single line, hint below; long values (like several subtitle languages) no longer push the title out. «Clear history» moved to «About». Library: tv.p2160:player-core:0.2.24 (versionCode 36).

Версия 0.2.23

Choose a tag to compare

@spacesarmat spacesarmat released this 08 Nov 17:45
3bf6391

Какой APK скачать: arm - подходит любому телефону и ТВ (рекомендуется). arm64-v8a / armeabi-v7a - поменьше, под одну архитектуру; universal - для всего, включая x86.

Торренты: исправлено закрытие плеера на Galaxy S25 и других Android 16

  • Симптом: при открытии серии из торрента плеер запускался и сразу закрывался (без ошибки), на части устройств Android 16.
  • Причина: данные торрентов лежали на эмулированном хранилище (/sdcard), которое обслуживает FUSE-демон MediaProvider. При массовом открытии файлов торрента он падал с известной ошибкой (Check failed: active_nodes_…), том переподключался и система (vold) посылала приложению SIGINT за открытые файлы - процесс умирал без стека.
  • Теперь данные торрентов хранятся во внутренней памяти приложения (FUSE не участвует). Данные в старом месте переносятся автоматически при первом обращении.
  • Проверено на Galaxy S25: раздача стартует, серия открывается и играет.

Библиотека: tv.p2160:player-core:0.2.23 (versionCode 35).

English: Fixed the player closing right after opening a torrent episode on Galaxy S25 and some other Android 16 devices. Root cause: torrent data lived on the emulated storage (/sdcard), served by the MediaProvider FUSE daemon; opening many torrent files crashed it (a known Check failed: active_nodes_… bug), the volume remounted and the system (vold) sent the app SIGINT for its open file handles - the process died without a stack trace. Torrent data now lives in the app's internal storage (no FUSE in the path); existing data is migrated automatically on first access. Verified on Galaxy S25: the torrent starts and the episode plays. Library: tv.p2160:player-core:0.2.23 (versionCode 35).

Версия 0.2.22

Choose a tag to compare

@spacesarmat spacesarmat released this 08 Nov 16:51
3cb885e

Какой APK скачать: arm - подходит любому телефону и ТВ (рекомендуется). arm64-v8a / armeabi-v7a - поменьше, под одну архитектуру; universal - для всего, включая x86.

Тестовый режим (журнал действий)

  • Новый раздел Настройки → «Диагностика»: выключатель тестового режима и кнопка «Поделиться журналом».
  • Пока режим включён, приложение записывает в файл (и в logcat, метка p2160.actions): жизненный цикл экранов, нажатия по кнопкам интерфейса, события плеера (открытие файла, пауза, перемотка, ошибки), события торрентов (добавление, выбор файла, ожидание данных). При падении приложения в журнал дописывается стек ошибки.
  • Файл лежит во внутренней памяти, ротация по 4 МБ, старые файлы удаляются; выключенный режим не замедляет приложение.
  • Нужен, чтобы разобраться в «у меня вылетает/не играет»: включите режим, повторите проблему и пришлите журнал.

Библиотека: tv.p2160:player-core:0.2.22 (versionCode 34).

English: New Settings → «Diagnostics» section: a test-mode switch and a «Share the log» button. While enabled, the app records to a file (and logcat, tag p2160.actions): screen lifecycle, UI taps, player events (file open, pause, seek, errors) and torrent events (add, file select, waiting for data). On crash the stack trace is appended to the log. The file rotates at 4 MB; the disabled mode costs nothing. Use it to report «it crashes / won't play»: enable, reproduce, send the log. Library: tv.p2160:player-core:0.2.22 (versionCode 34).

Версия 0.2.21

Choose a tag to compare

@spacesarmat spacesarmat released this 08 Nov 15:59
b5bd210

Какой APK скачать: arm - подходит любому телефону и ТВ (рекомендуется). arm64-v8a / armeabi-v7a - поменьше, под одну архитектуру; universal - для всего, включая x86.

WMV и VC-1 в AVI

  • AVI с fourcc WMV1/WMV2/WMV3/WVC1 теперь играются: заголовок дорожки подменяется на MJPG-заглушку (иначе Media3 выбрасывает дорожку), а настоящий кодек и sequence header возвращаются декодеру.
  • Если у устройства есть MediaCodec на video/wvc1, берётся он, иначе дорожку забирает FFmpeg (декодеры vc1/wmv уже есть в сборке на всех ABI, размер APK не вырос).
  • Торрент-раздачи с такими AVI тоже играются.

Торренты: честные сообщения об ошибках

  • Когда у раздачи нет пиров и данные не идут, плеер показывал «Контейнер не поддерживается или повреждён». Теперь показывает «Нет соединения с источником» — файл при этом здоров, просто ждать нечего.

Библиотека: tv.p2160:player-core:0.2.21 (versionCode 33).

English: AVI files with WMV1/WMV2/WMV3/WVC1 fourcc now play: the track header is swapped to an MJPG placeholder (otherwise Media3 drops the track) while the real codec and sequence header are handed to the decoder. Device MediaCodec is preferred for VC-1, FFmpeg takes over otherwise (decoders already shipped in every ABI). Also, when a torrent swarm has no data, the player now says "Cannot connect to the source" instead of "Container is not supported or damaged". Library: tv.p2160:player-core:0.2.21 (versionCode 33).

Версия 0.2.20

Choose a tag to compare

@spacesarmat spacesarmat released this 08 Nov 14:19
e885963

Какой APK скачать: arm - подходит любому телефону и ТВ (рекомендуется). arm64-v8a / armeabi-v7a - поменьше, под одну архитектуру; universal - для всего, включая x86.

Полный аудит проекта и исправления

  • Плейлисты .m3u/.m3u8 с абсолютными путями (C:/…) снова разбираются: путь больше не принимается за относительный и не отсекается защитой от ../. Трогает в основном Windows; на Android-путях поведение прежнее.
  • Юнит-тесты проходят на Windows-машине: имя файла из file://-URI берётся не через последний сегмент пути (на Windows он весь путь), а через имя файла.
  • Проверено целиком: сборка, все юнит-тесты, lint и релизная сборка с обфускацией (поля декодера FFmpeg в dex на месте).

Для пользователей приложения изменений в поведении нет.

Библиотека: tv.p2160:player-core:0.2.20 (versionCode 32).

English: Full project audit. m3u playlists with absolute paths (C:/…) are parsed again - the path is no longer mistaken for a relative one and dropped by the ../ guard. Unit tests now pass on Windows machines. Verified end to end: build, all unit tests, lint and the obfuscated release build (FFmpeg decoder fields present in dex). No user-facing behaviour changes. Library: tv.p2160:player-core:0.2.20 (versionCode 32).

2160 Player 0.2.19

Choose a tag to compare

@spacesarmat spacesarmat released this 01 Nov 07:44
5fde56f

Какой APK скачать: arm - подходит любому телефону и ТВ (рекомендуется). arm64-v8a / armeabi-v7a - поменьше, под одну архитектуру; universal - для всего, включая x86.

Пульт во время буферизации

  • Пока идёт буферизация, фокус D-pad больше не прыгает по кнопкам. Он остаётся там, куда его поставили, поэтому «Аудио» и «Субтитры» открываются без предварительной паузы.
  • На центральную кнопку фокус ставится при первом показе управления и после закрытия боковой панели, если внутри кнопок его ещё нет. Переход buffering/ready сам по себе фокус не двигает.
  • Касания на телефоне не менялись. Индикатор загрузки по-прежнему внутри той же центральной кнопки.

Библиотека: tv.p2160:player-core:0.2.19 (versionCode 31).

English: While the player is buffering, D-pad focus stays on the control the user selected, so the audio and subtitle buttons can be opened without pausing first. Focus moves to the centre button only when the controls first appear or a side panel has just closed and nothing in the controls is focused. A buffering/ready change does not move it. Touch behaviour is unchanged. Library: tv.p2160:player-core:0.2.19 (versionCode 31).

2160 Player 0.2.18

Choose a tag to compare

@spacesarmat spacesarmat released this 01 Nov 06:49
1683805

Какой APK скачать: arm - подходит любому телефону и ТВ (рекомендуется). arm64-v8a / armeabi-v7a - поменьше, под одну архитектуру; universal - для всего, включая x86.

Конец файла

  • Медленный поток (например TorrServer по HTTP) больше не считается досмотренным, если плеер сообщил конец далеко от длительности. Позиция вроде 1:20 из 24:01 не закрывает серию, не ставит playback_completion и не записывает файл как досмотренный.
  • Конец принимается, только когда длительность известна и позиция в том же допуске, что и «досмотрено» (больше 97 %, или у ролика от 10 минут хвост короче 30 с).
  • Иначе источник открывается снова с текущей позиции. После нескольких попыток показывается обычная ошибка с «Повторить» и «Закрыть».
  • Короткое видео с более длинной внешней дорожкой по-прежнему заканчивается на конце видео. Плейлист после настоящего конца переходит к следующему, как раньше.

Пульт

  • Индикатор буферизации рисуется внутри центральной кнопки. Кнопка одна и та же, фокус с неё не сходит, когда после закрытия панели звука дорожка переключается и поток снова буферизуется.
  • После закрытия панели фокус запрашивается на следующем кадре и повторяется, если первый запрос не прошёл.
  • Если кнопки видны, а фокуса нигде нет, OK ставит паузу, а не перематывает и не открывает следующую главу.

Заставка при паузе

  • Настройка «Заставка при паузе» на месте. Она считает только паузу: воспроизведение не запрошено и плеер уже готов. Долгая буферизация заставку не включает.
  • Через 3 минуты кадр затемняется, по центру «Пауза» и название. Любая клавиша или касание возвращает картинку. Назад ещё и делает своё обычное действие. Стрелки и OK могут только разбудить.
  • «Остаться на кадре» по-прежнему гаснет через 3 минуты и при выключенной заставке.

Обрыв после старта

  • Если кадры уже шли и потом остановились, или позиция ушла дальше загруженного куска, это не «Воспроизведение не началось». Плеер открывает источник снова с последней позиции, где ещё были кадры (три попытки, затем «Поток оборвался»). Счётчик обнуляется, только когда кадры ушли на 10 с дальше точки обрыва. Идущие часы при замершей картинке попытки не сбрасывают. Когда попытки кончились, плеер встаёт на паузу. В результат и в историю пишется последняя позиция с кадрами, не ушедшие часы. «Повторить» продолжает с неё. Закрытие плеера останавливает сторож и отменяет уже запланированный повтор. Файл не помечается досмотренным и сам не закрывается.
  • Так бывает у обрезанного MKV и у HTTP, который отдаёт меньше байт, чем обещает заголовок: STATE_ENDED не приходит, картинка замирает, а часы идут дальше.

Результат с file://

  • В ответ больше не кладётся file:// в data. Иначе закрытие с return_result падает с FileUriExposedException. Позиция, длительность и остальные extras остаются. http и content в data по-прежнему есть.

Короткие ролики

  • Хвост короче 30 с считается досмотром только у ролика от 10 минут. Пауза на 18.4 с из 40 с и Назад дают end_by=user, не playback_completion. У коротких остаётся порог 97 %.

Субтитры и смена звука

  • Явные и внешние субтитры (в том числе из TEXT_TRACKS с select, без TEXT_OFF) остаются выбранными, когда пользователь переключает звук, включая переход на встроенную дорожку. Селектор больше не снимает их из-за нового языка озвучки.

Библиотека: tv.p2160:player-core:0.2.18 (versionCode 30).

English: A slow HTTP stream that reports the end far from the duration is no longer treated as watched: playback resumes from that position, with a bounded retry and then the usual error dialog. The same retry runs when playback has already shown frames and then stalls, or when the clock runs past the buffered data: the message is "The stream stopped", not "Playback did not start". The retry counter resets only after rendered frames move 10 seconds past the break. A frozen picture with a running clock does not reset it, so the same break ends in the error after 3 retries. That error pauses playback. The result and the resume point keep the last rendered position, and Retry starts there again. Closing the player stops the watchdog and cancels a pending reopen. Other fatal error dialogs pause as well. playback_completion is sent only after a verified end. The 30-second tail counts as finished only for titles of at least 10 minutes; a 40-second clip paused at 18 seconds is not watched. A file:// URI is omitted from the result Intent data so closing with return_result does not throw FileUriExposedException. An explicit or external subtitle stays selected when the audio track changes. A short video with a longer external audio track still ends at the video, and a real end still advances a playlist. The buffering spinner is drawn inside the same centre button, so D-pad focus survives closing a side panel and rebuffering. If the controls are visible and nothing is focused, OK pauses. The pause screensaver counts a real pause only (playWhenReady false and ready), not buffering. It dims the frame and shows Pause with the title. Any key wakes it; Back also does its usual action. Library: tv.p2160:player-core:0.2.18 (versionCode 30).