Воспроизведение из плагина: VOD, ТВ, URL, плееры и события¶
Черновик (2026-10-30). Как PHP-плагин запускает воспроизведение, какие URL отдаёт плееру, какой движок плеера срабатывает, какие события приходят обратно и чем отличаются прошивки. Источники: SDK плагинов (
doc, без версии прошивки, кроме оговорённых мест); код tv188b260827_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 у
PluginVodInfo13 полей: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. Приtrueplayback URL используется как stream URL, приfalseget_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; приTRUEget_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). - Плагин
downloadsr25 (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):
- Функция
0x00204178ищет в URL|||dune_params|||и разбирает всё после разделителя поиском ключей (код r25)198. Для playback URL её вызывает0x001fad30через0x001edab0(код r25)199. В ветвиprocess_new_urlпараметры в stream URL читаются, лишь когда в playback URL разделителя не было (код r25)200. - При ключе
http_headers:разборщик копирует значение до первой запятой или конца строки, вызываетhtml_utils_unescapeи, если результат непуст, делит егоstring_array_splitпо;и сохраняет массив в глобальную переменную — слот GOT-0x2630(код r25)201. Как значение делится на устройстве — таблица проверки на устройстве ниже; что из этого следует для%2C, — §7. Этот слот освобождает и обнуляет функция0x00203bcc(код r25)202; вызов сброса на устройстве не снят — §7. - Цикл плеера
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 иMediaPlayerImpladdSubtitlesпустой, а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).
- Сначала могут сработать особые ветви: HLS, Blu-ray, ExFS,
forceHifiImpl(код r25)256. Приengine=-1и HLS сinitFragment, mp4 илиonlyAltRenditionsForAudioвыбирается ExoPlayer (1) (код r25)257. - Для промежуточного
engine-1 или 0 вызывается платформенныйgetPlaybackEngineOverride(код r25)256: - базовый
APKPlatform: 1 (ExoPlayer) для потокового HTTP, иначе 2 (libVLC) (код r25)258; FwAPKAmlogicPlatform— своё правило с веткойvideo.codec; оноdisputed(§7). «Потоковый HTTP» — HTTP/HTTPS URL, кроме случаев, которыеisNonStreamingHTTPсчитает непотоковыми;contentType1, 6, 4, 3, 5 из непотоковых исключены (код r25)259.- Затем по очереди проверяются файлы-флаги
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) появилось по записи —uidkbp9:e1:1иkbp9:e1:2,index0 и 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. После проверки на устройстве все три утверждения SDKdisputed, поэтому они перечислены в §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_days14 дней (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 r25recapдал вshell.logtype 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).
-
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 не вызывалась ни разу, хотя плагин-тестовый плагин реализует оба метода. ↩↩↩
-
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. ↩↩↩
-
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]
-
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 уже есть — через запятую без повторной магии. ↩↩
-
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.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.
-
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.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.
-
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. ↩↩↩
-
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.
-
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. ↩↩↩
-
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. ↩↩
-
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. ↩↩ -
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). ↩↩
-
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() исполняется как следующее действие ↩
-
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 переопределяют выбор и состояние воспроизведения по умолчанию
-
doc-sdk-plugins--gui-actions.c086 · doc · any-documented; прошивка — · LaunchMediaUrl рекурсивно строит плейлист с url в качестве корня, по содержимому плейлиста выбирает исполнителя и запускает его ↩
-
doc-sdk-plugins--gui-actions.c082 · doc · any-documented; прошивка — · FilePlay (данные FilePlayActionData с полем url) запускает обычное воспроизведение одного файла; url должен указывать на аудио- или видеофайл либо поток поддерживаемого формата ↩
-
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
-
doc-sdk-plugins--gui-actions.c038 · doc · any-documented; прошивка — · Если вывод Get_tv_info невалиден, PluginTvPlayAction завершается ошибкой ↩
-
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 ↩
-
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. ↩
-
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. ↩
-
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; иначе — обычное воспроизведение файлов ↩
-
doc-sdk-plugins--gui-actions.c084 · doc · any-documented; прошивка — · url в PlaylistPlay может указывать на одиночный локальный/сетевой/http аудио- или видеофайл (или иной поддерживаемый сетевой ресурс), на плейлист m3u/pls или на локальную/сетевую папку с аудио, видео и плейлистами ↩
-
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 ↩
-
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 добавляются только при истинности. ↩
-
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 (сценарий сериала) ↩
-
doc-sdk-plugins--operations.c027 · doc · any-documented; прошивка — · PluginMovieFolderView::left_button_action необязателен, по умолчанию левой кнопке назначено GUI-действие VOD_PLAY ↩
-
doc-sdk-plugins.c079 · doc · any-documented; прошивка — · Типичный IPTV-плагин добавляет точку входа в меню TV, реагирующую на ENTER как PLUGIN_OPEN_FOLDER и на PLAY как PLUGIN_TV_PLAY, плюс точку в Setup->Applications ↩
-
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. ↩
-
doc-sdk-plugins.c081 · doc · any-documented; прошивка — · Во время TV/VOD-воспроизведения плагина работает playback executor, исполняющий только PluginHandleUserInput, PluginShowError, ChangeBehaviour, PluginInvalidateFolders и PluginVodPlay (с обязательным vod_info) ↩
-
doc-sdk-plugins--gui-actions.c100 · doc · any-documented; прошивка — · С прошивки 131029_b9 CloseAndRunAction, вызванное из TV-воспроизведения или VOD-воспроизведения плагина без активного диалога, работает как остановка воспроизведения ↩
-
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.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.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 нет. ↩↩
-
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). ↩
-
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». ↩↩
-
fw-tv188b-261021-0117-r25.c276 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 StreamMarker без поля duration (только type, from, to) оболочка принимает: оба маркера серии добавлены («2 markers added»). ↩
-
fw-tv188b-261021-0117-r25.c277 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 серия VOD без ключа PluginVodSeriesInfo::markers воспроизводится — серия «KB6 S2 lazy» без markers проиграна до конца файла. ↩
-
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 с после запуска была кнопка «Пропустить вступление».
-
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.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'. ↩↩
-
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. ↩↩
-
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.c050 · device · android-dune-fw; прошивка 261021_0117_r25 · При проверке на tv188b r25 для маркера type=recap` с обратной кавычкой (from=3, to=15) на OSD через 5 с после запуска была кнопка «Пропустить вступление». ↩
-
fw-tv188b-261021-0117-r25--java-player--native-vod-bridge.c010 · code · android-dune-fw; прошивка 261021_0117_r25 · Загрузчик маркеров 0x002fca08 заменяет duration меньше 1 на 7 в копии каждого допущенного маркера перед добавлением во внутренний список. ↩
-
doc-sdk-plugins--operations.c097 · doc · any-documented; прошивка — · get_vod_info() возвращает данные для запуска VOD-воспроизведения (PluginVodInfo); необязательный $media_url — подсказка, с какой серии начать ↩
-
doc-sdk-plugins--operations.c098 · doc · any-documented; прошивка — · get_vod_info() обычно вызывается при PLAY или ENTER на элементе папки, у которого на это событие назначено действие plugin_vod_play ↩
-
doc-sdk-plugins--operations.c099 · doc · any-documented; прошивка — · VOD-воспроизведение плагина проигрывает список серий фильма; серий не меньше одной ↩
-
doc-sdk-plugins--operations.c103 · doc · any-documented; прошивка — · PluginVodInfo::series — список серий, образующий подобие плейлиста; initial_series_ndx — индекс серии, с которой начинается воспроизведение ↩↩
-
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 ↩
-
doc-sdk-plugins--operations.c102 · doc · any-documented; прошивка — · PluginVodInfo name, description, poster_url и series[i]->name используются для OSD ↩
-
doc-sdk-plugins--operations.c101 · doc · any-documented; прошивка — · Класс PluginVodSeriesInfo имеет поля name, playback_url (String) и playback_url_is_stream_url (Boolean) ↩
-
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 ↩
-
doc-sdk-plugins--operations.c116 · doc · any-documented; прошивка — · get_vod_stream_url() вызывается при каждом старте или возобновлении воспроизведения, если series[ndx]->playback_url_is_stream_url = false; параметром передаётся series[ndx]->playback_url ↩
-
doc-sdk-plugins--operations.c104 · doc · any-documented; прошивка — · PluginVodInfo::initial_position_ms — начальная позиция в миллисекундах; при отрицательном значении выбирается позиция по умолчанию (возможно продолжение просмотра) ↩
-
doc-sdk-plugins--operations.c105 · doc · any-documented; прошивка — · PluginVodInfo::advert_mode = TRUE: отключены перемотка, переходы, смена скорости и т. п., OSD сильно ограничен, но доступны настройка изображения, zoom, выбор аудио и субтитров ↩
-
doc-sdk-plugins--operations.c106 · doc · any-documented; прошивка — · PluginVodInfo::ip_address_required и valid_time_required задают поведение при недоступных IP-адресе и/или корректном времени (как у PluginTvInfo) ↩
-
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 ↩
-
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 ↩
-
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.
-
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' ↩
-
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» ↩
-
fw-tv188b-260827-0003-r24--php-framework.c232 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс PluginStreamInfo с ключами (2): url, markers ↩
-
fw-tv188b-260827-0003-r24--plugin-loader--manifest.c051 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Манифест ktv_start объявляет
; строка vod_get_stream_info есть в libduneshell.so среди строк plugin_next_url.c, а в списке операций плагина — get_vod_stream_info ↩vod_get_stream_info -
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}. ↩
-
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. ↩
-
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. ↩
-
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. ↩
-
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 первых двух видео. ↩
-
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, указывающим позицию прерывания.
-
doc-sdk-plugins.c077 · doc · any-documented; прошивка — · Минимальное ТВ-воспроизведение требует get_tv_info() и get_tv_playback_url(); архив — ненулевого $archive_tm_sec, защищённые каналы — непустого $protect_code ↩
-
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) ↩
-
doc-sdk-plugins--operations.c039 · doc · any-documented; прошивка — · get_tv_info() вызывается, когда GUI Dune исполняет действие PLUGIN_TV_PLAY ↩
-
doc-sdk-plugins--operations.c038 · doc · any-documented; прошивка — · get_tv_info() возвращает данные для запуска ТВ-воспроизведения плагина (PluginTvInfo); $media_url — подсказка, какой канал играть первым ↩
-
doc-sdk-plugins--operations.c087 · doc · any-documented; прошивка — · get_tv_playback_url() возвращает строкой playback URL канала: для live при $archive_tm_sec <= 0, для архива при $archive_tm_sec > 0 ↩
-
doc-sdk-plugins--operations.c089 · doc · any-documented; прошивка — · get_tv_playback_url() вызывается каждый раз, когда воспроизведение канала начинается или возобновляется ↩
-
doc-sdk-plugins--operations.c090 · doc · any-documented; прошивка — · Если PluginTvChannel::playback_url_is_stream_url == false, для получения реального stream URL нужен дополнительный вызов get_tv_stream_url() с playback URL ↩
-
doc-sdk-plugins--operations.c096 · doc · any-documented; прошивка — · При PluginTvChannel::playback_url_is_stream_url = TRUE playback URL трактуется как stream URL и get_tv_stream_url() никогда не вызывается ↩
-
doc-sdk-plugins--operations.c093 · doc · any-documented; прошивка — · Разделение playback URL и stream URL нужно, когда плагин не может дать фиксированный URL потока и получает его удалённым вызовом, результат которого каждый раз разный ↩
-
doc-sdk-plugins--operations.c094 · doc · any-documented; прошивка — · Playback URL при playback_url_is_stream_url = false используется для предварительной инициализации движка воспроизведения, поэтому должен иметь правильный префикс (например http://ts://), и передаётся в get_tv_stream_url() ↩
-
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 ↩
-
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»). ↩
-
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 ↩
-
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 ↩
-
doc-sdk-plugins--operations.c048 · doc · any-documented; прошивка — · Поля PluginTvInfo initial_group_id, initial_channel_id, initial_favorites, initial_archive_tm задают начальное состояние и необязательны: незаданное поле выставляется автоматически ↩
-
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
-
doc-sdk-plugins--operations.c067 · doc · any-documented; прошивка — · PluginTvChannel::buffering_ms — время предбуферизации при воспроизведении канала ↩
-
doc-sdk-plugins--operations.c064 · doc · any-documented; прошивка — · PluginTvChannel::have_archive включает архив канала; тогда get_tv_playback_url() должна поддерживать архив ↩
-
doc-sdk-plugins--operations.c071 · doc · any-documented; прошивка — · PluginTvChannel::archive_past_sec — максимальная глубина архива от текущего момента в прошлое, archive_delay_sec — интервал (в секундах) от текущего момента до ближайшего момента в прошлом, для которого архив доступен ↩
-
doc-sdk-plugins--operations.c068 · doc · any-documented; прошивка — · PluginTvChannel::timeshift_hours (сдвиг по времени в часах) не реализован ↩
-
doc-sdk-plugins--operations.c058 · doc · any-documented; прошивка — · PluginTvInfo::custom_protect_code_handling (с прошивки 121116): для каналов с is_protected = true, если get_tv_playback_url() вернул строку 'protected', показывается диалог кода, иначе поток считается незащищённым ↩↩
-
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. ↩
-
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 для следующей серии.
-
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 не созданы, выбора файла не было. ↩ -
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] ↩
-
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:// ↩
-
plg-dc-globaltv.c078 · code · unknown; прошивка — · В URL воспроизведения плагин заменяет //127.0.0.1:/ на //localhost:/ и префикс http://localhost: на http://ts://localhost:. ↩
-
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» ↩
-
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--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, поэтому там оба параметра сохраняются. ↩
-
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.
-
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.
-
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». ↩
-
doc-sdk-media-url.c002 · doc · any-documented; прошивка — · Параметр rtsp_tcp:0|1 (по умолчанию 0) действует только для RTSP: 0 — предпочитать RTSP+RTP с автоопределением RTSP-TCP, когда это возможно; 1 — принудительно использовать RTSP-TCP. ↩
-
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, поэтому там оба параметра сохраняются.
-
doc-sdk-media-url.c005 · doc · any-documented; прошивка — · Параметр hls_initial_bandwidth:low|high|auto|auto_high (по умолчанию — по настройкам пользователя, то есть auto) задаёт начальный битрейт при старте HLS: low — минимально возможный, high — максимально возможный, auto — последний запомненный фактический или минимальный (рекомендуемый), auto_high — последний запомненный или максимальный. ↩
-
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»). ↩↩
-
doc-sdk-media-url.c007 · doc · any-documented; прошивка — · Параметр hls_bw_strategy:0|1 (по умолчанию 0) действует только для HLS: 0 — текущая стратегия, при которой плеер максимизирует качество и переключает вариант даже при недостаточной пропускной способности, если буферизация позволяет временно играть более высокий битрейт; 1 — переключать варианты реже и только когда пропускная способность больше выбранного варианта. ↩
-
doc-sdk-media-url.c008 · doc · any-documented; прошивка — · Параметр hls_sticky_live:0|1 (по умолчанию 1) действует только для HLS и включает обходной приём для скользящего окна live-плейлиста: если из-за сбоя в нём появился тег конца списка, тег игнорируется; на воспроизведение HLS VOD параметр не влияет. ↩
-
doc-sdk-media-url.c009 · doc · any-documented; прошивка — · Параметр enable_seek:0|1 (по умолчанию 1) действует (по тексту «сейчас») только для HLS: 0 — запретить seek по времени, 1 — разрешить, когда это возможно, то есть для VOD-контента. ↩
-
doc-sdk-media-url.c010 · doc · any-documented; прошивка — · Параметр deint_mode:off|bob|adaptive|adaptive_plus (по умолчанию — по настройкам пользователя) задаёт режим деинтерлейсинга; adaptive_plus доступен в прошивке 150318_b9+. Пример применения — IPTV-канал с чересстрочным видео, для которого нужен режим adaptive, даже если у пользователя выбран bob. ↩
-
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, который заявляет прогрессивность, но на деле чересстрочный. ↩
-
doc-sdk-media-url.c012 · doc · any-documented; прошивка — · Параметр buffering_ms:1..60000 (по умолчанию — по настройкам пользователя) задаёт период буферизации в миллисекундах и действует только для MPEG-TS-потоков (HTTP/TS, HLS, RTSP, UDP multicast, DVB); для HLS влияние на старт сильно зависит от пропускной способности и может быть почти незаметным, если она намного выше битрейта потока. ↩
-
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. ↩
-
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 — более агрессивные. ↩
-
doc-sdk-media-url.c015 · doc · any-documented; прошивка — · Параметр fast_prebuf:0|1 (по умолчанию 0) действует только для multicast MPEG-TS и включает быстрый старт воспроизведения в особых случаях; он предназначен в основном для специфических сценариев (локальный multicast-прокси для быстрого переключения каналов) и, вероятно, даёт сбои буферизации на обычных трансляциях. ↩
-
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 непрактично. ↩
-
doc-sdk-media-url.c017 · doc · any-documented; прошивка — · Параметр ll_display_for_http_ts:0|1 (по умолчанию 0) действует только для MPEG-TS через HTTP/TS и включает специальный низколатентный режим показа: каждый видеокадр выводится почти сразу после полного получения; режим предназначен для потоков, специально оптимизированных для низкой задержки. ↩
-
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; задержка нужна для стабильного воспроизведения звука ценой некоторого отставания. ↩
-
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. Параметр не рекомендуется использовать без необходимости. ↩
-
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 там используется всегда. ↩
-
doc-sdk-media-url.c021 · doc · any-documented; прошивка — · Параметр keep_pic:0|1 (по умолчанию 1) действует для MPEG-TS и указывает, оставлять ли последний показанный кадр на экране (вместо чёрного экрана) при переключении между MPEG-TS-потоками; эффект есть только когда оба потока допускают оптимизированное переключение без полного перезапуска движка, при полном перезапуске экран всё равно чёрный. ↩
-
doc-sdk-media-url.c022 · doc · any-documented; прошивка — · Параметр keep_audio_pid:0|1 (по умолчанию 0) действует для MPEG-TS: при включении сохраняет тот же audio PID при смене содержимого программы и не выбирает его заново по языковым предпочтениям; это специфический обходной приём для потоковых данных. ↩
-
doc-sdk-media-url.c023 · doc · any-documented; прошивка — · Параметр recording_encryption:0|1 (по умолчанию 0) действует только для MPEG-TS (HLS, UDP multicast, DVB): при включении записи LPVR пишутся на диск в зашифрованном виде, и такие записи можно воспроизвести только на том же STB, где они созданы. ↩
-
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. ↩
-
doc-sdk-media-url.c025 · doc · any-documented; прошивка — · Параметр cancel_ll_prebuf:0|1 (по умолчанию 1; доступен в прошивке 140312_b9+) действует только для multicast/DVB и только на платформах 867x+: при 1 включает раннюю отмену низколатентной предбуферизации, когда считается, что данных уже достаточно; если после переключения каналов пропадает звук, рекомендуется попробовать 0 (вернуть старое поведение). ↩
-
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-потоку.
-
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-ассетов без явного указания типа. ↩
-
doc-sdk-media-url.c030 · doc · any-documented; прошивка — · Параметр hls_v4_audio:1 (по умолчанию 0; доступен в прошивке 131009_b9+) действует только для HLS и включает существенно ограниченную поддержку аудиодорожек HLS v4 в подходящих ассетах. ↩
-
doc-sdk-media-url.c031 · doc · any-documented; прошивка — · Параметр program_number:1... (по умолчанию autodetect; доступен в прошивке 140218_b9+) действует для любого MPEG-TS и задаёт номер программы (service id) явно; полезен при многопрограммном потоке и как обходной путь, когда PAT перечисляет несколько программ, но присутствует только одна и не первая. Несуществующая программа приводит к выбору без программы, то есть без звука и видео; параметр имеет приоритет над номером программы в DVB URL. ↩
-
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. ↩
-
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 (меняя способ получения ключей). ↩
-
doc-sdk-media-url.c034 · doc · any-documented; прошивка — · Параметр item_id:0... (по умолчанию autodetect или выбор пользователя; доступен в прошивке 150312_r10+) действует при воспроизведении некоторых многоэлементных ассетов и позволяет выбрать элемент такого ассета. ↩
-
doc-sdk-media-url.c035 · doc · any-documented; прошивка — · Параметр item_position:0... (по умолчанию 0 или закладка; доступен в прошивке 150312_r10+) действует при воспроизведении некоторых многоэлементных ассетов и задаёт позицию продолжения в элементе, когда указан item_id. ↩
-
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 ↩
-
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. ↩
-
fw-tv188b-261021-0117-r25--java-player.c063 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 выбор DUNE («Только сейчас») в системном диалоге VIEW для тестового HTTP MP4 запускает VLC через PlayerProxyActivity. ↩
-
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. ↩↩
-
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. ↩
-
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. ↩
-
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. ↩
-
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 файла. ↩
-
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. ↩
-
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. ↩
-
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». ↩
-
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. ↩
-
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.c059 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 VLC следует тестовому HTTP 302 с /redir/kb8-a.mp4 на /m/kb8-a.mp4. ↩
-
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. ↩
-
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. ↩↩
-
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. ↩
-
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. ↩↩↩
-
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.
-
fw-tv188b-261021-0117-r25--java-player.c020 · code · android-dune-fw; прошивка 261021_0117_r25 · DefaultHttpDataSource.makeConnection объединяет defaultRequestProperties, requestProperties и карту запроса именно в таком порядке, затем вызывает setRequestProperty для каждого элемента. ↩
-
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 и выбирает фабрику без вызовов логгера в обеих ветвях этого метода.
-
fw-tv188b-261021-0117-r25--java-player.c030 · code · android-dune-fw; прошивка 261021_0117_r25 · Базовый MediaPlayerImpl.doSetDataSourceAndPrepare вызывает Android MediaPlayer.setDataSource(Context, Uri) без аргумента карты HTTP-заголовков. ↩
-
fw-tv188b-261021-0117-r25--java-player.c029 · code · android-dune-fw; прошивка 261021_0117_r25 · Для собственного HLS-запроса InternalPlayer задаёт HttpURLConnection connectTimeout=5000, readTimeout=3000 и переносит заголовки, разбитые по первому ": ". ↩
-
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 (разборщик), затем делает второй косвенный вызов и возвращает результат разборщика.
-
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 разделителя не было. ↩
-
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). ↩↩
-
fw-tv188b-261021-0117-r25--java-player--native-vod-bridge.c017 · code · android-dune-fw; прошивка 261021_0117_r25 · Функция 0x00203bcc освобождает массив слота GOT -0x2630 через string_array_free и обнуляет слот. ↩↩
-
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], сохраняя индексы.
-
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.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.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.c003 · code · android-dune-fw; прошивка 261021_0117_r25 · Конструктор Java PlaybackParams r25 присваивает четвёртый аргумент boolean полю httpUdt. ↩
-
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. ↩
-
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 серии. ↩
-
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.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.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 этого заголовка не содержал. ↩
-
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. ↩↩
-
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. ↩
-
plg-hdtv-smart-vod--link-api.c070 · code · unknown; прошивка — · Для передачи заголовков плееру код добавляет к URL суффикс |||dune_params|||http_headers: с urlencode-заголовками (sibnet, sovetromantica, Twitch). ↩
-
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. ↩
-
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 дописывается с экранированием запятых как ',,'. ↩
-
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 запоминается ↩
-
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. ↩
-
fw-tv188b-261021-0117-r25--java-player.c025 · code · android-dune-fw; прошивка 261021_0117_r25 · При contentType=4 ExoPlayerImpl.buildMediaSource создаёт HlsMediaSource.Factory с MyHlsDataSourceFactory. ↩
-
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) для источника манифеста. ↩
-
fw-tv188b-261021-0117-r25--java-player.c027 · code · android-dune-fw; прошивка 261021_0117_r25 · При contentType=5 ExoPlayerImpl.buildMediaSource создаёт SsMediaSource.Factory с DefaultSsChunkSource.Factory. ↩
-
fw-tv188b-261021-0117-r25--java-player.c050 · code · android-dune-fw; прошивка 261021_0117_r25 · Для contentType, отличных от 3, 4 и 5, ExoPlayerImpl.buildMediaSource создаёт ProgressiveMediaSource.Factory. ↩
-
fw-tv188b-261021-0117-r25--java-player.c028 · code · android-dune-fw; прошивка 261021_0117_r25 · MyHlsDataSourceFactory.doCreateDataSource обычно использует общую dataSourceFactory, но при enableDrm=true и типе 3 создаёт VMXWebKeyDataSource. ↩
-
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». ↩
-
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 не изменился. ↩ -
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 субтитров для плагинов не было
-
fw-tv188b-261021-0117-r25--java-player.c039 · code · android-dune-fw; прошивка 261021_0117_r25 · PlaybackParams принимает три массива externalSubtitles, externalSubtitlesSuffixes и externalSubtitlesFullSuffixes через конструктор и сохраняет их в одноимённых полях. ↩
-
fw-tv188b-261021-0117-r25--java-player.c034 · code · android-dune-fw; прошивка 261021_0117_r25 · VLCPlayerImpl.addingSubtitlesSupported возвращает true. ↩
-
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.
-
fw-tv188b-261021-0117-r25--media-player.c001 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · subtitles.php принимает только команды search и rating и один JSON-аргумент; при другом режиме или числе аргументов вызывает usage() с exit(1). ↩
-
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". ↩ -
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. ↩
-
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.
-
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. ↩
-
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.
- 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
-
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. ↩↩
-
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 ↩↩
-
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/ ↩↩
-
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) ↩↩
-
fw-tv188b-261021-0117-r25--java-player.c001 · code · android-dune-fw; прошивка 261021_0117_r25 · InternalPlayerAPI.play(String, PlaybackParams) при существующем internalPlayer передаёт оба аргумента в InternalPlayer.play. ↩
-
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. ↩↩
-
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). ↩
-
fw-tv188b-261021-0117-r25--java-player.c006 · code · android-dune-fw; прошивка 261021_0117_r25 · Базовый APKPlatform.getPlaybackEngineOverride возвращает 1 при isStreamingHTTP=true и 2 иначе. ↩↩
-
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. ↩
-
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. ↩
-
plg-dc-globaltv.c061 · code · android; прошивка — · На Android плагин читает /firmware/config/android_platform.txt и считает платформу Amlogic, если строка начинается с s905; к dune_params добавляется engine:1 на любом Android. ↩
-
doc-sdk-plugins.c135 · doc · android; прошивка — · Android-платформы не поддерживают FlashLite; HTML/JS API поддерживаются на другом движке; ядро плеера иное, хотя добавлены 4Kp60 и Widevine DRM ↩
-
doc-sdk-plugins.c130 · doc · sigma-smp87xx; прошивка — · Плеер SMP87xx основан на плеере SMP86xx, поддерживает те же протоколы и форматы и больше (например DASH и H.265), но возможны несовместимости ↩
-
doc-sdk-plugins.c131 · doc · sigma-smp87xx; прошивка — · На SMP87xx есть фоновое воспроизведение (TOP MENU возвращает в меню при продолжении проигрывания); плагин должен учитывать навигацию по своим экранам во время своей сессии воспроизведения ↩
-
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). ↩
-
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). ↩
-
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. ↩
-
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.
-
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. ↩↩
-
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. ↩
-
fw-tv188b-261021-0117-r25.c271 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 событие playback_stop приходит и при автопереходе к следующей серии VOD по окончании файла предыдущей — до вызова get_vod_stream_url для следующей серии. ↩
-
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. ↩
-
fw-tv188b-261021-0117-r25--media-player.c054 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 назначенное в PluginVodInfo::actions действие key_pause перехватывает PAUSE: плагин получает событие, а воспроизведение продолжает идти. ↩
-
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-й секунде.
-
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 для этих команд. ↩
-
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. ↩↩
-
doc-sdk-plugins--operations.c109 · doc · any-documented; прошивка — · GUI_EVENT_PLAYBACK_STOP в PluginVodInfo::actions срабатывает при остановке, запуске другого media_url или запросе выключения; фактическая остановка откладывается до конца исполнения действия, а повторное STOP/POWER-OFF отменяет его ↩
-
doc-sdk-plugins--gui-actions.c016 · doc · any-documented; прошивка — · С прошивки 150529 событие GUI_EVENT_PLAYBACK_SWITCHED генерируется после переключения воспроизведения на новый media URL, включая самый первый ↩
-
doc-sdk-plugins--gui-actions.c017 · doc · any-documented; прошивка — · С прошивки 150529 событие GUI_EVENT_PLAYBACK_GOING_TO_SWITCH генерируется перед переключением на новый media URL; в отличие от GUI_EVENT_PLAYBACK_STOP, оно не генерируется при остановке и выключении ↩↩
-
doc-sdk-plugins--gui-actions.c018 · doc · any-documented; прошивка — · Плеер не ждёт завершения действия, назначенного на GUI_EVENT_PLAYBACK_GOING_TO_SWITCH (в отличие от GUI_EVENT_PLAYBACK_STOP) ↩
-
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
-
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-воспроизведения плагина
-
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". ↩↩
-
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. ↩
-
doc-sdk-plugins.c010 · doc · any-documented; прошивка — · OSD-интерфейс воспроизведения IPTV и VOD (навигация по каналам, категории, избранное, EPG, серии) предоставляется автоматически ↩
-
doc-sdk-plugins--controls-playback.c047 · doc · any-documented; прошивка — · Подход D в SDK предлагает запоминать позицию по GUI_EVENT_TIMER, сохранять последнюю такую позицию постоянно по GUI_EVENT_PLAYBACK_STOP и использовать её при следующем старте через initial_position_ms. ↩
-
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 с. ↩
-
fw-tv188b-261021-0117-r25--media-player.c065 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 открытый диалог продолжения задерживает запуск VOD: между vod_play и выбором «Продолжить» проходит около 7 минут, после выбора появляется file_playback. ↩
-
doc-sdk-plugins--controls-playback.c043 · doc · any-documented; прошивка — · Для чтения текущей позиции SDK предлагает поле playback_position файла /tmp/run/ext_command.state как временное решение вне официального PHP API. ↩
-
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. ↩
-
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 отсутствует. ↩↩
-
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. ↩
-
doc-sdk-plugins.c090 · doc · any-documented; прошивка — · Auto-resume (выключен по умолчанию, включается
yes) при включении/выходе из standby восстанавливает только live-ТВ, архив ТВ и VOD; позиция в иерархии папок не восстанавливается ↩ -
doc-sdk-plugins.c091 · doc · any-documented; прошивка — · Вместо стандартного auto-resume можно задать своё GUI-действие (
); ему передаются все значения resume_state.properties ↩ -
plg-dc-globaltv.c052 · code · unknown; прошивка — · При автовозобновлении плагин читает из user_input поля resume_tv_group, resume_tv_channel, resume_tv_is_favorite и resume_media_url и отвечает действием tv_play. ↩
-
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. ↩
-
fw-tv188b-261021-0117-r25--shell-ext--entry-handler.c096 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 последний шард истории 000034.json вырос за прогон с 30 до 34 записей — новые записи дописываются в последний шард. ↩
-
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 вхождение). ↩ -
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. ↩
-
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 они есть
-
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. ↩
-
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". ↩
-
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 ↩↩↩
-
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. ↩
-
fw-apk-260724-0207-r24.c035 · code · android-atv; прошивка 260724_0207_r24 · Платформенный слой Java: com.dunehd.platform.APKPlatform наследует GenericPlatform; рядом есть платформо-специфичные классы AmlogicAndroid11MiscPropertiesManager и S928XPlaybackTweaks ↩
-
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 ↩
-
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 ↩
-
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) ↩
-
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. ↩
-
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. ↩ -
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 (торрент-сервер), а не ядро медиаплеера ↩
-
doc-sdk-plugins--operations.c107 · doc · any-documented; прошивка — · PluginVodInfo::buffering_ms (предбуферизация в мс) не реализован ↩
-
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. ↩
-
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' при неверном коде ↩
-
doc-sdk-plugins.c088 · doc · any-documented; прошивка — · Для архива канала нужны PluginTvChannel::have_archive = true, поддержка реального unixtime archive_tm_sec; по умолчанию archive_past_days = 14 дней, archive_delay_sec = 31 минута ↩
-
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
-
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 с после запуска была кнопка «Пропустить вступление».
-
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. ↩
-
fw-tv188b-261021-0117-r25--java-player--native-vod-bridge.c047 · inference · android-dune-fw; прошивка 261021_0117_r25 · Из c014 следует, что запятая, полученная разэкранированием (%2C), не разделяет заголовки, а ";" (сырой или %3B) — разделяет. ↩
-
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.
-
fw-tv188b-261021-0117-r25--java-player--native-vod-bridge.c025 · inference · android-dune-fw; прошивка 261021_0117_r25 · Предполагается, что плагин включает HttpUdtDataSource параметром udt:1 при engine:1 (любое значение, кроме начинающегося с 0). ↩
-
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 раздел не описан ↩
-
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. ↩
-
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. ↩
-
fw-tv188b-261021-0117-r25--java-player.c010 · code, disputed · android-dune-fw; прошивка 261021_0117_r25 · safeParseURL для обычного абсолютного пути выполняет escapeExcludedCharacters и добавляет file://; до этого file:// снимается, а ветвь FS.isExfsUrl передаёт преобразование в exfsPathToExternalURI. ↩
-
doc-sdk-plugins--gui-actions.c087 · doc, disputed · any-documented; прошивка — · При построении плейлиста LaunchMediaUrl заходит в локальные/сетевые папки и плейлисты m3u/pls и добавляет аудио-, видео- и графические файлы и потоки, DVD/Blu-ray-файлы и папки, Flash-приложения (swf://*, .swf) и WWW-ссылки (www://, *.url, *.URL) ↩
-
doc-sdk-plugins--gui-actions.c005 · doc, disputed · any-documented; прошивка — · GUI_EVENT_PLAYBACK_STOP генерируется при остановке воспроизведения, при выключении питания или перед переключением воспроизведения ↩
-
doc-sdk-plugins--gui-actions.c006 · doc, disputed · any-documented; прошивка — · Если на GUI_EVENT_PLAYBACK_STOP назначено действие, плеер сначала приостанавливает воспроизведение, исполняет действие, ждёт завершения цепочки действий и только потом выполняет остановку, выключение или переключение ↩
-
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» и не является исчерпывающим. ↩
-
doc-sdk-plugins--gui-actions.c013 · doc, disputed · any-documented; прошивка — · С прошивки 131029_b9 все ранее перечисленные клавишные события можно использовать в TV-воспроизведении и VOD-воспроизведении плагина ↩
-
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 ↩
-
doc-sdk-plugins--controls-playback.c044 · doc, disputed · any-documented; прошивка — · Подход B для возобновления VOD предлагает PHP-коду читать данные из /config/resume_state.properties и затем задавать initial_position_ms; чтение файла прямо названо временным решением вне официального PHP API. ↩
-
doc-sdk-plugins--controls-playback.c045 · doc, disputed · any-documented; прошивка — · В подходе C SDK указывает, что /config/resume_state.properties создаётся системой даже без auto_resume в манифесте и может читаться и обрабатываться PHP-кодом плагина. ↩
-
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 в плейлист не попали. ↩ -
fw-tv188b-261021-0117-r25--downloads.c007 · code, disputed · tv188b, android-dune-fw; прошивка 261021_0117_r25 · play_magnet запускает один поток непосредственно, а для нескольких файлов пишет open_magnet.m3u и запускает file:// плейлист. ↩
-
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. ↩
-
fw-tv188b-261021-0117-r25--java-player.c012 · code, disputed · android-dune-fw; прошивка 261021_0117_r25 · ExoPlayerImpl.play заменяет userAgent значением после точного регистрозависимого префикса "User-Agent: " в params.httpHeaders; цикл позволяет последней такой строке перезаписать предыдущую. ↩
-
fw-tv188b-261021-0117-r25--java-player.c013 · code, disputed · android-dune-fw; прошивка 261021_0117_r25 · ExoPlayerImpl.setHTTPHeaders пропускает строки с точным префиксом "User-Agent: "; остальные заголовки разбивает по первому ": " с индексом >0 и сохраняет имя/значение в default request properties. ↩
-
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). ↩
-
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. ↩
-
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://») и пустая строка отвергаются ↩
-
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» ↩
-
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) в нём совпадают ↩
-
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 не доказана. ↩
-
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 через эти реализации не доказана. ↩
-
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. ↩
-
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-пути; их приём утилитой требует подтверждения.
-
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. ↩ -
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 файловой отметки. ↩