Перейти к содержанию

Воспроизведение из плагина: VOD, ТВ, URL, плееры и события

Черновик (2026-10-30). Как PHP-плагин запускает воспроизведение, какие URL отдаёт плееру, какой движок плеера срабатывает, какие события приходят обратно и чем отличаются прошивки. Источники: SDK плагинов (doc, без версии прошивки, кроме оговорённых мест); код tv188b 260827_0003_r24 и 261021_0117_r25 (PHP-фреймворк, shell_ext, Java-классы dune.apk; уровень code); наблюдения на одном устройстве tv188b с прошивкой 261021_0117_r25 (тестовый плагин test_plugin6, проверка на устройстве; тестовый плагин test_plugin8, проверка на устройстве; проверка на устройстве; проверка на устройстве; уровень device). Код r24 и r25 и наблюдения r25 относятся к разным сборкам, поэтому одно на другое не переносится. Каждое фактическое предложение ссылается на claim id.

Рядом: поставщики каталога «Фильмы» и запуск внешних приложений (start_playback_app, launch_ext_app) — guide/movie-suppliers.md (§5–§9); IP Control и launch_media_url снаружи — guide/ip-control.md; очередь операций и тайм-ауты — guide/plugin-operations.md. Здесь они не повторяются.

Коротко: вопрос → ответ

Вопрос Ответ Где
Чем плагин запускает VOD? действием plugin_vod_play с PluginVodInfo или без него — тогда оболочка вызывает get_vod_info (код r25, SDK)1 §1.1, §1.2
Когда оболочка зовёт get_vod_stream_url? r25, device: перед стартом каждой серии с playback_url_is_stream_url=false; серию с true играет по playback_url как есть (устройство r25)2 §1.2
Работает ли initial_position_ms? r25, device: да, для начальной серии; следующая серия после автоперехода начинается с 0 (устройство r25)3 §1.2, §4.4
Вызывается ли get_vod_stream_info? r25, device: при проверке на устройстве для ленивой серии — ни разу, хотя тестовый плагин его реализует (устройство r25)4; при проверке на устройстве при <feature>vod_get_stream_info</feature> — да, с playback_url серии (устройство r25)5 §1.2
Работает ли buffering_ms VOD? r25, device: оболочка пишет «setting buffering to 3000ms»; SDK называет поле нереализованным — см. «Расхождения» (устройство r25)6 §1.2, §6
Чем плагин запускает ТВ? действием plugin_tv_play; оболочка вызывает get_tv_info, затем get_tv_playback_url (SDK)7 §1.3
Какие префиксы URL советует SDK? http://mp4://… для MP4 по HTTP, http://ts://… для TS, udp:/@ip:port для multicast (SDK)8 §2.1
Как передать плееру параметры? суффиксом \|\|\|dune_params\|\|\| с параметрами через запятую (код r25)9 §2.1
Как задать заголовки потока из PHP? r25: суффиксом \|\|\|dune_params\|\|\|http_headers:… у URL. device, tv188b, engine:1: в playback_url серии с playback_url_is_stream_url=true (устройство r25)10 и, при проверке на устройстве, в ответе get_vod_stream_url (устройство r25)11 и get_tv_playback_url (устройство r25)12; в playback_url серии два заголовка — через %3B или ; (устройство r25)13, при сырой запятой и ,, в сохранённом запросе ExoPlayer только первый (устройство r25)14. Путь значения и udt: до PlaybackParams по коду — (код r25)15; включает ли udt:1 HttpUdtDataSource — не проверено, §7 §2.3
Доходят ли HTTP-заголовки до ExoPlayer? r25, device: User-Agent из http_headers заменяет свой во всех трёх проверенных формах (устройство r25)16, два заголовка через %2C пришли одной строкой (устройство r25)17, в playback_url серии через %3B или ; (проверка на устройстве) — отдельными (устройство r25)13; разбор прочих заголовков по коду — disputed (§2.3, §7); у HTTP MP4 на VLC http_headers не доходят — ни User-Agent, ни свой заголовок (устройство r25)18 §2.3
Какой движок сыграет поток? r25, device: MP4 и MKV по HTTP (contentType=2) и локальный файл — VLC, HLS (contentType=4) — ExoPlayer (устройство r25)19; dune_params engine:1 выбирает ExoPlayer, engine:2 — VLC (устройство r25)20 §3
Какие события приходят плагину в VOD? r25, device: цветные клавиши, timer, playback_stop, а также playback_user_action, playback_switched, playback_state_changed, playback_going_to_switch (устройство r25)21; при регистрации в actions — и нецветные клавиши (устройство r25)22 §4.1
Где взять позицию воспроизведения? r25, device: в событиях timer и playback_user_action; при остановке — plugin_vod_stop_position (устройство r25)23 §4.1, §4.4
Попадает ли VOD плагина в «Недавнее»? r25, device: да, по концу серии (устройство r25)24, с uid = recent_uid серии (устройство r25)25, и при ручном STOP (устройство r25)26; запуски без recent_uid записей не дали (устройство r25)27 §4.5

1. Как плагин запускает воспроизведение

1.1. Действия

GUI-действие в PHP — массив с handler_string_id и data; среди типов SDK называет PLUGIN_TV_PLAY и PLUGIN_VOD_PLAY (SDK)28. В dune_api.php r24 строковые идентификаторы действий заданы константами, среди них launch_media_url и playlist_play (код r24)29.

Действие Данные Что делает Claims
plugin_vod_play PluginVodPlayActionData::vod_info (необязательно) VOD по vod_info, а без него — по get_vod_info($media_url) выбранного элемента (SDK)30
plugin_tv_play initial_group_id, initial_channel_id, initial_is_favorite, initial_archive_tm (все необязательны) ТВ: get_tv_info($media_url) и состояние по PluginTvInfo; initial_* перекрывают выбор по умолчанию (SDK)31
launch_media_url url и др. строит плейлист с url в корне и по содержимому выбирает исполнителя (SDK)32
file_play url обычное воспроизведение одного файла или потока (SDK)33
playlist_play url, start_index плейлист из файла или папки, первым — элемент start_index (SDK)34
dvd_play, bluray_play url DVD и Blu-ray; Blu-ray — только в прошивках с его поддержкой (SDK)35

Если вывод get_tv_info невалиден, PluginTvPlayAction завершается ошибкой (SDK)36. Действия file_play, dvd_play, bluray_play, playlist_play и launch_media_url появились в SDK 120531_2200_beta (SDK)37.

launch_media_url подробнее. r25, device: одноэлементный M3U по HTTP раскрывается — plugin_launcher из него вызывает действие плагина и через IP Control (устройство r25)38, и из GUI-действия с M3U из www плагина (устройство r25)39. Что ещё по SDK собирается в плейлист (папки, pls, медиа, swf://, www://), на устройстве не проверено — §7. Плейлист из одного элемента уходит DVD-, Blu-ray-, Flash-плееру или браузеру, только картинки — фотовьюверу, остальное — обычному воспроизведению файлов (SDK)40. url может указывать на файл (локальный, сетевой, http), плейлист m3u/pls или папку (SDK)41. В r24 LaunchMediaUrlActionData имеет 9 ключей: url, caption, play_in_background, start_index, internal_player_only, resume_extra_choices, resume_ext_text, params, post_action (код r24)42. ActionFactory::launch_media_url_ext в shell_ext r24 по умолчанию ставит play_in_background=false, start_index=-1, internal_player_only=false (код r24)43. Что делают internal_player_only и play_in_background, claims не говорят.

Кнопки и клавиши. В movie-папке кнопка PLAY при has_multiple_series = FALSE исполняет PLUGIN_VOD_PLAY, при TRUE открывает папку серий по series_media_url (SDK)44; по умолчанию левой кнопке назначено VOD_PLAY (SDK)45. Типичный IPTV-плагин вешает на точку входа ENTER → PLUGIN_OPEN_FOLDER и PLAY → PLUGIN_TV_PLAY (SDK)46. Во фреймворке shell_ext r25 ActionFactory::vod_play() без аргумента отдаёт vod_info=null, а tv_play() — только handler_string_id (код r25)47.

Во время воспроизведения работает отдельный исполнитель: он принимает только PluginHandleUserInput, PluginShowError, ChangeBehaviour, PluginInvalidateFolders и PluginVodPlay с обязательным vod_info (SDK)48. CloseAndRunAction из TV/VOD-воспроизведения без открытого диалога с прошивки 131029_b9 работает как остановка (SDK)49.

1.2. VOD: PluginVodInfo и серии

Что видно на r25 (device).

Наблюдение Claim
Серия с playback_url_is_stream_url=true играется по playback_url как есть (путь /tmp/mnt/smb/…), без get_vod_stream_url и get_vod_stream_info (устройство r25)50
Для серии с false («ленивой») get_vod_stream_url вызывается перед её стартом — и при автопереходе к ней, и при старте VOD с неё; играется возвращённый URL (устройство r25)51
input_data операции get_vod_stream_url содержит только media_url, равный playback_url серии (kbp6lazy://2); sel_state нет (устройство r25)52
Для ленивой серии get_vod_stream_info не вызывался ни разу, хотя тестовый плагин реализует оба метода (устройство r25)4
initial_position_ms=8000 — старт начальной серии с 8 с, и при initial_series_ndx=0, и при 1 (устройство r25)53
Следующая серия после автоперехода начинается с 0, а не с initial_position_ms (устройство r25)54
buffering_ms=3000 — в shell.log «[player] setting buffering to 3000ms» и «using special buffering 3000ms» (устройство r25)6
markers начальной серии читаются при старте: два StreamMarker дали «markers I: 2 markers added: 2..12,25..35» (устройство r25)55
StreamMarker без duration (только type, from, to) принимается (устройство r25)56
Серия без ключа markers воспроизводится до конца (устройство r25)57
PHP-плагин на DunePluginFw с call_plugin() получает от оболочки операции handle_user_input и get_vod_stream_url (устройство r25)58
Проверка на устройстве: при <feature>vod_get_stream_info</feature> ленивая серия вызывает get_vod_stream_info с playback_url kbp8lazy://a6lazy (устройство r25)5
Проверка на устройстве: intro-маркер 3–20 с — и из ответа get_vod_stream_info, и из PluginVodSeriesInfo::markers — показывает на OSD кнопку «Пропустить заставку» (снимок через 6 с после запуска) (устройство r25)59
Проверка на устройстве: единственный маркер type=intro, from=3, to=15 без duration — в shell.log markers_osd_markers I: type intro activated for 7s; на OSD через 5 с — кнопка «Пропустить заставку» (устройство r25)60
Проверка на устройстве, ошибка BUG-037: маркер type=recap с теми же from/to даёт в shell.log type intro activated for 7s, а на OSD — ту же кнопку «Пропустить заставку», что у intro (устройство r25)61
Проверка на устройстве: маркер type=recap` с обратной кавычкой — в shell.log type recap activated for 7s, на OSD — кнопка «Пропустить вступление» (устройство r25)62

Маркер recap на r25 (BUG-037). Строки проверки на устройстве — один прогон на tv188b r25; текст кнопки снят на снимках через 5 с после запуска, действие кнопки не проверялось: ENTER на ней не нажимался (устройство r25)63. dune_api.php r25 задаёт для recap строку 'recap' (код r25)64, а нативный конвертер StreamMarkerType той же сборки (0x001a6e1c) по коду возвращает 0 для 'intro', 1 для 'recap`' с завершающей обратной кавычкой, 2 для 'closing_credits', -1 для остальных строк и NULL (код r25)65. На устройстве маркер со строкой recap показал кнопку заставки, как intro (устройство r25)66, а кнопку «Пропустить вступление» из трёх поданных значений дала только строка с обратной кавычкой (устройство r25)67. Почему recap даёт type intro и как ведёт себя closing_credits, — §7. Значение 7 с совпадает с кодом загрузчика 0x002fca08, который заменяет duration меньше 1 на 7 (код r25)68. Расхождение константы и конвертера — §6, запись об ошибке — BUG-037.

Что говорит SDK.

  • get_vod_info() возвращает PluginVodInfo; $media_url — подсказка, с какой серии начать (SDK)69; обычно её вызывает PLAY или ENTER на элементе с действием plugin_vod_play (SDK)70.
  • VOD проигрывает список серий, серий не меньше одной (SDK)71; series — подобие плейлиста, initial_series_ndx — серия, с которой начать (SDK)72.
  • В SDK у PluginVodInfo 13 полей: name, description, poster_url, series, initial_series_ndx, initial_position_ms, buffering_ms, advert_mode, actions, timer, ip_address_required, valid_time_required, subtitles_osd_enabled (SDK)73; name, description, poster_url и имена серий идут в OSD (SDK)74.
  • У PluginVodSeriesInfo в SDK — name, playback_url, playback_url_is_stream_url (SDK)75. При true playback URL используется как stream URL, при false get_vod_stream_url() вызывается каждый раз, когда нужен stream URL (SDK)76, — при каждом старте или возобновлении, с playback_url серии параметром (SDK)77.
  • initial_position_ms < 0 — позиция по умолчанию, возможно продолжение просмотра (SDK)78.
  • advert_mode = TRUE отключает перемотку, переходы и смену скорости, OSD сильно ограничен (SDK)79.
  • ip_address_required и valid_time_required — поведение без IP-адреса или верного времени (SDK)80.

Что есть в коде r24 сверх SDK. В dune_api.php r24 у PluginVodInfo 25 ключей: к полям SDK добавлены id, sub_name, extra_menu_items, enter_menu_action, skip_dummy_player_on_error, keep_playing_on_reload, keep_playing_on_reenter, recent_plugin, recent_action_params, recent_group_by, recent_tags, params (код r24)81. У PluginVodSeriesInfo 7 ключей: name, playback_url, playback_url_is_stream_url, content_id, recent_uid, mdb_info, markers (код r24)82. markers — список StreamMarker (код r24)83 с полями type, from, to, duration (код r24)84; типы — intro, recap, closing_credits (код r24)85. Что делают sub_name, extra_menu_items, enter_menu_action, skip_dummy_player_on_error и keep_playing_*, claims не говорят.

get_vod_stream_info. Это операция с необязательным методом плагина get_vod_stream_info($input_data, $plugin_cookies), которого нет в интерфейсе DunePlugin (код r24)86; её результат — PluginStreamInfo с ключами url и markers (код r24)87. Встроенный ktv_start объявляет в манифесте <feature>vod_get_stream_info</feature> (код r24)88. Встроенный VOD r25 (MainVod) по get_vod_stream_info возвращает объект {url, markers} (код r25)89. Нужна ли сторонним плагинам эта feature, чтобы оболочка позвала метод, — гипотеза, см. «Не проверено».

Фреймворк shell_ext (код r25). Movie::get_vod_info бросает исключение при пустом списке серий, иначе строит PluginVodInfo с initial_series_ndx, buffering_ms и keep_playing_on_reenter=true (код r25)90. AbstractVod::get_buffering_ms по умолчанию возвращает 3000, а get_vod_stream_url бросает «Not implemented.» — его переопределяют только при playback_url_is_stream_url=false (код r25)91. MovieSeries по умолчанию имеет playback_url_is_stream_url=true (код r25)92.

Реклама. SDK строит pre-roll и post-roll цепочкой PluginVodPlay с advert_mode, переходы — через GUI_EVENT_PLAYBACK_STOP в actions (SDK)93. Рекламу в середине видео SDK прямо не поддерживает, а предложенный обход называет непроверенным (SDK)94: таймер, проверка позиции и возврат к основному видео с initial_position_ms (SDK)95.

1.3. ТВ: PluginTvInfo, каналы, URL канала

Из наблюдений ТВ-воспроизведения плагина на r25 в этом разделе одно — заголовки из ответа get_tv_playback_url (проверка на устройстве); всё остальное ниже — SDK и код.

Минимум. ТВ требует get_tv_info() и get_tv_playback_url(); архив — ненулевого $archive_tm_sec, защищённые каналы — непустого $protect_code (SDK)96. Сигнатура — get_tv_playback_url($channel_id, $archive_tm_sec, $protect_code, &$plugin_cookies) (SDK)97. get_tv_info() вызывается, когда GUI исполняет PLUGIN_TV_PLAY (SDK)98; $media_url — подсказка, какой канал играть первым (SDK)99.

Playback URL и stream URL.

  • get_tv_playback_url() возвращает строку: live при $archive_tm_sec <= 0, архив при > 0 (SDK)100; вызывается каждый раз, когда воспроизведение канала начинается или возобновляется (SDK)101.
  • При PluginTvChannel::playback_url_is_stream_url == false нужен ещё вызов get_tv_stream_url() с playback URL (SDK)102; при TRUE get_tv_stream_url() никогда не вызывается (SDK)103.
  • Разделение нужно, когда фиксированного URL потока нет и он получается удалённым вызовом (SDK)104. Playback URL при этом служит предварительной инициализации движка и должен иметь правильный префикс, например http://ts:// (SDK)105.
  • В коде r24 оболочка, если есть input_data->program_id и метод get_tv_playback_url_v2, вызывает его с program_id; иначе — обычный get_tv_playback_url (код r24)106.
  • При остановке воспроизведения исполнитель операций r24 снимает из очереди и отменяет get_day_epg, get_tv_playback_url и get_tv_stream_url (код r24)107 (подробнее — guide/plugin-operations.md §1.1).
  • В единственном прогоне на tv188b r25 (device) ответ get_tv_playback_url с engine:1,http_headers:X-KB11-TV%3A%20one привёл к GET ?g=tv от ExoPlayer с X-KB11-TV: one и ответом 200 (устройство r25)12; суффикс разобран в §2.3.

PluginTvInfo. В SDK 22 поля (SDK)108, в dune_api.php r24 — 43 ключа, в том числе keep_playing_on_reload, keep_playing_on_reenter, initial_trick_play, archive, ext_epg_* (код r24)109. Начальные initial_group_id, initial_channel_id, initial_favorites, initial_archive_tm необязательны (SDK)110; положительный initial_archive_tm запускает архив с этой метки GMT (SDK)111. actions и timer в PluginTvInfo есть с прошивки 131029_b9 (SDK)112.

Каналы. PluginTvChannel::buffering_ms — предбуферизация канала (SDK)113; have_archive требует поддержки архива в get_tv_playback_url() (SDK)114; archive_past_sec и archive_delay_sec задают окно архива (SDK)115; timeshift_hours не реализован (SDK)116. Защищённый канал: при custom_protect_code_handling строка 'protected' из get_tv_playback_url() вызывает диалог кода (SDK)117 — в другом месте SDK описано иначе, см. «Расхождения».

Фреймворк shell_ext (код r25). AbstractTv::get_tv_playback_url возвращает get_streaming_url() канала и не использует archive_ts и protect_code, а get_tv_stream_url по умолчанию бросает исключение (код r25)118. DefaultChannel по умолчанию: архив и защита выключены, EPG — 14 дней назад и 7 вперёд, get_buffering_ms — 0 (код r25)119.

EPG (get_day_epg, epg_mode, PluginUpdateEpgAction) — отдельная тема; здесь только то, что EPG-кэш в памяти плеера обновляет PluginUpdateEpgAction и только в режиме ТВ-воспроизведения плагина (SDK)120.

1.4. Плейлисты и серии

  • Серии VOD — подобие плейлиста внутри одного запуска (SDK)72; на r25 оболочка сама переходит к следующей серии по концу файла (device) (устройство r25)121.
  • Плейлист из файла или папки — playlist_play или launch_media_url (§1.1).
  • Плагин downloads r25 (device) при одном воспроизводимом файле торрента сразу запускает поток TorrServer, без open_magnet.m3u (устройство r25)122; плейлист для нескольких файлов — по коду, не проверен (§7).

2. Какие URL понимает плеер

2.1. Префиксы, схемы и dune_params

Префиксы SDK. Примеры VOD stream URL: http://mp4://host[:port][/path] для MP4 по HTTP (самый рекомендуемый), http://ts://… для TS, http://host… для прочих контейнеров (поддержка ограничена), mms:// (ограничена) (SDK)123. Примеры ТВ: udp:/@ip-address:port для multicast TS-over-UDP и http://ts://host[:port][/path] для TS-over-HTTP (SDK)124.

Префиксы в коде. Перед проверкой media_check оболочка r24 снимает хвост |||dune_params||| и заменяет http(s)://mp4:// и http(s)://ts:// на http(s):// (код r24)125. Плагин GlobalTV на локальных URL заменяет http://localhost: на http://ts://localhost: (код)126. YouTube r22 превращал http(s):// в http(s)://mp4://, а к DASH-манифесту дописывал /.mpd (код r22)127.

dune_params. UrlUtils::append_dune_param r25 добавляет параметр как |||dune_params|||<параметр>, а если магия уже есть — через запятую (код r25)9. При http_headers с заголовками через сырую запятую в сохранённом запросе ExoPlayer для playback_url серии остался только первый (tv188b r25, §2.3) (устройство r25)128. Что встречается в коде и прогонах:

Параметр Кто ставит или читает Claim
protocol:hls, hls_ignore_chunk_errors:0 встроенный VOD r25 (MainVod); на не-Android второй параметр теряется из-за ошибки в коде (код r25)129
http_online_subs:1, file_id:<путь> downloads r25 для потока из торрента (код r25)130
bufind_mode:1; на Android engine:1; для архива mediainfo:0 плагин GlobalTV (код)131
http_headers:<заголовки> ставит плагин в URL; r25, device: при engine:1 заголовок из playback_url серии с playback_url_is_stream_url=true и, при проверке на устройстве, из ответа get_vod_stream_url приходит на HTTP-сервер; в playback_url серии %3B и ; дали отдельные заголовки, при сырой запятой и ,, — только первый (§2.3). Механика разборщика по коду — §7 (устройство r25)132
udt:<значение> читает разборщик libduneshell.so r25 (code): байт для PlaybackParams.httpUdt равен 1, если есть udt: и нет udt:0 (§2.3); проверка на устройстве: в логе виден разбор engine:1, но не значение httpUdt (§2.3); включение плагином не проверено — §7 (устройство r25, код r25)133

По документу IP Control протокол 4 разрешил dune_params в start_bluray_playback, m3u и dune_folder.txt (SDK)134. Как плеер r25 разбирает суффикс dune_params и udt, по коду — §2.3 (код r25)135, механика http_headers — §7, выбор движка через engine — в §3. Как он применяет остальные параметры таблиц этого раздела, claims не говорят.

Параметры dune_params по SDK (на r24+ не подтверждено). SDK задаёт синтаксис <media_url>|||dune_params|||param1:value1,...,paramN:valueN, например http://myserver.com/my_content|||dune_params|||protocol:hls,buffering_ms:2000 (SDK)136. Таблица ниже — текст SDK: значения по умолчанию, номера прошивок (140223_b9+, 150321_r10+ и т. п.) и платформы 867x+ взяты оттуда. Для r24+ всё это не подтверждено; у protocol в строке указан код r25, который этот параметр ставит.

Параметр Назначение Значения (по умолчанию) Где работает по SDK Claim
rtsp_tcp 0 — предпочитать RTSP+RTP с автоопределением RTSP-TCP, когда это возможно; 1 — принудительно RTSP-TCP 0, 1 (0) только RTSP (SDK)137
rtsp_seek_via_reopen 0 — seek без полного переоткрытия RTSP-потока; 1 — с полным переоткрытием (нужно или полезно для некоторых RTSP-серверов) 0, 1 (1) только RTSP (SDK)138
protocol принудительно включает HLS для HTTP URL, который не оканчивается на .m3u8 и не содержит .m3u8? hls — единственное поддерживаемое (autodetect) HTTP URL; protocol:hls ставит встроенный VOD r25 (таблица выше) (код r25, SDK)139
hls_initial_bandwidth начальный битрейт при старте HLS: low — минимально возможный, high — максимально возможный, auto — последний запомненный фактический или минимальный (рекомендуемый), auto_high — последний запомненный или максимальный low, high, auto, auto_high (по настройкам пользователя, то есть auto) HLS (SDK)140
hls_key_url_add_query строка добавляется к query-части URL AES-ключа HLS: если query уже есть — через &, иначе через ?; запятая внутри строки пишется двойной: aaa=bbb,,ccc означает aaa=bbb,ccc строка (none) только HLS и только при AES-шифровании (SDK)141
hls_bw_strategy 0 — плеер максимизирует качество и переключает вариант даже при недостаточной пропускной способности, если буферизация позволяет временно играть более высокий битрейт; 1 — переключать варианты реже и только когда пропускная способность больше выбранного варианта 0, 1 (0) только HLS (SDK)142
hls_sticky_live обход для скользящего окна live-плейлиста: появившийся в нём из-за сбоя тег конца списка игнорируется 0, 1 (1) только HLS; на HLS VOD не влияет (SDK)143
enable_seek 0 — запретить seek по времени; 1 — разрешить, когда это возможно, то есть для VOD-контента 0, 1 (1) по тексту «сейчас» только HLS (SDK)144
deint_mode режим деинтерлейсинга; пример — IPTV-канал с чересстрочным видео, которому нужен adaptive, даже если у пользователя выбран bob off, bob, adaptive, adaptive_plus (по настройкам пользователя) adaptive_plus — прошивка 150318_b9+ (SDK)145
force_deint принудительный деинтерлейсинг: off — только когда контент распознан как чересстрочный; tff, bff — принудительно с предположением top-field-first или bottom-field-first; use_mpeg2_pseq — эвристически принудительно для MPEG-2, который заявляет прогрессивность, но на деле чересстрочный off, tff, bff, use_mpeg2_pseq (use_mpeg2_pseq для MPEG-TS, иначе off) — (SDK)146
buffering_ms период буферизации в миллисекундах; для HLS влияние на старт сильно зависит от пропускной способности и может быть почти незаметным, если она намного выше битрейта. Поле PluginVodInfo::buffering_ms — §1.2 1..60000 (по настройкам пользователя) только MPEG-TS-потоки: HTTP/TS, HLS, RTSP, UDP multicast, DVB (SDK)147
vmx_iptv_enh_buffering улучшенная буферизация Verimatrix IPTV: 1 ускоряет переключение каналов; 0 полезен для диагностики и/или на очень высоких битрейтах и заодно выключает PSI-оптимизацию для multicast, переопределяя psi_opt 0, 1 (1) только multicast URL (SDK)148
psi_opt уровень оптимизаций при открытии потока: 0 — без оптимизаций, 1 — некоторые, 2 — более агрессивные 0, 1, 2 (1 для HLS, 2 для RTSP, иначе 0) только MPEG-TS-потоки: HTTP/TS, HLS, RTSP, UDP multicast (SDK)149
fast_prebuf быстрый старт в особых случаях, в основном для локального multicast-прокси при быстром переключении каналов; на обычных трансляциях вероятны сбои буферизации 0, 1 (0) только multicast MPEG-TS (SDK)150
ll_prebuf_for_http_ts быстрый старт (низколатентная предбуферизация) только для очень стабильных источников; при нём не рекомендуется buffering_ms ниже 300, а высокое значение непрактично 0, 1 (0) только MPEG-TS через HTTP/TS (SDK)151
ll_display_for_http_ts низколатентный показ: каждый видеокадр выводится почти сразу после полного получения; для потоков, специально оптимизированных под низкую задержку 0, 1 (0) только MPEG-TS через HTTP/TS (SDK)152
ll_display_for_http_ts_audio_delay задержка звука относительно видео при ll_display_for_http_ts:1 — для стабильного звука ценой некоторого отставания миллисекунды (100) только MPEG-TS через HTTP/TS (SDK)153
buffering_skip_to_keyframe при старте пропускает часть (аудио)данных, для которых нет воспроизводимого видео; без необходимости использовать не рекомендуется 0, 1 (0) только MPEG-TS-потоки: HTTP/TS (лишь при ll_prebuf_for_http_ts:1), HLS, RTSP, UDP multicast; на VOD и радио не влияет (SDK)154
pcr использовать ли PCR для синхронизации часов; 0 может помочь при ошибках PCR, но меняет поведение буферизации и без крайней необходимости не рекомендуется 0, 1 (0 для локальных файлов, иначе 1) только локальные MPEG-TS-файлы, HLS и MPEG-TS через HTTP/TS; для multicast, DVB и RTSP не поддерживается — PCR там используется всегда (SDK)155
keep_pic оставлять последний кадр вместо чёрного экрана при переключении между MPEG-TS-потоками; эффект только при оптимизированном переключении без полного перезапуска движка 0, 1 (1) MPEG-TS (SDK)156
keep_audio_pid сохраняет audio PID при смене содержимого программы и не выбирает его заново по языковым предпочтениям; специфический обходной приём 0, 1 (0) MPEG-TS (SDK)157
recording_encryption записи LPVR пишутся на диск в зашифрованном виде, играются только на том же STB 0, 1 (0) только MPEG-TS: HLS, UDP multicast, DVB (SDK)158
pcr_disc_ms порог восстановления после разрыва PCR в миллисекундах: разрыв больше порога — перезапуск демультиплексора с быстрым восстановлением, иначе ожидание, равное разрыву; не работает при pcr:0 или реальном отсутствии PCR 1… (10000000 для HLS, иначе 10000) HLS, RTSP, HTTP/TS, не multicast/DVB; прошивки 140223_b9+, 140424_b8+ (SDK)159
cancel_ll_prebuf 1 — ранняя отмена низколатентной предбуферизации, когда данных считается достаточно; если после переключения каналов пропадает звук, рекомендуется 0 0, 1 (1) только multicast/DVB и только платформы 867x+; прошивка 140312_b9+ (SDK)160
shorter_ll_prebuf 1 — сокращает низколатентную предбуферизацию на оценённую длительность уже буферизованных данных; требует cancel_ll_prebuf:1, в основном экспериментальный 0, 1 (0) только multicast/DVB и только платформы 867x+; прошивка 140312_b9+ (SDK)161
hls_seek_live seek, пауза и отчёт о длительности и позиции для live (sliding window) HLS. С 150610_r10+ диапазон seek [0, duration] исключает несколько первых и последних сегментов, при менее чем шести сегментах поток не допускает seek. Пауза разрешена для любого live HLS. Позиция: position = duration - offset, на старте равна duration, на паузе уменьшается на 1 в секунду до нуля, seek за duration — возврат к live 0, 1 (0) только HLS; прошивка 140226_b9+ (SDK)162
hls_forced_type считать тип ассета другим; приоритет над hls_sticky_live, но ассет без end-list как VoD не сыграет; в основном для event-ассетов без явного типа vod, event, sliding_window (по ассету) только HLS; прошивка 140225_b9+ (SDK)163
hls_v4_audio существенно ограниченная поддержка аудиодорожек HLS v4 в подходящих ассетах 1 (0) только HLS; прошивка 131009_b9+ (SDK)164
program_number номер программы (service id) явно: при многопрограммном потоке и когда PAT перечисляет несколько программ, а присутствует одна и не первая. Несуществующая программа — без звука и видео; приоритет над номером в DVB URL 1… (autodetect) любой MPEG-TS; прошивка 140218_b9+ (SDK)165
ss_for_http_ts переключение между двумя HTTP/TS-потоками без полного перезапуска движка; эффект есть, только когда оба потока идут через HTTP/TS и у обоих media URL параметр равен 1 1 (0) только MPEG-TS через HTTP/TS; прошивка 140814_b9+ (SDK)166
vmx_drm если возможно, переопределяет статус Verimatrix DRM: отключить Verimatrix IPTV, отключить или включить Verimatrix Web (меняя способ получения ключей) 0, 1 (по медиа и запрошенному DRM) MPEG-TS, где применимы Verimatrix IPTV и Verimatrix Web; прошивка 150321_r10+ (SDK)167
item_id выбор элемента многоэлементного ассета 0… (autodetect или выбор пользователя) некоторые многоэлементные ассеты; прошивка 150312_r10+ (SDK)168
item_position позиция продолжения в элементе, когда указан item_id 0… (0 или закладка) некоторые многоэлементные ассеты; прошивка 150312_r10+ (SDK)169

Схемы. APK r24 принимает VIEW-интенты для медиа со схемами file, content, http, https, rtp, rtsp, smb, nfs (код r24)170. На r25 (device) am start -a android.intent.action.VIEW -t video/* из php_server открывает системный выбор приложений с DUNE первым (устройство r25)171, выбор DUNE запускает VLC через PlayerProxyActivity (устройство r25)172, а явный запуск PlayerProxyActivity без action VIEW VOD не запускает (устройство r25)173. Явный запуск с action VIEW (am start -a android.intent.action.VIEW -n com.dunehd.app/com.dunehd.shell.PlayerProxyActivity -d <HTTP MP4> -t video/*) играет через VLC (устройство r25)174, а с extra com.dunehd.playback.dune_params = engine:1 — через ExoPlayer (устройство r25)175. Встроенная история r25 для file:// дописывает к URL save_watch_history=1 и show_in_recent=1 и запускает его через launch_media_url_ext (код r25)176. Какие транспорты есть в libvlc.so, известно только по именам символов — см. «Не проверено».

2.2. Отдача файла из самого плагина

На r25 (device) httpd плеера отдаёт файлы из www плагина:

  • с Range: запрос байтов 0–1023 дал 206 Partial Content и верный Content-Range (устройство r25)177;
  • через символическую ссылку из www на каталог вне плагина, например на SMB-ресурс (устройство r25)178;
  • .mkv уходит с Content-type: text/html (на HEAD заголовка нет) (устройство r25)179.

plugin_www_url у плагина — http://127.0.0.1:80/plugins/<плагин>/ (устройство r25)180. URL http://127.0.0.1/plugins/… от поставщика оболочка приняла без изменений (устройство r25)181. Сыграл ли плеер такой .mkv с text/html, claims не говорят.

2.3. HTTP: заголовки, тайм-ауты, редиректы (код r25)

Что видно на r25 (device, две проверки на устройстве).

Наблюдение Claim
Перед запросами VLC оболочка делает GET тестового MP4 с User-Agent: DuneHD/1.0, Icy-MetaData: 1 и X-Dune-Serial-Number (устройство r25)182
VLC (HTTP MP4): User-Agent из http_headers (URL-кодированный или сырой) не применяется — сервер видит VLC/3.0.15 LibVLC/3.0.15 (устройство r25)183
VLC (HTTP MP4): http_headers:X-KB8-Test%3A%20one не передаёт X-KB8-Test серверу (устройство r25)184
VLC следует HTTP 302 (устройство r25)185
ExoPlayer (HLS): User-Agent ExoPlayerDemo/1.0.1-13-261021_0117_r25 (Linux;Android 11) ExoPlayerLib/2.14.0 (устройство r25)186
ExoPlayer (HTTP MP4, engine:1): тот же User-Agent и Accept-Encoding: identity (устройство r25)187
Перед запросом ExoPlayer оболочка сама делает GET того же URL с User-Agent: DuneHD/1.0 …, Range: bytes=0-, Icy-MetaData: 1 и X-Dune-Serial-Number (устройство r25)188
ExoPlayer: User-Agent из http_headers заменяет ExoPlayerDemo/… во всех трёх проверенных формах — URL-кодированной, «сырой» и с запятой в значении (устройство r25)16
ExoPlayer: два заголовка через %2C пришли одной строкой User-Agent: KB9-UA2/1.0,X-KB9-Test: one — разделителем заголовков %2C не служит (устройство r25)17
ExoPlayer проходит HTTP 302: после 302 с Location второй GET получает 200 (устройство r25)189

Итого на r25: свой User-Agent через http_headers задаётся на ExoPlayer (устройство r25)16, а на VLC — нет (устройство r25)183. Из редиректов ExoPlayer на устройстве проверен только 302 http → http (устройство r25)189; прочие коды и переход между протоколами — нет, поэтому перечень кодов по коду (disputed) стоит в §7. Другие регистры User-Agent и несколько отдельных строк User-Agent на устройстве не проверялись; обычные заголовки отдельными строками — проверка на устройстве, ниже. Таблица ниже — Java-классы dune.apk r25 (code).

Что ExoPlayer (ExoPlayerImpl) Claims
User-Agent по умолчанию Util.getUserAgent(context, "ExoPlayerDemo") (код r25)190
Свой User-Agent, прочие заголовки разбор params.httpHeaders по коду — disputed, §7; на устройстве User-Agent заменяется (таблица выше), а X-A и X-B через %3B или ; приходят отдельно (ниже) (устройство r25)191
Порядок defaultRequestProperties, requestProperties, карта запроса; что затем отдельно ставятся Range, User-Agent, Accept-Encoding, — disputed, §7 (код r25)192
Тайм-ауты connect 8000 мс, read 50000 мс (код r25)193
Редиректы allowCrossProtocolRedirects; только http/https; больше 20 — Too many redirects; перечень кодов 300/301/302/303/307/308 — disputed, §7 (код r25)194
httpUdt=true вместо HTTP-фабрики — HttpUdtDataSource: URL уходит в native _open, заголовки не сохраняются, код ответа 200/404 — по descriptor, а не HTTP-статус сервера, заголовков ответа нет; buildDataSourceFactory выбирает фабрику без вызовов логгера в обеих ветвях. Что видно на устройстве с udt — ниже (код r25)195

Другие пути:

  • Android MediaPlayer (MediaPlayerImpl) вызывает setDataSource(Context, Uri) без карты заголовков (код r25)196.
  • Собственный HLS-запрос InternalPlayer — HttpURLConnection с connect 5000 и read 3000 мс; заголовки переносятся, разбитые по первому : (код r25)197.

Как задать params.httpHeaders и httpUdt из PHP (r25). Заголовки потока задаются суффиксом |||dune_params|||http_headers:… у URL. На tv188b 261021_0117_r25 (device) суффикс |||dune_params|||engine:1,http_headers:… в playback_url серии с playback_url_is_stream_url=true, когда get_vod_stream_url не вызывается, доходит до строки лога [player] parsing dune params, а заданный заголовок приходит на HTTP-сервер (устройство r25)10. Это прогон на ExoPlayer (устройство r25)16; у HTTP MP4 на VLC http_headers не доходят (таблица выше).

Путь значения по коду libduneshell.so r25 (code):

  1. Функция 0x00204178 ищет в URL |||dune_params||| и разбирает всё после разделителя поиском ключей (код r25)198. Для playback URL её вызывает 0x001fad30 через 0x001edab0 (код r25)199. В ветви process_new_url параметры в stream URL читаются, лишь когда в playback URL разделителя не было (код r25)200.
  2. При ключе http_headers: разборщик копирует значение до первой запятой или конца строки, вызывает html_utils_unescape и, если результат непуст, делит его string_array_split по ; и сохраняет массив в глобальную переменную — слот GOT -0x2630 (код r25)201. Как значение делится на устройстве — таблица проверки на устройстве ниже; что из этого следует для %2C, — §7. Этот слот освобождает и обнуляет функция 0x00203bcc (код r25)202; вызов сброса на устройстве не снят — §7.
  3. Цикл плеера 0x001f8870 кладёт массив в смещение +0x50 структуры параметров и передаёт её в 0x000bb510 (код r25)203. Эта нативная обёртка internal_player_api_play преобразует поле в Java-массив (код r25)204, а конструктор PlaybackParams присваивает его полю httpHeaders (код r25)205.

httpUdt приходит из того же суффикса (code): разборщик ставит глобальный байт в 1, если в параметрах есть udt: и нет udt:0, а цикл плеера копирует этот байт в +0x2c структуры (код r25)206; обёртка превращает ненулевое значение в true (код r25)207, конструктор присваивает его полю httpUdt (код r25)208. Встроенная ветвь: plugin_next_set_urls при свойстве ktv_vod_service и ненулевом результате помощника 0x00404af8 сама добавляет http_headers через dune_params_append к playback URL и, если задан, к stream URL (код r25)209.

Ответ get_vod_stream_url при playback_url_is_stream_url=false оболочка (device) передаёт вторым URL в SET_URLS, первым остаётся playback_url серии (устройство r25)210.

Заголовки потока при проверке на устройстве (tv188b r25, device, один прогон). Везде engine:1; другие прошивки и устройства не проверялись.

Что подано Что записал HTTP-сервер Claim
Ответ get_vod_stream_url с http_headers:X-KB477%3A%20one, playback_url=kbplazy://0 без суффикса запрос ExoPlayer /m/kb9-a.mp4?b=lazy без суффикса dune_params, с X-KB477: one (устройство r25)11
playback_url с http_headers:X-A%3A%201%3BX-B%3A%202 отдельные заголовки X-A: 1 и X-B: 2 (устройство r25)211
playback_url с http_headers:X-A%3A%201;X-B%3A%202 отдельные заголовки X-A: 1 и X-B: 2 (устройство r25)212
playback_url с http_headers:X-A%3A%201,X-B%3A%202 в сохранённом запросе ExoPlayer X-A: 1, без X-B (устройство r25)128
playback_url с http_headers:X-A%3A%201,,X-B%3A%202 в сохранённом запросе ExoPlayer X-A: 1, без X-B (устройство r25)213
Серия 1 с http_headers:X-KB11-G%3A%20one GET ?g=1 от ExoPlayer с X-KB11-G: one и ответом 200; предварительный GET DuneHD этого заголовка не содержал (устройство r25)214
Автопереход на серию 2 без http_headers оба GET ?g=2 (DuneHD и ExoPlayer) без X-KB11-G; ExoPlayer получил 200 (устройство r25)215

Заголовки из ответа get_tv_playback_url — §1.3.

udt при проверке на устройстве (tv188b r25, device, один прогон, engine:1).

Параметр Что записал HTTP-сервер Статус на t=10
без udt (d=none) предварительный запрос DuneHD с ответом 206 и запрос ExoPlayer с ответом 200 (устройство r25)216 playing, позиция 7 (устройство r25)217
udt:0 (d=0) предварительный запрос DuneHD с ответом 206 и запрос ExoPlayer с ответом 200 (устройство r25)216 playing, позиция 8 (устройство r25)217
udt:1 (d=1) только запрос DuneHD с ответом 206 (устройство r25)216 buffering, позиция 0, после чего скрипт послал Stop (устройство r25)217

Логи показывают разбор engine:1 и выбор playback engine: ExoPlayer во всех трёх случаях, но не значение httpUdt и не выбор фабрики DataSource, даже в контроле без udt (устройство r25)218. Какой DataSource работал при udt:1, прогон поэтому не показывает — см. §7.

В коде плагинов (прошивка в этих claims не указана) приём тот же: link_api Smart VOD дописывает |||dune_params|||http_headers: с urlencode-заголовками для sibnet, sovetromantica и Twitch (код)219, LiteIPTV для архива добавляет непустой ua параметром http_headers (код)220, ProIPTV передаёт User-Agent: … ключом http_headers и экранирует запятые в user-agent из #EXTHTTP как ,, (код)221. При проверке на tv188b r25 форма X-A%3A%201,,X-B%3A%202 в playback_url серии дала в сохранённом запросе ExoPlayer только X-A: 1 (устройство r25)213; ,, внутри значения одного заголовка — см. §7. По SDK, на r24+ не подтверждено: ,, внутри значения означает запятую у параметра hls_key_url_add_query (§2.1) (SDK)141.

PHP-фреймворк для своих запросов ставит User-Agent «DuneHD/1.0 (product_id: …; firmware_version: …)» (код r24)222, но к заголовкам плеера это отношения не имеет.

2.4. HLS, DASH, Smooth Streaming и прочее (код r25)

PlaybackParams.contentType: 0 — UNKNOWN, 1 — HTTP_TS, 2 — HTTP_FILE, 3 — DASH, 4 — HLS, 5 — SS, 6 — HTTP_AUDIO, 7 — DVB (код r25)223. ExoPlayer строит источник по нему: HLS — HlsMediaSource (код r25)224, DASH — DashMediaSource (код r25)225, SS — SsMediaSource (код r25)226, остальное — ProgressiveMediaSource (код r25)227. Для HLS при enableDrm=true и типе 3 создаётся VMXWebKeyDataSource (код r25)228. По какому правилу плеер определяет contentType по URL плагина, claims не говорят; значения, наблюдавшиеся на r25, — в §3.

2.5. Торрент и magnet

  • r25, device: launch_media_url по IP Control с голой magnet: отклоняется («qualified url is expected») (устройство r25)229, а HTTPS-URL .torrent не запустил ни воспроизведения, ни downloads (устройство r25)230.
  • r25, device: magnet открывается действием open_magnet плагина downloads (устройство r25)231; цепочка запускает TorrServer и показывает диалог «Воспроизвести / Скачать все файлы» (устройство r25)232.

Устройство downloads и TorrServer — в главе о загрузках.

2.6. Субтитры

  • SDK: subtitles_osd_enabled включает OSD выбора субтитров в VOD и ТВ, по умолчанию включено, с прошивки 140521_b9 (SDK)233.
  • r25, code: внешние субтитры приходят в PlaybackParams тремя массивами externalSubtitles* (код r25)234. Добавлять их умеет только libVLC: VLCPlayerImpl.addingSubtitlesSupported — true (код r25)235, и при создании media каждый элемент externalSubtitles идёт в addSlave (код r25)236. У ExoPlayer и MediaPlayerImpl addSubtitles пустой, а addingSubtitlesSupported — false (код r25)237.
  • Онлайн-субтитры ищет subtitles.php (команды search и rating) (код r25)238: в DuneMDB (код r25)239 и в REST API OpenSubtitles (код r25)240; файл в r24 и r25 одинаковый (код r24, r25)241. Кто вызывает его во время воспроизведения, claims не говорят; downloads добавляет к URL потока параметр http_online_subs:1 (код r25)130.
  • Поток с субтитрами в PlaybackParams от плагина — не восстановлено: это часть моста PHP → Java.

3. Какой плеер срабатывает

Раздел — код r25 (code), кроме таблицы наблюдений проверки на устройстве (device).

Что играло на r25 (device, две проверки на устройстве). Главное: обычный файл по HTTP (contentType=2) идёт на VLC, ExoPlayer — HLS и явный engine:1 (устройство r25)242.

Поток Движок Claim
MP4 по HTTP без engine VLC, contentType=2 (HTTP_FILE) (устройство r25)243
MKV из www плагина и по HTTP с компьютера VLC, contentType=2 (устройство r25)244
локальный VOD /tmp/test_plugin8/kb8-local.mp4 VLC, contentType=0; открыт как file:///data/data/com.dunehd.app/tmp/test_plugin8/kb8-local.mp4 (устройство r25)245
HLS с TS-сегментами ExoPlayer, contentType=4 (устройство r25)246
локальный MP4 с dune_params engine:1 ExoPlayer (устройство r25)247
HTTP MP4 с dune_params engine:2 VLC (устройство r25)248
HTTP MP4 с dune_params engine:1 ExoPlayer (устройство r25)249
HTTP MP4 явным am start VIEW в PlayerProxyActivity VLC; с extra dune_params = engine:1 — ExoPlayer (§2.1) (устройство r25)250

Библиотеки. В r25 есть priv-app/dune/lib/arm/libvlc.so (36 300 964 байта) (код r25)251; в r24 libvlc.so лежит там же (код r24)252, в tv175u — в dunehd_shell/lib/arm/ (код r24)253. В dex APK r24 есть пакеты shell.internalplayer, ExoPlayer и libVLC (org.videolan.libvlc) (код r24)254.

Движки. InternalPlayerAPI.play(String, PlaybackParams) передаёт оба аргумента в InternalPlayer.play (код r25)255. Реализацию по engine выбирает createPlayerImpl; соответствие значений классам по коду — disputed (§7): проверка на устройстве подтвердил engine:1 → ExoPlayer и engine:2 → VLC (устройство r25)20, значение 4 не проверялось.

Как выбирается engine (determinePlaybackEngine).

  1. Сначала могут сработать особые ветви: HLS, Blu-ray, ExFS, forceHifiImpl (код r25)256. При engine=-1 и HLS с initFragment, mp4 или onlyAltRenditionsForAudio выбирается ExoPlayer (1) (код r25)257.
  2. Для промежуточного engine -1 или 0 вызывается платформенный getPlaybackEngineOverride (код r25)256:
  3. базовый APKPlatform: 1 (ExoPlayer) для потокового HTTP, иначе 2 (libVLC) (код r25)258;
  4. FwAPKAmlogicPlatform — своё правило с веткой video.codec; оно disputed (§7). «Потоковый HTTP» — HTTP/HTTPS URL, кроме случаев, которые isNonStreamingHTTP считает непотоковыми; contentType 1, 6, 4, 3, 5 из непотоковых исключены (код r25)259.
  5. Затем по очереди проверяются файлы-флаги force_vlc_experimental, force_exoplayer, force_hplayer, force_platform_player, force_media_player; более поздний перезаписывает выбор (код r25)260.

engine:1 в dune_params ставит GlobalTV на Android (код)261; на r25 такой параметр выбирает ExoPlayer (устройство r25)247. Какой из платформенных классов работает на tv188b и как engine из dune_params попадает в PlaybackParams, claims не говорят. Абсолютный путь из PluginVodInfo на r25 дошёл до VLC как file:// (устройство r25)245; детали safeParseURL по коду — §7.

Платформы по SDK. На Android ядро плеера иное; добавлены 4Kp60 и Widevine DRM (SDK)262. SMP87xx поддерживает протоколы и форматы SMP86xx и больше, например DASH и H.265, но возможны несовместимости (SDK)263; на SMP87xx есть фоновое воспроизведение, и плагин должен учитывать навигацию по своим экранам во время своей сессии (SDK)264.

4. События, OSD, позиция, история

4.1. События VOD на r25 (device)

Через PluginVodInfo::actions при VOD приходят цветные клавиши, timer, остановка, а также playback_user_action, playback_switched, playback_state_changed и playback_going_to_switch; на каждое оболочка исполняет назначенный plugin_handle_user_input (устройство r25)21.

Событие Когда и с чем Claims
playback_state_changed (первое) сразу после ответа plugin_vod_play, до запуска плеера; play_mode none, selected_media_url точки входа, plugin_playback_start=1, playback_position 8 при initial_position_ms=8000 (устройство r25)265
playback_user_action при старте серии: playback_event_type Play, playback_position, playback_url — для ленивой серии URL из get_vod_stream_url (устройство r25)266
playback_switched на первый URL и на каждый следующий при автопереходе; после playback_user_action, до playing (устройство r25)267
playback_state_changed plugin_playback_events — JSON {"events":[…]} с playss_id, tm_sec, tm_usec, state; состояния initializing, buffering, seeking, playing, finished, deinitializing, stopped; в одном событии бывает несколько смен (устройство r25)268
timer с ChangeBehaviour delay_ms 5000 в ответ на каждый — раз в ~5 с; первый — ~5 с после первого playing серии; несёт playback_position (устройство r25)269
цветные клавиши control_id ev_key_a_red … ev_key_d_blue, поля plugin_vod_id, plugin_vod_series_ndx, plugin_vod_sel_series_ndx, playback_browser_activated; без playback_position (устройство r25)270
playback_going_to_switch и в конце последней серии, когда перехода нет: после stopped, прямо перед playback_stop (устройство r25)271
playback_stop по концу файла: plugin_vod_id, plugin_vod_series_ndx, plugin_vod_stop_position, plugin_vod_duration, plugin_vod_start_tm, plugin_vod_stop_tm, plugin_vod_prebuffering_end_tm, playback_end_of_stream=1; без playback_position (устройство r25)272
playback_stop при автопереходе приходит и между сериями — до get_vod_stream_url следующей (устройство r25)273
playback_state_changed после остановки те же поля и plugin_playback_stop=1, без plugin_playback_events (устройство r25)274

Ручное управление (проверка на устройстве):

Что Что видно Claims
нецветные клавиши в actions доставляются key_pause, key_play, стрелки, key_subtitle, key_audio, key_next, key_1, key_info, key_popup_menu (устройство r25)22
key_pause в actions перехватывает PAUSE: плагин получает событие, воспроизведение продолжается (устройство r25)275
IR PAUSE/PLAY при actions только на цветные playback_user_action с playback_event_type Pause/Resume (устройство r25)276
IP Control set_playback_state speed=0, speed=256, position=30 пауза, возобновление, переход к 30-й секунде (устройство r25)277
те же команды IP Control playback_state_changed, но без playback_user_action (устройство r25)278
ручной STOP действие playback_stop запускается после перехода Android-плеера в STOPPED (устройство r25)279

Перемотку с пульта и события в ТВ-воспроизведении база не записывает.

4.2. События по SDK

  • GUI_EVENT_PLAYBACK_STOP: когда SDK его генерирует и что плеер делает при назначенном действии — после проверки на устройстве оба утверждения disputed (§7); порядок на r25 — §4.1 и «Расхождения». По SDK повторное STOP/POWER-OFF отменяет назначенное на остановку действие (SDK)280.
  • С прошивки 150529: GUI_EVENT_PLAYBACK_SWITCHED — после переключения на новый media URL, включая первый (SDK)281; GUI_EVENT_PLAYBACK_GOING_TO_SWITCH — перед переключением, но не при остановке и выключении (SDK)282, и плеер не ждёт его действия (SDK)283.
  • GUI_EVENT_TIMER генерируется один раз по истечении delay_ms (SDK)284; новый таймер обычно задаётся ChangeBehaviour (SDK)285. С 131029_b9 таймер работает и в ТВ (SDK)286.
  • Про клавиши SDK говорит двояко, и обе стороны после проверки на устройстве disputed — см. «Расхождения» и §7.

4.3. OSD плагина (SDK и код r24)

Действие Что делает Claims
plugin_update_osd (с 150528_r10) рисует свои картинки и однострочные тексты под штатным OSD; новый список заменяет прежний; держатся до следующего действия или остановки; только в TV/VOD плагина (SDK)287
PluginOsdComponent x, y, image_url или text, размеры, text_font_size, text_color 0..23, text_halo; картинка грузится асинхронно (SDK)288
plugin_update_info_block (с 150526_r10) многострочный текст над информационным блоком (INFO); виден вместе с блоком; только в TV/VOD плагина (SDK)289

В r24 и r25 константа PLUGIN_UPDATE_OSD_ACTION_ID="plugin_update_osd" есть в dune_api.php (код r25)290, а libduneshell.so r24 знает plugin_update_osd и plugin_update_info_block (код r24)291. На r25 OSD плагина не проверялся. OSD навигации по каналам и сериям оболочка рисует сама (SDK)292.

4.4. Позиция и «Продолжить»

  • r25, device: initial_position_ms задаёт старт начальной серии, следующая серия идёт с 0 (устройство r25)3. Позицию дают timer и playback_user_action, при остановке — plugin_vod_stop_position (§4.1).
  • SDK предлагает запоминать позицию по GUI_EVENT_TIMER, сохранять её по GUI_EVENT_PLAYBACK_STOP и подставлять в initial_position_ms при следующем старте (SDK)293.
  • r25, device: повторный VOD с initial_position_ms=-1 и тем же recent_uid предлагает продолжить с сохранённых 33 с, и «Продолжить» запускает с 33 с (устройство r25)294; пока диалог открыт, VOD не стартует — в прогоне между vod_play и выбором прошло около 7 минут (устройство r25)295.
  • Другие пути SDK названы временными, вне официального API: поле playback_position файла /tmp/run/ext_command.state (SDK)296 и чтение файла resume_state.properties (что SDK пишет о нём, — disputed, §7); в примере — plugin_vod_id, plugin_vod_series_ndx, plugin_vod_position_seconds, plugin_tv_channel и другие (SDK)297.
  • r25, device: resume_state.properties лежит в $FS_PREFIX/config (/data/data/com.dunehd.app/config), а /config/resume_state.properties нет (устройство r25)298; после ручного STOP VOD тестового плагина в нём plugin_name=test_plugin8 и plugin_vod_position_seconds=33 (устройство r25)299. Чтение файла из PHP и ext_command.state на r25 не проверялись.
  • auto_resume (по умолчанию выключен) при включении и выходе из standby восстанавливает live-ТВ, архив и VOD (SDK)300; вместо стандарта можно задать своё действие, ему передаются значения resume_state.properties (SDK)301. Плагин GlobalTV на автовозобновлении читает resume_tv_* и resume_media_url и отвечает tv_play (код)302.

4.5. История и «Недавнее»

  • r25, device: запись истории plugin VOD получает uid из recent_uid серии, action_plugin — из recent_plugin, action_params — из recent_action_params (устройство r25)25. При проверке на устройстве по концу каждой из двух серий (RUN_POSTPLAY_ACTIONS, eos: yes) появилось по записи — uid kbp9:e1:1 и kbp9:e1:2, index 0 и 1, с action_plugin/action_params, без ключей url и video_id (устройство r25)24. Полный перечень полей записи по более раннему прогону (с video_id) — в «Расхождениях», §6.
  • r25, device: история лежит в $FS_PREFIX/config/watch_history, файлами JSON до 40 записей (устройство r25)303; новые записи дописываются в последний файл: за прогон 000034.json вырос с 30 до 34 записей (устройство r25)304.
  • r25, device (проверка на устройстве): при ручном STOP запись добавляется через ~1 мс после state2 deinitializing -> stopped; у такой записи нет полей index и video_id (устройство r25)26. Запись сохраняется после am force-stop и перезапуска приложения (устройство r25)305.
  • r25, device (проверка на устройстве): каждый из 7 запусков с recent_uid в series[] дал запись, повторный запуск того же recent_uid — вторую (устройство r25)306; 12 запусков без recent_uid записей не дали (устройство r25)27.
  • Запуск из «Недавнего» записи с action_plugin — handle_user_input этого плагина с wh_* (r25, device) (устройство r25)307; код и поля вызова — guide/movie-suppliers.md §11.1. Подробности, «Продолжить» у поставщика и пороги «Просмотрено» — там же, §11.

5. Отличия прошивок и классов устройств

Что r22 (tv188b 250815) r24 (tv188b 260827) r25 (tv188b 261021) APK r24 (ATV) tv175u r24
get_vod_stream_info, StreamMarker, PluginStreamInfo нет (код r22, r24)308 есть (код r22, r24)308 device: маркеры читаются (устройство r25)55, get_vod_stream_info не вызван (устройство r25)4, а с feature — вызван (устройство r25)5 StreamMarker в dune_api.php (код r24)309 —
plugin_update_osd, get_vod_stream_url в dune_api.php — — есть (код r25)290 есть (код r24)310 —
PHP-фреймворк firmware_ext/php/ — совпадает с APK и tv175u (код r24)311 — совпадает (код r24)311 совпадает (код r24)311
subtitles.php — тот же файл, что в r25 (код r24, r25)241 тот же (код r24, r25)241 — —
libvlc.so, libxxx_dune_mediainfo.so — в priv-app/dune/lib/arm/ (код r24)252; SHA256 отличается от r25 (код r24, r25)312 в priv-app/dune/lib/arm/ (код r25)251 ExoPlayer и libVLC в dex (код r24)254 в dunehd_shell/lib/arm/ (код r24)253
Платформенный класс Java — — в коде есть APKPlatform (код r25)258 и FwAPKAmlogicPlatform (§7) APKPlatform наследует GenericPlatform; есть S928XPlaybackTweaks (код r24)313 —
buffering_ms VOD — поставщики ставят 3000 (код r24)314 device: применяется (устройство r25)6 — —
Ключи состояния воспроизведения IP Control — блок имён в libduneshell.so (код r24)315 — — тот же блок (код r24)316
TorrServer — — внешнее приложение ru.yourok.torrserve в прогоне device (устройство r25)317; встроенный ts на *:8095 (проверка на устройстве) (устройство r25)318 libxxx_ts.so — TorrServer MatriX.134 (код r24)319 —

«—» значит, что в базе нет утверждения, а не что возможности нет. Наблюдения device есть только для tv188b r25; APK и tv175u по воспроизведению на устройстве не проверялись. Классы Sigma — только SDK (§3).

6. Расхождения

  • playback_going_to_switch в конце последней серии. SDK: событие не генерируется при остановке и выключении (SDK)282; r25 (device): приходит в конце последней серии, когда перехода нет и плеер закрывается (устройство r25)271. Стороны связаны conflicts_with.
  • PluginVodInfo::buffering_ms. SDK: не реализован (SDK)320; r25 (device): оболочка применяет 3000 мс (устройство r25)6. Стороны связаны conflicts_with.
  • Клавиши в VOD. Одна сторона — r25 (device): при регистрации в actions плагину доставляются нецветные клавиши (устройство r25)22, цветные — тоже (устройство r25)321. Другая — SDK, который сам себе противоречит: в описании PluginVodInfo::actions из клавиш поддержаны только цветные, а в разделе событий с 131029_b9 — все клавиши в TV и VOD. После проверки на устройстве все три утверждения SDK disputed, поэтому они перечислены в §7; conflicts_with с device-claim есть у «только цветные», а между двумя местами SDK — тоже есть.
  • Перечень событий VOD. Перечень SDK обрывается (disputed, §7); на r25 приходят ещё четыре события (устройство r25)21. Это не противоречие, а неполнота SDK.
  • Действие на GUI_EVENT_PLAYBACK_STOP. r25 (device): при ручном STOP действие playback_stop запускается уже после перехода Android-плеера в STOPPED (устройство r25)279. SDK описывает обратный порядок — сначала пауза и действие, потом остановка; это утверждение disputed и стоит в §7, связь conflicts_with есть.
  • Путь resume_state.properties. r25 (device): файл лежит в $FS_PREFIX/config, /config/resume_state.properties нет (устройство r25)298. SDK называет путь /config/resume_state.properties (API 120531_2200_beta); эти утверждения disputed и стоят в §7, связь conflicts_with есть.
  • Защищённый канал. Одно место SDK: при custom_protect_code_handling 'protected' возвращает get_tv_playback_url() (SDK)117; другое: protect_code кодируется в playback URL, а 'protected' возвращает get_tv_stream_url() (SDK)322. Стороны связаны conflicts_with.
  • Глубина архива. Одно место SDK — archive_past_days 14 дней (SDK)323; объявление PluginTvChannel — только archive_past_sec (SDK)324. Стороны связаны conflicts_with.
  • Имя параметра get_vod_stream_url. В объявлении — $media_url, в обзоре и в описании операции — $playback_url (SDK)325. На r25 в input_data приходит ключ media_url (устройство r25)52.
  • video_id в записи истории plugin VOD. При проверке на устройстве запись по концу серии содержит caption, ctype video, pos, len, start, watched и video_id «hash:F077E72E6AD27E99» (устройство r25)326; при проверке на устройстве у записей по концу двух серий ключа video_id нет ни в одной (устройство r25)24. Обе — tv188b r25, device; утверждения связаны conflicts_with.
  • Тип маркера recap в коде r25. dune_api.php задаёт STREAM_MARKER_RECAP='recap' (код r25)64; нативный конвертер StreamMarkerType той же сборки по коду возвращает 1 для recap` с завершающей обратной кавычкой и -1 для остальных строк, кроме intro и closing_credits (код r25)65. При проверке на tv188b r25 recap дал в shell.log type intro и кнопку «Пропустить заставку», а recap` — type recap и «Пропустить вступление» (устройство r25)327 (§1.2). Стороны связаны conflicts_with; запись об ошибке — BUG-037.

7. Не проверено

Гипотезы (inference) и disputed; кандидаты на проверку на устройстве или в коде.

Утверждение Статус Claim
PHP URL и параметры попадают в Java InternalPlayerAPI.play через нативную оболочку; передача PHP URL и параметров в Java не восстановлена, кроме http_headers и udt, путь которых по коду разобран — §2.3 inference (вывод r25)328
Из кода разборщика 0x00204178 (§2.3) следует, что запятая, полученная разэкранированием (%2C), заголовки не разделяет, а ; (сырой или %3B) — разделяет. Проверка на устройстве: деление по %3B и ;, обрыв на сырой запятой и ,, (§2.3); %2C на устройстве дал одну строку заголовка (устройство r25)17, но путь разэкранированной запятой, запись в слот GOT и ветвь пустого результата не трассировались (код r25)201; ,, внутри значения одного заголовка, как у ProIPTV (§2.3), не подавалась inference (вывод r25)329
Код: функция 0x00203bcc освобождает массив слота GOT -0x2630 через string_array_free и обнуляет слот. Проверка на устройстве: на серии 2 без http_headers заголовка серии 1 нет (устройство r25)215, но вызов string_array_free и обнуление слота лог не показал code (код r25)202
По трём маркерам проверки на устройстве конечный тип на OSD согласуется с таблицей конвертера StreamMarkerType (§1.2) для intro и recap`, а recap, для которого конвертер по коду возвращает -1, дал type intro. closing_credits, прочие строки, NULL и сами коды возврата на устройстве не проверялись; что натив делает с -1, claims не разбирают inference (вывод r25)330
Плагин включает HttpUdtDataSource параметром udt:1 при engine:1 (любое значение, кроме начинающегося с 0). Проверка на устройстве: в логе виден разбор engine:1, выбран ExoPlayer, сервер записал только запрос DuneHD, статус на t=10 buffering (устройство r25)331; значение httpUdt и фабрика не сняты (нужен trace), а buffering HttpUdtDataSource не доказывает inference (вывод r25)332
features/feature в манифесте объявляет необязательные возможности, например vod_get_stream_info — вызов get_vod_stream_info; r25, device: с этой feature метод вызван (§1.2), нужна ли она — не проверено inference (вывод r24)333
Код: после проверок remote/DVB createPlayerImpl выбирает по engine 1 — ExoPlayerImpl, 2 — VLCPlayerImpl, 4 — MediaPlayerImpl. Проверка на устройстве: 1 и 2 подтверждены (§3), 4 не проверялось code, disputed (код r25)334
Код: FwAPKAmlogicPlatform.getPlaybackEngineOverride — 1 для потокового HTTP, иначе 0 при video.codec=7 и 2 в остальных случаях. Проверка на устройстве согласуется (HTTP-файл contentType=2 и локальный файл — VLC, HLS — ExoPlayer, §3; ожидание «HTTP mp4 → ExoPlayer» было неверным), ветка codec=7 не проверялась code, disputed (код r25)335
Код: safeParseURL для абсолютного пути делает escapeExcludedCharacters и добавляет file://, до этого снимает file://, ExFS — через exfsPathToExternalURI. Проверка на устройстве: путь → file:// подтверждён (§3), остальное не проверялось code, disputed (код r25)336
SDK: launch_media_url заходит в папки, m3u/pls и собирает аудио, видео, картинки, DVD/Blu-ray, swf://, www://. Проверка на устройстве: подтверждён только заход в M3U (§1.1) doc, disputed (SDK)337
SDK: GUI_EVENT_PLAYBACK_STOP — при остановке, выключении питания или перед переключением. r25: остановка — да (19 сессий VOD), переключение — проверка на устройстве, выключение не проверялось doc, disputed (SDK)338
SDK: при назначенном на STOP действии плеер приостанавливается, ждёт цепочку действий и потом останавливается. r25: порядок обратный (§6) doc, disputed (SDK)339
SDK: в PluginVodInfo::actions из клавиш поддержаны только цветные; ещё GUI_EVENT_TIMER и GUI_EVENT_PLAYBACK_STOP, перечень обрывается. r25: нецветные клавиши доходят (§4.1, §6) doc, disputed (SDK)340
SDK: с 131029_b9 все клавишные события можно использовать в TV- и VOD-воспроизведении. r25: в VOD подтверждены перечисленные в §4.1 клавиши, TV не проверялось doc, disputed (SDK)341
SDK: с 131029_b9 добавлены GUI_EVENT_KEY_FWD, …_REW, …_STOP, …_SUBTITLE, …_AUDIO и др. (20 событий). r25, VOD: подтверждены только SUBTITLE и AUDIO doc, disputed (SDK)342
SDK, подход B: PHP читает /config/resume_state.properties и задаёт initial_position_ms. r25: файл в $FS_PREFIX/config (§4.4, §6), чтение из PHP не проверено doc, disputed (SDK)343
SDK, подход C: /config/resume_state.properties создаётся даже без auto_resume и читается PHP. r25: файл обновляется у тестового плагина без auto_resume в манифесте, но путь иной; чтение из PHP не проверено doc, disputed (SDK)344
Код downloads: play_magnet для нескольких файлов пишет open_magnet.m3u и запускает file://-плейлист. Проверка на устройстве: один файл — прямой поток (§1.4); проверка на устройстве: шесть .avi — open_magnet.m3u по file:// (устройство r25)345 code, disputed (код r25)346
Для HTTP MP4 через явный PlayerProxyActivity нужен action VIEW (§2.1); r25, device: с VIEW — играет (устройство r25)174, без — нет (устройство r25)173 inference, verified (вывод r25)347
Код: ExoPlayerImpl.play берёт User-Agent из строки params.httpHeaders с точным регистрозависимым префиксом User-Agent:, последняя побеждает. r25, device: замена подтверждена (устройство r25)16, другой регистр и несколько отдельных строк User-Agent не проверены code, disputed (код r25)348
Код: setHTTPHeaders пропускает строки User-Agent:, прочие делит по первому : в default request properties. r25, device: %2C дал одну строку (устройство r25)17; проверка на устройстве: X-A и X-B через %3B или ; пришли отдельными заголовками (устройство r25)13; случаи без пробела и с несколькими :, сохранение в default request properties не проверены code, disputed (код r25)349
Код: после общей карты заголовков makeConnection отдельно ставит Range, User-Agent и Accept-Encoding (gzip или identity). r25, device: у ExoPlayer видны свой User-Agent и Accept-Encoding: identity (устройство r25)187 code, disputed (код r25)350
Код: ручной цикл DefaultHttpDataSource.makeConnection следует Location при 300, 301, 302, 303, 307 и 308. r25, device: подтверждён только 302 http → http (устройство r25)189 code, disputed (код r25)351
Проверку URL поставщика проходят абсолютный путь и схема из строчных латинских букв, -, _; m3u8://, HTTP:// отвергаются inference, verified (вывод r24)352
Команды запуска IP Control требуют полного URL со схемой (nfs://, storage_name://) inference (вывод r24)353
Блок имён playback_* в libduneshell.so — ключи ответа cmd=status и ext_command.state inference (вывод r24)354
Транспорты libvlc.so по именам символов: file, HTTP, FTP, RTMP*, RTP, RTSP, UDP, MMSH, MMST inference (вывод r25)355
Доступ libvlc.so к NFS и SMB inference (вывод r25)356
Контейнеры libvlc.so: AVI, FLV, Matroska, MOV/MP4, MPEG-TS/PS, Ogg inference (вывод r25)357
HLS через libvlc.so inference (вывод r25)358
Субтитры libvlc.so: ASS/SSA, SRT, WebVTT; точки подключения внешних субтитров inference (вывод r25)359
dune_mediainfo распознаёт HLS/m3u8, DASH/mpd, MKV, TS, MP4 и др.; принимает HTTP, HTTPS, UDF inference (вывод r25)360
Для «Продолжить» у кнопки поставщика история plugin VOD должна содержать uid <sup_id>:…, movie_id и len>0, pos>=0 inference (вывод r25)361
«Просмотрено» для plugin VOD с не-URL uid хранится только отметкой фильма в watched_movies.txt inference (вывод r25)362

    • doc-sdk-plugins--gui-actions.c041 · doc · any-documented; прошивка — · PluginVodPlayAction запускает VOD-воспроизведение по vod_info, а если оно не задано — по результату get_vod_info($current_media_url), где $current_media_url — media_url выбранного элемента папки (null, если ничего не выбрано)
    • fw-tv188b-261021-0117-r25--shell-ext--ui-lib--tv-vod.c068 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · ActionFactory::tv_play возвращает действие только с handler_string_id PLUGIN_TV_PLAY_ACTION_ID; ActionFactory::vod_play($vod_info=null) добавляет data[PluginVodPlayActionData::vod_info]=$vod_info, поэтому вызовы экранов без аргумента передают vod_info=null.

    ↩

    • fw-tv188b-261021-0117-r25.c279 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 для серии VOD с playback_url_is_stream_url=false оболочка перед её стартом вызывает get_vod_stream_url — и при автопереходе к ней, и при старте VOD с неё (initial_series_ndx=1) — и играет возвращённый URL.
    • fw-tv188b-261021-0117-r25.c278 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 серию VOD с playback_url_is_stream_url=true оболочка играет по playback_url как есть (путь к файлу /tmp/mnt/smb/…), без вызова get_vod_stream_url или get_vod_stream_info.

    ↩

    • fw-tv188b-261021-0117-r25.c263 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 при PluginVodInfo::initial_position_ms=8000 воспроизведение начальной серии VOD началось с позиции 8 с — и при initial_series_ndx=0, и при initial_series_ndx=1.
    • fw-tv188b-261021-0117-r25.c264 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 следующая серия VOD после автоперехода по окончании предыдущей начинается с позиции 0, а не с PluginVodInfo::initial_position_ms (8000).

    ↩↩

  1. fw-tv188b-261021-0117-r25.c281 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 для ленивой серии VOD оболочка вызвала только get_vod_stream_url; get_vod_stream_info не вызывалась ни разу, хотя плагин-тестовый плагин реализует оба метода. ↩↩↩

  2. fw-tv188b-261021-0117-r25--media-player.c061 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 ленивая серия при feature vod_get_stream_info вызывает get_vod_stream_info с playback_url kbp8lazy://a6lazy. ↩↩↩

  3. fw-tv188b-261021-0117-r25.c287 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 при старте VOD тестового плагина test_plugin6 с PluginVodInfo::buffering_ms=3000 оболочка пишет в shell.log «[player] setting buffering to 3000ms» и «[player] DEBUG: using special buffering 3000ms». ↩↩↩↩

    • doc-sdk-plugins--gui-actions.c037 · doc · any-documented; прошивка — · PluginTvPlayAction запускает TV-воспроизведение: берёт media_url выбранного элемента папки (null, если ничего не выбрано), выполняет Get_tv_info($media_url) и инициализирует состояние по полученному PluginTvInfo
    • doc-sdk-plugins--operations.c089 · doc · any-documented; прошивка — · get_tv_playback_url() вызывается каждый раз, когда воспроизведение канала начинается или возобновляется

    ↩

    • doc-sdk-plugins--operations.c115 · doc · any-documented; прошивка — · Примеры VOD stream URL: MP4 по HTTP — http://mp4://host[:port][/path] (самый рекомендуемый); TS по HTTP — http://ts://…; иной контейнер по HTTP — http://host… (поддержка и производительность ограничены); MMS — mms://host[/path] (поддержка ограничена)
    • doc-sdk-plugins--operations.c092 · doc · any-documented; прошивка — · Примеры ТВ stream URL: multicast TS-over-UDP (raw UDP или RTP-over-UDP) — udp:/@ip-address:port; unicast TS-over-HTTP — http://ts://host[:port][/path]

    ↩

  4. fw-tv188b-261021-0117-r25--builtin-plugins-misc.c010 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · UrlUtils::append_dune_param добавляет параметр к URL как «|||dune_params|||» + параметр, а если магия в URL уже есть — через запятую без повторной магии. ↩↩

  5. fw-tv188b-261021-0117-r25--java-player--native-vod-bridge.c022 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 суффикс |||dune_params|||engine:1,http_headers:… в playback_url серии (playback_url_is_stream_url=true, get_vod_stream_url не вызывается) доходит до "[player] parsing dune params", а заданный заголовок приходит на HTTP-сервер. Значение с %2C осталось одной строкой: User-Agent стал "KB9-UA2/1.0,X-KB9-Test: one". ↩↩

  6. fw-tv188b-261021-0117-r25--java-player--native-vod-bridge.c030 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При проверке на tv188b r25 при playback_url=kbplazy://0 без суффикса ответ get_vod_stream_url с engine:1,http_headers:X-KB477%3A%20one дал серверу запрос ExoPlayer /m/kb9-a.mp4?b=lazy без суффикса dune_params и с заголовком X-KB477: one. ↩↩

  7. fw-tv188b-261021-0117-r25--java-player--native-vod-bridge.c045 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В единственном прогоне на tv188b r25 ответ get_tv_playback_url с engine:1,http_headers:X-KB11-TV%3A%20one привёл к GET ?g=tv от ExoPlayer с X-KB11-TV: one и ответом 200. ↩↩

    • fw-tv188b-261021-0117-r25--java-player--native-vod-bridge.c031 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При проверке на tv188b r25 playback_url с engine:1,http_headers:X-A%3A%201%3BX-B%3A%202 дал в запросе ExoPlayer два отдельных заголовка X-A: 1 и X-B: 2.
    • fw-tv188b-261021-0117-r25--java-player--native-vod-bridge.c032 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При проверке на tv188b r25 playback_url с engine:1,http_headers:X-A%3A%201;X-B%3A%202 дал в запросе ExoPlayer два отдельных заголовка X-A: 1 и X-B: 2.

    ↩↩↩

    • fw-tv188b-261021-0117-r25--java-player--native-vod-bridge.c033 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При проверке на tv188b r25 playback_url с engine:1,http_headers:X-A%3A%201,X-B%3A%202 дал в сохранённом запросе ExoPlayer заголовок X-A: 1, без X-B.
    • fw-tv188b-261021-0117-r25--java-player--native-vod-bridge.c034 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При проверке на tv188b r25 playback_url с engine:1,http_headers:X-A%3A%201,,X-B%3A%202 дал в сохранённом запросе ExoPlayer заголовок X-A: 1, без X-B.

    ↩

    • fw-tv188b-261021-0117-r25--java-player--native-vod-bridge.c013 · code · android-dune-fw; прошивка 261021_0117_r25 · Функция 0x00204178 ищет в переданной строке "|||dune_params|||": нет — возвращает 0; есть — разбирает всё после разделителя (смещение +17) поиском ключей через strstr и в конце возвращает 1.
    • fw-tv188b-261021-0117-r25--java-player--native-vod-bridge.c015 · code · android-dune-fw; прошивка 261021_0117_r25 · Цикл плеера 0x001f8870 обнуляет структуру по адресу sp+0x110 (0xbc байт), кладёт значение слота GOT -0x2630 в sp+0x160 (смещение +0x50 структуры) и передаёт структуру вторым аргументом в 0x000bb510. Так массив из http_headers: попадает в PlaybackParams.httpHeaders.
    • fw-tv188b-261021-0117-r25--java-player--native-vod-bridge.c016 · code · android-dune-fw; прошивка 261021_0117_r25 · Разборщик 0x00204178 ставит глобальный байт (слот GOT -0x2644) в 1, если в параметрах есть "udt:" и нет "udt:0"; цикл плеера 0x001f8870 копирует этот байт в sp+0x13c (+0x2c структуры), откуда он идёт в PlaybackParams.httpUdt.
    • fw-tv188b-261021-0117-r25--java-player--native-vod-bridge.c004 · code · android-dune-fw; прошивка 261021_0117_r25 · Нативная обёртка internal_player_api_play (0x000bb510) преобразует поле параметров по смещению 0x50 в Java-массив и передаёт его в позицию httpHeaders конструктора PlaybackParams.
    • fw-tv188b-261021-0117-r25--java-player--native-vod-bridge.c005 · code · android-dune-fw; прошивка 261021_0117_r25 · Нативная обёртка internal_player_api_play преобразует int по смещению 0x2c структуры параметров в четвёртый boolean конструктора PlaybackParams (httpUdt): ненулевой int даёт true.
    • fw-tv188b-261021-0117-r25--java-player--native-vod-bridge.c006 · code · android-dune-fw; прошивка 261021_0117_r25 · Помощник 0x000b914c создаёт Java-массив длины native_array[0] (для NULL — 0) и поэлементно переносит строки из native_array[1], сохраняя индексы.
    • fw-tv188b-261021-0117-r25--java-player--native-vod-bridge.c002 · code · android-dune-fw; прошивка 261021_0117_r25 · Конструктор Java PlaybackParams r25 присваивает аргумент String[] после frameRate и engine полю httpHeaders.
    • fw-tv188b-261021-0117-r25--java-player--native-vod-bridge.c003 · code · android-dune-fw; прошивка 261021_0117_r25 · Конструктор Java PlaybackParams r25 присваивает четвёртый аргумент boolean полю httpUdt.

    ↩

  8. fw-tv188b-261021-0117-r25--java-player.c069 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 все три проверенные формы params.httpHeaders заменяют User-Agent ExoPlayer на заданный: URL-кодированная, «сырая» и форма с запятой в значении. ↩↩↩↩↩

  9. fw-tv188b-261021-0117-r25--java-player.c070 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 два заголовка, переданные через %2C, пришли одной строкой «User-Agent: KB9-UA2/1.0,X-KB9-Test: one». ↩↩↩↩

    • fw-tv188b-261021-0117-r25--java-player.c057 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 http_headers с User-Agent (URL-кодированный либо сырой вид) у HTTP MP4 на VLC не заменяет User-Agent: сервер видит VLC/3.0.15 LibVLC/3.0.15.
    • fw-tv188b-261021-0117-r25--java-player.c058 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 http_headers:X-KB8-Test%3A%20one у HTTP MP4 на VLC не передаёт X-KB8-Test серверу.

    ↩

    • fw-tv188b-261021-0117-r25--java-player.c051 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 тестовый MP4 по HTTP без engine запускается через VLC с contentType=2 (HTTP_FILE).
    • fw-tv188b-261021-0117-r25--java-player.c052 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 тестовый MKV воспроизводится через VLC с contentType=2 как из www плагина, так и по HTTP с компьютера.
    • fw-tv188b-261021-0117-r25--java-player.c053 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 локальный VOD /tmp/test_plugin8/kb8-local.mp4 запускается через VLC с contentType=0; VLC открывает file:///data/data/com.dunehd.app/tmp/test_plugin8/kb8-local.mp4.
    • fw-tv188b-261021-0117-r25--java-player.c054 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 тестовый HLS с TS-сегментами запускается через ExoPlayer с contentType=4.

    ↩

    • fw-tv188b-261021-0117-r25--java-player.c055 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 добавление dune_params engine:1 к тестовому локальному MP4 выбирает ExoPlayer.
    • fw-tv188b-261021-0117-r25--java-player.c056 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 dune_params engine:2 для тестового HTTP MP4 выбирает VLC.

    ↩↩

  10. fw-tv188b-261021-0117-r25.c265 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 через PluginVodInfo::actions при VOD приходят не только события цветных клавиш, таймера и остановки, но и playback_user_action, playback_switched, playback_state_changed и playback_going_to_switch — оболочка исполняет назначенное на них действие plugin_handle_user_input. ↩↩↩

  11. fw-tv188b-261021-0117-r25--media-player.c053 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 при регистрации actions в plugin VOD плагину доставляются key_pause, key_play, стрелки, key_subtitle, key_audio, key_next, key_1, key_info и key_popup_menu. ↩↩↩

    • fw-tv188b-261021-0117-r25--shell-ext--entry-handler.c086 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 цветные клавиши пульта во время plugin VOD приходят плагину как handle_user_input с control_id ev_key_a_red, ev_key_b_green, ev_key_c_yellow, ev_key_d_blue и полями plugin_vod_id, plugin_vod_series_ndx, plugin_vod_sel_series_ndx, но без playback_position; playback_position есть у ev_timer.
    • fw-tv188b-261021-0117-r25.c270 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 событие playback_stop VOD по окончании файла несёт plugin_vod_id, plugin_vod_series_ndx, plugin_vod_stop_position, plugin_vod_duration, plugin_vod_start_tm, plugin_vod_stop_tm, plugin_vod_prebuffering_end_tm и playback_end_of_stream=1, без playback_position.

    ↩

  12. fw-tv188b-261021-0117-r25--shell-ext--entry-handler.c094 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 по концу каждой из двух серий plugin VOD (RUN_POSTPLAY_ACTIONS, eos: yes) оболочка добавила запись истории: uid kbp9:e1:1 и kbp9:e1:2, action_plugin/action_params, index 0/1, без ключей url и video_id. ↩↩↩

  13. fw-tv188b-261021-0117-r25--shell-ext--entry-handler.c087 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 запись истории plugin VOD получает uid из PluginVodSeriesInfo::recent_uid, action_plugin из PluginVodInfo::recent_plugin и action_params из PluginVodInfo::recent_action_params. ↩↩

  14. fw-tv188b-261021-0117-r25--shell-ext--entry-handler.c092 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В прогоне collect8 при ручном STOP (ir_code STOP) plugin VOD test_plugin8 запись истории добавляется сразу после перехода plugin_playback в stopped: wh D: (ADD) start 1793353828, 20 of 75, url '(null)', m '(null)', a test_plugin8:2; force 1 — в 09:50:51.005973, через ~1 мс после state2 deinitializing -> stopped (09:50:51.005088); uid 'kbp8:a6ser'; у записи #16 в 000034.json нет полей index и video_id. ↩↩

  15. fw-tv188b-261021-0117-r25--shell-ext--entry-handler.c091 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В прогоне collect8 12 VOD-запусков блоков A1–A3 и A7 без recent_uid (в case.json поля uid нет, например a1plain) не дали записей в истории: в 000034.json было 15 записей, стало 24, и все 9 новых — это 7 запусков с recent_uid (#15–#21), B1 (#22) и торрент (#23). ↩↩

  16. doc-sdk-plugins.c070 · doc · any-documented; прошивка — · GUI-действие в PHP — массив с handler_string_id (тип) и data (параметры); среди типов PLUGIN_OPEN_FOLDER, PLUGIN_TV_PLAY, PLUGIN_VOD_PLAY и особый HANDLE_USER_INPUT, чей результат handle_user_input() исполняется как следующее действие ↩

  17. fw-tv188b-260827-0003-r24--php-framework.c116 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php (раздел «GUI-action ids») определяет идентификаторы действий GUI: LAUNCH_EXT_APP_ACTION_ID='launch_ext_app', LAUNCH_MEDIA_URL_ACTION_ID='launch_media_url', OPEN_FOLDER_ACTION_ID='open_folder', PLAYLIST_PLAY_ACTION_ID='playlist_play', PLUGIN_CLEAR_ARCHIVE_CACHE_ACTION_ID='plugin_clear_archive_cache', PLUGIN_EXIT_FOLDERS_ACTION_ID='plugin_exit_folders', PLUGIN_HANDLE_USER_INPUT_ACTION_ID='plugin_handle_user_input', PLUGIN_INVALIDATE_FOLDERS_ACTION_ID='plugin_invalidate_folders', PLUGIN_OPEN_FOLDER_ACTION_ID='plugin_open_folder', PLUGIN_REFRESH_ENTRY_POINTS_ACTION_ID='plugin_refresh_entry_points', PLUGIN_REPLACE_PATH_ACTION_ID='plugin_replace_path', PLUGIN_RUN_NATIVE_CODE_ACTION_ID='plugin_run_native_code', PLUGIN_SHOW_ERROR_ACTION_ID='plugin_show_error', PLUGIN_SYSTEM_ACTION_ID='plugin_system', PLUGIN_TV_PLAY_ACTION_ID='plugin_tv_play' ↩

    • doc-sdk-plugins--gui-actions.c040 · doc · any-documented; прошивка — · Данные PluginVodPlayAction — класс PluginVodPlayActionData с необязательным полем vod_info (PluginVodInfo, по умолчанию null)
    • doc-sdk-plugins--gui-actions.c041 · doc · any-documented; прошивка — · PluginVodPlayAction запускает VOD-воспроизведение по vod_info, а если оно не задано — по результату get_vod_info($current_media_url), где $current_media_url — media_url выбранного элемента папки (null, если ничего не выбрано)

    ↩

    • doc-sdk-plugins--gui-actions.c036 · doc · any-documented; прошивка — · Данные PluginTvPlayAction — класс PluginTvPlayActionData: initial_group_id, initial_channel_id (null — авто), initial_is_favorite (false), initial_archive_tm (unixtime_t, −1 — не задано); все необязательные
    • doc-sdk-plugins--gui-actions.c037 · doc · any-documented; прошивка — · PluginTvPlayAction запускает TV-воспроизведение: берёт media_url выбранного элемента папки (null, если ничего не выбрано), выполняет Get_tv_info($media_url) и инициализирует состояние по полученному PluginTvInfo
    • doc-sdk-plugins--gui-actions.c039 · doc · any-documented; прошивка — · Заданные параметры initial_* в PluginTvPlayAction переопределяют выбор и состояние воспроизведения по умолчанию

    ↩

  18. doc-sdk-plugins--gui-actions.c086 · doc · any-documented; прошивка — · LaunchMediaUrl рекурсивно строит плейлист с url в качестве корня, по содержимому плейлиста выбирает исполнителя и запускает его ↩

  19. doc-sdk-plugins--gui-actions.c082 · doc · any-documented; прошивка — · FilePlay (данные FilePlayActionData с полем url) запускает обычное воспроизведение одного файла; url должен указывать на аудио- или видеофайл либо поток поддерживаемого формата ↩

  20. doc-sdk-plugins--gui-actions.c083 · doc · any-documented; прошивка — · PlaylistPlay (данные PlaylistPlayActionData: url, start_index) воспроизводит плейлист, построенный из файла или папки по url; первым играет элемент с индексом start_index, если он валиден ↩

    • doc-sdk-plugins--gui-actions.c080 · doc · any-documented; прошивка — · DvdPlay (данные DvdPlayActionData с полем url) запускает DVD-воспроизведение по заданному url
    • doc-sdk-plugins--gui-actions.c081 · doc · any-documented; прошивка — · BlurayPlay (данные BlurayPlayActionData с полем url) запускает Blu-ray-воспроизведение по url; действие доступно только в прошивках с поддержкой Blu-ray

    ↩

  21. doc-sdk-plugins--gui-actions.c038 · doc · any-documented; прошивка — · Если вывод Get_tv_info невалиден, PluginTvPlayAction завершается ошибкой ↩

  22. doc-sdk-plugins.c104 · doc · any-documented; прошивка — · В 120531_2200_beta добавлены действия file_play, dvd_play, bluray_play, playlist_play, launch_media_url, change_behavior, show_black_screen, show_main_screen и события timer, playback_stop ↩

  23. fw-tv188b-261021-0117-r25--media-player.c068 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 IP Control launch_media_url с одноэлементным M3U по HTTP (компьютер либо www плагина), содержащим plugin_launcher, вызывает действие b3 и передаёт from в user_input. ↩

  24. fw-tv188b-261021-0117-r25--media-player.c069 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 GUI-действие launch_media_url с M3U из www плагина вызывает b3 по plugin_launcher и передаёт from=gui. ↩

  25. doc-sdk-plugins--gui-actions.c088 · doc · any-documented; прошивка — · Исполнители LaunchMediaUrl для плейлиста из одного элемента: DVD-плеер (DVD-папка или образ), Blu-ray-плеер (Blu-ray-папка или образ), Flash-плеер (.swf или swf://), веб-браузер (.url/*.URL или www://); фотовьювер — если в плейлисте только изображения jpg, png, bmp, gif; иначе — обычное воспроизведение файлов ↩

  26. doc-sdk-plugins--gui-actions.c084 · doc · any-documented; прошивка — · url в PlaylistPlay может указывать на одиночный локальный/сетевой/http аудио- или видеофайл (или иной поддерживаемый сетевой ресурс), на плейлист m3u/pls или на локальную/сетевую папку с аудио, видео и плейлистами ↩

  27. fw-tv188b-260827-0003-r24--php-framework.c194 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс LaunchMediaUrlActionData с ключами (9): url, caption, play_in_background, start_index, internal_player_only, resume_extra_choices, resume_ext_text, params, post_action ↩

  28. fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c026 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · ActionFactory::launch_media_url_ext строит действие launch_media_url; схема заполнения использует LaunchMediaUrlActionData::{url, caption, post_action, play_in_background, start_index, internal_player_only, resume_extra_choices, resume_ext_text, params}. play_in_background=false, start_index=-1, internal_player_only=false; params добавляются только при истинности. ↩

  29. doc-sdk-plugins--operations.c029 · doc · any-documented; прошивка — · ENTER на кнопке PLAY movie-папки: при has_multiple_series = FALSE исполняется PLUGIN_VOD_PLAY, при TRUE — PLUGIN_OPEN_FOLDER с media_url из series_media_url (сценарий сериала) ↩

  30. doc-sdk-plugins--operations.c027 · doc · any-documented; прошивка — · PluginMovieFolderView::left_button_action необязателен, по умолчанию левой кнопке назначено GUI-действие VOD_PLAY ↩

  31. doc-sdk-plugins.c079 · doc · any-documented; прошивка — · Типичный IPTV-плагин добавляет точку входа в меню TV, реагирующую на ENTER как PLUGIN_OPEN_FOLDER и на PLAY как PLUGIN_TV_PLAY, плюс точку в Setup->Applications ↩

  32. fw-tv188b-261021-0117-r25--shell-ext--ui-lib--tv-vod.c068 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · ActionFactory::tv_play возвращает действие только с handler_string_id PLUGIN_TV_PLAY_ACTION_ID; ActionFactory::vod_play($vod_info=null) добавляет data[PluginVodPlayActionData::vod_info]=$vod_info, поэтому вызовы экранов без аргумента передают vod_info=null. ↩

  33. doc-sdk-plugins.c081 · doc · any-documented; прошивка — · Во время TV/VOD-воспроизведения плагина работает playback executor, исполняющий только PluginHandleUserInput, PluginShowError, ChangeBehaviour, PluginInvalidateFolders и PluginVodPlay (с обязательным vod_info) ↩

  34. doc-sdk-plugins--gui-actions.c100 · doc · any-documented; прошивка — · С прошивки 131029_b9 CloseAndRunAction, вызванное из TV-воспроизведения или VOD-воспроизведения плагина без активного диалога, работает как остановка воспроизведения ↩

  35. fw-tv188b-261021-0117-r25.c278 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 серию VOD с playback_url_is_stream_url=true оболочка играет по playback_url как есть (путь к файлу /tmp/mnt/smb/…), без вызова get_vod_stream_url или get_vod_stream_info. ↩

  36. fw-tv188b-261021-0117-r25.c279 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 для серии VOD с playback_url_is_stream_url=false оболочка перед её стартом вызывает get_vod_stream_url — и при автопереходе к ней, и при старте VOD с неё (initial_series_ndx=1) — и играет возвращённый URL. ↩

  37. fw-tv188b-261021-0117-r25.c280 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в call_ctx операции get_vod_stream_url input_data содержит только media_url, равный playback_url ленивой серии (kbp6lazy://2); поля sel_state нет. ↩↩

  38. fw-tv188b-261021-0117-r25.c263 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 при PluginVodInfo::initial_position_ms=8000 воспроизведение начальной серии VOD началось с позиции 8 с — и при initial_series_ndx=0, и при initial_series_ndx=1. ↩

  39. fw-tv188b-261021-0117-r25.c264 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 следующая серия VOD после автоперехода по окончании предыдущей начинается с позиции 0, а не с PluginVodInfo::initial_position_ms (8000). ↩

  40. fw-tv188b-261021-0117-r25.c275 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 оболочка при старте VOD читает PluginVodSeriesInfo::markers начальной серии (playback_url_is_stream_url=true): для двух StreamMarker (intro from 2 to 12, closing_credits from 25 to 35) в shell.log «markers I: 2 markers added: 2..12,25..35». ↩↩

  41. fw-tv188b-261021-0117-r25.c276 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 StreamMarker без поля duration (только type, from, to) оболочка принимает: оба маркера серии добавлены («2 markers added»). ↩

  42. fw-tv188b-261021-0117-r25.c277 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 серия VOD без ключа PluginVodSeriesInfo::markers воспроизводится — серия «KB6 S2 lazy» без markers проиграна до конца файла. ↩

  43. fw-tv188b-261021-0117-r25.c260 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 PHP-плагин, программа которого объявляет наследника DunePluginFw с методом call_plugin() и присваивает его экземпляр в DunePluginFw::$instance (тестовый плагин test_plugin6), загружается php_server и получает от оболочки операции handle_user_input и get_vod_stream_url. ↩

    • fw-tv188b-261021-0117-r25--media-player.c062 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 intro-маркер 3–20 с из ответа get_vod_stream_info показывает на OSD кнопку «Пропустить заставку» на снимке через 6 с после запуска VOD.
    • fw-tv188b-261021-0117-r25--media-player.c063 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 intro-маркер 3–20 с из PluginVodSeriesInfo::markers показывает на OSD кнопку «Пропустить заставку» на снимке через 6 с после запуска VOD.

    ↩

    • fw-tv188b-261021-0117-r25--java-player--native-vod-bridge.c038 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При проверке на tv188b r25 для единственного маркера type=intro, from=3, to=15 без duration shell.log записал markers_osd_markers I: type intro activated for 7s.
    • fw-tv188b-261021-0117-r25--java-player--native-vod-bridge.c048 · device · android-dune-fw; прошивка 261021_0117_r25 · При проверке на tv188b r25 для маркера type=intro (from=3, to=15) на OSD через 5 с после запуска была кнопка «Пропустить заставку».

    ↩

    • fw-tv188b-261021-0117-r25--java-player--native-vod-bridge.c039 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При проверке на tv188b r25 для единственного маркера type=recap, from=3, to=15 без duration shell.log записал markers_osd_markers I: type intro activated for 7s.
    • fw-tv188b-261021-0117-r25--java-player--native-vod-bridge.c049 · device · android-dune-fw; прошивка 261021_0117_r25 · При проверке на tv188b r25 для маркера type=recap (from=3, to=15) на OSD через 5 с после запуска была кнопка «Пропустить заставку», та же, что у intro.

    ↩

    • fw-tv188b-261021-0117-r25--java-player--native-vod-bridge.c040 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При проверке на tv188b r25 для единственного маркера type=recap` с обратной кавычкой, from=3, to=15 без duration shell.log записал markers_osd_markers I: type recap activated for 7s.
    • fw-tv188b-261021-0117-r25--java-player--native-vod-bridge.c050 · device · android-dune-fw; прошивка 261021_0117_r25 · При проверке на tv188b r25 для маркера type=recap` с обратной кавычкой (from=3, to=15) на OSD через 5 с после запуска была кнопка «Пропустить вступление».

    ↩

  44. fw-tv188b-261021-0117-r25--java-player--native-vod-bridge.c040 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При проверке на tv188b r25 для единственного маркера type=recap` с обратной кавычкой, from=3, to=15 без duration shell.log записал markers_osd_markers I: type recap activated for 7s. ↩

  45. fw-tv188b-261021-0117-r25--java-player--native-vod-bridge.c011 · code · android-dune-fw; прошивка 261021_0117_r25 · dune_api.php r25 задаёт StreamMarkerType константами STREAM_MARKER_INTRO='intro', STREAM_MARKER_RECAP='recap', STREAM_MARKER_CLOSING_CREDITS='closing_credits'. ↩↩

  46. fw-tv188b-261021-0117-r25--java-player--native-vod-bridge.c012 · code · android-dune-fw; прошивка 261021_0117_r25 · Нативный конвертер StreamMarkerType r25 (0x001a6e1c) возвращает 0 для 'intro', 1 для 'recap`' с завершающей обратной кавычкой, 2 для 'closing_credits', -1 для остальных строк и NULL. ↩↩

  47. fw-tv188b-261021-0117-r25--java-player--native-vod-bridge.c049 · device · android-dune-fw; прошивка 261021_0117_r25 · При проверке на tv188b r25 для маркера type=recap (from=3, to=15) на OSD через 5 с после запуска была кнопка «Пропустить заставку», та же, что у intro. ↩

  48. fw-tv188b-261021-0117-r25--java-player--native-vod-bridge.c050 · device · android-dune-fw; прошивка 261021_0117_r25 · При проверке на tv188b r25 для маркера type=recap` с обратной кавычкой (from=3, to=15) на OSD через 5 с после запуска была кнопка «Пропустить вступление». ↩

  49. fw-tv188b-261021-0117-r25--java-player--native-vod-bridge.c010 · code · android-dune-fw; прошивка 261021_0117_r25 · Загрузчик маркеров 0x002fca08 заменяет duration меньше 1 на 7 в копии каждого допущенного маркера перед добавлением во внутренний список. ↩

  50. doc-sdk-plugins--operations.c097 · doc · any-documented; прошивка — · get_vod_info() возвращает данные для запуска VOD-воспроизведения (PluginVodInfo); необязательный $media_url — подсказка, с какой серии начать ↩

  51. doc-sdk-plugins--operations.c098 · doc · any-documented; прошивка — · get_vod_info() обычно вызывается при PLAY или ENTER на элементе папки, у которого на это событие назначено действие plugin_vod_play ↩

  52. doc-sdk-plugins--operations.c099 · doc · any-documented; прошивка — · VOD-воспроизведение плагина проигрывает список серий фильма; серий не меньше одной ↩

  53. doc-sdk-plugins--operations.c103 · doc · any-documented; прошивка — · PluginVodInfo::series — список серий, образующий подобие плейлиста; initial_series_ndx — индекс серии, с которой начинается воспроизведение ↩↩

  54. doc-sdk-plugins--operations.c100 · doc · any-documented; прошивка — · Класс PluginVodInfo в документе имеет 13 полей: name, description, poster_url, series, initial_series_ndx, initial_position_ms, buffering_ms, advert_mode, actions, timer, ip_address_required, valid_time_required, subtitles_osd_enabled ↩

  55. doc-sdk-plugins--operations.c102 · doc · any-documented; прошивка — · PluginVodInfo name, description, poster_url и series[i]->name используются для OSD ↩

  56. doc-sdk-plugins--operations.c101 · doc · any-documented; прошивка — · Класс PluginVodSeriesInfo имеет поля name, playback_url (String) и playback_url_is_stream_url (Boolean) ↩

  57. doc-sdk-plugins--operations.c111 · doc · any-documented; прошивка — · PluginVodSeriesInfo::playback_url_is_stream_url: true — playback URL используется как stream URL; false — get_vod_stream_url() вызывается каждый раз, когда нужен stream URL ↩

  58. doc-sdk-plugins--operations.c116 · doc · any-documented; прошивка — · get_vod_stream_url() вызывается при каждом старте или возобновлении воспроизведения, если series[ndx]->playback_url_is_stream_url = false; параметром передаётся series[ndx]->playback_url ↩

  59. doc-sdk-plugins--operations.c104 · doc · any-documented; прошивка — · PluginVodInfo::initial_position_ms — начальная позиция в миллисекундах; при отрицательном значении выбирается позиция по умолчанию (возможно продолжение просмотра) ↩

  60. doc-sdk-plugins--operations.c105 · doc · any-documented; прошивка — · PluginVodInfo::advert_mode = TRUE: отключены перемотка, переходы, смена скорости и т. п., OSD сильно ограничен, но доступны настройка изображения, zoom, выбор аудио и субтитров ↩

  61. doc-sdk-plugins--operations.c106 · doc · any-documented; прошивка — · PluginVodInfo::ip_address_required и valid_time_required задают поведение при недоступных IP-адресе и/или корректном времени (как у PluginTvInfo) ↩

  62. fw-tv188b-260827-0003-r24--php-framework.c253 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс PluginVodInfo с ключами (25): id, name, sub_name, description, poster_url, series, initial_series_ndx, initial_position_ms, buffering_ms, advert_mode, extra_menu_items, enter_menu_action, actions, timer, ip_address_required, valid_time_required, subtitles_osd_enabled, skip_dummy_player_on_error, keep_playing_on_reload, keep_playing_on_reenter, recent_plugin, recent_action_params, recent_group_by, recent_tags, params ↩

  63. fw-tv188b-260827-0003-r24--php-framework.c255 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс PluginVodSeriesInfo с ключами (7): name, playback_url, playback_url_is_stream_url, content_id, recent_uid, mdb_info, markers ↩

  64. fw-tv188b-260827-0003-r24--php-framework--dune-api.c158 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · В комментариях dune_api.php r24 поля PluginVodSeriesInfo::{markers} имеют C-тип (StreamMarkerList *). ↩

    • fw-tv188b-260827-0003-r24--php-framework--dune-api.c171 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · В комментариях dune_api.php r24 поля StreamMarker::{type} имеют C-тип StreamMarkerType.
    • fw-tv188b-260827-0003-r24--php-framework--dune-api.c172 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · В комментариях dune_api.php r24 поля StreamMarker::{from, to, duration} имеют C-тип int.

    ↩

  65. fw-tv188b-260827-0003-r24--php-framework.c113 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php задаёт перечисление StreamMarkerType строковыми константами: STREAM_MARKER_INTRO='intro', STREAM_MARKER_RECAP='recap', STREAM_MARKER_CLOSING_CREDITS='closing_credits' ↩

  66. fw-tv188b-260827-0003-r24--php-framework.c023 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Операция get_vod_stream_info вызывает необязательный метод плагина get_vod_stream_info($input_data, $plugin_cookies) (его нет в интерфейсе DunePlugin); если метода нет — исключение «Method not found: get_vod_stream_info» ↩

  67. fw-tv188b-260827-0003-r24--php-framework.c232 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс PluginStreamInfo с ключами (2): url, markers ↩

  68. fw-tv188b-260827-0003-r24--plugin-loader--manifest.c051 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Манифест ktv_start объявляет vod_get_stream_info; строка vod_get_stream_info есть в libduneshell.so среди строк plugin_next_url.c, а в списке операций плагина — get_vod_stream_info ↩

  69. fw-tv188b-261021-0117-r25--builtin-plugins-misc.c013 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Перед выдачей URL MainVod::do_get_vod_stream_info проверяет ответ get_series_episode_stream_options: при !isset($opts) — throw_error(get_last_error_action('errmsg_failed_to_start_playback')), при isset($opts->error) — show_error, tv_episode_not_available — «episode announced», payment_url или show_payment_info — «Playback is prohibited», отсутствие stream_url — InternalError (MV06); затем set_playback_session и возврат объекта {url, markers}. ↩

  70. fw-tv188b-261021-0117-r25--shell-ext--ui-lib--tv-vod.c056 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Movie::get_vod_info бросает Exception 'Invalid movie: series list is empty', если series_list не массив или пуст; иначе строит series с полями name, playback_url и playback_url_is_stream_url, initial_series_ndx=-1 и заменяет его индексом каждой серии с id, равным sel_id (без break, побеждает последняя); возвращает PluginVodInfo с id, name, description, poster_url, series, initial_series_ndx, buffering_ms и keep_playing_on_reenter=true. ↩

  71. fw-tv188b-261021-0117-r25--shell-ext--ui-lib--tv-vod.c043 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · AbstractVod::get_buffering_ms по умолчанию возвращает 3000; get_vod_stream_url бросает Exception 'Not implemented.' с комментарием, что метод переопределяют только при playback_url_is_stream_url=false. ↩

  72. fw-tv188b-261021-0117-r25--shell-ext--ui-lib--tv-vod.c050 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · MovieSeries требует id не null (иначе Exception 'MovieSeries::id is null'), приводит id к строке и имеет значения по умолчанию name='', playback_url='' и playback_url_is_stream_url=true. ↩

  73. doc-sdk-plugins--controls-playback.c039 · doc · any-documented; прошивка — · Пример SDK для рекламы до и после основного видео строит цепочку PluginVodPlay: pre-roll с advert_mode = TRUE, основное видео с FALSE, post-roll с TRUE; переходы запускаются через GUI_EVENT_PLAYBACK_STOP в actions первых двух видео. ↩

  74. doc-sdk-plugins--controls-playback.c040 · doc · any-documented; прошивка — · Для рекламы в середине видео SDK указывает отсутствие прямой поддержки и называет предложенный обходной подход потенциальным и реально не проверенным. ↩

    • doc-sdk-plugins--controls-playback.c041 · doc · any-documented; прошивка — · Непроверенный пример рекламы в середине видео предлагает задать PluginVodInfo::timer с задержкой в одну или несколько секунд, зарегистрировать GUI_EVENT_TIMER и по событию проверять позицию для запуска рекламы через PluginVodPlay с advert_mode = TRUE.
    • doc-sdk-plugins--controls-playback.c042 · doc · any-documented; прошивка — · В непроверенном примере рекламы в середине видео GUI_EVENT_PLAYBACK_STOP рекламы запускает основное видео с advert_mode = FALSE и initial_position_ms, указывающим позицию прерывания.

    ↩

  75. doc-sdk-plugins.c077 · doc · any-documented; прошивка — · Минимальное ТВ-воспроизведение требует get_tv_info() и get_tv_playback_url(); архив — ненулевого $archive_tm_sec, защищённые каналы — непустого $protect_code ↩

  76. doc-sdk-plugins.c057 · doc · any-documented; прошивка — · Сигнатуры: get_tv_playback_url($channel_id, $archive_tm_sec, $protect_code, &$plugin_cookies); get_day_epg($channel_id, $day_start_tm_sec, &$plugin_cookies); get_regular_folder_items($media_url, $from_ndx, &$plugin_cookies) ↩

  77. doc-sdk-plugins--operations.c039 · doc · any-documented; прошивка — · get_tv_info() вызывается, когда GUI Dune исполняет действие PLUGIN_TV_PLAY ↩

  78. doc-sdk-plugins--operations.c038 · doc · any-documented; прошивка — · get_tv_info() возвращает данные для запуска ТВ-воспроизведения плагина (PluginTvInfo); $media_url — подсказка, какой канал играть первым ↩

  79. doc-sdk-plugins--operations.c087 · doc · any-documented; прошивка — · get_tv_playback_url() возвращает строкой playback URL канала: для live при $archive_tm_sec <= 0, для архива при $archive_tm_sec > 0 ↩

  80. doc-sdk-plugins--operations.c089 · doc · any-documented; прошивка — · get_tv_playback_url() вызывается каждый раз, когда воспроизведение канала начинается или возобновляется ↩

  81. doc-sdk-plugins--operations.c090 · doc · any-documented; прошивка — · Если PluginTvChannel::playback_url_is_stream_url == false, для получения реального stream URL нужен дополнительный вызов get_tv_stream_url() с playback URL ↩

  82. doc-sdk-plugins--operations.c096 · doc · any-documented; прошивка — · При PluginTvChannel::playback_url_is_stream_url = TRUE playback URL трактуется как stream URL и get_tv_stream_url() никогда не вызывается ↩

  83. doc-sdk-plugins--operations.c093 · doc · any-documented; прошивка — · Разделение playback URL и stream URL нужно, когда плагин не может дать фиксированный URL потока и получает его удалённым вызовом, результат которого каждый раз разный ↩

  84. doc-sdk-plugins--operations.c094 · doc · any-documented; прошивка — · Playback URL при playback_url_is_stream_url = false используется для предварительной инициализации движка воспроизведения, поэтому должен иметь правильный префикс (например http://ts://), и передаётся в get_tv_stream_url() ↩

  85. fw-tv188b-260827-0003-r24--php-framework.c021 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Для get_tv_playback_url при наличии input_data->program_id и метода get_tv_playback_url_v2 вызывается get_tv_playback_url_v2($channel_id, $archive_tm, $protect_code, $program_id, $plugin_cookies); иначе — get_tv_playback_url с input_data->archive_tm ↩

  86. fw-tv188b-260827-0003-r24--plugin-loader--php-runtime--opexec.c024 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · При остановке воспроизведения (play-stop) исполнитель удаляет из очередей запросы типов 5–7 (в порядке plugin_operation.c — get_day_epg, get_tv_playback_url, get_tv_stream_url) с сообщением «plugin_opexec D: play-stop q-removing %s», а такие же активные операции отменяет с флагом fast = 1 («play-stop a-canceling req %lld»). ↩

  87. doc-sdk-plugins--operations.c040 · doc · any-documented; прошивка — · Класс PluginTvInfo в документе имеет 22 поля: server_time, groups, channels, show_group_channels_only, favorites_supported, favorite_channel_ids, favorites_icon_url, initial_group_id, initial_channel_id, initial_favorites, initial_archive_tm, actions, timer, ip_address_required, valid_time_required, epg_mode, epg_font_size, epg_day_use_local_tz, epg_day_shift_sec, custom_protect_code_handling, subtitles_osd_enabled, archive ↩

  88. fw-tv188b-260827-0003-r24--php-framework.c239 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс PluginTvInfo с ключами (43): server_time, groups, channels, channels_file, show_group_channels_only, favorites_supported, favorite_channel_ids, favorites_icon_url, initial_group_id, initial_channel_id, initial_is_favorite, initial_archive_tm, initial_trick_play, initial_trick_play_duration, initial_archive_program, actions, timer, ip_address_required, valid_time_required, ext_epg_enabled, epg_mode, epg_ttl_sec, epg_font_size, groups_text_size, groups_page_size, channels_text_size, channels_page_size, epg_text_size, epg_page_size, epg_day_use_local_tz, epg_day_shift_sec, ext_epg_base_url, ext_epg_channel_ids_url, custom_protect_code_handling, builtin_pcontrol_enabled, entered_pcode, subtitles_osd_enabled, keep_playing_on_reload, keep_playing_on_reenter, icon_auto_reducing_disabled, disable_connecting_status_osd, show_prev_next_scrolling_hint, archive ↩

  89. doc-sdk-plugins--operations.c048 · doc · any-documented; прошивка — · Поля PluginTvInfo initial_group_id, initial_channel_id, initial_favorites, initial_archive_tm задают начальное состояние и необязательны: незаданное поле выставляется автоматически ↩

  90. doc-sdk-plugins--operations.c049 · doc · any-documented; прошивка — · Положительное PluginTvInfo::initial_archive_tm запускает воспроизведение архива с этой метки времени (GMT unixtime) ↩

    • doc-sdk-plugins--operations.c050 · doc · any-documented; прошивка — · PluginTvInfo::actions — отображение {событие -> GUI-действие}; доступно с прошивки 131029_b9
    • doc-sdk-plugins--operations.c051 · doc · any-documented; прошивка — · PluginTvInfo::timer — однократное событие таймера, сбрасываемое действием ChangeBehaviour; доступно с прошивки 131029_b9

    ↩

  91. doc-sdk-plugins--operations.c067 · doc · any-documented; прошивка — · PluginTvChannel::buffering_ms — время предбуферизации при воспроизведении канала ↩

  92. doc-sdk-plugins--operations.c064 · doc · any-documented; прошивка — · PluginTvChannel::have_archive включает архив канала; тогда get_tv_playback_url() должна поддерживать архив ↩

  93. doc-sdk-plugins--operations.c071 · doc · any-documented; прошивка — · PluginTvChannel::archive_past_sec — максимальная глубина архива от текущего момента в прошлое, archive_delay_sec — интервал (в секундах) от текущего момента до ближайшего момента в прошлом, для которого архив доступен ↩

  94. doc-sdk-plugins--operations.c068 · doc · any-documented; прошивка — · PluginTvChannel::timeshift_hours (сдвиг по времени в часах) не реализован ↩

  95. doc-sdk-plugins--operations.c058 · doc · any-documented; прошивка — · PluginTvInfo::custom_protect_code_handling (с прошивки 121116): для каналов с is_protected = true, если get_tv_playback_url() вернул строку 'protected', показывается диалог кода, иначе поток считается незащищённым ↩↩

  96. fw-tv188b-261021-0117-r25--shell-ext--ui-lib--tv-vod.c018 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · AbstractTv::get_tv_stream_url по умолчанию бросает Exception 'Error: get_tv_stream_url() is not supported.', а get_tv_playback_url загружает каналы и возвращает get_channel($channel_id)->get_streaming_url(), не используя archive_ts и protect_code. ↩

  97. fw-tv188b-261021-0117-r25--shell-ext--ui-lib--tv-vod.c010 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · DefaultChannel реализует Channel поверх полей id, title, icon_url, streaming_url и массива groups; get_number возвращает -1, has_archive и is_protected — false, get_past_epg_days — 14, get_future_epg_days — 7, get_archive_past_sec — 1486400, get_archive_delay_sec — 3160, get_buffering_ms и get_timeshift_hours — 0; add_group дописывает группу в массив. ↩

    • doc-sdk-plugins--gui-actions.c131 · doc · any-documented; прошивка — · PluginUpdateEpgAction обновляет EPG, закэшированный в памяти плеера; три сценария: clear=TRUE без остальных полей — очистить весь кэш; clear=TRUE с channel_id (и, по желанию, programs на день day_start_tm_sec) — очистить кэш канала и положить новый список; clear=FALSE с channel_id, day_start_tm_sec, programs — просто обновить программу канала на день
    • doc-sdk-plugins--gui-actions.c132 · doc · any-documented; прошивка — · PluginUpdateEpgAction действует только в режиме TV-воспроизведения плагина

    ↩

    • fw-tv188b-261021-0117-r25.c264 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 следующая серия VOD после автоперехода по окончании предыдущей начинается с позиции 0, а не с PluginVodInfo::initial_position_ms (8000).
    • fw-tv188b-261021-0117-r25.c271 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 событие playback_stop приходит и при автопереходе к следующей серии VOD по окончании файла предыдущей — до вызова get_vod_stream_url для следующей серии.

    ↩

  98. fw-tv188b-261021-0117-r25--downloads.c076 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В прогоне collect8 при одном воспроизводимом файле торрента play_magnet сразу вернул downloads->launch_media_url с потоком http://127.0.0.1:8095/stream/Big%20Buck%20Bunny.mp4?link=dd8255ecdc7ca55fb0bbf81323d87062db1f6d1c&index=2&play; open_magnet.m3u и open_magnet.json в $P/tmp/plugins/downloads не созданы, выбора файла не было. ↩

  99. doc-sdk-plugins--operations.c115 · doc · any-documented; прошивка — · Примеры VOD stream URL: MP4 по HTTP — http://mp4://host[:port][/path] (самый рекомендуемый); TS по HTTP — http://ts://…; иной контейнер по HTTP — http://host… (поддержка и производительность ограничены); MMS — mms://host[/path] (поддержка ограничена) ↩

  100. doc-sdk-plugins--operations.c092 · doc · any-documented; прошивка — · Примеры ТВ stream URL: multicast TS-over-UDP (raw UDP или RTP-over-UDP) — udp:/@ip-address:port; unicast TS-over-HTTP — http://ts://host[:port][/path] ↩

  101. fw-tv188b-260827-0003-r24--movie-suppliers--stream-protocol.c028 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Перед передачей в media_check из URL убирается хвост с «|||dune_params|||», а префиксы http://mp4://, https://mp4://, http://ts://, https://ts:// заменяются на http:// или https:// ↩

  102. plg-dc-globaltv.c078 · code · unknown; прошивка — · В URL воспроизведения плагин заменяет //127.0.0.1:/ на //localhost:/ и префикс http://localhost: на http://ts://localhost:. ↩

  103. fw-tv188b-260827-0003-r24--movie-suppliers--stream-protocol.c067 · code · tv188b, android-dune-fw; прошивка 250815_1012_r22 · YoutubeStreamAPI::get_stream_media_url r22 возвращает строку «error», если ссылку получить не удалось; к адресу DASH-манифеста дописывает «/.mpd»; http:// и https:// превращает в http://mp4:// и https://mp4://; адрес не с «/» и не http(s) — тоже «error» ↩

  104. fw-tv188b-261021-0117-r25--java-player--native-vod-bridge.c033 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При проверке на tv188b r25 playback_url с engine:1,http_headers:X-A%3A%201,X-B%3A%202 дал в сохранённом запросе ExoPlayer заголовок X-A: 1, без X-B. ↩↩

  105. fw-tv188b-261021-0117-r25--builtin-plugins-misc.c011 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В MainVod::do_get_vod_stream_info URL собирается с hls_ignore_chunk_errors:0, но при !HD::is_android() второй append_dune_param снова получает исходный $opts->stream_url, поэтому на не-Android остаётся только protocol:hls, а hls_ignore_chunk_errors:0 теряется; в MainEntryHandler::play_movie_stream второй append_dune_param получает уже дополненный $stream_url, поэтому там оба параметра сохраняются. ↩

  106. fw-tv188b-261021-0117-r25--downloads.c008 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · get_magnet_playback_url добавляет к playback_url суффикс |||dune_params|||http_online_subs:1,file_id:<путь файла>. ↩↩

    • plg-dc-globaltv.c079 · code · unknown; прошивка — · К URL воспроизведения плагин добавляет суффикс |||dune_params|||: bufind_mode:1 всегда; на Android ещё engine:1 (и для live, и для архива); для архива ещё mediainfo:0.
    • plg-dc-globaltv.c061 · code · android; прошивка — · На Android плагин читает /firmware/config/android_platform.txt и считает платформу Amlogic, если строка начинается с s905; к dune_params добавляется engine:1 на любом Android.

    ↩

    • fw-tv188b-261021-0117-r25--java-player--native-vod-bridge.c022 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 суффикс |||dune_params|||engine:1,http_headers:… в playback_url серии (playback_url_is_stream_url=true, get_vod_stream_url не вызывается) доходит до "[player] parsing dune params", а заданный заголовок приходит на HTTP-сервер. Значение с %2C осталось одной строкой: User-Agent стал "KB9-UA2/1.0,X-KB9-Test: one".
    • fw-tv188b-261021-0117-r25--java-player--native-vod-bridge.c030 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При проверке на tv188b r25 при playback_url=kbplazy://0 без суффикса ответ get_vod_stream_url с engine:1,http_headers:X-KB477%3A%20one дал серверу запрос ExoPlayer /m/kb9-a.mp4?b=lazy без суффикса dune_params и с заголовком X-KB477: one.
    • fw-tv188b-261021-0117-r25--java-player--native-vod-bridge.c031 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При проверке на tv188b r25 playback_url с engine:1,http_headers:X-A%3A%201%3BX-B%3A%202 дал в запросе ExoPlayer два отдельных заголовка X-A: 1 и X-B: 2.
    • fw-tv188b-261021-0117-r25--java-player--native-vod-bridge.c032 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При проверке на tv188b r25 playback_url с engine:1,http_headers:X-A%3A%201;X-B%3A%202 дал в запросе ExoPlayer два отдельных заголовка X-A: 1 и X-B: 2.
    • fw-tv188b-261021-0117-r25--java-player--native-vod-bridge.c033 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При проверке на tv188b r25 playback_url с engine:1,http_headers:X-A%3A%201,X-B%3A%202 дал в сохранённом запросе ExoPlayer заголовок X-A: 1, без X-B.
    • fw-tv188b-261021-0117-r25--java-player--native-vod-bridge.c034 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При проверке на tv188b r25 playback_url с engine:1,http_headers:X-A%3A%201,,X-B%3A%202 дал в сохранённом запросе ExoPlayer заголовок X-A: 1, без X-B.

    ↩

    • fw-tv188b-261021-0117-r25--java-player--native-vod-bridge.c016 · code · android-dune-fw; прошивка 261021_0117_r25 · Разборщик 0x00204178 ставит глобальный байт (слот GOT -0x2644) в 1, если в параметрах есть "udt:" и нет "udt:0"; цикл плеера 0x001f8870 копирует этот байт в sp+0x13c (+0x2c структуры), откуда он идёт в PlaybackParams.httpUdt.
    • fw-tv188b-261021-0117-r25--java-player--native-vod-bridge.c037 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При проверке на tv188b r25 логи 45–47 показывают разбор engine:1 (без udt, udt:0, udt:1) и выбор playback engine: ExoPlayer во всех трёх случаях, но не показывают значение httpUdt или выбор фабрики DataSource даже в контроле без udt.

    ↩

  107. fw-tv188b-260827-0003-r24--http-api--ext-command-params.c039 · doc · any-documented; прошивка — · В протоколе 4 dune_params разрешены в start_bluray_playback, в m3u и в dune_folder.txt для Blu-ray lite ↩

    • fw-tv188b-261021-0117-r25--java-player--native-vod-bridge.c013 · code · android-dune-fw; прошивка 261021_0117_r25 · Функция 0x00204178 ищет в переданной строке "|||dune_params|||": нет — возвращает 0; есть — разбирает всё после разделителя (смещение +17) поиском ключей через strstr и в конце возвращает 1.
    • fw-tv188b-261021-0117-r25--java-player--native-vod-bridge.c016 · code · android-dune-fw; прошивка 261021_0117_r25 · Разборщик 0x00204178 ставит глобальный байт (слот GOT -0x2644) в 1, если в параметрах есть "udt:" и нет "udt:0"; цикл плеера 0x001f8870 копирует этот байт в sp+0x13c (+0x2c структуры), откуда он идёт в PlaybackParams.httpUdt.

    ↩

  108. doc-sdk-media-url.c001 · doc · any-documented; прошивка — · Параметры воспроизведения добавляются к media_url суффиксом «|||dune_params|||» и списком «param1:value1,...,paramN:valueN»; пример — «http://myserver.com/my_content|||dune_params|||protocol:hls,buffering_ms:2000». ↩

  109. doc-sdk-media-url.c002 · doc · any-documented; прошивка — · Параметр rtsp_tcp:0|1 (по умолчанию 0) действует только для RTSP: 0 — предпочитать RTSP+RTP с автоопределением RTSP-TCP, когда это возможно; 1 — принудительно использовать RTSP-TCP. ↩

  110. doc-sdk-media-url.c003 · doc · any-documented; прошивка — · Параметр rtsp_seek_via_reopen:0|1 (по умолчанию 1) действует только для RTSP: 0 — seek без полного переоткрытия RTSP-потока, 1 — с полным переоткрытием (нужно или полезно для некоторых RTSP-серверов). ↩

    • doc-sdk-media-url.c004 · doc · any-documented; прошивка — · Параметр protocol:hls (по умолчанию autodetect) — единственное поддерживаемое значение; принудительно включает HLS для HTTP URL, который не оканчивается на «.m3u8» и не содержит «.m3u8?».
    • fw-tv188b-261021-0117-r25--builtin-plugins-misc.c011 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В MainVod::do_get_vod_stream_info URL собирается с hls_ignore_chunk_errors:0, но при !HD::is_android() второй append_dune_param снова получает исходный $opts->stream_url, поэтому на не-Android остаётся только protocol:hls, а hls_ignore_chunk_errors:0 теряется; в MainEntryHandler::play_movie_stream второй append_dune_param получает уже дополненный $stream_url, поэтому там оба параметра сохраняются.

    ↩

  111. doc-sdk-media-url.c005 · doc · any-documented; прошивка — · Параметр hls_initial_bandwidth:low|high|auto|auto_high (по умолчанию — по настройкам пользователя, то есть auto) задаёт начальный битрейт при старте HLS: low — минимально возможный, high — максимально возможный, auto — последний запомненный фактический или минимальный (рекомендуемый), auto_high — последний запомненный или максимальный. ↩

  112. doc-sdk-media-url.c006 · doc · any-documented; прошивка — · Параметр hls_key_url_add_query:{string} (по умолчанию none) действует только для HLS и только при AES-шифровании: {string} добавляется к query-части URL HLS AES-ключа; если query уже есть — через «&», иначе через «?». Одиночная запятая внутри строки недопустима (разделитель параметров), вместо неё используется двойная запятая («aaa=bbb,,ccc» означает «aaa=bbb,ccc»). ↩↩

  113. doc-sdk-media-url.c007 · doc · any-documented; прошивка — · Параметр hls_bw_strategy:0|1 (по умолчанию 0) действует только для HLS: 0 — текущая стратегия, при которой плеер максимизирует качество и переключает вариант даже при недостаточной пропускной способности, если буферизация позволяет временно играть более высокий битрейт; 1 — переключать варианты реже и только когда пропускная способность больше выбранного варианта. ↩

  114. doc-sdk-media-url.c008 · doc · any-documented; прошивка — · Параметр hls_sticky_live:0|1 (по умолчанию 1) действует только для HLS и включает обходной приём для скользящего окна live-плейлиста: если из-за сбоя в нём появился тег конца списка, тег игнорируется; на воспроизведение HLS VOD параметр не влияет. ↩

  115. doc-sdk-media-url.c009 · doc · any-documented; прошивка — · Параметр enable_seek:0|1 (по умолчанию 1) действует (по тексту «сейчас») только для HLS: 0 — запретить seek по времени, 1 — разрешить, когда это возможно, то есть для VOD-контента. ↩

  116. doc-sdk-media-url.c010 · doc · any-documented; прошивка — · Параметр deint_mode:off|bob|adaptive|adaptive_plus (по умолчанию — по настройкам пользователя) задаёт режим деинтерлейсинга; adaptive_plus доступен в прошивке 150318_b9+. Пример применения — IPTV-канал с чересстрочным видео, для которого нужен режим adaptive, даже если у пользователя выбран bob. ↩

  117. doc-sdk-media-url.c011 · doc · any-documented; прошивка — · Параметр force_deint:off|tff|bff|use_mpeg2_pseq (по умолчанию use_mpeg2_pseq для MPEG-TS, иначе off) задаёт принудительный деинтерлейсинг: off — только когда контент распознан как чересстрочный; tff и bff — принудительно с предположением top-field-first или bottom-field-first; use_mpeg2_pseq — эвристически принудительно для MPEG-2, который заявляет прогрессивность, но на деле чересстрочный. ↩

  118. doc-sdk-media-url.c012 · doc · any-documented; прошивка — · Параметр buffering_ms:1..60000 (по умолчанию — по настройкам пользователя) задаёт период буферизации в миллисекундах и действует только для MPEG-TS-потоков (HTTP/TS, HLS, RTSP, UDP multicast, DVB); для HLS влияние на старт сильно зависит от пропускной способности и может быть почти незаметным, если она намного выше битрейта потока. ↩

  119. doc-sdk-media-url.c013 · doc · any-documented; прошивка — · Параметр vmx_iptv_enh_buffering:0|1 (по умолчанию 1) действует только для multicast URL и включает (1) или выключает (0) улучшенную буферизацию Verimatrix IPTV; 1 ускоряет переключение каналов, 0 полезен для диагностики и/или на очень высоких битрейтах и заодно выключает PSI-оптимизацию для multicast, переопределяя psi_opt. ↩

  120. doc-sdk-media-url.c014 · doc · any-documented; прошивка — · Параметр psi_opt:0|1|2 (по умолчанию 1 для HLS, 2 для RTSP, 0 в остальных случаях) действует только для MPEG-TS-потоков (HTTP/TS, HLS, RTSP, UDP multicast) и задаёт уровень оптимизаций при открытии потока: 0 — без оптимизаций, 1 — некоторые, 2 — более агрессивные. ↩

  121. doc-sdk-media-url.c015 · doc · any-documented; прошивка — · Параметр fast_prebuf:0|1 (по умолчанию 0) действует только для multicast MPEG-TS и включает быстрый старт воспроизведения в особых случаях; он предназначен в основном для специфических сценариев (локальный multicast-прокси для быстрого переключения каналов) и, вероятно, даёт сбои буферизации на обычных трансляциях. ↩

  122. doc-sdk-media-url.c016 · doc · any-documented; прошивка — · Параметр ll_prebuf_for_http_ts:0|1 (по умолчанию 0) действует только для MPEG-TS через HTTP/TS и включает быстрый старт (низколатентную предбуферизацию); результат зависит от особенностей потока и может не работать во всех случаях, поэтому параметр предназначен только для очень стабильных источников. При включённом параметре не рекомендуется ставить buffering_ms ниже 300, а высокое значение buffering_ms непрактично. ↩

  123. doc-sdk-media-url.c017 · doc · any-documented; прошивка — · Параметр ll_display_for_http_ts:0|1 (по умолчанию 0) действует только для MPEG-TS через HTTP/TS и включает специальный низколатентный режим показа: каждый видеокадр выводится почти сразу после полного получения; режим предназначен для потоков, специально оптимизированных для низкой задержки. ↩

  124. doc-sdk-media-url.c018 · doc · any-documented; прошивка — · Параметр ll_display_for_http_ts_audio_delay (по умолчанию 100) действует только для MPEG-TS через HTTP/TS и задаёт задержку звука в миллисекундах относительно видео, когда ll_display_for_http_ts равен 1; задержка нужна для стабильного воспроизведения звука ценой некоторого отставания. ↩

  125. doc-sdk-media-url.c019 · doc · any-documented; прошивка — · Параметр buffering_skip_to_keyframe:0|1 (по умолчанию 0) действует только для MPEG-TS-потоков (HTTP/TS, HLS, RTSP, UDP multicast) и при включении пропускает при старте часть (аудио)данных, для которых нет воспроизводимого видео; на VOD и радио (audio-only) не влияет, а для HTTP/TS действует только при ll_prebuf_for_http_ts:1. Параметр не рекомендуется использовать без необходимости. ↩

  126. doc-sdk-media-url.c020 · doc · any-documented; прошивка — · Параметр pcr:0|1 (по умолчанию 0 для локальных файлов, 1 в остальных случаях) действует только для локальных MPEG-TS-файлов, HLS и MPEG-TS через HTTP/TS и указывает, использовать ли PCR для синхронизации часов при воспроизведении; отключение (0) может помочь при ошибках PCR, но меняет поведение буферизации и не рекомендуется без крайней необходимости. Для multicast, DVB и RTSP параметр не поддерживается — PCR там используется всегда. ↩

  127. doc-sdk-media-url.c021 · doc · any-documented; прошивка — · Параметр keep_pic:0|1 (по умолчанию 1) действует для MPEG-TS и указывает, оставлять ли последний показанный кадр на экране (вместо чёрного экрана) при переключении между MPEG-TS-потоками; эффект есть только когда оба потока допускают оптимизированное переключение без полного перезапуска движка, при полном перезапуске экран всё равно чёрный. ↩

  128. doc-sdk-media-url.c022 · doc · any-documented; прошивка — · Параметр keep_audio_pid:0|1 (по умолчанию 0) действует для MPEG-TS: при включении сохраняет тот же audio PID при смене содержимого программы и не выбирает его заново по языковым предпочтениям; это специфический обходной приём для потоковых данных. ↩

  129. doc-sdk-media-url.c023 · doc · any-documented; прошивка — · Параметр recording_encryption:0|1 (по умолчанию 0) действует только для MPEG-TS (HLS, UDP multicast, DVB): при включении записи LPVR пишутся на диск в зашифрованном виде, и такие записи можно воспроизвести только на том же STB, где они созданы. ↩

  130. doc-sdk-media-url.c024 · doc · any-documented; прошивка — · Параметр pcr_disc_ms:1... (по умолчанию 10000000 для HLS, 10000 в остальных случаях; доступен в прошивках 140223_b9+ и 140424_b8+) задаёт в миллисекундах порог чувствительности механизма восстановления после разрыва PCR: если разрыв больше порога, демультиплексор перезапускается с быстрым восстановлением, иначе ждёт время, равное разрыву. Восстановление не работает при pcr:0 или реальном отсутствии PCR; параметр действует для HLS, RTSP и HTTP/TS, но не для multicast/DVB. ↩

  131. doc-sdk-media-url.c025 · doc · any-documented; прошивка — · Параметр cancel_ll_prebuf:0|1 (по умолчанию 1; доступен в прошивке 140312_b9+) действует только для multicast/DVB и только на платформах 867x+: при 1 включает раннюю отмену низколатентной предбуферизации, когда считается, что данных уже достаточно; если после переключения каналов пропадает звук, рекомендуется попробовать 0 (вернуть старое поведение). ↩

  132. doc-sdk-media-url.c026 · doc · any-documented; прошивка — · Параметр shorter_ll_prebuf:0|1 (по умолчанию 0; доступен в прошивке 140312_b9+) действует только для multicast/DVB и только на платформах 867x+: при 1 сокращает низколатентную предбуферизацию на время, оценённое как длительность уже буферизованных данных; требует cancel_ll_prebuf:1 и имеет в основном экспериментальный статус. ↩

    • doc-sdk-media-url.c027 · doc · any-documented; прошивка — · Параметр hls_seek_live:0|1 (по умолчанию 0; доступен в прошивке 140226_b9+) действует только для HLS и включает seek, паузу и отчёт о длительности и позиции при воспроизведении live (sliding window) HLS. С прошивки 150610_r10+ разрешённый диапазон seek ([0, duration]) исключает несколько первых и последних сегментов; если сегментов меньше шести, поток считается не допускающим seek, несмотря на параметр. Пауза разрешена для любого live HLS, даже не допускающего seek или без этого параметра.
    • doc-sdk-media-url.c028 · doc · any-documented; прошивка — · При включённом hls_seek_live позиция live-HLS считается как position = duration минус offset: position 0 — максимальный возможный сдвиг от live-потока, position = duration — воспроизведение live; на старте позиция равна duration, при обычном воспроизведении не меняется, seek устанавливает её в заданное значение с округлением к длине сегмента, а на паузе она уменьшается на 1 каждую секунду до нуля. Попытка seek за duration равносильна возврату к live-потоку.

    ↩

  133. doc-sdk-media-url.c029 · doc · any-documented; прошивка — · Параметр hls_forced_type:vod/event/sliding_window (по умолчанию — по ассету; доступен в прошивке 140225_b9+) действует только для HLS и позволяет считать тип ассета другим; он имеет приоритет над hls_sticky_live, но не позволяет играть ассет без end-list как VoD; предназначен в основном для корректной обработки event-ассетов без явного указания типа. ↩

  134. doc-sdk-media-url.c030 · doc · any-documented; прошивка — · Параметр hls_v4_audio:1 (по умолчанию 0; доступен в прошивке 131009_b9+) действует только для HLS и включает существенно ограниченную поддержку аудиодорожек HLS v4 в подходящих ассетах. ↩

  135. doc-sdk-media-url.c031 · doc · any-documented; прошивка — · Параметр program_number:1... (по умолчанию autodetect; доступен в прошивке 140218_b9+) действует для любого MPEG-TS и задаёт номер программы (service id) явно; полезен при многопрограммном потоке и как обходной путь, когда PAT перечисляет несколько программ, но присутствует только одна и не первая. Несуществующая программа приводит к выбору без программы, то есть без звука и видео; параметр имеет приоритет над номером программы в DVB URL. ↩

  136. doc-sdk-media-url.c032 · doc · any-documented; прошивка — · Параметр ss_for_http_ts:1 (по умолчанию 0; доступен в прошивке 140814_b9+) действует только для MPEG-TS через HTTP/TS и включает оптимизацию переключения между двумя HTTP/TS-потоками без полного перезапуска движка; эффект есть только когда оба потока идут через HTTP/TS и у обоих media URL этот параметр равен 1. ↩

  137. doc-sdk-media-url.c033 · doc · any-documented; прошивка — · Параметр vmx_drm:0|1 (по умолчанию — по медиа и запрошенному DRM; доступен в прошивке 150321_r10+) действует для MPEG-TS, где применимы Verimatrix IPTV и Verimatrix Web, и, если возможно, переопределяет текущий статус Verimatrix DRM: позволяет отключить Verimatrix IPTV и отключить или включить Verimatrix Web (меняя способ получения ключей). ↩

  138. doc-sdk-media-url.c034 · doc · any-documented; прошивка — · Параметр item_id:0... (по умолчанию autodetect или выбор пользователя; доступен в прошивке 150312_r10+) действует при воспроизведении некоторых многоэлементных ассетов и позволяет выбрать элемент такого ассета. ↩

  139. doc-sdk-media-url.c035 · doc · any-documented; прошивка — · Параметр item_position:0... (по умолчанию 0 или закладка; доступен в прошивке 150312_r10+) действует при воспроизведении некоторых многоэлементных ассетов и задаёт позицию продолжения в элементе, когда указан item_id. ↩

  140. fw-apk-260724-0207-r24.c011 · code · android-atv; прошивка 260724_0207_r24 · SplashActivity принимает VIEW-интенты для http/https с хостом app.dunehd.com и для медиа (video/, audio/, application/vnd.apple.mpegurl…) со схемами file, content, http, https, rtp, rtsp, smb, nfs ↩

  141. fw-tv188b-261021-0117-r25--java-player.c062 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 am start -a android.intent.action.VIEW -t video/* из php_server открывает системный выбор приложений, где первым предложен DUNE. ↩

  142. fw-tv188b-261021-0117-r25--java-player.c063 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 выбор DUNE («Только сейчас») в системном диалоге VIEW для тестового HTTP MP4 запускает VLC через PlayerProxyActivity. ↩

  143. fw-tv188b-261021-0117-r25--java-player.c064 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 явный запуск PlayerProxyActivity с HTTP MP4 и video/* без action VIEW (adb и php_server, также с skip_resume_position:1) оставляет navigator и передаёт intent в MainActivity без запуска VOD. ↩↩

  144. fw-tv188b-261021-0117-r25--java-player.c072 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 явный am start -a android.intent.action.VIEW -n com.dunehd.app/com.dunehd.shell.PlayerProxyActivity -d -t video/* запускает воспроизведение через VLC (playback engine: VLC). ↩↩

  145. fw-tv188b-261021-0117-r25--java-player.c073 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 тот же явный запуск PlayerProxyActivity с extra com.dunehd.playback.dune_params = engine:1 запускает ExoPlayer (playback engine: ExoPlayer), а не VLC. ↩

  146. fw-tv188b-261021-0117-r25--shell-ext--entry-handler--recent-views.c045 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · RecentHelper::run_witem r25 для file:// (после веток action_plugin/action_params и open_movie) добавляет к URL save_watch_history=1 и show_in_recent=1 и запускает через ActionFactory::launch_media_url_ext. ↩

  147. fw-tv188b-261021-0117-r25.c164 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 httpd поддерживает Range для файлов www плагина: запрос байтов 0-1023 файла 117452604 байт вернул 206 Partial Content, Content-Range: bytes 0-1023/117452604, Accept-Ranges: bytes, Content-Length: 1024. ↩

  148. fw-tv188b-261021-0117-r25.c163 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 httpd отдаёт файлы через символическую ссылку из www плагина на каталог вне плагина: ссылка www/media -> /tmp/mnt/smb/5/surround sound test (каталог SMB-ресурса), GET /plugins/test_plugin6/media/<файл>.mkv с Range вернул 206, HEAD — 200 с Content-Length файла. ↩

  149. fw-tv188b-261021-0117-r25.c165 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 httpd отдаёт файл .mkv из www плагина с заголовком Content-type: text/html (ответ 206 на GET с Range), а в ответе на HEAD для того же файла заголовка Content-type нет; .txt отдаётся с Content-type: text/plain. ↩

  150. fw-tv188b-261021-0117-r25.c289 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 у test_plugin5 plugin_www_url = 'http://127.0.0.1:80/plugins/test_plugin5/', plugin_cgi_url = 'http://127.0.0.1:80/cgi-bin/plugins/test_plugin5/' — с явным портом 80. ↩

  151. fw-tv188b-261021-0117-r25.c192 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 url вида http://… из ответа get_stream_url оболочка принимает и использует без изменений: «get_stream_url() result: http://127.0.0.1/plugins/test_plugin5/kbp5-no-media.mp4». ↩

  152. fw-tv188b-261021-0117-r25--java-player.c060 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 перед запросами VLC оболочка делает GET тестового MP4 с User-Agent DuneHD/1.0, Icy-MetaData: 1 и X-Dune-Serial-Number. ↩

  153. fw-tv188b-261021-0117-r25--java-player.c057 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 http_headers с User-Agent (URL-кодированный либо сырой вид) у HTTP MP4 на VLC не заменяет User-Agent: сервер видит VLC/3.0.15 LibVLC/3.0.15. ↩↩

  154. fw-tv188b-261021-0117-r25--java-player.c058 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 http_headers:X-KB8-Test%3A%20one у HTTP MP4 на VLC не передаёт X-KB8-Test серверу. ↩

  155. fw-tv188b-261021-0117-r25--java-player.c059 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 VLC следует тестовому HTTP 302 с /redir/kb8-a.mp4 на /m/kb8-a.mp4. ↩

  156. fw-tv188b-261021-0117-r25--java-player.c061 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 HTTP-запросы HLS от ExoPlayer используют User-Agent ExoPlayerDemo/1.0.1-13-261021_0117_r25 (Linux;Android 11) ExoPlayerLib/2.14.0. ↩

  157. fw-tv188b-261021-0117-r25--java-player.c067 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · HTTP-запрос ExoPlayer на tv188b r25 идёт с User-Agent «ExoPlayerDemo/1.0.1-13-261021_0117_r25 (Linux;Android 11) ExoPlayerLib/2.14.0» и Accept-Encoding: identity. ↩↩

  158. fw-tv188b-261021-0117-r25--java-player.c068 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Перед запросом ExoPlayer оболочка на tv188b r25 сама делает GET того же URL с User-Agent «DuneHD/1.0 …», Range: bytes=0-, Icy-MetaData: 1 и X-Dune-Serial-Number. ↩

  159. fw-tv188b-261021-0117-r25--java-player.c071 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 ExoPlayer проходит HTTP 302 (/redir/kb9-a.mp4 → /m/kb9-a.mp4): после ответа 302 с Location он делает второй GET и получает 200. ↩↩↩

  160. fw-tv188b-261021-0117-r25--java-player.c011 · code · android-dune-fw; прошивка 261021_0117_r25 · ExoPlayerImpl.play начинает с userAgent, вычисленного Util.getUserAgent(context, "ExoPlayerDemo"). ↩

    • fw-tv188b-261021-0117-r25--java-player.c069 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 все три проверенные формы params.httpHeaders заменяют User-Agent ExoPlayer на заданный: URL-кодированная, «сырая» и форма с запятой в значении.
    • fw-tv188b-261021-0117-r25--java-player--native-vod-bridge.c031 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При проверке на tv188b r25 playback_url с engine:1,http_headers:X-A%3A%201%3BX-B%3A%202 дал в запросе ExoPlayer два отдельных заголовка X-A: 1 и X-B: 2.
    • fw-tv188b-261021-0117-r25--java-player--native-vod-bridge.c032 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При проверке на tv188b r25 playback_url с engine:1,http_headers:X-A%3A%201;X-B%3A%202 дал в запросе ExoPlayer два отдельных заголовка X-A: 1 и X-B: 2.

    ↩

  161. fw-tv188b-261021-0117-r25--java-player.c020 · code · android-dune-fw; прошивка 261021_0117_r25 · DefaultHttpDataSource.makeConnection объединяет defaultRequestProperties, requestProperties и карту запроса именно в таком порядке, затем вызывает setRequestProperty для каждого элемента. ↩

  162. fw-tv188b-261021-0117-r25--java-player.c015 · code · android-dune-fw; прошивка 261021_0117_r25 · Обычной HTTP-фабрике ExoPlayerImpl задаёт connectTimeoutMs=8000 и readTimeoutMs=50000. ↩

    • fw-tv188b-261021-0117-r25--java-player.c016 · code · android-dune-fw; прошивка 261021_0117_r25 · Для обычной HTTP-фабрики ExoPlayerImpl включает allowCrossProtocolRedirects; Factory передаёт этот флаг конструктору DefaultHttpDataSource.
    • fw-tv188b-261021-0117-r25--java-player.c017 · code · android-dune-fw; прошивка 261021_0117_r25 · DefaultHttpDataSource.handleRedirect разрешает относительный Location через new URL(base, Location), принимает только http/https и бросает ProtocolException для другой схемы либо null Location.
    • fw-tv188b-261021-0117-r25--java-player.c019 · code · android-dune-fw; прошивка 261021_0117_r25 · Ручной цикл DefaultHttpDataSource.makeConnection бросает NoRouteToHostException с Too many redirects при счётчике i2>20.

    ↩

    • fw-tv188b-261021-0117-r25--java-player.c014 · code · android-dune-fw; прошивка 261021_0117_r25 · ExoPlayerImpl.buildDataSourceFactory при params.httpUdt=true создаёт HttpUdtDataSource.Factory, иначе DefaultHttpDataSource.Factory и вызывает setHTTPHeaders.
    • fw-tv188b-261021-0117-r25--java-player.c022 · code · android-dune-fw; прошивка 261021_0117_r25 · HttpUdtDataSource.makeConnection передаёт DataSpec.uri.toString() в native _open(String) и при положительной position и действительном descriptor вызывает native _seek.
    • fw-tv188b-261021-0117-r25--java-player.c023 · code · android-dune-fw; прошивка 261021_0117_r25 · Java-метод HttpUdtDataSource.setRequestProperty пуст; HttpUdtDataSource.Factory.setDefaultRequestProperties возвращает фабрику без сохранения карты.
    • fw-tv188b-261021-0117-r25--java-player.c024 · code · android-dune-fw; прошивка 261021_0117_r25 · HttpUdtDataSource.getResponseCode возвращает 200 при descriptor!=-1 и 404 иначе.
    • fw-tv188b-261021-0117-r25--java-player.c049 · code · android-dune-fw; прошивка 261021_0117_r25 · HttpUdtDataSource.getResponseHeaders возвращает Collections.emptyMap().
    • fw-tv188b-261021-0117-r25--java-player--native-vod-bridge.c041 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · HttpUdtDataSource.getResponseCode() в r25 возвращает фиксированное 200 при descriptor != -1 и 404 при descriptor == -1; это не чтение HTTP-статуса ответа сервера.
    • fw-tv188b-261021-0117-r25--java-player--native-vod-bridge.c042 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В r25 метод ExoPlayerImpl.buildDataSourceFactory(DefaultBandwidthMeter) читает поле PlaybackParams.httpUdt и выбирает фабрику без вызовов логгера в обеих ветвях этого метода.

    ↩

  163. fw-tv188b-261021-0117-r25--java-player.c030 · code · android-dune-fw; прошивка 261021_0117_r25 · Базовый MediaPlayerImpl.doSetDataSourceAndPrepare вызывает Android MediaPlayer.setDataSource(Context, Uri) без аргумента карты HTTP-заголовков. ↩

  164. fw-tv188b-261021-0117-r25--java-player.c029 · code · android-dune-fw; прошивка 261021_0117_r25 · Для собственного HLS-запроса InternalPlayer задаёт HttpURLConnection connectTimeout=5000, readTimeout=3000 и переносит заголовки, разбитые по первому ": ". ↩

  165. fw-tv188b-261021-0117-r25--java-player--native-vod-bridge.c013 · code · android-dune-fw; прошивка 261021_0117_r25 · Функция 0x00204178 ищет в переданной строке "|||dune_params|||": нет — возвращает 0; есть — разбирает всё после разделителя (смещение +17) поиском ключей через strstr и в конце возвращает 1. ↩

    • fw-tv188b-261021-0117-r25--java-player--native-vod-bridge.c018 · code · android-dune-fw; прошивка 261021_0117_r25 · Функция 0x001fad30 вызывает 0x001edab0 для текущего playback URL (DAT_00ecc7bc), если его первый символ не "[" и не "{" ((c & 0xdf) != 0x5b); ненулевой результат запоминает как флаг «параметры разобраны». Вызов замаскирован арифметикой: 0x7607cc - 0x572d1c = 0x1edab0.
    • fw-tv188b-261021-0117-r25--java-player--native-vod-bridge.c019 · code · android-dune-fw; прошивка 261021_0117_r25 · Функция 0x001edab0 передаёт свой аргумент по замаскированному адресу 0x6aac95 - 0x4a6b1d = 0x204178 (разборщик), затем делает второй косвенный вызов и возвращает результат разборщика.

    ↩

  166. fw-tv188b-261021-0117-r25--java-player--native-vod-bridge.c020 · code · android-dune-fw; прошивка 261021_0117_r25 · В ветви process_new_url (special) функция 0x001fad30 после лога "next stream URL" вызывает 0x001edab0 (0x769886 - 0x57bdd6) для stream URL, только если флаг «параметры разобраны» не установлен. Поэтому параметры в stream URL читаются, лишь когда в playback URL разделителя не было. ↩

  167. fw-tv188b-261021-0117-r25--java-player--native-vod-bridge.c014 · code · android-dune-fw; прошивка 261021_0117_r25 · Разборщик 0x00204178 при наличии ключа "http_headers:" копирует значение до первой запятой или конца строки, вызывает html_utils_unescape и, если результат непуст, делит его string_array_split по ";" и сохраняет массив в глобальную переменную (слот GOT -0x2630, Ghidra DAT_00ee73f4). ↩↩

  168. fw-tv188b-261021-0117-r25--java-player--native-vod-bridge.c017 · code · android-dune-fw; прошивка 261021_0117_r25 · Функция 0x00203bcc освобождает массив слота GOT -0x2630 через string_array_free и обнуляет слот. ↩↩

  169. fw-tv188b-261021-0117-r25--java-player--native-vod-bridge.c015 · code · android-dune-fw; прошивка 261021_0117_r25 · Цикл плеера 0x001f8870 обнуляет структуру по адресу sp+0x110 (0xbc байт), кладёт значение слота GOT -0x2630 в sp+0x160 (смещение +0x50 структуры) и передаёт структуру вторым аргументом в 0x000bb510. Так массив из http_headers: попадает в PlaybackParams.httpHeaders. ↩

    • fw-tv188b-261021-0117-r25--java-player--native-vod-bridge.c004 · code · android-dune-fw; прошивка 261021_0117_r25 · Нативная обёртка internal_player_api_play (0x000bb510) преобразует поле параметров по смещению 0x50 в Java-массив и передаёт его в позицию httpHeaders конструктора PlaybackParams.
    • fw-tv188b-261021-0117-r25--java-player--native-vod-bridge.c006 · code · android-dune-fw; прошивка 261021_0117_r25 · Помощник 0x000b914c создаёт Java-массив длины native_array[0] (для NULL — 0) и поэлементно переносит строки из native_array[1], сохраняя индексы.

    ↩

  170. fw-tv188b-261021-0117-r25--java-player--native-vod-bridge.c002 · code · android-dune-fw; прошивка 261021_0117_r25 · Конструктор Java PlaybackParams r25 присваивает аргумент String[] после frameRate и engine полю httpHeaders. ↩

  171. fw-tv188b-261021-0117-r25--java-player--native-vod-bridge.c016 · code · android-dune-fw; прошивка 261021_0117_r25 · Разборщик 0x00204178 ставит глобальный байт (слот GOT -0x2644) в 1, если в параметрах есть "udt:" и нет "udt:0"; цикл плеера 0x001f8870 копирует этот байт в sp+0x13c (+0x2c структуры), откуда он идёт в PlaybackParams.httpUdt. ↩

  172. fw-tv188b-261021-0117-r25--java-player--native-vod-bridge.c005 · code · android-dune-fw; прошивка 261021_0117_r25 · Нативная обёртка internal_player_api_play преобразует int по смещению 0x2c структуры параметров в четвёртый boolean конструктора PlaybackParams (httpUdt): ненулевой int даёт true. ↩

  173. fw-tv188b-261021-0117-r25--java-player--native-vod-bridge.c003 · code · android-dune-fw; прошивка 261021_0117_r25 · Конструктор Java PlaybackParams r25 присваивает четвёртый аргумент boolean полю httpUdt. ↩

  174. fw-tv188b-261021-0117-r25--java-player--native-vod-bridge.c009 · code · android-dune-fw; прошивка 261021_0117_r25 · plugin_next_set_urls при наличии свойства ktv_vod_service и ненулевого результата помощника 0x00404af8 добавляет http_headers через dune_params_append к playback URL и, если задан, к stream URL. ↩

  175. fw-tv188b-261021-0117-r25--java-player--native-vod-bridge.c021 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 при playback_url_is_stream_url=false ответ PHP get_vod_stream_url оболочка логирует как "stream URL is got" и передаёт вторым URL в SET_URLS, первым остаётся playback_url серии. ↩

  176. fw-tv188b-261021-0117-r25--java-player--native-vod-bridge.c031 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При проверке на tv188b r25 playback_url с engine:1,http_headers:X-A%3A%201%3BX-B%3A%202 дал в запросе ExoPlayer два отдельных заголовка X-A: 1 и X-B: 2. ↩

  177. fw-tv188b-261021-0117-r25--java-player--native-vod-bridge.c032 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При проверке на tv188b r25 playback_url с engine:1,http_headers:X-A%3A%201;X-B%3A%202 дал в запросе ExoPlayer два отдельных заголовка X-A: 1 и X-B: 2. ↩

  178. fw-tv188b-261021-0117-r25--java-player--native-vod-bridge.c034 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При проверке на tv188b r25 playback_url с engine:1,http_headers:X-A%3A%201,,X-B%3A%202 дал в сохранённом запросе ExoPlayer заголовок X-A: 1, без X-B. ↩↩

  179. fw-tv188b-261021-0117-r25--java-player--native-vod-bridge.c043 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В единственном прогоне на tv188b r25 серия 1 с engine:1,http_headers:X-KB11-G%3A%20one дала серверный GET ?g=1 от ExoPlayer с X-KB11-G: one и ответом 200; предварительный GET DuneHD этого заголовка не содержал. ↩

  180. fw-tv188b-261021-0117-r25--java-player--native-vod-bridge.c044 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В том же прогоне после автоматического перехода с серии 1 на серию 2 с engine:1 без http_headers оба серверных GET ?g=2 (DuneHD и ExoPlayer) не содержали X-KB11-G; ExoPlayer получил 200. ↩↩

  181. fw-tv188b-261021-0117-r25--java-player--native-vod-bridge.c035 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При проверке на tv188b r25 с engine:1 сервер для d=none и d=0 записал предварительный запрос DuneHD с ответом 206 и запрос ExoPlayer с ответом 200; для d=1 (udt:1) записан только запрос DuneHD с ответом 206. ↩↩↩

  182. fw-tv188b-261021-0117-r25--java-player--native-vod-bridge.c036 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При проверке на tv188b r25 с engine:1 без udt и с udt:0 статус на t=10 был playing с позицией 7 и 8 соответственно; с udt:1 статус на t=10 был buffering с позицией 0, после чего скрипт послал Stop. ↩↩↩

  183. fw-tv188b-261021-0117-r25--java-player--native-vod-bridge.c037 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При проверке на tv188b r25 логи 45–47 показывают разбор engine:1 (без udt, udt:0, udt:1) и выбор playback engine: ExoPlayer во всех трёх случаях, но не показывают значение httpUdt или выбор фабрики DataSource даже в контроле без udt. ↩

  184. plg-hdtv-smart-vod--link-api.c070 · code · unknown; прошивка — · Для передачи заголовков плееру код добавляет к URL суффикс |||dune_params|||http_headers: с urlencode-заголовками (sibnet, sovetromantica, Twitch). ↩

  185. plg-hdtv-liteiptv.c042 · code · unknown; прошивка — · Для архива при верном PIN (или незащищённом канале) get_tv_playback_url подставляет в шаблон arc_channels[id]['url'] переменные $start, $stop, $offset и $time через eval; $stop ограничен началом плюс 4 часа, а непустой ua добавляется параметром dune_params http_headers. ↩

  186. plg-gh-kocourkuba-proiptv.c042 · code · unknown; прошивка — · User-Agent потока плагин передаёт в dune_params ключом http_headers ("User-Agent: …"): нестандартный UA плагина добавляется, если заголовка ещё нет; #EXTVLCOPT http-user-agent перезаписывает http_headers («highest priority»); user-agent из #EXTHTTP дописывается с экранированием запятых как ',,'. ↩

  187. fw-tv188b-260827-0003-r24--php-framework.c054 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · HD::http_init() читает /tmp/sysinfo.txt и формирует User-Agent «DuneHD/1.0» с добавкой « (product_id: …; firmware_version: …)» из строк этого файла; serial_number запоминается ↩

  188. fw-tv188b-261021-0117-r25--java-player.c003 · code · android-dune-fw; прошивка 261021_0117_r25 · PlaybackParams определяет contentType: UNKNOWN=0, HTTP_TS=1, HTTP_FILE=2, DASH=3, HLS=4, SS=5, HTTP_AUDIO=6, DVB=7. ↩

  189. fw-tv188b-261021-0117-r25--java-player.c025 · code · android-dune-fw; прошивка 261021_0117_r25 · При contentType=4 ExoPlayerImpl.buildMediaSource создаёт HlsMediaSource.Factory с MyHlsDataSourceFactory. ↩

  190. fw-tv188b-261021-0117-r25--java-player.c026 · code · android-dune-fw; прошивка 261021_0117_r25 · При contentType=3 ExoPlayerImpl.buildMediaSource создаёт DashMediaSource.Factory с DefaultDashChunkSource.Factory и отдельным buildDataSourceFactory(false) для источника манифеста. ↩

  191. fw-tv188b-261021-0117-r25--java-player.c027 · code · android-dune-fw; прошивка 261021_0117_r25 · При contentType=5 ExoPlayerImpl.buildMediaSource создаёт SsMediaSource.Factory с DefaultSsChunkSource.Factory. ↩

  192. fw-tv188b-261021-0117-r25--java-player.c050 · code · android-dune-fw; прошивка 261021_0117_r25 · Для contentType, отличных от 3, 4 и 5, ExoPlayerImpl.buildMediaSource создаёт ProgressiveMediaSource.Factory. ↩

  193. fw-tv188b-261021-0117-r25--java-player.c028 · code · android-dune-fw; прошивка 261021_0117_r25 · MyHlsDataSourceFactory.doCreateDataSource обычно использует общую dataSourceFactory, но при enableDrm=true и типе 3 создаёт VMXWebKeyDataSource. ↩

  194. fw-tv188b-260827-0003-r24--http-api--ext-command-params.c096 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 launch_media_url с голой magnet-ссылкой (magnet:?xt=urn:btih:…) отклоняется: command_status=failed, error_kind=invalid_parameters, «'media_url' parameter value '…' is invalid: qualified url is expected»; в shell.log «[extcmd] launch_media_url failed: invalid media_url specified». ↩

  195. fw-tv188b-260827-0003-r24--http-api--ext-command-params.c097 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 launch_media_url с HTTPS-URL файла .torrent не запустил ни воспроизведение, ни плагин downloads: в shell.log только «[bp_dialog] root item #0 type URL caption ''» без строки элемента «#1: …», каталог /tmp/run/dl_input не изменился. ↩

  196. fw-tv188b-260827-0003-r24--http-api--ext-command-params.c094 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 launch_media_url с plugin_launcher://{name=downloads}{action_id=open_magnet}{magnet_url=} запускает публичное действие плагина без точки входа: «[plugin_launcher] launching plugin 'downloads' (ep (null), action open_magnet)» и handle_user_input(entry.open_magnet) с тайм-аутом 300 с. ↩

    • fw-tv188b-261021-0117-r25--downloads.c072 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 действие open_magnet плагина downloads с непустым magnet_url прошло цепочку entry.open_magnet → entry.ensure_ts (~11 с, запуск TorrServer) → entry.open_dl → show_dialog с опросом entry.dialog_open_dl раз в ~1 с (три вызова) → close_dialog_and_run → entry.show_open_magnet → show_dialog; тайм-аут open_magnet и dialog_open_dl — 300 с, остальных шагов — 60 с.
    • fw-tv188b-261021-0117-r25--downloads.c073 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 show_open_magnet для торрента из трёх файлов показывает диалог «Выберите действие для торрента» с «Название торрента: <имя>», «Найдено файлов: 3» и кнопками «Воспроизвести» (в фокусе) и «Скачать все файлы».

    ↩

    • doc-sdk-plugins--operations.c112 · doc · any-documented; прошивка — · PluginVodInfo::subtitles_osd_enabled включает/выключает OSD выбора субтитров при VOD, по умолчанию включено; доступно с прошивки 140521_b9
    • doc-sdk-plugins--operations.c059 · doc · any-documented; прошивка — · PluginTvInfo::subtitles_osd_enabled включает/выключает OSD выбора субтитров при ТВ-воспроизведении, по умолчанию включено; доступно с прошивки 140521_b9, раньше OSD субтитров для плагинов не было

    ↩

  197. fw-tv188b-261021-0117-r25--java-player.c039 · code · android-dune-fw; прошивка 261021_0117_r25 · PlaybackParams принимает три массива externalSubtitles, externalSubtitlesSuffixes и externalSubtitlesFullSuffixes через конструктор и сохраняет их в одноимённых полях. ↩

  198. fw-tv188b-261021-0117-r25--java-player.c034 · code · android-dune-fw; прошивка 261021_0117_r25 · VLCPlayerImpl.addingSubtitlesSupported возвращает true. ↩

  199. fw-tv188b-261021-0117-r25--java-player.c040 · code · android-dune-fw; прошивка 261021_0117_r25 · В VLCPlayerImpl.createMedia при обычном mediaType (не DVD/Blu-ray), visualizationMode=false и непустом externalSubtitles создаётся IMedia.Slave(0,4,uri) для каждого элемента и вызывается media.addSlave. ↩

    • fw-tv188b-261021-0117-r25--java-player.c031 · code · android-dune-fw; прошивка 261021_0117_r25 · ExoPlayerImpl.addSubtitles имеет пустое тело, а addingSubtitlesSupported возвращает false.
    • fw-tv188b-261021-0117-r25--java-player.c032 · code · android-dune-fw; прошивка 261021_0117_r25 · У базового MediaPlayerImpl.addSubtitles пустое тело, а addingSubtitlesSupported возвращает false.

    ↩

  200. fw-tv188b-261021-0117-r25--media-player.c001 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · subtitles.php принимает только команды search и rating и один JSON-аргумент; при другом режиме или числе аргументов вызывает usage() с exit(1). ↩

  201. fw-tv188b-261021-0117-r25--media-player.c004 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При непустом dunemdb_id режим search запрашивает movie/ в DuneMDB и принимает result как movie только при status="ok". ↩

  202. fw-tv188b-261021-0117-r25--media-player.c016 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · load_os_subtitles делает GET к https://api.opensubtitles.com/api/v1/subtitles с page=1, query, moviehash, imdb_id, season_number, episode_number, languages; пустой список languages заменяет на all. ↩

  203. fw-tv188b-261021-0117-r25--media-player.c038 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24, 261021_0117_r25 · subtitles.php в tv188b r24 и r25 имеет одинаковые размер 25911 байт и SHA256 b476a7eab854827cf514a5b02a644c7bc4ae5d4f8efd55629fc846fae32c249e. ↩↩↩

    • fw-tv188b-261021-0117-r25--java-player.c051 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 тестовый MP4 по HTTP без engine запускается через VLC с contentType=2 (HTTP_FILE).
    • fw-tv188b-261021-0117-r25--java-player.c054 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 тестовый HLS с TS-сегментами запускается через ExoPlayer с contentType=4.
    • fw-tv188b-261021-0117-r25--java-player.c055 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 добавление dune_params engine:1 к тестовому локальному MP4 выбирает ExoPlayer.

    ↩

  204. fw-tv188b-261021-0117-r25--java-player.c051 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 тестовый MP4 по HTTP без engine запускается через VLC с contentType=2 (HTTP_FILE). ↩

  205. fw-tv188b-261021-0117-r25--java-player.c052 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 тестовый MKV воспроизводится через VLC с contentType=2 как из www плагина, так и по HTTP с компьютера. ↩

  206. fw-tv188b-261021-0117-r25--java-player.c053 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 локальный VOD /tmp/test_plugin8/kb8-local.mp4 запускается через VLC с contentType=0; VLC открывает file:///data/data/com.dunehd.app/tmp/test_plugin8/kb8-local.mp4. ↩↩

  207. fw-tv188b-261021-0117-r25--java-player.c054 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 тестовый HLS с TS-сегментами запускается через ExoPlayer с contentType=4. ↩

  208. fw-tv188b-261021-0117-r25--java-player.c055 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 добавление dune_params engine:1 к тестовому локальному MP4 выбирает ExoPlayer. ↩↩

  209. fw-tv188b-261021-0117-r25--java-player.c056 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 dune_params engine:2 для тестового HTTP MP4 выбирает VLC. ↩

  210. fw-tv188b-261021-0117-r25--java-player.c066 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 HTTP MP4 с dune_params engine:1 запускается движком ExoPlayer: в logcat «playback engine: ExoPlayer». ↩

    • fw-tv188b-261021-0117-r25--java-player.c072 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 явный am start -a android.intent.action.VIEW -n com.dunehd.app/com.dunehd.shell.PlayerProxyActivity -d -t video/* запускает воспроизведение через VLC (playback engine: VLC).
    • fw-tv188b-261021-0117-r25--java-player.c073 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 тот же явный запуск PlayerProxyActivity с extra com.dunehd.playback.dune_params = engine:1 запускает ExoPlayer (playback engine: ExoPlayer), а не VLC.

    ↩

  211. fw-tv188b-261021-0117-r25--media-player.c037 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · tree.tsv r25 содержит ELF system/system/priv-app/dune/lib/arm/libvlc.so размером 36300964 байта и firmware/lib/libvlc.so как ссылку на /data/data/com.dunehd.app/lib/libvlc.so. ↩↩

  212. fw-tv188b-260827-0003-r24.c017 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Нативные библиотеки dune.apk лежат в /system/priv-app/dune/lib/arm/, среди них libduneshell.so (~15 МБ), libphp5.so, libvlc.so, libcvm.so, libmicrowindowsawt.so ↩↩

  213. fw-tv175u-260724-0207-r24.c016 · code · tv175u, android; прошивка 260724_0207_r24 · Оболочка Dune — привилегированный APK /system/priv-app/dunehd_shell/dunehd_shell.apk (30661088 байт); его нативные библиотеки (libduneshell.so, libvlc.so и др.) лежат в /system/priv-app/dunehd_shell/lib/arm/ ↩↩

  214. fw-apk-260724-0207-r24.c037 · code · android-atv; прошивка 260724_0207_r24 · Из 8526 классов dex 1001 — в пакетах com.dunehd.* (shell, shell.bg, shell.internalplayer, platform, stbapi и др.); остальное — библиотеки: Guava, ExoPlayer, cz.msebera httpclient, Jackson, androidx, libVLC (org.videolan.libvlc), JSON-RPC-клиент Kodi (org.tinymediamanager.jsonrpc — 538 из 722 классов classes2.dex) ↩↩

  215. fw-tv188b-261021-0117-r25--java-player.c001 · code · android-dune-fw; прошивка 261021_0117_r25 · InternalPlayerAPI.play(String, PlaybackParams) при существующем internalPlayer передаёт оба аргумента в InternalPlayer.play. ↩

  216. fw-tv188b-261021-0117-r25--java-player.c004 · code · android-dune-fw; прошивка 261021_0117_r25 · determinePlaybackEngine вызывает платформенный getPlaybackEngineOverride для промежуточного engine -1 или 0; перед ним могут сработать специальные ветви HLS, Blu-ray, ExFS и forceHifiImpl. ↩↩

  217. fw-tv188b-261021-0117-r25--java-player.c005 · code · android-dune-fw; прошивка 261021_0117_r25 · При engine=-1 и обнаруженных HLS initFragment, mp4 либо onlyAltRenditionsForAudio determinePlaybackEngine переключает промежуточный engine на ExoPlayer (1). ↩

  218. fw-tv188b-261021-0117-r25--java-player.c006 · code · android-dune-fw; прошивка 261021_0117_r25 · Базовый APKPlatform.getPlaybackEngineOverride возвращает 1 при isStreamingHTTP=true и 2 иначе. ↩↩

  219. fw-tv188b-261021-0117-r25--java-player.c007 · code · android-dune-fw; прошивка 261021_0117_r25 · APKPlatform.isStreamingHTTP считает потоковым HTTP/HTTPS URL, для которого InternalPlayer.isNonStreamingHTTP возвращает false; байткод isNonStreamingHTTP исключает contentType 1, 6, 4, 3 и 5. ↩

  220. fw-tv188b-261021-0117-r25--java-player.c009 · code · android-dune-fw; прошивка 261021_0117_r25 · determinePlaybackEngine последовательно вызывает a.w с путями force_vlc_experimental, force_exoplayer, force_hplayer, force_platform_player и force_media_player; более поздний true перезаписывает промежуточный engine. ↩

  221. plg-dc-globaltv.c061 · code · android; прошивка — · На Android плагин читает /firmware/config/android_platform.txt и считает платформу Amlogic, если строка начинается с s905; к dune_params добавляется engine:1 на любом Android. ↩

  222. doc-sdk-plugins.c135 · doc · android; прошивка — · Android-платформы не поддерживают FlashLite; HTML/JS API поддерживаются на другом движке; ядро плеера иное, хотя добавлены 4Kp60 и Widevine DRM ↩

  223. doc-sdk-plugins.c130 · doc · sigma-smp87xx; прошивка — · Плеер SMP87xx основан на плеере SMP86xx, поддерживает те же протоколы и форматы и больше (например DASH и H.265), но возможны несовместимости ↩

  224. doc-sdk-plugins.c131 · doc · sigma-smp87xx; прошивка — · На SMP87xx есть фоновое воспроизведение (TOP MENU возвращает в меню при продолжении проигрывания); плагин должен учитывать навигацию по своим экранам во время своей сессии воспроизведения ↩

  225. fw-tv188b-261021-0117-r25.c269 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 первое событие playback_state_changed при VOD приходит сразу после ответа plugin_vod_play, до запуска плеера, с play_mode none, selected_media_url точки входа, plugin_playback_start=1 и playback_position 8 (при initial_position_ms=8000). ↩

  226. fw-tv188b-261021-0117-r25.c267 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 событие playback_user_action при старте серии VOD несёт playback_event_type Play, playback_position и playback_url — URL, по которому запускается плеер (для ленивой серии — URL, возвращённый get_vod_stream_url). ↩

  227. fw-tv188b-261021-0117-r25.c282 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 событие playback_switched в VOD приходит и на первый URL при старте, и на каждый следующий при автопереходе к другой серии — после playback_user_action (Play) и до состояния playing. ↩

  228. fw-tv188b-261021-0117-r25.c268 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 событие playback_state_changed в VOD несёт plugin_playback_events — JSON-строку {"events":[…]} с элементами playss_id, tm_sec, tm_usec, state; наблюдались состояния initializing, buffering, seeking, playing, finished, deinitializing, stopped, и одно событие может содержать несколько смен состояния. ↩

    • fw-tv188b-261021-0117-r25.c273 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 при ответе ChangeBehaviour с timer delay_ms 5000 на каждое событие timer VOD события timer приходили с интервалом около 5 с (5,00–5,05 с).
    • fw-tv188b-261021-0117-r25.c274 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 первое событие timer VOD приходило примерно через 5 с после первого состояния playing серии — и при старте VOD, и после автоперехода к следующей серии (между последним таймером серии 1 и первым таймером серии 2 прошло 8,8 с).
    • fw-tv188b-261021-0117-r25--shell-ext--entry-handler.c086 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 цветные клавиши пульта во время plugin VOD приходят плагину как handle_user_input с control_id ev_key_a_red, ev_key_b_green, ev_key_c_yellow, ev_key_d_blue и полями plugin_vod_id, plugin_vod_series_ndx, plugin_vod_sel_series_ndx, но без playback_position; playback_position есть у ev_timer.

    ↩

    • fw-tv188b-261021-0117-r25--shell-ext--entry-handler.c086 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 цветные клавиши пульта во время plugin VOD приходят плагину как handle_user_input с control_id ev_key_a_red, ev_key_b_green, ev_key_c_yellow, ev_key_d_blue и полями plugin_vod_id, plugin_vod_series_ndx, plugin_vod_sel_series_ndx, но без playback_position; playback_position есть у ev_timer.
    • fw-tv188b-261021-0117-r25.c266 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 событие цветной клавиши в VOD (key_a_red, key_b_green из PluginVodInfo::actions) приходит в input_data без playback_position — с полями handler_id, control_id, play_mode, topmenu_root_id, playback_browser_activated, plugin_vod_id, plugin_vod_series_ndx, plugin_vod_sel_series_ndx.

    ↩

  229. fw-tv188b-261021-0117-r25.c283 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 событие playback_going_to_switch приходит и в конце последней серии VOD, когда перехода на новый URL нет и плеер закрывается — после состояния stopped и непосредственно перед playback_stop с playback_end_of_stream=1. ↩↩

  230. fw-tv188b-261021-0117-r25.c270 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 событие playback_stop VOD по окончании файла несёт plugin_vod_id, plugin_vod_series_ndx, plugin_vod_stop_position, plugin_vod_duration, plugin_vod_start_tm, plugin_vod_stop_tm, plugin_vod_prebuffering_end_tm и playback_end_of_stream=1, без playback_position. ↩

  231. fw-tv188b-261021-0117-r25.c271 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 событие playback_stop приходит и при автопереходе к следующей серии VOD по окончании файла предыдущей — до вызова get_vod_stream_url для следующей серии. ↩

  232. fw-tv188b-261021-0117-r25.c272 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 сразу после события playback_stop VOD приходит событие playback_state_changed с теми же полями остановки и plugin_playback_stop=1, без plugin_playback_events. ↩

  233. fw-tv188b-261021-0117-r25--media-player.c054 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 назначенное в PluginVodInfo::actions действие key_pause перехватывает PAUSE: плагин получает событие, а воспроизведение продолжает идти. ↩

  234. fw-tv188b-261021-0117-r25--media-player.c059 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 IR PAUSE/PLAY при actions=color дают VOD-плагину playback_user_action с playback_event_type Pause/Resume. ↩

    • fw-tv188b-261021-0117-r25--media-player.c055 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 IP Control set_playback_state speed=0 ставит plugin VOD на паузу.
    • fw-tv188b-261021-0117-r25--media-player.c056 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 IP Control set_playback_state speed=256 возобновляет plugin VOD после паузы.
    • fw-tv188b-261021-0117-r25--media-player.c057 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 IP Control set_playback_state position=30 перематывает plugin VOD к 30-й секунде.

    ↩

  235. fw-tv188b-261021-0117-r25--media-player.c058 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 команды set_playback_state speed=0, speed=256 и position=30 вызывают у VOD-плагина playback_state_changed без playback_user_action для этих команд. ↩

  236. fw-tv188b-261021-0117-r25--media-player.c060 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 при ручном STOP в plugin VOD действие playback_stop запускается после перехода Android-плеера в STOPPED. ↩↩

  237. doc-sdk-plugins--operations.c109 · doc · any-documented; прошивка — · GUI_EVENT_PLAYBACK_STOP в PluginVodInfo::actions срабатывает при остановке, запуске другого media_url или запросе выключения; фактическая остановка откладывается до конца исполнения действия, а повторное STOP/POWER-OFF отменяет его ↩

  238. doc-sdk-plugins--gui-actions.c016 · doc · any-documented; прошивка — · С прошивки 150529 событие GUI_EVENT_PLAYBACK_SWITCHED генерируется после переключения воспроизведения на новый media URL, включая самый первый ↩

  239. doc-sdk-plugins--gui-actions.c017 · doc · any-documented; прошивка — · С прошивки 150529 событие GUI_EVENT_PLAYBACK_GOING_TO_SWITCH генерируется перед переключением на новый media URL; в отличие от GUI_EVENT_PLAYBACK_STOP, оно не генерируется при остановке и выключении ↩↩

  240. doc-sdk-plugins--gui-actions.c018 · doc · any-documented; прошивка — · Плеер не ждёт завершения действия, назначенного на GUI_EVENT_PLAYBACK_GOING_TO_SWITCH (в отличие от GUI_EVENT_PLAYBACK_STOP) ↩

  241. doc-sdk-plugins--gui-actions.c003 · doc · any-documented; прошивка — · GUI_EVENT_TIMER — особое событие периодической активности; генерируется один раз по истечении тайм-аута GuiTimerDef::delay_ms ↩

    • doc-sdk-plugins--gui-actions.c004 · doc · any-documented; прошивка — · Новый таймер (GUI_EVENT_TIMER) обычно задаётся GUI-действием ChangeBehaviour
    • doc-sdk-plugins--operations.c110 · doc · any-documented; прошивка — · PluginVodInfo::timer — однократное событие таймера, сбрасываемое действием ChangeBehaviour

    ↩

  242. doc-sdk-plugins--gui-actions.c014 · doc · any-documented; прошивка — · С прошивки 131029_b9 событие таймера можно использовать и в TV-воспроизведении плагина (так же, как в VOD-воспроизведении) ↩

    • doc-sdk-plugins--gui-actions.c134 · doc · any-documented; прошивка — · Данные PluginUpdateOsdAction — класс PluginUpdateOsdActionData: components (тип записан как PluginOsdComponenetList) и необязательный post_action; действие доступно с прошивки 150528_r10
    • doc-sdk-plugins--gui-actions.c136 · doc · any-documented; прошивка — · PluginUpdateOsdAction позволяет рисовать в TV/VOD-воспроизведении плагина произвольное число своих картинок и текстов; они рисуются под (до) штатными элементами OSD — браузером плейлиста, информационным блоком и т. п.
    • doc-sdk-plugins--gui-actions.c137 · doc · any-documented; прошивка — · PluginUpdateOsdAction заменяет прежнюю последовательность компонентов OSD новой; компоненты остаются на экране до следующего PluginUpdateOsdAction или остановки воспроизведения; пустой список или null — ничего не рисовать
    • doc-sdk-plugins--gui-actions.c139 · doc · any-documented; прошивка — · PluginUpdateOsdAction действует только в режиме TV- или VOD-воспроизведения плагина

    ↩

    • doc-sdk-plugins--gui-actions.c135 · doc · any-documented; прошивка — · Класс PluginOsdComponent: x, y, image_url, image_width/image_height (по умолчанию — фактический размер картинки), text, text_font_size (PluginFontSize, по умолчанию FONT_SIZE_NORMAL), text_color (15), text_halo (false)
    • doc-sdk-plugins--gui-actions.c138 · doc · any-documented; прошивка — · PluginOsdComponent — либо картинка, либо однострочный текст в зависимости от того, задан image_url или text; порядок компонентов задаёт порядок отрисовки
    • doc-sdk-plugins--gui-actions.c140 · doc · any-documented; прошивка — · x, y в PluginOsdComponent — левый верхний угол картинки или текста; при нулевых image_width/image_height берётся фактический размер картинки; картинка загружается асинхронно; текст не обрезается, кроме как границами экрана
    • doc-sdk-plugins--gui-actions.c129 · doc · any-documented; прошивка — · text_color в PluginUpdateInfoBlockAction и PluginOsdComponent — индекс цвета (целое 0..23, по умолчанию 15); text_halo — рисовать ли чёрную тень вокруг текста для читаемости на светлом фоне

    ↩

    • doc-sdk-plugins--gui-actions.c125 · doc · any-documented; прошивка — · Данные PluginUpdateInfoBlockAction — класс PluginUpdateInfoBlockActionData: text_above и необязательные text_color (по умолчанию 15), text_halo (false), text_y_offset (0), post_action; действие доступно с прошивки 150526_r10
    • doc-sdk-plugins--gui-actions.c126 · doc · any-documented; прошивка — · PluginUpdateInfoBlockAction задаёт многострочное сообщение над верхней границей информационного блока (обычно включается кнопкой INFO); оно видно только вместе с блоком и держится до остановки воспроизведения или следующего PluginUpdateInfoBlock
    • doc-sdk-plugins--gui-actions.c127 · doc · any-documented; прошивка — · PluginUpdateInfoBlockAction действует только в режиме TV- или VOD-воспроизведения плагина

    ↩

  243. fw-tv188b-261021-0117-r25--java-player.c046 · code · android-dune-fw; прошивка 261021_0117_r25 · PHP dune_api.php r25 определяет PLUGIN_OP_GET_VOD_STREAM_URL="get_vod_stream_url" и PLUGIN_UPDATE_OSD_ACTION_ID="plugin_update_osd". ↩↩

  244. fw-tv188b-260827-0003-r24--plugin-loader--gui-actions.c049 · code · android-dune-fw; прошивка 260827_0003_r24 · В strings libduneshell.so присутствуют сообщения XML-конструктора об отсутствующем data для plugin_update_osd и plugin_update_info_block. ↩

  245. doc-sdk-plugins.c010 · doc · any-documented; прошивка — · OSD-интерфейс воспроизведения IPTV и VOD (навигация по каналам, категории, избранное, EPG, серии) предоставляется автоматически ↩

  246. doc-sdk-plugins--controls-playback.c047 · doc · any-documented; прошивка — · Подход D в SDK предлагает запоминать позицию по GUI_EVENT_TIMER, сохранять последнюю такую позицию постоянно по GUI_EVENT_PLAYBACK_STOP и использовать её при следующем старте через initial_position_ms. ↩

  247. fw-tv188b-261021-0117-r25--media-player.c064 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 повторный VOD с initial_position_ms=-1 и тем же recent_uid предлагает продолжение с сохранённых 33 с; выбор «Продолжить» запускает с 33 с. ↩

  248. fw-tv188b-261021-0117-r25--media-player.c065 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 открытый диалог продолжения задерживает запуск VOD: между vod_play и выбором «Продолжить» проходит около 7 минут, после выбора появляется file_playback. ↩

  249. doc-sdk-plugins--controls-playback.c043 · doc · any-documented; прошивка — · Для чтения текущей позиции SDK предлагает поле playback_position файла /tmp/run/ext_command.state как временное решение вне официального PHP API. ↩

  250. doc-sdk-plugins--controls-playback.c046 · doc · any-documented; прошивка — · Пример содержимого resume_state.properties в SDK включает mode и поля plugin_name, plugin_entry_media_url, plugin_media_url, plugin_vod_id, plugin_vod_series_ndx, plugin_vod_position_seconds, plugin_tv_group, plugin_tv_channel, plugin_tv_is_favorite и plugin_tv_archive_tm. ↩

  251. fw-tv188b-261021-0117-r25--media-player.c066 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 resume_state.properties лежит в $FS_PREFIX/config (/data/data/com.dunehd.app/config), а /config/resume_state.properties отсутствует. ↩↩

  252. fw-tv188b-261021-0117-r25--media-player.c067 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 после ручного STOP VOD test_plugin8 файл $FS_PREFIX/config/resume_state.properties содержит plugin_name=test_plugin8 и plugin_vod_position_seconds=33. ↩

  253. doc-sdk-plugins.c090 · doc · any-documented; прошивка — · Auto-resume (выключен по умолчанию, включается yes) при включении/выходе из standby восстанавливает только live-ТВ, архив ТВ и VOD; позиция в иерархии папок не восстанавливается ↩

  254. doc-sdk-plugins.c091 · doc · any-documented; прошивка — · Вместо стандартного auto-resume можно задать своё GUI-действие (); ему передаются все значения resume_state.properties ↩

  255. plg-dc-globaltv.c052 · code · unknown; прошивка — · При автовозобновлении плагин читает из user_input поля resume_tv_group, resume_tv_channel, resume_tv_is_favorite и resume_media_url и отвечает действием tv_play. ↩

  256. fw-tv188b-261021-0117-r25--shell-ext--entry-handler.c084 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 история просмотра лежит в $FS_PREFIX/config/watch_history (/data/data/com.dunehd.app/config/watch_history; /config/watch_history в корне ФС нет): файлы с шестизначными номерами 000026.json … 000034.json (на 2026-10-28 было 000026…000033; 000034 появился 2026-10-29, файлы 000026–000033 остались), в каждом JSON-массив до 40 записей; новые записи дописываются в последний файл; рядом — cleared.txt, max_time.txt, timestamp, watched_files.txt, watched_movies.txt, sync_fixed, sync_fixed_v2. ↩

  257. fw-tv188b-261021-0117-r25--shell-ext--entry-handler.c096 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 последний шард истории 000034.json вырос за прогон с 30 до 34 записей — новые записи дописываются в последний шард. ↩

  258. fw-tv188b-261021-0117-r25--shell-ext--entry-handler.c089 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В прогоне collect8 (2026-10-30, tv188b 261021_0117_r25) после ручного STOP (ir_code STOP) plugin VOD test_plugin8 с recent_uid kbp8:d2fs запись появилась в $P/config/watch_history/000034.json через ~1 с (mtime 13:02:00.888) — до am force-stop com.dunehd.app (13:02:01); после перезапуска приложения (pid 9349, 13:02:36) при проверке в 13:02:57 запись осталась в шардах (1 вхождение). ↩

  259. fw-tv188b-261021-0117-r25--shell-ext--entry-handler.c090 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В прогоне collect8 каждый из 7 VOD-запусков test_plugin8 с recent_uid в series[].recent_uid (a6lazy, a6ser, a5ctrl, a5keys, a4first, a4resume, d2fs) дал запись истории: #15–#21 в 000034.json; kbp8:a4 записан дважды — за a4first и a4resume. ↩

  260. fw-tv188b-261021-0117-r25--shell-ext--entry-handler.c095 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 выбор записи «KB9 … #2» в «Последнем» сразу вызвал handle_user_input(recent) плагина с wh_uid kbp9:e1:2, wh_s/wh_e −1, wh_pos 7, wh_len 8, wh_file_index 1, autoplay 0 и play_default_directly 0, таймаут 20 с. ↩

    • fw-tv188b-260827-0003-r24--php-framework.c079 · code · tv188b, android-dune-fw; прошивка 250815_1012_r22, 260827_0003_r24 · В 250815_1012_r22 (tv188b) DunePluginFw::invoke_operation не обрабатывает get_vod_stream_info, а в get_out_type_code нет PLUGIN_OP_GET_VOD_STREAM_INFO; в 260827_0003_r24 они есть
    • fw-tv188b-260827-0003-r24--php-framework.c080 · code · tv188b, android-dune-fw; прошивка 250815_1012_r22, 260827_0003_r24 · В dune_api.php 250815_1012_r22 (tv188b) нет классов ChangeMovieDataActionData, ChooseFileActionData, CreateNetworkFolderActionData, CustomIgnoreUpdateActionData, EditMovieDataActionData, FileChooserFilter, FileChooserUiParams, PluginExitFoldersActionData, PluginStreamInfo, PluginTvChannelChange, PluginUpdateTvInfoActionData, PluginVodGetStreamInfoInputData, StreamMarker, SyncMyCollectionActionData, WakeNetworkFolderActionData и соответствующих ACTION_ID, STREAM_MARKER, PLUGIN_OP_GET_VOD_STREAM_INFO, GUI_EVENT_CONFIRM_UPDATE, GUI_EVENT_KEY_FAVORITES, GUI_EVENT_NETWORK_CHANGE, GUI_EVENT_TOPMENU_REFRESH; в 260827_0003_r24 они есть

    ↩↩

  261. fw-tv188b-261021-0117-r25--java-player.c043 · code · android-atv; прошивка 260724_0207_r24 · PHP dune_api.php объявляет StreamMarker с полями type, from, to, duration; PluginVodSeriesInfo.markers аннотировано как StreamMarkerList. ↩

  262. fw-tv188b-261021-0117-r25--java-player.c047 · code · android-atv; прошивка 260724_0207_r24 · PHP dune_api.php APK r24 определяет PLUGIN_OP_GET_VOD_STREAM_URL="get_vod_stream_url" и PLUGIN_UPDATE_OSD_ACTION_ID="plugin_update_osd". ↩

  263. fw-apk-260724-0207-r24.c043 · code · android-atv; прошивка 260724_0207_r24 · Все 10 текстовых файлов PHP-фреймворка data.zip/firmware_ext/php/ (bootstrap.php, dune_api.php, dune_plugin.php, dunelib/*…) совпадают по sha256 с firmware_ext/php/ прошивок tv175u r24 и tv188b r24; в прошивках там же лежат ещё php-cgi и libphp5.so ↩↩↩

  264. fw-tv188b-261021-0117-r25--media-player.c039 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24, 261021_0117_r25 · libxxx_dune_mediainfo.so и libvlc.so в tv188b r25 отличаются по SHA256 от одноимённых ELF r24. ↩

  265. fw-apk-260724-0207-r24.c035 · code · android-atv; прошивка 260724_0207_r24 · Платформенный слой Java: com.dunehd.platform.APKPlatform наследует GenericPlatform; рядом есть платформо-специфичные классы AmlogicAndroid11MiscPropertiesManager и S928XPlaybackTweaks ↩

  266. fw-tv188b-260827-0003-r24--movie-suppliers--stream-protocol.c039 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Серии VOD-описания поставщика добавляются с playback_url_is_stream_url = false; VOD-описание задаёт buffering_ms = 3000 и keep_playing_on_reenter = true ↩

  267. fw-tv188b-260827-0003-r24--http-api--ext-command-params.c065 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · libduneshell.so r24 содержит блок имён параметров состояния воспроизведения: playback_state, previous_playback_state, last_playback_event, playback_speed, playback_duration, playback_position_version, playback_repeat, playback_shuffle, playlist_version, playback_current_bitrate, playback_is_buffering, playback_volume_index(max), playback_volume, playback_mute, playback_video_width/height, audio_track_pid, subtitles_track_pid, playback_window, playback_clip_rect_, playback_video_source_rect_, osd_width/height, is_video, pause_is_available, teletext_available, scrambling_detected, audio_track.%d., subtitles_track.%d.*, playback_caption, playback_extra_caption, playback_picture ↩

  268. fw-tv188b-260827-0003-r24--http-api--ext-command-params.c072 · code · tv175u, unknown; прошивка 260724_0207_r24 · В libduneshell.so tv175u 260724_0207_r24 блок имён параметров состояния воспроизведения тот же, что в tv188b r24 (playback_state … playback_picture) ↩

  269. fw-tv188b-261021-0117-r25--network-services.c054 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в прогоне 2026-10-23 TorrServer был внешним приложением ru.yourok.torrserve (процесс torrserver, root) и слушал *:8090, 127.0.0.1:36535 и 0.0.0.0:32400. ↩

  270. fw-tv188b-261021-0117-r25--network-services.c065 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В прогоне collect8 встроенный ts (pid 32670) слушает порт 8095 на всех интерфейсах (*:8095) и отвечает MatriX.134 на /echo с компьютера (http://<адрес в LAN>:8095/echo), то есть доступен из LAN. ↩

  271. fw-apk-260724-0207-r24.c054 · code · android-atv; прошивка 260724_0207_r24 · libxxx_ts.so (44235376 байт; firmware/bin/ts по apk_bin_map.txt) — программа на Go с идентификацией TorrServer/MatriX.134 (торрент-сервер), а не ядро медиаплеера ↩

  272. doc-sdk-plugins--operations.c107 · doc · any-documented; прошивка — · PluginVodInfo::buffering_ms (предбуферизация в мс) не реализован ↩

  273. fw-tv188b-261021-0117-r25--shell-ext--entry-handler.c086 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 цветные клавиши пульта во время plugin VOD приходят плагину как handle_user_input с control_id ev_key_a_red, ev_key_b_green, ev_key_c_yellow, ev_key_d_blue и полями plugin_vod_id, plugin_vod_series_ndx, plugin_vod_sel_series_ndx, но без playback_position; playback_position есть у ev_timer. ↩

  274. doc-sdk-plugins.c089 · doc · any-documented; прошивка — · Защищённый канал: is_protected = true, playback_url_is_stream_url = false, protect_code кодируется в playback_url, а get_tv_stream_url() возвращает 'protected' при неверном коде ↩

  275. doc-sdk-plugins.c088 · doc · any-documented; прошивка — · Для архива канала нужны PluginTvChannel::have_archive = true, поддержка реального unixtime archive_tm_sec; по умолчанию archive_past_days = 14 дней, archive_delay_sec = 31 минута ↩

  276. doc-sdk-plugins--operations.c072 · doc · any-documented; прошивка — · В объявлении PluginTvChannel глубина архива задаётся полем archive_past_sec; поля archive_past_days в нём нет ↩

    • doc-sdk-plugins.c078 · doc · any-documented; прошивка — · Имя параметра get_vod_stream_url различается внутри документа: в объявлении интерфейса — $media_url, в обзоре возможностей — $playback_url
    • doc-sdk-plugins--operations.c113 · doc · any-documented; прошивка — · В описании операции get_vod_stream_url() (раздел «Plugin operations») параметр назван $playback_url

    ↩

  277. fw-tv188b-261021-0117-r25--shell-ext--entry-handler.c097 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 запись истории req7, добавленная по концу серии plugin VOD (RUN_POSTPLAY_ACTIONS), содержит uid «kbp7vod:s1» (из PluginVodSeriesInfo::recent_uid), action_plugin «test_plugin7», action_params {from: kbp7_vod, kbp7: recent}, index 0, caption «KB probe 7 VOD», ctype video, pos 24, len 25, start, watched 26 и video_id «hash:F077E72E6AD27E99»; ключа url в записи нет. ↩

    • fw-tv188b-261021-0117-r25--java-player--native-vod-bridge.c039 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При проверке на tv188b r25 для единственного маркера type=recap, from=3, to=15 без duration shell.log записал markers_osd_markers I: type intro activated for 7s.
    • fw-tv188b-261021-0117-r25--java-player--native-vod-bridge.c049 · device · android-dune-fw; прошивка 261021_0117_r25 · При проверке на tv188b r25 для маркера type=recap (from=3, to=15) на OSD через 5 с после запуска была кнопка «Пропустить заставку», та же, что у intro.
    • fw-tv188b-261021-0117-r25--java-player--native-vod-bridge.c040 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При проверке на tv188b r25 для единственного маркера type=recap` с обратной кавычкой, from=3, to=15 без duration shell.log записал markers_osd_markers I: type recap activated for 7s.
    • fw-tv188b-261021-0117-r25--java-player--native-vod-bridge.c050 · device · android-dune-fw; прошивка 261021_0117_r25 · При проверке на tv188b r25 для маркера type=recap` с обратной кавычкой (from=3, to=15) на OSD через 5 с после запуска была кнопка «Пропустить вступление».

    ↩

  278. fw-tv188b-261021-0117-r25--java-player.c048 · inference · android-dune-fw; прошивка 261021_0117_r25 · По наличию PHP DunePlugin.get_vod_stream_url и Java InternalPlayerAPI.play предполагается мост через нативную оболочку; этим разбором передача PHP URL и параметров в Java не восстановлена, кроме http_headers и udt, путь которых восстановлен в единице native-vod-bridge. ↩

  279. fw-tv188b-261021-0117-r25--java-player--native-vod-bridge.c047 · inference · android-dune-fw; прошивка 261021_0117_r25 · Из c014 следует, что запятая, полученная разэкранированием (%2C), не разделяет заголовки, а ";" (сырой или %3B) — разделяет. ↩

  280. fw-tv188b-261021-0117-r25--java-player--native-vod-bridge.c046 · inference · android-dune-fw; прошивка 261021_0117_r25 · По трём маркерам проверки на устройстве на tv188b r25 конечный тип OSD согласуется с таблицей конвертера c012 для 'intro' (intro) и 'recap`' (recap), а 'recap' без кавычки, для которого конвертер по коду возвращает -1, на OSD дал тип intro. Ветви closing_credits, прочих строк и NULL и сами коды возврата на устройстве не проверялись. ↩

    • fw-tv188b-261021-0117-r25--java-player--native-vod-bridge.c035 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При проверке на tv188b r25 с engine:1 сервер для d=none и d=0 записал предварительный запрос DuneHD с ответом 206 и запрос ExoPlayer с ответом 200; для d=1 (udt:1) записан только запрос DuneHD с ответом 206.
    • fw-tv188b-261021-0117-r25--java-player--native-vod-bridge.c036 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При проверке на tv188b r25 с engine:1 без udt и с udt:0 статус на t=10 был playing с позицией 7 и 8 соответственно; с udt:1 статус на t=10 был buffering с позицией 0, после чего скрипт послал Stop.
    • fw-tv188b-261021-0117-r25--java-player--native-vod-bridge.c037 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При проверке на tv188b r25 логи 45–47 показывают разбор engine:1 (без udt, udt:0, udt:1) и выбор playback engine: ExoPlayer во всех трёх случаях, но не показывают значение httpUdt или выбор фабрики DataSource даже в контроле без udt.

    ↩

  281. fw-tv188b-261021-0117-r25--java-player--native-vod-bridge.c025 · inference · android-dune-fw; прошивка 261021_0117_r25 · Предполагается, что плагин включает HttpUdtDataSource параметром udt:1 при engine:1 (любое значение, кроме начинающегося с 0). ↩

  282. fw-tv188b-260827-0003-r24--plugin-loader--manifest.c052 · inference · tv188b, android-dune-fw; прошивка 260827_0003_r24 · features/feature, вероятно, объявляет необязательные возможности плагина, которые оболочка использует только при объявлении (например, vod_get_stream_info — вызов операции get_vod_stream_info при воспроизведении VOD); в SDK раздел не описан ↩

  283. fw-tv188b-261021-0117-r25--java-player.c002 · code, disputed · android-dune-fw; прошивка 261021_0117_r25 · В createPlayerImpl после проверок remote/DVB значения engine 1, 2 и 4 выбирают соответственно ExoPlayerImpl, VLCPlayerImpl и MediaPlayerImpl. ↩

  284. fw-tv188b-261021-0117-r25--java-player.c008 · code, disputed · android-dune-fw; прошивка 261021_0117_r25 · FwAPKAmlogicPlatform.getPlaybackEngineOverride для потокового HTTP возвращает 1; иначе при video.codec=7 возвращает 0, а в остальных случаях 2. ↩

  285. fw-tv188b-261021-0117-r25--java-player.c010 · code, disputed · android-dune-fw; прошивка 261021_0117_r25 · safeParseURL для обычного абсолютного пути выполняет escapeExcludedCharacters и добавляет file://; до этого file:// снимается, а ветвь FS.isExfsUrl передаёт преобразование в exfsPathToExternalURI. ↩

  286. doc-sdk-plugins--gui-actions.c087 · doc, disputed · any-documented; прошивка — · При построении плейлиста LaunchMediaUrl заходит в локальные/сетевые папки и плейлисты m3u/pls и добавляет аудио-, видео- и графические файлы и потоки, DVD/Blu-ray-файлы и папки, Flash-приложения (swf://*, .swf) и WWW-ссылки (www://, *.url, *.URL) ↩

  287. doc-sdk-plugins--gui-actions.c005 · doc, disputed · any-documented; прошивка — · GUI_EVENT_PLAYBACK_STOP генерируется при остановке воспроизведения, при выключении питания или перед переключением воспроизведения ↩

  288. doc-sdk-plugins--gui-actions.c006 · doc, disputed · any-documented; прошивка — · Если на GUI_EVENT_PLAYBACK_STOP назначено действие, плеер сначала приостанавливает воспроизведение, исполняет действие, ждёт завершения цепочки действий и только потом выполняет остановку, выключение или переключение ↩

  289. doc-sdk-plugins--operations.c108 · doc, disputed · any-documented; прошивка — · По тексту документа PluginVodInfo::actions при VOD-воспроизведении поддерживает из клавиш только цветные (GUI_EVENT_KEY_A_RED, GUI_EVENT_KEY_B_GREEN, GUI_EVENT_KEY_C_YELLOW, GUI_EVENT_KEY_D_BLUE); также описаны события таймера (GUI_EVENT_TIMER) и остановки (GUI_EVENT_PLAYBACK_STOP), но перечень в документе обрывается на «- playback» и не является исчерпывающим. ↩

  290. doc-sdk-plugins--gui-actions.c013 · doc, disputed · any-documented; прошивка — · С прошивки 131029_b9 все ранее перечисленные клавишные события можно использовать в TV-воспроизведении и VOD-воспроизведении плагина ↩

  291. doc-sdk-plugins--gui-actions.c015 · doc, disputed · any-documented; прошивка — · С прошивки 131029_b9 для диалогов с контролами, регулярных папок, TV- и VOD-воспроизведения плагина (с ограничениями) добавлены события GUI_EVENT_KEY_FWD, GUI_EVENT_KEY_REW, GUI_EVENT_KEY_SLOW, GUI_EVENT_KEY_STOP, GUI_EVENT_KEY_TOP_MENU, GUI_EVENT_KEY_POWER, GUI_EVENT_KEY_EJECT, GUI_EVENT_KEY_MODE, GUI_EVENT_KEY_VENDOR, GUI_EVENT_KEY_MUTE, GUI_EVENT_KEY_V_PLUS, GUI_EVENT_KEY_V_MINUS, GUI_EVENT_KEY_SEARCH, GUI_EVENT_KEY_ZOOM, GUI_EVENT_KEY_SUBTITLE, GUI_EVENT_KEY_REPEAT, GUI_EVENT_KEY_AUDIO, GUI_EVENT_KEY_REC, GUI_EVENT_KEY_DUNE, GUI_EVENT_KEY_URL ↩

  292. doc-sdk-plugins--controls-playback.c044 · doc, disputed · any-documented; прошивка — · Подход B для возобновления VOD предлагает PHP-коду читать данные из /config/resume_state.properties и затем задавать initial_position_ms; чтение файла прямо названо временным решением вне официального PHP API. ↩

  293. doc-sdk-plugins--controls-playback.c045 · doc, disputed · any-documented; прошивка — · В подходе C SDK указывает, что /config/resume_state.properties создаётся системой даже без auto_resume в манифесте и может читаться и обрабатываться PHP-кодом плагина. ↩

  294. fw-tv188b-261021-0117-r25--downloads.c080 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 для торрента Pioneer One VO (12 файлов) entry.play_magnet вернул launch_media_url с file:///data/data/com.dunehd.app/tmp/plugins/downloads/open_magnet.m3u; файл содержит шесть записей #EXTINF с avi, srt в плейлист не попали. ↩

  295. fw-tv188b-261021-0117-r25--downloads.c007 · code, disputed · tv188b, android-dune-fw; прошивка 261021_0117_r25 · play_magnet запускает один поток непосредственно, а для нескольких файлов пишет open_magnet.m3u и запускает file:// плейлист. ↩

  296. fw-tv188b-261021-0117-r25--java-player.c065 · inference · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Вероятно, на tv188b r25 для воспроизведения HTTP MP4 через явный PlayerProxyActivity требуется action android.intent.action.VIEW. ↩

  297. fw-tv188b-261021-0117-r25--java-player.c012 · code, disputed · android-dune-fw; прошивка 261021_0117_r25 · ExoPlayerImpl.play заменяет userAgent значением после точного регистрозависимого префикса "User-Agent: " в params.httpHeaders; цикл позволяет последней такой строке перезаписать предыдущую. ↩

  298. fw-tv188b-261021-0117-r25--java-player.c013 · code, disputed · android-dune-fw; прошивка 261021_0117_r25 · ExoPlayerImpl.setHTTPHeaders пропускает строки с точным префиксом "User-Agent: "; остальные заголовки разбивает по первому ": " с индексом >0 и сохраняет имя/значение в default request properties. ↩

  299. fw-tv188b-261021-0117-r25--java-player.c021 · code, disputed · android-dune-fw; прошивка 261021_0117_r25 · После общей карты заголовков DefaultHttpDataSource.makeConnection отдельно устанавливает Range (если вычислен), User-Agent (если не null) и Accept-Encoding (gzip либо identity). ↩

  300. fw-tv188b-261021-0117-r25--java-player.c018 · code, disputed · android-dune-fw; прошивка 261021_0117_r25 · В ручном цикле DefaultHttpDataSource.makeConnection HTTP-методы с кодами 1 или 3 следуют Location при ответах 300, 301, 302, 303, 307 и 308. ↩

  301. fw-tv188b-260827-0003-r24--movie-suppliers--stream-protocol.c046 · inference · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Проверку URL проходят абсолютный путь («/tmp/www/dash.mpd») и URL со схемой из строчных латинских букв, «-» и «_» (http://, https://, http://mp4://…), а также пустая схема («://…»); схема с цифрами или заглавными буквами (например «m3u8://», «HTTP://») и пустая строка отвергаются ↩

  302. fw-tv188b-260827-0003-r24--http-api--ext-command-params.c081 · inference · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Команды запуска r24, вероятно, требуют в media_url полного (qualified) URL — со схемой вроде nfs:// или storage_name://; иное значение даёт ошибку «invalid media_url» ↩

  303. fw-tv188b-260827-0003-r24--http-api--ext-command-params.c066 · inference · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Блок имён c065, вероятно, — ключи состояния воспроизведения, которые ext_command отдаёт в ответе cmd=status (и в /tmp/run/ext_command.state); имена из документа (playback_speed, playback_duration, playback_is_buffering, teletext_available, playback_volume, playback_mute, playback_caption, playback_extra_caption, playback_picture, is_video) в нём совпадают ↩

  304. fw-tv188b-261021-0117-r25--media-player.c046 · inference · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Имена ff_*_protocol и ff_rtsp_demuxer в libvlc.so дают кандидатов транспорта file, HTTP, FTP, RTMP/RTMPT/RTMPE/RTMPS/RTMPTS/RTMPTE, RTP, RTSP, UDP, MMSH и MMST; их доступность через VOD не доказана. ↩

  305. fw-tv188b-261021-0117-r25--media-player.c047 · inference · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Имена nfs_parse_url_incomplete/nfs_open_async, smb_fopen и smb2_parse_args/smb2_open_async в libvlc.so указывают на возможный доступ к NFS и SMB; маршрутизация VOD через эти реализации не доказана. ↩

  306. fw-tv188b-261021-0117-r25--media-player.c048 · inference · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Имена ff_avi_demuxer, ff_flv_demuxer, ff_matroska_demuxer, ff_mov_demuxer, ff_mpegts_demuxer, ff_mpegps_demuxer и ff_ogg_demuxer в libvlc.so дают кандидатов контейнеров AVI, FLV, Matroska, MOV/MP4, MPEG-TS/PS и Ogg. ↩

  307. fw-tv188b-261021-0117-r25--media-player.c049 · inference · tv188b, android-dune-fw; прошивка 261021_0117_r25 · ff_hls_demuxer и ff_hls_protocol в strings libvlc.so указывают на возможный путь HLS; поддержка конкретного HLS VOD этой сборкой не подтверждена. ↩

    • fw-tv188b-261021-0117-r25--media-player.c050 · inference · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Имена ff_ass_demuxer, ff_srt_demuxer, ff_webvtt_demuxer, ff_subrip_decoder и ff_webvtt_decoder в libvlc.so дают кандидатов форматов субтитров ASS/SSA, SRT/SubRip и WebVTT.
    • fw-tv188b-261021-0117-r25--media-player.c051 · inference · tv188b, android-dune-fw; прошивка 261021_0117_r25 · libvlc_media_player_add_slave, libvlc_media_slaves_add и libvlc_video_set_subtitle_file в strings libvlc.so — кандидаты точек подключения внешних субтитров; вызов их оболочкой не установлен.

    ↩

    • fw-tv188b-261021-0117-r25--media-player.c045 · inference · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Справочные строки MediaInfo в dune_mediainfo дают кандидатов распознавания HLS/m3u8, DASH/mpd, Matroska/mkv, MPEG-PS, MPEG-TS, MPEG-4/mp4, AVI, FLV, Ogg и WebM; работоспособность парсеров не подтверждена.
    • fw-tv188b-261021-0117-r25--media-player.c043 · inference · tv188b, android-dune-fw; прошивка 261021_0117_r25 · По строкам http://, https:// и udf://%s#%s кандидатами входов dune_mediainfo являются HTTP, HTTPS и UDF-пути; их приём утилитой требует подтверждения.

    ↩

  308. fw-tv188b-261021-0117-r25--shell-ext--entry-handler.c088 · inference · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Вероятно, для «Продолжить» у кнопки поставщика история plugin VOD должна содержать uid вида :…, movie_id нужного фильма и len>0 и pos>=0. ↩

  309. fw-tv188b-261021-0117-r25--shell-ext--entry-handler.c055 · inference · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Вероятно, для записи поставщика или plugin VOD с не-URL uid и movie_id «Просмотрено» в r25 хранится только отметкой фильма в watched_movies.txt: get_movie_mark_files не даёт такому uid файловой отметки. ↩