# Dune HD: неофициальный справочник разработчика плагинов > Неофициальный справочник разработчика PHP-плагинов медиаплееров Dune HD: среда, API, миграция на r25, публикация. Основа — код прошивок tv188b r24/r25 и наблюдения на одном устройстве tv188b; на другие модели не переносится. Проект не связан с Dune HD. Метки уровня в тексте, детали — в сносках и claims.jsonl. Состояние на 2026-11-03. # Быстрый старт: минимальный PHP-плагин на r25 > Редакция 2026-11-02. Разработчик и его LLM-агент получают за один проход плагин, который ставится и открывается > на Android-прошивке Dune HD, и понимают, почему он устроен именно так. Отправная точка — зонды, которые реально > ставились на одно устройство: Pro 8K Plus (tv188b), прошивка `261021_0117_r25` (`device`). Код r24 (`code`) и SDK > (`doc`) — справка; факт только из SDK помечен «по SDK, на r24+ не подтверждено». На другие прошивки и устройства > наблюдения не переносятся. Каждое фактическое предложение ссылается на claim id. > > Рядом: установка, подпись, удаление — «Пакет плагина»; экраны — > «Экраны и папки плагина»; клавиши и диалоги — «Ввод и диалоги»; очередь, > тайм-ауты и `php_server` — «Операции плагина, тайм-ауты и `php_server`»; приёмы плагинов — > «Приёмы разработки плагинов Dune HD»; грабли — «Грабли». ## Коротко: вопрос → ответ | Вопрос | Ответ | Где | |---|---|---| | Проверены ли листинги §2.2 и §2.4 на устройстве? | да, в одном прогоне на tv188b r25 (запрос 11): файлы зонда `kb_probe5`, побайтно равные §2.2 и §2.4 при сверке на компьютере (устройство r25)[^1], поставлены через `adb push` (устройство r25)[^2] и из ZIP (устройство r25)[^3]; в обоих случаях ENTER на пункте дал диалог «KB probe 5» с «OK: props» (устройство r25)[^4] | §2.2, §2.5–§2.7 | | Какие файлы нужны? | `dune_plugin.xml` обязателен по SDK (SDK)[^5]; для PHP-плагина к нему нужна программа, путь к которой задан в манифесте (SDK)[^6]; зонд `kb_probe10` из этих двух файлов на r25 установился и отработал (устройство r25)[^7] | §2.1 | | Почему пункта нет в «Приложениях»? | на r25 точки входа без `icon_url` там не появлялись (устройство r25)[^8] | §2.3 | | Куда класть плагин на r25? | `/data/data/com.dunehd.app/flashdata/plugins/`, а не `/flashdata/plugins`: такого каталога в корне ФС нет (устройство r25)[^9] | §2.5 | | Как плагин подхватывается после `adb push`? | после `am force-stop com.dunehd.app`; перечитывание по IP Control новый каталог не подхватило (устройство r25)[^10] | §2.5 | | Что должна делать программа? | объявить наследника `DunePluginFw` с `call_plugin()` и присвоить экземпляр в `DunePluginFw::$instance` (устройство r25, SDK)[^11] | §2.4 | | Нужна ли `hd_create_plugin()`? | SDK называет её обязательной (SDK)[^12], но зонды `kb_probe5` и `kb_probe10` на r25 работали без неё (устройство r25)[^13] | §2.4, §5 | | Где лог плагина? | `/tmp/run/<плагин>.log`, туда идут `hd_print()` и ошибки PHP (устройство r25)[^14] | §2.9 | | Что значит «Ошибка приложения»? | сбой вызова: Fatal error, `exit()` или `null` из `call_plugin` (устройство r25)[^15]; диалог общей ошибки, без текста PHP, дал и `E_PARSE` при загрузке `main.php` на tv188b r25 (устройство r25)[^16] | §2.10 | | Правка `main.php` применяется сама? | да, после `touch main.php` при следующем вызове (устройство r25)[^17]; правка подключаемого файла — нет (устройство r25)[^18] | §2.11 | ## 1. Как устроен плагин: от манифеста до ответа PHP **Объект:** PHP-плагин с программой `main.php` на tv188b r25 (`device`); сверх этого — код r24 и SDK. Плагин — каталог в `flashdata/plugins` с манифестом, который оболочка читает при старте (устройство r25)[^19] и регистрирует (устройство r25)[^20], а PHP запускает только когда пункт выбрали (устройство r25)[^21]. Поэтому у «плагин не работает» много разных причин, и каждая видна на своём шаге цепочки: 1. При старте приложения оболочка читает `flashdata/plugins` и `firmware_ext/plugins` («Loading plugins from …») (устройство r25)[^19] и регистрирует плагин («Plugin '

' of type '' is registered») (устройство r25)[^20]. Запись появляется в `/tmp/run/installed_plugins.xml` (устройство r25)[^22]. 2. Без `icon_url` пункта в разделе «Приложения» нет (устройство r25)[^8], а у `kb_probe5` после добавления `icon_url` в точки входа в записи появились `launch_capable 1` и `category applications` (устройство r25)[^23]. 3. При регистрации процесса PHP ещё нет: `php_server` запускается при первом вызове плагина (устройство r25)[^21]. 4. `php_server` подключает системные файлы и затем программу плагина, после чего пишет «[server] ready.» (устройство r25)[^24]. К исполнению `main.php` уже определены `DunePluginFw`, `DuneSystem`, `PLUGIN_OP_HANDLE_USER_INPUT` и `hd_print` (устройство r25)[^25]. 5. ENTER на пункте исполняет действие из `actions` точки входа (SDK)[^26]: в зонде это `plugin_handle_user_input` (устройство r25)[^27]. Плагин получает JSON-контекст в `call_plugin($call_ctx_json)` (устройство r25)[^28]. 6. Плагин возвращает JSON со структурой `PluginOutputData` (по коду r24) (код r24, SDK)[^29], а `plugin_show_error` из ответа оболочка исполняет (устройство r25)[^30]. Между вызовами `php_server` живёт: статические переменные класса сохраняются (устройство r25)[^31], но после каждого перезапуска начинаются заново (устройство r25)[^32]. Вызовы одного плагина сериализуются (SDK)[^33]; подробно — «Операции плагина, тайм-ауты и `php_server`». **Другие прошивки.** В коде r24 те же опоры: абстрактный `DunePluginFw` со статическим `$instance` и методом `call_plugin` (код r24)[^34] и загрузка системных файлов из `php_server` (код r24)[^35]. `bootstrap.php`, `dune_config.php` и `dune_plugin.php` одинаковы в проверенных r22 и r24 (tv175u, tv188b) (код r22, r24)[^36]. Прогонов на r24 нет — §6; Sigma и платформенные варианты — «Пакет плагина». ## 2. Задачи ### 2.1. Какие файлы нужны в пакете **Объект:** каталог PHP-плагина на tv188b r25 (`device`). По SDK `dune_plugin.xml` — единственный файл, обязательный для загрузки, а остальные файлы указываются в манифесте и могут называться как угодно (SDK)[^5]. PHP-плагину нужна ещё программа, путь к которой задаёт `params/program` (SDK)[^6]. Пример такого каталога — `probes/kb_probe10/`: зонд из двух файлов, `dune_plugin.xml` и `main.php`, на r25 установился и отработал; его точка входа запущена через `plugin_launcher`, а `handle_user_input` выполнил `kbp10_run` (устройство r25)[^7]. Это не листинг главы; два файла сокращённых манифеста §2.2 и `main.php` §2.4 (устройство r25)[^1] поставлены отдельно (устройство r25)[^37]. | Файл | Зачем | Нужен ли | Claim | |---|---|---|---| | `dune_plugin.xml` | манифест в корне пакета | да | (SDK)[^38] | | `main.php` (имя задаёт `params/program`) | программа PHP-плагина | для `type php` | (устройство r25, SDK)[^39] | | `bin/` | исполняемые файлы, например для `global_actions` | нет | (устройство r25, SDK)[^40] | | `www/`, `www/cgi-bin/` | статика и CGI, см. §2.12 | нет | (устройство r25)[^41] | Каталог называется так же, как `name` в манифесте; иначе плагин не зарегистрируется (устройство r25)[^42]. Полный перечень содержимого пакета — «Пакет плагина». ### 2.2. Написать `dune_plugin.xml` **Объект:** манифест PHP-плагина с одной точкой входа на tv188b r25. > **Упрощение и проверка.** Листинги этого раздела и §2.4 получены из файлов зонда `kb_probe5` удалением лишнего. В запросе 11 > на tv188b r25 (один прогон) файлы зонда `dune_plugin.xml` (751 байт) и `main.php` (1692 байта) побайтно совпали с этими > листингами (устройство r25)[^1]: `cmp` выполнялся на компьютере до установки, хеш копии на плеере не > сверялся. Установка — §2.5 и §2.6, результат на экране — §2.7. Полный манифест, который стоял на r25, — > `probes/kb_probe5/dune_plugin.xml`: в нём 6 точек входа и `global_actions`. Из манифеста зонда оставлены строки 1, 3–26 и 102, 141 — одна точка входа без `global_actions`: ```xml kb_probe5 KB probe 5 php main.php 261026_0000 1 root://applications kbp5_props KB probe 5: props gui_skin://large_icons/apps.aai plugin_handle_user_input kbp5 props ``` Полный манифест той же формы — `probes/kb_probe10/dune_plugin.xml`: одна точка входа и без `global_actions`; лишний для старта блок `operation_timeout` задаёт тайм-аут 600 с (ключи задаются в секундах (устройство r25)[^43]). Значение каждого элемента — §3.1. Имя в манифесте должно совпадать с именем каталога: иначе оболочка пишет `invalid plugin manifest ... name ... is not equal to directory name ...` и плагин не регистрируется (устройство r25)[^44]. Допустимые символы `name` по SDK — алфавитно-цифровые, `-`, `.`, `_`, длина не более 64 (SDK)[^45]. ### 2.3. Сделать пункт видимым: точка входа и `icon_url` **Объект:** `entry_point` с `parent_media_url` `root://applications` на tv188b r25 (`device`). `icon_url` на r25 решает, появится ли пункт. Зонд `kb_probe5` сначала стоял без него: в `installed_plugins.xml` было `launch_capable 0` и не было `category`. После добавления `gui_skin://large_icons/apps.aai` в каждую точку входа и перезапуска приложения стало `launch_capable 1` и `category applications` (устройство r25)[^23]. Без `icon_url` пунктов в разделе «Приложения» не было (устройство r25)[^8]. Запись плагина в `installed_plugins.xml` при этом есть (устройство r25)[^23], поэтому смотреть надо не на её наличие, а на `launch_capable`. Что проверено, а что нет: - значок скина: `gui_skin://` входит в схемы URL картинок по SDK (SDK)[^46], каталог `large_icons` есть в базовом скине r25 (код r25)[^47], а пункт листинга §2.2 с `gui_skin://large_icons/apps.aai` виден с иконкой в «Приложения» → DUNE HD (запрос 11) (устройство r25)[^48]; - иконка из пакета: по SDK её можно взять по `plugin_file://path` (SDK)[^46]. В запросе 11 на tv188b r25 зонд `kb_probe11p` с `icon_url` `plugin_file://icons/kb11.png` зарегистрирован с `launch_capable=1`, `category=applications` и `logo_url=plugin_file://%kb_probe11p%/icons/kb11.png`, а его пункт в «Приложения» → DUNE HD показал синюю квадратную иконку (устройство r25)[^49]; приём — в «Приёмы разработки плагинов Dune HD»; - родитель `setup://applications` без `icon_url`: в запросе 11 на tv188b r25 зонд `kb_probe11i` с единственной такой точкой зарегистрирован с `launch_capable=0`, а при просмотре всех четырёх рядов «Настройки → Приложения» пункта не увидели (устройство r25)[^50]; - другие родители без `icon_url` — в §6. ### 2.4. Написать `main.php`: `DunePluginFw` и `call_plugin` **Объект:** программа PHP-плагина на tv188b r25 (`device`), PHP 5.3.6 (устройство r25)[^51]. По SDK программа делает одно: объявляет наследника `DunePluginFw`, реализует в нём `call_plugin()` и присваивает экземпляр в `DunePluginFw::$instance` (SDK)[^52]. Плагин с такой программой (`kb_probe6`) на r25 загружается и получает операции (устройство r25)[^53]. Подключать системные файлы самому не нужно: они загружены до `main.php` (устройство r25)[^25]. Функция `hd_create_plugin()`, которую SDK называет обязательной для PHP-плагина (SDK)[^12], зондам `kb_probe5` и `kb_probe10` на r25 не понадобилась: они работали без неё, с классом-наследником `DunePluginFw` (устройство r25)[^13]. Обе стороны — в §5. Это `probes/kb_probe5/main.php` без диагностики. Убраны запись в `/tmp/kb_probe5`, `lib/kbp5_lib.php`, счётчик `$n`, дамп свойств и ветки `sleep`, `fatal`, `exit`, `native`, `restart_gui`; строка `msg_lines` склеена из двух. Именно этот вариант поставлен в запросе 11 на tv188b r25, см. §2.2 (устройство r25)[^54]. ```php control_id) ? $user_input->control_id : ''; kbp5_print("handle_user_input control_id=$control_id"); return array( GuiAction::handler_string_id => PLUGIN_SHOW_ERROR_ACTION_ID, GuiAction::caption => null, GuiAction::data => array( PluginShowErrorActionData::fatal => false, PluginShowErrorActionData::title => 'KB probe 5', PluginShowErrorActionData::msg_lines => array('OK: ' . $control_id), ), GuiAction::params => null, ); } class KbProbe5Fw extends DunePluginFw { public function call_plugin($call_ctx_json) { $ctx = json_decode($call_ctx_json); $out = null; if (isset($ctx->op_type_code) && $ctx->op_type_code === PLUGIN_OP_HANDLE_USER_INPUT) $out = kbp5_handle_user_input($ctx->input_data); else kbp5_print('unsupported op ' . (isset($ctx->op_type_code) ? $ctx->op_type_code : '?')); $res = array( PluginOutputData::has_data => !is_null($out), PluginOutputData::plugin_cookies => isset($ctx->plugin_cookies) ? $ctx->plugin_cookies : null, PluginOutputData::is_error => false, PluginOutputData::error_action => null, ); if (!is_null($out)) { $res[PluginOutputData::data_type] = PLUGIN_OUT_DATA_GUI_ACTION; $res[PluginOutputData::data] = $out; } return json_encode($res); } } DunePluginFw::$instance = new KbProbe5Fw(); ?> ``` Почему так: - `call_plugin` всегда возвращает JSON: если вернуть `null`, оболочка считает это сбоем и показывает «Ошибка приложения» (устройство r25)[^55]; - `plugin_cookies` возвращаются в ответе: поле есть и во входном контексте, и в `PluginOutputData` (устройство r25, код r24)[^56]; - тип данных при `handle_user_input` по коду r24 — `PLUGIN_OUT_DATA_GUI_ACTION` (`gui_action`) (код r24)[^57]; - `handler_id` и `control_id` из манифеста приходят в `input_data` (устройство r25)[^58]: здесь `control_id` попадает в текст сообщения, а `handler_id` не проверяется. Зонды `kb_probe7_to` и `kb_probe10` вместо своей ветки зовут `$this->invoke_operation($plugin, $ctx)` и `get_out_type_code()`; что делают эти методы `DunePluginFw` по коду r24 — (код r24)[^59]. Полный файл такого вида (76 строк): `probes/kb_probe7_to/main.php`. ### 2.5. Установить на r25 через `adb push` **Объект:** развёртывание без установщика на tv188b r25 (`device`). Так ставились PHP-зонды `kb_probe5` и `kb_probe6`: каталог копируется в `flashdata/plugins`, ему выставляются владелец и права, затем перезапускается приложение (устройство r25)[^60]. Команды взяты из логов прогона (`files/21-push.txt`, `collect5-README.md`); `$P` из лога раскрыт, а команды на устройстве записаны через `adb shell`: ```sh adb connect :5555 adb root adb push kb_probe5 /data/data/com.dunehd.app/flashdata/plugins/ adb shell 'chown -R system:system /data/data/com.dunehd.app/flashdata/plugins/kb_probe5; chmod -R +x /data/data/com.dunehd.app/flashdata/plugins/kb_probe5/bin /data/data/com.dunehd.app/flashdata/plugins/kb_probe5/www/cgi-bin 2>/dev/null' adb shell am force-stop com.dunehd.app ``` Почему именно так: - `/flashdata` в корне ФС нет, хотя оболочка в логах называет каталог `/flashdata/plugins` (устройство r25)[^61]; PHP этот путь видит (устройство r25)[^62], а `adb push` — нет; - развёртывание шло под `adb root`, с `chown` и `chmod` (устройство r25)[^20]; `chcon` не понадобился, метка совпала с соседним плагином (устройство r25)[^63]; - перечитывание по IP Control новый каталог не подхватило, а `am force-stop` — подхватил (устройство r25)[^10]; приложение поднимается само за 1–2 с (устройство r25)[^64] и заново регистрирует плагины (устройство r25)[^65]; - `chmod` относится только к `bin` и `www/cgi-bin` (устройство r25)[^20]; вывод ошибок отброшен, как в логе прогона, потому что этих каталогов в минимальном плагине нет; - `global_actions` `install` при таком развёртывании не выполняется (устройство r25)[^66], `update` при смене `version_index` на месте — тоже (устройство r25)[^67]; `boot` придёт при ближайшем старте приложения (устройство r25)[^68]. Проверка регистрации — две команды. Первая из `22-reload.txt`, вторая читает файл, который сверяет §2.3: ```sh adb shell "grep -a -n -E 'kb_probe5|is not equal to directory' /tmp/run/shell.log | tail -40" adb shell cat /tmp/run/installed_plugins.xml ``` Ожидаемо в `shell.log` — `Plugin 'kb_probe5' of type 'php' is registered` (устройство r25)[^20]. Запись в `installed_plugins.xml` после прогона с `icon_url` (устройство r25)[^69]: ```xml kb_probe5 KB probe 5 /data/data/com.dunehd.app/flashdata/plugins/kb_probe5 1 261026_0000 1 applications ``` Листинги §2.2 и §2.4 проверены на этом способе в запросе 11 на tv188b r25 (один прогон): после `adb push`, `chown system:system` и перезапуска приложения сокращённый `kb_probe5` зарегистрирован как `php` с `launch_capable=1` и `category=applications` (устройство r25)[^2]. Установку без `adb root` и `chown` этот прогон не проверял (§6). Подробности и расхождения с SDK — «Пакет плагина». Удаление такого плагина: `rm -rf` каталога и снова `am force-stop`; в одном прогоне плагин исчез из списка только после него (устройство r25)[^70], в другом после перечитывания по IP Control записи уже не было (устройство r25)[^71] — см. §5. ### 2.6. Установить на r25 из ZIP **Объект:** штатный установщик на tv188b r25 (`device`) и упаковка архива. По SDK плагин ставится запуском файла `dune_plugin*.zip` (SDK)[^72], а `dune_plugin.xml` лежит в корне архива (SDK)[^73]. На r25 так установлен `dune_plugin_kb_probe5_plat.zip` из `/sdcard/DuneHD`: в файловом браузере плеера, в каталог `flashdata/plugins/kb_probe5_plat` (устройство r25)[^74]. Перезапуск приложения при этом не нужен: оболочка пишет «[plugin_installer] reloading plugin» и регистрирует плагин в том же процессе (устройство r25)[^75]. Файл в `bin/` стал исполняемым, а файлы в корне — нет (устройство r25)[^76]. Этот зонд — типа `plain`, без PHP (устройство r25)[^75]. PHP-плагин из ZIP проверен в запросе 11 на tv188b r25 (один прогон). `dune_plugin_kb_probe5.zip` с двумя файлами листинга §2.2 и §2.4 зарегистрировал `kb_probe5` как `php` без смены pid приложения (устройство r25)[^3]; пункт «KB probe 5: props» доступен в «Приложения» без перезапуска, ENTER даёт диалог «KB probe 5 / OK: props» (устройство r25)[^77]. В листинге нет `global_actions`, поэтому `install` этот зонд не показал (устройство r25)[^3]. Остальное показал зонд `kb_probe11z` того же прогона. В его архиве не было `dune_plugin.sign` и `dune_plugin_signer_id.txt`, а штатный установщик принял архив и зарегистрировал плагин как `php` (устройство r25)[^78]. Это один прогон на данном устройстве: он не определяет `external_plugins_enabled` и не доказывает отключение проверки подписей (устройство r25)[^78]; что известно о подписи — «Пакет плагина» и §6. После установки оболочка выполнила global action `install` как `sh bin/ga.sh install`, а маркер `ga_install.txt` записал `event=install` и `uid=1000(system)` (устройство r25)[^79]; при `adb push` с перезапуском приложения он не выполняется (устройство r25)[^66]. Файлы `bin/ga.sh` и `www/cgi-bin/ping.sh` из ZIP с mode 644 в каталоге плагина получили 755 (устройство r25)[^80]. ENTER пультом на «KB11 zip» в «Приложения» → DUNE HD вызвал `handle_user_input` с `control_id=enter` и диалог «KB probe 11z / OK: zip» (устройство r25)[^81]. Архив из корня каталога плагина собирает строка из скрипта `probe/dialog_scroll_probe_build.sh`; метаданные macOS исключены: ```sh (cd "$src" && zip -q -X -r "$out" . -x '.DS_Store' '._*') ``` Остальное об установщике — «Пакет плагина». ### 2.7. Первый экран: сообщение `plugin_show_error` **Объект:** ответ `handle_user_input` с действием `plugin_show_error` на tv188b r25 (`device`). Минимальный видимый результат — сообщение: экрана-папки для него не нужно. Откройте «Приложения», выберите пункт и нажмите ENTER: оболочка вызовет `handle_user_input`, а в ответ исполнит `plugin_show_error` (устройство r25)[^82]. По SDK в меню это диалог с заголовком и строками (SDK)[^83], а данные действия — `fatal`, `title`, `msg_lines` (SDK)[^84]. Зонд передаёт `fatal => false`: при `fatal == true` действие выводит в верхнее меню (SDK)[^85]. На экране это видно так (запрос 11, tv188b r25, один прогон): пункт «KB probe 5: props» виден в «Приложения» → DUNE HD, и ENTER открывает диалог с заголовком «KB probe 5» и строкой «OK: props» (устройство r25)[^48]. Тот же диалог получен и после установки листинга из ZIP (устройство r25)[^77]. Что должно появиться в логах при первом нажатии. В `shell.log` — старт и результат вызова, в скобках `handler_id.control_id` (устройство r25)[^82]: ```text plugin D: kb_probe5->handle_user_input(kbp5.props): start (timeout=60.0s) plugin D: kb_probe5->handle_user_input(kbp5.props) result action: kb_probe5->plugin_show_error(.) ``` В `/tmp/run/kb_probe5.log` — запуск `php_server` (устройство r25)[^24] и строка из `hd_print` (устройство r25)[^86]: ```text [17362] [t17362] [2026-10-26 10:37:59.843274] [kb_probe5] [server] ready. [17362] [t17362] [2026-10-26 10:37:59.843283] [kb_probe5] [server] main loop started. [17362] [t17362] [2026-10-26 10:38:00.049121] kbp5: handle_user_input control_id=props ``` Контекст этого вызова (`files/40-php-props.txt`, строка 126) — в §3.2. Подробнее об ошибках и сообщениях — «Ввод и диалоги». ### 2.8. Первый экран-папка: `plugin_open_folder` и `get_folder_view` **Объект:** control-папка стороннего плагина; пробник `dialog_scroll_probe` 0.1.0 на Pro 8K Plus r25, операции папок — по SDK и `dune_api.php` r24. Настоящий экран — это папка: на `PLUGIN_OPEN_FOLDER` оболочка вызывает `get_folder_view()` плагина (SDK)[^87] и показывает результат как содержимое папки (SDK)[^88]. Пробник `dialog_scroll_probe` стоял на r25: окна `show_dialog`, которые строит его программа, наблюдались на устройстве и проверены настоящим пультом (устройство r25)[^89]. Это второй образец: его можно брать целиком, два файла лежат в `probe/dialog_scroll_probe/`. Что сама папка на r25 открылась, отдельным claim пока не оформлено — см. §6. Манифест пробника целиком — точка входа в `setup://applications`, ENTER открывает папку (SDK)[^88]. Про `ip_address_required` см. «Приёмы разработки плагинов Dune HD»: ```xml dialog_scroll_probe Dialog Scroll Probe php main.php setup://applications setup Dialog Scroll Probe gui_skin://large_icons/info.aai no no plugin_open_folder setup Dialog Scroll Probe 0.1.0 1 ``` Разбор операций в `call_plugin` — строки 42–72 `main.php`. В отличие от §2.4 здесь две операции и две разные метки типа: ```php public function call_plugin($call_ctx_json) { $ctx = json_decode($call_ctx_json); $op = is_object($ctx) && isset($ctx->op_type_code) ? $ctx->op_type_code : null; $in = is_object($ctx) && isset($ctx->input_data) ? $ctx->input_data : null; $out = array( PluginOutputData::has_data => false, PluginOutputData::plugin_cookies => is_object($ctx) && isset($ctx->plugin_cookies) ? $ctx->plugin_cookies : null, PluginOutputData::is_error => false, PluginOutputData::error_action => null); $data = null; $type = null; if ($op === PLUGIN_OP_GET_FOLDER_VIEW) { $data = self::folder_view(); $type = PLUGIN_OUT_DATA_PLUGIN_FOLDER_VIEW; } else if ($op === PLUGIN_OP_HANDLE_USER_INPUT) { $data = self::user_input($in); $type = PLUGIN_OUT_DATA_GUI_ACTION; } if (!is_null($data)) { $out[PluginOutputData::has_data] = true; $out[PluginOutputData::data_type] = $type; $out[PluginOutputData::data] = $data; } return json_encode($out); } ``` Сама папка — строки 100–120: список кнопок в `PLUGIN_FOLDER_VIEW_CONTROLS`: ```php private static function button($name, $caption, $width, $action, $params = null) { return array(GuiControlDef::name => $name, GuiControlDef::title => null, GuiControlDef::kind => GUI_CONTROL_BUTTON, GuiControlDef::specific_def => array(GuiButtonDef::caption => $caption, GuiButtonDef::width => $width, GuiButtonDef::push_action => $action), GuiControlDef::params => $params); } private static function folder_view() { $defs = array(); foreach (self::$rows as $id => $caption) $defs[] = self::button($id, $caption, 1200, self::input($id)); return array( PluginFolderView::view_kind => PLUGIN_FOLDER_VIEW_CONTROLS, PluginFolderView::multiple_views_supported => false, PluginFolderView::data => array( PluginControlsFolderView::defs => $defs, PluginControlsFolderView::initial_sel_ndx => -1)); } ``` Кнопка несёт `push_action`, а строка действия собирается в `input()`, строки 74–82; `initial_sel_ndx => -1` — контрол по умолчанию (SDK)[^90]. Тип данных `folder view` по коду r24 — `plugin_folder_view` (код r24)[^57]; поля папки по SDK — `defs`, `initial_sel_ndx`, `params` (SDK)[^91]. Дальше: control-папка — «Экраны и папки плагина», обычный каталог — там же §2.1, контролы — «Контролы диалогов и папок». Регулярная папка зонда в запросе 11 на tv188b r25 не открылась: оболочка вызвала `get_folder_view("kbp11_reg")`, а вместо папки появился диалог «Ошибка приложения» (устройство r25)[^92]; о причине — §6. ### 2.9. Смотреть логи: `/tmp/run/<плагин>.log` и `shell.log` **Объект:** логи плагина и оболочки на tv188b r25 (`device`). Логи — главный инструмент разработки; смотреть их надо в двух местах: один про PHP, другой про оболочку. | Лог | Что в нём | Команда | Claim | |---|---|---|---| | `/tmp/run/<плагин>.log` | запуск `php_server`, строки `hd_print()`, ошибки и предупреждения PHP | `adb shell tail -60 /tmp/run/kb_probe5.log` | (устройство r25)[^93] | | `/tmp/run/shell.log` | регистрация, отказ манифеста, старт и результат операций, сбой вызова | `adb shell "grep -a -E 'kb_probe5' /tmp/run/shell.log \| tail -40"` | (устройство r25)[^94] | | `/tmp/run/installed_plugins.xml` | что зарегистрировано, `launch_capable`, `category` | `adb shell cat /tmp/run/installed_plugins.xml` | (устройство r25)[^69] | Что учитывать при чтении: - время в обоих логах на 3 часа меньше местного (устройство r25)[^95]; - реальный путь лога плагина — `/data/data/com.dunehd.app/tmp/run/<плагин>.log`, предел 3072000 байт (устройство r25)[^96]; - `@` не спасает от записи: предупреждение от `@mkdir(...)` попало в лог при каждом запуске `php_server` (устройство r25)[^97]; - SDK советует `busybox tail -F` через telnet или ADB (SDK)[^98]; по SDK, на r24+ не подтверждено; - флаг `/config/hd_debug/PHP_CLIENT.txt` со значением 1 на работающем приложении новых строк не дал (устройство r25)[^99]; прочие флаги — «Операции плагина, тайм-ауты и `php_server`». Приёмы логирования в плагинах — «Приёмы разработки плагинов Dune HD». ### 2.10. Почему плагин не появился или не открывается **Объект:** диагностика на tv188b r25 (`device`); строки r24 отмечены. Идите по цепочке §1 сверху вниз: сначала `shell.log` и `installed_plugins.xml`, затем лог плагина. | Симптом | Что видно | Причина | Что сделать | Claim | |---|---|---|---|---| | Плагина нет в списке после `adb push` | нет строки `is registered`, нет в `installed_plugins.xml` | приложение не перезапущено; перечитывание по IP Control новый каталог не подхватывает | `adb shell am force-stop com.dunehd.app` | (устройство r25)[^10] | | То же | `invalid plugin manifest … name '' is not equal to directory name '<каталог>'` | `name` не равен имени каталога; плагин не регистрируется ни под одним именем | привести к одному имени | (устройство r25)[^44] | | То же, манифест иной | r24, строки: `name is missing`, `caption is invalid or missing`, `type is missing`, `type '%s' is not supported` | ошибка в обязательном элементе (строки — из кода r24) | сверить с §3.1 | (код r24)[^100] | | Плагин зарегистрирован, пункта в «Приложениях» нет | `launch_capable 0`, нет `category` | у точек входа нет `icon_url` | добавить `icon_url`, затем `am force-stop` | (устройство r25)[^101] | | Плагин `plain` не виден в меню | `launch_capable 0` | так у зонда-поставщика (`launch_capable 0`) | см. §2.12 | (устройство r25)[^102] | | ENTER: «Ошибка приложения / Произошла ошибка. Приложение будет закрыто.» | лог плагина: `php-call failed.` и `[E_ERROR] …`; `shell.log`: `treating empty result as failure` | Fatal error или `exit()` в вызове | исправить по строке `[файл:строка]`; следующий вызов поднимет новый `php_server` | (устройство r25)[^103] | | То же, а `php-call failed` нет | `shell.log`: `treating empty result as failure`, `PHP_CALL_FAILED` | `call_plugin` вернул `null` | всегда возвращать JSON | (устройство r25)[^55] | | Диалог общей ошибки приложения, без текста PHP (запрос 11, намеренно сломанный `kb_probe11s`) | лог плагина: `[…/main.php:4] [E_PARSE] syntax error, unexpected ';'`; `shell.log`: `PHP_CALL_FAILED` и `plugin_show_error` | синтаксическая ошибка в `main.php`: его загрузка завершилась `E_PARSE` | исправить строку из `[файл:строка]` | (устройство r25)[^16] | | Через минуту: «Превышено время операции» | `cancelling by timeout`, `killing PHP-server process` | вызов не уложился в тайм-аут: у `handle_user_input` без `operation_timeout` он 60 с | ускорить вызов или задать `operation_timeout` | (устройство r25)[^104] | | Правка кода не действует | тот же pid, старое поведение | изменён подключаемый файл, а `php_server` перезапускается по `main.php` | `touch main.php` | (устройство r25)[^105] | | `php-cgi` не запускается из `adb shell` | `CANNOT LINK…` | так он на r25 и не стартует; из CGI-обёртки плагина работает | проверять через HTTP-запрос к CGI | (устройство r25)[^106] | Прочие грабли — «Грабли». ### 2.11. Правка и перезапуск: что применяется само **Объект:** цикл разработки на tv188b r25 (`device`). | Что изменили | Как применить | Что произойдёт | Claim | |---|---|---|---| | `main.php` | `touch main.php`, затем вызов плагина | следующий вызов сначала перезапустит `php_server` («PHP-script modification detected») | (устройство r25)[^17] | | подключаемый файл `lib/*.php` | изменить файл, затем `touch main.php` | без `touch` вызов исполнит тот же процесс со старым кодом | (устройство r25)[^105] | | `dune_plugin.xml` | `adb push` и `am force-stop com.dunehd.app` | приложение заново зарегистрирует плагины | (устройство r25)[^107] | После перезапуска `php_server` (по `touch`, после Fatal error, после `exit(0)`) статические переменные начинаются заново (устройство r25)[^32], а SDK предупреждает, что на глобальные переменные полагаться нельзя (SDK)[^108]. Для постоянных данных в SDK есть `data_dir_path`, но на устройствах без System Storage и Flash Memory Storage ключ не задан (SDK)[^109]; его значение на r25 — §3.4. ### 2.12. Веб-часть и плагин без PHP **Объект:** `www/`, `www/cgi-bin/` и `type plain` на tv188b r25 (`device`). Веб-часть для старта не нужна, но её легко добавить: `www/index.txt` отдаётся по `http:///plugins/

/index.txt` (устройство r25)[^110], а скрипт `www/cgi-bin/env.sh` — исполняется по `http:///cgi-bin/plugins/

/env.sh` (устройство r25)[^111]. Оба отвечают и из локальной сети (устройство r25)[^112]. В коде r24 скрипт CGI запускается как shell-скрипт (код r24)[^113], а на r25 работает под root (устройство r25)[^114]; в примере ниже заголовки печатает сам скрипт. Начало `probes/kb_probe5/www/cgi-bin/env.sh`: ```sh #!/bin/sh echo "Content-Type: text/plain" echo "" ``` Подробно — «Пакет плагина». Плагин без PHP — `plain` без `params/program`: зонд-поставщик `kb_probe5_sup` (`probes/kb_probe5_sup/`) с такими манифестом и каталогом `bin/` регистрируется с `launch_capable 0` (устройство r25)[^102]. Что он делает — «Поставщик каталога «Фильмы»». В `libduneshell.so` r24 есть сообщение «operation '%s' is not supported for plain plugin type» (код r24)[^115]. ## 3. Справочник ### 3.1. Элементы манифеста минимального плагина Полный разбор манифеста — в «Приёмы разработки плагинов Dune HD». | Элемент | Значение в листинге | Назначение | Где работает | Claim | |---|---|---|---|---| | `name` | `kb_probe5` | идентификатор; `[A-Za-z0-9._-]`, до 64 символов; равен имени каталога | формат — SDK; равенство — r25 | (устройство r25, SDK)[^116] | | `caption` | `KB probe 5` | подпись плагина в настройках | SDK; на r25 попадает в запись `installed_plugins.xml` | (устройство r25, SDK)[^117] | | `type` | `php` | тип; на r25 регистрируются `php`, `plain`, `internal.internal` | r25 | (устройство r25)[^118] | | `params/program` | `main.php` | путь к главному PHP-файлу | SDK; на r25 загружается из каталога плагина | (устройство r25, SDK)[^119] | | `version`, `version_index` | `261026_0000`, `1` | подпись версии для интерфейса и растущее число версии; описаны в разделе об онлайн-обновлении | SDK; на r25 попадают в запись `installed_plugins.xml` | (устройство r25, SDK)[^120] | | `entry_point/parent_media_url` | `root://applications` | раздел меню; по SDK — `root://tv`, `root://applications`, `setup://applications` | в зонде r25 — `root://applications` | (устройство r25, SDK)[^121] | | `entry_point/media_url` | `kbp5_props` | идентификатор узла, уникален в плагине | SDK; уникальность на r25 не проверялась | (SDK)[^122] | | `entry_point/caption` | `KB probe 5: props` | подпись точки входа по SDK; пункт с этой подписью показан в меню | SDK; показ в меню — tv188b r25, запрос 11 | (устройство r25, SDK)[^123] | | `entry_point/icon_url` | `gui_skin://large_icons/apps.aai` | значок; на tv188b r25 иконку показали также `plugin_file://icons/kb11.png`; без `icon_url` пункт не появлялся в `root://applications`, а в `setup://applications` его не увидели (§2.3) | r25 | (устройство r25)[^124] | | `entry_point/actions/key_enter` | `plugin_handle_user_input` + `params` | действие на ENTER; `params` приходят в `input_data` | r25 | (устройство r25, SDK)[^125] | Поля `entry_point` SDK перечисляет как возможные и ни одно не называет обязательным (SDK)[^126] (по SDK, на r24+ не подтверждено); подробности о `icon_url` на r25 — §5. Обязательны ли `version` и `version_index` вне онлайн-обновления — см. §6. Необязательный `operation_timeout` в манифесте задаётся в секундах (устройство r25)[^43], подробно — «Операции плагина, тайм-ауты и `php_server`». Что делают ENTER и PLAY у других плагинов — «Приёмы разработки плагинов Dune HD». ### 3.2. Контекст вызова и ответ `call_plugin` Вход на r25 — JSON, на верхнем уровне только `op_type_code`, `op_id`, `opexec_id`, `internet_status`, `input_data` и `plugin_cookies`; путей плагина в нём нет (устройство r25)[^28]. Строка из лога вызова зонда: ```json {"op_type_code":"handle_user_input","op_id":"4","opexec_id":"4","internet_status":"1","input_data":{"handler_id":"kbp5","control_id":"props","play_mode":"none","topmenu_root_id":"section:applications","selected_media_url":"kbp5_props","orig_selected_media_url":"kbp5_props"},"plugin_cookies":{}} ``` Поля ответа ниже — по коду r24 (`dune_api.php`), кроме отмеченных «по SDK». | Ключ ответа | Значение | Claim | |---|---|---| | `PluginOutputData::has_data` | есть ли данные | (код r24)[^127] | | `PluginOutputData::data_type` | тип данных: `gui_action`, `plugin_folder_view` и другие, по операции | (код r24)[^57] | | `PluginOutputData::data` | сами данные | (код r24)[^127] | | `PluginOutputData::plugin_cookies` | cookies плагина | (код r24)[^127] | | `PluginOutputData::is_error`, `error_action` | ошибка и действие для неё, по SDK | (SDK)[^128] | Сами GUI-действия — массивы с `handler_string_id` и `data` (SDK)[^129]; строковые id в `dune_api.php` r24 — (код r24)[^130]. ### 3.3. Что загружено до `main.php` и какой это PHP | Что | Значение на r25 | Claim | |---|---|---| | Порядок загрузки | `bootstrap.php`, `dune_api.php`, `dune_plugin.php`, `dune_plugin_fw.php`, свойства, `dune_config.php`, программа плагина | (устройство r25)[^24] | | Определено к `main.php` | `DunePluginFw`, `DuneSystem`, `PLUGIN_OP_HANDLE_USER_INPUT`, `hd_print` | (устройство r25)[^25] | | Версия и SAPI в `php_server` | PHP 5.3.6, `php_sapi_name()` = `hd` | (устройство r25)[^131] | | Версия и SAPI в CGI | PHP 5.3.6, `cgi-fcgi` | (устройство r25)[^132] | | uid | `php_server` — 1000, CGI — 0 | (устройство r25)[^133] | | `include_path` | `.:<каталог плагина>:/data/data/com.dunehd.app/firmware_ext/php/include` | (устройство r25)[^134] | | Свойства | `DuneSystem::$properties`, 8 ключей, в том числе пути §3.4 | (устройство r25)[^135] | ### 3.4. Пути плагина на r25 | Свойство или путь | Значение у `kb_probe5` | Claim | |---|---|---| | `install_dir_path` | `/data/data/com.dunehd.app/flashdata/plugins/kb_probe5` | (устройство r25)[^136] | | `tmp_dir_path` | `/data/data/com.dunehd.app/tmp/plugins/kb_probe5` | (устройство r25)[^137] | | `data_dir_path` | `/data/data/com.dunehd.app/flashdata/plugins_data/kb_probe5` | (устройство r25)[^138] | | `plugin_www_url` | `http://127.0.0.1:80/plugins/kb_probe5/` | (устройство r25)[^139] | | `plugin_cgi_url` | `http://127.0.0.1:80/cgi-bin/plugins/kb_probe5/` | (устройство r25)[^139] | Прочие пути на устройстве — «Пакет плагина». ## 4. Как это делают плагины Зонд пишет `call_plugin` вручную ради наглядности, а плагины обычно подключают каркас. У 8 встроенных плагинов r24 есть свой `default_dune_plugin_fw.php` с классом `DefaultDunePluginFw` (код r24)[^140]. В копии `android_apps` (и идентичной `bt_setup`) его `call_plugin` оборачивает `call_plugin_impl` в `json_decode` и `json_encode` (код r24)[^141], а в файле встроенного плагина экземпляр регистрируется в конце (код r24)[^142]. В Twitch TV файл-программа называет класс через `DefaultDunePluginFw::$plugin_class_name` (код)[^143], а экран открывает `plugin_open_folder` (код)[^144]; Screenshoter вместо этого ставит на ENTER свой обработчик `plugin_handle_user_input` (код)[^145]. Эта схема и её грабли — «Приёмы разработки плагинов Dune HD». ## 5. Расхождения - **`hd_create_plugin()`.** SDK в одном месте требует от PHP-плагина программу с этой функцией (SDK)[^12], а в другом описывает программу через наследника `DunePluginFw`, `call_plugin()` и `DunePluginFw::$instance` (SDK)[^52]. На tv188b r25 зонды `kb_probe5` и `kb_probe10` работали без `hd_create_plugin()`: их `main.php` объявляет наследника `DunePluginFw`, и `handle_user_input` выполнялся (устройство r25)[^13]; зонд `kb_probe6` с такой программой загружается и получает от оболочки операции `handle_user_input` и `get_vod_stream_url` (устройство r25)[^53]. Стороны (SDK)[^12] и (устройство r25)[^13] связаны `conflicts_with`. - **`icon_url`.** SDK описывает `icon_url` среди параметров отображения (`disputed`, claim — в §6). Поля `entry_point` он перечисляет как возможные, ни одно не называя обязательным — по SDK, на r24+ не подтверждено (SDK)[^126]. На r25 без него `launch_capable 0` и пункт не появлялся (устройство r25)[^101]; в запросе 11 то же наблюдалось у единственной точки `setup://applications`: `launch_capable=0`, пункта не увидели (устройство r25)[^50]. Связи `conflicts_with` у этих claims нет. - **Путь `adb push`.** SDK приводит `adb push` в `/flashdata/plugins/` (SDK)[^146]; на r25 такого каталога в корне ФС нет, а рабочий путь — `/data/data/com.dunehd.app/flashdata/plugins/` (устройство r25)[^147]. - **Перечитывание плагинов.** SDK предлагает `cmd=main_screen` и `cmd=ir_code&ir_code=B24DBF00` (`disputed`, claim — в §6); на r25 новый каталог они не подхватили (устройство r25)[^10]. Удаление плагина после такого перечитывания в разных прогонах дало разный результат, стороны связаны `conflicts_with` (устройство r25)[^148]. - **Поля control-папки.** SDK перечисляет у `PluginControlsFolderView` поля `defs`, `initial_sel_ndx` и `params` (SDK)[^91], а в `dune_api.php` r24 у класса есть ещё `actions` и `timer` (код r24)[^149]. Стороны связаны `conflicts_with`. - **Тайм-аут операции.** SDK — 10 с по умолчанию (SDK)[^150], r25 — 60 с у `handle_user_input` без `operation_timeout` (устройство r25)[^151]. По тайм-ауту r25 останавливает `php_server` и тем прерывает вызов (устройство r25)[^152], а inference из кода r24 предполагал, что вызов не прерывается и его результат отбрасывается (`inference`, claim — в §6); подробно — «Операции плагина, тайм-ауты и `php_server`». - **Типы плагина.** Раздел манифеста SDK называет только `php` (SDK)[^6], другой раздел добавляет `plain` (SDK)[^153], а на r25 регистрируются `php`, `plain` и `internal.internal` (устройство r25)[^118]. ## 6. Не проверено **Листинги и шаги этой главы.** В базе нет данных о следующем. | Что | Что известно | Что наблюдать | |---|---|---| | Открытие control-папки `dialog_scroll_probe` | снимок есть: `files/shots/screen.png`, отдельного claim нет | оформить claim | | Регулярная папка стороннего плагина на r25 | в запросе 11 (tv188b r25, один прогон) папка зонда не открылась: после запуска `KB11 reg` оболочка вызвала `get_folder_view("kbp11_reg")`, вместо папки — диалог «Ошибка приложения», ENTER на элементах не нажимали (устройство r25)[^92]. В отличие от ответа `AbstractRegularScreen` зонд не задаёт `archive` и `folder_type` (код r25)[^154], а `SetupFoldersScreen` дополнительно задаёт геометрию подписи, `not_loaded_view_item_params` и `async_icon_loading=false` (код r25)[^155]. Причина не установлена, дефект прошивки этим прогоном не установлен (гипотеза — ниже) | повторить с полной формой, снять сырой JSON и `shell.log` | | Проверка подписи при установке ZIP на r25 | неподписанные `kb_probe5_plat` (устройство r25)[^156] и `kb_probe11z` (устройство r25)[^78] приняты; механизм и политика этим не установлены (гипотеза — ниже) | ZIP с неверной `dune_plugin.sign`: отказ или установка | | `adb` | не описано, как включить его в меню, и не проверено без `adb root`, `chown`, `chmod` | шаги на чистом устройстве | | Точка входа без `icon_url` у других родителей, например `root://tv` | наблюдались `root://applications` (устройство r25)[^8] и `setup://applications` (устройство r25)[^50]; `root://tv` из перечня SDK (§3.1) без него не пробовали | снять `icon_url` у точки входа в `root://tv` | | Другие сбои в коде верхнего уровня `main.php` и повторная загрузка после исправления | в запросе 11 наблюдалась `E_PARSE` намеренно сломанного `kb_probe11s` (§2.10) (устройство r25)[^16] | Fatal error вне функций; исправить файл и вызвать снова | | Где на экране виден `caption` плагина на r25 | в меню пункт показан с подписью точки входа «KB probe 5: props» (устройство r25)[^48]; подпись плагина в настройках — описание SDK (§3.1) | где появляется `caption` плагина | | Манифест без `version`, `version_index` или `entry_point/caption` | в листингах эти элементы есть; вне онлайн-обновления требований к первым двум в claims нет | снять элемент: регистрация и пункт в меню | | Эта цепочка на r24 и других устройствах | зонды на r24 не ставились | повторить на r24 | **Гипотезы и ослабленные утверждения.** | Утверждение | Статус | Claim | |---|---|---| | Ошибка открытия `KB11 reg` могла быть связана с неполной формой ответа зонда; дефект прошивки прогоном не установлен | inference | (вывод r25)[^157] | | Отсутствие подписи не помешало установке `kb_probe5_plat`; это не доказывает, что подпись не проверяется у других плагинов, и не задаёт политику кастомных прошивок | inference | (вывод r25)[^158] | | SDK: параметры отображения точки входа, среди них `icon_url` | doc, disputed | (SDK)[^159] | | SDK: перечитать плагины по IP Control или ANGLE | doc, disputed | (SDK)[^160] | | Тайм-аут r24 не прерывает PHP-вызов: результат приходит позже и отбрасывается | inference, disputed | (вывод r24)[^161] | | `gui_skin://` разрешается относительно каталога текущего скина | inference | (вывод r25)[^162] | | Оболочка вызывает плагин через `DunePluginFw::$instance->call_plugin` | inference | (вывод r24)[^163] | | `php_server` исполняет вызов выражением `$out = …($in)` | inference | (вывод r24)[^164] | | Неизвестные элементы манифеста игнорируются с сообщением | inference | (вывод r24)[^165] | | r24 поддерживает типы `php` и `plain`, у `plain` операции отклоняются | inference | (вывод r24)[^166] | | Правка `main.php` подхватывается по времени изменения (на r25 наблюдалось, §2.11) | inference, disputed | (вывод r24)[^167] | [^1]: fw-tv188b-261021-0117-r25--plugin-loader.c041 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 на tv188b r25 проверка cmp подтвердила побайтовое совпадение dune_plugin.xml (751 байт) и main.php (1692 байт) зонда kb_probe5 с листингами quick-start §2.2 и §2.4. [^2]: fw-tv188b-261021-0117-r25--plugin-loader.c042 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 на tv188b r25 сокращённый kb_probe5 после adb push, chown system:system и перезапуска приложения зарегистрирован как php с launch_capable=1 и category=applications. [^3]: fw-tv188b-261021-0117-r25--plugin-loader.c044 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 на tv188b r25 установка dune_plugin_kb_probe5.zip с двумя файлами листинга зарегистрировала kb_probe5 как php без смены pid приложения 12389. [^4]: - fw-tv188b-261021-0117-r25--plugin-loader.c043 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 на tv188b r25 после adb push листинга kb_probe5 пункт «KB probe 5: props» виден с иконкой в «Приложения» → DUNE HD; ENTER открывает диалог «KB probe 5» с «OK: props». - fw-tv188b-261021-0117-r25--plugin-loader.c045 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 на tv188b r25 после установки ZIP листинга kb_probe5 пункт «KB probe 5: props» доступен в «Приложения» без перезапуска приложения; ENTER даёт диалог «KB probe 5 / OK: props». [^5]: doc-sdk-plugins.c025 · doc · any-documented; прошивка — · dune_plugin.xml — единственный файл, обязательный для загрузки плагина; остальные файлы указываются в манифесте и могут называться как угодно [^6]: doc-sdk-plugins.c030 · doc · any-documented; прошивка — · Раздел манифеста утверждает, что из типов движка (dune_plugin->type) поддерживается только 'php' с единственным обязательным параметром 'program' — путём к главному PHP-файлу [^7]: fw-tv188b-261021-0117-r25.c371 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 зонд kb_probe10, установленный из двух файлов (dune_plugin.xml и main.php), установился и отработал: точка входа kbp10_run запущена через plugin_launcher, handle_user_input выполнил kbp10_run, в /tmp/kb_probe10 появились started.txt и wget.txt. [^8]: fw-tv188b-261021-0117-r25.c213 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 точки входа плагина kb_probe5 (root://applications), заданные без icon_url, в разделе «Приложения» не появлялись. [^9]: - fw-tv188b-261021-0117-r25.c206 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 плагин разворачивается без установщика: каталог копируется adb push (под adb root) в /data/data/com.dunehd.app/flashdata/plugins/, затем chown -R system:system и chmod -R +x для bin и www/cgi-bin; после перезапуска приложения (am force-stop com.dunehd.app) оболочка регистрирует такой плагин («Plugin '

' of type '' is registered»). - fw-tv188b-261021-0117-r25.c207 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в корне ФС каталога /flashdata нет, а оболочка в shell.log называет каталог плагинов /flashdata/plugins («Loading plugins from '/flashdata/plugins'», «invalid plugin manifest from '/flashdata/plugins/kb_probe5_badname/dune_plugin.xml'», «copying recursively '/tmp/plugin_tmp' to '/flashdata/plugins/kb_probe5_plat'»); файлы этих плагинов лежат в /data/data/com.dunehd.app/flashdata/plugins. [^10]: fw-tv188b-261021-0117-r25.c203 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 каталоги плагинов, положенные adb push в /data/data/com.dunehd.app/flashdata/plugins, не подхватились перечитыванием по IP Control (cmd=main_screen, затем cmd=ir_code&ir_code=B24DBF00; обе команды ответили command_status ok): в shell.log после них нет ни строк kb_probe5, ни «Loading plugins from», ни populate_plugins, а kb_probe5 нет в /tmp/run/installed_plugins.xml. kb_probe5 и kb_probe5_sup зарегистрировались после am force-stop com.dunehd.app. [^11]: - doc-sdk-plugins.c054 · doc · any-documented; прошивка — · Программа плагина должна: объявить класс-наследник DunePluginFw, реализовать в нём call_plugin() и присвоить экземпляр в DunePluginFw::$instance - fw-tv188b-261021-0117-r25.c260 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 PHP-плагин, программа которого объявляет наследника DunePluginFw с методом call_plugin() и присваивает его экземпляр в DunePluginFw::$instance (зонд kb_probe6), загружается php_server и получает от оболочки операции handle_user_input и get_vod_stream_url. [^12]: doc-sdk-plugins.c026 · doc · any-documented; прошивка — · PHP-плагин обязан содержать PHP-программу с функцией hd_create_plugin(); путь к ней задаётся в dune_plugin.xml [^13]: fw-tv188b-261021-0117-r25.c372 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 PHP-зонды kb_probe5 и kb_probe10 работали без hd_create_plugin(): их main.php объявляет класс, унаследованный от DunePluginFw, и handle_user_input выполнялся. [^14]: - fw-tv188b-261021-0117-r25.c328 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 строки hd_print() из кода плагина попадают в /tmp/run/<плагин>.log с префиксом «[pid] [t] [время]»: hd_print("kbp5: …") зонда дал «[17362] [t17362] [2026-10-26 10:38:00.049061] kbp5: props dumped to /tmp/kb_probe5/props.txt». - fw-tv188b-261021-0117-r25.c326 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 ошибки и предупреждения PHP в коде плагина php_server пишет в /tmp/run/<плагин>.log строкой вида «[<полный путь файла>:<строка>] [E_WARNING] …» / «[…] [E_ERROR] …». [^15]: - fw-tv188b-261021-0117-r25.c320 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 при сбое PHP-вызова (Fatal error или exit(0) в handle_user_input) оболочка пишет в shell.log «[<плагин>] [php] poll_calls() E: treating empty result as failure and stopping server», останавливает php_server («shutting down...», «stopped.»), затем «Error: operation returned PHP_CALL_FAILED.», «[handle_user_input] Failed.» и «[plugin] <плагин>: FATAL ERROR detected (msg = Ошибка приложения)». - fw-tv188b-260827-0003-r24--plugin-loader--php-runtime.c039 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25, если call_plugin PHP-плагина возвращает null, php_server ничего не пишет в ответ и завершает цикл по EOF канала, а оболочка печатает «poll_calls() E: treating empty result as failure and stopping server», «Error: operation returned PHP_CALL_FAILED.», «result status failed», выполняет plugin_show_error и «FATAL ERROR detected (msg = Ошибка приложения)»; на экране — «Ошибка приложения / Произошла ошибка. Приложение будет закрыто.». [^16]: fw-tv188b-261021-0117-r25--php-framework.c058 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 загрузка намеренно синтаксически сломанного main.php kb_probe11s завершилась E_PARSE на строке 4 (syntax error, unexpected ';'); shell.log записал PHP_CALL_FAILED и plugin_show_error. [^17]: fw-tv188b-261021-0117-r25.c304 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 после touch main.php плагина kb_probe5 следующий вызов handle_user_input сначала перезапускает php_server: в shell.log того же процесса оболочки «[kb_probe5] [php] start_call(): PHP-script modification detected (1793009215). Restarting PHP-server-process...», «shutting down...», «stopped.», «server started; pid: 17676.», и вызов исполняет уже новый процесс 17676. [^18]: fw-tv188b-261021-0117-r25.c306 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 правка файла lib/kbp5_lib.php, подключаемого из main.php через require_once, без изменения main.php не перезапустила php_server kb_probe5: следующий вызов исполнил тот же процесс 17362 (n=5) со старой версией функции (lib=v1), в shell.log между «start» и «result action» сообщений о перезапуске нет. [^19]: fw-tv188b-261021-0117-r25.c225 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 при каждой из пяти загрузок плагинов в снимке shell.log оболочка пишет «=====> Loading plugins from '/flashdata/plugins'», а затем «… '/firmware_ext/plugins'»; других каталогов в строках «Loading plugins from» нет. [^20]: fw-tv188b-261021-0117-r25.c206 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 плагин разворачивается без установщика: каталог копируется adb push (под adb root) в /data/data/com.dunehd.app/flashdata/plugins/, затем chown -R system:system и chmod -R +x для bin и www/cgi-bin; после перезапуска приложения (am force-stop com.dunehd.app) оболочка регистрирует такой плагин («Plugin '

' of type '' is registered»). [^21]: fw-tv188b-261021-0117-r25.c297 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 php_server нового PHP-плагина из flashdata запускается при первом вызове плагина, а не при его регистрации: после регистрации kb_probe6 процесса php_server kb_probe6 нет, а при первом handle_user_input в shell.log идут «start (timeout=60.0s)», «[kb_probe6] [php] creating...», «server started; pid: 31928.», «ready.» (так же у kb_probe5, pid 17362). [^22]: fw-tv188b-261021-0117-r25.c211 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 запись /tmp/run/installed_plugins.xml для плагина из $FS_PREFIX/flashdata/plugins (от до ) содержит name, caption, path, version_index, version и launch_capable; path — полный путь с $FS_PREFIX (/data/data/com.dunehd.app/flashdata/plugins/

). Полей version_id, patch_index и delete_capable в записях зондов нет. [^23]: fw-tv188b-261021-0117-r25.c212 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 у плагина kb_probe5, все 6 точек входа которого (parent_media_url root://applications) были без icon_url, в /tmp/run/installed_plugins.xml launch_capable 0 и нет category; после добавления в каждую точку входа icon_url gui_skin://large_icons/apps.aai и перезапуска приложения — launch_capable 1 и category applications. [^24]: fw-tv188b-261021-0117-r25.c313 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 php_server при старте пишет в /tmp/run/<плагин>.log по порядку: «[server] preparing...», «reader fd: N; writer fd: M», «resetting include path to …», загрузку bootstrap.php, dune_api.php, dune_plugin.php, dune_plugin_fw.php, «executing system properties cmd (number of properties: 7)...», загрузку dune_config.php, затем программы плагина, после чего «[server] ready.» и «[server] main loop started.»; get_included_files() из main.php даёт тот же порядок файлов. [^25]: fw-tv188b-261021-0117-r25.c314 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 к исполнению программы плагина (код верхнего уровня main.php) уже определены классы DunePluginFw и DuneSystem, константа PLUGIN_OP_HANDLE_USER_INPUT и функция hd_print. [^26]: doc-sdk-plugins.c038 · doc · any-documented; прошивка — · actions точки входа — соответствие событие (клавиша) → GUI-действие при фокусе на точке входа; popup_menu добавляет пункты в контекстное меню точки входа [^27]: fw-tv188b-261021-0117-r25.c336 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 строковый id plugin_handle_user_input в key_enter манифеста принят: при выборе точки входа kbp5.native shell.log пишет «plugin D: kb_probe5->handle_user_input(kbp5.native): start (timeout=60.0s)». [^28]: fw-tv188b-261021-0117-r25.c296 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 JSON-контекст вызова handle_user_input, который получает call_plugin PHP-плагина, содержит на верхнем уровне только op_type_code, op_id, opexec_id, internet_status, input_data и plugin_cookies; install_dir_path, tmp_dir_path, data_dir_path, plugin_www_url и plugin_cgi_url в нём нет. [^29]: - doc-sdk-plugins.c046 · doc · any-documented; прошивка — · Вызов плагина концептуально — string call_plugin(string call_ctx_json): JSON с кодом операции и параметрами на входе, JSON с результатом на выходе - fw-tv188b-260827-0003-r24--php-framework.c213 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс PluginOutputData с ключами (6): has_data, data_type, data, plugin_cookies, is_error, error_action [^30]: fw-tv188b-261021-0117-r25.c339 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 строковый id plugin_show_error в ответе handle_user_input принят: shell.log пишет result action plugin_show_error. [^31]: fw-tv188b-261021-0117-r25.c307 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 статическая переменная класса плагина сохраняется между вызовами, пока жив php_server: счётчик KbProbe5Fw::$n, увеличиваемый в каждом call_plugin, рос 1→5 в пяти вызовах процесса 17362 (13:38:00–13:39:25). [^32]: fw-tv188b-261021-0117-r25.c308 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 после каждого перезапуска php_server (по touch main.php, после Fatal error, после exit(0)) статические переменные плагина начинаются заново: счётчик KbProbe5Fw::$n в первом вызове нового процесса снова равен 1 (pid 17676, 17849, 17924). [^33]: doc-sdk-plugins.c060 · doc · any-documented; прошивка — · Плагин обрабатывает одновременно только один вызов: вызовы из Dune GUI всегда сериализуются [^34]: fw-tv188b-260827-0003-r24--php-framework.c016 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Абстрактный класс DunePluginFw имеет статическое поле $instance (комментарий: должно содержать экземпляр DunePluginFw) и абстрактный метод call_plugin($call_ctx_json), возвращающий строку [^35]: fw-tv188b-260827-0003-r24--php-framework.c304 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · php_server содержит пути /firmware_ext/php/bootstrap.php, dune_api.php, dune_plugin.php, dune_plugin_fw.php, dune_config.php, шаблон «require ('%s');» и сообщение «[server] loading '%s'...» [^36]: fw-tv188b-260827-0003-r24--php-framework.c082 · code · tv188b, tv175u, android-dune-fw; прошивка 240619_0210_r22, 250815_1012_r22, 260724_0207_r24, 260827_0003_r24 · bootstrap.php, dune_config.php, dune_plugin.php и dunelib/dune_countries.php одинаковы (sha256) в tv175u 240619_0210_r22, tv188b 250815_1012_r22 и r24-прошивках; dunelib/config_utils, dune_languages, expr, utils в r22-прошивках отсутствуют [^37]: - fw-tv188b-261021-0117-r25--plugin-loader.c042 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 на tv188b r25 сокращённый kb_probe5 после adb push, chown system:system и перезапуска приложения зарегистрирован как php с launch_capable=1 и category=applications. - fw-tv188b-261021-0117-r25--plugin-loader.c044 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 на tv188b r25 установка dune_plugin_kb_probe5.zip с двумя файлами листинга зарегистрировала kb_probe5 как php без смены pid приложения 12389. [^38]: - doc-sdk-plugins.c025 · doc · any-documented; прошивка — · dune_plugin.xml — единственный файл, обязательный для загрузки плагина; остальные файлы указываются в манифесте и могут называться как угодно - doc-sdk-plugins.c016 · doc · any-documented; прошивка — · Установщик плагина — ZIP-архив с файлом dune_plugin.xml на верхнем уровне и прочими файлами плагина [^39]: - doc-sdk-plugins.c030 · doc · any-documented; прошивка — · Раздел манифеста утверждает, что из типов движка (dune_plugin->type) поддерживается только 'php' с единственным обязательным параметром 'program' — путём к главному PHP-файлу - fw-tv188b-261021-0117-r25.c313 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 php_server при старте пишет в /tmp/run/<плагин>.log по порядку: «[server] preparing...», «reader fd: N; writer fd: M», «resetting include path to …», загрузку bootstrap.php, dune_api.php, dune_plugin.php, dune_plugin_fw.php, «executing system properties cmd (number of properties: 7)...», загрузку dune_config.php, затем программы плагина, после чего «[server] ready.» и «[server] main loop started.»; get_included_files() из main.php даёт тот же порядок файлов. [^40]: - doc-sdk-plugins.c092 · doc · any-documented; прошивка — · Файлы в bin/ и www/cgi-bin/ плагина при установке становятся исполняемыми (ZIP не хранит UNIX-атрибуты) - fw-tv188b-261021-0117-r25.c080 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 global_action plugin_system с run_string «bin/ga.sh boot» (путь относительно каталога плагина) оболочка исполняет как «Running system(sh /data/data/com.dunehd.app/flashdata/plugins/kb_probe5/bin/ga.sh boot)» — с префиксом sh и абсолютным путём каталога плагина. [^41]: - fw-tv188b-261021-0117-r25.c154 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 файл www/index.txt плагина отдаётся по http:///plugins/

/index.txt: HTTP 200, Content-type: text/plain, Accept-Ranges: bytes, тело — содержимое файла. - fw-tv188b-261021-0117-r25.c155 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 запрос http:///cgi-bin/plugins/kb_probe5/env.sh?kbp5=1 выполнил скрипт www/cgi-bin/env.sh плагина: его вывод вернулся с HTTP 200, QUERY_STRING=kbp5=1 и REQUEST_URI переданы скрипту. [^42]: fw-tv188b-261021-0117-r25.c210 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 плагин, у которого name в dune_plugin.xml (kb_probe5_other) не равен имени каталога (kb_probe5_badname), не регистрируется: строки «Plugin … is registered» для него нет, в /tmp/run/installed_plugins.xml и /tmp/www/plugins его нет ни под тем, ни под другим именем. [^43]: fw-tv188b-260827-0003-r24--plugin-loader--php-runtime--opexec.c035 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 ключи манифеста operation_timeout/default и operation_timeout/<тип операции> задаются в секундах и работают: 5 дало handle_user_input «start (timeout=5.0s)» и отмену на 5 с, 7 — «timeout=7.0s» и отмену на 7 с. [^44]: - fw-tv188b-261021-0117-r25.c209 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25, если name в dune_plugin.xml не равен имени каталога плагина, оболочка при загрузке пишет в shell.log «[populate_plugins] invalid plugin manifest from '<путь>/dune_plugin.xml': name '' is not equal to directory name '<каталог>'». - fw-tv188b-261021-0117-r25.c210 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 плагин, у которого name в dune_plugin.xml (kb_probe5_other) не равен имени каталога (kb_probe5_badname), не регистрируется: строки «Plugin … is registered» для него нет, в /tmp/run/installed_plugins.xml и /tmp/www/plugins его нет ни под тем, ни под другим именем. [^45]: doc-sdk-plugins.c028 · doc · any-documented; прошивка — · dune_plugin->name — идентификатор плагина: непустой, только алфавитно-цифровые символы и '-', '.', '_', длина не более 64 [^46]: doc-sdk-plugins.c101 · doc · any-documented; прошивка — · Картинки можно указывать как http://, plugin_archive://archive/path, plugin_file://path или gui_skin://path (ресурс стандартного скина прошивки) [^47]: fw-tv188b-261021-0117-r25--gui-resources.c003 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Базовый скин firmware/skin/ в r25 — 743 записи tree.tsv (292 image, 388 binary, 63 text): 12 каталогов ресурсов (battery_icons, button_icons, cut_images, flags, images, large_icons, osd_icons, scrollbar_icons, small_icons, special_icons, weather_icons, wifi_icons) и два файла dune_skin.properties, dune_skin_config.xml; крупнейшие — cut_images 245, flags 241, large_icons 82. [^48]: fw-tv188b-261021-0117-r25--plugin-loader.c043 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 на tv188b r25 после adb push листинга kb_probe5 пункт «KB probe 5: props» виден с иконкой в «Приложения» → DUNE HD; ENTER открывает диалог «KB probe 5» с «OK: props». [^49]: fw-tv188b-261021-0117-r25--plugin-loader.c058 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 kb_probe11p с icon_url=plugin_file://icons/kb11.png зарегистрирован с launch_capable=1, category=applications и logo_url=plugin_file://%kb_probe11p%/icons/kb11.png; в Приложения → DUNE HD пункт KB11 file icon показал синюю квадратную иконку. [^50]: fw-tv188b-261021-0117-r25--plugin-loader.c057 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 kb_probe11i с единственной точкой setup://applications без icon_url зарегистрирован с launch_capable=0; при просмотре всех четырёх рядов Настройки → Приложения пункта KB11 no icon не увидели. [^51]: fw-tv188b-261021-0117-r25--libphp5.c002 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В зонде kb_probe5 на tv188b 261021_0117_r25 значение PHP_VERSION равно 5.3.6. [^52]: doc-sdk-plugins.c054 · doc · any-documented; прошивка — · Программа плагина должна: объявить класс-наследник DunePluginFw, реализовать в нём call_plugin() и присвоить экземпляр в DunePluginFw::$instance [^53]: fw-tv188b-261021-0117-r25.c260 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 PHP-плагин, программа которого объявляет наследника DunePluginFw с методом call_plugin() и присваивает его экземпляр в DunePluginFw::$instance (зонд kb_probe6), загружается php_server и получает от оболочки операции handle_user_input и get_vod_stream_url. [^54]: - fw-tv188b-261021-0117-r25--plugin-loader.c041 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 на tv188b r25 проверка cmp подтвердила побайтовое совпадение dune_plugin.xml (751 байт) и main.php (1692 байт) зонда kb_probe5 с листингами quick-start §2.2 и §2.4. - fw-tv188b-261021-0117-r25--plugin-loader.c042 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 на tv188b r25 сокращённый kb_probe5 после adb push, chown system:system и перезапуска приложения зарегистрирован как php с launch_capable=1 и category=applications. - fw-tv188b-261021-0117-r25--plugin-loader.c044 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 на tv188b r25 установка dune_plugin_kb_probe5.zip с двумя файлами листинга зарегистрировала kb_probe5 как php без смены pid приложения 12389. [^55]: fw-tv188b-260827-0003-r24--plugin-loader--php-runtime.c039 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25, если call_plugin PHP-плагина возвращает null, php_server ничего не пишет в ответ и завершает цикл по EOF канала, а оболочка печатает «poll_calls() E: treating empty result as failure and stopping server», «Error: operation returned PHP_CALL_FAILED.», «result status failed», выполняет plugin_show_error и «FATAL ERROR detected (msg = Ошибка приложения)»; на экране — «Ошибка приложения / Произошла ошибка. Приложение будет закрыто.». [^56]: - fw-tv188b-261021-0117-r25.c296 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 JSON-контекст вызова handle_user_input, который получает call_plugin PHP-плагина, содержит на верхнем уровне только op_type_code, op_id, opexec_id, internet_status, input_data и plugin_cookies; install_dir_path, tmp_dir_path, data_dir_path, plugin_www_url и plugin_cgi_url в нём нет. - fw-tv188b-260827-0003-r24--php-framework.c213 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс PluginOutputData с ключами (6): has_data, data_type, data, plugin_cookies, is_error, error_action [^57]: - fw-tv188b-260827-0003-r24--php-framework.c025 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · DunePluginFw::get_out_type_code($op_code) сопоставляет операции типам выходных данных: folder view → plugin_folder_view, regular folder items → plugin_regular_folder_range, handle_user_input и change_tv_favorites → gui_action, tv_info → plugin_tv_info, day_epg → plugin_tv_epg_program_list, *_url → url, vod_info → plugin_vod_info, vod_stream_info → plugin_stream_info - fw-tv188b-260827-0003-r24--php-framework.c111 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php задаёт перечисление PluginOutputDataType строковыми константами: PLUGIN_OUT_DATA_PLUGIN_FOLDER_VIEW='plugin_folder_view', PLUGIN_OUT_DATA_PLUGIN_REGULAR_FOLDER_RANGE='plugin_regular_folder_range', PLUGIN_OUT_DATA_GUI_ACTION='gui_action', PLUGIN_OUT_DATA_PLUGIN_TV_INFO='plugin_tv_info', PLUGIN_OUT_DATA_PLUGIN_TV_EPG_PROGRAM_LIST='plugin_tv_epg_program_list', PLUGIN_OUT_DATA_URL='url', PLUGIN_OUT_DATA_PLUGIN_VOD_INFO='plugin_vod_info', PLUGIN_OUT_DATA_PLUGIN_STREAM_INFO='plugin_stream_info' [^58]: fw-tv188b-261021-0117-r25.c262 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 params (handler_id, control_id) действия plugin_handle_user_input из key_enter точки входа в манифесте приходят полями handler_id и control_id в input_data операции handle_user_input. [^59]: - fw-tv188b-260827-0003-r24--php-framework.c019 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · invoke_operation использует поля контекста вызова op_type_code, input_data, plugin_cookies, internet_status, opexec_id; имя вызываемого метода плагина равно значению op_type_code - fw-tv188b-260827-0003-r24--php-framework.c025 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · DunePluginFw::get_out_type_code($op_code) сопоставляет операции типам выходных данных: folder view → plugin_folder_view, regular folder items → plugin_regular_folder_range, handle_user_input и change_tv_favorites → gui_action, tv_info → plugin_tv_info, day_epg → plugin_tv_epg_program_list, *_url → url, vod_info → plugin_vod_info, vod_stream_info → plugin_stream_info [^60]: - fw-tv188b-261021-0117-r25.c206 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 плагин разворачивается без установщика: каталог копируется adb push (под adb root) в /data/data/com.dunehd.app/flashdata/plugins/, затем chown -R system:system и chmod -R +x для bin и www/cgi-bin; после перезапуска приложения (am force-stop com.dunehd.app) оболочка регистрирует такой плагин («Plugin '

' of type '' is registered»). - fw-tv188b-261021-0117-r25.c233 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 после am force-stop com.dunehd.app новый процесс приложения заново регистрирует плагины: в shell.log 35 строк «Plugin '

' of type '' is registered», в том числе для kb_probe6 и kb_probe6_sup, положенных adb push перед этим. [^61]: fw-tv188b-261021-0117-r25.c207 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в корне ФС каталога /flashdata нет, а оболочка в shell.log называет каталог плагинов /flashdata/plugins («Loading plugins from '/flashdata/plugins'», «invalid plugin manifest from '/flashdata/plugins/kb_probe5_badname/dune_plugin.xml'», «copying recursively '/tmp/plugin_tmp' to '/flashdata/plugins/kb_probe5_plat'»); файлы этих плагинов лежат в /data/data/com.dunehd.app/flashdata/plugins. [^62]: fw-tv188b-261021-0117-r25.c255 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 во встроенном PHP (php_server и php-cgi CGI плагина) путь /flashdata существует: is_dir('/flashdata') = true, realpath — /data/data/com.dunehd.app/flashdata, хотя в корне ФС (adb shell) /flashdata нет. [^63]: fw-tv188b-261021-0117-r25.c208 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 каталоги плагинов, положенные adb push под adb root в /data/data/com.dunehd.app/flashdata/plugins и переданные chown system:system, имеют SELinux-метку u:object_r:system_app_data_file:s0 — такую же, как у каталога соседнего плагина (Bazinga3); chcon не понадобился. [^64]: fw-tv188b-261021-0117-r25.c084 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 после am force-stop com.dunehd.app приложение Dune поднимается само (новый pid) за 1–2 с, без am start. [^65]: fw-tv188b-261021-0117-r25.c233 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 после am force-stop com.dunehd.app новый процесс приложения заново регистрирует плагины: в shell.log 35 строк «Plugin '

' of type '' is registered», в том числе для kb_probe6 и kb_probe6_sup, положенных adb push перед этим. [^66]: fw-tv188b-261021-0117-r25.c082 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 global_action install не выполняется, если плагин положен в $FS_PREFIX/flashdata/plugins через adb push и приложение перезапущено: маркеров install от kb_probe5 и kb_probe6_sup нет, тогда как boot, boot_end и gui_start kb_probe5 выполнились. [^67]: fw-tv188b-261021-0117-r25.c083 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 global_action update не выполняется, если version_index в dune_plugin.xml изменён на месте (1 → 2) и приложение перезапущено через am force-stop, хотя оболочка регистрирует плагин с version_index 2 и заново запускает movie_suppliers_update.sh. [^68]: fw-tv188b-261021-0117-r25.c076 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 плагин, положенный через adb push без перезагрузки, получил boot при ближайшем старте приложения Dune (после am force-stop), а не при загрузке системы; флага kb_probe5_plugin_boot_action_executed.flag до этого не было. [^69]: - fw-tv188b-261021-0117-r25.c211 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 запись /tmp/run/installed_plugins.xml для плагина из $FS_PREFIX/flashdata/plugins (от до ) содержит name, caption, path, version_index, version и launch_capable; path — полный путь с $FS_PREFIX (/data/data/com.dunehd.app/flashdata/plugins/

). Полей version_id, patch_index и delete_capable в записях зондов нет. - fw-tv188b-261021-0117-r25.c212 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 у плагина kb_probe5, все 6 точек входа которого (parent_media_url root://applications) были без icon_url, в /tmp/run/installed_plugins.xml launch_capable 0 и нет category; после добавления в каждую точку входа icon_url gui_skin://large_icons/apps.aai и перезапуска приложения — launch_capable 1 и category applications. [^70]: fw-tv188b-261021-0117-r25.c204 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 (collect6) плагины, удалённые rm -rf из /data/data/com.dunehd.app/flashdata/plugins, после перечитывания по IP Control (cmd=main_screen + cmd=ir_code&ir_code=B24DBF00) остались в /tmp/run/installed_plugins.xml (grep -c kb_probe6 = 4) и в меню «Приложения»; исчезли они только после am force-stop com.dunehd.app. [^71]: fw-tv188b-261021-0117-r25.c205 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 (collect5) после rm -rf каталогов зондов kb_probe5* из /data/data/com.dunehd.app/flashdata/plugins и перечитывания по IP Control (cmd=main_screen + cmd=ir_code&ir_code=B24DBF00) в /tmp/run/installed_plugins.xml не было ни одной строки с kb_probe5 (grep -c = 0). [^72]: doc-sdk-plugins.c017 · doc · any-documented; прошивка — · Плагин устанавливается запуском файла dune_plugin*.zip с любого носителя (например, USB-флешки) и ставится во флеш-память устройства [^73]: doc-sdk-plugins.c016 · doc · any-documented; прошивка — · Установщик плагина — ZIP-архив с файлом dune_plugin.xml на верхнем уровне и прочими файлами плагина [^74]: fw-tv188b-261021-0117-r25.c219 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 dune_plugin_kb_probe5_plat.zip, запущенный в файловом браузере плеера из /sdcard/DuneHD, установлен в /data/data/com.dunehd.app/flashdata/plugins/kb_probe5_plat; после установки есть также каталоги /data/data/com.dunehd.app/flashdata/plugins_archive/kb_probe5_plat, …/flashdata/plugins_data/kb_probe5_plat и /tmp/plugins/kb_probe5_plat. [^75]: fw-tv188b-261021-0117-r25.c218 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 после штатной установки ZIP оболочка пишет «[plugin_installer] reloading plugin», регистрирует плагин («Plugin 'kb_probe5_plat' of type 'plain' is registered») и «[plugin_installer] Done.» в том же процессе приложения (pid 19586), без перезапуска приложения. [^76]: fw-tv188b-261021-0117-r25.c216 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 после штатной установки ZIP файл bin/marker.txt, который в ZIP имел права -rw-r--r--, получил -rwxr-xr-x, а dune_plugin.xml и only_android.txt в корне плагина остались -rw-r--r--. [^77]: fw-tv188b-261021-0117-r25--plugin-loader.c045 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 на tv188b r25 после установки ZIP листинга kb_probe5 пункт «KB probe 5: props» доступен в «Приложения» без перезапуска приложения; ENTER даёт диалог «KB probe 5 / OK: props». [^78]: fw-tv188b-261021-0117-r25--plugin-loader.c046 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 на tv188b r25 штатный установщик принял dune_plugin_kb_probe11z.zip без dune_plugin.sign и dune_plugin_signer_id.txt и зарегистрировал kb_probe11z как php. [^79]: fw-tv188b-261021-0117-r25--plugin-loader.c047 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 на tv188b r25 после установки kb_probe11z оболочка выполнила global action install как sh bin/ga.sh install; маркер ga_install.txt записал event=install и uid=1000(system). [^80]: fw-tv188b-261021-0117-r25--plugin-loader.c052 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 на tv188b r25 штатная установка kb_probe11z изменила mode файлов bin/ga.sh и www/cgi-bin/ping.sh с 644 в ZIP на 755 в каталоге плагина. [^81]: fw-tv188b-261021-0117-r25--plugin-loader.c048 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 на tv188b r25 после установки неподписанного kb_probe11z ENTER пультом на «KB11 zip» в «Приложения» → DUNE HD вызвал handle_user_input с control_id=enter и диалог «KB probe 11z / OK: zip». [^82]: - fw-tv188b-261021-0117-r25.c336 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 строковый id plugin_handle_user_input в key_enter манифеста принят: при выборе точки входа kbp5.native shell.log пишет «plugin D: kb_probe5->handle_user_input(kbp5.native): start (timeout=60.0s)». - fw-tv188b-261021-0117-r25.c339 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 строковый id plugin_show_error в ответе handle_user_input принят: shell.log пишет result action plugin_show_error. [^83]: doc-sdk-plugins--gui-actions.c044 · doc · any-documented; прошивка — · PluginShowErrorAction в режиме воспроизведения показывает одну строку текста в центре экрана, а в меню Dune — диалог с заголовком и строками сообщения [^84]: doc-sdk-plugins--gui-actions.c043 · doc · any-documented; прошивка — · Данные PluginShowErrorAction — класс PluginShowErrorActionData: fatal (Boolean), title (String), msg_lines (List, необязательно) [^85]: doc-sdk-plugins--gui-actions.c045 · doc · any-documented; прошивка — · При fatal == true PluginShowErrorAction планирует выход из плагина по фатальной ошибке: воспроизведение останавливается, браузер Dune переходит в верхнее меню [^86]: fw-tv188b-261021-0117-r25.c328 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 строки hd_print() из кода плагина попадают в /tmp/run/<плагин>.log с префиксом «[pid] [t] [время]»: hd_print("kbp5: …") зонда дал «[17362] [t17362] [2026-10-26 10:38:00.049061] kbp5: props dumped to /tmp/kb_probe5/props.txt». [^87]: doc-sdk-plugins--operations.c003 · doc · any-documented; прошивка — · get_folder_view() вызывается, когда GUI Dune исполняет действие PLUGIN_OPEN_FOLDER [^88]: doc-sdk-plugins--gui-actions.c033 · doc · any-documented; прошивка — · PluginOpenFolderAction открывает папку плагина: caption добавляется в блок пути, выполняется операция Get_folder_view($media_url), её результат показывается как содержимое папки [^89]: - fw-tv188b-261021-0117-r25--php-framework--native-actions.c036 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В show_dialog подпись не получает фокус: в окне A из 30 подписей и кнопки OK фокус при открытии стоит на OK. - fw-tv188b-261021-0117-r25--php-framework--native-actions.c049 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Настоящий пульт на той же прошивке подтвердил: в окнах A (подписи) и B (подписи с max_height 875) прокрутки нет, в C (кнопки) есть, кнопка OK закрывает окно. [^90]: doc-sdk-plugins--operations.c023 · doc · any-documented; прошивка — · PluginControlsFolderView::initial_sel_ndx — индекс (с 0) контрола, получающего фокус первым; -1 означает контрол по умолчанию (первый) [^91]: doc-sdk-plugins--operations.c020 · doc · any-documented; прошивка — · Класс PluginControlsFolderView имеет поля defs (Array), initial_sel_ndx (int), params (PluginFolderViewParams) [^92]: fw-tv188b-261021-0117-r25--php-framework.c054 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 после запуска KB11 reg оболочка вызвала get_folder_view("kbp11_reg"), а lead увидел диалог «Ошибка приложения» вместо папки и не нажимал ENTER на элементах. [^93]: - fw-tv188b-261021-0117-r25.c313 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 php_server при старте пишет в /tmp/run/<плагин>.log по порядку: «[server] preparing...», «reader fd: N; writer fd: M», «resetting include path to …», загрузку bootstrap.php, dune_api.php, dune_plugin.php, dune_plugin_fw.php, «executing system properties cmd (number of properties: 7)...», загрузку dune_config.php, затем программы плагина, после чего «[server] ready.» и «[server] main loop started.»; get_included_files() из main.php даёт тот же порядок файлов. - fw-tv188b-261021-0117-r25.c328 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 строки hd_print() из кода плагина попадают в /tmp/run/<плагин>.log с префиксом «[pid] [t] [время]»: hd_print("kbp5: …") зонда дал «[17362] [t17362] [2026-10-26 10:38:00.049061] kbp5: props dumped to /tmp/kb_probe5/props.txt». - fw-tv188b-261021-0117-r25.c326 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 ошибки и предупреждения PHP в коде плагина php_server пишет в /tmp/run/<плагин>.log строкой вида «[<полный путь файла>:<строка>] [E_WARNING] …» / «[…] [E_ERROR] …». [^94]: - fw-tv188b-261021-0117-r25.c206 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 плагин разворачивается без установщика: каталог копируется adb push (под adb root) в /data/data/com.dunehd.app/flashdata/plugins/, затем chown -R system:system и chmod -R +x для bin и www/cgi-bin; после перезапуска приложения (am force-stop com.dunehd.app) оболочка регистрирует такой плагин («Plugin '

' of type '' is registered»). - fw-tv188b-261021-0117-r25.c209 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25, если name в dune_plugin.xml не равен имени каталога плагина, оболочка при загрузке пишет в shell.log «[populate_plugins] invalid plugin manifest from '<путь>/dune_plugin.xml': name '' is not equal to directory name '<каталог>'». - fw-tv188b-261021-0117-r25.c336 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 строковый id plugin_handle_user_input в key_enter манифеста принят: при выборе точки входа kbp5.native shell.log пишет «plugin D: kb_probe5->handle_user_input(kbp5.native): start (timeout=60.0s)». - fw-tv188b-261021-0117-r25.c339 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 строковый id plugin_show_error в ответе handle_user_input принят: shell.log пишет result action plugin_show_error. - fw-tv188b-261021-0117-r25.c320 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 при сбое PHP-вызова (Fatal error или exit(0) в handle_user_input) оболочка пишет в shell.log «[<плагин>] [php] poll_calls() E: treating empty result as failure and stopping server», останавливает php_server («shutting down...», «stopped.»), затем «Error: operation returned PHP_CALL_FAILED.», «[handle_user_input] Failed.» и «[plugin] <плагин>: FATAL ERROR detected (msg = Ошибка приложения)». [^95]: fw-tv188b-261021-0117-r25.c330 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 метки времени в /tmp/run/<плагин>.log и shell.log на 3 часа меньше местного времени: вызов, который date() в php_server kb_probe5 записал как 13:38:00, в логе плагина помечен 10:38:00.049. [^96]: fw-tv188b-261021-0117-r25.c329 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 php_server при старте пишет «Starting logging to '/data/data/com.dunehd.app/tmp/run/<плагин>.log' (<= 3072000)»; в окружении php_server LOG_DIR=/tmp/run и LOG_MAX_FILE_SIZE=3072000. [^97]: fw-tv188b-261021-0117-r25.c327 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 предупреждение PHP попадает в /tmp/run/<плагин>.log и для выражения с оператором подавления @: @mkdir(...) в main.php:11 зонда при существующем каталоге дал строку «[…/main.php:11] [E_WARNING] mkdir() …: File exists» при каждом запуске php_server. [^98]: doc-sdk-plugins.c139 · doc · sigma-smp86xx, sigma-smp87xx, android; прошивка — · Лог плагина — /tmp/run/.log (Sigma: tail -F через telnet; Android: busybox tail -F через telnet/ADB) [^99]: fw-tv188b-261021-0117-r25.c325 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 после создания /config/hd_debug/PHP_CLIENT.txt со значением 1 на работающем приложении (13:39:01, без его перезапуска) в выборке shell.log по вызовам kb_probe5 сообщений «start_call(): call_id…» и «[call: N]: starting...» не появилось — только «start (timeout=60.0s)» и «result action» (и строки перезапуска по mtime). [^100]: fw-tv188b-260827-0003-r24--plugin-loader.c009 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · libduneshell.so содержит сообщения проверки манифеста: «name is missing», «name '%s' is invalid», «plugin already registered with name», «name '%s' is not equal to directory name '%s'», «caption is invalid or missing», «type is missing», «type '%s' is not supported» [^101]: - fw-tv188b-261021-0117-r25.c212 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 у плагина kb_probe5, все 6 точек входа которого (parent_media_url root://applications) были без icon_url, в /tmp/run/installed_plugins.xml launch_capable 0 и нет category; после добавления в каждую точку входа icon_url gui_skin://large_icons/apps.aai и перезапуска приложения — launch_capable 1 и category applications. - fw-tv188b-261021-0117-r25.c213 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 точки входа плагина kb_probe5 (root://applications), заданные без icon_url, в разделе «Приложения» не появлялись. [^102]: fw-tv188b-261021-0117-r25.c221 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 плагин с type plain без params/program (зонды-поставщики kb_probe5_sup и kb_probe6_sup: в каталоге только dune_plugin.xml и bin/) регистрируется; его запись в /tmp/run/installed_plugins.xml — launch_capable 0 и movie_suppliers со значением params/movie_suppliers. [^103]: - fw-tv188b-261021-0117-r25.c319 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 при Fatal error в handle_user_input (вызов несуществующей функции) php_server пишет в /tmp/run/<плагин>.log «[<плагин>] [server] php-call failed.» и строку «[<путь к файлу>:<строка>] [E_ERROR] Call to undefined function …»; «can not retrieve 'out'» не появляется. - fw-tv188b-261021-0117-r25.c320 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 при сбое PHP-вызова (Fatal error или exit(0) в handle_user_input) оболочка пишет в shell.log «[<плагин>] [php] poll_calls() E: treating empty result as failure and stopping server», останавливает php_server («shutting down...», «stopped.»), затем «Error: operation returned PHP_CALL_FAILED.», «[handle_user_input] Failed.» и «[plugin] <плагин>: FATAL ERROR detected (msg = Ошибка приложения)». - fw-tv188b-261021-0117-r25.c322 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 после остановки php_server из-за сбоя вызова (Fatal error, exit(0)) следующий вызов плагина запускает новый php_server: в shell.log после «start (timeout=60.0s)» идёт «[kb_probe5] [php] server started; pid: 17849.» (после Fatal error) и «… pid: 17924.» (после exit). - fw-tv188b-261021-0117-r25.c236 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 после сбоя операции handle_user_input php_server с «op 11 failed (read status: 2)» и PHP_CALL_FAILED оболочка пишет «FATAL ERROR detected (msg = Ошибка приложения)» и показывает диалог «Ошибка приложения / Произошла ошибка. Приложение будет закрыто.» с кнопкой OK; после закрытия плеер не завис. [^104]: - fw-tv188b-261021-0117-r25.c309 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 операция handle_user_input PHP-плагина без operation_timeout в манифесте (kb_probe5, kb_probe6; ENTER на точке входа с plugin_handle_user_input) стартует с тайм-аутом 60 с: в shell.log «…->handle_user_input(…): start (timeout=60.0s)». - fw-tv188b-260827-0003-r24--plugin-loader--php-runtime--opexec.c032 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 по тайм-ауту handle_user_input оболочка останавливает php_server плагина и тем прерывает вызов: за «cancelling by timeout (N s)» следуют «FATAL ERROR detected (msg = operation timed out)», «[php] shutting down...», через ~0,25 с «killing PHP-server process...» и «stopped.», затем «canceling req N (fast: 1)», «PHP-FW was shut down. The operation fails.», «result status canceled» и «canceled in N s»; PHP-код вызова не доработал. - fw-tv188b-260827-0003-r24--plugin-loader--php-runtime--opexec.c033 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 после отмены handle_user_input по тайм-ауту оболочка выполняет plugin_show_error, и на экране — диалог «Превышено время операции» с кнопкой OK (перевод plugin_operation_timed_out). [^105]: - fw-tv188b-261021-0117-r25.c306 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 правка файла lib/kbp5_lib.php, подключаемого из main.php через require_once, без изменения main.php не перезапустила php_server kb_probe5: следующий вызов исполнил тот же процесс 17362 (n=5) со старой версией функции (lib=v1), в shell.log между «start» и «result action» сообщений о перезапуске нет. - fw-tv188b-261021-0117-r25.c304 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 после touch main.php плагина kb_probe5 следующий вызов handle_user_input сначала перезапускает php_server: в shell.log того же процесса оболочки «[kb_probe5] [php] start_call(): PHP-script modification detected (1793009215). Restarting PHP-server-process...», «shutting down...», «stopped.», «server started; pid: 17676.», и вызов исполняет уже новый процесс 17676. [^106]: - fw-tv188b-261021-0117-r25.c241 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 $FS_PREFIX/firmware_ext/php/php-cgi, запущенный из adb shell (adbd root) с LD_LIBRARY_PATH=$FS_PREFIX/lib:$LD_LIBRARY_PATH, не стартует — «CANNOT LINK EXECUTABLE … library "libiconv.so.2" not found: needed by main executable», код 1 (и с -v, и с -q -f). - fw-tv188b-261021-0117-r25.c238 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 php-cgi, запущенный CGI-обёрткой плагина без изменения LD_LIBRARY_PATH, стартует и выполняет скрипт; в окружении php-cgi LD_LIBRARY_PATH=/data/data/com.dunehd.app/firmware/lib:/lib:/usr/lib. [^107]: - fw-tv188b-261021-0117-r25.c212 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 у плагина kb_probe5, все 6 точек входа которого (parent_media_url root://applications) были без icon_url, в /tmp/run/installed_plugins.xml launch_capable 0 и нет category; после добавления в каждую точку входа icon_url gui_skin://large_icons/apps.aai и перезапуска приложения — launch_capable 1 и category applications. - fw-tv188b-261021-0117-r25.c233 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 после am force-stop com.dunehd.app новый процесс приложения заново регистрирует плагины: в shell.log 35 строк «Plugin '

' of type '' is registered», в том числе для kb_probe6 и kb_probe6_sup, положенных adb push перед этим. [^108]: doc-sdk-plugins.c061 · doc · any-documented; прошивка — · Глобальные переменные PHP обычно сохраняются между вызовами, но экземпляр движка может быть пересоздан в любой момент между вызовами — плагин не должен на них полагаться [^109]: doc-sdk-plugins.c066 · doc · any-documented; прошивка — · data_dir_path (постоянные данные) недоступен на устройствах без System Storage и Flash Memory Storage — тогда ключ не задан [^110]: fw-tv188b-261021-0117-r25.c154 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 файл www/index.txt плагина отдаётся по http:///plugins/

/index.txt: HTTP 200, Content-type: text/plain, Accept-Ranges: bytes, тело — содержимое файла. [^111]: fw-tv188b-261021-0117-r25.c155 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 запрос http:///cgi-bin/plugins/kb_probe5/env.sh?kbp5=1 выполнил скрипт www/cgi-bin/env.sh плагина: его вывод вернулся с HTTP 200, QUERY_STRING=kbp5=1 и REQUEST_URI переданы скрипту. [^112]: fw-tv188b-261021-0117-r25.c156 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 статика www и CGI плагина отвечают на запросы с другого хоста локальной сети: CGI видит REMOTE_ADDR=[::ffff:<адрес в LAN>] при HTTP_HOST=<адрес в LAN> (IP плеера), файл www/index.txt отдаётся тому же клиенту с HTTP 200. [^113]: fw-tv188b-260827-0003-r24--http-api.c008 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · CGI-скрипт плагина запускается run_plugin_cgi как shell-скрипт (sh), а не напрямую: PHP-обработчик плагин должен вызвать сам [^114]: fw-tv188b-261021-0117-r25.c152 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 CGI плагина, запущенный httpd через run_plugin_cgi, работает под uid=0(root) gid=0(root) с SELinux-контекстом u:r:shell:s0. [^115]: fw-tv188b-260827-0003-r24--plugin-loader--manifest.c053 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · libduneshell.so содержит сообщение «[plugin] error: operation '%s' is not supported for plain plugin type» и имя program рядом с run.php и php_plugin_op_handle.c [^116]: - doc-sdk-plugins.c028 · doc · any-documented; прошивка — · dune_plugin->name — идентификатор плагина: непустой, только алфавитно-цифровые символы и '-', '.', '_', длина не более 64 - fw-tv188b-261021-0117-r25.c210 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 плагин, у которого name в dune_plugin.xml (kb_probe5_other) не равен имени каталога (kb_probe5_badname), не регистрируется: строки «Plugin … is registered» для него нет, в /tmp/run/installed_plugins.xml и /tmp/www/plugins его нет ни под тем, ни под другим именем. [^117]: - doc-sdk-plugins.c029 · doc · any-documented; прошивка — · dune_plugin->caption — подпись плагина, показываемая в Setup / Misc / Plugins - fw-tv188b-261021-0117-r25.c211 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 запись /tmp/run/installed_plugins.xml для плагина из $FS_PREFIX/flashdata/plugins (от до ) содержит name, caption, path, version_index, version и launch_capable; path — полный путь с $FS_PREFIX (/data/data/com.dunehd.app/flashdata/plugins/

). Полей version_id, patch_index и delete_capable в записях зондов нет. [^118]: fw-tv188b-261021-0117-r25.c220 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 оболочка регистрирует плагины типов php, plain и internal.internal (dune_internal): «Plugin '

' of type '<тип>' is registered». [^119]: - doc-sdk-plugins.c030 · doc · any-documented; прошивка — · Раздел манифеста утверждает, что из типов движка (dune_plugin->type) поддерживается только 'php' с единственным обязательным параметром 'program' — путём к главному PHP-файлу - fw-tv188b-261021-0117-r25.c290 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 install_dir_path у kb_probe5 = '/data/data/com.dunehd.app/flashdata/plugins/kb_probe5' (is_dir() = true) — тот же путь, что плагина в /tmp/run/installed_plugins.xml. - fw-tv188b-261021-0117-r25.c313 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 php_server при старте пишет в /tmp/run/<плагин>.log по порядку: «[server] preparing...», «reader fd: N; writer fd: M», «resetting include path to …», загрузку bootstrap.php, dune_api.php, dune_plugin.php, dune_plugin_fw.php, «executing system properties cmd (number of properties: 7)...», загрузку dune_config.php, затем программы плагина, после чего «[server] ready.» и «[server] main loop started.»; get_included_files() из main.php даёт тот же порядок файлов. [^120]: - doc-sdk-plugins.c105 · doc · any-documented; прошивка — · Онлайн-обновление: в манифесте задаются version_index (число, растёт с каждой версией, в UI не показывается), version (подпись для UI) и check_update (schema, url, timeout, required, auto) - fw-tv188b-261021-0117-r25.c211 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 запись /tmp/run/installed_plugins.xml для плагина из $FS_PREFIX/flashdata/plugins (от до ) содержит name, caption, path, version_index, version и launch_capable; path — полный путь с $FS_PREFIX (/data/data/com.dunehd.app/flashdata/plugins/

). Полей version_id, patch_index и delete_capable в записях зондов нет. [^121]: - doc-sdk-plugins.c031 · doc · any-documented; прошивка — · Точку входа (entry_point) можно поместить в папки root://tv, root://applications, setup://applications - fw-tv188b-261021-0117-r25.c212 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 у плагина kb_probe5, все 6 точек входа которого (parent_media_url root://applications) были без icon_url, в /tmp/run/installed_plugins.xml launch_capable 0 и нет category; после добавления в каждую точку входа icon_url gui_skin://large_icons/apps.aai и перезапуска приложения — launch_capable 1 и category applications. [^122]: doc-sdk-plugins.c037 · doc · any-documented; прошивка — · media_url точки входа — идентификатор узла меню плагина, уникальный в пределах плагина; используется в операциях плагина [^123]: - doc-sdk-plugins.c149 · doc · any-documented; прошивка — · caption у entry_point — подпись точки входа (entry point caption). - fw-tv188b-261021-0117-r25--plugin-loader.c043 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 на tv188b r25 после adb push листинга kb_probe5 пункт «KB probe 5: props» виден с иконкой в «Приложения» → DUNE HD; ENTER открывает диалог «KB probe 5» с «OK: props». [^124]: - fw-tv188b-261021-0117-r25.c212 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 у плагина kb_probe5, все 6 точек входа которого (parent_media_url root://applications) были без icon_url, в /tmp/run/installed_plugins.xml launch_capable 0 и нет category; после добавления в каждую точку входа icon_url gui_skin://large_icons/apps.aai и перезапуска приложения — launch_capable 1 и category applications. - fw-tv188b-261021-0117-r25.c213 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 точки входа плагина kb_probe5 (root://applications), заданные без icon_url, в разделе «Приложения» не появлялись. - fw-tv188b-261021-0117-r25--plugin-loader.c043 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 на tv188b r25 после adb push листинга kb_probe5 пункт «KB probe 5: props» виден с иконкой в «Приложения» → DUNE HD; ENTER открывает диалог «KB probe 5» с «OK: props». - fw-tv188b-261021-0117-r25--plugin-loader.c057 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 kb_probe11i с единственной точкой setup://applications без icon_url зарегистрирован с launch_capable=0; при просмотре всех четырёх рядов Настройки → Приложения пункта KB11 no icon не увидели. - fw-tv188b-261021-0117-r25--plugin-loader.c058 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 kb_probe11p с icon_url=plugin_file://icons/kb11.png зарегистрирован с launch_capable=1, category=applications и logo_url=plugin_file://%kb_probe11p%/icons/kb11.png; в Приложения → DUNE HD пункт KB11 file icon показал синюю квадратную иконку. [^125]: - doc-sdk-plugins.c038 · doc · any-documented; прошивка — · actions точки входа — соответствие событие (клавиша) → GUI-действие при фокусе на точке входа; popup_menu добавляет пункты в контекстное меню точки входа - fw-tv188b-261021-0117-r25.c262 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 params (handler_id, control_id) действия plugin_handle_user_input из key_enter точки входа в манифесте приходят полями handler_id и control_id в input_data операции handle_user_input. - fw-tv188b-261021-0117-r25.c336 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 строковый id plugin_handle_user_input в key_enter манифеста принят: при выборе точки входа kbp5.native shell.log пишет «plugin D: kb_probe5->handle_user_input(kbp5.native): start (timeout=60.0s)». [^126]: doc-sdk-plugins.c148 · doc · any-documented; прошивка — · Поля entry_point перечислены как возможные («may contain the following fields»); документ не называет ни одно из них обязательным. [^127]: fw-tv188b-260827-0003-r24--php-framework.c213 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс PluginOutputData с ключами (6): has_data, data_type, data, plugin_cookies, is_error, error_action [^128]: doc-sdk-plugins.c058 · doc · any-documented; прошивка — · Результат операции — PluginOutputData с полями has_data, data_type, data, plugin_cookies, is_error, error_action; при ошибке is_error = true и может быть задано error_action [^129]: 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() исполняется как следующее действие [^130]: 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' [^131]: - fw-tv188b-261021-0117-r25--libphp5.c002 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В зонде kb_probe5 на tv188b 261021_0117_r25 значение PHP_VERSION равно 5.3.6. - fw-tv188b-261021-0117-r25--libphp5.c003 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В зонде kb_probe5 на tv188b 261021_0117_r25 php_sapi_name возвращает hd. [^132]: fw-tv188b-261021-0117-r25.c239 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в php-cgi CGI плагина PHP_VERSION = 5.3.6, php_sapi_name() = cgi-fcgi. [^133]: fw-tv188b-261021-0117-r25.c240 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 PHP-скрипт CGI плагина (php-cgi через CGI-обёртку) работает с posix_getuid() = 0, а php_server того же плагина — с uid 1000. [^134]: fw-tv188b-261021-0117-r25.c316 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 include_path в php_server = '.:<каталог плагина>:/data/data/com.dunehd.app/firmware_ext/php/include', каталог плагина — с префиксом $FS_PREFIX: …/flashdata/plugins/kb_probe5 и …/flashdata/plugins/dune-hd.tv у плагинов из flashdata, …/firmware_ext/plugins/shell_ext и …/firmware_ext/plugins/android_apps у встроенных; php_server пишет его в лог «[server] resetting include path to '…'». [^135]: fw-tv188b-261021-0117-r25.c288 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 DuneSystem::$properties у PHP-плагина kb_probe5 из flashdata содержит 8 ключей: sdk_version '1.0.0', plugin_name 'kb_probe5', install_dir_path, tmp_dir_path, data_dir_path, plugin_www_url, plugin_cgi_url, few_buttons_remote_type '0'. [^136]: fw-tv188b-261021-0117-r25.c290 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 install_dir_path у kb_probe5 = '/data/data/com.dunehd.app/flashdata/plugins/kb_probe5' (is_dir() = true) — тот же путь, что плагина в /tmp/run/installed_plugins.xml. [^137]: fw-tv188b-261021-0117-r25.c291 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 tmp_dir_path у kb_probe5 = '/data/data/com.dunehd.app/tmp/plugins/kb_probe5' — путь /tmp/plugins/kb_probe5 с префиксом FS_PREFIX=/data/data/com.dunehd.app; is_dir() для него true. [^138]: fw-tv188b-261021-0117-r25.c292 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 data_dir_path у kb_probe5 (плагин в flashdata) = '/data/data/com.dunehd.app/flashdata/plugins_data/kb_probe5'; is_dir() для него true. [^139]: fw-tv188b-261021-0117-r25.c289 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 у kb_probe5 plugin_www_url = 'http://127.0.0.1:80/plugins/kb_probe5/', plugin_cgi_url = 'http://127.0.0.1:80/cgi-bin/plugins/kb_probe5/' — с явным портом 80. [^140]: fw-tv188b-260827-0003-r24--php-framework.c289 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Класс DefaultDunePluginFw extends DunePluginFw определён не в php/, а в файлах default_dune_plugin_fw.php 8 встроенных плагинов: в lib/ у android_apps, bt_setup, dunestore, ext_epg, ktv_start, radiotime, shell_ext и в phplib/ у bluray [^141]: fw-tv188b-260827-0003-r24--php-framework.c290 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · В копии android_apps (и идентичной bt_setup) DefaultDunePluginFw::call_plugin($call_ctx_json) возвращает json_encode(call_plugin_impl(json_decode($call_ctx_json))) [^142]: fw-tv188b-260827-0003-r24--php-framework.c291 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Файл default_dune_plugin_fw.php встроенного плагина в конце регистрирует экземпляр: DunePluginFw::$instance = new DefaultDunePluginFw() [^143]: plg-gh-aspel-twitch-dune-plugin.c022 · code · unknown; прошивка — · Точка входа main.php подключает lib/default_dune_plugin_fw.php и main_plugin.php, затем задаёт класс плагина DefaultDunePluginFw::$plugin_class_name = 'TwitchPlugin'. [^144]: plg-gh-aspel-twitch-dune-plugin.c007 · code · unknown; прошивка — · В первой точке входа ENTER назначен на действие plugin_open_folder. [^145]: plg-dc-screenshoter.c014 · code · unknown; прошивка — · В обеих точках входа клавиши key_enter и key_play вызывают действие plugin_handle_user_input с handler_id = entry [^146]: doc-sdk-plugins.c140 · doc · android; прошивка — · В SDK для Android приведены команды развёртывания плагина: adb push в /flashdata/plugins/ и chmod -R +x для bin и www/cgi-bin внутри каталога плагина. [^147]: - fw-tv188b-261021-0117-r25.c207 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в корне ФС каталога /flashdata нет, а оболочка в shell.log называет каталог плагинов /flashdata/plugins («Loading plugins from '/flashdata/plugins'», «invalid plugin manifest from '/flashdata/plugins/kb_probe5_badname/dune_plugin.xml'», «copying recursively '/tmp/plugin_tmp' to '/flashdata/plugins/kb_probe5_plat'»); файлы этих плагинов лежат в /data/data/com.dunehd.app/flashdata/plugins. - fw-tv188b-261021-0117-r25.c206 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 плагин разворачивается без установщика: каталог копируется adb push (под adb root) в /data/data/com.dunehd.app/flashdata/plugins/, затем chown -R system:system и chmod -R +x для bin и www/cgi-bin; после перезапуска приложения (am force-stop com.dunehd.app) оболочка регистрирует такой плагин («Plugin '

' of type '' is registered»). [^148]: - fw-tv188b-261021-0117-r25.c204 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 (collect6) плагины, удалённые rm -rf из /data/data/com.dunehd.app/flashdata/plugins, после перечитывания по IP Control (cmd=main_screen + cmd=ir_code&ir_code=B24DBF00) остались в /tmp/run/installed_plugins.xml (grep -c kb_probe6 = 4) и в меню «Приложения»; исчезли они только после am force-stop com.dunehd.app. - fw-tv188b-261021-0117-r25.c205 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 (collect5) после rm -rf каталогов зондов kb_probe5* из /data/data/com.dunehd.app/flashdata/plugins и перечитывания по IP Control (cmd=main_screen + cmd=ir_code&ir_code=B24DBF00) в /tmp/run/installed_plugins.xml не было ни одной строки с kb_probe5 (grep -c = 0). [^149]: fw-tv188b-260827-0003-r24--php-framework.c199 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс PluginControlsFolderView с ключами (5): defs, actions, timer, initial_sel_ndx, params [^150]: doc-sdk-plugins.c042 · doc · any-documented; прошивка — · По SDK тайм-аут операций плагина по умолчанию составляет 10 секунд; operation_timeout задаёт общий () и потиповой (N) тайм-аут. [^151]: fw-tv188b-261021-0117-r25.c309 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 операция handle_user_input PHP-плагина без operation_timeout в манифесте (kb_probe5, kb_probe6; ENTER на точке входа с plugin_handle_user_input) стартует с тайм-аутом 60 с: в shell.log «…->handle_user_input(…): start (timeout=60.0s)». [^152]: fw-tv188b-260827-0003-r24--plugin-loader--php-runtime--opexec.c032 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 по тайм-ауту handle_user_input оболочка останавливает php_server плагина и тем прерывает вызов: за «cancelling by timeout (N s)» следуют «FATAL ERROR detected (msg = operation timed out)», «[php] shutting down...», через ~0,25 с «killing PHP-server process...» и «stopped.», затем «canceling req N (fast: 1)», «PHP-FW was shut down. The operation fails.», «result status canceled» и «canceled in N s»; PHP-код вызова не доработал. [^153]: doc-sdk-plugins.c102 · doc · any-documented; прошивка — · Для чистых FlashLite/HTML-плагинов вместо 'php' можно указать тип 'plain' — тогда PHP-программа и параметр program не нужны [^154]: fw-tv188b-261021-0117-r25--php-framework.c055 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Форма KB11 reg использует те же имена view_kind=view_regular, data и initial_range, что AbstractRegularScreen r25, но в отличие от его ответа не задаёт archive и folder_type. [^155]: fw-tv188b-261021-0117-r25--php-framework.c056 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · KB11 reg задаёт только num_cols=1/num_rows=5 в view_params и icon_path в base_view_item_params; экран SetupFoldersScreen r25 дополнительно задаёт геометрию подписи, not_loaded_view_item_params и async_icon_loading=false. [^156]: fw-tv188b-261021-0117-r25--plugin-loader.c037 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 ZIP dune_plugin_kb_probe5_plat.zip без dune_plugin.sign и dune_plugin_signer_id.txt установлен штатно в /flashdata/plugins/kb_probe5_plat (в логе; фактически /data/data/com.dunehd.app/flashdata/plugins/kb_probe5_plat) и зарегистрирован как Plugin 'kb_probe5_plat' of type 'plain'. [^157]: fw-tv188b-261021-0117-r25--php-framework.c057 · inference · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Ошибка открытия KB11 reg в запросе 11 могла быть связана с неполной формой ответа зонда: отличия folder_type и параметров вида от встроенного регулярного экрана не исключены; дефект прошивки этим прогоном не установлен. [^158]: fw-tv188b-261021-0117-r25--plugin-loader.c039 · inference · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 отсутствие dune_plugin.sign и dune_plugin_signer_id.txt не помешало штатной установке и регистрации kb_probe5_plat; это не доказывает, что подпись не проверяется у других плагинов, и не задаёт политику кастомных прошивок. [^159]: doc-sdk-plugins.c035 · doc, disputed · any-documented; прошивка — · Параметры отображения точки входа: icon_url, icon_margins и icon_fit_scale_factor (120606+), badge_icon_url (120901+), override_default_badge (141005_b9+) — аналоги свойств ViewItemParams [^160]: doc-sdk-plugins.c142 · doc, disputed · any-documented; прошивка — · Перечитать плагины без перезапуска оболочки: в верхнем меню нажать ANGLE/ROTATE (или Refresh в POP UP MENU) либо по IP Control: cmd=main_screen, затем cmd=ir_code&ir_code=B24DBF00 [^161]: fw-tv188b-260827-0003-r24--plugin-loader--php-runtime.c016 · inference, disputed · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Тайм-аут операции (operation_timeout; по SDK по умолчанию 10 с, потиповой N может задать своё значение) отсчитывает оболочка: по истечении она отменяет операцию у себя и сообщает «Operation time exceeded», но PHP-вызов в php_server не прерывается — его результат приходит позже и отбрасывается («Received result for cancelled operation»). [^162]: fw-tv188b-261021-0117-r25--gui-resources.c025 · inference · tv188b, android-dune-fw; прошивка 261021_0117_r25 · gui_skin:// разрешается относительно каталога текущего скина из /tmp/dune_skin_dir.txt; значение настройки gui_skin вида alt: выбирает альтернативный скин, extra: — внешний (extra) скин; при отсутствии скина или недопустимом значении — откат на default. [^163]: fw-tv188b-260827-0003-r24--php-framework.c293 · inference · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Оболочка (libduneshell.so) вызывает плагин через PHP-выражение DunePluginFw::$instance->call_plugin(...), то есть через экземпляр, который регистрирует default_dune_plugin_fw.php плагина [^164]: fw-tv188b-260827-0003-r24--php-framework.c308 · inference · tv188b, android-dune-fw; прошивка 260827_0003_r24 · php_server, вероятно, исполняет вызов плагина как PHP-код «$in = <<($in);», где выражение (например DunePluginFw::$instance->call_plugin) приходит от оболочки в CallPacket [^165]: fw-tv188b-260827-0003-r24--plugin-loader--manifest.c003 · inference · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Неизвестные дочерние элементы манифеста (по крайней мере в resources, permissions и там, где выводится «unexpected element»), а также повторные resource type и permission name, вероятно, не делают манифест недействительным: парсер пишет предупреждение и пропускает элемент; для entry_point/popup_menu/menu_items в сообщении нет «ignored», и что происходит там, не установлено [^166]: fw-tv188b-260827-0003-r24--plugin-loader--manifest.c055 · inference · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Оболочка r24, вероятно, поддерживает типы плагинов php и plain: plain-плагин загружается, но вызовы операций плагина для него отклоняются («not supported for plain plugin type»); это согласуется с SDK о типе plain (doc-sdk-plugins.c102), но не с фразой SDK «поддерживается только php» (doc-sdk-plugins.c030, внутреннее противоречие документа) [^167]: fw-tv188b-260827-0003-r24--plugin-loader.c102 · inference, disputed · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Изменение файла программы плагина (main.php из params/program; второго аргумента php_server) по времени модификации, вероятно, подхватывается без перезагрузки оболочки — при следующем вызове PHP-сервер плагина перезапускается. # Среда исполнения PHP плагина на r24 и r25 > Редакция 2026-11-02. В какой среде работает код плагина Dune HD на прошивках r24 и r25: версия и модули PHP, > `php_server` и `php-cgi`, uid, переменные окружения, подстановка `FS_PREFIX`, каталоги, HTTP, фон, лимиты, отладка. > Источники: наблюдения на tv188b `261021_0117_r25` (`device`) и `260827_0003_r24` (`device`, снимки процессов); код > tv188b r24 и r25 (`code`); код APK `260724_0207_r24` — там разобрана подстановка путей (`code`, платформа `android-atv`); > SDK — только как справка и с пометкой. Чего нет ни в коде, ни в наблюдениях, глава не утверждает. Факты о других > устройствах — только где сказано. Каждое фактическое предложение ссылается на claim id. Дополнение (2026-11-03): > наблюдения запроса 11 — один прогон, tv188b `261021_0117_r25`, зонд `kb_probe11`; на другие прошивки и устройства они не переносятся. > Дополнение (2026-11-03): повторы запроса 12 (`curl_multi`, `bg2`) — тоже один прогон на том же устройстве; `HTTP_HOST` разведён > по способу задать URL, окружение sh-CGI в §4.1 отделено от `php-cgi`. > Дополнение (2026-11-03): запрос 13 (зонд `kb_probe13`, один прогон на том же устройстве) — `$_SERVER` и `$_ENV` > `php_server`, окружение самого `php-cgi` (§4.1), `exec` первым словом и после пробела (§3.2), `ffmpeg` (§3.4), повтор `bg2` со > снимками процессов (§3.8). > > Рядом: очередь операций, тайм-ауты и жизнь `php_server` — «Операции плагина, тайм-ауты и `php_server`»; ошибки > прошивки — «Реестр ошибок прошивки и SDK»; приёмы плагинов (HTTP, хранение, фон, CGI) — > «Приёмы разработки плагинов Dune HD»; лог и отладка в плагинах — > «Приёмы разработки плагинов Dune HD»; сводка по прошивкам — > «Матрица совместимости возможностей плагина». ## Коротко: вопрос → ответ | Вопрос | Ответ | Где | |---|---|---| | Какая версия PHP? | 5.3.6: r25, `device` (устройство r25)[^1]; строка `PHP/5.3.6` есть в пяти сборках r22, r24, r25 (код r22, r24, r25)[^2] | §2 | | Разрядность целых? | r25, `device`: `PHP_INT_SIZE` = 4 (устройство r25)[^3] | §2 | | Какие расширения загружены? | tv188b r25, один прогон: 32 в `php_server` (устройство r25)[^4], те же и `cgi-fcgi` в CGI (устройство r25)[^5] | §2 | | Какой текущий каталог? | tv188b r25, один прогон: `php_server` — `/` (устройство r25)[^6], CGI зонда — `/data/data/com.dunehd.app/flashdata/plugins/kb_probe11/www/cgi-bin` (устройство r25)[^7] | §1.3 | | Кто исполняет код плагина? | `php_server`, по процессу на плагин, дочерний для `com.dunehd.app` (устройство)[^8] | §1.1 | | Какой uid? | `php_server` — 1000 (r25) (устройство r25)[^9], `system` (r24) (устройство r24)[^10]; CGI на r25 — root (устройство r25)[^11] | §1.3 | | Что такое `FS_PREFIX`? | r25: `/data/data/com.dunehd.app` (устройство r25)[^12] — корень, куда встроенный PHP отображает `/tmp`, `/config`, `/flashdata` (устройство r25)[^13] | §3.2 | | Куда писать постоянные данные? | `data_dir_path` (устройство r25)[^14]; онлайн-обновление его сохраняет (устройство r25)[^15] | §3.3 | | Куда писать временные? | `tmp_dir_path` (устройство r25)[^16] | §3.3 | | Что переживает `am force-stop`? | tv188b r25, один прогон: файлы в `tmp_dir_path`, `/tmp` и `data_dir_path` (устройство r25)[^17]; перезагрузка не проверялась | §3.3 | | Почему путь в команде не сработал? | r25: в `"…"` префикс не подставляется, в `'…'` подставляется (устройство r25)[^18] | §3.2 | | Как выполнить команду от root? | `/system/dunehd/dunehd_service do …`: r25 — uid 0 (устройство r25)[^19] | §3.5 | | Какой cURL? | r25: 7.67.0 с OpenSSL 1.0.1u (устройство r25)[^20]; части констант нет (устройство r25)[^21] | «HTTP из PHP плагина на r24 и r25» §3.6, §4.2 | | Какой CA-бандл? | `/firmware/certs/ca-bundle.crt` (устройство r25)[^22] данных Mozilla 2022 года (код r22, r24, r25)[^23] | «HTTP из PHP плагина на r24 и r25» §3.6 | | Есть ли `wget`? | r25: `$FS_PREFIX/bin/wget`, ссылка на BusyBox (устройство r25)[^24]; в одном прогоне вызов по имени к `/ping` — `ok` и `rc=0` (устройство r25)[^25], полным путём — `rc=126` (устройство r25)[^26] | «HTTP из PHP плагина на r24 и r25» §3.6 | | Куда идёт `hd_print`? | r25: `/tmp/run/<плагин>.log` (устройство r25)[^27], в этом же файле — fd 1 и 2 `php_server` (устройство r25)[^28] | §3.11 | | Где переменные окружения в `php_server`? | tv188b r25, один прогон: в `$_ENV` и `getenv()`; `$_SERVER` содержал только `REQUEST_TIME`, `argv` и `argc` (устройство r25)[^29] | §4.1 | | Есть ли `ffmpeg`? | tv188b r25, один прогон: `ffmpeg -version` без пути и `$FS_PREFIX/firmware/scripts/ffmpeg.sh -version` из `php_server` — `rc=0`, «ffmpeg version 7.1.3» (устройство r25)[^30] | §3.4 | | Почему `exec('/config/x.sh')` — `rc=127`? | tv188b r25, по одному прогону: путь первым словом `$FS_PREFIX` не получил (устройство r25)[^31], а `sh /config/x.sh` — получил (устройство r25)[^32] | §3.2 | | Сколько живёт PHP-вызов? | до тайм-аута операции: `handle_user_input` на r25 — 60 с по умолчанию (устройство r25)[^33], по тайм-ауту `php_server` убивается (устройство r25)[^34] | §3.9 | ## 1. Модель: где исполняется PHP плагина Код плагина работает в одном из нескольких процессов, и от процесса зависят uid, окружение и настройки PHP (устройство r25)[^35]. Основной — `php_server`: на r25 он живёт между вызовами оболочки (устройство r25)[^36] и исполняет `main.php` плагина (устройство r25)[^37]. CGI и отдельные скрипты идут в `php-cgi`: по коду r24 `php-cgi` связан с `libphp5.so` (код r24)[^38], но SAPI и настройки у него другие (§1.3). Shell-скрипты плагина — третий контекст, без PHP (устройство r25)[^39]. ### 1.1. `php_server`: PHP плагина На tv188b r24 и r25 наблюдались три `php_server` — по одному на плагин; все они — дочерние процессы `com.dunehd.app` (устройство)[^8]. Запускает его модуль `php_driver.cpp` оболочки (код r24): `/firmware/bin/php_server` (код r24)[^40]; на r25 это происходит при первом вызове плагина, а не при регистрации (устройство r25)[^41]. Формат аргументов — `php_server ` (код r24)[^42]; PHP встроен через `libphp5.so` (код r24)[^43]. На r25 с оболочкой он связан двумя каналами pipe (устройство r25)[^44], а других открытых дескрипторов, кроме `/dev/null` на fd 0 и лога на fd 1 и 2, у него нет (устройство r25)[^28]. При старте он загружает по порядку `bootstrap.php`, `dune_api.php`, `dune_plugin.php`, `dune_plugin_fw.php`, затем выполняет определение системных свойств, загружает `dune_config.php` и только потом программу плагина (устройство r25)[^37]. Поэтому к коду верхнего уровня `main.php` уже определены `DunePluginFw`, `DuneSystem`, `PLUGIN_OP_HANDLE_USER_INPUT` и `hd_print` (устройство r25)[^45], и подключать их самому не нужно. В логе системные файлы названы `/firmware_ext/php/<файл>`, исполняются как `/data/data/com.dunehd.app/firmware_ext/php/<файл>` (устройство r25)[^46], а `get_included_files()` показывает `/system/dunehd/firmware_ext/php/<файл>` (устройство r25)[^47]. `include_path` на r25 — `.:<каталог плагина>:/data/data/com.dunehd.app/firmware_ext/php/include` (устройство r25)[^48]; в строках `php_server` r24 есть шаблон `ini_set('include_path', '.:%s:%s');` (код r24)[^49]. Текущий каталог и значения `ini` на r25 — §1.3. Когда процесс перезапускается, что происходит со статическими переменными и что считается сбоем, — в «Операции плагина, тайм-ауты и `php_server`». Файла `system_properties.txt`, путь к которому `php_server` получает в аргументах, на r25 в `/tmp/plugins/<плагин>` нет: каталог пуст (устройство r25)[^50]; значения читайте из `DuneSystem::$properties`, а не из файла (§3.1). ### 1.2. `php-cgi`: CGI и отдельные PHP-скрипты CGI-скрипт плагина `run_plugin_cgi` запускает как shell-скрипт, а PHP-обработчик плагин должен вызвать сам (код r24)[^51]. Встроенный CGI `download_subtitle` — двухстрочная обёртка: дописать `.php` к `SCRIPT_FILENAME` и запустить `$FS_PREFIX/firmware_ext/php/php-cgi -c .` (код r24)[^52]. На r25 плагин с такой обёрткой исполняет свой `<имя>.php`: `getcwd()` — `www/cgi-bin`, `php.ini` — из того же каталога, `get_include_path()` — `.` (устройство r25)[^53]. По коду r24 `php-cgi` связан с `libphp5.so` и содержит лишь CGI-обвязку (код r24)[^38]. В r24 тот же `php-cgi` прошивка использует и как отдельный процесс без HTTP: `run_async_worker.sh` запускает им `async_worker.php` (код r24)[^54]. На r24 этот процесс работает от `system` (`u:r:system_app:s0`) с PPID 1 (устройство r24)[^55], тогда как CGI на r25 — от root (устройство r25)[^11]. Обёртки, переменные `PLUGIN_*`, свой `php.ini` и свой `php-cgi` в пакете — «Приёмы разработки плагинов Dune HD». **URL и запуск CGI по SDK.** По SDK встроенный HTTP-сервер отдаёт `$install_dir_path/www/*` по `http:///plugins//*` и исполняет CGI из `www/cgi-bin/*` по `http:///cgi-bin/plugins//*` (SDK)[^56]; на r25 это наблюдалось и для файла `www/index.txt` (устройство r25)[^57], и для CGI (устройство r25)[^58]. Страница `httpd` SDK — выдержка из `busybox/networking/httpd.c`, и не всё перечисленное в ней поддерживается текущими прошивками (SDK)[^59]; сказанное в ней — по SDK, на r24+ не подтверждено. По выдержке URL, начинающийся с `/cgi-bin/`, считается CGI-скриптом: сервер переходит в каталог скрипта и запускает его, установив `QUERY_STRING` и другие переменные (SDK)[^60], за описанием которых страница отсылает к спецификации NCSA (SDK)[^61]. На r25 текущий каталог CGI — `…/www/cgi-bin` плагина (устройство r25)[^62], а наблюдавшиеся переменные — в §4.1. В выдержке приведён запуск из rc-скрипта с uid=0 под пользователем `www` (`httpd -u www`), при uid `www` = 80 — `httpd -p 80 -u 80 …` (SDK)[^63]. Это пример из выдержки; на r25 CGI плагина работает под uid 0 (устройство r25)[^11], см. §6. **Сервисные плагины (по SDK, на r24+ не подтверждено).** Страница SDK описывает плагины-службы, к которым обращаются HTTP-запросом к `http://localhost` или `http://127.0.0.1` по пути `/cgi-bin/plugins/<имя_плагина>/do?cmd=…` (SDK)[^64]; см. также `dunehd_service` в §1.4. `mediainfo_service` (`2013_04_18`) получает длительность файла и делает скриншот (SDK)[^65]; `/D/some folder/file.avi` в его описании — пример UNIX-пути (SDK)[^66]. `3g_service` (`2013_05_20`) — SMS и 3G: команды (SDK)[^67], поля `status` (SDK)[^68]; фоновое 3G-подключение при каждой загрузке выключено (SDK)[^69], интернет проверяет через ping 8.8.8.8 (SDK)[^70], а при нём не поддерживаются приём и передача SMS (SDK)[^71]. `dvb_service` (`2013_04_28`) ставит системное время по DVB-каналу, но не одновременно с воспроизведением DVB-канала (SDK)[^72]; альтернатива — автозапуск скрипта `dvb_time` из `/config/boot` (SDK)[^73]. `file_service` (`2013_08_12`) знает `delete_file`, `get_info` и `read_text_file` (SDK)[^74]: директорию не удаляет (SDK)[^75], `get_info` возвращает `type`, `size`, `mtime` (SDK)[^76], текст идёт после строки `@data` (SDK)[^77], ошибка — `result = error` и `error_message` (SDK)[^78]. ### 1.3. Сравнение `php_server` и `php-cgi` на r25 Все строки таблицы — tv188b `261021_0117_r25`, `device`, кроме отмеченных. Строки `getcwd()`, «Расширения», `max_execution_time`, `memory_limit` и `magic_quotes_gpc` — один прогон запроса 11, зонд `kb_probe11`; значения `ini` — этого зонда, а не всех плагинов. Прогон подтвердил и строки uid, `php_sapi_name()`, `PHP_VERSION` (устройство r25)[^79], `include_path` (устройство r25)[^80]. В запросе 13 (зонд `kb_probe13`, один прогон) `php_server` снова дал `php_sapi_name()` = `hd`, `PHP_VERSION` 5.3.6, `getcwd()` = `/` и uid 1000 (устройство r25)[^81], а `php-cgi` (`/data/data/com.dunehd.app/firmware_ext/php/php-cgi`), запущенный busybox `httpd` для CGI зонда, — `cgi-fcgi` и uid 0 (устройство r25)[^82]. | Что | `php_server` | `php-cgi` из CGI плагина | Claim | |---|---|---|---| | Кто запускает | оболочка, родитель `com.dunehd.app` | `httpd` через `run_plugin_cgi` и обёртку плагина | (устройство r25)[^83] | | uid | 1000 (`system`) | 0 | (устройство r25)[^84] | | `getcwd()` | `/` | `/data/data/com.dunehd.app/flashdata/plugins/kb_probe11/www/cgi-bin` | (устройство r25)[^79] | | Расширения | 32, перечень — §2 | те же 32 и `cgi-fcgi` | (устройство r25)[^85] | | `max_execution_time` | 0 | 30 | (устройство r25)[^80] | | `memory_limit` | 128M | 128M | (устройство r25)[^80] | | `magic_quotes_gpc` | 1 | 0 | (устройство r25)[^80] | | SELinux-контекст | `u:r:system_app:s0` | `u:r:shell:s0` | (устройство r25)[^86] | | `php_sapi_name()` | `hd` | `cgi-fcgi` | (устройство r25)[^87] | | `PHP_VERSION`, разрядность | 5.3.6, 32 бита | то же | (устройство r25)[^88] | | `include_path` | `.`, каталог плагина, `firmware_ext/php/include` | `.` | (устройство r25)[^89] | | `date.timezone` | Europe/Moscow | пусто при `php.ini` без этого ключа, `date()` пишет Warning | (устройство r25)[^90] | | `PHP_PROC_OPEN_SH` | `$FS_PREFIX/bin/sh` | не задана | (устройство r25)[^91] | | Окружение процесса | своё, с `HOME`, `TMPDIR`, `PHP_PROC_OPEN_SH` и др. (запрос 13); переменные — в `$_ENV`, не в `$_SERVER` | то же, что у sh-CGI `httpd`; `HOME` и `TMPDIR` нет (запрос 13) | (устройство r25)[^92] | | Куда идут ошибки | `/tmp/run/<плагин>.log` | stderr обёрток — `$FS_PREFIX/tmp/dune_apk_cgi_err.log` (код r24) | (устройство r25, код r24)[^93] | | Подстановка `FS_PREFIX` | есть | есть | (устройство r25)[^94] | ### 1.4. Shell-скрипты плагина и `dunehd_service` Скрипт `plugin_system` из `global_action` на r25 работает под uid 1000 с контекстом `u:r:system_app:s0`, текущим каталогом `/` и `FS_PREFIX=/data/data/com.dunehd.app` (устройство r25)[^39]. Команды поставщика из стороннего плагина — тоже uid 1000 и каталог `/` (устройство r25)[^95]. Демон `dunehd_service` на r24 работает от root с контекстом `u:r:shell:s0` (устройство r24)[^96]; как им пользоваться, — §3.5. `httpd` на r24 и r25 — тоже root (устройство)[^97]. Сам процесс `com.dunehd.app` на r24 — `system` (устройство r24)[^98], и в его окружении нет `FS_PREFIX` и `PHP_PROC_OPEN_SH` (устройство r24)[^99]. ## 2. Версия PHP и модули Строка `PHP/5.3.6` есть в `libphp5.so` пяти исследованных сборок: tv188b r22, r24, r25, tv175u r24 и APK r24 (код r22, r24, r25)[^2]. На r25 `PHP_VERSION` = 5.3.6 подтверждён и в `php_server` (устройство r25)[^1], и в `php-cgi` (устройство r25)[^100]. В тех же сборках — OpenSSL 1.0.1u (код r22, r24, r25)[^101] и PCRE 8.11 (код r22, r24, r25)[^102]. Бинарные файлы при этом разные: r22 (`e7d22b70…`), r24 (`e28ffc74…`) и r25 (`4a31ef48…`), причём файл tv188b r24 совпадает с APK `260724_0207_r24` и tv175u `260724_0207_r24` (код r22, r24, r25)[^103]. На tv188b r25 в прогоне запроса 11 `php_server` зонда `kb_probe11` перечислил 32 загруженных расширения: `Core`, `date`, `ereg`, `libxml`, `openssl`, `pcre`, `sqlite3`, `zlib`, `ctype`, `curl`, `dom`, `fileinfo`, `filter`, `hash`, `iconv`, `json`, `mbstring`, `pcntl`, `SPL`, `PDO`, `posix`, `Reflection`, `session`, `SimpleXML`, `soap`, `sockets`, `standard`, `tokenizer`, `xml`, `xmlreader`, `xmlwriter`, `zip` (устройство r25)[^4]; CGI того же зонда — те же и `cgi-fcgi` (устройство r25)[^5]. О других прошивках — §7. Ниже — имена из `strings libphp5.so` пяти сборок (`code`): наличие имени значит «так собрано», а не «проверено вызовом». «Нет наблюдения» в столбце r25 — вызов не проверялся, хотя расширение группы есть в перечне выше (устройство r25)[^4]. | Группа | Имена в strings | Наблюдение на r25 | Claim | |---|---|---|---| | JSON | `json_encode`, `json_decode`, `json_last_error` | да, §4.2 | (устройство r25, код r22, r24, r25)[^104] | | cURL | `curl_init`, `curl_setopt`, `curl_setopt_array`, `curl_exec`, `curl_getinfo`, `curl_error`, `curl_errno`, `curl_close`, `curl_copy_handle`, `curl_version` | да, «HTTP из PHP плагина на r24 и r25» §3.6 | (устройство r25, код r22, r24, r25)[^105] | | cURL multi | `curl_multi_init`, `curl_multi_add_handle`, `curl_multi_exec`, `curl_multi_select`, `curl_multi_getcontent`, `curl_multi_info_read`, `curl_multi_remove_handle`, `curl_multi_close` | да, с падением, «HTTP из PHP плагина на r24 и r25» §3.6 | (устройство r25, код r22, r24, r25)[^106] | | mbstring | `mb_strlen`, `mb_substr`, `mb_convert_encoding`, `mb_detect_encoding`, `mb_check_encoding` | `mb_strlen` — да, таблица ниже | (устройство r25, код r22, r24, r25)[^107] | | iconv | `iconv_strlen`, `iconv_substr`, `iconv_mime_decode`, `iconv_get_encoding`, `iconv_set_encoding` | нет наблюдения | (код r22, r24, r25)[^108] | | PCRE | `preg_match`, `preg_match_all`, `preg_replace`, `preg_split`, `preg_last_error` | нет наблюдения | (код r22, r24, r25)[^109] | | OpenSSL | `openssl_encrypt`, `openssl_decrypt`, `openssl_sign`, `openssl_verify`, `openssl_random_pseudo_bytes` | `openssl_x509_parse` — да | (устройство r25, код r22, r24, r25)[^110] | | pcntl | `pcntl_fork`, `pcntl_waitpid`, `pcntl_signal`, `pcntl_signal_dispatch`, `pcntl_exec` | `pcntl_fork`, `pcntl_waitpid` — да, таблица ниже | (устройство r25, код r22, r24, r25)[^111] | | posix | `posix_getuid`, `posix_getpid`, `posix_kill`, `posix_setuid` | `posix_getuid`, `posix_kill` — да | (устройство r25, код r22, r24, r25)[^112] | | sockets | `socket_create`, `socket_connect`, `socket_select`, `socket_read`, `socket_write` | нет наблюдения | (код r22, r24, r25)[^113] | | XML | `simplexml_load_string`, `xml_parser_create`, `libxml_use_internal_errors` | нет наблюдения | (код r22, r24, r25)[^114] | | Классы | `DOMDocument`, `SoapClient`, `ZipArchive`, `SQLite3` | `DOMDocument`, `ZipArchive`, `SQLite3` — да, таблица ниже; `SoapClient` — нет наблюдения | (устройство r25, код r22, r24, r25)[^115] | | hash, сессии, zlib | `hash_hmac`, `hash_file`, `session_start`, `gzcompress`, `gzuncompress` | нет наблюдения | (код r22, r24, r25)[^116] | **Проверка вызовом (tv188b r25, `php_server` зонда `kb_probe11`, запрос 11, один прогон).** Результат относится к этому единственному вызову; другие методы тех же расширений он не проверяет. | Вызов | Результат | Claim | |---|---|---| | `mb_strlen` для двух букв UTF-8 | 2 | (устройство r25)[^117] | | `SQLite3(':memory:')->querySingle('SELECT 1')` | 1 | (устройство r25)[^118] | | `ZipArchive::open` с `CREATE` | true | (устройство r25)[^119] | | `DOMDocument::loadXML('')` | true | (устройство r25)[^120] | | `pcntl_fork`, в потомке `posix_kill(getmypid(), 9)`, в родителе `pcntl_waitpid` | потомок 22745; `pcntl_waitpid` вернул 22745, `status=9` | (устройство r25)[^121] | | `popen('echo kb11-popen', 'r')`, `pclose` | строка `kb11-popen`, `pclose` — 0 | (устройство r25)[^122] | | `proc_open` без `cwd` и `env` | `rc=0`, оболочка — §3.4; с `cwd` и `env` — §3.2 | (устройство r25)[^123] | `libphp5.so` тянет `libxml2.so.2`, `libcurl.so.5`, `libssl.so.1.0.0`, `libcrypto.so.1.0.0`, `libiconv.so.2`, `libz.so` (код r22, r24, r25)[^124]; `libiconv.so.2` не находит `php-cgi`, запущенный снаружи (устройство r25)[^125] (§3.11). **Целые и JSON (r25, `device`, `php_server` и `php-cgi`).** `PHP_INT_MAX` = 2147483647 (устройство r25)[^3]. Литерал 3000000000 в коде даёт integer 2147483647; `PHP_INT_MAX + 1` даёт 2147483648, а `time() * 1000` — 13-значное число без обрезки (устройство r25)[^126]. `json_decode()` целых вне 32 бит возвращает 2147483647 или −2147483648 при `json_last_error()` = 0 (устройство r25)[^127], а 12345678901234567890 — double (устройство r25)[^128]. Как плагины обходят потерю больших чисел, — §5. ## 3. Задачи ### 3.1. Узнать свои пути: `DuneSystem::$properties` и `FS_PREFIX` На r25 `DuneSystem::$properties` плагина из `flashdata` содержит 8 ключей: `sdk_version` `1.0.0`, `plugin_name`, `install_dir_path`, `tmp_dir_path`, `data_dir_path`, `plugin_www_url`, `plugin_cgi_url`, `few_buttons_remote_type` (устройство r25)[^129]. Значения путей уже с `FS_PREFIX` (устройство r25)[^130], а URL — с явным портом 80: `http://127.0.0.1:80/plugins/

/` и `http://127.0.0.1:80/cgi-bin/plugins/

/` (устройство r25)[^131]. Сверка с перечнем SDK — §4.4. По коду r24 сам префикс возвращает `HD::get_fs_prefix` из `FS_PREFIX`, пустую строку — если переменной нет; `HD::is_apk`, `is_fw_apk` и `get_apk_package_name` читают `HD_APK`, `HD_FW_APK` и `APK_PACKAGE_NAME` (код r24)[^132]. На tv188b r25 `FS_PREFIX` есть в `php_server` (устройство r25)[^12] и в `php-cgi` CGI (устройство r25)[^133]. На tv175u r24 скрипт `init` эту переменную не выставляет (код r24)[^134]. Поэтому брать путь из свойства или `HD::get_fs_prefix` надёжнее, чем зашивать `/data/data/com.dunehd.app`. В CGI обёртка передаёт `PLUGIN_NAME`, `PLUGIN_CGI_DIR` и `SCRIPT_FILENAME` (устройство r25)[^58]; как плагины достраивают остальное — «Приёмы разработки плагинов Dune HD». ### 3.2. Понять, что делает абсолютный путь: подстановка `FS_PREFIX` На r25 встроенный PHP переписывает абсолютные пути (устройство r25)[^135] и пути в команде `shell_exec` (устройство r25)[^18]. Поэтому один и тот же путь значит разное в PHP, в команде и в `adb shell`. **Что видно на r25 (`device`, `php_server` и `php-cgi`).** `realpath('/config')` = `/data/data/com.dunehd.app/config`, `realpath('/firmware')` = `/system/dunehd/firmware`, `realpath('/firmware_ext/php')` = `/system/dunehd/firmware_ext/php`, хотя в корне ФС из `adb shell` `/firmware` и `/firmware_ext` нет, а `/config` — другой каталог (устройство r25)[^135]. `is_dir('/flashdata')` = true при `realpath` `/data/data/com.dunehd.app/flashdata`, хотя в корне ФС его нет (устройство r25)[^136]. CA-бандл доступен и как `/firmware/certs/ca-bundle.crt`, и как `$FS_PREFIX/firmware/certs/ca-bundle.crt` (устройство r25)[^22]. **Файловые функции (код APK r24).** Префикс добавляется только к пути, начинающемуся с `/` (код r24)[^137]. Корни: всё, что начинается с `/tmp`, `/firmware`, `/config`, `/flashdata`, `/fconfig`, ровно `/system/dunehd/init` и `/D`, и ещё один образец по адресу `0x353448` (код r24)[^138]. Сравнение — по префиксу без границы каталога: подходят и `/firmware_ext/…`, `/tmpX`, `/config2/…` (код r24)[^139]. Для `/D` и второго образца после `FS_PREFIX` вставляется `/tmp/mnt` (код r24)[^140]. Без `FS_PREFIX` путь не меняется (код r24)[^141]. `_php_add_fs_prefix` вызывают 22 функции, среди них `_php_curl_setopt`, `simplexml_load_file`, `chdir`, `glob`, `readfile`, `rename`, `unlink`, `chmod`, `touch`, `php_stat`, `_php_stream_mkdir`, `_php_stream_opendir`, `_php_stream_open_wrapper_ex`, `zend_stream_open` (код r24)[^142]. Отдельно префикс учитывает `virtual_file_ex` (код r24)[^143], а её вызывает 21 функция, включая `tsrm_realpath`, `php_do_open_temporary_file` и `php_zip_extract_file` (код r24)[^144]. Две оговорки по коду APK r24: открытие потока с поиском по `include_path` идёт без `_php_add_fs_prefix` (код r24)[^145], а чтение `/sys/class/net/eth0/address` при заданной `HD_APK` подменяется на `/tmp/run/dune_mac.txt` (код r24)[^146]; значение `HD_APK` при этом не проверяется (код r24)[^147]. **Команды.** На r25 `shell_exec` добавляет `$FS_PREFIX` к словам `/tmp/…`, `/firmware/…`, `/config/…`, `/flashdata/…` и к пути в одинарных кавычках, но не к `/etc/…`, не к `x/tmp/f` и не к пути в двойных кавычках (устройство r25)[^18]. Этот дефект описан в BUG-012. По коду APK r24 `_php_add_fs_prefix_to_cmd` вызывают `php_exec`, `zif_shell_exec`, `zif_popen`, `zif_proc_open` и `virtual_popen` (код r24)[^148]; путь проверяется, только если перед `/` стоит пробел, `!`, `&`, апостроф, скобка, `;`, `<`, `>` или обратная кавычка (код r24)[^149]. Ещё два правила того же кода касаются первого слова команды. Слово, оканчивающееся на `/php-cgi`, заменяется на `$FS_PREFIX/firmware_ext/php/php-cgi` с добавлением `-c <исходный каталог>` (код r24)[^150]. Команда, начинающаяся с `$FS_PREFIX` или пути под корнем, не из `/firmware/bin/` и не из `/firmware_ext/php/`, получает спереди `sh ` (код r24)[^151]. **Первое слово команды в коде `libphp5.so` r25.** Если команда начинается с `/` и путь требует префикса, но не начинается с `/firmware/bin/` или `/firmware_ext/php/`, `_php_add_fs_prefix_to_cmd` ставит в начало результата `sh ` (код r25)[^152]. `$FS_PREFIX` к пути у `/` эта функция дописывает, только если байт перед `/` — пробел, `!`, `&`, апостроф, `(`, `)`, `;`, `<`, `>` или обратная кавычка; для `/` в первом символе команды проверяется байт перед началом строки (код r25)[^153]. Слово-путь после пробела (как `/config/…` в наблюдении `shell_exec` выше (устройство r25)[^18]) и путь первым словом команды проходят, таким образом, разные ветви одного кода. Вызывают ли эту функцию и `exec`, и `shell_exec`, и чем объясняется прогон ниже, — гипотезы в §7. **Первое слово, `cwd`, `env` и `include_path` на r25 (tv188b, `php_server`, запрос 11, один прогон).** `exec` команды `/config/kbp11_x.sh first-word` вернул `rc=127` и `sh: /config/kbp11_x.sh: No such file or directory`, а `file_get_contents` того же пути с `use_include_path=true` прочитал 49 байт (устройство r25)[^154]; гипотеза о причине — §7. `file_get_contents('lib/kbp11_steps.php', true)` прочитал 15678 байт (устройство r25)[^155]. `proc_open` с `cwd=/tmp` вернул `rc=0`, `pwd=/tmp` и увидел каталог `kb_probe11` (устройство r25)[^156]. `proc_open` с `env={KB11_E:one}` вернул `rc=0`, `KB11_E=one` и `PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:.` (устройство r25)[^157] — не тот `PATH`, что в снимке окружения `php_server` (§4.1) (устройство r25)[^158]. Какие из гипотез по коду APK r24 это проверяет и что осталось открытым, — §7. **Первое слово и слово после пробела в одном прогоне (tv188b r25, `php_server`, запрос 13, один прогон).** С `PHP_DEBUG=1` `exec("/config/kbp13_x.sh first-word 2>&1")` снова вернул `rc=127` и `sh: /config/kbp13_x.sh: No such file or directory`: путь первым словом `$FS_PREFIX` не получил (устройство r25)[^31]. В том же прогоне `exec("echo /config/kbp13_x.sh")` напечатал `/data/data/com.dunehd.app/config/kbp13_x.sh`, а `exec("sh /config/kbp13_x.sh after-sh")` запустил скрипт с `argv0` `/data/data/com.dunehd.app/config/kbp13_x.sh` — путь после пробела префикс получил (устройство r25)[^32]. `shell_exec("echo x; /config/kbp13_x.sh after-semicolon")` тоже выполнил скрипт по пути с `$FS_PREFIX` (устройство r25)[^159]; перед `/` там стоял пробел, поэтому прогон не различает, сработал `;` или пробел (устройство r25)[^159]. Практически: свой скрипт под `/config` запускайте как `sh /config/…`, а не путём первым словом (устройство r25)[^160]. Строк о замене команд этот прогон не проверял; почему, — §3.11 (устройство r25)[^161]. `libphp5.so` tv188b r24 совпадает с APK по sha256, а у r25 файл другой (код r22, r24, r25)[^103]. Перенос правил кода на r24 и r25 — в §7. ### 3.3. Выбрать, куда писать, и что переживёт перезапуск Значения — у плагинов из `flashdata` на tv188b r25, если не сказано иное. `php_server` работает как `system` (устройство r25)[^19]; этому же пользователю после регистрации плагина принадлежат `/tmp/plugins/

` и `plugins_data/

` (устройство r25)[^162]. | Что | Путь | Что с ним происходит | Claim | |---|---|---|---| | `install_dir_path` | `$FS_PREFIX/flashdata/plugins/

`; у встроенных каталог плагина — `$FS_PREFIX/firmware_ext/plugins/

` | файлы пакета; при замене плагина удаляются каталоги установки (код APK r24) | (устройство r25, код r24)[^163] | | `data_dir_path` | `$FS_PREFIX/flashdata/plugins_data/

`, в том числе у встроенных | постоянные данные; файлы и cookies пережили два онлайн-обновления | (устройство r25)[^164] | | `tmp_dir_path` | `$FS_PREFIX/tmp/plugins/

`, он же `/tmp/plugins/

` для PHP | существует уже после регистрации плагина | (устройство r25)[^165] | | Свой каталог в `/tmp` | например `/tmp/kb_probe5/props.txt` | зонд `php_server` записал туда файл | (устройство r25)[^27] | | Лог | `/tmp/run/

.log`, предел 3072000 байт | см. §3.11 | (устройство r25)[^166] | | pid | `/tmp/run/

.pid` | переписывается при каждом новом запуске `php_server` | (устройство r25)[^167] | | `/config` | для PHP — `$FS_PREFIX/config`, в `adb shell` `/config` — другой каталог | `boot`-скрипты — §13.1 | (устройство r25)[^135] | | Точки монтирования | `/tmp/mnt/network`, `smb`, `storage`, права `drwxrwxrwx system:system` | SMB-ресурсы — в `/tmp/mnt/smb/` | (устройство r25)[^168] | **Запись и `am force-stop` (tv188b r25, `php_server` зонда `kb_probe11`, запрос 11, один прогон).** Зонд создал и удалил файл `kbp11_w.tmp` в `/sdcard`, `/config`, `/tmp`, `tmp_dir_path` и `data_dir_path` (устройство r25)[^169]; `fopen` на запись `/data/data/com.dunehd.app/firmware/kbp11_w.tmp` вернул `failed to open stream: Read-only file system` (устройство r25)[^170]. Файлы по 5 байт в `tmp_dir_path`, `/tmp` и `data_dir_path` сохранились после `am force-stop` и запуска `com.dunehd.app` (pid 15016 → 22982) (устройство r25)[^17]. `/data/data/com.dunehd.app/tmp` в этом прогоне оказался символической ссылкой на `/tmp` (устройство r25)[^171]. Перезагрузка не проверялась — §7. `/tmp` на tv188b r24 — tmpfs, его монтирует `init` (код r24)[^172]. По коду APK в режиме `fw_apk` каталог `/tmp` заменяется ссылкой на системный `/tmp`, а `firmware` и `firmware_ext` — ссылками на `/system/dunehd/…` (код r24)[^173]. Флаги однократных действий в `/tmp/run` (код r24) (код r24)[^174] на r25 датированы моментом загрузки системы (устройство r25)[^175], а при следующих стартах приложения `boot` и `boot_end` не повторяются (устройство r25)[^176]. Перезапуск самого `php_server` на r25 обнуляет статические переменные (устройство r25)[^177], поэтому состояние, которое должно пережить его, держат в файле. По SDK `data_dir_path` может отсутствовать на устройствах без System Storage и Flash Memory Storage (SDK)[^178], а после каждой записи в постоянное хранилище нужен `sync` (SDK)[^179] (по SDK, на r24+ не подтверждено). Настройки и кэш в плагинах — §10, перенос данных на накопитель — §10.5, что сохраняется при обновлении — «Онлайн-обновление плагина». ### 3.4. Запустить внешнюю команду: `shell_exec`, `proc_open`, `PATH` На r25 `shell_exec` выполняет команду через `/system/bin/sh` (устройство r25)[^180]. `proc_open` по коду APK r24 берёт оболочку из `PHP_PROC_OPEN_SH`, а без неё — `/bin/sh` (код r24)[^181], и зовёт её как `sh -c <команда>` (код r24)[^182]. В `php_server` r25 эта переменная указывает на `$FS_PREFIX/bin/sh`, то есть на `libxxx_bash.so` (устройство r25)[^183], а в `php-cgi` CGI её нет (устройство r25)[^133]. В прогоне запроса 11 на tv188b r25 `proc_open` без `cwd` и `env` из `php_server` выполнил sh-команду с `rc=0`, и `readlink /proc/$$/exe` в ней показал `/system/bin/libxxx_bash.so` (устройство r25)[^123]. Какой интерпретатор получит `proc_open` в `php-cgi`, — см. §7. По коду APK r24 `cwd` у `proc_open` передаётся в `chdir()` как есть, без префикса (код r24)[^184]. Наблюдения r25 с `cwd` и `env` — §3.2. **`PATH`.** Во фрагменте окружения демонов и `php-cgi` он начинается с `$FS_PREFIX/firmware/bin:$FS_PREFIX/bin:/bin`: r25 — `httpd` и `network_manager` (устройство r25)[^185], r24 — `php-cgi` `shell_ext` (устройство r24)[^186]. В самом `com.dunehd.app` на r24 это не так: `PATH=/product/bin:…` без `$FS_PREFIX` (устройство r24)[^99]. В `php_server` r25 (прогон `kb_probe8`) `PATH` начинается так же, целиком он приведён в §4.1 (устройство r25)[^158]; из `php_server` r25 `which wget` находит `$FS_PREFIX/bin/wget` (устройство r25)[^12]. **`ffmpeg` (tv188b r25, `php_server`, запрос 13, один прогон).** Все три вызова — `FS_PREFIX=$FS_PREFIX sh $FS_PREFIX/firmware/scripts/ffmpeg.sh -version`, `sh $FS_PREFIX/firmware/scripts/ffmpeg.sh -version` без явного `FS_PREFIX` и `ffmpeg -version` без пути — вернули `rc=0` и «ffmpeg version 7.1.3» (устройство r25)[^30]. `$FS_PREFIX/firmware/bin/ffmpeg` — символическая ссылка на `/data/data/com.dunehd.app/lib/libxxx_ffmpeg.so`, а `firmware/scripts/ffmpeg.sh` — обычный файл 457 байт (устройство r25)[^187]. **Утилиты.** На r25 `/system/bin` содержит 46 файлов `libxxx_*.so` с правами `-rwxr-xr-x` (устройство r25)[^188]. `$FS_PREFIX/bin/httpd` и `$FS_PREFIX/bin/wget` — ссылки на BusyBox (устройство r25)[^189], в r24 это v1.35.0 (код r24)[^190]. В `bin` APK r24, среди прочего, — `sh`, `bash`, `tar` и 24 апплета BusyBox: `nohup`, `sed`, `awk`, `xargs`, `killall`, `date`, `ps`, `unzip`, `wget`, `tail` и другие (код r24)[^191]. ### 3.5. Выполнить команду от root: `dunehd_service do` На r25 из `php_server` (`uid=1000(system)`, `u:r:system_app:s0`) команда `shell_exec('/system/dunehd/dunehd_service do id')` выводит `uid=0(root)`, контекст `u:r:shell:s0` (устройство r25)[^19]. Клиент, демон, обёртка и файл окружения одинаковы в tv188b r22, r24 и r25 (код r22, r24, r25)[^192]. Код `shell_ext` r25 так удаляет пакеты: `system()` с `/system/dunehd/dunehd_service do LD_LIBRARY_PATH= pm uninstall '<пакет>'` (код r25)[^193]. В `launch_ext_app` r25 команда с таким началом идёт в ветку «run command», а `am start …` — в `apk_helper` (устройство r25)[^194]. **§3.6–§3.7. HTTP из PHP, cURL, CA-бандл, локальные URL, `lcreg`, `wget` — перенесены в «HTTP из PHP плагина на r24 и r25».** ### 3.8. Фон и отдельные процессы Долгий код не стоит держать в PHP-вызове: операция ограничена по времени (§3.9), а на r25 команды IP Control (устройство r25)[^195] и клавиши (устройство r25)[^196] ждут её конца (подробно — «Операции плагина, тайм-ауты и `php_server`»). Схема «запустить процесс, вернуть действие, читать файл по таймеру» и варианты плагинов — в §13.4, а демоны и автозапуск — в §13. Что показывает сама прошивка: - **Отдельный PHP-процесс.** `run_async_worker.sh` r24 делает `exec php-cgi -f <плагин>/async_worker.php`, вывод — в `$FS_PREFIX/tmp/plugins/<плагин>/error.log` (код r24)[^54]. С ним общаются файлами в `/tmp/plugins/<плагин>/async_worker`: `wake_flag`, `stop_flag`, `request.`, `response.` (код r24)[^197]. - **Форк из PHP.** Конструктор `HDHttpLoader` в `shell_ext` r25 создаёт пару UNIX-сокетов и делает `pcntl_fork` (код r25)[^198]. На уровне кода это пример, а не наблюдение; строка «exitting from forked child» есть и в `php_server` r24 (код r24)[^43]. Вызов `pcntl_fork` из `php_server` зонда на r25 — §2. - **Что видно в процессах r24.** `php-cgi` `async_worker` — `system`, PPID 1 (устройство r24)[^55]; демон стороннего `Dune_backup`, который его скрипт запускает через `dunehd_service do`, если этот файл есть (код)[^199], — root, `u:r:shell:s0`, PPID 1 (устройство r24)[^200]. **Фоновый процесс из `shell_exec` (tv188b r25, `php_server`, запрос 11, один прогон).** `shell_exec('sleep 61 >/dev/null 2>&1 &')` вернулся за 0.01 с; процесс `sleep` с `PPid=1` оставался после `kill` `php_server` и сохранял открытые pipe-дескрипторы 93 и 98 (устройство r25)[^201]. Шаг `bg2` того же запроса разобран в §7. **`shell_exec("sleep 61 &")` без перенаправления (tv188b r25, `php_server`, запрос 12, один прогон).** Перед шагом `bg2` шаг `noop` завершился в новом `php_server`, и выборка процессов не показала ни одного `sleep 61` (устройство r25)[^202]. Шаг `bg2` записал `begin` и метку перед `shell_exec("sleep 61 &")`, но записи возврата в отчёте нет, а `end bg2` за 75 с окна ожидания не появился (устройство r25)[^203]. Оболочка отменила `handle_user_input` по тайм-ауту 30.0 с, убила PHP-сервер и записала отмену через 30.333 с с сообщением «Превышено время операции» (устройство r25)[^204]. После окна ожидания выборка процессов не вывела ни `sleep 61`, ни его pipe- и socket-дескрипторов, а `php_server` зонда уже не найден (устройство r25)[^205]. Команда с перенаправлением в запросе 11 вернулась за 0.01 с (устройство r25)[^201], без перенаправления в запросе 12 возврат до отмены операции не записан (устройство r25)[^203]; это по одному прогону каждого вида, и почему возврата нет в отчёте, лог не показывает. **Тот же `bg2` со снимками процессов (tv188b r25, `php_server`, запрос 13, один прогон).** `php_server` 15502 записал метку перед `shell_exec("sleep 61 &")`, записи о возврате нет; через 30 с оболочка отменила `handle_user_input` по тайм-ауту, убила PHP-сервер и показала «Превышено время операции» — повтор запроса 12 (устройство r25)[^206]. Процесс `sleep 61` на 1, 5, 29, 32 и 45 с имел `PPid` 1, держал fd 1 на pipe, а также fd 101 (чтение) и 110 (запись) на pipe — те же номера, что в аргументах `php_server` «… 101 110» (устройство r25)[^207]. `php_server` исчез к 20:01:24 (отмена — в 20:01:22), а `sleep 61` оставался до 45 с и не был виден на 62 и 70 с: он пережил `php_server` и завершился сам, а не вместе с ним (устройство r25)[^208]. Почему `shell_exec` не вернулся, — гипотеза в §7. Вывод для плагина: фоновую команду из `shell_exec` запускайте с перенаправлением вывода, как в запросе 11, где `sleep 61 >/dev/null 2>&1 &` вернулся за 0.01 с (устройство r25)[^201]. Widget Ext запускает свои скрипты с перенаправлением вывода `> /dev/null &` (код)[^209], другие приёмы — §5. ### 3.9. Тайм-ауты и лимиты Срок операции считает оболочка; единицы и умолчания — в «Операции плагина, тайм-ауты и `php_server`». Здесь только то, что влияет на код в среде: на r25 `handle_user_input` без `operation_timeout` стартует с 60 с (устройство r25)[^33], а по истечении срока оболочка останавливает `php_server`, и код вызова не дорабатывает (устройство r25)[^34]. `bootstrap.php` (код r24) делает `set_time_limit(0)` (код r24)[^210]; файл одинаков в r22 и r24 (код r22, r24)[^211]. Лимит PHP, таким образом, снят, а `sleep(15)` при сроке 60 с дорабатывает (устройство r25)[^212]; в прогоне запроса 11 `max_execution_time` у `php_server` зонда — 0, у его CGI — 30 (§1.3) (устройство r25)[^80]. В CGI разобранных плагинов фреймворк не подключается (код)[^213], а обёртка передаёт `php-cgi` свой `php.ini` (устройство r25)[^53]: на r25 `php.ini` `shell_ext` — `date.timezone = UTC`, `display_errors = 0`, `log_errors = 1`, `error_log = /tmp/run/shell_ext_cgi.log` (код r25)[^214]. `memory_limit` в `shell_ext` задаёт код прошивки: `main_plugin.php` r24 ставит 300M, конструктор `MainPlugin` вызывает `gc_disable()` (код r24)[^215], `AsyncWorker` ставит 200M (код r24)[^216]; в r25 `Memory::check` поднимает лимит с 300 до 500 МБ шагами по 50 МБ (код r25)[^217]. У зонда `kb_probe11` на tv188b r25 в запросе 11 `memory_limit` — 128M и в `php_server`, и в CGI (устройство r25)[^80]; на других прошивках значение не проверялось — §7. Предел лога `php_server` — 3072000 байт (устройство r25)[^166]. ### 3.10. Время и часовой пояс В r24 `bootstrap.php` выставляет `date.timezone` из `date_default_timezone_get()` с комментарием «Use timezone from the environment (TZ)» (код r24)[^218]. На r25 в `php_server` это дало Europe/Moscow при `getenv('TZ')` = false, а `date()` — MSK +0300 (устройство r25)[^219]. В `php-cgi` без `date.timezone` в `php.ini` значение пусто, и `date()` пишет PHP Warning, хотя `date_default_timezone_get()` возвращает ту же Europe/Moscow (устройство r25)[^220]. В CGI поэтому пояс задают в `php.ini` или в коде: `php.ini` `shell_ext` r25 — UTC (код r25)[^214]. Метки времени в логах на r25 на 3 часа меньше местного времени (устройство r25)[^221] (BUG-017). `openssl_x509_parse()` даёт `validTo_time_t` = −1 для сроков позже 2038-01-19 03:14:07 UTC (устройство r25)[^222]. ### 3.11. Отладить: лог, `PHP_DEBUG`, запуск снаружи **Лог `php_server`.** По SDK лог плагина — `/tmp/run/.log` (SDK)[^223]; на r25 это `/data/data/com.dunehd.app/tmp/run/<плагин>.log`, предел 3072000 байт, в окружении `LOG_DIR=/tmp/run` (устройство r25)[^166]. Туда попадают `hd_print` с префиксом `[pid] [t] [время]` (устройство r25)[^27], ошибки PHP строкой `[<файл>:<строка>] [E_WARNING] …` (устройство r25)[^224] и этапы старта (устройство r25)[^37]. Оператор `@` запись не подавляет (устройство r25)[^225]. По коду r24 `hd_print` выводит через `echo` (код r24)[^226], а ошибки перехватывает обработчик `bootstrap.php` (код r24)[^227]; приглушают их `hd_silence_warnings()` и `hd_restore_warnings()` (код r24)[^228]. SDK советует `hd_print` вместо `echo`, `print` и `printf` (SDK)[^229] (по SDK, на r24+ не подтверждено). Приёмы логирования — §17.1. **Лог CGI.** По коду r24 stderr CGI-скриптов пишется в `$FS_PREFIX/tmp/dune_apk_cgi_err.log`, больше 10000 байт — в `.old` (код r24)[^230]; на r25 там видны `Segmentation fault` (устройство r25)[^231] и предупреждения линковщика `unable to normalize "./lib"` (устройство r25)[^232]. **`PHP_DEBUG`.** При заданной переменной изменённые команды печатаются в stdout как ` -C-> EEE orig command:` и ` -C-> EEE repl command:` (код r24)[^233], изменённые URL — как ` =H=> EEE orig http:` и ` =H=> EEE repl http:` (код r24)[^234] (код APK r24). В r24 tv188b печать URL тоже ограждена `PHP_DEBUG` (код r24)[^235]. В прогоне запроса 11 на tv188b r25 после `wget` с `putenv(PHP_DEBUG=1)` `grep EEE` по `/tmp/run/kb_probe11.log` не вывел строк, а успешный результат самого `wget` записан (устройство r25)[^236]; это наблюдение о логе, а не вывод, что печати нет (§7). В запросе 13 (tv188b r25, `php_server`, один прогон) с `PHP_DEBUG=1` печать URL в лог плагина дошла: после `curl_setopt(CURLOPT_URL, …)` там появились строки «=H=> EEE orig http» и «repl http» (устройство r25)[^237] (подробно — «HTTP из PHP плагина на r24 и r25» §3.6). После шага с командами `grep «=H=>»` не нашёл ни одной строки (устройство r25)[^161]; маркер команд — ` -C-> EEE`, а зонд искал только маркер HTTP, так что печать команд не проверена (устройство r25, код r24)[^238]. Флаги `/config/hd_debug/*` — в «Операции плагина, тайм-ауты и `php_server`». **Запуск снаружи.** `php-cgi` из `adb shell` на r25 не стартует: `CANNOT LINK EXECUTABLE`, нет `libiconv.so.2` при `LD_LIBRARY_PATH=$FS_PREFIX/lib:…` (устройство r25)[^125], а в другом зонде — нет `libphp5.so` (устройство r25)[^239]. В CGI он работает, и там `LD_LIBRARY_PATH=/data/data/com.dunehd.app/firmware/lib:/lib:/usr/lib` (устройство r25)[^240]. На r25 в этих опытах правка подключаемого файла подхватилась только после смены mtime `main.php` (устройство r25)[^241]. Отладка без устройства — §17.5. ### 3.12. Почему не работает: диагностическая таблица Всё в таблице — tv188b r25, `device`, кроме отмеченных. | Симптом | Причина или наблюдение | Что сделать | Claim | |---|---|---|---| | Путь работает в PHP, но не в `adb shell` | `/flashdata` и `/firmware` есть только для встроенного PHP | в `adb` писать `$FS_PREFIX/…` | (устройство r25)[^242] | | Команда не нашла файл по `"/tmp/x"` | в двойных кавычках префикс не подставляется | одинарные кавычки | (устройство r25)[^18] | | Большой id из JSON стал 2147483647 | 32-битные целые, ошибки при этом нет | переписать числа в строки до `json_decode` (§5) | (устройство r25)[^127] | | Не определена `JSON_UNESCAPED_UNICODE` или `CURLOPT_RESOLVE` | констант нет | §4.2 | (устройство r25)[^243] | | Правка `lib/*.php` не видна | `php_server` перезапускается по mtime `main.php` | `touch main.php` | (устройство r25)[^241] | | Нет `system_properties.txt` | файла нет при работающем `php_server` | `DuneSystem::$properties` | (устройство r25)[^50] | | `PHP_CALL_FAILED` и «Ошибка приложения» | `curl_multi` к `httpd` плеера; в запросе 12 — `curl_multi` к компьютеру, отчёт обрывается на метке перед `curl_multi_getcontent`; Fatal error или `exit(0)` в `handle_user_input`, в запросе 11 — E_ERROR от вызова несуществующего `HD::make_json_rpc_request`; `null` из `call_plugin` | «HTTP из PHP плагина на r24 и r25» §3.6; «Операции плагина, тайм-ауты и `php_server`» | (устройство r25)[^244] | | «Превышено время операции» после `shell_exec("sleep 61 &")` | запросы 12 и 13, по одному прогону: возврат `shell_exec` не записан, операция отменена по тайм-ауту 30 с; в запросе 13 `sleep` держал fd 1 на pipe и пережил `php_server` | §3.8: команда с перенаправлением `>/dev/null 2>&1 &` в запросе 11 вернулась за 0.01 с | (устройство r25)[^245] | | «Превышено время операции» | срок операции истёк, `php_server` остановлен | вынести работу в фон (§3.8) | (устройство r25)[^246] | | HTTPS: `errno 60` у `www.ssl.com` | цепочка заканчивается самоподписанным корнем: «self signed certificate in certificate chain» | BUG-001 | (устройство r25)[^247] | | HTTPS: `errno 35` у `kodikapi.com` | причина не установлена, отключение проверки не помогает | — | (устройство r25)[^248] | | `date()` в CGI пишет Warning | в `php.ini` нет `date.timezone` | задать ключ | (устройство r25)[^220] | | Время в логе расходится с `date()` на 3 часа | метки лога меньше местного времени | сравнивать с поправкой | (устройство r25)[^221] | | `$FS_PREFIX/bin/wget … \| head` пуст | причина не установлена; `wget` по имени в том же прогоне сработал | вызывать по имени | (устройство r25)[^249] | | `wget` полным путём или через `sh`: `rc=126`, `cannot execute binary file` | один прогон, причина не установлена; по имени в том же прогоне сработал | вызывать по имени | (устройство r25)[^250] | | `exec('/config/kbp11_x.sh …')`: `rc=127`, `No such file or directory` | запросы 11 и 13, по одному прогону: путь первым словом `$FS_PREFIX` не получил; `file_get_contents` того же пути с `use_include_path=true` файл прочитал; по коду r25 путь первым словом, которому нужен префикс, получает `sh `, а префикс зависит от байта перед строкой (§3.2), гипотеза о причине — §7 | `sh /config/…`: в запросе 13 путь после пробела префикс получил | (устройство r25, код r25)[^251] | | `fopen` на запись в `$FS_PREFIX/firmware/`: `Read-only file system` | один прогон; запись в каталоги §3.3 прошла | писать в `data_dir_path` или `tmp_dir_path` | (устройство r25)[^252] | | `php-cgi` из `adb`: `CANNOT LINK EXECUTABLE` | нет библиотек при запуске снаружи | запускать из CGI-обёртки | (устройство r25)[^253] | | Предупреждение в логе при `@mkdir` | `@` запись не подавляет | проверять наличие заранее | (устройство r25)[^225] | ## 4. Справочник ### 4.1. Переменные окружения **Окружение `php_server` на tv188b r25.** Значения одного прогона (плагин `kb_probe8`, pid 3005, ppid 2449, uid 1000), кроме отмеченного. Снимок относится только к `php_server`; для `php-cgi` и других прошивок — вторая таблица. | Переменная | Значение | Claim | |---|---|---| | `PATH` | `/data/data/com.dunehd.app/firmware/bin:/data/data/com.dunehd.app/bin:/bin:/product/bin:/apex/com.android.runtime/bin:/apex/com.android.art/bin:/system_ext/bin:/system/bin:/system/xbin:/odm/bin:/vendor/bin:/vendor/xbin` | (устройство r25)[^158] | | `HOME` | `/data/user/0/com.dunehd.app/app_vlc` | (устройство r25)[^254] | | `TMPDIR` | `/data/data/com.dunehd.app/tmp` | (устройство r25)[^255] | | `FS_BIN_PREFIX` | `/data/data/com.dunehd.app` | (устройство r25)[^256] | | `APK_PACKAGE_NAME` | `com.dunehd.app` | (устройство r25)[^257] | | `HD_APK` | `1` | (устройство r25)[^258] | | `HD_FW_APK` | `1` | (устройство r25)[^259] | | `HD_HTTP_LOCAL_PORT` | `80` | (устройство r25)[^260] | | `HD_DSSD_AMEM` | `0xecc5679c`; в прогоне `kb_probe5` (collect5) было `0x2e78afb7`: значение меняется между прогонами | (устройство r25)[^261] | | `HD_RMCL_DISABLE_CLOPTNS` | `1` | (устройство r25)[^262] | В прогоне запроса 11 (зонд `kb_probe11`) `/proc/self/environ` `php_server` содержал `PHP_PROC_OPEN_SH=/data/data/com.dunehd.app/bin/sh`, `FS_PREFIX=/data/data/com.dunehd.app`, `TMPDIR=/data/data/com.dunehd.app/tmp`, `FS_BIN_PREFIX=/data/data/com.dunehd.app` и `HD_HTTP_LOCAL_PORT=80` (устройство r25)[^263]. Куда ведёт `TMPDIR`, — §3.3. В прогоне запроса 13 (зонд `kb_probe13`) `/proc/self/environ` `php_server` содержал, кроме общих с CGI переменных, `HOME=/data/user/0/com.dunehd.app/app_vlc`, `TMPDIR=/data/data/com.dunehd.app/tmp`, `FS_BIN_PREFIX=/data/data/com.dunehd.app`, `APK_PACKAGE_NAME=com.dunehd.app`, `PHP_PROC_OPEN_SH=/data/data/com.dunehd.app/bin/sh`, `LOG_MAX_FILE_SIZE=3072000` и `HD_RMCL_DISABLE_CLOPTNS=1` (устройство r25)[^264]. Читать их из PHP нужно через `$_ENV` или `getenv()`: `$_SERVER` в `php_server` содержал только `REQUEST_TIME`, `argv` и `argc`, а `$_ENV` совпал с `/proc/self/environ` (устройство r25)[^29]. `HD_DSSD_AMEM` по коду r24 читает `client_authenticate` в `dunehd_service`: при отсутствии переменной берётся `get_default_env` (код r24, r25)[^265]. **Значения по процессам и прошивкам.** Для каждой строки указан процесс, где значение наблюдалось; значения `php_server` r25 — в снимке выше. «sh-CGI r25» — вывод `env` sh-скрипта `env.sh` плагина `kb_probe5`, запущенного busybox `httpd` как CGI (uid 0): это окружение CGI-оболочки, а не самого процесса `php-cgi` (устройство r25)[^266]. В нём нет `HOME`, `TMPDIR`, `FS_BIN_PREFIX`, `APK_PACKAGE_NAME`, `PHP_PROC_OPEN_SH`, `HD_DSSD_AMEM` и `HD_RMCL_DISABLE_CLOPTNS`, которые были в окружении `php_server` `kb_probe8` (устройство r25)[^267]. Окружение самого `php-cgi` снято в запросе 13 (зонд `kb_probe13`, один прогон): набор имён в `/proc/self/environ` `php-cgi` совпал с набором в `env` sh-обёртки того же CGI-запроса, различие — только в значении `_` (устройство r25)[^268]. В нём были `FS_PREFIX`, `HD_HTTP_LOCAL_PORT=80`, `LD_LIBRARY_PATH`, `PATH`, `LOG_DIR`, `HD_APK`, `PLUGIN_NAME`, `PLUGIN_CGI_DIR` и `DUNEHD_SERVICE_DONT_FORK`, а `getenv(HOME)` и `getenv(TMPDIR)` вернули false (устройство r25)[^82]. Поэтому строки «sh-CGI r25» в этом прогоне относятся и к `php-cgi` (устройство r25)[^268]. | Переменная | Значение | Где | Claim | |---|---|---|---| | `FS_PREFIX` | `/data/data/com.dunehd.app` | r25: `php_server`, `php-cgi` CGI, sh-CGI, `plugin_system`, команды поставщика; r24: `php-cgi` `async_worker`, демоны | (устройство)[^269] | | `HD_APK`, `HD_FW_APK` | `1` | r25: `httpd`, `network_manager`, sh-CGI; r24: `php-cgi` `async_worker`; APK r24 — только `HD_APK` (код); tv175u r24 `init` их не выставляет (код) | (устройство, код r24)[^270] | | `HD_HTTP_LOCAL_PORT` | `80`; APK r24 — `11080` (код) | r25: `php_server`, sh-CGI, `php-cgi` CGI (запрос 13); r24: `php-cgi` `async_worker` | (устройство, код r24)[^271] | | `PATH` | начинается с `$FS_PREFIX/firmware/bin:$FS_PREFIX/bin:/bin` | r25: `httpd`, `network_manager`, sh-CGI; r24: `php-cgi` `async_worker`; `php_server` r25 — снимок выше, с тем же началом, что в sh-CGI | (устройство)[^272] | | `LD_LIBRARY_PATH` | `$FS_PREFIX/firmware/lib:/lib:/usr/lib` | r25: `php-cgi` CGI, sh-CGI; r24: `php-cgi` `async_worker` | (устройство)[^273] | | `PHP_PROC_OPEN_SH` | `$FS_PREFIX/bin/sh` (`libxxx_bash.so`) | r25: `php_server`, нет в `php-cgi` CGI; r24: `php-cgi` `async_worker` | (устройство)[^274] | | `DUNEHD_SERVICE_DONT_FORK` | `1` | r25: sh-CGI | (устройство r25)[^275] | | `LOG_DIR`, `LOG_MAX_FILE_SIZE` | `/tmp/run`, `3072000` | r25: `php_server`; `LOG_DIR` — ещё и sh-CGI; r24: `php-cgi` `async_worker` | (устройство)[^276] | | `TMPDIR` | `$FS_PREFIX/tmp` | r25: `php_server`; в `php-cgi` CGI r25 `getenv` = false; r24: `php-cgi` `async_worker` | (устройство)[^277] | | `HOME` | `/data/user/0/com.dunehd.app/app_vlc` | r25: `php_server`; в `php-cgi` CGI r25 `getenv` = false; r24: `php-cgi` `async_worker` | (устройство)[^277] | | `FS_BIN_PREFIX`, `APK_PACKAGE_NAME` | `/data/data/com.dunehd.app`, `com.dunehd.app` | r24: `php-cgi` `async_worker` | (устройство r24)[^186] | | `HD_DSSD_AMEM`, `HD_RMCL_DISABLE_CLOPTNS` | `0x0744a101`, `1` | r24: `php-cgi` `async_worker` | (устройство r24)[^278] | | `TZ` | нет (`getenv` = false) | r25: `php_server` | (устройство r25)[^219] | | `PLUGIN_NAME`, `PLUGIN_CGI_DIR`, `SCRIPT_FILENAME` | имя и реальные пути `www/cgi-bin` | r25: CGI | (устройство r25)[^58] | | `SERVER_SOFTWARE`, `GATEWAY_INTERFACE` | `busybox httpd/1.35.0`, `CGI/1.1` | r25: CGI | (устройство r25)[^279] | | `PHP_DEBUG` | включает печать подстановок (код) | APK r24; URL также tv188b r24 | (код r24)[^280] | ### 4.2. Что есть и чего нет в PHP r25 Загруженные расширения и проверка вызовами — §2. Константы проверены зондом на tv188b r25 в `php_server` и `php-cgi`, `device`. На других прошивках имена констант `CURLOPT_*` в strings те же (код r22, r24, r25)[^281], но определены ли они — см. §7. | Что | Определено | Не определено | Claim | |---|---|---|---| | JSON | `JSON_NUMERIC_CHECK` (32), `JSON_HEX_TAG` (1), `JSON_FORCE_OBJECT` (16), `JSON_ERROR_UTF8` (5) | `JSON_BIGINT_AS_STRING`, `JSON_UNESCAPED_UNICODE`, `JSON_UNESCAPED_SLASHES`, `JSON_PRETTY_PRINT` | (устройство r25)[^282] | | cURL | `CURLOPT_ENCODING` (10102), `CURLOPT_SSLVERSION`, `CURLOPT_CAINFO`, `CURLOPT_TIMEOUT_MS`, `CURLOPT_CONNECTTIMEOUT_MS`, `CURLOPT_NOSIGNAL`, `CURLOPT_IPRESOLVE` | `CURLOPT_ACCEPT_ENCODING`, `CURLOPT_RESOLVE`, `CURL_SSLVERSION_TLSv1_2`, `CURLOPT_SSL_VERIFYSTATUS`, `CURLOPT_TCP_KEEPALIVE`, `CURLMOPT_PIPELINING`, `CURLMOPT_MAXCONNECTS` | (устройство r25)[^21] | ### 4.3. Различия r22, r24 и r25 Только то, для чего есть claims о каждой версии. Если версии в строке нет, значит, о ней claims нет. | Что | r22 | r24 | r25 | Claim | |---|---|---|---|---| | Файл `libphp5.so` | `e7d22b70…` | `e28ffc74…` | `4a31ef48…` | (код r22, r24, r25)[^103] | | Строка версии PHP, OpenSSL, PCRE | 5.3.6, 1.0.1u, 8.11 | то же | то же | (код r22, r24, r25)[^283] | | CA-бандл | тот же файл | тот же файл | тот же файл | (код r22, r24, r25)[^284] | | Помощник URL в `libphp5.so` | имя `_php_add_http_port` | `_php_add_http_port` | `_php_add_fs_prefix_to_http` | (код r22, r24, r25)[^285] | | `lcreg` в HTTP-помощнике | — | нет | есть | (код)[^286] | | `opensocket` в `curl_exec` | — | — | есть | (код r25)[^287] | | Запись `/tmp/run/%s.pid` в `php_server` | — | строки нет | строка есть | (код r25)[^288] | | `dunelib/utils.php` и др. | только `dune_countries.php` | `config_utils`, `dune_languages`, `expr`, `utils` | — | (код r22, r24)[^289] | | `bootstrap.php`, `dune_config.php`, `dune_plugin.php` | одинаковы с r24 | одинаковы с r22 | — | (код r22, r24)[^211] | | `dune_api.php`, `dune_plugin_fw.php` | 119788 и 6211 байт | 127635 и 6653 байт | — | (код r22, r24)[^290] | | Запуск `$FS_PREFIX/config/boot` | цикл прямо в `init` | через `binit.sh` | — | (код)[^291] | | `dunehd_service` (клиент, ELF, обёртка, `.env`) | одинаково | одинаково | одинаково | (код r22, r24, r25)[^192] | | `php.ini` `shell_ext`: `error_reporting` | — | без `E_WARNING` | `E_WARNING` включён | (код)[^292] | | По тайм-ауту (r25 — наблюдение, r24 — код) | — | флаг отмены | остановка `php_server` | (устройство r25, код r24)[^293]; см. «Операции плагина, тайм-ауты и `php_server`» | Sigma и прошивки ниже r22 — короткая справка: SDK для Sigma называет `tail -F` лога через telnet (SDK)[^223]; вложенные в плагины сборки curl под другие платформы — §9.1. ### 4.4. Ключи `DuneSystem::$properties`: SDK и r25 Столбец «По SDK» — страница SDK без указания версии прошивки (по SDK, на r24+ не подтверждено). Столбец «На r25» — tv188b `261021_0117_r25`, `device`, плагин `kb_probe5` из `flashdata`. Куда писать и что сохраняется, — §3.3. | Ключ | По SDK | На r25 | Claim | |---|---|---|---| | `plugin_name` | в перечне из шести ключей | `kb_probe5` | (устройство r25, SDK)[^294] | | `install_dir_path` | в перечне; от него отсчитываются `www/*` и `www/cgi-bin/*` | `/data/data/com.dunehd.app/flashdata/plugins/kb_probe5` | (устройство r25, SDK)[^295] | | `tmp_dir_path` | в перечне; каталог под `/tmp` для временных данных, Dune GUI гарантирует, что он существует | `/data/data/com.dunehd.app/tmp/plugins/kb_probe5`; пустой каталог есть уже после регистрации плагина | (устройство r25, SDK)[^296] | | `data_dir_path` | в перечне; постоянные данные; на устройствах без System Storage и Flash Memory Storage ключ не задан; после каждой записи — `sync` | `/data/data/com.dunehd.app/flashdata/plugins_data/kb_probe5` | (устройство r25, SDK)[^297] | | `plugin_www_url` | в перечне | `http://127.0.0.1:80/plugins/kb_probe5/` | (устройство r25, SDK)[^298] | | `plugin_cgi_url` | в перечне | `http://127.0.0.1:80/cgi-bin/plugins/kb_probe5/` | (устройство r25, SDK)[^298] | | `sdk_version` | не в перечне | `1.0.0` | (устройство r25, SDK)[^294] | | `few_buttons_remote_type` | не в перечне | `0` | (устройство r25, SDK)[^294] | ## 5. Как это делают плагины Платформа исполнения большинства разобранных плагинов не установлена; приём ниже — то, как написан код, а не гарантия работы на r24+. **Большие числа в JSON.** Клиент TorrServer r25 перед `json_decode` заменяет значения от 10 цифр на строки (код r25)[^299]; RemTor при `hack_big_int` переписывает все целые значения (код)[^300], Torrent Center — значения после части ключей (код)[^301]. Приём — §9.4. **Фон.** Widget Ext запускает скрипты через `shell_exec("<путь> > /dev/null &")` (код)[^209]; Torrent Center — вложенный `php-cgi -f www/cgi-bin/run.php` через `HD::asyncExec` (код)[^302]; ProIPTV — отдельный PHP-процесс через `shell_exec` с логом (код)[^303]. **Root.** rclone на Android идёт через `/system/dunehd/dunehd_service do` и передаёт результат JSON-файлом `exec_log` (код)[^304]; Dune BackUp запускает демон так же, если этот файл есть (код)[^199]. **Часовой пояс.** GlobalTV ставит `date_default_timezone_set("UTC")`, а смещение берёт из `date +%z` (код)[^305]; копия фреймворка MegaAnime ставит UTC и через `ini_set` (код)[^306]. **`set_time_limit`.** Anidub.Com и `folder_cache` вызывают `set_time_limit(0)` (код)[^307]; `m3u.class.php` remote-control — наоборот, `set_time_limit(15)` (код)[^308]. **Пути.** Widget Ext смешивает пути с `$FS_PREFIX` и без него: в `boot.sh` и в PHP-части — без, в остальных скриптах — с ним (код)[^309]. Lampa bridge в CGI-обёртке задаёт `FS_PREFIX` по умолчанию `/data/data/com.dunehd.app` и дополняет `LD_LIBRARY_PATH` (код)[^310]; по сообщениям автора в комментариях (`forum`), `run_plugin_cgi` вызывает файл через `sh` и на Android 11 (форум)[^311], а код заявлен совместимым с PHP 5.3 (форум)[^312]. **Вывод.** Контроллер Kohana-канала перед возвратом результата делает `echo` имени операции (код)[^313]: на r25 fd 1 `php_server` ведёт в его лог (устройство r25)[^28]. Служебный Cleanup ищет потомков процесса по общим pipe-дескрипторам в `/proc//fd` и по PPID (код)[^314]. ## 6. Расхождения - **uid CGI: выдержка SDK и r25.** В выдержке SDK `httpd` запускается из rc-скрипта с uid=0 под пользователем `www` (`httpd -u www`; при uid `www` = 80 — `httpd -p 80 -u 80 …`) (SDK)[^63], с оговоркой, что не всё из неё поддерживается прошивками (SDK)[^59]. На r25 `httpd` запущен как `$FS_PREFIX/bin/httpd -h …` и работает от root (устройство r25)[^315], CGI плагина — uid 0 (устройство r25)[^11]. `conflicts_with` нет. - **«PHP на Dune требует явной таймзоны».** Так сказано в комментариях `HD::format_timestamp` (код r24)[^316] и библиотеки GlobalTV (код)[^317]. На r25 `php_server` без `TZ` даёт Europe/Moscow и MSK (устройство r25)[^219], а `php-cgi` с той же Europe/Moscow пишет Warning (устройство r25)[^220]. Связь между комментариями и наблюдениями — `related`, `conflicts_with` нет. - **`/flashdata` из SDK.** SDK даёт команды `adb push` в `/flashdata/plugins/` (SDK)[^318], а на r25 в корне ФС этого каталога нет (устройство r25)[^319]; стороны связаны `conflicts_with`, см. BUG-010. - **Тайм-ауты и судьба процесса.** Умолчание 10 с в SDK (SDK)[^320] против 60 с на r25 (устройство r25)[^33]; остановка `php_server` на r25 (устройство r25)[^34] и код r24 — «Операции плагина, тайм-ауты и `php_server`». - **`PHP_PROC_OPEN_SH` и `php-cgi`.** На r24 переменная есть у `php-cgi` `async_worker` (устройство r24)[^186], на r25 её нет у `php-cgi` из CGI (устройство r25)[^133]. Сравниваются разные прошивки и разные способы запуска; поведение каждого случая на другой прошивке не проверено. - **`/config/…` в команде на tv188b r25.** `shell_exec` добавляет `$FS_PREFIX` к словам `/config/…` (устройство r25)[^18], а `exec` с таким путём первым словом вернул `rc=127` и сообщение с путём без префикса (устройство r25)[^154]. По коду r25 путь первым словом и слово после пробела проходят разные ветви `_php_add_fs_prefix_to_cmd` (код r25)[^321] (§3.2); стороны связаны как `related`, `conflicts_with` нет. В запросе 13 обе стороны наблюдались в одном прогоне одной функцией `exec`: путь первым словом префикс не получил (устройство r25)[^31], путь после пробела — получил (устройство r25)[^32]. Объяснение различия позицией слова — гипотеза, §7. ## 7. Не проверено Гипотезы (`inference`) и `disputed`; кандидаты на проверку на устройстве. Гипотезы о жизни `php_server` и операциях — «Операции плагина, тайм-ауты и `php_server`», о CA-бандле — «Реестр ошибок прошивки и SDK» и «HTTP из PHP плагина на r24 и r25» §7. | Утверждение | Статус | Claim | |---|---|---| | В запросе 11 после `kill` `php_server` и запуска шага `bg2` операция `handle_user_input` отменена через 30.0 с с `operation timed out`; `step_bg2.txt` не появился, в `steps.txt` нет `begin bg2`. Верификатор: тайм-аут 30 с без `end` повторился в чистом запросе 12 (§3.8), а отсутствие `begin bg2` — только условия запроса 11, где от `bg1` ещё жил `sleep` | device, disputed | (устройство r25)[^322] | | `shell_exec("sleep 61 &")` в `php_server` не возвращается, вероятно, потому что фоновый `sleep` наследует pipe stdout (fd 1) и держит его открытым до конца, а `shell_exec` ждёт EOF; fd 101/110 `php_server` перед `exec` тоже не закрываются (наблюдения — §3.8) | inference | (вывод r25)[^323] | | В r25 `_php_add_fs_prefix_to_cmd` вызывается из `php_exec` (`exec`, `system`, `passthru`), `zif_shell_exec`, `zif_popen`, `zif_proc_open` и `virtual_popen`, то есть `exec` и `shell_exec` переписывают команду одной функцией (только перекрёстные ссылки r2) | inference | (вывод r25)[^324] | | `rc=127` у `exec("/config/kbp11_x.sh first-word")` в запросе 11 согласуется с тем, что путь стоит первым словом: функция добавила `sh `, но `$FS_PREFIX` к первому слову не дописала (байт перед строкой не разделитель); в `shell_exec` запроса 6 `/config/c` стоял после пробела и префикс получил. Различие — по позиции слова, а не по функции. В запросе 13 оба случая повторились в одном прогоне `exec` (§3.2) | inference, verified | (вывод r25)[^325] | | Подстановка путей и команд на tv188b r24 работает как в APK: тот же `libphp5.so`, `FS_PREFIX` задан | inference | (вывод r24)[^326] | | На tv175u r24 `libphp5.so` пути и команды не переписывает: `FS_PREFIX` пуст | inference | (вывод r24)[^327] | | В APK файловые функции для `/tmp/…`, `/config/…`, `/flashdata/…`, `/fconfig/…`, `/firmware…` работают с `$FS_PREFIX/…` | inference | (вывод r24)[^328] | | В APK вторая строка-образец — `/D/`, то есть `/D/x` превращается в `$FS_PREFIX/tmp/mnt/D/x` | inference | (вывод r24)[^329] | | В APK подстановке в командах подвержены `exec`, `system`, `passthru`, `shell_exec`, `popen`, `proc_open` | inference | (вывод r24)[^330] | | Программа плагина, запущенная по абсолютному пути вне `/firmware/bin/` и `/firmware_ext/php/`, в APK запускается через `sh`; связаны ли с этим пустой вывод `$FS_PREFIX/bin/wget` (устройство r25)[^331] и `rc=126` при вызове полным путём и через `sh` на r25 (устройство r25)[^26], claims не говорят | inference | (вывод r24)[^332] | | В APK путь первым словом команды (`/config/x.sh`) проверяет байт перед началом строки. В коде r25 то же сказано в (код r25)[^153] (§3.2); на r25 `exec` с таким путём дал `rc=127` (устройство r25)[^154]; трассы подстановки и памяти перед строкой нет, APK и r24 не проверялись | inference | (вывод r24)[^333] | | В APK `proc_open` с `$cwd` вида `/tmp/…` переходит в системный каталог, а не в `$FS_PREFIX/…`. На r25 `cwd=/tmp` дал `pwd=/tmp` (устройство r25)[^156], но `$FS_PREFIX/tmp` там же — ссылка на `/tmp` (устройство r25)[^171]: маршрут `cwd` не различён; для этого нужен каталог вроде `/config`, APK и r24 не проверялись | inference | (вывод r24)[^334] | | В APK `proc_open` с массивом `$env` теряет `FS_PREFIX`, `PATH`, `LD_LIBRARY_PATH`. На r25 зонд вывел только `KB11_E` и `PATH` (устройство r25)[^157]: остальные переменные не проверены, APK и r24 тоже | inference | (вывод r24)[^335] | | В APK `realpath`, `include`, `tempnam`, `tmpfile` получают `FS_PREFIX` перед разрешением пути | inference | (вывод r24)[^336] | | В APK `chdir`, `glob`, `readfile`, `rename`, `unlink`, `chmod`, `touch` и другие применяют подстановку | inference | (вывод r24)[^337] | | `/sys/class/net/eth0/address` в APK даёт содержимое `dune_mac.txt`, а не MAC интерфейса | inference | (вывод r24)[^338] | | В APK поток с поиском по `include_path` обходит подстановку: `file_get_contents($f, true)` даёт другой результат. На r25 такие чтения вернули 49 и 15678 байт (устройство r25)[^339]; это не показывает, каким путём шло разрешение, APK и r24 не проверялись | inference | (вывод r24)[^340] | | На tv188b r24 окружение `php_server` не снято: наличие в нём `FS_PREFIX`, `HD_APK`, `HD_FW_APK`, `LOG_DIR`, `TMPDIR`, `PHP_PROC_OPEN_SH` не установлено | inference | (вывод r24)[^341] | | В APK `php_server` наследует окружение процесса оболочки | inference | (вывод r24)[^342] | | На tv188b r24 `php_server` исполняет вызов как PHP-код `$in = <</plugins_data/` (на r25 — §3.3) | inference, disputed | (вывод r24, r25)[^346] | | На r24 `tmp_dir_path` — `$FS_PREFIX/tmp/plugins/` (на r25 — §3.3) | inference, disputed | (вывод r24, r25)[^347] | | На tv188b r24 установщик заменяет нерабочие бинарники плагина (`bin/php-cgi`) ссылками на `/firmware/bin` | inference, disputed | (вывод r24)[^348] | | На tv188b r25 `run_plugin_cgi` запускается с `$0` — именем файла CGI из каталога с именем плагина | inference | (вывод r25)[^349] | | В плагине zlostnyi-iptv вызов по ссылке на месте вызова в PHP 5.3 — лишь deprecated, поэтому такой код плагина работает на r25 | inference | (вывод)[^350] | | В плагине dunemdb-supplier-movies-rus запущенный из описателя поставщика `php-cgi` без `-c` не обязательно читает `bin/php.ini` | inference | (вывод)[^351] | В базе нет данных о следующем: - полный список расширений (`get_loaded_extensions()`) и значения `ini_get`, включая `memory_limit`, на r24 и на устройствах, кроме tv188b r25 (там — один прогон, §2 и §1.3); наличие функций `mcrypt_*` (в перечне §2 `mcrypt` нет (устройство r25)[^4]; строка `mcrypt` в `libphp5.so` пяти сборок входит в перечень авторов расширений (код r22, r24, r25)[^352]); - вызовы вне таблицы §2: остальные `mb_*`, `SQLite3` с файлом, распаковка `ZipArchive`; эти же вызовы в `php-cgi` и на других прошивках; какой интерпретатор получает `proc_open` в `php-cgi` r25, где `PHP_PROC_OPEN_SH` нет (устройство r25)[^133]; - окружение и uid `php_server` на r22; полный снимок окружения `php_server` r25 у других плагинов и назначение `HD_RMCL_DISABLE_CLOPTNS`; - `HTTP_HOST` и порт при `curl_setopt(CURLOPT_URL)` и `curl_init($url)` из `php-cgi` в CGI плагина (запрос 13 проверил их из `php_server`, «HTTP из PHP плагина на r24 и r25» §3.6); процесс без `HD_HTTP_LOCAL_PORT` и порт не 80; что делает `_php_apply_lcreg_to_http` при таких входах; окружение `php-cgi` вне CGI-запроса и на других прошивках (§4.1 — один прогон запроса 13); - работают ли на r24+ сервисные плагины из страницы SDK (§1.2), какие у них uid и окружение; код `shell_ext` r24 ставит и обновляет «сервисные плагины» (код r24)[^353], но те ли это службы, claims не говорят; - можно ли из `php_server` писать в `/tmp/mnt/storage`; запись в `/sdcard` и `/config` на других прошивках; что происходит с файлами `tmp_dir_path`, `/tmp` и `data_dir_path` при перезагрузке (прогон запроса 11 проверил только `am force-stop`, §3.3); - почему `shell_exec("sleep 61 &")` не возвращается (гипотеза о наследованном stdout — в таблице выше; снимки запроса 13 — §3.8): возвращается ли он без наследования fd 1 при оставленных fd 101/110, и не мешает ли фоновый процесс с этими дескрипторами следующему `php_server`; - печатает ли `PHP_DEBUG=1` строки ` -C-> EEE` о замене команд в лог плагина (печать URL в запросе 13 дошла, §3.11); работает ли `lcreg` на устройстве и действует ли при отсутствии `lcreg.txt` (устройство r25)[^354] ветка ошибки чтения из кода (код r25)[^355]; - какое поле читает `zif_curl_multi_getcontent` в точке падения (сигнал и кадр сбоя сняты в запросе 13, «HTTP из PHP плагина на r24 и r25» §3.6); `curl_multi` к внешним хостам на r25 и на других прошивках; что делает `_php_curl_opensocket_remote`; определены ли константы §4.2 на r24 и r22. [^1]: fw-tv188b-261021-0117-r25--libphp5.c002 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В зонде kb_probe5 на tv188b 261021_0117_r25 значение PHP_VERSION равно 5.3.6. [^2]: fw-tv188b-261021-0117-r25--libphp5.c001 · code · android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24, 1.0.1-1000-260724_0207_r24 · В strings libphp5.so пяти исследованных сборок присутствует строка PHP/5.3.6. [^3]: fw-tv188b-261021-0117-r25.c242 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 встроенный PHP 32-битный по целым: в php_server и в php-cgi CGI плагина PHP_INT_SIZE = 4, PHP_INT_MAX = 2147483647. [^4]: fw-tv188b-261021-0117-r25--libphp5.c056 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 php_server kb_probe11 перечислил 32 загруженных расширения: Core, date, ereg, libxml, openssl, pcre, sqlite3, zlib, ctype, curl, dom, fileinfo, filter, hash, iconv, json, mbstring, pcntl, SPL, PDO, posix, Reflection, session, SimpleXML, soap, sockets, standard, tokenizer, xml, xmlreader, xmlwriter, zip. [^5]: fw-tv188b-261021-0117-r25--libphp5.c059 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 CGI env перечислил те же 32 расширения, что php_server kb_probe11, и дополнительное cgi-fcgi. [^6]: fw-tv188b-261021-0117-r25--libphp5.c055 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 на tv188b r25 php_server зонда kb_probe11 сообщил PHP_VERSION=5.3.6, SAPI hd, getcwd=/ и uid=1000. [^7]: fw-tv188b-261021-0117-r25--libphp5.c058 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 CGI env зонда сообщил PHP_VERSION=5.3.6, SAPI cgi-fcgi, uid=0 и getcwd=/data/data/com.dunehd.app/flashdata/plugins/kb_probe11/www/cgi-bin. [^8]: - fw-tv188b-260827-0003-r24--plugin-loader--php-runtime.c030 · device · tv188b, android-dune-fw; прошивка 260827_0003_r24 · На tv188b r24 одновременно работают три процесса php_server — по одному на плагин (shell_ext, dune-hd.tv, android_apps), все — дочерние com.dunehd.app, с аргументами <плагин> <скрипт> /tmp/run /tmp/plugins/<плагин>/system_properties.txt - fw-tv188b-261021-0117-r25.c298 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На снимках tv188b r25 (collect4 и начало collect6, до установки зондов) работают три php_server — shell_ext, dune-hd.tv (программа /flashdata/plugins/dune-hd.tv/i24h.php) и android_apps; все — дочерние процессы com.dunehd.app с Uid 1000. [^9]: fw-tv188b-261021-0117-r25.c240 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 PHP-скрипт CGI плагина (php-cgi через CGI-обёртку) работает с posix_getuid() = 0, а php_server того же плагина — с uid 1000. [^10]: fw-tv188b-260827-0003-r24.c054 · device · tv188b, android-dune-fw; прошивка 260827_0003_r24 · На tv188b r24 три процесса php_server (shell_ext, dune-hd.tv, android_apps) работают от пользователя system с SELinux-меткой u:r:system_app:s0; их родитель — com.dunehd.app (PPID 25631), а UID пакета приложения — 1000 (sharedUser android.uid.system/1000). [^11]: fw-tv188b-261021-0117-r25.c152 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 CGI плагина, запущенный httpd через run_plugin_cgi, работает под uid=0(root) gid=0(root) с SELinux-контекстом u:r:shell:s0. [^12]: fw-tv188b-261021-0117-r25.c350 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 команды зонда из php_server (uid 1000) дают FS_PREFIX=/data/data/com.dunehd.app; which wget и command -v wget возвращают /data/data/com.dunehd.app/bin/wget. [^13]: - fw-tv188b-261021-0117-r25.c254 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в файловых функциях встроенного PHP (php_server и php-cgi) realpath('/config') = /data/data/com.dunehd.app/config, realpath('/firmware') = /system/dunehd/firmware, realpath('/firmware_ext/php') = /system/dunehd/firmware_ext/php, хотя в корне ФС (adb shell) /firmware и /firmware_ext нет, а /config — другой каталог. - fw-tv188b-261021-0117-r25.c255 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 во встроенном PHP (php_server и php-cgi CGI плагина) путь /flashdata существует: is_dir('/flashdata') = true, realpath — /data/data/com.dunehd.app/flashdata, хотя в корне ФС (adb shell) /flashdata нет. - fw-tv188b-261021-0117-r25.c291 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 tmp_dir_path у kb_probe5 = '/data/data/com.dunehd.app/tmp/plugins/kb_probe5' — путь /tmp/plugins/kb_probe5 с префиксом FS_PREFIX=/data/data/com.dunehd.app; is_dir() для него true. [^14]: fw-tv188b-261021-0117-r25.c292 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 data_dir_path у kb_probe5 (плагин в flashdata) = '/data/data/com.dunehd.app/flashdata/plugins_data/kb_probe5'; is_dir() для него true. [^15]: fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c090 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 онлайн-обновление сохраняет cookies плагина и его data_dir_path: v2 и v3 получили в plugin_cookies значение kbp7u_mark, записанное v1, файл kbp7u_mark.txt v1 в flashdata/plugins_data/ остался с прежним mtime. [^16]: fw-tv188b-261021-0117-r25.c291 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 tmp_dir_path у kb_probe5 = '/data/data/com.dunehd.app/tmp/plugins/kb_probe5' — путь /tmp/plugins/kb_probe5 с префиксом FS_PREFIX=/data/data/com.dunehd.app; is_dir() для него true. [^17]: fw-tv188b-261021-0117-r25.c376 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 файлы kbp11_persist.txt по 5 байт в tmp_dir_path, /tmp и data_dir_path сохранились после am force-stop и запуска com.dunehd.app (pid 15016 → 22982). [^18]: fw-tv188b-261021-0117-r25.c253 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 встроенный PHP (php_server и php-cgi CGI) в команде shell_exec добавляет $FS_PREFIX (/data/data/com.dunehd.app) к словам /tmp/…, /firmware/…, /config/…, /flashdata/… и к пути в одинарных кавычках ('/tmp/h'), но не к /etc/…, не к x/tmp/f и не к пути в двойных кавычках ("/tmp/g"). [^19]: fw-tv188b-261021-0117-r25.c259 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 из php_server PHP-плагина (id — uid=1000(system), context=u:r:system_app:s0) команда shell_exec('/system/dunehd/dunehd_service do id') выводит uid=0(root) gid=0(root) groups=0(root) context=u:r:shell:s0. [^20]: fw-tv188b-261021-0117-r25.c249 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в php_server и php-cgi curl_version() сообщает version 7.67.0, ssl_version OpenSSL/1.0.1u, libz_version 1.2.11, host arm-unknown-linux-androideabi. [^21]: fw-tv188b-261021-0117-r25.c250 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в php_server и php-cgi не определены константы CURLOPT_ACCEPT_ENCODING, CURLOPT_RESOLVE, CURL_SSLVERSION_TLSv1_2, CURLOPT_SSL_VERIFYSTATUS, CURLOPT_TCP_KEEPALIVE, CURLMOPT_PIPELINING и CURLMOPT_MAXCONNECTS; CURLOPT_ENCODING (10102), CURLOPT_SSLVERSION, CURLOPT_CAINFO, CURLOPT_TIMEOUT_MS, CURLOPT_CONNECTTIMEOUT_MS, CURLOPT_NOSIGNAL и CURLOPT_IPRESOLVE определены. [^22]: fw-tv188b-261021-0117-r25.c251 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 из php_server и php-cgi файл /firmware/certs/ca-bundle.crt доступен (is_file true; размер 227282, md5 e9dc50a63d76d3c88baa24a4374c4542), как и $FS_PREFIX/firmware/certs/ca-bundle.crt; в нём 143 PEM-блока сертификатов. [^23]: fw-tv188b-261021-0117-r25--libphp5.c037 · code · android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24, 1.0.1-1000-260724_0207_r24 · Заголовки CA-бандлов пяти исследованных сборок датируют данные Mozilla 11 октября 2022 года. [^24]: - fw-tv188b-261021-0117-r25.c350 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 команды зонда из php_server (uid 1000) дают FS_PREFIX=/data/data/com.dunehd.app; which wget и command -v wget возвращают /data/data/com.dunehd.app/bin/wget. - fw-tv188b-261021-0117-r25.c351 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 $FS_PREFIX/bin/wget — симлинк на $FS_PREFIX/lib/libxxx_busybox.so; /system/bin/libxxx_busybox.so — отдельный файл root:shell размером 987728 байт. [^25]: fw-tv188b-261021-0117-r25--libphp5.c073 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 which wget из php_server показал /data/data/com.dunehd.app/bin/wget — ссылку на libxxx_busybox.so; вызов по имени wget к /ping компьютера вернул ok и rc=0. [^26]: fw-tv188b-261021-0117-r25--libphp5.c074 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 прямой вызов /data/data/com.dunehd.app/bin/wget и вызов sh с тем же путём из php_server оба вернули rc=126 и cannot execute binary file. [^27]: fw-tv188b-261021-0117-r25.c328 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 строки hd_print() из кода плагина попадают в /tmp/run/<плагин>.log с префиксом «[pid] [t] [время]»: hd_print("kbp5: …") зонда дал «[17362] [t17362] [2026-10-26 10:38:00.049061] kbp5: props dumped to /tmp/kb_probe5/props.txt». [^28]: fw-tv188b-261021-0117-r25.c300 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 у php_server (снимок /proc//fd снаружи процесса) открыты только fd 0 → /dev/null, fd 1 и 2 → /tmp/run/<плагин>.log и два pipe-канала из argv; так у kb_probe6 и у встроенных shell_ext, dune-hd.tv, android_apps. [^29]: fw-tv188b-261021-0117-r25--libphp5.c090 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 13 $_SERVER в php_server зонда kb_probe13 содержал только REQUEST_TIME, argv и argc — без переменных окружения; переменные окружения процесса были в $_ENV (один прогон). [^30]: fw-tv188b-261021-0117-r25.c393 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 13 из php_server все три вызова — FS_PREFIX=$FS_PREFIX sh $FS_PREFIX/firmware/scripts/ffmpeg.sh -version, sh $FS_PREFIX/firmware/scripts/ffmpeg.sh -version без явного FS_PREFIX и ffmpeg -version без пути — вернули rc=0 и «ffmpeg version 7.1.3» (один прогон). [^31]: fw-tv188b-261021-0117-r25--libphp5.c091 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 13 с PHP_DEBUG=1 exec("/config/kbp13_x.sh first-word 2>&1") в php_server вернул rc=127 и «sh: /config/kbp13_x.sh: No such file or directory» — путь первым словом префикс $FS_PREFIX не получил (повтор наблюдения запроса 11, один прогон). [^32]: fw-tv188b-261021-0117-r25--libphp5.c092 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 13 exec("echo /config/kbp13_x.sh") в php_server напечатал /data/data/com.dunehd.app/config/kbp13_x.sh, а exec("sh /config/kbp13_x.sh after-sh") запустил скрипт с argv0 /data/data/com.dunehd.app/config/kbp13_x.sh: путь после пробела получил $FS_PREFIX (один прогон). [^33]: fw-tv188b-261021-0117-r25.c309 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 операция handle_user_input PHP-плагина без operation_timeout в манифесте (kb_probe5, kb_probe6; ENTER на точке входа с plugin_handle_user_input) стартует с тайм-аутом 60 с: в shell.log «…->handle_user_input(…): start (timeout=60.0s)». [^34]: fw-tv188b-260827-0003-r24--plugin-loader--php-runtime--opexec.c032 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 по тайм-ауту handle_user_input оболочка останавливает php_server плагина и тем прерывает вызов: за «cancelling by timeout (N s)» следуют «FATAL ERROR detected (msg = operation timed out)», «[php] shutting down...», через ~0,25 с «killing PHP-server process...» и «stopped.», затем «canceling req N (fast: 1)», «PHP-FW was shut down. The operation fails.», «result status canceled» и «canceled in N s»; PHP-код вызова не доработал. [^35]: - fw-tv188b-261021-0117-r25.c240 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 PHP-скрипт CGI плагина (php-cgi через CGI-обёртку) работает с posix_getuid() = 0, а php_server того же плагина — с uid 1000. - fw-tv188b-261021-0117-r25.c258 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в окружении php-cgi CGI плагина переменной PHP_PROC_OPEN_SH нет (getenv = false), а FS_PREFIX = /data/data/com.dunehd.app есть. - fw-tv188b-261021-0117-r25.c248 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в php-cgi CGI плагина с php.ini без date.timezone ini date.timezone пуст; date_default_timezone_get() возвращает Europe/Moscow, но date() и date_default_timezone_get() пишут PHP Warning «It is not safe to rely on the system's timezone settings… We selected 'Europe/Moscow' for 'MSK/3.0/no DST' instead». [^36]: fw-tv188b-261021-0117-r25.c307 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 статическая переменная класса плагина сохраняется между вызовами, пока жив php_server: счётчик KbProbe5Fw::$n, увеличиваемый в каждом call_plugin, рос 1→5 в пяти вызовах процесса 17362 (13:38:00–13:39:25). [^37]: fw-tv188b-261021-0117-r25.c313 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 php_server при старте пишет в /tmp/run/<плагин>.log по порядку: «[server] preparing...», «reader fd: N; writer fd: M», «resetting include path to …», загрузку bootstrap.php, dune_api.php, dune_plugin.php, dune_plugin_fw.php, «executing system properties cmd (number of properties: 7)...», загрузку dune_config.php, затем программы плагина, после чего «[server] ready.» и «[server] main loop started.»; get_included_files() из main.php даёт тот же порядок файлов. [^38]: fw-tv188b-260827-0003-r24--http-api.c114 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · libxxx_php-cgi.so (php-cgi) динамически связан с libphp5.so и содержит лишь CGI-обвязку (php_module_startup, php_execute_script, страница «CGI security») [^39]: fw-tv188b-261021-0117-r25.c081 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 скрипт global_action plugin_system (boot, boot_end, gui_start) работает под uid 1000(system) с SELinux-контекстом u:r:system_app:s0, текущим каталогом / и переменной окружения FS_PREFIX=/data/data/com.dunehd.app; $0 — абсолютный путь скрипта. [^40]: fw-tv188b-260827-0003-r24--plugin-loader.c099 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Модуль php_driver.cpp оболочки запускает процесс PHP-сервера: строки «starting PHP-server process», /tmp/plugins/%s/system_properties.txt, /firmware/bin/php_server, «execv (%s) failed» [^41]: fw-tv188b-261021-0117-r25.c297 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 php_server нового PHP-плагина из flashdata запускается при первом вызове плагина, а не при его регистрации: после регистрации kb_probe6 процесса php_server kb_probe6 нет, а при первом handle_user_input в shell.log идут «start (timeout=60.0s)», «[kb_probe6] [php] creating...», «server started; pid: 31928.», «ready.» (так же у kb_probe5, pid 17362). [^42]: fw-tv188b-260827-0003-r24--php-framework.c303 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Строка использования php_server (libxxx_php_server.so): «php_server » [^43]: fw-tv188b-260827-0003-r24--plugin-loader--php-runtime.c027 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · php_server встраивает PHP через libphp5.so (импорты php_module_startup, php_request_startup, zend_eval_string) и пишет этапы инициализации движка: «php engine: initializing...», «php engine: startup() failed.», «php engine: initialized.», «php engine: exitting from forked child (pid %d)» [^44]: fw-tv188b-261021-0117-r25.c299 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 два последних аргумента php_server — fd канала на чтение и fd канала на запись: при argv «… 83 109» сервер пишет «[server] reader fd: 83; writer fd: 109», а в /proc fd 83 — pipe, открытый на чтение (lr-x), fd 109 — pipe на запись (l-wx); у kb_probe5 так же «… 90 93» и «reader fd: 90; writer fd: 93». [^45]: fw-tv188b-261021-0117-r25.c314 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 к исполнению программы плагина (код верхнего уровня main.php) уже определены классы DunePluginFw и DuneSystem, константа PLUGIN_OP_HANDLE_USER_INPUT и функция hd_print. [^46]: fw-tv188b-261021-0117-r25.c311 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 php_server пишет в лог «[server] loading '/firmware_ext/php/<файл>'...», а выполняет «require ('/data/data/com.dunehd.app/firmware_ext/php/<файл>');» — с префиксом $FS_PREFIX; программа плагина так же: loading '/flashdata/plugins/kb_probe5/main.php', require ('/data/data/com.dunehd.app/flashdata/plugins/kb_probe5/main.php'). [^47]: fw-tv188b-261021-0117-r25.c312 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в коде main.php kb_probe5 get_included_files() показывает системные файлы как '/system/dunehd/firmware_ext/php/<файл>' (bootstrap.php … dune_config.php), а main.php — как '/data/data/com.dunehd.app/flashdata/plugins/kb_probe5/main.php'; __FILE__ — тот же путь main.php. [^48]: fw-tv188b-261021-0117-r25.c316 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 include_path в php_server = '.:<каталог плагина>:/data/data/com.dunehd.app/firmware_ext/php/include', каталог плагина — с префиксом $FS_PREFIX: …/flashdata/plugins/kb_probe5 и …/flashdata/plugins/dune-hd.tv у плагинов из flashdata, …/firmware_ext/plugins/shell_ext и …/firmware_ext/plugins/android_apps у встроенных; php_server пишет его в лог «[server] resetting include path to '…'». [^49]: fw-tv188b-260827-0003-r24--php-framework.c306 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · php_server задаёт include_path по шаблону «ini_set('include_path', '.:%s:%s');»; рядом строка /firmware_ext/php/include [^50]: fw-tv188b-261021-0117-r25.c293 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 у работающего php_server каталог /tmp/plugins/<плагин> пуст: файла system_properties.txt, путь к которому php_server получает в argv, нет ни при загрузке main.php (kb_probe6, два запуска), ни при первом вызове (kb_probe5). [^51]: fw-tv188b-260827-0003-r24--http-api.c008 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · CGI-скрипт плагина запускается run_plugin_cgi как shell-скрипт (sh), а не напрямую: PHP-обработчик плагин должен вызвать сам [^52]: fw-tv188b-260827-0003-r24--http-api.c010 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · CGI shell_ext/www/cgi-bin/download_subtitle — двухстрочная обёртка: дописывает .php к SCRIPT_FILENAME и запускает $FS_PREFIX/firmware_ext/php/php-cgi -c . (php.ini из каталога cgi-bin) [^53]: fw-tv188b-261021-0117-r25.c237 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 CGI-обёртка плагина по образцу download_subtitle (SCRIPT_FILENAME="$SCRIPT_FILENAME.php" и "$FS_PREFIX/firmware_ext/php/php-cgi" -c .) исполняет <имя>.php из www/cgi-bin плагина: __FILE__ и SCRIPT_FILENAME — …/www/cgi-bin/rt.php, getcwd() — каталог www/cgi-bin, php_ini_loaded_file() — www/cgi-bin/php.ini, get_include_path() — «.». [^54]: fw-tv188b-260827-0003-r24--shell-ext.c023 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · run_async_worker.sh берёт php-cgi из $FS_PREFIX/firmware_ext/php/php-cgi (если его нет — exit 1) и запускает exec php-cgi -f <плагин>/async_worker.php с аргументами скрипта, stdout/stderr — в $FS_PREFIX/tmp/plugins/<плагин>/error.log [^55]: fw-tv188b-260827-0003-r24.c055 · device · tv188b, android-dune-fw; прошивка 260827_0003_r24 · На tv188b r24 фоновый PHP-процесс плагина shell_ext «php-cgi -f $FS_PREFIX/firmware_ext/plugins/shell_ext/async_worker.php start» (pid 26705) работает от пользователя system с меткой u:r:system_app:s0 и PPID 1. [^56]: doc-sdk-plugins.c095 · doc · any-documented; прошивка — · Встроенный HTTP-сервер отдаёт $install_dir_path/www/* по http:///plugins//* и исполняет CGI из www/cgi-bin/* по http:///cgi-bin/plugins//* [^57]: fw-tv188b-261021-0117-r25.c154 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 файл www/index.txt плагина отдаётся по http:///plugins/

/index.txt: HTTP 200, Content-type: text/plain, Accept-Ranges: bytes, тело — содержимое файла. [^58]: fw-tv188b-261021-0117-r25.c149 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 CGI-скрипт плагина, вызванный через http:///cgi-bin/plugins/

/<файл>, получает PLUGIN_NAME=

, а PLUGIN_CGI_DIR и SCRIPT_FILENAME — реальные пути $FS_PREFIX/flashdata/plugins/

/www/cgi-bin и …/www/cgi-bin/<файл>, а не /tmp/www/plugins/

/… [^59]: doc-sdk-httpd.c001 · doc · any-documented; прошивка — · Документ HTTPD — выдержка из busybox/networking/httpd.c; не все перечисленные в ней возможности поддерживаются текущими прошивками Dune HD. [^60]: doc-sdk-httpd.c003 · doc · any-documented; прошивка — · URL, начинающийся с /cgi-bin/, считается CGI-скриптом; сервер переходит в каталог скрипта и запускает его, установив QUERY_STRING и другие переменные окружения. [^61]: doc-sdk-httpd.c004 · doc · any-documented; прошивка — · За описанием переменных окружения CGI документ отсылает к спецификации NCSA http://hoohoo.ncsa.uiuc.edu/cgi/env.html. [^62]: fw-tv188b-261021-0117-r25.c150 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 CGI-скрипт плагина запускается с $0, равным абсолютному SCRIPT_FILENAME ($FS_PREFIX/flashdata/plugins/

/www/cgi-bin/<файл>), и текущим каталогом PLUGIN_CGI_DIR ($FS_PREFIX/flashdata/plugins/

/www/cgi-bin). [^63]: doc-sdk-httpd.c002 · doc · any-documented; прошивка — · В выдержке busybox httpd демон запускается из rc-скрипта с uid=0 под пользователем www (`httpd -u www`); при uid пользователя www = 80 это эквивалентно `httpd -p 80 -u 80 -h /www -c /etc/httpd.conf -r "Web Server Authentication"`. [^64]: doc-sdk-service-plugins.c001 · doc · any-documented; прошивка — · Документ обращается к сервисным плагинам HTTP-запросами к `http://localhost` или `http://127.0.0.1` по пути `/cgi-bin/plugins/<имя_плагина>/do?cmd=…`. [^65]: - doc-sdk-service-plugins.c002 · doc · any-documented; прошивка — · mediainfo_service по `cmd=get_duration` получает длительность медиафайла; параметр `file` — UNIX-путь к видеофайлу (в примере `/D/some folder/file.avi`). - doc-sdk-service-plugins.c003 · doc · any-documented; прошивка — · mediainfo_service по `cmd=make_screenshot` сохраняет скриншот в `screenshot_file`, берёт его с позиции `screenshot_pos` секунд и размера `screenshot_size`. [^66]: doc-sdk-service-plugins.c002 · doc · any-documented; прошивка — · mediainfo_service по `cmd=get_duration` получает длительность медиафайла; параметр `file` — UNIX-путь к видеофайлу (в примере `/D/some folder/file.avi`). [^67]: doc-sdk-service-plugins.c004 · doc · any-documented; прошивка — · 3g_service поддерживает команды `send_sms`, `status`, `list_sms`, `delete_sms`, `set_sms_storage`, `start_3g` и `stop_3g`. [^68]: - doc-sdk-service-plugins.c005 · doc · any-documented; прошивка — · 3g_service по `cmd=status` с флагами `get_sim_status`, `get_imsi`, `get_imei`, `get_signal` возвращает `sim_status`, `imsi`, `imei`, `signal_strength`, `signal_ber`; ответ завершается `result = ok`. - doc-sdk-service-plugins.c006 · doc · any-documented; прошивка — · 3g_service по `cmd=status` также сообщает `have_main_connection` и `have_3g_connection` — доступность интернета через основное подключение и 3G. [^69]: doc-sdk-service-plugins.c007 · doc · any-documented; прошивка — · Фоновое 3G-подключение включается `cmd=start_3g` и выключается `cmd=stop_3g`; при каждой загрузке STB оно выключено, постоянно поддерживается и используется для интернета только тогда, когда основное подключение доступа не даёт. [^70]: doc-sdk-service-plugins.c008 · doc · any-documented; прошивка — · Доступность интернета фоновое 3G-подключение проверяет через ping google DNS 8.8.8.8; переключение между основным и 3G-подключением происходит автоматически в обе стороны. [^71]: doc-sdk-service-plugins.c009 · doc · any-documented; прошивка — · При включённом фоновом 3G-подключении не поддерживаются приём и передача SMS; качество сигнала определяется только в момент включения; горячее отключение USB-модема поддерживается только при выключенном фоновом 3G. [^72]: doc-sdk-service-plugins.c010 · doc · any-documented; прошивка — · dvb_service по `cmd=set_system_time` с `media_url` DVB-канала устанавливает системное время; запрос нельзя выполнять одновременно с воспроизведением DVB-канала. [^73]: doc-sdk-service-plugins.c011 · doc · any-documented; прошивка — · Альтернатива вызову dvb_service — автозапуск скрипта при загрузке STB: создать `/config/boot`, скачать `dvb_time`, сделать его исполняемым и указать в нём DVB media_url. [^74]: doc-sdk-service-plugins.c012 · doc · any-documented; прошивка — · file_service поддерживает команды `delete_file`, `get_info` и `read_text_file`. [^75]: doc-sdk-service-plugins.c013 · doc · any-documented; прошивка — · file_service `cmd=delete_file` удаляет файл и возвращает `result = ok`; попытка удалить директорию даёт ошибку. [^76]: doc-sdk-service-plugins.c014 · doc · any-documented; прошивка — · file_service `cmd=get_info` возвращает `type` (`regular_file`, `regular empty file`, `directory` и специальные значения), `size`, `mtime` в unix timestamp и `result = ok`; ссылки разыменовываются. [^77]: doc-sdk-service-plugins.c015 · doc · any-documented; прошивка — · file_service `cmd=read_text_file` читает текстовый файл; содержимое идёт после строки-разделителя `@data`; при `max_length <= 0` возвращается файл целиком, иначе первые `max(file_size, max_length)` байт. [^78]: doc-sdk-service-plugins.c016 · doc · any-documented; прошивка — · При ошибке file_service возвращает `result = error` и `error_message = command '' failed`. [^79]: - fw-tv188b-261021-0117-r25--libphp5.c055 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 на tv188b r25 php_server зонда kb_probe11 сообщил PHP_VERSION=5.3.6, SAPI hd, getcwd=/ и uid=1000. - fw-tv188b-261021-0117-r25--libphp5.c058 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 CGI env зонда сообщил PHP_VERSION=5.3.6, SAPI cgi-fcgi, uid=0 и getcwd=/data/data/com.dunehd.app/flashdata/plugins/kb_probe11/www/cgi-bin. [^80]: - fw-tv188b-261021-0117-r25--libphp5.c057 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 php_server kb_probe11 показал max_execution_time=0, memory_limit=128M, include_path=.::/data/data/com.dunehd.app/firmware_ext/php/include и magic_quotes_gpc=1. - fw-tv188b-261021-0117-r25--libphp5.c060 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 CGI env показал max_execution_time=30, memory_limit=128M, include_path=. и magic_quotes_gpc=0. [^81]: fw-tv188b-261021-0117-r25--libphp5.c089 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 13 шаг g_env в php_server зонда kb_probe13 записал php_sapi_name() = hd, PHP_VERSION 5.3.6, getcwd() = / и posix_getuid() = 1000 (один прогон). [^82]: fw-tv188b-261021-0117-r25.c391 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 13 php-cgi (/data/data/com.dunehd.app/firmware_ext/php/php-cgi, php_sapi_name cgi-fcgi, uid 0), запущенный busybox httpd для /cgi-bin/plugins/kb_probe13/env, имел FS_PREFIX, HD_HTTP_LOCAL_PORT=80, LD_LIBRARY_PATH, PATH, LOG_DIR, HD_APK, PLUGIN_NAME, PLUGIN_CGI_DIR и DUNEHD_SERVICE_DONT_FORK, а getenv(HOME) и getenv(TMPDIR) вернули false (один прогон). [^83]: - fw-tv188b-261021-0117-r25.c298 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На снимках tv188b r25 (collect4 и начало collect6, до установки зондов) работают три php_server — shell_ext, dune-hd.tv (программа /flashdata/plugins/dune-hd.tv/i24h.php) и android_apps; все — дочерние процессы com.dunehd.app с Uid 1000. - fw-tv188b-261021-0117-r25.c152 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 CGI плагина, запущенный httpd через run_plugin_cgi, работает под uid=0(root) gid=0(root) с SELinux-контекстом u:r:shell:s0. [^84]: - fw-tv188b-261021-0117-r25.c240 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 PHP-скрипт CGI плагина (php-cgi через CGI-обёртку) работает с posix_getuid() = 0, а php_server того же плагина — с uid 1000. - fw-tv188b-261021-0117-r25.c259 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 из php_server PHP-плагина (id — uid=1000(system), context=u:r:system_app:s0) команда shell_exec('/system/dunehd/dunehd_service do id') выводит uid=0(root) gid=0(root) groups=0(root) context=u:r:shell:s0. - fw-tv188b-261021-0117-r25--libphp5.c055 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 на tv188b r25 php_server зонда kb_probe11 сообщил PHP_VERSION=5.3.6, SAPI hd, getcwd=/ и uid=1000. - fw-tv188b-261021-0117-r25--libphp5.c058 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 CGI env зонда сообщил PHP_VERSION=5.3.6, SAPI cgi-fcgi, uid=0 и getcwd=/data/data/com.dunehd.app/flashdata/plugins/kb_probe11/www/cgi-bin. [^85]: - fw-tv188b-261021-0117-r25--libphp5.c056 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 php_server kb_probe11 перечислил 32 загруженных расширения: Core, date, ereg, libxml, openssl, pcre, sqlite3, zlib, ctype, curl, dom, fileinfo, filter, hash, iconv, json, mbstring, pcntl, SPL, PDO, posix, Reflection, session, SimpleXML, soap, sockets, standard, tokenizer, xml, xmlreader, xmlwriter, zip. - fw-tv188b-261021-0117-r25--libphp5.c059 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 CGI env перечислил те же 32 расширения, что php_server kb_probe11, и дополнительное cgi-fcgi. [^86]: - fw-tv188b-261021-0117-r25.c259 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 из php_server PHP-плагина (id — uid=1000(system), context=u:r:system_app:s0) команда shell_exec('/system/dunehd/dunehd_service do id') выводит uid=0(root) gid=0(root) groups=0(root) context=u:r:shell:s0. - fw-tv188b-261021-0117-r25.c152 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 CGI плагина, запущенный httpd через run_plugin_cgi, работает под uid=0(root) gid=0(root) с SELinux-контекстом u:r:shell:s0. [^87]: - fw-tv188b-261021-0117-r25--libphp5.c003 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В зонде kb_probe5 на tv188b 261021_0117_r25 php_sapi_name возвращает hd. - fw-tv188b-261021-0117-r25.c239 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в php-cgi CGI плагина PHP_VERSION = 5.3.6, php_sapi_name() = cgi-fcgi. - fw-tv188b-261021-0117-r25--libphp5.c055 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 на tv188b r25 php_server зонда kb_probe11 сообщил PHP_VERSION=5.3.6, SAPI hd, getcwd=/ и uid=1000. - fw-tv188b-261021-0117-r25--libphp5.c058 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 CGI env зонда сообщил PHP_VERSION=5.3.6, SAPI cgi-fcgi, uid=0 и getcwd=/data/data/com.dunehd.app/flashdata/plugins/kb_probe11/www/cgi-bin. [^88]: - fw-tv188b-261021-0117-r25--libphp5.c002 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В зонде kb_probe5 на tv188b 261021_0117_r25 значение PHP_VERSION равно 5.3.6. - fw-tv188b-261021-0117-r25.c239 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в php-cgi CGI плагина PHP_VERSION = 5.3.6, php_sapi_name() = cgi-fcgi. - fw-tv188b-261021-0117-r25.c242 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 встроенный PHP 32-битный по целым: в php_server и в php-cgi CGI плагина PHP_INT_SIZE = 4, PHP_INT_MAX = 2147483647. - fw-tv188b-261021-0117-r25--libphp5.c055 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 на tv188b r25 php_server зонда kb_probe11 сообщил PHP_VERSION=5.3.6, SAPI hd, getcwd=/ и uid=1000. - fw-tv188b-261021-0117-r25--libphp5.c058 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 CGI env зонда сообщил PHP_VERSION=5.3.6, SAPI cgi-fcgi, uid=0 и getcwd=/data/data/com.dunehd.app/flashdata/plugins/kb_probe11/www/cgi-bin. [^89]: - fw-tv188b-261021-0117-r25.c316 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 include_path в php_server = '.:<каталог плагина>:/data/data/com.dunehd.app/firmware_ext/php/include', каталог плагина — с префиксом $FS_PREFIX: …/flashdata/plugins/kb_probe5 и …/flashdata/plugins/dune-hd.tv у плагинов из flashdata, …/firmware_ext/plugins/shell_ext и …/firmware_ext/plugins/android_apps у встроенных; php_server пишет его в лог «[server] resetting include path to '…'». - fw-tv188b-261021-0117-r25.c237 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 CGI-обёртка плагина по образцу download_subtitle (SCRIPT_FILENAME="$SCRIPT_FILENAME.php" и "$FS_PREFIX/firmware_ext/php/php-cgi" -c .) исполняет <имя>.php из www/cgi-bin плагина: __FILE__ и SCRIPT_FILENAME — …/www/cgi-bin/rt.php, getcwd() — каталог www/cgi-bin, php_ini_loaded_file() — www/cgi-bin/php.ini, get_include_path() — «.». - fw-tv188b-261021-0117-r25--libphp5.c057 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 php_server kb_probe11 показал max_execution_time=0, memory_limit=128M, include_path=.::/data/data/com.dunehd.app/firmware_ext/php/include и magic_quotes_gpc=1. - fw-tv188b-261021-0117-r25--libphp5.c060 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 CGI env показал max_execution_time=30, memory_limit=128M, include_path=. и magic_quotes_gpc=0. [^90]: - fw-tv188b-261021-0117-r25.c247 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в php_server PHP-плагина ini date.timezone = Europe/Moscow и date_default_timezone_get() = Europe/Moscow при getenv('TZ') = false; date() даёт MSK +0300, getprop persist.sys.timezone — Europe/Moscow. - fw-tv188b-261021-0117-r25.c248 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в php-cgi CGI плагина с php.ini без date.timezone ini date.timezone пуст; date_default_timezone_get() возвращает Europe/Moscow, но date() и date_default_timezone_get() пишут PHP Warning «It is not safe to rely on the system's timezone settings… We selected 'Europe/Moscow' for 'MSK/3.0/no DST' instead». [^91]: - fw-tv188b-261021-0117-r25.c257 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в окружении php_server PHP-плагинов (kb_probe6, shell_ext, dune-hd.tv, android_apps) PHP_PROC_OPEN_SH=/data/data/com.dunehd.app/bin/sh; $FS_PREFIX/bin/sh — ссылка на /data/data/com.dunehd.app/lib/libxxx_bash.so. - fw-tv188b-261021-0117-r25.c258 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в окружении php-cgi CGI плагина переменной PHP_PROC_OPEN_SH нет (getenv = false), а FS_PREFIX = /data/data/com.dunehd.app есть. [^92]: - fw-tv188b-261021-0117-r25.c390 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 13 /proc/self/environ php_server зонда kb_probe13 содержал, кроме общих с CGI переменных, HOME=/data/user/0/com.dunehd.app/app_vlc, TMPDIR=/data/data/com.dunehd.app/tmp, FS_BIN_PREFIX=/data/data/com.dunehd.app, APK_PACKAGE_NAME=com.dunehd.app, PHP_PROC_OPEN_SH=/data/data/com.dunehd.app/bin/sh, LOG_MAX_FILE_SIZE=3072000 и HD_RMCL_DISABLE_CLOPTNS=1 (один прогон). - fw-tv188b-261021-0117-r25--libphp5.c090 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 13 $_SERVER в php_server зонда kb_probe13 содержал только REQUEST_TIME, argv и argc — без переменных окружения; переменные окружения процесса были в $_ENV (один прогон). - fw-tv188b-261021-0117-r25.c391 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 13 php-cgi (/data/data/com.dunehd.app/firmware_ext/php/php-cgi, php_sapi_name cgi-fcgi, uid 0), запущенный busybox httpd для /cgi-bin/plugins/kb_probe13/env, имел FS_PREFIX, HD_HTTP_LOCAL_PORT=80, LD_LIBRARY_PATH, PATH, LOG_DIR, HD_APK, PLUGIN_NAME, PLUGIN_CGI_DIR и DUNEHD_SERVICE_DONT_FORK, а getenv(HOME) и getenv(TMPDIR) вернули false (один прогон). - fw-tv188b-261021-0117-r25.c392 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 13 набор имён переменных в /proc/self/environ php-cgi совпал с набором имён в env sh-обёртки того же CGI-запроса (различие только в значении «_»): окружение php-cgi — это окружение sh-CGI busybox httpd (один прогон). [^93]: - fw-tv188b-261021-0117-r25.c326 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 ошибки и предупреждения PHP в коде плагина php_server пишет в /tmp/run/<плагин>.log строкой вида «[<полный путь файла>:<строка>] [E_WARNING] …» / «[…] [E_ERROR] …». - fw-tv188b-260827-0003-r24--http-api.c005 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · run_plugin_cgi направляет stderr CGI-скриптов плагинов в $FS_PREFIX/tmp/dune_apk_cgi_err.log; при размере больше 10000 байт лог переименовывается в .old [^94]: - fw-tv188b-261021-0117-r25.c253 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 встроенный PHP (php_server и php-cgi CGI) в команде shell_exec добавляет $FS_PREFIX (/data/data/com.dunehd.app) к словам /tmp/…, /firmware/…, /config/…, /flashdata/… и к пути в одинарных кавычках ('/tmp/h'), но не к /etc/…, не к x/tmp/f и не к пути в двойных кавычках ("/tmp/g"). - fw-tv188b-261021-0117-r25.c254 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в файловых функциях встроенного PHP (php_server и php-cgi) realpath('/config') = /data/data/com.dunehd.app/config, realpath('/firmware') = /system/dunehd/firmware, realpath('/firmware_ext/php') = /system/dunehd/firmware_ext/php, хотя в корне ФС (adb shell) /firmware и /firmware_ext нет, а /config — другой каталог. [^95]: fw-tv188b-261021-0117-r25.c179 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 команды поставщика из стороннего плагина (bin без cd) выполняются с uid 1000 и текущим каталогом /. [^96]: fw-tv188b-260827-0003-r24.c057 · device · tv188b, android-dune-fw; прошивка 260827_0003_r24 · На tv188b r24 демон dunehd_service (pid 587) работает от root с SELinux-меткой u:r:shell:s0 и PPID 1. [^97]: - fw-tv188b-260827-0003-r24.c058 · device · tv188b, android-dune-fw; прошивка 260827_0003_r24 · На tv188b r24 HTTP-сервер «httpd -h /data/data/com.dunehd.app/tmp/www» (pid 1843) работает от root с SELinux-меткой u:r:shell:s0 и PPID 1. - fw-tv188b-261021-0117-r25.c094 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 httpd запущен как «$FS_PREFIX/bin/httpd -h /data/data/com.dunehd.app/tmp/www», то есть корень веб-сервера — $FS_PREFIX/tmp/www; процесс работает от root (метка u:r:shell:s0, PPID 1). [^98]: fw-tv188b-260827-0003-r24.c062 · device · tv188b, android-dune-fw; прошивка 260827_0003_r24 · На tv188b r24 com.dunehd.app (pid 25631), его процесс :bg (pid 1590) и com.dunehd.systemui (pid 4952) работают от пользователя system с SELinux-меткой u:r:system_app:s0; userId пакета com.dunehd.app — 1000 (sharedUser android.uid.system/1000). [^99]: fw-tv188b-260827-0003-r24.c067 · device · tv188b, android-dune-fw; прошивка 260827_0003_r24 · На tv188b r24 в окружении com.dunehd.app (pid 25631) PATH=/product/bin:… (без $FS_PREFIX), ANDROID_SOCKET_zygote=18 и ANDROID_SOCKET_usap_pool_primary=19; переменных FS_PREFIX, HD_APK, HD_FW_APK, LOG_DIR, TMPDIR, PHP_PROC_OPEN_SH и LD_LIBRARY_PATH в блоке нет. [^100]: fw-tv188b-261021-0117-r25.c239 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в php-cgi CGI плагина PHP_VERSION = 5.3.6, php_sapi_name() = cgi-fcgi. [^101]: fw-tv188b-261021-0117-r25--libphp5.c006 · code · android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24, 1.0.1-1000-260724_0207_r24 · В strings libphp5.so пяти исследованных сборок присутствует версия OpenSSL 1.0.1u от 22 Sep 2016. [^102]: fw-tv188b-261021-0117-r25--libphp5.c007 · code · android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24, 1.0.1-1000-260724_0207_r24 · В strings libphp5.so пяти исследованных сборок присутствует строка версии PCRE 8.11 2010-12-10. [^103]: fw-apk-260724-0207-r24--data-deploy--php-fs-prefix.c028 · code · android-atv, android-dune-fw; прошивка 260724_0207_r24, 260827_0003_r24, 240619_0210_r22, 250815_1012_r22, 261021_0117_r25 · libphp5.so APK 260724_0207_r24 совпадает по sha256 (e28ffc74…) с libphp5.so прошивок tv175u 260724_0207_r24 и tv188b 260827_0003_r24; в tv175u 240619_0210_r22 и tv188b 250815_1012_r22 файл другой (e7d22b70…), в tv188b 261021_0117_r25 — тоже (4a31ef48…) [^104]: - fw-tv188b-261021-0117-r25--libphp5.c009 · code · android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24, 1.0.1-1000-260724_0207_r24 · В strings libphp5.so пяти исследованных сборок присутствуют имена JSON: json_encode, json_decode, json_last_error. - fw-tv188b-261021-0117-r25.c244 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в php_server и php-cgi json_decode() целых вне 32-битного диапазона (2147483648, 4294967296, 9007199254740993, 1793009215123, [3000000000]) возвращает integer 2147483647, а -2147483649 — integer -2147483648; json_last_error() при этом 0. [^105]: - fw-tv188b-261021-0117-r25--libphp5.c010 · code · android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24, 1.0.1-1000-260724_0207_r24 · В strings libphp5.so пяти исследованных сборок присутствуют имена cURL: curl_init, curl_copy_handle, curl_version, curl_setopt, curl_setopt_array, curl_exec, curl_getinfo, curl_error, curl_errno, curl_close. - fw-tv188b-261021-0117-r25.c249 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в php_server и php-cgi curl_version() сообщает version 7.67.0, ssl_version OpenSSL/1.0.1u, libz_version 1.2.11, host arm-unknown-linux-androideabi. [^106]: - fw-tv188b-261021-0117-r25--libphp5.c011 · code · android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24, 1.0.1-1000-260724_0207_r24 · В strings libphp5.so пяти исследованных сборок присутствуют имена PHP cURL multi: curl_multi_init, curl_multi_add_handle, curl_multi_remove_handle, curl_multi_select, curl_multi_exec, curl_multi_getcontent, curl_multi_info_read, curl_multi_close. - fw-tv188b-261021-0117-r25.c234 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 PHP-скрипт CGI плагина (php-cgi через CGI-обёртку), выполнивший curl_multi на 4 хендла к httpd самого плеера (http://127.0.0.1/plugins/…, http://127.0.0.1:80/cgi-bin/plugins/…, http://localhost/cgi-bin/plugins/…), доходит до curl_multi_info_read и получает все 4 сообщения с msg=1 result=0, после чего php-cgi завершается с кодом 139 и в /tmp/dune_apk_cgi_err.log появляется «Segmentation fault»; повторный запуск дал то же самое. [^107]: - fw-tv188b-261021-0117-r25--libphp5.c014 · code · android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24, 1.0.1-1000-260724_0207_r24 · В strings libphp5.so пяти исследованных сборок присутствуют имена mbstring: mb_strlen, mb_substr, mb_convert_encoding, mb_detect_encoding, mb_check_encoding. - fw-tv188b-261021-0117-r25--libphp5.c062 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 из php_server kb_probe11 вызов mb_strlen для двух букв UTF-8 вернул 2. [^108]: fw-tv188b-261021-0117-r25--libphp5.c015 · code · android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24, 1.0.1-1000-260724_0207_r24 · В strings libphp5.so пяти исследованных сборок присутствуют имена iconv: iconv_strlen, iconv_substr, iconv_mime_decode, iconv_get_encoding, iconv_set_encoding. [^109]: fw-tv188b-261021-0117-r25--libphp5.c016 · code · android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24, 1.0.1-1000-260724_0207_r24 · В strings libphp5.so пяти исследованных сборок присутствуют имена PCRE: preg_match, preg_match_all, preg_replace, preg_split, preg_last_error. [^110]: - fw-tv188b-261021-0117-r25--libphp5.c017 · code · android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24, 1.0.1-1000-260724_0207_r24 · В strings libphp5.so пяти исследованных сборок присутствуют имена OpenSSL: openssl_encrypt, openssl_decrypt, openssl_sign, openssl_verify, openssl_random_pseudo_bytes. - fw-tv188b-261021-0117-r25.c331 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 openssl_x509_parse() в php_server и в php-cgi даёт validTo_time_t = -1 (gmdate — 1969-12-31 23:59:59) у всех сертификатов /firmware/certs/ca-bundle.crt со сроком позже 2038-01-19 03:14:07 UTC (57 из 143), а более ранние сроки переводит верно; 2147483647 (2038-01-19 03:14:07) — настоящий срок сертификата GlobalSign. [^111]: - fw-tv188b-261021-0117-r25--libphp5.c018 · code · android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24, 1.0.1-1000-260724_0207_r24 · В strings libphp5.so пяти исследованных сборок присутствуют имена pcntl: pcntl_fork, pcntl_waitpid, pcntl_signal, pcntl_signal_dispatch, pcntl_exec. - fw-tv188b-261021-0117-r25--libphp5.c066 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 pcntl_fork из php_server создал потомка 22745; после posix_kill(getmypid(),9) в потомке pcntl_waitpid вернул 22745 и status=9. [^112]: - fw-tv188b-261021-0117-r25--libphp5.c019 · code · android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24, 1.0.1-1000-260724_0207_r24 · В strings libphp5.so пяти исследованных сборок присутствуют имена posix: posix_getuid, posix_getpid, posix_kill, posix_setuid. - fw-tv188b-261021-0117-r25--libphp5.c004 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В зонде kb_probe5 на tv188b 261021_0117_r25 posix_getuid возвращает 1000. - fw-tv188b-261021-0117-r25--libphp5.c066 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 pcntl_fork из php_server создал потомка 22745; после posix_kill(getmypid(),9) в потомке pcntl_waitpid вернул 22745 и status=9. [^113]: fw-tv188b-261021-0117-r25--libphp5.c020 · code · android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24, 1.0.1-1000-260724_0207_r24 · В strings libphp5.so пяти исследованных сборок присутствуют имена sockets: socket_create, socket_connect, socket_select, socket_read, socket_write. [^114]: fw-tv188b-261021-0117-r25--libphp5.c021 · code · android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24, 1.0.1-1000-260724_0207_r24 · В strings libphp5.so пяти исследованных сборок присутствуют имена XML: simplexml_load_string, xml_parser_create, libxml_use_internal_errors. [^115]: - fw-tv188b-261021-0117-r25--libphp5.c022 · code · android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24, 1.0.1-1000-260724_0207_r24 · В strings libphp5.so пяти исследованных сборок присутствуют имена классов XML/SOAP/ZIP/SQLite: DOMDocument, SoapClient, ZipArchive, SQLite3. - fw-tv188b-261021-0117-r25--libphp5.c063 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 из php_server SQLite3(:memory:)->querySingle(SELECT 1) вернул 1. - fw-tv188b-261021-0117-r25--libphp5.c064 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 из php_server ZipArchive::open с CREATE вернул true. - fw-tv188b-261021-0117-r25--libphp5.c065 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 из php_server DOMDocument::loadXML для вернул true. [^116]: fw-tv188b-261021-0117-r25--libphp5.c023 · code · android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24, 1.0.1-1000-260724_0207_r24 · В strings libphp5.so пяти исследованных сборок присутствуют имена hash, сессий и zlib: hash_hmac, hash_file, session_start, gzcompress, gzuncompress. [^117]: fw-tv188b-261021-0117-r25--libphp5.c062 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 из php_server kb_probe11 вызов mb_strlen для двух букв UTF-8 вернул 2. [^118]: fw-tv188b-261021-0117-r25--libphp5.c063 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 из php_server SQLite3(:memory:)->querySingle(SELECT 1) вернул 1. [^119]: fw-tv188b-261021-0117-r25--libphp5.c064 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 из php_server ZipArchive::open с CREATE вернул true. [^120]: fw-tv188b-261021-0117-r25--libphp5.c065 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 из php_server DOMDocument::loadXML для вернул true. [^121]: fw-tv188b-261021-0117-r25--libphp5.c066 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 pcntl_fork из php_server создал потомка 22745; после posix_kill(getmypid(),9) в потомке pcntl_waitpid вернул 22745 и status=9. [^122]: fw-tv188b-261021-0117-r25--libphp5.c067 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 popen(echo kb11-popen,r) вернул строку kb11-popen, pclose — 0. [^123]: fw-tv188b-261021-0117-r25--libphp5.c068 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 proc_open без cwd/env выполнил sh-команду с rc=0; readlink /proc/$$/exe в ней показал /system/bin/libxxx_bash.so. [^124]: fw-tv188b-261021-0117-r25--libphp5.c008 · code · android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24, 1.0.1-1000-260724_0207_r24 · В strings libphp5.so пяти исследованных сборок присутствуют имена библиотек-зависимостей: libxml2.so.2, libcurl.so.5, libssl.so.1.0.0, libcrypto.so.1.0.0, libiconv.so.2, libz.so. [^125]: fw-tv188b-261021-0117-r25.c241 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 $FS_PREFIX/firmware_ext/php/php-cgi, запущенный из adb shell (adbd root) с LD_LIBRARY_PATH=$FS_PREFIX/lib:$LD_LIBRARY_PATH, не стартует — «CANNOT LINK EXECUTABLE … library "libiconv.so.2" not found: needed by main executable», код 1 (и с -v, и с -q -f). [^126]: fw-tv188b-261021-0117-r25.c243 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в php_server и php-cgi целочисленный литерал 3000000000 в PHP-коде даёт integer 2147483647 (gettype integer, json_encode(3000000000) и json_encode(1793009215123) — 2147483647), тогда как PHP_INT_MAX + 1 даёт 2147483648, а time() * 1000 — 13-значное число без обрезки. [^127]: fw-tv188b-261021-0117-r25.c244 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в php_server и php-cgi json_decode() целых вне 32-битного диапазона (2147483648, 4294967296, 9007199254740993, 1793009215123, [3000000000]) возвращает integer 2147483647, а -2147483649 — integer -2147483648; json_last_error() при этом 0. [^128]: fw-tv188b-261021-0117-r25.c245 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в php_server и php-cgi json_decode() целого 12345678901234567890 возвращает double 1.2345678901235E+19 при json_last_error() = 0. [^129]: fw-tv188b-261021-0117-r25.c288 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 DuneSystem::$properties у PHP-плагина kb_probe5 из flashdata содержит 8 ключей: sdk_version '1.0.0', plugin_name 'kb_probe5', install_dir_path, tmp_dir_path, data_dir_path, plugin_www_url, plugin_cgi_url, few_buttons_remote_type '0'. [^130]: - fw-tv188b-261021-0117-r25.c290 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 install_dir_path у kb_probe5 = '/data/data/com.dunehd.app/flashdata/plugins/kb_probe5' (is_dir() = true) — тот же путь, что плагина в /tmp/run/installed_plugins.xml. - fw-tv188b-261021-0117-r25.c291 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 tmp_dir_path у kb_probe5 = '/data/data/com.dunehd.app/tmp/plugins/kb_probe5' — путь /tmp/plugins/kb_probe5 с префиксом FS_PREFIX=/data/data/com.dunehd.app; is_dir() для него true. - fw-tv188b-261021-0117-r25.c292 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 data_dir_path у kb_probe5 (плагин в flashdata) = '/data/data/com.dunehd.app/flashdata/plugins_data/kb_probe5'; is_dir() для него true. [^131]: fw-tv188b-261021-0117-r25.c289 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 у kb_probe5 plugin_www_url = 'http://127.0.0.1:80/plugins/kb_probe5/', plugin_cgi_url = 'http://127.0.0.1:80/cgi-bin/plugins/kb_probe5/' — с явным портом 80. [^132]: fw-tv188b-260827-0003-r24--php-framework.c071 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · HD читает переменные окружения: is_apk — HD_APK, is_fw_apk — HD_FW_APK, get_apk_package_name — APK_PACKAGE_NAME, get_fs_prefix — FS_PREFIX (пустая строка, если не задана); is_limited_apk = apk и не fw_apk; with_network_manager = не limited_apk [^133]: fw-tv188b-261021-0117-r25.c258 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в окружении php-cgi CGI плагина переменной PHP_PROC_OPEN_SH нет (getenv = false), а FS_PREFIX = /data/data/com.dunehd.app есть. [^134]: fw-tv175u-260724-0207-r24.c023 · code · tv175u, android; прошивка 260724_0207_r24 · Скрипт /system/dunehd/init не выставляет HD_APK, HD_FW_APK и FS_PREFIX: перед запуском dunehd_service он экспортирует только PATH, LD_LIBRARY_PATH=/firmware/lib:/lib:/usr/lib и LOG_DIR=/tmp/run [^135]: fw-tv188b-261021-0117-r25.c254 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в файловых функциях встроенного PHP (php_server и php-cgi) realpath('/config') = /data/data/com.dunehd.app/config, realpath('/firmware') = /system/dunehd/firmware, realpath('/firmware_ext/php') = /system/dunehd/firmware_ext/php, хотя в корне ФС (adb shell) /firmware и /firmware_ext нет, а /config — другой каталог. [^136]: - fw-tv188b-261021-0117-r25.c255 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 во встроенном PHP (php_server и php-cgi CGI плагина) путь /flashdata существует: is_dir('/flashdata') = true, realpath — /data/data/com.dunehd.app/flashdata, хотя в корне ФС (adb shell) /flashdata нет. - fw-tv188b-261021-0117-r25.c207 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в корне ФС каталога /flashdata нет, а оболочка в shell.log называет каталог плагинов /flashdata/plugins («Loading plugins from '/flashdata/plugins'», «invalid plugin manifest from '/flashdata/plugins/kb_probe5_badname/dune_plugin.xml'», «copying recursively '/tmp/plugin_tmp' to '/flashdata/plugins/kb_probe5_plat'»); файлы этих плагинов лежат в /data/data/com.dunehd.app/flashdata/plugins. [^137]: fw-apk-260724-0207-r24--data-deploy--php-fs-prefix.c001 · code · android-atv; прошивка 260724_0207_r24 · В libphp5.so APK функция _php_get_fs_prefix(path) возвращает getenv("FS_PREFIX"), только если path начинается с '/' и _php_path_needs_prefix.part.0(path) вернула не 0; иначе возвращает NULL [^138]: fw-apk-260724-0207-r24--data-deploy--php-fs-prefix.c007 · code · android-atv; прошивка 260724_0207_r24 · _php_path_needs_prefix.part.0(path) возвращает 1, если str_starts_with(path, s) не 0 для одной из строк "/tmp", "/firmware", "/config", "/flashdata", "/fconfig" или strcmp(path, s) равен 0 для "/system/dunehd/init" и "/D"; иначе возвращает 1 или 0 по результату str_starts_with(path, <строка по адресу 0x353448>) — того же второго образца, что в _php_get_fs_prefix2 [^139]: fw-apk-260724-0207-r24--data-deploy--php-fs-prefix.c032 · code · android-atv; прошивка 260724_0207_r24 · Корни в _php_path_needs_prefix.part.0 сравниваются как префикс без проверки границы каталога: str_starts_with(path, s) возвращает результат strncmp(path, s, strlen(s)) == 0, поэтому проверку проходят и /firmware_ext/…, /tmpX, /config2/…, /flashdata_old/… [^140]: fw-apk-260724-0207-r24--data-deploy--php-fs-prefix.c002 · code · android-atv; прошивка 260724_0207_r24 · _php_get_fs_prefix2(path) при заданной FS_PREFIX возвращает строку "/tmp/mnt", если path равен "/D" (strcmp) или начинается со второй строки-образца (str_starts_with); в остальных случаях и без FS_PREFIX — NULL [^141]: fw-apk-260724-0207-r24--data-deploy--php-fs-prefix.c006 · code · android-atv; прошивка 260724_0207_r24 · Без переменной FS_PREFIX _php_add_fs_prefix путь под корнями не меняет: возвращает *out, если он не NULL, иначе исходный path [^142]: fw-apk-260724-0207-r24--data-deploy--php-fs-prefix.c026 · code · android-atv; прошивка 260724_0207_r24 · _php_add_fs_prefix вызывают в 24 местах 22 функции: _php_curl_setopt (2 вызова), zif_simplexml_load_file, zim_simplexml_element_asXML, zif_chdir, zif_glob, zif_readfile, zif_rename (2), zif_unlink, php_do_chgrp.isra.1, php_do_chown.isra.2, zif_disk_total_space, zif_disk_free_space, zif_chmod, zif_touch, fcn.0020d018 (у Ghidra — php_clear_stat_cache), php_stat, _php_stream_mkdir, _php_stream_rmdir, _php_stream_stat_path, _php_stream_opendir, _php_stream_open_wrapper_ex и zend_stream_open [^143]: fw-apk-260724-0207-r24--data-deploy--php-fs-prefix.c025 · code · android-atv; прошивка 260724_0207_r24 · virtual_file_ex(state, path, …) для path, начинающегося с '/', собирает во внутреннем буфере строку _php_get_fs_prefix(path) + _php_get_fs_prefix2(path) + path (префиксы — если не NULL; _php_get_fs_prefix2 вызывается, только если первый не NULL) и передаёт этот буфер в tsrm_realpath_r; относительный path дописывается через '/' к пути из state без префиксов [^144]: fw-apk-260724-0207-r24--data-deploy--php-fs-prefix.c033 · code · android-atv; прошивка 260724_0207_r24 · virtual_file_ex вызывают в 22 местах 21 функция: virtual_chdir, virtual_realpath, virtual_filepath_ex, virtual_fopen, virtual_access, virtual_utime, virtual_chmod, virtual_chown, virtual_open, virtual_creat, virtual_rename (2 вызова), virtual_stat, virtual_lstat, virtual_unlink, virtual_mkdir, virtual_rmdir, virtual_opendir, tsrm_realpath, expand_filepath_ex, php_do_open_temporary_file и php_zip_extract_file.isra.3 [^145]: fw-apk-260724-0207-r24--data-deploy--php-fs-prefix.c040 · code · android-atv; прошивка 260724_0207_r24 · _php_stream_open_wrapper_ex(path, mode, options, …) при сброшенном бите 1 в options пропускает path через _php_add_fs_prefix до php_stream_locate_url_wrapper; при установленном бите 1 _php_add_fs_prefix не вызывает, а разрешает path через указатель zend_resolve_path [^146]: fw-apk-260724-0207-r24--data-deploy--php-fs-prefix.c041 · code · android-atv; прошивка 260724_0207_r24 · Если mode начинается с 'r', path равен "/sys/class/net/eth0/address" и переменная HD_APK задана (php_is_apk() не 0), _php_stream_open_wrapper_ex при сброшенном бите 1 в options подменяет path на "/tmp/run/dune_mac.txt" и уже его пропускает через _php_add_fs_prefix [^147]: fw-apk-260724-0207-r24--data-deploy--php-fs-prefix.c044 · code · android-atv; прошивка 260724_0207_r24 · php_is_apk() возвращает 1, если getenv("HD_APK") не NULL, иначе 0; содержимое значения HD_APK не проверяется. [^148]: fw-apk-260724-0207-r24--data-deploy--php-fs-prefix.c008 · code · android-atv; прошивка 260724_0207_r24 · _php_add_fs_prefix_to_cmd вызывают php_exec, zif_shell_exec, zif_popen, zif_proc_open и virtual_popen (перекрёстные ссылки radare2 в листинге) [^149]: fw-apk-260724-0207-r24--data-deploy--php-fs-prefix.c014 · code · android-atv; прошивка 260724_0207_r24 · _php_add_fs_prefix_to_cmd ищет в команде символы '/' и проверяет путь, только если перед '/' стоит пробел, '!', '&', апостроф, '(', ')', ';', '<', '>' или обратная кавычка; после двойной кавычки, '=', '|', ':', табуляции и прочих символов путь не переписывается [^150]: fw-apk-260724-0207-r24--data-deploy--php-fs-prefix.c011 · code · android-atv; прошивка 260724_0207_r24 · Если первое слово команды оканчивается на /php-cgi (strstr "/php-cgi " раньше первого пробела), _php_add_fs_prefix_to_cmd заменяет его на $FS_PREFIX/firmware_ext/php/php-cgi, дописывает « -c » и исходный каталог этого php-cgi (часть слова до /php-cgi, без префикса), а остаток команды разбирает дальше [^151]: fw-apk-260724-0207-r24--data-deploy--php-fs-prefix.c012 · code · android-atv; прошивка 260724_0207_r24 · Если команда начинается с $FS_PREFIX или с пути, для которого _php_path_needs_prefix.part.0 не 0, и этот путь (после префикса) не начинается с /firmware/bin/ или /firmware_ext/php/, _php_add_fs_prefix_to_cmd начинает результат со строки «sh » (3 байта) [^152]: fw-tv188b-261021-0117-r25--libphp5.c085 · code · android-dune-fw; прошивка 261021_0117_r25 · В r25 _php_add_fs_prefix_to_cmd, если команда начинается с '/' и путь требует префикса (_php_path_needs_prefix.part.0), но не начинается с /firmware/bin/ или /firmware_ext/php/, ставит в начало результата «sh ». [^153]: fw-tv188b-261021-0117-r25--libphp5.c086 · code · android-dune-fw; прошивка 261021_0117_r25 · В r25 _php_add_fs_prefix_to_cmd дописывает $FS_PREFIX к пути у '/', только если байт перед '/' — пробел, '!', '&', апостроф, '(', ')', ';', '<', '>' или '`'; для '/' в первом символе команды проверяется байт перед началом строки. [^154]: fw-tv188b-261021-0117-r25--libphp5.c077 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 exec команды /config/kbp11_x.sh first-word из php_server вернул rc=127 и sh: /config/kbp11_x.sh: No such file or directory; file_get_contents того же пути с use_include_path=true прочитал 49 байт. [^155]: fw-tv188b-261021-0117-r25--libphp5.c080 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 file_get_contents(lib/kbp11_steps.php,true) из php_server прочитал 15678 байт. [^156]: fw-tv188b-261021-0117-r25--libphp5.c078 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 proc_open с cwd=/tmp из php_server вернул rc=0, pwd=/tmp и увидел каталог kb_probe11. [^157]: fw-tv188b-261021-0117-r25--libphp5.c079 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 proc_open с env={KB11_E:one} из php_server вернул rc=0, KB11_E=one и PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:.. [^158]: fw-tv188b-261021-0117-r25.c354 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в окружении php_server плагина kb_probe8 (pid 3005, ppid 2449, uid 1000) PATH=/data/data/com.dunehd.app/firmware/bin:/data/data/com.dunehd.app/bin:/bin:/product/bin:/apex/com.android.runtime/bin:/apex/com.android.art/bin:/system_ext/bin:/system/bin:/system/xbin:/odm/bin:/vendor/bin:/vendor/xbin. [^159]: fw-tv188b-261021-0117-r25--libphp5.c093 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 13 shell_exec("echo x; /config/kbp13_x.sh after-semicolon") выполнил скрипт по пути /data/data/com.dunehd.app/config/kbp13_x.sh: путь после «; » получил $FS_PREFIX (один прогон). [^160]: - fw-tv188b-261021-0117-r25--libphp5.c091 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 13 с PHP_DEBUG=1 exec("/config/kbp13_x.sh first-word 2>&1") в php_server вернул rc=127 и «sh: /config/kbp13_x.sh: No such file or directory» — путь первым словом префикс $FS_PREFIX не получил (повтор наблюдения запроса 11, один прогон). - fw-tv188b-261021-0117-r25--libphp5.c092 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 13 exec("echo /config/kbp13_x.sh") в php_server напечатал /data/data/com.dunehd.app/config/kbp13_x.sh, а exec("sh /config/kbp13_x.sh after-sh") запустил скрипт с argv0 /data/data/com.dunehd.app/config/kbp13_x.sh: путь после пробела получил $FS_PREFIX (один прогон). [^161]: fw-tv188b-261021-0117-r25--libphp5.c094 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 13 после шага g_subst с PHP_DEBUG=1 grep «=H=>» по /tmp/run/kb_probe13.log не нашёл ни одной строки; строк о замене команд в выводе нет (один прогон). [^162]: - fw-tv188b-261021-0117-r25.c147 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 после регистрации плагина из $FS_PREFIX/flashdata/plugins появляется пустой каталог /tmp/plugins/

(владелец system). - fw-tv188b-261021-0117-r25.c148 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 после регистрации плагина, положенного через adb push, появляется каталог $FS_PREFIX/flashdata/plugins_data/

(владелец system). [^163]: - fw-tv188b-261021-0117-r25.c290 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 install_dir_path у kb_probe5 = '/data/data/com.dunehd.app/flashdata/plugins/kb_probe5' (is_dir() = true) — тот же путь, что плагина в /tmp/run/installed_plugins.xml. - fw-tv188b-261021-0117-r25.c316 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 include_path в php_server = '.:<каталог плагина>:/data/data/com.dunehd.app/firmware_ext/php/include', каталог плагина — с префиксом $FS_PREFIX: …/flashdata/plugins/kb_probe5 и …/flashdata/plugins/dune-hd.tv у плагинов из flashdata, …/firmware_ext/plugins/shell_ext и …/firmware_ext/plugins/android_apps у встроенных; php_server пишет его в лог «[server] resetting include path to '…'». - fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c073 · code · android-atv; прошивка 260724_0207_r24 · В APK r24 при замене установленного плагина (fcn.00291428) старому вызывается nav_plugin_delete_plugin_data (fcn.00261034) с флагом 1: удаляются только каталоги установки (список fcn.0021bab0 и plugin->path) и ещё одно поле плагина (+0x14); /tmp/plugin_updater_.txt, поля +0x10, +0x18…+0x24, /tmp/www/plugins/, /tmp/www/cgi-bin/plugins/ и файл, путь которого строит fcn.0027ee94, удаляются только при флаге 0; затем новый каталог копируется (из /tmp/) или переименовывается в <хранилище>/plugins/, снимается флаг скрытия, удаляется /tmp/plugin_updater_.txt и плагин перезагружается [^164]: - fw-tv188b-261021-0117-r25.c292 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 data_dir_path у kb_probe5 (плагин в flashdata) = '/data/data/com.dunehd.app/flashdata/plugins_data/kb_probe5'; is_dir() для него true. - fw-tv188b-261021-0117-r25.c231 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 каталоги данных плагинов лежат в /data/data/com.dunehd.app/flashdata/plugins_data/

, в том числе для встроенных из firmware_ext (widget, radiotime, s928x_dvfel и др.) и dune_internal; в /data/data/com.dunehd.app/config/plugins_data есть только bluray. Других каталогов plugins_data поиск по ФС не нашёл, кроме тех же путей через /data/user/0 и /data_mirror. - fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c090 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 онлайн-обновление сохраняет cookies плагина и его data_dir_path: v2 и v3 получили в plugin_cookies значение kbp7u_mark, записанное v1, файл kbp7u_mark.txt v1 в flashdata/plugins_data/ остался с прежним mtime. [^165]: - fw-tv188b-261021-0117-r25.c291 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 tmp_dir_path у kb_probe5 = '/data/data/com.dunehd.app/tmp/plugins/kb_probe5' — путь /tmp/plugins/kb_probe5 с префиксом FS_PREFIX=/data/data/com.dunehd.app; is_dir() для него true. - fw-tv188b-261021-0117-r25.c294 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 пустой каталог /tmp/plugins/<плагин> PHP-плагина существует уже после регистрации плагина, до первого вызова и запуска его php_server: kb_probe5 — в 13:24 при первом вызове в 13:37:59, kb_probe6 — в 15:06 при первом вызове в 15:08:02 (местное время). [^166]: fw-tv188b-261021-0117-r25.c329 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 php_server при старте пишет «Starting logging to '/data/data/com.dunehd.app/tmp/run/<плагин>.log' (<= 3072000)»; в окружении php_server LOG_DIR=/tmp/run и LOG_MAX_FILE_SIZE=3072000. [^167]: fw-tv188b-261021-0117-r25.c303 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 /tmp/run/<плагин>.pid переписывается при каждом новом запуске php_server: у kb_probe5 файл последовательно содержал 17362, 17676, 17849, 17924, а его mtime совпадал со временем запуска нового процесса (13:37:59.827, 13:39:39.787, 13:40:31.655, 13:40:46.215). [^168]: - fw-tv188b-261021-0117-r25.c123 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 /tmp/mnt содержит каталоги network, smb и storage, все drwxrwxrwx system:system. - fw-tv188b-261021-0117-r25.c124 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 SMB-ресурсы из /tmp/run/network_mount_list.xml (path="/tmp/mnt/smb/", status="mounted") смонтированы как cifs в /tmp/mnt/smb/: например, //<адрес в LAN>/usb_tb — в /tmp/mnt/smb/5. [^169]: fw-tv188b-261021-0117-r25--libphp5.c069 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 php_server kb_probe11 успешно создал и удалил kbp11_w.tmp в /sdcard, /config, /tmp, tmp_dir_path и data_dir_path. [^170]: fw-tv188b-261021-0117-r25--libphp5.c070 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 fopen на запись /data/data/com.dunehd.app/firmware/kbp11_w.tmp из php_server вернул ошибку failed to open stream: Read-only file system. [^171]: fw-tv188b-261021-0117-r25.c375 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 на tv188b r25 /data/data/com.dunehd.app/tmp оказался символической ссылкой на /tmp. [^172]: fw-tv188b-260827-0003-r24.c021 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Скрипт /system/xbin/dunehd/init монтирует tmpfs в /tmp, запускает dunehd_service и выставляет FS_PREFIX=/data/data/com.dunehd.app, HD_APK=1, HD_FW_APK=1, HD_HTTP_LOCAL_PORT=80 [^173]: fw-apk-260724-0207-r24--data-deploy.c028 · code · android-atv; прошивка 260724_0207_r24 · В режиме fw_apk класс содержит другой путь: fwApkEnsureTmpDir удаляет настоящий каталог /tmp и заменяет его симлинком на системный /tmp, а fwApkEnsureSymlinks ставит /firmware → /system/dunehd/firmware и /firmware_ext → /system/dunehd/firmware_ext [^174]: fw-tv188b-260827-0003-r24--plugin-loader.c054 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · libduneshell.so содержит флаги однократных действий /tmp/run/%s_plugin_boot_action_executed.flag и /tmp/run/%s_plugin_boot_end_action_executed.flag с сообщениями «boot action already executed» [^175]: fw-tv188b-261021-0117-r25.c075 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 флаги boot/boot_end встроенных и ранее установленных плагинов (Dune_backup, radiotime, widget_ext, s928x_dvfel) имели mtime 2026-10-25 01:54 — момент загрузки системы, если вычесть /proc/uptime (127797 с) из времени начала прогона 2026-10-26 13:24. [^176]: fw-tv188b-261021-0117-r25.c077 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 при следующих стартах приложения (после am force-stop и после restart_gui) boot и boot_end плагина kb_probe5 не выполнялись повторно — в shell.log «[plugin] kb_probe5: boot action already executed» и «[plugin] kb_probe5: GUI boot action already executed». [^177]: fw-tv188b-261021-0117-r25.c308 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 после каждого перезапуска php_server (по touch main.php, после Fatal error, после exit(0)) статические переменные плагина начинаются заново: счётчик KbProbe5Fw::$n в первом вызове нового процесса снова равен 1 (pid 17676, 17849, 17924). [^178]: doc-sdk-plugins.c066 · doc · any-documented; прошивка — · data_dir_path (постоянные данные) недоступен на устройствах без System Storage и Flash Memory Storage — тогда ключ не задан [^179]: doc-sdk-plugins.c067 · doc · any-documented; прошивка — · После каждой записи в постоянное хранилище нужно сразу выполнять sync (команду или системный вызов) [^180]: fw-tv188b-261021-0117-r25.c256 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 shell_exec во встроенном PHP (php_server и php-cgi CGI) выполняет команду через /system/bin/sh: readlink /proc/$$/exe даёт /system/bin/sh, $0 — sh. [^181]: fw-apk-260724-0207-r24--data-deploy--php-fs-prefix.c019 · code · android-atv; прошивка 260724_0207_r24 · Дочерний процесс proc_open берёт путь оболочки из getenv("PHP_PROC_OPEN_SH"), а если переменной нет — "/bin/sh" [^182]: fw-apk-260724-0207-r24--data-deploy--php-fs-prefix.c020 · code · android-atv; прошивка 260724_0207_r24 · Затем дочерний процесс proc_open вызывает execl(<оболочка>, "sh", "-c", <команда>, NULL), а при заданном аргументе env — execle(…, <массив env>); если exec не удался — _exit(127) [^183]: fw-tv188b-261021-0117-r25.c257 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в окружении php_server PHP-плагинов (kb_probe6, shell_ext, dune-hd.tv, android_apps) PHP_PROC_OPEN_SH=/data/data/com.dunehd.app/bin/sh; $FS_PREFIX/bin/sh — ссылка на /data/data/com.dunehd.app/lib/libxxx_bash.so. [^184]: fw-apk-260724-0207-r24--data-deploy--php-fs-prefix.c021 · code · android-atv; прошивка 260724_0207_r24 · Аргумент cwd в zif_proc_open передаётся в chdir() дочернего процесса как есть: единственный вызов функций _php_*fs_prefix* в листинге zif_proc_open — _php_add_fs_prefix_to_cmd для команды [^185]: - fw-tv188b-261021-0117-r25.c091 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 у процесса network_manager ($FS_PREFIX/firmware/bin/network_manager, PPID 1) в окружении HD_HTTP_LOCAL_PORT=80, HD_FW_APK=1, HD_APK=1, FS_PREFIX=/data/data/com.dunehd.app, LOG_DIR=/tmp/run, DUNEHD_SERVICE_DONT_FORK=1, PATH начинается с $FS_PREFIX/firmware/bin:$FS_PREFIX/bin:/bin, а LD_LIBRARY_PATH=$FS_PREFIX/firmware/lib:/lib:/usr/lib (без /system/xbin/dunehd/firmware/lib). - fw-tv188b-261021-0117-r25.c092 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 у процесса httpd ($FS_PREFIX/bin/httpd, PPID 1) в окружении HD_HTTP_LOCAL_PORT=80, HD_FW_APK=1, HD_APK=1, FS_PREFIX=/data/data/com.dunehd.app, LOG_DIR=/tmp/run, DUNEHD_SERVICE_DONT_FORK=1, PATH начинается с $FS_PREFIX/firmware/bin:$FS_PREFIX/bin:/bin, а LD_LIBRARY_PATH=$FS_PREFIX/firmware/lib:/lib:/usr/lib (без /system/xbin/dunehd/firmware/lib). [^186]: fw-tv188b-260827-0003-r24.c068 · device · tv188b, android-dune-fw; прошивка 260827_0003_r24 · На tv188b r24 в окружении php-cgi плагина shell_ext (pid 26705) есть FS_PREFIX=/data/data/com.dunehd.app, FS_BIN_PREFIX=/data/data/com.dunehd.app, TMPDIR=$FS_PREFIX/tmp, LOG_DIR=/tmp/run, PHP_PROC_OPEN_SH=$FS_PREFIX/bin/sh, APK_PACKAGE_NAME=com.dunehd.app и HOME=/data/user/0/com.dunehd.app/app_vlc; PATH начинается с $FS_PREFIX/firmware/bin:$FS_PREFIX/bin:/bin, а LD_LIBRARY_PATH=$FS_PREFIX/firmware/lib:/lib:/usr/lib. [^187]: fw-tv188b-261021-0117-r25.c394 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 13 $FS_PREFIX/firmware/bin/ffmpeg — символическая ссылка на /data/data/com.dunehd.app/lib/libxxx_ffmpeg.so, а firmware/scripts/ffmpeg.sh — обычный файл 457 байт (один прогон). [^188]: fw-tv188b-261021-0117-r25.c086 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в /system/bin 46 файлов libxxx_*.so, все root:shell с правами -rwxr-xr-x. [^189]: - fw-tv188b-261021-0117-r25.c095 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 $FS_PREFIX/bin/httpd — симлинк на /data/data/com.dunehd.app/lib/libxxx_busybox.so, и в $FS_PREFIX/apk_bin_map.txt есть строка «bin/httpd libxxx_busybox.so». - fw-tv188b-261021-0117-r25.c351 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 $FS_PREFIX/bin/wget — симлинк на $FS_PREFIX/lib/libxxx_busybox.so; /system/bin/libxxx_busybox.so — отдельный файл root:shell размером 987728 байт. [^190]: fw-tv188b-260827-0003-r24--http-api.c112 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · libxxx_busybox.so в tv188b r24 — BusyBox v1.35.0, собранный 2023-11-24 [^191]: fw-apk-260724-0207-r24--data-deploy.c015 · code · android-atv; прошивка 260724_0207_r24 · apk_bin_map.txt ставит в /bin/ 32 ссылки: sh и bash → libxxx_bash.so; tar → libxxx_tar.so; smbd, nmbd, smbpasswd, nmblookup → одноимённые libxxx_*.so; 24 апплета busybox (nohup, uptime, od, touch, tee, sync, sed, xargs, mktemp, killall, awk, date, gunzip, gzip, httpd, ifconfig, netstat, ps, telnetd, unzip, vi, wget, zcat, tail) и сам busybox → libxxx_busybox.so [^192]: - fw-tv188b-260827-0003-r24--init-runtime--dunehd-service.c001 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24, 250815_1012_r22, 261021_0117_r25 · Клиент dunehd_service имеет одинаковые размер, SHA-256 и режим доступа в tv188b r22 (250815_1012), r24 (260827_0003) и r25 (261021_0117). - fw-tv188b-260827-0003-r24--init-runtime--dunehd-service.c002 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24, 250815_1012_r22, 261021_0117_r25 · Сервисный ELF dunehd_service имеет одинаковые размер, SHA-256 и режим доступа в tv188b r22 (250815_1012), r24 (260827_0003) и r25 (261021_0117). - fw-tv188b-260827-0003-r24--init-runtime--dunehd-service.c003 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24, 250815_1012_r22, 261021_0117_r25 · Обёртка dunehd_service.sh имеет одинаковые размер, SHA-256 и режим доступа в tv188b r22 (250815_1012), r24 (260827_0003) и r25 (261021_0117). - fw-tv188b-260827-0003-r24--init-runtime--dunehd-service.c004 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24, 250815_1012_r22, 261021_0117_r25 · Файл окружения dunehd_service.env имеет одинаковые размер, SHA-256 и режим доступа в tv188b r22 (250815_1012), r24 (260827_0003) и r25 (261021_0117). [^193]: fw-tv188b-261021-0117-r25--app-launch.c015 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Удаление пакета (run_uninstall_cmd, r25) PHP выполняет сам через system() командой /system/dunehd/dunehd_service do LD_LIBRARY_PATH= pm uninstall '<пакет>', а не через launch_ext_app. [^194]: fw-tv188b-261021-0117-r25--app-launch.c071 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в запросе 9 в launch_ext_app выбор ветки виден в shell.log: cmd, начинающаяся с «/system/dunehd/dunehd_service do am start …», идёт в ветку «run command» (pclose 0, command status 0), а cmd «am start --user 0 …» — в ветку «launch activity for command» и apk_helper (activity launch status −1, error_action). [^195]: fw-tv188b-260827-0003-r24--http-api--ext-command-params.c098 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 команды IP Control ждут, пока идёт handle_user_input плагина: launch_media_url, отправленный через 4 с после начала 20-секундной операции, получил ответ только после её конца — и для точки входа того же плагина, и для другого плагина. [^196]: fw-tv188b-261021-0117-r25.c343 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 событие PROG_BLUE, нажатое в 22:10:24 во время операции таймера (sleep 3), дошло до плагина в 22:10:26.592 — сразу после timer end в 22:10:26.588, то есть ждало конца операции. [^197]: fw-tv188b-260827-0003-r24--shell-ext.c070 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Протокол async_worker через файлы в /tmp/plugins/<плагин>/async_worker: wake_flag (разбудить), stop_flag (остановить), request. (запрос, читается при пробуждении) и response. (ответ, содержимое — time()); данные — /flashdata/plugins_data/<плагин> [^198]: fw-tv188b-261021-0117-r25--shell-ext--ui-lib--support.c051 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Конструктор HDHttpLoader создаёт пару UNIX-сокетов AF_UNIX/SOCK_STREAM и делает pcntl_fork; в родителе закрывается $this->parent, в ребёнке — $this->child; ребёнок выполняет child_loop и завершается с кодом 33. [^199]: plg-dc-dune-backup.c048 · code · unknown; прошивка — · bin/gui_start.sh запрещает повторный запуск demon_as.sh (проверка ps w и pidof), затем запускает демон через /system/dunehd/dunehd_service do, если этот файл есть, иначе напрямую. [^200]: fw-tv188b-260827-0003-r24.c056 · device · tv188b, android-dune-fw; прошивка 260827_0003_r24 · На tv188b r24 фоновый процесс установленного плагина Dune_backup «sh $FS_PREFIX/flashdata/plugins/Dune_backup/bin/demon_as.sh» (pid 3881 и 27104) работает от root с SELinux-меткой u:r:shell:s0 и PPID 1. [^201]: fw-tv188b-261021-0117-r25--libphp5.c071 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 shell_exec(sleep 61 >/dev/null 2>&1 &) вернулся за 0.01 с; процесс sleep 23847 с PPid=1 оставался после kill php_server 23841 и сохранял открытые pipe-дескрипторы 93/98. [^202]: fw-tv188b-261021-0117-r25--libphp5.c081 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Перед bg2 запроса 12 шаг noop завершился в новом php_server 2929; последующая выборка процессов показала этот сервер и не вывела ни одного sleep 61. [^203]: fw-tv188b-261021-0117-r25--libphp5.c082 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 12 чистый bg2 записал begin и метку перед shell_exec("sleep 61 &") из php_server 2929; в сохранённом отчёте нет записи возврата, а ожидание end bg2 показало 0 → 0 за 75 с. [^204]: fw-tv188b-261021-0117-r25--libphp5.c083 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В чистом bg2 запроса 12 оболочка отменила handle_user_input по тайм-ауту 30.0 с, убила PHP-server и записала отмену операции через 30.333 с с сообщением «Превышено время операции». [^205]: fw-tv188b-261021-0117-r25--libphp5.c084 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · После окна ожидания bg2 запроса 12 выборка процессов в 11:45:06 не вывела sleep 61 и его pipe/socket fd, а заголовок сообщил php_server(kb_probe12)=нет. [^206]: fw-tv188b-261021-0117-r25--libphp5.c095 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В чистом bg2 запроса 13 php_server 15502 записал метку перед shell_exec("sleep 61 &"), записи о возврате нет; оболочка через 30 с отменила handle_user_input по тайм-ауту, убила PHP-server и показала «Превышено время операции» (один прогон, повтор запроса 12). [^207]: fw-tv188b-261021-0117-r25--libphp5.c096 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В bg2 запроса 13 процесс sleep 61 (15964) на 1, 5, 29, 32 и 45 с имел PPid 1 и держал fd 1 на pipe, а также fd 101 (чтение) и 110 (запись) на pipe — те же номера, что в аргументах php_server «… 101 110» (один прогон). [^208]: fw-tv188b-261021-0117-r25--libphp5.c097 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В bg2 запроса 13 php_server 15502 был в заголовке в 20:01:21 и исчез к 20:01:24 (отмена в 20:01:22), а sleep 61 оставался и после этого до 45 с и не был виден на 62 и 70 с — завершился сам, а не вместе с php_server (один прогон). [^209]: plg-dc-widget-ext.c041 · code · unknown; прошивка — · Плагин вызывает свои shell-скрипты из PHP через shell_exec("<путь> > /dev/null &") — в фоне, без ожидания [^210]: fw-tv188b-260827-0003-r24--php-framework.c005 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · bootstrap.php снимает ограничение времени выполнения PHP: set_time_limit(0) [^211]: fw-tv188b-260827-0003-r24--php-framework.c082 · code · tv188b, tv175u, android-dune-fw; прошивка 240619_0210_r22, 250815_1012_r22, 260724_0207_r24, 260827_0003_r24 · bootstrap.php, dune_config.php, dune_plugin.php и dunelib/dune_countries.php одинаковы (sha256) в tv175u 240619_0210_r22, tv188b 250815_1012_r22 и r24-прошивках; dunelib/config_utils, dune_languages, expr, utils в r22-прошивках отсутствуют [^212]: fw-tv188b-261021-0117-r25.c310 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 handle_user_input kb_probe5 со sleep(15) при «start (timeout=60.0s)» доработал без отмены: результат («result action») пришёл через ~15 с после старта, сообщений об отмене по тайм-ауту нет, а следующий вызов исполнил тот же php_server 17676. [^213]: plg-dc-screenshoter.c060 · code · unknown; прошивка — · В CGI фреймворк плагина не подключается: do_config.php сам объявляет класс DuneSystem и заполняет DuneSystem::$properties из $_ENV (PLUGIN_NAME, PLUGIN_INSTALL_DIR_PATH, …) [^214]: fw-tv188b-261021-0117-r25.c335 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · shell_ext/www/cgi-bin/php.ini r25 задаёт cgi.force_redirect = 0, cgi.redirect_status_env = yes, date.timezone = UTC, error_reporting = E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED (E_WARNING включён), magic_quotes_gpc = 0, display_errors = 0, log_errors = 1 и error_log = /tmp/run/shell_ext_cgi.log. [^215]: fw-tv188b-260827-0003-r24--shell-ext.c046 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Конструктор MainPlugin вызывает gc_disable() и HD::init(20); main_plugin.php ставит memory_limit 300M [^216]: fw-tv188b-260827-0003-r24--shell-ext.c072 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · AsyncWorker shell_ext ставит memory_limit 200M, читает /tmp/run/installed_plugins.xml и хранит версию формата данных 2 в /flashdata/plugins_data/shell_ext/data_format_version.txt [^217]: fw-tv188b-261021-0117-r25--shell-ext--ui-lib--support.c037 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Memory::get_used_mb возвращает memory_get_usage(true)/1048576; Memory::check при used>0, used > mem_limit-50 и mem_limit<500 увеличивает лимит на 50 МБ, вызывает ini_set('memory_limit','M') и не уменьшает его; начальный mem_limit=300, максимум 500. [^218]: fw-tv188b-260827-0003-r24--php-framework.c004 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · bootstrap.php устанавливает ini date.timezone из date_default_timezone_get(), с комментарием «Use timezone from the environment (TZ)» как обход известной проблемы PHP с 5.3.0 [^219]: fw-tv188b-261021-0117-r25.c247 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в php_server PHP-плагина ini date.timezone = Europe/Moscow и date_default_timezone_get() = Europe/Moscow при getenv('TZ') = false; date() даёт MSK +0300, getprop persist.sys.timezone — Europe/Moscow. [^220]: fw-tv188b-261021-0117-r25.c248 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в php-cgi CGI плагина с php.ini без date.timezone ini date.timezone пуст; date_default_timezone_get() возвращает Europe/Moscow, но date() и date_default_timezone_get() пишут PHP Warning «It is not safe to rely on the system's timezone settings… We selected 'Europe/Moscow' for 'MSK/3.0/no DST' instead». [^221]: fw-tv188b-261021-0117-r25.c330 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 метки времени в /tmp/run/<плагин>.log и shell.log на 3 часа меньше местного времени: вызов, который date() в php_server kb_probe5 записал как 13:38:00, в логе плагина помечен 10:38:00.049. [^222]: fw-tv188b-261021-0117-r25.c331 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 openssl_x509_parse() в php_server и в php-cgi даёт validTo_time_t = -1 (gmdate — 1969-12-31 23:59:59) у всех сертификатов /firmware/certs/ca-bundle.crt со сроком позже 2038-01-19 03:14:07 UTC (57 из 143), а более ранние сроки переводит верно; 2147483647 (2038-01-19 03:14:07) — настоящий срок сертификата GlobalSign. [^223]: doc-sdk-plugins.c139 · doc · sigma-smp86xx, sigma-smp87xx, android; прошивка — · Лог плагина — /tmp/run/.log (Sigma: tail -F через telnet; Android: busybox tail -F через telnet/ADB) [^224]: fw-tv188b-261021-0117-r25.c326 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 ошибки и предупреждения PHP в коде плагина php_server пишет в /tmp/run/<плагин>.log строкой вида «[<полный путь файла>:<строка>] [E_WARNING] …» / «[…] [E_ERROR] …». [^225]: fw-tv188b-261021-0117-r25.c327 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 предупреждение PHP попадает в /tmp/run/<плагин>.log и для выражения с оператором подавления @: @mkdir(...) в main.php:11 зонда при существующем каталоге дал строку «[…/main.php:11] [E_WARNING] mkdir() …: File exists» при каждом запуске php_server. [^226]: fw-tv188b-260827-0003-r24--php-framework.c001 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · bootstrap.php определяет hd_print($str): выводит строку через echo с суффиксом $HD_NEW_LINE (по умолчанию ''), а при заданном $HD_OB_PREFIX — с этим префиксом и вызовом ob_flush() [^227]: fw-tv188b-260827-0003-r24--php-framework.c002 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · bootstrap.php регистрирует hd_error_handler через set_error_handler и hd_shutdown_handler через register_shutdown_function; обработчик печатает ошибку через hd_print в формате «[файл:строка] [E_ТИП] сообщение» [^228]: fw-tv188b-260827-0003-r24--php-framework.c003 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · hd_silence_warnings() выключает вывод ошибок (error_reporting(0) и пустой обработчик hd_error_silencer), hd_restore_warnings() восстанавливает обработчик и error_reporting(E_STRICT | E_ALL) [^229]: doc-sdk-plugins.c048 · doc · any-documented; прошивка — · bootstrap.php настраивает вывод ошибок PHP во внутренний лог, текущий часовой пояс и определяет hd_print() — её следует использовать вместо echo/print/printf [^230]: fw-tv188b-260827-0003-r24--plugin-loader.c036 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · run_plugin_cgi пишет stderr CGI-скриптов в $FS_PREFIX/tmp/dune_apk_cgi_err.log и переносит лог в .old, когда он больше 10000 байт [^231]: fw-tv188b-261021-0117-r25.c234 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 PHP-скрипт CGI плагина (php-cgi через CGI-обёртку), выполнивший curl_multi на 4 хендла к httpd самого плеера (http://127.0.0.1/plugins/…, http://127.0.0.1:80/cgi-bin/plugins/…, http://localhost/cgi-bin/plugins/…), доходит до curl_multi_info_read и получает все 4 сообщения с msg=1 result=0, после чего php-cgi завершается с кодом 139 и в /tmp/dune_apk_cgi_err.log появляется «Segmentation fault»; повторный запуск дал то же самое. [^232]: fw-tv188b-261021-0117-r25.c166 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 после вызовов sh-CGI плагинов в /tmp/dune_apk_cgi_err.log есть строки «WARNING: linker: Warning: unable to normalize "./lib" (ignoring)». [^233]: fw-apk-260724-0207-r24--data-deploy--php-fs-prefix.c017 · code · android-atv; прошивка 260724_0207_r24 · Если команда изменена и задана переменная PHP_DEBUG, _php_add_fs_prefix_to_cmd печатает в stdout « -C-> EEE orig command: %s» с исходной и « -C-> EEE repl command: %s» с новой командой [^234]: fw-apk-260724-0207-r24--data-deploy--php-fs-prefix.c039 · code · android-atv; прошивка 260724_0207_r24 · После замены URL при заданной PHP_DEBUG _php_add_fs_prefix_to_http печатает в stdout « =H=> EEE orig http: %s» с исходным и « =H=> EEE repl http: %s» с новым URL [^235]: fw-tv188b-261021-0117-r25--libphp5--curl-http.c021 · code · android-dune-fw; прошивка 260827_0003_r24 · В r24 _php_add_fs_prefix_to_http не вызывает lcreg и других функций замены хоста; при отсутствии HD_HTTP_LOCAL_PORT или несовпадении префикса URL не меняется, а печать исходного и нового URL ограждена getenv("PHP_DEBUG"). [^236]: fw-tv188b-261021-0117-r25--libphp5.c076 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 после wget с putenv(PHP_DEBUG=1) собранный grep EEE по /tmp/run/kb_probe11.log не вывел строк; успешный результат самого wget записан. [^237]: fw-tv188b-261021-0117-r25--libphp5--curl-http.c036 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 13 с PHP_DEBUG=1 и HD_HTTP_LOCAL_PORT=80 curl_setopt(CURLOPT_URL, http://127.0.0.1/cgi-bin/plugins/kb_probe13/host.sh) дал в логе плагина «=H=> EEE orig http» с исходным URL и «repl http: http://127.0.0.1:80/cgi-bin/plugins/kb_probe13/host.sh», а CURLINFO_EFFECTIVE_URL — тот же URL с :80 (один прогон). [^238]: - fw-tv188b-261021-0117-r25--libphp5.c094 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 13 после шага g_subst с PHP_DEBUG=1 grep «=H=>» по /tmp/run/kb_probe13.log не нашёл ни одной строки; строк о замене команд в выводе нет (один прогон). - fw-apk-260724-0207-r24--data-deploy--php-fs-prefix.c017 · code · android-atv; прошивка 260724_0207_r24 · Если команда изменена и задана переменная PHP_DEBUG, _php_add_fs_prefix_to_cmd печатает в stdout « -C-> EEE orig command: %s» с исходной и « -C-> EEE repl command: %s» с новой командой [^239]: fw-tv188b-261021-0117-r25--libphp5.c005 · device · android-dune-fw; прошивка 261021_0117_r25 · На tv188b 261021_0117_r25 запуск php-cgi -v из collect5 завершился CANNOT LINK EXECUTABLE: library libphp5.so not found. [^240]: fw-tv188b-261021-0117-r25.c238 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 php-cgi, запущенный CGI-обёрткой плагина без изменения LD_LIBRARY_PATH, стартует и выполняет скрипт; в окружении php-cgi LD_LIBRARY_PATH=/data/data/com.dunehd.app/firmware/lib:/lib:/usr/lib. [^241]: - fw-tv188b-261021-0117-r25.c304 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 после touch main.php плагина kb_probe5 следующий вызов handle_user_input сначала перезапускает php_server: в shell.log того же процесса оболочки «[kb_probe5] [php] start_call(): PHP-script modification detected (1793009215). Restarting PHP-server-process...», «shutting down...», «stopped.», «server started; pid: 17676.», и вызов исполняет уже новый процесс 17676. - fw-tv188b-261021-0117-r25.c306 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 правка файла lib/kbp5_lib.php, подключаемого из main.php через require_once, без изменения main.php не перезапустила php_server kb_probe5: следующий вызов исполнил тот же процесс 17362 (n=5) со старой версией функции (lib=v1), в shell.log между «start» и «result action» сообщений о перезапуске нет. [^242]: - fw-tv188b-261021-0117-r25.c254 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в файловых функциях встроенного PHP (php_server и php-cgi) realpath('/config') = /data/data/com.dunehd.app/config, realpath('/firmware') = /system/dunehd/firmware, realpath('/firmware_ext/php') = /system/dunehd/firmware_ext/php, хотя в корне ФС (adb shell) /firmware и /firmware_ext нет, а /config — другой каталог. - fw-tv188b-261021-0117-r25.c255 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 во встроенном PHP (php_server и php-cgi CGI плагина) путь /flashdata существует: is_dir('/flashdata') = true, realpath — /data/data/com.dunehd.app/flashdata, хотя в корне ФС (adb shell) /flashdata нет. [^243]: - fw-tv188b-261021-0117-r25.c246 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в php_server и php-cgi константы JSON_BIGINT_AS_STRING, JSON_UNESCAPED_UNICODE, JSON_UNESCAPED_SLASHES и JSON_PRETTY_PRINT не определены; JSON_NUMERIC_CHECK (32), JSON_HEX_TAG (1), JSON_FORCE_OBJECT (16), JSON_ERROR_UTF8 (5) определены. - fw-tv188b-261021-0117-r25.c250 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в php_server и php-cgi не определены константы CURLOPT_ACCEPT_ENCODING, CURLOPT_RESOLVE, CURL_SSLVERSION_TLSv1_2, CURLOPT_SSL_VERIFYSTATUS, CURLOPT_TCP_KEEPALIVE, CURLMOPT_PIPELINING и CURLMOPT_MAXCONNECTS; CURLOPT_ENCODING (10102), CURLOPT_SSLVERSION, CURLOPT_CAINFO, CURLOPT_TIMEOUT_MS, CURLOPT_CONNECTTIMEOUT_MS, CURLOPT_NOSIGNAL и CURLOPT_IPRESOLVE определены. [^244]: - fw-tv188b-261021-0117-r25.c235 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 тот же зонд curl_multi (4 хендла к httpd плеера) в php_server PHP-плагина (операция handle_user_input) доходит до curl_multi_info_read со всеми 4 сообщениями msg=1 result=0; результата операция не возвращает: через ~0,25 с после её начала оболочка пишет в shell.log «[kb_probe6] [php] E: op 11 failed (read status: 2).», «shutting down...», «stopped.» и «Error: operation returned PHP_CALL_FAILED.». - fw-tv188b-261021-0117-r25--libphp5--curl-http.c029 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В multi запроса 12 оболочка получила EOF от PHP-сервера, записала PHP_CALL_FAILED и stopped; end multi за 25 с не появился, а при сборе php_server зонда уже не найден. - fw-tv188b-261021-0117-r25.c320 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 при сбое PHP-вызова (Fatal error или exit(0) в handle_user_input) оболочка пишет в shell.log «[<плагин>] [php] poll_calls() E: treating empty result as failure and stopping server», останавливает php_server («shutting down...», «stopped.»), затем «Error: operation returned PHP_CALL_FAILED.», «[handle_user_input] Failed.» и «[plugin] <плагин>: FATAL ERROR detected (msg = Ошибка приложения)». - fw-tv188b-261021-0117-r25--php-framework.c063 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 после E_ERROR от вызова несуществующего HD::make_json_rpc_request в handle_user_input оболочка записала «poll_calls() E: treating empty result as failure and stopping server», остановила php_server, получила PHP_CALL_FAILED и выполнила plugin_show_error («FATAL ERROR detected (msg = Ошибка приложения)»). - fw-tv188b-260827-0003-r24--plugin-loader--php-runtime.c039 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25, если call_plugin PHP-плагина возвращает null, php_server ничего не пишет в ответ и завершает цикл по EOF канала, а оболочка печатает «poll_calls() E: treating empty result as failure and stopping server», «Error: operation returned PHP_CALL_FAILED.», «result status failed», выполняет plugin_show_error и «FATAL ERROR detected (msg = Ошибка приложения)»; на экране — «Ошибка приложения / Произошла ошибка. Приложение будет закрыто.». [^245]: - fw-tv188b-261021-0117-r25--libphp5.c082 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 12 чистый bg2 записал begin и метку перед shell_exec("sleep 61 &") из php_server 2929; в сохранённом отчёте нет записи возврата, а ожидание end bg2 показало 0 → 0 за 75 с. - fw-tv188b-261021-0117-r25--libphp5.c083 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В чистом bg2 запроса 12 оболочка отменила handle_user_input по тайм-ауту 30.0 с, убила PHP-server и записала отмену операции через 30.333 с с сообщением «Превышено время операции». - fw-tv188b-261021-0117-r25--libphp5.c095 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В чистом bg2 запроса 13 php_server 15502 записал метку перед shell_exec("sleep 61 &"), записи о возврате нет; оболочка через 30 с отменила handle_user_input по тайм-ауту, убила PHP-server и показала «Превышено время операции» (один прогон, повтор запроса 12). - fw-tv188b-261021-0117-r25--libphp5.c096 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В bg2 запроса 13 процесс sleep 61 (15964) на 1, 5, 29, 32 и 45 с имел PPid 1 и держал fd 1 на pipe, а также fd 101 (чтение) и 110 (запись) на pipe — те же номера, что в аргументах php_server «… 101 110» (один прогон). - fw-tv188b-261021-0117-r25--libphp5.c097 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В bg2 запроса 13 php_server 15502 был в заголовке в 20:01:21 и исчез к 20:01:24 (отмена в 20:01:22), а sleep 61 оставался и после этого до 45 с и не был виден на 62 и 70 с — завершился сам, а не вместе с php_server (один прогон). - fw-tv188b-261021-0117-r25--libphp5.c071 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 shell_exec(sleep 61 >/dev/null 2>&1 &) вернулся за 0.01 с; процесс sleep 23847 с PPid=1 оставался после kill php_server 23841 и сохранял открытые pipe-дескрипторы 93/98. [^246]: - fw-tv188b-260827-0003-r24--plugin-loader--php-runtime--opexec.c033 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 после отмены handle_user_input по тайм-ауту оболочка выполняет plugin_show_error, и на экране — диалог «Превышено время операции» с кнопкой OK (перевод plugin_operation_timed_out). - fw-tv188b-260827-0003-r24--plugin-loader--php-runtime--opexec.c032 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 по тайм-ауту handle_user_input оболочка останавливает php_server плагина и тем прерывает вызов: за «cancelling by timeout (N s)» следуют «FATAL ERROR detected (msg = operation timed out)», «[php] shutting down...», через ~0,25 с «killing PHP-server process...» и «stopped.», затем «canceling req N (fast: 1)», «PHP-FW was shut down. The operation fails.», «result status canceled» и «canceled in N s»; PHP-код вызова не доработал. [^247]: fw-tv188b-261021-0117-r25--libphp5.c050 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · www.ssl.com на tv188b r25 из php_server (uid 1000) с полным бандлом, без корня Entrust и только с корнем Entrust при включённой проверке TLS даёт errno 60 «self signed certificate in certificate chain»; без проверки — HTTP 200, а цепочка заканчивается самоподписанным SSL.com TLS RSA Root CA 2022. [^248]: fw-tv188b-261021-0117-r25--libphp5.c051 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · kodikapi.com на tv188b r25 из php_server (uid 1000) во всех четырёх режимах (full, no_entrust, only_entrust, no_verify) получил errno 35 «OpenSSL SSL_connect: SSL_ERROR_SYSCALL in connection to kodikapi.com:443» и HTTP 0; причина не установлена. [^249]: - fw-tv188b-261021-0117-r25.c353 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 вызов $FS_PREFIX/bin/wget -q -O - 'http://127.0.0.1/cgi-bin/do?cmd=status' | head -c 80 из php_server (uid 1000) в том же прогоне вернул пустой вывод, а [exit 0] — код head в конвейере; причина не установлена. - fw-tv188b-261021-0117-r25.c352 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 команда wget -q -O - 'http://127.0.0.1/cgi-bin/do?cmd=status' | head -c 80 из php_server (uid 1000) вернула начало XML-ответа &1") в php_server вернул rc=127 и «sh: /config/kbp13_x.sh: No such file or directory» — путь первым словом префикс $FS_PREFIX не получил (повтор наблюдения запроса 11, один прогон). - fw-tv188b-261021-0117-r25--libphp5.c092 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 13 exec("echo /config/kbp13_x.sh") в php_server напечатал /data/data/com.dunehd.app/config/kbp13_x.sh, а exec("sh /config/kbp13_x.sh after-sh") запустил скрипт с argv0 /data/data/com.dunehd.app/config/kbp13_x.sh: путь после пробела получил $FS_PREFIX (один прогон). - fw-tv188b-261021-0117-r25--libphp5.c085 · code · android-dune-fw; прошивка 261021_0117_r25 · В r25 _php_add_fs_prefix_to_cmd, если команда начинается с '/' и путь требует префикса (_php_path_needs_prefix.part.0), но не начинается с /firmware/bin/ или /firmware_ext/php/, ставит в начало результата «sh ». - fw-tv188b-261021-0117-r25--libphp5.c086 · code · android-dune-fw; прошивка 261021_0117_r25 · В r25 _php_add_fs_prefix_to_cmd дописывает $FS_PREFIX к пути у '/', только если байт перед '/' — пробел, '!', '&', апостроф, '(', ')', ';', '<', '>' или '`'; для '/' в первом символе команды проверяется байт перед началом строки. [^252]: - fw-tv188b-261021-0117-r25--libphp5.c070 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 fopen на запись /data/data/com.dunehd.app/firmware/kbp11_w.tmp из php_server вернул ошибку failed to open stream: Read-only file system. - fw-tv188b-261021-0117-r25--libphp5.c069 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 php_server kb_probe11 успешно создал и удалил kbp11_w.tmp в /sdcard, /config, /tmp, tmp_dir_path и data_dir_path. [^253]: - fw-tv188b-261021-0117-r25.c241 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 $FS_PREFIX/firmware_ext/php/php-cgi, запущенный из adb shell (adbd root) с LD_LIBRARY_PATH=$FS_PREFIX/lib:$LD_LIBRARY_PATH, не стартует — «CANNOT LINK EXECUTABLE … library "libiconv.so.2" not found: needed by main executable», код 1 (и с -v, и с -q -f). - fw-tv188b-261021-0117-r25.c238 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 php-cgi, запущенный CGI-обёрткой плагина без изменения LD_LIBRARY_PATH, стартует и выполняет скрипт; в окружении php-cgi LD_LIBRARY_PATH=/data/data/com.dunehd.app/firmware/lib:/lib:/usr/lib. [^254]: fw-tv188b-261021-0117-r25.c355 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в окружении php_server плагина kb_probe8 (pid 3005, ppid 2449, uid 1000) HOME=/data/user/0/com.dunehd.app/app_vlc. [^255]: fw-tv188b-261021-0117-r25.c356 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в окружении php_server плагина kb_probe8 (pid 3005, ppid 2449, uid 1000) TMPDIR=/data/data/com.dunehd.app/tmp. [^256]: fw-tv188b-261021-0117-r25.c357 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в окружении php_server плагина kb_probe8 (pid 3005, ppid 2449, uid 1000) FS_BIN_PREFIX=/data/data/com.dunehd.app. [^257]: fw-tv188b-261021-0117-r25.c358 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в окружении php_server плагина kb_probe8 (pid 3005, ppid 2449, uid 1000) APK_PACKAGE_NAME=com.dunehd.app. [^258]: fw-tv188b-261021-0117-r25.c359 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в окружении php_server плагина kb_probe8 (pid 3005, ppid 2449, uid 1000) HD_APK=1. [^259]: fw-tv188b-261021-0117-r25.c360 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в окружении php_server плагина kb_probe8 (pid 3005, ppid 2449, uid 1000) HD_FW_APK=1. [^260]: fw-tv188b-261021-0117-r25.c361 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в окружении php_server плагина kb_probe8 (pid 3005, ppid 2449, uid 1000) HD_HTTP_LOCAL_PORT=80. [^261]: fw-tv188b-261021-0117-r25.c362 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в окружении php_server плагина kb_probe8 (pid 3005, ppid 2449, uid 1000) HD_DSSD_AMEM=0xecc5679c; в прогоне kb_probe5 (collect5) у php_server было HD_DSSD_AMEM=0x2e78afb7 — значение меняется между прогонами. [^262]: fw-tv188b-261021-0117-r25.c363 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в окружении php_server плагина kb_probe8 (pid 3005, ppid 2449, uid 1000) HD_RMCL_DISABLE_CLOPTNS=1. [^263]: fw-tv188b-261021-0117-r25--libphp5.c061 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 /proc/self/environ php_server kb_probe11 содержал PHP_PROC_OPEN_SH=/data/data/com.dunehd.app/bin/sh, FS_PREFIX=/data/data/com.dunehd.app, TMPDIR=/data/data/com.dunehd.app/tmp, FS_BIN_PREFIX=/data/data/com.dunehd.app и HD_HTTP_LOCAL_PORT=80. [^264]: fw-tv188b-261021-0117-r25.c390 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 13 /proc/self/environ php_server зонда kb_probe13 содержал, кроме общих с CGI переменных, HOME=/data/user/0/com.dunehd.app/app_vlc, TMPDIR=/data/data/com.dunehd.app/tmp, FS_BIN_PREFIX=/data/data/com.dunehd.app, APK_PACKAGE_NAME=com.dunehd.app, PHP_PROC_OPEN_SH=/data/data/com.dunehd.app/bin/sh, LOG_MAX_FILE_SIZE=3072000 и HD_RMCL_DISABLE_CLOPTNS=1 (один прогон). [^265]: fw-tv188b-260827-0003-r24--init-runtime--dunehd-service.c014 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24, 261021_0117_r25 · client_authenticate берёт числовое значение через getenv(HD_DSSD_AMEM), а при отсутствии переменной использует get_default_env; значение разбирается strtoul с основанием 0. [^266]: fw-tv188b-261021-0117-r25.c382 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 вывод env sh-скрипта env.sh плагина kb_probe5, запущенного busybox httpd как CGI (uid=0), — это окружение sh-CGI, а не самого процесса php-cgi — содержит FS_PREFIX=/data/data/com.dunehd.app. [^267]: fw-tv188b-261021-0117-r25.c388 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в выводе env sh-скрипта env.sh плагина kb_probe5, запущенного busybox httpd как CGI (uid=0), нет переменных HOME, TMPDIR, FS_BIN_PREFIX, APK_PACKAGE_NAME, PHP_PROC_OPEN_SH, HD_DSSD_AMEM и HD_RMCL_DISABLE_CLOPTNS, которые были в окружении php_server kb_probe8. [^268]: fw-tv188b-261021-0117-r25.c392 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 13 набор имён переменных в /proc/self/environ php-cgi совпал с набором имён в env sh-обёртки того же CGI-запроса (различие только в значении «_»): окружение php-cgi — это окружение sh-CGI busybox httpd (один прогон). [^269]: - fw-tv188b-261021-0117-r25.c350 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 команды зонда из php_server (uid 1000) дают FS_PREFIX=/data/data/com.dunehd.app; which wget и command -v wget возвращают /data/data/com.dunehd.app/bin/wget. - fw-tv188b-261021-0117-r25.c258 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в окружении php-cgi CGI плагина переменной PHP_PROC_OPEN_SH нет (getenv = false), а FS_PREFIX = /data/data/com.dunehd.app есть. - fw-tv188b-261021-0117-r25.c382 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 вывод env sh-скрипта env.sh плагина kb_probe5, запущенного busybox httpd как CGI (uid=0), — это окружение sh-CGI, а не самого процесса php-cgi — содержит FS_PREFIX=/data/data/com.dunehd.app. - fw-tv188b-261021-0117-r25.c081 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 скрипт global_action plugin_system (boot, boot_end, gui_start) работает под uid 1000(system) с SELinux-контекстом u:r:system_app:s0, текущим каталогом / и переменной окружения FS_PREFIX=/data/data/com.dunehd.app; $0 — абсолютный путь скрипта. - fw-tv188b-261021-0117-r25.c172 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 bin/movie_suppliers_update.sh плагина-поставщика выполняется с uid 1000 и переменной окружения FS_PREFIX=/data/data/com.dunehd.app. - fw-tv188b-260827-0003-r24.c068 · device · tv188b, android-dune-fw; прошивка 260827_0003_r24 · На tv188b r24 в окружении php-cgi плагина shell_ext (pid 26705) есть FS_PREFIX=/data/data/com.dunehd.app, FS_BIN_PREFIX=/data/data/com.dunehd.app, TMPDIR=$FS_PREFIX/tmp, LOG_DIR=/tmp/run, PHP_PROC_OPEN_SH=$FS_PREFIX/bin/sh, APK_PACKAGE_NAME=com.dunehd.app и HOME=/data/user/0/com.dunehd.app/app_vlc; PATH начинается с $FS_PREFIX/firmware/bin:$FS_PREFIX/bin:/bin, а LD_LIBRARY_PATH=$FS_PREFIX/firmware/lib:/lib:/usr/lib. - fw-tv188b-260827-0003-r24.c063 · device · tv188b, android-dune-fw; прошивка 260827_0003_r24 · На tv188b r24 в окружении dunehd_service (pid 587) есть FS_PREFIX=/data/data/com.dunehd.app, HD_APK=1, HD_FW_APK=1, HD_HTTP_LOCAL_PORT=80 и DUNEHD_SERVICE_DONT_FORK=1, а PATH начинается с $FS_PREFIX/firmware/bin:$FS_PREFIX/bin:/bin. [^270]: - fw-tv188b-261021-0117-r25.c091 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 у процесса network_manager ($FS_PREFIX/firmware/bin/network_manager, PPID 1) в окружении HD_HTTP_LOCAL_PORT=80, HD_FW_APK=1, HD_APK=1, FS_PREFIX=/data/data/com.dunehd.app, LOG_DIR=/tmp/run, DUNEHD_SERVICE_DONT_FORK=1, PATH начинается с $FS_PREFIX/firmware/bin:$FS_PREFIX/bin:/bin, а LD_LIBRARY_PATH=$FS_PREFIX/firmware/lib:/lib:/usr/lib (без /system/xbin/dunehd/firmware/lib). - fw-tv188b-261021-0117-r25.c092 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 у процесса httpd ($FS_PREFIX/bin/httpd, PPID 1) в окружении HD_HTTP_LOCAL_PORT=80, HD_FW_APK=1, HD_APK=1, FS_PREFIX=/data/data/com.dunehd.app, LOG_DIR=/tmp/run, DUNEHD_SERVICE_DONT_FORK=1, PATH начинается с $FS_PREFIX/firmware/bin:$FS_PREFIX/bin:/bin, а LD_LIBRARY_PATH=$FS_PREFIX/firmware/lib:/lib:/usr/lib (без /system/xbin/dunehd/firmware/lib). - fw-tv188b-261021-0117-r25.c384 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 вывод env sh-скрипта env.sh плагина kb_probe5, запущенного busybox httpd как CGI (uid=0), — окружение sh-CGI, не процесса php-cgi — содержит HD_APK=1 и HD_FW_APK=1. - fw-tv188b-260827-0003-r24.c069 · device · tv188b, android-dune-fw; прошивка 260827_0003_r24 · На tv188b r24 в окружении php-cgi плагина shell_ext (pid 26705) есть HD_HTTP_LOCAL_PORT=80, HD_APK=1, HD_FW_APK=1, HD_DSSD_AMEM=0x0744a101, HD_RMCL_DISABLE_CLOPTNS=1, LOG_MAX_FILE_SIZE=3072000 и VLC_DATA_PATH=/system/usr/share. - fw-apk-260724-0207-r24--data-deploy.c034 · code · android-atv; прошивка 260724_0207_r24 · runDaemonProcess задаёт HD_APK=1; переменной HD_FW_APK среди его строк нет (const-string метода: LOG_DIR, HD_APK, HD_HTTP_LOCAL_PORT, FS_PREFIX, PATH, LD_LIBRARY_PATH, HOME, PWD, /tmp/run и пути) - fw-tv175u-260724-0207-r24.c023 · code · tv175u, android; прошивка 260724_0207_r24 · Скрипт /system/dunehd/init не выставляет HD_APK, HD_FW_APK и FS_PREFIX: перед запуском dunehd_service он экспортирует только PATH, LD_LIBRARY_PATH=/firmware/lib:/lib:/usr/lib и LOG_DIR=/tmp/run [^271]: - fw-tv188b-261021-0117-r25.c361 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в окружении php_server плагина kb_probe8 (pid 3005, ppid 2449, uid 1000) HD_HTTP_LOCAL_PORT=80. - fw-tv188b-261021-0117-r25--libphp5.c061 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 /proc/self/environ php_server kb_probe11 содержал PHP_PROC_OPEN_SH=/data/data/com.dunehd.app/bin/sh, FS_PREFIX=/data/data/com.dunehd.app, TMPDIR=/data/data/com.dunehd.app/tmp, FS_BIN_PREFIX=/data/data/com.dunehd.app и HD_HTTP_LOCAL_PORT=80. - fw-tv188b-261021-0117-r25.c381 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в окружении php_server плагина kb_probe6 (запрос 6) HD_HTTP_LOCAL_PORT=80. - fw-tv188b-261021-0117-r25.c383 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 вывод env sh-скрипта env.sh плагина kb_probe5, запущенного busybox httpd как CGI (uid=0), — окружение sh-CGI, не процесса php-cgi — содержит HD_HTTP_LOCAL_PORT=80. - fw-tv188b-261021-0117-r25.c391 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 13 php-cgi (/data/data/com.dunehd.app/firmware_ext/php/php-cgi, php_sapi_name cgi-fcgi, uid 0), запущенный busybox httpd для /cgi-bin/plugins/kb_probe13/env, имел FS_PREFIX, HD_HTTP_LOCAL_PORT=80, LD_LIBRARY_PATH, PATH, LOG_DIR, HD_APK, PLUGIN_NAME, PLUGIN_CGI_DIR и DUNEHD_SERVICE_DONT_FORK, а getenv(HOME) и getenv(TMPDIR) вернули false (один прогон). - fw-tv188b-260827-0003-r24.c069 · device · tv188b, android-dune-fw; прошивка 260827_0003_r24 · На tv188b r24 в окружении php-cgi плагина shell_ext (pid 26705) есть HD_HTTP_LOCAL_PORT=80, HD_APK=1, HD_FW_APK=1, HD_DSSD_AMEM=0x0744a101, HD_RMCL_DISABLE_CLOPTNS=1, LOG_MAX_FILE_SIZE=3072000 и VLC_DATA_PATH=/system/usr/share. - fw-apk-260724-0207-r24--data-deploy.c033 · code · android-atv; прошивка 260724_0207_r24 · runDaemonProcess задаёт HD_HTTP_LOCAL_PORT=11080 (константа HDConfig.HD_HTTP_LOCAL_PORT, подставлена в байткод как const/16 11080) [^272]: - fw-tv188b-261021-0117-r25.c091 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 у процесса network_manager ($FS_PREFIX/firmware/bin/network_manager, PPID 1) в окружении HD_HTTP_LOCAL_PORT=80, HD_FW_APK=1, HD_APK=1, FS_PREFIX=/data/data/com.dunehd.app, LOG_DIR=/tmp/run, DUNEHD_SERVICE_DONT_FORK=1, PATH начинается с $FS_PREFIX/firmware/bin:$FS_PREFIX/bin:/bin, а LD_LIBRARY_PATH=$FS_PREFIX/firmware/lib:/lib:/usr/lib (без /system/xbin/dunehd/firmware/lib). - fw-tv188b-261021-0117-r25.c092 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 у процесса httpd ($FS_PREFIX/bin/httpd, PPID 1) в окружении HD_HTTP_LOCAL_PORT=80, HD_FW_APK=1, HD_APK=1, FS_PREFIX=/data/data/com.dunehd.app, LOG_DIR=/tmp/run, DUNEHD_SERVICE_DONT_FORK=1, PATH начинается с $FS_PREFIX/firmware/bin:$FS_PREFIX/bin:/bin, а LD_LIBRARY_PATH=$FS_PREFIX/firmware/lib:/lib:/usr/lib (без /system/xbin/dunehd/firmware/lib). - fw-tv188b-261021-0117-r25.c385 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 вывод env sh-скрипта env.sh плагина kb_probe5, запущенного busybox httpd как CGI (uid=0), — окружение sh-CGI, не процесса php-cgi — содержит PATH, начинающийся с /data/data/com.dunehd.app/firmware/bin:/data/data/com.dunehd.app/bin:/bin, тот же, что в php_server kb_probe8. - fw-tv188b-260827-0003-r24.c068 · device · tv188b, android-dune-fw; прошивка 260827_0003_r24 · На tv188b r24 в окружении php-cgi плагина shell_ext (pid 26705) есть FS_PREFIX=/data/data/com.dunehd.app, FS_BIN_PREFIX=/data/data/com.dunehd.app, TMPDIR=$FS_PREFIX/tmp, LOG_DIR=/tmp/run, PHP_PROC_OPEN_SH=$FS_PREFIX/bin/sh, APK_PACKAGE_NAME=com.dunehd.app и HOME=/data/user/0/com.dunehd.app/app_vlc; PATH начинается с $FS_PREFIX/firmware/bin:$FS_PREFIX/bin:/bin, а LD_LIBRARY_PATH=$FS_PREFIX/firmware/lib:/lib:/usr/lib. - fw-tv188b-261021-0117-r25.c354 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в окружении php_server плагина kb_probe8 (pid 3005, ppid 2449, uid 1000) PATH=/data/data/com.dunehd.app/firmware/bin:/data/data/com.dunehd.app/bin:/bin:/product/bin:/apex/com.android.runtime/bin:/apex/com.android.art/bin:/system_ext/bin:/system/bin:/system/xbin:/odm/bin:/vendor/bin:/vendor/xbin. [^273]: - fw-tv188b-261021-0117-r25.c238 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 php-cgi, запущенный CGI-обёрткой плагина без изменения LD_LIBRARY_PATH, стартует и выполняет скрипт; в окружении php-cgi LD_LIBRARY_PATH=/data/data/com.dunehd.app/firmware/lib:/lib:/usr/lib. - fw-tv188b-261021-0117-r25.c386 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 вывод env sh-скрипта env.sh плагина kb_probe5, запущенного busybox httpd как CGI (uid=0), — окружение sh-CGI, не процесса php-cgi — содержит LD_LIBRARY_PATH=/data/data/com.dunehd.app/firmware/lib:/lib:/usr/lib. - fw-tv188b-260827-0003-r24.c068 · device · tv188b, android-dune-fw; прошивка 260827_0003_r24 · На tv188b r24 в окружении php-cgi плагина shell_ext (pid 26705) есть FS_PREFIX=/data/data/com.dunehd.app, FS_BIN_PREFIX=/data/data/com.dunehd.app, TMPDIR=$FS_PREFIX/tmp, LOG_DIR=/tmp/run, PHP_PROC_OPEN_SH=$FS_PREFIX/bin/sh, APK_PACKAGE_NAME=com.dunehd.app и HOME=/data/user/0/com.dunehd.app/app_vlc; PATH начинается с $FS_PREFIX/firmware/bin:$FS_PREFIX/bin:/bin, а LD_LIBRARY_PATH=$FS_PREFIX/firmware/lib:/lib:/usr/lib. [^274]: - fw-tv188b-261021-0117-r25.c257 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в окружении php_server PHP-плагинов (kb_probe6, shell_ext, dune-hd.tv, android_apps) PHP_PROC_OPEN_SH=/data/data/com.dunehd.app/bin/sh; $FS_PREFIX/bin/sh — ссылка на /data/data/com.dunehd.app/lib/libxxx_bash.so. - fw-tv188b-261021-0117-r25.c258 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в окружении php-cgi CGI плагина переменной PHP_PROC_OPEN_SH нет (getenv = false), а FS_PREFIX = /data/data/com.dunehd.app есть. - fw-tv188b-260827-0003-r24.c068 · device · tv188b, android-dune-fw; прошивка 260827_0003_r24 · На tv188b r24 в окружении php-cgi плагина shell_ext (pid 26705) есть FS_PREFIX=/data/data/com.dunehd.app, FS_BIN_PREFIX=/data/data/com.dunehd.app, TMPDIR=$FS_PREFIX/tmp, LOG_DIR=/tmp/run, PHP_PROC_OPEN_SH=$FS_PREFIX/bin/sh, APK_PACKAGE_NAME=com.dunehd.app и HOME=/data/user/0/com.dunehd.app/app_vlc; PATH начинается с $FS_PREFIX/firmware/bin:$FS_PREFIX/bin:/bin, а LD_LIBRARY_PATH=$FS_PREFIX/firmware/lib:/lib:/usr/lib. [^275]: fw-tv188b-261021-0117-r25.c387 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 вывод env sh-скрипта env.sh плагина kb_probe5, запущенного busybox httpd как CGI (uid=0), — окружение sh-CGI, не процесса php-cgi — содержит LOG_DIR=/tmp/run и DUNEHD_SERVICE_DONT_FORK=1. [^276]: - fw-tv188b-261021-0117-r25.c329 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 php_server при старте пишет «Starting logging to '/data/data/com.dunehd.app/tmp/run/<плагин>.log' (<= 3072000)»; в окружении php_server LOG_DIR=/tmp/run и LOG_MAX_FILE_SIZE=3072000. - fw-tv188b-261021-0117-r25.c387 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 вывод env sh-скрипта env.sh плагина kb_probe5, запущенного busybox httpd как CGI (uid=0), — окружение sh-CGI, не процесса php-cgi — содержит LOG_DIR=/tmp/run и DUNEHD_SERVICE_DONT_FORK=1. - fw-tv188b-260827-0003-r24.c068 · device · tv188b, android-dune-fw; прошивка 260827_0003_r24 · На tv188b r24 в окружении php-cgi плагина shell_ext (pid 26705) есть FS_PREFIX=/data/data/com.dunehd.app, FS_BIN_PREFIX=/data/data/com.dunehd.app, TMPDIR=$FS_PREFIX/tmp, LOG_DIR=/tmp/run, PHP_PROC_OPEN_SH=$FS_PREFIX/bin/sh, APK_PACKAGE_NAME=com.dunehd.app и HOME=/data/user/0/com.dunehd.app/app_vlc; PATH начинается с $FS_PREFIX/firmware/bin:$FS_PREFIX/bin:/bin, а LD_LIBRARY_PATH=$FS_PREFIX/firmware/lib:/lib:/usr/lib. - fw-tv188b-260827-0003-r24.c069 · device · tv188b, android-dune-fw; прошивка 260827_0003_r24 · На tv188b r24 в окружении php-cgi плагина shell_ext (pid 26705) есть HD_HTTP_LOCAL_PORT=80, HD_APK=1, HD_FW_APK=1, HD_DSSD_AMEM=0x0744a101, HD_RMCL_DISABLE_CLOPTNS=1, LOG_MAX_FILE_SIZE=3072000 и VLC_DATA_PATH=/system/usr/share. [^277]: - fw-tv188b-261021-0117-r25.c390 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 13 /proc/self/environ php_server зонда kb_probe13 содержал, кроме общих с CGI переменных, HOME=/data/user/0/com.dunehd.app/app_vlc, TMPDIR=/data/data/com.dunehd.app/tmp, FS_BIN_PREFIX=/data/data/com.dunehd.app, APK_PACKAGE_NAME=com.dunehd.app, PHP_PROC_OPEN_SH=/data/data/com.dunehd.app/bin/sh, LOG_MAX_FILE_SIZE=3072000 и HD_RMCL_DISABLE_CLOPTNS=1 (один прогон). - fw-tv188b-261021-0117-r25.c391 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 13 php-cgi (/data/data/com.dunehd.app/firmware_ext/php/php-cgi, php_sapi_name cgi-fcgi, uid 0), запущенный busybox httpd для /cgi-bin/plugins/kb_probe13/env, имел FS_PREFIX, HD_HTTP_LOCAL_PORT=80, LD_LIBRARY_PATH, PATH, LOG_DIR, HD_APK, PLUGIN_NAME, PLUGIN_CGI_DIR и DUNEHD_SERVICE_DONT_FORK, а getenv(HOME) и getenv(TMPDIR) вернули false (один прогон). - fw-tv188b-260827-0003-r24.c068 · device · tv188b, android-dune-fw; прошивка 260827_0003_r24 · На tv188b r24 в окружении php-cgi плагина shell_ext (pid 26705) есть FS_PREFIX=/data/data/com.dunehd.app, FS_BIN_PREFIX=/data/data/com.dunehd.app, TMPDIR=$FS_PREFIX/tmp, LOG_DIR=/tmp/run, PHP_PROC_OPEN_SH=$FS_PREFIX/bin/sh, APK_PACKAGE_NAME=com.dunehd.app и HOME=/data/user/0/com.dunehd.app/app_vlc; PATH начинается с $FS_PREFIX/firmware/bin:$FS_PREFIX/bin:/bin, а LD_LIBRARY_PATH=$FS_PREFIX/firmware/lib:/lib:/usr/lib. [^278]: fw-tv188b-260827-0003-r24.c069 · device · tv188b, android-dune-fw; прошивка 260827_0003_r24 · На tv188b r24 в окружении php-cgi плагина shell_ext (pid 26705) есть HD_HTTP_LOCAL_PORT=80, HD_APK=1, HD_FW_APK=1, HD_DSSD_AMEM=0x0744a101, HD_RMCL_DISABLE_CLOPTNS=1, LOG_MAX_FILE_SIZE=3072000 и VLC_DATA_PATH=/system/usr/share. [^279]: fw-tv188b-261021-0117-r25.c153 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в окружении CGI плагина SERVER_SOFTWARE=busybox httpd/1.35.0 и GATEWAY_INTERFACE=CGI/1.1. [^280]: - fw-apk-260724-0207-r24--data-deploy--php-fs-prefix.c017 · code · android-atv; прошивка 260724_0207_r24 · Если команда изменена и задана переменная PHP_DEBUG, _php_add_fs_prefix_to_cmd печатает в stdout « -C-> EEE orig command: %s» с исходной и « -C-> EEE repl command: %s» с новой командой - fw-tv188b-261021-0117-r25--libphp5--curl-http.c021 · code · android-dune-fw; прошивка 260827_0003_r24 · В r24 _php_add_fs_prefix_to_http не вызывает lcreg и других функций замены хоста; при отсутствии HD_HTTP_LOCAL_PORT или несовпадении префикса URL не меняется, а печать исходного и нового URL ограждена getenv("PHP_DEBUG"). [^281]: fw-tv188b-261021-0117-r25--libphp5.c028 · code · android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24, 1.0.1-1000-260724_0207_r24 · Наборы имён curl_multi_* (12) и CURLOPT_* (111) в strings libphp5.so совпадают у всех пяти исследованных сборок. [^282]: fw-tv188b-261021-0117-r25.c246 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в php_server и php-cgi константы JSON_BIGINT_AS_STRING, JSON_UNESCAPED_UNICODE, JSON_UNESCAPED_SLASHES и JSON_PRETTY_PRINT не определены; JSON_NUMERIC_CHECK (32), JSON_HEX_TAG (1), JSON_FORCE_OBJECT (16), JSON_ERROR_UTF8 (5) определены. [^283]: - fw-tv188b-261021-0117-r25--libphp5.c001 · code · android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24, 1.0.1-1000-260724_0207_r24 · В strings libphp5.so пяти исследованных сборок присутствует строка PHP/5.3.6. - fw-tv188b-261021-0117-r25--libphp5.c006 · code · android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24, 1.0.1-1000-260724_0207_r24 · В strings libphp5.so пяти исследованных сборок присутствует версия OpenSSL 1.0.1u от 22 Sep 2016. - fw-tv188b-261021-0117-r25--libphp5.c007 · code · android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24, 1.0.1-1000-260724_0207_r24 · В strings libphp5.so пяти исследованных сборок присутствует строка версии PCRE 8.11 2010-12-10. [^284]: fw-tv188b-261021-0117-r25--libphp5.c036 · code · android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24, 1.0.1-1000-260724_0207_r24 · CA-бандлы всех пяти исследованных сборок совпадают по SHA-256 722be2869ed2c2a949e5edb75b030f1e737e869ca8e8f70bc8d876dd93227ead. [^285]: fw-tv188b-261021-0117-r25--libphp5.c029 · code · android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24, 1.0.1-1000-260724_0207_r24 · В strings libphp5.so tv188b r25 присутствует _php_add_fs_prefix_to_http вместо имени _php_add_http_port из r24 и r22. [^286]: - fw-tv188b-261021-0117-r25--libphp5--curl-http.c021 · code · android-dune-fw; прошивка 260827_0003_r24 · В r24 _php_add_fs_prefix_to_http не вызывает lcreg и других функций замены хоста; при отсутствии HD_HTTP_LOCAL_PORT или несовпадении префикса URL не меняется, а печать исходного и нового URL ограждена getenv("PHP_DEBUG"). - fw-tv188b-261021-0117-r25--libphp5--curl-http.c004 · code · android-dune-fw; прошивка 261021_0117_r25 · В r25 _php_do_add_fs_prefix_to_http вызывает lcreg при отсутствии HD_HTTP_LOCAL_PORT либо для http:// URL, не попавшего под CGI-подстановку; при заданной HD_HTTP_LOCAL_PORT URL без префикса http:// выходит до lcreg. [^287]: fw-tv188b-261021-0117-r25--libphp5--curl-http.c022 · code · android-dune-fw; прошивка 261021_0117_r25 · В r25 zif_curl_exec перед curl_easy_perform читает сохранённый URL из поля handle +0x16c; если хост (после http:// или https://, без userinfo и порта) не localhost/localhost. и не разрешается getaddrinfo в 127.x или ::1, либо URL пуст или с другой схемой, ставит опцию 0x4ec3 с обработчиком _php_curl_opensocket_remote. [^288]: fw-tv188b-260827-0003-r24--plugin-loader--php-runtime.c036 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В r25 php_server содержит путь /tmp/run/%s.pid и импорт FS_writestring, которых нет в strings php_server r24 [^289]: fw-tv188b-260827-0003-r24.c052 · code · tv188b, android-dune-fw; прошивка 250815_1012_r22, 260827_0003_r24 · В 260827_0003_r24 по сравнению с 250815_1012_r22 в firmware_ext/php/include/dunelib/ добавлены config_utils.php, dune_languages.php, expr.php, utils.php: в r22 там только dune_countries.php [^290]: fw-tv188b-260827-0003-r24.c053 · code · tv188b, android-dune-fw; прошивка 250815_1012_r22, 260827_0003_r24 · В 260827_0003_r24 по сравнению с 250815_1012_r22 изменены firmware_ext/php/dune_api.php (119788 → 127635 байт) и dune_plugin_fw.php (6211 → 6653 байт) [^291]: - fw-tv188b-260827-0003-r24--init-runtime.c033 · code · tv188b, android-dune-fw; прошивка 250815_1012_r22 · В tv188b r22 цикл запуска $FS_PREFIX/config/boot записан прямо в init (отдельного вызова binit.sh нет) - fw-tv188b-260827-0003-r24--init-runtime.c031 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · binit.sh находит файлы в $FS_PREFIX/config/boot (find … -type f) и по очереди, без фонового запуска, выполняет исполняемые (-x), записывая в лог код возврата каждого [^292]: - fw-tv188b-260827-0003-r24--shell-ext.c074 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · www/cgi-bin/php.ini shell_ext: cgi.force_redirect = 0, cgi.redirect_status_env = yes, error_reporting без E_NOTICE/E_STRICT/E_DEPRECATED/E_WARNING, magic_quotes_gpc = 0 - fw-tv188b-261021-0117-r25.c335 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · shell_ext/www/cgi-bin/php.ini r25 задаёт cgi.force_redirect = 0, cgi.redirect_status_env = yes, date.timezone = UTC, error_reporting = E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED (E_WARNING включён), magic_quotes_gpc = 0, display_errors = 0, log_errors = 1 и error_log = /tmp/run/shell_ext_cgi.log. [^293]: - fw-tv188b-260827-0003-r24--plugin-loader--php-runtime--opexec.c017 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Отмена операции PHP-плагина (php_plugin.c, fcn.00272050) находит дескриптор операции по id, печатает «Cancelling... Output-data: %p.» и ставит в дескрипторе байт-флаг отмены — и больше ничего: ни php_server, ни PHP-коду отмена не передаётся. - fw-tv188b-260827-0003-r24--plugin-loader--php-runtime--opexec.c032 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 по тайм-ауту handle_user_input оболочка останавливает php_server плагина и тем прерывает вызов: за «cancelling by timeout (N s)» следуют «FATAL ERROR detected (msg = operation timed out)», «[php] shutting down...», через ~0,25 с «killing PHP-server process...» и «stopped.», затем «canceling req N (fast: 1)», «PHP-FW was shut down. The operation fails.», «result status canceled» и «canceled in N s»; PHP-код вызова не доработал. [^294]: - doc-sdk-plugins.c064 · doc · any-documented; прошивка — · DuneSystem::$properties содержит plugin_name, install_dir_path, tmp_dir_path, data_dir_path, plugin_www_url, plugin_cgi_url - fw-tv188b-261021-0117-r25.c288 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 DuneSystem::$properties у PHP-плагина kb_probe5 из flashdata содержит 8 ключей: sdk_version '1.0.0', plugin_name 'kb_probe5', install_dir_path, tmp_dir_path, data_dir_path, plugin_www_url, plugin_cgi_url, few_buttons_remote_type '0'. [^295]: - doc-sdk-plugins.c064 · doc · any-documented; прошивка — · DuneSystem::$properties содержит plugin_name, install_dir_path, tmp_dir_path, data_dir_path, plugin_www_url, plugin_cgi_url - doc-sdk-plugins.c095 · doc · any-documented; прошивка — · Встроенный HTTP-сервер отдаёт $install_dir_path/www/* по http:///plugins//* и исполняет CGI из www/cgi-bin/* по http:///cgi-bin/plugins//* - fw-tv188b-261021-0117-r25.c290 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 install_dir_path у kb_probe5 = '/data/data/com.dunehd.app/flashdata/plugins/kb_probe5' (is_dir() = true) — тот же путь, что плагина в /tmp/run/installed_plugins.xml. [^296]: - doc-sdk-plugins.c064 · doc · any-documented; прошивка — · DuneSystem::$properties содержит plugin_name, install_dir_path, tmp_dir_path, data_dir_path, plugin_www_url, plugin_cgi_url - doc-sdk-plugins.c065 · doc · any-documented; прошивка — · tmp_dir_path — каталог под /tmp для временных данных плагина; Dune GUI гарантирует его существование - fw-tv188b-261021-0117-r25.c291 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 tmp_dir_path у kb_probe5 = '/data/data/com.dunehd.app/tmp/plugins/kb_probe5' — путь /tmp/plugins/kb_probe5 с префиксом FS_PREFIX=/data/data/com.dunehd.app; is_dir() для него true. - fw-tv188b-261021-0117-r25.c294 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 пустой каталог /tmp/plugins/<плагин> PHP-плагина существует уже после регистрации плагина, до первого вызова и запуска его php_server: kb_probe5 — в 13:24 при первом вызове в 13:37:59, kb_probe6 — в 15:06 при первом вызове в 15:08:02 (местное время). [^297]: - doc-sdk-plugins.c064 · doc · any-documented; прошивка — · DuneSystem::$properties содержит plugin_name, install_dir_path, tmp_dir_path, data_dir_path, plugin_www_url, plugin_cgi_url - doc-sdk-plugins.c066 · doc · any-documented; прошивка — · data_dir_path (постоянные данные) недоступен на устройствах без System Storage и Flash Memory Storage — тогда ключ не задан - doc-sdk-plugins.c067 · doc · any-documented; прошивка — · После каждой записи в постоянное хранилище нужно сразу выполнять sync (команду или системный вызов) - fw-tv188b-261021-0117-r25.c292 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 data_dir_path у kb_probe5 (плагин в flashdata) = '/data/data/com.dunehd.app/flashdata/plugins_data/kb_probe5'; is_dir() для него true. [^298]: - doc-sdk-plugins.c064 · doc · any-documented; прошивка — · DuneSystem::$properties содержит plugin_name, install_dir_path, tmp_dir_path, data_dir_path, plugin_www_url, plugin_cgi_url - fw-tv188b-261021-0117-r25.c289 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 у kb_probe5 plugin_www_url = 'http://127.0.0.1:80/plugins/kb_probe5/', plugin_cgi_url = 'http://127.0.0.1:80/cgi-bin/plugins/kb_probe5/' — с явным портом 80. [^299]: fw-tv188b-261021-0117-r25--downloads.c043 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · torrserverActionGet включает API_OPT_LONG_INT_AS_STRING: перед json_decode клиент заменяет значения из 10 и более десятичных цифр после ключа \w+ на JSON-строки. [^300]: plg-hdtv-remtor.c114 · code · unknown; прошивка — · При hack_big_int TransmissionRPC переписывает регулярным выражением целые числа JSON (значения вида "key":123) в строки, чтобы большие размеры не теряли точность. [^301]: plg-dc-torrent-center.c082 · code · unknown; прошивка — · torrserverActionGet перед json_decode переписывает в строки числовые значения после ключа из символов слова перед запятой, а отдельным выражением — значения length. [^302]: plg-dc-torrent-center.c079 · code · unknown; прошивка — · TorrServer::actionGetTorrentList запускает вложенный php-cgi -f www/cgi-bin/run.php с action=torrentTorrServList через HD::asyncExec. [^303]: plg-gh-kocourkuba-proiptv.c061 · code · unknown; прошивка — · run_bg_epg_indexing запускает фоновую индексацию EPG, если allow_index истинно или включён delay-load пиконов при is_delay_load_supported(), или движок XMLTV/combined; источник должен существовать и не быть заблокирован is_index_locked. Он пишет JSON-конфиг в tmp, экспортирует DuneSystem и запускает отдельный процесс ' bin/index_epg.php ' через shell_exec с перенаправлением в лог; check_and_run_bg_indexing выставляет plugin_cookies->ticker, когда индексация запущена. [^304]: - plg-hdtv-rclone.c081 · code · unknown; прошивка — · SmartConfig::do_cmd удаляет старый exec_log, а на android выполняет команду через /system/dunehd/dunehd_service do с экранированием двойных кавычек; на остальных платформах — через system(). - plg-hdtv-rclone.c082 · code · unknown; прошивка — · Результат shell-команд передаётся в PHP через JSON-файл exec_log: do_exec_log декодирует его json_decode и складывает поля в $this->execLogObj, откуда вызывающий код читает status/descr. [^305]: plg-dc-globaltv.c072 · code · unknown; прошивка — · Плагин вызывает date_default_timezone_set("UTC"), а смещение пояса вычисляет из вывода shell-команды date +%z. [^306]: plg-hdtv-megaanime.c076 · code · unknown; прошивка — · Копия lib/default_dune_plugin_fw.php в MegaAnime отличается от копии эталона HdKinoTeatr: добавляет флаг tracing_enabled, в create_plugin ставит date_default_timezone_set('UTC') и ini_set('date.timezone', 'UTC'), а call_plugin получил обработку ошибок и трассировку. [^307]: - plg-gh-rpervykh-dune-plugin-anidub-com.c040 · code · unknown; прошивка — · set_time_limit(0) вызывают anidub_main, anidub_main_year, anidub_main_studii, get_main_menu_items и Youtube::retrieve_playback_url. - plg-hdtv-folder-cache-vod.c050 · code · unknown; прошивка — · Youtube::retrieve_playback_url() и General_main() снимают ограничение времени через set_time_limit(0); в Youtube это подписано комментарием «no more plugin restarts». [^308]: plg-dune-remote-control.c074 · code · unknown; прошивка — · При подключении m3u.class.php выполняет error_reporting(0) и set_time_limit(15), перекрывая error_reporting(E_ALL), заданный в do.php. [^309]: - plg-dc-widget-ext.c086 · code · unknown; прошивка — · boot.sh проверяет каталог /flashdata/plugins_data без $FS_PREFIX, а остальные скрипты — $FS_PREFIX/flashdata/plugins_data - plg-dc-widget-ext.c087 · code · unknown; прошивка — · PHP-часть вызывает /firmware/scripts/run_widget.sh без $FS_PREFIX, а shell-скрипты — $FS_PREFIX/firmware/scripts/run_widget.sh [^310]: plg-gh-vladikshkwok-lampa-dune-plugins.c044 · code · android; прошивка — · CGI-обёртка api задаёт FS_PREFIX по умолчанию /data/data/com.dunehd.app и добавляет в LD_LIBRARY_PATH каталоги firmware/lib, lib и системные. [^311]: plg-gh-vladikshkwok-lampa-dune-plugins.c046 · forum · android; прошивка — · Комментарии CGI-обёртки api утверждают, что run_plugin_cgi вызывает файл через sh даже на Android 11, а php-cgi предпочитает SCRIPT_FILENAME опции -f при наличии REQUEST_METHOD. [^312]: plg-gh-vladikshkwok-lampa-dune-plugins.c123 · forum · android; прошивка — · Комментарий bridge.php заявляет совместимость с PHP 5.3 и отсутствие распространения SDK, демона и внешнего сервиса метаданных. [^313]: plg-hdtv-kohana-channel.c048 · code · unknown; прошивка — · Controller перед возвратом результата печатает в stdout имя операции: echo 'get_tv_info: ' . $media_url и аналогичные строки в get_folder_view, get_next_folder_view, get_tv_stream_url, get_vod_info, get_vod_stream_url, get_regular_folder_items, get_day_epg, get_tv_playback_url, change_tv_favorites. [^314]: plg-hdtv-cleanup.c013 · code · unknown; прошивка — · check_children добирает дочерние процессы двумя способами: по общим pipe-файловым дескрипторам из /proc//fd и по PPID через pgrep -P, объединяет их, убирает дубликаты и убивает каждый через kill. [^315]: fw-tv188b-261021-0117-r25.c094 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 httpd запущен как «$FS_PREFIX/bin/httpd -h /data/data/com.dunehd.app/tmp/www», то есть корень веб-сервера — $FS_PREFIX/tmp/www; процесс работает от root (метка u:r:shell:s0, PPID 1). [^316]: fw-tv188b-260827-0003-r24--php-framework.c075 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · В HD::format_timestamp есть комментарий, что PHP на Dune требует явной таймзоны (нет встроенной информации о таймзонах?) [^317]: plg-dc-globaltv.c071 · code · unknown; прошивка — · Комментарий в библиотеке: PHP на Dune требует явного указания часового пояса (встроенной информации о часовых поясах, видимо, нет). [^318]: doc-sdk-plugins.c140 · doc · android; прошивка — · В SDK для Android приведены команды развёртывания плагина: adb push в /flashdata/plugins/ и chmod -R +x для bin и www/cgi-bin внутри каталога плагина. [^319]: fw-tv188b-261021-0117-r25.c207 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в корне ФС каталога /flashdata нет, а оболочка в shell.log называет каталог плагинов /flashdata/plugins («Loading plugins from '/flashdata/plugins'», «invalid plugin manifest from '/flashdata/plugins/kb_probe5_badname/dune_plugin.xml'», «copying recursively '/tmp/plugin_tmp' to '/flashdata/plugins/kb_probe5_plat'»); файлы этих плагинов лежат в /data/data/com.dunehd.app/flashdata/plugins. [^320]: doc-sdk-plugins.c042 · doc · any-documented; прошивка — · По SDK тайм-аут операций плагина по умолчанию составляет 10 секунд; operation_timeout задаёт общий () и потиповой (N) тайм-аут. [^321]: - fw-tv188b-261021-0117-r25--libphp5.c085 · code · android-dune-fw; прошивка 261021_0117_r25 · В r25 _php_add_fs_prefix_to_cmd, если команда начинается с '/' и путь требует префикса (_php_path_needs_prefix.part.0), но не начинается с /firmware/bin/ или /firmware_ext/php/, ставит в начало результата «sh ». - fw-tv188b-261021-0117-r25--libphp5.c086 · code · android-dune-fw; прошивка 261021_0117_r25 · В r25 _php_add_fs_prefix_to_cmd дописывает $FS_PREFIX к пути у '/', только если байт перед '/' — пробел, '!', '&', апостроф, '(', ')', ';', '<', '>' или '`'; для '/' в первом символе команды проверяется байт перед началом строки. [^322]: fw-tv188b-261021-0117-r25--libphp5.c072 · device, disputed · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 после kill php_server и запуска collect11 шага bg2 операция handle_user_input была отменена через 30.0 с с operation timed out; step_bg2.txt не появился, а в сохранённом steps.txt нет begin bg2 между end bg1 и begin wget. [^323]: fw-tv188b-261021-0117-r25--libphp5.c098 · inference · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Вероятно, shell_exec("sleep 61 &") в php_server не возвращается потому, что фоновый sleep наследует pipe stdout (fd 1) и держит его открытым до конца, а shell_exec ждёт EOF; наследование fd 101/110 php_server тоже не закрывается перед exec. [^324]: fw-tv188b-261021-0117-r25--libphp5.c087 · inference · android-dune-fw; прошивка 261021_0117_r25 · В r25 _php_add_fs_prefix_to_cmd вызывается из php_exec (exec, system, passthru), zif_shell_exec, zif_popen, zif_proc_open и virtual_popen, то есть exec и shell_exec переписывают команду одной функцией. [^325]: fw-tv188b-261021-0117-r25--libphp5.c088 · inference · tv188b, android-dune-fw; прошивка 261021_0117_r25 · rc=127 и «sh: /config/kbp11_x.sh: No such file or directory» у exec("/config/kbp11_x.sh first-word") в запросе 11 согласуются с тем, что путь стоит первым словом: _php_add_fs_prefix_to_cmd добавил «sh », но $FS_PREFIX к первому слову не дописал (байт перед строкой не разделитель); в shell_exec запроса 6 /config/c стоял после пробела и префикс получил. Различие — по позиции слова, а не по функции exec/shell_exec. [^326]: fw-apk-260724-0207-r24--data-deploy--php-fs-prefix.c029 · inference · android-dune-fw; прошивка 260827_0003_r24 · Вероятно, на tv188b 260827_0003_r24 подстановка путей и команд в PHP работает так же, как в APK: там тот же libphp5.so, а init и dunehd_service.env задают FS_PREFIX=/data/data/com.dunehd.app [^327]: fw-apk-260724-0207-r24--data-deploy--php-fs-prefix.c030 · inference · android-dune-fw; прошивка 260724_0207_r24 · Вероятно, на tv175u 260724_0207_r24 libphp5.so пути и команды не переписывает: файл тот же, что в APK, а скрипт /system/dunehd/init FS_PREFIX не задаёт, так что getenv("FS_PREFIX") пуст [^328]: fw-apk-260724-0207-r24--data-deploy--php-fs-prefix.c031 · inference · android-atv; прошивка 260724_0207_r24 · Вероятно, в APK PHP-плагин, обращаясь файловыми функциями к /tmp/…, /config/…, /flashdata/…, /fconfig/…, /firmware…, фактически работает с $FS_PREFIX/tmp/… и т. д., к /D/… — с $FS_PREFIX/tmp/mnt/D/…, а пути, уже начинающиеся с $FS_PREFIX (/data/data/<пакет>), не меняются; поэтому годятся и абсолютные пути прошивки, и getenv("FS_PREFIX") . "/config/…" [^329]: fw-apk-260724-0207-r24--data-deploy--php-fs-prefix.c003 · inference · android-atv; прошивка 260724_0207_r24 · Вероятно, вторая строка-образец _php_get_fs_prefix2 (адрес 0x353448) — "/D/": к путям /D и /D/… после FS_PREFIX добавляется /tmp/mnt, то есть /D/x превращается в $FS_PREFIX/tmp/mnt/D/x [^330]: fw-apk-260724-0207-r24--data-deploy--php-fs-prefix.c009 · inference · android-atv; прошивка 260724_0207_r24 · Вероятно, подстановке FS_PREFIX в командах подвержены PHP-функции exec, system и passthru (через php_exec), shell_exec (и оператор `…`), popen и proc_open [^331]: fw-tv188b-261021-0117-r25.c353 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 вызов $FS_PREFIX/bin/wget -q -O - 'http://127.0.0.1/cgi-bin/do?cmd=status' | head -c 80 из php_server (uid 1000) в том же прогоне вернул пустой вывод, а [exit 0] — код head в конвейере; причина не установлена. [^332]: fw-apk-260724-0207-r24--data-deploy--php-fs-prefix.c013 · inference · android-atv; прошивка 260724_0207_r24 · Вероятно, в APK программа плагина, запущенная exec/shell_exec по абсолютному пути вне /firmware/bin/ и /firmware_ext/php/ (например /flashdata/plugins/<плагин>/bin/x или $FS_PREFIX/…), запускается как «sh <путь>»: shell-скрипт так работает и без бита x, а ELF-бинарник — нет [^333]: fw-apk-260724-0207-r24--data-deploy--php-fs-prefix.c016 · inference · android-atv; прошивка 260724_0207_r24 · Для '/' в самом начале команды _php_add_fs_prefix_to_cmd проверяет байт перед началом строки (вне команды), поэтому, вероятно, путь первым словом (/config/x.sh …) получает FS_PREFIX непредсказуемо — в зависимости от памяти перед строкой; «sh » при этом добавляется [^334]: fw-apk-260724-0207-r24--data-deploy--php-fs-prefix.c022 · inference · android-atv; прошивка 260724_0207_r24 · Вероятно, в APK proc_open(<команда>, …, $cwd) с $cwd вида /tmp/… или /config/… переходит в системный каталог Android, а не в $FS_PREFIX/…: пути в команде переписываются, а cwd — нет [^335]: fw-apk-260724-0207-r24--data-deploy--php-fs-prefix.c023 · inference · android-atv; прошивка 260724_0207_r24 · Вероятно, при переданном в proc_open массиве $env дочерний процесс получает только эти переменные: FS_PREFIX, PATH, LD_LIBRARY_PATH и прочее окружение php_server в него не попадают, если плагин их не передал [^336]: fw-apk-260724-0207-r24--data-deploy--php-fs-prefix.c034 · inference · android-atv; прошивка 260724_0207_r24 · Вероятно, в APK при заданной FS_PREFIX абсолютные пути под корнями /config и /tmp, разрешаемые realpath(), include/require, проверкой open_basedir и созданием временных файлов tempnam/tmpfile через virtual_file_ex, получают FS_PREFIX перед разрешением. [^337]: fw-apk-260724-0207-r24--data-deploy--php-fs-prefix.c035 · inference · android-atv; прошивка 260724_0207_r24 · Вероятно, _php_add_fs_prefix применяют к путям PHP-функции chdir, glob, readfile, rename, unlink, chgrp, chown, chmod, touch, disk_total_space, disk_free_space, clearstatcache, stat-семейство (php_stat: stat, filemtime, file_exists, is_dir…), mkdir, rmdir, opendir/scandir, открытие потоков (_php_stream_open_wrapper_ex: fopen, file_get_contents, file_put_contents и т. п.), include/require (zend_stream_open), simplexml_load_file, SimpleXMLElement::asXML и curl_setopt [^338]: fw-apk-260724-0207-r24--data-deploy--php-fs-prefix.c042 · inference · android-atv; прошивка 260724_0207_r24 · Вероятно, в APK при заданных HD_APK и FS_PREFIX плагин, читающий /sys/class/net/eth0/address через fopen с режимом на 'r' или file_get_contents без поиска по include_path, получает содержимое $FS_PREFIX/tmp/run/dune_mac.txt [^339]: - fw-tv188b-261021-0117-r25--libphp5.c077 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 exec команды /config/kbp11_x.sh first-word из php_server вернул rc=127 и sh: /config/kbp11_x.sh: No such file or directory; file_get_contents того же пути с use_include_path=true прочитал 49 байт. - fw-tv188b-261021-0117-r25--libphp5.c080 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 file_get_contents(lib/kbp11_steps.php,true) из php_server прочитал 15678 байт. [^340]: fw-apk-260724-0207-r24--data-deploy--php-fs-prefix.c043 · inference · android-atv; прошивка 260724_0207_r24 · Вероятно, при открытии потока с поиском по include_path (fopen($f, $mode, true), file_get_contents($f, true) — бит 1 options, USE_PATH) _php_stream_open_wrapper_ex путь не переписывает, и FS_PREFIX к нему приписывается разве что при разрешении через virtual_file_ex [^341]: fw-tv188b-260827-0003-r24.c070 · inference · tv188b, android-dune-fw; прошивка 260827_0003_r24 · На tv188b r24 окружение php_server отдельно не снято: сбор `24-environ` выбирал процессы по `pgrep -f dunehd`, а в argv php_server строки dunehd нет; при этом окружение родителя com.dunehd.app не содержит FS_PREFIX, HD_APK, HD_FW_APK, LOG_DIR, TMPDIR и PHP_PROC_OPEN_SH, поэтому наличие этих переменных у php_server на r24 не установлено. [^342]: fw-apk-260724-0207-r24--data-deploy.c046 · inference · android-atv; прошивка 260724_0207_r24 · Вероятно, PHP-код плагина в APK исполняется в процессе php_server, который оболочка запускает fork + FS_execv("/firmware/bin/php_server", …) без отдельного окружения, поэтому он наследует окружение процесса оболочки: FS_PREFIX, HD_APK=1, HD_HTTP_LOCAL_PORT=11080, APK_PACKAGE_NAME, PATH, LD_LIBRARY_PATH, PHP_PROC_OPEN_SH; HD_FW_APK не задан [^343]: fw-tv188b-260827-0003-r24--php-framework.c308 · inference · tv188b, android-dune-fw; прошивка 260827_0003_r24 · php_server, вероятно, исполняет вызов плагина как PHP-код «$in = <<($in);», где выражение (например DunePluginFw::$instance->call_plugin) приходит от оболочки в CallPacket [^344]: fw-tv188b-260827-0003-r24--php-framework.c033 · inference · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Пути require_once 'dunelib/…' разрешаются, только если каталог firmware_ext/php/include/ есть в include_path PHP; где он задаётся, из модуля не видно [^345]: fw-tv188b-260827-0003-r24--php-framework.c309 · inference, disputed · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Системные PHP-файлы /firmware_ext/php подключаются до кода плагина: так сказано в SDK; для tv188b r24 порядок из строк php_server не следует [^346]: fw-tv188b-260827-0003-r24--plugin-loader.c081 · inference, disputed · tv188b, android-dune-fw; прошивка 260827_0003_r24, 261021_0117_r25 · data_dir_path, вероятно, — <хранилище>/plugins_data/; для плагина из flashdata — с префиксом $FS_PREFIX ($FS_PREFIX/flashdata/plugins_data/); варианты persistfs и запасной /config/plugins_data, а также правило выбора не установлены. [^347]: fw-tv188b-260827-0003-r24--plugin-loader.c082 · inference, disputed · tv188b, android-dune-fw; прошивка 260827_0003_r24, 261021_0117_r25 · tmp_dir_path, вероятно, — $FS_PREFIX/tmp/plugins/ (для плагина из flashdata); shell-переменная bluray задаёт тот же путь без префикса — /tmp/plugins/. [^348]: fw-tv188b-260827-0003-r24--plugin-loader.c047 · inference, disputed · tv188b, android-dune-fw; прошивка 260827_0003_r24 · libduneshell.so содержит строки установщика %s/bin/php-cgi, %s/www/cgi-bin/php-cgi, /firmware/bin/%s и сообщения «non-working binary detected», «created symlink(%s -> %s)»; вероятно, нерабочий бинарник плагина заменяется ссылкой на /firmware/bin/<имя>; связь %s/bin/php-cgi с этой заменой не установлена, а /firmware/bin/php-cgi в этой прошивке нет [^349]: fw-tv188b-261021-0117-r25.c151 · inference · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 httpd запускает ссылку run_plugin_cgi с $0, равным имени файла CGI без каталога, из каталога, последний компонент которого — имя плагина: обёртка строит SCRIPT_FILENAME как $dir_path/$0 и PLUGIN_NAME как ${PWD##*/}, и для /cgi-bin/plugins/kb_probe5/env.sh получились …/www/cgi-bin/env.sh и kb_probe5. Полный путь каталога запуска не наблюдался. [^350]: plg-hdtv-zlostnyi-iptv.c068 · inference · unknown; прошивка — · Передача по ссылке на месте вызова (call-time pass-by-reference) в PHP 5.3 — лишь предупреждение deprecated, в 5.4+ — ошибка разбора; в прошивке r25 PHP 5.3.6, поэтому код работает, но на PHP 5.4+ файлы с такими вызовами не загрузятся. [^351]: plg-dc-dunemdb-supplier-movies-rus.c021 · inference · unknown; прошивка — · Не доказано, что запущенный из описателя php-cgi читает bin/php.ini: ключ -c не передан, а путь php.ini по умолчанию задан при сборке PHP. [^352]: fw-tv188b-261021-0117-r25--libphp5.c025 · code · android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24, 1.0.1-1000-260724_0207_r24 · Строка mcrypt в libphp5.so пяти сборок входит в общий перечень авторов расширений PHP. [^353]: fw-tv188b-260827-0003-r24--shell-ext--entry-handler.c088 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · get_update_service_plugins_action пропускает установленный сервисный плагин при version_index>1; version_index<=1 ведёт к установке/обновлению. [^354]: fw-tv188b-261021-0117-r25.c377 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 ls и cat /data/data/com.dunehd.app/config/lcreg.txt вернули No such file or directory. [^355]: fw-tv188b-261021-0117-r25--libphp5--curl-http.c007 · code · android-dune-fw; прошивка 261021_0117_r25 · В r25 lcreg_kind выбирается через atoi первой строки lcreg.txt: 0 выбирает встроенную таблицу lcreg_ru_pairs, 1 читает lcreg_pairs.txt; ошибка открытия/чтения lcreg.txt, результат вне 0/1 или недоступный файл пар дают lcreg_kind=-1. # Справочник API плагина r25: `dune_api.php` и фреймворк `firmware_ext/php` > Редакция 2026-11-02. Что PHP-плагин Dune HD получает от прошивки: интерфейс `DunePlugin`, операции, действия > `GuiAction`, константы и классы `dune_api.php`, библиотека `dunelib`. Основа — код tv188b `261021_0117_r25` и > `260827_0003_r24` (`code`, `android-dune-fw`) и наблюдения на tv188b r25 (`device`). SDK — справка: факт только из него > помечен «по SDK, на r24+ не подтверждено». Всё r24/r25 ниже — про tv188b; на другие устройства и прошивки не переносится, > кроме сказанного в §1.3. Каждое фактическое предложение ссылается на claim id. > > Рядом: контролы — «Контролы диалогов и папок»; экраны — «Экраны и папки плагина»; ввод и > диалоги — «Ввод и диалоги»; воспроизведение — «Воспроизведение из плагина»; очередь и тайм-ауты — > «Операции плагина, тайм-ауты и `php_server`»; приёмы плагинов — «Приёмы разработки плагинов Dune HD». ## Коротко: вопрос → ответ | Вопрос | Ответ | Где | |---|---|---| | Откуда берутся `GuiAction`, `*_ACTION_ID`, `ViewParams`? | Из `dune_api.php` прошивки: screenshoter пользуется ими, не определяя в своём пакете (код r24)[^1] | §1.1 | | Что вернуть из `handle_user_input`? | `GuiAction` (код r24)[^2]; `null` от самого `call_plugin` — другое дело, это ошибка (устройство r25)[^3] | §2.1, §2.4 | | Где `ActionFactory`? | В `lib/` встроенного `shell_ext` (код r24)[^4]; у GlobalTV — свои `ActionFactory`, `ControlFactory` и `GCompsFactory` (код)[^5] | §4 | | Какие операции новые в r25? | `get_folder_rows` (код r25)[^6] | §2.5 | | Какие действия новые в r25? | `apply_hash_dirties`, `cond`, `fs_ctl`, `load_and_scale_image`, `update_special_favorite_folder` (код r25)[^7]. В одном прогоне на tv188b r25 выполнены `cond` (устройство r25)[^8], `fs_ctl scandir` (устройство r25)[^9], `load_and_scale_image` (устройство r25)[^10] | §2.6, §2.7 | | Придёт ли в `post_action` поле `action_status`? | В одном прогоне на tv188b r25 пришло строкой у `cond` (устройство r25)[^8], `fs_ctl` (устройство r25)[^9], `load_and_scale_image` (устройство r25)[^10], а у `plugin_system` (устройство r25)[^11], `stop_playback` (устройство r25)[^12], `plugin_exit_folders` (устройство r25)[^13] и `sleep` (устройство r25)[^14] его не было | §2.6, §2.7, §2.9, §3.4 | | Какие строки запросит `get_folder_rows`? | С непустым `id`, опцией `PLUGIN_ROW_OPT_LOADING` и без записи в `plugin_pending_rows` (код r25)[^15] | §2.5 | | Работает ли `handle_response=true` из JSON-ответа плагина? | По коду r25 JSON-десериализация поле не читает, оно остаётся `false` (код r25)[^16]. В одном прогоне на tv188b r25 `restart_needed_flag` остались (устройство r25)[^17], pid `com.dunehd.app` тот же (устройство r25)[^18]; что это не доказывает — §6 | §2.9 | | Как проверить, что поле есть в этой прошивке? | `defined('Класс::поле')` и `class_exists('Класс')` — так делает ProIPTV (код)[^19] | §2.3 | | Можно ли задать `fs_ctl` в манифесте? | В `libduneshell.so` r25 есть строка `create_fs_ctl_action_from_xml(): not implemented` (код r25)[^20] | §2.6 | | Что значит колонка «где» в таблицах? | Объявление в `dune_api.php`, а не проверка работы; проверенное на устройстве помечено `device` | §3 | | Насколько полон этот справочник? | Имена и ключи — полностью; назначение описано не у всех | §7 | ## 1. Как устроен API плагина ### 1.1. Файлы фреймворка `firmware_ext/php` PHP-плагин загружается процессом `php_server` (устройство r25)[^21], а API, на который он опирается, — это несколько файлов прошивки в `firmware_ext/php`. Ни один файл этого каталога не подключает `bootstrap.php`, `dune_api.php`, `dune_config.php` или `dune_plugin_fw.php`: их пути вместе с шаблоном `require ('%s');` лежат в `php_server` (код r24)[^22]. Порядок загрузки и жизнь процесса — в «Операции плагина, тайм-ауты и `php_server`». | Файл | Что даёт плагину | Claim | |---|---|---| | `dune_api.php` | только данные: константы `define` и классы с константами-ключами; функций нет | (код r24)[^23] | | `dune_plugin.php` | интерфейс `DunePlugin`, §3.1 | (код r24)[^24] | | `dune_plugin_fw.php` | абстрактный `DunePluginFw`: `$instance`, `call_plugin`, `invoke_operation`, `get_out_type_code` | (код r24)[^25] | | `bootstrap.php` | `hd_print`, обработчики ошибок, снятие лимита времени, §3.7 | (код r24)[^26] | | `dune_config.php` | тип пульта, §3.7 | (код r24)[^27] | | `dunelib/*` | `HD`, `ConfigUtils`, `Expr`, `DuneLanguages`, `InstalledPlugins` (r25), §3.6 | (код)[^28] | Класс `DuneSystem` со статическим `$properties` в файлах каталога не определён (код r24)[^29]: шаблон его кода лежит в `php_server` вместе с элементом `'sdk_version' => '1.0.0',` (код r24)[^30]. `include_path` `php_server` задаёт шаблоном `ini_set('include_path', '.:%s:%s');`, рядом есть строка `/firmware_ext/php/include` (код r24)[^31]. ### 1.2. Классы как имена ключей и `GuiAction` Константа класса в `dune_api.php` — имя ключа структуры: её значение совпадает с именем, а в комментарии указан C-тип поля (код r24)[^32]. Поэтому `PluginVodPlayActionData::vod_info` — просто строка `'vod_info'` для ключа массива, и таблицы §3.4 и §3.5 перечисляют именно ключи. Типы сложных полей разобраны в базе (пример — поля `ChangeBehaviourActionData::timer` и `post_action` (код r24)[^33]); в таблицы они не вынесены, кроме новых классов r25. `GuiAction` — структура с ключами `handler_string_id`, `data`, `caption`, `plugin_name`, `params`, `flags` (код r24)[^34]. По SDK, на r24+ не подтверждено: в `handler_string_id` лежит тип действия, в `data` — параметры (SDK)[^35]. Значения типа заданы константами `*_ACTION_ID` (код r24)[^36]; `HD::ensure_plugin_name` подставляет `plugin_name` из `DuneSystem::$properties`, если он не задан (код r24)[^37]. Единственный определённый флаг — `GUI_ACTION_FLAG_SKIP_ON_PLAY_RESTART=1` (код r24)[^38]. Цепочки строятся полем `post_action`; `ActionFactory::set_post_action` в `shell_ext` присоединяет продолжение к хвосту `data.post_action`, а у `plugin_handle_user_input` хранит его JSON в `params.next_action` (код)[^39]. Какой класс `*ActionData` читается для какого типа действия, прямо подтверждают фабрики `shell_ext` и SDK; остальные пары в §3.4 сведены по сходству имён — см. §6. ### 1.3. Что менялось: r22, r24, r25 Все PHP-файлы фреймворка в tv175u `260724_0207_r24` совпадают с tv188b `260827_0003_r24` по sha256 (код r24)[^40]. `bootstrap.php`, `dune_config.php`, `dune_plugin.php` одинаковы в r22- и r24-прошивках (код r22, r24)[^41]. | Что | r22 (`250815_1012_r22`) | r24 | r25 | Claim | |---|---|---|---|---| | Классы `ChangeMovieData`, `ChooseFile`, `CreateNetworkFolder`, `CustomIgnoreUpdate`, `EditMovieData`, `PluginExitFolders`, `PluginUpdateTvInfo`, `SyncMyCollection`, `WakeNetworkFolder` (`*ActionData`), `FileChooserFilter`, `FileChooserUiParams`, `PluginStreamInfo`, `PluginTvChannelChange`, `PluginVodGetStreamInfoInputData`, `StreamMarker` | нет | есть | есть | (код r22, r24)[^42] | | `get_vod_stream_info` в `invoke_operation` и `get_out_type_code` | нет | есть | есть | (код r22, r24)[^43] | | Счёт в `dune_api.php` | — | 316 `define`, 167 классов, 998 ключей | 331 `define`, 179 классов; ключи — §7 | (код)[^44] | | Операция `get_folder_rows`, тип ответа `plugin_folder_rows` | — | — | есть | (код r25)[^45] | | Пять новых действий | — | — | есть | (код r25)[^7] | | `FsCmdKind` и классы `fs_ctl` | — | — | есть | (код r25)[^46] | | `row_dup`, `PLUGIN_ROW_OPT_LOADING`, `PLUGIN_ROW_OPT_OPTIMIZE_INVISIBLE`, `row_dup_map`, `type_mask`, `GCOMP_OPT_STUB` | — | — | есть | (код r25)[^47] | | Новые ключи `FileChooserUiParams`, `PluginSystemActionData::handle_response` | — | — | есть | (код r25)[^48] | | `SyncMyCollectionActionData::mcf_id` | — | есть | убран | (код)[^49] | | `HD::make_json_rpc_request` | — | есть | нет | (код)[^50] | | `HD::ensure_empty_file`, `log_elapsed`, `read_int`, `read_string` | — | — | есть | (код r25)[^51] | | `InstalledPlugins` | — | — | есть | (код r25)[^52] | ## 2. Задачи ### 2.1. Реализовать операции плагина: `DunePlugin` и `DunePluginFw` (r24, r25) Плагин — наследник `DunePluginFw` с методом `call_plugin`, экземпляр которого присвоен `DunePluginFw::$instance`: на tv188b r25 такой плагин загружается `php_server` и получает операции `handle_user_input` и `get_vod_stream_url` (устройство r25)[^21]. В каталоге `php/` наследника нет (код r24)[^53]: `DefaultDunePluginFw` лежит в файлах `default_dune_plugin_fw.php` встроенных плагинов (код r24)[^54], а в копии `android_apps` его `call_plugin` — это `json_encode(call_plugin_impl(json_decode($call_ctx_json)))` (код r24)[^55]. `invoke_operation($plugin, $call_ctx)` берёт поля контекста `op_type_code`, `input_data`, `plugin_cookies`, `internet_status`, `opexec_id`, и имя метода плагина равно `op_type_code` (код r24)[^56]. Перед вызовом он дёргает необязательные `set_plugin_cookies`, `set_internet_status`, `set_opexec_id`, если они есть (код r24)[^57]; при отсутствии значений приходят `-2` и `"-1"` (код r24)[^58]. Любая операция, не перечисленная явно, уходит в `handle_user_input` (код r24)[^59]. Если во входе есть `sel_state` и у плагина есть метод `_v2`, вызывается он — для шести операций получения папки и ТВ/VOD (код r24)[^60]. Для `get_tv_playback_url` при `program_id` вызывается `get_tv_playback_url_v2` (код r24)[^61]. Полный перечень — §3.1. `$plugin_cookies` передаётся по ссылке во всех методах (код r24)[^62]. `get_folder_rows` — исключение: ему передаются только `media_url` и `row_ids`, необязательный `set_plugin_cookies` вызывается раньше, при входе в `invoke_operation` (код r25)[^63]. ### 2.2. Вернуть результат операции: `PluginOutputData` (r24) Ответ плагина оболочка разбирает в `json_materialize_output_data_from_json` (код r24)[^64]. Порядок проверок задаёт, что нужно плагину: ключи `has_data`, `data_type`, `data`, затем `is_error`, `error_action`, `plugin_cookies` (код r24)[^65]. При `is_error` ≠ 0 соответствие типа не проверяется (код r24)[^66]. При `is_error=0` и `has_data` ≠ 0 тип `data_type` должен совпасть с требуемым для операции (код r24)[^67]; пустой ответ там, где данные обязательны, — ошибка (код r24)[^68]. `op_id` проверяется, только если он ожидается и есть в JSON (код r24)[^69]. Таблица типов — §3.2. ### 2.3. Проверить, что поле или класс есть в прошивке (плагины, r24, r25) Набор имён меняется от прошивки к прошивке (§1.3), и часть плагинов проверяет возможности по именам. ProIPTV определяет `is_choose_file_supported()` через `defined('ChooseFileActionData::filter')`, `is_rows_api_supported()` через `class_exists('PluginRowsFolderView')`, `is_delay_load_supported()` через `defined('PluginUpdateTvInfoActionData::channel_changes')` (код)[^19]. GlobalTV проверяет rows тем же `class_exists` (код)[^70], а bazinga3 проверяет `item_sticker` и `item_detailed_icon_width` через `defined('ViewItemParams::…')` (код)[^71]. Сравнения версии в `Expr` — `fwv_ge`, `fwv_gt`, `fwv_le`, `fwv_lt` — строковые, через `strcmp` (код r24)[^72]. ### 2.4. Почему операция или действие не срабатывает Сообщения ниже — из кода r24/r25 и наблюдений на r25; строка лога показывает, на каком уровне сломалось. | Симптом | Что произошло | Где | Claim | |---|---|---|---| | Исключение `Method not found: get_vod_stream_info` | Операция пришла, метода у плагина нет: в интерфейсе `DunePlugin` его нет | r24 | (код r24)[^73] | | Исключение `Method not found: get_folder_rows` | То же для `get_folder_rows`, §2.5 | r25 | (код r25)[^74] | | Исключение и лог `Uknown operation code` (опечатка в оригинале) | `get_out_type_code` не знает код операции | r24 | (код r24)[^75] | | `plugin op E: wrong data_type %s (required %s)` | `data_type` не тот, что нужен операции | r24 | (код r24)[^67] | | `plugin op E: got null data (op_type: %s)` | `has_data=0`, а данные обязательны | r24 | (код r24)[^68] | | `plugin op E: can not deserialize PluginOutputData: %s.` | Ошибка разбора ответа | r24 | (код r24)[^76] | | `Error: invalid string type-tc value (%s) for 'PluginOutputDataType'` | Строка `data_type` не из перечня §3.2 | r24 | (код r24)[^77] | | `JSON: GuiAction: unknown handler id (%s)` | Такая строка есть в `libduneshell.so` для неизвестного типа действия | r24 | (код r24)[^78] | | `poll_calls() E: treating empty result as failure and stopping server`, диалог «Ошибка приложения» | `call_plugin` вернул `null`: `php_server` ничего не ответил | r25 `device` | (устройство r25)[^3] | | `op 11 failed (read status: 2)`, `PHP_CALL_FAILED`, тот же диалог | Сбой операции `handle_user_input` в `php_server` | r25 `device` | (устройство r25)[^79] | | `cond E: unknown op '<имя>'` | Неизвестный оператор условия; вычислитель даёт -1, обёртка превращает его в `false` | r25 | (код r25)[^80] | | Целое стало `2147483647` | Литерал вне 32 бит и `json_decode` обрезают значение, ошибки нет: «Грабли» | r25 `device` | (устройство r25)[^81] | | Вызов `HD::make_json_rpc_request` на r25 | Метода в r25 нет | r25 | (код r25)[^82] | | Передан `mcf_id` в `sync_my_collection` | В r25 ключа нет, фабрика принимает только `post_action` | r25 | (код r25)[^83] | | `fs_ctl` в манифесте | В `libduneshell.so` есть строка `create_fs_ctl_action_from_xml(): not implemented`; вывод — §6 | r25 | (код r25)[^20] | | Файл `output_path` не разбирается как JSON | `fs_ctl scandir` завершился ошибкой: после `input` записан анонимный объект, `{"input":{...},{"error":{...}}}`: §2.6, BUG-038 | r25 `device` | (устройство r25)[^84] | | `response ignored, folder changed` | Ответ `folder_rows` не совпал с текущей папкой по ключу `plugin_name:media_url`, строки в pending не попали: §2.5 | r25 | (код r25)[^85] | | Передан `handle_response=true` в JSON-действии `plugin_system` | По коду JSON-десериализация поле не читает, оно остаётся `false`; в одном прогоне флаги `restart_needed_flag` остались, pid `com.dunehd.app` тот же: §2.9 | r25; `device` — один прогон на tv188b | (устройство r25, код r25)[^86] | **Тайм-аут и ожидание индекса mc (tv188b r25).** Единицы и умолчания тайм-аута — в «Операции плагина, тайм-ауты и `php_server`». По коду r25 длительность предварительного ожидания проверки индекса mc в `timeout_us` операции не входит (код r25)[^87], а запуск отложенного запроса ждёт значения 1 в `/tmp/plugins/shell_ext/mc_index_valid.txt` (код r25)[^88]. Подробно, вместе с отменой по дедлайну, — «Операции плагина, тайм-ауты и `php_server`». ### 2.5. Подгрузить строки rows: `get_folder_rows` (r25) В r25 появилась операция `PLUGIN_OP_GET_FOLDER_ROWS='get_folder_rows'` с ответом `PLUGIN_OUT_DATA_PLUGIN_FOLDER_ROWS` и классы `PluginFolderRowsInputData {media_url, row_ids}` и `PluginFolderRows {rows}` (код r25)[^6]. `invoke_operation` вызывает `$plugin->get_folder_rows(media_url, row_ids)`, а без метода бросает исключение (код r25)[^74]. Типы: `media_url` — `(char *)`, `row_ids` — `(MY_StringArray *)`, `rows` — `(PluginRowList *)` (код r25)[^89]. Как это устроено на экранах `shell_ext`, разобрано в «Экраны и папки плагина». Загрузчик оболочки `rows_loader` держит одну текущую задачу: запрос другого плагина отменяет старую с предупреждением `cancelling old task of plugin` (код r25)[^90], а по завершении вызывается обязательный обработчик `rows_loaded` (код r25)[^91]. Для строки `row_dup` поиск идёт по `dup_id` в `row_dup_map`, а отсутствие карты, id или записи даёт `null` с предупреждением (код r25)[^92]. Формат `PluginRow::data` выбирается нативным типом строки: `DUP` (1) читается как строка `dup_id`, а `GCOMPS` (2), `REGULAR` (3) и `TITLE` (4) — как объекты `PluginGCompsRow`, `PluginRegularRow` и `PluginTitleRow` (код r25)[^93]. **Какие строки запрашиваются (код tv188b r25).** Источник и обработчик ответа регистрирует инициализация `PluginRows` (код r25)[^94]. В пакет `row_ids` строка попадает при `id!=NULL`, `options & PLUGIN_ROW_OPT_LOADING` (0x4) и отсутствии ключа `id` в `plugin_pending_rows`; заданный полуинтервал обходится по возрастанию индекса (код r25)[^15]. Источник сначала пробует одну опорную строку по сохранённому id (при отсутствии или ненахождении id — строку 0), затем смежный диапазон, ограниченный проверками компонентов, и лишь при пустом пакете — расширенный по высотам диапазон вокруг опорного индекса (код r25)[^95]. Если все три попытки дают пустой массив, источник ставит флаг исчерпания `DAT_00eea496` и возвращает `NULL`, а при установленном флаге следующий вызов сразу возвращает `NULL`, не собирая новый пакет (код r25)[^96]. `0x0026dca8` сбрасывает флаг исчерпания `DAT_00eea496`, если находит объект в `PluginRowsFolderCache` (код r25)[^97]. **Запрос и ответ.** При отсутствии текущего `request_id` `rows_loader` вызывает источник и ставит полученный пакет как операцию `get_folder_rows` (native kind=3); после обработки запросов цикл повторяется, пока есть готовые пакеты и нет текущей задачи (код r25)[^98]. При ненулевых входных данных `get_folder_rows` нативный JSON-сериализатор пишет в `input_data` `media_url` и массив `row_ids`, обходя его с нулевого индекса по возрастанию (код r25)[^99]. Ответ применяется только к текущей папке с совпадающим ключом `plugin_name:media_url`; при несовпадении пишется `response ignored, folder changed`, и строки в pending не попадают (код r25)[^85]. Ответ, прошедший проверки статуса и текущей папки, помещает строки с `id!=NULL` в `plugin_pending_rows` под ключом их `id` (код r25)[^100]. При применении pending строка ответа заменяет исходную по `id` через `PluginRowIndex`, а не по позиции в массиве ответа, и запись удаляется из pending (код r25)[^101]. Что происходит при пустом или неполном ответе — §6. **`PLUGIN_ROW_OPT_OPTIMIZE_INVISIBLE` и `GCOMP_OPT_STUB`.** При создании компонента строки с эффективным native-типом 2–4 функция `0x002cad94` при ненулевом втором аргументе и `options & 0x8` создаёт упрощённый компонент с флагом 0x400000 вместо ветви создания содержимого строки (код r25)[^102]. `plugin_rows_clear_stubs` в переданном диапазоне пересоздаёт строки с ненулевым `id`, `options & PLUGIN_ROW_OPT_OPTIMIZE_INVISIBLE` (0x8) и найденным компонентом с `GCOMP_OPT_STUB` (0x400000), вызывая создатель компонента с `optimize=0` (код r25)[^103]. Вывод о смысле опций для плагина — §6. ### 2.6. Работа с файлами из GUI: `fs_ctl` (r25) `fs_ctl` — действие с `cmd` (`FsCmdDef`: `kind` и `specific_def`), `output_path` и `post_action` (код r25)[^104]. Результат приходит не в ответе, а в свойствах продолжения `post_action` (код r25)[^105]. В строках оболочки есть `FS_CTL` и путь `/config/hd_debug/FS_CTL.txt` (код r25)[^106]. Про XML — §2.4 и §6. | `kind` | Класс и поля | Поведение | Claim | |---|---|---|---| | `resolve_url` | `FsResolveUrlDef`: `url` (`char *`), `try_mount_if_needed` (`bool`) | успех — `fs_ctl_resolved_path` | (код r25)[^107] | | `stat` | `FsStatDef`: `path` (`char *`) | успех — `fs_ctl_is_dir` (1 каталог, 0 файл, -1 прочее) и `fs_ctl_st_mode`, `fs_ctl_st_size`, `fs_ctl_st_mtime`, `fs_ctl_st_ctime` | (код r25)[^108] | | `scandir` | `FsScandirDef`: `path` (`char *`), `with_stat` (`bool`), `max_items_count` (`int`) | лимит 100000 при `max_items_count<=0` или `>=100000`; ошибка `stat` элемента — `error=1` у этого имени, итоговый статус не портит | (код r25)[^109] | | `get_file` | `FsGetFileDef`: `path`, `target_path` (`char *`), `skip`, `max_size`, `chunk_size` (`int`) | `max_size<=0` — предел 2147483647; `chunk_size<=0` — 1048576, иначе 1024–1048576; пишет во временный `.tmp` и переименовывает; `skip` ≠ 0 — seek, отрицательный от конца (origin 2) | (код r25)[^110] | | Поле продолжения | Когда | Claim | |---|---|---| | `action_status` | 1 при нулевом статусе команды, 0 при ненулевом; в прогоне `scandir` на tv188b r25 пришёл строкой `"1"` и `"0"` | (устройство r25, код r25)[^111] | | `fs_ctl_command` | имя команды | (код r25)[^112] | | `fs_ctl_error` | при ненулевом статусе и наличии строки ошибки | (код r25)[^113] | | `fs_ctl_content_size` | успешный `get_file` без `output_path` | (код r25)[^114] | | `fs_ctl_output_path` | `scandir` или `get_file` с непустым `output_path`; `fs_ctl_output` и `fs_ctl_content_size` тогда пропускаются | (код r25)[^115] | | `fs_ctl_write_output_failed=1` | запись в `output_path` не удалась; `action_status` всё равно по статусу команды | (код r25)[^116] | | `fs_ctl_path` | наблюдался в прогоне `scandir` с `output_path` на tv188b r25, при успехе и при ошибке | (устройство r25)[^117] | В `output_path` результат сохраняют только `scandir` и `get_file`, остальные команды идут через свойства (код r25)[^118]. При ошибке `scandir` или `get_file` с `output_path` объект ошибки пишется без имени поля после `input` (код r25)[^119]; что это значит для JSON при `scandir`, видно в прогоне ниже, при `get_file` — §6. **`scandir` с `output_path` на устройстве (tv188b r25, один прогон запроса 11).** На существующем каталоге `/tmp/kb_probe11` продолжение получило `action_status="1"`, `fs_ctl_command=scandir`, `fs_ctl_output_path` и `fs_ctl_path`, а файл результата содержит объект `input` и `output.names` (устройство r25)[^9]. На несуществующем `/tmp/kb_probe11/no_such` продолжение получило `action_status="0"`, `fs_ctl_error="scandir failed"` и те же три поля (устройство r25)[^120], а файл результата оказался синтаксически неверным JSON: анонимный объект ошибки после `input`, `{"input":{...},{"error":{...}}}` (устройство r25)[^84] — BUG-038. Поэтому исход `scandir` смотрите в `action_status`, а файл разбирайте после него. Сбой самой записи в `output_path` в этом прогоне не моделировался: §6. ### 2.7. Новые действия r25: `cond`, `load_and_scale_image`, `update_special_favorite_folder`, `apply_hash_dirties` **`cond`** — `CondActionData {pattern, post_action}` (код r25)[^121]; манифест `downloads` задаёт так `is_shown_action` первой точки входа: `pattern` `is_plugin_file(dunemdb_supplier_online_movies/__v2)` без `post_action` (код r25)[^122]. В `gui_condition` r25 регистрируются функции `is_file` и `is_plugin_file` и свойство `separate_android_tv_apps` (код r25)[^123]; оператор `ff` равен `firmware_feature` (код r25)[^124], его аргумент обрезается до 255 байт (код r25)[^125]. `is_plugin_file` делит аргумент по первому `/`, ищет запись по части до `/` и истинен, только если `<путь>/<остаток>` — обычный файл (код r25)[^126]. Как `cond` задаёт видимость точки входа `downloads` — §6. В одном прогоне запроса 11 на tv188b r25 `cond` с `pattern` `is_file(/tmp/kb_probe11/load.txt)` выполнил свой `post_action` со строковым `action_status="1"` (устройство r25)[^8], а с `is_file(/tmp/kb_probe11/no_such)` — свой `post_action` со строковым `action_status="0"` (устройство r25)[^127]. Ложное условие в этом прогоне продолжение не отменило (устройство r25)[^127], поэтому результат читайте в его обработчике из `action_status`. **`load_and_scale_image`** — `LoadAndScaleImageActionData {icon_url, local_path, scale_if_needed, icon_width, icon_height, post_action}` (код r25)[^128]. Фабрика добавляет `scale_if_needed=1` и размеры только при истинном `scale_if_needed`, а `post_action` — только если он непуст (код r25)[^129]. `local_path` отвергается, если он короче 5 символов, не начинается с `/`, заканчивается на `/` или начиная с позиции 2 в нём нет второго `/` (код r25)[^130]; `post_action` при этом всё равно копируется в продолжение (код r25)[^131], и оно получает `action_status` и при успешной, и при неудачной загрузке (код r25)[^132]. Пример — `MovieHelper::perform_add_special_favorite` для `@Movies` с целью `/flashdata/main_screen_items/@Movies/$id.jpg` и размером 291×437 (код r25)[^133]. В одном прогоне запроса 11 на tv188b r25 действие с `icon_url` `gui_skin://large_icons/apps.aai`, `local_path` `/tmp/kb_probe11/img.aai` и `scale_if_needed=false` создало файл 70344 байта и вызвало `post_action` со строковым `action_status="1"` (устройство r25)[^10]; масштабирование в этом запуске было выключено. **`update_special_favorite_folder`** — `UpdateSpecialFavoriteFolderActionData {name, delete, skip_interactions, post_action}` (код r25)[^134]; фабрика передаёт `name`, `delete`, `post_action`, объявленный `skip_interactions` не передаёт (код r25)[^135]. `MovieHelper` вызывает его при добавлении, когда `to_root_folder=false` (код r25)[^136], и с `delete=true`, когда список опустел (код r25)[^137]. **`apply_hash_dirties`** — `ApplyHashDirtiesActionData {post_action}` (код r25)[^138]. `DataModel::update_dirties_for_files` при `force_sync` или непустом `file_by_folder_id` добавляет его через `add_result_action` после сохранения (код r25)[^139], а `HashDirties::write_file` пишет `/flashdata/plugins_data/shell_ext/hash_dirties.txt` по семь полей на строку через табуляцию (код r25)[^140]. Что с файлом делает оболочка и когда очищает — §6. ### 2.8. Выбрать файл или папку: `choose_file` (r24, r25) `ChooseFileActionData {filter, ui_params, post_action}` (код r24)[^141] появился после r22 (§1.3). Фильтр — `FileChooserFilter {file_type_dir, file_extensions, check_writable}` (код r24)[^142]; интерфейс — `FileChooserUiParams`, в r25 к нему добавлены `with_network_folders`, `with_network_browser`, `new_folder_default_name` (код r25)[^143]. Если `ui_params` нет, оболочка r25 создаёт их со стандартной инициализацией: оба сетевых флага `true`, `with_favorite_folders=false`, `new_folder_default_name=null` (код r25)[^144]. Результат — в продолжении: `file_chooser_result_status` (0, если выбран хотя бы один URL, иначе 1) (код r25)[^145], `action_status=1` только при нулевом статусе (код r25)[^146], `file_chooser_result_urls_count` и `file_chooser_result_url_N` с индексом от нуля (код r25)[^147]. Встроенный `downloads` поэтому принимает результат при `action_status=1`, `file_chooser_result_status=0`, `file_chooser_result_urls_count=1` и наличии `file_chooser_result_url_0` (код r25)[^148]; папку он запрашивает через `dir_only=true`, `check_writable=true`, `nf_name=dune_downloads`, `with_network=true` (код r25)[^149]. Цепочка видна на устройстве (устройство r25)[^150]. ### 2.9. Запустить команду: `plugin_system` и `handle_response` (r25) `plugin_system` исполняет `run_string`: на tv188b r25 относительный `bin/ga.sh boot` из `global_action` выполнен как `system(sh …)` с абсолютным путём каталога плагина (устройство r25)[^151], скрипт работал под uid 1000(system) с текущим каталогом `/` (устройство r25)[^152]. Подробности о фоновых процессах — в «Приёмы разработки плагинов Dune HD». В r25 добавлен ключ `handle_response` (`bool`) (код r25)[^153]. Если команда не распознана как фоновая и `handle_response=true`, после `safe_system` наличие `restart_needed_flag` в каталоге из поля plugin+0x14 вызывает удаление флага и вызов функции 0x0069f754, независимо от кода завершения (код r25)[^154]; фоновая команда определяется по одиночному `&` в конце (не `&&`; допускается суффикс `echo $!`), тогда пишется лог игнорирования (код r25)[^155]. `post_action` копируется в продолжение и при фоне, и при ненулевом статусе (код r25)[^156]; статус действия — 0 при `safe_system==0`, иначе -1 (код r25)[^157]. Встроенный `s928x_dvfel` задаёт `handle_response yes` в `install` и `update` манифеста (код r25)[^158], а его `ctl.sh` при смене контрольной суммы библиотеки вне `boot` создаёт этот флаг, только если прежняя сумма непуста (код r25)[^159]. JSON-десериализация `plugin_system` этот ключ не читает: в обнулённых данных заполняются `run_string` и `post_action`, а `handle_response` остаётся `false` (код r25)[^16]. В XML-конструкторе отсутствие дочернего `handle_response` тоже даёт `false`: конструктор передаёт умолчание 0, а XML-помощник возвращает его при отсутствующем элементе (код r25)[^160]. **`handle_response=true` в JSON на устройстве (tv188b r25, один прогон запроса 11).** Действие `plugin_system` с `run_string=bin/kbp11_ps.sh` выполнило `sh <каталог установки>/bin/kbp11_ps.sh`; маркер записал `pwd=/`, а `post_action` с `k_ps` пришёл без `action_status` (устройство r25)[^11]. Созданные `restart_needed_flag` в `tmp_dir_path` и `install_dir_path` зонда оставались и сразу после шага, и через 10 с (устройство r25)[^17]; pid `com.dunehd.app` до действия и через 10 с после него один и тот же, 26976 (устройство r25)[^18]. Причину этот прогон не устанавливает: §6. ## 3. Справочник Столбец «Где» в §3.3–§3.5: `r24, r25` значит «объявлено в `dune_api.php` этой прошивки», это `code`, а не проверка работы. Перечень имён r24 подтверждён claims; все 316 имён `define` и 167 классов r24 есть и в r25 (код r24, r25)[^161], а значения и ключи сверены механически (§7). `нет в r22` — по (код r22, r24)[^42]. `device` — наблюдение на tv188b r25. В столбце «Назначение» «не описано» значит, что claims о смысле нет, и догадка по имени не записана. «По коду r25:» в §3.4 — фабрика и место вызова во встроенных плагинах r25 (`shell_ext`, `android_apps`, `bt_setup`, `downloads`): что и когда плагин передаёт, а не что делает оболочка; выводы о действии оболочки — в §6. ### 3.1. Интерфейс `DunePlugin` и операции `PluginOperationType` (r24, r25) Интерфейс объявляет 11 методов (код r24)[^24]. Сигнатуры и результаты — по комментариям `dune_plugin.php`, `$plugin_cookies` — `[inout]` (код r24)[^62]. Строки операций — значения `PLUGIN_OP_*` (код)[^162]; тип результата — `get_out_type_code` (код)[^163]. | Константа | Метод плагина | Результат | Тип данных ответа | Где | Claim | |---|---|---|---|---|---| | `PLUGIN_OP_GET_FOLDER_VIEW` | `get_folder_view($media_url, &$plugin_cookies)`, при `sel_state` — `_v2` | `PluginFolderView` | `plugin_folder_view` | r24, r25 | (код r24)[^164] | | `PLUGIN_OP_GET_NEXT_FOLDER_VIEW` | `get_next_folder_view($media_url, &$plugin_cookies)`, при `sel_state` — `_v2` | `PluginFolderView` | `plugin_folder_view` | r24, r25 | (код r24)[^164] | | `PLUGIN_OP_GET_REGULAR_FOLDER_ITEMS` | `get_regular_folder_items($media_url, $from_ndx, &$plugin_cookies)` | `PluginRegularFolderRange` | `plugin_regular_folder_range` | r24, r25 | (код r24)[^165] | | `PLUGIN_OP_HANDLE_USER_INPUT` | `handle_user_input(&$user_input, &$plugin_cookies)` | `GuiAction` | `gui_action` | r24, r25; `device` (устройство r25)[^166] | (код r24)[^2] | | `PLUGIN_OP_GET_TV_INFO` | `get_tv_info($media_url, &$plugin_cookies)`, при `sel_state` — `_v2` | `PluginTvInfo` | `plugin_tv_info` | r24, r25 | (код r24)[^167] | | `PLUGIN_OP_GET_DAY_EPG` | `get_day_epg($channel_id, $day_start_tm_sec, &$plugin_cookies)` | `List` | `plugin_tv_epg_program_list` | r24, r25 | (код r24)[^168] | | `PLUGIN_OP_GET_TV_PLAYBACK_URL` | `get_tv_playback_url($channel_id, $archive_tm_sec, $protect_code, &$plugin_cookies)`, при `program_id` — `_v2` | строка | `url` | r24, r25 | (код r24)[^169] | | `PLUGIN_OP_GET_TV_STREAM_URL` | `get_tv_stream_url($media_url, &$plugin_cookies)`, при `sel_state` — `_v2` | строка | `url` | r24, r25 | (код r24)[^167] | | `PLUGIN_OP_CHANGE_TV_FAVORITES` | `change_tv_favorites($op_type, $channel_id, &$plugin_cookies)`; тип из `fav_op_type` | `GuiAction`, расхождение — §5 | `gui_action` | r24, r25 | (код r24)[^170] | | `PLUGIN_OP_GET_VOD_INFO` | `get_vod_info($media_url, &$plugin_cookies)`, при `sel_state` — `_v2` | `PluginVodInfo` | `plugin_vod_info` | r24, r25 | (код r24)[^171] | | `PLUGIN_OP_GET_VOD_STREAM_URL` | `get_vod_stream_url($media_url, &$plugin_cookies)`, при `sel_state` — `_v2` | строка | `url` | r24, r25; `device` (устройство r25)[^21] | (код r24)[^171] | | `PLUGIN_OP_GET_VOD_STREAM_INFO` | необязательный `get_vod_stream_info($input_data, $plugin_cookies)`, в интерфейсе нет | `PluginStreamInfo` | `plugin_stream_info` | нет в r22; r24, r25; `device` (устройство r25)[^172] | (код)[^173] | | `PLUGIN_OP_GET_FOLDER_ROWS` | необязательный `get_folder_rows($media_url, $row_ids)` | `PluginFolderRows` | `plugin_folder_rows` | r25 | (код r25)[^45] | Значения: `get_folder_view`, `get_next_folder_view`, `get_regular_folder_items`, `handle_user_input`, `get_tv_info`, `get_day_epg`, `get_tv_playback_url`, `get_tv_stream_url`, `change_tv_favorites`, `get_vod_info`, `get_vod_stream_url`, `get_vod_stream_info`, `get_folder_rows`. ### 3.2. `PluginOutputData` и `PluginOutputDataType` (r24, r25) `PluginOutputData` — ключи `has_data`, `data_type`, `data`, `plugin_cookies`, `is_error`, `error_action` (код r24)[^174]. Как оболочка r24 их проверяет — §2.2. Ветвь разбора `data` в оболочке r24 создаёт структуру по индексу типа; ниже индексы сведены со строками типа, это сопоставление — вывод (§6). | `data_type` | Константа | Что читается из `data` | Claim | |---|---|---|---| | `plugin_folder_view` | `PLUGIN_OUT_DATA_PLUGIN_FOLDER_VIEW` | `PluginFolderView` | (код r24)[^175] | | `plugin_regular_folder_range` | `PLUGIN_OUT_DATA_PLUGIN_REGULAR_FOLDER_RANGE` | `PluginRegularFolderRange` | (код r24)[^176] | | `gui_action` | `PLUGIN_OUT_DATA_GUI_ACTION` | `GuiAction` | (код r24)[^177] | | `plugin_tv_info` | `PLUGIN_OUT_DATA_PLUGIN_TV_INFO` | `PluginTvInfo` | (код r24)[^178] | | `plugin_tv_epg_program_list` | `PLUGIN_OUT_DATA_PLUGIN_TV_EPG_PROGRAM_LIST` | список `PluginTvEpgProgram` | (код r24)[^179] | | `url` | `PLUGIN_OUT_DATA_URL` | строка | (код r24)[^180] | | `plugin_vod_info` | `PLUGIN_OUT_DATA_PLUGIN_VOD_INFO` | `PluginVodInfo` | (код r24)[^181] | | `plugin_stream_info` | `PLUGIN_OUT_DATA_PLUGIN_STREAM_INFO` | `PluginStreamInfo`: `url`, `markers` | (код r24)[^182] | | `plugin_folder_rows` (r25) | `PLUGIN_OUT_DATA_PLUGIN_FOLDER_ROWS` | `PluginFolderRows`; строки есть в `libduneshell.so` r25 | (код r25)[^183] | ### 3.3. Константы `define` и перечисления (r24, r25) Значения — из claims r24, новые в r25 помечены; сверка с файлом r25 — §7. `GuiEventKind` — 91 константа (код r24)[^184]: клавиши и часть прочих — в «Ввод и диалоги», здесь их нет; остальные — в строке таблицы. В r22 нет `GUI_EVENT_CONFIRM_UPDATE`, `GUI_EVENT_KEY_FAVORITES`, `GUI_EVENT_NETWORK_CHANGE`, `GUI_EVENT_TOPMENU_REFRESH` (код r22, r24)[^42]. | Группа | Значения | Где | Claim | |---|---|---|---| | `VALIGN_*` | `VALIGN_TOP`=0, `VALIGN_CENTER`=1, `VALIGN_BOTTOM`=2 | r24, r25 | (код r24)[^185] | | `HALIGN_*` | `HALIGN_LEFT`=0, `HALIGN_CENTER`=1, `HALIGN_RIGHT`=2 | r24, r25 | (код r24)[^186] | | `FONT_SIZE_*` | `FONT_SIZE_NORMAL`=0, `FONT_SIZE_SMALL`=1, `FONT_SIZE_LARGE`=4 | r24, r25 | (код r24)[^187] | | `CYCLE_MODE_GAP_*` | `CYCLE_MODE_GAP_AUTO`=0, `CYCLE_MODE_GAP_YES`=1, `CYCLE_MODE_GAP_NO`=2 | r24, r25 | (код r24)[^188] | | `ORIENTATION_*` | `ORIENTATION_VERTICAL`=0, `ORIENTATION_HORIZONTAL`=1 | r24, r25 | (код r24)[^189] | | `USE_TZ_*` | `USE_TZ_GMT`=0, `USE_TZ_LOCAL`=1, `USE_TZ_NONE`=2 | r24, r25 | (код r24)[^190] | | `EPG_*` | `EPG_START_OVER_ENABLED`=4, `EPG_START_OVER_DISABLED`=8, `EPG_TRICK_PLAY_ENABLED`=16 | r24, r25 | (код r24)[^191] | | `GUI_ACTION_FLAG_*` | `GUI_ACTION_FLAG_SKIP_ON_PLAY_RESTART`=1 | r24, r25 | (код r24)[^38] | | `CHANGE_OP_*` | `CHANGE_OP_ADD`=2, `CHANGE_OP_DELETE`=3, `CHANGE_OP_DELETE_ANDROID_APPS_EXCEPT`=101, `CHANGE_OP_NOP`=0, `CHANGE_OP_REPLACE`=1, `CHANGE_OP_TOGGLE`=4 | r24, r25 | (код r24)[^192] | | `EDIT_LIST_CONFIG_OPT_*` | `EDIT_LIST_CONFIG_OPT_ALLOW_EMPTY`=0x2, `EDIT_LIST_CONFIG_OPT_REMOVE_UNCHECKED`=0x1, `EDIT_LIST_CONFIG_OPT_WITH_DEFAULT`=0x4 | r24, r25 | (код r24)[^193] | | `GCOMP_GEOM_OPT_*` | `GCOMP_GEOM_OPT_NON_NEGATIVE_X`=0x1, `GCOMP_GEOM_OPT_NON_NEGATIVE_Y`=0x2 | r24, r25 | (код r24)[^194] | | `GCOMP_OPT_*` | `GCOMP_OPT_APPEAR_WITH_FADE`=0x100, `GCOMP_OPT_BG_PICTURE`=0x8, `GCOMP_OPT_DEBUG_FRAME`=0x01000000, `GCOMP_OPT_EMPTY_WITH_VIDEO`=0x20, `GCOMP_OPT_FOCUS`=0x100000, `GCOMP_OPT_IMG_CHECK_EFF_URL`=0x200000, `GCOMP_OPT_NO_CLIP`=0x4, `GCOMP_OPT_NO_PREPAINT`=0x2, `GCOMP_OPT_PREPAINT`=0x1, `GCOMP_OPT_TRANSPARENT_WITH_VIDEO`=0x10, `GCOMP_OPT_TTF_COMPACT_HEIGHT`=0x2000, `GCOMP_OPT_TTF_LAYOUT_FIX`=0x1000, `GCOMP_OPT_TTF_QUALITY_WRAP`=0x4000; в r25: `GCOMP_OPT_STUB`=0x400000 | r24, r25 | (код)[^195] | | `PLUGIN_ROW_OPT_*` | `PLUGIN_ROW_OPT_FIRST_IN_CLUSTER`=0x1, `PLUGIN_ROW_OPT_FIRST_WITH_INFO`=0x2; в r25: `PLUGIN_ROW_OPT_LOADING`=0x4, `PLUGIN_ROW_OPT_OPTIMIZE_INVISIBLE`=0x8 | r24, r25 | (код)[^196] | | `DialogFrameStyle` | `DIALOG_FRAME_STYLE_DEFAULT`=default, `DIALOG_FRAME_STYLE_GLASS`=glass, `DIALOG_FRAME_STYLE_TRANSPARENT`=transparent, `DIALOG_FRAME_STYLE_PLAYBACK_INFO`=playback_info | r24, r25 | (код r24)[^197] | | `GCompFocusType` | `GCOMP_FOCUS_NONE`=none, `GCOMP_FOCUS_SYSTEM`=system, `GCOMP_FOCUS_DEFAULT_CUT_IMAGE`=default_cut_image, `GCOMP_FOCUS_INACTIVE_CUT_IMAGE`=inactive_cut_image, `GCOMP_FOCUS_DEFAULT_RECT`=default_rect, `GCOMP_FOCUS_RECT2`=rect2, `GCOMP_FOCUS_RECT3`=rect3 | r24, r25 | (код r24)[^198] | | `GCompItemType` | `GCOMP_ITEM_REGULAR`=regular, `GCOMP_ITEM_LABEL`=label, `GCOMP_ITEM_BUTTON`=button, `GCOMP_ITEM_TEXT_FIELD`=text_field | r24, r25 | (код r24)[^199] | | `GCompLayoutRole` | `GCOMP_LAYOUT_UNSET`=unset, `GCOMP_LAYOUT_TOP`=top, `GCOMP_LAYOUT_BOTTOM`=bottom, `GCOMP_LAYOUT_LEFT`=left, `GCOMP_LAYOUT_RIGHT`=right, `GCOMP_LAYOUT_CENTER`=center | r24, r25 | (код r24)[^200] | | `GCompTextFit` | `GCOMP_TEXT_FIT_CROP`=crop, `GCOMP_TEXT_FIT_INSERT_ELLIPSIS`=insert_ellipsis, `GCOMP_TEXT_FIT_APPEND_ELLIPSIS`=append_ellipsis | r24, r25 | (код r24)[^201] | | `GCompTransition` | `GCOMP_TRANSITION_NONE`=none, `GCOMP_TRANSITION_LAST_STEP`=last_step, `GCOMP_TRANSITION_DEFAULT`=default, `GCOMP_TRANSITION_FADE`=fade | r24, r25 | (код r24)[^202] | | `GComponentKind` | `GCOMPONENT_LABEL`=label, `GCOMPONENT_TTF_LABEL`=ttf_label, `GCOMPONENT_RECT`=rect, `GCOMPONENT_IMAGE`=image, `GCOMPONENT_CUT_IMAGE`=cut_image, `GCOMPONENT_SANDWICH`=sandwich, `GCOMPONENT_BUTTON`=button, `GCOMPONENT_TEXT_FIELD`=text_field, `GCOMPONENT_PANEL`=panel, `GCOMPONENT_SCROLL_PANE`=scroll_pane, `GCOMPONENT_PREPAINT_PANE`=prepaint_pane, `GCOMPONENT_SCROLLBAR`=scrollbar | r24, r25 | (код r24)[^203] | | `GCompsFlipEffect` | `GCOMPS_FLIP_EFFECT_NONE`=none, `GCOMPS_FLIP_EFFECT_FADE`=fade, `GCOMPS_FLIP_EFFECT_FADE_OUT_SCALED`=fade_out_scaled | r24, r25 | (код r24)[^204] | | `GuiControlKind` | `GUI_CONTROL_LABEL`=label, `GUI_CONTROL_PROGRESS_BAR`=progress_bar, `GUI_CONTROL_COMBOBOX`=combobox, `GUI_CONTROL_TEXT_FIELD`=text_field, `GUI_CONTROL_BUTTON`=button, `GUI_CONTROL_VGAP`=vgap | r24, r25 | (код r24)[^205] | | `GuiEventKind (нет в input-dialogs)` | `GUI_EVENT_FOLDER_LEAVE`=folder_leave, `GUI_EVENT_FOLDER_ENTER`=folder_enter, `GUI_EVENT_FOLDER_RETURN_BACK`=folder_return_back, `GUI_EVENT_MENU_PLAYBACK_OSD_CLOSED`=menu_playback_osd_closed, `GUI_EVENT_MENU_PLAYBACK_OSD_GOING_TO_OPEN`=menu_playback_osd_going_to_open, `GUI_EVENT_MENU_PLAYBACK_FINISH`=menu_playback_finish, `GUI_EVENT_MENU_EXT_APP_FINISH`=menu_ext_app_finish, `GUI_EVENT_WEB_BROWSER_FINISH`=web_browser_finish, `GUI_EVENT_BOOT`=boot, `GUI_EVENT_BOOT_END`=boot_end, `GUI_EVENT_INSTALL`=install, `GUI_EVENT_UPDATE`=update, `GUI_EVENT_UNINSTALL`=uninstall, `GUI_EVENT_GOING_TO_UPDATE`=going_to_update, `GUI_EVENT_GOING_TO_STOP`=going_to_stop, `GUI_EVENT_GUI_START`=gui_start, `GUI_EVENT_EARLY_GUI_START`=early_gui_start, `GUI_EVENT_STORAGE_DETECTED_MENU`=storage_detected_menu, `GUI_EVENT_FILE_POPUP_MENU`=file_popup_menu, `GUI_EVENT_TOPMENU_POPUP_MENU`=topmenu_popup_menu, `GUI_EVENT_TOPMENU_REFRESH`=topmenu_refresh, `GUI_EVENT_GOING_TO_RELOAD_ALL_FOLDERS`=going_to_reload_all_folders, `GUI_EVENT_FAVORITES_UPDATED`=favorites_updated, `GUI_EVENT_NETWORK_CHANGE`=network_change, `GUI_EVENT_SETTINGS_UPDATED`=settings_updated, `GUI_EVENT_CONFIRM_UPDATE`=confirm_update, `GUI_EVENT_SHUTDOWN`=shutdown | r24, r25 | (код r24)[^184] | | `PluginEpgMode` | `PLUGIN_EPG_DISABLED`=disabled, `PLUGIN_EPG_USE_DAY_REQUEST`=use_day_request, `PLUGIN_EPG_GET_FROM_STREAM`=get_from_stream, `PLUGIN_EPG_USE_DVB_PROVIDER`=use_dvb_provider | r24, r25 | (код r24)[^206] | | `PluginFavoritesOpType` | `PLUGIN_FAVORITES_OP_ADD`=add, `PLUGIN_FAVORITES_OP_REMOVE`=remove, `PLUGIN_FAVORITES_OP_MOVE_UP`=move_up, `PLUGIN_FAVORITES_OP_MOVE_DOWN`=move_down | r24, r25 | (код r24)[^207] | | `PluginFolderViewKind` | `PLUGIN_FOLDER_VIEW_REGULAR`=view_regular, `PLUGIN_FOLDER_VIEW_CONTROLS`=view_controls, `PLUGIN_FOLDER_VIEW_MOVIE`=view_movie, `PLUGIN_FOLDER_VIEW_GCOMPS`=view_gcomps, `PLUGIN_FOLDER_VIEW_ROWS`=view_rows | r24, r25 | (код r24)[^208] | | `PluginFontSize` | `PLUGIN_FONT_NORMAL`=normal, `PLUGIN_FONT_SMALL`=small | r24, r25 | (код r24)[^209] | | `PluginRowType` | `PLUGIN_ROW_TYPE_VGAP`=row_vgap, `PLUGIN_ROW_TYPE_GCOMPS`=row_gcomps, `PLUGIN_ROW_TYPE_REGULAR`=row_regular, `PLUGIN_ROW_TYPE_TITLE`=row_title; в r25: `PLUGIN_ROW_TYPE_DUP`=row_dup | r24, r25 | (код)[^210] | | `StreamMarkerType` | `STREAM_MARKER_INTRO`=intro, `STREAM_MARKER_RECAP`=recap, `STREAM_MARKER_CLOSING_CREDITS`=closing_credits | нет в r22; r24, r25 | (код)[^211] | | `FsCmdKind` | `FS_CMD_RESOLVE_URL`=resolve_url, `FS_CMD_STAT`=stat, `FS_CMD_SCANDIR`=scandir, `FS_CMD_GET_FILE`=get_file | r25 | (код r25)[^212] | Таблица даёт значения. Смысл отдельных констант записан там, где они используются: `CHANGE_OP_DELETE_ANDROID_APPS_EXCEPT` — §3.4, `edit_main_screen`; `PLUGIN_FAVORITES_OP_*` — `fav_op_type` операции `change_tv_favorites` (код r24)[^213]; `PLUGIN_ROW_OPT_LOADING`, `PLUGIN_ROW_OPT_OPTIMIZE_INVISIBLE` и `GCOMP_OPT_STUB` — §2.5. `FS_CMD_*` — имена выражений `def->kind == FS_CMD_*` есть в `libduneshell.so` r25 (код r25)[^214]. ### 3.4. Действия: `*_ACTION_ID` и классы `*ActionData` (r24, r25) 92 действия по областям, фабрики — из `shell_ext`, r24, если не сказано иное (код r24)[^4]. Ключи — в порядке объявления. Строки с пометкой «(?)» сведены только по сходству имён (§6). «SDK:» в ячейке — сокращение для «по SDK, на r24+ не подтверждено». **Папки, путь и обновление экрана** | Константа и строка | Данные: класс и ключи | Назначение | Где | Claim | |---|---|---|---|---| | `PLUGIN_OPEN_FOLDER_ACTION_ID` = `plugin_open_folder` | `PluginOpenFolderActionData`: `caption`, `media_url`, `id`, `sel_id`, `tags`, `keep_osd_context`, `post_action` | SDK: открывает папку плагина, `caption` добавляет в блок пути, вызывает `get_folder_view($media_url)` (SDK)[^215]; `media_url=null` — берёт выбранный элемент (SDK)[^216]. Фабрика: `open_folder_ext`. | r24, r25 | (код r24)[^217] | | `OPEN_FOLDER_ACTION_ID` = `open_folder` | `OpenFolderActionData`: `media_url`, `caption` | SDK: открывает обычную, не плагинную папку (SDK)[^218]. Фабрика с похожим именем строит другое действие — §5. | r24, r25 | (код)[^219] | | `PLUGIN_EXIT_FOLDERS_ACTION_ID` = `plugin_exit_folders` | `PluginExitFoldersActionData` (?): `count`, `post_action` | По коду r25: фабрика `exit_folders` плагина `downloads` строит действие с `count` и `post_action`, а при неопределённой константе `PluginExitFoldersActionData::count` возвращает только `post_action`; манифест `downloads` ставит `plugin_exit_folders` в `global_actions` `install` и `update` (код r25)[^220]. Смысл `count` — §6. Запуск при `count=0` (один прогон на tv188b r25): `post_action` вызван, `play_mode=none`, в сохранённом вводе нет `action_status` (устройство r25)[^13]; выход из папок при `count>0` не наблюдался. | нет в r22; r24, r25; фабрика и манифест — код r25; `device` только при `count=0` | (код)[^221] | | `PLUGIN_REPLACE_PATH_ACTION_ID` = `plugin_replace_path` | `PluginReplacePathActionData`: `erase_count`, `elements`, `sel_id`, `post_action` | По коду r25: фабрика `replace_path` (`shell_ext`) передаёт `erase_count`, `elements` и `post_action`, а `sel_id` не передаёт; единственный вызывающий — `PathHelper::update_movie_file_matching_path`: `erase_count = get_movie_screens_count()`, `elements` — элементы пути (`media_url`, `caption`, `id`) нового фильма (код r25)[^222]. Что делает оболочка — §6. Фабрика: `replace_path`. | r24, r25; вызов — код r25 | (код r24)[^223] | | `RENAME_PATH_ACTION_ID` = `rename_path` | `RenamePathActionData`: `caption`, `post_action` | По коду r25: `shell_ext` выдаёт действие после успешного `rename_mc_folder`: `close_dialog_and_run(rename_path($caption, invalidate_all_folders(...)))` (код r25)[^224]. Что делает оболочка — §6. Фабрика: `rename_path`. | r24, r25; вызов — код r25 | (код r24)[^225] | | `PLUGIN_INVALIDATE_FOLDERS_ACTION_ID` = `plugin_invalidate_folders` | `PluginInvalidateFoldersActionData`: `media_urls`, `all_except`, `repopulate`, `post_action` | SDK: сбрасывает кэш папок (SDK)[^226]; «Экраны и папки плагина». Фабрика: `invalidate_folders`. | r24, r25 | (код r24)[^227] | | `PLUGIN_UPDATE_FOLDER_ACTION_ID` = `plugin_update_folder` | `PluginUpdateFolderActionData`: `range`, `need_refresh`, `sel_ndx` | SDK: частично заменяет состояние регулярной папки (SDK)[^228]; «Экраны и папки плагина». Фабрика: `update_regular_folder`. | r24, r25 | (код r24)[^229] | | `RESET_CONTROLS_ACTION_ID` = `reset_controls` | `ResetControlsActionData`: `defs`, `initial_sel_ndx`, `keep_inner_state`, `post_action` | SDK: заменяет состояние диалога или папки с контролами (SDK)[^230]; «Экраны и папки плагина». Фабрика: `reset_controls`. | r24, r25 | (код r24)[^231] | | `CHANGE_BEHAVIOUR_ACTION_ID` = `change_behaviour` | `ChangeBehaviourActionData`: `actions`, `timer`, `post_action` | SDK: заменяет заданную карту действий и перезапускает заданный таймер (SDK)[^232]; «Экраны и папки плагина». Фабрика: `change_behaviour`. | r24, r25 | (код r24)[^233] | | `CHANGE_GCOMPS_ACTION_ID` = `change_gcomps` | `ChangeGCompsActionData`: `change_defs`, `window_change`, `interrupt_disabled`, `num_steps`, `flip_effect`, `duration_multiplier`, `small_state_text`, `sel_state`, `ui_state`, `skip_repaint`, `post_action` | «Экраны и папки плагина». Фабрика: `change_gcomps`. | r24, r25 | (код r24)[^234] | | `PLUGIN_UPDATE_STICKER_ACTION_ID` = `plugin_update_sticker` | `PluginUpdateStickerActionData`: `sticker`, `ep_media_url`, `post_action` | «Экраны и папки плагина». Фабрика: `update_sticker`. | r24, r25 | (код r24)[^235] | | `PLUGIN_UPDATE_ROWS_INFO_ACTION_ID` = `plugin_update_rows_info` | `PluginUpdateRowsInfoActionData`: `clear_cache`, `invalidate_cache`, `info`, `post_action` | «Экраны и папки плагина». Фабрика: `update_rows_info`. | r24, r25 | (код r24)[^236] | | `PLUGIN_UPDATE_ROWS_MENU_ACTION_ID` = `plugin_update_rows_menu` | `PluginUpdateRowsMenuActionData` (?): `reload_topmenu`, `post_action` | По коду r25: фабрика `update_rows_menu` плагина `android_apps` передаёт `reload_topmenu` и `post_action`; `apps_setup_screen` выдаёт `update_rows_menu(true, …)` после `AppShortcuts::set_dirty`, `AppConfig::set_dirty` и `EpfsHandler::update_apps_epfs`. Что делает оболочка (перечитать меню строк и верхнее меню) — только по имени ключа, не проверено (код r25)[^237]. | r24, r25; вызов — код r25 | (код r24)[^238] | | `PLUGIN_REFRESH_ENTRY_POINTS_ACTION_ID` = `plugin_refresh_entry_points` | `PluginRefreshEntryPointsActionData` (?): `post_action` | не описано | r24, r25 | (код r24)[^239] | | `UPDATE_FOLDER_MARKS_ACTION_ID` = `update_folder_marks` | `UpdateFolderMarksActionData`: `change_op`, `ids`, `marks_output_key`, `post_action` | В «Недавнем» r25 `update_folder_marks(CHANGE_OP_NOP, null, 'marks_str', post_action)` оборачивает Popup и Clear (код r25)[^240]. Фабрика: `update_folder_marks`. | r24, r25 | (код r24)[^241] | | `PLUGIN_CLEAR_ARCHIVE_CACHE_ACTION_ID` = `plugin_clear_archive_cache` | `PluginClearArchiveCacheActionData`: `archive_id`, `post_action` | SDK: удаляет кэш архивов плагина; при `archive_id=null` — все архивы плагина (SDK)[^242]. Фабрика: `clear_archive_cache`. | r24, r25 | (код r24)[^243] | | `PLUGIN_UPDATE_ARCHIVE_CACHE_ACTION_ID` = `plugin_update_archive_cache` | `PluginUpdateArchiveCacheActionData` (?): `archive`, `reread_archive_dir`, `post_action` | не описано | r24, r25 | (код r24)[^244] | | `PLUGIN_UPDATE_EPF_MAPPING_ACTION_ID` = `plugin_update_epf_mapping` | `PluginUpdateEpfMappingActionData`: `epf_id`, `mapped_plugin_name`, `sync_epfs`, `post_action` | По коду r25: фабрика `update_epf_mapping` (`shell_ext`) без `MainHelper::$with_newgui` возвращает `post_action`; `reread_all_epfs($sync_epfs)` — тот же вызов с `epf_id` и `mapped_plugin_name` = `null` (код r25)[^245]. С непустым `epf_id` действие строит `get_update_epf_action`: для каждой пары `epf_id` => имя плагина из `$epf_mapping`, `sync_epfs=false`, только при `HD::with_epfs()` (код r25)[^246]. Что делает оболочка — §6. Фабрика: `update_epf_mapping`. | r24, r25; вызов — код r25 | (код r24)[^247] | | `SHOW_MAIN_SCREEN_ACTION_ID` = `show_main_screen` | `ShowMainScreenActionData`: `post_action` | SDK: переключает на главный экран; добавлено для `auto_start`, реализация с ограничениями (SDK)[^248]. Фабрика: `show_main_screen`. | r24, r25 | (код r24)[^249] | | `SHOW_BLACK_SCREEN_ACTION_ID` = `show_black_screen` | `ShowBlackScreenActionData`: `bg_url`, `post_action` | SDK: чёрный экран либо картинка `bg_url` (SDK)[^250]. | r24, r25 | (код)[^251] | **Диалоги, меню и ошибки** | Константа и строка | Данные: класс и ключи | Назначение | Где | Claim | |---|---|---|---|---| | `SHOW_DIALOG_ACTION_ID` = `show_dialog` | `ShowDialogActionData`: `title`, `defs`, `actions`, `timer`, `close_by_return`, `preferred_width`, `max_height`, `min_item_title_width`, `initial_sel_ndx`, `params` | SDK: показывает диалог с контролами (SDK)[^252]; «Ввод и диалоги», поля — «Ввод и диалоги». Фабрика: `show_dialog`. | r24, r25; `device` (устройство r25)[^253] | (код r24)[^254] | | `SHOW_GCOMPS_DIALOG_ACTION_ID` = `show_gcomps` | `ShowGCompsDialogActionData` (?): `geom_def`, `comp_defs`, `focus`, `ui_state`, `sel_state`, `actions`, `timer`, `params`, `async_icon_loading` | не описано | r24, r25 | (код r24)[^255] | | `CLOSE_DIALOG_AND_RUN_ACTION_ID` = `close_dialog_and_run` | `CloseDialogAndRunActionData`: `post_action` | SDK: закрывает диалог и возвращает `post_action` (SDK)[^256]; «Ввод и диалоги». Фабрика: `close_dialog_and_run`. | r24, r25 | (код r24)[^257] | | `CLOSE_AND_RUN_ACTION_ID` = `close_and_run` | `CloseAndRunActionData`: `post_action` | SDK: при активном диалоге с контролами работает как `close_dialog_and_run` (SDK)[^258]; «Ввод и диалоги». Фабрика: `close_and_run`. | r24, r25 | (код r24)[^259] | | `SHOW_POPUP_MENU_ACTION_ID` = `show_popup_menu` | `ShowPopupMenuActionData`: `menu_items`, `selected_menu_item_index`, `prepend_items_from_selected_plugin` | SDK: показывает всплывающее меню (SDK)[^260]; «Ввод и диалоги». Фабрика: `show_popup_menu`. | r24, r25 | (код r24)[^261] | | `ADD_MENU_ITEMS_ACTION_ID` = `add_menu_items` | `AddMenuItemsActionData`: `menu_id`, `menu_params`, `menu_items`, `sel_ndx`, `post_action` | «Ввод и диалоги». В GlobalTV — ответ на `topmenu_popup` (код)[^262]. Фабрика: `add_menu_items`. | r24, r25 | (код r24)[^263] | | `RENAME_MENU_ITEM_ACTION_ID` = `rename_menu_item` | `RenameMenuItemActionData` (?): `id`, `caption`, `orig_caption`, `with_dialog`, `post_action` | По коду r25: фабрика `rename_menu_item` плагина `android_apps` передаёт `id`, `caption`, `orig_caption`, `with_dialog` (по умолчанию `true`) и `post_action`; `AppsScreen::rename` передаёт id пункта меню приложения, текущую и исходную подпись, `with_dialog=true` и продолжение `finalize_rename`; по месту вызова — диалог переименования пункта меню (код r25)[^264]. | r24, r25; вызов — код r25 | (код r24)[^265] | | `PLUGIN_SHOW_ERROR_ACTION_ID` = `plugin_show_error` | `PluginShowErrorActionData`: `fatal`, `title`, `msg_lines`, `stop_playback`, `retry_delay_ms`, `options`, `post_action` | SDK: сообщение в центре экрана или диалог (SDK)[^266]; «Ввод и диалоги». | r24, r25; `device` (устройство r25)[^267] | (код r24)[^268] | | `CHOOSE_FILE_ACTION_ID` = `choose_file` | `ChooseFileActionData`: `filter`, `ui_params`, `post_action` | Диалог выбора файла или папки: §2.8. | нет в r22; r24, r25; `device` (устройство r25)[^150] | (код)[^269] | **Воспроизведение, ТВ и EPG** | Константа и строка | Данные: класс и ключи | Назначение | Где | Claim | |---|---|---|---|---| | `PLUGIN_VOD_PLAY_ACTION_ID` = `plugin_vod_play` | `PluginVodPlayActionData`: `vod_info` | SDK: запускает VOD (SDK)[^270]; «Воспроизведение из плагина». Фабрика: `vod_play`. | r24, r25; `device` (устройство r25)[^271] | (код r24)[^272] | | `PLUGIN_TV_PLAY_ACTION_ID` = `plugin_tv_play` | `PluginTvPlayActionData`: `initial_group_id`, `initial_channel_id`, `initial_is_favorite`, `initial_archive_tm`, `initial_trick_play`, `initial_trick_play_duration`, `initial_archive_program` | SDK: запускает ТВ (SDK)[^273]; «Воспроизведение из плагина». Фабрика: `tv_play`. | r24, r25 | (код r24)[^274] | | `LAUNCH_MEDIA_URL_ACTION_ID` = `launch_media_url` | `LaunchMediaUrlActionData`: `url`, `caption`, `play_in_background`, `start_index`, `internal_player_only`, `resume_extra_choices`, `resume_ext_text`, `params`, `post_action` | SDK: строит плейлист и выбирает исполнителя (SDK)[^275]; «Воспроизведение из плагина». Фабрика: `launch_media_url_ext`. | r24, r25; `device` (устройство r25)[^276] | (код r24)[^277] | | `FILE_PLAY_ACTION_ID` = `file_play` | `FilePlayActionData`: `url`, `caption` | SDK: один файл или поток (SDK)[^278]; «Воспроизведение из плагина». Фабрика: `launch_file`. | r24, r25 | (код r24)[^279] | | `PLAYLIST_PLAY_ACTION_ID` = `playlist_play` | `PlaylistPlayActionData`: `url`, `start_index` | SDK: плейлист из файла или папки (SDK)[^280]; «Воспроизведение из плагина». Фабрика: `launch_playlist`. | r24, r25 | (код r24)[^281] | | `DVD_PLAY_ACTION_ID` = `dvd_play` | `DvdPlayActionData`: `url` | SDK: DVD по `url` (SDK)[^282]; «Воспроизведение из плагина». | r24, r25 | (код)[^283] | | `BLURAY_PLAY_ACTION_ID` = `bluray_play` | `BlurayPlayActionData`: `url` | SDK: Blu-ray по `url`, только в прошивках с поддержкой Blu-ray (SDK)[^284]; «Воспроизведение из плагина». | r24, r25 | (код)[^285] | | `STOP_PLAYBACK_ACTION_ID` = `stop_playback` | `StopPlaybackActionData`: `wait_for_completion`, `post_action` | не описано Фабрика: `stop_playback`. Запуск с `wait_for_completion=true` без воспроизведения (`play_mode=none`, один прогон на tv188b r25): `post_action` вызван с `play_mode=none`, в сохранённом вводе нет `action_status` (устройство r25)[^12]; остановка идущего воспроизведения не наблюдалась. | r24, r25; `device` только без воспроизведения | (код r24)[^286] | | `SWITCH_OSD_MODE_ACTION_ID` = `switch_osd_mode` | `SwitchOsdModeActionData`: `osd_mode`, `post_action` | По коду r25: `MovieScreen` при запуске того же фильма, что уже играет (movie id из `info_tag`), вместо нового запуска возвращает `switch_osd_mode(true)` с логом «just switching to osd» (код r25)[^287]. Что делает оболочка — §6. Фабрика: `switch_osd_mode`. | r24, r25; вызов — код r25 | (код r24)[^288] | | `PLUGIN_UPDATE_OSD_ACTION_ID` = `plugin_update_osd` | `PluginUpdateOsdActionData`: `components`, `post_action` | SDK: свои картинки и тексты на OSD (SDK)[^289]; «Воспроизведение из плагина». | r24, r25 | (код r24, SDK)[^290] | | `PLUGIN_UPDATE_INFO_BLOCK_ACTION_ID` = `plugin_update_info_block` | `PluginUpdateInfoBlockActionData`: `text_above`, `text_color`, `text_halo`, `text_y_offset`, `post_action` | SDK: сообщение над информационным блоком (SDK)[^291], только в ТВ- и VOD-воспроизведении (SDK)[^292]. | r24, r25 | (код r24, SDK)[^293] | | `PLUGIN_UPDATE_EPG_ACTION_ID` = `plugin_update_epg` | `PluginUpdateEpgActionData`: `channel_id`, `clear`, `day_start_tm_sec`, `programs`, `ext_epg_enabled`, `post_action` | SDK: обновляет EPG в памяти плеера (SDK)[^294], только в ТВ-воспроизведении (SDK)[^295]. | r24, r25 | (код r24, SDK)[^296] | | `PLUGIN_TV_SELECT_CHANNEL_ACTION_ID` = `plugin_tv_select_channel` | `PluginTvSelectChannelActionData` (?): `group_id`, `channel_id`, `is_favorite` | не описано | r24, r25 | (код r24)[^297] | | `PLUGIN_UPDATE_TV_INFO_ACTION_ID` = `plugin_update_tv_info` | `PluginUpdateTvInfoActionData` (?): `channel_changes`, `post_action` | не описано | нет в r22; r24, r25 | (код)[^298] | | `UPDATE_TV_INFO_ACTION_ID` = `update_tv_info` | `UpdateTvInfoActionData` (?): `post_action` | Плагин dunemdb вызывает его из `do_play`, если константа определена, а `tv_info_updated` ещё нет (код)[^299]. | r24, r25 | (код r24)[^300] | | `DETECT_SERIES_ACTION_ID` = `detect_series` | `DetectSeriesActionData` (?): `base_path`, `rel_paths`, `result_path`, `post_action` | Плагин dunemdb читает результат `info_by_name` и проставляет сезон и серию (код)[^301]. | r24, r25 | (код r24)[^302] | | `DVB_COMMAND_ACTION_ID` = `dvb_command` | `DvbCommandActionData` (?): `name`, `params`, `callback_action` | не описано | r24, r25 | (код r24)[^303] | | `UPDATE_DVB_CHANNELS_ACTION_ID` = `update_dvb_channels` | `UpdateDvbChannelsActionData` (?): `post_action` | не описано | r24, r25 | (код r24)[^304] | **Вызов плагина, система, сеть, файлы** | Константа и строка | Данные: класс и ключи | Назначение | Где | Claim | |---|---|---|---|---| | `PLUGIN_HANDLE_USER_INPUT_ACTION_ID` = `plugin_handle_user_input` | `PluginHandleUserInputActionData`: `operation_timeout`, `show_dialog_delay`, `dialog_title` | Вызов операции `handle_user_input`; `params` действия приходят в `input_data` (устройство r25)[^305]. Тайм-аут: «Операции плагина, тайм-ауты и `php_server`». Фабрика: `handle_user_input`. | r24, r25; `device` (устройство r25)[^166] | (код r24)[^306] | | `COMPOSITE_ACTION_ID` = `composite` | `CompositeActionData`: `actions` | Фабрика заполняет `actions` (код r24)[^307]. Фабрика: `composite`. Из двух `plugin_handle_user_input` (один прогон на tv188b r25) выполнились `a_composite-1`, затем `a_composite-2`; обе записи post — с одинаковым временем 1793666163.336 и без `action_status` (устройство r25)[^308]. | r24, r25; `device` (устройство r25)[^308] | (код r24)[^309] | | `STATUS_ACTION_ID` = `status` | `StatusActionData`: `status` | SDK: просто возвращает заданный статус (SDK)[^310]. Фабрика: `status`. | r24, r25 | (код r24)[^311] | | `SLEEP_ACTION_ID` = `sleep` | `SleepActionData` (?): `delay_ms`, `post_action` | Запуск с `delay_ms=500` (один прогон на tv188b r25): `post_action` вызван в 03:36:07, начало шага — 03:36:06, в записанном продолжении нет `action_status` (устройство r25)[^14]; длительность паузы из этих отметок не следует. | r24, r25; `device` только продолжение | (код r24)[^312] | | `COND_ACTION_ID` = `cond` | `CondActionData`: `pattern`, `post_action` | Условие с `pattern`: §2.7. | r25; `device` с `is_file` (устройство r25)[^313] | (код r25)[^314] | | `RUN_BUILTIN_ACTION_ID` = `run_builtin` | `RunBuiltinActionData`: `builtin_action_id`, `params`, `post_action`, `error_action` | SDK: запуск встроенной функции (SDK)[^315], публичный список зависит от прошивки и пуст (SDK)[^316]. В манифестах r24 встречается (код r24)[^317]. Фабрика: `run_builtin`. | r24, r25 | (код r24)[^318] | | `RUN_DEFAULT_ACTION_ID` = `run_default` | `RunDefaultActionData`: `event`, `post_action` | Фабрика: `run_default`. В запросе 12 на tv188b r25 (один прогон) ENTER на первом пункте открытой папки дал ответ `run_default` с `event=key_info` и `post_action` с `tag=a_default` (устройство r25)[^319]; оболочка сразу записала «action D: not recognized kb_probe12->run_default()» (устройство r25)[^320], а `a_default` в сохранённых `handle_user_input(post)` не появился ни сразу, ни после BACK (устройство r25)[^321]. Причина не установлена; прогон запроса 11 — §6. | r24, r25; `device` — один прогон | (код r24)[^322] | | `PLUGIN_SYSTEM_ACTION_ID` = `plugin_system` | `PluginSystemActionData`: `run_string`, `post_action`; в r25: `handle_response` | Команда shell; на tv188b r25 относительный путь отсчитан от каталога плагина: §2.9. | r24, r25; `device` (устройство r25)[^323] | (код)[^324] | | `PLUGIN_RUN_NATIVE_CODE_ACTION_ID` = `plugin_run_native_code` | данных нет — по SDK (SDK)[^325] | Загружает `native_code.so` плагина (устройство r25)[^326]; подробности — (устройство r25)[^327]. | r24, r25; `device` (устройство r25)[^326] | (код r24)[^328] | | `FS_CTL_ACTION_ID` = `fs_ctl` | `FsCtlActionData`: `cmd`, `output_path`, `post_action` | Файловые команды: §2.6. | r25; `device` только `scandir` (устройство r25)[^117] | (код r25)[^329] | | `LOAD_AND_SCALE_IMAGE_ACTION_ID` = `load_and_scale_image` | `LoadAndScaleImageActionData`: `icon_url`, `local_path`, `scale_if_needed`, `icon_width`, `icon_height`, `post_action` | Скачать и уменьшить картинку: §2.7. Фабрика: `load_and_scale_image`. | r25; `device` при `scale_if_needed=false` (устройство r25)[^10] | (код r25)[^330] | | `WGET_ACTION_ID` = `wget` | `WgetActionData`: `id`, `url`, `post_data`, `curl_opts`, `target_path`, `target_cmd`, `result_key_prefix`, `post_action` | SDK: HTTP-запрос, статус и данные — в `post_action` (SDK)[^331]; из плагинов не рекомендуется (SDK)[^332]. Оболочка r25 им пользуется (код r25)[^333]. Фабрика: `wget`. | r24, r25 | (код r24)[^334] | | `UPDATE_IMAGES_ACTION_ID` = `update_images` | `UpdateImagesActionData` (?): `url_prefix`, `storage_dir_name`, `names`, `title`, `post_action` | не описано | r24, r25 | (код r24)[^335] | | `CHANGE_SETTINGS_ACTION_ID` = `change_settings` | `ChangeSettingsActionData`: `settings`, `reboot`, `restart_gui`, `post_action` | SDK: меняет настройки Dune парами «имя → значение» (SDK)[^336], в TV/VOD не действует (SDK)[^337]. На r25 `restart_gui=true` при `reboot=false` и пустых `settings` перезапускает приложение Dune, а не приставку (устройство r25)[^338]. Фабрика: `change_settings`. | r24, r25; `device` (устройство r25)[^339] | (код r24)[^340] | | `RESTART_ACTION_ID` = `restart` | `RestartActionData`: `reboot`, `factory_reset` | Фабрика заполняет `reboot` (код r24)[^341]. По коду r25: фабрики `shell_ext` и `bt_setup` передают только `reboot`, `android_apps` — `reboot` и `factory_reset`; `android_apps` выдаёт `restart(true)` после записи `AUTOSTART_ONCE_FILE`, а пункт `reset_settings` — `close_dialog_and_run(restart(false, true))` (код r25)[^342]. Фабрика: `restart`. | r24, r25; вызов — код r25 | (код r24)[^343] | | `SET_TIME_ZONE_ACTION_ID` = `set_time_zone` | `SetTimeZoneActionData` (?): `offset_sec`, `has_dst`, `olson_id`, `preferred_olson_ids`, `post_action` | не описано | r24, r25 | (код r24)[^344] | | `CONFIRM_LOCATION_ACTION_ID` = `confirm_location` | `ConfirmLocationActionData` (?): `post_action` | не описано | r24, r25 | (код r24)[^345] | | `WAIT_FOR_IP_ADDRESS_ACTION_ID` = `wait_for_ip_address` | `WaitForIpAddressActionData`: `timeout_sec`, `post_action` | SDK: ждёт IP-адрес со стандартным диалогом (SDK)[^346]. | r24, r25 | (код r24, SDK)[^347] | | `CHECK_SYSTEM_STORAGE_ACTION_ID` = `check_system_storage` | `CheckSystemStorageActionData`: `required_space`, `recommended_space`, `title`, `messages`, `post_action` | Фабрика принимает `title`, но в `data` его не пишет (код)[^348]. По коду r25 вызывающие (`setup_data_storage`, `setup_folder`, `setup_all_folders`) выдают `check_system_storage(0, 0, null, array(), …)` и в продолжении ветвятся по `$user_input->check_succeeded` (код r25)[^349]. Что проверяет оболочка — §6. Фабрика: `check_system_storage`. | r24, r25; вызов — код r25 | (код r24)[^350] | | `INIT_PERSISTFS_ACTION_ID` = `init_persistfs` | `InitPersistfsActionData` (?): `post_action` | не описано | r24, r25 | (код r24)[^351] | | `BT_COMMAND_ACTION_ID` = `bt_command` | `BtCommandActionData` (?): `name`, `params`, `callback_action` | По коду r25: `bt_setup` выдаёт действие с `name` `update_paired_devices_list`, `add_device`, `open_details`, `unpair_device`, `upgrade_device`, `setup_tv`; в `params` — ключи `bt_command_address`, `bt_command_fw_path`, `bt_command_fw_version`, `bt_command_force_reconnect` (код r25)[^352]. | r24, r25; вызов — код r25 | (код r24)[^353] | **Android-приложения и сервисы** | Константа и строка | Данные: класс и ключи | Назначение | Где | Claim | |---|---|---|---|---| | `LAUNCH_EXT_APP_ACTION_ID` = `launch_ext_app` | `LaunchExtAppActionData`: `cmd`, `ensure_playback_stopped`, `delay`, `package`, `version`, `msg_toast`, `params`, `error_action` | Запуск приложения; строку `am start …` разбирает само приложение, без `am` и `sh` (устройство r25)[^354]; при неудаче выполняет `error_action` (устройство r25)[^355]. Фабрика: `launch_ext_app`. | r24, r25; `device` (устройство r25)[^355] | (код r24)[^356] | | `WAIT_EXT_APP_START_ACTION_ID` = `wait_ext_app_start` | `WaitExtAppStartActionData`: `delay`, `package`, `error_action` | не описано Фабрика: `wait_ext_app_start`. | r24, r25 | (код r24)[^357] | | `START_SERVICE_ACTION_ID` = `start_service` | `StartServiceActionData` (?): `class_name`, `package_name`, `params`, `delay_ms`, `post_action` | не описано | r24, r25 | (код r24)[^358] | | `DOWNLOAD_AND_INSTALL_APK_ACTION_ID` = `download_and_install_apk` | `DownloadAndInstallApkActionData`: `caption`, `package`, `src`, `from_market`, `urls`, `indirect`, `intro_dialog_urls`, `username`, `password`, `post_action` | Установка APK; `install_from_market` строит то же действие с `from_market=true` (код r24)[^359]. Фабрика: `download_and_install_apk`, `install_from_market`. | r24, r25 | (код r24)[^360] | | `UNINSTALL_APK_ACTION_ID` = `uninstall_apk` | `UninstallApkActionData` (?): `package`, `src`, `post_action` | По коду r25: фабрика `uninstall_apk` плагина `android_apps` передаёт `package`, `src` (по умолчанию пустая строка) и `post_action`; `AppsScreen` выдаёт действие для установленного не системного приложения при `HD::is_limited_apk()` или непустом `src`; продолжение — тот же `user_input` с `uninstall_performed=1`, где для приложения с `src` читается `action_status` (код r25)[^361]. | r24, r25; вызов — код r25 | (код r24)[^362] | **Избранное, главный экран, история, коллекция, родительский контроль** | Константа и строка | Данные: класс и ключи | Назначение | Где | Claim | |---|---|---|---|---| | `ADD_TO_FAVORITES_ACTION_ID` = `add_to_favorites` | `AddToFavoritesActionData`: `media_url`, `caption`, `icon_url`, `icon_width`, `icon_height`, `badge_url`, `skip_interactions`, `post_action` | Добавить в избранное; в r25 `skip_interactions=true` пишется только при истинном аргументе (код r25)[^363], `icon_width`/`icon_height` — только когда оба больше 0 (код r25)[^364]. Фабрика: `add_to_favorites`. | r24, r25 | (код r24)[^365] | | `REMOVE_FROM_FAVORITES_ACTION_ID` = `remove_from_favorites` | `RemoveFromFavoritesActionData`: `name`, `post_action` | По коду r25: `MovieHelper::remove_favorite_movie` передаёт в `name` корневое имя из `Favorites::remove_movie($id)`, `BaseEntityScreen` — id сущности с продолжением `post_remove_from_favorites` (код r25)[^366]. Фабрика: `remove_from_favorites`. | r24, r25; вызов — код r25 | (код r24)[^367] | | `UPDATE_SPECIAL_FAVORITE_FOLDER_ACTION_ID` = `update_special_favorite_folder` | `UpdateSpecialFavoriteFolderActionData`: `name`, `delete`, `skip_interactions`, `post_action` | Спецпапки избранного: §2.7. Фабрика: `update_special_favorite_folder`. | r25 | (код r25)[^368] | | `EDIT_MAIN_SCREEN_ACTION_ID` = `edit_main_screen` | `EditMainScreenActionData` (?): `change_op`, `ids`, `caption`, `icon_url`, `post_action` | Плагин `android_apps` r25 при активном remote config и `restrict_apps_by_remote_config` передаёт `CHANGE_OP_DELETE_ANDROID_APPS_EXCEPT` (код r25)[^369]. | r24, r25 | (код r24)[^370] | | `UPDATE_WATCHED_MARKS_ACTION_ID` = `update_watched_marks` | `UpdateWatchedMarksActionData`: `item_ids`, `movie_ids`, `watched`, `post_action` | Фабрика при пустых `item_ids` и `movie_ids` сразу возвращает `post_action` (код r24)[^371]. По коду r25 иначе в `data` — `watched` и только непустые `item_ids`, `movie_ids`, `post_action`; `MovieHelper` выдаёт `update_watched_marks(null, array($movie_id), true, …)` — отметку фильма просмотренным (код r25)[^372]. Фабрика: `update_watched_marks`. | r24, r25; вызов — код r25 | (код r24)[^373] | | `CLEAR_WATCH_HISTORY_ACTION_ID` = `clear_watch_history` | `ClearWatchHistoryActionData`: `item_ids`, `post_action` | `clear_watch_history(null, …)` — пункт «Очистить всё» в «Недавнем» r25 (код r25)[^374]. Фабрика: `clear_watch_history`. | r24, r25 | (код r24)[^375] | | `APPLY_HASH_DIRTIES_ACTION_ID` = `apply_hash_dirties` | `ApplyHashDirtiesActionData`: `post_action` | Применить изменения hash-привязок: §2.7. Фабрика: `apply_hash_dirties`. | r25 | (код r25)[^376] | | `SYNC_MY_COLLECTION_ACTION_ID` = `sync_my_collection` | `SyncMyCollectionActionData`: `post_action` (в r24 ещё `mcf_id`) | В r25 ключа `mcf_id` нет (код r25)[^83]; фабрика r25 принимает только `post_action` (код r25)[^377]. Фабрика: `sync_my_collection`. | нет в r22; r24, r25 | (код)[^378] | | `EDIT_MOVIE_DATA_ACTION_ID` = `edit_movie_data` | `EditMovieDataActionData`: `movie_id`, `post_action` | По коду r25: `GuiCommon` по `control_id` `edit_movie_data` (пункт меню `navigator_popup_edit_movie_data`) выдаёт действие с продолжением `update_on_movie_change`, которое реагирует, только если `movie_data_changed` или `change_movie_data_status` > 0 (код r25)[^379]. Что открывает оболочка — §6. Фабрика: `edit_movie_data`. | нет в r22; r24, r25; вызов — код r25 | (код)[^380] | | `CHANGE_MOVIE_DATA_ACTION_ID` = `change_movie_data` | `ChangeMovieDataActionData`: `movie_ids_to_delete`, `post_action` | По коду r25: `CustomMoviesScreen` выдаёт действие после подтверждения очистки (весь список или `clear_element` — один фильм) с продолжением `update_on_movie_change` (код r25)[^381]. Поля ответа — §6. Фабрика: `change_movie_data`. | нет в r22; r24, r25; вызов — код r25 | (код)[^382] | | `EDIT_LIST_CONFIG_ACTION_ID` = `edit_list_config` | `EditListConfigActionData`: `config_id`, `title`, `all_items`, `checked_ids`, `groups`, `def_id`, `options`, `close_item_params`, `dialog_params`, `sel_id`, `post_action` | Фабрика r25 принимает обязательный `options` между `groups` и `sel_id` (код r25)[^383]. По коду r25 фабрика всегда кладёт в `data` `config_id`, `title`, `all_items`, `post_action`, а `checked_ids`, `groups`, `options`, `sel_id` — только если они заданы; `MovieFilterDialog` выдаёт действие для настройки списка (годы, жанры) с заголовком `configure_list_title` и продолжением `apply_edit_list`; по месту вызова — диалог выбора отмеченных пунктов списка (код r25)[^384]. Фабрика: `edit_list_config`. | r24, r25; вызов — код r25 | (код r24)[^385] | | `CHANGE_LIST_CONFIG_ACTION_ID` = `change_list_config` | `ChangeListConfigActionData` (?): `config_id`, `set_default`, `def_id`, `ids_to_check`, `ids_to_uncheck`, `ids_to_def`, `order`, `post_action` | Копия фабрики в GlobalTV всегда пишет `config_id` и `post_action`, а `set_default`, `def_id`, `ids_to_check`, `ids_to_uncheck` и `ids_to_def` — при истинном аргументе (код)[^386]. | r24, r25 | (код r24)[^387] | | `CREATE_NETWORK_FOLDER_ACTION_ID` = `create_network_folder` | `CreateNetworkFolderActionData`: `name`, `url`, `post_action` | В `get_add_to_collection_action` r24 непустой `nnf_url` создаёт сетевую папку (код r24)[^388]. Фабрика: `create_network_folder`. | нет в r22; r24, r25 | (код)[^389] | | `WAKE_NETWORK_FOLDER_ACTION_ID` = `wake_network_folder` | `WakeNetworkFolderActionData`: `folder_id`, `post_action` | `play_local_single_file` r25 вызывает его для сетевой папки без `wol_checked`, с повтором входного действия и `wol_checked=1` (код r25)[^390]. Фабрика: `wake_network_folder`. | нет в r22; r24, r25 | (код)[^391] | | `CUSTOM_IGNORE_UPDATE_ACTION_ID` = `custom_ignore_update` | `CustomIgnoreUpdateActionData`: `add`, `is_dir`, `quids`, `post_action` | Фабрика пишет `is_dir` строковым ключом (код r24)[^392]. По коду r25 фабрика передаёт `add` (по умолчанию `true`), `is_dir`, `quids` и `post_action`, а все три вызова передают `add=false` (очистка записи исключённых файлов, папка медиатеки) со списком `quid` вида «источник/путь» (код r25)[^393]. Фабрика: `custom_ignore_update`. | нет в r22; r24, r25; вызов — код r25 | (код)[^394] | | `INVALIDATE_FILES_ASSOCIATIONS_ACTION_ID` = `invalidate_files_associations` | `InvalidateFilesAssociationsActionData`: `all`, `hashes`, `paths`, `folder_url`, `base_dir_path`, `base_cache_dpath`, `post_action` | По коду r25: фабрика передаёт `hashes`, `paths`, `folder_url`, `base_dir_path`, `base_cache_dpath`, `post_action`, а ключ `all` не передаёт; `MainEntryHandler` после удаления файлов выдаёт действие с `paths` удалённых файлов и `folder_url` папки (при `folder_id != -1`), затем `reread_all_epfs(true)` (код r25)[^395]. Фабрика: `invalidate_files_associations`. | r24, r25; вызов — код r25 | (код r24)[^396] | | `CHECK_RESTRICTED_ACTION_ID` = `check_restricted` | `CheckRestrictedActionData`: `id`, `post_action` | `run_tv_app` r24 возвращает его для `plugin:<имя>` и `android_app:<пакет>`, пока не установлен `pcontrol_checked` (код r24)[^397]. Фабрика: `check_restricted`. | r24, r25 | (код r24)[^398] | | `SET_RESTRICTED_ACTION_ID` = `set_restricted` | `SetRestrictedActionData` (?): `id`, `restricted`, `post_action` | По коду r25: фабрика передаёт `id`, `restricted`, `post_action`; `AndroidApps` переключает защиту пункта меню приложения — `set_restricted($id, !$now_restricted, …)`, продолжение `finalize_toggle_password` перечитывает список ограниченных (`reload_restricted`); по месту вызова — родительский контроль пункта меню (код r25)[^399]. | r24, r25; вызов — код r25 | (код r24)[^400] | | `CHANGE_PARENTAL_CODE_ACTION_ID` = `change_parental_code` | `ChangeParentalCodeActionData` (?): `post_action` | Смена родительского кода в GlobalTV (код)[^401]. | r24, r25 | (код r24)[^402] | ### 3.5. Структуры данных (r24, r25) Классы без суффикса `ActionData`. Где полный перечень ключей есть в другой главе, здесь только ссылка и число. «SDK:» — как в §3.4. **Вход и выход операций** | Класс | Назначение | Ключи | Где | Claim | |---|---|---|---|---| | `PluginOutputData` | Ответ плагина оболочке: §3.2. | `has_data`, `data_type`, `data`, `plugin_cookies`, `is_error`, `error_action` | r24, r25 | (код r24)[^174] | | `PluginFolderViewInputData` | Вход `get_folder_view`: `sel_state` при наличии метода `_v2` выбирает вызов `_v2` (код r24)[^60]. | `media_url`, `sel_state` | r24, r25 | (код r24)[^403] | | `PluginFolderRowsInputData` | Вход `get_folder_rows`: §2.5. | `media_url`, `row_ids` | r25 | (код r25)[^404] | | `PluginFolderRows` | Результат `get_folder_rows`: §2.5. | `rows` | r25 | (код r25)[^405] | | `PluginVodGetStreamInfoInputData` | На r25 при ленивой серии с feature `vod_get_stream_info` `get_vod_stream_info` вызывается с `playback_url` (устройство r25)[^172]. | `playback_url` | нет в r22; r24, r25 | (код)[^406] | | `PluginStreamInfo` | Результат `get_vod_stream_info`: читается `url` и список `markers` (код r24)[^407]. | `url`, `markers` | нет в r22; r24, r25 | (код)[^408] | | `StreamMarker` | Маркер потока; на r25 intro-маркер 3–20 с из `PluginVodSeriesInfo::markers` показывает на OSD кнопку «Пропустить заставку» (устройство r25)[^409]. Типы — §3.3. | `type`, `from`, `to`, `duration` | нет в r22; r24, r25 | (код)[^410] | **Общие структуры** | Класс | Назначение | Ключи | Где | Claim | |---|---|---|---|---| | `GuiAction` | SDK: тип в `handler_string_id` и параметры в `data` (SDK)[^35]; §1.2. | `handler_string_id`, `data`, `caption`, `plugin_name`, `params`, `flags` | r24, r25 | (код r24)[^34] | | `GuiTimerDef` | Таймер. Фабрика пишет `reset_on_keypress`, `clear_on_keypress` только при истинном аргументе (код r24)[^411]; SDK: в диалоге таймер срабатывает один раз (SDK)[^412]. | `delay_ms`, `reset_on_keypress`, `clear_on_keypress`, `num_repeats`, `early_start` | r24, r25 | (код r24)[^413] | | `GuiMenuItemDef` | Пункт меню: «Ввод и диалоги». | `is_separator`, `id`, `caption`, `icon_url`, `marked`, `action`, `is_shown_action` | r24, r25 | (код r24)[^414] | | `GuiItem` | Фабрика `add_gui_item` (код r24)[^415]; в r25 пишет `params` при истинном аргументе (код r25)[^416]. | `id`, `caption`, `icon_url`, `group_id`, `params` | r24, r25 | (код r24)[^417] | | `GuiExtraChoice` | Фабрика `add_extra_choice` дописывает `caption` в массив (код r24)[^418]. | `caption` | r24, r25 | (код r24)[^419] | | `PluginPathElement` | Фабрика `add_path_element` дописывает элемент в массив (код r24)[^420]; `plugin_replace_path` читает `elements` (код r24)[^421]. | `media_url`, `id`, `caption` | r24, r25 | (код r24)[^422] | | `PluginRef` | не описано | `name`, `ep_media_url` | r24, r25 | (код r24)[^423] | | `PluginArchiveDef` | SDK: архив картинок папки, ссылки `plugin_archive:///` (SDK)[^424]. Десериализуется оболочкой r24 с `total_size` как long (код r24)[^425]. | `id`, `urls_with_keys`, `all_tgz_url`, `total_size` | r24, r25 | (код r24)[^426] | | `FileMovieInfo` | не описано | `movie_id`, `title`, `icon_url`, `rate_imdb`, `rate_content`, `series_type`, `s`, `e` | r24, r25 | (код r24)[^427] | | `FileChooserFilter` | Фильтр `choose_file`: §2.8. | `file_type_dir`, `file_extensions`, `check_writable` | нет в r22; r24, r25 | (код)[^428] | | `FileChooserUiParams` | Интерфейс `choose_file`: §2.8. | `with_favorite_folders`, `details_width`, `dialog_title`, `with_network_folders`, `with_network_browser`, `new_folder_default_name` | нет в r22; r24, r25 | (код)[^429] | | `FsCmdDef` | Команда `fs_ctl`: `kind` и `specific_def`, §2.6. | `kind`, `specific_def` | r25 | (код r25)[^430] | | `FsResolveUrlDef` | Параметры `resolve_url`: §2.6. | `url`, `try_mount_if_needed` | r25 | (код r25)[^431] | | `FsStatDef` | Параметры `stat`: §2.6. | `path` | r25 | (код r25)[^432] | | `FsScandirDef` | Параметры `scandir`: §2.6. | `path`, `with_stat`, `max_items_count` | r25 | (код r25)[^433] | | `FsGetFileDef` | Параметры `get_file`: §2.6. | `path`, `target_path`, `skip`, `max_size`, `chunk_size` | r25 | (код r25)[^434] | **Папки: виды, элементы, карточка** | Класс | Назначение | Ключи | Где | Claim | |---|---|---|---|---| | `PluginFolderView` | «Экраны и папки плагина». В r25 добавлен `type_mask` (код r25)[^435]. | `view_kind`, `data`, `multiple_views_supported`, `archive`, `folder_type`, `params`, `type_mask` | r24, r25 | (код)[^436] | | `PluginFolderViewParams` | SDK: параметры control- и movie-папок (SDK)[^437]. | `paint_path_box`, `paint_path_box_background`, `paint_content_box_background`, `background_url`, `popup_dialogs_enabled` | r24, r25 | (код r24)[^438] | | `PluginRegularFolderView` | «Экраны и папки плагина» | 11: в главе по ссылке | r24, r25 | (код r24)[^439] | | `PluginRegularFolderRange` | «Экраны и папки плагина» | `total`, `more_items_available`, `from_ndx`, `count`, `items` | r24, r25 | (код r24)[^440] | | `PluginRegularFolderItem` | «Экраны и папки плагина» | `media_url`, `caption`, `starred`, `locked`, `view_item_params`, `plugin_ref` | r24, r25 | (код r24)[^441] | | `ViewParams` | «Экраны и папки плагина» | 91: в главе по ссылке | r24, r25 | (код r24)[^442] | | `ViewItemParams` | «Экраны и папки плагина» | 54: в главе по ссылке | r24, r25 | (код r24)[^443] | | `PluginControlsFolderView` | «Экраны и папки плагина». | `defs`, `actions`, `timer`, `initial_sel_ndx`, `params` | r24, r25 | (код r24)[^444] | | `PluginMovieFolderView` | «Экраны и папки плагина» | `movie`, `left_button_caption`, `left_button_action`, `has_right_button`, `right_button_caption`, `right_button_action`, `has_multiple_series`, `series_media_url`, `poster_valign`, `params` | r24, r25 | (код r24)[^445] | | `PluginMovie` | «Экраны и папки плагина» | `name`, `name_original`, `description`, `poster_url`, `length_min`, `year`, `directors_str`, `scenarios_str`, `actors_str`, `genres_str`, `rate_imdb`, `rate_kinopoisk`, `rate_mpaa`, `country`, `budget`, `details`, `rate_details` | r24, r25 | (код r24)[^446] | **Rows** | Класс | Назначение | Ключи | Где | Claim | |---|---|---|---|---| | `PluginRowsFolderView` | «Экраны и папки плагина» | 4: в главе по ссылке | r24, r25 | (код r24)[^447] | | `PluginRowsPane` | «Экраны и папки плагина». В r25 добавлен `row_dup_map` (код r25)[^448]. | 27: в главе по ссылке | r24, r25 | (код)[^449] | | `PluginRow` | «Экраны и папки плагина». В r25 `data` бывает и строкой (код r25)[^450]; формат по типу строки — §2.5. | 12: в главе по ссылке | r24, r25 | (код r24)[^451] | | `PluginRegularRow` | «Экраны и папки плагина» | 14: в главе по ссылке | r24, r25 | (код r24)[^452] | | `PluginRegularItem` | «Экраны и папки плагина» | 6: в главе по ссылке | r24, r25 | (код r24)[^453] | | `PluginRegularItemParams` | «Экраны и папки плагина» | 11: в главе по ссылке | r24, r25 | (код r24)[^454] | | `PluginRegularItemVariableParams` | «Экраны и папки плагина» | 12: в главе по ссылке | r24, r25 | (код r24)[^455] | | `PluginRegularSticker` | «Экраны и папки плагина» | 4: в главе по ссылке | r24, r25 | (код r24)[^456] | | `PluginTitleRow` | «Экраны и папки плагина» | 10: в главе по ссылке | r24, r25 | (код r24)[^457] | | `PluginGCompsRow` | «Экраны и папки плагина» | 4: в главе по ссылке | r24, r25 | (код r24)[^458] | | `PluginRowsHeader` | «Экраны и папки плагина» | 3: в главе по ссылке | r24, r25 | (код r24)[^459] | | `PluginRowsInfo` | «Экраны и папки плагина» | 8: в главе по ссылке | r24, r25 | (код r24)[^460] | | `PluginMargins` | Отступы: фабрика `RowsFactory::margins` (код r24)[^461]. | `left`, `top`, `right`, `bottom` | r24, r25 | (код r24)[^462] | **GComponents** | Класс | Назначение | Ключи | Где | Claim | |---|---|---|---|---| | `PluginGCompsFolderView` | Данные папки вида `PLUGIN_FOLDER_VIEW_GCOMPS` (код r24)[^463]. | `window_def`, `sel_state`, `actions`, `timer` | r24, r25 | (код r24)[^464] | | `GCompWindowDef` | Окно; фабрика `get_window_def` (код r24)[^465]. | `background_color`, `background_url`, `background_fit_def`, `async_loading_background`, `not_loaded_background_url`, `playback_bg_alpha`, `small_state_text`, `opaque_background`, `comp_defs`, `focus`, `bg_def`, `ui_state` | r24, r25 | (код r24)[^466] | | `GComponentDef` | Компонент: `kind` и `specific_def` (код r24)[^467]. | `id`, `geom_def`, `margins_def`, `focusable_def`, `focused_variant_def`, `extra_variant_defs`, `options`, `kind`, `specific_def` | r24, r25 | (код r24)[^468] | | `ChangeGCompDef` | Изменение компонента для `change_gcomps`: фабрика `get_change_def` (код r24)[^469]. | `id`, `remove`, `geom_def`, `props`, `view_position`, `custom_props`, `selected`, `children`, `children_merge_mode`, `children_insert_after_id`, `transition` | r24, r25 | (код r24)[^470] | | `ChangeGCompWindowDef` | Изменение окна: фабрика `change_gcomp_window` (код r24)[^471]. | `background_color`, `background_url` | r24, r25 | (код r24)[^472] | | `GCompGeometryDef` | не описано | `role`, `w`, `h`, `opts`, `align_def` | r24, r25 | (код r24)[^473] | | `GCompAlignDef` | не описано | `x`, `y`, `use_base_width`, `use_base_height`, `halign`, `valign`, `base_halign`, `base_valign`, `base_to_prev`, `base_id` | r24, r25 | (код r24)[^474] | | `GCompMarginsDef` | Копия `GCompMargins::all` в GlobalTV пишет все четыре (код)[^475]. | `left`, `top`, `right`, `bottom` | r24, r25 | (код r24)[^476] | | `GCompFocusDef` | Фокус: `RowsFactory::focus`, `type=GCOMP_FOCUS_SYSTEM`, `type2=GCOMP_FOCUS_NONE` (код r24)[^477]. | `type`, `type2` | r24, r25 | (код r24)[^478] | | `GCompFocusableDef` | Фабрика `set_focusable` (код r24)[^479]. | `sel_margins`, `background_color`, `background_url` | r24, r25 | (код r24)[^480] | | `GCompVariantDef` | Варианты вида: `set_focus_var` (код r24)[^481], `add_extra_var` (код r24)[^482]. | `ref_id`, `geom_def`, `props`, `transition_modifier` | r24, r25 | (код r24)[^483] | | `GCompUiStateDef` | Фабрика `get_gcomp_ui_state_def` (код r24)[^484]. | `title`, `items`, `bg_url`, `poster_url`, `view_params` | r24, r25 | (код r24)[^485] | | `GCompViewPositionDef` | Фабрика `get_view_position_def` (код r24)[^486]. | `id`, `x`, `y`, `freedom_factor`, `gravity`, `end_min_offset`, `outside_id` | r24, r25 | (код r24)[^487] | | `GCompItemDef` | Элементы `get_comp_item_def`, `get_label_item_def`, `get_button_item_def` (код r24)[^488]. | `type`, `id`, `left_caption`, `caption`, `icon_url` | r24, r25 | (код r24)[^489] | | `GCompLabelDef` | `label`: (код r24)[^467]. | `text`, `font_size`, `text_color`, `max_num_lines`, `draw_halo` | r24, r25 | (код r24)[^490] | | `GCompTtfLabelDef` | `ttf_label`: (код r24)[^491]. | `text`, `font_size`, `font_face`, `text_color`, `max_num_lines`, `line_spacing`, `halign`, `valign`, `base_font_size`, `min_font_size`, `fit` | r24, r25 | (код r24)[^492] | | `GCompRectDef` | `rect`: (код r24)[^493]. | `color` | r24, r25 | (код r24)[^494] | | `GCompImageDef` | `image`: (код r24)[^495]. | `url`, `alpha`, `mix_alpha`, `mix_color`, `keep_aspect_ratio`, `upscale_enabled`, `not_loaded_url`, `load_failed_url`, `low_quality_url` | r24, r25 | (код r24)[^496] | | `GCompCutImageDef` | не описано | `url`, `alpha` | r24, r25 | (код r24)[^497] | | `ImageFitDef` | Фабрика `get_image_fit_def` (код r24)[^498]. | `base_halign_ratio`, `base_valign_ratio` | r24, r25 | (код r24)[^499] | | `GCompButtonDef` | `button`: (код r24)[^500]. | `caption`, `caption_centered`, `selected` | r24, r25 | (код r24)[^501] | | `GCompTextFieldDef` | `text_field`: (код r24)[^502]. | `def`, `params` | r24, r25 | (код r24)[^503] | | `GCompPanelDef` | `panel`: (код r24)[^504]. | `children`, `alpha`, `mix_alpha`, `mix_color`, `prepaint_params` | r24, r25 | (код r24)[^505] | | `GCompPrepaintPaneDef` | `prepaint_pane`: (код r24)[^506]. | `panel`, `native_width`, `native_height` | r24, r25 | (код r24)[^507] | | `GCompPrepaintParams` | Фабрика `ppp` (код r24)[^508]. | `width`, `height` | r24, r25 | (код r24)[^509] | | `GCompScrollPaneDef` | `scroll_pane`: (код r24)[^510]. | `panel`, `view_position`, `view_use_base_width`, `view_use_base_height`, `view_width`, `view_height` | r24, r25 | (код r24)[^511] | | `GCompScrollbarDef` | `scrollbar`: (код r24)[^512]. | `scroll_pane_id`, `vertical` | r24, r25 | (код r24)[^513] | **Контролы** | Класс | Назначение | Ключи | Где | Claim | |---|---|---|---|---| | `GuiControlDef` | «Контролы диалогов и папок» | 6: в главе по ссылке | r24, r25 | (код r24)[^514] | | `GuiLabelDef` | «Контролы диалогов и папок» | 1: в главе по ссылке | r24, r25 | (код r24)[^515] | | `GuiButtonDef` | «Контролы диалогов и папок» | 3: в главе по ссылке | r24, r25 | (код r24)[^516] | | `GuiComboboxDef` | «Контролы диалогов и папок» | 6: в главе по ссылке | r24, r25 | (код r24)[^517] | | `GuiTextFieldDef` | «Контролы диалогов и папок» | 9: в главе по ссылке | r24, r25 | (код r24)[^518] | | `GuiVGapDef` | «Контролы диалогов и папок» | 1: в главе по ссылке | r24, r25 | (код r24)[^519] | | `GuiProgressBarDef` | Фабрика `add_progress_bar` (код r24)[^520]. | `progress`, `width` | r24, r25 | (код r24)[^521] | **ТВ, VOD и OSD** | Класс | Назначение | Ключи | Где | Claim | |---|---|---|---|---| | `PluginTvInfo` | «Воспроизведение из плагина» | `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` | r24, r25 | (код r24)[^522] | | `PluginTvChannel` | «Воспроизведение из плагина» | `id`, `caption`, `extra_caption`, `group_ids`, `icon_url`, `number`, `have_archive`, `is_protected`, `recording_enabled`, `ext_epg_enabled`, `vod_archive_enabled`, `start_over_enabled`, `trick_play_enabled`, `buffering_ms`, `timeshift_hours`, `epg_mode`, `epg_normal_refresh_sec`, `epg_fast_refresh_sec`, `epg_fast_refresh_timeout`, `past_epg_days`, `future_epg_days`, `ext_epg_id`, `ext_epg_icon_url`, `epg_icon_width`, `epg_icon_height`, `epg_icon_x_offset`, `epg_icon_y_offset`, `epg_icon_hide_without_archive`, `use_program_have_archive_flags`, `archive_past_sec`, `archive_delay_sec`, `playback_url_is_stream_url` | r24, r25 | (код r24)[^523] | | `PluginTvGroup` | «Воспроизведение из плагина» | `id`, `caption`, `icon_url`, `channel_ids` | r24, r25 | (код r24)[^524] | | `PluginTvEpgProgram` | Элемент результата `get_day_epg` (код r24)[^525]. | `start_tm_sec`, `end_tm_sec`, `name`, `description`, `have_archive`, `flags`, `icon_url`, `ext_id` | r24, r25 | (код r24)[^526] | | `PluginTvChannelChange` | В оболочке r24 есть диагностики чтения `id`, `icon_url` (код r24)[^527]. | `id`, `icon_url` | нет в r22; r24, r25 | (код)[^528] | | `PluginVodInfo` | «Воспроизведение из плагина» | `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` | r24, r25 | (код r24)[^529] | | `PluginVodSeriesInfo` | «Воспроизведение из плагина» | `name`, `playback_url`, `playback_url_is_stream_url`, `content_id`, `recent_uid`, `mdb_info`, `markers` | r24, r25 | (код r24)[^530] | | `PluginOsdComponent` | «Воспроизведение из плагина» | `x`, `y`, `image_url`, `image_width`, `image_height`, `text`, `text_font_size`, `text_color`, `text_halo` | r24, r25 | (код r24)[^531] | ### 3.6. Библиотека `dunelib`: `HD`, `ConfigUtils`, `Expr`, `DuneLanguages`, `InstalledPlugins` (r24, r25) Файлы `dunelib` подключают друг друга через `require_once 'dunelib/…'` (код r24)[^532]. Как плагины пользуются HTTP-методами `HD`, — в «Приёмы разработки плагинов Dune HD». | Метод или набор | Что делает | Где | Claim | |---|---|---|---| | `HD` (перечень) | класс-утилита со статическими методами и `DuneCurlException` с `errno`, `error`, `http_code` | r24 | (код r24)[^533] | | `HD` (константы) | `INT_MIN`, `INT_MAX`, `NBSP`, `DUNE_AUTH_PATH`, `INTERNET_STATUS_PATH`, `FORCE_CHECK_INTERNET_ON_ERROR_PATH` | r24 | (код r24)[^534] | | `HD::init`, `http_init` | `init($def_curl_timeout=20)` переустанавливает общий тайм-аут и вызывает `http_init`, который собирает User-Agent из `/tmp/sysinfo.txt` | r24 | (код r24)[^535] | | `HD::http_get_document` | ошибка curl и любой код, кроме 200, — `DuneCurlException`; TLS по умолчанию без проверки — BUG-003; лог отключает `$silent=true` | r24 | (код r24)[^536] | | `HD::http_get_document` (r25) | лог ` http <метод>: ` и ` http DATA: …`, сообщения об ошибках в нижнем регистре | r25 | (код r25)[^537] | | `HD::http_post_document`, `http_request_document` | POST через `CURLOPT_POSTFIELDS`; `request` выбирает POST при `$post_data` | r24 | (код r24)[^538] | | `HD::encode_user_data`, `decode_user_data` | упаковка в `media_url` как `\|\|` | r24 | (код r24)[^539] | | `HD::create_regular_folder_range` | массив с ключами `PluginRegularFolderRange`, режет `items` по `total` | r24 | (код r24)[^540] | | `HD::write_to_file_using_tmp`, `…_if_changed` | атомарная запись через `.tmp` и rename; второй возвращает 0, 1 или -1 | r24 | (код r24)[^541] | | `HD::parse_props`, `read_props_file`, `encode_props`, `parse_xml_document` | `key=value`, запись `key = value`; XML — `Exception('Illegal XML document')` | r24 | (код r24)[^542] | | `HD::get_internet_status`, `append_dune_auth`, `get_mac_addr`, `get_product_id`, `is_custom_fw` | чтение сервисных файлов | r24 | (код r24)[^543] | | `HD::is_android` | всегда `true` | r24 | (код r24)[^544] | | `HD::is_apk`, `is_fw_apk`, `get_apk_package_name`, `get_fs_prefix`, `with_epfs`, `is_whale_tv`, `is_dual_system` | переменные окружения, каталог и флаги прошивки | r24 | (код r24)[^545] | | `HD::enable_caching_for_image_url`, `localtime_TZ`, `get_item` | `dune_image_cache=1` для URL на `http`/`cached_image`; `date` через `exec`; заглушка `false` | r24 | (код r24)[^546] | | `HD::ensure_empty_file`, `log_elapsed`, `read_int`, `read_string` | новые в r25 | r25 | (код r25)[^51] | | `ConfigUtils::get_config`, `load_config` | `/config/settings.properties` с кэшем до смены mtime, только ключи из умолчаний | r24 | (код r24)[^547] | | `ConfigUtils::get_location_info` | `/tmp/location_info.properties`, затем `/config/…` | r24 | (код r24)[^548] | | `ConfigUtils::load_plugin_cookies` | `/config/_plugin_cookies.properties` | r24 | (код r24)[^549] | | `ConfigUtils::load_firmware_features` | флаги из `/tmp/firmware_features.txt` и `/tmp/ro_features.txt`; в r25 убирает `downloads` при `/tmp/flm.txt` | r24, r25 | (код)[^550] | | `ConfigUtils::load_product_and_fw` | `/tmp/run/versions.txt`; `platform_kind_group` — `8Nxx` для `platform_kind` вида `8…`, иначе сам `platform_kind` | r24 | (код r24)[^551] | | `Expr::make`, `evaluate` | условные выражения по настройкам, местоположению, флагам и версиям | r24 | (код r24)[^552] | | Операторы `Expr` | `or`, `and`, `not`, `country`, `language`, `product`, `firmware_feature`, `firmware_version`, `fwv_*` и другие | r24 | (код r24)[^553] | | `Expr` (значения) | список через запятую; `=~`, `!~`, `i=~`, `i!~` — регулярные выражения; иначе `strcasecmp` | r24 | (код r24)[^554] | | `Expr::add_user_op`, `set_user_data` | свой оператор через `call_user_func` | r24 | (код r24)[^555] | | `DuneLanguages::get_code_by_id`, `get_en_caption_by_code`, `get_native_caption_by_code` | по таблице `$VALUES`, иначе `null` | r24 | (код r24)[^556] | | `DuneLanguages::static_init` | заполняет таблицу (код r24)[^557]; сам файл его не вызывает, встроенные плагины вызывают явно (код r24)[^558] | r24 | (код r24)[^559] | | `InstalledPlugins::get_by_name`, `reload`, `ensure_loaded` | `/tmp/run/installed_plugins.xml` с кэшем до смены mtime | r25 | (код r25)[^52] | | `DlState` | файловый протокол загрузок: «Загрузки и TorrServer для плагина» | r25 | (код r25)[^560] | ### 3.7. `bootstrap.php` и `dune_config.php` (r24) | Имя | Что делает | Claim | |---|---|---| | `hd_print($str)` | `echo` с суффиксом `$HD_NEW_LINE`; при `$HD_OB_PREFIX` — префикс и `ob_flush()` | (код r24)[^561] | | `hd_error_handler`, `hd_shutdown_handler` | формат `[файл:строка] [E_ТИП] сообщение` | (код r24)[^562] | | `hd_silence_warnings`, `hd_restore_warnings` | выключить и вернуть вывод ошибок | (код r24)[^563] | | `date.timezone` | из `date_default_timezone_get()`, обход проблемы PHP с 5.3.0 | (код r24)[^564] | | `set_time_limit(0)` | снимает лимит времени выполнения | (код r24)[^565] | | `FEW_BUTTONS_REMOTE_TYPE_NONE=0`, `_OVAL=1`, `_SMALL=2`, `_ARROWS=3` | типы пульта | (код r24)[^27] | | `dune_config_get_few_buttons_remote_type` | `DuneSystem::$properties['few_buttons_remote_type']` | (код r24)[^566] | | `dune_config_with_color_buttons`, `dune_config_show_pop_up_icon_only` | `with_color_buttons` — `false` для SMALL и ARROWS, иначе `true`; `show_pop_up_icon_only` — `true` для OVAL, SMALL, ARROWS, иначе `false` | (код r24)[^567] | Как учитывать тип пульта — «Ввод и диалоги». ## 4. Как это делают плагины Имена API плагин может брать из `dune_api.php` прошивки, не определяя их в пакете: так делает screenshoter (код r24)[^1]. Фабрики `ActionFactory`, `ControlFactory` `shell_ext` держит в своём `lib/` (код r24)[^4], а GlobalTV носит свои `ActionFactory`, `ControlFactory` и `GCompsFactory` (код)[^5] — как копии расходятся с прошивочной, см. «Ввод и диалоги». Так, копия `edit_list_config` GlobalTV принимает `options` и `close_item_params`, которых не принимала фабрика r24 (код r24)[^568], её `update_rows_info` принимает `folder_key` и `item_id` (код r24)[^569], а `show_error` пишет поля через проверку `defined` (код r24)[^570]. Проверка возможностей — §2.3. Каталог приёмов — «Приёмы разработки плагинов Dune HD». ## 5. Расхождения | Что | Одна сторона | Другая сторона | Claims | |---|---|---|---| | Тип результата `change_tv_favorites` | SDK: в объявлении интерфейса `void` (SDK)[^571], в описании операции — `GuiAction` (SDK)[^572] | код r24: `GuiAction` | (код r24, SDK)[^573] | | Данные `plugin_handle_user_input` | SDK: данных нет | r24: `operation_timeout`, `show_dialog_delay`, `dialog_title`; `device` r25: `operation_timeout` действует | (устройство r25, код r24, SDK)[^574] | | Поля `PluginControlsFolderView` | SDK: `defs`, `initial_sel_ndx`, `params` | r24: ещё `actions`, `timer` | (код r24, SDK)[^575] | | Имя `change_behaviour` | SDK-история версий: `change_behavior` | код r24: `change_behaviour` | (код r24, SDK)[^576] | | `ActionFactory::open_folder` | в `shell_ext` через `open_folder_ext` строит `plugin_open_folder` | `open_general_folder` плагина polsky-tv строит `OPEN_FOLDER_ACTION_ID`, это другое действие | (код)[^577] | | Параметр `title` в `check_system_storage` | ключ объявлен в классе | фабрика r24 принимает `title`, но не пишет его в `data` | (код r24)[^578] | | `skip_interactions` в `update_special_favorite_folder` | ключ объявлен в классе | фабрика r25 его не передаёт | (код r25)[^579] | | `handle_response` в `plugin_system` | ключ объявлен в классе r25 | JSON-десериализация r25 его не читает | (код r25)[^580] | | Класс в сообщении о `vod_info` | строка лога называет `PluginTvPlayActionData` | ключ `vod_info` объявлен в `PluginVodPlayActionData` | (код r24)[^581] | | Имя класса `PluginUpdateFolderActionData` | SDK: `PluginUpdateFolderAction` (без суффикса `ActionData`), поля `range`, `need_refresh`, `sel_ndx` | код r24: класс `PluginUpdateFolderActionData` с теми же тремя ключами | (код r24, SDK)[^582] | | `restart_gui` в `change_settings` | SDK: описание `restart_gui` дословно как у `reboot` — «whether to reboot STB immediately» | на tv188b r25 `restart_gui=true`, `reboot=false` и пустые `settings` перезапускают приложение Dune, а не приставку | (устройство r25, SDK)[^583] | ## 6. Не проверено Здесь — выводы (`inference`), `disputed` и то, что прогон на устройстве не установил; выводы и `disputed` в основном тексте не используются. Проверка каждого — в поле `check` claim. | Вывод | Claim | |---|---| | Id типов SDK соответствуют значениям `*_ACTION_ID` по сходству имён: для пяти пар строка принята на устройстве, для остальных 27 — вывод. Пометка «(?)» в §3.4 — то же, для пар вне списка SDK | (код r24, вывод r24)[^584] | | `GuiAction` разбирает `data` по типу из `handler_string_id` | (вывод r24)[^585] | | `plugin_handle_user_input` читает `PluginHandleUserInputActionData` | (вывод r24)[^586] | | XML-конструктор `plugin_system` проверяет `data/run_string` | (вывод r24)[^587] | | Индексы 0–7 в разборе `data` идут в порядке `PluginOutputDataType` | (вывод r24)[^588] | | Плагин вызывается выражением `DunePluginFw::$instance->call_plugin(...)`; вызов собирается как PHP-код `$in = <<_plugin_cookies.properties` — постоянное хранилище `$plugin_cookies` | (вывод r24)[^592] | | Без `DuneLanguages::static_init()` геттеры дают `null`, и `lang_code` в `ConfigUtils` тоже | (вывод r24)[^593] | | `ActionFactory::show_error`: состав полей и умолчания (`disputed`) | (код r24)[^594] | | `fs_ctl` нельзя задать в XML, только в JSON | (вывод r25)[^595] | | Команды `fs_ctl`: `resolve_url` с монтированием, `stat`, `get_file`; у `scandir` — `with_stat` и `max_items_count`; передача результата, кроме `scandir` с `output_path` (он наблюдался, §2.6) | (вывод r25)[^596] | | Файл `output_path` при ошибке `get_file` — такой же невалидный JSON `{"input":{...},{"error":{...}}}`, как у `scandir` в §2.6 | (вывод r25)[^597] | | Сбой записи в `output_path` даёт `fs_ctl_write_output_failed=1` при `action_status` по статусу команды: так в коде (§2.6), в прогоне §2.6 этот сбой не моделировался | (код r25)[^116] | | `cond` своим `pattern` задаёт видимость точки входа `downloads` (вычисление `is_file` с `post_action` — §2.7); `ff(downloads)` проверяет `firmware_feature`; `is_plugin_file` проверяет файл в установленном плагине | (вывод r25)[^598] | | `update_special_favorite_folder` возвращает `action_status`; шкала не установлена | (вывод r25)[^599] | | `apply_hash_dirties` заставляет оболочку обработать `HashDirties`; формат результата и очистка не установлены | (вывод r25)[^600] | | Строка `row_dup`: поиск в `row_dup_map` по `dup_id`; `PLUGIN_ROW_OPT_LOADING` — подгрузка через `get_folder_rows`; `PLUGIN_ROW_OPT_OPTIMIZE_INVISIBLE` — оптимизация невидимых строк (что прочитано в коде — §2.5) | (вывод r25)[^601] | | Пустой или неполный ответ `get_folder_rows` допускает повторный запрос прежних id, если исходные строки сохраняют `PLUGIN_ROW_OPT_LOADING` и контекст выбора не меняется; частота и неизбежность повтора не установлены | (вывод r25)[^602] | | `handle_response=yes` включает проверку `restart_needed_flag` и перезапуск GUI | (вывод r25)[^603] | | `handle_response=true` в JSON `plugin_system`: вывод из псевдокода — поле по смещению +4 остаётся 0. Прогон §2.9 этого не доказал и не опроверг: какой каталог читает натив (поле plugin+0x14) и значение поля в нём не сняты, XML-формы для сравнения не было | (код r25, вывод r25)[^604] | | `run_default` с `event=key_info` и `post_action` `a_default`: в итоговой выборке post его не видно, соседние `a_exit`, `a_composite-1/2` и `a_sleep` есть (один прогон на tv188b r25). Причина не установлена; это не значит, что действие не работает | (устройство r25)[^605] | | `plugin_exit_folders` закрывает открытые папки плагина: `count` — сколько уровней, 0 — вероятно, все (по месту использования в `downloads`) | (вывод r25)[^606] | | `plugin_replace_path` заменяет хвост пути навигации: снимает `erase_count` последних элементов и подставляет `elements` без повторного открытия экранов | (вывод r25)[^607] | | `rename_path` меняет подпись текущего (последнего) элемента пути навигации на `caption` | (вывод r25)[^608] | | `plugin_update_epf_mapping` с `epf_id` привязывает точку входа EPF к плагину `mapped_plugin_name`, с `epf_id = null` заставляет перечитать все EPF; `sync_epfs` — вероятно, синхронный режим | (вывод r25)[^609] | | `switch_osd_mode(osd_mode=true)` переводит оболочку из GUI плагина в экран воспроизведения (OSD) идущего видео, не перезапуская его; `osd_mode=false` не разобран | (вывод r25)[^610] | | `check_system_storage` проверяет наличие системного хранилища данных (при ненулевых `required_space`/`recommended_space` — и объём) и сообщает итог полем `check_succeeded` | (вывод r25)[^611] | | `edit_movie_data` открывает нативный редактор метаданных фильма `movie_id` и сообщает `movie_data_changed > 0` при изменении; `change_movie_data` сообщает `change_movie_data_status` | (вывод r25)[^612] | | `with_network_folders`, `with_network_browser` — сетевые папки и обзор сети; `new_folder_default_name` — начальное имя новой папки | (вывод r25)[^613] | В базе нет наблюдений на устройстве для большинства действий §3.4: строки с `device` — исключение. Нет их и для контрактов, прочитанных в коде tv188b r25: ожидание индекса mc (§2.4, «Операции плагина, тайм-ауты и `php_server`»), порядок запросов `rows_loader` (§2.5). У `handle_response` из JSON есть один прогон, но код он не проверил (§2.9 и таблица выше). Что не покрыто вообще — §7. ## 7. Покрытие `dune_api.php` r25 Подсчёт — скриптом по `files/system/system/dunehd/firmware_ext/php/dune_api.php` против claims базы (статусы `refuted` и `withdrawn` не учитываются); это результат сверки, а не claim. Все 316 имён `define` и 167 классов r24 есть и в r25, где их 331 и 179 (код r24, r25)[^161]. Сверка r24 с r25 по файлам: значения `define` не изменились, состав ключей изменился только у `FileChooserUiParams`, `PluginFolderView`, `PluginRowsPane`, `PluginSystemActionData`, `SyncMyCollectionActionData`. | Что считаем | Покрыто | Всего | Как считалось | |---|---|---|---| | `define`: имя и значение | 331 | 331 | пара `ИМЯ=значение` в тексте claim прошивки r24 или r25; `FS_CMD_*` — по имени и значению из двух claims | | Классы: имя | 179 | 179 | claim с классом и его ключами | | Ключи классов | 1035 | 1035 | перечень ключей в claim совпал с файлом r25 по каждому классу | | Действия: назначение или поведение | 78 | 92 | в §3.4 есть текст со ссылкой, а не «не описано»; у 19 действий описание — по коду r25 (фабрика, место вызова или манифест), а смысл для части из них — вывод (§6) | | Структуры: назначение или поведение | 83 | 88 | в §3.5 есть текст со ссылкой, а не «не описано»; часто это только фабрика или ссылка на главу | | `define` вне `*_ACTION_ID`: смысл | 196 | 239 | имя или строка значения встречается в claim, который не является инвентарём | Итого по `dune_api.php` r25: **покрыто именем и значением 510 из 510** (331 `define` и 179 классов), смыслом — **357 из 419** (строки ниже). «Смысл» у констант — только упоминание в содержательном claim, глубина там разная; смысл отдельных ключей классов не считался. **Действия без описанного назначения.** Их 14, и в PHP r24/r25 для них нет вызовов, поэтому место вызова смысла не подсказывает: - только `define` в `dune_api.php`, вызовов в PHP нет (11): `plugin_refresh_entry_points`, `plugin_update_archive_cache`, `show_gcomps`, `plugin_tv_select_channel`, `plugin_update_tv_info`, `dvb_command`, `update_dvb_channels`, `update_images`, `set_time_zone`, `confirm_location`, `start_service`; - фабрика есть, вызовов нет (3): `stop_playback` (есть наблюдение продолжения, §3.4), `init_persistfs`, `wait_ext_app_start`. `composite` описан в §3.4 по прогону на устройстве и в этот перечень не входит. **Структуры без описанного назначения, по областям:** - Общие структуры: `PluginRef`, `FileMovieInfo`. - GComponents: `GCompGeometryDef`, `GCompAlignDef`, `GCompCutImageDef`. **Константы без смыслового claim по этому поиску (только значение), по группам:** - EPG_*: `EPG_START_OVER_DISABLED`, `EPG_TRICK_PLAY_ENABLED`. - EDIT_LIST_CONFIG_OPT_*: `EDIT_LIST_CONFIG_OPT_WITH_DEFAULT`. - GCOMP_GEOM_OPT_*: `GCOMP_GEOM_OPT_NON_NEGATIVE_X`, `GCOMP_GEOM_OPT_NON_NEGATIVE_Y`. - GCOMP_OPT_*: `GCOMP_OPT_APPEAR_WITH_FADE`, `GCOMP_OPT_BG_PICTURE`, `GCOMP_OPT_DEBUG_FRAME`, `GCOMP_OPT_EMPTY_WITH_VIDEO`, `GCOMP_OPT_FOCUS`, `GCOMP_OPT_NO_PREPAINT`, `GCOMP_OPT_TRANSPARENT_WITH_VIDEO`, `GCOMP_OPT_TTF_QUALITY_WRAP`. - PLUGIN_ROW_OPT_*: `PLUGIN_ROW_OPT_FIRST_WITH_INFO`. - DialogFrameStyle: `DIALOG_FRAME_STYLE_TRANSPARENT`. - GCompFocusType: `GCOMP_FOCUS_INACTIVE_CUT_IMAGE`, `GCOMP_FOCUS_RECT2`, `GCOMP_FOCUS_RECT3`. - GCompLayoutRole: `GCOMP_LAYOUT_UNSET`. - GCompTextFit: `GCOMP_TEXT_FIT_CROP`, `GCOMP_TEXT_FIT_INSERT_ELLIPSIS`, `GCOMP_TEXT_FIT_APPEND_ELLIPSIS`. - GCompTransition: `GCOMP_TRANSITION_LAST_STEP`, `GCOMP_TRANSITION_FADE`. - GComponentKind: `GCOMPONENT_SANDWICH`. - GCompsFlipEffect: `GCOMPS_FLIP_EFFECT_NONE`, `GCOMPS_FLIP_EFFECT_FADE`, `GCOMPS_FLIP_EFFECT_FADE_OUT_SCALED`. - GuiEventKind: `GUI_EVENT_KEY_FIP_NEXT`, `GUI_EVENT_KEY_FIP_PREV`, `GUI_EVENT_KEY_SHUFFLE`, `GUI_EVENT_KEY_MUSIC`, `GUI_EVENT_UI_ACTION`, `GUI_EVENT_FOLDER_LEAVE`, `GUI_EVENT_FOLDER_RETURN_BACK`, `GUI_EVENT_MENU_PLAYBACK_OSD_CLOSED`, `GUI_EVENT_MENU_PLAYBACK_OSD_GOING_TO_OPEN`, `GUI_EVENT_MENU_EXT_APP_FINISH`, `GUI_EVENT_WEB_BROWSER_FINISH`, `GUI_EVENT_SHUTDOWN`. - PluginEpgMode: `PLUGIN_EPG_DISABLED`, `PLUGIN_EPG_USE_DVB_PROVIDER`. - StreamMarkerType: `STREAM_MARKER_RECAP`. [^1]: plg-dc-screenshoter.c036 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Константы *_ACTION_ID, GUI_EVENT_KEY_*, DIALOG_FRAME_STYLE_GLASS и классы GuiAction, PluginRegularFolderItem, ViewParams используются, но в пакете не определены; их определяет dune_api.php PHP-фреймворка прошивки [^2]: fw-tv188b-260827-0003-r24--php-framework.c014 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · DunePlugin::change_tv_favorites($op_type, $channel_id, &$plugin_cookies) и handle_user_input(&$user_input, &$plugin_cookies) возвращают GuiAction (по комментариям) [^3]: fw-tv188b-260827-0003-r24--plugin-loader--php-runtime.c039 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25, если call_plugin PHP-плагина возвращает null, php_server ничего не пишет в ответ и завершает цикл по EOF канала, а оболочка печатает «poll_calls() E: treating empty result as failure and stopping server», «Error: operation returned PHP_CALL_FAILED.», «result status failed», выполняет plugin_show_error и «FATAL ERROR detected (msg = Ошибка приложения)»; на экране — «Ошибка приложения / Произошла ошибка. Приложение будет закрыто.». [^4]: fw-tv188b-260827-0003-r24--shell-ext.c086 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · shell_ext несёт собственную UI-библиотеку в lib/: action_factory.php, control_factory.php, gcomps_factory.php, rows_factory.php, абстрактные экраны (regular, rows, gcomps, controls), подкаталоги tv/ и vod/ и async_worker/ [^5]: - plg-dc-globaltv.c132 · code · unknown; прошивка — · Библиотека плагина формирует действие с handler_string_id = PLUGIN_OPEN_FOLDER_ACTION_ID в ActionFactory::open_folder. - plg-dc-globaltv.c167 · code · unknown; прошивка — · Для ввода кода родительского контроля GlobalTvTvSectionListScreen вызывает ControlFactory::add_text_field с numeric=true, has_osk=false, always_active=true и params fixed_osk_id='numeric'. - plg-dc-globaltv--gcomps-controls.c001 · code · unknown; прошивка — · GCompsFactory::get_label_def возвращает компонент LABEL с id, geom_def, margins_def и specific_def из text/max_num_lines/text_color/font_size; defaults: id=null, max_num_lines=1, color=15, font_size=FONT_SIZE_NORMAL. [^6]: fw-tv188b-261021-0117-r25.c009 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · dune_api.php r25 вводит операцию плагина PLUGIN_OP_GET_FOLDER_ROWS='get_folder_rows' с выходным типом PLUGIN_OUT_DATA_PLUGIN_FOLDER_ROWS='plugin_folder_rows' и классы PluginFolderRowsInputData {media_url, row_ids} и PluginFolderRows {rows} [^7]: fw-tv188b-261021-0117-r25.c008 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · dune_api.php r25 добавляет идентификаторы GUI-действий APPLY_HASH_DIRTIES_ACTION_ID='apply_hash_dirties', COND_ACTION_ID='cond', FS_CTL_ACTION_ID='fs_ctl', LOAD_AND_SCALE_IMAGE_ACTION_ID='load_and_scale_image', UPDATE_SPECIAL_FAVORITE_FOLDER_ACTION_ID='update_special_favorite_folder' (в r24 их нет) [^8]: fw-tv188b-261021-0117-r25--php-framework--native-actions.c050 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 cond с pattern is_file(/tmp/kb_probe11/load.txt) выполнил post с tag=a_cond_yes и строковым action_status="1". [^9]: fw-tv188b-261021-0117-r25--php-framework--native-actions.c052 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 fs_ctl scandir(/tmp/kb_probe11) с output_path вернул post с action_status="1", fs_ctl_command=scandir, fs_ctl_output_path и fs_ctl_path; fs_ok.json содержит объект input и output.names. [^10]: fw-tv188b-261021-0117-r25--php-framework--native-actions.c054 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 load_and_scale_image(gui_skin://large_icons/apps.aai, /tmp/kb_probe11/img.aai, scale_if_needed=false) создал файл 70344 байта и вызвал post a_image с action_status="1". [^11]: fw-tv188b-261021-0117-r25--plugin-loader--native-contracts-2.c021 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 JSON-действие plugin_system(run_string=bin/kbp11_ps.sh,handle_response=true) выполнило sh <каталог установки>/bin/kbp11_ps.sh; маркер записал pid=30154 и pwd=/, а post k_ps пришёл без action_status. [^12]: fw-tv188b-261021-0117-r25--php-framework--native-actions.c055 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 stop_playback(wait_for_completion=true), запущенный при play_mode=none, вызвал post a_stop с play_mode=none без поля action_status в сохранённом user_input. [^13]: fw-tv188b-261021-0117-r25--php-framework--native-actions.c056 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 plugin_exit_folders(count=0) вызвал post a_exit с play_mode=none без поля action_status в сохранённом user_input. [^14]: fw-tv188b-261021-0117-r25--php-framework--native-actions.c059 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 sleep(delay_ms=500) вызвал post a_sleep в 03:36:07, после begin шага в 03:36:06; поле action_status в записанном продолжении отсутствует. [^15]: fw-tv188b-261021-0117-r25--plugin-loader--native-contracts-2.c008 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Сборщик row_ids обходит заданный полуинтервал строк по возрастанию индекса и добавляет id только при id!=NULL, options & PLUGIN_ROW_OPT_LOADING (0x4) и отсутствии ключа id в plugin_pending_rows. [^16]: fw-tv188b-261021-0117-r25--plugin-loader--native-contracts-2.c006 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · JSON-десериализация plugin_system оставляет PluginSystemActionData::handle_response=false: в обнулённых данных заполняются run_string и post_action, а поле handle_response не читается. [^17]: fw-tv188b-261021-0117-r25--plugin-loader--native-contracts-2.c022 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 после JSON plugin_system с handle_response=true созданные restart_needed_flag в tmp_dir_path и install_dir_path зонда оставались сразу после шага и через 10 с. [^18]: fw-tv188b-261021-0117-r25--plugin-loader--native-contracts-2.c023 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 pid com.dunehd.app до JSON plugin_system(handle_response=true) и через 10 с после него остался 26976. [^19]: plg-gh-kocourkuba-proiptv.c030 · code · unknown; прошивка — · Возможности фреймворка плагин проверяет по наличию констант и классов dune_api.php: is_choose_file_supported() — defined('ChooseFileActionData::filter'), is_rows_api_supported() — class_exists('PluginRowsFolderView'), is_delay_load_supported() — defined('PluginUpdateTvInfoActionData::channel_changes'), is_ext_epg_enabled() — defined('PluginUpdateEpgActionData::ext_epg_enabled'); is_ext_epg_supported() дополнительно требует файл $FS_PREFIX/firmware_ext/plugins/ext_epg/dune_plugin.xml. [^20]: fw-tv188b-261021-0117-r25.c017 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В libduneshell.so r25 есть строка «create_fs_ctl_action_from_xml(): not implemented», тогда как для cond, load_and_scale_image, apply_hash_dirties и update_special_favorite_folder есть create_*_action_from_xml() без такой пометки [^21]: fw-tv188b-261021-0117-r25.c260 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 PHP-плагин, программа которого объявляет наследника DunePluginFw с методом call_plugin() и присваивает его экземпляр в DunePluginFw::$instance (зонд kb_probe6), загружается php_server и получает от оболочки операции handle_user_input и get_vod_stream_url. [^22]: - fw-tv188b-260827-0003-r24--php-framework.c006 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Ни один файл каталога php/ не подключает bootstrap.php, dune_api.php, dune_config.php или dune_plugin_fw.php (require_once есть только внутри dunelib); пути этих файлов (и dune_plugin.php) вместе с шаблоном «require ('%s');» есть в строках php_server (libxxx_php_server.so) - fw-tv188b-260827-0003-r24--php-framework.c304 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · php_server содержит пути /firmware_ext/php/bootstrap.php, dune_api.php, dune_plugin.php, dune_plugin_fw.php, dune_config.php, шаблон «require ('%s');» и сообщение «[server] loading '%s'...» [^23]: fw-tv188b-260827-0003-r24--php-framework.c120 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php помечен как автогенерируемый и содержит только данные: 316 констант через define() и 167 классов, в которых 998 констант класса; функций в файле нет [^24]: fw-tv188b-260827-0003-r24--php-framework.c007 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Интерфейс DunePlugin (dune_plugin.php) объявляет 11 методов: get_folder_view, get_next_folder_view, get_tv_info, get_tv_stream_url, get_vod_info, get_vod_stream_url, get_regular_folder_items, get_day_epg, get_tv_playback_url, change_tv_favorites, handle_user_input [^25]: - fw-tv188b-260827-0003-r24--php-framework.c016 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Абстрактный класс DunePluginFw имеет статическое поле $instance (комментарий: должно содержать экземпляр DunePluginFw) и абстрактный метод call_plugin($call_ctx_json), возвращающий строку - fw-tv188b-260827-0003-r24--php-framework.c017 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · DunePluginFw::invoke_operation($plugin, $call_ctx) перед вызовом операции вызывает у плагина необязательные методы set_plugin_cookies, set_internet_status и set_opexec_id, если они существуют (method_exists) - fw-tv188b-260827-0003-r24--php-framework.c025 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · DunePluginFw::get_out_type_code($op_code) сопоставляет операции типам выходных данных: folder view → plugin_folder_view, regular folder items → plugin_regular_folder_range, handle_user_input и change_tv_favorites → gui_action, tv_info → plugin_tv_info, day_epg → plugin_tv_epg_program_list, *_url → url, vod_info → plugin_vod_info, vod_stream_info → plugin_stream_info [^26]: - fw-tv188b-260827-0003-r24--php-framework.c001 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · bootstrap.php определяет hd_print($str): выводит строку через echo с суффиксом $HD_NEW_LINE (по умолчанию ''), а при заданном $HD_OB_PREFIX — с этим префиксом и вызовом ob_flush() - fw-tv188b-260827-0003-r24--php-framework.c002 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · bootstrap.php регистрирует hd_error_handler через set_error_handler и hd_shutdown_handler через register_shutdown_function; обработчик печатает ошибку через hd_print в формате «[файл:строка] [E_ТИП] сообщение» - fw-tv188b-260827-0003-r24--php-framework.c005 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · bootstrap.php снимает ограничение времени выполнения PHP: set_time_limit(0) [^27]: fw-tv188b-260827-0003-r24--php-framework.c028 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_config.php определяет константы типа пульта FEW_BUTTONS_REMOTE_TYPE_NONE=0, _OVAL=1, _SMALL=2, _ARROWS=3 [^28]: - fw-tv188b-260827-0003-r24--php-framework.c032 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Файлы dunelib подключают друг друга через require_once с путями вида 'dunelib/…': expr.php → config_utils.php, dune_countries.php; config_utils.php → utils.php, dune_languages.php - fw-tv188b-260827-0003-r24--php-framework.c050 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dunelib/utils.php определяет класс-утилиту HD (статические методы) и исключение DuneCurlException extends Exception с полями errno, error, http_code - fw-tv188b-261021-0117-r25.c021 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Новый dunelib/installed_plugins.php (r25): класс InstalledPlugins читает /tmp/run/installed_plugins.xml (INSTALLED_PLUGINS_FILE) и кэширует список, перечитывая файл при смене mtime; методы get_by_name($plugins, $name), reload(), ensure_loaded() [^29]: fw-tv188b-260827-0003-r24--php-framework.c031 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Класс DuneSystem со статическим массивом $properties используется в dune_config.php и dunelib/utils.php (ключи few_buttons_remote_type, plugin_name), но ни в одном файле каталога php/ не определён; шаблон его определения «class DuneSystem { public static $properties = array(» есть в строках php_server (libxxx_php_server.so) [^30]: fw-tv188b-260827-0003-r24--php-framework.c305 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · php_server содержит шаблон PHP-кода «class DuneSystem { public static $properties = array(» и элемент «'sdk_version' => '1.0.0',», а также сообщение «executing system properties cmd (number of properties: %d)» [^31]: fw-tv188b-260827-0003-r24--php-framework.c306 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · php_server задаёт include_path по шаблону «ini_set('include_path', '.:%s:%s');»; рядом строка /firmware_ext/php/include [^32]: fw-tv188b-260827-0003-r24--php-framework.c121 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Константы классов dune_api.php — имена ключей структур: значение константы совпадает с её именем, а в комментарии указан C-тип поля (например (char *), MY_Bool, (GuiAction *)) [^33]: - fw-tv188b-260827-0003-r24--php-framework--dune-api.c003 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · В комментариях dune_api.php r24 поля ChangeBehaviourActionData::{timer} имеют C-тип (GuiTimerDef *). - fw-tv188b-260827-0003-r24--php-framework--dune-api.c004 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · В комментариях dune_api.php r24 поля ChangeBehaviourActionData::{post_action} имеют C-тип (GuiAction *). [^34]: fw-tv188b-260827-0003-r24--php-framework.c178 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс GuiAction с ключами (6): handler_string_id, data, caption, plugin_name, params, flags [^35]: 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() исполняется как следующее действие [^36]: fw-tv188b-260827-0003-r24--php-framework.c114 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php (раздел «GUI-action ids») определяет идентификаторы действий GUI: ADD_MENU_ITEMS_ACTION_ID='add_menu_items', ADD_TO_FAVORITES_ACTION_ID='add_to_favorites', BLURAY_PLAY_ACTION_ID='bluray_play', BT_COMMAND_ACTION_ID='bt_command', CHANGE_BEHAVIOUR_ACTION_ID='change_behaviour', CHANGE_GCOMPS_ACTION_ID='change_gcomps', CHANGE_LIST_CONFIG_ACTION_ID='change_list_config', CHANGE_MOVIE_DATA_ACTION_ID='change_movie_data', CHANGE_PARENTAL_CODE_ACTION_ID='change_parental_code', CHANGE_SETTINGS_ACTION_ID='change_settings', CHECK_RESTRICTED_ACTION_ID='check_restricted', CHECK_SYSTEM_STORAGE_ACTION_ID='check_system_storage', CHOOSE_FILE_ACTION_ID='choose_file', CLEAR_WATCH_HISTORY_ACTION_ID='clear_watch_history', CLOSE_AND_RUN_ACTION_ID='close_and_run' [^37]: fw-tv188b-260827-0003-r24--php-framework.c076 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · HD::ensure_plugin_name(&$action) подставляет в действие plugin_name из DuneSystem::$properties, если он не задан [^38]: fw-tv188b-260827-0003-r24--php-framework.c090 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет константы GUI_ACTION_FLAG_*: GUI_ACTION_FLAG_SKIP_ON_PLAY_RESTART=1 [^39]: - fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c072 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · ActionFactory::set_post_action присоединяет продолжение к хвосту data.post_action; для plugin_handle_user_input сохраняет JSON в params.next_action, только если next_action ложен. - fw-tv188b-261021-0117-r25--shell-ext--ui-lib.c038 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · ActionFactory::set_post_action для plugin_handle_user_input создаёт params при отсутствии и дополняет существующий JSON next_action через set_post_action_to_string. [^40]: fw-tv188b-260827-0003-r24--php-framework.c081 · code · tv188b, tv175u, android-dune-fw; прошивка 260724_0207_r24, 260827_0003_r24 · Все 10 PHP-файлов фреймворка в tv175u 260724_0207_r24 совпадают по sha256 с tv188b 260827_0003_r24 [^41]: fw-tv188b-260827-0003-r24--php-framework.c082 · code · tv188b, tv175u, android-dune-fw; прошивка 240619_0210_r22, 250815_1012_r22, 260724_0207_r24, 260827_0003_r24 · bootstrap.php, dune_config.php, dune_plugin.php и dunelib/dune_countries.php одинаковы (sha256) в tv175u 240619_0210_r22, tv188b 250815_1012_r22 и r24-прошивках; dunelib/config_utils, dune_languages, expr, utils в r22-прошивках отсутствуют [^42]: 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 они есть [^43]: 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 они есть [^44]: - fw-tv188b-260827-0003-r24--php-framework.c120 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php помечен как автогенерируемый и содержит только данные: 316 констант через define() и 167 классов, в которых 998 констант класса; функций в файле нет - fw-tv188b-261021-0117-r25.c374 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24, 261021_0117_r25 · В dune_api.php r25 присутствуют все 316 имён define и 167 классов из r24 (отсутствующих нет); в r25 — 331 define и 179 классов. [^45]: - fw-tv188b-261021-0117-r25.c009 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · dune_api.php r25 вводит операцию плагина PLUGIN_OP_GET_FOLDER_ROWS='get_folder_rows' с выходным типом PLUGIN_OUT_DATA_PLUGIN_FOLDER_ROWS='plugin_folder_rows' и классы PluginFolderRowsInputData {media_url, row_ids} и PluginFolderRows {rows} - fw-tv188b-261021-0117-r25.c010 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · DunePluginFw::invoke_operation в r25 обрабатывает get_folder_rows: вызывает $plugin->get_folder_rows(media_url, row_ids), а если метода нет — бросает Exception «Method not found: get_folder_rows»; get_out_type_code сопоставляет операции тип plugin_folder_rows [^46]: fw-tv188b-261021-0117-r25.c012 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · dune_api.php r25 вводит файловые команды для действия fs_ctl: перечисление FsCmdKind (resolve_url, stat, scandir, get_file) и классы FsCtlActionData {cmd, output_path, post_action}, FsCmdDef {kind, specific_def}, FsResolveUrlDef {url, try_mount_if_needed}, FsStatDef {path}, FsScandirDef {path, with_stat, max_items_count}, FsGetFileDef {path, target_path, skip, max_size, chunk_size} [^47]: fw-tv188b-261021-0117-r25.c011 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · dune_api.php r25 описывает строки с ленивой подгрузкой: тип строки PLUGIN_ROW_TYPE_DUP='row_dup', опции PLUGIN_ROW_OPT_LOADING=0x4 и PLUGIN_ROW_OPT_OPTIMIZE_INVISIBLE=0x8, поле PluginRowsPane::row_dup_map, PluginFolderView::type_mask и GCOMP_OPT_STUB=0x400000 [^48]: fw-tv188b-261021-0117-r25.c014 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · dune_api.php r25 добавляет поля в существующие классы: FileChooserUiParams::{with_network_folders, with_network_browser, new_folder_default_name}, PluginSystemActionData::handle_response [^49]: - fw-tv188b-260827-0003-r24--php-framework.c276 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс SyncMyCollectionActionData с ключами (2): mcf_id, post_action - fw-tv188b-261021-0117-r25.c015 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В r25 класс SyncMyCollectionActionData содержит только post_action: ключ mcf_id убран из dune_api.php, а ActionFactory::sync_my_collection в shell_ext/lib принимает только $post_action [^50]: - fw-tv188b-260827-0003-r24--php-framework.c067 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · HD::make_json_rpc_request($op_name, $params) возвращает массив JSON-RPC 2.0 с растущим id - fw-tv188b-261021-0117-r25.c022 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В dunelib/utils.php r25 нет метода HD::make_json_rpc_request: между encode_props и get_mac_addr, где он стоял в r24, его нет [^51]: fw-tv188b-261021-0117-r25.c024 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В HD (dunelib/utils.php) r25 добавлены статические методы ensure_empty_file($path), log_elapsed($msg, $start_tm, $suffix=''), read_int($path, $def=0), read_string($path, $def='') [^52]: fw-tv188b-261021-0117-r25.c021 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Новый dunelib/installed_plugins.php (r25): класс InstalledPlugins читает /tmp/run/installed_plugins.xml (INSTALLED_PLUGINS_FILE) и кэширует список, перечитывая файл при смене mtime; методы get_by_name($plugins, $name), reload(), ensure_loaded() [^53]: fw-tv188b-260827-0003-r24--php-framework.c027 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · В каталоге php/ call_plugin только объявлен абстрактным в DunePluginFw; наследников DunePluginFw и реализации call_plugin в php/ нет — они во встроенных плагинах (c289–c291) [^54]: fw-tv188b-260827-0003-r24--php-framework.c289 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Класс DefaultDunePluginFw extends DunePluginFw определён не в php/, а в файлах default_dune_plugin_fw.php 8 встроенных плагинов: в lib/ у android_apps, bt_setup, dunestore, ext_epg, ktv_start, radiotime, shell_ext и в phplib/ у bluray [^55]: fw-tv188b-260827-0003-r24--php-framework.c290 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · В копии android_apps (и идентичной bt_setup) DefaultDunePluginFw::call_plugin($call_ctx_json) возвращает json_encode(call_plugin_impl(json_decode($call_ctx_json))) [^56]: fw-tv188b-260827-0003-r24--php-framework.c019 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · invoke_operation использует поля контекста вызова op_type_code, input_data, plugin_cookies, internet_status, opexec_id; имя вызываемого метода плагина равно значению op_type_code [^57]: fw-tv188b-260827-0003-r24--php-framework.c017 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · DunePluginFw::invoke_operation($plugin, $call_ctx) перед вызовом операции вызывает у плагина необязательные методы set_plugin_cookies, set_internet_status и set_opexec_id, если они существуют (method_exists) [^58]: fw-tv188b-260827-0003-r24--php-framework.c018 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Если в контексте вызова нет internet_status, set_internet_status получает -2; если нет opexec_id, set_opexec_id получает строку "-1" [^59]: fw-tv188b-260827-0003-r24--php-framework.c024 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Любая операция, не перечисленная в invoke_operation явно, передаётся в handle_user_input($input_data, $plugin_cookies) [^60]: fw-tv188b-260827-0003-r24--php-framework.c020 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Для операций get_folder_view, get_next_folder_view, get_tv_info, get_tv_stream_url, get_vod_info, get_vod_stream_url при наличии input_data->sel_state и метода _v2 вызывается _v2($media_url, $sel_state, $plugin_cookies), иначе ($media_url, $plugin_cookies) [^61]: 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 [^62]: fw-tv188b-260827-0003-r24--php-framework.c015 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Во всех методах DunePlugin $plugin_cookies передаётся по ссылке и описан как [inout] Map: Key -> Value; у handle_user_input по ссылке передаётся и $user_input [^63]: fw-tv188b-261021-0117-r25--php-framework.c036 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В отличие от операций с cookies аргументами, ветка get_folder_rows в DunePluginFw передаёт только media_url и row_ids; необязательный set_plugin_cookies вызывается раньше при входе в invoke_operation. [^64]: fw-tv188b-260827-0003-r24--plugin-loader--gui-actions--json-outputs.c001 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · В libduneshell.so r24 функция fcn.0023c924 — json_materialize_output_data_from_json из json_materialization.c; она собирает PluginOutputData из JSON-ответа плагина. [^65]: - fw-tv188b-260827-0003-r24--plugin-loader--gui-actions--json-outputs.c004 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · После чтения has_data: если значение равно 0, разбор data_type и data (switch по типу) пропускается, и управление переходит к чтению is_error. - fw-tv188b-260827-0003-r24--plugin-loader--gui-actions--json-outputs.c005 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · При has_data ≠ 0 и наличии ключа data_type функция читает data_type как строку и преобразует её в индекс PluginOutputDataType вызовом FUN_00279598; при отрицательном результате печатается Error: invalid string type-tc value (%s) for 'PluginOutputDataType'. (при ошибке разбора строки — Error: can not deserialize string type-code value for 'PluginOutputDataType': %s.), после чего индекс приравнивается 0; индекс сохраняется в поле data_type. - fw-tv188b-260827-0003-r24--plugin-loader--gui-actions--json-outputs.c014 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · После разбора data (или сразу при has_data = 0) json_materialize_output_data_from_json читает is_error, затем error_action (GuiAction) и plugin_cookies (properties), сохраняя их в PluginOutputData. [^66]: fw-tv188b-260827-0003-r24--plugin-loader--gui-actions--json-outputs.c015 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Если чтение is_error, error_action и plugin_cookies прошло без ошибки и is_error ≠ 0, json_materialize_output_data_from_json возвращает PluginOutputData без проверки соответствия data_type требуемому типу операции. [^67]: fw-tv188b-260827-0003-r24--plugin-loader--gui-actions--json-outputs.c018 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Если чтение is_error, error_action и plugin_cookies прошло без ошибки, is_error = 0, has_data ≠ 0 и data_type ≠ требуемому типу операции, функция печатает plugin op E: wrong data_type %s (required %s) of deserialized PluginOutputData., освобождает структуру и возвращает NULL; при равенстве возвращает структуру. [^68]: fw-tv188b-260827-0003-r24--plugin-loader--gui-actions--json-outputs.c016 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Если чтение is_error, error_action и plugin_cookies прошло без ошибки, is_error = 0, has_data = 0 и флаг обязательности данных ≠ 0, json_materialize_output_data_from_json печатает plugin op E: got null data (op_type: %s), освобождает PluginOutputData и возвращает NULL. [^69]: fw-tv188b-260827-0003-r24--plugin-loader--gui-actions--json-outputs.c002 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · json_materialize_output_data_from_json проверяет op_id до создания PluginOutputData: проверка включается, только если ожидаемый 64-битный op_id ≥ 1 и ключ op_id есть в JSON; если проверка включена, неположительное или нечисловое значение даёт plugin op E: invalid 'op_id' in response, несовпадение — wrong 'op_id' in response, в обоих случаях возвращается NULL; при выключенной проверке op_id не сравнивается. [^70]: plg-dc-globaltv.c056 · code · unknown; прошивка — · Поддержку rows API плагин определяет проверкой class_exists("PluginRowsFolderView"). [^71]: plg-dc-bazinga3.c082 · code · unknown; прошивка — · Поддержку item_sticker и item_detailed_icon_width в главном меню плагин проверяет через defined('ViewItemParams::…') перед использованием. [^72]: fw-tv188b-260827-0003-r24--php-framework.c045 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Сравнения версий в Expr (fwv_ge/gt/le/lt) строковые: strcmp(firmware_version, аргумент) [^73]: 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» [^74]: fw-tv188b-261021-0117-r25.c010 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · DunePluginFw::invoke_operation в r25 обрабатывает get_folder_rows: вызывает $plugin->get_folder_rows(media_url, row_ids), а если метода нет — бросает Exception «Method not found: get_folder_rows»; get_out_type_code сопоставляет операции тип plugin_folder_rows [^75]: fw-tv188b-260827-0003-r24--php-framework.c026 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Для неизвестного кода операции get_out_type_code печатает ошибку через hd_print и бросает исключение «Uknown operation code» (с опечаткой в тексте) [^76]: fw-tv188b-260827-0003-r24--plugin-loader--gui-actions--json-outputs.c019 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · При ошибке любого шага разбора, не описанного отдельными ветвями, json_materialize_output_data_from_json печатает plugin op E: can not deserialize PluginOutputData: %s., освобождает память структуры и возвращает NULL. [^77]: fw-tv188b-260827-0003-r24--plugin-loader--gui-actions--json-outputs.c005 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · При has_data ≠ 0 и наличии ключа data_type функция читает data_type как строку и преобразует её в индекс PluginOutputDataType вызовом FUN_00279598; при отрицательном результате печатается Error: invalid string type-tc value (%s) for 'PluginOutputDataType'. (при ошибке разбора строки — Error: can not deserialize string type-code value for 'PluginOutputDataType': %s.), после чего индекс приравнивается 0; индекс сохраняется в поле data_type. [^78]: fw-tv188b-260827-0003-r24--plugin-loader--gui-actions.c047 · code · android-dune-fw; прошивка 260827_0003_r24 · В strings libduneshell.so есть сообщение JSON: GuiAction: unknown handler id (%s). [^79]: fw-tv188b-261021-0117-r25.c236 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 после сбоя операции handle_user_input php_server с «op 11 failed (read status: 2)» и PHP_CALL_FAILED оболочка пишет «FATAL ERROR detected (msg = Ошибка приложения)» и показывает диалог «Ошибка приложения / Произошла ошибка. Приложение будет закрыто.» с кнопкой OK; после закрытия плеер не завис. [^80]: - fw-tv188b-261021-0117-r25--php-framework--native-actions.c030 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Неизвестное имя оператора в gui_condition пишет в лог "cond E: unknown op '<имя>'". - fw-tv188b-261021-0117-r25--plugin-loader--native-contracts.c001 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Если оператор условия не совпал ни со встроенными операторами, ни с зарегистрированной custom-функцией, вычислитель 0x00147ef8 после лога unknown op возвращает -1. - fw-tv188b-261021-0117-r25--plugin-loader--native-contracts.c002 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Булева обёртка условия 0x00148f98 возвращает true только при результате вычислителя, равном 1; результат -1 превращается в false. [^81]: - fw-tv188b-261021-0117-r25.c243 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в php_server и php-cgi целочисленный литерал 3000000000 в PHP-коде даёт integer 2147483647 (gettype integer, json_encode(3000000000) и json_encode(1793009215123) — 2147483647), тогда как PHP_INT_MAX + 1 даёт 2147483648, а time() * 1000 — 13-значное число без обрезки. - fw-tv188b-261021-0117-r25.c244 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в php_server и php-cgi json_decode() целых вне 32-битного диапазона (2147483648, 4294967296, 9007199254740993, 1793009215123, [3000000000]) возвращает integer 2147483647, а -2147483649 — integer -2147483648; json_last_error() при этом 0. [^82]: fw-tv188b-261021-0117-r25.c022 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В dunelib/utils.php r25 нет метода HD::make_json_rpc_request: между encode_props и get_mac_addr, где он стоял в r24, его нет [^83]: fw-tv188b-261021-0117-r25.c015 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В r25 класс SyncMyCollectionActionData содержит только post_action: ключ mcf_id убран из dune_api.php, а ActionFactory::sync_my_collection в shell_ext/lib принимает только $post_action [^84]: fw-tv188b-261021-0117-r25--plugin-loader--native-contracts.c012 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 fs_ctl scandir несуществующего /tmp/kb_probe11/no_such записал в fs_bad.json синтаксически неверный JSON с анонимным объектом error после input: {"input":{...},{"error":{...}}}. [^85]: fw-tv188b-261021-0117-r25--plugin-loader--native-contracts-2.c014 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Ответ folder_rows применяется только к текущей папке с совпадающим ключом plugin_name:media_url; при несовпадении обработчик пишет «response ignored, folder changed» и не помещает строки в pending. [^86]: - fw-tv188b-261021-0117-r25--plugin-loader--native-contracts-2.c006 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · JSON-десериализация plugin_system оставляет PluginSystemActionData::handle_response=false: в обнулённых данных заполняются run_string и post_action, а поле handle_response не читается. - fw-tv188b-261021-0117-r25--plugin-loader--native-contracts-2.c022 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 после JSON plugin_system с handle_response=true созданные restart_needed_flag в tmp_dir_path и install_dir_path зонда оставались сразу после шага и через 10 с. - fw-tv188b-261021-0117-r25--plugin-loader--native-contracts-2.c023 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 pid com.dunehd.app до JSON plugin_system(handle_response=true) и через 10 с после него остался 26976. [^87]: fw-tv188b-261021-0117-r25--plugin-loader--native-contracts-2.c001 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В nav_plugin_perform_operation_blocked предварительный вызов ожидания проверки индекса mc выполняется до снятия начального времени и вычисления дедлайна timeout_us; длительность этого вызова в timeout_us операции не входит. [^88]: fw-tv188b-261021-0117-r25--plugin-loader--native-contracts-2.c019 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Проверка mc в 0x0041cd54 — хвостовой вызов FS_read_int('/tmp/plugins/shell_ext/mc_index_valid.txt', -1); ожидающий активный запрос продолжает запуск только при результате этой проверки 1. [^89]: - fw-tv188b-261021-0117-r25--php-framework.c012 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Аннотации dune_api.php r25 задают поля PluginFolderRowsInputData: media_url — (char *); row_ids — (MY_StringArray *). - fw-tv188b-261021-0117-r25--php-framework.c011 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Аннотации dune_api.php r25 задают поля PluginFolderRows: rows — (PluginRowList *). [^90]: fw-tv188b-261021-0117-r25--php-framework--native-actions.c033 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · rows_loader держит одну текущую задачу; новый запрос от другого плагина отменяет старую задачу с предупреждением "cancelling old task of plugin", а для того же плагина текущая задача отменяется только при ненулевом втором аргументе. [^91]: fw-tv188b-261021-0117-r25--php-framework--native-actions.c035 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · По завершении задачи rows_loader логирует её статус, вызывает обязательный rows_loaded-обработчик (иначе assert), сбрасывает id текущей задачи и взводит флаг, который возвращает следующий вызов цикла загрузчика. [^92]: fw-tv188b-261021-0117-r25--php-framework--native-actions.c021 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Для строки DUP нативный поиск эффективной строки использует dup_id для lookup в row_dup_map; отсутствие карты, id либо записи даёт null с предупреждением. [^93]: fw-tv188b-261021-0117-r25--plugin-loader--native-contracts-2.c007 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Формат PluginRow::data выбирается нативным типом строки: DUP (1) читается как строка dup_id, а GCOMPS (2), REGULAR (3) и TITLE (4) читаются как объекты PluginGCompsRow, PluginRegularRow и PluginTitleRow соответственно. [^94]: fw-tv188b-261021-0117-r25--plugin-loader--native-contracts-2.c012 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Инициализация PluginRows регистрирует источник запросов 0x0026aa84 в DAT_00eea7a4 и обработчик ответа 0x00273cd4 в DAT_00eea798 через 0x002a9a90. [^95]: fw-tv188b-261021-0117-r25--plugin-loader--native-contracts-2.c010 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Источник get_folder_rows сначала пробует одну опорную строку по сохранённому id (при отсутствии или ненахождении id — строку 0), затем смежный диапазон, ограниченный проверками компонентов +0x50, и лишь при пустом пакете — расширенный по высотам диапазон вокруг опорного индекса. [^96]: fw-tv188b-261021-0117-r25--plugin-loader--native-contracts-2.c011 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Если все три попытки выбора row_ids дают пустой массив, источник ставит DAT_00eea496=1 и возвращает NULL; при установленном флаге следующий вызов источника сразу возвращает NULL, не собирая новый пакет. [^97]: fw-tv188b-261021-0117-r25--plugin-loader--native-contracts-2.c017 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В 0x0026dca8, если найден объект в PluginRowsFolderCache, флаг исчерпания DAT_00eea496 сбрасывается в 0 до последующего условного вызова rows_loader. [^98]: fw-tv188b-261021-0117-r25--plugin-loader--native-contracts-2.c013 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При отсутствии текущего request_id rows_loader вызывает источник запросов и ставит полученный пакет как операцию get_folder_rows (native kind=3); после обработки запросов цикл повторяется, пока есть готовые пакеты и нет текущей задачи. [^99]: fw-tv188b-261021-0117-r25--plugin-loader--native-contracts-2.c005 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При ненулевых входных данных get_folder_rows нативный JSON-сериализатор записывает в input_data поле media_url и массив row_ids, обходя переданный массив идентификаторов с нулевого индекса по возрастанию. [^100]: fw-tv188b-261021-0117-r25--plugin-loader--native-contracts-2.c009 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Обработчик ответа folder_rows, прошедшего проверки статуса и текущей папки, помещает возвращённые строки с id!=NULL в plugin_pending_rows под ключом их id. [^101]: fw-tv188b-261021-0117-r25--plugin-loader--native-contracts-2.c015 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При применении plugin_pending_rows строка ответа заменяет исходную строку по её id через PluginRowIndex, а не по позиции в массиве ответа; запись при этом удаляется из pending. [^102]: fw-tv188b-261021-0117-r25--plugin-loader--native-contracts-2.c002 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При создании компонента строки с эффективным native-типом 2–4 функция 0x002cad94 при ненулевом втором аргументе и options & 0x8 создаёт упрощённый компонент с флагом 0x400000 вместо ветви создания содержимого строки. [^103]: fw-tv188b-261021-0117-r25--plugin-loader--native-contracts-2.c018 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В переданном диапазоне plugin_rows_clear_stubs пересоздаёт строки с ненулевым id, options & OPTIMIZE_INVISIBLE (0x8) и найденным компонентом с GCOMP_OPT_STUB (0x400000), вызывая создатель компонента с optimize=0. [^104]: - fw-tv188b-261021-0117-r25--php-framework.c001 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Аннотации dune_api.php r25 задают поля FsCmdDef: kind — FsCmdKind; specific_def — (void *). - fw-tv188b-261021-0117-r25--php-framework.c002 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Аннотации dune_api.php r25 задают поля FsCtlActionData: cmd — (FsCmdDef *); output_path — (char *); post_action — (GuiAction *). [^105]: fw-tv188b-261021-0117-r25--php-framework--native-actions.c001 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · fs_ctl задаёт в свойствах продолжения action_status=1 при нулевом статусе файловой команды и 0 при ненулевом. [^106]: fw-tv188b-261021-0117-r25--plugin-loader.c030 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В strings libduneshell.so r25 присутствуют FS_CTL и путь /config/hd_debug/FS_CTL.txt. [^107]: - fw-tv188b-261021-0117-r25--php-framework.c004 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Аннотации dune_api.php r25 задают поля FsResolveUrlDef: url — (char *); try_mount_if_needed — bool. - fw-tv188b-261021-0117-r25--php-framework--native-actions.c007 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При успешном fs_ctl resolve_url продолжение получает fs_ctl_resolved_path. [^108]: - fw-tv188b-261021-0117-r25--php-framework.c006 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Аннотации dune_api.php r25 задают поля FsStatDef: path — (char *). - fw-tv188b-261021-0117-r25--php-framework--native-actions.c003 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При успешном fs_ctl stat поле fs_ctl_is_dir равно 1 для каталога, 0 для обычного файла и -1 для остальных типов по маске st_mode & 0xf000. - fw-tv188b-261021-0117-r25--php-framework--native-actions.c005 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При успешном fs_ctl stat продолжение получает fs_ctl_st_mode, fs_ctl_st_size (через long long), fs_ctl_st_mtime и fs_ctl_st_ctime. [^109]: - fw-tv188b-261021-0117-r25--php-framework.c005 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Аннотации dune_api.php r25 задают поля FsScandirDef: path — (char *); with_stat — bool; max_items_count — int. - fw-tv188b-261021-0117-r25--php-framework--native-actions.c004 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · fs_ctl scandir передаёт FS_scandir_ext лимит 100000 при max_items_count<=0 или max_items_count>=100000; положительное меньшее значение передаётся без изменения. - fw-tv188b-261021-0117-r25--php-framework--native-actions.c019 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В stats результата fs_ctl scandir неудачный stat отдельного элемента сериализуется как error=1 для этого имени. - fw-tv188b-261021-0117-r25--php-framework--native-actions.c025 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При успешном FS_scandir_ext ошибка FS_stat одного элемента не меняет итоговый статус команды scandir на ошибочный: после прохода по элементам устанавливается ноль. [^110]: - fw-tv188b-261021-0117-r25--php-framework.c003 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Аннотации dune_api.php r25 задают поля FsGetFileDef: path — (char *); target_path — (char *); skip — int; max_size — int; chunk_size — int. - fw-tv188b-261021-0117-r25--php-framework--native-actions.c014 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В fs_ctl get_file неположительный max_size заменяется пределом 2147483647 байт копирования. - fw-tv188b-261021-0117-r25--php-framework--native-actions.c015 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В fs_ctl get_file chunk_size<=0 даёт буфер 1048576 байт; положительное значение ограничивается диапазоном 1024–1048576 байт. - fw-tv188b-261021-0117-r25--php-framework--native-actions.c016 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · fs_ctl get_file при skip=0 не вызывает seek; ненулевой skip передаётся в FS_vfseek со знаковым расширением до 64 бит и origin 0 для положительного, 2 для отрицательного значения. - fw-tv188b-261021-0117-r25--php-framework--native-actions.c017 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · fs_ctl get_file пишет во временный путь с суффиксом .tmp от target_path, затем после успешного копирования и закрытия файлов вызывает FS_rename во входной target_path. [^111]: - fw-tv188b-261021-0117-r25--php-framework--native-actions.c001 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · fs_ctl задаёт в свойствах продолжения action_status=1 при нулевом статусе файловой команды и 0 при ненулевом. - fw-tv188b-261021-0117-r25--php-framework--native-actions.c052 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 fs_ctl scandir(/tmp/kb_probe11) с output_path вернул post с action_status="1", fs_ctl_command=scandir, fs_ctl_output_path и fs_ctl_path; fs_ok.json содержит объект input и output.names. - fw-tv188b-261021-0117-r25--php-framework--native-actions.c053 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 fs_ctl scandir(/tmp/kb_probe11/no_such) с output_path вернул post с action_status="0", fs_ctl_error="scandir failed", fs_ctl_command=scandir, fs_ctl_output_path и fs_ctl_path. [^112]: fw-tv188b-261021-0117-r25--php-framework--native-actions.c013 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · fs_ctl включает в fs_ctl_command продолжения имя команды: resolve_url/stat/scandir/get_file для native kind 0/1/2/3 соответственно. [^113]: fw-tv188b-261021-0117-r25--php-framework--native-actions.c012 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · fs_ctl добавляет продолжению fs_ctl_error только при ненулевом статусе команды и наличии строки ошибки. [^114]: fw-tv188b-261021-0117-r25--php-framework--native-actions.c008 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При успешном fs_ctl get_file без непустого output_path продолжение получает fs_ctl_content_size. [^115]: fw-tv188b-261021-0117-r25--php-framework--native-actions.c026 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · У существующего продолжения fs_ctl с непустым output_path для scandir/get_file передаётся fs_ctl_output_path, а inline-поля fs_ctl_output/fs_ctl_content_size пропускаются, включая сбой записи файла. [^116]: fw-tv188b-261021-0117-r25--php-framework--native-actions.c002 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Если запись результата fs_ctl в output_path не удалась, продолжение получает fs_ctl_write_output_failed=1, а action_status по-прежнему определяется статусом самой команды. [^117]: - fw-tv188b-261021-0117-r25--php-framework--native-actions.c052 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 fs_ctl scandir(/tmp/kb_probe11) с output_path вернул post с action_status="1", fs_ctl_command=scandir, fs_ctl_output_path и fs_ctl_path; fs_ok.json содержит объект input и output.names. - fw-tv188b-261021-0117-r25--php-framework--native-actions.c053 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 fs_ctl scandir(/tmp/kb_probe11/no_such) с output_path вернул post с action_status="0", fs_ctl_error="scandir failed", fs_ctl_command=scandir, fs_ctl_output_path и fs_ctl_path. [^118]: fw-tv188b-261021-0117-r25--php-framework--native-actions.c006 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · fs_ctl пытается сохранить результат в непустой output_path только для команд scandir и get_file; resolve_url и stat проходят по ветви свойств продолжения. [^119]: - fw-tv188b-261021-0117-r25--plugin-loader--native-contracts.c007 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В fs_ctl при непустом output_path и команде scandir со статусом не 0 сериализатор 0x004972a4 после внешнего объекта и поля input вызывает 0x0049720c без предварительного имени поля для его объекта. - fw-tv188b-261021-0117-r25--plugin-loader--native-contracts.c008 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В fs_ctl при непустом output_path и команде get_file со статусом не 0 после внешнего объекта и input вызывается самостоятельный объект ошибки 0x0049720c без предварительного имени поля; успешная ветвь вместо него записывает поле output. [^120]: fw-tv188b-261021-0117-r25--php-framework--native-actions.c053 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 fs_ctl scandir(/tmp/kb_probe11/no_such) с output_path вернул post с action_status="0", fs_ctl_error="scandir failed", fs_ctl_command=scandir, fs_ctl_output_path и fs_ctl_path. [^121]: fw-tv188b-261021-0117-r25--php-framework.c007 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Аннотации dune_api.php r25 задают поля CondActionData: pattern — (char *); post_action — (GuiAction *). [^122]: fw-tv188b-261021-0117-r25--php-framework.c022 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Манифест downloads задаёт is_shown_action первой entry_point как cond с pattern is_plugin_file(dunemdb_supplier_online_movies/__v2); post_action в этом действии не задан. [^123]: fw-tv188b-261021-0117-r25--php-framework--native-actions.c031 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В r25 для условий регистрируются пользовательские функции is_file и is_plugin_file и свойство separate_android_tv_apps. [^124]: fw-tv188b-261021-0117-r25--php-framework--native-actions.c028 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Разбор gui_condition принимает имя оператора ff наравне с firmware_feature (сравнение с учётом регистра). [^125]: fw-tv188b-261021-0117-r25--php-framework--native-actions.c029 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Предикат firmware_feature в gui_condition обрезает аргумент до 255 байт и передаёт его в has_firmware_feature. [^126]: fw-tv188b-261021-0117-r25--php-framework--native-actions.c032 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · is_plugin_file делит аргумент по первому '/', ищет запись по непустой части до '/', берёт её непустой путь и истинно только если "<путь>/<остаток>" — обычный файл; без '/', с пустой частью или без записи — ложно. [^127]: fw-tv188b-261021-0117-r25--php-framework--native-actions.c051 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 cond с pattern is_file(/tmp/kb_probe11/no_such) выполнил post с tag=a_cond_no и строковым action_status="0". [^128]: fw-tv188b-261021-0117-r25--php-framework.c008 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Аннотации dune_api.php r25 задают поля LoadAndScaleImageActionData: icon_url — (char *); local_path — (char *); scale_if_needed — bool; icon_width — int; icon_height — int; post_action — (GuiAction *). [^129]: fw-tv188b-261021-0117-r25--php-framework.c025 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · ActionFactory::load_and_scale_image(icon_url, local_path, scale_if_needed=false, icon_width=0, icon_height=0, post_action=null) возвращает GuiAction load_and_scale_image; scale_if_needed=1 и размеры добавляются только при истинном scale_if_needed, post_action — только если непуст. [^130]: fw-tv188b-261021-0117-r25--php-framework--native-actions.c009 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · load_and_scale_image отвергает подготовленный local_path, если длина меньше 5, первый символ не '/', последний символ '/', либо начиная с позиции 2 нет второго '/'. [^131]: fw-tv188b-261021-0117-r25--php-framework--native-actions.c023 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · load_and_scale_image после отклонения некорректного local_path всё равно записывает копию post_action в выходное продолжение. [^132]: fw-tv188b-261021-0117-r25--php-framework--native-actions.c024 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Если у load_and_scale_image создано продолжение, обработчик добавляет ему action_status как при нулевом, так и при ненулевом результате загрузки. [^133]: fw-tv188b-261021-0117-r25--php-framework.c026 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · MovieHelper::perform_add_special_favorite для @Movies возвращает load_and_scale_image с целью /flashdata/main_screen_items/@Movies/$id.jpg и размером 291×437, передавая повторный user_input с icon_cached=1 в post_action. [^134]: fw-tv188b-261021-0117-r25--php-framework.c009 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Аннотации dune_api.php r25 задают поля UpdateSpecialFavoriteFolderActionData: name — (char *); delete — bool; skip_interactions — bool; post_action — (GuiAction *). [^135]: fw-tv188b-261021-0117-r25--php-framework.c028 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · ActionFactory::update_special_favorite_folder(name, delete, post_action=null) возвращает GuiAction update_special_favorite_folder с этими тремя полями; объявленный skip_interactions фабрика не передаёт. [^136]: fw-tv188b-261021-0117-r25--php-framework.c029 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · MovieHelper::add_special_favorite при false to_root_folder возвращает update_special_favorite_folder(special_folder_name, false, custom_action(add_special_favorite)); данные продолжения содержат type и id. [^137]: fw-tv188b-261021-0117-r25--php-framework.c030 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · MovieHelper::remove_favorite_movie/remove_favorite_person при отсутствии root_name и опустевшем соответствующем списке возвращают update_special_favorite_folder с delete=true для @Movies/@CastAndCrew; если список ещё непуст, возвращается post_action с action_status=1. [^138]: - fw-tv188b-261021-0117-r25--php-framework.c010 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Аннотации dune_api.php r25 задают поля ApplyHashDirtiesActionData: post_action — (GuiAction *). - fw-tv188b-261021-0117-r25--php-framework.c032 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · ActionFactory::apply_hash_dirties(post_action=null) возвращает GuiAction apply_hash_dirties, в data которого единственное поле post_action. [^139]: fw-tv188b-261021-0117-r25--php-framework.c033 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · DataModel::update_dirties_for_files при force_sync либо непустом file_by_folder_id добавляет ActionFactory::apply_hash_dirties() через MainHelper::$plugin->add_result_action после вызовов store у dirties и set_quick_rescan_needed. [^140]: fw-tv188b-261021-0117-r25--php-framework.c034 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · HashDirties::write_file записывает в /flashdata/plugins_data/shell_ext/hash_dirties.txt по строке на запись семь полей через табуляцию: hash, del, old_movie_id, new_movie_id, ass_type, s, e. [^141]: fw-tv188b-260827-0003-r24--php-framework.c136 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс ChooseFileActionData с ключами (3): filter, ui_params, post_action [^142]: fw-tv188b-260827-0003-r24--php-framework.c151 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс FileChooserFilter с ключами (3): file_type_dir, file_extensions, check_writable [^143]: - fw-tv188b-261021-0117-r25--php-framework.c013 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Аннотации dune_api.php r25 задают поля FileChooserUiParams: with_network_folders — bool; with_network_browser — bool; new_folder_default_name — (char *). - fw-tv188b-261021-0117-r25--php-framework.c014 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Аннотации dune_api.php r25 задают поля PluginSystemActionData: handle_response — bool. [^144]: - fw-tv188b-261021-0117-r25--php-framework--native-actions.c020 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Нативная инициализация FileChooserUiParams задаёт with_network_folders=true и with_network_browser=true, оставляя with_favorite_folders=false и остальные поля нулевыми, включая new_folder_default_name=null. - fw-tv188b-261021-0117-r25--php-framework--native-actions.c022 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Если choose_file не получил ui_params, он создаёт FileChooserUiParams через ту же стандартную инициализацию, которая включает оба сетевых флага. [^145]: fw-tv188b-261021-0117-r25--php-framework--native-actions.c027 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Нативный choose_file вычисляет file_chooser_result_status как 0 при количестве выбранных URL больше нуля и 1 иначе. [^146]: fw-tv188b-261021-0117-r25--php-framework--native-actions.c010 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Нативный choose_file записывает в продолжение file_chooser_result_status из результата диалога и action_status=1 только при file_chooser_result_status=0, иначе action_status=0. [^147]: fw-tv188b-261021-0117-r25--php-framework--native-actions.c011 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Нативный choose_file передаёт продолжению число выбранных URL в file_chooser_result_urls_count и каждый URL в file_chooser_result_url_N с индексом от нуля. [^148]: fw-tv188b-261021-0117-r25--php-framework.c048 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · downloads SetupScreen::apply_dl_folder_url принимает результат выбора папки только при action_status=1, file_chooser_result_status=0, file_chooser_result_urls_count=1 и наличии file_chooser_result_url_0. [^149]: fw-tv188b-261021-0117-r25--php-framework.c050 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · downloads SetupScreen::edit_dl_folder_url и initial_choose_dl_folder_url передают choose_file dir_only=true, check_writable=true, nf_name=DEF_DL_FOLDER_NAME (dune_downloads) и with_network=true. [^150]: fw-tv188b-261021-0117-r25--downloads.c074 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 выбор «Скачать все файлы» без заданной папки загрузок (cookies плагина downloads нет) ведёт по цепочке entry.apply_open_magnet → entry.choose_enter_action → entry.add_dl → choose_file и открывает диалог выбора «Папка загрузок» со списком хранилищ (Встроенная память, Браузер сети, сетевые папки). [^151]: fw-tv188b-261021-0117-r25.c080 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 global_action plugin_system с run_string «bin/ga.sh boot» (путь относительно каталога плагина) оболочка исполняет как «Running system(sh /data/data/com.dunehd.app/flashdata/plugins/kb_probe5/bin/ga.sh boot)» — с префиксом sh и абсолютным путём каталога плагина. [^152]: fw-tv188b-261021-0117-r25.c081 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 скрипт global_action plugin_system (boot, boot_end, gui_start) работает под uid 1000(system) с SELinux-контекстом u:r:system_app:s0, текущим каталогом / и переменной окружения FS_PREFIX=/data/data/com.dunehd.app; $0 — абсолютный путь скрипта. [^153]: fw-tv188b-261021-0117-r25--php-framework.c014 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Аннотации dune_api.php r25 задают поля PluginSystemActionData: handle_response — bool. [^154]: fw-tv188b-261021-0117-r25--plugin-loader--native-contracts.c004 · code, disputed · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В plugin_system после safe_system, если команда не распознана фоновой и handle_response=true, наличие <поле plugin+0x14>/restart_needed_flag вызывает удаление флага и вызов 0x0069f754; проверка не зависит от кода завершения safe_system. [^155]: fw-tv188b-261021-0117-r25--plugin-loader--native-contracts.c003 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Обработчик plugin_system распознаёт фон после удаления хвостовых пробелов и необязательного суффикса echo $!: оставшаяся длина должна быть не меньше 2, последний символ — &, предпоследний — не &; при handle_response=true в этой ветви только пишет лог игнорирования ответа и не проверяет restart_needed_flag. [^156]: fw-tv188b-261021-0117-r25--plugin-loader--native-contracts.c005 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В plugin_system, если управление дошло до общего выхода 0x0025635c после команды и обработки handle_response, копия post_action записывается в выходной указатель, включая фон и ненулевой статус safe_system; null post_action остаётся null. [^157]: fw-tv188b-261021-0117-r25--plugin-loader--native-contracts.c010 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Если plugin_system достигает общего возврата 0x00256398, его нативный статус равен 0 при safe_system==0 и -1 при любом ненулевом safe_system; это отдельно от копирования post_action. [^158]: fw-tv188b-261021-0117-r25.c033 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Встроенный плагин s928x_dvfel (r25) — type plain, версия 2026.10.19.1-0.2.8; global_actions boot_end, install, update, uninstall запускают plugin_system bin/ctl.sh, причём install и update — с handle_response yes [^159]: fw-tv188b-261021-0117-r25--php-framework.c045 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · ctl.sh s928x_dvfel при изменении контрольной суммы libdvfelplay.so вне boot создаёт restart_needed_flag, только если прежняя actual_cksum непуста; при пустой прежней сумме удаляет флаг, а в boot эта ветка изменения флага пропускается. [^160]: fw-tv188b-261021-0117-r25--plugin-loader--native-contracts-2.c020 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В XML-конструкторе plugin_system отсутствие дочернего handle_response задаёт PluginSystemActionData::handle_response=false: конструктор передаёт умолчание 0, XML-помощник возвращает его при отсутствующем элементе. [^161]: fw-tv188b-261021-0117-r25.c374 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24, 261021_0117_r25 · В dune_api.php r25 присутствуют все 316 имён define и 167 классов из r24 (отсутствующих нет); в r25 — 331 define и 179 классов. [^162]: - fw-tv188b-260827-0003-r24--php-framework.c110 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php задаёт перечисление PluginOperationType строковыми константами: PLUGIN_OP_GET_FOLDER_VIEW='get_folder_view', PLUGIN_OP_GET_NEXT_FOLDER_VIEW='get_next_folder_view', PLUGIN_OP_GET_REGULAR_FOLDER_ITEMS='get_regular_folder_items', PLUGIN_OP_HANDLE_USER_INPUT='handle_user_input', PLUGIN_OP_GET_TV_INFO='get_tv_info', PLUGIN_OP_GET_DAY_EPG='get_day_epg', PLUGIN_OP_GET_TV_PLAYBACK_URL='get_tv_playback_url', PLUGIN_OP_GET_TV_STREAM_URL='get_tv_stream_url', PLUGIN_OP_CHANGE_TV_FAVORITES='change_tv_favorites', PLUGIN_OP_GET_VOD_INFO='get_vod_info', PLUGIN_OP_GET_VOD_STREAM_URL='get_vod_stream_url', PLUGIN_OP_GET_VOD_STREAM_INFO='get_vod_stream_info' - fw-tv188b-261021-0117-r25.c009 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · dune_api.php r25 вводит операцию плагина PLUGIN_OP_GET_FOLDER_ROWS='get_folder_rows' с выходным типом PLUGIN_OUT_DATA_PLUGIN_FOLDER_ROWS='plugin_folder_rows' и классы PluginFolderRowsInputData {media_url, row_ids} и PluginFolderRows {rows} [^163]: - fw-tv188b-260827-0003-r24--php-framework.c025 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · DunePluginFw::get_out_type_code($op_code) сопоставляет операции типам выходных данных: folder view → plugin_folder_view, regular folder items → plugin_regular_folder_range, handle_user_input и change_tv_favorites → gui_action, tv_info → plugin_tv_info, day_epg → plugin_tv_epg_program_list, *_url → url, vod_info → plugin_vod_info, vod_stream_info → plugin_stream_info - fw-tv188b-261021-0117-r25.c010 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · DunePluginFw::invoke_operation в r25 обрабатывает get_folder_rows: вызывает $plugin->get_folder_rows(media_url, row_ids), а если метода нет — бросает Exception «Method not found: get_folder_rows»; get_out_type_code сопоставляет операции тип plugin_folder_rows [^164]: - fw-tv188b-260827-0003-r24--php-framework.c008 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · DunePlugin::get_folder_view($media_url, &$plugin_cookies) и get_next_folder_view($media_url, &$plugin_cookies) возвращают PluginFolderView (по комментарию) - fw-tv188b-260827-0003-r24--php-framework.c020 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Для операций get_folder_view, get_next_folder_view, get_tv_info, get_tv_stream_url, get_vod_info, get_vod_stream_url при наличии input_data->sel_state и метода _v2 вызывается _v2($media_url, $sel_state, $plugin_cookies), иначе ($media_url, $plugin_cookies) [^165]: - fw-tv188b-260827-0003-r24--php-framework.c011 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · DunePlugin::get_regular_folder_items($media_url, $from_ndx, &$plugin_cookies) возвращает PluginRegularFolderRange (по комментарию) - fw-tv188b-260827-0003-r24--php-framework.c022 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Для change_tv_favorites тип операции берётся из input_data->fav_op_type, для get_day_epg — channel_id и day_start_tm_sec, для get_regular_folder_items — media_url и from_ndx [^166]: fw-tv188b-261021-0117-r25.c261 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 при ENTER на точке входа (key_enter → plugin_handle_user_input) input_data операции handle_user_input содержит selected_media_url и orig_selected_media_url, равные media_url этой точки входа, а также play_mode none и topmenu_root_id section:applications. [^167]: - fw-tv188b-260827-0003-r24--php-framework.c009 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · DunePlugin::get_tv_info($media_url, &$plugin_cookies) возвращает PluginTvInfo, get_tv_stream_url($media_url, &$plugin_cookies) — строку (по комментариям) - fw-tv188b-260827-0003-r24--php-framework.c020 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Для операций get_folder_view, get_next_folder_view, get_tv_info, get_tv_stream_url, get_vod_info, get_vod_stream_url при наличии input_data->sel_state и метода _v2 вызывается _v2($media_url, $sel_state, $plugin_cookies), иначе ($media_url, $plugin_cookies) [^168]: - fw-tv188b-260827-0003-r24--php-framework.c012 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · DunePlugin::get_day_epg($channel_id, $day_start_tm_sec, &$plugin_cookies) возвращает List (по комментарию) - fw-tv188b-260827-0003-r24--php-framework.c022 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Для change_tv_favorites тип операции берётся из input_data->fav_op_type, для get_day_epg — channel_id и day_start_tm_sec, для get_regular_folder_items — media_url и from_ndx [^169]: - fw-tv188b-260827-0003-r24--php-framework.c013 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · DunePlugin::get_tv_playback_url($channel_id, $archive_tm_sec, $protect_code, &$plugin_cookies) возвращает строку (по комментарию) - 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 [^170]: - fw-tv188b-260827-0003-r24--php-framework.c014 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · DunePlugin::change_tv_favorites($op_type, $channel_id, &$plugin_cookies) и handle_user_input(&$user_input, &$plugin_cookies) возвращают GuiAction (по комментариям) - fw-tv188b-260827-0003-r24--php-framework.c022 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Для change_tv_favorites тип операции берётся из input_data->fav_op_type, для get_day_epg — channel_id и day_start_tm_sec, для get_regular_folder_items — media_url и from_ndx [^171]: - fw-tv188b-260827-0003-r24--php-framework.c010 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · DunePlugin::get_vod_info($media_url, &$plugin_cookies) возвращает PluginVodInfo, get_vod_stream_url($media_url, &$plugin_cookies) — строку (по комментариям) - fw-tv188b-260827-0003-r24--php-framework.c020 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Для операций get_folder_view, get_next_folder_view, get_tv_info, get_tv_stream_url, get_vod_info, get_vod_stream_url при наличии input_data->sel_state и метода _v2 вызывается _v2($media_url, $sel_state, $plugin_cookies), иначе ($media_url, $plugin_cookies) [^172]: 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. [^173]: - 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.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 они есть [^174]: fw-tv188b-260827-0003-r24--php-framework.c213 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс PluginOutputData с ключами (6): has_data, data_type, data, plugin_cookies, is_error, error_action [^175]: - fw-tv188b-260827-0003-r24--php-framework.c111 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php задаёт перечисление PluginOutputDataType строковыми константами: PLUGIN_OUT_DATA_PLUGIN_FOLDER_VIEW='plugin_folder_view', PLUGIN_OUT_DATA_PLUGIN_REGULAR_FOLDER_RANGE='plugin_regular_folder_range', PLUGIN_OUT_DATA_GUI_ACTION='gui_action', PLUGIN_OUT_DATA_PLUGIN_TV_INFO='plugin_tv_info', PLUGIN_OUT_DATA_PLUGIN_TV_EPG_PROGRAM_LIST='plugin_tv_epg_program_list', PLUGIN_OUT_DATA_URL='url', PLUGIN_OUT_DATA_PLUGIN_VOD_INFO='plugin_vod_info', PLUGIN_OUT_DATA_PLUGIN_STREAM_INFO='plugin_stream_info' - fw-tv188b-260827-0003-r24--plugin-loader--gui-actions--json-outputs.c006 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · При индексе data_type = 0 json_materialize_output_data_from_json создаёт PluginFolderView (0x18 байта) и разбирает объект data функцией FUN_00233c00. [^176]: - fw-tv188b-260827-0003-r24--php-framework.c111 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php задаёт перечисление PluginOutputDataType строковыми константами: PLUGIN_OUT_DATA_PLUGIN_FOLDER_VIEW='plugin_folder_view', PLUGIN_OUT_DATA_PLUGIN_REGULAR_FOLDER_RANGE='plugin_regular_folder_range', PLUGIN_OUT_DATA_GUI_ACTION='gui_action', PLUGIN_OUT_DATA_PLUGIN_TV_INFO='plugin_tv_info', PLUGIN_OUT_DATA_PLUGIN_TV_EPG_PROGRAM_LIST='plugin_tv_epg_program_list', PLUGIN_OUT_DATA_URL='url', PLUGIN_OUT_DATA_PLUGIN_VOD_INFO='plugin_vod_info', PLUGIN_OUT_DATA_PLUGIN_STREAM_INFO='plugin_stream_info' - fw-tv188b-260827-0003-r24--plugin-loader--gui-actions--json-outputs.c007 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · При индексе data_type = 1 json_materialize_output_data_from_json создаёт PluginRegularFolderRange (0x14 байт) и разбирает объект data функцией FUN_00221a30. [^177]: - fw-tv188b-260827-0003-r24--php-framework.c111 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php задаёт перечисление PluginOutputDataType строковыми константами: PLUGIN_OUT_DATA_PLUGIN_FOLDER_VIEW='plugin_folder_view', PLUGIN_OUT_DATA_PLUGIN_REGULAR_FOLDER_RANGE='plugin_regular_folder_range', PLUGIN_OUT_DATA_GUI_ACTION='gui_action', PLUGIN_OUT_DATA_PLUGIN_TV_INFO='plugin_tv_info', PLUGIN_OUT_DATA_PLUGIN_TV_EPG_PROGRAM_LIST='plugin_tv_epg_program_list', PLUGIN_OUT_DATA_URL='url', PLUGIN_OUT_DATA_PLUGIN_VOD_INFO='plugin_vod_info', PLUGIN_OUT_DATA_PLUGIN_STREAM_INFO='plugin_stream_info' - fw-tv188b-260827-0003-r24--plugin-loader--gui-actions--json-outputs.c008 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · При индексе data_type = 2 json_materialize_output_data_from_json создаёт GuiAction (0x1c байт) и разбирает объект data функцией FUN_00222688. [^178]: - fw-tv188b-260827-0003-r24--php-framework.c111 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php задаёт перечисление PluginOutputDataType строковыми константами: PLUGIN_OUT_DATA_PLUGIN_FOLDER_VIEW='plugin_folder_view', PLUGIN_OUT_DATA_PLUGIN_REGULAR_FOLDER_RANGE='plugin_regular_folder_range', PLUGIN_OUT_DATA_GUI_ACTION='gui_action', PLUGIN_OUT_DATA_PLUGIN_TV_INFO='plugin_tv_info', PLUGIN_OUT_DATA_PLUGIN_TV_EPG_PROGRAM_LIST='plugin_tv_epg_program_list', PLUGIN_OUT_DATA_URL='url', PLUGIN_OUT_DATA_PLUGIN_VOD_INFO='plugin_vod_info', PLUGIN_OUT_DATA_PLUGIN_STREAM_INFO='plugin_stream_info' - fw-tv188b-260827-0003-r24--plugin-loader--gui-actions--json-outputs.c009 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · При индексе data_type = 3 json_materialize_output_data_from_json создаёт PluginTvInfo (0xac байт) и разбирает объект data функцией FUN_00236be4. [^179]: - fw-tv188b-260827-0003-r24--php-framework.c111 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php задаёт перечисление PluginOutputDataType строковыми константами: PLUGIN_OUT_DATA_PLUGIN_FOLDER_VIEW='plugin_folder_view', PLUGIN_OUT_DATA_PLUGIN_REGULAR_FOLDER_RANGE='plugin_regular_folder_range', PLUGIN_OUT_DATA_GUI_ACTION='gui_action', PLUGIN_OUT_DATA_PLUGIN_TV_INFO='plugin_tv_info', PLUGIN_OUT_DATA_PLUGIN_TV_EPG_PROGRAM_LIST='plugin_tv_epg_program_list', PLUGIN_OUT_DATA_URL='url', PLUGIN_OUT_DATA_PLUGIN_VOD_INFO='plugin_vod_info', PLUGIN_OUT_DATA_PLUGIN_STREAM_INFO='plugin_stream_info' - fw-tv188b-260827-0003-r24--plugin-loader--gui-actions--json-outputs.c010 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · При индексе data_type = 4 json_materialize_output_data_from_json создаёт список PluginTvEpgProgramList (FUN_002abc9c) и разбирает элементы PluginTvEpgProgram (0x20 байт) функцией FUN_00219e6c. [^180]: - fw-tv188b-260827-0003-r24--php-framework.c111 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php задаёт перечисление PluginOutputDataType строковыми константами: PLUGIN_OUT_DATA_PLUGIN_FOLDER_VIEW='plugin_folder_view', PLUGIN_OUT_DATA_PLUGIN_REGULAR_FOLDER_RANGE='plugin_regular_folder_range', PLUGIN_OUT_DATA_GUI_ACTION='gui_action', PLUGIN_OUT_DATA_PLUGIN_TV_INFO='plugin_tv_info', PLUGIN_OUT_DATA_PLUGIN_TV_EPG_PROGRAM_LIST='plugin_tv_epg_program_list', PLUGIN_OUT_DATA_URL='url', PLUGIN_OUT_DATA_PLUGIN_VOD_INFO='plugin_vod_info', PLUGIN_OUT_DATA_PLUGIN_STREAM_INFO='plugin_stream_info' - fw-tv188b-260827-0003-r24--plugin-loader--gui-actions--json-outputs.c011 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · При индексе data_type = 5 json_materialize_output_data_from_json читает data как строку функцией FUN_00151550 и сохраняет указатель на неё в поле data. [^181]: - fw-tv188b-260827-0003-r24--php-framework.c111 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php задаёт перечисление PluginOutputDataType строковыми константами: PLUGIN_OUT_DATA_PLUGIN_FOLDER_VIEW='plugin_folder_view', PLUGIN_OUT_DATA_PLUGIN_REGULAR_FOLDER_RANGE='plugin_regular_folder_range', PLUGIN_OUT_DATA_GUI_ACTION='gui_action', PLUGIN_OUT_DATA_PLUGIN_TV_INFO='plugin_tv_info', PLUGIN_OUT_DATA_PLUGIN_TV_EPG_PROGRAM_LIST='plugin_tv_epg_program_list', PLUGIN_OUT_DATA_URL='url', PLUGIN_OUT_DATA_PLUGIN_VOD_INFO='plugin_vod_info', PLUGIN_OUT_DATA_PLUGIN_STREAM_INFO='plugin_stream_info' - fw-tv188b-260827-0003-r24--plugin-loader--gui-actions--json-outputs.c012 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · При индексе data_type = 6 json_materialize_output_data_from_json создаёт PluginVodInfo (100 байт) и разбирает объект data функцией FUN_0023a8d4. [^182]: - fw-tv188b-260827-0003-r24--php-framework.c111 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php задаёт перечисление PluginOutputDataType строковыми константами: PLUGIN_OUT_DATA_PLUGIN_FOLDER_VIEW='plugin_folder_view', PLUGIN_OUT_DATA_PLUGIN_REGULAR_FOLDER_RANGE='plugin_regular_folder_range', PLUGIN_OUT_DATA_GUI_ACTION='gui_action', PLUGIN_OUT_DATA_PLUGIN_TV_INFO='plugin_tv_info', PLUGIN_OUT_DATA_PLUGIN_TV_EPG_PROGRAM_LIST='plugin_tv_epg_program_list', PLUGIN_OUT_DATA_URL='url', PLUGIN_OUT_DATA_PLUGIN_VOD_INFO='plugin_vod_info', PLUGIN_OUT_DATA_PLUGIN_STREAM_INFO='plugin_stream_info' - fw-tv188b-260827-0003-r24--plugin-loader--gui-actions--json-outputs.c013 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · При индексе data_type = 7 json_materialize_output_data_from_json создаёт PluginStreamInfo (8 байт), читает строку url и список markers; элементы StreamMarker (0x14 байт) разбирает FUN_002223f0. [^183]: - fw-tv188b-261021-0117-r25.c009 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · dune_api.php r25 вводит операцию плагина PLUGIN_OP_GET_FOLDER_ROWS='get_folder_rows' с выходным типом PLUGIN_OUT_DATA_PLUGIN_FOLDER_ROWS='plugin_folder_rows' и классы PluginFolderRowsInputData {media_url, row_ids} и PluginFolderRows {rows} - fw-tv188b-261021-0117-r25--plugin-loader.c005 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В strings libduneshell.so r25 присутствуют get_folder_rows, plugin_folder_rows, row_ids и plugin_folder_rows_input_data_create. [^184]: fw-tv188b-260827-0003-r24--php-framework.c105 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php задаёт перечисление GuiEventKind строковыми константами: GUI_EVENT_KEY_ENTER='key_enter', GUI_EVENT_KEY_PLAY='key_play', GUI_EVENT_KEY_A_RED='key_a_red', GUI_EVENT_KEY_B_GREEN='key_b_green', GUI_EVENT_KEY_C_YELLOW='key_c_yellow', GUI_EVENT_KEY_D_BLUE='key_d_blue', GUI_EVENT_KEY_POPUP_MENU='key_popup_menu', GUI_EVENT_KEY_INFO='key_info', GUI_EVENT_KEY_LEFT='key_left', GUI_EVENT_KEY_RIGHT='key_right', GUI_EVENT_KEY_UP='key_up', GUI_EVENT_KEY_DOWN='key_down', GUI_EVENT_KEY_P_PLUS='key_p_plus', GUI_EVENT_KEY_P_MINUS='key_p_minus', GUI_EVENT_KEY_NEXT='key_next', GUI_EVENT_KEY_PREV='key_prev', GUI_EVENT_KEY_FIP_NEXT='key_fip_next', GUI_EVENT_KEY_FIP_PREV='key_fip_prev', GUI_EVENT_KEY_SETUP='key_setup', GUI_EVENT_KEY_RETURN='key_return', GUI_EVENT_KEY_SELECT='key_select', GUI_EVENT_KEY_CLEAR='key_clear', GUI_EVENT_KEY_PAUSE='key_pause', GUI_EVENT_KEY_FWD='key_fwd', GUI_EVENT_KEY_REW='key_rew', GUI_EVENT_KEY_SLOW='key_slow', GUI_EVENT_KEY_STOP='key_stop', GUI_EVENT_KEY_TOP_MENU='key_top_menu', GUI_EVENT_KEY_POWER='key_power', GUI_EVENT_KEY_EJECT='key_eject', GUI_EVENT_KEY_MODE='key_mode', GUI_EVENT_KEY_VENDOR='key_vendor', GUI_EVENT_KEY_SHUFFLE='key_shuffle', GUI_EVENT_KEY_MUSIC='key_music', GUI_EVENT_KEY_MUTE='key_mute', GUI_EVENT_KEY_V_PLUS='key_v_plus', GUI_EVENT_KEY_V_MINUS='key_v_minus', GUI_EVENT_KEY_SEARCH='key_search', GUI_EVENT_KEY_ZOOM='key_zoom', GUI_EVENT_KEY_SUBTITLE='key_subtitle', GUI_EVENT_KEY_REPEAT='key_repeat', GUI_EVENT_KEY_AUDIO='key_audio', GUI_EVENT_KEY_REC='key_rec', GUI_EVENT_KEY_DUNE='key_dune', GUI_EVENT_KEY_FAVORITES='key_favorites', GUI_EVENT_KEY_URL='key_url', GUI_EVENT_KEY_0='key_0', GUI_EVENT_KEY_1='key_1', GUI_EVENT_KEY_2='key_2', GUI_EVENT_KEY_3='key_3', GUI_EVENT_KEY_4='key_4', GUI_EVENT_KEY_5='key_5', GUI_EVENT_KEY_6='key_6', GUI_EVENT_KEY_7='key_7', GUI_EVENT_KEY_8='key_8', GUI_EVENT_KEY_9='key_9', GUI_EVENT_UI_ACTION='ui_action', GUI_EVENT_TIMER='timer', GUI_EVENT_PLUGIN_ROWS_INFO_UPDATE='plugin_rows_info_update', GUI_EVENT_FOLDER_LEAVE='folder_leave', GUI_EVENT_FOLDER_ENTER='folder_enter', GUI_EVENT_FOLDER_RETURN_BACK='folder_return_back', GUI_EVENT_PLAYBACK_STOP='playback_stop', GUI_EVENT_PLAYBACK_GOING_TO_SWITCH='playback_going_to_switch', GUI_EVENT_PLAYBACK_SWITCHED='playback_switched', GUI_EVENT_PLAYBACK_USER_ACTION='playback_user_action', GUI_EVENT_PLAYBACK_STATE_CHANGED='playback_state_changed', GUI_EVENT_MENU_PLAYBACK_OSD_CLOSED='menu_playback_osd_closed', GUI_EVENT_MENU_PLAYBACK_OSD_GOING_TO_OPEN='menu_playback_osd_going_to_open', GUI_EVENT_MENU_PLAYBACK_FINISH='menu_playback_finish', GUI_EVENT_MENU_EXT_APP_FINISH='menu_ext_app_finish', GUI_EVENT_WEB_BROWSER_FINISH='web_browser_finish', GUI_EVENT_BOOT='boot', GUI_EVENT_BOOT_END='boot_end', GUI_EVENT_INSTALL='install', GUI_EVENT_UPDATE='update', GUI_EVENT_UNINSTALL='uninstall', GUI_EVENT_GOING_TO_UPDATE='going_to_update', GUI_EVENT_GOING_TO_STOP='going_to_stop', GUI_EVENT_GUI_START='gui_start', GUI_EVENT_EARLY_GUI_START='early_gui_start', GUI_EVENT_STORAGE_DETECTED_MENU='storage_detected_menu', GUI_EVENT_FILE_POPUP_MENU='file_popup_menu', GUI_EVENT_TOPMENU_POPUP_MENU='topmenu_popup_menu', GUI_EVENT_TOPMENU_REFRESH='topmenu_refresh', GUI_EVENT_GOING_TO_RELOAD_ALL_FOLDERS='going_to_reload_all_folders', GUI_EVENT_FAVORITES_UPDATED='favorites_updated', GUI_EVENT_NETWORK_CHANGE='network_change', GUI_EVENT_SETTINGS_UPDATED='settings_updated', GUI_EVENT_CONFIRM_UPDATE='confirm_update', GUI_EVENT_SHUTDOWN='shutdown' [^185]: fw-tv188b-260827-0003-r24--php-framework.c083 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет константы VALIGN_*: VALIGN_TOP=0, VALIGN_CENTER=1, VALIGN_BOTTOM=2 [^186]: fw-tv188b-260827-0003-r24--php-framework.c084 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет константы HALIGN_*: HALIGN_LEFT=0, HALIGN_CENTER=1, HALIGN_RIGHT=2 [^187]: fw-tv188b-260827-0003-r24--php-framework.c085 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет константы FONT_SIZE_*: FONT_SIZE_NORMAL=0, FONT_SIZE_SMALL=1, FONT_SIZE_LARGE=4 [^188]: fw-tv188b-260827-0003-r24--php-framework.c086 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет константы CYCLE_MODE_GAP_*: CYCLE_MODE_GAP_AUTO=0, CYCLE_MODE_GAP_YES=1, CYCLE_MODE_GAP_NO=2 [^189]: fw-tv188b-260827-0003-r24--php-framework.c087 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет константы ORIENTATION_*: ORIENTATION_VERTICAL=0, ORIENTATION_HORIZONTAL=1 [^190]: fw-tv188b-260827-0003-r24--php-framework.c088 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет константы USE_TZ_*: USE_TZ_GMT=0, USE_TZ_LOCAL=1, USE_TZ_NONE=2 [^191]: fw-tv188b-260827-0003-r24--php-framework.c089 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет константы EPG_*: EPG_START_OVER_ENABLED=4, EPG_START_OVER_DISABLED=8, EPG_TRICK_PLAY_ENABLED=16 [^192]: fw-tv188b-260827-0003-r24--php-framework.c091 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет константы CHANGE_OP_*: CHANGE_OP_ADD=2, CHANGE_OP_DELETE=3, CHANGE_OP_DELETE_ANDROID_APPS_EXCEPT=101, CHANGE_OP_NOP=0, CHANGE_OP_REPLACE=1, CHANGE_OP_TOGGLE=4 [^193]: fw-tv188b-260827-0003-r24--php-framework.c092 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет константы EDIT_LIST_CONFIG_OPT_*: EDIT_LIST_CONFIG_OPT_ALLOW_EMPTY=0x2, EDIT_LIST_CONFIG_OPT_REMOVE_UNCHECKED=0x1, EDIT_LIST_CONFIG_OPT_WITH_DEFAULT=0x4 [^194]: fw-tv188b-260827-0003-r24--php-framework.c093 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет константы GCOMP_GEOM_OPT_*: GCOMP_GEOM_OPT_NON_NEGATIVE_X=0x1, GCOMP_GEOM_OPT_NON_NEGATIVE_Y=0x2 [^195]: - fw-tv188b-260827-0003-r24--php-framework.c094 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет константы GCOMP_OPT_*: GCOMP_OPT_APPEAR_WITH_FADE=0x100, GCOMP_OPT_BG_PICTURE=0x8, GCOMP_OPT_DEBUG_FRAME=0x01000000, GCOMP_OPT_EMPTY_WITH_VIDEO=0x20, GCOMP_OPT_FOCUS=0x100000, GCOMP_OPT_IMG_CHECK_EFF_URL=0x200000, GCOMP_OPT_NO_CLIP=0x4, GCOMP_OPT_NO_PREPAINT=0x2, GCOMP_OPT_PREPAINT=0x1, GCOMP_OPT_TRANSPARENT_WITH_VIDEO=0x10, GCOMP_OPT_TTF_COMPACT_HEIGHT=0x2000, GCOMP_OPT_TTF_LAYOUT_FIX=0x1000, GCOMP_OPT_TTF_QUALITY_WRAP=0x4000 - fw-tv188b-261021-0117-r25.c011 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · dune_api.php r25 описывает строки с ленивой подгрузкой: тип строки PLUGIN_ROW_TYPE_DUP='row_dup', опции PLUGIN_ROW_OPT_LOADING=0x4 и PLUGIN_ROW_OPT_OPTIMIZE_INVISIBLE=0x8, поле PluginRowsPane::row_dup_map, PluginFolderView::type_mask и GCOMP_OPT_STUB=0x400000 [^196]: - fw-tv188b-260827-0003-r24--php-framework.c095 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет константы PLUGIN_ROW_OPT_*: PLUGIN_ROW_OPT_FIRST_IN_CLUSTER=0x1, PLUGIN_ROW_OPT_FIRST_WITH_INFO=0x2 - fw-tv188b-261021-0117-r25.c011 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · dune_api.php r25 описывает строки с ленивой подгрузкой: тип строки PLUGIN_ROW_TYPE_DUP='row_dup', опции PLUGIN_ROW_OPT_LOADING=0x4 и PLUGIN_ROW_OPT_OPTIMIZE_INVISIBLE=0x8, поле PluginRowsPane::row_dup_map, PluginFolderView::type_mask и GCOMP_OPT_STUB=0x400000 [^197]: fw-tv188b-260827-0003-r24--php-framework.c096 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php задаёт перечисление DialogFrameStyle строковыми константами: DIALOG_FRAME_STYLE_DEFAULT='default', DIALOG_FRAME_STYLE_GLASS='glass', DIALOG_FRAME_STYLE_TRANSPARENT='transparent', DIALOG_FRAME_STYLE_PLAYBACK_INFO='playback_info' [^198]: fw-tv188b-260827-0003-r24--php-framework.c097 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php задаёт перечисление GCompFocusType строковыми константами: GCOMP_FOCUS_NONE='none', GCOMP_FOCUS_SYSTEM='system', GCOMP_FOCUS_DEFAULT_CUT_IMAGE='default_cut_image', GCOMP_FOCUS_INACTIVE_CUT_IMAGE='inactive_cut_image', GCOMP_FOCUS_DEFAULT_RECT='default_rect', GCOMP_FOCUS_RECT2='rect2', GCOMP_FOCUS_RECT3='rect3' [^199]: fw-tv188b-260827-0003-r24--php-framework.c098 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php задаёт перечисление GCompItemType строковыми константами: GCOMP_ITEM_REGULAR='regular', GCOMP_ITEM_LABEL='label', GCOMP_ITEM_BUTTON='button', GCOMP_ITEM_TEXT_FIELD='text_field' [^200]: fw-tv188b-260827-0003-r24--php-framework.c099 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php задаёт перечисление GCompLayoutRole строковыми константами: GCOMP_LAYOUT_UNSET='unset', GCOMP_LAYOUT_TOP='top', GCOMP_LAYOUT_BOTTOM='bottom', GCOMP_LAYOUT_LEFT='left', GCOMP_LAYOUT_RIGHT='right', GCOMP_LAYOUT_CENTER='center' [^201]: fw-tv188b-260827-0003-r24--php-framework.c100 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php задаёт перечисление GCompTextFit строковыми константами: GCOMP_TEXT_FIT_CROP='crop', GCOMP_TEXT_FIT_INSERT_ELLIPSIS='insert_ellipsis', GCOMP_TEXT_FIT_APPEND_ELLIPSIS='append_ellipsis' [^202]: fw-tv188b-260827-0003-r24--php-framework.c101 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php задаёт перечисление GCompTransition строковыми константами: GCOMP_TRANSITION_NONE='none', GCOMP_TRANSITION_LAST_STEP='last_step', GCOMP_TRANSITION_DEFAULT='default', GCOMP_TRANSITION_FADE='fade' [^203]: fw-tv188b-260827-0003-r24--php-framework.c102 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php задаёт перечисление GComponentKind строковыми константами: GCOMPONENT_LABEL='label', GCOMPONENT_TTF_LABEL='ttf_label', GCOMPONENT_RECT='rect', GCOMPONENT_IMAGE='image', GCOMPONENT_CUT_IMAGE='cut_image', GCOMPONENT_SANDWICH='sandwich', GCOMPONENT_BUTTON='button', GCOMPONENT_TEXT_FIELD='text_field', GCOMPONENT_PANEL='panel', GCOMPONENT_SCROLL_PANE='scroll_pane', GCOMPONENT_PREPAINT_PANE='prepaint_pane', GCOMPONENT_SCROLLBAR='scrollbar' [^204]: fw-tv188b-260827-0003-r24--php-framework.c103 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php задаёт перечисление GCompsFlipEffect строковыми константами: GCOMPS_FLIP_EFFECT_NONE='none', GCOMPS_FLIP_EFFECT_FADE='fade', GCOMPS_FLIP_EFFECT_FADE_OUT_SCALED='fade_out_scaled' [^205]: fw-tv188b-260827-0003-r24--php-framework.c104 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php задаёт перечисление GuiControlKind строковыми константами: GUI_CONTROL_LABEL='label', GUI_CONTROL_PROGRESS_BAR='progress_bar', GUI_CONTROL_COMBOBOX='combobox', GUI_CONTROL_TEXT_FIELD='text_field', GUI_CONTROL_BUTTON='button', GUI_CONTROL_VGAP='vgap' [^206]: fw-tv188b-260827-0003-r24--php-framework.c106 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php задаёт перечисление PluginEpgMode строковыми константами: PLUGIN_EPG_DISABLED='disabled', PLUGIN_EPG_USE_DAY_REQUEST='use_day_request', PLUGIN_EPG_GET_FROM_STREAM='get_from_stream', PLUGIN_EPG_USE_DVB_PROVIDER='use_dvb_provider' [^207]: fw-tv188b-260827-0003-r24--php-framework.c107 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php задаёт перечисление PluginFavoritesOpType строковыми константами: PLUGIN_FAVORITES_OP_ADD='add', PLUGIN_FAVORITES_OP_REMOVE='remove', PLUGIN_FAVORITES_OP_MOVE_UP='move_up', PLUGIN_FAVORITES_OP_MOVE_DOWN='move_down' [^208]: fw-tv188b-260827-0003-r24--php-framework.c108 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php задаёт перечисление PluginFolderViewKind строковыми константами: PLUGIN_FOLDER_VIEW_REGULAR='view_regular', PLUGIN_FOLDER_VIEW_CONTROLS='view_controls', PLUGIN_FOLDER_VIEW_MOVIE='view_movie', PLUGIN_FOLDER_VIEW_GCOMPS='view_gcomps', PLUGIN_FOLDER_VIEW_ROWS='view_rows' [^209]: fw-tv188b-260827-0003-r24--php-framework.c109 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php задаёт перечисление PluginFontSize строковыми константами: PLUGIN_FONT_NORMAL='normal', PLUGIN_FONT_SMALL='small' [^210]: - fw-tv188b-260827-0003-r24--php-framework.c112 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php задаёт перечисление PluginRowType строковыми константами: PLUGIN_ROW_TYPE_VGAP='row_vgap', PLUGIN_ROW_TYPE_GCOMPS='row_gcomps', PLUGIN_ROW_TYPE_REGULAR='row_regular', PLUGIN_ROW_TYPE_TITLE='row_title' - fw-tv188b-261021-0117-r25.c011 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · dune_api.php r25 описывает строки с ленивой подгрузкой: тип строки PLUGIN_ROW_TYPE_DUP='row_dup', опции PLUGIN_ROW_OPT_LOADING=0x4 и PLUGIN_ROW_OPT_OPTIMIZE_INVISIBLE=0x8, поле PluginRowsPane::row_dup_map, PluginFolderView::type_mask и GCOMP_OPT_STUB=0x400000 [^211]: - 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.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 они есть [^212]: - fw-tv188b-261021-0117-r25.c012 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · dune_api.php r25 вводит файловые команды для действия fs_ctl: перечисление FsCmdKind (resolve_url, stat, scandir, get_file) и классы FsCtlActionData {cmd, output_path, post_action}, FsCmdDef {kind, specific_def}, FsResolveUrlDef {url, try_mount_if_needed}, FsStatDef {path}, FsScandirDef {path, with_stat, max_items_count}, FsGetFileDef {path, target_path, skip, max_size, chunk_size} - fw-tv188b-261021-0117-r25--plugin-loader.c021 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В strings libduneshell.so r25 присутствуют четыре выражения def->kind == FS_CMD_RESOLVE_URL, FS_CMD_STAT, FS_CMD_SCANDIR и FS_CMD_GET_FILE. [^213]: fw-tv188b-260827-0003-r24--php-framework.c022 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Для change_tv_favorites тип операции берётся из input_data->fav_op_type, для get_day_epg — channel_id и day_start_tm_sec, для get_regular_folder_items — media_url и from_ndx [^214]: fw-tv188b-261021-0117-r25--plugin-loader.c021 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В strings libduneshell.so r25 присутствуют четыре выражения def->kind == FS_CMD_RESOLVE_URL, FS_CMD_STAT, FS_CMD_SCANDIR и FS_CMD_GET_FILE. [^215]: doc-sdk-plugins--gui-actions.c033 · doc · any-documented; прошивка — · PluginOpenFolderAction открывает папку плагина: caption добавляется в блок пути, выполняется операция Get_folder_view($media_url), её результат показывается как содержимое папки [^216]: doc-sdk-plugins--gui-actions.c034 · doc · any-documented; прошивка — · Если media_url в PluginOpenFolderAction равен null, используется media_url выбранного элемента папки; если элемент не выбран, действие игнорируется [^217]: - 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' - fw-tv188b-260827-0003-r24--php-framework.c211 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс PluginOpenFolderActionData с ключами (7): caption, media_url, id, sel_id, tags, keep_osd_context, post_action - fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c001 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · ActionFactory::open_folder_ext строит действие plugin_open_folder; схема заполнения использует PluginOpenFolderActionData::{media_url, caption, id, post_action, sel_id, tags}. sel_id при isset; tags=[movie_id:] только для screen_id=MovieScreen::ID. [^218]: doc-sdk-plugins--gui-actions.c097 · doc · any-documented; прошивка — · OpenFolder (данные OpenFolderActionData с необязательным media_url) открывает обычную (не плагинную) папку; без media_url выбранный элемент открывается обычным образом; доступно с прошивки 130315_b6 [^219]: - 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' - fw-tv188b-260827-0003-r24--php-framework.c195 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс OpenFolderActionData с ключами (2): media_url, caption - doc-sdk-plugins--gui-actions.c155 · code · unknown; прошивка — · ActionFactory::open_general_folder плагина polsky-tv формирует действие типа OpenFolder с handler_string_id = OPEN_FOLDER_ACTION_ID и data из поля класса OpenFolderActionData::media_url. [^220]: fw-tv188b-261021-0117-r25--php-framework--native-actions.c063 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Фабрика exit_folders плагина downloads строит plugin_exit_folders с data count и post_action, но при неопределённой константе PluginExitFoldersActionData::count вместо действия возвращает post_action; манифест downloads ставит plugin_exit_folders в global_actions install и update. [^221]: - 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' - fw-tv188b-260827-0003-r24--php-framework.c200 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс PluginExitFoldersActionData с ключами (2): count, post_action - 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 они есть [^222]: fw-tv188b-261021-0117-r25--php-framework--native-actions.c065 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Фабрика replace_path shell_ext строит plugin_replace_path с data erase_count, elements и post_action (sel_id из PluginReplacePathActionData не передаёт); единственный вызывающий — PathHelper::update_movie_file_matching_path: erase_count = get_movie_screens_count(), elements — элементы пути (media_url, caption, id) нового фильма. [^223]: - 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' - fw-tv188b-260827-0003-r24--php-framework.c225 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс PluginReplacePathActionData с ключами (4): erase_count, elements, sel_id, post_action - fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c041 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · ActionFactory::replace_path строит действие plugin_replace_path; схема заполнения использует PluginReplacePathActionData::{erase_count, elements, post_action}. [^224]: fw-tv188b-261021-0117-r25--php-framework--native-actions.c067 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Фабрика rename_path строит rename_path с data caption и post_action; shell_ext выдаёт её после успешного rename_mc_folder: close_dialog_and_run(rename_path($caption, invalidate_all_folders(...))). [^225]: - fw-tv188b-260827-0003-r24--php-framework.c117 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php (раздел «GUI-action ids») определяет идентификаторы действий GUI: PLUGIN_TV_SELECT_CHANNEL_ACTION_ID='plugin_tv_select_channel', PLUGIN_UPDATE_ARCHIVE_CACHE_ACTION_ID='plugin_update_archive_cache', PLUGIN_UPDATE_EPF_MAPPING_ACTION_ID='plugin_update_epf_mapping', PLUGIN_UPDATE_EPG_ACTION_ID='plugin_update_epg', PLUGIN_UPDATE_FOLDER_ACTION_ID='plugin_update_folder', PLUGIN_UPDATE_INFO_BLOCK_ACTION_ID='plugin_update_info_block', PLUGIN_UPDATE_OSD_ACTION_ID='plugin_update_osd', PLUGIN_UPDATE_ROWS_INFO_ACTION_ID='plugin_update_rows_info', PLUGIN_UPDATE_ROWS_MENU_ACTION_ID='plugin_update_rows_menu', PLUGIN_UPDATE_STICKER_ACTION_ID='plugin_update_sticker', PLUGIN_UPDATE_TV_INFO_ACTION_ID='plugin_update_tv_info', PLUGIN_VOD_PLAY_ACTION_ID='plugin_vod_play', REMOVE_FROM_FAVORITES_ACTION_ID='remove_from_favorites', RENAME_MENU_ITEM_ACTION_ID='rename_menu_item', RENAME_PATH_ACTION_ID='rename_path' - fw-tv188b-260827-0003-r24--php-framework.c258 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс RenamePathActionData с ключами (2): caption, post_action - fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c039 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · ActionFactory::rename_path строит действие rename_path; схема заполнения использует RenamePathActionData::{caption, post_action}. [^226]: doc-sdk-plugins--gui-actions.c072 · doc · any-documented; прошивка — · PluginInvalidateFolders очищает кэш папок плагина с указанными media_urls, заставляя полностью перезагрузить их; некэшированные media_url игнорируются [^227]: - 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' - fw-tv188b-260827-0003-r24--php-framework.c207 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс PluginInvalidateFoldersActionData с ключами (4): media_urls, all_except, repopulate, post_action - fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c017 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · ActionFactory::invalidate_folders строит действие plugin_invalidate_folders; схема заполнения использует PluginInvalidateFoldersActionData::{media_urls, post_action, all_except}. [^228]: doc-sdk-plugins--gui-actions.c069 · doc · any-documented; прошивка — · PluginUpdateFolderAction частично заменяет состояние текущей регулярной папки плагина: при need_refresh очищается кэш состояния папки, применяется переданный range, при sel_ndx >= 0 фокус переходит на элемент с этим индексом [^229]: - fw-tv188b-260827-0003-r24--php-framework.c117 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php (раздел «GUI-action ids») определяет идентификаторы действий GUI: PLUGIN_TV_SELECT_CHANNEL_ACTION_ID='plugin_tv_select_channel', PLUGIN_UPDATE_ARCHIVE_CACHE_ACTION_ID='plugin_update_archive_cache', PLUGIN_UPDATE_EPF_MAPPING_ACTION_ID='plugin_update_epf_mapping', PLUGIN_UPDATE_EPG_ACTION_ID='plugin_update_epg', PLUGIN_UPDATE_FOLDER_ACTION_ID='plugin_update_folder', PLUGIN_UPDATE_INFO_BLOCK_ACTION_ID='plugin_update_info_block', PLUGIN_UPDATE_OSD_ACTION_ID='plugin_update_osd', PLUGIN_UPDATE_ROWS_INFO_ACTION_ID='plugin_update_rows_info', PLUGIN_UPDATE_ROWS_MENU_ACTION_ID='plugin_update_rows_menu', PLUGIN_UPDATE_STICKER_ACTION_ID='plugin_update_sticker', PLUGIN_UPDATE_TV_INFO_ACTION_ID='plugin_update_tv_info', PLUGIN_VOD_PLAY_ACTION_ID='plugin_vod_play', REMOVE_FROM_FAVORITES_ACTION_ID='remove_from_favorites', RENAME_MENU_ITEM_ACTION_ID='rename_menu_item', RENAME_PATH_ACTION_ID='rename_path' - fw-tv188b-260827-0003-r24--php-framework.c245 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс PluginUpdateFolderActionData с ключами (3): range, need_refresh, sel_ndx - fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c022 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · ActionFactory::update_regular_folder строит действие plugin_update_folder; схема заполнения использует PluginUpdateFolderActionData::{range, need_refresh, sel_ndx}. need_refresh=false; sel_ndx=-1, приводится к int. [^230]: doc-sdk-plugins--gui-actions.c064 · doc · any-documented; прошивка — · ResetControlsAction заменяет состояние текущего диалога с контролами или папки с контролами; вне их игнорируется [^231]: - fw-tv188b-260827-0003-r24--php-framework.c118 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php (раздел «GUI-action ids») определяет идентификаторы действий GUI: RESET_CONTROLS_ACTION_ID='reset_controls', RESTART_ACTION_ID='restart', RUN_BUILTIN_ACTION_ID='run_builtin', RUN_DEFAULT_ACTION_ID='run_default', SET_RESTRICTED_ACTION_ID='set_restricted', SET_TIME_ZONE_ACTION_ID='set_time_zone', SHOW_BLACK_SCREEN_ACTION_ID='show_black_screen', SHOW_DIALOG_ACTION_ID='show_dialog', SHOW_GCOMPS_DIALOG_ACTION_ID='show_gcomps', SHOW_MAIN_SCREEN_ACTION_ID='show_main_screen', SHOW_POPUP_MENU_ACTION_ID='show_popup_menu', SLEEP_ACTION_ID='sleep', START_SERVICE_ACTION_ID='start_service', STATUS_ACTION_ID='status', STOP_PLAYBACK_ACTION_ID='stop_playback' - fw-tv188b-260827-0003-r24--php-framework.c259 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс ResetControlsActionData с ключами (4): defs, initial_sel_ndx, keep_inner_state, post_action - fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c024 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · ActionFactory::reset_controls строит действие reset_controls; схема заполнения использует ResetControlsActionData::{defs, initial_sel_ndx, post_action}. [^232]: doc-sdk-plugins--gui-actions.c096 · doc · any-documented; прошивка — · В ChangeBehaviour заданное actions заменяет существующую карту действий, а заданный таймер перезапускается от текущего момента [^233]: - fw-tv188b-260827-0003-r24--php-framework.c114 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php (раздел «GUI-action ids») определяет идентификаторы действий GUI: ADD_MENU_ITEMS_ACTION_ID='add_menu_items', ADD_TO_FAVORITES_ACTION_ID='add_to_favorites', BLURAY_PLAY_ACTION_ID='bluray_play', BT_COMMAND_ACTION_ID='bt_command', CHANGE_BEHAVIOUR_ACTION_ID='change_behaviour', CHANGE_GCOMPS_ACTION_ID='change_gcomps', CHANGE_LIST_CONFIG_ACTION_ID='change_list_config', CHANGE_MOVIE_DATA_ACTION_ID='change_movie_data', CHANGE_PARENTAL_CODE_ACTION_ID='change_parental_code', CHANGE_SETTINGS_ACTION_ID='change_settings', CHECK_RESTRICTED_ACTION_ID='check_restricted', CHECK_SYSTEM_STORAGE_ACTION_ID='check_system_storage', CHOOSE_FILE_ACTION_ID='choose_file', CLEAR_WATCH_HISTORY_ACTION_ID='clear_watch_history', CLOSE_AND_RUN_ACTION_ID='close_and_run' - fw-tv188b-260827-0003-r24--php-framework.c126 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс ChangeBehaviourActionData с ключами (3): actions, timer, post_action - fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c035 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · ActionFactory::change_behaviour строит действие change_behaviour; схема заполнения использует ChangeBehaviourActionData::{actions, timer, post_action}. Перед построением вызывает GlobalActionMap::add_actions(actions). [^234]: - fw-tv188b-260827-0003-r24--php-framework.c114 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php (раздел «GUI-action ids») определяет идентификаторы действий GUI: ADD_MENU_ITEMS_ACTION_ID='add_menu_items', ADD_TO_FAVORITES_ACTION_ID='add_to_favorites', BLURAY_PLAY_ACTION_ID='bluray_play', BT_COMMAND_ACTION_ID='bt_command', CHANGE_BEHAVIOUR_ACTION_ID='change_behaviour', CHANGE_GCOMPS_ACTION_ID='change_gcomps', CHANGE_LIST_CONFIG_ACTION_ID='change_list_config', CHANGE_MOVIE_DATA_ACTION_ID='change_movie_data', CHANGE_PARENTAL_CODE_ACTION_ID='change_parental_code', CHANGE_SETTINGS_ACTION_ID='change_settings', CHECK_RESTRICTED_ACTION_ID='check_restricted', CHECK_SYSTEM_STORAGE_ACTION_ID='check_system_storage', CHOOSE_FILE_ACTION_ID='choose_file', CLEAR_WATCH_HISTORY_ACTION_ID='clear_watch_history', CLOSE_AND_RUN_ACTION_ID='close_and_run' - fw-tv188b-260827-0003-r24--php-framework.c129 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс ChangeGCompsActionData с ключами (11): change_defs, window_change, interrupt_disabled, num_steps, flip_effect, duration_multiplier, small_state_text, sel_state, ui_state, skip_repaint, post_action - fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c065 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · ActionFactory::change_gcomps строит действие change_gcomps; схема заполнения использует ChangeGCompsActionData::{change_defs, num_steps, sel_state, window_change, interrupt_disabled, small_state_text, ui_state, skip_repaint, post_action}. sel_state берётся из get_cur_sel_state_str(); num_steps=0; дополнительные поля по истинности, skip_repaint записывается как true. [^235]: - fw-tv188b-260827-0003-r24--php-framework.c117 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php (раздел «GUI-action ids») определяет идентификаторы действий GUI: PLUGIN_TV_SELECT_CHANNEL_ACTION_ID='plugin_tv_select_channel', PLUGIN_UPDATE_ARCHIVE_CACHE_ACTION_ID='plugin_update_archive_cache', PLUGIN_UPDATE_EPF_MAPPING_ACTION_ID='plugin_update_epf_mapping', PLUGIN_UPDATE_EPG_ACTION_ID='plugin_update_epg', PLUGIN_UPDATE_FOLDER_ACTION_ID='plugin_update_folder', PLUGIN_UPDATE_INFO_BLOCK_ACTION_ID='plugin_update_info_block', PLUGIN_UPDATE_OSD_ACTION_ID='plugin_update_osd', PLUGIN_UPDATE_ROWS_INFO_ACTION_ID='plugin_update_rows_info', PLUGIN_UPDATE_ROWS_MENU_ACTION_ID='plugin_update_rows_menu', PLUGIN_UPDATE_STICKER_ACTION_ID='plugin_update_sticker', PLUGIN_UPDATE_TV_INFO_ACTION_ID='plugin_update_tv_info', PLUGIN_VOD_PLAY_ACTION_ID='plugin_vod_play', REMOVE_FROM_FAVORITES_ACTION_ID='remove_from_favorites', RENAME_MENU_ITEM_ACTION_ID='rename_menu_item', RENAME_PATH_ACTION_ID='rename_path' - fw-tv188b-260827-0003-r24--php-framework.c250 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс PluginUpdateStickerActionData с ключами (3): sticker, ep_media_url, post_action - fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c059 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · ActionFactory::update_sticker строит действие plugin_update_sticker; схема заполнения использует PluginUpdateStickerActionData::{ep_media_url, sticker, post_action}. [^236]: - fw-tv188b-260827-0003-r24--php-framework.c117 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php (раздел «GUI-action ids») определяет идентификаторы действий GUI: PLUGIN_TV_SELECT_CHANNEL_ACTION_ID='plugin_tv_select_channel', PLUGIN_UPDATE_ARCHIVE_CACHE_ACTION_ID='plugin_update_archive_cache', PLUGIN_UPDATE_EPF_MAPPING_ACTION_ID='plugin_update_epf_mapping', PLUGIN_UPDATE_EPG_ACTION_ID='plugin_update_epg', PLUGIN_UPDATE_FOLDER_ACTION_ID='plugin_update_folder', PLUGIN_UPDATE_INFO_BLOCK_ACTION_ID='plugin_update_info_block', PLUGIN_UPDATE_OSD_ACTION_ID='plugin_update_osd', PLUGIN_UPDATE_ROWS_INFO_ACTION_ID='plugin_update_rows_info', PLUGIN_UPDATE_ROWS_MENU_ACTION_ID='plugin_update_rows_menu', PLUGIN_UPDATE_STICKER_ACTION_ID='plugin_update_sticker', PLUGIN_UPDATE_TV_INFO_ACTION_ID='plugin_update_tv_info', PLUGIN_VOD_PLAY_ACTION_ID='plugin_vod_play', REMOVE_FROM_FAVORITES_ACTION_ID='remove_from_favorites', RENAME_MENU_ITEM_ACTION_ID='rename_menu_item', RENAME_PATH_ACTION_ID='rename_path' - fw-tv188b-260827-0003-r24--php-framework.c248 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс PluginUpdateRowsInfoActionData с ключами (4): clear_cache, invalidate_cache, info, post_action - fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c067 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · ActionFactory::update_rows_info строит действие plugin_update_rows_info; схема заполнения использует PluginRowsInfo::{info_defs, bg_url, nl_bg_url, mask_url, bg_poster_mode, playback_urls}; PluginUpdateRowsInfoActionData::{info, post_action}. [^237]: fw-tv188b-261021-0117-r25--php-framework--native-actions.c069 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Фабрика update_rows_menu android_apps строит plugin_update_rows_menu с data reload_topmenu и post_action; apps_setup_screen выдаёт update_rows_menu(true, …) после AppShortcuts::set_dirty, AppConfig::set_dirty и EpfsHandler::update_apps_epfs; что делает оболочка (перечитать меню строк и верхнее меню) — по имени ключа, не проверено. [^238]: - fw-tv188b-260827-0003-r24--php-framework.c117 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php (раздел «GUI-action ids») определяет идентификаторы действий GUI: PLUGIN_TV_SELECT_CHANNEL_ACTION_ID='plugin_tv_select_channel', PLUGIN_UPDATE_ARCHIVE_CACHE_ACTION_ID='plugin_update_archive_cache', PLUGIN_UPDATE_EPF_MAPPING_ACTION_ID='plugin_update_epf_mapping', PLUGIN_UPDATE_EPG_ACTION_ID='plugin_update_epg', PLUGIN_UPDATE_FOLDER_ACTION_ID='plugin_update_folder', PLUGIN_UPDATE_INFO_BLOCK_ACTION_ID='plugin_update_info_block', PLUGIN_UPDATE_OSD_ACTION_ID='plugin_update_osd', PLUGIN_UPDATE_ROWS_INFO_ACTION_ID='plugin_update_rows_info', PLUGIN_UPDATE_ROWS_MENU_ACTION_ID='plugin_update_rows_menu', PLUGIN_UPDATE_STICKER_ACTION_ID='plugin_update_sticker', PLUGIN_UPDATE_TV_INFO_ACTION_ID='plugin_update_tv_info', PLUGIN_VOD_PLAY_ACTION_ID='plugin_vod_play', REMOVE_FROM_FAVORITES_ACTION_ID='remove_from_favorites', RENAME_MENU_ITEM_ACTION_ID='rename_menu_item', RENAME_PATH_ACTION_ID='rename_path' - fw-tv188b-260827-0003-r24--php-framework.c249 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс PluginUpdateRowsMenuActionData с ключами (2): reload_topmenu, post_action [^239]: - 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' - fw-tv188b-260827-0003-r24--php-framework.c216 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс PluginRefreshEntryPointsActionData с ключами (1): post_action [^240]: fw-tv188b-261021-0117-r25--shell-ext--entry-handler--recent-views.c014 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · get_action_map r25 ставит Enter/Play/Menu playback finish; при непустой истории Popup и Clear обёрнуты update_folder_marks(CHANGE_OP_NOP, null, 'marks_str', post_action), то есть marks_output_key='marks_str'. [^241]: - fw-tv188b-260827-0003-r24--php-framework.c119 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php (раздел «GUI-action ids») определяет идентификаторы действий GUI: SWITCH_OSD_MODE_ACTION_ID='switch_osd_mode', SYNC_MY_COLLECTION_ACTION_ID='sync_my_collection', UNINSTALL_APK_ACTION_ID='uninstall_apk', UPDATE_DVB_CHANNELS_ACTION_ID='update_dvb_channels', UPDATE_FOLDER_MARKS_ACTION_ID='update_folder_marks', UPDATE_IMAGES_ACTION_ID='update_images', UPDATE_TV_INFO_ACTION_ID='update_tv_info', UPDATE_WATCHED_MARKS_ACTION_ID='update_watched_marks', WAIT_EXT_APP_START_ACTION_ID='wait_ext_app_start', WAIT_FOR_IP_ADDRESS_ACTION_ID='wait_for_ip_address', WAKE_NETWORK_FOLDER_ACTION_ID='wake_network_folder', WGET_ACTION_ID='wget' - fw-tv188b-260827-0003-r24--php-framework.c279 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс UpdateFolderMarksActionData с ключами (4): change_op, ids, marks_output_key, post_action - fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c023 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · ActionFactory::update_folder_marks строит действие update_folder_marks; схема заполнения использует UpdateFolderMarksActionData::{change_op, ids, marks_output_key, post_action}. change_op всегда; ids/post_action при истинности, marks_output_key при isset. [^242]: - doc-sdk-plugins--gui-actions.c075 · doc · any-documented; прошивка — · Данные PluginClearArchiveCache — класс PluginClearArchiveCacheActionData: archive_id (необязательно, null — все архивы) и необязательный post_action - doc-sdk-plugins--gui-actions.c076 · doc · any-documented; прошивка — · PluginClearArchiveCache удаляет из файловой системы кэш архивов плагина: при заданном archive_id — только этот архив, иначе все архивы текущего плагина [^243]: - 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' - fw-tv188b-260827-0003-r24--php-framework.c198 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс PluginClearArchiveCacheActionData с ключами (2): archive_id, post_action - fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c025 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · ActionFactory::clear_archive_cache строит действие plugin_clear_archive_cache; схема заполнения использует PluginClearArchiveCacheActionData::{archive_id, post_action}. [^244]: - fw-tv188b-260827-0003-r24--php-framework.c117 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php (раздел «GUI-action ids») определяет идентификаторы действий GUI: PLUGIN_TV_SELECT_CHANNEL_ACTION_ID='plugin_tv_select_channel', PLUGIN_UPDATE_ARCHIVE_CACHE_ACTION_ID='plugin_update_archive_cache', PLUGIN_UPDATE_EPF_MAPPING_ACTION_ID='plugin_update_epf_mapping', PLUGIN_UPDATE_EPG_ACTION_ID='plugin_update_epg', PLUGIN_UPDATE_FOLDER_ACTION_ID='plugin_update_folder', PLUGIN_UPDATE_INFO_BLOCK_ACTION_ID='plugin_update_info_block', PLUGIN_UPDATE_OSD_ACTION_ID='plugin_update_osd', PLUGIN_UPDATE_ROWS_INFO_ACTION_ID='plugin_update_rows_info', PLUGIN_UPDATE_ROWS_MENU_ACTION_ID='plugin_update_rows_menu', PLUGIN_UPDATE_STICKER_ACTION_ID='plugin_update_sticker', PLUGIN_UPDATE_TV_INFO_ACTION_ID='plugin_update_tv_info', PLUGIN_VOD_PLAY_ACTION_ID='plugin_vod_play', REMOVE_FROM_FAVORITES_ACTION_ID='remove_from_favorites', RENAME_MENU_ITEM_ACTION_ID='rename_menu_item', RENAME_PATH_ACTION_ID='rename_path' - fw-tv188b-260827-0003-r24--php-framework.c242 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс PluginUpdateArchiveCacheActionData с ключами (3): archive, reread_archive_dir, post_action [^245]: fw-tv188b-261021-0117-r25--php-framework--native-actions.c070 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Фабрика update_epf_mapping shell_ext без MainHelper::$with_newgui возвращает post_action, иначе строит plugin_update_epf_mapping с data epf_id, mapped_plugin_name, sync_epfs, post_action; reread_all_epfs($sync_epfs) — тот же вызов с epf_id и mapped_plugin_name = null. [^246]: fw-tv188b-261021-0117-r25--php-framework--native-actions.c071 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · shell_ext строит plugin_update_epf_mapping с непустым epf_id в get_update_epf_action: для каждой пары epf_id => имя плагина из $epf_mapping, sync_epfs=false, только при HD::with_epfs(). [^247]: - fw-tv188b-260827-0003-r24--php-framework.c117 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php (раздел «GUI-action ids») определяет идентификаторы действий GUI: PLUGIN_TV_SELECT_CHANNEL_ACTION_ID='plugin_tv_select_channel', PLUGIN_UPDATE_ARCHIVE_CACHE_ACTION_ID='plugin_update_archive_cache', PLUGIN_UPDATE_EPF_MAPPING_ACTION_ID='plugin_update_epf_mapping', PLUGIN_UPDATE_EPG_ACTION_ID='plugin_update_epg', PLUGIN_UPDATE_FOLDER_ACTION_ID='plugin_update_folder', PLUGIN_UPDATE_INFO_BLOCK_ACTION_ID='plugin_update_info_block', PLUGIN_UPDATE_OSD_ACTION_ID='plugin_update_osd', PLUGIN_UPDATE_ROWS_INFO_ACTION_ID='plugin_update_rows_info', PLUGIN_UPDATE_ROWS_MENU_ACTION_ID='plugin_update_rows_menu', PLUGIN_UPDATE_STICKER_ACTION_ID='plugin_update_sticker', PLUGIN_UPDATE_TV_INFO_ACTION_ID='plugin_update_tv_info', PLUGIN_VOD_PLAY_ACTION_ID='plugin_vod_play', REMOVE_FROM_FAVORITES_ACTION_ID='remove_from_favorites', RENAME_MENU_ITEM_ACTION_ID='rename_menu_item', RENAME_PATH_ACTION_ID='rename_path' - fw-tv188b-260827-0003-r24--php-framework.c243 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс PluginUpdateEpfMappingActionData с ключами (4): epf_id, mapped_plugin_name, sync_epfs, post_action - fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c036 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · ActionFactory::update_epf_mapping строит действие plugin_update_epf_mapping; схема заполнения использует PluginUpdateEpfMappingActionData::{epf_id, mapped_plugin_name, sync_epfs, post_action}. При !MainHelper::$with_newgui сразу возвращает post_action. [^248]: doc-sdk-plugins--gui-actions.c091 · doc · any-documented; прошивка — · ShowMainScreen (данные ShowMainScreenActionData с полем post_action) переключает на главный экран; добавлено для сценариев auto_start, текущая реализация имеет ограничения [^249]: - fw-tv188b-260827-0003-r24--php-framework.c118 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php (раздел «GUI-action ids») определяет идентификаторы действий GUI: RESET_CONTROLS_ACTION_ID='reset_controls', RESTART_ACTION_ID='restart', RUN_BUILTIN_ACTION_ID='run_builtin', RUN_DEFAULT_ACTION_ID='run_default', SET_RESTRICTED_ACTION_ID='set_restricted', SET_TIME_ZONE_ACTION_ID='set_time_zone', SHOW_BLACK_SCREEN_ACTION_ID='show_black_screen', SHOW_DIALOG_ACTION_ID='show_dialog', SHOW_GCOMPS_DIALOG_ACTION_ID='show_gcomps', SHOW_MAIN_SCREEN_ACTION_ID='show_main_screen', SHOW_POPUP_MENU_ACTION_ID='show_popup_menu', SLEEP_ACTION_ID='sleep', START_SERVICE_ACTION_ID='start_service', STATUS_ACTION_ID='status', STOP_PLAYBACK_ACTION_ID='stop_playback' - fw-tv188b-260827-0003-r24--php-framework.c268 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс ShowMainScreenActionData с ключами (1): post_action - fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c031 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · ActionFactory::show_main_screen строит действие show_main_screen; схема заполнения использует ShowMainScreenActionData::{post_action}. [^250]: doc-sdk-plugins--gui-actions.c092 · doc · any-documented; прошивка — · ShowBlackScreen (данные ShowBlackScreenActionData: bg_url, post_action) переключает на чёрный экран; если задан bg_url, вместо сплошного чёрного фона показывается эта картинка [^251]: - fw-tv188b-260827-0003-r24--php-framework.c118 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php (раздел «GUI-action ids») определяет идентификаторы действий GUI: RESET_CONTROLS_ACTION_ID='reset_controls', RESTART_ACTION_ID='restart', RUN_BUILTIN_ACTION_ID='run_builtin', RUN_DEFAULT_ACTION_ID='run_default', SET_RESTRICTED_ACTION_ID='set_restricted', SET_TIME_ZONE_ACTION_ID='set_time_zone', SHOW_BLACK_SCREEN_ACTION_ID='show_black_screen', SHOW_DIALOG_ACTION_ID='show_dialog', SHOW_GCOMPS_DIALOG_ACTION_ID='show_gcomps', SHOW_MAIN_SCREEN_ACTION_ID='show_main_screen', SHOW_POPUP_MENU_ACTION_ID='show_popup_menu', SLEEP_ACTION_ID='sleep', START_SERVICE_ACTION_ID='start_service', STATUS_ACTION_ID='status', STOP_PLAYBACK_ACTION_ID='stop_playback' - fw-tv188b-260827-0003-r24--php-framework.c265 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс ShowBlackScreenActionData с ключами (2): bg_url, post_action - doc-sdk-plugins--gui-actions.c158 · code · unknown; прошивка — · ActionFactory::show_black_screen плагина freetv формирует действие типа ShowBlackScreen с handler_string_id = SHOW_BLACK_SCREEN_ACTION_ID и data из полей класса ShowBlackScreenActionData::bg_url и ::post_action. [^252]: doc-sdk-plugins--gui-actions.c052 · doc · any-documented; прошивка — · ShowDialogAction показывает диалог с контролами и взаимодействует с пользователем, пока диалог не закрыт; контролы идут вертикальным списком, у каждого может быть заголовок (1 или 2 колонки), полоса прокрутки появляется при необходимости [^253]: fw-tv188b-261021-0117-r25--php-framework--native-actions.c036 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В show_dialog подпись не получает фокус: в окне A из 30 подписей и кнопки OK фокус при открытии стоит на OK. [^254]: - fw-tv188b-260827-0003-r24--php-framework.c118 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php (раздел «GUI-action ids») определяет идентификаторы действий GUI: RESET_CONTROLS_ACTION_ID='reset_controls', RESTART_ACTION_ID='restart', RUN_BUILTIN_ACTION_ID='run_builtin', RUN_DEFAULT_ACTION_ID='run_default', SET_RESTRICTED_ACTION_ID='set_restricted', SET_TIME_ZONE_ACTION_ID='set_time_zone', SHOW_BLACK_SCREEN_ACTION_ID='show_black_screen', SHOW_DIALOG_ACTION_ID='show_dialog', SHOW_GCOMPS_DIALOG_ACTION_ID='show_gcomps', SHOW_MAIN_SCREEN_ACTION_ID='show_main_screen', SHOW_POPUP_MENU_ACTION_ID='show_popup_menu', SLEEP_ACTION_ID='sleep', START_SERVICE_ACTION_ID='start_service', STATUS_ACTION_ID='status', STOP_PLAYBACK_ACTION_ID='stop_playback' - fw-tv188b-260827-0003-r24--php-framework.c266 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс ShowDialogActionData с ключами (10): title, defs, actions, timer, close_by_return, preferred_width, max_height, min_item_title_width, initial_sel_ndx, params - fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c007 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · ActionFactory::show_dialog строит действие show_dialog; схема заполнения использует ShowDialogActionData::{title, defs, close_by_return, preferred_width, min_item_title_width, max_height, initial_sel_ndx, actions, timer, params}. attrs: initial_sel_ndx=-1, actions=null, timer=null, min_item_title_width=0, max_height=0, params=null; close_by_return=false, preferred_width=0. [^255]: - fw-tv188b-260827-0003-r24--php-framework.c118 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php (раздел «GUI-action ids») определяет идентификаторы действий GUI: RESET_CONTROLS_ACTION_ID='reset_controls', RESTART_ACTION_ID='restart', RUN_BUILTIN_ACTION_ID='run_builtin', RUN_DEFAULT_ACTION_ID='run_default', SET_RESTRICTED_ACTION_ID='set_restricted', SET_TIME_ZONE_ACTION_ID='set_time_zone', SHOW_BLACK_SCREEN_ACTION_ID='show_black_screen', SHOW_DIALOG_ACTION_ID='show_dialog', SHOW_GCOMPS_DIALOG_ACTION_ID='show_gcomps', SHOW_MAIN_SCREEN_ACTION_ID='show_main_screen', SHOW_POPUP_MENU_ACTION_ID='show_popup_menu', SLEEP_ACTION_ID='sleep', START_SERVICE_ACTION_ID='start_service', STATUS_ACTION_ID='status', STOP_PLAYBACK_ACTION_ID='stop_playback' - fw-tv188b-260827-0003-r24--php-framework.c267 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс ShowGCompsDialogActionData с ключами (9): geom_def, comp_defs, focus, ui_state, sel_state, actions, timer, params, async_icon_loading [^256]: doc-sdk-plugins--gui-actions.c061 · doc · any-documented; прошивка — · CloseDialogAndRunAction (данные CloseDialogAndRunActionData с необязательным post_action) закрывает текущий диалог с контролами и возвращает post_action как результат вызвавшего действия SHOW_DIALOG [^257]: - fw-tv188b-260827-0003-r24--php-framework.c115 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php (раздел «GUI-action ids») определяет идентификаторы действий GUI: CLOSE_DIALOG_AND_RUN_ACTION_ID='close_dialog_and_run', COMPOSITE_ACTION_ID='composite', CONFIRM_LOCATION_ACTION_ID='confirm_location', CREATE_NETWORK_FOLDER_ACTION_ID='create_network_folder', CUSTOM_IGNORE_UPDATE_ACTION_ID='custom_ignore_update', DETECT_SERIES_ACTION_ID='detect_series', DOWNLOAD_AND_INSTALL_APK_ACTION_ID='download_and_install_apk', DVB_COMMAND_ACTION_ID='dvb_command', DVD_PLAY_ACTION_ID='dvd_play', EDIT_LIST_CONFIG_ACTION_ID='edit_list_config', EDIT_MAIN_SCREEN_ACTION_ID='edit_main_screen', EDIT_MOVIE_DATA_ACTION_ID='edit_movie_data', FILE_PLAY_ACTION_ID='file_play', INIT_PERSISTFS_ACTION_ID='init_persistfs', INVALIDATE_FILES_ASSOCIATIONS_ACTION_ID='invalidate_files_associations' - fw-tv188b-260827-0003-r24--php-framework.c139 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс CloseDialogAndRunActionData с ключами (1): post_action - fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c008 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · ActionFactory::close_dialog_and_run строит действие close_dialog_and_run; схема заполнения использует CloseDialogAndRunActionData::{post_action}. [^258]: doc-sdk-plugins--gui-actions.c099 · doc · any-documented; прошивка — · CloseAndRunAction (данные CloseAndRunActionData с необязательным post_action): при активном диалоге с контролами работает как CloseDialogAndRunAction, при другом диалоге ничего не делает, а без диалогов в активной папке закрывает её (переход вверх) и возвращает post_action; доступно с прошивки 121114 [^259]: - fw-tv188b-260827-0003-r24--php-framework.c114 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php (раздел «GUI-action ids») определяет идентификаторы действий GUI: ADD_MENU_ITEMS_ACTION_ID='add_menu_items', ADD_TO_FAVORITES_ACTION_ID='add_to_favorites', BLURAY_PLAY_ACTION_ID='bluray_play', BT_COMMAND_ACTION_ID='bt_command', CHANGE_BEHAVIOUR_ACTION_ID='change_behaviour', CHANGE_GCOMPS_ACTION_ID='change_gcomps', CHANGE_LIST_CONFIG_ACTION_ID='change_list_config', CHANGE_MOVIE_DATA_ACTION_ID='change_movie_data', CHANGE_PARENTAL_CODE_ACTION_ID='change_parental_code', CHANGE_SETTINGS_ACTION_ID='change_settings', CHECK_RESTRICTED_ACTION_ID='check_restricted', CHECK_SYSTEM_STORAGE_ACTION_ID='check_system_storage', CHOOSE_FILE_ACTION_ID='choose_file', CLEAR_WATCH_HISTORY_ACTION_ID='clear_watch_history', CLOSE_AND_RUN_ACTION_ID='close_and_run' - fw-tv188b-260827-0003-r24--php-framework.c138 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс CloseAndRunActionData с ключами (1): post_action - fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c010 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · ActionFactory::close_and_run строит действие close_and_run; схема заполнения использует CloseAndRunActionData::{post_action}. [^260]: doc-sdk-plugins--gui-actions.c066 · doc · any-documented; прошивка — · ShowPopupMenuAction показывает всплывающее меню до его закрытия; действие выбранного пользователем пункта возвращается как post action [^261]: - fw-tv188b-260827-0003-r24--php-framework.c118 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php (раздел «GUI-action ids») определяет идентификаторы действий GUI: RESET_CONTROLS_ACTION_ID='reset_controls', RESTART_ACTION_ID='restart', RUN_BUILTIN_ACTION_ID='run_builtin', RUN_DEFAULT_ACTION_ID='run_default', SET_RESTRICTED_ACTION_ID='set_restricted', SET_TIME_ZONE_ACTION_ID='set_time_zone', SHOW_BLACK_SCREEN_ACTION_ID='show_black_screen', SHOW_DIALOG_ACTION_ID='show_dialog', SHOW_GCOMPS_DIALOG_ACTION_ID='show_gcomps', SHOW_MAIN_SCREEN_ACTION_ID='show_main_screen', SHOW_POPUP_MENU_ACTION_ID='show_popup_menu', SLEEP_ACTION_ID='sleep', START_SERVICE_ACTION_ID='start_service', STATUS_ACTION_ID='status', STOP_PLAYBACK_ACTION_ID='stop_playback' - fw-tv188b-260827-0003-r24--php-framework.c269 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс ShowPopupMenuActionData с ключами (3): menu_items, selected_menu_item_index, prepend_items_from_selected_plugin - fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c019 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · ActionFactory::show_popup_menu строит действие show_popup_menu; схема заполнения использует ShowPopupMenuActionData::{menu_items, selected_menu_item_index}. [^262]: plg-dc-globaltv.c055 · code · unknown; прошивка — · Для topmenu_popup плагин читает из user_input selected_topmenu_item_id (формат plugin:<имя>:section_) и topmenu_pcode_entered и отвечает действием add_menu_items. [^263]: - fw-tv188b-260827-0003-r24--php-framework.c114 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php (раздел «GUI-action ids») определяет идентификаторы действий GUI: ADD_MENU_ITEMS_ACTION_ID='add_menu_items', ADD_TO_FAVORITES_ACTION_ID='add_to_favorites', BLURAY_PLAY_ACTION_ID='bluray_play', BT_COMMAND_ACTION_ID='bt_command', CHANGE_BEHAVIOUR_ACTION_ID='change_behaviour', CHANGE_GCOMPS_ACTION_ID='change_gcomps', CHANGE_LIST_CONFIG_ACTION_ID='change_list_config', CHANGE_MOVIE_DATA_ACTION_ID='change_movie_data', CHANGE_PARENTAL_CODE_ACTION_ID='change_parental_code', CHANGE_SETTINGS_ACTION_ID='change_settings', CHECK_RESTRICTED_ACTION_ID='check_restricted', CHECK_SYSTEM_STORAGE_ACTION_ID='check_system_storage', CHOOSE_FILE_ACTION_ID='choose_file', CLEAR_WATCH_HISTORY_ACTION_ID='clear_watch_history', CLOSE_AND_RUN_ACTION_ID='close_and_run' - fw-tv188b-260827-0003-r24--php-framework.c122 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс AddMenuItemsActionData с ключами (5): menu_id, menu_params, menu_items, sel_ndx, post_action - fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c038 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · ActionFactory::add_menu_items строит действие add_menu_items; схема заполнения использует AddMenuItemsActionData::{menu_items}. [^264]: fw-tv188b-261021-0117-r25--php-framework--native-actions.c073 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Фабрика rename_menu_item android_apps строит rename_menu_item с data id, caption, orig_caption, with_dialog (по умолчанию true) и post_action; AppsScreen::rename передаёт id пункта меню приложения, текущую и исходную подпись, with_dialog=true и продолжение finalize_rename — по смыслу оболочка показывает диалог переименования пункта меню (inference по месту вызова). [^265]: - fw-tv188b-260827-0003-r24--php-framework.c117 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php (раздел «GUI-action ids») определяет идентификаторы действий GUI: PLUGIN_TV_SELECT_CHANNEL_ACTION_ID='plugin_tv_select_channel', PLUGIN_UPDATE_ARCHIVE_CACHE_ACTION_ID='plugin_update_archive_cache', PLUGIN_UPDATE_EPF_MAPPING_ACTION_ID='plugin_update_epf_mapping', PLUGIN_UPDATE_EPG_ACTION_ID='plugin_update_epg', PLUGIN_UPDATE_FOLDER_ACTION_ID='plugin_update_folder', PLUGIN_UPDATE_INFO_BLOCK_ACTION_ID='plugin_update_info_block', PLUGIN_UPDATE_OSD_ACTION_ID='plugin_update_osd', PLUGIN_UPDATE_ROWS_INFO_ACTION_ID='plugin_update_rows_info', PLUGIN_UPDATE_ROWS_MENU_ACTION_ID='plugin_update_rows_menu', PLUGIN_UPDATE_STICKER_ACTION_ID='plugin_update_sticker', PLUGIN_UPDATE_TV_INFO_ACTION_ID='plugin_update_tv_info', PLUGIN_VOD_PLAY_ACTION_ID='plugin_vod_play', REMOVE_FROM_FAVORITES_ACTION_ID='remove_from_favorites', RENAME_MENU_ITEM_ACTION_ID='rename_menu_item', RENAME_PATH_ACTION_ID='rename_path' - fw-tv188b-260827-0003-r24--php-framework.c257 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс RenameMenuItemActionData с ключами (5): id, caption, orig_caption, with_dialog, post_action [^266]: doc-sdk-plugins--gui-actions.c044 · doc · any-documented; прошивка — · PluginShowErrorAction в режиме воспроизведения показывает одну строку текста в центре экрана, а в меню Dune — диалог с заголовком и строками сообщения [^267]: fw-tv188b-261021-0117-r25.c339 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 строковый id plugin_show_error в ответе handle_user_input принят: shell.log пишет result action plugin_show_error. [^268]: - 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' - fw-tv188b-260827-0003-r24--php-framework.c231 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс PluginShowErrorActionData с ключами (7): fatal, title, msg_lines, stop_playback, retry_delay_ms, options, post_action - fw-tv188b-260827-0003-r24--plugin-loader--gui-actions.c029 · code · android-dune-fw; прошивка 260827_0003_r24 · В strings libduneshell.so есть диагностики чтения полей PluginShowErrorActionData: fatal (boolean); title (string); msg_lines (array); stop_playback (boolean); retry_delay_ms (int); options (properties); post_action (object). [^269]: - fw-tv188b-260827-0003-r24--php-framework.c114 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php (раздел «GUI-action ids») определяет идентификаторы действий GUI: ADD_MENU_ITEMS_ACTION_ID='add_menu_items', ADD_TO_FAVORITES_ACTION_ID='add_to_favorites', BLURAY_PLAY_ACTION_ID='bluray_play', BT_COMMAND_ACTION_ID='bt_command', CHANGE_BEHAVIOUR_ACTION_ID='change_behaviour', CHANGE_GCOMPS_ACTION_ID='change_gcomps', CHANGE_LIST_CONFIG_ACTION_ID='change_list_config', CHANGE_MOVIE_DATA_ACTION_ID='change_movie_data', CHANGE_PARENTAL_CODE_ACTION_ID='change_parental_code', CHANGE_SETTINGS_ACTION_ID='change_settings', CHECK_RESTRICTED_ACTION_ID='check_restricted', CHECK_SYSTEM_STORAGE_ACTION_ID='check_system_storage', CHOOSE_FILE_ACTION_ID='choose_file', CLEAR_WATCH_HISTORY_ACTION_ID='clear_watch_history', CLOSE_AND_RUN_ACTION_ID='close_and_run' - fw-tv188b-260827-0003-r24--php-framework.c136 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс ChooseFileActionData с ключами (3): filter, ui_params, post_action - 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--php-framework--native-actions.c010 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Нативный choose_file записывает в продолжение file_chooser_result_status из результата диалога и action_status=1 только при file_chooser_result_status=0, иначе action_status=0. [^270]: 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, если ничего не выбрано) [^271]: 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). [^272]: - fw-tv188b-260827-0003-r24--php-framework.c117 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php (раздел «GUI-action ids») определяет идентификаторы действий GUI: PLUGIN_TV_SELECT_CHANNEL_ACTION_ID='plugin_tv_select_channel', PLUGIN_UPDATE_ARCHIVE_CACHE_ACTION_ID='plugin_update_archive_cache', PLUGIN_UPDATE_EPF_MAPPING_ACTION_ID='plugin_update_epf_mapping', PLUGIN_UPDATE_EPG_ACTION_ID='plugin_update_epg', PLUGIN_UPDATE_FOLDER_ACTION_ID='plugin_update_folder', PLUGIN_UPDATE_INFO_BLOCK_ACTION_ID='plugin_update_info_block', PLUGIN_UPDATE_OSD_ACTION_ID='plugin_update_osd', PLUGIN_UPDATE_ROWS_INFO_ACTION_ID='plugin_update_rows_info', PLUGIN_UPDATE_ROWS_MENU_ACTION_ID='plugin_update_rows_menu', PLUGIN_UPDATE_STICKER_ACTION_ID='plugin_update_sticker', PLUGIN_UPDATE_TV_INFO_ACTION_ID='plugin_update_tv_info', PLUGIN_VOD_PLAY_ACTION_ID='plugin_vod_play', REMOVE_FROM_FAVORITES_ACTION_ID='remove_from_favorites', RENAME_MENU_ITEM_ACTION_ID='rename_menu_item', RENAME_PATH_ACTION_ID='rename_path' - fw-tv188b-260827-0003-r24--php-framework.c254 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс PluginVodPlayActionData с ключами (1): vod_info - fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c004 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · ActionFactory::vod_play строит действие plugin_vod_play; схема заполнения использует PluginVodPlayActionData::{vod_info}. [^273]: doc-sdk-plugins--gui-actions.c037 · doc · any-documented; прошивка — · PluginTvPlayAction запускает TV-воспроизведение: берёт media_url выбранного элемента папки (null, если ничего не выбрано), выполняет Get_tv_info($media_url) и инициализирует состояние по полученному PluginTvInfo [^274]: - 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' - fw-tv188b-260827-0003-r24--php-framework.c240 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс PluginTvPlayActionData с ключами (7): initial_group_id, initial_channel_id, initial_is_favorite, initial_archive_tm, initial_trick_play, initial_trick_play_duration, initial_archive_program - fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c003 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · ActionFactory::tv_play строит действие plugin_tv_play; схема заполнения использует только handler_string_id. [^275]: doc-sdk-plugins--gui-actions.c086 · doc · any-documented; прошивка — · LaunchMediaUrl рекурсивно строит плейлист с url в качестве корня, по содержимому плейлиста выбирает исполнителя и запускает его [^276]: fw-tv188b-261021-0117-r25.c341 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 cmd=launch_media_url с plugin_launcher://{name=kb_probe9}{ep_media_url=kbp9_ping} запустил точку входа плагина: число вызовов ping выросло 0 → 1. [^277]: - 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' - 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 добавляются только при истинности. [^278]: doc-sdk-plugins--gui-actions.c082 · doc · any-documented; прошивка — · FilePlay (данные FilePlayActionData с полем url) запускает обычное воспроизведение одного файла; url должен указывать на аудио- или видеофайл либо поток поддерживаемого формата [^279]: - fw-tv188b-260827-0003-r24--php-framework.c115 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php (раздел «GUI-action ids») определяет идентификаторы действий GUI: CLOSE_DIALOG_AND_RUN_ACTION_ID='close_dialog_and_run', COMPOSITE_ACTION_ID='composite', CONFIRM_LOCATION_ACTION_ID='confirm_location', CREATE_NETWORK_FOLDER_ACTION_ID='create_network_folder', CUSTOM_IGNORE_UPDATE_ACTION_ID='custom_ignore_update', DETECT_SERIES_ACTION_ID='detect_series', DOWNLOAD_AND_INSTALL_APK_ACTION_ID='download_and_install_apk', DVB_COMMAND_ACTION_ID='dvb_command', DVD_PLAY_ACTION_ID='dvd_play', EDIT_LIST_CONFIG_ACTION_ID='edit_list_config', EDIT_MAIN_SCREEN_ACTION_ID='edit_main_screen', EDIT_MOVIE_DATA_ACTION_ID='edit_movie_data', FILE_PLAY_ACTION_ID='file_play', INIT_PERSISTFS_ACTION_ID='init_persistfs', INVALIDATE_FILES_ASSOCIATIONS_ACTION_ID='invalidate_files_associations' - fw-tv188b-260827-0003-r24--php-framework.c154 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс FilePlayActionData с ключами (2): url, caption - fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c030 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · ActionFactory::launch_file строит действие file_play; схема заполнения использует FilePlayActionData::{url, caption}. [^280]: doc-sdk-plugins--gui-actions.c083 · doc · any-documented; прошивка — · PlaylistPlay (данные PlaylistPlayActionData: url, start_index) воспроизводит плейлист, построенный из файла или папки по url; первым играет элемент с индексом start_index, если он валиден [^281]: - 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' - fw-tv188b-260827-0003-r24--php-framework.c196 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс PlaylistPlayActionData с ключами (2): url, start_index - fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c029 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · ActionFactory::launch_playlist строит действие playlist_play; схема заполнения использует PlaylistPlayActionData::{url, start_index}. [^282]: doc-sdk-plugins--gui-actions.c080 · doc · any-documented; прошивка — · DvdPlay (данные DvdPlayActionData с полем url) запускает DVD-воспроизведение по заданному url [^283]: - fw-tv188b-260827-0003-r24--php-framework.c115 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php (раздел «GUI-action ids») определяет идентификаторы действий GUI: CLOSE_DIALOG_AND_RUN_ACTION_ID='close_dialog_and_run', COMPOSITE_ACTION_ID='composite', CONFIRM_LOCATION_ACTION_ID='confirm_location', CREATE_NETWORK_FOLDER_ACTION_ID='create_network_folder', CUSTOM_IGNORE_UPDATE_ACTION_ID='custom_ignore_update', DETECT_SERIES_ACTION_ID='detect_series', DOWNLOAD_AND_INSTALL_APK_ACTION_ID='download_and_install_apk', DVB_COMMAND_ACTION_ID='dvb_command', DVD_PLAY_ACTION_ID='dvd_play', EDIT_LIST_CONFIG_ACTION_ID='edit_list_config', EDIT_MAIN_SCREEN_ACTION_ID='edit_main_screen', EDIT_MOVIE_DATA_ACTION_ID='edit_movie_data', FILE_PLAY_ACTION_ID='file_play', INIT_PERSISTFS_ACTION_ID='init_persistfs', INVALIDATE_FILES_ASSOCIATIONS_ACTION_ID='invalidate_files_associations' - fw-tv188b-260827-0003-r24--php-framework.c147 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс DvdPlayActionData с ключами (1): url - doc-sdk-plugins--gui-actions.c156 · code · unknown; прошивка — · ActionFactory::dvd_play плагина emplexer формирует действие типа DvdPlay с handler_string_id = DVD_PLAY_ACTION_ID и data из поля класса DvdPlayActionData::url. [^284]: doc-sdk-plugins--gui-actions.c081 · doc · any-documented; прошивка — · BlurayPlay (данные BlurayPlayActionData с полем url) запускает Blu-ray-воспроизведение по url; действие доступно только в прошивках с поддержкой Blu-ray [^285]: - fw-tv188b-260827-0003-r24--php-framework.c114 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php (раздел «GUI-action ids») определяет идентификаторы действий GUI: ADD_MENU_ITEMS_ACTION_ID='add_menu_items', ADD_TO_FAVORITES_ACTION_ID='add_to_favorites', BLURAY_PLAY_ACTION_ID='bluray_play', BT_COMMAND_ACTION_ID='bt_command', CHANGE_BEHAVIOUR_ACTION_ID='change_behaviour', CHANGE_GCOMPS_ACTION_ID='change_gcomps', CHANGE_LIST_CONFIG_ACTION_ID='change_list_config', CHANGE_MOVIE_DATA_ACTION_ID='change_movie_data', CHANGE_PARENTAL_CODE_ACTION_ID='change_parental_code', CHANGE_SETTINGS_ACTION_ID='change_settings', CHECK_RESTRICTED_ACTION_ID='check_restricted', CHECK_SYSTEM_STORAGE_ACTION_ID='check_system_storage', CHOOSE_FILE_ACTION_ID='choose_file', CLEAR_WATCH_HISTORY_ACTION_ID='clear_watch_history', CLOSE_AND_RUN_ACTION_ID='close_and_run' - fw-tv188b-260827-0003-r24--php-framework.c124 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс BlurayPlayActionData с ключами (1): url - doc-sdk-plugins--gui-actions.c157 · code · unknown; прошивка — · ActionFactory::bluray_play плагина emplexer формирует действие типа BlurayPlay с handler_string_id = BLURAY_PLAY_ACTION_ID и data из поля класса BlurayPlayActionData::url. [^286]: - fw-tv188b-260827-0003-r24--php-framework.c118 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php (раздел «GUI-action ids») определяет идентификаторы действий GUI: RESET_CONTROLS_ACTION_ID='reset_controls', RESTART_ACTION_ID='restart', RUN_BUILTIN_ACTION_ID='run_builtin', RUN_DEFAULT_ACTION_ID='run_default', SET_RESTRICTED_ACTION_ID='set_restricted', SET_TIME_ZONE_ACTION_ID='set_time_zone', SHOW_BLACK_SCREEN_ACTION_ID='show_black_screen', SHOW_DIALOG_ACTION_ID='show_dialog', SHOW_GCOMPS_DIALOG_ACTION_ID='show_gcomps', SHOW_MAIN_SCREEN_ACTION_ID='show_main_screen', SHOW_POPUP_MENU_ACTION_ID='show_popup_menu', SLEEP_ACTION_ID='sleep', START_SERVICE_ACTION_ID='start_service', STATUS_ACTION_ID='status', STOP_PLAYBACK_ACTION_ID='stop_playback' - fw-tv188b-260827-0003-r24--php-framework.c273 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс StopPlaybackActionData с ключами (2): wait_for_completion, post_action - fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c033 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · ActionFactory::stop_playback строит действие stop_playback; схема заполнения использует StopPlaybackActionData::{wait_for_completion, post_action}. [^287]: fw-tv188b-261021-0117-r25--php-framework--native-actions.c074 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Фабрика switch_osd_mode shell_ext строит switch_osd_mode с data osd_mode и post_action; MovieScreen при запуске того же фильма, что уже играет (movie id из info_tag), вместо нового запуска возвращает switch_osd_mode(true) с логом "just switching to osd". [^288]: - fw-tv188b-260827-0003-r24--php-framework.c119 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php (раздел «GUI-action ids») определяет идентификаторы действий GUI: SWITCH_OSD_MODE_ACTION_ID='switch_osd_mode', SYNC_MY_COLLECTION_ACTION_ID='sync_my_collection', UNINSTALL_APK_ACTION_ID='uninstall_apk', UPDATE_DVB_CHANNELS_ACTION_ID='update_dvb_channels', UPDATE_FOLDER_MARKS_ACTION_ID='update_folder_marks', UPDATE_IMAGES_ACTION_ID='update_images', UPDATE_TV_INFO_ACTION_ID='update_tv_info', UPDATE_WATCHED_MARKS_ACTION_ID='update_watched_marks', WAIT_EXT_APP_START_ACTION_ID='wait_ext_app_start', WAIT_FOR_IP_ADDRESS_ACTION_ID='wait_for_ip_address', WAKE_NETWORK_FOLDER_ACTION_ID='wake_network_folder', WGET_ACTION_ID='wget' - fw-tv188b-260827-0003-r24--php-framework.c275 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс SwitchOsdModeActionData с ключами (2): osd_mode, post_action - fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c032 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · ActionFactory::switch_osd_mode строит действие switch_osd_mode; схема заполнения использует SwitchOsdModeActionData::{osd_mode, post_action}. [^289]: doc-sdk-plugins--gui-actions.c136 · doc · any-documented; прошивка — · PluginUpdateOsdAction позволяет рисовать в TV/VOD-воспроизведении плагина произвольное число своих картинок и текстов; они рисуются под (до) штатными элементами OSD — браузером плейлиста, информационным блоком и т. п. [^290]: - fw-tv188b-260827-0003-r24--php-framework.c117 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php (раздел «GUI-action ids») определяет идентификаторы действий GUI: PLUGIN_TV_SELECT_CHANNEL_ACTION_ID='plugin_tv_select_channel', PLUGIN_UPDATE_ARCHIVE_CACHE_ACTION_ID='plugin_update_archive_cache', PLUGIN_UPDATE_EPF_MAPPING_ACTION_ID='plugin_update_epf_mapping', PLUGIN_UPDATE_EPG_ACTION_ID='plugin_update_epg', PLUGIN_UPDATE_FOLDER_ACTION_ID='plugin_update_folder', PLUGIN_UPDATE_INFO_BLOCK_ACTION_ID='plugin_update_info_block', PLUGIN_UPDATE_OSD_ACTION_ID='plugin_update_osd', PLUGIN_UPDATE_ROWS_INFO_ACTION_ID='plugin_update_rows_info', PLUGIN_UPDATE_ROWS_MENU_ACTION_ID='plugin_update_rows_menu', PLUGIN_UPDATE_STICKER_ACTION_ID='plugin_update_sticker', PLUGIN_UPDATE_TV_INFO_ACTION_ID='plugin_update_tv_info', PLUGIN_VOD_PLAY_ACTION_ID='plugin_vod_play', REMOVE_FROM_FAVORITES_ACTION_ID='remove_from_favorites', RENAME_MENU_ITEM_ACTION_ID='rename_menu_item', RENAME_PATH_ACTION_ID='rename_path' - fw-tv188b-260827-0003-r24--php-framework.c247 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс PluginUpdateOsdActionData с ключами (2): components, post_action - doc-sdk-plugins--gui-actions.c134 · doc · any-documented; прошивка — · Данные PluginUpdateOsdAction — класс PluginUpdateOsdActionData: components (тип записан как PluginOsdComponenetList) и необязательный post_action; действие доступно с прошивки 150528_r10 [^291]: doc-sdk-plugins--gui-actions.c126 · doc · any-documented; прошивка — · PluginUpdateInfoBlockAction задаёт многострочное сообщение над верхней границей информационного блока (обычно включается кнопкой INFO); оно видно только вместе с блоком и держится до остановки воспроизведения или следующего PluginUpdateInfoBlock [^292]: doc-sdk-plugins--gui-actions.c127 · doc · any-documented; прошивка — · PluginUpdateInfoBlockAction действует только в режиме TV- или VOD-воспроизведения плагина [^293]: - fw-tv188b-260827-0003-r24--php-framework.c117 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php (раздел «GUI-action ids») определяет идентификаторы действий GUI: PLUGIN_TV_SELECT_CHANNEL_ACTION_ID='plugin_tv_select_channel', PLUGIN_UPDATE_ARCHIVE_CACHE_ACTION_ID='plugin_update_archive_cache', PLUGIN_UPDATE_EPF_MAPPING_ACTION_ID='plugin_update_epf_mapping', PLUGIN_UPDATE_EPG_ACTION_ID='plugin_update_epg', PLUGIN_UPDATE_FOLDER_ACTION_ID='plugin_update_folder', PLUGIN_UPDATE_INFO_BLOCK_ACTION_ID='plugin_update_info_block', PLUGIN_UPDATE_OSD_ACTION_ID='plugin_update_osd', PLUGIN_UPDATE_ROWS_INFO_ACTION_ID='plugin_update_rows_info', PLUGIN_UPDATE_ROWS_MENU_ACTION_ID='plugin_update_rows_menu', PLUGIN_UPDATE_STICKER_ACTION_ID='plugin_update_sticker', PLUGIN_UPDATE_TV_INFO_ACTION_ID='plugin_update_tv_info', PLUGIN_VOD_PLAY_ACTION_ID='plugin_vod_play', REMOVE_FROM_FAVORITES_ACTION_ID='remove_from_favorites', RENAME_MENU_ITEM_ACTION_ID='rename_menu_item', RENAME_PATH_ACTION_ID='rename_path' - fw-tv188b-260827-0003-r24--php-framework.c246 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс PluginUpdateInfoBlockActionData с ключами (5): text_above, text_color, text_halo, text_y_offset, post_action - 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 [^294]: 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 — просто обновить программу канала на день [^295]: doc-sdk-plugins--gui-actions.c132 · doc · any-documented; прошивка — · PluginUpdateEpgAction действует только в режиме TV-воспроизведения плагина [^296]: - fw-tv188b-260827-0003-r24--php-framework.c117 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php (раздел «GUI-action ids») определяет идентификаторы действий GUI: PLUGIN_TV_SELECT_CHANNEL_ACTION_ID='plugin_tv_select_channel', PLUGIN_UPDATE_ARCHIVE_CACHE_ACTION_ID='plugin_update_archive_cache', PLUGIN_UPDATE_EPF_MAPPING_ACTION_ID='plugin_update_epf_mapping', PLUGIN_UPDATE_EPG_ACTION_ID='plugin_update_epg', PLUGIN_UPDATE_FOLDER_ACTION_ID='plugin_update_folder', PLUGIN_UPDATE_INFO_BLOCK_ACTION_ID='plugin_update_info_block', PLUGIN_UPDATE_OSD_ACTION_ID='plugin_update_osd', PLUGIN_UPDATE_ROWS_INFO_ACTION_ID='plugin_update_rows_info', PLUGIN_UPDATE_ROWS_MENU_ACTION_ID='plugin_update_rows_menu', PLUGIN_UPDATE_STICKER_ACTION_ID='plugin_update_sticker', PLUGIN_UPDATE_TV_INFO_ACTION_ID='plugin_update_tv_info', PLUGIN_VOD_PLAY_ACTION_ID='plugin_vod_play', REMOVE_FROM_FAVORITES_ACTION_ID='remove_from_favorites', RENAME_MENU_ITEM_ACTION_ID='rename_menu_item', RENAME_PATH_ACTION_ID='rename_path' - fw-tv188b-260827-0003-r24--php-framework.c244 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс PluginUpdateEpgActionData с ключами (6): channel_id, clear, day_start_tm_sec, programs, ext_epg_enabled, post_action - doc-sdk-plugins--gui-actions.c130 · doc · any-documented; прошивка — · Данные PluginUpdateEpgAction — класс PluginUpdateEpgActionData: channel_id, clear (Boolean), day_start_tm_sec, programs (PluginTvEpgProgramList), post_action (необязательно); действие доступно с прошивки 150528_r10 [^297]: - fw-tv188b-260827-0003-r24--php-framework.c117 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php (раздел «GUI-action ids») определяет идентификаторы действий GUI: PLUGIN_TV_SELECT_CHANNEL_ACTION_ID='plugin_tv_select_channel', PLUGIN_UPDATE_ARCHIVE_CACHE_ACTION_ID='plugin_update_archive_cache', PLUGIN_UPDATE_EPF_MAPPING_ACTION_ID='plugin_update_epf_mapping', PLUGIN_UPDATE_EPG_ACTION_ID='plugin_update_epg', PLUGIN_UPDATE_FOLDER_ACTION_ID='plugin_update_folder', PLUGIN_UPDATE_INFO_BLOCK_ACTION_ID='plugin_update_info_block', PLUGIN_UPDATE_OSD_ACTION_ID='plugin_update_osd', PLUGIN_UPDATE_ROWS_INFO_ACTION_ID='plugin_update_rows_info', PLUGIN_UPDATE_ROWS_MENU_ACTION_ID='plugin_update_rows_menu', PLUGIN_UPDATE_STICKER_ACTION_ID='plugin_update_sticker', PLUGIN_UPDATE_TV_INFO_ACTION_ID='plugin_update_tv_info', PLUGIN_VOD_PLAY_ACTION_ID='plugin_vod_play', REMOVE_FROM_FAVORITES_ACTION_ID='remove_from_favorites', RENAME_MENU_ITEM_ACTION_ID='rename_menu_item', RENAME_PATH_ACTION_ID='rename_path' - fw-tv188b-260827-0003-r24--php-framework.c241 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс PluginTvSelectChannelActionData с ключами (3): group_id, channel_id, is_favorite [^298]: - fw-tv188b-260827-0003-r24--php-framework.c117 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php (раздел «GUI-action ids») определяет идентификаторы действий GUI: PLUGIN_TV_SELECT_CHANNEL_ACTION_ID='plugin_tv_select_channel', PLUGIN_UPDATE_ARCHIVE_CACHE_ACTION_ID='plugin_update_archive_cache', PLUGIN_UPDATE_EPF_MAPPING_ACTION_ID='plugin_update_epf_mapping', PLUGIN_UPDATE_EPG_ACTION_ID='plugin_update_epg', PLUGIN_UPDATE_FOLDER_ACTION_ID='plugin_update_folder', PLUGIN_UPDATE_INFO_BLOCK_ACTION_ID='plugin_update_info_block', PLUGIN_UPDATE_OSD_ACTION_ID='plugin_update_osd', PLUGIN_UPDATE_ROWS_INFO_ACTION_ID='plugin_update_rows_info', PLUGIN_UPDATE_ROWS_MENU_ACTION_ID='plugin_update_rows_menu', PLUGIN_UPDATE_STICKER_ACTION_ID='plugin_update_sticker', PLUGIN_UPDATE_TV_INFO_ACTION_ID='plugin_update_tv_info', PLUGIN_VOD_PLAY_ACTION_ID='plugin_vod_play', REMOVE_FROM_FAVORITES_ACTION_ID='remove_from_favorites', RENAME_MENU_ITEM_ACTION_ID='rename_menu_item', RENAME_PATH_ACTION_ID='rename_path' - fw-tv188b-260827-0003-r24--php-framework.c251 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс PluginUpdateTvInfoActionData с ключами (2): channel_changes, post_action - 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 они есть [^299]: plg-dc-dunemdb-supplier-online-movies.c113 · code · unknown; прошивка — · do_play до выбора источника выполняет: при dirty истории — update_wh(force_reload) и возврат; при !tv_info_updated и определённом UPDATE_TV_INFO_ACTION_ID — update_tv_info; при сериале, user_choice=resume и se_chosen_manually — заменяет resume на auto_choose и удаляет supplier_info; при сериале, auto_choose, passed_e >= 0 и !eps_wh_updated — update_eps_wh. [^300]: - fw-tv188b-260827-0003-r24--php-framework.c119 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php (раздел «GUI-action ids») определяет идентификаторы действий GUI: SWITCH_OSD_MODE_ACTION_ID='switch_osd_mode', SYNC_MY_COLLECTION_ACTION_ID='sync_my_collection', UNINSTALL_APK_ACTION_ID='uninstall_apk', UPDATE_DVB_CHANNELS_ACTION_ID='update_dvb_channels', UPDATE_FOLDER_MARKS_ACTION_ID='update_folder_marks', UPDATE_IMAGES_ACTION_ID='update_images', UPDATE_TV_INFO_ACTION_ID='update_tv_info', UPDATE_WATCHED_MARKS_ACTION_ID='update_watched_marks', WAIT_EXT_APP_START_ACTION_ID='wait_ext_app_start', WAIT_FOR_IP_ADDRESS_ACTION_ID='wait_for_ip_address', WAKE_NETWORK_FOLDER_ACTION_ID='wake_network_folder', WGET_ACTION_ID='wget' - fw-tv188b-260827-0003-r24--php-framework.c281 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс UpdateTvInfoActionData с ключами (1): post_action [^301]: plg-dc-dunemdb-supplier-online-movies.c105 · code · unknown; прошивка — · AddTorrentDialog::apply_series читает info_by_name из результата detect_series, проставляет s/e найденным файлам; в обычном режиме (не switch_mode) для одиночного файла (count(series)==1, season<0, chosen_op вне play/download) сразу запускает vod_play; при chosen_op=play выполняет enter-действие torrent_files с выбранным файлом, при chosen_op=download запускает download_torrent, иначе открывает папку torrent_files с выбранным элементом. [^302]: - fw-tv188b-260827-0003-r24--php-framework.c115 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php (раздел «GUI-action ids») определяет идентификаторы действий GUI: CLOSE_DIALOG_AND_RUN_ACTION_ID='close_dialog_and_run', COMPOSITE_ACTION_ID='composite', CONFIRM_LOCATION_ACTION_ID='confirm_location', CREATE_NETWORK_FOLDER_ACTION_ID='create_network_folder', CUSTOM_IGNORE_UPDATE_ACTION_ID='custom_ignore_update', DETECT_SERIES_ACTION_ID='detect_series', DOWNLOAD_AND_INSTALL_APK_ACTION_ID='download_and_install_apk', DVB_COMMAND_ACTION_ID='dvb_command', DVD_PLAY_ACTION_ID='dvd_play', EDIT_LIST_CONFIG_ACTION_ID='edit_list_config', EDIT_MAIN_SCREEN_ACTION_ID='edit_main_screen', EDIT_MOVIE_DATA_ACTION_ID='edit_movie_data', FILE_PLAY_ACTION_ID='file_play', INIT_PERSISTFS_ACTION_ID='init_persistfs', INVALIDATE_FILES_ASSOCIATIONS_ACTION_ID='invalidate_files_associations' - fw-tv188b-260827-0003-r24--php-framework.c144 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс DetectSeriesActionData с ключами (4): base_path, rel_paths, result_path, post_action [^303]: - fw-tv188b-260827-0003-r24--php-framework.c115 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php (раздел «GUI-action ids») определяет идентификаторы действий GUI: CLOSE_DIALOG_AND_RUN_ACTION_ID='close_dialog_and_run', COMPOSITE_ACTION_ID='composite', CONFIRM_LOCATION_ACTION_ID='confirm_location', CREATE_NETWORK_FOLDER_ACTION_ID='create_network_folder', CUSTOM_IGNORE_UPDATE_ACTION_ID='custom_ignore_update', DETECT_SERIES_ACTION_ID='detect_series', DOWNLOAD_AND_INSTALL_APK_ACTION_ID='download_and_install_apk', DVB_COMMAND_ACTION_ID='dvb_command', DVD_PLAY_ACTION_ID='dvd_play', EDIT_LIST_CONFIG_ACTION_ID='edit_list_config', EDIT_MAIN_SCREEN_ACTION_ID='edit_main_screen', EDIT_MOVIE_DATA_ACTION_ID='edit_movie_data', FILE_PLAY_ACTION_ID='file_play', INIT_PERSISTFS_ACTION_ID='init_persistfs', INVALIDATE_FILES_ASSOCIATIONS_ACTION_ID='invalidate_files_associations' - fw-tv188b-260827-0003-r24--php-framework.c146 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс DvbCommandActionData с ключами (3): name, params, callback_action [^304]: - fw-tv188b-260827-0003-r24--php-framework.c119 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php (раздел «GUI-action ids») определяет идентификаторы действий GUI: SWITCH_OSD_MODE_ACTION_ID='switch_osd_mode', SYNC_MY_COLLECTION_ACTION_ID='sync_my_collection', UNINSTALL_APK_ACTION_ID='uninstall_apk', UPDATE_DVB_CHANNELS_ACTION_ID='update_dvb_channels', UPDATE_FOLDER_MARKS_ACTION_ID='update_folder_marks', UPDATE_IMAGES_ACTION_ID='update_images', UPDATE_TV_INFO_ACTION_ID='update_tv_info', UPDATE_WATCHED_MARKS_ACTION_ID='update_watched_marks', WAIT_EXT_APP_START_ACTION_ID='wait_ext_app_start', WAIT_FOR_IP_ADDRESS_ACTION_ID='wait_for_ip_address', WAKE_NETWORK_FOLDER_ACTION_ID='wake_network_folder', WGET_ACTION_ID='wget' - fw-tv188b-260827-0003-r24--php-framework.c278 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс UpdateDvbChannelsActionData с ключами (1): post_action [^305]: fw-tv188b-261021-0117-r25.c262 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 params (handler_id, control_id) действия plugin_handle_user_input из key_enter точки входа в манифесте приходят полями handler_id и control_id в input_data операции handle_user_input. [^306]: - 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' - fw-tv188b-260827-0003-r24--php-framework.c206 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс PluginHandleUserInputActionData с ключами (3): operation_timeout, show_dialog_delay, dialog_title - fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c034 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · ActionFactory::handle_user_input строит действие plugin_handle_user_input; схема заполнения использует PluginHandleUserInputActionData::{operation_timeout, show_dialog_delay}. params на верхнем уровне; data=null без timeout/delay, иначе заданные поля приводятся к int. [^307]: fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c044 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · ActionFactory::composite строит действие composite; схема заполнения использует CompositeActionData::{actions}. [^308]: fw-tv188b-261021-0117-r25--php-framework--native-actions.c058 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 composite из двух plugin_handle_user_input выполнил a_composite-1 затем a_composite-2; оба post записаны с одинаковым временем 1793666163.336 и без action_status. [^309]: - fw-tv188b-260827-0003-r24--php-framework.c115 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php (раздел «GUI-action ids») определяет идентификаторы действий GUI: CLOSE_DIALOG_AND_RUN_ACTION_ID='close_dialog_and_run', COMPOSITE_ACTION_ID='composite', CONFIRM_LOCATION_ACTION_ID='confirm_location', CREATE_NETWORK_FOLDER_ACTION_ID='create_network_folder', CUSTOM_IGNORE_UPDATE_ACTION_ID='custom_ignore_update', DETECT_SERIES_ACTION_ID='detect_series', DOWNLOAD_AND_INSTALL_APK_ACTION_ID='download_and_install_apk', DVB_COMMAND_ACTION_ID='dvb_command', DVD_PLAY_ACTION_ID='dvd_play', EDIT_LIST_CONFIG_ACTION_ID='edit_list_config', EDIT_MAIN_SCREEN_ACTION_ID='edit_main_screen', EDIT_MOVIE_DATA_ACTION_ID='edit_movie_data', FILE_PLAY_ACTION_ID='file_play', INIT_PERSISTFS_ACTION_ID='init_persistfs', INVALIDATE_FILES_ASSOCIATIONS_ACTION_ID='invalidate_files_associations' - fw-tv188b-260827-0003-r24--php-framework.c140 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс CompositeActionData с ключами (1): actions - fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c044 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · ActionFactory::composite строит действие composite; схема заполнения использует CompositeActionData::{actions}. [^310]: doc-sdk-plugins--gui-actions.c067 · doc · any-documented; прошивка — · StatusAction (данные StatusActionData с полем int status) просто возвращает заданный статус [^311]: - fw-tv188b-260827-0003-r24--php-framework.c118 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php (раздел «GUI-action ids») определяет идентификаторы действий GUI: RESET_CONTROLS_ACTION_ID='reset_controls', RESTART_ACTION_ID='restart', RUN_BUILTIN_ACTION_ID='run_builtin', RUN_DEFAULT_ACTION_ID='run_default', SET_RESTRICTED_ACTION_ID='set_restricted', SET_TIME_ZONE_ACTION_ID='set_time_zone', SHOW_BLACK_SCREEN_ACTION_ID='show_black_screen', SHOW_DIALOG_ACTION_ID='show_dialog', SHOW_GCOMPS_DIALOG_ACTION_ID='show_gcomps', SHOW_MAIN_SCREEN_ACTION_ID='show_main_screen', SHOW_POPUP_MENU_ACTION_ID='show_popup_menu', SLEEP_ACTION_ID='sleep', START_SERVICE_ACTION_ID='start_service', STATUS_ACTION_ID='status', STOP_PLAYBACK_ACTION_ID='stop_playback' - fw-tv188b-260827-0003-r24--php-framework.c272 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс StatusActionData с ключами (1): status - fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c015 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · ActionFactory::status строит действие status; схема заполнения использует StatusActionData::{status}. [^312]: - fw-tv188b-260827-0003-r24--php-framework.c118 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php (раздел «GUI-action ids») определяет идентификаторы действий GUI: RESET_CONTROLS_ACTION_ID='reset_controls', RESTART_ACTION_ID='restart', RUN_BUILTIN_ACTION_ID='run_builtin', RUN_DEFAULT_ACTION_ID='run_default', SET_RESTRICTED_ACTION_ID='set_restricted', SET_TIME_ZONE_ACTION_ID='set_time_zone', SHOW_BLACK_SCREEN_ACTION_ID='show_black_screen', SHOW_DIALOG_ACTION_ID='show_dialog', SHOW_GCOMPS_DIALOG_ACTION_ID='show_gcomps', SHOW_MAIN_SCREEN_ACTION_ID='show_main_screen', SHOW_POPUP_MENU_ACTION_ID='show_popup_menu', SLEEP_ACTION_ID='sleep', START_SERVICE_ACTION_ID='start_service', STATUS_ACTION_ID='status', STOP_PLAYBACK_ACTION_ID='stop_playback' - fw-tv188b-260827-0003-r24--php-framework.c270 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс SleepActionData с ключами (2): delay_ms, post_action [^313]: - fw-tv188b-261021-0117-r25--php-framework--native-actions.c050 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 cond с pattern is_file(/tmp/kb_probe11/load.txt) выполнил post с tag=a_cond_yes и строковым action_status="1". - fw-tv188b-261021-0117-r25--php-framework--native-actions.c051 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 cond с pattern is_file(/tmp/kb_probe11/no_such) выполнил post с tag=a_cond_no и строковым action_status="0". [^314]: - fw-tv188b-261021-0117-r25.c008 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · dune_api.php r25 добавляет идентификаторы GUI-действий APPLY_HASH_DIRTIES_ACTION_ID='apply_hash_dirties', COND_ACTION_ID='cond', FS_CTL_ACTION_ID='fs_ctl', LOAD_AND_SCALE_IMAGE_ACTION_ID='load_and_scale_image', UPDATE_SPECIAL_FAVORITE_FOLDER_ACTION_ID='update_special_favorite_folder' (в r24 их нет) - fw-tv188b-261021-0117-r25--php-framework.c007 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Аннотации dune_api.php r25 задают поля CondActionData: pattern — (char *); post_action — (GuiAction *). - fw-tv188b-261021-0117-r25.c013 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · dune_api.php r25: CondActionData {pattern, post_action}, LoadAndScaleImageActionData {icon_url, local_path, scale_if_needed, icon_width, icon_height, post_action}, UpdateSpecialFavoriteFolderActionData {name, delete, skip_interactions, post_action}, ApplyHashDirtiesActionData {post_action} [^315]: doc-sdk-plugins--gui-actions.c114 · doc · any-documented; прошивка — · RunBuiltinAction (данные RunBuiltinActionData: builtin_action_id, params, post_action) введено для внутренних целей и запускает встроенную функцию по builtin_action_id с параметрами params; доступно с прошивки 130315_b6 [^316]: doc-sdk-plugins--gui-actions.c115 · doc · any-documented; прошивка — · Список публичных встроенных действий для RunBuiltinAction зависит от прошивки и (по документу) пуст [^317]: fw-tv188b-260827-0003-r24--plugin-loader--manifest.c018 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Встроенные shell_ext и kartina_tv_launcher задают у entry_point элемент is_shown_action (действие run_builtin с builtin_action_id), а элемента show_action нет ни в одном встроенном манифесте [^318]: - fw-tv188b-260827-0003-r24--php-framework.c118 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php (раздел «GUI-action ids») определяет идентификаторы действий GUI: RESET_CONTROLS_ACTION_ID='reset_controls', RESTART_ACTION_ID='restart', RUN_BUILTIN_ACTION_ID='run_builtin', RUN_DEFAULT_ACTION_ID='run_default', SET_RESTRICTED_ACTION_ID='set_restricted', SET_TIME_ZONE_ACTION_ID='set_time_zone', SHOW_BLACK_SCREEN_ACTION_ID='show_black_screen', SHOW_DIALOG_ACTION_ID='show_dialog', SHOW_GCOMPS_DIALOG_ACTION_ID='show_gcomps', SHOW_MAIN_SCREEN_ACTION_ID='show_main_screen', SHOW_POPUP_MENU_ACTION_ID='show_popup_menu', SLEEP_ACTION_ID='sleep', START_SERVICE_ACTION_ID='start_service', STATUS_ACTION_ID='status', STOP_PLAYBACK_ACTION_ID='stop_playback' - fw-tv188b-260827-0003-r24--php-framework.c261 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс RunBuiltinActionData с ключами (4): builtin_action_id, params, post_action, error_action - fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c042 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · ActionFactory::run_builtin строит действие run_builtin; схема заполнения использует RunBuiltinActionData::{builtin_action_id, params, post_action, error_action}. [^319]: fw-tv188b-261021-0117-r25--php-framework--native-actions.c060 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В d-default запроса 12 ENTER на первом пункте открытой контрольной папки KB12 reg привёл к ответу run_default с event=key_info и post_action с tag=a_default; шаг a_default записал begin и end. [^320]: fw-tv188b-261021-0117-r25--php-framework--native-actions.c061 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В d-default запроса 12 оболочка получила от handle_user_input действие kb_probe12->run_default и сразу записала «action D: not recognized kb_probe12->run_default()». [^321]: fw-tv188b-261021-0117-r25--php-framework--native-actions.c062 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · После run_default из открытой папки в d-default запроса 12 в сохранённых handle_user_input(post) не видно tag=a_default ни сразу, ни после BACK; показаны только два reg_enter, и PHP-сервер 6964 ещё жив. [^322]: - fw-tv188b-260827-0003-r24--php-framework.c118 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php (раздел «GUI-action ids») определяет идентификаторы действий GUI: RESET_CONTROLS_ACTION_ID='reset_controls', RESTART_ACTION_ID='restart', RUN_BUILTIN_ACTION_ID='run_builtin', RUN_DEFAULT_ACTION_ID='run_default', SET_RESTRICTED_ACTION_ID='set_restricted', SET_TIME_ZONE_ACTION_ID='set_time_zone', SHOW_BLACK_SCREEN_ACTION_ID='show_black_screen', SHOW_DIALOG_ACTION_ID='show_dialog', SHOW_GCOMPS_DIALOG_ACTION_ID='show_gcomps', SHOW_MAIN_SCREEN_ACTION_ID='show_main_screen', SHOW_POPUP_MENU_ACTION_ID='show_popup_menu', SLEEP_ACTION_ID='sleep', START_SERVICE_ACTION_ID='start_service', STATUS_ACTION_ID='status', STOP_PLAYBACK_ACTION_ID='stop_playback' - fw-tv188b-260827-0003-r24--php-framework.c262 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс RunDefaultActionData с ключами (2): event, post_action - fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c016 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · ActionFactory::run_default строит действие run_default; схема заполнения использует RunDefaultActionData::{event, post_action}. [^323]: fw-tv188b-261021-0117-r25.c340 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 строковый id plugin_system в boot-действии выполнен: shell.log пишет action D: exec_all plugin_system и Running system(sh <плагин>/bin/ga.sh boot). [^324]: - 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' - fw-tv188b-260827-0003-r24--php-framework.c233 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс PluginSystemActionData с ключами (2): run_string, post_action - fw-tv188b-261021-0117-r25--php-framework.c014 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Аннотации dune_api.php r25 задают поля PluginSystemActionData: handle_response — bool. - fw-tv188b-260827-0003-r24--plugin-loader--gui-actions.c035 · code · android-dune-fw; прошивка 260827_0003_r24 · В strings libduneshell.so есть диагностики чтения полей PluginSystemActionData: run_string (string); post_action (object). [^325]: doc-sdk-plugins--gui-actions.c074 · doc · any-documented; прошивка — · PluginRunNativeCode не имеет данных; загружает библиотеку native_code.so из каталога установки плагина и пытается вызвать из неё некоторую функцию [^326]: fw-tv188b-261021-0117-r25.c337 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 строковый id plugin_run_native_code в ответе handle_user_input выполнен: shell.log пишет result action plugin_run_native_code, вызывает plugin_run_native_code(/flashdata/plugins/kb_probe5, kbp5_native) и передаёт native_code.so в [native_plugins_handler] open plugin. [^327]: - fw-tv188b-261021-0117-r25.c284 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 на действие plugin_run_native_code оболочка вызывает plugin_run_native_code с каталогом плагина /flashdata/plugins/<плагин> и media_url точки входа, из которой запущено действие (plugin_run_native_code(/flashdata/plugins/kb_probe5, kbp5_native)). - fw-tv188b-261021-0117-r25.c285 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 по действию plugin_run_native_code оболочка открывает библиотеку по пути /flashdata/plugins/<плагин>/native_code.so (в логе без $FS_PREFIX); если файла нет, в shell.log — «cannot open …: dlopen failed: library "…" not found». [^328]: 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' [^329]: - fw-tv188b-261021-0117-r25.c008 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · dune_api.php r25 добавляет идентификаторы GUI-действий APPLY_HASH_DIRTIES_ACTION_ID='apply_hash_dirties', COND_ACTION_ID='cond', FS_CTL_ACTION_ID='fs_ctl', LOAD_AND_SCALE_IMAGE_ACTION_ID='load_and_scale_image', UPDATE_SPECIAL_FAVORITE_FOLDER_ACTION_ID='update_special_favorite_folder' (в r24 их нет) - fw-tv188b-261021-0117-r25--php-framework.c002 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Аннотации dune_api.php r25 задают поля FsCtlActionData: cmd — (FsCmdDef *); output_path — (char *); post_action — (GuiAction *). - fw-tv188b-261021-0117-r25.c012 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · dune_api.php r25 вводит файловые команды для действия fs_ctl: перечисление FsCmdKind (resolve_url, stat, scandir, get_file) и классы FsCtlActionData {cmd, output_path, post_action}, FsCmdDef {kind, specific_def}, FsResolveUrlDef {url, try_mount_if_needed}, FsStatDef {path}, FsScandirDef {path, with_stat, max_items_count}, FsGetFileDef {path, target_path, skip, max_size, chunk_size} [^330]: - fw-tv188b-261021-0117-r25.c008 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · dune_api.php r25 добавляет идентификаторы GUI-действий APPLY_HASH_DIRTIES_ACTION_ID='apply_hash_dirties', COND_ACTION_ID='cond', FS_CTL_ACTION_ID='fs_ctl', LOAD_AND_SCALE_IMAGE_ACTION_ID='load_and_scale_image', UPDATE_SPECIAL_FAVORITE_FOLDER_ACTION_ID='update_special_favorite_folder' (в r24 их нет) - fw-tv188b-261021-0117-r25--php-framework.c008 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Аннотации dune_api.php r25 задают поля LoadAndScaleImageActionData: icon_url — (char *); local_path — (char *); scale_if_needed — bool; icon_width — int; icon_height — int; post_action — (GuiAction *). - fw-tv188b-261021-0117-r25.c013 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · dune_api.php r25: CondActionData {pattern, post_action}, LoadAndScaleImageActionData {icon_url, local_path, scale_if_needed, icon_width, icon_height, post_action}, UpdateSpecialFavoriteFolderActionData {name, delete, skip_interactions, post_action}, ApplyHashDirtiesActionData {post_action} - fw-tv188b-261021-0117-r25--php-framework.c025 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · ActionFactory::load_and_scale_image(icon_url, local_path, scale_if_needed=false, icon_width=0, icon_height=0, post_action=null) возвращает GuiAction load_and_scale_image; scale_if_needed=1 и размеры добавляются только при истинном scale_if_needed, post_action — только если непуст. [^331]: doc-sdk-plugins--gui-actions.c117 · doc · any-documented; прошивка — · WgetAction (данные WgetActionData: url, post_data, result_key_prefix, post_action) выполняет HTTP-запрос на url с post_data и передаёт статус и данные результата в post_action; доступно с прошивки 130924_b9 [^332]: doc-sdk-plugins--gui-actions.c118 · doc · any-documented; прошивка — · WgetAction настоятельно не рекомендуется использовать из PHP-плагинов (введено для внутренних нужд); для HTTP-запросов плагины должны использовать нативные методы curl [^333]: fw-tv188b-261021-0117-r25--shell-ext--movies.c022 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На stage 2 оболочка запускает асинхронную проверку ActionFactory::wget по префиксу API с таймаутом 40 с, id se_ping_ и result_key_prefix 'ping_'; на stage 3 принимает только ответ с ping_id, равным последнему id, и при ping_status == succeeded продолжает запуск, иначе показывает «нет подключения к интернету». [^334]: - fw-tv188b-260827-0003-r24--php-framework.c119 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php (раздел «GUI-action ids») определяет идентификаторы действий GUI: SWITCH_OSD_MODE_ACTION_ID='switch_osd_mode', SYNC_MY_COLLECTION_ACTION_ID='sync_my_collection', UNINSTALL_APK_ACTION_ID='uninstall_apk', UPDATE_DVB_CHANNELS_ACTION_ID='update_dvb_channels', UPDATE_FOLDER_MARKS_ACTION_ID='update_folder_marks', UPDATE_IMAGES_ACTION_ID='update_images', UPDATE_TV_INFO_ACTION_ID='update_tv_info', UPDATE_WATCHED_MARKS_ACTION_ID='update_watched_marks', WAIT_EXT_APP_START_ACTION_ID='wait_ext_app_start', WAIT_FOR_IP_ADDRESS_ACTION_ID='wait_for_ip_address', WAKE_NETWORK_FOLDER_ACTION_ID='wake_network_folder', WGET_ACTION_ID='wget' - fw-tv188b-260827-0003-r24--php-framework.c288 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс WgetActionData с ключами (8): id, url, post_data, curl_opts, target_path, target_cmd, result_key_prefix, post_action - fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c043 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · ActionFactory::wget строит действие wget; схема заполнения использует WgetActionData::{id, url, post_data, curl_opts, target_path, result_key_prefix, post_action}. [^335]: - fw-tv188b-260827-0003-r24--php-framework.c119 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php (раздел «GUI-action ids») определяет идентификаторы действий GUI: SWITCH_OSD_MODE_ACTION_ID='switch_osd_mode', SYNC_MY_COLLECTION_ACTION_ID='sync_my_collection', UNINSTALL_APK_ACTION_ID='uninstall_apk', UPDATE_DVB_CHANNELS_ACTION_ID='update_dvb_channels', UPDATE_FOLDER_MARKS_ACTION_ID='update_folder_marks', UPDATE_IMAGES_ACTION_ID='update_images', UPDATE_TV_INFO_ACTION_ID='update_tv_info', UPDATE_WATCHED_MARKS_ACTION_ID='update_watched_marks', WAIT_EXT_APP_START_ACTION_ID='wait_ext_app_start', WAIT_FOR_IP_ADDRESS_ACTION_ID='wait_for_ip_address', WAKE_NETWORK_FOLDER_ACTION_ID='wake_network_folder', WGET_ACTION_ID='wget' - fw-tv188b-260827-0003-r24--php-framework.c280 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс UpdateImagesActionData с ключами (5): url_prefix, storage_dir_name, names, title, post_action [^336]: doc-sdk-plugins--gui-actions.c120 · doc · any-documented; прошивка — · ChangeSettingsAction меняет внутренние настройки Dune парами setting_name → setting_value из settings; перечень имён и значений настроек в документ не входит [^337]: doc-sdk-plugins--gui-actions.c124 · doc · any-documented; прошивка — · В режиме TV/VOD-воспроизведения плагина ChangeSettingsAction не действует [^338]: fw-tv188b-261021-0117-r25.c072 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 ChangeSettingsAction с restart_gui=true, reboot=false и пустыми settings перезапускает приложение Dune, а не приставку. Оболочка пишет «APK: trigger restart», pid com.dunehd.app меняется 17983 → 19586, а /proc/uptime растёт непрерывно (129033 → 129116 с). [^339]: fw-tv188b-261021-0117-r25.c338 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 строковый id change_settings в ответе handle_user_input выполнен: shell.log пишет result action change_settings и action D: (general) run kb_probe5->change_settings(). [^340]: - fw-tv188b-260827-0003-r24--php-framework.c114 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php (раздел «GUI-action ids») определяет идентификаторы действий GUI: ADD_MENU_ITEMS_ACTION_ID='add_menu_items', ADD_TO_FAVORITES_ACTION_ID='add_to_favorites', BLURAY_PLAY_ACTION_ID='bluray_play', BT_COMMAND_ACTION_ID='bt_command', CHANGE_BEHAVIOUR_ACTION_ID='change_behaviour', CHANGE_GCOMPS_ACTION_ID='change_gcomps', CHANGE_LIST_CONFIG_ACTION_ID='change_list_config', CHANGE_MOVIE_DATA_ACTION_ID='change_movie_data', CHANGE_PARENTAL_CODE_ACTION_ID='change_parental_code', CHANGE_SETTINGS_ACTION_ID='change_settings', CHECK_RESTRICTED_ACTION_ID='check_restricted', CHECK_SYSTEM_STORAGE_ACTION_ID='check_system_storage', CHOOSE_FILE_ACTION_ID='choose_file', CLEAR_WATCH_HISTORY_ACTION_ID='clear_watch_history', CLOSE_AND_RUN_ACTION_ID='close_and_run' - fw-tv188b-260827-0003-r24--php-framework.c133 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс ChangeSettingsActionData с ключами (4): settings, reboot, restart_gui, post_action - fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c045 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · ActionFactory::change_settings строит действие change_settings; схема заполнения использует ChangeSettingsActionData::{settings, reboot, restart_gui, post_action}. [^341]: fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c046 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · ActionFactory::restart строит действие restart; схема заполнения использует RestartActionData::{reboot}. [^342]: fw-tv188b-261021-0117-r25--php-framework--native-actions.c076 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · restart: фабрика shell_ext и bt_setup передаёт только data reboot, android_apps — reboot и factory_reset; android_apps выдаёт restart(true) после записи AUTOSTART_ONCE_FILE, а пункт reset_settings — close_dialog_and_run(restart(false, true)). [^343]: - fw-tv188b-260827-0003-r24--php-framework.c118 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php (раздел «GUI-action ids») определяет идентификаторы действий GUI: RESET_CONTROLS_ACTION_ID='reset_controls', RESTART_ACTION_ID='restart', RUN_BUILTIN_ACTION_ID='run_builtin', RUN_DEFAULT_ACTION_ID='run_default', SET_RESTRICTED_ACTION_ID='set_restricted', SET_TIME_ZONE_ACTION_ID='set_time_zone', SHOW_BLACK_SCREEN_ACTION_ID='show_black_screen', SHOW_DIALOG_ACTION_ID='show_dialog', SHOW_GCOMPS_DIALOG_ACTION_ID='show_gcomps', SHOW_MAIN_SCREEN_ACTION_ID='show_main_screen', SHOW_POPUP_MENU_ACTION_ID='show_popup_menu', SLEEP_ACTION_ID='sleep', START_SERVICE_ACTION_ID='start_service', STATUS_ACTION_ID='status', STOP_PLAYBACK_ACTION_ID='stop_playback' - fw-tv188b-260827-0003-r24--php-framework.c260 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс RestartActionData с ключами (2): reboot, factory_reset - fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c046 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · ActionFactory::restart строит действие restart; схема заполнения использует RestartActionData::{reboot}. [^344]: - fw-tv188b-260827-0003-r24--php-framework.c118 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php (раздел «GUI-action ids») определяет идентификаторы действий GUI: RESET_CONTROLS_ACTION_ID='reset_controls', RESTART_ACTION_ID='restart', RUN_BUILTIN_ACTION_ID='run_builtin', RUN_DEFAULT_ACTION_ID='run_default', SET_RESTRICTED_ACTION_ID='set_restricted', SET_TIME_ZONE_ACTION_ID='set_time_zone', SHOW_BLACK_SCREEN_ACTION_ID='show_black_screen', SHOW_DIALOG_ACTION_ID='show_dialog', SHOW_GCOMPS_DIALOG_ACTION_ID='show_gcomps', SHOW_MAIN_SCREEN_ACTION_ID='show_main_screen', SHOW_POPUP_MENU_ACTION_ID='show_popup_menu', SLEEP_ACTION_ID='sleep', START_SERVICE_ACTION_ID='start_service', STATUS_ACTION_ID='status', STOP_PLAYBACK_ACTION_ID='stop_playback' - fw-tv188b-260827-0003-r24--php-framework.c264 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс SetTimeZoneActionData с ключами (5): offset_sec, has_dst, olson_id, preferred_olson_ids, post_action [^345]: - fw-tv188b-260827-0003-r24--php-framework.c115 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php (раздел «GUI-action ids») определяет идентификаторы действий GUI: CLOSE_DIALOG_AND_RUN_ACTION_ID='close_dialog_and_run', COMPOSITE_ACTION_ID='composite', CONFIRM_LOCATION_ACTION_ID='confirm_location', CREATE_NETWORK_FOLDER_ACTION_ID='create_network_folder', CUSTOM_IGNORE_UPDATE_ACTION_ID='custom_ignore_update', DETECT_SERIES_ACTION_ID='detect_series', DOWNLOAD_AND_INSTALL_APK_ACTION_ID='download_and_install_apk', DVB_COMMAND_ACTION_ID='dvb_command', DVD_PLAY_ACTION_ID='dvd_play', EDIT_LIST_CONFIG_ACTION_ID='edit_list_config', EDIT_MAIN_SCREEN_ACTION_ID='edit_main_screen', EDIT_MOVIE_DATA_ACTION_ID='edit_movie_data', FILE_PLAY_ACTION_ID='file_play', INIT_PERSISTFS_ACTION_ID='init_persistfs', INVALIDATE_FILES_ASSOCIATIONS_ACTION_ID='invalidate_files_associations' - fw-tv188b-260827-0003-r24--php-framework.c141 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс ConfirmLocationActionData с ключами (1): post_action [^346]: doc-sdk-plugins--gui-actions.c116 · doc · any-documented; прошивка — · WaitForIpAddressAction (данные WaitForIpAddressActionData: timeout_sec, post_action): если IP-адрес по DHCP ещё не получен, показывает стандартный диалог «Wait For IP Address», пока адрес не получен или не прошло timeout_sec секунд; доступно с прошивки 130914_b8 [^347]: - fw-tv188b-260827-0003-r24--php-framework.c119 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php (раздел «GUI-action ids») определяет идентификаторы действий GUI: SWITCH_OSD_MODE_ACTION_ID='switch_osd_mode', SYNC_MY_COLLECTION_ACTION_ID='sync_my_collection', UNINSTALL_APK_ACTION_ID='uninstall_apk', UPDATE_DVB_CHANNELS_ACTION_ID='update_dvb_channels', UPDATE_FOLDER_MARKS_ACTION_ID='update_folder_marks', UPDATE_IMAGES_ACTION_ID='update_images', UPDATE_TV_INFO_ACTION_ID='update_tv_info', UPDATE_WATCHED_MARKS_ACTION_ID='update_watched_marks', WAIT_EXT_APP_START_ACTION_ID='wait_ext_app_start', WAIT_FOR_IP_ADDRESS_ACTION_ID='wait_for_ip_address', WAKE_NETWORK_FOLDER_ACTION_ID='wake_network_folder', WGET_ACTION_ID='wget' - fw-tv188b-260827-0003-r24--php-framework.c286 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс WaitForIpAddressActionData с ключами (2): timeout_sec, post_action - doc-sdk-plugins--gui-actions.c116 · doc · any-documented; прошивка — · WaitForIpAddressAction (данные WaitForIpAddressActionData: timeout_sec, post_action): если IP-адрес по DHCP ещё не получен, показывает стандартный диалог «Wait For IP Address», пока адрес не получен или не прошло timeout_sec секунд; доступно с прошивки 130914_b8 [^348]: - fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c210 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · ActionFactory::check_system_storage принимает title, но возвращаемый массив data содержит только required_space, recommended_space, messages и post_action. - fw-tv188b-261021-0117-r25--php-framework--native-actions.c077 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Фабрика check_system_storage shell_ext принимает $title, но в data кладёт только required_space, recommended_space, messages и post_action — title не передаётся; вызывающие (setup_data_storage, setup_folder, setup_all_folders) выдают check_system_storage(0, 0, null, array(), …) и в продолжении ветвятся по $user_input->check_succeeded. [^349]: fw-tv188b-261021-0117-r25--php-framework--native-actions.c077 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Фабрика check_system_storage shell_ext принимает $title, но в data кладёт только required_space, recommended_space, messages и post_action — title не передаётся; вызывающие (setup_data_storage, setup_folder, setup_all_folders) выдают check_system_storage(0, 0, null, array(), …) и в продолжении ветвятся по $user_input->check_succeeded. [^350]: - fw-tv188b-260827-0003-r24--php-framework.c114 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php (раздел «GUI-action ids») определяет идентификаторы действий GUI: ADD_MENU_ITEMS_ACTION_ID='add_menu_items', ADD_TO_FAVORITES_ACTION_ID='add_to_favorites', BLURAY_PLAY_ACTION_ID='bluray_play', BT_COMMAND_ACTION_ID='bt_command', CHANGE_BEHAVIOUR_ACTION_ID='change_behaviour', CHANGE_GCOMPS_ACTION_ID='change_gcomps', CHANGE_LIST_CONFIG_ACTION_ID='change_list_config', CHANGE_MOVIE_DATA_ACTION_ID='change_movie_data', CHANGE_PARENTAL_CODE_ACTION_ID='change_parental_code', CHANGE_SETTINGS_ACTION_ID='change_settings', CHECK_RESTRICTED_ACTION_ID='check_restricted', CHECK_SYSTEM_STORAGE_ACTION_ID='check_system_storage', CHOOSE_FILE_ACTION_ID='choose_file', CLEAR_WATCH_HISTORY_ACTION_ID='clear_watch_history', CLOSE_AND_RUN_ACTION_ID='close_and_run' - fw-tv188b-260827-0003-r24--php-framework.c135 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс CheckSystemStorageActionData с ключами (5): required_space, recommended_space, title, messages, post_action - fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c049 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · ActionFactory::check_system_storage строит действие check_system_storage; схема заполнения использует CheckSystemStorageActionData::{required_space, recommended_space, messages, post_action}. Параметр title принят, но в data не записан. [^351]: - fw-tv188b-260827-0003-r24--php-framework.c115 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php (раздел «GUI-action ids») определяет идентификаторы действий GUI: CLOSE_DIALOG_AND_RUN_ACTION_ID='close_dialog_and_run', COMPOSITE_ACTION_ID='composite', CONFIRM_LOCATION_ACTION_ID='confirm_location', CREATE_NETWORK_FOLDER_ACTION_ID='create_network_folder', CUSTOM_IGNORE_UPDATE_ACTION_ID='custom_ignore_update', DETECT_SERIES_ACTION_ID='detect_series', DOWNLOAD_AND_INSTALL_APK_ACTION_ID='download_and_install_apk', DVB_COMMAND_ACTION_ID='dvb_command', DVD_PLAY_ACTION_ID='dvd_play', EDIT_LIST_CONFIG_ACTION_ID='edit_list_config', EDIT_MAIN_SCREEN_ACTION_ID='edit_main_screen', EDIT_MOVIE_DATA_ACTION_ID='edit_movie_data', FILE_PLAY_ACTION_ID='file_play', INIT_PERSISTFS_ACTION_ID='init_persistfs', INVALIDATE_FILES_ASSOCIATIONS_ACTION_ID='invalidate_files_associations' - fw-tv188b-260827-0003-r24--php-framework.c191 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс InitPersistfsActionData с ключами (1): post_action [^352]: fw-tv188b-261021-0117-r25--php-framework--native-actions.c079 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · bt_command (data name, params, callback_action) bt_setup выдаёт с именами update_paired_devices_list, add_device, open_details, unpair_device, upgrade_device, setup_tv; в params — ключи bt_command_address, bt_command_fw_path, bt_command_fw_version, bt_command_force_reconnect. [^353]: - fw-tv188b-260827-0003-r24--php-framework.c114 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php (раздел «GUI-action ids») определяет идентификаторы действий GUI: ADD_MENU_ITEMS_ACTION_ID='add_menu_items', ADD_TO_FAVORITES_ACTION_ID='add_to_favorites', BLURAY_PLAY_ACTION_ID='bluray_play', BT_COMMAND_ACTION_ID='bt_command', CHANGE_BEHAVIOUR_ACTION_ID='change_behaviour', CHANGE_GCOMPS_ACTION_ID='change_gcomps', CHANGE_LIST_CONFIG_ACTION_ID='change_list_config', CHANGE_MOVIE_DATA_ACTION_ID='change_movie_data', CHANGE_PARENTAL_CODE_ACTION_ID='change_parental_code', CHANGE_SETTINGS_ACTION_ID='change_settings', CHECK_RESTRICTED_ACTION_ID='check_restricted', CHECK_SYSTEM_STORAGE_ACTION_ID='check_system_storage', CHOOSE_FILE_ACTION_ID='choose_file', CLEAR_WATCH_HISTORY_ACTION_ID='clear_watch_history', CLOSE_AND_RUN_ACTION_ID='close_and_run' - fw-tv188b-260827-0003-r24--php-framework.c125 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс BtCommandActionData с ключами (3): name, params, callback_action [^354]: fw-tv188b-261021-0117-r25.c136 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 строку «am start …» действия launch_ext_app приложение разбирает само, без запуска am или sh: apk_helper делит её на список аргументов (одинарные кавычки снимаются: «-p 'com.android.tv.settings' -a … -c …» → args(6) «-p, com.android.tv.settings, -a, …»), и activity стартует AndroidJavaUtils в процессе приложения com.dunehd.app. [^355]: fw-tv188b-261021-0117-r25.c137 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 при «activity launch status: -1» действие launch_ext_app из ответа start_playback_app выполнило свой error_action: сразу за этим в shell.log «running gui show_error(0, Не удалось запустить воспроизведение)», на экране это сообщение, приложение не открылось. [^356]: - 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' - fw-tv188b-260827-0003-r24--php-framework.c193 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс LaunchExtAppActionData с ключами (8): cmd, ensure_playback_stopped, delay, package, version, msg_toast, params, error_action - fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c051 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · ActionFactory::launch_ext_app строит действие launch_ext_app; схема заполнения использует LaunchExtAppActionData::{cmd, ensure_playback_stopped, delay, package, msg_toast, error_action}. [^357]: - fw-tv188b-260827-0003-r24--php-framework.c119 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php (раздел «GUI-action ids») определяет идентификаторы действий GUI: SWITCH_OSD_MODE_ACTION_ID='switch_osd_mode', SYNC_MY_COLLECTION_ACTION_ID='sync_my_collection', UNINSTALL_APK_ACTION_ID='uninstall_apk', UPDATE_DVB_CHANNELS_ACTION_ID='update_dvb_channels', UPDATE_FOLDER_MARKS_ACTION_ID='update_folder_marks', UPDATE_IMAGES_ACTION_ID='update_images', UPDATE_TV_INFO_ACTION_ID='update_tv_info', UPDATE_WATCHED_MARKS_ACTION_ID='update_watched_marks', WAIT_EXT_APP_START_ACTION_ID='wait_ext_app_start', WAIT_FOR_IP_ADDRESS_ACTION_ID='wait_for_ip_address', WAKE_NETWORK_FOLDER_ACTION_ID='wake_network_folder', WGET_ACTION_ID='wget' - fw-tv188b-260827-0003-r24--php-framework.c285 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс WaitExtAppStartActionData с ключами (3): delay, package, error_action - fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c050 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · ActionFactory::wait_ext_app_start строит действие wait_ext_app_start; схема заполнения использует WaitExtAppStartActionData::{delay, package, error_action}. [^358]: - fw-tv188b-260827-0003-r24--php-framework.c118 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php (раздел «GUI-action ids») определяет идентификаторы действий GUI: RESET_CONTROLS_ACTION_ID='reset_controls', RESTART_ACTION_ID='restart', RUN_BUILTIN_ACTION_ID='run_builtin', RUN_DEFAULT_ACTION_ID='run_default', SET_RESTRICTED_ACTION_ID='set_restricted', SET_TIME_ZONE_ACTION_ID='set_time_zone', SHOW_BLACK_SCREEN_ACTION_ID='show_black_screen', SHOW_DIALOG_ACTION_ID='show_dialog', SHOW_GCOMPS_DIALOG_ACTION_ID='show_gcomps', SHOW_MAIN_SCREEN_ACTION_ID='show_main_screen', SHOW_POPUP_MENU_ACTION_ID='show_popup_menu', SLEEP_ACTION_ID='sleep', START_SERVICE_ACTION_ID='start_service', STATUS_ACTION_ID='status', STOP_PLAYBACK_ACTION_ID='stop_playback' - fw-tv188b-260827-0003-r24--php-framework.c271 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс StartServiceActionData с ключами (5): class_name, package_name, params, delay_ms, post_action [^359]: fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c055 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · ActionFactory::install_from_market строит действие download_and_install_apk; схема заполнения использует DownloadAndInstallApkActionData::{caption, package, from_market, post_action}. from_market=true; тот же handler, что download_and_install_apk. [^360]: - fw-tv188b-260827-0003-r24--php-framework.c115 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php (раздел «GUI-action ids») определяет идентификаторы действий GUI: CLOSE_DIALOG_AND_RUN_ACTION_ID='close_dialog_and_run', COMPOSITE_ACTION_ID='composite', CONFIRM_LOCATION_ACTION_ID='confirm_location', CREATE_NETWORK_FOLDER_ACTION_ID='create_network_folder', CUSTOM_IGNORE_UPDATE_ACTION_ID='custom_ignore_update', DETECT_SERIES_ACTION_ID='detect_series', DOWNLOAD_AND_INSTALL_APK_ACTION_ID='download_and_install_apk', DVB_COMMAND_ACTION_ID='dvb_command', DVD_PLAY_ACTION_ID='dvd_play', EDIT_LIST_CONFIG_ACTION_ID='edit_list_config', EDIT_MAIN_SCREEN_ACTION_ID='edit_main_screen', EDIT_MOVIE_DATA_ACTION_ID='edit_movie_data', FILE_PLAY_ACTION_ID='file_play', INIT_PERSISTFS_ACTION_ID='init_persistfs', INVALIDATE_FILES_ASSOCIATIONS_ACTION_ID='invalidate_files_associations' - fw-tv188b-260827-0003-r24--php-framework.c145 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс DownloadAndInstallApkActionData с ключами (10): caption, package, src, from_market, urls, indirect, intro_dialog_urls, username, password, post_action - fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c054 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · ActionFactory::download_and_install_apk строит действие download_and_install_apk; схема заполнения использует DownloadAndInstallApkActionData::{caption, package, urls, indirect, intro_dialog_urls, post_action}. - fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c055 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · ActionFactory::install_from_market строит действие download_and_install_apk; схема заполнения использует DownloadAndInstallApkActionData::{caption, package, from_market, post_action}. from_market=true; тот же handler, что download_and_install_apk. [^361]: fw-tv188b-261021-0117-r25--php-framework--native-actions.c080 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Фабрика uninstall_apk android_apps строит uninstall_apk с data package, src (по умолчанию пустая строка), post_action; AppsScreen выдаёт её для установленного не системного приложения при HD::is_limited_apk() или непустом src, продолжение — тот же user_input с uninstall_performed=1, где для приложения с src читается action_status. [^362]: - fw-tv188b-260827-0003-r24--php-framework.c119 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php (раздел «GUI-action ids») определяет идентификаторы действий GUI: SWITCH_OSD_MODE_ACTION_ID='switch_osd_mode', SYNC_MY_COLLECTION_ACTION_ID='sync_my_collection', UNINSTALL_APK_ACTION_ID='uninstall_apk', UPDATE_DVB_CHANNELS_ACTION_ID='update_dvb_channels', UPDATE_FOLDER_MARKS_ACTION_ID='update_folder_marks', UPDATE_IMAGES_ACTION_ID='update_images', UPDATE_TV_INFO_ACTION_ID='update_tv_info', UPDATE_WATCHED_MARKS_ACTION_ID='update_watched_marks', WAIT_EXT_APP_START_ACTION_ID='wait_ext_app_start', WAIT_FOR_IP_ADDRESS_ACTION_ID='wait_for_ip_address', WAKE_NETWORK_FOLDER_ACTION_ID='wake_network_folder', WGET_ACTION_ID='wget' - fw-tv188b-260827-0003-r24--php-framework.c277 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс UninstallApkActionData с ключами (3): package, src, post_action [^363]: fw-tv188b-261021-0117-r25--shell-ext--ui-lib.c029 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · ActionFactory::add_to_favorites задаёт skip_interactions=false по умолчанию и добавляет data.skip_interactions=true только при истинном аргументе. [^364]: fw-tv188b-261021-0117-r25--shell-ext--ui-lib.c030 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · ActionFactory::add_to_favorites берёт icon_width и icon_height из params с умолчанием 0 и добавляет оба поля в data только когда оба больше 0. [^365]: - fw-tv188b-260827-0003-r24--php-framework.c114 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php (раздел «GUI-action ids») определяет идентификаторы действий GUI: ADD_MENU_ITEMS_ACTION_ID='add_menu_items', ADD_TO_FAVORITES_ACTION_ID='add_to_favorites', BLURAY_PLAY_ACTION_ID='bluray_play', BT_COMMAND_ACTION_ID='bt_command', CHANGE_BEHAVIOUR_ACTION_ID='change_behaviour', CHANGE_GCOMPS_ACTION_ID='change_gcomps', CHANGE_LIST_CONFIG_ACTION_ID='change_list_config', CHANGE_MOVIE_DATA_ACTION_ID='change_movie_data', CHANGE_PARENTAL_CODE_ACTION_ID='change_parental_code', CHANGE_SETTINGS_ACTION_ID='change_settings', CHECK_RESTRICTED_ACTION_ID='check_restricted', CHECK_SYSTEM_STORAGE_ACTION_ID='check_system_storage', CHOOSE_FILE_ACTION_ID='choose_file', CLEAR_WATCH_HISTORY_ACTION_ID='clear_watch_history', CLOSE_AND_RUN_ACTION_ID='close_and_run' - fw-tv188b-260827-0003-r24--php-framework.c123 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс AddToFavoritesActionData с ключами (8): media_url, caption, icon_url, icon_width, icon_height, badge_url, skip_interactions, post_action - fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c056 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · ActionFactory::add_to_favorites строит действие add_to_favorites; схема заполнения использует AddToFavoritesActionData::{media_url, caption, icon_url, skip_interactions, badge_url, post_action}. skip_interactions без default после аргументов с default; badge_url из params и post_action только при истинности. [^366]: fw-tv188b-261021-0117-r25--php-framework--native-actions.c081 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Фабрика remove_from_favorites shell_ext строит remove_from_favorites с data name и post_action; MovieHelper::remove_favorite_movie передаёт в name корневое имя из Favorites::remove_movie($id), BaseEntityScreen — id сущности с продолжением post_remove_from_favorites. [^367]: - fw-tv188b-260827-0003-r24--php-framework.c117 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php (раздел «GUI-action ids») определяет идентификаторы действий GUI: PLUGIN_TV_SELECT_CHANNEL_ACTION_ID='plugin_tv_select_channel', PLUGIN_UPDATE_ARCHIVE_CACHE_ACTION_ID='plugin_update_archive_cache', PLUGIN_UPDATE_EPF_MAPPING_ACTION_ID='plugin_update_epf_mapping', PLUGIN_UPDATE_EPG_ACTION_ID='plugin_update_epg', PLUGIN_UPDATE_FOLDER_ACTION_ID='plugin_update_folder', PLUGIN_UPDATE_INFO_BLOCK_ACTION_ID='plugin_update_info_block', PLUGIN_UPDATE_OSD_ACTION_ID='plugin_update_osd', PLUGIN_UPDATE_ROWS_INFO_ACTION_ID='plugin_update_rows_info', PLUGIN_UPDATE_ROWS_MENU_ACTION_ID='plugin_update_rows_menu', PLUGIN_UPDATE_STICKER_ACTION_ID='plugin_update_sticker', PLUGIN_UPDATE_TV_INFO_ACTION_ID='plugin_update_tv_info', PLUGIN_VOD_PLAY_ACTION_ID='plugin_vod_play', REMOVE_FROM_FAVORITES_ACTION_ID='remove_from_favorites', RENAME_MENU_ITEM_ACTION_ID='rename_menu_item', RENAME_PATH_ACTION_ID='rename_path' - fw-tv188b-260827-0003-r24--php-framework.c256 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс RemoveFromFavoritesActionData с ключами (2): name, post_action - fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c057 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · ActionFactory::remove_from_favorites строит действие remove_from_favorites; схема заполнения использует RemoveFromFavoritesActionData::{name, post_action}. [^368]: - fw-tv188b-261021-0117-r25.c008 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · dune_api.php r25 добавляет идентификаторы GUI-действий APPLY_HASH_DIRTIES_ACTION_ID='apply_hash_dirties', COND_ACTION_ID='cond', FS_CTL_ACTION_ID='fs_ctl', LOAD_AND_SCALE_IMAGE_ACTION_ID='load_and_scale_image', UPDATE_SPECIAL_FAVORITE_FOLDER_ACTION_ID='update_special_favorite_folder' (в r24 их нет) - fw-tv188b-261021-0117-r25--php-framework.c009 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Аннотации dune_api.php r25 задают поля UpdateSpecialFavoriteFolderActionData: name — (char *); delete — bool; skip_interactions — bool; post_action — (GuiAction *). - fw-tv188b-261021-0117-r25.c013 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · dune_api.php r25: CondActionData {pattern, post_action}, LoadAndScaleImageActionData {icon_url, local_path, scale_if_needed, icon_width, icon_height, post_action}, UpdateSpecialFavoriteFolderActionData {name, delete, skip_interactions, post_action}, ApplyHashDirtiesActionData {post_action} - fw-tv188b-261021-0117-r25--php-framework.c028 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · ActionFactory::update_special_favorite_folder(name, delete, post_action=null) возвращает GuiAction update_special_favorite_folder с этими тремя полями; объявленный skip_interactions фабрика не передаёт. [^369]: fw-tv188b-261021-0117-r25--shell-ext--android-apps.c068 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · apply_remote_config встроенного плагина при активном remote config и restrict_apps_by_remote_config генерирует список и возвращает edit_main_screen с CHANGE_OP_DELETE_ANDROID_APPS_EXCEPT и android_app: из apps. [^370]: - fw-tv188b-260827-0003-r24--php-framework.c115 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php (раздел «GUI-action ids») определяет идентификаторы действий GUI: CLOSE_DIALOG_AND_RUN_ACTION_ID='close_dialog_and_run', COMPOSITE_ACTION_ID='composite', CONFIRM_LOCATION_ACTION_ID='confirm_location', CREATE_NETWORK_FOLDER_ACTION_ID='create_network_folder', CUSTOM_IGNORE_UPDATE_ACTION_ID='custom_ignore_update', DETECT_SERIES_ACTION_ID='detect_series', DOWNLOAD_AND_INSTALL_APK_ACTION_ID='download_and_install_apk', DVB_COMMAND_ACTION_ID='dvb_command', DVD_PLAY_ACTION_ID='dvd_play', EDIT_LIST_CONFIG_ACTION_ID='edit_list_config', EDIT_MAIN_SCREEN_ACTION_ID='edit_main_screen', EDIT_MOVIE_DATA_ACTION_ID='edit_movie_data', FILE_PLAY_ACTION_ID='file_play', INIT_PERSISTFS_ACTION_ID='init_persistfs', INVALIDATE_FILES_ASSOCIATIONS_ACTION_ID='invalidate_files_associations' - fw-tv188b-260827-0003-r24--php-framework.c149 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс EditMainScreenActionData с ключами (5): change_op, ids, caption, icon_url, post_action [^371]: fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c048 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · ActionFactory::update_watched_marks строит действие update_watched_marks; схема заполнения использует UpdateWatchedMarksActionData::{watched, item_ids, movie_ids, post_action}. При пустых item_ids и movie_ids возвращает post_action; списки и post_action — по истинности. [^372]: fw-tv188b-261021-0117-r25--php-framework--native-actions.c082 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Фабрика update_watched_marks shell_ext при пустых item_ids и movie_ids возвращает post_action без действия; иначе data — watched и только непустые item_ids, movie_ids, post_action; MovieHelper выдаёт update_watched_marks(null, array($movie_id), true, …) — отметка фильма просмотренным. [^373]: - fw-tv188b-260827-0003-r24--php-framework.c119 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php (раздел «GUI-action ids») определяет идентификаторы действий GUI: SWITCH_OSD_MODE_ACTION_ID='switch_osd_mode', SYNC_MY_COLLECTION_ACTION_ID='sync_my_collection', UNINSTALL_APK_ACTION_ID='uninstall_apk', UPDATE_DVB_CHANNELS_ACTION_ID='update_dvb_channels', UPDATE_FOLDER_MARKS_ACTION_ID='update_folder_marks', UPDATE_IMAGES_ACTION_ID='update_images', UPDATE_TV_INFO_ACTION_ID='update_tv_info', UPDATE_WATCHED_MARKS_ACTION_ID='update_watched_marks', WAIT_EXT_APP_START_ACTION_ID='wait_ext_app_start', WAIT_FOR_IP_ADDRESS_ACTION_ID='wait_for_ip_address', WAKE_NETWORK_FOLDER_ACTION_ID='wake_network_folder', WGET_ACTION_ID='wget' - fw-tv188b-260827-0003-r24--php-framework.c282 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс UpdateWatchedMarksActionData с ключами (4): item_ids, movie_ids, watched, post_action - fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c048 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · ActionFactory::update_watched_marks строит действие update_watched_marks; схема заполнения использует UpdateWatchedMarksActionData::{watched, item_ids, movie_ids, post_action}. При пустых item_ids и movie_ids возвращает post_action; списки и post_action — по истинности. [^374]: fw-tv188b-261021-0117-r25--shell-ext--entry-handler--recent-views.c024 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Пункт «Очистить всё» в popup «Недавнего» r25 добавляется всегда и вызывает ActionFactory::clear_watch_history(null, full_update). [^375]: - fw-tv188b-260827-0003-r24--php-framework.c114 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php (раздел «GUI-action ids») определяет идентификаторы действий GUI: ADD_MENU_ITEMS_ACTION_ID='add_menu_items', ADD_TO_FAVORITES_ACTION_ID='add_to_favorites', BLURAY_PLAY_ACTION_ID='bluray_play', BT_COMMAND_ACTION_ID='bt_command', CHANGE_BEHAVIOUR_ACTION_ID='change_behaviour', CHANGE_GCOMPS_ACTION_ID='change_gcomps', CHANGE_LIST_CONFIG_ACTION_ID='change_list_config', CHANGE_MOVIE_DATA_ACTION_ID='change_movie_data', CHANGE_PARENTAL_CODE_ACTION_ID='change_parental_code', CHANGE_SETTINGS_ACTION_ID='change_settings', CHECK_RESTRICTED_ACTION_ID='check_restricted', CHECK_SYSTEM_STORAGE_ACTION_ID='check_system_storage', CHOOSE_FILE_ACTION_ID='choose_file', CLEAR_WATCH_HISTORY_ACTION_ID='clear_watch_history', CLOSE_AND_RUN_ACTION_ID='close_and_run' - fw-tv188b-260827-0003-r24--php-framework.c137 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс ClearWatchHistoryActionData с ключами (2): item_ids, post_action - fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c047 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · ActionFactory::clear_watch_history строит действие clear_watch_history; схема заполнения использует ClearWatchHistoryActionData::{item_ids, post_action}. [^376]: - fw-tv188b-261021-0117-r25.c008 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · dune_api.php r25 добавляет идентификаторы GUI-действий APPLY_HASH_DIRTIES_ACTION_ID='apply_hash_dirties', COND_ACTION_ID='cond', FS_CTL_ACTION_ID='fs_ctl', LOAD_AND_SCALE_IMAGE_ACTION_ID='load_and_scale_image', UPDATE_SPECIAL_FAVORITE_FOLDER_ACTION_ID='update_special_favorite_folder' (в r24 их нет) - fw-tv188b-261021-0117-r25--php-framework.c010 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Аннотации dune_api.php r25 задают поля ApplyHashDirtiesActionData: post_action — (GuiAction *). - fw-tv188b-261021-0117-r25.c013 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · dune_api.php r25: CondActionData {pattern, post_action}, LoadAndScaleImageActionData {icon_url, local_path, scale_if_needed, icon_width, icon_height, post_action}, UpdateSpecialFavoriteFolderActionData {name, delete, skip_interactions, post_action}, ApplyHashDirtiesActionData {post_action} - fw-tv188b-261021-0117-r25--php-framework.c032 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · ActionFactory::apply_hash_dirties(post_action=null) возвращает GuiAction apply_hash_dirties, в data которого единственное поле post_action. [^377]: fw-tv188b-261021-0117-r25--shell-ext--ui-lib.c036 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · ActionFactory::sync_my_collection принимает только post_action=null и строит SYNC_MY_COLLECTION_ACTION_ID с data.post_action; аргумента и поля mcf_id в этой обёртке нет. [^378]: - fw-tv188b-260827-0003-r24--php-framework.c119 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php (раздел «GUI-action ids») определяет идентификаторы действий GUI: SWITCH_OSD_MODE_ACTION_ID='switch_osd_mode', SYNC_MY_COLLECTION_ACTION_ID='sync_my_collection', UNINSTALL_APK_ACTION_ID='uninstall_apk', UPDATE_DVB_CHANNELS_ACTION_ID='update_dvb_channels', UPDATE_FOLDER_MARKS_ACTION_ID='update_folder_marks', UPDATE_IMAGES_ACTION_ID='update_images', UPDATE_TV_INFO_ACTION_ID='update_tv_info', UPDATE_WATCHED_MARKS_ACTION_ID='update_watched_marks', WAIT_EXT_APP_START_ACTION_ID='wait_ext_app_start', WAIT_FOR_IP_ADDRESS_ACTION_ID='wait_for_ip_address', WAKE_NETWORK_FOLDER_ACTION_ID='wake_network_folder', WGET_ACTION_ID='wget' - fw-tv188b-260827-0003-r24--php-framework.c276 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс SyncMyCollectionActionData с ключами (2): mcf_id, post_action - fw-tv188b-261021-0117-r25.c015 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В r25 класс SyncMyCollectionActionData содержит только post_action: ключ mcf_id убран из dune_api.php, а ActionFactory::sync_my_collection в shell_ext/lib принимает только $post_action - 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-260827-0003-r24--shell-ext--ui-lib.c070 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · ActionFactory::sync_my_collection строит действие sync_my_collection; схема заполнения использует SyncMyCollectionActionData::{mcf_id, post_action}. mcf_id по умолчанию -1, приводится к string. [^379]: fw-tv188b-261021-0117-r25--php-framework--native-actions.c083 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Фабрика edit_movie_data shell_ext строит edit_movie_data с data movie_id и post_action; GuiCommon по control_id edit_movie_data (пункт меню navigator_popup_edit_movie_data) выдаёт её с продолжением update_on_movie_change, которое реагирует, только если movie_data_changed или change_movie_data_status > 0. [^380]: - fw-tv188b-260827-0003-r24--php-framework.c115 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php (раздел «GUI-action ids») определяет идентификаторы действий GUI: CLOSE_DIALOG_AND_RUN_ACTION_ID='close_dialog_and_run', COMPOSITE_ACTION_ID='composite', CONFIRM_LOCATION_ACTION_ID='confirm_location', CREATE_NETWORK_FOLDER_ACTION_ID='create_network_folder', CUSTOM_IGNORE_UPDATE_ACTION_ID='custom_ignore_update', DETECT_SERIES_ACTION_ID='detect_series', DOWNLOAD_AND_INSTALL_APK_ACTION_ID='download_and_install_apk', DVB_COMMAND_ACTION_ID='dvb_command', DVD_PLAY_ACTION_ID='dvd_play', EDIT_LIST_CONFIG_ACTION_ID='edit_list_config', EDIT_MAIN_SCREEN_ACTION_ID='edit_main_screen', EDIT_MOVIE_DATA_ACTION_ID='edit_movie_data', FILE_PLAY_ACTION_ID='file_play', INIT_PERSISTFS_ACTION_ID='init_persistfs', INVALIDATE_FILES_ASSOCIATIONS_ACTION_ID='invalidate_files_associations' - fw-tv188b-260827-0003-r24--php-framework.c150 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс EditMovieDataActionData с ключами (2): movie_id, post_action - 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-260827-0003-r24--shell-ext--ui-lib.c062 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · ActionFactory::edit_movie_data строит действие edit_movie_data; схема заполнения использует EditMovieDataActionData::{movie_id, post_action}. [^381]: fw-tv188b-261021-0117-r25--php-framework--native-actions.c085 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Фабрика change_movie_data shell_ext строит change_movie_data с data movie_ids_to_delete и post_action; CustomMoviesScreen выдаёт её после подтверждения очистки (весь список или clear_element — один фильм) с продолжением update_on_movie_change. [^382]: - fw-tv188b-260827-0003-r24--php-framework.c114 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php (раздел «GUI-action ids») определяет идентификаторы действий GUI: ADD_MENU_ITEMS_ACTION_ID='add_menu_items', ADD_TO_FAVORITES_ACTION_ID='add_to_favorites', BLURAY_PLAY_ACTION_ID='bluray_play', BT_COMMAND_ACTION_ID='bt_command', CHANGE_BEHAVIOUR_ACTION_ID='change_behaviour', CHANGE_GCOMPS_ACTION_ID='change_gcomps', CHANGE_LIST_CONFIG_ACTION_ID='change_list_config', CHANGE_MOVIE_DATA_ACTION_ID='change_movie_data', CHANGE_PARENTAL_CODE_ACTION_ID='change_parental_code', CHANGE_SETTINGS_ACTION_ID='change_settings', CHECK_RESTRICTED_ACTION_ID='check_restricted', CHECK_SYSTEM_STORAGE_ACTION_ID='check_system_storage', CHOOSE_FILE_ACTION_ID='choose_file', CLEAR_WATCH_HISTORY_ACTION_ID='clear_watch_history', CLOSE_AND_RUN_ACTION_ID='close_and_run' - fw-tv188b-260827-0003-r24--php-framework.c131 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс ChangeMovieDataActionData с ключами (2): movie_ids_to_delete, post_action - 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-260827-0003-r24--shell-ext--ui-lib.c063 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · ActionFactory::change_movie_data строит действие change_movie_data; схема заполнения использует ChangeMovieDataActionData::{movie_ids_to_delete, post_action}. [^383]: fw-tv188b-261021-0117-r25--shell-ext--ui-lib.c034 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · ActionFactory::edit_list_config принимает обязательный позиционный options между groups и sel_id и добавляет data.options только по истинности. [^384]: fw-tv188b-261021-0117-r25--php-framework--native-actions.c086 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Фабрика edit_list_config shell_ext всегда кладёт в data config_id, title, all_items, post_action, а checked_ids, groups, options, sel_id — только если заданы; MovieFilterDialog выдаёт её для настройки списка (годы, жанры) с заголовком configure_list_title и продолжением apply_edit_list — по смыслу диалог выбора отмеченных пунктов списка (inference). [^385]: - fw-tv188b-260827-0003-r24--php-framework.c115 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php (раздел «GUI-action ids») определяет идентификаторы действий GUI: CLOSE_DIALOG_AND_RUN_ACTION_ID='close_dialog_and_run', COMPOSITE_ACTION_ID='composite', CONFIRM_LOCATION_ACTION_ID='confirm_location', CREATE_NETWORK_FOLDER_ACTION_ID='create_network_folder', CUSTOM_IGNORE_UPDATE_ACTION_ID='custom_ignore_update', DETECT_SERIES_ACTION_ID='detect_series', DOWNLOAD_AND_INSTALL_APK_ACTION_ID='download_and_install_apk', DVB_COMMAND_ACTION_ID='dvb_command', DVD_PLAY_ACTION_ID='dvd_play', EDIT_LIST_CONFIG_ACTION_ID='edit_list_config', EDIT_MAIN_SCREEN_ACTION_ID='edit_main_screen', EDIT_MOVIE_DATA_ACTION_ID='edit_movie_data', FILE_PLAY_ACTION_ID='file_play', INIT_PERSISTFS_ACTION_ID='init_persistfs', INVALIDATE_FILES_ASSOCIATIONS_ACTION_ID='invalidate_files_associations' - fw-tv188b-260827-0003-r24--php-framework.c148 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс EditListConfigActionData с ключами (11): config_id, title, all_items, checked_ids, groups, def_id, options, close_item_params, dialog_params, sel_id, post_action - fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c061 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · ActionFactory::edit_list_config строит действие edit_list_config; схема заполнения использует EditListConfigActionData::{config_id, title, all_items, post_action, checked_ids, groups, sel_id}. checked_ids/groups при истинности; sel_id при isset. [^386]: - plg-dc-globaltv--list-config.c005 · code · unknown; прошивка — · ActionFactory::change_list_config всегда помещает config_id и post_action в данные ChangeListConfigActionData. - plg-dc-globaltv--list-config.c006 · code · unknown; прошивка — · В change_list_config поля set_default, def_id, ids_to_check, ids_to_uncheck и ids_to_def записываются только при истинном соответствующем аргументе. [^387]: - fw-tv188b-260827-0003-r24--php-framework.c114 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php (раздел «GUI-action ids») определяет идентификаторы действий GUI: ADD_MENU_ITEMS_ACTION_ID='add_menu_items', ADD_TO_FAVORITES_ACTION_ID='add_to_favorites', BLURAY_PLAY_ACTION_ID='bluray_play', BT_COMMAND_ACTION_ID='bt_command', CHANGE_BEHAVIOUR_ACTION_ID='change_behaviour', CHANGE_GCOMPS_ACTION_ID='change_gcomps', CHANGE_LIST_CONFIG_ACTION_ID='change_list_config', CHANGE_MOVIE_DATA_ACTION_ID='change_movie_data', CHANGE_PARENTAL_CODE_ACTION_ID='change_parental_code', CHANGE_SETTINGS_ACTION_ID='change_settings', CHECK_RESTRICTED_ACTION_ID='check_restricted', CHECK_SYSTEM_STORAGE_ACTION_ID='check_system_storage', CHOOSE_FILE_ACTION_ID='choose_file', CLEAR_WATCH_HISTORY_ACTION_ID='clear_watch_history', CLOSE_AND_RUN_ACTION_ID='close_and_run' - fw-tv188b-260827-0003-r24--php-framework.c130 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс ChangeListConfigActionData с ключами (8): config_id, set_default, def_id, ids_to_check, ids_to_uncheck, ids_to_def, order, post_action [^388]: fw-tv188b-260827-0003-r24--shell-ext--entry-handler.c173 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · В get_add_to_collection_action непустой nnf_url создаёт create_network_folder с продолжением add_to_collection, которое сохраняет только path. [^389]: - fw-tv188b-260827-0003-r24--php-framework.c115 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php (раздел «GUI-action ids») определяет идентификаторы действий GUI: CLOSE_DIALOG_AND_RUN_ACTION_ID='close_dialog_and_run', COMPOSITE_ACTION_ID='composite', CONFIRM_LOCATION_ACTION_ID='confirm_location', CREATE_NETWORK_FOLDER_ACTION_ID='create_network_folder', CUSTOM_IGNORE_UPDATE_ACTION_ID='custom_ignore_update', DETECT_SERIES_ACTION_ID='detect_series', DOWNLOAD_AND_INSTALL_APK_ACTION_ID='download_and_install_apk', DVB_COMMAND_ACTION_ID='dvb_command', DVD_PLAY_ACTION_ID='dvd_play', EDIT_LIST_CONFIG_ACTION_ID='edit_list_config', EDIT_MAIN_SCREEN_ACTION_ID='edit_main_screen', EDIT_MOVIE_DATA_ACTION_ID='edit_movie_data', FILE_PLAY_ACTION_ID='file_play', INIT_PERSISTFS_ACTION_ID='init_persistfs', INVALIDATE_FILES_ASSOCIATIONS_ACTION_ID='invalidate_files_associations' - fw-tv188b-260827-0003-r24--php-framework.c142 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс CreateNetworkFolderActionData с ключами (3): name, url, post_action - 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-260827-0003-r24--shell-ext--ui-lib.c053 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · ActionFactory::create_network_folder строит действие create_network_folder; схема заполнения использует CreateNetworkFolderActionData::{name, url, post_action}. [^390]: fw-tv188b-261021-0117-r25--shell-ext--entry-handler--movie-screen.c048 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · play_local_single_file для сетевой папки без wol_checked возвращает wake_network_folder с повтором входного действия и wol_checked=1; после проверки с action_status=0 прекращает запуск возвратом null. [^391]: - fw-tv188b-260827-0003-r24--php-framework.c119 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php (раздел «GUI-action ids») определяет идентификаторы действий GUI: SWITCH_OSD_MODE_ACTION_ID='switch_osd_mode', SYNC_MY_COLLECTION_ACTION_ID='sync_my_collection', UNINSTALL_APK_ACTION_ID='uninstall_apk', UPDATE_DVB_CHANNELS_ACTION_ID='update_dvb_channels', UPDATE_FOLDER_MARKS_ACTION_ID='update_folder_marks', UPDATE_IMAGES_ACTION_ID='update_images', UPDATE_TV_INFO_ACTION_ID='update_tv_info', UPDATE_WATCHED_MARKS_ACTION_ID='update_watched_marks', WAIT_EXT_APP_START_ACTION_ID='wait_ext_app_start', WAIT_FOR_IP_ADDRESS_ACTION_ID='wait_for_ip_address', WAKE_NETWORK_FOLDER_ACTION_ID='wake_network_folder', WGET_ACTION_ID='wget' - fw-tv188b-260827-0003-r24--php-framework.c287 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс WakeNetworkFolderActionData с ключами (2): folder_id, post_action - 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-260827-0003-r24--shell-ext--ui-lib.c052 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · ActionFactory::wake_network_folder строит действие wake_network_folder; схема заполнения использует WakeNetworkFolderActionData::{folder_id, post_action}. [^392]: fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c069 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · ActionFactory::custom_ignore_update строит действие custom_ignore_update; схема заполнения использует CustomIgnoreUpdateActionData::{add, quids, post_action}; строковый ключ is_dir. is_dir записан строковым ключом; add=true, is_dir=false. [^393]: fw-tv188b-261021-0117-r25--php-framework--native-actions.c087 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Фабрика custom_ignore_update shell_ext строит custom_ignore_update с data add (по умолчанию true), is_dir, quids и post_action; все три вызова передают add=false (очистка записи исключённых файлов, папка медиатеки) со списком quid вида «источник/путь». [^394]: - fw-tv188b-260827-0003-r24--php-framework.c115 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php (раздел «GUI-action ids») определяет идентификаторы действий GUI: CLOSE_DIALOG_AND_RUN_ACTION_ID='close_dialog_and_run', COMPOSITE_ACTION_ID='composite', CONFIRM_LOCATION_ACTION_ID='confirm_location', CREATE_NETWORK_FOLDER_ACTION_ID='create_network_folder', CUSTOM_IGNORE_UPDATE_ACTION_ID='custom_ignore_update', DETECT_SERIES_ACTION_ID='detect_series', DOWNLOAD_AND_INSTALL_APK_ACTION_ID='download_and_install_apk', DVB_COMMAND_ACTION_ID='dvb_command', DVD_PLAY_ACTION_ID='dvd_play', EDIT_LIST_CONFIG_ACTION_ID='edit_list_config', EDIT_MAIN_SCREEN_ACTION_ID='edit_main_screen', EDIT_MOVIE_DATA_ACTION_ID='edit_movie_data', FILE_PLAY_ACTION_ID='file_play', INIT_PERSISTFS_ACTION_ID='init_persistfs', INVALIDATE_FILES_ASSOCIATIONS_ACTION_ID='invalidate_files_associations' - fw-tv188b-260827-0003-r24--php-framework.c143 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс CustomIgnoreUpdateActionData с ключами (4): add, is_dir, quids, post_action - 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-260827-0003-r24--shell-ext--ui-lib.c069 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · ActionFactory::custom_ignore_update строит действие custom_ignore_update; схема заполнения использует CustomIgnoreUpdateActionData::{add, quids, post_action}; строковый ключ is_dir. is_dir записан строковым ключом; add=true, is_dir=false. [^395]: fw-tv188b-261021-0117-r25--php-framework--native-actions.c088 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Фабрика invalidate_files_associations shell_ext строит действие с data hashes, paths, folder_url, base_dir_path, base_cache_dpath, post_action (ключ all из InvalidateFilesAssociationsActionData не передаёт); MainEntryHandler после удаления файлов выдаёт её с paths удалённых файлов и folder_url папки (при folder_id != -1), затем reread_all_epfs(true). [^396]: - fw-tv188b-260827-0003-r24--php-framework.c115 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php (раздел «GUI-action ids») определяет идентификаторы действий GUI: CLOSE_DIALOG_AND_RUN_ACTION_ID='close_dialog_and_run', COMPOSITE_ACTION_ID='composite', CONFIRM_LOCATION_ACTION_ID='confirm_location', CREATE_NETWORK_FOLDER_ACTION_ID='create_network_folder', CUSTOM_IGNORE_UPDATE_ACTION_ID='custom_ignore_update', DETECT_SERIES_ACTION_ID='detect_series', DOWNLOAD_AND_INSTALL_APK_ACTION_ID='download_and_install_apk', DVB_COMMAND_ACTION_ID='dvb_command', DVD_PLAY_ACTION_ID='dvd_play', EDIT_LIST_CONFIG_ACTION_ID='edit_list_config', EDIT_MAIN_SCREEN_ACTION_ID='edit_main_screen', EDIT_MOVIE_DATA_ACTION_ID='edit_movie_data', FILE_PLAY_ACTION_ID='file_play', INIT_PERSISTFS_ACTION_ID='init_persistfs', INVALIDATE_FILES_ASSOCIATIONS_ACTION_ID='invalidate_files_associations' - fw-tv188b-260827-0003-r24--php-framework.c192 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс InvalidateFilesAssociationsActionData с ключами (7): all, hashes, paths, folder_url, base_dir_path, base_cache_dpath, post_action - fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c068 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · ActionFactory::invalidate_files_associations строит действие invalidate_files_associations; схема заполнения использует InvalidateFilesAssociationsActionData::{hashes, paths, folder_url, base_dir_path, base_cache_dpath, post_action}. [^397]: fw-tv188b-260827-0003-r24--shell-ext--entry-handler.c064 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · run_tv_app возвращает check_restricted для menu_item_id plugin:<имя> или android_app:<пакет>, пока pcontrol_checked не установлен. [^398]: - fw-tv188b-260827-0003-r24--php-framework.c114 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php (раздел «GUI-action ids») определяет идентификаторы действий GUI: ADD_MENU_ITEMS_ACTION_ID='add_menu_items', ADD_TO_FAVORITES_ACTION_ID='add_to_favorites', BLURAY_PLAY_ACTION_ID='bluray_play', BT_COMMAND_ACTION_ID='bt_command', CHANGE_BEHAVIOUR_ACTION_ID='change_behaviour', CHANGE_GCOMPS_ACTION_ID='change_gcomps', CHANGE_LIST_CONFIG_ACTION_ID='change_list_config', CHANGE_MOVIE_DATA_ACTION_ID='change_movie_data', CHANGE_PARENTAL_CODE_ACTION_ID='change_parental_code', CHANGE_SETTINGS_ACTION_ID='change_settings', CHECK_RESTRICTED_ACTION_ID='check_restricted', CHECK_SYSTEM_STORAGE_ACTION_ID='check_system_storage', CHOOSE_FILE_ACTION_ID='choose_file', CLEAR_WATCH_HISTORY_ACTION_ID='clear_watch_history', CLOSE_AND_RUN_ACTION_ID='close_and_run' - fw-tv188b-260827-0003-r24--php-framework.c134 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс CheckRestrictedActionData с ключами (2): id, post_action - fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c058 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · ActionFactory::check_restricted строит действие check_restricted; схема заполнения использует CheckRestrictedActionData::{id, post_action}. [^399]: fw-tv188b-261021-0117-r25--php-framework--native-actions.c089 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Фабрика set_restricted строит set_restricted с data id, restricted, post_action; AndroidApps переключает защиту пункта меню приложения: set_restricted($id, !$now_restricted, …), продолжение finalize_toggle_password перечитывает список ограниченных (reload_restricted) — по смыслу родительский контроль пункта меню (inference). [^400]: - fw-tv188b-260827-0003-r24--php-framework.c118 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php (раздел «GUI-action ids») определяет идентификаторы действий GUI: RESET_CONTROLS_ACTION_ID='reset_controls', RESTART_ACTION_ID='restart', RUN_BUILTIN_ACTION_ID='run_builtin', RUN_DEFAULT_ACTION_ID='run_default', SET_RESTRICTED_ACTION_ID='set_restricted', SET_TIME_ZONE_ACTION_ID='set_time_zone', SHOW_BLACK_SCREEN_ACTION_ID='show_black_screen', SHOW_DIALOG_ACTION_ID='show_dialog', SHOW_GCOMPS_DIALOG_ACTION_ID='show_gcomps', SHOW_MAIN_SCREEN_ACTION_ID='show_main_screen', SHOW_POPUP_MENU_ACTION_ID='show_popup_menu', SLEEP_ACTION_ID='sleep', START_SERVICE_ACTION_ID='start_service', STATUS_ACTION_ID='status', STOP_PLAYBACK_ACTION_ID='stop_playback' - fw-tv188b-260827-0003-r24--php-framework.c263 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс SetRestrictedActionData с ключами (3): id, restricted, post_action [^401]: plg-dc-globaltv.c111 · code · unknown; прошивка — · Смену родительского кода плагин запрашивает действием CHANGE_PARENTAL_CODE_ACTION_ID (ActionFactory::change_parental_code). [^402]: - fw-tv188b-260827-0003-r24--php-framework.c114 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php (раздел «GUI-action ids») определяет идентификаторы действий GUI: ADD_MENU_ITEMS_ACTION_ID='add_menu_items', ADD_TO_FAVORITES_ACTION_ID='add_to_favorites', BLURAY_PLAY_ACTION_ID='bluray_play', BT_COMMAND_ACTION_ID='bt_command', CHANGE_BEHAVIOUR_ACTION_ID='change_behaviour', CHANGE_GCOMPS_ACTION_ID='change_gcomps', CHANGE_LIST_CONFIG_ACTION_ID='change_list_config', CHANGE_MOVIE_DATA_ACTION_ID='change_movie_data', CHANGE_PARENTAL_CODE_ACTION_ID='change_parental_code', CHANGE_SETTINGS_ACTION_ID='change_settings', CHECK_RESTRICTED_ACTION_ID='check_restricted', CHECK_SYSTEM_STORAGE_ACTION_ID='check_system_storage', CHOOSE_FILE_ACTION_ID='choose_file', CLEAR_WATCH_HISTORY_ACTION_ID='clear_watch_history', CLOSE_AND_RUN_ACTION_ID='close_and_run' - fw-tv188b-260827-0003-r24--php-framework.c132 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс ChangeParentalCodeActionData с ключами (1): post_action [^403]: fw-tv188b-260827-0003-r24--php-framework.c202 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс PluginFolderViewInputData с ключами (2): media_url, sel_state [^404]: - fw-tv188b-261021-0117-r25--php-framework.c012 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Аннотации dune_api.php r25 задают поля PluginFolderRowsInputData: media_url — (char *); row_ids — (MY_StringArray *). - fw-tv188b-261021-0117-r25.c009 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · dune_api.php r25 вводит операцию плагина PLUGIN_OP_GET_FOLDER_ROWS='get_folder_rows' с выходным типом PLUGIN_OUT_DATA_PLUGIN_FOLDER_ROWS='plugin_folder_rows' и классы PluginFolderRowsInputData {media_url, row_ids} и PluginFolderRows {rows} [^405]: - fw-tv188b-261021-0117-r25--php-framework.c011 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Аннотации dune_api.php r25 задают поля PluginFolderRows: rows — (PluginRowList *). - fw-tv188b-261021-0117-r25.c009 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · dune_api.php r25 вводит операцию плагина PLUGIN_OP_GET_FOLDER_ROWS='get_folder_rows' с выходным типом PLUGIN_OUT_DATA_PLUGIN_FOLDER_ROWS='plugin_folder_rows' и классы PluginFolderRowsInputData {media_url, row_ids} и PluginFolderRows {rows} [^406]: - fw-tv188b-260827-0003-r24--php-framework.c252 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс PluginVodGetStreamInfoInputData с ключами (1): playback_url - 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 они есть [^407]: fw-tv188b-260827-0003-r24--plugin-loader--gui-actions--json-outputs.c013 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · При индексе data_type = 7 json_materialize_output_data_from_json создаёт PluginStreamInfo (8 байт), читает строку url и список markers; элементы StreamMarker (0x14 байт) разбирает FUN_002223f0. [^408]: - 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--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 они есть [^409]: 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. [^410]: - fw-tv188b-260827-0003-r24--php-framework.c274 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс StreamMarker с ключами (4): type, from, to, duration - 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 они есть [^411]: fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c064 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · ActionFactory::timer формирует или дополняет структуру с полями GuiTimerDef::{delay_ms, reset_on_keypress, clear_on_keypress}. delay_ms всегда; reset_on_keypress/clear_on_keypress записываются как true только при истинном аргументе. [^412]: doc-sdk-plugins--gui-actions.c054 · doc · any-documented; прошивка — · Таймер ShowDialogAction срабатывает один раз; перезапустить его можно действием ChangeBehaviour [^413]: fw-tv188b-260827-0003-r24--php-framework.c188 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс GuiTimerDef с ключами (5): delay_ms, reset_on_keypress, clear_on_keypress, num_repeats, early_start [^414]: fw-tv188b-260827-0003-r24--php-framework.c185 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс GuiMenuItemDef с ключами (7): is_separator, id, caption, icon_url, marked, action, is_shown_action [^415]: fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c060 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · ActionFactory::add_gui_item формирует или дополняет структуру с полями GuiItem::{id, caption, icon_url, group_id}. icon_url по истинности; group_id при isset. [^416]: fw-tv188b-261021-0117-r25--shell-ext--ui-lib.c033 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · ActionFactory::add_gui_item принимает params=null последним аргументом и записывает GuiItem::params только при истинном params. [^417]: fw-tv188b-260827-0003-r24--php-framework.c183 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс GuiItem с ключами (5): id, caption, icon_url, group_id, params [^418]: fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c028 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · ActionFactory::add_extra_choice формирует или дополняет структуру с полями GuiExtraChoice::{caption}. Добавляет элемент с caption в переданный по ссылке массив. [^419]: fw-tv188b-260827-0003-r24--php-framework.c182 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс GuiExtraChoice с ключами (1): caption [^420]: fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c040 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · ActionFactory::add_path_element формирует или дополняет структуру с полями PluginPathElement::{media_url, caption, id}. Добавляет элемент в переданный по ссылке массив. [^421]: fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c041 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · ActionFactory::replace_path строит действие plugin_replace_path; схема заполнения использует PluginReplacePathActionData::{erase_count, elements, post_action}. [^422]: fw-tv188b-260827-0003-r24--php-framework.c214 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс PluginPathElement с ключами (3): media_url, id, caption [^423]: fw-tv188b-260827-0003-r24--php-framework.c215 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс PluginRef с ключами (2): name, ep_media_url [^424]: doc-sdk-plugins.c084 · doc · any-documented; прошивка — · Plugin archive (PluginArchiveDef: id, urls_with_keys, all_tgz_url, total_size) кэширует картинки папок в system/flash storage; ссылки на них — plugin_archive:/// [^425]: fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c039 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Структура PluginArchiveDef в libduneshell.so десериализуется с полями id (строка), urls_with_keys (properties), all_tgz_url (строка) и total_size (long) [^426]: fw-tv188b-260827-0003-r24--php-framework.c197 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс PluginArchiveDef с ключами (4): id, urls_with_keys, all_tgz_url, total_size [^427]: fw-tv188b-260827-0003-r24--php-framework.c153 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс FileMovieInfo с ключами (8): movie_id, title, icon_url, rate_imdb, rate_content, series_type, s, e [^428]: - fw-tv188b-260827-0003-r24--php-framework.c151 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс FileChooserFilter с ключами (3): file_type_dir, file_extensions, check_writable - 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 они есть [^429]: - fw-tv188b-260827-0003-r24--php-framework.c152 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс FileChooserUiParams с ключами (3): with_favorite_folders, details_width, dialog_title - fw-tv188b-261021-0117-r25--php-framework.c013 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Аннотации dune_api.php r25 задают поля FileChooserUiParams: with_network_folders — bool; with_network_browser — bool; new_folder_default_name — (char *). - 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 они есть [^430]: - fw-tv188b-261021-0117-r25--php-framework.c001 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Аннотации dune_api.php r25 задают поля FsCmdDef: kind — FsCmdKind; specific_def — (void *). - fw-tv188b-261021-0117-r25.c012 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · dune_api.php r25 вводит файловые команды для действия fs_ctl: перечисление FsCmdKind (resolve_url, stat, scandir, get_file) и классы FsCtlActionData {cmd, output_path, post_action}, FsCmdDef {kind, specific_def}, FsResolveUrlDef {url, try_mount_if_needed}, FsStatDef {path}, FsScandirDef {path, with_stat, max_items_count}, FsGetFileDef {path, target_path, skip, max_size, chunk_size} [^431]: fw-tv188b-261021-0117-r25--php-framework.c004 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Аннотации dune_api.php r25 задают поля FsResolveUrlDef: url — (char *); try_mount_if_needed — bool. [^432]: fw-tv188b-261021-0117-r25--php-framework.c006 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Аннотации dune_api.php r25 задают поля FsStatDef: path — (char *). [^433]: fw-tv188b-261021-0117-r25--php-framework.c005 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Аннотации dune_api.php r25 задают поля FsScandirDef: path — (char *); with_stat — bool; max_items_count — int. [^434]: fw-tv188b-261021-0117-r25--php-framework.c003 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Аннотации dune_api.php r25 задают поля FsGetFileDef: path — (char *); target_path — (char *); skip — int; max_size — int; chunk_size — int. [^435]: fw-tv188b-261021-0117-r25--php-framework.c016 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Аннотации dune_api.php r25 задают поля PluginFolderView: type_mask — int. [^436]: - fw-tv188b-260827-0003-r24--php-framework.c201 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс PluginFolderView с ключами (6): view_kind, data, multiple_views_supported, archive, folder_type, params - fw-tv188b-261021-0117-r25--php-framework.c016 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Аннотации dune_api.php r25 задают поля PluginFolderView: type_mask — int. [^437]: doc-sdk-plugins--operations.c021 · doc · any-documented; прошивка — · Класс PluginFolderViewParams (параметры control- и movie-папок) в документе имеет поля paint_path_box, paint_content_box_background (Boolean) и background_url (String) [^438]: fw-tv188b-260827-0003-r24--php-framework.c203 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс PluginFolderViewParams с ключами (5): paint_path_box, paint_path_box_background, paint_content_box_background, background_url, popup_dialogs_enabled [^439]: fw-tv188b-260827-0003-r24--php-framework.c219 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс PluginRegularFolderView с ключами (11): view_params, base_view_item_params, not_loaded_view_item_params, load_failed_view_item_params, actions, timer, async_icon_loading, async_icon_loading_pipelining, async_icon_loading_max_connects, async_icon_loading_interrupt_enabled, initial_range [^440]: fw-tv188b-260827-0003-r24--php-framework.c218 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс PluginRegularFolderRange с ключами (5): total, more_items_available, from_ndx, count, items [^441]: fw-tv188b-260827-0003-r24--php-framework.c217 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс PluginRegularFolderItem с ключами (6): media_url, caption, starred, locked, view_item_params, plugin_ref [^442]: fw-tv188b-260827-0003-r24--php-framework.c284 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс ViewParams с ключами (91): num_cols, num_rows, item_width, item_height, animation_enabled, scroll_animation_enabled, popup_dialogs_enabled, marks_enabled, orientation, cycle_mode_enabled, cycle_mode_gap, cycle_mode_gap_width, cycle_mode_gap_icon_path, background_path, background_x, background_y, background_width, background_height, background_order, scroll_path, scroll_x, scroll_y, scroll_height, mark_path, mark_dx, mark_dy, mark_scale_factor, optimize_full_screen_background, paint_path_box, paint_path_box_background, paint_widget, paint_widget_background, paint_content_box_background, paint_scrollbar, paint_icon_selection_box, paint_help_line, paint_playback_help_line, paint_playback_status, paint_playback_volume_indicators, paint_details, paint_details_box_background, help_line_text_color, icon_selection_box_dx, icon_selection_box_dy, icon_selection_box_width, icon_selection_box_height, paint_icon_badge_box, hidden_badge_box, icon_badge_box_dx, icon_badge_box_dy, icon_badge_box_width, icon_badge_box_height, icon_badge_box_sel_dx, icon_badge_box_sel_dy, icon_badge_box_sel_width, icon_badge_box_sel_height, content_box_x, content_box_y, content_box_width, content_box_height, content_box_padding_left, content_box_padding_top, content_box_padding_right, content_box_padding_bottom, extra_content_objects, details_box_width, paint_item_info_in_details, zoom_detailed_icon, detailed_icon_scale_factor, detailed_icon_valign, item_small_icon_name, folder_small_icon_name, item_detailed_info_font_size, item_detailed_info_rel_y, item_detailed_info_title_color, item_detailed_info_text_color, item_detailed_info_auto_line_break, item_detailed_info_use_main_icon, paint_sandwich, sandwich_base, sandwich_mask, sandwich_cover, sandwich_width, sandwich_height, sandwich_sel_width, sandwich_sel_height, sandwich_icon_scale_factor, sandwich_icon_keep_aspect_ratio, sandwich_icon_upscale_enabled, max_icon_width, max_icon_height [^443]: fw-tv188b-260827-0003-r24--php-framework.c283 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс ViewItemParams с ключами (54): predefined, item_paint_icon, item_paint_caption, item_ui_state_paint_caption, item_paint_unselected_caption, item_caption_font_size, item_paint_caption_within_icon, item_caption_within_icon_color, item_padding_top, item_padding_bottom, icon_path, icon_width, icon_height, icon_dx, icon_dy, icon_scale_factor, icon_margin_top, icon_margin_bottom, icon_margin_left, icon_margin_right, icon_sel_path, icon_sel_width, icon_sel_height, icon_sel_dx, icon_sel_dy, icon_sel_scale_factor, icon_sel_margin_top, icon_sel_margin_bottom, icon_sel_margin_left, icon_sel_margin_right, icon_valign, item_layout, icon_keep_aspect_ratio, icon_fit_scale_factor, item_caption_width, item_caption_wrap_enabled, item_caption_scroll_enabled, item_caption_dy, item_caption_sel_dy, item_caption_dx, item_caption_color, item_sticker, item_sticker_collage, item_detailed_info, item_detailed_icon_path, item_detailed_icon_width, item_detailed_icon_height, item_detailed_info_sticker, item_detailed_info_tags, item_detailed_info_extra, item_badge_icon_path, item_override_default_badge, item_sandwich_icon_scale_factor, item_extra_info [^444]: fw-tv188b-260827-0003-r24--php-framework.c199 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс PluginControlsFolderView с ключами (5): defs, actions, timer, initial_sel_ndx, params [^445]: fw-tv188b-260827-0003-r24--php-framework.c210 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс PluginMovieFolderView с ключами (10): movie, left_button_caption, left_button_action, has_right_button, right_button_caption, right_button_action, has_multiple_series, series_media_url, poster_valign, params [^446]: fw-tv188b-260827-0003-r24--php-framework.c209 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс PluginMovie с ключами (17): name, name_original, description, poster_url, length_min, year, directors_str, scenarios_str, actors_str, genres_str, rate_imdb, rate_kinopoisk, rate_mpaa, country, budget, details, rate_details [^447]: fw-tv188b-260827-0003-r24--php-framework.c227 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс PluginRowsFolderView с ключами (4): pane, sel_state, actions, timer [^448]: fw-tv188b-261021-0117-r25--php-framework.c015 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Аннотации dune_api.php r25 задают поля PluginRowsPane: row_dup_map — (PluginRowMap *). [^449]: - fw-tv188b-260827-0003-r24--php-framework.c230 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс PluginRowsPane с ключами (26): rows, headers, focus, bg, screen_r, screen_y2, min_row_index_for_y2, info_r, vod_r, header_enabled, single_list_navigation, initial_focus_header, initial_focus_header_id, initial_focus_item_id, initial_focus_row_id, horizontal_focus_freedom_factor, horizontal_focus_end_min_offset, vertical_focus_freedom_factor, vertical_focus_gravity, vertical_focus_end_min_offset, header_font_size, header_min_font_size, max_header_width, min_header_width, up_arrow_dy, regular_item_params_templates - fw-tv188b-261021-0117-r25--php-framework.c015 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Аннотации dune_api.php r25 задают поля PluginRowsPane: row_dup_map — (PluginRowMap *). [^450]: fw-tv188b-261021-0117-r25--plugin-loader.c006 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В strings libduneshell.so r25 для PluginRow::data есть диагностики string и object; диагностика string — новая относительно r24. [^451]: fw-tv188b-260827-0003-r24--php-framework.c226 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс PluginRow с ключами (12): type, data, id, ui_level, group_id, header_id, title, focusable, options, height, inactive_height, show_all_action [^452]: fw-tv188b-260827-0003-r24--php-framework.c223 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс PluginRegularRow с ключами (14): hide_captions, hide_icons, left_padding, inactive_left_padding, right_padding, width, fade_enabled, fade_icon_mix_color, fade_icon_mix_alpha, lite_fade_icon_mix_alpha, fade_caption_color, item_params_template_id, item_params, items [^453]: fw-tv188b-260827-0003-r24--php-framework.c220 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс PluginRegularItem с ключами (6): icon_url, sticker_urls, stickers, caption, id, params_template_id [^454]: fw-tv188b-260827-0003-r24--php-framework.c221 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс PluginRegularItemParams с ключами (11): def, sel, inactive, loading_url, load_failed_url, hide_captions, caption_max_num_lines, caption_line_spacing, sticker_text_size, sticker_text_color, sel_margins [^455]: fw-tv188b-260827-0003-r24--php-framework.c222 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс PluginRegularItemVariableParams с ключами (12): width, height, dx, icon_width, icon_height, icon_keep_aspect_ratio, icon_dy, caption_dy, caption_color, caption_font_size, sticker_width, sticker_height [^456]: fw-tv188b-260827-0003-r24--php-framework.c224 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс PluginRegularSticker с ключами (4): r, icon_url, text, color [^457]: fw-tv188b-260827-0003-r24--php-framework.c234 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс PluginTitleRow с ключами (10): caption, color, font_size, left, dy, active_dy, width, fade_enabled, fade_color, lite_fade_color [^458]: fw-tv188b-260827-0003-r24--php-framework.c205 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс PluginGCompsRow с ключами (4): defs, width, options, ui_state [^459]: fw-tv188b-260827-0003-r24--php-framework.c228 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс PluginRowsHeader с ключами (3): id, title, first_in_cluster [^460]: fw-tv188b-260827-0003-r24--php-framework.c229 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс PluginRowsInfo с ключами (8): folder_key, item_id, info_defs, bg_url, nl_bg_url, mask_url, bg_poster_mode, playback_urls [^461]: fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c138 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · RowsFactory::margins формирует или дополняет структуру с полями PluginMargins::{left, top, right, bottom}. [^462]: fw-tv188b-260827-0003-r24--php-framework.c208 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс PluginMargins с ключами (4): left, top, right, bottom [^463]: fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c187 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · AbstractGCompsScreen::get_folder_view_v2 возвращает PluginFolderView вида PLUGIN_FOLDER_VIEW_GCOMPS с данными PluginGCompsFolderView (window_def, sel_state, actions, timer) и multiple_views_supported=false. [^464]: fw-tv188b-260827-0003-r24--php-framework.c204 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс PluginGCompsFolderView с ключами (4): window_def, sel_state, actions, timer [^465]: fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c110 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · GCompsFactory::get_window_def формирует или дополняет структуру с полями GCompWindowDef::{background_color, background_url, async_loading_background, comp_defs, ui_state, not_loaded_background_url, playback_bg_alpha, background_fit_def, small_state_text, opaque_background}. [^466]: fw-tv188b-260827-0003-r24--php-framework.c176 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс GCompWindowDef с ключами (12): background_color, background_url, background_fit_def, async_loading_background, not_loaded_background_url, playback_bg_alpha, small_state_text, opaque_background, comp_defs, focus, bg_def, ui_state [^467]: fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c090 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · GCompsFactory::get_label_def строит GUI-элемент типа label; схема заполнения использует GComponentDef::{id, geom_def, margins_def, kind, specific_def}; GCompLabelDef::{text, max_num_lines, text_color, font_size}. max_num_lines=1, color=15, font_size=FONT_SIZE_NORMAL. [^468]: fw-tv188b-260827-0003-r24--php-framework.c177 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс GComponentDef с ключами (9): id, geom_def, margins_def, focusable_def, focused_variant_def, extra_variant_defs, options, kind, specific_def [^469]: fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c120 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · GCompsFactory::get_change_def формирует или дополняет структуру с полями ChangeGCompDef::{id, geom_def, props, view_position, selected, children, transition}. transition=GCOMP_TRANSITION_DEFAULT; остальные необязательные параметры null. [^470]: fw-tv188b-260827-0003-r24--php-framework.c127 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс ChangeGCompDef с ключами (11): id, remove, geom_def, props, view_position, custom_props, selected, children, children_merge_mode, children_insert_after_id, transition [^471]: fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c066 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · ActionFactory::change_gcomp_window формирует или дополняет структуру с полями ChangeGCompWindowDef::{background_color, background_url}. background_color=null по умолчанию. [^472]: fw-tv188b-260827-0003-r24--php-framework.c128 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс ChangeGCompWindowDef с ключами (2): background_color, background_url [^473]: fw-tv188b-260827-0003-r24--php-framework.c160 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс GCompGeometryDef с ключами (5): role, w, h, opts, align_def [^474]: fw-tv188b-260827-0003-r24--php-framework.c155 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс GCompAlignDef с ключами (10): x, y, use_base_width, use_base_height, halign, valign, base_halign, base_valign, base_to_prev, base_id [^475]: plg-dc-globaltv--gcomps-controls.c023 · code · unknown; прошивка — · GCompMargins::all всегда записывает четыре переданных аргумента в left/top/right/bottom массива GCompMarginsDef. [^476]: fw-tv188b-260827-0003-r24--php-framework.c164 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс GCompMarginsDef с ключами (4): left, top, right, bottom [^477]: fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c126 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · RowsFactory::focus формирует или дополняет структуру с полями GCompFocusDef::{type, type2}. type=GCOMP_FOCUS_SYSTEM, type2=GCOMP_FOCUS_NONE. [^478]: fw-tv188b-260827-0003-r24--php-framework.c158 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс GCompFocusDef с ключами (2): type, type2 [^479]: fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c117 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · GCompsFactory::set_focusable формирует или дополняет структуру с полями GComponentDef::{focusable_def}; GCompFocusableDef::{sel_margins, background_url}. [^480]: fw-tv188b-260827-0003-r24--php-framework.c159 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс GCompFocusableDef с ключами (3): sel_margins, background_color, background_url [^481]: fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c118 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · GCompsFactory::set_focus_var формирует или дополняет структуру с полями GComponentDef::{focused_variant_def}; GCompVariantDef::{ref_id, geom_def, props}. [^482]: fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c119 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · GCompsFactory::add_extra_var формирует или дополняет структуру с полями GComponentDef::{extra_variant_defs}; GCompVariantDef::{ref_id, geom_def, props}. [^483]: fw-tv188b-260827-0003-r24--php-framework.c174 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс GCompVariantDef с ключами (4): ref_id, geom_def, props, transition_modifier [^484]: fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c116 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · GCompsFactory::get_gcomp_ui_state_def формирует или дополняет структуру с полями GCompUiStateDef::{items, title, bg_url, poster_url, view_params}. [^485]: fw-tv188b-260827-0003-r24--php-framework.c173 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс GCompUiStateDef с ключами (5): title, items, bg_url, poster_url, view_params [^486]: fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c100 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · GCompsFactory::get_view_position_def формирует или дополняет структуру с полями GCompViewPositionDef::{x, y, id}. [^487]: fw-tv188b-260827-0003-r24--php-framework.c175 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс GCompViewPositionDef с ключами (7): id, x, y, freedom_factor, gravity, end_min_offset, outside_id [^488]: - fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c112 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · GCompsFactory::get_comp_item_def строит GUI-элемент типа regular; схема заполнения использует GCompItemDef::{type, id, caption, icon_url}. - fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c113 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · GCompsFactory::get_label_item_def строит GUI-элемент типа label; схема заполнения использует GCompItemDef::{type, left_caption, caption}. - fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c114 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · GCompsFactory::get_button_item_def строит GUI-элемент типа button; схема заполнения использует GCompItemDef::{type, id, left_caption, caption}. [^489]: fw-tv188b-260827-0003-r24--php-framework.c162 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс GCompItemDef с ключами (5): type, id, left_caption, caption, icon_url [^490]: fw-tv188b-260827-0003-r24--php-framework.c163 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс GCompLabelDef с ключами (5): text, font_size, text_color, max_num_lines, draw_halo [^491]: fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c091 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · GCompsFactory::label строит GUI-элемент типа ttf_label; схема заполнения использует GCompTtfLabelDef::{text, text_color, font_size, max_num_lines, line_spacing, base_font_size, min_font_size, halign}; GComponentDef::{id, geom_def, kind, specific_def, margins_def}. color=#FFFFFFE0, font_size=36; max_num_lines только если задан и !=1; line_spacing при isset; base_font_size/min_font_size/halign и margins по истинности. [^492]: fw-tv188b-260827-0003-r24--php-framework.c172 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс GCompTtfLabelDef с ключами (11): text, font_size, font_face, text_color, max_num_lines, line_spacing, halign, valign, base_font_size, min_font_size, fit [^493]: fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c094 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · GCompsFactory::get_rect_def строит GUI-элемент типа rect; схема заполнения использует GComponentDef::{geom_def, kind, specific_def, margins_def}; GCompRectDef::{color}. [^494]: fw-tv188b-260827-0003-r24--php-framework.c168 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс GCompRectDef с ключами (1): color [^495]: fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c096 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · GCompsFactory::get_image_def строит GUI-элемент типа image; схема заполнения использует GComponentDef::{geom_def, margins_def, kind, specific_def}; GCompImageDef::{url, keep_aspect_ratio, upscale_enabled, not_loaded_url, load_failed_url, low_quality_url, alpha, mix_alpha, mix_color}. keep_aspect_ratio=false, upscale_enabled=true; URL-заглушки и alpha/mix по умолчанию null. [^496]: fw-tv188b-260827-0003-r24--php-framework.c161 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс GCompImageDef с ключами (9): url, alpha, mix_alpha, mix_color, keep_aspect_ratio, upscale_enabled, not_loaded_url, load_failed_url, low_quality_url [^497]: fw-tv188b-260827-0003-r24--php-framework.c157 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс GCompCutImageDef с ключами (2): url, alpha [^498]: fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c111 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · GCompsFactory::get_image_fit_def формирует или дополняет структуру с полями ImageFitDef::{base_halign_ratio, base_valign_ratio}. [^499]: fw-tv188b-260827-0003-r24--php-framework.c190 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс ImageFitDef с ключами (2): base_halign_ratio, base_valign_ratio [^500]: fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c098 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · GCompsFactory::get_button_def строит GUI-элемент типа button; схема заполнения использует GComponentDef::{id, geom_def, margins_def, kind, specific_def}; GCompButtonDef::{caption, selected, caption_centered}. selected=false, caption_centered=true. [^501]: fw-tv188b-260827-0003-r24--php-framework.c156 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс GCompButtonDef с ключами (3): caption, caption_centered, selected [^502]: fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c093 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · GCompsFactory::text_field строит GUI-элемент типа text_field; схема заполнения использует GuiTextFieldDef::{initial_value, numeric, password, has_osk, width, apply_action}; GComponentDef::{id, geom_def, margins_def, kind, specific_def}; GCompTextFieldDef::{def, params}. other_params: numeric/password/has_osk=false, width=null, apply_action=null. [^503]: fw-tv188b-260827-0003-r24--php-framework.c171 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс GCompTextFieldDef с ключами (2): def, params [^504]: fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c101 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · GCompsFactory::get_panel_def строит GUI-элемент типа panel; схема заполнения использует GComponentDef::{id, geom_def, kind, specific_def, margins_def, options}; GCompPanelDef::{children}. margins и options только при истинности. [^505]: fw-tv188b-260827-0003-r24--php-framework.c165 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс GCompPanelDef с ключами (5): children, alpha, mix_alpha, mix_color, prepaint_params [^506]: fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c106 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · GCompsFactory::get_ppane_def строит GUI-элемент типа prepaint_pane; схема заполнения использует GComponentDef::{id, geom_def, kind, specific_def}; GCompPrepaintPaneDef::{panel, native_width, native_height}; GCompPanelDef::{children}. [^507]: fw-tv188b-260827-0003-r24--php-framework.c166 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс GCompPrepaintPaneDef с ключами (3): panel, native_width, native_height [^508]: fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c103 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · GCompsFactory::ppp формирует или дополняет структуру с полями GCompPrepaintParams::{width, height}. [^509]: fw-tv188b-260827-0003-r24--php-framework.c167 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс GCompPrepaintParams с ключами (2): width, height [^510]: fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c107 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · GCompsFactory::get_spane_def строит GUI-элемент типа scroll_pane; схема заполнения использует GComponentDef::{id, geom_def, margins_def, kind, specific_def}; GCompScrollPaneDef::{panel, view_width, view_height, view_position}; GCompPanelDef::{children}. [^511]: fw-tv188b-260827-0003-r24--php-framework.c169 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс GCompScrollPaneDef с ключами (6): panel, view_position, view_use_base_width, view_use_base_height, view_width, view_height [^512]: fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c099 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · GCompsFactory::get_scrollbar_def строит GUI-элемент типа scrollbar; схема заполнения использует GComponentDef::{geom_def, margins_def, kind, specific_def}; GCompScrollbarDef::{scroll_pane_id, vertical}. [^513]: fw-tv188b-260827-0003-r24--php-framework.c170 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс GCompScrollbarDef с ключами (2): scroll_pane_id, vertical [^514]: fw-tv188b-260827-0003-r24--php-framework.c181 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс GuiControlDef с ключами (6): name, title, use_preferred_width, kind, specific_def, params [^515]: fw-tv188b-260827-0003-r24--php-framework.c184 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс GuiLabelDef с ключами (1): caption [^516]: fw-tv188b-260827-0003-r24--php-framework.c179 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс GuiButtonDef с ключами (3): caption, width, push_action [^517]: fw-tv188b-260827-0003-r24--php-framework.c180 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс GuiComboboxDef с ключами (6): initial_value, value_caption_pairs, dimmed_ids, width, apply_action, confirm_action [^518]: fw-tv188b-260827-0003-r24--php-framework.c187 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс GuiTextFieldDef с ключами (9): initial_value, numeric, prefer_numbers, password, has_osk, always_active, width, apply_action, confirm_action [^519]: fw-tv188b-260827-0003-r24--php-framework.c189 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс GuiVGapDef с ключами (1): vgap [^520]: fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c089 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · ControlFactory::add_progress_bar строит GUI-элемент типа progress_bar; схема заполнения использует GuiControlDef::{name, title, kind, specific_def, params}; GuiProgressBarDef::{width, progress}. title=null, width=0, progress=0. [^521]: fw-tv188b-260827-0003-r24--php-framework.c186 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс GuiProgressBarDef с ключами (2): progress, width [^522]: 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 [^523]: fw-tv188b-260827-0003-r24--php-framework.c235 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс PluginTvChannel с ключами (32): id, caption, extra_caption, group_ids, icon_url, number, have_archive, is_protected, recording_enabled, ext_epg_enabled, vod_archive_enabled, start_over_enabled, trick_play_enabled, buffering_ms, timeshift_hours, epg_mode, epg_normal_refresh_sec, epg_fast_refresh_sec, epg_fast_refresh_timeout, past_epg_days, future_epg_days, ext_epg_id, ext_epg_icon_url, epg_icon_width, epg_icon_height, epg_icon_x_offset, epg_icon_y_offset, epg_icon_hide_without_archive, use_program_have_archive_flags, archive_past_sec, archive_delay_sec, playback_url_is_stream_url [^524]: fw-tv188b-260827-0003-r24--php-framework.c238 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс PluginTvGroup с ключами (4): id, caption, icon_url, channel_ids [^525]: fw-tv188b-260827-0003-r24--php-framework.c012 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · DunePlugin::get_day_epg($channel_id, $day_start_tm_sec, &$plugin_cookies) возвращает List (по комментарию) [^526]: fw-tv188b-260827-0003-r24--php-framework.c237 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс PluginTvEpgProgram с ключами (8): start_tm_sec, end_tm_sec, name, description, have_archive, flags, icon_url, ext_id [^527]: fw-tv188b-260827-0003-r24--plugin-loader--gui-actions.c045 · code · android-dune-fw; прошивка 260827_0003_r24 · В strings libduneshell.so есть диагностики чтения полей PluginTvChannelChange: id (string); icon_url (string). [^528]: - fw-tv188b-260827-0003-r24--php-framework.c236 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс PluginTvChannelChange с ключами (2): id, icon_url - 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 они есть [^529]: 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 [^530]: 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 [^531]: fw-tv188b-260827-0003-r24--php-framework.c212 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс PluginOsdComponent с ключами (9): x, y, image_url, image_width, image_height, text, text_font_size, text_color, text_halo [^532]: fw-tv188b-260827-0003-r24--php-framework.c032 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Файлы dunelib подключают друг друга через require_once с путями вида 'dunelib/…': expr.php → config_utils.php, dune_countries.php; config_utils.php → utils.php, dune_languages.php [^533]: - fw-tv188b-260827-0003-r24--php-framework.c050 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dunelib/utils.php определяет класс-утилиту HD (статические методы) и исключение DuneCurlException extends Exception с полями errno, error, http_code - fw-tv188b-260827-0003-r24--php-framework.c051 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Публичные методы HD: get, arrget, assert, is_map, init, has_attribute, get_map_element, filter_map, starts_with, ends_with, format_timestamp, format_duration, encode_user_data, decode_user_data, create_regular_folder_range, get_internet_status, force_check_internet_on_error, http_init, get_serial_number, get_dune_user_agent, get_addr_from_http_url, unset_http_params, get_dune_opts, http_headerfunction, http_get_document, http_post_document, http_request_document, http_server_responding, append_dune_auth, write_to_file_using_tmp, write_to_file_using_tmp_if_changed, safe_unlink, parse_xml_document, parse_props, read_props_file, encode_props, make_json_rpc_request, get_mac_addr, get_product_id, is_android, is_apk, is_fw_apk, is_limited_apk, with_network_manager, get_apk_package_name, get_fs_prefix, with_epfs, is_custom_fw, enable_caching_for_image_url, escape_xml_string, localtime_TZ, MY_localtime, format_date_time_date, format_date_time_date_ext, convert_daytime_to_12h, format_date_time_time, readlines, print_backtrace, escape_shell_arg, encode_json_str, path_basename, path_dirname, filemtime, ensure_plugin_name, http_status_code_to_string, get_item, is_whale_tv, is_dual_system [^534]: fw-tv188b-260827-0003-r24--php-framework.c052 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Константы HD: INT_MIN, INT_MAX, NBSP, DUNE_AUTH_PATH=/tmp/dune_auth.txt, INTERNET_STATUS_PATH=/tmp/run/internet_status.txt, FORCE_CHECK_INTERNET_ON_ERROR_PATH=/tmp/run/network_monitor/force_check_on_error [^535]: - fw-tv188b-260827-0003-r24--php-framework.c053 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Тайм-ауты HTTP в HD: $DEFAULT_CURL_TIMEOUT=60 и $DEFAULT_CURL_CONNECT_TIMEOUT=10 с, но HD::init($def_curl_timeout=20) переустанавливает общий тайм-аут (по умолчанию в 20 с) и вызывает http_init - 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 запоминается [^536]: - fw-tv188b-260827-0003-r24--php-framework.c058 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · HD::http_get_document бросает DuneCurlException при ошибке curl и при любом HTTP-коде, кроме 200 (включая 301/302/304); при ошибке curl создаёт флаг /tmp/run/network_monitor/force_check_on_error - fw-tv188b-260827-0003-r24--php-framework.c056 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · HD::http_get_document по умолчанию отключает проверку TLS-сертификата (CURLOPT_SSL_VERIFYPEER=false), следует редиректам, ставит CURLOPT_ENCODING=1 и тайм-ауты из $DEFAULT_CURL_*; опции вызывающего применяются поверх - fw-tv188b-260827-0003-r24--php-framework.c059 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · HD::http_get_document по умолчанию пишет в лог через hd_print URL, POST-поля и итог запроса; параметр $silent=true это отключает [^537]: fw-tv188b-261021-0117-r25.c023 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · HD::http_get_document в r25 пишет в лог « http <метод>: » (метод — CURLOPT_CUSTOMREQUEST, иначе POST при CURLOPT_POSTFIELDS, иначе GET) и « http DATA: …» вместо «HTTP fetching»/«HTTP POST fields»; сообщения об ошибках — в нижнем регистре («http request failed (код)») [^538]: fw-tv188b-260827-0003-r24--php-framework.c060 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · HD::http_post_document ставит CURLOPT_POST и CURLOPT_POSTFIELDS и вызывает http_get_document; http_request_document выбирает POST, если передан $post_data [^539]: fw-tv188b-260827-0003-r24--php-framework.c063 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · HD::encode_user_data/decode_user_data упаковывают данные в media_url как «||» [^540]: fw-tv188b-260827-0003-r24--php-framework.c064 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · HD::create_regular_folder_range($items, $from_ndx=0, $total=-1, $more_items_available=false) строит массив с ключами PluginRegularFolderRange total, more_items_available, from_ndx, count, items и обрезает items по total [^541]: fw-tv188b-260827-0003-r24--php-framework.c065 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · HD::write_to_file_using_tmp и write_to_file_using_tmp_if_changed пишут файл атомарно через .tmp и rename; второй возвращает 0, если содержимое не изменилось, 1 при записи и -1 при ошибке [^542]: fw-tv188b-260827-0003-r24--php-framework.c066 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · HD::parse_props/read_props_file разбирают строки key=value, encode_props пишет «key = value»; parse_xml_document использует simplexml_load_string и бросает Exception('Illegal XML document') [^543]: - fw-tv188b-260827-0003-r24--php-framework.c061 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · HD::get_internet_status() возвращает целое из /tmp/run/internet_status.txt или -1, если файла нет - fw-tv188b-260827-0003-r24--php-framework.c062 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · HD::append_dune_auth($url) дописывает к URL через ?/& содержимое файла /tmp/dune_auth.txt - fw-tv188b-260827-0003-r24--php-framework.c068 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · HD::get_mac_addr() в режиме APK читает /tmp/run/dune_mac.txt, иначе берёт HWaddr из вывода «ifconfig eth0» - fw-tv188b-260827-0003-r24--php-framework.c069 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · HD::get_product_id() читает /firmware/config/product_id.txt; HD::is_custom_fw() считает прошивку кастомной, если product_id не совпадает с product_id из /firmware/config/base_firmware_info.txt или один из файлов некорректен [^544]: fw-tv188b-260827-0003-r24--php-framework.c070 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · HD::is_android() всегда возвращает true [^545]: - fw-tv188b-260827-0003-r24--php-framework.c071 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · HD читает переменные окружения: is_apk — HD_APK, is_fw_apk — HD_FW_APK, get_apk_package_name — APK_PACKAGE_NAME, get_fs_prefix — FS_PREFIX (пустая строка, если не задана); is_limited_apk = apk и не fw_apk; with_network_manager = не limited_apk - fw-tv188b-260827-0003-r24--php-framework.c072 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · HD::with_epfs() истинно, если существует каталог /flashdata/plugins_epfs/shell_ext - fw-tv188b-260827-0003-r24--php-framework.c077 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · HD::is_whale_tv() и is_dual_system() проверяют флаги whale_tv и dual_system в наборе firmware features [^546]: - fw-tv188b-260827-0003-r24--php-framework.c073 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · HD::enable_caching_for_image_url дописывает к URL картинки, начинающемуся с http или cached_image, параметр dune_image_cache=1 - fw-tv188b-260827-0003-r24--php-framework.c074 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · HD::localtime_TZ($tm) получает локальное время вызовом внешней команды date -d @ через exec (с кэшем последнего значения) - fw-tv188b-260827-0003-r24--php-framework.c078 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · HD::get_item($path, $dummy=null) — заглушка, всегда возвращает false [^547]: - fw-tv188b-260827-0003-r24--php-framework.c034 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · ConfigUtils::get_config() читает /config/settings.properties (строки key=value, '#' — комментарий) и кэширует результат до смены mtime файла; учитываются только ключи из списка умолчаний - fw-tv188b-260827-0003-r24--php-framework.c035 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Умолчания ConfigUtils::load_config: interface_language=english, noncustom_interface_language=english, ui_type=type3, time_format=24, content_details_at_the_top=yes, auto_watched_percent=90%, auto_watched_time_left=30s, watched_marks_format=percents, enter_on_file_behaviour_new=playlist, play_on_file_behaviour=playlist, sync_enabled=disabled; widget_country, widget_city, network_connection, kartina_tv_login, kartina_tv_password, kartina_tv_interface_type, sync_folder_url — пустые - fw-tv188b-260827-0003-r24--php-framework.c036 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Если interface_language=custom, ConfigUtils берёт noncustom_interface_language; lang_code вычисляется через DuneLanguages::get_code_by_id, при неизвестном языке — предупреждение и english/en [^548]: fw-tv188b-260827-0003-r24--php-framework.c037 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · ConfigUtils::get_location_info() читает /tmp/location_info.properties, а если его нет — /config/location_info.properties; строки «key = value», ключи country, country_code_2 (по умолчанию WW), city [^549]: fw-tv188b-260827-0003-r24--php-framework.c038 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · ConfigUtils::load_plugin_cookies($plugin_name) читает /config/_plugin_cookies.properties как строки key=value в объект [^550]: - fw-tv188b-260827-0003-r24--php-framework.c040 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · ConfigUtils::load_firmware_features() собирает набор флагов из строк /tmp/firmware_features.txt и /tmp/ro_features.txt - fw-tv188b-261021-0117-r25.c025 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · ConfigUtils::load_firmware_features() в r25 убирает флаг downloads из набора, если есть файл /tmp/flm.txt (комментарий: оболочка создаёт его для «lite»-лицензии без загрузок) [^551]: - fw-tv188b-260827-0003-r24--php-framework.c041 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · ConfigUtils::load_product_and_fw() читает /tmp/run/versions.txt (key=value: firmware_version, product, platform_kind, android_platform); для fw_apk android_platform берётся из /firmware/config/fw_apk_platform.txt - fw-tv188b-260827-0003-r24--php-framework.c042 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · platform_kind_group: 4-символьный platform_kind, начинающийся с '8' и цифры, сводится к виду «8Nxx» (например 8672 → 86xx); иначе равен platform_kind [^552]: fw-tv188b-260827-0003-r24--php-framework.c043 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Класс Expr (dunelib/expr.php) вычисляет условные выражения: Expr::make() собирает контекст из настроек, местоположения, флагов прошивки, /tmp/run/versions.txt и переменных HD_APK/HD_FW_APK; evaluate($pat) переводит шаблон в нижний регистр и вычисляет его [^553]: fw-tv188b-260827-0003-r24--php-framework.c044 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Операторы Expr: or, and, not/!, strict_country, country/c, language/l, product/p (product, platform_kind или platform_kind_group), android_platform, firmware_feature/ff, firmware_version/fwv, fwv_ge/fwv_gt/fwv_le/fwv_lt (и полные имена firmware_version_*), apk, fw_apk, limited_apk; шаблон «any» всегда истинен [^554]: fw-tv188b-260827-0003-r24--php-framework.c046 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · В аргументах Expr список значений разделяется запятыми; элемент с префиксом =~ или !~ (также i=~, i!~) — регулярное выражение, иначе сравнение без учёта регистра (strcasecmp) [^555]: fw-tv188b-260827-0003-r24--php-framework.c047 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Expr::add_user_op($op_name, $func_name) регистрирует пользовательский оператор: неизвестный встроенным оператор вызывает call_user_func($func_name, $op, $arg, $user_data); set_user_data задаёт $user_data [^556]: - fw-tv188b-260827-0003-r24--php-framework.c297 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · DuneLanguages::get_code_by_id($id) возвращает код языка (4-е поле) для записи с данным id (1-е поле), иначе null - fw-tv188b-260827-0003-r24--php-framework.c298 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · DuneLanguages::get_en_caption_by_code($id) возвращает английское название (3-е поле) по коду языка (4-е поле), иначе null - fw-tv188b-260827-0003-r24--php-framework.c299 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · DuneLanguages::get_native_caption_by_code($id) возвращает родное название (2-е поле) по коду языка (4-е поле), иначе null [^557]: fw-tv188b-260827-0003-r24--php-framework.c294 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Класс DuneLanguages (dunelib/dune_languages.php) хранит таблицу языков в private static $VALUES, а заполняет её только метод static_init() [^558]: fw-tv188b-260827-0003-r24--php-framework.c300 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Сам dune_languages.php static_init() не вызывает: встроенные плагины вызывают DuneLanguages::static_init() явно (android_apps/main_plugin.php, shell_ext/main_plugin.php и async_worker.php, dunestore/dunestore_plugin.php) [^559]: - fw-tv188b-260827-0003-r24--php-framework.c294 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Класс DuneLanguages (dunelib/dune_languages.php) хранит таблицу языков в private static $VALUES, а заполняет её только метод static_init() - fw-tv188b-260827-0003-r24--php-framework.c300 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Сам dune_languages.php static_init() не вызывает: встроенные плагины вызывают DuneLanguages::static_init() явно (android_apps/main_plugin.php, shell_ext/main_plugin.php и async_worker.php, dunestore/dunestore_plugin.php) [^560]: - fw-tv188b-261021-0117-r25.c027 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · dunelib/dl_state.php (r25): DlState отправляет команды менеджеру загрузок JSON-файлами в /tmp/run/dl_input/<время>.<…>.in с cmd_type add (id, name, total, files[path, url, size_mb, ext_ts], params), remove, pause, resume (group_id, file_paths), start_ts, change_dl_folder, test_dl_folder - fw-tv188b-261021-0117-r25.c028 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · DlState читает состояние загрузок из /tmp/run/dl_gstat.txt и /tmp/run/dl_state.txt, кэш — /flashdata/dl_cache и /tmp/run/dl_cache; в strings libxxx_dl_manager.so есть те же пути /tmp/run/dl_input, /tmp/run/dl_gstat.txt, /tmp/run/dl_state.txt [^561]: fw-tv188b-260827-0003-r24--php-framework.c001 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · bootstrap.php определяет hd_print($str): выводит строку через echo с суффиксом $HD_NEW_LINE (по умолчанию ''), а при заданном $HD_OB_PREFIX — с этим префиксом и вызовом ob_flush() [^562]: fw-tv188b-260827-0003-r24--php-framework.c002 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · bootstrap.php регистрирует hd_error_handler через set_error_handler и hd_shutdown_handler через register_shutdown_function; обработчик печатает ошибку через hd_print в формате «[файл:строка] [E_ТИП] сообщение» [^563]: fw-tv188b-260827-0003-r24--php-framework.c003 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · hd_silence_warnings() выключает вывод ошибок (error_reporting(0) и пустой обработчик hd_error_silencer), hd_restore_warnings() восстанавливает обработчик и error_reporting(E_STRICT | E_ALL) [^564]: fw-tv188b-260827-0003-r24--php-framework.c004 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · bootstrap.php устанавливает ini date.timezone из date_default_timezone_get(), с комментарием «Use timezone from the environment (TZ)» как обход известной проблемы PHP с 5.3.0 [^565]: fw-tv188b-260827-0003-r24--php-framework.c005 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · bootstrap.php снимает ограничение времени выполнения PHP: set_time_limit(0) [^566]: fw-tv188b-260827-0003-r24--php-framework.c029 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_config_get_few_buttons_remote_type() возвращает DuneSystem::$properties['few_buttons_remote_type'] [^567]: fw-tv188b-260827-0003-r24--php-framework.c030 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_config_with_color_buttons() возвращает false для пультов SMALL и ARROWS и true для остальных; dune_config_show_pop_up_icon_only() возвращает true для OVAL, SMALL, ARROWS и false для остальных [^568]: plg-dc-globaltv--lib.c068 · code · android-dune-fw; прошивка 260827_0003_r24 · ActionFactory::edit_list_config плагина принимает options/close_item_params между groups и sel_id; r24 принимает после groups сразу sel_id/post_action. [^569]: plg-dc-globaltv--lib.c065 · code · android-dune-fw; прошивка 260827_0003_r24 · ActionFactory::update_rows_info плагина принимает folder_key/item_id и включает их в PluginRowsInfo, а r24 начинает аргументы с info_defs и добавляет bg_poster_mode вместо этих полей. [^570]: plg-dc-globaltv--lib.c070 · code · android-dune-fw; прошивка 260827_0003_r24 · В ActionFactory::show_error плагина поля stop_playback/retry_delay_ms добавляются при defined(stop_playback), а r24 записывает их без проверки defined. [^571]: doc-sdk-plugins--operations.c084 · doc · any-documented; прошивка — · В объявлении интерфейса DunePlugin (раздел «DunePlugin interface») тип результата change_tv_favorites() — void [^572]: doc-sdk-plugins--operations.c083 · doc · any-documented; прошивка — · В описании операции change_tv_favorites() возвращает GuiAction — необязательное GUI-действие, исполняемое немедленно [^573]: - doc-sdk-plugins--operations.c084 · doc · any-documented; прошивка — · В объявлении интерфейса DunePlugin (раздел «DunePlugin interface») тип результата change_tv_favorites() — void - doc-sdk-plugins--operations.c083 · doc · any-documented; прошивка — · В описании операции change_tv_favorites() возвращает GuiAction — необязательное GUI-действие, исполняемое немедленно - fw-tv188b-260827-0003-r24--php-framework.c014 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · DunePlugin::change_tv_favorites($op_type, $channel_id, &$plugin_cookies) и handle_user_input(&$user_input, &$plugin_cookies) возвращают GuiAction (по комментариям) [^574]: - doc-sdk-plugins--gui-actions.c042 · doc · any-documented; прошивка — · PluginHandleUserInputAction не имеет данных; выполняет операцию Handle_user_input(GuiAction::$params) и возвращает её результат как post action - fw-tv188b-260827-0003-r24--php-framework.c206 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс PluginHandleUserInputActionData с ключами (3): operation_timeout, show_dialog_delay, dialog_title - fw-tv188b-260827-0003-r24--plugin-loader--php-runtime--opexec.c034 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 ключ operation_timeout в данных действия plugin_handle_user_input задаётся в миллисекундах: 3000 дало «start (timeout=3.0s)» и отмену через 3,3 с, 3 — «timeout=0.0s» и отмену через 0,36 с, 60000 — «timeout=60.0s»; значение из данных действия перекрывает operation_timeout/default манифеста (5). [^575]: - doc-sdk-plugins--operations.c020 · doc · any-documented; прошивка — · Класс PluginControlsFolderView имеет поля defs (Array), initial_sel_ndx (int), params (PluginFolderViewParams) - fw-tv188b-260827-0003-r24--php-framework.c199 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс PluginControlsFolderView с ключами (5): defs, actions, timer, initial_sel_ndx, params [^576]: - 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-260827-0003-r24--shell-ext--ui-lib.c035 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · ActionFactory::change_behaviour строит действие change_behaviour; схема заполнения использует ChangeBehaviourActionData::{actions, timer, post_action}. Перед построением вызывает GlobalActionMap::add_actions(actions). [^577]: - fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c001 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · ActionFactory::open_folder_ext строит действие plugin_open_folder; схема заполнения использует PluginOpenFolderActionData::{media_url, caption, id, post_action, sel_id, tags}. sel_id при isset; tags=[movie_id:] только для screen_id=MovieScreen::ID. - fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c002 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · ActionFactory::open_folder делегирует open_folder_ext с sel_id=null. - doc-sdk-plugins--gui-actions.c155 · code · unknown; прошивка — · ActionFactory::open_general_folder плагина polsky-tv формирует действие типа OpenFolder с handler_string_id = OPEN_FOLDER_ACTION_ID и data из поля класса OpenFolderActionData::media_url. [^578]: - fw-tv188b-260827-0003-r24--php-framework.c135 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс CheckSystemStorageActionData с ключами (5): required_space, recommended_space, title, messages, post_action - fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c210 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · ActionFactory::check_system_storage принимает title, но возвращаемый массив data содержит только required_space, recommended_space, messages и post_action. [^579]: - fw-tv188b-261021-0117-r25--php-framework.c009 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Аннотации dune_api.php r25 задают поля UpdateSpecialFavoriteFolderActionData: name — (char *); delete — bool; skip_interactions — bool; post_action — (GuiAction *). - fw-tv188b-261021-0117-r25--php-framework.c028 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · ActionFactory::update_special_favorite_folder(name, delete, post_action=null) возвращает GuiAction update_special_favorite_folder с этими тремя полями; объявленный skip_interactions фабрика не передаёт. [^580]: - fw-tv188b-261021-0117-r25--php-framework.c014 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Аннотации dune_api.php r25 задают поля PluginSystemActionData: handle_response — bool. - fw-tv188b-261021-0117-r25--plugin-loader--native-contracts-2.c006 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · JSON-десериализация plugin_system оставляет PluginSystemActionData::handle_response=false: в обнулённых данных заполняются run_string и post_action, а поле handle_response не читается. [^581]: - fw-tv188b-260827-0003-r24--plugin-loader--gui-actions.c046 · code · android-dune-fw; прошивка 260827_0003_r24 · В strings libduneshell.so сообщение о чтении vod_info называет PluginTvPlayActionData, а не PluginVodPlayActionData. - fw-tv188b-260827-0003-r24--php-framework.c254 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс PluginVodPlayActionData с ключами (1): vod_info [^582]: - doc-sdk-plugins--gui-actions.c068 · doc · any-documented; прошивка — · Данные PluginUpdateFolderAction описаны классом с именем PluginUpdateFolderAction (без суффикса ActionData): range (PluginRegularFolderRange), need_refresh (Boolean), sel_ndx (необязательно, −1 — не менять) - fw-tv188b-260827-0003-r24--php-framework.c245 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс PluginUpdateFolderActionData с ключами (3): range, need_refresh, sel_ndx [^583]: - doc-sdk-plugins--gui-actions.c122 · doc · any-documented; прошивка — · Поле reboot в ChangeSettingsAction определяет, перезагрузить ли приставку немедленно; описание restart_gui в документе дословно то же («whether to reboot STB immediately») - fw-tv188b-261021-0117-r25.c072 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 ChangeSettingsAction с restart_gui=true, reboot=false и пустыми settings перезапускает приложение Dune, а не приставку. Оболочка пишет «APK: trigger restart», pid com.dunehd.app меняется 17983 → 19586, а /proc/uptime растёт непрерывно (129033 → 129116 с). [^584]: - doc-sdk-plugins--gui-actions.c151 · inference · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Строковые id (handler_string_id) типов действий SDK соответствуют значениям констант *_ACTION_ID по сходству имён; для пяти пар (c336–c340) строковый id принят на устройстве, для остальных 27 пар соответствие остаётся выводом. - doc-sdk-plugins--gui-actions.c150 · code, disputed · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php r24 определяет константы *_ACTION_ID со строковыми значениями; 32 из них: PLUGIN_OPEN_FOLDER_ACTION_ID → plugin_open_folder, PLUGIN_TV_PLAY_ACTION_ID → plugin_tv_play, PLUGIN_VOD_PLAY_ACTION_ID → plugin_vod_play, PLUGIN_HANDLE_USER_INPUT_ACTION_ID → plugin_handle_user_input, PLUGIN_SHOW_ERROR_ACTION_ID → plugin_show_error, SHOW_DIALOG_ACTION_ID → show_dialog, CLOSE_DIALOG_AND_RUN_ACTION_ID → close_dialog_and_run, RESET_CONTROLS_ACTION_ID → reset_controls, SHOW_POPUP_MENU_ACTION_ID → show_popup_menu, STATUS_ACTION_ID → status, PLUGIN_UPDATE_FOLDER_ACTION_ID → plugin_update_folder, PLUGIN_INVALIDATE_FOLDERS_ACTION_ID → plugin_invalidate_folders, PLUGIN_RUN_NATIVE_CODE_ACTION_ID → plugin_run_native_code, PLUGIN_CLEAR_ARCHIVE_CACHE_ACTION_ID → plugin_clear_archive_cache, DVD_PLAY_ACTION_ID → dvd_play, BLURAY_PLAY_ACTION_ID → bluray_play, FILE_PLAY_ACTION_ID → file_play, PLAYLIST_PLAY_ACTION_ID → playlist_play, LAUNCH_MEDIA_URL_ACTION_ID → launch_media_url, SHOW_MAIN_SCREEN_ACTION_ID → show_main_screen, SHOW_BLACK_SCREEN_ACTION_ID → show_black_screen, CHANGE_BEHAVIOUR_ACTION_ID → change_behaviour, OPEN_FOLDER_ACTION_ID → open_folder, CLOSE_AND_RUN_ACTION_ID → close_and_run, PLUGIN_SYSTEM_ACTION_ID → plugin_system, RUN_BUILTIN_ACTION_ID → run_builtin, WAIT_FOR_IP_ADDRESS_ACTION_ID → wait_for_ip_address, WGET_ACTION_ID → wget, CHANGE_SETTINGS_ACTION_ID → change_settings, PLUGIN_UPDATE_INFO_BLOCK_ACTION_ID → plugin_update_info_block, PLUGIN_UPDATE_EPG_ACTION_ID → plugin_update_epg, PLUGIN_UPDATE_OSD_ACTION_ID → plugin_update_osd. [^585]: fw-tv188b-260827-0003-r24--plugin-loader--gui-actions.c057 · inference · android-dune-fw; прошивка 260827_0003_r24 · GuiAction в этой прошивке, предположительно, разбирает data по типу, выбранному через handler_string_id. [^586]: fw-tv188b-260827-0003-r24--plugin-loader--gui-actions.c058 · inference · android-dune-fw; прошивка 260827_0003_r24 · Действие plugin_handle_user_input в этой прошивке, предположительно, принимает data типа PluginHandleUserInputActionData с operation_timeout, show_dialog_delay и dialog_title. [^587]: fw-tv188b-260827-0003-r24--plugin-loader--gui-actions.c059 · inference · android-dune-fw; прошивка 260827_0003_r24 · XML-конструктор plugin_system, предположительно, проверяет наличие и корректность data/run_string. [^588]: fw-tv188b-260827-0003-r24--plugin-loader--gui-actions--json-outputs.c020 · inference · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Индексы case 0..7 в json_materialize_output_data_from_json соответствуют строковым значениям PluginOutputDataType в порядке dune_api.php: 0 plugin_folder_view, 1 plugin_regular_folder_range, 2 gui_action, 3 plugin_tv_info, 4 plugin_tv_epg_program_list, 5 url, 6 plugin_vod_info, 7 plugin_stream_info. [^589]: - fw-tv188b-260827-0003-r24--php-framework.c293 · inference · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Оболочка (libduneshell.so) вызывает плагин через PHP-выражение DunePluginFw::$instance->call_plugin(...), то есть через экземпляр, который регистрирует default_dune_plugin_fw.php плагина - fw-tv188b-260827-0003-r24--php-framework.c308 · inference · tv188b, android-dune-fw; прошивка 260827_0003_r24 · php_server, вероятно, исполняет вызов плагина как PHP-код «$in = <<($in);», где выражение (например DunePluginFw::$instance->call_plugin) приходит от оболочки в CallPacket [^590]: fw-tv188b-260827-0003-r24--php-framework.c309 · inference, disputed · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Системные PHP-файлы /firmware_ext/php подключаются до кода плагина: так сказано в SDK; для tv188b r24 порядок из строк php_server не следует [^591]: fw-tv188b-260827-0003-r24--php-framework.c033 · inference · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Пути require_once 'dunelib/…' разрешаются, только если каталог firmware_ext/php/include/ есть в include_path PHP; где он задаётся, из модуля не видно [^592]: fw-tv188b-260827-0003-r24--php-framework.c039 · inference · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Файл /config/_plugin_cookies.properties — постоянное хранилище $plugin_cookies, которые оболочка передаёт в методы плагина [^593]: fw-tv188b-260827-0003-r24--php-framework.c302 · inference · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Если плагин не вызвал DuneLanguages::static_init(), геттеры DuneLanguages возвращают null (foreach по неинициализированному $VALUES), и ConfigUtils::load_config() получит lang_code = null [^594]: fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c005 · code, disputed · tv188b, android-dune-fw; прошивка 260827_0003_r24 · ActionFactory::show_error строит действие plugin_show_error; схема заполнения использует PluginShowErrorActionData::{fatal, title, msg_lines, stop_playback, retry_delay_ms}; stop_playback и retry_delay_ms — параметры функции со значениями по умолчанию false и 0, вызывающий может передать свои; fatal также печатает сообщение [^595]: fw-tv188b-261021-0117-r25.c018 · inference · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Действие fs_ctl, по-видимому, нельзя задать в XML (dune_plugin.xml), только в JSON-ответе PHP-плагина [^596]: - fw-tv188b-261021-0117-r25--php-framework.c017 · inference · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Вероятно, fs_ctl resolve_url разрешает URL в путь и может запрашивать монтирование через try_mount_if_needed. - fw-tv188b-261021-0117-r25--php-framework.c018 · inference · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Вероятно, fs_ctl stat возвращает признаки каталога и метаданные st_mode/st_size/st_mtime/st_ctime для path. - fw-tv188b-261021-0117-r25--php-framework.c019 · inference · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Вероятно, fs_ctl scandir читает элементы каталога path с опциональным stat и ограничением max_items_count. - fw-tv188b-261021-0117-r25--php-framework.c020 · inference · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Вероятно, fs_ctl get_file копирует из path в target_path с пропуском skip и ограничением max_size; chunk_size задаёт размер порции. - fw-tv188b-261021-0117-r25--php-framework.c021 · inference · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Вероятно, результат fs_ctl передаётся продолжению через поля fs_ctl_* и при заданном output_path сохраняется в файл; формат файла и коды результата по strings не установлены. [^597]: fw-tv188b-261021-0117-r25--plugin-loader--native-contracts.c009 · inference · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При ошибочном scandir/get_file и непустом output_path результат предположительно имеет невалидный JSON вида {"input":{...},{"error":{...}}}: перед самостоятельным объектом ошибки отсутствует имя поля. [^598]: - fw-tv188b-261021-0117-r25--php-framework.c023 · inference · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Вероятно, cond вычисляет булев pattern и использует его результат как условие видимости entry_point downloads. - fw-tv188b-261021-0117-r25--php-framework.c024 · inference · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Вероятно, нативный pattern ff(downloads) проверяет firmware_feature downloads: таково прямое значение ff в отдельном PHP-интерпретаторе Expr, а нативный конфиг rows_menu_config.json использует это выражение. - fw-tv188b-261021-0117-r25--php-framework.c052 · inference · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Вероятно, pattern-функция is_plugin_file(plugin/path) проверяет файл в установленном плагине; реализация выбора базового каталога и проверка типа файла не установлены. [^599]: fw-tv188b-261021-0117-r25--php-framework.c031 · inference · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Вероятно, update_special_favorite_folder возвращает в продолжение action_status: MovieHelper::perform_add_special_favorite считает нулевой статус до icon_cached фатальной ошибкой; нативная шкала статусов не установлена. [^600]: fw-tv188b-261021-0117-r25--php-framework.c035 · inference · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Вероятно, apply_hash_dirties заставляет нативную оболочку обработать записи HashDirties после изменения hash-привязок; формат результата действия и момент очистки файла не установлены. [^601]: - fw-tv188b-261021-0117-r25--php-framework.c043 · inference · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Вероятно, нативная оболочка ищет эффективную строку DUP в row_dup_map по dup_id из data; отсутствие карты, dup_id или эффективной строки диагностируется предупреждениями. - fw-tv188b-261021-0117-r25--php-framework.c044 · inference · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Вероятно, PLUGIN_ROW_OPT_LOADING помечает строку для последующей подгрузки через get_folder_rows; точные триггеры, порядок и повтор нативных запросов из PHP/strings не следуют. - fw-tv188b-261021-0117-r25--php-framework.c051 · inference · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Вероятно, PLUGIN_ROW_OPT_OPTIMIZE_INVISIBLE разрешает оптимизацию невидимых строк; какие операции пропускаются и как определяется невидимость, из PHP/strings не установлено. [^602]: fw-tv188b-261021-0117-r25--plugin-loader--native-contracts-2.c016 · inference · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Вероятно, пустой или неполный ответ get_folder_rows допускает повторный запрос прежних id, если исходные строки сохраняют LOADING и контекст выбора не меняется: неполученные строки не попадают в pending и снова проходят фильтр. [^603]: - fw-tv188b-261021-0117-r25.c020 · inference · tv188b, android-dune-fw; прошивка 261021_0117_r25 · PluginSystemActionData::handle_response=yes, вероятно, заставляет оболочку после завершения run_string проверить /restart_needed_flag и перезапустить GUI; для команды в фоне (с «&») флаг игнорируется - fw-tv188b-261021-0117-r25--php-framework.c046 · inference · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Вероятно, handle_response у plugin_system включает проверку restart_needed_flag и запрос перезапуска GUI после run_string; для фоновой команды диагностируется игнорирование handle_response. [^604]: - fw-tv188b-261021-0117-r25--plugin-loader--native-contracts.c011 · inference · tv188b, android-dune-fw; прошивка 261021_0117_r25 · По псевдокоду JSON-ветка plugin_system в 0x00223998, предположительно, оставляет handle_response по смещению +4 равным 0: выделяет 12 обнулённых байтов и читает только run_string и post_action, без чтения handle_response. - fw-tv188b-261021-0117-r25--plugin-loader--native-contracts.c004 · code, disputed · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В plugin_system после safe_system, если команда не распознана фоновой и handle_response=true, наличие <поле plugin+0x14>/restart_needed_flag вызывает удаление флага и вызов 0x0069f754; проверка не зависит от кода завершения safe_system. - fw-tv188b-261021-0117-r25--plugin-loader--native-contracts-2.c006 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · JSON-десериализация plugin_system оставляет PluginSystemActionData::handle_response=false: в обнулённых данных заполняются run_string и post_action, а поле handle_response не читается. [^605]: fw-tv188b-261021-0117-r25--php-framework--native-actions.c057 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 после выдачи run_default(event=key_info, post_action с tag=a_default) в итоговой выборке post не видно a_default; соседние a_exit, a_composite-1/2 и a_sleep присутствуют. [^606]: fw-tv188b-261021-0117-r25--php-framework--native-actions.c064 · inference, disputed · tv188b, android-dune-fw; прошивка 261021_0117_r25 · По месту использования plugin_exit_folders закрывает открытые папки плагина (count — сколько уровней; 0 — вероятно, все) — у downloads при установке и обновлении плагина. [^607]: fw-tv188b-261021-0117-r25--php-framework--native-actions.c066 · inference, disputed · tv188b, android-dune-fw; прошивка 261021_0117_r25 · plugin_replace_path заменяет хвост пути навигации: снимает erase_count последних элементов и подставляет elements без повторного открытия экранов (у shell_ext — после смены сопоставления файла с фильмом). [^608]: fw-tv188b-261021-0117-r25--php-framework--native-actions.c068 · inference · tv188b, android-dune-fw; прошивка 261021_0117_r25 · rename_path меняет подпись текущего (последнего) элемента пути навигации на caption — так shell_ext обновляет заголовок после переименования папки. [^609]: fw-tv188b-261021-0117-r25--php-framework--native-actions.c072 · inference · tv188b, android-dune-fw; прошивка 261021_0117_r25 · plugin_update_epf_mapping с epf_id привязывает точку входа EPF к плагину mapped_plugin_name, а с epf_id = null (reread_all_epfs) заставляет оболочку перечитать все EPF; sync_epfs — вероятно, синхронный режим. [^610]: fw-tv188b-261021-0117-r25--php-framework--native-actions.c075 · inference · tv188b, android-dune-fw; прошивка 261021_0117_r25 · switch_osd_mode(osd_mode=true) переводит оболочку из GUI плагина в экран воспроизведения (OSD) идущего видео, не перезапуская его. [^611]: fw-tv188b-261021-0117-r25--php-framework--native-actions.c078 · inference · tv188b, android-dune-fw; прошивка 261021_0117_r25 · check_system_storage проверяет наличие (и, при ненулевых required_space/recommended_space, объём) системного хранилища данных и сообщает итог продолжению полем check_succeeded. [^612]: fw-tv188b-261021-0117-r25--php-framework--native-actions.c084 · inference · tv188b, android-dune-fw; прошивка 261021_0117_r25 · edit_movie_data открывает нативный редактор метаданных фильма movie_id и сообщает продолжению movie_data_changed > 0, если данные изменены; change_movie_data — сообщает change_movie_data_status. [^613]: - fw-tv188b-261021-0117-r25--php-framework.c049 · inference · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Вероятно, with_network_folders/with_network_browser управляют доступностью сетевых папок и обзора сети; нативные умолчания и раздельный смысл флагов не установлены. - fw-tv188b-261021-0117-r25--php-framework.c053 · inference · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Вероятно, new_folder_default_name задаёт начальное имя создаваемой папки в choose_file; допустимые имена и нативное значение по умолчанию не установлены. # Миграция плагина на r25: что проверить и поменять, диагностика «перестало работать» > Редакция 2026-11-02. Что проверить и поменять, чтобы PHP-плагин Dune HD, написанный под r22 или r24, работал на > r25, и как разобрать симптом «на r24 работало, на r25 нет». Источники: код tv188b `261021_0117_r25` и > `260827_0003_r24` (`code`), наблюдения на tv188b r25 и снимки tv188b r24 (`device`), список изменений прошивок > (`doc`), страница SDK `dune_devel_info` (`doc`, только как «что просит SDK»: §4.6), код плагинов ProIPTV, GlobalTV > `260130_1351`, Dune BackUp (`code`). Каждое фактическое предложение ссылается на claim id. Наблюдений и кода по другим устройствам и сборкам r25 в базе нет: §1. > > Рядом: сводка r24 → r25 и r22 → r24 — «Различия по версиям и платформам»; матрица возможностей по > прошивкам — «Матрица совместимости возможностей плагина»; реестр ошибок прошивки — «Реестр ошибок прошивки и SDK»; > грабли — «Грабли»; приёмы совместимости в плагинах — > «Приёмы разработки плагинов Dune HD». ## Коротко: вопрос → ответ | Вопрос | Ответ | Где | |---|---|---| | Нужно ли пересобирать плагин под r25? | `php_server` r25 сам подгружает `bootstrap.php`, `dune_api.php`, `dune_plugin.php`, `dune_plugin_fw.php` и `dune_config.php` прошивки перед программой плагина (устройство r25)[^1]; проверять надо вызовы убранного и изменённого | §1, §2.4 | | Что в API r25 убрано? | `HD::make_json_rpc_request` (код r25)[^2], его прямой вызов на tv188b r25 в запросе 11 — `E_ERROR` (устройство r25)[^3], и ключ `mcf_id` у `SyncMyCollectionActionData` (код r25)[^4] | §2.4 | | Сменилась ли версия PHP? | нет: `PHP/5.3.6` во всех пяти разобранных сборках (код r22, r24, r25)[^5] | §3 | | Сменился ли CA-бандл? | нет: SHA-256 один во всех пяти сборках (код r22, r24, r25)[^6] | §3 | | Что нового в сетевом стеке PHP? | подмена хоста `lcreg`, которой нет в r24 (код)[^7] | §2.5 | | Как отличить r25 в коде? | `firmware_version` в `/tmp/run/versions.txt` (устройство r25)[^8] либо проверка нужной константы (код)[^9] | §2.3 | | Какого ключа нет в `versions.txt` r25? | `android_platform` (устройство r25)[^8] | §2.1, строка 9 | | Проверяет ли `HD::http_get_document` r25 сертификат TLS? | по умолчанию нет: `CURLOPT_SSL_VERIFYPEER=false` (код r25)[^10]; включённая проверка идёт по бандлу прошивки (код r25)[^11] | §2.9 | | Что SDK просит от плагинов на Android 11+ AOSP и ATV? | `FS_PREFIX` к путям (SDK)[^12], запуск скриптов через `sh` или `bash` (SDK)[^13], никаких бинарных исполняемых файлов в пакете (SDK)[^14]; это текст SDK, а не факт r25 | §4.6 | ## 1. Что меняется при переходе на r25: три слоя под плагином **Объект:** PHP-плагин на tv188b `260827_0003_r24` → `261021_0117_r25`. Перенос на r25 — это не сборка плагина под новую версию, а смена того, что лежит под плагином. Таких слоёв три, и от слоя зависит, где искать причину. Первый слой — PHP-фреймворк прошивки. На r25 `php_server` при старте загружает `bootstrap.php`, `dune_api.php`, `dune_plugin.php`, `dune_plugin_fw.php`, затем `dune_config.php` и только потом программу плагина (устройство r25)[^1]. Системные файлы при этом берутся из `/system/dunehd/firmware_ext/php/` (устройство r25)[^15]. Файлы `dune_api.php` и `dune_plugin_fw.php` в r25 уже не те, что в r24 (код r24, r25)[^16]. Поэтому классы и константы, которые видит плагин, меняются вместе с прошивкой, а расхождения этого слоя собраны в §2.4 и §4.1. В `include_path` на r25 каталог плагина стоит раньше `firmware_ext/php/include` (устройство r25)[^17]; шаблон `.:%s:%s` с двумя каталогами есть и в строках `php_server` разобранной прошивки r24 (код r24)[^18]. Второй слой — нативный код. `libphp5.so` r25 — другой файл, чем в r24 (код r22, r24, r25)[^19], `libduneshell.so` тоже (код r24, r25)[^20], `libvlc.so` и `libxxx_dune_mediainfo.so` тоже (код r24, r25)[^21]. Изменения этого слоя видны как поведение: §2.5, §2.6 и строки таблицы §2.1. Третий слой — чужие внутренние библиотеки, которые плагин мог скопировать к себе: `shell_ext/lib` прошивки и её копии в плагинах. Например, в копиях lib GlobalTV `260130_1351` и `shell_ext/lib` tv188b r24 побайтно совпадают интерфейсы экранов (код r24)[^22]. Сигнатуры в r25 разошлись с такими копиями (код r24, r25)[^23]; они перечислены в §2.4. **Чем подтверждено и чем нет.** Наблюдения `device` по r25 в этой главе сделаны на tv188b с прошивкой `261021_0117_r25`, модель «Pro 8K Plus» (устройство r25)[^24]. Список изменений называет эту сборку alpha-версией r25 (SDK r25)[^25], Android 11 в ней тот же, что в r24 (код r25)[^26]. В разделе r25 страницы alpha перечислены восемь 8K-моделей (SDK r25)[^27], а у tv989a свои версии r25 (SDK r25)[^28]. Снимки `device` с r24, на которые опирается глава, — это процессы, окружение, файлы и `cmd=status` (устройство r24)[^29]. Поэтому в главе различаются четыре метки столбца «r24 → r25»: | Метка | Что значит | |---|---| | изменилось | есть claims обеих версий и они различаются | | новое в r25 | claim r25 прямо говорит, что в r24 этого нет | | r24: не проверено | факт есть только для r25; на r24 могло быть так же | | SDK ≠ r25 | сторона сравнения — текст SDK; со старой прошивкой это не сравнение | ## 2. Задачи ### 2.1. Почему на r25 не работает: симптом → причина → что поменять **Объект:** плагин на tv188b `261021_0117_r25`; строка показывает, изменилось ли это относительно r24. Порядок — от того, что касается любого плагина, к тому, что касается только части плагинов: установка, PHP, сеть, IP Control, VOD, поставщик. Частоту самих сбоев claims не измеряют. Строки 31 и 32 (PHP и команды оболочки) дописаны в конец, чтобы не сдвигать номера, на которые ссылается §2.2. Первым делом смотрите лог плагина: на r25 он лежит в `/data/data/com.dunehd.app/tmp/run/<плагин>.log` (устройство r25)[^30]. | # | Симптом на r25 | Причина | Что поменять | r24 → r25 | Claim | |---|---|---|---|---|---| | 1 | Плагин, положенный `adb push`, не появился | перечитывание по IP Control его не подхватило, регистрация прошла после `am force-stop com.dunehd.app`; каталога `/flashdata` в корне ФС нет, файлы лежат в `/data/data/com.dunehd.app/flashdata/plugins` | класть туда и перезапускать приложение; подробно — «Пакет плагина» | SDK ≠ r25 | (устройство r25, SDK)[^31] | | 2 | Не выполняются `install` и `update` после `adb push` | при таком развёртывании они не вызываются, а `boot`, `boot_end`, `gui_start` вызываются | `update` проверять онлайн-обновлением: там новая версия его получает | r24: не проверено | (устройство r25)[^32] | | 3 | Плагин не зарегистрирован ни под каким именем | `name` в `dune_plugin.xml` не равен имени каталога; у установщика r24 есть сверка имени с сообщением «declared plugin name is» | привести имена к одному | r24: сверка в коде; поведение не проверено | (устройство r25, код r24)[^33] | | 4 | Точки входа нет в «Приложениях» | у точки входа нет `icon_url` | задать `icon_url` | r24: не проверено | (устройство r25)[^34] | | 5 | После установки не те файлы и бинарники | применяются `.platform.android`, затем поверх `.platform.android-arm-api19`; `.platform.87xx` и прочие удаляются | класть Android-вариант в `.platform.android`; см. BUG-008 | SDK ≠ r25 | (устройство r25, SDK)[^35] | | 6 | Правка PHP не подхватывается | `php_server` перезапускается при изменении `main.php`, правка подключаемого файла его не перезапускает | после правки делать `touch main.php` | r24: блок строк тот же, поведение не проверено | (устройство r25, код r25)[^36] | | 7 | «Ошибка приложения» при действии в плагине | Fatal error или `exit(0)` в `handle_user_input`: оболочка останавливает `php_server`, следующий вызов идёт в новом процессе; при `null` из `call_plugin` — та же остановка и «Ошибка приложения» | смотреть лог плагина; проверить вызовы из §2.4 | r24: не проверено | (устройство r25)[^37] | | 8 | «Превышено время операции» | по тайм-ауту оболочка останавливает `php_server`, без `operation_timeout` у `handle_user_input` 60 с | задать `operation_timeout`, разбить долгую работу; §2.6 | r24: код другой, поведение не проверено; §6 | (устройство r25, код r24)[^38] | | 9 | Пустое значение типа Android-платформы | в `/tmp/run/versions.txt` r25 нет `android_platform`; `ConfigUtils::load_product_and_fw()` r24 и r25 читает ключ оттуда, но при `fw_apk` берёт значение из `fw_apk_platform.txt`, так что пусто будет у своего разбора файла; ProIPTV разбирает его только вне APK, а при `is_apk()` и пустом static-кэше ставит `type` = `fw_apk` или `apk` без чтения `versions.txt` (§5) | брать из `$FS_PREFIX/firmware/config/fw_apk_platform.txt`, там `s928x_android11`; §2.3 | r24: файл tv188b не проверен; метод читает ключ и в r24, и в r25, `fw_apk_platform.txt` тот же, у tv175u r24 ключ пишет `init` | (устройство r25, код)[^39] | | 10 | `shell_exec` работает не с тем файлом | `$FS_PREFIX` добавляется к `/tmp/…`, `/firmware/…`, `/config/…`, `/flashdata/…` и к пути в одинарных кавычках, но не к пути в двойных | писать путь в одинарных кавычках или с явным `$FS_PREFIX`; см. BUG-012 | r24: не проверено; SDK пишет иначе: §6 | (устройство r25)[^40] | | 11 | `date()` в CGI пишет PHP Warning | в `php-cgi` с `php.ini` без `date.timezone` значение пусто, в `php_server` задано | задать `date.timezone` в `php.ini` CGI | r24: не проверено | (устройство r25)[^41] | | 12 | HTTPS падает с errno 60 | у сайта в бандле нет корня цепочки, как у `www.ssl.com`; бандл не менялся с r22 | см. BUG-001; как проверяет `HD::http_get_document` — §2.9 | не изменилось | (устройство r25, код r22, r24, r25)[^42] | | 13 | Сбой на `curl_multi`: код 139 или `PHP_CALL_FAILED` | падение после `curl_multi_info_read` на 4 хендлах к `httpd` самого плеера; с 4 хендлами к компьютеру (запрос 12, один прогон) — отчёт обрывается на метке перед `curl_multi_getcontent` h0, EOF и `PHP_CALL_FAILED`; обхода в claims нет, см. BUG-002 и «HTTP из PHP плагина на r24 и r25» | не держать такой вызов в основном пути; внешние хосты не проверялись | r24: имена функций те же, поведение не проверено | (устройство r25, код r22, r24, r25)[^43] | | 14 | Запрос ушёл на другой хост | `lcreg` заменил хост при заданном `lcreg.txt` | §2.5 | новое в r25 | (код)[^7] | | 15 | Свой разбор логов перестал находить строки | сменился формат сообщений `HD::http_get_document` и исполнителя операций | поправить шаблоны по §4.5 | изменилось | (код r25)[^44] | | 16 | `/cgi-bin/do?cmd=…&plugin=

` даёт `unknown_command` | запрос не дошёл до `www/cgi-bin/run.php` плагина | вызывать CGI по `/cgi-bin/plugins/

/<файл>` | r24: не проверено; §7 | (устройство r25)[^45] | | 17 | 404 на URL плагина | «/» в конце: каталог плагина со «/» — 404, без «/» — 302; «/» после имени файла — 404 | убрать «/» | r24: не проверено | (устройство r25)[^46] | | 18 | `cmd=open_path` отвечает `ok`, но плагин не запускается | точку входа запускает `launch_media_url` с `plugin_launcher://`, а не `open_path root://applications/…`; см. «IP Control (`/cgi-bin/do`) для разработчика плагина» | перейти на `plugin_launcher://{name=…}{ep_media_url=…}` | SDK ≠ r25 | (устройство r25, SDK)[^47] | | 19 | Команды IP Control зависают | ждут конца `handle_user_input`, даже адресованные другому плагину; см. «IP Control (`/cgi-bin/do`) для разработчика плагина» | не держать долгую работу в `handle_user_input` | r24: не проверено | (устройство r25)[^48] | | 20 | Не вызывается `get_vod_stream_info` | без `feature vod_get_stream_info` ленивая серия получает только `get_vod_stream_url`; с ней метод вызван | объявить `vod_get_stream_info`, как `ktv_start` | r24: манифест `ktv_start` тот же, поведение не проверено | (устройство r25, код r24)[^49] | | 21 | Серверу не приходят заголовки потока | HTTP MP4 без `engine` играет VLC, и `http_headers` на нём не уходят; с `engine:1` заголовок дошёл у серии с `playback_url_is_stream_url=true`, а в запросе 11 — и из ответа `get_vod_stream_url` для `kbplazy://0` без суффикса; см. «Воспроизведение из плагина» | добавить `engine:1` в `dune_params` | r24: не проверено, `libvlc.so` другой | (устройство r25)[^50] | | 22 | Логика переключения серий срабатывает в конце последней серии | `playback_going_to_switch` приходит и тогда, когда перехода нет | не считать событие признаком следующей серии; см. BUG-007 | SDK ≠ r25 | (устройство r25, SDK)[^51] | | 23 | Изменилась длительность буфера VOD | `PluginVodInfo::buffering_ms` применяется, хотя SDK называет поле нереализованным | проверить значение, которое отдаёт плагин | SDK ≠ r25 | (устройство r25, SDK)[^52] | | 24 | Прямой вызов `/firmware/scripts/ffmpeg.sh` падает | на устройстве такого пути нет: `No such file or directory`, хотя в образах r24 и r25 скрипт лежит в `system/system/dunehd/firmware/scripts/` | брать `$FS_PREFIX/firmware/bin/ffmpeg` (на r25 в запросе 11 из `adb shell` с `LD_LIBRARY_PATH` (§6) он вывел `ffmpeg version 7.1.3`), а без него — свою сборку, как ProIPTV (SDK бинарные исполняемые файлы в плагине запрещает: §6); см. BUG-016 | r24: вызов в коде и скрипт те же, поведение не проверено | (устройство r25, код, SDK)[^53] | | 25 | Поставщик rutube стал другим | r24 подменял `expr` на `country(ru)` без `rutube_integration`; r25 при этом плагине поставщика включает, а иначе решает ключ `expr` описателя | проверять условие по описателю | изменилось | (код)[^54] | | 26 | Поставщик получил `sup_info` у кнопки выбора | в r24 кнопки поставщиков его не получали; в r25 получает кнопка поставщика последней записи истории | разбирать `wh_*` и в `play_online`; см. «Поставщик каталога «Фильмы»» | изменилось | (код)[^55] | | 27 | Новый описатель в `/tmp/movie_suppliers` виден без флага | r24 перечитывает при флаг-файле, r25 ещё и при смене mtime каталога | не рассчитывать, что без флага список не обновится | изменилось | (код)[^56] | | 28 | `get_stream_url` вызывается без выбора пользователя; `url` файла не используется | у `stream` запросы идут сразу после `do_file_search`; у `stream_special` `url` из ответа не взят | держать `get_stream_url` быстрым и реализованным; см. «Поставщик каталога «Фильмы»» | r24: `stream_special` в коде так же; остальное не проверено | (устройство r25, код r24)[^57] | | 29 | `error_action` поверх открывшегося приложения | при `delay` < 1 ожидание фокуса сразу кончается неудачей, если оболочка ещё в фокусе | ставить `wait_app_start_delay` > 0, см. BUG-006 | r24: тот же порядок проверок в коде, поведение не проверено | (устройство r25, код)[^58] | | 30 | `am start --user …` даёт статус −1 | неизвестная опция отвергается: `--user` нет и среди строк `dune.apk` r24 | убрать опцию; ветка `/system/dunehd/dunehd_service` идёт в `popen`, с `--user` она не проверена (§7); см. «Поставщик каталога «Фильмы»» | не изменилось по строкам | (устройство r25, код)[^59] | | 31 | Прямой вызов `HD::make_json_rpc_request` на tv188b r25 в запросе 11 кончается фатальной ошибкой, JSON-ответа нет | в `dunelib/utils.php` r25 метода нет; в запросе 11 (один прогон) после `include` `dunelib/utils.php` класс `HD` есть, `method_exists` дал `false`, прямой вызов — `E_ERROR` `Call to undefined method HD::make_json_rpc_request()` | держать свою функцию; §2.4 | в r24 метод есть | (устройство r25, код)[^60] | | 32 | `wget` по полному пути не запустился в запросе 11 из `php_server` | в запросе 11 (один прогон) оба вызова `/data/data/com.dunehd.app/bin/wget` — напрямую и через `sh` — вернули rc=126 и `cannot execute binary file`; причину claim не называет | звать по имени: `which wget` показал этот путь (ссылка на `libxxx_busybox.so`), а вызов `wget` к `/ping` компьютера вернул `ok` и rc=0 | r24: не проверено | (устройство r25)[^61] | ### 2.2. Как перенести плагин: чек-лист от широкого к узкому **Объект:** пакет плагина под r22/r24, проверка на tv188b r25. Номера в скобках — строки таблицы §2.1, где описаны причина и claims. Чек-лист идёт от того, что нужно всем, к тому, что нужно части плагинов. Пункты, которые вас не касаются, пропускайте. **Любой плагин.** 1. Поставьте плагин и проверьте регистрацию, имя каталога и `icon_url`; при `adb push` — путь и перезапуск приложения (1, 3, 4). 2. Проверьте раскладку `.platform.*` (5) и вызов обработчиков `install`/`update` (2). 3. Найдите в коде `make_json_rpc_request` (31: прямой вызов на tv188b r25 в запросе 11 — `E_ERROR` (устройство r25)[^3]) и `mcf_id` (§2.4) и, если плагин несёт копию `shell_ext/lib` или `ext_epg/lib`, — сигнатуры из §2.4. 4. Откройте лог плагина и пройдите все экраны: Fatal error даст «Ошибку приложения» (7). 5. Проверьте код, который разбирает `/tmp/run/versions.txt`: ключ `android_platform` (9) и способ разбора ревизии (§2.3). 6. Задайте `operation_timeout` с верными единицами (8, §2.6). **Плагин с командами оболочки и CGI.** 7. Проверьте кавычки вокруг путей в `shell_exec` (10), «/» в конце URL (17), таймзону в CGI (11), адресацию CGI (16) и вызов ffmpeg (24) и `wget` (32). **Плагин с сетью.** 8. Проверьте HTTPS к своим хостам с включённой проверкой TLS (12, §2.9), `curl_multi` (13), подмену хоста (14, §2.5). 9. Проверьте скрипты, которые разбирают логи (15). **Плагин с внешним управлением.** 10. Замените `open_path` на `plugin_launcher://` (18) и учтите ожидание команд IP Control (19). **Плагин с VOD.** 11. Объявите `vod_get_stream_info`, если метод нужен (20); проверьте заголовки потока (21), обработку `playback_going_to_switch` (22) и значение `buffering_ms` (23). 12. Проверьте клавиши VOD и историю по «Ввод и диалоги» и «Воспроизведение из плагина». **Поставщик «Фильмов».** 13. Проверьте условие `expr` и обновление списка поставщиков (25, 27), разбор `sup_info` (26), `get_stream_url` (28), запуск приложения (29, 30). Различия по прошивкам сведены в «Поставщик каталога «Фильмы»». **Плагин, рассчитанный на r24 и r25 одновременно.** 14. Закройте новые вызовы API проверкой наличия (§2.3, §2.7). **Что просит SDK для Android 11+ AOSP и ATV.** 15. Пройдите требования страницы `dune_devel_info`: пути с `FS_PREFIX`, команды в `shell_exec` и `system`, имя процесса GUI, если плагин его ищет или завершает, запуск скриптов через `sh` или `bash`, бинарники в пакете. Это просьбы SDK; что из них подтверждено на r24+, а что нет, показано в §4.6. ### 2.3. Как определить прошивку и возможности из плагина **Объект:** код плагина на tv188b r24 и r25, приёмы ProIPTV. Плагину нужно это в двух случаях: чтобы обойти различие из §2.1 и чтобы не вызвать API, которого на этой прошивке нет. Подробный каталог приёмов — «Приёмы разработки плагинов Dune HD»; здесь только то, что важно при переходе на r25. На r25 `/tmp/run/versions.txt` — шесть строк `key=value`: `api_version=1.1.0`, `firmware_version=261021_0117_r25`, `product=tv188b`, `platform_kind=android`, `app_version`, `app_version_code` (устройство r25)[^8]. Версию можно взять и из `/cgi-bin/do?cmd=status`: там те же 16 имён параметров, что на r24, и `firmware_version` (устройство r24, r25)[^62]. Тип Android-платформы в `versions.txt` r25 не записан: ключа `android_platform` там нет (устройство r25)[^8]. `ConfigUtils::load_product_and_fw()` r25 всё равно читает его оттуда, но при истинном `HD::is_fw_apk()` перезаписывает значение содержимым `/firmware/config/fw_apk_platform.txt` (код r25)[^63]; `HD_FW_APK` у `php_server` на tv188b r25 равна 1 (устройство r25)[^64], а в r24 для `fw_apk` значение берётся из того же файла (код r24)[^65]. Сам файл в образах r24 и r25 один и тот же и содержит `s928x_android11` (код r24, r25)[^66], на устройстве r25 — то же (устройство r25)[^67]. Поэтому свой разбор `versions.txt` на r25 этого значения не даст (§2.1, строка 9). Ревизию разбирают числом: ProIPTV выделяет регуляркой `rev_number` (код)[^68] и считает `is_r25_or_higher()` как `rev_number > 24` (код)[^69]. В `Expr` прошивки r24 `fwv_ge`, `fwv_gt`, `fwv_le`, `fwv_lt` сравнивают через `strcmp` (код r24)[^70]. Возможность ProIPTV проверяет саму: `defined('ChooseFileActionData::filter')` и `class_exists('PluginRowsFolderView')` (код)[^9]. Для r25 подходят те же приёмы и имена из §4.1: например, `COND_ACTION_ID` есть в `dune_api.php` r25 и нет в r24 (код r25)[^71]. Флаги прошивки читаются из `/tmp/firmware_features.txt` и `/tmp/ro_features.txt` (код r24)[^72]; по версиям они сведены в §4.3. Признаки оболочки не менялись: на r24 и r25 в окружении заданы и `HD_APK=1`, и `HD_FW_APK=1` (устройство)[^73]. ### 2.4. Убранные и изменённые API r25: `HD`, `dune_api.php`, `shell_ext/lib` **Объект:** `dunelib/utils.php` и `dune_api.php` прошивки (доступны любому плагину), `shell_ext/lib` и `ext_epg/lib` прошивки (код встроенных плагинов и их копии в сторонних). Здесь всё, что в claims значится убранным или изменённым так, что старый вызов может сломаться. Первые две строки касаются любого плагина, потому что эти файлы подгружает сам `php_server` или они лежат в его `include_path` (устройство r25)[^74]. Остальные касаются тех, кто скопировал код `shell_ext/lib` или `ext_epg/lib` к себе: в `include_path` этих каталогов нет (устройство r25)[^17]. Для них важно, что копия и код прошивки разошлись: при обновлении копии или при переносе нового кода из r25 сверяйте сигнатуры. | Что | r24 | r25 | Что сделать | Claim | |---|---|---|---|---| | `HD::make_json_rpc_request($op_name, $params)` | возвращает массив JSON-RPC 2.0 с растущим id | метода нет; прямой вызов на tv188b r25 в запросе 11 — `E_ERROR` | держать свою функцию | (устройство r25, код)[^75] | | `SyncMyCollectionActionData::mcf_id` | ключи `mcf_id`, `post_action` | только `post_action` | убрать ключ | (код)[^76] | | `ActionFactory::sync_my_collection` (`shell_ext/lib`) | `mcf_id` по умолчанию −1 | принимает только `$post_action` | убрать аргумент | (код)[^77] | | `get_timer` в `GCompsScreen`, `RowsScreen` (`shell_ext/lib`) | `get_timer(MediaURL $media_url, &$plugin_cookies)` | `get_timer($media_url)`; так же объявлен в `RegularScreen` | при копировании новых экранов брать сигнатуру r25 | (код)[^78] | | `RowsFactory::pane` (`shell_ext/lib`) | формирует `PluginRowsPane` | второй позиционный параметр — `$row_dup_map`, за ним `$focus`, `$bg` | проверить позиционные вызовы | (код)[^79] | | `ActionFactory::edit_list_config` (`shell_ext/lib`) | после `groups` сразу `sel_id`, `post_action` | обязательный позиционный `options` между `groups` и `sel_id` | проверить позиционные вызовы | (код)[^80] | | `get_label_def` в `ext_epg/lib/gcomps_factory.php` | создаёт `GCOMPONENT_LABEL` | метода нет, вместо него `label_v2` с `GCOMPONENT_TTF_LABEL` | заменить в своей копии при обновлении | (код r24, r25)[^81] | На r25 Fatal error в `handle_user_input` даёт «Ошибку приложения» (§2.1, строка 7) (устройство r25)[^82]. Прямой вызов убранного `HD::make_json_rpc_request` проверен на tv188b r25 в запросе 11 (один прогон): после `include` файла `dunelib/utils.php` класс `HD` есть, `method_exists` дал `false`, а вызов завершился `E_ERROR` `Call to undefined method HD::make_json_rpc_request()`, а не JSON-ответом (устройство r25)[^3]. Какое сообщение видно на экране, claims не говорят: см. §7. Для того, что в r25 только добавлено, см. §4.1. ### 2.5. Почему запрос ушёл не на тот адрес: URL в `libphp5.so` r25 и `lcreg` **Объект:** `libphp5.so` tv188b r25 и r24 (`code`, дизассемблер), PHP-функции сети. Встроенный PHP переписывает URL до запроса, и в r25 к прежней подстановке порта добавилась подмена хоста. Она вынесена отдельно, потому что меняет адрес запроса, а не только его путь внутри плеера. Прежняя часть — подстановка порта. В коде r24 при заданной `HD_HTTP_LOCAL_PORT` URL `http://127.0.0.1/cgi-bin/plugins/…` и `http://localhost/cgi-bin/plugins/…` превращаются в `http://127.0.0.1:<порт>/cgi-bin/plugins/…`, и это та же CGI-подстановка, что в r25 (код r24)[^83]. В коде r25 `_php_do_add_fs_prefix_to_http` при заданной `HD_HTTP_LOCAL_PORT` заменяет префикс `http://localhost/cgi-bin/plugins/` на `http://127.0.0.1:/cgi-bin/plugins/` с тем же хвостом (код r25)[^84] и тем же кодом — префикс без порта `http://127.0.0.1/cgi-bin/plugins/` (код r25)[^85]. Без переменной, а также для `http://`-URL с другим хостом или путём порт не подставляется и URL уходит в `_php_apply_lcreg_to_http`; URL не на `http://` возвращается без обработки (код r25)[^86]. Что из этого видно на устройстве r25, — ниже, в абзаце о маршрутах; что не проверено — §7. Новая часть — `lcreg`. В r24 помощник не вызывает `lcreg` и других функций замены хоста (код r24)[^87], а в r25 вызывает его при отсутствии `HD_HTTP_LOCAL_PORT` либо для `http://`-URL, не попавшего под подстановку порта (код r25)[^88]. При заданной `HD_HTTP_LOCAL_PORT` URL без префикса `http://` выходит до `lcreg` (код r25)[^88], а в окружении `php_server` плагина `kb_probe8` на tv188b r25 она равна 80 (устройство r25)[^89]. Настройки берутся из `FS_PREFIX + /config/lcreg.txt` и `FS_PREFIX + /config/lcreg_pairs.txt` (код r25)[^90]: - первая строка `lcreg.txt`, равная 0, выбирает встроенную таблицу `lcreg_ru_pairs`, равная 1 — файл пар; ошибка чтения или другое значение дают `lcreg_kind=-1` (код r25)[^91], а при −1 замена не ищется (код r25)[^92]; - состояния −1, 0 и 1 не запускают повторное чтение настроек (код r25)[^93]; - строка файла пар имеет вид `<хост> : <замена>`, принимается до 1024 пар (код r25)[^94]; - имя хоста сравнивается целиком и с учётом регистра (код r25)[^95], схема, userinfo, порт и путь остаются исходными (код r25)[^96]; - при успешной замене исходный и новый URL печатаются через `printf` без проверки `PHP_DEBUG` (код r25)[^97]. Маршрут зависит от функции. `curl_setopt` с URL-опцией проходит через помощник (код r25)[^98], а `curl_init($url)` вызывает установку URL напрямую, минуя этот путь (код r25)[^99]. На tv188b r25 в запросе 11 (один прогон, `php_server`) один и тот же `http://localhost/cgi-bin/plugins/kb_probe11/host.sh` пришёл в CGI с `HTTP_HOST=127.0.0.1` при `curl_setopt(CURLOPT_URL)` (устройство r25)[^100] и с `HTTP_HOST=localhost` при `curl_init($url)` (устройство r25)[^101]; `curl_error` пуст в обоих случаях (устройство r25)[^102]. Более ранний запрос 6 испытал только `curl_init($u)` (код r25)[^103]: из `php_server` при `HD_HTTP_LOCAL_PORT=80` (устройство r25)[^104] запрос к `http://localhost/cgi-bin/plugins/kb_probe6/ping.sh` пришёл с `HTTP_HOST=localhost`, а к `http://127.0.0.1:80/cgi-bin/plugins/kb_probe6/ping.sh` — с `HTTP_HOST=127.0.0.1` (устройство r25)[^105]. Поэтому, читая `HTTP_HOST` в CGI, сначала смотрите, каким вызовом задан URL. Открытие потока передаёт путь в помощник до выбора URL-обёртки (код r25)[^106]. Кроме того, `curl_exec` r25 ставит обработчик `_php_curl_opensocket_remote` для адреса вне `localhost` и `127.x`/`::1`, а также для пустого URL или URL с другой схемой (код r25)[^107]; что он делает, в claims нет. Диагностика: проверьте наличие и содержимое `$FS_PREFIX/config/lcreg.txt` и найдите в выводе пары URL из `printf`. Что `lcreg` делает с хостами Dune и включён ли он на устройствах — в §7. ### 2.6. Почему операция кончается «Превышено время операции» **Объект:** операции PHP-плагина, код r24 и наблюдения на tv188b r25. Полная картина — «Операции плагина, тайм-ауты и `php_server`». Это различие заметнее других, потому что меняет, что происходит с вашим PHP-кодом. В коде r24 отмена операции только ставит флаг в дескрипторе и ничего не передаёт `php_server` (код r24)[^108], а пришедший результат отброшенной операции не разбирается (код r24)[^109]. На r25 по тайм-ауту оболочка останавливает `php_server`, и вызов прерывается (устройство r25)[^110]. Следующий вызов идёт в новом процессе (устройство r25)[^111], статические переменные начинаются заново (устройство r25)[^112]. Какой код r25 за это отвечает, claims не говорят (§6). Значение надо задавать в правильных единицах: в манифесте `operation_timeout` — секунды (устройство r25)[^113], в данных действия `plugin_handle_user_input` — миллисекунды (устройство r25)[^114]. Значение 3 в данных действия дало «timeout=0.0s» (устройство r25)[^114]; подробно — BUG-005. ### 2.7. Как пользоваться новым API r25, не сломав r24 **Объект:** новые действия и операции `dune_api.php` tv188b r25, уровень `code`; что с наблюдениями — §7. Идентификаторов новых действий в r24 нет (код r25)[^71], поэтому плагин для обеих прошивок проверяет их перед использованием (§2.3). Перечень — §4.1; здесь то, что отличает их на практике. Ленивые ряды. Операция `get_folder_rows` вызывает `$plugin->get_folder_rows(media_url, row_ids)`, а если метода нет, `DunePluginFw` бросает Exception «Method not found: get_folder_rows» (код r25)[^115]. В `shell_ext/lib` r25 `AbstractRowsScreen::get_rows` по умолчанию бросает исключение (код r25)[^116]. Структуры и `RowsFactory` — «Экраны и папки плагина». Действия из манифеста и из PHP. Для `cond`, `load_and_scale_image`, `apply_hash_dirties` и `update_special_favorite_folder` в `libduneshell.so` r25 есть конструкторы из XML, а `create_fs_ctl_action_from_xml()` пишет «not implemented» (код r25)[^117]. Встроенный `downloads` r25 задаёт `is_shown_action` точки входа как `cond` с `is_plugin_file(dunemdb_supplier_online_movies/__v2)` (код r25)[^118]. Загрузки. Флаг `downloads` появился в r25 (код r25)[^119], и код r25 убирает его при `/tmp/flm.txt` (код r25)[^120]. Ключ описателя `dl_capable` работает только при этом флаге (код r25)[^121]; подробно — «Загрузки и TorrServer для плагина». EPG и картинки. Экран программы `ext_epg` r25 выводит новые относительно r24 метки `kinopoisk_rating` и `producer` (код r25)[^122], в базовом скине появился `special_icons/kp.png` (код r25)[^123]. В `libduneshell.so` r25 есть декодер WebP (код r25)[^124]. ### 2.8. Как перенести плагин с r22 **Объект:** сравнение tv188b `250815_1012_r22`, tv175u `240619_0210_r22` и r24, уровень `code`. Плагин под r22 проходит два шага: сначала различия r22 → r24, затем всё из этой главы. Сводка — «Различия по версиям и платформам». - В `dune_api.php` r22 нет ряда классов и констант r24: `ChooseFileActionData`, `PluginStreamInfo`, `StreamMarker`, `GUI_EVENT_CONFIRM_UPDATE`, `GUI_EVENT_NETWORK_CHANGE` и др. (код r22, r24)[^125]; r22 не обрабатывает `get_vod_stream_info` (код r22, r24)[^126]. - Файлы `dunelib/config_utils`, `dune_languages`, `expr`, `utils` в r22 отсутствуют, а `bootstrap.php`, `dune_config.php`, `dune_plugin.php` и `dunelib/dune_countries.php` с r24 одинаковы (код r22, r24)[^127]. - `libphp5.so` r22 и r24 — разные файлы (код r22, r24, r25)[^19], при этом строка `PHP/5.3.6` в них та же (код r22, r24, r25)[^5]. - Встроенный youtube r22 регистрировался сам через `bin/register_supplier.sh` (код r22)[^128]; контракт потоковых команд поставщика в r22 тот же, что в r24 (код r22)[^129]. Ниже r22 и Sigma — короткая справка: версии по SDK в «Различия по версиям и платформам», а ProIPTV при `rev_number ≤ 21` показывает диалог `err_too_old_player` (код)[^130]. ### 2.9. Как `HD::http_get_document` проверяет TLS: `CURLOPT_SSL_VERIFYPEER`, `CURLOPT_CAINFO` **Объект:** `HD::http_get_document` на tv188b r25 и r24, `HD::http_server_responding` на r25, уровень `code`; запросы на устройстве — tv188b r25. Раздел нужен, чтобы понять, почему плагин на хелпере прошивки может не увидеть ошибку из §2.1, строка 12, и что меняется, когда он включает проверку. В r25 `HD::http_get_document()` и `HD::http_server_responding()` по умолчанию ставят `CURLOPT_SSL_VERIFYPEER=false` (код r25)[^10]; `HD::http_get_document` r24 делает то же (код r24)[^131], см. BUG-003. Разницу видно на `www.ssl.com`: на tv188b r25 из `php_server` он даёт errno 60 при включённой проверке и HTTP 200 без неё (устройство r25)[^132]. Включить проверку может вызывающий: при истинном `CURLOPT_SSL_VERIFYPEER` в `$opts` и URL на `https://` хелпер r25 добавляет `CURLOPT_CAINFO=/firmware/certs/ca-bundle.crt`, а `CURLOPT_CAINFO` из `$opts` при этом перезаписывается (код r25)[^11]. Подстановку этого файла делает и r24 (код r24)[^133]. Через этот хелпер на r25 проверка идёт по бандлу прошивки (код r25)[^11]: у него один SHA-256 в пяти сборках (код r22, r24, r25)[^6], а его сроки и отказы описаны в BUG-001. ## 3. Что не изменилось, хотя можно опасаться **Объект:** tv188b r24 и r25, частично все пять разобранных сборок (tv188b r22, r24, r25, tv175u r24, APK r24). Эти проверки при переходе можно не считать первоочередными: claims показывают совпадение. Совпадение файла или строк — это `code`, а не проверка поведения. Полная матрица — «Матрица совместимости возможностей плагина». | Чего опасаются | Что показывают claims | Уровень | Claim | |---|---|---|---| | Другая версия PHP | строка `PHP/5.3.6` в пяти сборках, на r25 `PHP_VERSION` = 5.3.6 | `code`, `device` | (устройство r25, код r22, r24, r25)[^134] | | Пропадут расширения PHP | имена JSON, cURL, mbstring, iconv, PCRE, OpenSSL, pcntl, posix, sockets, XML и классов `SQLite3`, `ZipArchive`, `SoapClient` есть в пяти сборках | `code` | (код r22, r24, r25)[^135] | | Другие curl и OpenSSL | OpenSSL 1.0.1u в пяти сборках, libcurl/7.67.0 в tv188b r22, r24, r25 и tv175u r24; наборы `curl_multi_*` (12) и `CURLOPT_*` (111) совпадают в пяти сборках | `code` | (код r22, r24, r25)[^136] | | Обновится или сломается CA-бандл | SHA-256 тот же в пяти сборках, данные Mozilla от 11 октября 2022 года; это и плюс, и проблема: см. BUG-001 | `code` | (код r22, r24, r25)[^137] | | Сменятся `FS_PREFIX` и признаки оболочки | `FS_PREFIX=/data/data/com.dunehd.app`, `HD_APK=1`, `HD_FW_APK=1`, `HD_HTTP_LOCAL_PORT=80` у демонов обеих версий | `device` | (устройство)[^138] | | Сменится uid `php_server` | r24: `php_server` работает от пользователя `system`, UID пакета приложения 1000; r25: uid 1000 | `device` | (устройство)[^139] | | CGI потеряет root | на r25 CGI работает под uid 0 и `u:r:shell:s0`; на r24 снят только `httpd` с теми же uid и меткой, а не сам CGI | `device` | (устройство)[^140] | | Сменится `dunehd_service` | клиент, сервисный ELF, обёртка и `.env` с одним SHA-256 в r22, r24, r25 | `code` | (код r22, r24, r25)[^141] | | Сменится протокол IP Control | те же 16 имён параметров `cmd=status`, `protocol_version=6` на r24 и r25 | `device` | (устройство r24, r25)[^62] | | Сменятся старые операции плагина | `DunePluginFw` r25 зовёт базовые `get_folder_view`, `get_vod_info` и др., если ветвь `_v2` не выбрана; `DunePlugin` объявляет те же 11 основных операций, что реализует demo2. Это код, а не проверка демо на устройстве | `code` | (код r25)[^142] | | Не загрузится плагин на `DunePluginFw` | зонд с наследником `DunePluginFw` на r25 загружается и получает операции | `device` | (устройство r25)[^143] | | Другая регистрация поставщика | `movie_suppliers_update.sh` с парами аргументов в коде r24 и на устройстве r25 | `code`, `device` | (устройство r25, код r24)[^144] | | Другие ключи запуска приложений | `LaunchExtAppActionData` с тем же набором из 8 ключей; `android_apps/model.php` r24 в части запуска как в r25; `dune.apk` tv188b r24 и r25 с `sharedUserId=android.uid.system` | `code` | (код)[^145] | | Другие субтитры | `subtitles.php` r24 и r25 одного размера и SHA256 | `code` | (код r24, r25)[^146] | | Пропадут ресурсы оболочки | шрифты, экранные клавиатуры и альтернативные скины совпадают; базовый скин — кроме нового `kp.png` | `code` | (код r25)[^147] | | Другая база Android | та же база Android 11 `RD2A.211001.002` | `code` | (код r25)[^26] | | Другой файл `gcomp_list.php` | побайтно как в r24 | `code` | (код r25)[^148] | | Другой конфиг поставщиков | `movies/suppliers_config.php` и `movies/movie_services_config.php` побайтно как в r24 | `code` | (код r25)[^149] | | Сетевые скрипты | `init_network.sh`, `init_torrents.sh`, `udhcpc_callback.sh`, `smb.bash` побайтно те же | `code` | (код r24, r25)[^150] | | Другой файл типа платформы | `firmware/config/fw_apk_platform.txt` с `s928x_android11` и одним sha256 в образах r24 и r25 | `code` | (код r24, r25)[^66] | | Другие `ffmpeg.sh` и `firmware/bin/ffmpeg` | `system/system/dunehd/firmware/scripts/ffmpeg.sh` (457 байт) с одним sha256 в образах r24 и r25; `system/system/dunehd/firmware/bin/ffmpeg` в обоих — симлинк на `libxxx_ffmpeg.so`. Это скрипт и ссылка, а не сам ffmpeg: §6, §7 | `code` | (код r24, r25)[^151] | | Другая проверка TLS в `HD::http_get_document` | `CURLOPT_SSL_VERIFYPEER=false` по умолчанию и `CURLOPT_CAINFO` с бандлом прошивки при включённой проверке для `https://` в r24 и r25: §2.9 | `code` | (код)[^152] | ## 4. Справочник ### 4.1. `dune_api.php`: что добавлено в r25 **Объект:** `dune_api.php` tv188b `261021_0117_r25` против `260827_0003_r24`, уровень `code`. Что делают действия на устройстве, см. §7. | Имя | Назначение | Поля и значения | Где работает | Claim | |---|---|---|---|---| | `COND_ACTION_ID` = `cond`, `CondActionData` | действие с условием `pattern`; смысл результата — §7 | `pattern`, `post_action` | tv188b r25, `code`; есть конструктор из XML | (код r25)[^153] | | `FS_CTL_ACTION_ID` = `fs_ctl`, `FsCtlActionData`, `FsCmdDef`, `FsCmdKind` | файловые команды | `cmd`, `output_path`, `post_action`; `FsCmdKind`: `resolve_url`, `stat`, `scandir`, `get_file` | tv188b r25, `code`; конструктор из XML «not implemented» | (код r25)[^154] | | `FsResolveUrlDef`, `FsStatDef`, `FsScandirDef`, `FsGetFileDef` | параметры команд `fs_ctl` | `url`, `try_mount_if_needed`; `path`; `path`, `with_stat`, `max_items_count`; `path`, `target_path`, `skip`, `max_size`, `chunk_size` | tv188b r25, `code` | (код r25)[^155] | | `LOAD_AND_SCALE_IMAGE_ACTION_ID`, `LoadAndScaleImageActionData` | загрузка и масштабирование картинки | `icon_url`, `local_path`, `scale_if_needed`, `icon_width`, `icon_height`, `post_action` | tv188b r25, `code` | (код r25)[^156] | | `UPDATE_SPECIAL_FAVORITE_FOLDER_ACTION_ID`, `UpdateSpecialFavoriteFolderActionData` | действие со спецпапкой избранного | `name`, `delete`, `skip_interactions`, `post_action` | tv188b r25, `code` | (код r25)[^156] | | `APPLY_HASH_DIRTIES_ACTION_ID`, `ApplyHashDirtiesActionData` | действие `apply_hash_dirties`; назначение — §7 | `post_action` | tv188b r25, `code` | (код r25)[^156] | | `PLUGIN_OP_GET_FOLDER_ROWS`, `PLUGIN_OUT_DATA_PLUGIN_FOLDER_ROWS` | операция ленивой подгрузки строк | `PluginFolderRowsInputData {media_url, row_ids}`, `PluginFolderRows {rows}` | tv188b r25, `code` | (код r25)[^157] | | `PLUGIN_ROW_TYPE_DUP`, `PLUGIN_ROW_OPT_LOADING`, `PLUGIN_ROW_OPT_OPTIMIZE_INVISIBLE`, `GCOMP_OPT_STUB` | типы и опции строк и компонентов | `row_dup`, `0x4`, `0x8`, `0x400000` | tv188b r25, `code` | (код r25)[^158] | | `PluginRowsPane::row_dup_map`, `PluginFolderView::type_mask` | новые поля | карта строк; `int` | tv188b r25, `code` | (код r25)[^159] | | `FileChooserUiParams::{with_network_folders, with_network_browser, new_folder_default_name}` | новые поля выбора файла | `bool`, `bool`, строка | tv188b r25, `code` | (код r25)[^160] | | `PluginSystemActionData::handle_response` | новое поле действия | `bool` | tv188b r25, `code` | (код r25)[^161] | ### 4.2. `dunelib`: что добавлено и убрано в r25 **Объект:** `firmware_ext/php/include/dunelib/` tv188b r25, уровень `code`. | Имя | Что | Claim | |---|---|---| | `dunelib/installed_plugins.php`, `InstalledPlugins` | новый класс: читает `/tmp/run/installed_plugins.xml`, перечитывает при смене mtime; `get_by_name`, `reload`, `ensure_loaded` | (код r25)[^162] | | `HD::ensure_empty_file`, `HD::log_elapsed`, `HD::read_int`, `HD::read_string` | новые статические методы | (код r25)[^163] | | `dunelib/dl_state.php`, `DlState` | команды менеджеру загрузок файлами в `/tmp/run/dl_input/` | (код r25)[^164] | | `ConfigUtils::load_firmware_features` | убирает `downloads` при `/tmp/flm.txt` | (код r25)[^120] | | `HD::http_get_document` | изменён формат лога: §4.5 | (код r25)[^165] | | `HD::make_json_rpc_request` | убран, прямой вызов на tv188b r25 в запросе 11 — `E_ERROR`: §2.4 | (устройство r25, код r25)[^166] | ### 4.3. Флаги `firmware_features` по прошивкам **Объект:** `firmware_features.txt` tv188b r22, r24, r25. | Флаг | r22 → r24 | r24 → r25 | Claim | |---|---|---|---| | `dunemdb_supplier_plugin_api_v7`, `sup_api_v8`, `movie_suppliers_order`, `lcfg_v2`, `light_stop` | добавлены в r24 | на r25 (`device`) есть | (устройство r25, код r24)[^167] | | `dunemdb_supplier_plugin_api_v2`…`v6`, `tmpfs`, `tv_config`, `newgui2021`, `app_root_url_type`, `url_sdcard`, `apk`, `fw_apk`, `drm_apps` | есть в r24 | на r25 (`device`) есть | (устройство r25, код r24)[^168] | | `movie_suppliers_update` | есть в r24 | на r25 (`device`) есть | (устройство r25, код r24)[^169] | | `downloads` | — | новый в r25; убирается при `/tmp/flm.txt`, файла на устройстве нет | (устройство r25, код r25)[^170] | ### 4.4. Файлы и бинарники прошивки r25 **Объект:** дерево файлов tv188b r25 против r24, уровень `code`. | Что | Изменение | Claim | |---|---|---| | Встроенные плагины | к 13 плагинам r24 добавлены `downloads` и `s928x_dvfel` | (код r25)[^171] | | `libxxx_dl_manager.so`, `libxxx_lcconv.so`, `libxxx_vsftpd.so` | новые исполняемые файлы | (код r25)[^172] | | `libphp5.so` | другой файл, чем в r24 | (код r22, r24, r25)[^19] | | `libduneshell.so` | другой SHA-256 | (код r24, r25)[^20] | | `libvlc.so`, `libxxx_dune_mediainfo.so` | другой SHA256 | (код r24, r25)[^21] | | `add_atv_route.sh`, `usbnet_nat_fast_repair.sh`, `usbnet_nat_full_repair.sh` | новые скрипты | (код r25)[^173] | | Манифест `bluray` | без `global_actions`, `bin/start.sh` и `bin/stop.sh` удалены | (код r25)[^174] | | Экран `audio` в `menu_config.xml` | нет настроек `native_sample_rate`, `start_silence_for_audio_files`, `disable_usb_audio`; есть кнопка `button_additional_audio_settings` | (код r25)[^175] | | Экран `ftp_server` в `menu_config.xml` | настройки `ftp_server_enabled`, `ftp_server_anonymous_access`, `ftp_server_user_name`, `ftp_server_password` | (код r25)[^176] | ### 4.5. Сообщения журналов, сменившие формат в r25 **Объект:** строки `libduneshell.so`, `php_server` и `dunelib/utils.php` tv188b r25 против r24, уровень `code`. Нужно тем, кто разбирает логи скриптом. | Журнал | r24 | r25 | Claim | |---|---|---|---| | `HD::http_get_document` | «HTTP fetching», «HTTP POST fields» | « http <метод>: », « http DATA: …», ошибки в нижнем регистре | (код r25)[^165] | | Запрос исполнителя операций | `req %lld (%s->%s/%s)` | `req %lld/%s->%s(%s.%s)` | (код r25)[^177] | | start, cancelling by timeout | `(%s)` | `(%s.%s)` | (код r25)[^178] | | canceled, finished with status | `(%s)` | `(%s.%s)` | (код r25)[^179] | | result action, result action null, result status | `(%s)` | `(%s.%s)` | (код r25)[^180] | | `plugin_opexec` | «still working...» | «plugin_opexec D: %s: %s», плюс «plugin_opexec I: waiting for mc index validation», «plugin_opexec I: mc index now valid»; в логе r25 при `PLUGIN_OPEXEC = 1` строка выглядит как «plugin_opexec D: req 93/…: still working...» | (устройство r25, код r25)[^181] | | Форк автопроверки обновлений | «fork(grand-child)», «grand-child process is started with pid %d» | «grand-child process %d», «hd_debug: plugin online upgrade forked with the log held» | (код r25)[^182] | | `/tmp/run/<плагин>.pid` | файл есть на устройстве | путь `/tmp/run/%s.pid` есть в строках самого `php_server`, в строках r24 его нет | (устройство r24, код r25)[^183] | ### 4.6. Что SDK просит от плагинов на Android 11+ AOSP и ATV: `dune_devel_info` **Объект:** раздел «Important notes» страницы SDK `dune_devel_info` (`doc`) и что об этом известно на tv188b r24, r25 и APK r24. Claims этой страницы не привязаны к r24 или r25: столбец «Что просит SDK» — это просьба документа, а не факт r25. Столбец «Что на r24+» показывает подтверждения кодом и устройством. Где их нет, стоит «по SDK, на r24+ не подтверждено». Значения на tv188b названы для указанного процесса: на другой процесс они не переносятся. | Что | Что просит SDK | Что на r24+ | Claim | |---|---|---|---| | Пути `/config`, `/tmp`, `/flashdata`, `/firmware`, `/firmware_ext` | на ATV и Android 11+ AOSP добавлять префикс `FS_PREFIX` `/data/data/com.dunehd.app`; в других разделах документации он может быть опущен — тогда его добавляют сами | tv188b r25, PHP: `/config` и `/flashdata` ведут в `$FS_PREFIX`, `/firmware` и `/firmware_ext/php` — в `/system/dunehd/`; в корне ФС из `adb shell` `/firmware`, `/firmware_ext`, `/flashdata` нет, а `/config` другой. Подробно — [php-environment.md](php-environment.md#32-понять-что-делает-абсолютный-путь-подстановка-fs_prefix) | (устройство r25, SDK)[^184] | | `FS_PREFIX` | в PHP-плагинах и CGI `/data/data/com.dunehd.app` на ATV и Android 11+ AOSP, на остальных не установлена | tv188b r25: то же в командах из `php_server` и у `httpd`; tv188b r24: то же у `dunehd_service`, код `init` её выставляет | (устройство, код r24, SDK)[^185] | | `HD_APK` | в PHP-плагинах и CGI `1` на ATV и Android 11+ AOSP, на остальных не установлена | tv188b r25: `1` у `php_server`; tv188b r24: `1` у `dunehd_service`; APK r24: `runDaemonProcess` задаёт `1` | (устройство, код r24, SDK)[^186] | | `HD_FW_APK` | в PHP-плагинах и CGI `1` на Android 11+ AOSP, на остальных не установлена | tv188b r25: `1` у `php_server`; tv188b r24: `1` у `dunehd_service`; APK r24: среди строк `runDaemonProcess` её нет | (устройство, код r24, SDK)[^187] | | `HD_HTTP_LOCAL_PORT` | в PHP-плагинах и CGI `11080` на ATV; на остальных пусто (старые прошивки) или `80` (новые) | tv188b r25: `80` у `php_server`; tv188b r24: `80` у `dunehd_service`; APK r24: `runDaemonProcess` задаёт `11080` | (устройство, код r24, SDK)[^188] | | Подстановка в PHP | движок сам добавляет `FS_PREFIX` ко всем нужным путям, кроме команд в `shell_exec()` и `system()`, поэтому старый код может работать без изменений | файловые функции — первая строка таблицы; `shell_exec` на tv188b r25 подставляет частично: §6 и §2.1, строка 10; `system()` — §7. Убранное API r25 правок всё равно требует: §2.4 | (устройство r25, SDK)[^189] | | `/tmp` | на Android 11+ AOSP доступен и как `$FS_PREFIX/tmp`, и как `/tmp` | tv188b r25: `tmp_dir_path` у пробного `kb_probe5` — `$FS_PREFIX/tmp/plugins/kb_probe5`; при `LOG_DIR=/tmp/run` лог `php_server` идёт в `$FS_PREFIX/tmp/run/`; вне PHP — §7 | (устройство r25, SDK)[^190] | | Имя процесса GUI | на последних ATV и Android 11+ AOSP `com.dunehd.app`, а не `com.dunehd.shell` | tv188b r24: процесс `com.dunehd.app`; tv188b r25: `php_server` — его дочерние процессы; другая страница SDK пишет иначе: §6 | (устройство, SDK)[^191] | | Shell-скрипты плагина | не запускать напрямую, вызывать через `sh` или `bash`: `bash /path/to/script` | запрет прямого запуска: по SDK, на r24+ не подтверждено (§7). В этих местах прошивка зовёт через `sh`: tv188b r25 исполняет `global_action plugin_system` с `run_string` как `system(sh <путь>)`; код r24 запускает CGI плагина как shell-скрипт; код APK r24 начинает с `sh ` команду с путём под корнем, кроме `/firmware/bin/` и `/firmware_ext/php/` | (устройство r25, код r24, SDK)[^192] | | Бинарники в пакете плагина | плагин не может содержать бинарные исполняемые файлы; если такой файл нужен, просят Dune HD рассмотреть его включение в следующее обновление ПО | по SDK, на r24+ не подтверждено (§7); практика иная: §6 | (SDK)[^14] | ## 5. Как это делают плагины **ProIPTV.** Сравнивает ревизию числом и отсекает `rev_number ≤ 21` (код)[^193], а отдельные возможности проверяет по константам и классам (код)[^9]. На r25 берёт системный ffmpeg при наличии, иначе свою сборку (код)[^194]. Вне APK читает `android_platform` из `versions.txt` (код)[^195]; признак APK у него — `HD_APK` (код)[^196], а она у `php_server` на tv188b r25 равна 1 (устройство r25)[^197], и ключа `android_platform` в файле r25 нет (устройство r25)[^8] (§2.1, строка 9). Оговорка: при истинном `is_apk()` и пустом static-кэше `get_platform_info()` идёт первой ветвью — `platform='android'`, `type` = `fw_apk` при `is_fw_apk()`, иначе `apk`, и `versions.txt` эта ветвь не читает (код)[^198]. Эталонные копии `php_r22/` и `php_r24/` совпадают с файлами соответствующих прошивок (код)[^199]. **GlobalTV `260130_1351`.** Несёт копию `lib`, часть файлов которой побайтно совпадает с `shell_ext/lib` r24 (код r24)[^200]. Поля `stop_playback`/`retry_delay_ms` в `show_error` и `max_height` в `show_dialog` он добавляет только при `defined`, тогда как r24 пишет их без проверки (код r24)[^201]. Сигнатуры расходятся с r25: `get_timer` (код r24, r25)[^23]. Приём и его ограничения — «Приёмы разработки плагинов Dune HD». **Dune BackUp.** Блок цветных кнопок в меню добавляет только при `intval(firmware_version) < 240619` и ещё двух условиях (код)[^202]: в этой проверке нет номера ревизии `rN`. Каталог приёмов совместимости — «Приёмы разработки плагинов Dune HD». ## 6. Расхождения **Тайм-аут операции: код r24 и r25 на устройстве.** В коде r24 отмена PHP-операции только ставит флаг (код r24)[^108], на r25 (`device`) `php_server` останавливается (устройство r25)[^110]. Сборки разные; на устройстве r24 это не проверялось, и какой код останавливает процесс, claims не говорят. Подробно — «Операции плагина, тайм-ауты и `php_server`». **Тайм-аут по умолчанию.** SDK: 10 с (SDK)[^203]; r25 (`device`): `handle_user_input` без `operation_timeout` — 60 с (устройство r25)[^204]. Стороны связаны `conflicts_with`. **`operation_timeout` в данных действия.** SDK: `PluginHandleUserInputAction` не имеет данных (SDK)[^205]; на r25 (`device`) ключ `operation_timeout` в данных действия `plugin_handle_user_input` работает и перекрывает `operation_timeout/default` манифеста (устройство r25)[^114]. Стороны связаны `conflicts_with`. **`.platform.*` на Android.** По тексту SDK `.platform.android` удаляется, а `.platform.87xx` переносится в корень (SDK)[^206]; установщик r25 делает наоборот (устройство r25)[^207]. Подробно — «Пакет плагина». **`open_path`.** Описание IP Control предлагает `cmd=open_path` для запуска пункта по `root://…` (SDK)[^208]; на r25 точка входа так не запускается (устройство r25)[^209]. Подробно — «IP Control (`/cgi-bin/do`) для разработчика плагина». **`/cgi-bin/do` с `plugin=`.** На r25 (`device`) запрос вернул `unknown_command` и не запустил `run.php` плагина (устройство r25)[^210]. Для r24 код предполагает запуск через `run.php`, но это `inference`/`disputed` (§7); стороны связаны `conflicts_with`. **Перечитывание плагинов по IP Control.** Документ SDK предлагает перечитывать плагины без перезапуска оболочки; на r25 (`device`) после `adb push` этого не произошло (устройство r25)[^211]. Утверждение документа — `disputed`, оно в §7; стороны связаны `conflicts_with`. **Путь `adb push`.** SDK указывает `/flashdata/plugins/` (SDK)[^212]; на r25 такого каталога в корне ФС нет (устройство r25)[^213]. Подробно — BUG-010. **`playback_going_to_switch` и `buffering_ms`.** SDK и r25 расходятся: (SDK)[^214] ↔ (устройство r25, SDK)[^215] ↔ (устройство r25)[^216]. Подробно — «Воспроизведение из плагина». **Клавиши в VOD.** SDK: `PluginVodInfo::actions` поддерживает из клавиш только цветные; на r25 (`device`) доставляются и нецветные (устройство r25)[^217]. Утверждение SDK — `disputed`, оно в §7; стороны связаны `conflicts_with`. **`ffmpeg` в r25: комментарий плагина и устройство.** Комментарий в ProIPTV говорит, что r25 и новее несут свой ffmpeg 7.1 (код)[^194]; на r25 (`device`) `media_check` вызывает `/firmware/scripts/ffmpeg.sh`, и файла по этому пути нет (устройство r25)[^218]. При этом в образах r24 и r25 скрипт `system/system/dunehd/firmware/scripts/ffmpeg.sh` один и тот же (код r24, r25)[^219], а `system/system/dunehd/firmware/bin/ffmpeg` в обоих — симлинк на `libxxx_ffmpeg.so` (код r24, r25)[^220]; в корне ФС на r25 `/firmware` нет (устройство r25)[^221]. Сами эти файлы r25 от r24 не отличают. Версию показал прогон запроса 11 на tv188b r25: из `adb shell` прямой запуск `$P/firmware/bin/ffmpeg -version` с `LD_LIBRARY_PATH=$P/lib:/system/dunehd/firmware/lib` вывел `ffmpeg version 7.1.3`, и этот `ffmpeg` — ссылка на `$P/lib/libxxx_ffmpeg.so` (устройство r25)[^222], что сходится с комментарием ProIPTV (код)[^194]. `sh $P/firmware/scripts/ffmpeg.sh -version` из `adb shell` в том же прогоне напечатал `ffmpeg not found` (устройство r25)[^223]; переменная `FS_PREFIX` в этот запуск не передавалась, так что это свойство окружения `adb`, а не вывод об отсутствии бинарника (устройство r25)[^223]. Связи `conflicts_with` нет, стороны связаны `related`; что осталось открытым — §7. **`versions.txt`.** Код r24 и r25 читает `android_platform` (код)[^224], в файле r25 его нет (устройство r25)[^8]. При `fw_apk` значение берётся из `fw_apk_platform.txt`, поэтому это не противоречие, а у tv175u r24 ключ в файл пишет `init` (код r24)[^225]; связи `conflicts_with` нет. **Имя процесса GUI: две страницы SDK.** `dune_devel_info`: на последних ATV и Android 11+ AOSP процесс главного GUI называется `com.dunehd.app`, а не `com.dunehd.shell` (SDK)[^226]. Страница плагинов: перезапуск оболочки на Android — `killall com.dunehd.shell` (SDK)[^227]. Стороны связаны `conflicts_with`. На tv188b r24 процесс называется `com.dunehd.app` (устройство r24)[^228], а `com.dunehd.shell` в `dune.apk` tv188b r24 и r25 — пакет класса активности `com.dunehd.shell.MainActivity` (код r24, r25)[^229]. Сам `killall` на r25 не проверялся (SDK)[^227]; плагины заново регистрирует новый процесс после `am force-stop com.dunehd.app` (устройство r25)[^230]. **Подстановка `FS_PREFIX` в `shell_exec`: SDK и r25.** По SDK движок добавляет префикс ко всем нужным путям, кроме команд в `shell_exec()` и `system()` (SDK)[^231]. На tv188b r25 (`device`) `shell_exec` добавляет его к `/tmp/…`, `/firmware/…`, `/config/…`, `/flashdata/…` и к пути в одинарных кавычках, но не к пути в двойных (устройство r25)[^40]; в коде APK r24 подстановку вызывают, в частности, `php_exec` и `zif_shell_exec` (код r24)[^232]. Связи `conflicts_with` нет, стороны связаны `related`. **Бинарники в плагине: SDK и код.** По SDK плагин не может содержать бинарные исполняемые файлы (SDK)[^14]. На r25 и новее ProIPTV берёт системный `$FS_PREFIX/firmware/bin/ffmpeg` при наличии, иначе — свою сборку `bin/ffmpeg-7.1.3` (код)[^194], а встроенный `shell_ext` r24 несёт собственные ELF `curl` и `php-cgi` (код r24)[^233]. Запускается ли такой файл у стороннего плагина на r24+, — §7. Связи `conflicts_with` нет. **`curl` к `localhost`: код r25 и устройство.** В запросе 11 на tv188b r25 (один прогон, `php_server`) один и тот же `http://localhost/cgi-bin/plugins/kb_probe11/host.sh` пришёл в CGI с `HTTP_HOST=127.0.0.1` при `curl_setopt(CURLOPT_URL)` (устройство r25)[^100] и с `HTTP_HOST=localhost` при `curl_init($url)` (устройство r25)[^101]; по коду r25 у этих двух точек входа разный маршрут URL (код r25)[^99]. Наблюдение запроса 6 с `HTTP_HOST=localhost` сделано тоже через `curl_init($u)` (устройство r25, код r25)[^234]. `file_get_contents` из `php_server` к такому URL пришёл с `HTTP_HOST=127.0.0.1`, и тот же claim заключает, что в curl замены нет; curl в этом зонде — `curl_init($u)` (устройство r25)[^235], тогда как `curl_setopt` в запросе 11 дал `127.0.0.1` (устройство r25)[^100]. Стороны связаны `related` (разный способ задать URL), `conflicts_with` нет: вывод «не в curl» верен только для `curl_init(url)`. Согласуется ли это наблюдение с кодовой подстановкой порта по §2.5 (устройство r25, код r25)[^236], — вопрос §7. ## 7. Не проверено Выводы `inference` и утверждения со статусом `disputed`: гипотезы, а не поведение. В тексте выше на них нет опоры. | Что | Статус | Claim | Как проверить | |---|---|---|---| | `lcreg` подменяет хосты Dune HD их парой `r2.<хост>`; перечень пар есть в строках `libxxx_movie_indexer.so` (код r25)[^237] | `inference` | (вывод r25)[^238] | прочитать `lcreg.txt` на устройстве и лог с `lcreg_kind` | | Действие `fs_ctl` нельзя задать в XML, только в JSON-ответе PHP-плагина | `inference` | (вывод r25)[^239] | объявить `fs_ctl` в манифесте и посмотреть лог оболочки | | `PluginSystemActionData::handle_response=yes` проверяет `restart_needed_flag` и перезапускает GUI | `inference` | (вывод r25)[^240] | плагин с `handle_response` yes, создающий этот флаг | | `smart_dirty=yes` переводит обновление EPF плагина на флаги | `inference` | (вывод r25)[^241] | лог оболочки при разных масках и сторонний EPF-плагин | | `cond` вычисляет булев `pattern` как условие видимости точки входа | `inference` | (вывод r25)[^242] | по нативному коду: `is_plugin_file`, результат `cond`, ошибки `pattern` | | `PLUGIN_ROW_OPT_LOADING` помечает строку для подгрузки через `get_folder_rows` | `inference` | (вывод r25)[^243] | листинги `rows_loader`: выбор строк, батчи, повторы | | Копии `php_r22/`, `php_r24/` ProIPTV — эталоны для отладки, на устройстве плагин работает с фреймворком прошивки | `inference` | (вывод)[^244] | сверить содержимое пакета плагина | | Прошивка r24 трактует `false` из `confirm_update` как отказ от обновления | `inference` | (вывод)[^245] | зонд на r24 | | `apply_hash_dirties` заставляет оболочку обработать записи `HashDirties` | `inference` | (вывод r25)[^246] | нативный обработчик: результат, ошибки `post_action` | | Заголовки потока задаются и из ответа `get_vod_stream_url` с суффиксом `\|\|\|dune_params\|\|\|engine:1,http_headers:…`. Верификатор подтвердил вывод; наблюдение на tv188b r25 (запрос 11, один прогон): ответ с `engine:1,http_headers:X-KB477%3A%20one` для `kbplazy://0` без суффикса дал запрос ExoPlayer с заголовком `X-KB477: one` (устройство r25)[^247] | `inference`, `verified`; наблюдение — `device` | (устройство r25, вывод r25)[^248] | повтор с другими сериями и `playback_url_is_stream_url=false`; r24 | | `cmd` «`/system/dunehd/dunehd_service do am start …`» уходит в системный `am` от root, где есть `--user` | `inference`, `disputed` | (вывод r24, r25)[^249] | запустить такую `cmd` через `launch_ext_app`, смотреть activity и «run command» в логе | | Команду `/cgi-bin/do`, адресованную плагину, r24 исполняет через `run.php` | `inference`, `disputed` | (вывод r24)[^250] | зонд на r24 по образцу r25 (устройство r25)[^210] | | По SDK `PluginVodInfo::actions` в VOD поддерживает из клавиш только цветные; на r25 доходят и другие (устройство r25)[^217] | `disputed` | (SDK)[^251] | см. «Ввод и диалоги» | | Плагины перечитываются без перезапуска оболочки по IP Control; на r25 после `adb push` этого не произошло (устройство r25)[^211] | `disputed` | (SDK)[^252] | см. «Пакет плагина» | | Окружение `php_server` на tv188b r24 отдельно не снято: наличие у него `FS_PREFIX`, `HD_APK`, `HD_FW_APK` не установлено | `inference` | (вывод r24)[^253] | прочитать `/proc//environ` процессов `php_server` на r24 | | В APK r24 подстановке `FS_PREFIX` в командах подвержены `exec`, `system` и `passthru` (через `php_exec`), `shell_exec`, `popen` и `proc_open` | `inference` | (вывод r24)[^254] | `putenv("PHP_DEBUG=1")`, вызвать `exec`, `system`, `popen`; в stdout `php_server` искать «-C-> EEE repl command» | | Наблюдение запроса 11 (`curl_setopt(CURLOPT_URL)` с `http://localhost/cgi-bin/plugins/…`, `HD_HTTP_LOCAL_PORT=80` → `HTTP_HOST=127.0.0.1`, `REQUEST_URI` сохранён) согласуется с заменой префикса `localhost` по коду r25 (§2.5); порт в ответе CGI не виден (`SERVER_PORT` пуст), поэтому подстановку именно порта оно не подтверждает | `inference` | (вывод r25)[^255] | `putenv("PHP_DEBUG=1")` и печать исходного и нового URL; вход `127.0.0.1` без порта, процесс без `HD_HTTP_LOCAL_PORT`, порт не 80: снять порт, на который ушёл запрос | В базе нет данных о следующем, и эти места в главе не опираются ни на какие наблюдения: - поведение сторонних плагинов на других устройствах и других сборках r25, включая APK-оболочку r25; - работа нового API §4.1 из стороннего плагина на устройстве; - какое сообщение видно на экране при вызове убранного `HD::make_json_rpc_request` (§2.4); - что будет при прямом запуске shell-скрипта и бинарника из пакета стороннего плагина на r24+ (§4.6, §6) и как на r25 ведёт себя команда в `system()`; - совпадают ли `/tmp` и `$FS_PREFIX/tmp` вне PHP на r24+ (§4.6); - работает ли `$FS_PREFIX/firmware/scripts/ffmpeg.sh` с заданным `FS_PREFIX` и `$FS_PREFIX/firmware/bin/ffmpeg` при вызове из `php_server` (версия 7.1.3 снята только прямым запуском из `adb shell`, §6); ffmpeg на r24; - `HTTP_HOST` при `curl_setopt(CURLOPT_URL)` и `curl_init($url)` из `php-cgi` в CGI плагина; порт, на который уходит запрос (§2.5); - что возвращает `ConfigUtils::load_product_and_fw()` на устройстве и есть ли `android_platform` в `versions.txt` tv188b r24 (§2.3); - что с `CURLOPT_CAINFO` в `HD::http_server_responding` и перезаписывает ли `HD::http_get_document` r24 переданный `CURLOPT_CAINFO` (§2.9); - наблюдения на устройстве с r22; - большинство сравнений `device` r24 ↔ r25: снимки r24 не содержат зондов плагина. [^1]: fw-tv188b-261021-0117-r25.c313 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 php_server при старте пишет в /tmp/run/<плагин>.log по порядку: «[server] preparing...», «reader fd: N; writer fd: M», «resetting include path to …», загрузку bootstrap.php, dune_api.php, dune_plugin.php, dune_plugin_fw.php, «executing system properties cmd (number of properties: 7)...», загрузку dune_config.php, затем программы плагина, после чего «[server] ready.» и «[server] main loop started.»; get_included_files() из main.php даёт тот же порядок файлов. [^2]: fw-tv188b-261021-0117-r25.c022 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В dunelib/utils.php r25 нет метода HD::make_json_rpc_request: между encode_props и get_mac_addr, где он стоял в r24, его нет [^3]: fw-tv188b-261021-0117-r25--php-framework.c059 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 после include dunelib/utils.php зонд увидел класс HD и method_exists(HD,make_json_rpc_request)=false; прямой вызов завершился E_ERROR Call to undefined method HD::make_json_rpc_request(), а не JSON-ответом. [^4]: fw-tv188b-261021-0117-r25.c015 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В r25 класс SyncMyCollectionActionData содержит только post_action: ключ mcf_id убран из dune_api.php, а ActionFactory::sync_my_collection в shell_ext/lib принимает только $post_action [^5]: fw-tv188b-261021-0117-r25--libphp5.c001 · code · android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24, 1.0.1-1000-260724_0207_r24 · В strings libphp5.so пяти исследованных сборок присутствует строка PHP/5.3.6. [^6]: fw-tv188b-261021-0117-r25--libphp5.c036 · code · android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24, 1.0.1-1000-260724_0207_r24 · CA-бандлы всех пяти исследованных сборок совпадают по SHA-256 722be2869ed2c2a949e5edb75b030f1e737e869ca8e8f70bc8d876dd93227ead. [^7]: - fw-tv188b-261021-0117-r25--libphp5--curl-http.c004 · code · android-dune-fw; прошивка 261021_0117_r25 · В r25 _php_do_add_fs_prefix_to_http вызывает lcreg при отсутствии HD_HTTP_LOCAL_PORT либо для http:// URL, не попавшего под CGI-подстановку; при заданной HD_HTTP_LOCAL_PORT URL без префикса http:// выходит до lcreg. - fw-tv188b-261021-0117-r25--libphp5--curl-http.c021 · code · android-dune-fw; прошивка 260827_0003_r24 · В r24 _php_add_fs_prefix_to_http не вызывает lcreg и других функций замены хоста; при отсутствии HD_HTTP_LOCAL_PORT или несовпадении префикса URL не меняется, а печать исходного и нового URL ограждена getenv("PHP_DEBUG"). [^8]: fw-tv188b-261021-0117-r25.c122 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 /tmp/run/versions.txt (145 байт, system:system) — шесть строк key=value: api_version=1.1.0, firmware_version=261021_0117_r25, product=tv188b, platform_kind=android, app_version=1.0.1-13-261021_0117_r25, app_version_code=13; ключа android_platform нет. [^9]: plg-gh-kocourkuba-proiptv.c030 · code · unknown; прошивка — · Возможности фреймворка плагин проверяет по наличию констант и классов dune_api.php: is_choose_file_supported() — defined('ChooseFileActionData::filter'), is_rows_api_supported() — class_exists('PluginRowsFolderView'), is_delay_load_supported() — defined('PluginUpdateTvInfoActionData::channel_changes'), is_ext_epg_enabled() — defined('PluginUpdateEpgActionData::ext_epg_enabled'); is_ext_epg_supported() дополнительно требует файл $FS_PREFIX/firmware_ext/plugins/ext_epg/dune_plugin.xml. [^10]: fw-tv188b-261021-0117-r25.c366 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В r25 HD::http_get_document() и HD::http_server_responding() по умолчанию ставят CURLOPT_SSL_VERIFYPEER=false. [^11]: fw-tv188b-261021-0117-r25.c367 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В r25 HD::http_get_document() добавляет CURLOPT_CAINFO=/firmware/certs/ca-bundle.crt только если в $opts передан истинный CURLOPT_SSL_VERIFYPEER и URL начинается с https://, после чего применяет $opts к хендлу; вызывающий может включить проверку, но CAINFO принудительно становится бандлом прошивки (переданный в $opts CAINFO перезаписывается). [^12]: doc-sdk-dune-devel-info.c001 · doc · any-documented; прошивка — · На ATV и Android 11+ AOSP к путям /config, /tmp, /flashdata, /firmware и /firmware_ext нужно добавлять префикс FS_PREFIX /data/data/com.dunehd.app; в других разделах документации этот префикс может быть опущен, и тогда его добавляют самостоятельно. [^13]: doc-sdk-dune-devel-info.c009 · doc · any-documented; прошивка — · Если плагин содержит исполняемые shell-скрипты, их нельзя запускать напрямую: их нужно вызывать через sh или bash (пример «bash /path/to/script»). [^14]: doc-sdk-dune-devel-info.c010 · doc · any-documented; прошивка — · Плагин не может содержать бинарные исполняемые файлы; если такой файл нужен, нужно отправить в Dune HD запрос рассмотреть его включение в следующее обновление ПО. [^15]: fw-tv188b-261021-0117-r25.c312 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в коде main.php kb_probe5 get_included_files() показывает системные файлы как '/system/dunehd/firmware_ext/php/<файл>' (bootstrap.php … dune_config.php), а main.php — как '/data/data/com.dunehd.app/flashdata/plugins/kb_probe5/main.php'; __FILE__ — тот же путь main.php. [^16]: plg-gh-kocourkuba-proiptv.c023 · code · android-dune-fw; прошивка 260827_0003_r24, 260724_0207_r24 (APK), 261021_0117_r25 · php_r24/dune_api.php, php_r24/dune_plugin_fw.php и php_r24/include/dunelib/{config_utils,utils}.php побайтно совпадают с одноимёнными файлами прошивки tv188b 260827_0003_r24 и APK 260724_0207_r24 (одинаковые sha256 в tree.tsv); с r25 (261021_0117) dune_api.php и dune_plugin_fw.php уже не совпадают. [^17]: fw-tv188b-261021-0117-r25.c316 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 include_path в php_server = '.:<каталог плагина>:/data/data/com.dunehd.app/firmware_ext/php/include', каталог плагина — с префиксом $FS_PREFIX: …/flashdata/plugins/kb_probe5 и …/flashdata/plugins/dune-hd.tv у плагинов из flashdata, …/firmware_ext/plugins/shell_ext и …/firmware_ext/plugins/android_apps у встроенных; php_server пишет его в лог «[server] resetting include path to '…'». [^18]: fw-tv188b-260827-0003-r24--php-framework.c306 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · php_server задаёт include_path по шаблону «ini_set('include_path', '.:%s:%s');»; рядом строка /firmware_ext/php/include [^19]: fw-apk-260724-0207-r24--data-deploy--php-fs-prefix.c028 · code · android-atv, android-dune-fw; прошивка 260724_0207_r24, 260827_0003_r24, 240619_0210_r22, 250815_1012_r22, 261021_0117_r25 · libphp5.so APK 260724_0207_r24 совпадает по sha256 (e28ffc74…) с libphp5.so прошивок tv175u 260724_0207_r24 и tv188b 260827_0003_r24; в tv175u 240619_0210_r22 и tv188b 250815_1012_r22 файл другой (e7d22b70…), в tv188b 261021_0117_r25 — тоже (4a31ef48…) [^20]: fw-tv188b-261021-0117-r25--shell-ext--epf-dirty--native.c001 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24, 261021_0117_r25 · libduneshell.so в tv188b r24 и r25 имеет разные SHA-256. [^21]: 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. [^22]: plg-dc-globaltv--lib.c002 · code · android-dune-fw; прошивка 260827_0003_r24 · В копиях lib Global TV 260130_1351 и shell_ext/lib tv188b r24 побайтово тождественна группа интерфейсов экранов: controls_screen.php, gcomps_screen.php, rows_screen.php. [^23]: plg-dc-globaltv--lib.c069 · code · android-dune-fw; прошивка 260827_0003_r24, 261021_0117_r25 · Интерфейсы GCompsScreen/RowsScreen в плагине и r24 объявляют get_timer(MediaURL $media_url, &$plugin_cookies), а в r25 get_timer принимает только нетипизированный media_url. [^24]: fw-tv188b-261021-0117-r25.c098 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 /fconfig/mname.txt содержит «Pro 8K Plus». [^25]: doc-dune-fw-changelog.c012 · doc · android; прошивка 261021_0117_r25 · В alpha-версии r25 (261021_0117_r25) в EPG GUI TV-плагинов добавлены дополнительные сведения о рейтинге и продюсерах, если они доступны. [^26]: fw-tv188b-261021-0117-r25.c004 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Система r25 — та же база Android 11 (RD2A.211001.002), userdebug/test-keys, плата tyson; сборка от 2026-10-20 [^27]: doc-dune-fw-changelog.c003 · doc · tv188a, tv188b, tv288b, tv388a, tv689a, tv788a, tv688a, tv989a, android; прошивка 261021_0117_r25 · В разделе r25 страницы alpha перечислены восемь 8K-моделей — tv188a, tv188b, tv288b, tv388a, tv689a, tv788a, tv688a, tv989a — и раздел «Changes since r24». [^28]: doc-dune-fw-changelog.c004 · doc · tv989a, android; прошивка 260814_0922_r25, 260912_0002_r25 · У Ultra 8K (tv989a) две версии r25: 260814_0922_r25 — первая официальная, 260912_0002_r25 — первая доступная через онлайн-обновление и последняя стабильная. [^29]: - fw-tv188b-260827-0003-r24.c054 · device · tv188b, android-dune-fw; прошивка 260827_0003_r24 · На tv188b r24 три процесса php_server (shell_ext, dune-hd.tv, android_apps) работают от пользователя system с SELinux-меткой u:r:system_app:s0; их родитель — com.dunehd.app (PPID 25631), а UID пакета приложения — 1000 (sharedUser android.uid.system/1000). - fw-tv188b-260827-0003-r24.c063 · device · tv188b, android-dune-fw; прошивка 260827_0003_r24 · На tv188b r24 в окружении dunehd_service (pid 587) есть FS_PREFIX=/data/data/com.dunehd.app, HD_APK=1, HD_FW_APK=1, HD_HTTP_LOCAL_PORT=80 и DUNEHD_SERVICE_DONT_FORK=1, а PATH начинается с $FS_PREFIX/firmware/bin:$FS_PREFIX/bin:/bin. - fw-tv188b-260827-0003-r24--plugin-loader--php-runtime.c029 · device · tv188b, android-dune-fw; прошивка 260827_0003_r24 · На tv188b r24 в /tmp/run лежат .log и .pid плагинов с работающим php_server (android_apps, dune-hd.tv, shell_ext); .pid датированы 15:40, логи — 15:40–15:41 - fw-tv188b-260827-0003-r24--http-api--ext-command-params.c061 · device · tv188b, android-dune-fw; прошивка 260827_0003_r24 · На tv188b r24 cmd=status отвечает XML command_result с protocol_version=6 — на единицу больше последней версии, описанной в документе IP Control (5) [^30]: fw-tv188b-261021-0117-r25.c329 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 php_server при старте пишет «Starting logging to '/data/data/com.dunehd.app/tmp/run/<плагин>.log' (<= 3072000)»; в окружении php_server LOG_DIR=/tmp/run и LOG_MAX_FILE_SIZE=3072000. [^31]: - fw-tv188b-261021-0117-r25.c203 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 каталоги плагинов, положенные adb push в /data/data/com.dunehd.app/flashdata/plugins, не подхватились перечитыванием по IP Control (cmd=main_screen, затем cmd=ir_code&ir_code=B24DBF00; обе команды ответили command_status ok): в shell.log после них нет ни строк kb_probe5, ни «Loading plugins from», ни populate_plugins, а kb_probe5 нет в /tmp/run/installed_plugins.xml. kb_probe5 и kb_probe5_sup зарегистрировались после am force-stop com.dunehd.app. - fw-tv188b-261021-0117-r25.c207 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в корне ФС каталога /flashdata нет, а оболочка в shell.log называет каталог плагинов /flashdata/plugins («Loading plugins from '/flashdata/plugins'», «invalid plugin manifest from '/flashdata/plugins/kb_probe5_badname/dune_plugin.xml'», «copying recursively '/tmp/plugin_tmp' to '/flashdata/plugins/kb_probe5_plat'»); файлы этих плагинов лежат в /data/data/com.dunehd.app/flashdata/plugins. - doc-sdk-plugins.c140 · doc · android; прошивка — · В SDK для Android приведены команды развёртывания плагина: adb push в /flashdata/plugins/ и chmod -R +x для bin и www/cgi-bin внутри каталога плагина. [^32]: - fw-tv188b-261021-0117-r25.c082 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 global_action install не выполняется, если плагин положен в $FS_PREFIX/flashdata/plugins через adb push и приложение перезапущено: маркеров install от kb_probe5 и kb_probe6_sup нет, тогда как boot, boot_end и gui_start kb_probe5 выполнились. - fw-tv188b-261021-0117-r25.c083 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 global_action update не выполняется, если version_index в dune_plugin.xml изменён на месте (1 → 2) и приложение перезапущено через am force-stop, хотя оболочка регистрирует плагин с version_index 2 и заново запускает movie_suppliers_update.sh. - fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c088 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 после установки обновления новая версия плагина получает глобальное действие update (в новом php_server), затем запускается исходная точка входа, с которой началась проверка; глобальное действие install при обновлении не вызывается. [^33]: - fw-tv188b-261021-0117-r25.c210 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 плагин, у которого name в dune_plugin.xml (kb_probe5_other) не равен имени каталога (kb_probe5_badname), не регистрируется: строки «Plugin … is registered» для него нет, в /tmp/run/installed_plugins.xml и /tmp/www/plugins его нет ни под тем, ни под другим именем. - fw-tv188b-260827-0003-r24--plugin-loader.c041 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Установщик сверяет name в манифесте с ожидаемым: есть сообщение «declared plugin name is '%s', real is '%s'» и ключ plugin_installer_error_name_changed__1 [^34]: fw-tv188b-261021-0117-r25.c213 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 точки входа плагина kb_probe5 (root://applications), заданные без icon_url, в разделе «Приложения» не появлялись. [^35]: - fw-tv188b-261021-0117-r25.c214 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 штатный установщик ZIP применил к корню плагина сначала .platform.android (скопировал only_android.txt и bin/marker.txt в корень), затем поверх — .platform.android-arm-api19 (bin/marker.txt перезаписан); в установленном плагине bin/marker.txt = «.platform.android-arm-api19» и есть only_android.txt. В shell.log — «[plugin_installer] applying /tmp/plugin_tmp/.platform.». - fw-tv188b-261021-0117-r25.c215 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 штатный установщик ZIP не применил .platform.87xx и .platform.foo и удалил все четыре каталога .platform.* (android-arm-api19, 87xx, android, foo: «[plugin_installer] removing /tmp/plugin_tmp/.platform.») до копирования; в установленном плагине нет ни каталогов .platform.*, ни only_87xx.txt. - doc-sdk-plugins.c137 · doc · android; прошивка — · Текст документа буквально говорит: при установке на Android содержимое .platform.android удаляется, а содержимое .platform.87xx переносится в корень [^36]: - fw-tv188b-261021-0117-r25.c304 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 после touch main.php плагина kb_probe5 следующий вызов handle_user_input сначала перезапускает php_server: в shell.log того же процесса оболочки «[kb_probe5] [php] start_call(): PHP-script modification detected (1793009215). Restarting PHP-server-process...», «shutting down...», «stopped.», «server started; pid: 17676.», и вызов исполняет уже новый процесс 17676. - fw-tv188b-261021-0117-r25.c306 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 правка файла lib/kbp5_lib.php, подключаемого из main.php через require_once, без изменения main.php не перезапустила php_server kb_probe5: следующий вызов исполнил тот же процесс 17362 (n=5) со старой версией функции (lib=v1), в shell.log между «start» и «result action» сообщений о перезапуске нет. - fw-tv188b-260827-0003-r24--plugin-loader--php-runtime.c035 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В r25 libduneshell.so содержит тот же блок строк php_driver.cpp/php_client.cpp/php_fw.cpp/php_utils.cpp, включая «start_call(): PHP-script modification detected (%ld). Restarting PHP-server-process...» [^37]: - fw-tv188b-261021-0117-r25.c320 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 при сбое PHP-вызова (Fatal error или exit(0) в handle_user_input) оболочка пишет в shell.log «[<плагин>] [php] poll_calls() E: treating empty result as failure and stopping server», останавливает php_server («shutting down...», «stopped.»), затем «Error: operation returned PHP_CALL_FAILED.», «[handle_user_input] Failed.» и «[plugin] <плагин>: FATAL ERROR detected (msg = Ошибка приложения)». - fw-tv188b-261021-0117-r25.c322 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 после остановки php_server из-за сбоя вызова (Fatal error, exit(0)) следующий вызов плагина запускает новый php_server: в shell.log после «start (timeout=60.0s)» идёт «[kb_probe5] [php] server started; pid: 17849.» (после Fatal error) и «… pid: 17924.» (после exit). - fw-tv188b-260827-0003-r24--plugin-loader--php-runtime.c039 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25, если call_plugin PHP-плагина возвращает null, php_server ничего не пишет в ответ и завершает цикл по EOF канала, а оболочка печатает «poll_calls() E: treating empty result as failure and stopping server», «Error: operation returned PHP_CALL_FAILED.», «result status failed», выполняет plugin_show_error и «FATAL ERROR detected (msg = Ошибка приложения)»; на экране — «Ошибка приложения / Произошла ошибка. Приложение будет закрыто.». [^38]: - fw-tv188b-260827-0003-r24--plugin-loader--php-runtime--opexec.c032 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 по тайм-ауту handle_user_input оболочка останавливает php_server плагина и тем прерывает вызов: за «cancelling by timeout (N s)» следуют «FATAL ERROR detected (msg = operation timed out)», «[php] shutting down...», через ~0,25 с «killing PHP-server process...» и «stopped.», затем «canceling req N (fast: 1)», «PHP-FW was shut down. The operation fails.», «result status canceled» и «canceled in N s»; PHP-код вызова не доработал. - fw-tv188b-260827-0003-r24--plugin-loader--php-runtime--opexec.c033 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 после отмены handle_user_input по тайм-ауту оболочка выполняет plugin_show_error, и на экране — диалог «Превышено время операции» с кнопкой OK (перевод plugin_operation_timed_out). - fw-tv188b-261021-0117-r25.c309 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 операция handle_user_input PHP-плагина без operation_timeout в манифесте (kb_probe5, kb_probe6; ENTER на точке входа с plugin_handle_user_input) стартует с тайм-аутом 60 с: в shell.log «…->handle_user_input(…): start (timeout=60.0s)». - fw-tv188b-260827-0003-r24--plugin-loader--php-runtime--opexec.c017 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Отмена операции PHP-плагина (php_plugin.c, fcn.00272050) находит дескриптор операции по id, печатает «Cancelling... Output-data: %p.» и ставит в дескрипторе байт-флаг отмены — и больше ничего: ни php_server, ни PHP-коду отмена не передаётся. [^39]: - fw-tv188b-261021-0117-r25.c122 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 /tmp/run/versions.txt (145 байт, system:system) — шесть строк key=value: api_version=1.1.0, firmware_version=261021_0117_r25, product=tv188b, platform_kind=android, app_version=1.0.1-13-261021_0117_r25, app_version_code=13; ключа android_platform нет. - fw-tv188b-260827-0003-r24--php-framework.c041 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · ConfigUtils::load_product_and_fw() читает /tmp/run/versions.txt (key=value: firmware_version, product, platform_kind, android_platform); для fw_apk android_platform берётся из /firmware/config/fw_apk_platform.txt - fw-tv188b-261021-0117-r25.c364 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В r25 config_utils.php::load_product_and_fw() читает android_platform из /tmp/run/versions.txt, но при истинном HD::is_fw_apk() (getenv('HD_FW_APK'); у php_server r25 на tv188b = 1) перезаписывает его содержимым файла /firmware/config/fw_apk_platform.txt. - fw-tv188b-261021-0117-r25.c365 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24, 261021_0117_r25 · В образе r25 файл system/system/dunehd/firmware/config/fw_apk_platform.txt содержит строку s928x_android11 (16 байт), его sha256 2e3d08a86de47e91eacb08c92dd6b29df881c4f216a5aa9498a195cf26bc2e55 совпадает с r24. - fw-tv175u-260724-0207-r24.c022 · code · tv175u, android; прошивка 260724_0207_r24 · Скрипт /system/dunehd/init пишет /tmp/run/versions.txt: product (из product_id.txt), firmware_version, platform_kind=android и android_platform (из android_platform.txt) - plg-gh-kocourkuba-proiptv.c029 · code · unknown; прошивка — · Вне APK get_platform_info() читает $FS_PREFIX/tmp/run/versions.txt как ini: нет файла или platform_kind не 'android' — платформа 'unsupported'; иначе platform=platform_kind, type=android_platform. - plg-gh-kocourkuba-proiptv.c081 · code · unknown; прошивка — · В get_platform_info() при is_null($platform) (static-кэш пуст) и истинном is_apk() — это первая ветвь, до else if (!is_dune()) и else — platform='android'; внутри неё type='fw_apk' при истинном is_fw_apk(), иначе type='apk'; versions.txt эта ветвь не читает (parse_ini_file — в ветви else). - fw-tv188b-261021-0117-r25.c097 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 $FS_PREFIX/firmware/config/fw_apk_platform.txt содержит s928x_android11. [^40]: fw-tv188b-261021-0117-r25.c253 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 встроенный PHP (php_server и php-cgi CGI) в команде shell_exec добавляет $FS_PREFIX (/data/data/com.dunehd.app) к словам /tmp/…, /firmware/…, /config/…, /flashdata/… и к пути в одинарных кавычках ('/tmp/h'), но не к /etc/…, не к x/tmp/f и не к пути в двойных кавычках ("/tmp/g"). [^41]: - fw-tv188b-261021-0117-r25.c248 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в php-cgi CGI плагина с php.ini без date.timezone ini date.timezone пуст; date_default_timezone_get() возвращает Europe/Moscow, но date() и date_default_timezone_get() пишут PHP Warning «It is not safe to rely on the system's timezone settings… We selected 'Europe/Moscow' for 'MSK/3.0/no DST' instead». - fw-tv188b-261021-0117-r25.c247 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в php_server PHP-плагина ini date.timezone = Europe/Moscow и date_default_timezone_get() = Europe/Moscow при getenv('TZ') = false; date() даёт MSK +0300, getprop persist.sys.timezone — Europe/Moscow. [^42]: - fw-tv188b-261021-0117-r25--libphp5.c050 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · www.ssl.com на tv188b r25 из php_server (uid 1000) с полным бандлом, без корня Entrust и только с корнем Entrust при включённой проверке TLS даёт errno 60 «self signed certificate in certificate chain»; без проверки — HTTP 200, а цепочка заканчивается самоподписанным SSL.com TLS RSA Root CA 2022. - fw-tv188b-261021-0117-r25--libphp5.c036 · code · android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24, 1.0.1-1000-260724_0207_r24 · CA-бандлы всех пяти исследованных сборок совпадают по SHA-256 722be2869ed2c2a949e5edb75b030f1e737e869ca8e8f70bc8d876dd93227ead. [^43]: - fw-tv188b-261021-0117-r25.c234 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 PHP-скрипт CGI плагина (php-cgi через CGI-обёртку), выполнивший curl_multi на 4 хендла к httpd самого плеера (http://127.0.0.1/plugins/…, http://127.0.0.1:80/cgi-bin/plugins/…, http://localhost/cgi-bin/plugins/…), доходит до curl_multi_info_read и получает все 4 сообщения с msg=1 result=0, после чего php-cgi завершается с кодом 139 и в /tmp/dune_apk_cgi_err.log появляется «Segmentation fault»; повторный запуск дал то же самое. - fw-tv188b-261021-0117-r25.c235 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 тот же зонд curl_multi (4 хендла к httpd плеера) в php_server PHP-плагина (операция handle_user_input) доходит до curl_multi_info_read со всеми 4 сообщениями msg=1 result=0; результата операция не возвращает: через ~0,25 с после её начала оболочка пишет в shell.log «[kb_probe6] [php] E: op 11 failed (read status: 2).», «shutting down...», «stopped.» и «Error: operation returned PHP_CALL_FAILED.». - fw-tv188b-261021-0117-r25--libphp5--curl-http.c028 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В multi запроса 12 curl_getinfo(h0, CURLINFO_HTTP_CODE) записал возврат 200; последняя строка отчёта — «перед curl_multi_getcontent h0», без последующей метки этого вызова. - fw-tv188b-261021-0117-r25--libphp5--curl-http.c029 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В multi запроса 12 оболочка получила EOF от PHP-сервера, записала PHP_CALL_FAILED и stopped; end multi за 25 с не появился, а при сборе php_server зонда уже не найден. - fw-tv188b-261021-0117-r25--libphp5.c028 · code · android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24, 1.0.1-1000-260724_0207_r24 · Наборы имён curl_multi_* (12) и CURLOPT_* (111) в strings libphp5.so совпадают у всех пяти исследованных сборок. [^44]: - fw-tv188b-261021-0117-r25.c023 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · HD::http_get_document в r25 пишет в лог « http <метод>: » (метод — CURLOPT_CUSTOMREQUEST, иначе POST при CURLOPT_POSTFIELDS, иначе GET) и « http DATA: …» вместо «HTTP fetching»/«HTTP POST fields»; сообщения об ошибках — в нижнем регистре («http request failed (код)») - fw-tv188b-260827-0003-r24--plugin-loader--php-runtime--opexec.c030 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В r25 (261021_0117_r25) набор сообщений исполнителя операций тот же, добавлены «plugin_opexec I: waiting for mc index validation», «plugin_opexec I: mc index now valid» и «plugin_opexec D: %s: %s» (вместо «still working...»), а сообщения операции получили формат «%s->%s(%s.%s)». [^45]: - fw-tv188b-261021-0117-r25.c169 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 GET /cgi-bin/do?cmd=kb_probe5_ping&plugin=kb_probe5&kbp5=1 при загруженном плагине kb_probe5 с www/cgi-bin/run.php вернул command_status=failed, error_kind=unknown_command, error_description «command 'kb_probe5_ping' is not supported». - fw-tv188b-261021-0117-r25.c170 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 запрос /cgi-bin/do?cmd=kb_probe5_ping&plugin=kb_probe5 не запустил www/cgi-bin/run.php плагина: файл /tmp/kb_probe5/run_php.txt, который run.php пишет при каждом запуске, не появился, а в shell.log после запроса нет строк handle_extcmd, kb_probe5, run.php, php-cgi и «headers missing». - fw-tv188b-261021-0117-r25.c149 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 CGI-скрипт плагина, вызванный через http:///cgi-bin/plugins/

/<файл>, получает PLUGIN_NAME=

, а PLUGIN_CGI_DIR и SCRIPT_FILENAME — реальные пути $FS_PREFIX/flashdata/plugins/

/www/cgi-bin и …/www/cgi-bin/<файл>, а не /tmp/www/plugins/

/… [^46]: - fw-tv188b-261021-0117-r25.c160 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 httpd на URL каталога плагина без «/» в конце (/plugins/

, /cgi-bin/plugins/

) отвечает 302 с Location на тот же путь со «/», а на URL со «/» (/plugins/

/, /cgi-bin/plugins/

/) — 404 Not Found. - fw-tv188b-261021-0117-r25.c161 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 «/» после имени файла плагина даёт 404 Not Found и для CGI (/cgi-bin/plugins/

/ping.sh/), и для статики (/plugins/

/index.txt/), хотя без «/» оба отвечают 200. [^47]: - fw-tv188b-260827-0003-r24--http-api--ext-command-params.c093 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 cmd=open_path&url=root://applications/<подпись пункта> отвечает command_status=ok, но точку входа плагина не запускает (вызовов 0 → 0), а launch_media_url с plugin_launcher://{name=<плагин>} {ep_media_url=} её запускает (0 → 1). - fw-tv188b-260827-0003-r24--http-api--ext-command-params.c040 · doc · any-documented; прошивка — · В описании IP Control указано, что протокол 4 добавил cmd=open_path&url=URL для открытия папки, раздела меню или запуска пункта по root://…; приведён пример root://applications/RadioTime. [^48]: fw-tv188b-260827-0003-r24--http-api--ext-command-params.c098 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 команды IP Control ждут, пока идёт handle_user_input плагина: launch_media_url, отправленный через 4 с после начала 20-секундной операции, получил ответ только после её конца — и для точки входа того же плагина, и для другого плагина. [^49]: - 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-260827-0003-r24--plugin-loader--manifest.c051 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Манифест ktv_start объявляет vod_get_stream_info; строка vod_get_stream_info есть в libduneshell.so среди строк plugin_next_url.c, а в списке операций плагина — get_vod_stream_info [^50]: - 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.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--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 · В запросе 11 на 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. [^51]: - 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. - doc-sdk-plugins--gui-actions.c017 · doc · any-documented; прошивка — · С прошивки 150529 событие GUI_EVENT_PLAYBACK_GOING_TO_SWITCH генерируется перед переключением на новый media URL; в отличие от GUI_EVENT_PLAYBACK_STOP, оно не генерируется при остановке и выключении [^52]: - fw-tv188b-261021-0117-r25.c287 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 при старте VOD зонда kb_probe6 с PluginVodInfo::buffering_ms=3000 оболочка пишет в shell.log «[player] setting buffering to 3000ms» и «[player] DEBUG: using special buffering 3000ms». - doc-sdk-plugins--operations.c107 · doc · any-documented; прошивка — · PluginVodInfo::buffering_ms (предбуферизация в мс) не реализован [^53]: - fw-tv188b-261021-0117-r25.c190 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 shell_ext/bin/media_check вызывает /firmware/scripts/ffmpeg.sh, а такого файла на устройстве нет: «media_check: line 27: /firmware/scripts/ffmpeg.sh: No such file or directory», «ffmpeg finished with status 1». - fw-tv188b-261021-0117-r25.c368 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24, 261021_0117_r25 · В образах r24 и r25 есть text-файл system/system/dunehd/firmware/scripts/ffmpeg.sh размером 457 байт с sha256 b26df76585300fd394662fbd02cdb3555cb0b1fd8a9859e5a7d0e876eef867df; в обеих версиях он одинаков. - fw-tv188b-261021-0117-r25.c369 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24, 261021_0117_r25 · В образах r24 и r25 system/system/dunehd/firmware/bin/ffmpeg — симлинк на /data/data/com.dunehd.app/lib/libxxx_ffmpeg.so. - fw-tv188b-261021-0117-r25--builtin-plugins-misc.c048 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 прямой запуск $P/firmware/bin/ffmpeg -version с LD_LIBRARY_PATH=$P/lib:/system/dunehd/firmware/lib из adb shell вывел ffmpeg version 7.1.3; путь ffmpeg — ссылка на $P/lib/libxxx_ffmpeg.so. - fw-tv188b-260827-0003-r24--shell-ext.c034 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · media_check проверяет URL: ffmpeg через /firmware/scripts/ffmpeg.sh (таймаут 5 с) и скорость чтения curl (первые 1000000 байт, таймаут 5 с, connect 4 с, --cacert /firmware/certs/ca-bundle.crt); curl берётся из /firmware/bin/curl, а если его нет — из каталога скрипта - plg-gh-kocourkuba-proiptv.c036 · code · unknown; прошивка — · get_ffmpeg_path() при is_r25_or_higher() и наличии $FS_PREFIX/firmware/bin/ffmpeg использует его, иначе — свою сборку bin/ffmpeg-7.1.3 (для bin/media_check.sh); комментарий: «Firmware r25 and newer ships its own ffmpeg 7.1». - doc-sdk-dune-devel-info.c010 · doc · any-documented; прошивка — · Плагин не может содержать бинарные исполняемые файлы; если такой файл нужен, нужно отправить в Dune HD запрос рассмотреть его включение в следующее обновление ПО. [^54]: - fw-tv188b-260827-0003-r24--movie-suppliers.c029 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Ключ expr описателя вычисляется Expr; ложь — поставщик отключается. Для id rutube expr принудительно country(ru), если не установлен плагин rutube_integration (иначе условия нет) - fw-tv188b-261021-0117-r25.c051 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Suppliers r25 (movies/suppliers.php): поставщик rutube включается, если установлен плагин rutube_integration; в остальных случаях (и для rutube без плагина) решает ключ expr описателя: ложь — поставщик отключается [^55]: - fw-tv188b-261021-0117-r25--shell-ext--entry-handler.c074 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · В r24 диалог выбора воспроизведения давал кнопкам play_online поставщиков только s, e и sup_id, без sup_info; wh_* доходили до поставщика лишь через entry/play_recent. - fw-tv188b-261021-0117-r25--shell-ext--entry-handler.c060 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В r25 диалог выбора воспроизведения строит для каждого поставщика (с дедупликацией по key_show_only_one) кнопку play_online с s, e, sup_id; только кнопке поставщика, чей id равен whi_sup_id последней записи истории, добавляется sup_info из get_wh_supplier_info. - fw-tv188b-261021-0117-r25--shell-ext--entry-handler.c063 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · MovieHelper::get_wh_supplier_info (r25) копирует action_params записи (или пустой объект), добавляет wh_uid, wh_s, wh_e (по умолчанию -1), wh_pos (-1), wh_len (0), wh_tags (JSON, если есть tags) и wh_file_index (если есть index) и возвращает JSON с sup_data и всеми wh_*-полями. [^56]: - fw-tv188b-260827-0003-r24--movie-suppliers.c035 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Перечитывание поставщиков: при наличии /tmp/movie_suppliers_changed.flag (reload_suppliers_if_changed); в первый раз ждёт файл suppliers_prepared_path до 30 раз по 0,1 с - fw-tv188b-261021-0117-r25.c052 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Suppliers::reload_if_changed (в r24 — reload_suppliers_if_changed) перечитывает поставщиков не только при наличии флага-файла, но и при смене mtime каталога /tmp/movie_suppliers [^57]: - fw-tv188b-261021-0117-r25.c188 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 у поставщика kbp5_stream (playback_type stream) сразу после ответа do_file_search серии — в пределах 0,12 с, без выбора пользователя — оболочка по очереди вызвала get_stream_url для файлов без url: сначала f1, затем f2_err. - fw-tv188b-261021-0117-r25.c194 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 stream_special не использует url файла из ответа do_file_search: у s1 был url http://kbp5.invalid/not-used-s1, но оболочка запросила URL через get_stream_url и взяла его результат, а в url элемента stream_url пустой, file_id s1. - fw-tv188b-260827-0003-r24--movie-suppliers--stream-protocol.c051 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Для stream_special process_special_stream_playback_type при пустом списке файлов возвращает ошибку, иначе берёт файл с минимальным count(path) (строгое <, при равенстве — первый) и вызывает get_play_movie_action с online=true и cur_stream_url=''; get_play_file_online_action передаёт cur_stream_url в get_vod_info, тот кладёт stream_url='' в playback url (для single/ass_type!=0 — напрямую cur_stream_url, для серии — при is_current=1), get_stream_url пропускает preloaded только при is_current!=0 && stream_url!='', поэтому идёт в get_stream_url_by_file_id. url из ответа do_file_search для запускаемого stream_special-файла не используется; поставщик должен реализовать get_stream_url [^58]: - fw-tv188b-261021-0117-r25--app-launch.c062 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Ожидание потери фокуса fcn.00560a58(delay, метка) в tv188b r25 — если оболочка уже без фокуса, «%s: shell app is already lost focus» и результат 1; если delay < 1 — сразу «%s: wait for shell app loosing focus timed-out» и 0; иначе каждые 100 мс (usleep(100000)) проверяет фокус до delay секунд — потеря фокуса даёт «%s: shell app lost focus in %.2fs» и ненулевой результат, истечение срока — «timed-out» и 0. - fw-tv188b-261021-0117-r25--app-launch.c077 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в запросе 7 launch_ext_app с delay 0 (am start настроек) дал «activity launch status: 0», через 4,968 мс — «general: wait for shell app loosing focus timed-out»; настройки открылись (Displayed +123ms), и поверх них выполнился error_action действия — диалог «KB7 error_action / delay=0». - fw-tv188b-261021-0117-r25--app-launch--native.c011 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · В tv188b r24 ожидание потери фокуса fcn.00549ed8 сначала проверяет, потерян ли фокус уже (тогда результат 1), затем delay < 1 (тогда timed-out и 0); при положительном delay опрашивает фокус с usleep(100000) до истечения delay секунд, возвращая ненулевой результат при потере фокуса и 0 при тайм-ауте. - fw-tv188b-260827-0003-r24--movie-suppliers.c061 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Нет пакета — generic отвечает error.missing_app (indirect true, urls http://online.dune-hd.com/apk/generic/.txt); иначе {bin, package, wait_app_start_delay 10, title, indirect true, urls} [^59]: - fw-tv188b-261021-0117-r25--app-launch.c070 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 launch_ext_app с cmd «am start --user 0 -n …» ушёл в apk_helper, тот вернул «Unknown option: --user» и activity launch status −1; выполнился error_action (диалог «KB9 error_action»). - fw-tv188b-261021-0117-r25--app-launch.c023 · code · tv188b, android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 260724_0207_r24 · Строки «--user» в таблице строк classes.dex нет ни в dune.apk tv188b r25 и r24, ни в APK DMC. - fw-tv188b-261021-0117-r25--app-launch.c072 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В tv188b r25 нативный обработчик launch_ext_app (fcn.00560ee8 libduneshell.so), если ветка остановки воспроизведения не вернула управление раньше, для cmd, в которой есть непробельный символ, сравнивает начало cmd с «/system/dunehd/dunehd_service» (strncmp на 0x1d символов, ведущие пробелы не пропускаются): при совпадении печатает «gui_action D: run command '%s'» и передаёт cmd помощнику fcn.00560d20 (popen), иначе печатает «gui_action D: launch activity for command '%s'» и передаёт cmd разборщику apk_helper fcn.006f2b60; если помощник вернул −1, cmd дополнительно уходит в ветку launch activity. [^60]: - fw-tv188b-261021-0117-r25--php-framework.c059 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 после include dunelib/utils.php зонд увидел класс HD и method_exists(HD,make_json_rpc_request)=false; прямой вызов завершился E_ERROR Call to undefined method HD::make_json_rpc_request(), а не JSON-ответом. - fw-tv188b-261021-0117-r25.c022 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В dunelib/utils.php r25 нет метода HD::make_json_rpc_request: между encode_props и get_mac_addr, где он стоял в r24, его нет - fw-tv188b-260827-0003-r24--php-framework.c067 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · HD::make_json_rpc_request($op_name, $params) возвращает массив JSON-RPC 2.0 с растущим id [^61]: - fw-tv188b-261021-0117-r25--libphp5.c074 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 прямой вызов /data/data/com.dunehd.app/bin/wget и вызов sh с тем же путём из php_server оба вернули rc=126 и cannot execute binary file. - fw-tv188b-261021-0117-r25--libphp5.c073 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 which wget из php_server показал /data/data/com.dunehd.app/bin/wget — ссылку на libxxx_busybox.so; вызов по имени wget к /ping компьютера вернул ok и rc=0. [^62]: fw-tv188b-261021-0117-r25.c349 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25, 260827_0003_r24 · На tv188b состав из 16 имён параметров ответа /cgi-bin/do?cmd=status в r25 совпадает с r24; в снимках обоих прогонов (player_state=navigator) protocol_version=6, а значения отличаются: android_app_active=0 в r25 и 1 в r24, firmware_version=261021_0117_r25 и 260827_0003_r24, app_version=1.0.1-13-261021_0117_r25 и 1.0.1-13-260827_0003_r24. [^63]: fw-tv188b-261021-0117-r25.c364 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В r25 config_utils.php::load_product_and_fw() читает android_platform из /tmp/run/versions.txt, но при истинном HD::is_fw_apk() (getenv('HD_FW_APK'); у php_server r25 на tv188b = 1) перезаписывает его содержимым файла /firmware/config/fw_apk_platform.txt. [^64]: fw-tv188b-261021-0117-r25.c360 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в окружении php_server плагина kb_probe8 (pid 3005, ppid 2449, uid 1000) HD_FW_APK=1. [^65]: fw-tv188b-260827-0003-r24--php-framework.c041 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · ConfigUtils::load_product_and_fw() читает /tmp/run/versions.txt (key=value: firmware_version, product, platform_kind, android_platform); для fw_apk android_platform берётся из /firmware/config/fw_apk_platform.txt [^66]: fw-tv188b-261021-0117-r25.c365 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24, 261021_0117_r25 · В образе r25 файл system/system/dunehd/firmware/config/fw_apk_platform.txt содержит строку s928x_android11 (16 байт), его sha256 2e3d08a86de47e91eacb08c92dd6b29df881c4f216a5aa9498a195cf26bc2e55 совпадает с r24. [^67]: fw-tv188b-261021-0117-r25.c097 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 $FS_PREFIX/firmware/config/fw_apk_platform.txt содержит s928x_android11. [^68]: plg-gh-kocourkuba-proiptv.c026 · code · unknown; прошивка — · get_raw_firmware_version() плагина читает строку firmware_version: из $FS_PREFIX/tmp/sysinfo.txt (иначе 'Not detected'), а get_parsed_firmware_ver() разбирает её регуляркой /^(\d*)_(\d*)_(\D*)(\d*)(.*)?$/ на build_date, build_number, rev_literal, rev_number, features. [^69]: plg-gh-kocourkuba-proiptv.c027 · code · unknown; прошивка — · Плагин сравнивает ревизию прошивки числом rev_number: is_r22_or_higher() — rev_number > 21, is_r24_or_higher() — > 22, is_r25_or_higher() — > 24 (при неразобранной версии rev_number=0). [^70]: fw-tv188b-260827-0003-r24--php-framework.c045 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Сравнения версий в Expr (fwv_ge/gt/le/lt) строковые: strcmp(firmware_version, аргумент) [^71]: fw-tv188b-261021-0117-r25.c008 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · dune_api.php r25 добавляет идентификаторы GUI-действий APPLY_HASH_DIRTIES_ACTION_ID='apply_hash_dirties', COND_ACTION_ID='cond', FS_CTL_ACTION_ID='fs_ctl', LOAD_AND_SCALE_IMAGE_ACTION_ID='load_and_scale_image', UPDATE_SPECIAL_FAVORITE_FOLDER_ACTION_ID='update_special_favorite_folder' (в r24 их нет) [^72]: fw-tv188b-260827-0003-r24--php-framework.c040 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · ConfigUtils::load_firmware_features() собирает набор флагов из строк /tmp/firmware_features.txt и /tmp/ro_features.txt [^73]: - fw-tv188b-260827-0003-r24.c063 · device · tv188b, android-dune-fw; прошивка 260827_0003_r24 · На tv188b r24 в окружении dunehd_service (pid 587) есть FS_PREFIX=/data/data/com.dunehd.app, HD_APK=1, HD_FW_APK=1, HD_HTTP_LOCAL_PORT=80 и DUNEHD_SERVICE_DONT_FORK=1, а PATH начинается с $FS_PREFIX/firmware/bin:$FS_PREFIX/bin:/bin. - fw-tv188b-261021-0117-r25.c091 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 у процесса network_manager ($FS_PREFIX/firmware/bin/network_manager, PPID 1) в окружении HD_HTTP_LOCAL_PORT=80, HD_FW_APK=1, HD_APK=1, FS_PREFIX=/data/data/com.dunehd.app, LOG_DIR=/tmp/run, DUNEHD_SERVICE_DONT_FORK=1, PATH начинается с $FS_PREFIX/firmware/bin:$FS_PREFIX/bin:/bin, а LD_LIBRARY_PATH=$FS_PREFIX/firmware/lib:/lib:/usr/lib (без /system/xbin/dunehd/firmware/lib). [^74]: - fw-tv188b-261021-0117-r25.c313 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 php_server при старте пишет в /tmp/run/<плагин>.log по порядку: «[server] preparing...», «reader fd: N; writer fd: M», «resetting include path to …», загрузку bootstrap.php, dune_api.php, dune_plugin.php, dune_plugin_fw.php, «executing system properties cmd (number of properties: 7)...», загрузку dune_config.php, затем программы плагина, после чего «[server] ready.» и «[server] main loop started.»; get_included_files() из main.php даёт тот же порядок файлов. - fw-tv188b-261021-0117-r25.c316 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 include_path в php_server = '.:<каталог плагина>:/data/data/com.dunehd.app/firmware_ext/php/include', каталог плагина — с префиксом $FS_PREFIX: …/flashdata/plugins/kb_probe5 и …/flashdata/plugins/dune-hd.tv у плагинов из flashdata, …/firmware_ext/plugins/shell_ext и …/firmware_ext/plugins/android_apps у встроенных; php_server пишет его в лог «[server] resetting include path to '…'». [^75]: - fw-tv188b-260827-0003-r24--php-framework.c067 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · HD::make_json_rpc_request($op_name, $params) возвращает массив JSON-RPC 2.0 с растущим id - fw-tv188b-261021-0117-r25.c022 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В dunelib/utils.php r25 нет метода HD::make_json_rpc_request: между encode_props и get_mac_addr, где он стоял в r24, его нет - fw-tv188b-261021-0117-r25--php-framework.c059 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 после include dunelib/utils.php зонд увидел класс HD и method_exists(HD,make_json_rpc_request)=false; прямой вызов завершился E_ERROR Call to undefined method HD::make_json_rpc_request(), а не JSON-ответом. [^76]: - fw-tv188b-260827-0003-r24--php-framework.c276 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dune_api.php определяет класс SyncMyCollectionActionData с ключами (2): mcf_id, post_action - fw-tv188b-261021-0117-r25.c015 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В r25 класс SyncMyCollectionActionData содержит только post_action: ключ mcf_id убран из dune_api.php, а ActionFactory::sync_my_collection в shell_ext/lib принимает только $post_action [^77]: - fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c070 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · ActionFactory::sync_my_collection строит действие sync_my_collection; схема заполнения использует SyncMyCollectionActionData::{mcf_id, post_action}. mcf_id по умолчанию -1, приводится к string. - fw-tv188b-261021-0117-r25.c015 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В r25 класс SyncMyCollectionActionData содержит только post_action: ключ mcf_id убран из dune_api.php, а ActionFactory::sync_my_collection в shell_ext/lib принимает только $post_action [^78]: - plg-dc-globaltv--lib.c069 · code · android-dune-fw; прошивка 260827_0003_r24, 261021_0117_r25 · Интерфейсы GCompsScreen/RowsScreen в плагине и r24 объявляют get_timer(MediaURL $media_url, &$plugin_cookies), а в r25 get_timer принимает только нетипизированный media_url. - fw-tv188b-261021-0117-r25.c044 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В shell_ext/lib r25 сигнатура get_timer стала get_timer($media_url) (без &$plugin_cookies) в интерфейсах GCompsScreen и RowsScreen; RegularScreen тоже объявляет get_timer($media_url), а AbstractRegularScreen по умолчанию возвращает null и кладёт таймер в PluginRegularFolderView::timer [^79]: - fw-tv188b-260827-0003-r24--shell-ext--ui-lib.c124 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · RowsFactory::pane формирует или дополняет структуру с полями PluginRowsPane::{rows, focus, bg, header_enabled, single_list_navigation, initial_focus_header, initial_focus_item_id, initial_focus_row_id, horizontal_focus_freedom_factor, horizontal_focus_end_min_offset, vertical_focus_freedom_factor, vertical_focus_gravity, vertical_focus_end_min_offset}. При пустом focus вызывает focus(); header_enabled/single_list_navigation=false, initial_focus_header=-1; hfactor/vfactor=1.0, vgravity=0.0, end_min_offset=0. - fw-tv188b-261021-0117-r25.c043 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · RowsFactory::pane в shell_ext/lib r25 получил второй позиционный параметр: pane($rows, $row_dup_map=null, $focus=null, $bg=null, …) и пишет PluginRowsPane::row_dup_map; добавлены RowsFactory::dup_row($id, $dup_id, $header_id=null) (тип PLUGIN_ROW_TYPE_DUP) и row_set_options [^80]: - plg-dc-globaltv--lib.c068 · code · android-dune-fw; прошивка 260827_0003_r24 · ActionFactory::edit_list_config плагина принимает options/close_item_params между groups и sel_id; r24 принимает после groups сразу sel_id/post_action. - fw-tv188b-261021-0117-r25--shell-ext--ui-lib.c034 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · ActionFactory::edit_list_config принимает обязательный позиционный options между groups и sel_id и добавляет data.options только по истинности. [^81]: fw-tv188b-261021-0117-r25--ext-epg--ui-lib.c009 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24, 261021_0117_r25 · В r24 ext_epg/lib/gcomps_factory.php определён get_label_def, создающий GCOMPONENT_LABEL; в r25 ext_epg/lib этого метода нет, вместо него label_v2, создающий GCOMPONENT_TTF_LABEL. [^82]: fw-tv188b-261021-0117-r25.c320 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 при сбое PHP-вызова (Fatal error или exit(0) в handle_user_input) оболочка пишет в shell.log «[<плагин>] [php] poll_calls() E: treating empty result as failure and stopping server», останавливает php_server («shutting down...», «stopped.»), затем «Error: operation returned PHP_CALL_FAILED.», «[handle_user_input] Failed.» и «[plugin] <плагин>: FATAL ERROR detected (msg = Ошибка приложения)». [^83]: fw-tv188b-261021-0117-r25--libphp5--curl-http.c020 · code · android-dune-fw; прошивка 260827_0003_r24 · В r24 _php_add_fs_prefix_to_http при заданной HD_HTTP_LOCAL_PORT заменяет префикс http://127.0.0.1/cgi-bin/plugins/ или http://localhost/cgi-bin/plugins/ на http://127.0.0.1:/cgi-bin/plugins/ с сохранением хвоста — та же CGI-подстановка, что в r25. [^84]: fw-tv188b-261021-0117-r25--libphp5--curl-http.c032 · code · android-dune-fw; прошивка 261021_0117_r25 · В r25 _php_do_add_fs_prefix_to_http при заданной HD_HTTP_LOCAL_PORT заменяет префикс URL http://localhost/cgi-bin/plugins/ на http://127.0.0.1:/cgi-bin/plugins/, сохраняя хвост URL. [^85]: fw-tv188b-261021-0117-r25--libphp5--curl-http.c033 · code · android-dune-fw; прошивка 261021_0117_r25 · В r25 _php_do_add_fs_prefix_to_http при заданной HD_HTTP_LOCAL_PORT заменяет и префикс без порта http://127.0.0.1/cgi-bin/plugins/ на http://127.0.0.1:/cgi-bin/plugins/ тем же кодом. [^86]: fw-tv188b-261021-0117-r25--libphp5--curl-http.c034 · code · android-dune-fw; прошивка 261021_0117_r25 · В r25 _php_do_add_fs_prefix_to_http без HD_HTTP_LOCAL_PORT, а также для http://-URL с другим хостом или путём порт не подставляет и передаёт URL в _php_apply_lcreg_to_http; URL не на http:// возвращается без обработки. [^87]: fw-tv188b-261021-0117-r25--libphp5--curl-http.c021 · code · android-dune-fw; прошивка 260827_0003_r24 · В r24 _php_add_fs_prefix_to_http не вызывает lcreg и других функций замены хоста; при отсутствии HD_HTTP_LOCAL_PORT или несовпадении префикса URL не меняется, а печать исходного и нового URL ограждена getenv("PHP_DEBUG"). [^88]: fw-tv188b-261021-0117-r25--libphp5--curl-http.c004 · code · android-dune-fw; прошивка 261021_0117_r25 · В r25 _php_do_add_fs_prefix_to_http вызывает lcreg при отсутствии HD_HTTP_LOCAL_PORT либо для http:// URL, не попавшего под CGI-подстановку; при заданной HD_HTTP_LOCAL_PORT URL без префикса http:// выходит до lcreg. [^89]: fw-tv188b-261021-0117-r25.c361 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в окружении php_server плагина kb_probe8 (pid 3005, ppid 2449, uid 1000) HD_HTTP_LOCAL_PORT=80. [^90]: fw-tv188b-261021-0117-r25--libphp5--curl-http.c006 · code · android-dune-fw; прошивка 261021_0117_r25 · Инициализация lcreg r25 читает настройки из FS_PREFIX + /config/lcreg.txt и FS_PREFIX + /config/lcreg_pairs.txt; при отсутствии FS_PREFIX использует пустой префикс. [^91]: fw-tv188b-261021-0117-r25--libphp5--curl-http.c007 · code · android-dune-fw; прошивка 261021_0117_r25 · В r25 lcreg_kind выбирается через atoi первой строки lcreg.txt: 0 выбирает встроенную таблицу lcreg_ru_pairs, 1 читает lcreg_pairs.txt; ошибка открытия/чтения lcreg.txt, результат вне 0/1 или недоступный файл пар дают lcreg_kind=-1. [^92]: fw-tv188b-261021-0117-r25--libphp5--curl-http.c011 · code · android-dune-fw; прошивка 261021_0117_r25 · lcreg_get_replacement r25 ищет замену только при lcreg_kind>=0 и префиксе http:// либо https://, сравниваемом через strncmp с учётом регистра. [^93]: fw-tv188b-261021-0117-r25--libphp5--curl-http.c010 · code · android-dune-fw; прошивка 261021_0117_r25 · В r25 lcreg_ensure_initialized вызывает lcreg_do_initialize только при lcreg_kind=-2; состояния -1, 0 и 1 не запускают повторное чтение через эту функцию. [^94]: - fw-tv188b-261021-0117-r25--libphp5--curl-http.c008 · code · android-dune-fw; прошивка 261021_0117_r25 · В режиме lcreg_kind=1 r25 принимает строки пар с точным разделителем « : »; строку без него пропускает, левую часть копирует до разделителя, правую — начиная через три байта после него, удаляя завершающий LF. - fw-tv188b-261021-0117-r25--libphp5--curl-http.c009 · code · android-dune-fw; прошивка 261021_0117_r25 · Чтение пользовательской таблицы lcreg r25 ограничено 1024 принятыми парами; отдельный fgets вызывается с размером 0x400. [^95]: fw-tv188b-261021-0117-r25--libphp5--curl-http.c012 · code · android-dune-fw; прошивка 261021_0117_r25 · Для lcreg r25 имя хоста выделяется после последнего @ перед первым / (либо концом строки) и до первого : в этой части; совпадение с таблицей требует равной длины и memcmp без изменения регистра. [^96]: fw-tv188b-261021-0117-r25--libphp5--curl-http.c013 · code · android-dune-fw; прошивка 261021_0117_r25 · При совпадении lcreg r25 _php_apply_lcreg_to_http создаёт новую строку из исходного префикса до хоста, замены из таблицы и исходного хвоста после хоста; схема, userinfo и хвост с портом/путём копируются из исходного URL. [^97]: fw-tv188b-261021-0117-r25--libphp5--curl-http.c005 · code · android-dune-fw; прошивка 261021_0117_r25 · При успешной замене lcreg функция _php_apply_lcreg_to_http r25 печатает исходный и новый URL через printf без проверки PHP_DEBUG. [^98]: fw-tv188b-261021-0117-r25--libphp5--curl-http.c002 · code · android-dune-fw; прошивка 261021_0117_r25 · В URL-ветви опции 0x2712 обработчик _php_curl_setopt r25 передаёт строку через _php_add_fs_prefix_to_http перед php_curl_option_url.isra.7. [^99]: fw-tv188b-261021-0117-r25--libphp5--curl-http.c016 · code · android-dune-fw; прошивка 261021_0117_r25 · В r25 zif_curl_init при переданном URL вызывает php_curl_option_url.isra.7 напрямую; HTTP-подстановка перед этим вызовом есть в URL-ветви _php_curl_setopt, поэтому эти две точки входа имеют разный маршрут обработки URL. [^100]: fw-tv188b-261021-0117-r25--libphp5--curl-http.c023 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 curl_setopt(CURLOPT_URL,http://localhost/cgi-bin/plugins/kb_probe11/host.sh) из php_server привёл к CGI HTTP_HOST=127.0.0.1 и пустой curl_error. [^101]: fw-tv188b-261021-0117-r25--libphp5--curl-http.c024 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 curl_init(http://localhost/cgi-bin/plugins/kb_probe11/host.sh) из php_server привёл к CGI HTTP_HOST=localhost и пустой curl_error. [^102]: - fw-tv188b-261021-0117-r25--libphp5--curl-http.c023 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 curl_setopt(CURLOPT_URL,http://localhost/cgi-bin/plugins/kb_probe11/host.sh) из php_server привёл к CGI HTTP_HOST=127.0.0.1 и пустой curl_error. - fw-tv188b-261021-0117-r25--libphp5--curl-http.c024 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 curl_init(http://localhost/cgi-bin/plugins/kb_probe11/host.sh) из php_server привёл к CGI HTTP_HOST=localhost и пустой curl_error. [^103]: fw-tv188b-261021-0117-r25.c380 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Зонд запроса 6 (kbp6_curl_multi_report) задаёт URL каждого запроса curl_multi через curl_init($u), а не через curl_setopt(CURLOPT_URL); функцию вызывают CGI cm.php (ctx cgi) и main.php php_server (ctx php_server). [^104]: fw-tv188b-261021-0117-r25.c381 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в окружении php_server плагина kb_probe6 (запрос 6) HD_HTTP_LOCAL_PORT=80. [^105]: fw-tv188b-261021-0117-r25.c378 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 6 php_server плагина kb_probe6 (отчёт curl_multi ctx=php_server, 15:08:30), задавший URL через curl_init($u), обратился к http://localhost/cgi-bin/plugins/kb_probe6/ping.sh?via=localhost — CGI получил HTTP_HOST=localhost; запрос к http://127.0.0.1:80/cgi-bin/plugins/kb_probe6/ping.sh?via=127.0.0.1 пришёл с HTTP_HOST=127.0.0.1. [^106]: - fw-tv188b-261021-0117-r25--libphp5--curl-http.c014 · code · android-dune-fw; прошивка 261021_0117_r25 · В r25 _php_stream_open_wrapper_ex при сброшенном бите 1 options передаёт путь через _php_add_fs_prefix до выбора URL-обёртки; при установленном бите 1 использует отдельную ветвь zend_resolve_path. - fw-tv188b-261021-0117-r25--libphp5--curl-http.c015 · code · android-dune-fw; прошивка 261021_0117_r25 · В r25 _php_add_fs_prefix передаёт вход в _php_do_add_fs_prefix_to_http, когда вход не начинается с / либо проверка _php_path_needs_prefix.part.0 не выбрала файловую ветвь. [^107]: fw-tv188b-261021-0117-r25--libphp5--curl-http.c022 · code · android-dune-fw; прошивка 261021_0117_r25 · В r25 zif_curl_exec перед curl_easy_perform читает сохранённый URL из поля handle +0x16c; если хост (после http:// или https://, без userinfo и порта) не localhost/localhost. и не разрешается getaddrinfo в 127.x или ::1, либо URL пуст или с другой схемой, ставит опцию 0x4ec3 с обработчиком _php_curl_opensocket_remote. [^108]: fw-tv188b-260827-0003-r24--plugin-loader--php-runtime--opexec.c017 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Отмена операции PHP-плагина (php_plugin.c, fcn.00272050) находит дескриптор операции по id, печатает «Cancelling... Output-data: %p.» и ставит в дескрипторе байт-флаг отмены — и больше ничего: ни php_server, ни PHP-коду отмена не передаётся. [^109]: fw-tv188b-260827-0003-r24--plugin-loader--php-runtime--opexec.c018 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Проверка результата операции PHP-плагина (php_plugin.c, fcn.002720ec) при пришедшем результате смотрит флаг отмены в дескрипторе операции: если он выставлен, печатается «Received result for cancelled operation.», а результат не разбирается и не отдаётся оболочке. [^110]: fw-tv188b-260827-0003-r24--plugin-loader--php-runtime--opexec.c032 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 по тайм-ауту handle_user_input оболочка останавливает php_server плагина и тем прерывает вызов: за «cancelling by timeout (N s)» следуют «FATAL ERROR detected (msg = operation timed out)», «[php] shutting down...», через ~0,25 с «killing PHP-server process...» и «stopped.», затем «canceling req N (fast: 1)», «PHP-FW was shut down. The operation fails.», «result status canceled» и «canceled in N s»; PHP-код вызова не доработал. [^111]: fw-tv188b-260827-0003-r24--plugin-loader--php-runtime.c037 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 следующий вызов плагина после отмены по тайм-ауту не ждёт отменённого: php_server с отменённым вызовом уже убит, и вызов, пришедший через ~4,7 с, сразу выполняется в новом php_server («[php] creating...», новый pid); код отменённого вызова не продолжился. [^112]: fw-tv188b-261021-0117-r25.c308 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 после каждого перезапуска php_server (по touch main.php, после Fatal error, после exit(0)) статические переменные плагина начинаются заново: счётчик KbProbe5Fw::$n в первом вызове нового процесса снова равен 1 (pid 17676, 17849, 17924). [^113]: fw-tv188b-260827-0003-r24--plugin-loader--php-runtime--opexec.c035 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 ключи манифеста operation_timeout/default и operation_timeout/<тип операции> задаются в секундах и работают: 5 дало handle_user_input «start (timeout=5.0s)» и отмену на 5 с, 7 — «timeout=7.0s» и отмену на 7 с. [^114]: fw-tv188b-260827-0003-r24--plugin-loader--php-runtime--opexec.c034 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 ключ operation_timeout в данных действия plugin_handle_user_input задаётся в миллисекундах: 3000 дало «start (timeout=3.0s)» и отмену через 3,3 с, 3 — «timeout=0.0s» и отмену через 0,36 с, 60000 — «timeout=60.0s»; значение из данных действия перекрывает operation_timeout/default манифеста (5). [^115]: fw-tv188b-261021-0117-r25.c010 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · DunePluginFw::invoke_operation в r25 обрабатывает get_folder_rows: вызывает $plugin->get_folder_rows(media_url, row_ids), а если метода нет — бросает Exception «Method not found: get_folder_rows»; get_out_type_code сопоставляет операции тип plugin_folder_rows [^116]: fw-tv188b-261021-0117-r25.c045 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Ленивая подгрузка строк в shell_ext/lib r25: интерфейс RowsScreen объявляет get_rows(MediaURL $media_url, $row_ids); DefaultDunePlugin::get_folder_rows($media_url_str, $row_ids) находит экран по media_url и вызывает его get_rows; AbstractRowsScreen::get_rows по умолчанию бросает исключение («override it to use lazy rows loading») [^117]: fw-tv188b-261021-0117-r25.c017 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В libduneshell.so r25 есть строка «create_fs_ctl_action_from_xml(): not implemented», тогда как для cond, load_and_scale_image, apply_hash_dirties и update_special_favorite_folder есть create_*_action_from_xml() без такой пометки [^118]: fw-tv188b-261021-0117-r25--php-framework.c022 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Манифест downloads задаёт is_shown_action первой entry_point как cond с pattern is_plugin_file(dunemdb_supplier_online_movies/__v2); post_action в этом действии не задан. [^119]: fw-tv188b-261021-0117-r25.c026 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · firmware_features.txt r25 содержит новый флаг downloads [^120]: fw-tv188b-261021-0117-r25.c025 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · ConfigUtils::load_firmware_features() в r25 убирает флаг downloads из набора, если есть файл /tmp/flm.txt (комментарий: оболочка создаёт его для «lite»-лицензии без загрузок) [^121]: fw-tv188b-261021-0117-r25.c053 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Новый ключ описателя поставщика dl_capable (r25): первый поставщик с dl_capable становится dl-поставщиком (кнопка «Загрузки», Suppliers::get_dl_sup), только если в firmware_features есть флаг downloads [^122]: fw-tv188b-261021-0117-r25.c066 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Экран программы встроенного плагина ext_epg r25 выводит метки по ключам imdb_rating, kinopoisk_rating, rating_ru и producer (kinopoisk_rating и producer — новые относительно r24) [^123]: fw-tv188b-261021-0117-r25--gui-resources.c020 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В r25 в базовом скине добавлен special_icons/kp.png (2329 байт), в r24 его нет; остальные 742 записи firmware/skin/ совпадают; ext_epg использует gui_skin://special_icons/kp.png. [^124]: fw-tv188b-261021-0117-r25.c064 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · libduneshell.so r25 содержит декодер WebP: исходник src/common/mt/webp_decoding.c, функцию decode_webp_image и сообщения «webp E: …» [^125]: 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 они есть [^126]: 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 они есть [^127]: fw-tv188b-260827-0003-r24--php-framework.c082 · code · tv188b, tv175u, android-dune-fw; прошивка 240619_0210_r22, 250815_1012_r22, 260724_0207_r24, 260827_0003_r24 · bootstrap.php, dune_config.php, dune_plugin.php и dunelib/dune_countries.php одинаковы (sha256) в tv175u 240619_0210_r22, tv188b 250815_1012_r22 и r24-прошивках; dunelib/config_utils, dune_languages, expr, utils в r22-прошивках отсутствуют [^128]: fw-tv188b-260827-0003-r24--movie-suppliers.c077 · code · tv188b, android-dune-fw; прошивка 250815_1012_r22 · В 250815_1012_r22 youtube регистрировался сам: global_actions boot_end/install/update с условием not(firmware_feature(movie_suppliers_update)) запускали bin/register_supplier.sh, писавший описатель прямо в $FS_PREFIX/tmp/movie_suppliers/YouTube [^129]: fw-tv188b-260827-0003-r24--movie-suppliers--stream-protocol.c062 · code · tv188b, android-dune-fw; прошивка 250815_1012_r22 · В 250815_1012_r22 Suppliers (shell_ext/movies/suppliers.php) задаёт тот же контракт потоковых команд, что и r24: те же ограничения seasons/episodes в get_episodes, те же ключи playback_url (movie_id, s, e, ass_type, sup_id, is_current, file_id, stream_url), та же проверка url ответа get_stream_url [^130]: plg-gh-kocourkuba-proiptv.c032 · code · unknown; прошивка — · Starnet_Entry_Handler при rev_number ≤ 21 (не is_r22_or_higher) показывает диалог err_too_old_player, а без класса SQLite3 — err_no_sqlite, и дальше не обрабатывает вход (кроме confirm_update, который проверяется раньше). [^131]: fw-tv188b-260827-0003-r24--php-framework.c056 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · HD::http_get_document по умолчанию отключает проверку TLS-сертификата (CURLOPT_SSL_VERIFYPEER=false), следует редиректам, ставит CURLOPT_ENCODING=1 и тайм-ауты из $DEFAULT_CURL_*; опции вызывающего применяются поверх [^132]: fw-tv188b-261021-0117-r25--libphp5.c050 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · www.ssl.com на tv188b r25 из php_server (uid 1000) с полным бандлом, без корня Entrust и только с корнем Entrust при включённой проверке TLS даёт errno 60 «self signed certificate in certificate chain»; без проверки — HTTP 200, а цепочка заканчивается самоподписанным SSL.com TLS RSA Root CA 2022. [^133]: fw-tv188b-260827-0003-r24--php-framework.c057 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Если вызывающий передал CURLOPT_SSL_VERIFYPEER=true для https-URL, HD::http_get_document подставляет CURLOPT_CAINFO=/firmware/certs/ca-bundle.crt [^134]: - fw-tv188b-261021-0117-r25--libphp5.c001 · code · android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24, 1.0.1-1000-260724_0207_r24 · В strings libphp5.so пяти исследованных сборок присутствует строка PHP/5.3.6. - fw-tv188b-261021-0117-r25--libphp5.c002 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В зонде kb_probe5 на tv188b 261021_0117_r25 значение PHP_VERSION равно 5.3.6. [^135]: - fw-tv188b-261021-0117-r25--libphp5.c009 · code · android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24, 1.0.1-1000-260724_0207_r24 · В strings libphp5.so пяти исследованных сборок присутствуют имена JSON: json_encode, json_decode, json_last_error. - fw-tv188b-261021-0117-r25--libphp5.c010 · code · android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24, 1.0.1-1000-260724_0207_r24 · В strings libphp5.so пяти исследованных сборок присутствуют имена cURL: curl_init, curl_copy_handle, curl_version, curl_setopt, curl_setopt_array, curl_exec, curl_getinfo, curl_error, curl_errno, curl_close. - fw-tv188b-261021-0117-r25--libphp5.c014 · code · android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24, 1.0.1-1000-260724_0207_r24 · В strings libphp5.so пяти исследованных сборок присутствуют имена mbstring: mb_strlen, mb_substr, mb_convert_encoding, mb_detect_encoding, mb_check_encoding. - fw-tv188b-261021-0117-r25--libphp5.c015 · code · android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24, 1.0.1-1000-260724_0207_r24 · В strings libphp5.so пяти исследованных сборок присутствуют имена iconv: iconv_strlen, iconv_substr, iconv_mime_decode, iconv_get_encoding, iconv_set_encoding. - fw-tv188b-261021-0117-r25--libphp5.c016 · code · android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24, 1.0.1-1000-260724_0207_r24 · В strings libphp5.so пяти исследованных сборок присутствуют имена PCRE: preg_match, preg_match_all, preg_replace, preg_split, preg_last_error. - fw-tv188b-261021-0117-r25--libphp5.c017 · code · android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24, 1.0.1-1000-260724_0207_r24 · В strings libphp5.so пяти исследованных сборок присутствуют имена OpenSSL: openssl_encrypt, openssl_decrypt, openssl_sign, openssl_verify, openssl_random_pseudo_bytes. - fw-tv188b-261021-0117-r25--libphp5.c018 · code · android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24, 1.0.1-1000-260724_0207_r24 · В strings libphp5.so пяти исследованных сборок присутствуют имена pcntl: pcntl_fork, pcntl_waitpid, pcntl_signal, pcntl_signal_dispatch, pcntl_exec. - fw-tv188b-261021-0117-r25--libphp5.c019 · code · android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24, 1.0.1-1000-260724_0207_r24 · В strings libphp5.so пяти исследованных сборок присутствуют имена posix: posix_getuid, posix_getpid, posix_kill, posix_setuid. - fw-tv188b-261021-0117-r25--libphp5.c020 · code · android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24, 1.0.1-1000-260724_0207_r24 · В strings libphp5.so пяти исследованных сборок присутствуют имена sockets: socket_create, socket_connect, socket_select, socket_read, socket_write. - fw-tv188b-261021-0117-r25--libphp5.c021 · code · android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24, 1.0.1-1000-260724_0207_r24 · В strings libphp5.so пяти исследованных сборок присутствуют имена XML: simplexml_load_string, xml_parser_create, libxml_use_internal_errors. - fw-tv188b-261021-0117-r25--libphp5.c022 · code · android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24, 1.0.1-1000-260724_0207_r24 · В strings libphp5.so пяти исследованных сборок присутствуют имена классов XML/SOAP/ZIP/SQLite: DOMDocument, SoapClient, ZipArchive, SQLite3. [^136]: - fw-tv188b-261021-0117-r25--libphp5.c006 · code · android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24, 1.0.1-1000-260724_0207_r24 · В strings libphp5.so пяти исследованных сборок присутствует версия OpenSSL 1.0.1u от 22 Sep 2016. - fw-tv188b-261021-0117-r25--libphp5.c026 · code · android-dune-fw; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24 · В strings библиотек libcurl сборок tv188b r22, r24, r25 и tv175u r24 присутствует libcurl/7.67.0. - fw-tv188b-261021-0117-r25--libphp5.c028 · code · android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24, 1.0.1-1000-260724_0207_r24 · Наборы имён curl_multi_* (12) и CURLOPT_* (111) в strings libphp5.so совпадают у всех пяти исследованных сборок. [^137]: - fw-tv188b-261021-0117-r25--libphp5.c036 · code · android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24, 1.0.1-1000-260724_0207_r24 · CA-бандлы всех пяти исследованных сборок совпадают по SHA-256 722be2869ed2c2a949e5edb75b030f1e737e869ca8e8f70bc8d876dd93227ead. - fw-tv188b-261021-0117-r25--libphp5.c037 · code · android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24, 1.0.1-1000-260724_0207_r24 · Заголовки CA-бандлов пяти исследованных сборок датируют данные Mozilla 11 октября 2022 года. [^138]: - fw-tv188b-260827-0003-r24.c063 · device · tv188b, android-dune-fw; прошивка 260827_0003_r24 · На tv188b r24 в окружении dunehd_service (pid 587) есть FS_PREFIX=/data/data/com.dunehd.app, HD_APK=1, HD_FW_APK=1, HD_HTTP_LOCAL_PORT=80 и DUNEHD_SERVICE_DONT_FORK=1, а PATH начинается с $FS_PREFIX/firmware/bin:$FS_PREFIX/bin:/bin. - fw-tv188b-261021-0117-r25.c091 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 у процесса network_manager ($FS_PREFIX/firmware/bin/network_manager, PPID 1) в окружении HD_HTTP_LOCAL_PORT=80, HD_FW_APK=1, HD_APK=1, FS_PREFIX=/data/data/com.dunehd.app, LOG_DIR=/tmp/run, DUNEHD_SERVICE_DONT_FORK=1, PATH начинается с $FS_PREFIX/firmware/bin:$FS_PREFIX/bin:/bin, а LD_LIBRARY_PATH=$FS_PREFIX/firmware/lib:/lib:/usr/lib (без /system/xbin/dunehd/firmware/lib). - fw-tv188b-261021-0117-r25.c092 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 у процесса httpd ($FS_PREFIX/bin/httpd, PPID 1) в окружении HD_HTTP_LOCAL_PORT=80, HD_FW_APK=1, HD_APK=1, FS_PREFIX=/data/data/com.dunehd.app, LOG_DIR=/tmp/run, DUNEHD_SERVICE_DONT_FORK=1, PATH начинается с $FS_PREFIX/firmware/bin:$FS_PREFIX/bin:/bin, а LD_LIBRARY_PATH=$FS_PREFIX/firmware/lib:/lib:/usr/lib (без /system/xbin/dunehd/firmware/lib). [^139]: - fw-tv188b-260827-0003-r24.c054 · device · tv188b, android-dune-fw; прошивка 260827_0003_r24 · На tv188b r24 три процесса php_server (shell_ext, dune-hd.tv, android_apps) работают от пользователя system с SELinux-меткой u:r:system_app:s0; их родитель — com.dunehd.app (PPID 25631), а UID пакета приложения — 1000 (sharedUser android.uid.system/1000). - fw-tv188b-261021-0117-r25.c240 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 PHP-скрипт CGI плагина (php-cgi через CGI-обёртку) работает с posix_getuid() = 0, а php_server того же плагина — с uid 1000. [^140]: - fw-tv188b-261021-0117-r25.c152 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 CGI плагина, запущенный httpd через run_plugin_cgi, работает под uid=0(root) gid=0(root) с SELinux-контекстом u:r:shell:s0. - fw-tv188b-260827-0003-r24.c058 · device · tv188b, android-dune-fw; прошивка 260827_0003_r24 · На tv188b r24 HTTP-сервер «httpd -h /data/data/com.dunehd.app/tmp/www» (pid 1843) работает от root с SELinux-меткой u:r:shell:s0 и PPID 1. [^141]: - fw-tv188b-260827-0003-r24--init-runtime--dunehd-service.c001 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24, 250815_1012_r22, 261021_0117_r25 · Клиент dunehd_service имеет одинаковые размер, SHA-256 и режим доступа в tv188b r22 (250815_1012), r24 (260827_0003) и r25 (261021_0117). - fw-tv188b-260827-0003-r24--init-runtime--dunehd-service.c002 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24, 250815_1012_r22, 261021_0117_r25 · Сервисный ELF dunehd_service имеет одинаковые размер, SHA-256 и режим доступа в tv188b r22 (250815_1012), r24 (260827_0003) и r25 (261021_0117). - fw-tv188b-260827-0003-r24--init-runtime--dunehd-service.c003 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24, 250815_1012_r22, 261021_0117_r25 · Обёртка dunehd_service.sh имеет одинаковые размер, SHA-256 и режим доступа в tv188b r22 (250815_1012), r24 (260827_0003) и r25 (261021_0117). - fw-tv188b-260827-0003-r24--init-runtime--dunehd-service.c004 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24, 250815_1012_r22, 261021_0117_r25 · Файл окружения dunehd_service.env имеет одинаковые размер, SHA-256 и режим доступа в tv188b r22 (250815_1012), r24 (260827_0003) и r25 (261021_0117). [^142]: - plg-sdk-demo2.c135 · code · android-dune-fw; прошивка 261021_0117_r25 · DunePluginFw r25 вызывает базовые get_folder_view/get_next_folder_view/get_tv_info/get_tv_stream_url/get_vod_info/get_vod_stream_url с media_url/cookies, если ветвь _v2 не выбрана. - plg-sdk-demo2.c134 · code · android-dune-fw; прошивка 261021_0117_r25 · В r25 интерфейс DunePlugin объявляет те же 11 основных операций, которые реализует DefaultDunePlugin demo2. [^143]: fw-tv188b-261021-0117-r25.c260 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 PHP-плагин, программа которого объявляет наследника DunePluginFw с методом call_plugin() и присваивает его экземпляр в DunePluginFw::$instance (зонд kb_probe6), загружается php_server и получает от оболочки операции handle_user_input и get_vod_stream_url. [^144]: - fw-tv188b-260827-0003-r24--movie-suppliers.c010 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · do_movie_suppliers_update запускает «sh /bin/movie_suppliers_update.sh» с парами аргументов (через escape_shell_arg) — только если строка «version_index:id1-id2…» отличается от сохранённой в /flashdata/plugins_data/<плагин>/movie_suppliers_params.txt; после запуска строка записывается туда - fw-tv188b-261021-0117-r25.c125 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 movie_suppliers_update.sh плагина-поставщика kb_probe6_sup запущен с парами аргументов « » (подпись равна id) для всех восьми id в порядке их перечисления в params/movie_suppliers манифеста. [^145]: - fw-tv188b-261021-0117-r25--app-launch.c001 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · dune_api.php r25 определяет класс LaunchExtAppActionData с ключами (8) cmd, ensure_playback_stopped, delay, package, version, msg_toast, params, error_action — тот же набор, что в r24. - fw-tv188b-261021-0117-r25--app-launch.c016 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · В r24 (tv188b) finalize_launch_cmd, plain_launch_app и чтение app_data.json в shell_ext/android_apps/model.php такие же, как в r25 (diff файлов — две строки, не про запуск). - fw-tv188b-261021-0117-r25--app-launch.c018 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25, 260827_0003_r24 · dune.apk tv188b (r24 и r25) — пакет com.dunehd.app с android:sharedUserId="android.uid.system". [^146]: 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. [^147]: - fw-tv188b-261021-0117-r25--gui-resources.c023 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · firmware/fonts/ r25 и r24 совпадают: 6 файлов, 0 изменённых. - fw-tv188b-261021-0117-r25--gui-resources.c022 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · on_screen_keyboards/ r25 и r24 совпадают: 7 файлов, 0 изменённых. - fw-tv188b-261021-0117-r25--gui-resources.c021 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · alternative_skins/ r25 и r24 совпадают: 821 запись, 0 изменённых; Air 313, Black 192, Silver 316. - fw-tv188b-261021-0117-r25--gui-resources.c020 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В r25 в базовом скине добавлен special_icons/kp.png (2329 байт), в r24 его нет; остальные 742 записи firmware/skin/ совпадают; ext_epg использует gui_skin://special_icons/kp.png. [^148]: fw-tv188b-260827-0003-r24--shell-ext--ui-lib--gcomp-list.c046 · code · android-dune-fw; прошивка 261021_0117_r25 · Извлечённый gcomp_list.php в tv188b 261021_0117_r25 побайтно совпадает с разобранной копией 260827_0003_r24 (550 строк). [^149]: fw-tv188b-260827-0003-r24--movie-suppliers--movie-services.c040 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Файлы movies/suppliers_config.php и movies/movie_services_config.php в shell_ext r25 побайтно совпадают с r24. [^150]: fw-tv188b-261021-0117-r25--network-services.c063 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25, 260827_0003_r24 · init_network.sh, init_torrents.sh, udhcpc_callback.sh и smb.bash в r24 и r25 совпадают побайтово: размеры и SHA-256 в tree.tsv одинаковые. [^151]: - fw-tv188b-261021-0117-r25.c368 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24, 261021_0117_r25 · В образах r24 и r25 есть text-файл system/system/dunehd/firmware/scripts/ffmpeg.sh размером 457 байт с sha256 b26df76585300fd394662fbd02cdb3555cb0b1fd8a9859e5a7d0e876eef867df; в обеих версиях он одинаков. - fw-tv188b-261021-0117-r25.c369 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24, 261021_0117_r25 · В образах r24 и r25 system/system/dunehd/firmware/bin/ffmpeg — симлинк на /data/data/com.dunehd.app/lib/libxxx_ffmpeg.so. [^152]: - fw-tv188b-260827-0003-r24--php-framework.c056 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · HD::http_get_document по умолчанию отключает проверку TLS-сертификата (CURLOPT_SSL_VERIFYPEER=false), следует редиректам, ставит CURLOPT_ENCODING=1 и тайм-ауты из $DEFAULT_CURL_*; опции вызывающего применяются поверх - fw-tv188b-261021-0117-r25.c366 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В r25 HD::http_get_document() и HD::http_server_responding() по умолчанию ставят CURLOPT_SSL_VERIFYPEER=false. - fw-tv188b-260827-0003-r24--php-framework.c057 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Если вызывающий передал CURLOPT_SSL_VERIFYPEER=true для https-URL, HD::http_get_document подставляет CURLOPT_CAINFO=/firmware/certs/ca-bundle.crt - fw-tv188b-261021-0117-r25.c367 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В r25 HD::http_get_document() добавляет CURLOPT_CAINFO=/firmware/certs/ca-bundle.crt только если в $opts передан истинный CURLOPT_SSL_VERIFYPEER и URL начинается с https://, после чего применяет $opts к хендлу; вызывающий может включить проверку, но CAINFO принудительно становится бандлом прошивки (переданный в $opts CAINFO перезаписывается). [^153]: - fw-tv188b-261021-0117-r25.c008 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · dune_api.php r25 добавляет идентификаторы GUI-действий APPLY_HASH_DIRTIES_ACTION_ID='apply_hash_dirties', COND_ACTION_ID='cond', FS_CTL_ACTION_ID='fs_ctl', LOAD_AND_SCALE_IMAGE_ACTION_ID='load_and_scale_image', UPDATE_SPECIAL_FAVORITE_FOLDER_ACTION_ID='update_special_favorite_folder' (в r24 их нет) - fw-tv188b-261021-0117-r25.c013 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · dune_api.php r25: CondActionData {pattern, post_action}, LoadAndScaleImageActionData {icon_url, local_path, scale_if_needed, icon_width, icon_height, post_action}, UpdateSpecialFavoriteFolderActionData {name, delete, skip_interactions, post_action}, ApplyHashDirtiesActionData {post_action} - fw-tv188b-261021-0117-r25.c017 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В libduneshell.so r25 есть строка «create_fs_ctl_action_from_xml(): not implemented», тогда как для cond, load_and_scale_image, apply_hash_dirties и update_special_favorite_folder есть create_*_action_from_xml() без такой пометки [^154]: - fw-tv188b-261021-0117-r25.c008 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · dune_api.php r25 добавляет идентификаторы GUI-действий APPLY_HASH_DIRTIES_ACTION_ID='apply_hash_dirties', COND_ACTION_ID='cond', FS_CTL_ACTION_ID='fs_ctl', LOAD_AND_SCALE_IMAGE_ACTION_ID='load_and_scale_image', UPDATE_SPECIAL_FAVORITE_FOLDER_ACTION_ID='update_special_favorite_folder' (в r24 их нет) - fw-tv188b-261021-0117-r25.c012 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · dune_api.php r25 вводит файловые команды для действия fs_ctl: перечисление FsCmdKind (resolve_url, stat, scandir, get_file) и классы FsCtlActionData {cmd, output_path, post_action}, FsCmdDef {kind, specific_def}, FsResolveUrlDef {url, try_mount_if_needed}, FsStatDef {path}, FsScandirDef {path, with_stat, max_items_count}, FsGetFileDef {path, target_path, skip, max_size, chunk_size} - fw-tv188b-261021-0117-r25.c017 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В libduneshell.so r25 есть строка «create_fs_ctl_action_from_xml(): not implemented», тогда как для cond, load_and_scale_image, apply_hash_dirties и update_special_favorite_folder есть create_*_action_from_xml() без такой пометки [^155]: fw-tv188b-261021-0117-r25.c012 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · dune_api.php r25 вводит файловые команды для действия fs_ctl: перечисление FsCmdKind (resolve_url, stat, scandir, get_file) и классы FsCtlActionData {cmd, output_path, post_action}, FsCmdDef {kind, specific_def}, FsResolveUrlDef {url, try_mount_if_needed}, FsStatDef {path}, FsScandirDef {path, with_stat, max_items_count}, FsGetFileDef {path, target_path, skip, max_size, chunk_size} [^156]: - fw-tv188b-261021-0117-r25.c008 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · dune_api.php r25 добавляет идентификаторы GUI-действий APPLY_HASH_DIRTIES_ACTION_ID='apply_hash_dirties', COND_ACTION_ID='cond', FS_CTL_ACTION_ID='fs_ctl', LOAD_AND_SCALE_IMAGE_ACTION_ID='load_and_scale_image', UPDATE_SPECIAL_FAVORITE_FOLDER_ACTION_ID='update_special_favorite_folder' (в r24 их нет) - fw-tv188b-261021-0117-r25.c013 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · dune_api.php r25: CondActionData {pattern, post_action}, LoadAndScaleImageActionData {icon_url, local_path, scale_if_needed, icon_width, icon_height, post_action}, UpdateSpecialFavoriteFolderActionData {name, delete, skip_interactions, post_action}, ApplyHashDirtiesActionData {post_action} [^157]: fw-tv188b-261021-0117-r25.c009 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · dune_api.php r25 вводит операцию плагина PLUGIN_OP_GET_FOLDER_ROWS='get_folder_rows' с выходным типом PLUGIN_OUT_DATA_PLUGIN_FOLDER_ROWS='plugin_folder_rows' и классы PluginFolderRowsInputData {media_url, row_ids} и PluginFolderRows {rows} [^158]: fw-tv188b-261021-0117-r25.c011 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · dune_api.php r25 описывает строки с ленивой подгрузкой: тип строки PLUGIN_ROW_TYPE_DUP='row_dup', опции PLUGIN_ROW_OPT_LOADING=0x4 и PLUGIN_ROW_OPT_OPTIMIZE_INVISIBLE=0x8, поле PluginRowsPane::row_dup_map, PluginFolderView::type_mask и GCOMP_OPT_STUB=0x400000 [^159]: - fw-tv188b-261021-0117-r25.c011 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · dune_api.php r25 описывает строки с ленивой подгрузкой: тип строки PLUGIN_ROW_TYPE_DUP='row_dup', опции PLUGIN_ROW_OPT_LOADING=0x4 и PLUGIN_ROW_OPT_OPTIMIZE_INVISIBLE=0x8, поле PluginRowsPane::row_dup_map, PluginFolderView::type_mask и GCOMP_OPT_STUB=0x400000 - fw-tv188b-261021-0117-r25--php-framework.c015 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Аннотации dune_api.php r25 задают поля PluginRowsPane: row_dup_map — (PluginRowMap *). - fw-tv188b-261021-0117-r25--php-framework.c016 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Аннотации dune_api.php r25 задают поля PluginFolderView: type_mask — int. [^160]: - fw-tv188b-261021-0117-r25.c014 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · dune_api.php r25 добавляет поля в существующие классы: FileChooserUiParams::{with_network_folders, with_network_browser, new_folder_default_name}, PluginSystemActionData::handle_response - fw-tv188b-261021-0117-r25--php-framework.c013 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Аннотации dune_api.php r25 задают поля FileChooserUiParams: with_network_folders — bool; with_network_browser — bool; new_folder_default_name — (char *). [^161]: fw-tv188b-261021-0117-r25.c014 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · dune_api.php r25 добавляет поля в существующие классы: FileChooserUiParams::{with_network_folders, with_network_browser, new_folder_default_name}, PluginSystemActionData::handle_response [^162]: fw-tv188b-261021-0117-r25.c021 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Новый dunelib/installed_plugins.php (r25): класс InstalledPlugins читает /tmp/run/installed_plugins.xml (INSTALLED_PLUGINS_FILE) и кэширует список, перечитывая файл при смене mtime; методы get_by_name($plugins, $name), reload(), ensure_loaded() [^163]: fw-tv188b-261021-0117-r25.c024 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В HD (dunelib/utils.php) r25 добавлены статические методы ensure_empty_file($path), log_elapsed($msg, $start_tm, $suffix=''), read_int($path, $def=0), read_string($path, $def='') [^164]: fw-tv188b-261021-0117-r25.c027 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · dunelib/dl_state.php (r25): DlState отправляет команды менеджеру загрузок JSON-файлами в /tmp/run/dl_input/<время>.<…>.in с cmd_type add (id, name, total, files[path, url, size_mb, ext_ts], params), remove, pause, resume (group_id, file_paths), start_ts, change_dl_folder, test_dl_folder [^165]: fw-tv188b-261021-0117-r25.c023 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · HD::http_get_document в r25 пишет в лог « http <метод>: » (метод — CURLOPT_CUSTOMREQUEST, иначе POST при CURLOPT_POSTFIELDS, иначе GET) и « http DATA: …» вместо «HTTP fetching»/«HTTP POST fields»; сообщения об ошибках — в нижнем регистре («http request failed (код)») [^166]: - fw-tv188b-261021-0117-r25.c022 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В dunelib/utils.php r25 нет метода HD::make_json_rpc_request: между encode_props и get_mac_addr, где он стоял в r24, его нет - fw-tv188b-261021-0117-r25--php-framework.c059 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 после include dunelib/utils.php зонд увидел класс HD и method_exists(HD,make_json_rpc_request)=false; прямой вызов завершился E_ERROR Call to undefined method HD::make_json_rpc_request(), а не JSON-ответом. [^167]: - fw-tv188b-260827-0003-r24.c040 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · По сравнению с 250815_1012_r22 в firmware_features.txt r24 добавлены флаги dunemdb_supplier_plugin_api_v7, sup_api_v8, movie_suppliers_order, lcfg_v2, light_stop - fw-tv188b-261021-0117-r25.c101 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 /tmp/firmware_features.txt — по флагу в строке: tmpfs, dunemdb_supplier_plugin_api_v2…v7, sup_api_v8, tv_config, newgui2021, app_root_url_type, movie_suppliers_update, movie_suppliers_order, url_sdcard, lcfg_v2, light_stop, apk, fw_apk, drm_apps, downloads. [^168]: - fw-tv188b-260827-0003-r24--firmware-config.c010 · code · android-dune-fw; прошивка 260827_0003_r24 · firmware_features.txt объявляет 19 флагов возможностей: tmpfs, dunemdb_supplier_plugin_api_v2, dunemdb_supplier_plugin_api_v3, dunemdb_supplier_plugin_api_v4, dunemdb_supplier_plugin_api_v5, dunemdb_supplier_plugin_api_v6, dunemdb_supplier_plugin_api_v7, sup_api_v8, tv_config, newgui2021, app_root_url_type, movie_suppliers_update, movie_suppliers_order, url_sdcard, lcfg_v2, light_stop, apk, fw_apk, drm_apps. - fw-tv188b-261021-0117-r25.c101 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 /tmp/firmware_features.txt — по флагу в строке: tmpfs, dunemdb_supplier_plugin_api_v2…v7, sup_api_v8, tv_config, newgui2021, app_root_url_type, movie_suppliers_update, movie_suppliers_order, url_sdcard, lcfg_v2, light_stop, apk, fw_apk, drm_apps, downloads. [^169]: - fw-tv188b-260827-0003-r24--movie-suppliers.c049 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · firmware_features.txt прошивки 260827_0003_r24 содержит флаги movie_suppliers_update и movie_suppliers_order - fw-tv188b-261021-0117-r25.c101 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 /tmp/firmware_features.txt — по флагу в строке: tmpfs, dunemdb_supplier_plugin_api_v2…v7, sup_api_v8, tv_config, newgui2021, app_root_url_type, movie_suppliers_update, movie_suppliers_order, url_sdcard, lcfg_v2, light_stop, apk, fw_apk, drm_apps, downloads. [^170]: - fw-tv188b-261021-0117-r25.c026 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · firmware_features.txt r25 содержит новый флаг downloads - fw-tv188b-261021-0117-r25.c025 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · ConfigUtils::load_firmware_features() в r25 убирает флаг downloads из набора, если есть файл /tmp/flm.txt (комментарий: оболочка создаёт его для «lite»-лицензии без загрузок) - fw-tv188b-261021-0117-r25.c115 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 файла /tmp/flm.txt нет. [^171]: fw-tv188b-261021-0117-r25.c006 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В r25 в firmware_ext/plugins 15 каталогов встроенных плагинов с dune_plugin.xml: к 13 из r24 добавлены downloads и s928x_dvfel [^172]: fw-tv188b-261021-0117-r25.c007 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Новые исполняемые файлы Dune в r25: libxxx_dl_manager.so, libxxx_lcconv.so, libxxx_vsftpd.so в /system/bin; симлинки firmware/bin/dl_manager, firmware/bin/lcconv и firmware_ext/ftpserver/bin/vsftpd ведут в /data/data/com.dunehd.app/lib/ [^173]: fw-tv188b-261021-0117-r25--network-services.c035 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В r25 появились скрипты add_atv_route.sh, usbnet_nat_fast_repair.sh и usbnet_nat_full_repair.sh; в r24 этих файлов нет (в отсортированном tree.tsv r24 add_atv_route.sh отсутствует между dune_keyboard_russian_low.txt и bd_upgrade.sh, а repair-скрипты — между umount_loop.sh и usbnet_nat_setup.sh). [^174]: fw-tv188b-261021-0117-r25.c036 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Манифест bluray в r25 без global_actions: после сразу php; файлы bin/start.sh и bin/stop.sh удалены (в bin/ остались init.sh и plugin_env.sh) [^175]: fw-tv188b-261021-0117-r25.c070 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В экране audio menu_config.xml r25 есть кнопка button_additional_audio_settings, а настроек native_sample_rate, start_silence_for_audio_files и disable_usb_audio, которые были в этом экране r24, нет. [^176]: fw-tv188b-261021-0117-r25.c069 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · menu_config.xml r25 содержит экран настроек ftp_server с настройками ftp_server_enabled, ftp_server_anonymous_access, ftp_server_user_name и ftp_server_password. [^177]: fw-tv188b-261021-0117-r25--plugin-loader.c016 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В strings libduneshell.so r25 есть шаблон запроса req %lld/%s->%s(%s.%s); в r24 был req %lld (%s->%s/%s). [^178]: fw-tv188b-261021-0117-r25--plugin-loader.c013 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В strings libduneshell.so r25 шаблоны start и cancelling by timeout используют (%s.%s) вместо (%s) в r24; сообщение [plugin] showing progress dialog сохранено. [^179]: fw-tv188b-261021-0117-r25--plugin-loader.c014 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В strings libduneshell.so r25 шаблоны canceled и finished with status используют (%s.%s) вместо (%s) в r24, сохраняя формат длительности %.3fs. [^180]: fw-tv188b-261021-0117-r25--plugin-loader.c015 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В strings libduneshell.so r25 шаблоны result action, result action null и result status используют (%s.%s) вместо (%s) в r24. [^181]: - fw-tv188b-260827-0003-r24--plugin-loader--php-runtime--opexec.c030 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В r25 (261021_0117_r25) набор сообщений исполнителя операций тот же, добавлены «plugin_opexec I: waiting for mc index validation», «plugin_opexec I: mc index now valid» и «plugin_opexec D: %s: %s» (вместо «still working...»), а сообщения операции получили формат «%s->%s(%s.%s)». - fw-tv188b-260827-0003-r24--plugin-loader--php-runtime--opexec.c044 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в запросе 9 при PLUGIN_OPEXEC = 1 в shell.log шли «plugin_opexec D: new activated req 92/…», «plugin_opexec D: req 93/…: still working...» и «plugin_opexec D: a-removing req 93/…»; сообщений «canceling req» в сохранённом выводе C1 нет. [^182]: fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c032 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В r25 строки форка автопроверки изменились: вместо «fork(grand-child)» и «grand-child process is started with pid %d» — «grand-child process %d» и новое «hd_debug: plugin online upgrade forked with the log held»; остальные строки plugin_updater, plugin online upgrade и plugin_archive те же (кроме исчезнувшей plugin_archive_async_loader) [^183]: - fw-tv188b-260827-0003-r24--plugin-loader--php-runtime.c029 · device · tv188b, android-dune-fw; прошивка 260827_0003_r24 · На tv188b r24 в /tmp/run лежат .log и .pid плагинов с работающим php_server (android_apps, dune-hd.tv, shell_ext); .pid датированы 15:40, логи — 15:40–15:41 - fw-tv188b-260827-0003-r24--plugin-loader--php-runtime.c036 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В r25 php_server содержит путь /tmp/run/%s.pid и импорт FS_writestring, которых нет в strings php_server r24 [^184]: - doc-sdk-dune-devel-info.c001 · doc · any-documented; прошивка — · На ATV и Android 11+ AOSP к путям /config, /tmp, /flashdata, /firmware и /firmware_ext нужно добавлять префикс FS_PREFIX /data/data/com.dunehd.app; в других разделах документации этот префикс может быть опущен, и тогда его добавляют самостоятельно. - fw-tv188b-261021-0117-r25.c254 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в файловых функциях встроенного PHP (php_server и php-cgi) realpath('/config') = /data/data/com.dunehd.app/config, realpath('/firmware') = /system/dunehd/firmware, realpath('/firmware_ext/php') = /system/dunehd/firmware_ext/php, хотя в корне ФС (adb shell) /firmware и /firmware_ext нет, а /config — другой каталог. - fw-tv188b-261021-0117-r25.c255 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 во встроенном PHP (php_server и php-cgi CGI плагина) путь /flashdata существует: is_dir('/flashdata') = true, realpath — /data/data/com.dunehd.app/flashdata, хотя в корне ФС (adb shell) /flashdata нет. [^185]: - doc-sdk-dune-devel-info.c002 · doc · any-documented; прошивка — · В PHP-плагинах и CGI-программах переменная окружения FS_PREFIX равна /data/data/com.dunehd.app на ATV и Android 11+ AOSP и не установлена на остальных платформах. - fw-tv188b-261021-0117-r25.c350 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 команды зонда из php_server (uid 1000) дают FS_PREFIX=/data/data/com.dunehd.app; which wget и command -v wget возвращают /data/data/com.dunehd.app/bin/wget. - fw-tv188b-261021-0117-r25.c092 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 у процесса httpd ($FS_PREFIX/bin/httpd, PPID 1) в окружении HD_HTTP_LOCAL_PORT=80, HD_FW_APK=1, HD_APK=1, FS_PREFIX=/data/data/com.dunehd.app, LOG_DIR=/tmp/run, DUNEHD_SERVICE_DONT_FORK=1, PATH начинается с $FS_PREFIX/firmware/bin:$FS_PREFIX/bin:/bin, а LD_LIBRARY_PATH=$FS_PREFIX/firmware/lib:/lib:/usr/lib (без /system/xbin/dunehd/firmware/lib). - fw-tv188b-260827-0003-r24.c063 · device · tv188b, android-dune-fw; прошивка 260827_0003_r24 · На tv188b r24 в окружении dunehd_service (pid 587) есть FS_PREFIX=/data/data/com.dunehd.app, HD_APK=1, HD_FW_APK=1, HD_HTTP_LOCAL_PORT=80 и DUNEHD_SERVICE_DONT_FORK=1, а PATH начинается с $FS_PREFIX/firmware/bin:$FS_PREFIX/bin:/bin. - fw-tv188b-260827-0003-r24.c021 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Скрипт /system/xbin/dunehd/init монтирует tmpfs в /tmp, запускает dunehd_service и выставляет FS_PREFIX=/data/data/com.dunehd.app, HD_APK=1, HD_FW_APK=1, HD_HTTP_LOCAL_PORT=80 [^186]: - doc-sdk-dune-devel-info.c003 · doc · any-documented; прошивка — · В PHP-плагинах и CGI-программах переменная окружения HD_APK равна 1 на ATV и Android 11+ AOSP и не установлена на остальных платформах. - fw-tv188b-261021-0117-r25.c359 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в окружении php_server плагина kb_probe8 (pid 3005, ppid 2449, uid 1000) HD_APK=1. - fw-tv188b-260827-0003-r24.c063 · device · tv188b, android-dune-fw; прошивка 260827_0003_r24 · На tv188b r24 в окружении dunehd_service (pid 587) есть FS_PREFIX=/data/data/com.dunehd.app, HD_APK=1, HD_FW_APK=1, HD_HTTP_LOCAL_PORT=80 и DUNEHD_SERVICE_DONT_FORK=1, а PATH начинается с $FS_PREFIX/firmware/bin:$FS_PREFIX/bin:/bin. - fw-apk-260724-0207-r24--data-deploy.c034 · code · android-atv; прошивка 260724_0207_r24 · runDaemonProcess задаёт HD_APK=1; переменной HD_FW_APK среди его строк нет (const-string метода: LOG_DIR, HD_APK, HD_HTTP_LOCAL_PORT, FS_PREFIX, PATH, LD_LIBRARY_PATH, HOME, PWD, /tmp/run и пути) [^187]: - doc-sdk-dune-devel-info.c004 · doc · any-documented; прошивка — · В PHP-плагинах и CGI-программах переменная окружения HD_FW_APK равна 1 на Android 11+ AOSP (в тексте — «Anroid 11+ AOSP») и не установлена на остальных платформах. - fw-tv188b-261021-0117-r25.c360 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в окружении php_server плагина kb_probe8 (pid 3005, ppid 2449, uid 1000) HD_FW_APK=1. - fw-tv188b-260827-0003-r24.c063 · device · tv188b, android-dune-fw; прошивка 260827_0003_r24 · На tv188b r24 в окружении dunehd_service (pid 587) есть FS_PREFIX=/data/data/com.dunehd.app, HD_APK=1, HD_FW_APK=1, HD_HTTP_LOCAL_PORT=80 и DUNEHD_SERVICE_DONT_FORK=1, а PATH начинается с $FS_PREFIX/firmware/bin:$FS_PREFIX/bin:/bin. - fw-apk-260724-0207-r24--data-deploy.c034 · code · android-atv; прошивка 260724_0207_r24 · runDaemonProcess задаёт HD_APK=1; переменной HD_FW_APK среди его строк нет (const-string метода: LOG_DIR, HD_APK, HD_HTTP_LOCAL_PORT, FS_PREFIX, PATH, LD_LIBRARY_PATH, HOME, PWD, /tmp/run и пути) [^188]: - doc-sdk-dune-devel-info.c005 · doc · any-documented; прошивка — · В PHP-плагинах и CGI-программах переменная окружения HD_HTTP_LOCAL_PORT равна 11080 на ATV; на остальных платформах она пустая (старые версии прошивки) или равна 80 (новые версии прошивки). - fw-tv188b-261021-0117-r25.c361 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в окружении php_server плагина kb_probe8 (pid 3005, ppid 2449, uid 1000) HD_HTTP_LOCAL_PORT=80. - fw-tv188b-260827-0003-r24.c063 · device · tv188b, android-dune-fw; прошивка 260827_0003_r24 · На tv188b r24 в окружении dunehd_service (pid 587) есть FS_PREFIX=/data/data/com.dunehd.app, HD_APK=1, HD_FW_APK=1, HD_HTTP_LOCAL_PORT=80 и DUNEHD_SERVICE_DONT_FORK=1, а PATH начинается с $FS_PREFIX/firmware/bin:$FS_PREFIX/bin:/bin. - fw-apk-260724-0207-r24--data-deploy.c033 · code · android-atv; прошивка 260724_0207_r24 · runDaemonProcess задаёт HD_HTTP_LOCAL_PORT=11080 (константа HDConfig.HD_HTTP_LOCAL_PORT, подставлена в байткод как const/16 11080) [^189]: - doc-sdk-dune-devel-info.c006 · doc · any-documented; прошивка — · PHP-движок сам добавляет FS_PREFIX ко всем нужным путям, кроме команд, переданных аргументами в shell_exec() и system(); поэтому старый код PHP-плагина может полностью работать на новых платформах без изменений. - fw-tv188b-261021-0117-r25.c253 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 встроенный PHP (php_server и php-cgi CGI) в команде shell_exec добавляет $FS_PREFIX (/data/data/com.dunehd.app) к словам /tmp/…, /firmware/…, /config/…, /flashdata/… и к пути в одинарных кавычках ('/tmp/h'), но не к /etc/…, не к x/tmp/f и не к пути в двойных кавычках ("/tmp/g"). [^190]: - doc-sdk-dune-devel-info.c007 · doc · any-documented; прошивка — · На Android 11+ AOSP каталог /tmp доступен и как $FS_PREFIX/tmp, и как /tmp. - fw-tv188b-261021-0117-r25.c291 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 tmp_dir_path у kb_probe5 = '/data/data/com.dunehd.app/tmp/plugins/kb_probe5' — путь /tmp/plugins/kb_probe5 с префиксом FS_PREFIX=/data/data/com.dunehd.app; is_dir() для него true. - fw-tv188b-261021-0117-r25.c329 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 php_server при старте пишет «Starting logging to '/data/data/com.dunehd.app/tmp/run/<плагин>.log' (<= 3072000)»; в окружении php_server LOG_DIR=/tmp/run и LOG_MAX_FILE_SIZE=3072000. [^191]: - doc-sdk-dune-devel-info.c008 · doc · any-documented; прошивка — · На последних ATV и Android 11+ AOSP процесс главного GUI Dune HD называется com.dunehd.app, а не com.dunehd.shell. - fw-tv188b-260827-0003-r24.c062 · device · tv188b, android-dune-fw; прошивка 260827_0003_r24 · На tv188b r24 com.dunehd.app (pid 25631), его процесс :bg (pid 1590) и com.dunehd.systemui (pid 4952) работают от пользователя system с SELinux-меткой u:r:system_app:s0; userId пакета com.dunehd.app — 1000 (sharedUser android.uid.system/1000). - fw-tv188b-261021-0117-r25.c298 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На снимках tv188b r25 (collect4 и начало collect6, до установки зондов) работают три php_server — shell_ext, dune-hd.tv (программа /flashdata/plugins/dune-hd.tv/i24h.php) и android_apps; все — дочерние процессы com.dunehd.app с Uid 1000. [^192]: - doc-sdk-dune-devel-info.c009 · doc · any-documented; прошивка — · Если плагин содержит исполняемые shell-скрипты, их нельзя запускать напрямую: их нужно вызывать через sh или bash (пример «bash /path/to/script»). - fw-tv188b-261021-0117-r25.c080 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 global_action plugin_system с run_string «bin/ga.sh boot» (путь относительно каталога плагина) оболочка исполняет как «Running system(sh /data/data/com.dunehd.app/flashdata/plugins/kb_probe5/bin/ga.sh boot)» — с префиксом sh и абсолютным путём каталога плагина. - fw-tv188b-260827-0003-r24--http-api.c008 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · CGI-скрипт плагина запускается run_plugin_cgi как shell-скрипт (sh), а не напрямую: PHP-обработчик плагин должен вызвать сам - fw-apk-260724-0207-r24--data-deploy--php-fs-prefix.c012 · code · android-atv; прошивка 260724_0207_r24 · Если команда начинается с $FS_PREFIX или с пути, для которого _php_path_needs_prefix.part.0 не 0, и этот путь (после префикса) не начинается с /firmware/bin/ или /firmware_ext/php/, _php_add_fs_prefix_to_cmd начинает результат со строки «sh » (3 байта) [^193]: - plg-gh-kocourkuba-proiptv.c027 · code · unknown; прошивка — · Плагин сравнивает ревизию прошивки числом rev_number: is_r22_or_higher() — rev_number > 21, is_r24_or_higher() — > 22, is_r25_or_higher() — > 24 (при неразобранной версии rev_number=0). - plg-gh-kocourkuba-proiptv.c032 · code · unknown; прошивка — · Starnet_Entry_Handler при rev_number ≤ 21 (не is_r22_or_higher) показывает диалог err_too_old_player, а без класса SQLite3 — err_no_sqlite, и дальше не обрабатывает вход (кроме confirm_update, который проверяется раньше). [^194]: plg-gh-kocourkuba-proiptv.c036 · code · unknown; прошивка — · get_ffmpeg_path() при is_r25_or_higher() и наличии $FS_PREFIX/firmware/bin/ffmpeg использует его, иначе — свою сборку bin/ffmpeg-7.1.3 (для bin/media_check.sh); комментарий: «Firmware r25 and newer ships its own ffmpeg 7.1». [^195]: plg-gh-kocourkuba-proiptv.c029 · code · unknown; прошивка — · Вне APK get_platform_info() читает $FS_PREFIX/tmp/run/versions.txt как ini: нет файла или platform_kind не 'android' — платформа 'unsupported'; иначе platform=platform_kind, type=android_platform. [^196]: plg-gh-kocourkuba-proiptv.c028 · code · unknown; прошивка — · Плагин определяет оболочку-APK по переменным окружения: is_apk() — (bool)getenv('HD_APK'), is_fw_apk() — (bool)getenv('HD_FW_APK'), is_limited_apk() — is_apk() && !is_fw_apk(); is_android() — is_file('/system/dunehd/init'). [^197]: fw-tv188b-261021-0117-r25.c359 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в окружении php_server плагина kb_probe8 (pid 3005, ppid 2449, uid 1000) HD_APK=1. [^198]: plg-gh-kocourkuba-proiptv.c081 · code · unknown; прошивка — · В get_platform_info() при is_null($platform) (static-кэш пуст) и истинном is_apk() — это первая ветвь, до else if (!is_dune()) и else — platform='android'; внутри неё type='fw_apk' при истинном is_fw_apk(), иначе type='apk'; versions.txt эта ветвь не читает (parse_ini_file — в ветви else). [^199]: - plg-gh-kocourkuba-proiptv.c022 · code · android-dune-fw; прошивка 250815_1012_r22 · php_r22/dune_api.php и php_r22/dune_plugin_fw.php побайтно совпадают с dune_api.php и dune_plugin_fw.php прошивки tv188b 250815_1012_r22 (одинаковые sha256 в tree.tsv); копии php_apk_r22/ этих файлов — те же. - plg-gh-kocourkuba-proiptv.c023 · code · android-dune-fw; прошивка 260827_0003_r24, 260724_0207_r24 (APK), 261021_0117_r25 · php_r24/dune_api.php, php_r24/dune_plugin_fw.php и php_r24/include/dunelib/{config_utils,utils}.php побайтно совпадают с одноимёнными файлами прошивки tv188b 260827_0003_r24 и APK 260724_0207_r24 (одинаковые sha256 в tree.tsv); с r25 (261021_0117) dune_api.php и dune_plugin_fw.php уже не совпадают. [^200]: plg-dc-globaltv--lib.c001 · code · android-dune-fw; прошивка 260827_0003_r24 · В копиях lib Global TV 260130_1351 и shell_ext/lib tv188b r24 побайтово тождественна группа поддержки архивов: archive.php, archive_cache.php. [^201]: - plg-dc-globaltv--lib.c070 · code · android-dune-fw; прошивка 260827_0003_r24 · В ActionFactory::show_error плагина поля stop_playback/retry_delay_ms добавляются при defined(stop_playback), а r24 записывает их без проверки defined. - plg-dc-globaltv--lib.c071 · code · android-dune-fw; прошивка 260827_0003_r24 · В ActionFactory::show_dialog плагина max_height добавляется при defined, а r24 записывает это поле без проверки. [^202]: plg-dc-dune-backup.c133 · code · unknown; прошивка — · Блок цветных кнопок A/B/C/D в popup_menu добавляется, только если не flag_apk, не flag_new и intval(firmware_version) < 240619; иначе пункты не показываются. [^203]: doc-sdk-plugins.c042 · doc · any-documented; прошивка — · По SDK тайм-аут операций плагина по умолчанию составляет 10 секунд; operation_timeout задаёт общий () и потиповой (N) тайм-аут. [^204]: fw-tv188b-261021-0117-r25.c309 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 операция handle_user_input PHP-плагина без operation_timeout в манифесте (kb_probe5, kb_probe6; ENTER на точке входа с plugin_handle_user_input) стартует с тайм-аутом 60 с: в shell.log «…->handle_user_input(…): start (timeout=60.0s)». [^205]: doc-sdk-plugins--gui-actions.c042 · doc · any-documented; прошивка — · PluginHandleUserInputAction не имеет данных; выполняет операцию Handle_user_input(GuiAction::$params) и возвращает её результат как post action [^206]: doc-sdk-plugins.c137 · doc · android; прошивка — · Текст документа буквально говорит: при установке на Android содержимое .platform.android удаляется, а содержимое .platform.87xx переносится в корень [^207]: - fw-tv188b-261021-0117-r25.c214 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 штатный установщик ZIP применил к корню плагина сначала .platform.android (скопировал only_android.txt и bin/marker.txt в корень), затем поверх — .platform.android-arm-api19 (bin/marker.txt перезаписан); в установленном плагине bin/marker.txt = «.platform.android-arm-api19» и есть only_android.txt. В shell.log — «[plugin_installer] applying /tmp/plugin_tmp/.platform.». - fw-tv188b-261021-0117-r25.c215 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 штатный установщик ZIP не применил .platform.87xx и .platform.foo и удалил все четыре каталога .platform.* (android-arm-api19, 87xx, android, foo: «[plugin_installer] removing /tmp/plugin_tmp/.platform.») до копирования; в установленном плагине нет ни каталогов .platform.*, ни only_87xx.txt. [^208]: fw-tv188b-260827-0003-r24--http-api--ext-command-params.c040 · doc · any-documented; прошивка — · В описании IP Control указано, что протокол 4 добавил cmd=open_path&url=URL для открытия папки, раздела меню или запуска пункта по root://…; приведён пример root://applications/RadioTime. [^209]: fw-tv188b-260827-0003-r24--http-api--ext-command-params.c093 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 cmd=open_path&url=root://applications/<подпись пункта> отвечает command_status=ok, но точку входа плагина не запускает (вызовов 0 → 0), а launch_media_url с plugin_launcher://{name=<плагин>} {ep_media_url=} её запускает (0 → 1). [^210]: fw-tv188b-261021-0117-r25.c170 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 запрос /cgi-bin/do?cmd=kb_probe5_ping&plugin=kb_probe5 не запустил www/cgi-bin/run.php плагина: файл /tmp/kb_probe5/run_php.txt, который run.php пишет при каждом запуске, не появился, а в shell.log после запроса нет строк handle_extcmd, kb_probe5, run.php, php-cgi и «headers missing». [^211]: fw-tv188b-261021-0117-r25.c203 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 каталоги плагинов, положенные adb push в /data/data/com.dunehd.app/flashdata/plugins, не подхватились перечитыванием по IP Control (cmd=main_screen, затем cmd=ir_code&ir_code=B24DBF00; обе команды ответили command_status ok): в shell.log после них нет ни строк kb_probe5, ни «Loading plugins from», ни populate_plugins, а kb_probe5 нет в /tmp/run/installed_plugins.xml. kb_probe5 и kb_probe5_sup зарегистрировались после am force-stop com.dunehd.app. [^212]: doc-sdk-plugins.c140 · doc · android; прошивка — · В SDK для Android приведены команды развёртывания плагина: adb push в /flashdata/plugins/ и chmod -R +x для bin и www/cgi-bin внутри каталога плагина. [^213]: fw-tv188b-261021-0117-r25.c207 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в корне ФС каталога /flashdata нет, а оболочка в shell.log называет каталог плагинов /flashdata/plugins («Loading plugins from '/flashdata/plugins'», «invalid plugin manifest from '/flashdata/plugins/kb_probe5_badname/dune_plugin.xml'», «copying recursively '/tmp/plugin_tmp' to '/flashdata/plugins/kb_probe5_plat'»); файлы этих плагинов лежат в /data/data/com.dunehd.app/flashdata/plugins. [^214]: doc-sdk-plugins--gui-actions.c017 · doc · any-documented; прошивка — · С прошивки 150529 событие GUI_EVENT_PLAYBACK_GOING_TO_SWITCH генерируется перед переключением на новый media URL; в отличие от GUI_EVENT_PLAYBACK_STOP, оно не генерируется при остановке и выключении [^215]: - 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. - doc-sdk-plugins--operations.c107 · doc · any-documented; прошивка — · PluginVodInfo::buffering_ms (предбуферизация в мс) не реализован [^216]: fw-tv188b-261021-0117-r25.c287 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 при старте VOD зонда kb_probe6 с PluginVodInfo::buffering_ms=3000 оболочка пишет в shell.log «[player] setting buffering to 3000ms» и «[player] DEBUG: using special buffering 3000ms». [^217]: 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. [^218]: fw-tv188b-261021-0117-r25.c190 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 shell_ext/bin/media_check вызывает /firmware/scripts/ffmpeg.sh, а такого файла на устройстве нет: «media_check: line 27: /firmware/scripts/ffmpeg.sh: No such file or directory», «ffmpeg finished with status 1». [^219]: fw-tv188b-261021-0117-r25.c368 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24, 261021_0117_r25 · В образах r24 и r25 есть text-файл system/system/dunehd/firmware/scripts/ffmpeg.sh размером 457 байт с sha256 b26df76585300fd394662fbd02cdb3555cb0b1fd8a9859e5a7d0e876eef867df; в обеих версиях он одинаков. [^220]: fw-tv188b-261021-0117-r25.c369 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24, 261021_0117_r25 · В образах r24 и r25 system/system/dunehd/firmware/bin/ffmpeg — симлинк на /data/data/com.dunehd.app/lib/libxxx_ffmpeg.so. [^221]: fw-tv188b-261021-0117-r25.c254 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в файловых функциях встроенного PHP (php_server и php-cgi) realpath('/config') = /data/data/com.dunehd.app/config, realpath('/firmware') = /system/dunehd/firmware, realpath('/firmware_ext/php') = /system/dunehd/firmware_ext/php, хотя в корне ФС (adb shell) /firmware и /firmware_ext нет, а /config — другой каталог. [^222]: fw-tv188b-261021-0117-r25--builtin-plugins-misc.c048 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 прямой запуск $P/firmware/bin/ffmpeg -version с LD_LIBRARY_PATH=$P/lib:/system/dunehd/firmware/lib из adb shell вывел ffmpeg version 7.1.3; путь ffmpeg — ссылка на $P/lib/libxxx_ffmpeg.so. [^223]: fw-tv188b-261021-0117-r25--builtin-plugins-misc.c047 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 запуск sh $P/firmware/scripts/ffmpeg.sh -version из adb shell напечатал ffmpeg not found. [^224]: - fw-tv188b-260827-0003-r24--php-framework.c041 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · ConfigUtils::load_product_and_fw() читает /tmp/run/versions.txt (key=value: firmware_version, product, platform_kind, android_platform); для fw_apk android_platform берётся из /firmware/config/fw_apk_platform.txt - fw-tv188b-261021-0117-r25.c364 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В r25 config_utils.php::load_product_and_fw() читает android_platform из /tmp/run/versions.txt, но при истинном HD::is_fw_apk() (getenv('HD_FW_APK'); у php_server r25 на tv188b = 1) перезаписывает его содержимым файла /firmware/config/fw_apk_platform.txt. [^225]: fw-tv175u-260724-0207-r24.c022 · code · tv175u, android; прошивка 260724_0207_r24 · Скрипт /system/dunehd/init пишет /tmp/run/versions.txt: product (из product_id.txt), firmware_version, platform_kind=android и android_platform (из android_platform.txt) [^226]: doc-sdk-dune-devel-info.c008 · doc · any-documented; прошивка — · На последних ATV и Android 11+ AOSP процесс главного GUI Dune HD называется com.dunehd.app, а не com.dunehd.shell. [^227]: doc-sdk-plugins.c141 · doc · sigma-smp86xx, sigma-smp87xx, android; прошивка — · Перезапуск процесса оболочки (перезагрузка всех плагинов): на Sigma — killall shell, на Android — killall com.dunehd.shell [^228]: fw-tv188b-260827-0003-r24.c062 · device · tv188b, android-dune-fw; прошивка 260827_0003_r24 · На tv188b r24 com.dunehd.app (pid 25631), его процесс :bg (pid 1590) и com.dunehd.systemui (pid 4952) работают от пользователя system с SELinux-меткой u:r:system_app:s0; userId пакета com.dunehd.app — 1000 (sharedUser android.uid.system/1000). [^229]: fw-tv188b-261021-0117-r25--app-launch.c020 · code · tv188b, android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 260724_0207_r24 · Главная activity оболочки com.dunehd.shell.MainActivity наследует android.app.NativeActivity и объявлена с android:launchMode="3" в dune.apk tv188b r25, r24 и в APK DMC. [^230]: fw-tv188b-261021-0117-r25.c233 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 после am force-stop com.dunehd.app новый процесс приложения заново регистрирует плагины: в shell.log 35 строк «Plugin '

' of type '' is registered», в том числе для kb_probe6 и kb_probe6_sup, положенных adb push перед этим. [^231]: doc-sdk-dune-devel-info.c006 · doc · any-documented; прошивка — · PHP-движок сам добавляет FS_PREFIX ко всем нужным путям, кроме команд, переданных аргументами в shell_exec() и system(); поэтому старый код PHP-плагина может полностью работать на новых платформах без изменений. [^232]: fw-apk-260724-0207-r24--data-deploy--php-fs-prefix.c008 · code · android-atv; прошивка 260724_0207_r24 · _php_add_fs_prefix_to_cmd вызывают php_exec, zif_shell_exec, zif_popen, zif_proc_open и virtual_popen (перекрёстные ссылки radare2 в листинге) [^233]: fw-tv188b-260827-0003-r24.c035 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Встроенный плагин shell_ext несёт собственные ELF curl и php-cgi в shell_ext/bin/ [^234]: - fw-tv188b-261021-0117-r25.c378 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 6 php_server плагина kb_probe6 (отчёт curl_multi ctx=php_server, 15:08:30), задавший URL через curl_init($u), обратился к http://localhost/cgi-bin/plugins/kb_probe6/ping.sh?via=localhost — CGI получил HTTP_HOST=localhost; запрос к http://127.0.0.1:80/cgi-bin/plugins/kb_probe6/ping.sh?via=127.0.0.1 пришёл с HTTP_HOST=127.0.0.1. - fw-tv188b-261021-0117-r25.c380 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Зонд запроса 6 (kbp6_curl_multi_report) задаёт URL каждого запроса curl_multi через curl_init($u), а не через curl_setopt(CURLOPT_URL); функцию вызывают CGI cm.php (ctx cgi) и main.php php_server (ctx php_server). [^235]: fw-tv188b-260827-0003-r24--plugin-loader--php-runtime.c041 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 запрос из php_server функцией file_get_contents к http://localhost/cgi-bin/plugins/

/… приходит в httpd с HTTP_HOST=127.0.0.1, а curl к тому же URL — с HTTP_HOST=localhost: localhost заменяется на 127.0.0.1 в потоковой обёртке http, но не в curl. [^236]: - fw-tv188b-261021-0117-r25--libphp5--curl-http.c023 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 curl_setopt(CURLOPT_URL,http://localhost/cgi-bin/plugins/kb_probe11/host.sh) из php_server привёл к CGI HTTP_HOST=127.0.0.1 и пустой curl_error. - fw-tv188b-261021-0117-r25--libphp5--curl-http.c032 · code · android-dune-fw; прошивка 261021_0117_r25 · В r25 _php_do_add_fs_prefix_to_http при заданной HD_HTTP_LOCAL_PORT заменяет префикс URL http://localhost/cgi-bin/plugins/ на http://127.0.0.1:/cgi-bin/plugins/, сохраняя хвост URL. [^237]: fw-tv188b-261021-0117-r25--shell-ext--movies.c060 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В strings libxxx_movie_indexer.so r25 есть /config/lcreg.txt, %s/config/lcreg_pairs.txt, «D: lcreg map '%s' (%d) -> '%s' (%d)», «D: using lcreg_kind %d», путь common/mt/lcreg.c и следом перечень пар хостов dune-hd.com / r2.dune-hd.com, …, dunemdb.dune-hd.com / r2.dunemdb.dune-hd.com, dunemdb-02.dune-hd.com / r2.dunemdb-02.dune-hd.com. [^238]: fw-tv188b-261021-0117-r25--shell-ext--movies.c061 · inference · tv188b, android-dune-fw; прошивка 261021_0117_r25 · lcreg (common/mt/lcreg.c, общий для нативных библиотек) подменяет хосты Dune HD их парой r2.<хост> (в том числе dunemdb.dune-hd.com → r2.dunemdb.dune-hd.com) по настройке /config/lcreg.txt и lcreg_pairs.txt. [^239]: fw-tv188b-261021-0117-r25.c018 · inference · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Действие fs_ctl, по-видимому, нельзя задать в XML (dune_plugin.xml), только в JSON-ответе PHP-плагина [^240]: fw-tv188b-261021-0117-r25.c020 · inference · tv188b, android-dune-fw; прошивка 261021_0117_r25 · PluginSystemActionData::handle_response=yes, вероятно, заставляет оболочку после завершения run_string проверить /restart_needed_flag и перезапустить GUI; для команды в фоне (с «&») флаг игнорируется [^241]: fw-tv188b-261021-0117-r25.c042 · inference · tv188b, android-dune-fw; прошивка 261021_0117_r25 · smart_dirty=yes, вероятно, переводит обновление EPF плагина на флаги: плагин пишет маску в /tmp/ui/dirty/<плагин>_epfs, а оболочка по ней и type_mask EPF выбирает срочность update_epfs — ASAP или отложенную очередь; непересечение масок не отменяет постановку в очередь, type_mask=0 сохраняет ASAP [^242]: fw-tv188b-261021-0117-r25--php-framework.c023 · inference · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Вероятно, cond вычисляет булев pattern и использует его результат как условие видимости entry_point downloads. [^243]: fw-tv188b-261021-0117-r25--php-framework.c044 · inference · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Вероятно, PLUGIN_ROW_OPT_LOADING помечает строку для последующей подгрузки через get_folder_rows; точные триггеры, порядок и повтор нативных запросов из PHP/strings не следуют. [^244]: plg-gh-kocourkuba-proiptv.c021 · inference · unknown; прошивка — · Вероятно, php_r22/, php_r24/ и php_apk_r22/ — эталонные копии PHP-фреймворка прошивок для локальной отладки: разработчик копирует нужную в ./php (она в .gitignore), а plugin_test_env.php подключает её; в пакет плагина они не входят (пакет собирается только из dune_plugin/), и на устройстве плагин ветку не выбирает — работает с фреймворком самой прошивки. [^245]: plg-gh-kocourkuba-proiptv.c034 · inference · unknown; прошивка — · Вероятно, прошивка r24 трактует возвращённое из confirm_update значение false как отказ от обновления плагина. [^246]: fw-tv188b-261021-0117-r25--php-framework.c035 · inference · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Вероятно, apply_hash_dirties заставляет нативную оболочку обработать записи HashDirties после изменения hash-привязок; формат результата действия и момент очистки файла не установлены. [^247]: fw-tv188b-261021-0117-r25--java-player--native-vod-bridge.c030 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 на 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. [^248]: - fw-tv188b-261021-0117-r25--java-player--native-vod-bridge.c023 · inference · android-dune-fw; прошивка 261021_0117_r25 · Предполагается, что заголовки потока задаются и из ответа get_vod_stream_url: вернуть URL с суффиксом |||dune_params|||engine:1,http_headers: при playback_url серии без этого суффикса. Код (разбор stream URL, ответ PHP как stream URL) это допускает. - fw-tv188b-261021-0117-r25--java-player--native-vod-bridge.c030 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 на 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. [^249]: fw-tv188b-261021-0117-r25--app-launch.c040 · inference, disputed · tv188b, android-dune-fw; прошивка 261021_0117_r25, 260827_0003_r24 · Гипотеза для плагинов на tv188b — cmd «/system/dunehd/dunehd_service do am start …» в launch_ext_app уходит в shell, то есть в системный am от имени демона dunehd_service (root), где есть --user и прочие опции, которых нет в IntentBuilder, и нет ограничения exported. [^250]: - fw-tv188b-260827-0003-r24--plugin-loader.c039 · inference, disputed · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Строки r24 (libduneshell.so:5986-6004, libxxx_do.so:281-285) предполагают перенаправление внешней команды ext_command с параметром plugin плагину: readlink /tmp/www/cgi-bin/plugins/, chdir, запуск /firmware_ext/php/php-cgi с SCRIPT_FILENAME=<…>/run.php, php.ini и переменными REQUEST_METHOD, QUERY_STRING, EXTCMD_ORIG_COMMAND_NAME; условие ветки не установлено. - fw-tv188b-260827-0003-r24--http-api.c041 · inference, disputed · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Команду /cgi-bin/do, адресованную плагину, код ext_command (в CGI do — libxxx_do.so — и в libduneshell.so), вероятно, исполняет так: readlink /tmp/www/cgi-bin/plugins/<плагин> и chdir, затем execv php-cgi со SCRIPT_FILENAME=<…>/run.php (вероятно, от цели readlink), php.ini (каталог не установлен) и переменными REQUEST_METHOD, QUERY_STRING, EXTCMD_ORIG_COMMAND_NAME [^251]: 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» и не является исчерпывающим. [^252]: doc-sdk-plugins.c142 · doc, disputed · any-documented; прошивка — · Перечитать плагины без перезапуска оболочки: в верхнем меню нажать ANGLE/ROTATE (или Refresh в POP UP MENU) либо по IP Control: cmd=main_screen, затем cmd=ir_code&ir_code=B24DBF00 [^253]: fw-tv188b-260827-0003-r24.c070 · inference · tv188b, android-dune-fw; прошивка 260827_0003_r24 · На tv188b r24 окружение php_server отдельно не снято: сбор `24-environ` выбирал процессы по `pgrep -f dunehd`, а в argv php_server строки dunehd нет; при этом окружение родителя com.dunehd.app не содержит FS_PREFIX, HD_APK, HD_FW_APK, LOG_DIR, TMPDIR и PHP_PROC_OPEN_SH, поэтому наличие этих переменных у php_server на r24 не установлено. [^254]: fw-apk-260724-0207-r24--data-deploy--php-fs-prefix.c009 · inference · android-atv; прошивка 260724_0207_r24 · Вероятно, подстановке FS_PREFIX в командах подвержены PHP-функции exec, system и passthru (через php_exec), shell_exec (и оператор `…`), popen и proc_open [^255]: fw-tv188b-261021-0117-r25--libphp5--curl-http.c035 · inference · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Наблюдение запроса 11 (curl_setopt(CURLOPT_URL) с http://localhost/cgi-bin/plugins/…, HD_HTTP_LOCAL_PORT=80 → HTTP_HOST=127.0.0.1, REQUEST_URI сохранён) согласуется с заменой префикса localhost по c032; порт в ответе CGI не виден (SERVER_PORT пуст), поэтому подстановку именно порта оно не подтверждает. # Публикация плагина: пакет, подпись, каналы распространения, новая версия > Редакция 2026-11-02. Путь разработчика плагина Dune HD от готового кода до установки у пользователя на прошивках > r24 и r25: что собрать, нужна ли подпись, какими каналами доставить, как выпустить новую версию и почему установка или > обновление не срабатывают. Источники и их вес: > > - наблюдения на tv188b `261021_0117_r25` (`device`, тестовые плагины `kb_probe*`) — самое сильное, но одна прошивка; > - код tv188b `260827_0003_r24` (`code`: строки `libduneshell.so`, PHP встроенных плагинов) и tv188b `261021_0117_r25` > (`code`: PHP `dunestore`); > - код APK DMC `260724_0207_r24` (`code`, класс `android-atv`): листингов `.so` tv188b по этой теме нет, поэтому на tv188b > этот код не переносится; > - пакеты и дескрипторы обновлений сторонних плагинов (`code`, прошивка исполнения в большинстве не установлена); > - SDK (`doc`): факт только из SDK помечен «по SDK, на r24+ не подтверждено»; > - сообщения форумов (`forum`) помечены «по сообщениям пользователей». > > Каждое фактическое предложение ссылается на claim id. > > Рядом: формат пакета, установка и каталоги — «Пакет плагина»; механика онлайн-обновления — > «Онлайн-обновление плагина»; приёмы сборки и обновления в плагинах — > «Приёмы разработки плагинов Dune HD» и > §12 там же; сводка по прошивкам — > «Матрица совместимости возможностей плагина». ## Коротко: вопрос → ответ | Вопрос | Ответ | Где | |---|---|---| | Что выпускать? | для первой установки ZIP с `dune_plugin.xml` в корне (SDK)[^1], для онлайн-обновления `.tar.gz` с тем же содержимым (SDK)[^2] | §2.1 | | Нужна ли подпись на r24/r25? | на tv188b r25 (`device`, два зонда) ZIP без `dune_plugin.sign` и `dune_plugin_signer_id.txt` установился штатно и зарегистрирован (устройство r25)[^3]; общая политика и механизм подписи этим не установлены; в строках r24 есть отказы неподписанным (код r24)[^4], а срабатывают ли они — §6; по коду tv188b r25 `populate_plugins` проверяет подпись только при `strict_verify_needed` в `` манифеста (код r25)[^5], а в режиме `signed` проверка отдельная (код r25)[^6] | §2.2 | | Ставить ли в свой манифест `strict_verify_needed`? | без подписи — не ставить: на tv188b r25 (`device`, запрос 13, один прогон) зонд с этим флагом и без `dune_plugin_signer_id.txt` не зарегистрирован (устройство r25)[^7], а зонд без флага с испорченным `dune_plugin.sign` зарегистрирован и работал (устройство r25)[^8] | §2.2, §2.13 | | Чем подписывать? | по SDK, на r24+ не подтверждено: DSA-ключ 2048 и `plugin_sign.x86`, публичный ключ — в кастомной прошивке (SDK)[^9]; по коду r25 ключ `com.dune-hd` встроен в `libduneshell.so`, а другой signer ID принимается, только если равен customer ID, с ключом `plugin_key.pem` (код r25)[^10] | §2.3 | | Что проверяет прошивка? | по SDK, на r24+ не подтверждено: подпись и допустимость signer ID (SDK)[^11]; строки r24: `[plugin_signer]`, DSA, `plugin_key.pem` (код r24)[^12]; код r25: `dune_plugin_signer_id.txt` (код r25)[^13], список допустимых signer ID (код r25)[^14], `dune_plugin.sign` (код r25)[^15], SHA-дайджест файлов каталога (код r25)[^16] и DSA (код r25)[^10] | §2.2, §3.3 | | Как кастомная прошивка ограничивает плагины? | по SDK, на r24+ не подтверждено: `external_plugins_enabled`, `allowed_plugin_signer_ids` и `plugin_config.xml` (SDK)[^17]; код r25 читает первые два: `signed` — 1, `none` — 2, иначе 0 (код r25)[^18], `none` пропускает загрузку из `/flashdata/plugins` и `/tmp/mnt/D/dune_plugins` (код r25)[^19], `signed` — отдельная проверка с `.bad_signature` (код r25)[^6], список signer ID — в `ro_config+0x1f0` (код r25)[^20]; что искали на tv188b r25 — §2.2 (устройство r25)[^21] | §2.2, §2.3, §3.3 | | Как поставить с накопителя? | r25, `device`: запуск ZIP в файловом браузере плеера (устройство r25)[^22] | §2.5 | | Как поставить по ссылке? | из плагина — `launch_media_url` с `plugin_installer://…` (код r25)[^23]; на tv188b r25 (`device`) форма `schema=zip` сработала по IP Control (устройство r25)[^24] | §2.6 | | Как попасть в Dune Store? | формат элемента и источники известны из кода r25 (код r25)[^25]; порядок приёма в каталог — §6; по SDK, на r24+ не подтверждено: кастомную конфигурацию Dune Store включают файлом `dsconfig.xml` в кастомной прошивке (SDK)[^26] | §2.7, §3.5 | | Как выпустить новую версию? | поднять `version_index`, выложить пакет и обновить дескриптор по `check_update/url` (SDK)[^27] | §2.9, §2.10 | | Когда пользователь получит обновление? | r25, `device`: при запуске точки входа (SDK)[^28], в том числе по IP Control (устройство r25)[^29], не раньше срока из `next_check_update_timeout` (устройство r25)[^30] | §2.12, «Онлайн-обновление плагина» | | Годится ли `adb push` для пользователей? | на r25 `install` при нём не выполняется (устройство r25)[^31], а сам он идёт под adb root (устройство r25)[^32] | §2.8 | ## 1. Как плагин доходит до пользователя Публикация связывает три вещи: пакет с кодом, канал доставки и дескриптор, по которому оболочка узнаёт о новой версии. Первая установка и обновление идут разными путями, но заканчиваются в одном месте. Первая установка — это пакет, который запускает пользователь (SDK)[^1] или другой плагин (код r25)[^23]. На tv188b r25 (`device`) штатный установщик распаковывает архив во временный каталог и копирует его в `/flashdata/plugins/

`, удалив прежний (устройство r25)[^33]. Фактически плагин лежит в `/data/data/com.dunehd.app/flashdata/plugins/

` (устройство r25)[^22]. Затем оболочка регистрирует плагин в том же процессе, без перезапуска приложения (устройство r25)[^34]. Проверку обновления запускает сама оболочка при запуске точки входа (SDK)[^28], а доступным обновление считается по `version_index` в дескрипторе на сервере (код APK r24, `schema` 1) (код r24)[^35]. На r25 (`device`) пакет скачивается по `url` из `update_info` и ставится через временный каталог `/tmp/plugin_tmp` (устройство r25)[^36]. Поэтому `check_update` нужно закладывать уже в первый выпуск: без `url` проверка отключается (код r24)[^37], и установленная копия не получит следующие версии. Подпись — отдельный слой поверх пакета, два дополнительных файла в нём (SDK)[^38]. Плагин идентифицируют `name` и `version_index`: на r25 `name` обязан совпасть с именем каталога (устройство r25)[^39], а версия новее только при большем `version_index` (код APK r24, `schema` 1) (код r24)[^35]. ## 2. Задачи ### 2.1. Собрать установочный ZIP и пакет обновления `.tar.gz` Выпуск плагина для r24/r25 — это обычно два архива одного каталога (SDK)[^40]. Установочный архив — ZIP с `dune_plugin.xml` на верхнем уровне (SDK)[^1], файл называют `dune_plugin*.zip` (SDK)[^41]. Пакет обновления — `.tar.gz` с тем же содержимым; в `update_info` указывают его `md5` и `size` — место после установки (`du -sk` × 1024) (SDK)[^2]. На tv188b r24 установщик скачивает пакет как `tgz` или `zip` и сверяет `md5` (код r24)[^42]. Состав каталога — «Пакет плагина». Права файлов в двух архивах на r25 (`device`) ведут себя по-разному (устройство r25)[^43]. При установке ZIP на r25 (`device`) файл в `bin/` с правами `-rw-r--r--` получил `-rwxr-xr-x`, а файлы в корне остались `-rw-r--r--` (устройство r25)[^44]. В запросе 11 на tv188b r25 штатная установка изменила mode файлов `bin/ga.sh` и `www/cgi-bin/ping.sh` с 644 в ZIP на 755 в каталоге плагина (устройство r25)[^45]. При обновлении из `tgz` на r25 (`device`) файлы оказались с `-rw-r--r--`, как в архиве (устройство r25)[^46]. Становятся ли исполняемыми файлы `bin/` из `tgz`, — вопрос §6. Каталоги `.platform.*` тоже обрабатывает установщик на r25 (`device`) (устройство r25)[^47]. На r25 (`device`) он применил к корню `.platform.android`, затем `.platform.android-arm-api19`, а все каталоги `.platform.*` удалил до копирования (устройство r25)[^47]. Подробности и расхождение с текстом SDK — «Пакет плагина». Перед выпуском проверьте три поля манифеста. На r25 `name` должен совпасть с именем каталога, иначе плагин не регистрируется (устройство r25)[^48]. На r25 точка входа без `icon_url` в разделе «Приложения» не появляется (устройство r25)[^49]. По SDK `version_index` растёт с каждой версией и в интерфейсе не показывается, а `version` — подпись для интерфейса (SDK)[^27]. Приёмы сборки (права в архиве, воспроизводимый ZIP, подстановка версии) — «Приёмы разработки плагинов Dune HD». ### 2.2. Нужна ли подпись на r24 и r25 На tv188b r25 штатный установщик принял ZIP без файлов подписи в двух зондах и зарегистрировал оба плагина, но это наблюдения на одной прошивке, а не общая политика. На tv188b `261021_0117_r25` (`device`) `dune_plugin_kb_probe5_plat.zip` без `dune_plugin.sign` и `dune_plugin_signer_id.txt` установлен штатно в `/flashdata/plugins/kb_probe5_plat` (путь из лога) и зарегистрирован как `Plugin 'kb_probe5_plat' of type 'plain'` (устройство r25)[^50]. Гипотезы о политике и их условия собраны в §6. Второй зонд проверил и то, что идёт после установки (tv188b r25, `device`, запрос 11, один прогон). Штатный установщик принял `dune_plugin_kb_probe11z.zip` без этих двух файлов и зарегистрировал `kb_probe11z` как `php` (устройство r25)[^51]. Оболочка выполнила `install` как `sh bin/ga.sh install`, а маркер `ga_install.txt` записал `event=install` и `uid=1000(system)` (устройство r25)[^52]. ENTER пультом на «KB11 zip» в «Приложения» → DUNE HD вызвал `handle_user_input` с `control_id=enter` и диалог зонда (устройство r25)[^53]. В сохранённом фрагменте `shell.log` этой установки есть `[plugin_installer]`, регистрация и `install`, но нет сообщений `[plugin_signer]` и DSA-проверки зонда (устройство r25)[^54]. Отсутствие строк во фрагменте лога не означает, что проверки не было, а политику `signed` и механизм подписи этот прогон не испытывал (§6). Подпись на r25 видна с двух сторон: по файлам и по логу. На tv188b r25 (`device`) поиск `dune_plugin.sign` в `flashdata/plugins` и `firmware_ext/plugins` нашёл ровно 10 файлов: `dune-hd.tv`, `dunemdb_supplier_youtube`, `smotreshka.tv`, `dunemdb_supplier_online_movies`, `dunestore`, `dunemdb_supplier_generic`, `android_apps`, `ktv_start`, `widget`, `shell_ext` (устройство r25)[^55]. Screenshoter и `widget_ext`, которые на r25 проверяются на обновление (устройство r25)[^56], в этом перечне не названы (устройство r25)[^55]. В `shell.log` r25 строка «[plugin_signer] DSA verification for signer_id com.dune-hd: OK» записана для `dune-hd.tv` из `/flashdata/plugins` (устройство r25)[^57] и для `shell_ext` из `/firmware_ext/plugins` (устройство r25)[^58]. Почему именно эти два, объяснение есть для `dune-hd.tv`: в его `dune_plugin.xml` на плеере есть `strict_verify_needed` (устройство r25)[^59], а `populate_plugins` r25 вызывает `plugin_signer` только при этом флаге (код r25)[^60]; у `shell_ext` этой строки нет, хотя DSA-проверка в логе есть (устройство r25)[^61]. Разбор кода — ниже в этом разделе, расхождение — §5. На r24 наблюдение косвенное: речь о загрузке, а не об установке. На tv188b `260827_0003_r24` (`device`) поиск по `/system`, `/vendor` и `/data/data/com.dunehd.app` не нашёл `plugin_config.xml` (устройство r24)[^62]. В `/tmp/run/installed_plugins.xml` там загружены плагины, для которых поиск не нашёл `dune_plugin_signer_id.txt`, в том числе `melange`, `play_in_apps`, `Filmix_api`, `Screenshoter`, `VPN` и `test_php-cgi`; наличие `dune_plugin.sign` у них не проверялось (устройство r24)[^63]. Поэтому «без signer ID» здесь не значит «без подписи». По SDK, на r24+ не подтверждено: запрет неподписанных связан с настройками `ro_config` (SDK)[^64]. В строках `libduneutil.so` есть `external_plugins_enabled`, `signed` и `allowed_plugin_signer_ids` на r25 (код r25)[^65] и r24 (код r24)[^66]; что они делают, сами строки не показывают; разбор кода r25 — ниже. По SDK, на r24+ не подтверждено: `external_plugins_enabled` по умолчанию равен `all`, а незаданный `allowed_plugin_signer_ids` разрешает все signer ID (SDK)[^67]. В образах tv188b r24 и r25 `ro_config.properties` начинается с записи `check_fw_upgrade_in_wizard = yes` (код r22, r24, r25)[^68]. На tv188b r25 (`device`, запрос 11, один прогон) чтение `/config/ro_config.properties` и `/data/data/com.dunehd.app/config/ro_config.properties` вернуло No such file or directory (устройство r25)[^69], а `find` по `/system`, `/vendor` и `/data/data/com.dunehd.app` не вывел совпадений для `plugin_config.xml` (устройство r25)[^70]. Какая политика действует на устройстве, это не показывает (§6). Значения настроек — §3.3. Код проверки в оболочке r24 виден по строкам. В `libduneshell.so` r24 есть строки `[plugin_signer]`: файлы `dune_plugin.sign` и `dune_plugin_signer_id.txt`, signer_id `com.dune-hd`, ключ `/firmware/config/plugin_key.pem` или `/config/plugin_key.pem`, DSA-проверка (код r24)[^12]. Там же есть сообщения установщика о запретах, включая «install not allowed for unsigned plugin» и «unsigned plugins not allowed» (код r24)[^4]. Загрузчик имеет строки `strict_verify_needed` и «signature verification failed for '%s', but required» (код r24)[^71]. Строки доказывают наличие кода, но не то, что ветка срабатывает. Параметр `params/strict_verify_needed = yes` задан в манифесте Dune HD TV (код)[^72]. **Проверка подписи при загрузке на r25 (код tv188b `261021_0117_r25`).** На r25 код загрузчика в `libduneshell.so` разобран, и он показывает, когда подпись проверяет `populate_plugins`. `populate_plugins` вызывает `plugin_signer`, только если в свойствах плагина истинно `strict_verify_needed`; при ложном значении плагин регистрируется без проверки (код r25)[^60]. Эти свойства — содержимое `` манифеста `dune_plugin.xml`, а без флага его значение по умолчанию ложно (код r25)[^73]. Если при флаге `plugin_signer` вернул отказ, загрузчик пишет «signature verification failed for '%s', but required» и не регистрирует плагин (код r25)[^74]. Флаг стоит в `` манифеста Dune HD TV версии `240718_1541` (код)[^75] и в установленном на tv188b r25 `dune-hd.tv` (устройство r25)[^59]. Сам `plugin_signer` r25 идёт по шагам, и у каждого отказа своё сообщение и результат 0 (код r25)[^76] (перечень — §3.3). Сначала он читает `dune_plugin_signer_id.txt`; без файла — «the required signer_id is missing» (код r25)[^13]. Затем сверяет signer ID со списком допустимых: из поля `ro_config+0x1f0`, а при пустом поле — `com.dune-hd` или `com.dune-hd,` (код r25)[^14]; поле заполняется из `allowed_plugin_signer_ids` (код r25)[^20]. Дальше читает `dune_plugin.sign` (до 256 байт) (код r25)[^15], считает SHA-дайджест файлов каталога (код r25)[^16] и проверяет DSA-подпись ключом signer ID (код r25)[^10]. Вторая сторона — политика прошивки в `ro_config`. `ro_config_load_if_needed` сохраняет `external_plugins_enabled` в `ro_config+0x1ec`: `signed` (без учёта регистра) — 1, `none` — 2, отсутствующее или любое другое значение — 0 (код r25)[^18]. В функции загрузки `FUN_00215ed4` каталоги `/flashdata/plugins` и `/tmp/mnt/D/dune_plugins` передаются в `populate_plugins` со вторым аргументом 0, а `/fconfig/plugins`, `/firmware/plugins` и `/firmware_ext/plugins` — с 1 (код r25)[^77]. При `none` эта функция пропускает вызовы для первых двух каталогов и продолжает для трёх других (код r25)[^19]. В режиме `signed` отдельная функция вызывает `plugin_signer`, а при отказе пытается создать `<каталог>/.bad_signature` и пишет «[plugin] %s: marked as bad» (код r25)[^6]; в режиме 0 она возвращает успех без вызова `plugin_signer` (код r25)[^78]. Где эта функция вызывается — §6. Файл `.bad_signature` загрузчик проверяет только в ветке `/flashdata/plugins` и `/tmp/mnt/D/dune_plugins`: плагин с ним пропускается с сообщением «bad_signature flag is set» (код r25)[^79]. Ещё один отказ — «plugin %s is not permitted» от функции-фильтра; в той же ветке каталог плагина после него удаляется (код r25)[^80], а адрес фильтра ставит отдельная функция (код r25)[^81]. Условия фильтра — §6. **Запрос 13: что показало устройство (tv188b r25, `device`, один прогон).** Два сторонних зонда с одинаково испорченным `dune_plugin.sign` повели себя по-разному (устройство r25)[^82]. `kb_probe13v` со `strict_verify_needed=yes` в `` не зарегистрирован: `plugin_signer` остановился на «the required signer_id is missing», загрузчик написал «signature verification failed for 'kb_probe13v', but required», в `installed_plugins.xml` зонда нет (устройство r25)[^7]. Проверка остановилась до сверки подписи, поэтому отказ именно из-за испорченного `dune_plugin.sign` этот прогон не показал (устройство r25)[^7]. `kb_probe13n` без флага зарегистрирован без строк `plugin_signer`, и его точка входа вызвала `handle_user_input` (устройство r25)[^8]. Для стороннего плагина без подписи вывод практический: `strict_verify_needed` в `` не ставить — с флагом `plugin_signer` требует `dune_plugin.sign` (код r25)[^15], а при его отказе плагин не регистрируется (код r25)[^74]; в запросе 13 зонд с флагом и без signer ID не зарегистрирован (устройство r25)[^7]. Тот же прогон не нашёл строки `strict_verify_needed` в `dune_plugin.xml` встроенных плагинов `firmware_ext/plugins`, включая `shell_ext`, хотя DSA-проверка `shell_ext` в логе есть (устройство r25)[^61]; каким путём проверяется `shell_ext`, не установлено (§5, §6). SDK описывает политику так (по SDK, на r24+ не подтверждено). Плагины, встроенные в розничную прошивку и доступные в ней через Dune Store, подписаны Dune HD (SDK)[^38]. Подписанный плагин система проверяет и отказывается использовать при несовпадении подписи или недопустимом signer ID (SDK)[^11]; на r25 `populate_plugins` без `strict_verify_needed` подпись не проверяет (устройство r25, код r25)[^83] — расхождение в §5. Разрешать только подписанные плагины могут быть настроены кастомные (операторские) прошивки (SDK)[^84]. В образе подписаны 6 из 13 встроенных плагинов tv188b r24 (код r24)[^85]. Подпись есть и в разобранных пакетах Online services (код)[^86], Megogo (код)[^87], Okko (код)[^88], Dune HD TV (код)[^89]. Подпись и содержимое пакета связаны: по SDK плагин с несовпадающей подписью система не использует (SDK)[^11], поэтому правка файлов подписанного пакета — отдельный риск. По коду r25 дайджест подписи охватывает все обычные файлы каталога плагина рекурсивно, имена в каждом каталоге сортируются, кроме `dune_plugin.sign` на верхнем уровне и каталога `icons` у `shell_ext` (код r25)[^16]. При загрузке на r25 отказ `plugin_signer` при `strict_verify_needed` ведёт к отказу в регистрации (код r25)[^74], без флага `populate_plugins` подпись не проверяет (код r25)[^60], а режим `signed` — выше в этом разделе. ### 2.3. Подписать плагин своим ключом: кастомная прошивка Раздел до последнего абзаца — по SDK, на r24+ не подтверждено; что подтверждает код r25 — в последнем абзаце. Значение signer ID `com.dune-hd` зарезервировано за Dune HD, второе допустимое значение — customer ID кастомной прошивки (с `150326_r10`) (SDK)[^90]. Собственная подпись делается DSA-ключами 2048 через `openssl` и утилитой `plugin_sign.x86

`, а публичный ключ кладётся в прошивку как `/firmware/config/plugin_key.pem` (SDK)[^9]. Публичный ключ кладётся в прошивку, а signer ID равен customer ID кастомной прошивки, поэтому этот маршрут описан для кастомных прошивок (SDK)[^91]. Получить подпись `com.dune-hd` для стороннего плагина — вопрос §6. Какие плагины разрешены, прошивка задаёт параметрами `ro_config` или файлом `plugin_config.xml`, и вместе их применять не рекомендуется (SDK)[^92]; значения — §3.3. Чтобы запретить установку и запуск произвольных сторонних плагинов, раздел «Secure firmware» рекомендует `external_plugins_enabled = signed` (SDK)[^64]. Сторонний плагин для кастомного каталога `dunestore` тогда подписывают собственным ключом, а прошивку настраивают разрешать этот ключ (SDK)[^93]. Подписью Dune HD такой плагин не получить: та же страница говорит, что сторонние приложения кастомного каталога не будут подписаны, потому что подписывать сейчас могут только приложения, выпускаемые и поддерживаемые Dune HD (SDK)[^94]. Это два разных случая — подпись Dune HD и свой ключ на своей прошивке, а не противоречие; claims связаны `related`. На r24 путь к ключу подтверждается только строками (код r24)[^12]; роль второго пути и приоритет на r24 — §6. На r25 их показывает код `plugin_signer`: подпись `com.dune-hd` проверяется ключом, встроенным в `libduneshell.so`, другой signer ID принимается, только если равен `get_customer_id()`, и тогда ключ берётся из `/config/plugin_key.pem`, а без него — из `/firmware/config/plugin_key.pem`; иначе — «unsupported signer_id» или «plugin_key.pem not found» (код r25)[^10]. Если `allowed_plugin_signer_ids` задан, signer ID должен быть в этом списке (код r25)[^95]. Это та же схема «`com.dune-hd` или customer ID с ключом в прошивке», что в SDK (SDK)[^91]. В режиме `external_plugins_enabled = signed` код r25 проверяет подпись отдельной функцией (код r25)[^6]; что этот режим делает на устройстве — вопрос §6. Проверку при загрузке включает и флаг `strict_verify_needed` в `` самого плагина (код r25)[^60] (§2.2). ### 2.4. Выбрать канал распространения Каналы делятся на четыре группы и дополняют друг друга: файл нужен для первой установки вручную, ссылка `plugin_installer://` — чтобы поставить плагин из другого плагина, каталог `dunestore` — чтобы плагин находили на самом устройстве, а `check_update` — чтобы установленная копия получала новые версии (код r25, SDK)[^96]. Полная таблица — §3.2. В разобранных пакетах встречаются облачная ссылка в посте форума (код)[^97], GitHub Release (код)[^98], общий хост dune-club.info (код)[^99] и Dune Store (код)[^100]. Как устроены эти варианты в конкретных плагинах — §4. ### 2.5. Как ставит пользователь: файл на носителе На tv188b r25 (`device`) `dune_plugin_kb_probe5_plat.zip`, запущенный в файловом браузере плеера из `/sdcard/DuneHD`, был установлен; рядом появились каталоги `plugins_archive`, `plugins_data` и `/tmp/plugins/

` (устройство r25)[^22]. Перезапускать приложение не понадобилось (устройство r25)[^34]. Что видит пользователь, показал запрос 11 на tv188b r25 (`device`, по одному прогону на архив). После ENTER на `dune_plugin_kb_probe5.zip` в файловом браузере установщик сразу показал диалог «Установка приложения» с текстом «KB probe 5: установлено успешно.» и кнопками «Запустить» и «Закрыть»; вопроса перед установкой не было (устройство r25)[^101]. С `dune_plugin_kb_probe11z.zip` было то же окно с текстом «KB probe 11z: установлено успешно.», вопроса перед установкой тоже не было (устройство r25)[^102]. Инструкцию для пользователя стоит писать с учётом этого окна после установки. SDK называет любой носитель, например USB-флешку (SDK)[^41]. По SDK, на r24+ не подтверждено: для ручной установки обычно нужно активированное «Flash memory storage» или «System storage», иначе устройство предложит его активировать (SDK)[^103]; при совпадении имени с установленным вручную плагином система предложит перезаписать или отменить, а встроенные перезаписать нельзя (SDK)[^104]. По сообщениям пользователей (Dune HD TV-175L SmartBox 4K), Screenshoter ставится выбором ZIP в файловом браузере с флешки, а архив 7z не подходит (форум)[^105]. Инструкцию для пользователя стоит писать с этими оговорками: наблюдение на r25 относится к запуску из `/sdcard/DuneHD` (устройство r25)[^22], запуск с USB — вопрос §6. Имя архива в инструкции лучше брать в форме `dune_plugin*.zip`, которую называет SDK (SDK)[^41]. В запросе 11 на tv188b r25 (`device`) после ENTER на `kb11_other.zip` в файловом браузере изменений на экране и диалога не было видно, а проверка установки показала отсутствие каталога `kb_probe11z`; архив был копией `dune_plugin_kb_probe11z.zip` (устройство r25)[^106], который штатный установщик принял (устройство r25)[^51]. В том же запросе браузер показал `kb11_other.zip` со значком «?» (неизвестный тип), а лежащие рядом `dune_plugin_*.zip` — со значком файла (устройство r25)[^107]. Это наблюдение одного имени: причина и правило не установлены (§6). ### 2.6. Поставить плагин из другого плагина: `plugin_installer://` Встроенный `dunestore` r25 запускает установку действием `launch_media_url` с URL `plugin_installer://…` (код r25)[^108]. В коде r25 так работает `ensure_tv_app_installed`: для неустановленного плагина — `plugin_installer://:::schema=2&name=&need_confirm_replace=0&close_on_success=1` с необязательным `signer_id`, для установленного при `force_check_update` — `plugin_installer://:::schema=update` (код r25)[^23]. YouTube указывает и прямой пакет `.tar.gz` (код)[^109]. Разбор URL в коде APK r24 и `schema=update` без подтверждения — «Онлайн-обновление плагина». Ключи — §3.4. На устройстве установщик проверен без кода плагина, по IP Control (tv188b r25, `device`, запрос 11, один прогон). Команда `launch_media_url` с `plugin_installer://:::schema=zip&name=kb_probe11z&need_confirm_replace=0&close_on_success=1` заменила уже установленный `kb_probe11z` и зарегистрировала его как `php` (устройство r25)[^24]. После этого оболочка выполнила `install`, а `ga_install.txt` дополнился событием `install` (устройство r25)[^110]. Когда после завершения установки проверили экран, диалога не было: остался раздел «Приложения», ничего не спрашивалось; краткое окно хода установки до проверки этим не исключено (устройство r25)[^111]. Это наблюдение формы `schema=zip` на r25 (устройство r25)[^24]: оно дополняет общий синтаксис URL и ветвь прямого ZIP-пакета из кода r24 (код r24)[^112], но r24 не проверялся. Формы `schema=2`, `schema=update` и ключ `signer_id` из кода выше этот прогон не посылал, а вызовов `dunestore` (код r25)[^108] не выполнял; они и запуск из действия плагина или с сайта — вопросы §6. ### 2.7. Попасть в каталог `dunestore` (Dune Store и community) `dunestore` — встроенный PHP-плагин с точкой входа в `root://applications` (код r25)[^113], и на r25 он читает несколько источников каталога. Его модель задаёт стандартный каталог `http://online.dune-hd.com/dune_store/v1/catalog.xml` и community-каталог `http://dune-club.info/plugins/update/community_catalog.xml` (код r25)[^114]. Источники можно переопределить в `/config/dsconfig.xml`, иначе `/firmware/config/dsconfig.xml`; без файла используются `standard_source` и `community_source`, а `source` задаёт свой `catalog_url`, `signer_id` и `community=yes` (код r25)[^115]. Каталоги различаются условиями. Плагин стандартного источника (signer_id `com.dune-hd`) попадает в список, только если его имя перечислено в категории `plugins` этого каталога и он не скрыт по типу устройства (код r25)[^116]. Для community-плагина кнопка установки сначала показывает диалог подтверждения (код r25)[^117]; в режиме расширений community-каталог игнорируется целиком, если community выключен (код r25)[^118]. Чтобы плагин был виден на нужных устройствах, в элементе каталога задают условия: `expr` либо `apk`, `strict_country`, `country`, `language`, `product`, а затем всегда проверяется `firmware_features` (код r25)[^119]. В режиме расширений при наличии `/config/dunestore_ext_devel` каталог заменяется на `dev_catalog.xml`, community — на `dev_community_catalog.xml` (код r25)[^120]. Установку из карточки `dunestore` строит сам: при `update_url` — `plugin_installer` со `schema` 1 или 2, иначе с `download_url` и `space_needed`, добавляя `need_confirm_replace=0` и `signer_id`, если он задан (код r25)[^117]. Как получить место в стандартном или community-каталоге — вопрос §6. По сообщениям пользователей (Real Vision 4K, R21), Screenshoter есть в Dune Store и после установки обновляется автоматически (форум)[^121]. Страница SDK о Dune Store добавляет к этому требования к записи (этот абзац и следующий — по SDK, на r24+ не подтверждено; при расхождении см. §5). Каталог скачивается при запуске Dune Store пользователем (SDK)[^122], а обновления идут механизмом плагинов: Dune Store предполагает, что все его плагины настроены на онлайн-обновление (SDK)[^123]. Запись должна совпадать с манифестом: `name` (SDK)[^124], `caption` (SDK)[^125], `version_index` и `version` (SDK)[^126]; остальные поля — §3.5. Категорию задаёт `catalog.xml`, а раздел главного меню — `parent_media_url` в `dune_plugin.xml` (SDK)[^127]. Список разделов определяет не каталог, а `/firmware/config/menu_config.xml` (SDK)[^128], и новая категория его не меняет (SDK)[^129]. Свой каталог описан для кастомной прошивки: она включает `dsconfig.xml` (SDK)[^26]; если точка входа ссылается на раздел, которого нет в её конфигурации, после установки точка не будет видна и доступна (SDK)[^130]. В примере SDK свой сервер хранит только урезанный каталог, а иконки, пакеты и спецификации обновлений остаются на стандартном (SDK)[^131]. Полный клон стандартного сервера не поддерживается и не рекомендуется без договорённости с Dune HD (SDK)[^132]. Параметры `dsconfig.xml` — §3.5. ### 2.8. Ставить при разработке: `adb push` и чем он отличается от установки `adb push` удобен для отладки, но это другой путь, и результаты на нём отличаются от того, что получит пользователь. На tv188b r25 (`device`) каталог копируется под adb root в `/data/data/com.dunehd.app/flashdata/plugins/`, затем нужны `chown -R system:system`, `chmod -R +x` для `bin` и `www/cgi-bin` и `am force-stop com.dunehd.app` (устройство r25)[^32]. Два отличия важны перед выпуском: `install` при таком размещении не выполняется (устройство r25)[^31], и `update` не выполняется при смене `version_index` на месте (устройство r25)[^133]. Поэтому код этих обработчиков проверяют реальной установкой ZIP и реальным обновлением: при штатной установке `dune_plugin_kb_probe11z.zip` на tv188b r25 `install` выполнился (`device`, запрос 11, §2.2) (устройство r25)[^52]. Другие подробности — «Пакет плагина». Механизм `dune_plugins` на накопителе SDK описывает для разработки (SDK)[^134], но на Android накопители монтируются с `noexec`, что ему мешает (SDK)[^135] (по SDK, на r24+ не подтверждено). ### 2.9. Выпустить новую версию: `update_info.xml` (`schema` 2) SDK рекомендует `schema = 2`, а схему 1 называет устаревшей (по SDK, на r24+ не подтверждено) (SDK)[^136]. На r25 (`device`) проверяются обе: лог показывает плагины как `[schema1]` и `[schema2]` (устройство r25)[^56]. Порядок выпуска: 1. В `dune_plugin.xml` новой версии поднимите `version_index` и обновите `version` (SDK)[^27]. 2. Соберите `.tar.gz` с тем же содержимым, что у ZIP, посчитайте `md5` и `size` (SDK)[^2]. 3. Добавьте `plugin_version_descriptor` с `version_index`, `version`, `beta`, `critical`, `url`, `md5`, `size`, `caption` (код)[^137]; корень — `dune_plugin_update_info` с `schema` и `name` (код)[^138]. Значение `name` должно совпасть с именем плагина (код r24)[^139]. Подробнее о полях — «Онлайн-обновление плагина». 4. Старые дескрипторы можно оставить: из прошедших условия берётся наибольший `version_index` (код APK r24) (код r24)[^140]. В снятых файлах их 6–20 на плагин, и часть номеров пропущена (код)[^141]. 5. Положите пакет и файл на сервер по URL из `check_update` манифеста (SDK)[^27]. На r25 (`device`) запрос приходит GET-ом с дописанным `?dune_auth=…` и заголовками `User-Agent`, `X-Dune-Interface-Language`, `X-Dune-Serial-Number` (устройство r25)[^142], так что сервер должен принимать такой URL. `beta` по SDK зарезервирован и игнорируется (по SDK, на r24+ не подтверждено) (SDK)[^143]. Дескриптор можно ограничить функциями прошивки через `required_firmware_features` и `require`: по коду APK r24 дескриптор без нужной функции не проходит (код r24)[^140]. Так версию адресуют прошивкам с нужной функцией: у GlobalTV условие стоит на 16 дескрипторах из 20 (код)[^144]. Новая версия приезжает на место старой с сохранением данных: на r25 (`device`) cookies и `data_dir_path` пережили два обновления (устройство r25)[^145]. Плагин получает `confirm_update` (устройство r25)[^146], `going_to_update` (устройство r25)[^36] и `update`, а `install` при обновлении не вызывается (устройство r25)[^147]. Поэтому код миграции данных вешают на `update`, а не только на `install`. Порядок событий — «Онлайн-обновление плагина». Откатить выпуск дескриптором с меньшим номером не получится: обновление доступно, только если `version_index` больше установленного (код APK r24, `schema` 1) (код r24)[^35], а в `schema` 2 «newer» — тоже больше установленного (код r24)[^140]. Старый код выпускают под новым номером. ### 2.10. Выпустить новую версию: `update.txt` (`schema` 1) Этот формат встречается в собранных дескрипторах чаще: из 29 снятых с серверов 23 — `update.txt`, 6 — `update_info.xml` (код)[^148]. Все 23 — ровно пять строк `ключ=значение`: `version_index`, `version`, `download_url`, `space_needed`, `last_critical_version_index` (код)[^149]. Полей `md5` и `size` среди них нет (код)[^149]. Код APK r24 требует `version_index` не меньше 1, `download_url` на http или https и `space_needed` больше 0 (код r24)[^150]. Обновление критическое, если `last_critical_version_index` ≥ 1 и установленный `version_index` меньше него (код r24)[^35]. В `last_critical_version_index` пишите целое число. У 9 из 41 дескриптора там стоит строка версии вроде «1.0.0» (код)[^151], а код APK r24 для «1.0.0» вернёт 1 (код r24)[^152]. Окончания CRLF и LF для разбора равнозначны (код APK r24) (код r24)[^153]. Подробно о формате — «Онлайн-обновление плагина». ### 2.11. Сделать обновление обязательным Обязательность складывается из двух механизмов. По SDK, на r24+ не подтверждено: при `critical = yes`, `timeout = 0` и `required = yes` старую версию не дадут запустить, если на сервере есть обновление (SDK)[^154]. Код APK r24 ведёт себя так: при ошибке проверки и `required=yes` (кроме `schema` 3) запуск запрещается (код r24)[^155]; отказ от критического обновления или его неудачная установка запрещают запуск, отказ от некритического запуску не мешает (код r24)[^156]. Значит, на коде APK r24 `required=yes` связывает запуск плагина с успехом проверки: её сбой запрещает запуск (код r24)[^155]. В практике это редкость: `required yes` задан у двух манифестов из 43 (код)[^157], а `critical` равен `no` во всех 73 снятых дескрипторах `schema` 2 (код)[^158]. Обновить без вопроса пользователю можно через `dont_ask_confirmations=yes`: на r25 (`device`) диалога нет, установка идёт сразу, но `confirm_update` всё равно вызывается (устройство r25)[^159]. Значение берётся из манифеста установленной версии (устройство r25)[^159]. ### 2.12. Проверить выпуск на устройстве r25 Проверять нужно цепочку целиком, потому что `adb push` её не запускает (§2.8). Поставьте старую версию из ZIP, выложите новую и запустите точку входа: на r25 (`device`) запуск по IP Control тоже вызывает проверку (`launch_media_url plugin_launcher://{name=…}{ep_media_url=…}`) (устройство r25)[^29]. Если запроса к серверу нет, первым проверьте срок. Он хранится в `/tmp/plugin_updater_.txt` (устройство r25)[^160], а до срока в `shell.log` пишется «remote check skipped by timeout» и запроса нет (устройство r25)[^161]. Диалог и его вид — «Онлайн-обновление плагина». Итог проверки виден в логах r25: установка — строки цепочки (устройство r25)[^36], фоновая автопроверка — отдельный лог `/tmp/run/plugin_online_upgrade.log` (устройство r25)[^162], а итог по плагину `schema` 2 — «N candidates», «N matches (0 newer)», «have_better_version = no» (устройство r25)[^163]. На экране сообщений о ходе и завершении установки нет (устройство r25)[^164]. ### 2.13. Почему плагин не ставится или не обновляется Таблица идёт от симптома к причине. Строки r24 — это сообщения из `libduneshell.so`; условие, при котором они появляются, там не всегда установлено. | Симптом | Причина | Что сделать | Claim | |---|---|---|---| | Плагин не зарегистрирован, в `shell.log` «invalid plugin manifest … is not equal to directory name» (r25, `device`) | `name` не равен имени каталога | привести `name` и каталог к одному значению | (устройство r25)[^48] | | Установлен, но в «Приложениях» нет (r25, `device`) | у точки входа нет `icon_url`; `launch_capable` в `installed_plugins.xml` равен 0 | добавить `icon_url` | (устройство r25)[^165] | | Ошибка о манифесте (строки r24) | `dune_plugin.xml` не найден или не разбирается | проверить, что файл в корне архива | (код r24, SDK)[^166] | | «declared plugin name is '%s', real is '%s'» (строки r24) | `name` в манифесте не совпал с ожидаемым | сверить `name` пакета и установленного плагина | (код r24)[^167] | | «suitable storage not found; cancelled» (строки r24) | не найдено подходящее хранилище; условие не установлено | по SDK, на r24+ не подтверждено: активировать Flash memory storage | (код r24, SDK)[^168] | | «install not allowed for unsigned plugin», «unsigned plugins not allowed» (строки r24) | запрет неподписанных; условие — §6 | проверить политику прошивки; по SDK, на r24+ не подтверждено: `external_plugins_enabled`, `allow_install` (§3.3) | (код r24, SDK)[^169] | | «replace not allowed for plugin '%s' because of signer_id mismatch» (строки r24) | замена плагина с другим `signer_id` | не менять подписанта у выпущенного плагина; по SDK, на r24+ не подтверждено: онлайн-обновление всегда ограничено логикой `same_signer_id` | (код r24, SDK)[^170] | | Плагин не зарегистрирован, в `shell.log` «the required signer_id is missing» и «signature verification failed for '%s', but required» (tv188b r25, `device`, запрос 13, один прогон) | в `` манифеста `strict_verify_needed=yes`, а `dune_plugin_signer_id.txt` нет | убрать `strict_verify_needed` из `` либо подписать плагин (§2.3) | (устройство r25, код r25)[^171] | | Плагин из `/flashdata/plugins` не загружается, в `shell.log` «bad_signature flag is set» (код r25) | в каталоге плагина есть файл `.bad_signature`; его пытается создать проверка режима `signed` | искать причину отметки (§2.2); снятие отметки на устройстве не проверялось | (код r25)[^172] | | Каталог плагина в `/flashdata/plugins` исчез, в `shell.log` «plugin %s is not permitted» (код r25) | имя отверг фильтр прошивки; условия фильтра — §6 | проверить политику прошивки (§3.3) | (код r25)[^173] | | «replace hard-coded plugin '%s' not allowed» (строки r24) | замена «hard-coded» плагина | дать плагину своё `name` | (код r24)[^4] | | Архив не запускается (по сообщениям пользователей) | архив 7z вместо ZIP | упаковать в ZIP | (форум)[^105] | | После ENTER на `kb11_other.zip` в файловом браузере изменений на экране не видно, каталога `kb_probe11z` нет; в браузере у файла значок «?» (tv188b r25, `device`, запрос 11) | не установлена; так было с копией `dune_plugin_kb_probe11z.zip` (одно имя, правило не выведено) | назвать архив `dune_plugin*.zip` и повторить (§2.5) | (устройство r25, SDK)[^174] | | «md5 does not match» (строки r24) | `md5` в дескрипторе не совпал с пакетом | пересчитать `md5` после последней сборки | (код r24)[^42] | | «remote check skipped by timeout» (r25, `device`) | срок следующей проверки не наступил | дождаться срока; срок задаёт `next_check_update_timeout` | (устройство r25)[^175] | | «0 newer», «have_better_version = no» (r25, `device`) | на сервере нет дескриптора новее | поднять `version_index` | (устройство r25)[^163] | | Дескриптор не подходит (код APK r24) | не выполнено `require` или `required_firmware_features` | проверить условия дескриптора | (код r24)[^140] | | Проверка не запускается (код APK r24) | `schema` больше 3 либо нет `url` при `schema` 1 или 2 | исправить `check_update` | (код r24)[^176] | | Плагин перестал запускаться (код APK r24) | `required=yes` и ошибка проверки либо отказ от критического обновления | вернуть доступность сервера, пересмотреть `required` | (код r24)[^177] | | `update` или `install` не вызваны после `adb push` (r25, `device`) | этот путь их не вызывает | проверять настоящей установкой (§2.8) | (устройство r25)[^178] | | Диалог обновления появляется снова после «Напомнить позже» (r25, `device`) | «Напомнить позже» не сдвигает срок проверки | это штатно; при частых показах увеличить `next_check_update_timeout` | (устройство r25)[^179] | | Копия из `flashdata` заменена встроенной (r25, `device`) | в логе «prefer_new_builtin (41 vs 34)»; `version_index` копии в `firmware_ext` больше | не использовать имя встроенного плагина | (устройство r25)[^180] | ### 2.14. Удалить плагин Штатно плагин удаляют URL `plugin_uninstaller://<имя>`: так делает `dunestore` через `ActionFactory::launch_media_url`, без собственного удаления каталогов в PHP (код r25)[^181], и GlobalTV при установке в стране CN (код)[^182]. Карточка установленного плагина в `dunestore` всегда показывает кнопку «Удалить» справа (код r25)[^117]. На устройстве этот URL проверен по IP Control (tv188b r25, `device`, запрос 11, один прогон, зонд `kb_probe11z`). `plugin_uninstaller://kb_probe11z` вызвал `uninstall` через `sh bin/ga.sh uninstall`, и оболочка записала «uninstall action finished with status 0» (устройство r25)[^183]. После этого `ls` показал No such file or directory для каталогов `plugins/kb_probe11z`, `plugins_data/kb_probe11z`, `plugins_archive/kb_probe11z` и `/tmp/plugins/kb_probe11z`; перед удалением эти каталоги существовали (устройство r25)[^184]. На экране после удаления диалога не было, ничего не спрашивалось; краткое окно хода удаления до проверки экрана этим не исключено (устройство r25)[^185]. Цепочку удаления `dunestore` прогон не выполнял, удаление cookies не проверено (§6). По SDK, на r24+ не подтверждено: вручную установленные плагины удаляются в «Setup / Misc / Plugins» (ENTER → Delete) (SDK)[^186]. Среди системных событий плагина SDK называет `uninstall` (SDK)[^187]. Widget Ext вызывает в нём `bin/uninstall.sh` синхронно (код)[^188]. По коду APK r24 каталоги данных и cookies при замене пакета не удаляются, их удаление есть только в ветке флага 0 (код r24)[^189]; что происходит с cookies при штатном удалении — §6. ## 3. Справочник ### 3.1. Что требуется от пакета на r24 и r25 «Обязательно» здесь значит: без этого на указанной прошивке наблюдался отказ или этого прямо требует источник. | Требование | Статус | Где наблюдалось | Claim | |---|---|---|---| | `dune_plugin.xml` в корне ZIP | обязательно | SDK; строки об отсутствующем манифесте на r24 | (код r24, SDK)[^190] | | `name` равен имени каталога | обязательно | r25, `device`; для r24 — §6 | (устройство r25)[^39] | | PHP-программа с `hd_create_plugin()` | по SDK обязательно для PHP-плагина; зонды `kb_probe5` и `kb_probe10` без `hd_create_plugin()`, с наследником `DunePluginFw`, работали (§5) | SDK; без функции — tv188b r25, `device` | (устройство r25, SDK)[^191] | | `params/program` у типа `plain` | не обязательно | r25, `device` | (устройство r25)[^192] | | `icon_url` у точки входа в `root://applications` | нужно, чтобы пункт был виден | r25, `device` | (устройство r25)[^49] | | `version_index` | нужен для обновлений, больше установленного | код APK r24 | (код r24)[^193] | | `check_update/url` | без него проверка отключается | код APK r24 | (код r24)[^37] | | Имя файла `dune_plugin*.zip` | так называет SDK; после ENTER на `kb11_other.zip` каталога `kb_probe11z` нет (одно имя, §2.5); обязательность — §6 | SDK; так назван зонд на tv188b r25; `kb11_other.zip` — tv188b r25, `device` | (устройство r25, SDK)[^194] | | `dune_plugin.sign`, `dune_plugin_signer_id.txt` | два зонда без них установлены и зарегистрированы; по коду r25 `populate_plugins` проверяет их только при `strict_verify_needed` в ``, режим `signed` — отдельная проверка; зонд с испорченным `dune_plugin.sign` без флага зарегистрирован, с флагом и без `dune_plugin_signer_id.txt` — нет; общая политика не установлена — §2.2, §6 | tv188b r25, `device` (четыре зонда); код r25; SDK; строки r24 | (устройство r25, код, SDK)[^195] | ### 3.2. Каналы распространения | Канал | Как устроен | Что нужно от автора | Где работает | Claim | |---|---|---|---|---| | ZIP на носителе | запуск файла в файловом браузере | ZIP, инструкция | r25, `device`: `/sdcard/DuneHD`; USB — по SDK | (устройство r25, SDK)[^196] | | Вложение или ссылка на форуме | пользователь скачивает ZIP сам | хостинг файла | разобранные пакеты; по сообщениям пользователей | (код, форум)[^197] | | GitHub Release | ZIP на каждый тег | workflow сборки | код ProIPTV | (код)[^98] | | `plugin_installer://` из плагина | `launch_media_url` | URL пакета или дескриптора | код r25, сторонние пакеты; tv188b r25, `device`: `schema=zip` по IP Control, не из плагина (§2.6) | (устройство r25, код)[^198] | | `dunestore`, стандартный каталог | элемент в `catalog.xml` | запись в каталоге (порядок — §6) | код r25 | (код r25)[^199] | | `dunestore`, community | элемент в `community_catalog.xml`, диалог при установке | запись в каталоге (порядок — §6) | код r25 | (код r25)[^200] | | `dunestore`, свой источник | `source` в `dsconfig.xml` | файл на устройстве; по SDK его включает кастомная прошивка, другие пути — §6 | код r25; SDK | (код r25, SDK)[^201] | | `check_update` при запуске | оболочка опрашивает дескриптор | сервер с дескриптором и пакетом | r25, `device` | (устройство r25)[^29] | | `check_update/auto` в фоне | фоновая автопроверка | `auto = yes` в манифесте | код APK r24; процесс на r25, `device` | (устройство r25, код r24)[^202] | | `adb push` | копирование каталога под adb root | только для разработки (§2.8) | r25, `device` | (устройство r25)[^32] | ### 3.3. Файлы и строки подписи (r24, r25) Первая таблица — строки `libduneshell.so` tv188b `260827_0003_r24`, а не наблюдаемое поведение; вторая — код `libduneshell.so` и `libduneutil.so` tv188b `261021_0117_r25` с условием каждого сообщения; третья — настройки по SDK. | Имя | Назначение | Где | Claim | |---|---|---|---| | `dune_plugin.sign` | файл подписи | корень плагина | (SDK r24)[^203] | | `dune_plugin_signer_id.txt` | signer ID; у встроенного `shell_ext` — `com.dune-hd` без перевода строки | корень плагина | (код r24)[^204] | | `/firmware/config/plugin_key.pem`, `/config/plugin_key.pem` | строки ключа в блоке `[plugin_signer]` | оболочка | (код r24)[^12] | | `/config/plugin_config.xml`, `/firmware/config/plugin_config.xml` | `parse_plugin_config()`, имена `allow_install`, `signed` и др. | оболочка | (код r24)[^205] | | `strict_verify_needed` | строка загрузчика и параметр манифеста Dune HD TV | оболочка, манифест | (код)[^206] | | «install not allowed for unsigned plugin», «unsigned plugins not allowed», «signer_id '%s' not allowed by firmware», «signature verification failed» | сообщения установщика о запрете | оболочка | (код r24)[^4] | | `%s/.bad_signature`, «bad_signature flag is set» | путь-шаблон и сообщение загрузчика | оболочка | (код r24)[^207] | | «plugin %s is not permitted», «marked as bad» | сообщения загрузчика | оболочка | (код r24)[^208] | Код tv188b r25 (`code`; на устройстве наблюдались только строки с пометкой `device`). Каталоги «ветки 0» — `/flashdata/plugins` и `/tmp/mnt/D/dune_plugins` (код r25)[^77]. | Сообщение или поле | Когда | Итог | Claim | |---|---|---|---| | `strict_verify_needed` в `` | читается из свойств манифеста, умолчание — ложь | при истине `populate_plugins` вызывает `plugin_signer`, иначе регистрирует без проверки | (код r25)[^5] | | «[populate_plugins] ERROR: signature verification failed for '%s', but required» | `plugin_signer` вернул 0 при `strict_verify_needed` | плагин не регистрируется; `device`, запрос 13, один прогон | (устройство r25, код r25)[^209] | | «[plugin_signer] %s: the required signer_id is missing» | нет `dune_plugin_signer_id.txt` | отказ; `device`, запрос 13, один прогон | (устройство r25, код r25)[^210] | | «invalid signer_id: requied(%s) != actual(%s)» | задан требуемый signer ID и не совпал; `populate_plugins` его не задаёт | отказ | (код r25)[^13] | | «[plugin_signer] %s: signer_id '%s' not allowed» | signer ID не в списке `ro_config+0x1f0` (`allowed_plugin_signer_ids`), при пустом — не `com.dune-hd` и не `com.dune-hd,` | отказ | (код r25)[^95] | | «the required signature not found for plugin '%s'», «invalid signature file for plugin '%s'» | нет `dune_plugin.sign`; размер файла не равен прочитанному (читается до 256 байт) | отказ | (код r25)[^15] | | дайджест | SHA по обычным файлам каталога рекурсивно, имена в каждом каталоге сортируются; без `dune_plugin.sign` на верхнем уровне и `icons` у `shell_ext` | — | (код r25)[^16] | | «unsupported signer_id», «plugin_key.pem not found», «DSA verification for signer_id %s: OK\|failed» | `com.dune-hd` — встроенный ключ; customer ID — `/config/plugin_key.pem`, иначе `/firmware/config/plugin_key.pem`; другой signer ID — отказ | итог проверки; «OK» для `dune-hd.tv` и `shell_ext` — `device` | (устройство r25, код r25)[^211] | | `external_plugins_enabled` → `ro_config+0x1ec` | `signed` без учёта регистра — 1, `none` — 2, нет или другое — 0 | — | (код r25)[^18] | | `allowed_plugin_signer_ids` → `ro_config+0x1f0` | разборщик `ro_config_load_if_needed` | список для «not allowed» выше | (код r25)[^20] | | `none` (`+0x1ec` = 2) | загрузка каталогов | каталоги ветки 0 пропускаются, `/fconfig/plugins`, `/firmware/plugins`, `/firmware_ext/plugins` загружаются | (код r25)[^19] | | «[plugin] %s: marked as bad» | режим `signed`, `plugin_signer` вернул 0 (функция `FUN_00215e08`) | попытка создать `<каталог>/.bad_signature`, результат 0; при режиме 0 — 1 без проверки, при `none` — сразу 0 | (код r25)[^212] | | «[populate_plugins] %s: bad_signature flag is set» | ветка 0, в каталоге есть файл `.bad_signature` | плагин пропускается без загрузки | (код r25)[^213] | | «plugin %s is not permitted» | фильтр по адресу из `0x00ee9e68` вернул ненулевое для имени | в ветке 0 каталог плагина удаляется, иначе пропуск | (код r25)[^173] | Настройки кастомной прошивки ниже описаны в SDK (всё по SDK, на r24+ не подтверждено; разбор `external_plugins_enabled` и `allowed_plugin_signer_ids` кодом r25 — в таблице выше; применение на устройстве — §6; что искали на tv188b r25 — §2.2). Имена полей `plugin_config.xml` в SDK те же, что в строках `libduneshell.so` r24 (код r24, SDK)[^214]. В синтаксисе и примере SDK есть опечатки: закрывающий `` и `` (SDK)[^215]. | Имя | Назначение | Значения | С какой прошивки | Claim | |---|---|---|---|---| | `external_plugins_enabled` (`ro_config.properties`) | какие сторонние плагины разрешены | `all` (умолчание) — все; `signed` — только подписанные Dune HD, `signer_id` в `allowed_plugin_signer_ids`, если список задан; `none` — только включённые в прошивку, без обновлений, включая онлайн-обновление | `130803_b8+` | (SDK)[^216] | | `allowed_plugin_signer_ids` (`ro_config.properties`) | допустимые signer ID | список через запятую; не задан (умолчание) — разрешены все | `130803_b8+` | (SDK)[^217] | | `plugins_installation_enabled` (`ro_config.properties`) | делает то же, что `plugin_config.xml`, но менее гибко; как и `external_plugins_enabled` | в разобранной части SDK не описаны | не указано | (SDK)[^92] | | `/firmware/config/plugin_config.xml` | ограничивает установку, замену и удаление отдельных плагинов | корень `plugin_config`, раздел `plugins` с `default_external`, `default_embedded` и записями `plugin name="..."` | `150113_b9+` | (SDK)[^218] | | `default_embedded`, `default_external`, `plugin name="..."` | умолчания для встроенных и внешних; запись плагина перекрывает часть умолчаний | по умолчанию разрешено всё; embedded — входит в прошивку, например `/firmware_ext/plugins/`, и остаётся им после замены или обновления, остальные — external | не указано | (SDK)[^219] | | install, replace, update | термины файла | install — развёртывание нового; replace — любое изменение существующего, кроме update; update — онлайн-обновление | не указано | (SDK)[^220] | | `allow_install`, `allow_delete` | установка новых внешних плагинов; удаление плагина | `allow_install`: `yes`, `signed` (только подписанных), `no`; `allow_delete`: `yes`, `no` | не указано | (SDK)[^221] | | `allow_replace` | замена; на онлайн-обновление не влияет, оно всегда ограничено логикой `same_signer_id` | `yes`, `no`, `same_signer_id`: прежний подписан — новый с тем же signer ID; прежний не подписан — новый любой | не указано | (SDK)[^222] | ### 3.4. Ключи URL `plugin_installer://` Форма URL из встроенных PHP-плагинов r24 — `plugin_installer://<адрес>:::<ключ>=<значение>&…` (код r24)[^223]; расхождение с более ранней гипотезой о формате — §5. На tv188b r25 (`device`, запрос 11, один прогон) эта форма сработала с `schema=zip`, `name`, `need_confirm_replace=0` и `close_on_success=1` (устройство r25)[^24]; действие каждого ключа по отдельности не проверялось, остальные значения `schema` на устройстве тоже, r24 не проверялся. | Ключ | Значения и смысл | Где | Claim | |---|---|---|---| | `schema` | `update` — обновить установленный плагин; `tgz`, `zip` — прямой пакет; 1 и 2 — дескриптор; иначе «schema %d is not supported» | код APK r24; `zip` — tv188b r25, `device` | (устройство r25, код r24)[^224] | | `name` | имя плагина; для `schema` 1 обязателен | код APK r24 | (код r24)[^225] | | `caption`, `title` | ключи в URL встроенных плагинов; `caption` `dunestore` ставит вне ТВ-режима | PHP r24, r25 | (код)[^226] | | `need_confirm_replace` | `dunestore` и `ensure_tv_app_installed` передают 0 | PHP r25 | (код r25)[^227] | | `close_on_success` | `dunestore` и `ensure_tv_app_installed` передают 1 | PHP r25 | (код r25)[^227] | | `signer_id` | добавляется, если задан | PHP r25 | (код r25)[^117] | | `space_needed` | в URL с `download_url` | PHP r25, YouTube | (код)[^228] | | `ignore_existing` | параметр установщика (ключ ли это URL, не установлено); при ≠ 0 и `schema` 2 отключает сравнение с установленной версией | код APK r24 | (код r24)[^225] | Выбор `schema` в `dunestore`: адрес на `.txt` или с «.txt?» — 1, иначе 2; без `update_url` — `download_url` без `schema` (код r24)[^229]. ### 3.5. Элемент плагина в каталоге `dunestore` (r25) Элемент `plugins/plugin` задаёт `name`, `version_index`, `version`, `caption`, `icon_path`, `icon_fit_scale_factor`, `badge_icon_url`, `poster_path`, `archive_path`, `update_url`, `space_needed`, `short_description`, `long_description`, `interface_language`, `language`, `country`, `preferred_language`, `suggested/language+country`, `required_plugins`, `always_install`, `target_plugin`, `target_app`, `target_update_url`, `strict_country`, `apk`, `expr`, `auto_apply_expr`, `product`, `firmware_features` (код r25)[^230]. Категории каталога описаны отдельно (код r25)[^231]. Кэш — на срок до 604800 с с запросом по `If-Modified-Since` (код r25)[^232]. Зависимости из `required_plugins` ставятся перед самим плагином через `plugin_installer://` (код r25)[^108]. Смысл полей описывает страница SDK (всё ниже — по SDK, на r24+ не подтверждено; расхождения с кодом r25 — §5). Каталог — XML с иерархией `catalog/categories/category`, `catalog/plugins/plugin` и `catalog/skins/skin` (SDK)[^233]; приложение принадлежит ровно одной категории (SDK)[^234]. Совпадение `name`, `caption`, `version_index`, `version` с манифестом — §2.7. | Поле `plugin` | Смысл и требования по SDK | Claim | |---|---|---| | `archive_path` | относительно `download_url_prefix`, `.tar.gz`, содержимое как у `dune_plugin*.zip`, манифест с `check_update` | (SDK)[^235] | | `space_needed` | байты после установки во flash-память: `du -sk` × 1024 | (SDK)[^236] | | `language` | фильтр по Interface language, `any` — все | (SDK)[^237] | | `country`, `strict_country` | страны показа по GeoIP, `any` — все; `strict_country` — строже | (SDK)[^238] | | `product` | продукты Dune HD или платформы 8644, 8654, 8670, 8672, 8674 | (SDK)[^239] | | `short_description`, `long_description`, `icon_path`, `badge_icon_url`, `poster_path`, `interface_language` | оформление карточки и списка | (SDK)[^240] | `dsconfig.xml` поддерживается с прошивок `130716_b6+` (SDK)[^241]; по умолчанию список источников содержит только стандартный (SDK)[^242]. | Параметр `dsconfig.xml` | Что задаёт | Claim | |---|---|---| | `sources`: `standard_source`, `source` | у `source` — `catalog_url`, `download_url_prefix`, `icon_url_prefix`; без префиксов они выводятся из `catalog_url`; при описании одного ресурса в нескольких источниках используется первый | (SDK)[^243] | | `enabled_plugins`, `disabled_plugins` | имена через запятую: показать только перечисленные или скрыть их | (SDK)[^244] | | `enabled_plugins_url`, `disabled_plugins_url` | HTTP-URL такого списка, скачивается при каждом входе; не скачался — список плагинов пуст, поэтому нужен надёжный сервер; из четырёх параметров списка действует один | (SDK)[^245] | ### 3.6. Старые прошивки и Sigma Справка без подробностей. По SDK собственная подпись и customer ID есть с `150326_r10` (SDK)[^91], фоновая автопроверка — с `150430_r10` (SDK)[^246]. Платформенные файлы для SMP87xx лежат в `.platform.87xx/`, основная копия — для SMP86xx (SDK)[^247]. По сообщениям пользователей, в Dune 301 (`150721_0136_B9`) предустановленные плагины лежат в `firmware_ext` и удаляются только модификацией прошивки (форум)[^248]. ## 4. Как это делают плагины ### 4.1. Релиз по тегу и свой сервер обновлений: ProIPTV ProIPTV разделяет два выхода сборки. Workflow на каждый тег `N.N.N` публикует `dune_plugin_proiptv.<тег>.zip` как GitHub Release (код)[^98], а `build/make_update.php` упаковывает `update_proiptv.tar.gz` и заполняет в `update_proiptv.xml` поля `version`, `version_index`, `md5` и `size` (код)[^249]. Манифест ссылается на свой хост: `schema` 2, https, `timeout` 0, `auto` false (код)[^250]. Приём снимает ручной пересчёт `md5`; остальное о сборке — «Приёмы разработки плагинов Dune HD». ### 4.2. Семейство на общем хосте и `update.txt`: dune-club.info Из 23 `download_url` `schema` 1 — 18 на dune-club.info (код)[^251]; все 43 адреса обновлений загрузчиков начинаются с `http://` (код)[^252]. Пример манифеста: `schema` 1, `http://dune-club.info/plugins/update/Screenshoter/update.txt` (код)[^253]. Рядом Screenshoter держит `info.txt`, который показывает кнопка `whats_new` (код)[^254]. Сервер с https тоже бывает: у GlobalTV адрес пакета https (код)[^255]. ### 4.3. Пакет-заготовка, который дозаливается обновлением Для форумного распространения кладут только манифест, PHP и значок: в 37 из 43 пакетов ровно три файла (код)[^256]. У всех 41 дескриптора `version_index` выше, чем в манифесте того же плагина, у 39 манифестов он равен 0 (код)[^257]. По сообщениям пользователей, автор liteIPTV пишет, что приложенная версия обновится до актуальной (форум)[^258]. Запустится ли такой пакет без сервера — §6 и «Приёмы разработки плагинов Dune HD». ### 4.4. Community-плагины с подписью Dune HD: GlobalTV, Online Movies Подпись и community-метка бывают вместе. GlobalTV содержит `dune_plugin.sign` и signer ID `com.dune-hd` (код)[^259], а его `dune_plugin_metadata.xml` помечает `community_plugin = yes` и `secure_update = yes` (код)[^260]. Online Movies в метаданных несёт `community_extension` и `signed_community` (код)[^261], а подписант в `commit.txt` — `com.dune-hd` (код)[^262]. GlobalTV задаёт `timeout 86400`, `auto yes`, `dont_ask_confirmations yes` (код)[^263]. Смысл этих меток для оболочки — §6. ### 4.5. Плагин ставит зависимость: YouTube, Entware, altIPTV Плагин может доставить другой плагин сам. Экран настроек YouTube по кнопке `installPlug` возвращает `plugin_installer://…Codec_install.tar.gz` с `name`, `space_needed`, `need_confirm_replace=0` и запускает результат `plugin_launcher://` (код)[^109]. На Android он подставляет другой пакет, `ffmpeg_install` (код)[^264]. Entware проверяет наличие RemTor по `installed_plugins.xml` и либо предлагает установку, либо открывает плагин (код)[^265]. altIPTV ставит `Codec_install` тем же путём с `refresh` (код)[^266]. Запуск и удаление других плагинов — «Приёмы разработки плагинов Dune HD». ## 5. Расхождения **`hd_create_plugin()` в PHP-программе.** SDK требует от PHP-плагина программу с этой функцией (SDK)[^267]; на tv188b r25 (`device`) зонды `kb_probe5` и `kb_probe10` без неё, с классом-наследником `DunePluginFw`, работали, и `handle_user_input` выполнялся (устройство r25)[^268]. Claims связаны `conflicts_with`; подробнее — «Пакет плагина». **Формат URL `plugin_installer://`.** Встроенные PHP-плагины r24 формируют его как `<адрес>:::<ключ>=<значение>&…` (код r24)[^223]. Вторая сторона — гипотеза по строкам о синтаксисе `{ключ=значение}` (`inference`, её claim и суть — в §6). Claims связаны `conflicts_with`; в этой главе использована форма из кода PHP. На tv188b r25 (`device`, запрос 11) форма с `:::` и `schema=zip` сработала (устройство r25)[^24]; форму с фигурными скобками этот прогон для установщика не посылал, r24 не проверялся. **Схема обновления.** SDK называет `schema` 1 устаревшей (SDK)[^136], а в снятых дескрипторах она преобладает: 23 из 29 (код)[^148]; на r25 (`device`) плагины со схемой 1 проверяются (устройство r25)[^56]. Связи `conflicts_with` нет. **Развёртывание через `adb` на Android.** SDK приводит `adb push` в `/flashdata/plugins/` (SDK)[^269], а на r25 каталога `/flashdata` в корне ФС нет, и плагины лежат в `/data/data/com.dunehd.app/flashdata/plugins` (устройство r25)[^270]. Claims связаны `conflicts_with`. **Что перечитывает плагины без перезапуска.** Лог r25 расходится с SDK и сам с собой: новый плагин перечитывание по IP Control не подхватило (устройство r25)[^271], а удалённые после него в одном прогоне остались (устройство r25)[^272], в другом исчезли (устройство r25)[^273]. Утверждение SDK (`disputed`) — в §6. **Установка `.platform.*` и замена встроенного плагина.** SDK буквально говорит, что на Android содержимое `.platform.android` удаляется, а `.platform.87xx` переносится в корень (SDK)[^274]; на r25 (`device`) установщик применил `.platform.android`, затем `.platform.android-arm-api19`, а все `.platform.*` удалил (устройство r25)[^47]. Встроенные плагины по SDK перезаписать нельзя (SDK)[^104], а гипотеза о замене встроенного загрузчиком — в «Пакет плагина». Подробности — «Пакет плагина». **Срок проверки** разобран в «Онлайн-обновление плагина». **Каталог `dunestore`: SDK и код r25.** Значения `type` категории: страница SDK допускает только `plugins` и `skins` (SDK)[^275], код r25 знает ещё `categories` (код r25)[^231]. Поля `plugin`: SDK перечисляет 16 (SDK)[^276], код r25 читает больше, например `update_url`, `required_plugins`, `expr`, `firmware_features` (код r25)[^230]. Обе пары связаны `conflicts_with`; для r25 в этой главе основа — код. Префикс загрузок: SDK называет `http://online.dune-hd.com/dune_store/v1/` (SDK)[^277], код r25 — `http://files3.dune-hd.com/dune_store/v1/` (код r25)[^114]; связи `conflicts_with` нет (`related`). **Проверка подписи при загрузке: SDK и r25.** По SDK подписанный плагин система проверяет и при несовпадении подписи не использует (SDK)[^11]. `populate_plugins` tv188b r25 вызывает `plugin_signer` только при `strict_verify_needed` в `` (код r25)[^60], и в запросе 13 (`device`, один прогон) сторонний `kb_probe13n` без флага с испорченным `dune_plugin.sign` зарегистрирован и работал (устройство r25)[^8]. Первые два claims связаны `conflicts_with`. Как ведёт себя режим `external_plugins_enabled = signed`, это расхождение не решает (§6). **Почему проверяется `shell_ext`.** В запросе 13 (tv188b r25, `device`) у `shell_ext` строки `strict_verify_needed` в `dune_plugin.xml` нет, а DSA-проверка его подписи в `shell.log` есть (устройство r25)[^61]. Вторая сторона — гипотеза (`disputed`, её claim — в §6), что DSA-проверку в логе вызывает только этот флаг. Claims связаны `conflicts_with`; путь вызова `plugin_signer` для `shell_ext` не установлен. **Незаданный `allowed_plugin_signer_ids`.** По SDK без этого параметра разрешены все signer ID (SDK)[^278]. В коде r25 при пустом поле списка `plugin_signer` подставляет `com.dune-hd` или `com.dune-hd,` и отвергает остальные signer ID (код r25)[^14]; ключ для проверки у него есть только для этих двух (код r25)[^10]. Связи `conflicts_with` нет; проявляется ли различие на устройстве — §6. ## 6. Не проверено Здесь гипотезы (`inference`), ослабленные верификатором утверждения (`disputed`) и вопросы, на которые в базе нет ответа. Опираться на них без проверки нельзя. **Подпись и политика установки.** | Claim | Суть | Что мешает | |---|---|---| | (вывод r25)[^279] | на tv188b r25 отсутствие файлов подписи не помешало установке и регистрации `kb_probe5_plat`; это не доказывает, что подпись не проверяется у других плагинов, и не задаёт политику кастомных прошивок | `inference`; лог запроса 11 этот claim не проверил: там другой зонд, `kb_probe11z` (§2.2). Для загрузки на r25 ответ дали код и запрос 13: подпись проверяется при `strict_verify_needed` (код r25)[^60], зонд без флага с испорченной подписью работал (устройство r25)[^8]; политика кастомных прошивок не испытана | | (вывод r24)[^280] | на tv188b r24 без `plugin_config.xml` плагины без `dune_plugin_signer_id.txt` загружались; «подпись не нужна» верно только для розничной r24 без `plugin_config.xml` | `inference`; не проверено на других моделях, кастомных прошивках и для `dune_plugin.sign` | | (вывод r25)[^281] | лог r25 показывает DSA-проверку для `dune-hd.tv` и `shell_ext`; проверяются ли остальные и почему выбраны эти два, из него не следует | `inference`. Для `dune-hd.tv` флаг есть на плеере (устройство r25)[^59], а код связывает проверку с ним (код r25)[^60]; у `shell_ext` флага нет (устройство r25)[^61], путь его проверки не найден | | (вывод r25)[^282] | DSA-проверка в логе r25 видна у `dune-hd.tv` и `shell_ext`, вероятно, потому, что `plugin_signer` вызывается только при `strict_verify_needed=yes` | `inference`, `disputed` (`weakened`): для `dune-hd.tv` согласуется, но у `shell_ext` флага нет, а проверка есть (устройство r25)[^61] (`conflicts_with`, §5). Нужен листинг второй ветки `populate_plugins` для `/firmware_ext/plugins` | | (вывод r25)[^283] | без `strict_verify_needed` `populate_plugins` r25 подпись стороннего плагина не проверяет; `external_plugins_enabled=signed`, если действует, работает через фильтр «not permitted», `.bad_signature` или установщик — какой механизм, не установлено | `inference`, `disputed` (`unclear`): первая часть подтверждена на устройстве (устройство r25)[^8], режим `signed` не проверялся. Нужны вызывающая сторона `FUN_00215e08` и тело фильтра `0x00690bf0` | | (вывод r24)[^284] | `ro_config_load_if_needed` в `libduneutil.so` r24 читает `external_plugins_enabled` и `allowed_plugin_signer_ids` из `/config/ro_config.properties` или `/firmware/config/ro_config.properties` и различает `signed` и `none` | `inference`: только псевдокод Ghidra, подтверждающего r2-листинга нет; на r25 разбор этих двух параметров подтверждён кодом (код r25)[^285], на r24 это не переносится | | (вывод r24)[^286] | запрет неподписанных — настройка кастомных прошивок; механизм r24 неизвестен. Наблюдения на розничной tv188b r24 — в §2.2 (устройство r24)[^287] | `inference`, `verified`; `dune_plugin.sign` в том прогоне не искали | | (вывод r24)[^288] | установщик может отказать неподписанному, при другом `signer_id` и при замене «hard-coded»; что действует по умолчанию, неизвестно | `disputed`: запреты установщика на устройстве не испытывались | | (вывод r24)[^289] | что делает загрузчик с неверной подписью без `strict_verify_needed` | `inference`; на r24 не проверено. На tv188b r25 по коду без флага подпись не проверяется (код r25)[^60], в запросе 13 зонд без флага с испорченной подписью работал (устройство r25)[^8] | | (вывод r24)[^290] | `.bad_signature` помечает плагин, и загрузчик его пропускает | `disputed` для r24. Код r25 это показывает для каталогов ветки 0 (§3.3) (код r25)[^213], а создать файл пытается проверка режима `signed` (код r25)[^6]; на устройстве не проверялось | | (вывод r24)[^291] | `plugin_config.xml` задаёт политику по имени плагина с умолчаниями | `disputed`: файла нет на устройстве и в четырёх прошивках, а поиск запроса 11 в `/system`, `/vendor` и `/data/data/com.dunehd.app` его тоже не нашёл (устройство r25)[^70]; формат описан в SDK (§3.3), применение на r24+ не проверено | | (вывод r24)[^292] | `/config/plugin_config.xml` дополняет или перекрывает `/firmware/config/plugin_config.xml` | `disputed`: приоритет не виден | | (вывод r24)[^293] | подпись считается по DSA по обычным файлам каталога плагина | для r24 порядок файлов и исключение `dune_plugin.sign` не установлены; для r25 — код (код r25)[^16] | | (вывод r24)[^294] | ключ ищется в двух путях `plugin_key.pem` | `disputed`: для r24 роль `/config/plugin_key.pem` и приоритет не установлены; на устройстве r24 файла нет. На r25 по коду пути `plugin_key.pem` нужны только для signer ID, равного customer ID, `/config` — первым (код r25)[^10] | | (вывод r24)[^295] | `signer_id` сравнивается с требуемым и может быть отклонён | для r24 условие не установлено; для r25 — код (код r25)[^296] | **Установка и обновление.** | Claim | Суть | Что мешает | |---|---|---| | (SDK)[^297] | `LaunchMediaUrl` выбирает установщик и деинсталлятор по URL | `disputed`: запись верификатора подтвердила на r25 только `plugin_launcher://`. Установщик и деинсталлятор потом наблюдались по IP Control (устройство r25)[^298], но claim о выборе по плейлисту заново не проверялся | | (вывод r24)[^299] | параметры `plugin_installer://` — в синтаксисе `{ключ=значение}` | гипотеза по строкам, связана `conflicts_with` с кодом PHP (§5) | | (вывод r24)[^300] | пакет скачивается как `__plugin__.zip`, распаковывается и копируется в `<хранилище>/plugins/` | вывод из строк r24; на r25 близкая цепочка наблюдалась (устройство r25)[^33] | | (вывод r24)[^301] | на r24 `name` сравнивается с каталогом, этап отказа вероятен в `populate_plugins` | отказ установщика не установлен; на r25 — §2.13 | | (вывод r24)[^302] | `require` и `required_firmware_features` отсеивают дескрипторы по прошивке на tv188b | для APK r24 — код, на tv188b не проверено | | (вывод)[^303] | заготовки без `lib/` без обновления не выполнятся | вывод из состава пакета; запуск без сети не проверялся | | (SDK)[^304] | перечитать плагины: ANGLE/ROTATE, Refresh или IP Control | `disputed`: на r25 новый плагин не появился (устройство r25)[^271] | **В базе нет данных о следующем.** Это вопросы, а не утверждения о Дюне. - Ставится и запускается ли неподписанный ZIP штатным установщиком на r24, а на r25 — на других моделях и прошивках; на tv188b r25 есть два зонда (§2.2). - Что делает на устройстве `external_plugins_enabled = signed`: код r25 описывает проверку с `.bad_signature` (§2.2), но откуда она вызывается (установщик, загрузка или оба), в листингах не видно. - Что делает загрузчик tv188b r25 с плагином со `strict_verify_needed`, `dune_plugin_signer_id.txt` и испорченным `dune_plugin.sign`: зонд запроса 13 отвергнут раньше, на отсутствии signer ID (устройство r25)[^7], так что сам DSA-отказ не наблюдался. - Каким путём `plugin_signer` вызывается для `shell_ext` без `strict_verify_needed` (§5) и проверяются ли так другие плагины `/firmware_ext/plugins`. - Условия фильтра «plugin %s is not permitted» (функция `0x00690bf0`) и связь его с `ro_config`. - Проявляется ли на устройстве расхождение SDK и кода r25 о незаданном `allowed_plugin_signer_ids` (§5). - Какая политика задана на устройстве: `/firmware/config/ro_config.properties` прогон запроса 11 не читал, а `plugin_config.xml` вне трёх каталогов его поиска не искал (§2.2). - Как получить подпись `com.dune-hd` и как попасть в стандартный и community-каталог `dunestore`; порядка приёма стороннего плагина в разобранных страницах SDK нет. - Попадает ли `dsconfig.xml` на устройство пользователя иначе, чем в составе прошивки, и работает ли свой `source` на практике. - Что значат для оболочки `community_plugin`, `community_extension`, `signed_community`, `secure_update` и читает ли она `dune_plugin_metadata.xml`. - Что `signer_id` в URL `plugin_installer://` меняет при установке. - Ставится ли ZIP с USB-накопителя на r24 и r25 и обязательна ли форма имени `dune_plugin*.zip`: на tv188b r25 проверено одно другое имя, и не установлено, в нём ли причина (§2.5). - Становятся ли исполняемыми файлы `bin/` и `www/cgi-bin/` при установке из `tgz`. - Вызывается ли `install` при установке ZIP на r24 и на других моделях r25; на tv188b r25 есть один прогон (§2.2). - Удаляются ли cookies плагина при штатном удалении на tv188b r25 (§2.14) и что остаётся от `plugins_data` и cookies на других прошивках. - Работают ли на устройстве `schema=2` и `schema=update` и запуск `plugin_installer://` из действия плагина или с сайта; по IP Control на tv188b r25 проверена только форма `schema=zip` (§2.6). [^1]: doc-sdk-plugins.c016 · doc · any-documented; прошивка — · Установщик плагина — ZIP-архив с файлом dune_plugin.xml на верхнем уровне и прочими файлами плагина [^2]: doc-sdk-plugins.c111 · doc · any-documented; прошивка — · Пакет обновления — .tar.gz с тем же содержимым, что у установочного dune_plugin*.zip; md5 — сумма .tar.gz; size — место после установки (du -sk × 1024) [^3]: - fw-tv188b-261021-0117-r25--plugin-loader.c037 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 ZIP dune_plugin_kb_probe5_plat.zip без dune_plugin.sign и dune_plugin_signer_id.txt установлен штатно в /flashdata/plugins/kb_probe5_plat (в логе; фактически /data/data/com.dunehd.app/flashdata/plugins/kb_probe5_plat) и зарегистрирован как Plugin 'kb_probe5_plat' of type 'plain'. - fw-tv188b-261021-0117-r25--plugin-loader.c046 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 на tv188b r25 штатный установщик принял dune_plugin_kb_probe11z.zip без dune_plugin.sign и dune_plugin_signer_id.txt и зарегистрировал kb_probe11z как php. [^4]: fw-tv188b-260827-0003-r24--plugin-loader.c040 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · libduneshell.so содержит сообщения установщика плагинов о запретах: «install not allowed for plugin», «install not allowed for unsigned plugin», «replace hard-coded plugin '%s' not allowed», «replace not allowed for plugin '%s' because of signer_id mismatch», «unsigned plugins not allowed», «signer_id '%s' not allowed by firmware», «signature verification failed» [^5]: - fw-tv188b-261021-0117-r25--plugin-loader.c066 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В populate_plugins (0x00215450) r25 после разбора манифеста plugin_signer (0x002aa204) вызывается только если properties_get_bool(<свойства плагина>, "strict_verify_needed", 0) истинно; при ложном значении плагин регистрируется без вызова plugin_signer. - fw-tv188b-261021-0117-r25--plugin-loader.c085 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Свойства, из которых populate_plugins r25 читает strict_verify_needed, поступают из манифеста dune_plugin.xml: FUN_00215304 передаёт прочитанный XML в FUN_0029006c, тот передаёт результат xml_utils_get_child_element_params с именем params восьмым аргументом FUN_0028ff44, который сохраняет его в +0x1c возвращаемого описателя; populate_plugins читает свойства из того же +0x1c. [^6]: fw-tv188b-261021-0117-r25--plugin-loader.c082 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В режиме external_plugins_enabled=signed FUN_00215e08 r25 вызывает plugin_signer (0x002aa204) для переданных имени и каталога плагина с третьим аргументом 0; при результате 0 пытается создать <каталог>/.bad_signature, пишет «[plugin] %s: marked as bad» и возвращает 0. [^7]: fw-tv188b-261021-0117-r25--plugin-loader.c086 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 13 (один прогон) сторонний kb_probe13v с yes в params и испорченным dune_plugin.sign не зарегистрирован: plugin_signer остановился на «the required signer_id is missing», populate_plugins — «signature verification failed for 'kb_probe13v', but required»; в installed_plugins.xml его нет. [^8]: fw-tv188b-261021-0117-r25--plugin-loader.c087 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 13 (один прогон) сторонний kb_probe13n с тем же испорченным dune_plugin.sign, но без strict_verify_needed, зарегистрирован без строк plugin_signer, есть в installed_plugins.xml, и его точка входа KB13N dlg вызвала handle_user_input(dlg). [^9]: doc-sdk-plugins.c119 · doc · any-documented; прошивка — · Собственная подпись (150326_r10+): DSA-ключи 2048 через openssl, подпись утилитой plugin_sign.x86

, публичный ключ кладётся в прошивку как /firmware/config/plugin_key.pem [^10]: fw-tv188b-261021-0117-r25--plugin-loader.c075 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · plugin_signer r25 проверяет подпись signer_id «com.dune-hd» встроенным в libduneshell.so ключом (dsa_sign_verify_dsa_signature с константами DAT_00e8e8c8…); другой signer_id принимается, только если равен get_customer_id(), и тогда ключ берётся из /config/plugin_key.pem, а без него — из /firmware/config/plugin_key.pem; иначе «unsupported signer_id» или «plugin_key.pem not found» и 0. Итог пишется «DSA verification for signer_id %s: OK|failed». [^11]: doc-sdk-plugins.c117 · doc · any-documented; прошивка — · Для подписанного плагина система проверяет подпись и отказывается его использовать при несовпадении подписи или недопустимом signer ID [^12]: fw-tv188b-260827-0003-r24--plugin-loader.c050 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · libduneshell.so содержит строки [plugin_signer]: файлы dune_plugin.sign и dune_plugin_signer_id.txt, signer_id com.dune-hd, ключ /firmware/config/plugin_key.pem или /config/plugin_key.pem, DSA-проверку [^13]: fw-tv188b-261021-0117-r25--plugin-loader.c070 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · plugin_signer (0x002aa204) r25 читает signer_id из файла dune_plugin_signer_id.txt в каталоге плагина (FUN_002aa164); если его нет — «[plugin_signer] %s: the required signer_id is missing» и результат 0; если третий аргумент задан и не равен signer_id — «invalid signer_id: requied(%s) != actual(%s)» и 0 (populate_plugins передаёт 0, т. е. без требуемого signer_id). [^14]: fw-tv188b-261021-0117-r25--plugin-loader.c071 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · plugin_signer r25 проверяет signer_id по списку через запятую (FUN_002a9f64); список берётся из поля ro_config по смещению 0x1f0, а если оно пусто — «com.dune-hd» или «com.dune-hd,»; signer_id не из списка — «[plugin_signer] %s: signer_id '%s' not allowed» и 0. [^15]: fw-tv188b-261021-0117-r25--plugin-loader.c073 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · plugin_signer r25 открывает <каталог>/dune_plugin.sign; нет файла — «the required signature not found for plugin '%s'» и 0; файл читается до 256 байт, и если его размер (ftell после fseek в конец) не равен прочитанному — «invalid signature file for plugin '%s'» и 0. [^16]: fw-tv188b-261021-0117-r25--plugin-loader.c074 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Дайджест подписи в plugin_signer r25 (FUN_002a9ab4) — SHA по содержимому всех обычных файлов каталога плагина рекурсивно, имена в каждом каталоге сортируются qsort; на верхнем уровне пропускаются dune_plugin.sign и, у плагина shell_ext, каталог icons; не-обычные файлы пропускаются с WARNING. [^17]: - doc-sdk-dune-custom-firmware.c001 · doc · any-documented; прошивка — · Параметр external_plugins_enabled в /firmware/config/ro_config.properties задаёт, какие сторонние плагины разрешены; умолчание — all, доступен с прошивок 130803_b8+. - doc-sdk-dune-custom-firmware.c004 · doc · any-documented; прошивка — · allowed_plugin_signer_ids задаёт разделённый запятыми список допустимых signer ID; если параметр не задан, разрешены все signer ID; умолчание — не задан, доступен с прошивок 130803_b8+. - doc-sdk-dune-custom-firmware.c006 · doc · any-documented; прошивка — · Файл /firmware/config/plugin_config.xml позволяет ограничить действия с отдельными плагинами — указать, какие нельзя устанавливать, заменять или удалять; доступен с прошивок 150113_b9+. [^18]: fw-tv188b-261021-0117-r25--plugin-loader.c079 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · ro_config_load_if_needed r25 сохраняет external_plugins_enabled в ro_config+0x1ec: signed (без учёта регистра) — 1, none — 2, отсутствующее или любое другое значение — 0. [^19]: fw-tv188b-261021-0117-r25--plugin-loader.c081 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При external_plugins_enabled=none (ro_config+0x1ec == 2) FUN_00215ed4 r25 пропускает вызовы populate_plugins для /flashdata/plugins и /tmp/mnt/D/dune_plugins, но продолжает вызовы для /fconfig/plugins, /firmware/plugins и /firmware_ext/plugins. [^20]: fw-tv188b-261021-0117-r25--plugin-loader.c072 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Поле ro_config по смещению 0x1f0, из которого plugin_signer r25 берёт список допустимых signer_id, заполняется разборщиком ro_config_load_if_needed из свойства allowed_plugin_signer_ids. [^21]: - fw-tv188b-261021-0117-r25--plugin-loader.c049 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 на tv188b r25 чтение /config/ro_config.properties и /data/data/com.dunehd.app/config/ro_config.properties вернуло No such file or directory для обоих путей. - fw-tv188b-261021-0117-r25--plugin-loader.c050 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 на tv188b r25 команда find /system /vendor /data/data/com.dunehd.app -name plugin_config.xml не вывела совпадений между метками начала и конца поиска. [^22]: fw-tv188b-261021-0117-r25.c219 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 dune_plugin_kb_probe5_plat.zip, запущенный в файловом браузере плеера из /sdcard/DuneHD, установлен в /data/data/com.dunehd.app/flashdata/plugins/kb_probe5_plat; после установки есть также каталоги /data/data/com.dunehd.app/flashdata/plugins_archive/kb_probe5_plat, …/flashdata/plugins_data/kb_probe5_plat и /tmp/plugins/kb_probe5_plat. [^23]: fw-tv188b-261021-0117-r25--shell-ext--search-tv.c026 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · ensure_tv_app_installed r25 для type=plugin: если плагин уже установлен и force_check_update — запускает plugin_installer://:::schema=update (при need_launch с launch после), иначе если не установлен — требует update_url и запускает plugin_installer://:::schema=2&name=&need_confirm_replace=0&close_on_success=1 с необязательным signer_id (при need_launch с launch после). [^24]: fw-tv188b-261021-0117-r25--plugin-loader.c053 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 IP Control launch_media_url с plugin_installer://HTTP-URL:::schema=zip&name=kb_probe11z&need_confirm_replace=0&close_on_success=1 заменил уже установленный kb_probe11z и зарегистрировал его как php. [^25]: - fw-tv188b-261021-0117-r25--builtin-plugins-misc.c031 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Элемент plugins/plugin каталога задаёт name, version_index, version, caption, icon_path, icon_fit_scale_factor (по умолчанию 0.9), badge_icon_url, poster_path, archive_path, update_url, space_needed, short_description, long_description, interface_language, language, country, preferred_language, suggested/language+country, required_plugins, always_install, target_plugin, target_app, target_update_url, strict_country, apk, expr, auto_apply_expr, product, firmware_features; skins/skin — name, caption, icon_path, archive_path, space_needed, short_description. - fw-tv188b-261021-0117-r25--builtin-plugins-misc.c028 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В обычном режиме источники каталога dunestore: /config/dsconfig.xml, иначе /firmware/config/dsconfig.xml; без файла, при ошибке разбора или без элемента sources используются standard_source и community_source. В sources допустимы standard_source, community_source и source (обязателен непустой catalog_url с «/»; signer_id; icon_url_prefix и download_url_prefix по умолчанию — каталог catalog_url; community=yes); неизвестный элемент и source без непустого catalog_url, содержащего «/», пропускаются. [^26]: doc-sdk-dune-store.c048 · doc · any-documented; прошивка — · Чтобы применить кастомную конфигурацию Dune Store, прошивка должна включать файл dsconfig.xml (описание — в документе Custom firmware images). [^27]: doc-sdk-plugins.c105 · doc · any-documented; прошивка — · Онлайн-обновление: в манифесте задаются version_index (число, растёт с каждой версией, в UI не показывается), version (подпись для UI) и check_update (schema, url, timeout, required, auto) [^28]: doc-sdk-plugins.c106 · doc · any-documented; прошивка — · Проверка обновления выполняется при запуске любой точки входа плагина; найденное обновление предлагается пользователю, после установки запускается исходная точка входа [^29]: fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c078 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 запуск точки входа плагина по IP Control (launch_media_url plugin_launcher://{name=…}{ep_media_url=…}) вызывает проверку обновления check_update schema 2: оболочка грузит update info из check_update/url с тайм-аутом 1 («loading update info with timeout 1»), тогда как фоновая автопроверка — с тайм-аутом 5. [^30]: fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c080 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 после удалённой проверки обновления на запуске (schema 2) /tmp/plugin_updater_.txt содержит время проверки + next_check_update_timeout из update_info.xml (20), а не + check_update/timeout манифеста (3600): проверка в 1793207761 записала 1793207781, проверка в 1793207784 — 1793207804. [^31]: fw-tv188b-261021-0117-r25.c082 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 global_action install не выполняется, если плагин положен в $FS_PREFIX/flashdata/plugins через adb push и приложение перезапущено: маркеров install от kb_probe5 и kb_probe6_sup нет, тогда как boot, boot_end и gui_start kb_probe5 выполнились. [^32]: fw-tv188b-261021-0117-r25.c206 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 плагин разворачивается без установщика: каталог копируется adb push (под adb root) в /data/data/com.dunehd.app/flashdata/plugins/, затем chown -R system:system и chmod -R +x для bin и www/cgi-bin; после перезапуска приложения (am force-stop com.dunehd.app) оболочка регистрирует такой плагин («Plugin '

' of type '' is registered»). [^33]: fw-tv188b-261021-0117-r25.c217 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 штатный установщик ZIP перед распаковкой выполняет rm -rf '/tmp/plugin_tmp' и mkdir, затем распаковывает архив командой «unzip '' -d /data/data/com.dunehd.app/tmp/plugin_tmp» и копирует оттуда каталог в /flashdata/plugins/

, предварительно удаляя прежний (FS_remove_recursively_if_exists). [^34]: fw-tv188b-261021-0117-r25.c218 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 после штатной установки ZIP оболочка пишет «[plugin_installer] reloading plugin», регистрирует плагин («Plugin 'kb_probe5_plat' of type 'plain' is registered») и «[plugin_installer] Done.» в том же процессе приложения (pid 19586), без перезапуска приложения. [^35]: fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c059 · code · android-atv; прошивка 260724_0207_r24 · В APK r24 разбор schema 1 (fcn.002c5968) считает обновление доступным, только если version_index из update.txt больше установленного (иначе результат «нет обновления», download_url и space_needed не проверяются); обновление критическое, если last_critical_version_index ≥ 1 и установленный version_index меньше него [^36]: fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c087 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 установка обновления после «Обновить» идёт так: «loading tgz-archive» (пакет по url из update info), распаковка «tar -x -z -C /tmp/plugin_tmp», глобальное действие going_to_update у установленной старой версии (в её php_server), остановка этого php_server, удаление /flashdata/plugins/ и /tmp/plugins/, копирование /tmp/plugin_tmp в /flashdata/plugins/ (cp_r) и перерегистрация плагина («reloading plugin»). [^37]: fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c045 · code · tv188b, android-atv; прошивка 260724_0207_r24 · В APK r24 check_update/url читается только для schema 1 и 2 (при schema 0 и 3 — нет); для schema 1–2 без url или с пустым url проверка отключается сообщением «invalid or missing 'check_update/check_update_url'» [^38]: doc-sdk-plugins.c115 · doc · any-documented; прошивка — · Встроенные в розничную прошивку и распространяемые через Dune Store плагины подписаны Dune HD; подписанный плагин содержит dune_plugin.sign и dune_plugin_signer_id.txt [^39]: fw-tv188b-261021-0117-r25.c210 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 плагин, у которого name в dune_plugin.xml (kb_probe5_other) не равен имени каталога (kb_probe5_badname), не регистрируется: строки «Plugin … is registered» для него нет, в /tmp/run/installed_plugins.xml и /tmp/www/plugins его нет ни под тем, ни под другим именем. [^40]: - doc-sdk-plugins.c016 · doc · any-documented; прошивка — · Установщик плагина — ZIP-архив с файлом dune_plugin.xml на верхнем уровне и прочими файлами плагина - doc-sdk-plugins.c111 · doc · any-documented; прошивка — · Пакет обновления — .tar.gz с тем же содержимым, что у установочного dune_plugin*.zip; md5 — сумма .tar.gz; size — место после установки (du -sk × 1024) [^41]: doc-sdk-plugins.c017 · doc · any-documented; прошивка — · Плагин устанавливается запуском файла dune_plugin*.zip с любого носителя (например, USB-флешки) и ставится во флеш-память устройства [^42]: fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c034 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Пакет обновления скачивается установщиком как «%s-archive» (tgz или zip), md5 сверяется («md5 does not match», expected/actual); zip распаковывается командой unzip __plugin__.zip во временном каталоге [^43]: - fw-tv188b-261021-0117-r25.c216 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 после штатной установки ZIP файл bin/marker.txt, который в ZIP имел права -rw-r--r--, получил -rwxr-xr-x, а dune_plugin.xml и only_android.txt в корне плагина остались -rw-r--r--. - fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c089 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 файлы плагина, установленные онлайн-обновлением из tgz, — владелец system, -rw-r--r--, метка u:object_r:system_app_data_file:s0; в архиве у них тоже -rw-r--r--, а файлы v1, положенные adb push, были -rw-rw-rw-. [^44]: fw-tv188b-261021-0117-r25.c216 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 после штатной установки ZIP файл bin/marker.txt, который в ZIP имел права -rw-r--r--, получил -rwxr-xr-x, а dune_plugin.xml и only_android.txt в корне плагина остались -rw-r--r--. [^45]: fw-tv188b-261021-0117-r25--plugin-loader.c052 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 на tv188b r25 штатная установка kb_probe11z изменила mode файлов bin/ga.sh и www/cgi-bin/ping.sh с 644 в ZIP на 755 в каталоге плагина. [^46]: fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c089 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 файлы плагина, установленные онлайн-обновлением из tgz, — владелец system, -rw-r--r--, метка u:object_r:system_app_data_file:s0; в архиве у них тоже -rw-r--r--, а файлы v1, положенные adb push, были -rw-rw-rw-. [^47]: - fw-tv188b-261021-0117-r25.c214 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 штатный установщик ZIP применил к корню плагина сначала .platform.android (скопировал only_android.txt и bin/marker.txt в корень), затем поверх — .platform.android-arm-api19 (bin/marker.txt перезаписан); в установленном плагине bin/marker.txt = «.platform.android-arm-api19» и есть only_android.txt. В shell.log — «[plugin_installer] applying /tmp/plugin_tmp/.platform.». - fw-tv188b-261021-0117-r25.c215 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 штатный установщик ZIP не применил .platform.87xx и .platform.foo и удалил все четыре каталога .platform.* (android-arm-api19, 87xx, android, foo: «[plugin_installer] removing /tmp/plugin_tmp/.platform.») до копирования; в установленном плагине нет ни каталогов .platform.*, ни only_87xx.txt. [^48]: - fw-tv188b-261021-0117-r25.c209 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25, если name в dune_plugin.xml не равен имени каталога плагина, оболочка при загрузке пишет в shell.log «[populate_plugins] invalid plugin manifest from '<путь>/dune_plugin.xml': name '' is not equal to directory name '<каталог>'». - fw-tv188b-261021-0117-r25.c210 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 плагин, у которого name в dune_plugin.xml (kb_probe5_other) не равен имени каталога (kb_probe5_badname), не регистрируется: строки «Plugin … is registered» для него нет, в /tmp/run/installed_plugins.xml и /tmp/www/plugins его нет ни под тем, ни под другим именем. [^49]: fw-tv188b-261021-0117-r25.c213 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 точки входа плагина kb_probe5 (root://applications), заданные без icon_url, в разделе «Приложения» не появлялись. [^50]: fw-tv188b-261021-0117-r25--plugin-loader.c037 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 ZIP dune_plugin_kb_probe5_plat.zip без dune_plugin.sign и dune_plugin_signer_id.txt установлен штатно в /flashdata/plugins/kb_probe5_plat (в логе; фактически /data/data/com.dunehd.app/flashdata/plugins/kb_probe5_plat) и зарегистрирован как Plugin 'kb_probe5_plat' of type 'plain'. [^51]: fw-tv188b-261021-0117-r25--plugin-loader.c046 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 на tv188b r25 штатный установщик принял dune_plugin_kb_probe11z.zip без dune_plugin.sign и dune_plugin_signer_id.txt и зарегистрировал kb_probe11z как php. [^52]: fw-tv188b-261021-0117-r25--plugin-loader.c047 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 на tv188b r25 после установки kb_probe11z оболочка выполнила global action install как sh bin/ga.sh install; маркер ga_install.txt записал event=install и uid=1000(system). [^53]: fw-tv188b-261021-0117-r25--plugin-loader.c048 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 на tv188b r25 после установки неподписанного kb_probe11z ENTER пультом на «KB11 zip» в «Приложения» → DUNE HD вызвал handle_user_input с control_id=enter и диалог «KB probe 11z / OK: zip». [^54]: fw-tv188b-261021-0117-r25--plugin-loader.c051 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 на tv188b r25 сохранённый фрагмент shell.log установки kb_probe11z содержит [plugin_installer], регистрацию и install action, но не содержит сообщений [plugin_signer] или DSA-проверки этого зонда. [^55]: fw-tv188b-261021-0117-r25--plugin-loader.c034 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 поиск dune_plugin.sign в $P/flashdata/plugins и $P/firmware_ext/plugins нашёл ровно 10 файлов: dune-hd.tv, dunemdb_supplier_youtube, smotreshka.tv, dunemdb_supplier_online_movies, dunestore, dunemdb_supplier_generic, android_apps, ktv_start, widget, shell_ext. [^56]: fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c026 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В том же логе r25 плагины с URL update.txt (Screenshoter, widget_ext) проверяются как [schema1]: лог показывает current и available version_index/version и «last_critical_version_index = 1, critical = no»; плагины с update_info.xml — как [schema2] [^57]: fw-tv188b-261021-0117-r25--plugin-loader.c035 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В shell.log r25 при загрузке плагинов из /flashdata/plugins для dune-hd.tv записаны num_files=224, num_bytes=2701081, digest A8235D91EA8D8DB2E60845D3B2826327CFB300FB и «[plugin_signer] DSA verification for signer_id com.dune-hd: OK». [^58]: fw-tv188b-261021-0117-r25--plugin-loader.c036 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В shell.log r25 при загрузке плагинов из /firmware_ext/plugins для shell_ext записаны num_files=292, num_bytes=3942977, digest 39A76B386D5C62C25A753DE2E92F5EE4363C2966 и «[plugin_signer] DSA verification for signer_id com.dune-hd: OK». [^59]: fw-tv188b-261021-0117-r25--plugin-loader.c089 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 13 (один прогон) установленный на плеере dune-hd.tv содержит в dune_plugin.xml строку yes, и при каждом запуске оболочки его подпись проходит DSA-проверку (signer_id com.dune-hd: OK). [^60]: fw-tv188b-261021-0117-r25--plugin-loader.c066 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В populate_plugins (0x00215450) r25 после разбора манифеста plugin_signer (0x002aa204) вызывается только если properties_get_bool(<свойства плагина>, "strict_verify_needed", 0) истинно; при ложном значении плагин регистрируется без вызова plugin_signer. [^61]: fw-tv188b-261021-0117-r25--plugin-loader.c088 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 13 (один прогон) grep strict_verify_needed не нашёл строки в dune_plugin.xml встроенных плагинов (firmware_ext/plugins/*, в том числе shell_ext), а нашёл только у dune-hd.tv и зондов в flashdata; при этом shell.log пишет DSA-проверку подписи shell_ext («DSA verification for signer_id com.dune-hd: OK»). [^62]: fw-tv188b-260827-0003-r24--plugin-loader.c108 · device · tv188b, android-dune-fw; прошивка 260827_0003_r24 · На tv188b r24 поиск по /system, /vendor и /data/data/com.dunehd.app не нашёл plugin_config.xml; в выводе только 10 файлов dune_plugin_signer_id.txt. [^63]: fw-tv188b-260827-0003-r24--plugin-loader.c109 · device · tv188b, android-dune-fw; прошивка 260827_0003_r24 · На tv188b r24 в /tmp/run/installed_plugins.xml загружены плагины, для которых поиск не нашёл dune_plugin_signer_id.txt, в том числе melange, play_in_apps, Filmix_api, Screenshoter, VPN и test_php-cgi; наличие dune_plugin.sign у них не проверялось. [^64]: doc-sdk-dune-custom-firmware.c005 · doc · any-documented; прошивка — · В разделе «Secure firmware» для запрета установки и запуска произвольных сторонних плагинов рекомендуется выставить external_plugins_enabled = signed в /firmware/config/ro_config.properties. [^65]: fw-tv188b-261021-0117-r25--plugin-loader.c038 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В strings libduneutil.so r25 присутствуют имена external_plugins_enabled, signed и allowed_plugin_signer_ids. [^66]: fw-tv188b-260827-0003-r24--plugin-loader.c112 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · В strings libduneutil.so r24 присутствуют имена external_plugins_enabled, signed и allowed_plugin_signer_ids. [^67]: - fw-tv188b-260827-0003-r24--plugin-loader.c110 · doc · any-documented; прошивка — · SDK описывает ro_config-параметр external_plugins_enabled: all — разрешены все сторонние плагины, signed — только подписанные Dune HD (signer_id должен быть в allowed_plugin_signer_ids, если список задан), none — сторонние плагины запрещены; по умолчанию all. - fw-tv188b-260827-0003-r24--plugin-loader.c111 · doc · any-documented; прошивка — · SDK описывает ro_config-параметр allowed_plugin_signer_ids: список разрешённых signer id через запятую; если параметр не задан, разрешены все signer id. [^68]: fw-tv188b-260827-0003-r24--firmware-config.c012 · code · android-dune-fw; прошивка 260827_0003_r24, 250815_1012_r22, 261021_0117_r25 · ro_config.properties задаёт следующие 1 начальных записей: check_fw_upgrade_in_wizard = yes. [^69]: fw-tv188b-261021-0117-r25--plugin-loader.c049 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 на tv188b r25 чтение /config/ro_config.properties и /data/data/com.dunehd.app/config/ro_config.properties вернуло No such file or directory для обоих путей. [^70]: fw-tv188b-261021-0117-r25--plugin-loader.c050 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 на tv188b r25 команда find /system /vendor /data/data/com.dunehd.app -name plugin_config.xml не вывела совпадений между метками начала и конца поиска. [^71]: fw-tv188b-260827-0003-r24--plugin-loader.c013 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · libduneshell.so содержит строки «strict_verify_needed» и «[populate_plugins] ERROR: signature verification failed for '%s', but required» [^72]: plg-ds-dune-hd-tv.c003 · code · unknown; прошивка — · Тип плагина — php, программа i24h.php; в params заданы strict_verify_needed = yes и pf_allowed = yes. [^73]: fw-tv188b-261021-0117-r25--plugin-loader.c085 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Свойства, из которых populate_plugins r25 читает strict_verify_needed, поступают из манифеста dune_plugin.xml: FUN_00215304 передаёт прочитанный XML в FUN_0029006c, тот передаёт результат xml_utils_get_child_element_params с именем params восьмым аргументом FUN_0028ff44, который сохраняет его в +0x1c возвращаемого описателя; populate_plugins читает свойства из того же +0x1c. [^74]: fw-tv188b-261021-0117-r25--plugin-loader.c067 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Если при strict_verify_needed plugin_signer вернул 0, populate_plugins r25 пишет «[populate_plugins] ERROR: signature verification failed for '%s', but required» и не регистрирует плагин (переход к освобождению описателя, минуя регистрацию). [^75]: fw-tv188b-261021-0117-r25--plugin-loader.c076 · code · unknown; прошивка — · Манифест dune_plugin.xml плагина dune-hd.tv (версия 240718_1541) содержит в строку yes. [^76]: - fw-tv188b-261021-0117-r25--plugin-loader.c070 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · plugin_signer (0x002aa204) r25 читает signer_id из файла dune_plugin_signer_id.txt в каталоге плагина (FUN_002aa164); если его нет — «[plugin_signer] %s: the required signer_id is missing» и результат 0; если третий аргумент задан и не равен signer_id — «invalid signer_id: requied(%s) != actual(%s)» и 0 (populate_plugins передаёт 0, т. е. без требуемого signer_id). - fw-tv188b-261021-0117-r25--plugin-loader.c071 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · plugin_signer r25 проверяет signer_id по списку через запятую (FUN_002a9f64); список берётся из поля ro_config по смещению 0x1f0, а если оно пусто — «com.dune-hd» или «com.dune-hd,»; signer_id не из списка — «[plugin_signer] %s: signer_id '%s' not allowed» и 0. - fw-tv188b-261021-0117-r25--plugin-loader.c073 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · plugin_signer r25 открывает <каталог>/dune_plugin.sign; нет файла — «the required signature not found for plugin '%s'» и 0; файл читается до 256 байт, и если его размер (ftell после fseek в конец) не равен прочитанному — «invalid signature file for plugin '%s'» и 0. - fw-tv188b-261021-0117-r25--plugin-loader.c075 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · plugin_signer r25 проверяет подпись signer_id «com.dune-hd» встроенным в libduneshell.so ключом (dsa_sign_verify_dsa_signature с константами DAT_00e8e8c8…); другой signer_id принимается, только если равен get_customer_id(), и тогда ключ берётся из /config/plugin_key.pem, а без него — из /firmware/config/plugin_key.pem; иначе «unsupported signer_id» или «plugin_key.pem not found» и 0. Итог пишется «DSA verification for signer_id %s: OK|failed». [^77]: fw-tv188b-261021-0117-r25--plugin-loader.c080 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В FUN_00215ed4 r25 второй аргумент populate_plugins равен 0 для /flashdata/plugins и /tmp/mnt/D/dune_plugins, а для /fconfig/plugins, /firmware/plugins и /firmware_ext/plugins — 1. [^78]: fw-tv188b-261021-0117-r25--plugin-loader.c083 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · FUN_00215e08 r25 возвращает 0 сразу при external_plugins_enabled=none; при режиме 0 возвращает 1 без вызова plugin_signer, при signed с успешным plugin_signer также возвращает 1. [^79]: - fw-tv188b-261021-0117-r25--plugin-loader.c068 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В ветке populate_plugins r25 со вторым аргументом 0 плагин пропускается без загрузки, если в его каталоге есть обычный файл .bad_signature (лог «[populate_plugins] %s: bad_signature flag is set»); в ветке с ненулевым вторым аргументом этот файл не проверяется. - fw-tv188b-261021-0117-r25--plugin-loader.c080 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В FUN_00215ed4 r25 второй аргумент populate_plugins равен 0 для /flashdata/plugins и /tmp/mnt/D/dune_plugins, а для /fconfig/plugins, /firmware/plugins и /firmware_ext/plugins — 1. [^80]: fw-tv188b-261021-0117-r25--plugin-loader.c069 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В populate_plugins r25 «plugin %s is not permitted» пишется, когда глобальный указатель на функцию-фильтр (DAT_00ee9e68) не нулевой и вернул ненулевое значение для имени плагина; в ветке со вторым аргументом 0 каталог плагина затем удаляется FS_remove_recursively_if_exists, в другой ветке — только пропуск. [^81]: fw-tv188b-261021-0117-r25--plugin-loader.c084 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · FUN_0069b808 r25 устанавливает в ячейку 0x00ee9e68, используемую фильтром «not permitted» в populate_plugins, адрес 0x00690bf0 (инструкция записи 0x0069bd68). [^82]: - fw-tv188b-261021-0117-r25--plugin-loader.c086 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 13 (один прогон) сторонний kb_probe13v с yes в params и испорченным dune_plugin.sign не зарегистрирован: plugin_signer остановился на «the required signer_id is missing», populate_plugins — «signature verification failed for 'kb_probe13v', but required»; в installed_plugins.xml его нет. - fw-tv188b-261021-0117-r25--plugin-loader.c087 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 13 (один прогон) сторонний kb_probe13n с тем же испорченным dune_plugin.sign, но без strict_verify_needed, зарегистрирован без строк plugin_signer, есть в installed_plugins.xml, и его точка входа KB13N dlg вызвала handle_user_input(dlg). [^83]: - fw-tv188b-261021-0117-r25--plugin-loader.c066 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В populate_plugins (0x00215450) r25 после разбора манифеста plugin_signer (0x002aa204) вызывается только если properties_get_bool(<свойства плагина>, "strict_verify_needed", 0) истинно; при ложном значении плагин регистрируется без вызова plugin_signer. - fw-tv188b-261021-0117-r25--plugin-loader.c087 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 13 (один прогон) сторонний kb_probe13n с тем же испорченным dune_plugin.sign, но без strict_verify_needed, зарегистрирован без строк plugin_signer, есть в installed_plugins.xml, и его точка входа KB13N dlg вызвала handle_user_input(dlg). [^84]: doc-sdk-plugins.c118 · doc · any-documented; прошивка — · Кастомные (операторские) прошивки могут быть настроены разрешать только подписанные плагины [^85]: fw-tv188b-260827-0003-r24--plugin-loader.c052 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Во встроенных плагинах прошивки 6 из 13 (android_apps, dunemdb_supplier_generic, dunestore, ktv_start, shell_ext, widget) имеют dune_plugin.sign и dune_plugin_signer_id.txt [^86]: plg-ds-dunemdb-supplier-generic.c013 · code · unknown; прошивка — · В пакете есть dune_plugin.sign (46 байт, sha256 e1c2a4207fdf5f756ee522a11b15c551a1da20f0a33257284082449f24c5fd4d) и dune_plugin_signer_id.txt с содержимым com.dune-hd; сам .sign в базу не копировался (извлечение только текстовых файлов), поэтому его содержимое недоступно. [^87]: plg-ds-dunemdb-supplier-megogo.c014 · code · android; прошивка — · В пакете есть dune_plugin.sign (47 байт, sha256 606f5a7ec786ff7239b59770eb08d8d0e4539e0af0a24006f1ef4ff8de46c64c) и dune_plugin_signer_id.txt с содержимым com.dune-hd; сам .sign в базу не копировался (извлечение только текстовых файлов), поэтому его содержимое недоступно. [^88]: plg-ds-dunemdb-supplier-okko.c014 · code · android; прошивка — · В пакете есть dune_plugin.sign (47 байт, sha256 e94dd19c6f576666b5aeef9c2423cf98d59b934707e24bcf059d2c9489fd609d) и dune_plugin_signer_id.txt с содержимым com.dune-hd; сам .sign в базу не копировался (извлечение только текстовых файлов), поэтому его содержимое недоступно. [^89]: plg-ds-dune-hd-tv.c014 · code · unknown; прошивка — · dune_plugin_signer_id.txt содержит идентификатор подписанта com.dune-hd; в пакете есть dune_plugin.sign. [^90]: doc-sdk-plugins.c116 · doc · any-documented; прошивка — · Допустимые signer ID: «com.dune-hd» (только Dune HD) и customer ID кастомной прошивки (с 150326_r10) [^91]: - doc-sdk-plugins.c116 · doc · any-documented; прошивка — · Допустимые signer ID: «com.dune-hd» (только Dune HD) и customer ID кастомной прошивки (с 150326_r10) - doc-sdk-plugins.c119 · doc · any-documented; прошивка — · Собственная подпись (150326_r10+): DSA-ключи 2048 через openssl, подпись утилитой plugin_sign.x86

, публичный ключ кладётся в прошивку как /firmware/config/plugin_key.pem [^92]: doc-sdk-dune-custom-firmware.c007 · doc · any-documented; прошивка — · Параметры ro_config external_plugins_enabled и plugins_installation_enabled делают то же самое, но менее гибко; совместное использование с plugin_config.xml не рекомендуется, а если возможностей ro_config не хватает, использовать plugin_config.xml. [^93]: doc-sdk-dune-store.c053 · doc · any-documented; прошивка — · Сторонние плагины можно добавить в кастомный каталог Dune Store; если прошивка требует только подписанные плагины, их подписывают собственным ключом подписи плагинов, а прошивку настраивают разрешать этот ключ. [^94]: doc-sdk-dune-store.c049 · doc · any-documented; прошивка — · Добавлять сторонние приложения в кастомный каталог Dune Store потенциально можно, но они не будут подписаны, так как сейчас подписывать могут только приложения, выпускаемые и поддерживаемые Dune HD. [^95]: - fw-tv188b-261021-0117-r25--plugin-loader.c071 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · plugin_signer r25 проверяет signer_id по списку через запятую (FUN_002a9f64); список берётся из поля ro_config по смещению 0x1f0, а если оно пусто — «com.dune-hd» или «com.dune-hd,»; signer_id не из списка — «[plugin_signer] %s: signer_id '%s' not allowed» и 0. - fw-tv188b-261021-0117-r25--plugin-loader.c072 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Поле ro_config по смещению 0x1f0, из которого plugin_signer r25 берёт список допустимых signer_id, заполняется разборщиком ro_config_load_if_needed из свойства allowed_plugin_signer_ids. [^96]: - doc-sdk-plugins.c017 · doc · any-documented; прошивка — · Плагин устанавливается запуском файла dune_plugin*.zip с любого носителя (например, USB-флешки) и ставится во флеш-память устройства - fw-tv188b-261021-0117-r25--shell-ext--search-tv.c026 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · ensure_tv_app_installed r25 для type=plugin: если плагин уже установлен и force_check_update — запускает plugin_installer://:::schema=update (при need_launch с launch после), иначе если не установлен — требует update_url и запускает plugin_installer://:::schema=2&name=&need_confirm_replace=0&close_on_success=1 с необязательным signer_id (при need_launch с launch после). - fw-tv188b-261021-0117-r25--builtin-plugins-misc.c028 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В обычном режиме источники каталога dunestore: /config/dsconfig.xml, иначе /firmware/config/dsconfig.xml; без файла, при ошибке разбора или без элемента sources используются standard_source и community_source. В sources допустимы standard_source, community_source и source (обязателен непустой catalog_url с «/»; signer_id; icon_url_prefix и download_url_prefix по умолчанию — каталог catalog_url; community=yes); неизвестный элемент и source без непустого catalog_url, содержащего «/», пропускаются. - doc-sdk-plugins.c105 · doc · any-documented; прошивка — · Онлайн-обновление: в манифесте задаются version_index (число, растёт с каждой версией, в UI не показывается), version (подпись для UI) и check_update (schema, url, timeout, required, auto) [^97]: plg-hdtv-duneplexcatalog.c074 · code · unknown; прошивка — · Пакет распространялся ссылкой Dropbox в посте p325463, а не через check_update: в dune_plugin.xml нет элемента check_update, version_index и global_actions. [^98]: plg-gh-kocourkuba-proiptv.c018 · code · unknown; прошивка — · Workflow .github/workflows/release.yml на каждый тег вида N.N.N собирает пакет make_update.php и публикует dune_plugin_proiptv.<тег>.zip как GitHub Release. [^99]: plg-hdtv-update-bootstrap.c014 · code · unknown; прошивка — · Из 43 манифестов 22 указывают хост обновлений dune-club.info, 19 — zlostnyi.tech (18 заготовок плюс shura), один (sunduk) — dunetv.ru и один (shara-tv) — update.shara-tv.org; адресов ott-play.com среди них нет. [^100]: plg-ds-dunemdb-supplier-generic.c007 · code · unknown; прошивка — · check_update задаёт schema 2, url http://online.dune-hd.com/dune_store_ext/apk/plugins/dunemdb_supplier_generic/update_info.xml, timeout 86400, required no, auto yes, dont_ask_confirmations yes и prefer_builtin_if_url_differ yes. [^101]: fw-tv188b-261021-0117-r25--plugin-loader.c060 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 на tv188b r25 после ENTER на dune_plugin_kb_probe5.zip в файловом браузере установщик сразу показал диалог «Установка приложения» с текстом «KB probe 5: установлено успешно.» и кнопками «Запустить» и «Закрыть»; вопроса перед установкой не было. [^102]: fw-tv188b-261021-0117-r25--plugin-loader.c061 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 на tv188b r25 после ENTER на dune_plugin_kb_probe11z.zip в файловом браузере установщик сразу показал диалог «Установка приложения» с текстом «KB probe 11z: установлено успешно.» и кнопками «Запустить»/«Закрыть»; вопроса перед установкой не было, нажата «Закрыть». [^103]: doc-sdk-plugins.c019 · doc · any-documented; прошивка — · Для ручной установки плагинов обычно требуется активированное «Flash memory storage» или «System storage»; если ни то ни другое не активно, устройство предложит активировать Flash memory storage [^104]: doc-sdk-plugins.c018 · doc · any-documented; прошивка — · При установке плагина с тем же именем, что у уже установленного вручную, предлагается перезаписать или отменить; встроенные в прошивку плагины перезаписать нельзя [^105]: thr-hdtv-19055.c023 · forum · Dune HD TV-175L SmartBox 4K, unknown; прошивка — · Плагин Screenshoter распространяется как ZIP-файл dune_plugin_Screenshoter.zip и ставится выбором ZIP в файловом браузере Dune с флешки (архив 7z не подходит) [^106]: fw-tv188b-261021-0117-r25--plugin-loader.c059 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 после ENTER на kb11_other.zip в файловом браузере lead не увидел изменения экрана или диалога, а проверка установки показала отсутствие каталога kb_probe11z; архив был копией dune_plugin_kb_probe11z.zip. [^107]: fw-tv188b-261021-0117-r25--plugin-loader.c064 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 на tv188b r25 файл kb11_other.zip показан в файловом браузере со значком «?» (неизвестный тип), тогда как рядом лежащие dune_plugin_*.zip — со значком файла. [^108]: fw-tv188b-261021-0117-r25--builtin-plugins-misc.c035 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Перед установкой dunestore разворачивает required_plugins: неустановленная зависимость ставится через plugin_installer://plugins//update_info.xml:::schema=2&name= (в обычном режиме download_url_prefix — http://files3.dune-hd.com/dune_store/v1/), установленная — через plugin_installer://:::schema=update. Для самого плагина: update_url → schema=1, если адрес оканчивается на .txt или содержит «.txt?», иначе schema=2; без update_url — download_url без schema; при !ext_tv_mode в URL самого плагина и неустановленной зависимости добавляется &caption=; затем добавляются need_confirm_replace=0, close_on_success=1 и signer_id (если задан), и URL отдаётся ActionFactory::launch_media_url с next_action apply_install. [^109]: plg-hdtv-youtube.c090 · code · unknown; прошивка — · При control_id=installPlug экран настроек YouTube возвращает launch_media_url с plugin_installer://http://dune-club.info/plugins/update/Codec_install/dune_plugin_Codec_install.tar.gz:::name=Codec_install&space_needed=2000000&need_confirm_replace=0 и post_action launch_media_url('plugin_launcher://Codec_install'). [^110]: fw-tv188b-261021-0117-r25--plugin-loader.c054 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 после установки по plugin_installer:// оболочка выполнила install зонда kb_probe11z, а ga_install.txt дополнился событием install в 03:36:15. [^111]: fw-tv188b-261021-0117-r25--plugin-loader.c062 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 на tv188b r25 при проверке экрана после завершения установки plugin_installer:// по IP Control диалога не было: остался раздел «Приложения», ничего не спрашивалось, кнопки не нажимались. [^112]: - fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c035 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Встроенные PHP-плагины r24 формируют URL установщика как plugin_installer://<адрес>:::<ключ>=<значение>&… с ключами schema, name, caption, title, need_confirm_replace, close_on_success, signer_id - fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c075 · code · android-atv; прошивка 260724_0207_r24 · В APK r24 URL установщика plugin_installer://…:::schema=… разбирается так (fcn.0057096c): schema = update — обновление установленного плагина (c076), tgz и zip — прямой пакет, иначе atoi; в fcn.002c7a40 schema < 1 — «schema should be > 0», 1 — нужен name (по нему берётся установленный version_index или −1, update.txt разбирается fcn.002c5968), 2 — update_info.xml разбирается fcn.002c5ef4 без сверки имени с name из URL, а ignore_existing ≠ 0 отключает сравнение с установленной версией; прочие — «schema %d is not supported» [^113]: fw-tv188b-261021-0117-r25--builtin-plugins-misc.c024 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Манифест dunestore: тип php с program main.php и active_hidden=yes; точка входа root://applications (media_url category_list) стоит после section_after plugin:android_apps:apps_all_android, plugin:android_apps:apps_atv и plugin:android_apps:apps, не является default (is_default_section no), show_by_default=yes и ip_address_required=yes; key_enter — plugin_handle_user_input entry/root, в контекстном меню — entry/clear_cache и entry/open_community_settings. [^114]: fw-tv188b-261021-0117-r25--builtin-plugins-misc.c027 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · DuneStoreModel задаёт каталог http://online.dune-hd.com/dune_store/v1/catalog.xml, префикс иконок http://online.dune-hd.com/dune_store/v1/ и загрузок http://files3.dune-hd.com/dune_store/v1/; community-каталог http://dune-club.info/plugins/update/community_catalog.xml, префиксы иконок и загрузок community — http://dune-club.info/plugins/update/; файл установленных плагинов /tmp/run/installed_plugins.xml; конфиг меню /firmware/config/menu_config.xml. [^115]: fw-tv188b-261021-0117-r25--builtin-plugins-misc.c028 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В обычном режиме источники каталога dunestore: /config/dsconfig.xml, иначе /firmware/config/dsconfig.xml; без файла, при ошибке разбора или без элемента sources используются standard_source и community_source. В sources допустимы standard_source, community_source и source (обязателен непустой catalog_url с «/»; signer_id; icon_url_prefix и download_url_prefix по умолчанию — каталог catalog_url; community=yes); неизвестный элемент и source без непустого catalog_url, содержащего «/», пропускаются. [^116]: fw-tv188b-261021-0117-r25--builtin-plugins-misc.c044 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Плагин попадает в каталог dunestore, только если он не отключён через dsconfig и не отключён plugin_is_disabled_by_special_conditions; при совпадении имени в разных источниках берётся первый, дубль пропускается с предупреждением «plugin ... declared in different sources». Плагин стандартного источника (signer_id com.dune-hd) дополнительно попадает в каталог, только если его имя перечислено в категории plugins этого каталога и он не скрыт plugin_is_hidden_by_box_type. [^117]: fw-tv188b-261021-0117-r25--builtin-plugins-misc.c037 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · DuneStorePluginScreen для установленного плагина показывает «Обновить», только если плагин не launch_capable и installed version_index < доступного, иначе «Запустить»; справа всегда «Удалить». Для неустановленного — «Установить»; для community-плагина установка сначала показывает диалог подтверждения и продолжается действием confirmed_install. Установка/обновление строит plugin_installer URL (update_url → schema 1/2, иначе download_url с space_needed), добавляет need_confirm_replace=0 и signer_id (если задан); удаление — plugin_uninstaller://; после действия refresh перечитывает installed_plugins.xml и инвалидирует списки. [^118]: fw-tv188b-261021-0117-r25--builtin-plugins-misc.c043 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В режиме расширений установка неустановленного community-плагина (dep=0, не в ТВ-режиме) требует подтверждения: показывается диалог с msg_you_are_going_to_install_community_app__1 и community_app_message_line1..5; «продолжить» запускает apply_install с community_confirmed=1, отказ (cb_result != 1) помечает плагин пройденным; community-каталог игнорируется целиком, если community выключен. [^119]: fw-tv188b-261021-0117-r25--builtin-plugins-misc.c033 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Видимость плагина в dunestore: скрываются установленная версия из hidden-файла и tvrain:4; expr (если не any) должен дать true; при отсутствии expr проверяются apk (точное совпадение с HD::is_apk), strict_country, country (widget_country из /config/settings.properties важнее), language и product; затем всегда firmware_features. Для плагина стандартного источника box_type=2 (/tmp/ebxt.txt) скрывает категорию tv, box_type=1 — плагины с flags&1. [^120]: fw-tv188b-261021-0117-r25--builtin-plugins-misc.c041 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В режиме расширений dunestore подменяет источники каталога переданными URL; при наличии /config/dunestore_ext_devel каталог заменяется на dev_catalog.xml, а community-каталог — на dev_community_catalog.xml в том же каталоге; community-источник добавляется только при with_community. [^121]: thr-hdtv-19055.c024 · forum · Dune HD Real Vision 4K, unknown; прошивка R21 · Screenshoter доступен в Dune Store и после установки обновляется автоматически [^122]: doc-sdk-dune-store.c008 · doc · any-documented; прошивка — · Каталог Dune Store (XML) скачивается приложением Dune Store при запуске пользователем; стандартный URL — http://online.dune-hd.com/dune_store/v1/catalog.xml, кастомная прошивка может использовать другой URL. [^123]: doc-sdk-dune-store.c012 · doc · any-documented; прошивка — · Онлайн-обновление плагинов — часть механизма плагинов, а не Dune Store; Dune Store предполагает, что все устанавливаемые через него плагины настроены на онлайн-обновление. [^124]: doc-sdk-dune-store.c020 · doc · any-documented; прошивка — · name плагина в каталоге — внутренний идентификатор, не показывается пользователю; должен точно совпадать с name в dune_plugin.xml. [^125]: doc-sdk-dune-store.c021 · doc · any-documented; прошивка — · caption плагина в каталоге — видимое имя, поддерживает lang и должен точно совпадать с caption в dune_plugin.xml; если в каталоге несколько языков, те же языки должны быть в манифесте. [^126]: doc-sdk-dune-store.c030 · doc · any-documented; прошивка — · version_index в каталоге задаёт текущий индекс версии плагина и используется, чтобы определить, что установленная версия старше доступной; должен точно совпадать с version_index в dune_plugin.xml. version — текущая версия для показа, должна точно совпадать с version в dune_plugin.xml. [^127]: doc-sdk-dune-store.c035 · doc · any-documented; прошивка — · Каждое приложение каталога само определяет две вещи: категорию в каталоге Dune Store (через catalog.xml) и раздел главного меню, где появится после установки (через parent_media_url в dune_plugin.xml). [^128]: doc-sdk-dune-store.c034 · doc · any-documented; прошивка — · Главное меню стандартных прошивок включает разделы, соответствующие всем категориям стандартного каталога Dune Store, но список разделов меню определяется не каталогом, а конфигурацией прошивки /firmware/config/menu_config.xml; стандартные прошивки настроены так, что списки совпадают. [^129]: doc-sdk-dune-store.c036 · doc · any-documented; прошивка — · Изменение списка категорий в каталоге Dune Store не меняет список разделов главного меню; для изменения меню нужна прошивка с изменённой конфигурацией меню. [^130]: doc-sdk-dune-store.c037 · doc · any-documented; прошивка — · Кастомная прошивка с собственным Dune Store может иметь любые списки разделов меню и категорий каталога при условии, что конфигурация прошивки включает все разделы меню, на которые ссылаются приложения каталога; если точка входа ссылается на отсутствующий раздел, после установки она не будет видна и доступна. [^131]: - doc-sdk-dune-store.c051 · doc · any-documented; прошивка — · Пример кастомизации: свой сервер хранит только урезанный каталог, а все остальные ресурсы (иконки, файлы плагинов/скинов, спецификации обновлений) скачиваются со стандартного сервера Dune Store, поэтому обновления со стандартного сервера автоматически доступны и в кастомной прошивке. - doc-sdk-dune-store.c052 · doc · any-documented; прошивка — · Для такого примера нужно скачать стандартный catalog.xml, оставить нужные приложения и скины, выложить каталог на своём сервере и включить в прошивку dsconfig.xml с catalog_url своего каталога и icon/download-префиксами стандартного сервера. [^132]: doc-sdk-dune-store.c050 · doc · any-documented; прошивка — · Полный клон стандартного сервера Dune Store (включая файлы плагинов и спецификации обновлений) сейчас не поддерживается и не рекомендуется без отдельной договорённости с Dune HD; технически возможен, но нетривиален. [^133]: fw-tv188b-261021-0117-r25.c083 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 global_action update не выполняется, если version_index в dune_plugin.xml изменён на месте (1 → 2) и приложение перезапущено через am force-stop, хотя оболочка регистрирует плагин с version_index 2 и заново запускает movie_suppliers_update.sh. [^134]: doc-sdk-plugins.c023 · doc · any-documented; прошивка — · Механизм dune_plugins предназначен в основном для разработки; чтобы применить изменения в папке, нужно дважды нажать POWER (уход в standby и включение) [^135]: doc-sdk-plugins.c136 · doc · android; прошивка — · На Android пользовательские накопители монтируются с noexec, что мешает механизму dune_plugins [^136]: doc-sdk-plugins.c107 · doc · any-documented; прошивка — · Схема обновления 1 устарела и не должна использоваться; нужно использовать schema = 2 [^137]: plg-upd-descriptors.c012 · code · unknown; прошивка — · Дескриптор schema 2 содержит восемь базовых элементов в порядке version_index, version, beta, critical, url, md5, size, caption. [^138]: plg-upd-descriptors.c009 · code · unknown; прошивка — · У всех шести update_info.xml корень dune_plugin_update_info с 2; кроме массива plugin_version_descriptor, в корне только элементы schema и name, а элементов redirect и next_check_update_timeout нет ни в одном файле. [^139]: fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c006 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Разбор update info schema 2 проверяет schema, совпадение name с именем плагина и в каждом plugin_version_descriptor — version_index, beta, critical, url, md5, size; считает кандидатов и «matches (newer)» и итог have_better_version [^140]: fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c064 · code · android-atv; прошивка 260724_0207_r24 · В APK r24 у plugin_version_descriptor (fcn.002c5ef4) дочерние элементы require — пары «имя единицы версии → шаблон» (текст обязателен: «require '%s': text content is expected»), required_firmware_features — список, разбитый str_next_token; дескриптор проходит, только если каждая единица найдена (иначе «required version unit '%s' not found»), её шаблон совпал (fcn.0017228c, «match<%s> … => YES/NO») и каждая функция есть (has_firmware_feature); из прошедших берётся наибольший version_index, «newer» — больше установленного [^141]: - plg-upd-descriptors.c010 · code · unknown; прошивка — · Шесть файлов schema 2 содержат 73 элемента plugin_version_descriptor: globaltv — 20, dunemdb_supplier_movies_rus — 13, dune-hd.tv — 16, dunemdb_supplier_generic — 10, amediateka — 8, first_muz_ru — 6. - plg-upd-descriptors.c011 · code · unknown; прошивка — · В каждом файле schema 2 version_index дескрипторов возрастает, но часть номеров пропущена: movies-rus — 10, globaltv — 37 и 41, amediateka — 9, dune-hd.tv — 80–85, 89, 97 и 98, dunemdb_supplier_generic — 13 и 14; у first_muz_ru идут 2–7 без пропусков. [^142]: fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c079 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 оболочка при проверке обновления на запуске запрашивает update_info.xml GET-запросом с адреса 127.0.0.1, дописав к URL «?dune_auth=…», с заголовками User-Agent «DuneHD/1.0 (product_id: tv188b; firmware_version: 261021_0117_r25)», X-Dune-Interface-Language (russian) и X-Dune-Serial-Number. [^143]: doc-sdk-plugins.c112 · doc · any-documented; прошивка — · Флаг beta в update_info зарезервирован и игнорируется (рекомендуется 'no') [^144]: plg-upd-descriptors.c014 · code · unknown; прошивка — · required_firmware_features есть у 26 из 73 дескрипторов: у globaltv — у 16 из 20 (начиная с version_index 31) со значением dunemdb_supplier_plugin_api_v6, у dunemdb_supplier_generic — у всех 10 со значением newgui2021. [^145]: fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c090 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 онлайн-обновление сохраняет cookies плагина и его data_dir_path: v2 и v3 получили в plugin_cookies значение kbp7u_mark, записанное v1, файл kbp7u_mark.txt v1 в flashdata/plugins_data/ остался с прежним mtime. [^146]: fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c086 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 перед диалогом обновления оболочка вызывает глобальное действие confirm_update установленной версии плагина и передаёт в user_input поля check_update_plugin_name, check_update_url (URL пакета), check_update_version, check_update_prev_version, check_update_version_index и check_update_prev_version_index; при ответе null — «confirm_update action finished with status 0» и «plugin_updater I: enabled by custom action», обновление идёт обычным путём. [^147]: fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c088 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 после установки обновления новая версия плагина получает глобальное действие update (в новом php_server), затем запускается исходная точка входа, с которой началась проверка; глобальное действие install при обновлении не вызывается. [^148]: plg-upd-descriptors.c001 · code · unknown; прошивка — · В наборе 29 дескрипторов обновления, снятых с серверов 2026-11-01, 23 — update.txt schema 1 (пять строк «ключ=значение») и 6 — update_info.xml schema 2 (корень dune_plugin_update_info). [^149]: plg-upd-descriptors.c002 · code · unknown; прошивка — · Все 23 дескриптора update.txt (schema 1) состоят ровно из пяти строк «ключ=значение» в одном порядке: version_index, version, download_url, space_needed, last_critical_version_index; других ключей, пустых строк и комментариев нет. [^150]: fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c058 · code · android-atv; прошивка 260724_0207_r24 · В APK r24 разбор update info schema 1 (fcn.002c5968) загружает файл в properties (properties_build_from_buffer) и читает ключи: next_check_update_timeout (по умолчанию −1), version_index (меньше 1 или нет — «invalid available version_index»), last_critical_version_index, version (необязателен), download_url (нужен http или https, иначе «invalid or missing download url»), space_needed (нужно больше 0, иначе «invalid or missing 'space_needed'») и все ключи, имена которых начинаются с confirm_dialog_line (strncmp на 0x13 = 19 символов), — они собираются в список строк [^151]: plg-hdtv-update-bootstrap.c036 · code · unknown; прошивка — · last_critical_version_index в 32 из 41 дескриптора — целое число (1 у 31, 5 у 101-ru), а в 9 — строка версии: «1.0.0» у 8 (1cent, 1usd, bcu, fox, great, lightiptv, tvteam, viplime) и «1.0.1» у smile. [^152]: fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c097 · code · android-atv; прошивка 260724_0207_r24 · В APK r24 properties_get_int при libc bionic android12-release (atoi вызывает strtol с основанием 10) возвращает 1 для найденного значения «1.0.0», а для существующей пустой строки и строки «abc» — 0; это не возврат переданного значения по умолчанию. [^153]: fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c098 · code · android-atv; прошивка 260724_0207_r24 · В APK r24 при libc bionic android12-release str_seg_strip обрезает по краям сегмента пробел (0x20), TAB (0x09), LF (0x0a), VT (0x0b), FF (0x0c) и CR (0x0d), поэтому замена окончаний LF на CRLF в update.txt не меняет разобранные ключи и значения. [^154]: doc-sdk-plugins.c113 · doc · any-documented; прошивка — · При critical = yes, timeout = 0 и required = yes система не даёт запустить старую версию плагина, если на сервере есть обновление [^155]: fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c014 · code · android-atv; прошивка 260724_0207_r24 · В APK r24 при ошибке проверки обновления в fcn.002635b0, если check_update/schema отличается от 3 и check_update/required=yes, выставляется выходной флаг запрета запуска (6-й аргумент = 1); при required=no эта ветка запрета пропускается. [^156]: fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c077 · code · android-atv; прошивка 260724_0207_r24 · В APK r24 при проверке обновления при запуске (fcn.002635b0) отказ от критического обновления на шаге подтверждения («critical update cancelled, access denied») и неудачная установка критического («critical update failed, access denied») удаляют /tmp/plugin_updater_.txt и запрещают запуск (флаг access denied); отказ от некритического ничего не удаляет и запуск продолжается [^157]: plg-hdtv-update-bootstrap.c017 · code · unknown; прошивка — · check_update/required yes задан только у sunduk и ottclub; у остальных 41 манифеста элемента required нет. [^158]: plg-upd-descriptors.c015 · code · unknown; прошивка — · beta и critical во всех 73 дескрипторах schema 2 равны no; значения yes нет ни в одном файле. [^159]: fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c091 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25, если у установленной версии в check_update задано dont_ask_confirmations=yes, проверка на запуске всё равно вызывает confirm_update, но диалог обновления не показывается: «installing application» идёт сразу за «enabled by custom action», на экране ни диалога, ни сообщений. [^160]: fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c028 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 каждый /tmp/plugin_updater_.txt содержит одно 10-значное число (unix-время), у 9 файлов значения 1792536168…1792622569 [^161]: fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c081 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 повторный запуск точки входа до срока из /tmp/plugin_updater_.txt не обращается к источнику обновления: в shell.log «[plugin_updater] remote check skipped by timeout», GET update_info.xml нет. [^162]: fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c025 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 лог /tmp/run/plugin_online_upgrade.log: grand-child процесс по очереди проверяет 9 плагинов — «Checking updates for plugin X», «autocheck of X: iteration 1/5, attempt 1/5», загрузка update info «with timeout 5», итог «plugin X is up-to-date» [^163]: fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c027 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В логе r25 итог schema 2 по плагину — «N candidates», «N matches (0 newer)», «have_better_version = no»: у dune-hd.tv 16 кандидатов, у widget 2, у melange и play_in_apps по 1 [^164]: fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c092 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 установка обновления после «Обновить» не показывает на экране сообщений о ходе и завершении: через ~2 и ~5 с после нажатия — сетка «Приложения» без окон, хотя в логе есть «dialog D: push progress.plugin_installer». [^165]: - fw-tv188b-261021-0117-r25.c213 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 точки входа плагина kb_probe5 (root://applications), заданные без icon_url, в разделе «Приложения» не появлялись. - fw-tv188b-261021-0117-r25.c212 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 у плагина kb_probe5, все 6 точек входа которого (parent_media_url root://applications) были без icon_url, в /tmp/run/installed_plugins.xml launch_capable 0 и нет category; после добавления в каждую точку входа icon_url gui_skin://large_icons/apps.aai и перезапуска приложения — launch_capable 1 и category applications. [^166]: - fw-tv188b-260827-0003-r24--plugin-loader.c007 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · libduneshell.so содержит путь-шаблон «%s/dune_plugin.xml» и сообщения об отсутствующем и неразбираемом манифесте (ключи plugin_installer_error_missing_manifest, plugin_installer_error_invalid_manifest) - doc-sdk-plugins.c016 · doc · any-documented; прошивка — · Установщик плагина — ZIP-архив с файлом dune_plugin.xml на верхнем уровне и прочими файлами плагина [^167]: fw-tv188b-260827-0003-r24--plugin-loader.c041 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Установщик сверяет name в манифесте с ожидаемым: есть сообщение «declared plugin name is '%s', real is '%s'» и ключ plugin_installer_error_name_changed__1 [^168]: - fw-tv188b-260827-0003-r24--plugin-loader.c043 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · libduneshell.so содержит строки установщика: /tmp/plugin_tmp, %s/__plugin__.zip, команду «cd %s%s && ls -la __plugin__.zip && unzip __plugin__.zip && rm -f __plugin__.zip», «md5 does not match», «suitable storage not found; cancelled» - doc-sdk-plugins.c019 · doc · any-documented; прошивка — · Для ручной установки плагинов обычно требуется активированное «Flash memory storage» или «System storage»; если ни то ни другое не активно, устройство предложит активировать Flash memory storage [^169]: - fw-tv188b-260827-0003-r24--plugin-loader.c040 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · libduneshell.so содержит сообщения установщика плагинов о запретах: «install not allowed for plugin», «install not allowed for unsigned plugin», «replace hard-coded plugin '%s' not allowed», «replace not allowed for plugin '%s' because of signer_id mismatch», «unsigned plugins not allowed», «signer_id '%s' not allowed by firmware», «signature verification failed» - doc-sdk-dune-custom-firmware.c002 · doc · any-documented; прошивка — · external_plugins_enabled: all разрешает все сторонние плагины; signed — только подписанные Dune HD, причём signer_id должен быть указан в allowed_plugin_signer_ids, если этот список задан. - doc-sdk-dune-custom-firmware.c012 · doc · any-documented; прошивка — · allow_install = yes|signed|no определяет, разрешена ли установка новых внешних плагинов; значение signed — только подписанных. [^170]: - fw-tv188b-260827-0003-r24--plugin-loader.c040 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · libduneshell.so содержит сообщения установщика плагинов о запретах: «install not allowed for plugin», «install not allowed for unsigned plugin», «replace hard-coded plugin '%s' not allowed», «replace not allowed for plugin '%s' because of signer_id mismatch», «unsigned plugins not allowed», «signer_id '%s' not allowed by firmware», «signature verification failed» - doc-sdk-dune-custom-firmware.c015 · doc · any-documented; прошивка — · allow_replace не влияет на онлайн-обновление: обновление всегда ограничено логикой same_signer_id. [^171]: - fw-tv188b-261021-0117-r25--plugin-loader.c086 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 13 (один прогон) сторонний kb_probe13v с yes в params и испорченным dune_plugin.sign не зарегистрирован: plugin_signer остановился на «the required signer_id is missing», populate_plugins — «signature verification failed for 'kb_probe13v', but required»; в installed_plugins.xml его нет. - fw-tv188b-261021-0117-r25--plugin-loader.c070 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · plugin_signer (0x002aa204) r25 читает signer_id из файла dune_plugin_signer_id.txt в каталоге плагина (FUN_002aa164); если его нет — «[plugin_signer] %s: the required signer_id is missing» и результат 0; если третий аргумент задан и не равен signer_id — «invalid signer_id: requied(%s) != actual(%s)» и 0 (populate_plugins передаёт 0, т. е. без требуемого signer_id). - fw-tv188b-261021-0117-r25--plugin-loader.c087 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 13 (один прогон) сторонний kb_probe13n с тем же испорченным dune_plugin.sign, но без strict_verify_needed, зарегистрирован без строк plugin_signer, есть в installed_plugins.xml, и его точка входа KB13N dlg вызвала handle_user_input(dlg). [^172]: - fw-tv188b-261021-0117-r25--plugin-loader.c068 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В ветке populate_plugins r25 со вторым аргументом 0 плагин пропускается без загрузки, если в его каталоге есть обычный файл .bad_signature (лог «[populate_plugins] %s: bad_signature flag is set»); в ветке с ненулевым вторым аргументом этот файл не проверяется. - fw-tv188b-261021-0117-r25--plugin-loader.c080 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В FUN_00215ed4 r25 второй аргумент populate_plugins равен 0 для /flashdata/plugins и /tmp/mnt/D/dune_plugins, а для /fconfig/plugins, /firmware/plugins и /firmware_ext/plugins — 1. - fw-tv188b-261021-0117-r25--plugin-loader.c082 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В режиме external_plugins_enabled=signed FUN_00215e08 r25 вызывает plugin_signer (0x002aa204) для переданных имени и каталога плагина с третьим аргументом 0; при результате 0 пытается создать <каталог>/.bad_signature, пишет «[plugin] %s: marked as bad» и возвращает 0. [^173]: - fw-tv188b-261021-0117-r25--plugin-loader.c069 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В populate_plugins r25 «plugin %s is not permitted» пишется, когда глобальный указатель на функцию-фильтр (DAT_00ee9e68) не нулевой и вернул ненулевое значение для имени плагина; в ветке со вторым аргументом 0 каталог плагина затем удаляется FS_remove_recursively_if_exists, в другой ветке — только пропуск. - fw-tv188b-261021-0117-r25--plugin-loader.c084 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · FUN_0069b808 r25 устанавливает в ячейку 0x00ee9e68, используемую фильтром «not permitted» в populate_plugins, адрес 0x00690bf0 (инструкция записи 0x0069bd68). [^174]: - fw-tv188b-261021-0117-r25--plugin-loader.c059 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 после ENTER на kb11_other.zip в файловом браузере lead не увидел изменения экрана или диалога, а проверка установки показала отсутствие каталога kb_probe11z; архив был копией dune_plugin_kb_probe11z.zip. - fw-tv188b-261021-0117-r25--plugin-loader.c064 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 на tv188b r25 файл kb11_other.zip показан в файловом браузере со значком «?» (неизвестный тип), тогда как рядом лежащие dune_plugin_*.zip — со значком файла. - doc-sdk-plugins.c017 · doc · any-documented; прошивка — · Плагин устанавливается запуском файла dune_plugin*.zip с любого носителя (например, USB-флешки) и ставится во флеш-память устройства [^175]: - fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c081 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 повторный запуск точки входа до срока из /tmp/plugin_updater_.txt не обращается к источнику обновления: в shell.log «[plugin_updater] remote check skipped by timeout», GET update_info.xml нет. - fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c080 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 после удалённой проверки обновления на запуске (schema 2) /tmp/plugin_updater_.txt содержит время проверки + next_check_update_timeout из update_info.xml (20), а не + check_update/timeout манифеста (3600): проверка в 1793207761 записала 1793207781, проверка в 1793207784 — 1793207804. [^176]: - fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c044 · code · tv188b, android-atv; прошивка 260724_0207_r24 · В APK r24 разбор манифеста читает check_update/schema (по умолчанию 0); schema больше 3 отключает проверку обновлений; check_update/timeout по умолчанию 0x15180 = 86400 с, отрицательный заменяется на 86400 - fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c045 · code · tv188b, android-atv; прошивка 260724_0207_r24 · В APK r24 check_update/url читается только для schema 1 и 2 (при schema 0 и 3 — нет); для schema 1–2 без url или с пустым url проверка отключается сообщением «invalid or missing 'check_update/check_update_url'» [^177]: - fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c014 · code · android-atv; прошивка 260724_0207_r24 · В APK r24 при ошибке проверки обновления в fcn.002635b0, если check_update/schema отличается от 3 и check_update/required=yes, выставляется выходной флаг запрета запуска (6-й аргумент = 1); при required=no эта ветка запрета пропускается. - fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c077 · code · android-atv; прошивка 260724_0207_r24 · В APK r24 при проверке обновления при запуске (fcn.002635b0) отказ от критического обновления на шаге подтверждения («critical update cancelled, access denied») и неудачная установка критического («critical update failed, access denied») удаляют /tmp/plugin_updater_.txt и запрещают запуск (флаг access denied); отказ от некритического ничего не удаляет и запуск продолжается [^178]: - fw-tv188b-261021-0117-r25.c082 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 global_action install не выполняется, если плагин положен в $FS_PREFIX/flashdata/plugins через adb push и приложение перезапущено: маркеров install от kb_probe5 и kb_probe6_sup нет, тогда как boot, boot_end и gui_start kb_probe5 выполнились. - fw-tv188b-261021-0117-r25.c083 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 global_action update не выполняется, если version_index в dune_plugin.xml изменён на месте (1 → 2) и приложение перезапущено через am force-stop, хотя оболочка регистрирует плагин с version_index 2 и заново запускает movie_suppliers_update.sh. [^179]: fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c085 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 после «Напомнить позже» оболочка запускает исходную точку входа установленной старой версии, а срок следующей проверки остаётся прежним — время проверки + next_check_update_timeout (20 с): запуск через 38 с снова загрузил update info и снова показал диалог обновления. [^180]: fw-tv188b-261021-0117-r25.c224 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 при загрузке плагинов shell.log содержит «plugin D: (dunemdb_supplier_youtube) prefer_new_builtin (41 vs 34)» и сразу за ним «[populate_plugins] dup dunemdb_supplier_youtube: replacing»; version_index копии в $FS_PREFIX/firmware_ext/plugins — 41, в $FS_PREFIX/flashdata/plugins — 34. [^181]: fw-tv188b-261021-0117-r25--builtin-plugins-misc.c036 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Удаление в dunestore — только ActionFactory::launch_media_url('plugin_uninstaller://') для каждого выбранного плагина, сцепленное в обратном порядке и завершающееся действием apply_install с install=false; собственного удаления каталогов или данных плагина в PHP нет. [^182]: plg-dc-globaltv.c029 · code · unknown; прошивка — · При установке в стране CN плагин, если установлен tv_app_supplier_globaltv, удаляет его (и сам globaltv) действиями launch_media_url с URL plugin_uninstaller://<имя>. [^183]: fw-tv188b-261021-0117-r25--plugin-loader.c055 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 plugin_uninstaller://kb_probe11z по IP Control вызвал uninstall через sh bin/ga.sh uninstall; оболочка записала uninstall action finished with status 0. [^184]: fw-tv188b-261021-0117-r25--plugin-loader.c056 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 после plugin_uninstaller://kb_probe11z ls показал No such file or directory для каталогов plugins/kb_probe11z, plugins_data/kb_probe11z, plugins_archive/kb_probe11z и /tmp/plugins/kb_probe11z; перед удалением эти каталоги существовали. [^185]: fw-tv188b-261021-0117-r25--plugin-loader.c063 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 на tv188b r25 при проверке экрана после завершения удаления plugin_uninstaller://kb_probe11z по IP Control диалога не было: ничего не спрашивалось, кнопки не нажимались. [^186]: doc-sdk-plugins.c020 · doc · any-documented; прошивка — · Все установленные плагины перечислены в меню «Setup / Misc / Plugins», где вручную установленные можно удалить (ENTER → Delete) [^187]: doc-sdk-plugins.c143 · doc · any-documented; прошивка — · Global plugin actions поддерживают системные события boot, install, update и uninstall [^188]: plg-dc-widget-ext.c006 · code · unknown; прошивка — · global_actions/uninstall вызывает bin/uninstall.sh без «&», в отличие от остальных global_actions [^189]: fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c074 · code · android-atv; прошивка 260724_0207_r24 · В APK r24 при замене пакета вызов nav_plugin_delete_plugin_data(…, 1) не удаляет каталоги данных /config/plugins_data/ и <хранилище>/plugins_data/, а также /config/_plugin_cookies.properties: удаление соответствующих полей +0x10 и +0x18 и вызов fcn.0027ee94 с FS_unlink находятся только в ветке флага 0. [^190]: - doc-sdk-plugins.c016 · doc · any-documented; прошивка — · Установщик плагина — ZIP-архив с файлом dune_plugin.xml на верхнем уровне и прочими файлами плагина - fw-tv188b-260827-0003-r24--plugin-loader.c007 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · libduneshell.so содержит путь-шаблон «%s/dune_plugin.xml» и сообщения об отсутствующем и неразбираемом манифесте (ключи plugin_installer_error_missing_manifest, plugin_installer_error_invalid_manifest) [^191]: - doc-sdk-plugins.c026 · doc · any-documented; прошивка — · PHP-плагин обязан содержать PHP-программу с функцией hd_create_plugin(); путь к ней задаётся в dune_plugin.xml - fw-tv188b-261021-0117-r25.c372 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 PHP-зонды kb_probe5 и kb_probe10 работали без hd_create_plugin(): их main.php объявляет класс, унаследованный от DunePluginFw, и handle_user_input выполнялся. [^192]: fw-tv188b-261021-0117-r25.c221 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 плагин с type plain без params/program (зонды-поставщики kb_probe5_sup и kb_probe6_sup: в каталоге только dune_plugin.xml и bin/) регистрируется; его запись в /tmp/run/installed_plugins.xml — launch_capable 0 и movie_suppliers со значением params/movie_suppliers. [^193]: - fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c059 · code · android-atv; прошивка 260724_0207_r24 · В APK r24 разбор schema 1 (fcn.002c5968) считает обновление доступным, только если version_index из update.txt больше установленного (иначе результат «нет обновления», download_url и space_needed не проверяются); обновление критическое, если last_critical_version_index ≥ 1 и установленный version_index меньше него - fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c064 · code · android-atv; прошивка 260724_0207_r24 · В APK r24 у plugin_version_descriptor (fcn.002c5ef4) дочерние элементы require — пары «имя единицы версии → шаблон» (текст обязателен: «require '%s': text content is expected»), required_firmware_features — список, разбитый str_next_token; дескриптор проходит, только если каждая единица найдена (иначе «required version unit '%s' not found»), её шаблон совпал (fcn.0017228c, «match<%s> … => YES/NO») и каждая функция есть (has_firmware_feature); из прошедших берётся наибольший version_index, «newer» — больше установленного [^194]: - doc-sdk-plugins.c017 · doc · any-documented; прошивка — · Плагин устанавливается запуском файла dune_plugin*.zip с любого носителя (например, USB-флешки) и ставится во флеш-память устройства - fw-tv188b-261021-0117-r25.c219 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 dune_plugin_kb_probe5_plat.zip, запущенный в файловом браузере плеера из /sdcard/DuneHD, установлен в /data/data/com.dunehd.app/flashdata/plugins/kb_probe5_plat; после установки есть также каталоги /data/data/com.dunehd.app/flashdata/plugins_archive/kb_probe5_plat, …/flashdata/plugins_data/kb_probe5_plat и /tmp/plugins/kb_probe5_plat. - fw-tv188b-261021-0117-r25--plugin-loader.c059 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 после ENTER на kb11_other.zip в файловом браузере lead не увидел изменения экрана или диалога, а проверка установки показала отсутствие каталога kb_probe11z; архив был копией dune_plugin_kb_probe11z.zip. [^195]: - fw-tv188b-261021-0117-r25--plugin-loader.c037 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 ZIP dune_plugin_kb_probe5_plat.zip без dune_plugin.sign и dune_plugin_signer_id.txt установлен штатно в /flashdata/plugins/kb_probe5_plat (в логе; фактически /data/data/com.dunehd.app/flashdata/plugins/kb_probe5_plat) и зарегистрирован как Plugin 'kb_probe5_plat' of type 'plain'. - fw-tv188b-261021-0117-r25--plugin-loader.c046 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 на tv188b r25 штатный установщик принял dune_plugin_kb_probe11z.zip без dune_plugin.sign и dune_plugin_signer_id.txt и зарегистрировал kb_probe11z как php. - fw-tv188b-261021-0117-r25--plugin-loader.c066 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В populate_plugins (0x00215450) r25 после разбора манифеста plugin_signer (0x002aa204) вызывается только если properties_get_bool(<свойства плагина>, "strict_verify_needed", 0) истинно; при ложном значении плагин регистрируется без вызова plugin_signer. - fw-tv188b-261021-0117-r25--plugin-loader.c082 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В режиме external_plugins_enabled=signed FUN_00215e08 r25 вызывает plugin_signer (0x002aa204) для переданных имени и каталога плагина с третьим аргументом 0; при результате 0 пытается создать <каталог>/.bad_signature, пишет «[plugin] %s: marked as bad» и возвращает 0. - fw-tv188b-261021-0117-r25--plugin-loader.c087 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 13 (один прогон) сторонний kb_probe13n с тем же испорченным dune_plugin.sign, но без strict_verify_needed, зарегистрирован без строк plugin_signer, есть в installed_plugins.xml, и его точка входа KB13N dlg вызвала handle_user_input(dlg). - fw-tv188b-261021-0117-r25--plugin-loader.c086 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 13 (один прогон) сторонний kb_probe13v с yes в params и испорченным dune_plugin.sign не зарегистрирован: plugin_signer остановился на «the required signer_id is missing», populate_plugins — «signature verification failed for 'kb_probe13v', but required»; в installed_plugins.xml его нет. - doc-sdk-plugins.c115 · doc · any-documented; прошивка — · Встроенные в розничную прошивку и распространяемые через Dune Store плагины подписаны Dune HD; подписанный плагин содержит dune_plugin.sign и dune_plugin_signer_id.txt - fw-tv188b-260827-0003-r24--plugin-loader.c050 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · libduneshell.so содержит строки [plugin_signer]: файлы dune_plugin.sign и dune_plugin_signer_id.txt, signer_id com.dune-hd, ключ /firmware/config/plugin_key.pem или /config/plugin_key.pem, DSA-проверку [^196]: - fw-tv188b-261021-0117-r25.c219 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 dune_plugin_kb_probe5_plat.zip, запущенный в файловом браузере плеера из /sdcard/DuneHD, установлен в /data/data/com.dunehd.app/flashdata/plugins/kb_probe5_plat; после установки есть также каталоги /data/data/com.dunehd.app/flashdata/plugins_archive/kb_probe5_plat, …/flashdata/plugins_data/kb_probe5_plat и /tmp/plugins/kb_probe5_plat. - doc-sdk-plugins.c017 · doc · any-documented; прошивка — · Плагин устанавливается запуском файла dune_plugin*.zip с любого носителя (например, USB-флешки) и ставится во флеш-память устройства [^197]: - plg-hdtv-duneplexcatalog.c074 · code · unknown; прошивка — · Пакет распространялся ссылкой Dropbox в посте p325463, а не через check_update: в dune_plugin.xml нет элемента check_update, version_index и global_actions. - plg-hdtv-update-bootstrap.c029 · forum · unknown; прошивка — · Автор liteIPTV в первом посте пишет, что приложенная версия обновится до последней актуальной. [^198]: - fw-tv188b-261021-0117-r25--shell-ext--search-tv.c026 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · ensure_tv_app_installed r25 для type=plugin: если плагин уже установлен и force_check_update — запускает plugin_installer://:::schema=update (при need_launch с launch после), иначе если не установлен — требует update_url и запускает plugin_installer://:::schema=2&name=&need_confirm_replace=0&close_on_success=1 с необязательным signer_id (при need_launch с launch после). - plg-hdtv-youtube.c090 · code · unknown; прошивка — · При control_id=installPlug экран настроек YouTube возвращает launch_media_url с plugin_installer://http://dune-club.info/plugins/update/Codec_install/dune_plugin_Codec_install.tar.gz:::name=Codec_install&space_needed=2000000&need_confirm_replace=0 и post_action launch_media_url('plugin_launcher://Codec_install'). - fw-tv188b-261021-0117-r25--plugin-loader.c053 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 IP Control launch_media_url с plugin_installer://HTTP-URL:::schema=zip&name=kb_probe11z&need_confirm_replace=0&close_on_success=1 заменил уже установленный kb_probe11z и зарегистрировал его как php. [^199]: - fw-tv188b-261021-0117-r25--builtin-plugins-misc.c027 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · DuneStoreModel задаёт каталог http://online.dune-hd.com/dune_store/v1/catalog.xml, префикс иконок http://online.dune-hd.com/dune_store/v1/ и загрузок http://files3.dune-hd.com/dune_store/v1/; community-каталог http://dune-club.info/plugins/update/community_catalog.xml, префиксы иконок и загрузок community — http://dune-club.info/plugins/update/; файл установленных плагинов /tmp/run/installed_plugins.xml; конфиг меню /firmware/config/menu_config.xml. - fw-tv188b-261021-0117-r25--builtin-plugins-misc.c044 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Плагин попадает в каталог dunestore, только если он не отключён через dsconfig и не отключён plugin_is_disabled_by_special_conditions; при совпадении имени в разных источниках берётся первый, дубль пропускается с предупреждением «plugin ... declared in different sources». Плагин стандартного источника (signer_id com.dune-hd) дополнительно попадает в каталог, только если его имя перечислено в категории plugins этого каталога и он не скрыт plugin_is_hidden_by_box_type. [^200]: - fw-tv188b-261021-0117-r25--builtin-plugins-misc.c027 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · DuneStoreModel задаёт каталог http://online.dune-hd.com/dune_store/v1/catalog.xml, префикс иконок http://online.dune-hd.com/dune_store/v1/ и загрузок http://files3.dune-hd.com/dune_store/v1/; community-каталог http://dune-club.info/plugins/update/community_catalog.xml, префиксы иконок и загрузок community — http://dune-club.info/plugins/update/; файл установленных плагинов /tmp/run/installed_plugins.xml; конфиг меню /firmware/config/menu_config.xml. - fw-tv188b-261021-0117-r25--builtin-plugins-misc.c037 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · DuneStorePluginScreen для установленного плагина показывает «Обновить», только если плагин не launch_capable и installed version_index < доступного, иначе «Запустить»; справа всегда «Удалить». Для неустановленного — «Установить»; для community-плагина установка сначала показывает диалог подтверждения и продолжается действием confirmed_install. Установка/обновление строит plugin_installer URL (update_url → schema 1/2, иначе download_url с space_needed), добавляет need_confirm_replace=0 и signer_id (если задан); удаление — plugin_uninstaller://; после действия refresh перечитывает installed_plugins.xml и инвалидирует списки. [^201]: - fw-tv188b-261021-0117-r25--builtin-plugins-misc.c028 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В обычном режиме источники каталога dunestore: /config/dsconfig.xml, иначе /firmware/config/dsconfig.xml; без файла, при ошибке разбора или без элемента sources используются standard_source и community_source. В sources допустимы standard_source, community_source и source (обязателен непустой catalog_url с «/»; signer_id; icon_url_prefix и download_url_prefix по умолчанию — каталог catalog_url; community=yes); неизвестный элемент и source без непустого catalog_url, содержащего «/», пропускаются. - doc-sdk-dune-store.c048 · doc · any-documented; прошивка — · Чтобы применить кастомную конфигурацию Dune Store, прошивка должна включать файл dsconfig.xml (описание — в документе Custom firmware images). [^202]: - fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c065 · code · android-atv; прошивка 260724_0207_r24 · В APK r24 фоновая автопроверка (fcn.00299d58) берёт плагины со schema 1 или 2 (0 и 3 пропускаются), у которых check_update/auto = yes или имя есть в списке; список читается один раз за процесс: /config/auto_updating_plugins.txt, а если его нет — /firmware/config/auto_updating_plugins.txt, по имени на строку (str_strip, is_valid_plugin_name_seg); перед каждой попыткой /tmp/plugin_updater_.txt удаляется; итераций 5, при принудительной проверке (аргумент 1) — 3 - fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c025 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 лог /tmp/run/plugin_online_upgrade.log: grand-child процесс по очереди проверяет 9 плагинов — «Checking updates for plugin X», «autocheck of X: iteration 1/5, attempt 1/5», загрузка update info «with timeout 5», итог «plugin X is up-to-date» [^203]: fw-tv188b-260827-0003-r24--plugin-loader.c085 · doc · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Подпись плагина хранится в файле dune_plugin.sign, signer ID — в dune_plugin_signer_id.txt; оба имени есть в strings r24 [^204]: fw-tv188b-260827-0003-r24--plugin-loader.c053 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Файл dune_plugin_signer_id.txt встроенного shell_ext содержит com.dune-hd (без перевода строки) [^205]: fw-tv188b-260827-0003-r24--plugin-loader.c021 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · libduneshell.so содержит пути /config/plugin_config.xml и /firmware/config/plugin_config.xml, функцию parse_plugin_config() и имена allow_install, signed, allow_delete, allow_replace, same_signer_id, default_embedded, default_external [^206]: - fw-tv188b-260827-0003-r24--plugin-loader.c013 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · libduneshell.so содержит строки «strict_verify_needed» и «[populate_plugins] ERROR: signature verification failed for '%s', but required» - plg-ds-dune-hd-tv.c003 · code · unknown; прошивка — · Тип плагина — php, программа i24h.php; в params заданы strict_verify_needed = yes и pf_allowed = yes. [^207]: fw-tv188b-260827-0003-r24--plugin-loader.c011 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · libduneshell.so содержит путь-шаблон «%s/.bad_signature» и сообщение «[populate_plugins] %s: bad_signature flag is set» [^208]: fw-tv188b-260827-0003-r24--plugin-loader.c015 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · libduneshell.so содержит сообщения «[populate_plugins] plugin %s is not permitted» и «[plugin] %s: marked as bad» [^209]: - fw-tv188b-261021-0117-r25--plugin-loader.c067 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Если при strict_verify_needed plugin_signer вернул 0, populate_plugins r25 пишет «[populate_plugins] ERROR: signature verification failed for '%s', but required» и не регистрирует плагин (переход к освобождению описателя, минуя регистрацию). - fw-tv188b-261021-0117-r25--plugin-loader.c086 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 13 (один прогон) сторонний kb_probe13v с yes в params и испорченным dune_plugin.sign не зарегистрирован: plugin_signer остановился на «the required signer_id is missing», populate_plugins — «signature verification failed for 'kb_probe13v', but required»; в installed_plugins.xml его нет. [^210]: - fw-tv188b-261021-0117-r25--plugin-loader.c070 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · plugin_signer (0x002aa204) r25 читает signer_id из файла dune_plugin_signer_id.txt в каталоге плагина (FUN_002aa164); если его нет — «[plugin_signer] %s: the required signer_id is missing» и результат 0; если третий аргумент задан и не равен signer_id — «invalid signer_id: requied(%s) != actual(%s)» и 0 (populate_plugins передаёт 0, т. е. без требуемого signer_id). - fw-tv188b-261021-0117-r25--plugin-loader.c086 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 13 (один прогон) сторонний kb_probe13v с yes в params и испорченным dune_plugin.sign не зарегистрирован: plugin_signer остановился на «the required signer_id is missing», populate_plugins — «signature verification failed for 'kb_probe13v', but required»; в installed_plugins.xml его нет. [^211]: - fw-tv188b-261021-0117-r25--plugin-loader.c075 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · plugin_signer r25 проверяет подпись signer_id «com.dune-hd» встроенным в libduneshell.so ключом (dsa_sign_verify_dsa_signature с константами DAT_00e8e8c8…); другой signer_id принимается, только если равен get_customer_id(), и тогда ключ берётся из /config/plugin_key.pem, а без него — из /firmware/config/plugin_key.pem; иначе «unsupported signer_id» или «plugin_key.pem not found» и 0. Итог пишется «DSA verification for signer_id %s: OK|failed». - fw-tv188b-261021-0117-r25--plugin-loader.c035 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В shell.log r25 при загрузке плагинов из /flashdata/plugins для dune-hd.tv записаны num_files=224, num_bytes=2701081, digest A8235D91EA8D8DB2E60845D3B2826327CFB300FB и «[plugin_signer] DSA verification for signer_id com.dune-hd: OK». - fw-tv188b-261021-0117-r25--plugin-loader.c036 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В shell.log r25 при загрузке плагинов из /firmware_ext/plugins для shell_ext записаны num_files=292, num_bytes=3942977, digest 39A76B386D5C62C25A753DE2E92F5EE4363C2966 и «[plugin_signer] DSA verification for signer_id com.dune-hd: OK». [^212]: - fw-tv188b-261021-0117-r25--plugin-loader.c082 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В режиме external_plugins_enabled=signed FUN_00215e08 r25 вызывает plugin_signer (0x002aa204) для переданных имени и каталога плагина с третьим аргументом 0; при результате 0 пытается создать <каталог>/.bad_signature, пишет «[plugin] %s: marked as bad» и возвращает 0. - fw-tv188b-261021-0117-r25--plugin-loader.c083 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · FUN_00215e08 r25 возвращает 0 сразу при external_plugins_enabled=none; при режиме 0 возвращает 1 без вызова plugin_signer, при signed с успешным plugin_signer также возвращает 1. [^213]: fw-tv188b-261021-0117-r25--plugin-loader.c068 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В ветке populate_plugins r25 со вторым аргументом 0 плагин пропускается без загрузки, если в его каталоге есть обычный файл .bad_signature (лог «[populate_plugins] %s: bad_signature flag is set»); в ветке с ненулевым вторым аргументом этот файл не проверяется. [^214]: - doc-sdk-dune-custom-firmware.c008 · doc · any-documented; прошивка — · Синтаксис plugin_config.xml: корень plugin_config, раздел plugins с default_external, default_embedded и записями plugin name="..."; действия allow_install (yes|signed|no), allow_delete (yes|no), allow_replace (yes|same_signer_id|no). - fw-tv188b-260827-0003-r24--plugin-loader.c021 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · libduneshell.so содержит пути /config/plugin_config.xml и /firmware/config/plugin_config.xml, функцию parse_plugin_config() и имена allow_install, signed, allow_delete, allow_replace, same_signer_id, default_embedded, default_external [^215]: doc-sdk-dune-custom-firmware.c016 · doc · any-documented; прошивка — · В синтаксисе plugin_config.xml документ закрывает элемент plugin тегом , а в примере 3 имя записано как — опечатки SDK. [^216]: - doc-sdk-dune-custom-firmware.c001 · doc · any-documented; прошивка — · Параметр external_plugins_enabled в /firmware/config/ro_config.properties задаёт, какие сторонние плагины разрешены; умолчание — all, доступен с прошивок 130803_b8+. - doc-sdk-dune-custom-firmware.c002 · doc · any-documented; прошивка — · external_plugins_enabled: all разрешает все сторонние плагины; signed — только подписанные Dune HD, причём signer_id должен быть указан в allowed_plugin_signer_ids, если этот список задан. - doc-sdk-dune-custom-firmware.c003 · doc · any-documented; прошивка — · external_plugins_enabled: none запрещает сторонние плагины — доступны только включённые в прошивку, и обновлять их, включая онлайн-обновление, нельзя. [^217]: doc-sdk-dune-custom-firmware.c004 · doc · any-documented; прошивка — · allowed_plugin_signer_ids задаёт разделённый запятыми список допустимых signer ID; если параметр не задан, разрешены все signer ID; умолчание — не задан, доступен с прошивок 130803_b8+. [^218]: - doc-sdk-dune-custom-firmware.c006 · doc · any-documented; прошивка — · Файл /firmware/config/plugin_config.xml позволяет ограничить действия с отдельными плагинами — указать, какие нельзя устанавливать, заменять или удалять; доступен с прошивок 150113_b9+. - doc-sdk-dune-custom-firmware.c008 · doc · any-documented; прошивка — · Синтаксис plugin_config.xml: корень plugin_config, раздел plugins с default_external, default_embedded и записями plugin name="..."; действия allow_install (yes|signed|no), allow_delete (yes|no), allow_replace (yes|same_signer_id|no). [^219]: - doc-sdk-dune-custom-firmware.c011 · doc · any-documented; прошивка — · default_embedded задаёт умолчания для встроенных плагинов, default_external — для внешних; по умолчанию разрешено всё; секция plugin name="..." перекрывает часть умолчаний для указанного плагина. - doc-sdk-dune-custom-firmware.c009 · doc · any-documented; прошивка — · В plugin_config.xml встроенным (embedded) считается плагин, входящий в прошивку (например, есть каталог /firmware_ext/plugins/), остальные — external; заменённый или обновлённый встроенный плагин всё равно считается embedded. [^220]: doc-sdk-dune-custom-firmware.c010 · doc · any-documented; прошивка — · Термины plugin_config.xml: install — развёртывание нового плагина, replace — любое изменение существующего, кроме update, update — вызов механизма онлайн-обновления. [^221]: - doc-sdk-dune-custom-firmware.c012 · doc · any-documented; прошивка — · allow_install = yes|signed|no определяет, разрешена ли установка новых внешних плагинов; значение signed — только подписанных. - doc-sdk-dune-custom-firmware.c013 · doc · any-documented; прошивка — · allow_delete = yes|no определяет, разрешено ли удаление плагина. [^222]: - doc-sdk-dune-custom-firmware.c014 · doc · any-documented; прошивка — · allow_replace = yes|same_signer_id|no определяет, разрешена ли замена; same_signer_id: если прежний плагин подписан — новый должен быть подписан тем же signer ID, если не подписан — новый может быть неподписан или подписан любым signer ID. - doc-sdk-dune-custom-firmware.c015 · doc · any-documented; прошивка — · allow_replace не влияет на онлайн-обновление: обновление всегда ограничено логикой same_signer_id. [^223]: fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c035 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Встроенные PHP-плагины r24 формируют URL установщика как plugin_installer://<адрес>:::<ключ>=<значение>&… с ключами schema, name, caption, title, need_confirm_replace, close_on_success, signer_id [^224]: - fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c075 · code · android-atv; прошивка 260724_0207_r24 · В APK r24 URL установщика plugin_installer://…:::schema=… разбирается так (fcn.0057096c): schema = update — обновление установленного плагина (c076), tgz и zip — прямой пакет, иначе atoi; в fcn.002c7a40 schema < 1 — «schema should be > 0», 1 — нужен name (по нему берётся установленный version_index или −1, update.txt разбирается fcn.002c5968), 2 — update_info.xml разбирается fcn.002c5ef4 без сверки имени с name из URL, а ignore_existing ≠ 0 отключает сравнение с установленной версией; прочие — «schema %d is not supported» - fw-tv188b-261021-0117-r25--plugin-loader.c053 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 IP Control launch_media_url с plugin_installer://HTTP-URL:::schema=zip&name=kb_probe11z&need_confirm_replace=0&close_on_success=1 заменил уже установленный kb_probe11z и зарегистрировал его как php. [^225]: fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c075 · code · android-atv; прошивка 260724_0207_r24 · В APK r24 URL установщика plugin_installer://…:::schema=… разбирается так (fcn.0057096c): schema = update — обновление установленного плагина (c076), tgz и zip — прямой пакет, иначе atoi; в fcn.002c7a40 schema < 1 — «schema should be > 0», 1 — нужен name (по нему берётся установленный version_index или −1, update.txt разбирается fcn.002c5968), 2 — update_info.xml разбирается fcn.002c5ef4 без сверки имени с name из URL, а ignore_existing ≠ 0 отключает сравнение с установленной версией; прочие — «schema %d is not supported» [^226]: - fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c035 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Встроенные PHP-плагины r24 формируют URL установщика как plugin_installer://<адрес>:::<ключ>=<значение>&… с ключами schema, name, caption, title, need_confirm_replace, close_on_success, signer_id - fw-tv188b-261021-0117-r25--builtin-plugins-misc.c035 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Перед установкой dunestore разворачивает required_plugins: неустановленная зависимость ставится через plugin_installer://plugins//update_info.xml:::schema=2&name= (в обычном режиме download_url_prefix — http://files3.dune-hd.com/dune_store/v1/), установленная — через plugin_installer://:::schema=update. Для самого плагина: update_url → schema=1, если адрес оканчивается на .txt или содержит «.txt?», иначе schema=2; без update_url — download_url без schema; при !ext_tv_mode в URL самого плагина и неустановленной зависимости добавляется &caption=; затем добавляются need_confirm_replace=0, close_on_success=1 и signer_id (если задан), и URL отдаётся ActionFactory::launch_media_url с next_action apply_install. [^227]: - fw-tv188b-261021-0117-r25--builtin-plugins-misc.c035 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Перед установкой dunestore разворачивает required_plugins: неустановленная зависимость ставится через plugin_installer://plugins//update_info.xml:::schema=2&name= (в обычном режиме download_url_prefix — http://files3.dune-hd.com/dune_store/v1/), установленная — через plugin_installer://:::schema=update. Для самого плагина: update_url → schema=1, если адрес оканчивается на .txt или содержит «.txt?», иначе schema=2; без update_url — download_url без schema; при !ext_tv_mode в URL самого плагина и неустановленной зависимости добавляется &caption=; затем добавляются need_confirm_replace=0, close_on_success=1 и signer_id (если задан), и URL отдаётся ActionFactory::launch_media_url с next_action apply_install. - fw-tv188b-261021-0117-r25--shell-ext--search-tv.c026 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · ensure_tv_app_installed r25 для type=plugin: если плагин уже установлен и force_check_update — запускает plugin_installer://:::schema=update (при need_launch с launch после), иначе если не установлен — требует update_url и запускает plugin_installer://:::schema=2&name=&need_confirm_replace=0&close_on_success=1 с необязательным signer_id (при need_launch с launch после). [^228]: - fw-tv188b-261021-0117-r25--builtin-plugins-misc.c037 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · DuneStorePluginScreen для установленного плагина показывает «Обновить», только если плагин не launch_capable и installed version_index < доступного, иначе «Запустить»; справа всегда «Удалить». Для неустановленного — «Установить»; для community-плагина установка сначала показывает диалог подтверждения и продолжается действием confirmed_install. Установка/обновление строит plugin_installer URL (update_url → schema 1/2, иначе download_url с space_needed), добавляет need_confirm_replace=0 и signer_id (если задан); удаление — plugin_uninstaller://; после действия refresh перечитывает installed_plugins.xml и инвалидирует списки. - plg-hdtv-youtube.c090 · code · unknown; прошивка — · При control_id=installPlug экран настроек YouTube возвращает launch_media_url с plugin_installer://http://dune-club.info/plugins/update/Codec_install/dune_plugin_Codec_install.tar.gz:::name=Codec_install&space_needed=2000000&need_confirm_replace=0 и post_action launch_media_url('plugin_launcher://Codec_install'). [^229]: fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c036 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dunestore выбирает schema по update_url: адрес, оканчивающийся на .txt или содержащий «.txt?», ставится со schema=1, иначе schema=2; без update_url — plugin_installer://:::name=… без schema [^230]: fw-tv188b-261021-0117-r25--builtin-plugins-misc.c031 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Элемент plugins/plugin каталога задаёт name, version_index, version, caption, icon_path, icon_fit_scale_factor (по умолчанию 0.9), badge_icon_url, poster_path, archive_path, update_url, space_needed, short_description, long_description, interface_language, language, country, preferred_language, suggested/language+country, required_plugins, always_install, target_plugin, target_app, target_update_url, strict_country, apk, expr, auto_apply_expr, product, firmware_features; skins/skin — name, caption, icon_path, archive_path, space_needed, short_description. [^231]: fw-tv188b-261021-0117-r25--builtin-plugins-misc.c030 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Каталог dunestore — XML с categories/category: name, type (categories|plugins|skins), caption_t_key или caption, icon_path, badge_icon_url, icon_margin_left/top/right/bottom, description, skip_if_single; при type=categories подкатегории — список имён, при plugins — список имён плагинов, при skins — список имён скинов. [^232]: fw-tv188b-261021-0117-r25--builtin-plugins-misc.c029 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Кэш каталога — /cache/.xml плюс .tm (Last-Modified); при наличии кэша и отсутствии интернета используется кэш; иначе при наличии .tm и непустом кэше запрос идёт с If-Modified-Since, если кэш не старше CACHE_EXPIRE_TIMEOUT = 604800 с (иначе заголовок не ставится — полное перечитывание), а 304 — кэш; при отсутствии Last-Modified XML пишется без .tm. [^233]: doc-sdk-dune-store.c013 · doc · any-documented; прошивка — · Каталог Dune Store — XML-документ с иерархией catalog/categories/category, catalog/plugins/plugin и catalog/skins/skin. [^234]: doc-sdk-dune-store.c003 · doc · any-documented; прошивка — · Каждое приложение в каталоге Dune Store реализовано как Dune-плагин; все приложения сгруппированы по категориям, каждое принадлежит ровно одной категории, а список категорий и их описания определяются каталогом Dune Store. [^235]: doc-sdk-dune-store.c031 · doc · any-documented; прошивка — · archive_path задаётся относительно download_url_prefix и ведёт на .tar.gz; содержимое архива совпадает с обычным установочным dune_plugin*.zip; dune_plugin.xml в архиве согласован с каталогом и содержит check_update. [^236]: doc-sdk-dune-store.c032 · doc · any-documented; прошивка — · space_needed — размер в байтах, который плагин займёт после установки во flash-память; вычисляется как du -sk /path/to/folder * 1024. [^237]: doc-sdk-dune-store.c027 · doc · any-documented; прошивка — · language — список идентификаторов языков через запятую для фильтрации по настройке Interface language (Setup / General); any означает все языки; идентификаторы те же, что в языковых файлах Dune; в документе перечислены 24 идентификатора для прошивки 130515_2104_b6. [^238]: doc-sdk-dune-store.c028 · doc · any-documented; прошивка — · country — список стран через запятую, где приложение показывается; в других странах оно не показывается, страна определяется по GeoIP; any означает все страны; идентификаторы — названия стран из базы MaxMind GeoIP. strict_country — то же, но с более строгой проверкой GeoIP. [^239]: doc-sdk-dune-store.c029 · doc · any-documented; прошивка — · product — список спецификаций продуктов Dune HD (идентификатор из Setup / Information) или платформ 8644, 8654, 8670, 8672, 8674; для WebKit-браузера указывают 8670, для Opera — 8672,8674, для любого из них — 8670,8672,8674. [^240]: - doc-sdk-dune-store.c022 · doc · any-documented; прошивка — · short_description плагина показывается в правой панели списка приложений и на экране описания; это короткая фраза (несколько слов), рекомендуется с точкой на конце, поддерживает lang. - doc-sdk-dune-store.c023 · doc · any-documented; прошивка — · long_description плагина показывается на экране описания; это одно или несколько предложений, переводы строк не допускаются, рекомендуется уместить без прокрутки; поддерживает lang. - doc-sdk-dune-store.c024 · doc · any-documented; прошивка — · icon_path плагина — путь относительно icon_url_prefix на PNG; при наличии точек входа рекомендуется совпадение с иконкой главной точки входа из dune_plugin.xml; badge_icon_url — gui_skin:// или http:// URL на PNG. - doc-sdk-dune-store.c025 · doc · any-documented; прошивка — · poster_path задаёт постер на экране описания приложения; обрабатывается так же, как icon_path, с теми же требованиями и может совпадать с icon_path. - doc-sdk-dune-store.c026 · doc · any-documented; прошивка — · interface_language — список названий языков через запятую и пробел, только для показа в Dune Store; international означает все языки; названия языков задаются по-английски. [^241]: doc-sdk-dune-store.c042 · doc · any-documented; прошивка — · Файл dsconfig.xml поддерживается начиная с прошивок 130716_b6+. [^242]: doc-sdk-dune-store.c039 · doc · any-documented; прошивка — · По умолчанию список источников приложений содержит только стандартный источник, соответствующий стандартному серверу Dune Store; кастомный список может содержать или не содержать стандартный источник и один или несколько своих. [^243]: - doc-sdk-dune-store.c040 · doc · any-documented; прошивка — · В dsconfig.xml источники задаются в dsconfig/sources элементами standard_source и source; для нестандартного источника указывают catalog_url, download_url_prefix и icon_url_prefix, а если префиксы не заданы, они выводятся из catalog_url отбрасыванием имени файла. - doc-sdk-dune-store.c041 · doc · any-documented; прошивка — · Если несколько источников описывают один и тот же ресурс (приложение, скин, категорию), приоритет определяется порядком источников в списке: используется описание из первого источника. [^244]: doc-sdk-dune-store.c043 · doc · any-documented; прошивка — · dsconfig.xml может ограничить список плагинов: enabled_plugins — через запятую имена, плагин не показывается, если его нет в списке; disabled_plugins — через запятую имена, плагин не показывается, если он в списке. [^245]: - doc-sdk-dune-store.c044 · doc · any-documented; прошивка — · enabled_plugins_url и disabled_plugins_url — HTTP-URL файла со списком имён через запятую, который скачивается при каждом входе в Dune Store; если скачать не удалось, Dune Store всегда показывает пустой список плагинов; enabled-вариант скрывает плагин, которого нет в списке, disabled-вариант — плагин, который в списке есть. - doc-sdk-dune-store.c046 · doc · any-documented; прошивка — · URL-варианты списка плагинов позволяют менять его на лету, но файлы должны лежать на надёжном сервере: если их не удаётся загрузить, Dune Store становится недоступен; inline-варианты не добавляют HTTP-запросов, но их труднее обновлять. - doc-sdk-dune-store.c045 · doc · any-documented; прошивка — · В dsconfig.xml должно присутствовать не более одного из параметров enabled_plugins, disabled_plugins, enabled_plugins_url, disabled_plugins_url; если задано несколько, используется только один, остальные игнорируются. [^246]: doc-sdk-plugins.c109 · doc · any-documented; прошивка — · check_update/auto включает фоновую автопроверку обновлений (по умолчанию выключена), доступно с прошивки 150430_r10 [^247]: doc-sdk-plugins.c132 · doc · sigma-smp86xx, sigma-smp87xx; прошивка — · Платформенные файлы для SMP87xx (ARM) кладутся в .platform.87xx/ в корне плагина; основная копия (bin/, www/cgi-bin/) — для SMP86xx (MIPS) [^248]: thr-mydune-108.c011 · forum · hdtv_301, unknown; прошивка 150721_0136_B9 · В прошивке Dune 301 предустановленные плагины лежат в firmware_ext, и их можно удалить, модифицировав прошивку [^249]: plg-gh-kocourkuba-proiptv.c017 · code · unknown; прошивка — · build/make_update.php (кроме отладочной сборки) упаковывает dune_plugin/ в update_proiptv.tar.gz (PharData, GZ) и заполняет в update_proiptv.xml поля plugin_version_descriptor version, version_index, md5 и size архива; шаблон update_proiptv.xml.tpl — dune_plugin_update_info schema 2, url https://iptv.proiptv.info/update/update_proiptv.tar.gz. [^250]: plg-gh-kocourkuba-proiptv.c011 · code · unknown; прошивка — · check_update манифеста: schema 2, url https://iptv.proiptv.info/update/update_proiptv.xml, timeout 0, required no, auto false. [^251]: plg-upd-descriptors.c021 · code · unknown; прошивка — · Все 23 download_url schema 1 — http:// (не https) и ведут на пять хостов: dune-club.info (18), ott-play.com (2), iptv.moi-dom.tv, ddaaff.mydune.ru и app.xsmart.tv (по 1). [^252]: plg-hdtv-update-bootstrap.c019 · code · unknown; прошивка — · Все 43 адреса обновлений начинаются с http://; ни один не использует https. [^253]: - plg-dc-screenshoter.c007 · code · unknown; прошивка — · Блок check_update задаёт schema = 1 - plg-dc-screenshoter.c008 · code · unknown; прошивка — · Адрес проверки обновлений check_update/url — http://dune-club.info/plugins/update/Screenshoter/update.txt [^254]: plg-dc-screenshoter.c042 · code · unknown; прошивка — · Кнопка whats_new загружает http://dune-club.info/plugins/update//info.txt и показывает текст в диалоге [^255]: plg-upd-descriptors.c020 · code · unknown; прошивка — · В schema 2 url пакета ведёт на files7.dune-hd.com у amediateka, dune-hd.tv, dunemdb_supplier_generic и first_muz_ru и на dune-club.info у globaltv и dunemdb_supplier_movies_rus; у globaltv адрес https, у остальных пяти — http. [^256]: plg-hdtv-update-bootstrap.c021 · code · unknown; прошивка — · В 37 из 43 пакетов ровно три файла — dune_plugin.xml, один PHP и один значок; у liteiptv четыре файла (два значка), ещё у edem, glanz, ilook, itv и smile — три файла и icons/Thumbs.db. [^257]: plg-hdtv-update-bootstrap.c040 · code · unknown; прошивка — · У всех 41 дескриптора version_index больше, чем version_index манифеста того же плагина: у 39 манифестов 0, у shura 5, у ottclub 7, а минимальный version_index дескриптора — 1 (great). [^258]: plg-hdtv-update-bootstrap.c029 · forum · unknown; прошивка — · Автор liteIPTV в первом посте пишет, что приложенная версия обновится до последней актуальной. [^259]: plg-dc-globaltv.c026 · code · unknown; прошивка — · Пакет содержит файл подписи dune_plugin.sign (бинарный, 48 байт) и dune_plugin_signer_id.txt со значением com.dune-hd. [^260]: plg-dc-globaltv.c023 · code · unknown; прошивка — · dune_plugin_metadata.xml помечает плагин как community_plugin = yes и secure_update = yes. [^261]: plg-dc-dunemdb-supplier-online-movies.c017 · code · unknown; прошивка — · Метаданные требуют firmware feature dunemdb_supplier_plugin_api_v6 и помечают плагин как community_extension и signed_community. [^262]: plg-dc-dunemdb-supplier-online-movies.c020 · code · unknown; прошивка — · В commit.txt пакета записан хеш 25042e182f8a6ecb0547d7a1df4a091b6d888ef5, идентификатор подписанта — com.dune-hd. [^263]: plg-dc-globaltv.c016 · code · unknown; прошивка — · Параметры check_update: timeout 86400, required no, auto yes, dont_ask_confirmations yes. [^264]: plg-hdtv-youtube.c091 · code · android; прошивка — · При control_id=installPlug и HD::is_android() == true экран настроек YouTube подставляет plugin_installer:// для http://dune-club.info/plugins/update/ffmpeg_install/dune_plugin_ffmpeg_install.tar.gz (name=ffmpeg_install) и post_action reset_controls вместо запуска плагина. [^265]: plg-dc-entware.c044 · code · unknown; прошивка — · Если /tmp/run/installed_plugins.xml не содержит rem_tor, экран transmission предлагает установить RemTor через plugin_installer://http://dune-club.info/plugins/update/_other/RemTor/rem_tor.tar.gz с name=rem_tor, space_needed=1009680 и need_confirm_replace=0; если содержит — открывает plugin_launcher://rem_tor. [^266]: plg-gh-mdpuma-dune-plugin-altiptv.c081 · code · unknown; прошивка — · Обработчик do_new_install возвращает launch_media_url с plugin_installer:// для Codec_install_v4.0.3.tar.gz и callback refresh. [^267]: doc-sdk-plugins.c026 · doc · any-documented; прошивка — · PHP-плагин обязан содержать PHP-программу с функцией hd_create_plugin(); путь к ней задаётся в dune_plugin.xml [^268]: fw-tv188b-261021-0117-r25.c372 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 PHP-зонды kb_probe5 и kb_probe10 работали без hd_create_plugin(): их main.php объявляет класс, унаследованный от DunePluginFw, и handle_user_input выполнялся. [^269]: doc-sdk-plugins.c140 · doc · android; прошивка — · В SDK для Android приведены команды развёртывания плагина: adb push в /flashdata/plugins/ и chmod -R +x для bin и www/cgi-bin внутри каталога плагина. [^270]: fw-tv188b-261021-0117-r25.c207 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в корне ФС каталога /flashdata нет, а оболочка в shell.log называет каталог плагинов /flashdata/plugins («Loading plugins from '/flashdata/plugins'», «invalid plugin manifest from '/flashdata/plugins/kb_probe5_badname/dune_plugin.xml'», «copying recursively '/tmp/plugin_tmp' to '/flashdata/plugins/kb_probe5_plat'»); файлы этих плагинов лежат в /data/data/com.dunehd.app/flashdata/plugins. [^271]: fw-tv188b-261021-0117-r25.c203 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 каталоги плагинов, положенные adb push в /data/data/com.dunehd.app/flashdata/plugins, не подхватились перечитыванием по IP Control (cmd=main_screen, затем cmd=ir_code&ir_code=B24DBF00; обе команды ответили command_status ok): в shell.log после них нет ни строк kb_probe5, ни «Loading plugins from», ни populate_plugins, а kb_probe5 нет в /tmp/run/installed_plugins.xml. kb_probe5 и kb_probe5_sup зарегистрировались после am force-stop com.dunehd.app. [^272]: fw-tv188b-261021-0117-r25.c204 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 (collect6) плагины, удалённые rm -rf из /data/data/com.dunehd.app/flashdata/plugins, после перечитывания по IP Control (cmd=main_screen + cmd=ir_code&ir_code=B24DBF00) остались в /tmp/run/installed_plugins.xml (grep -c kb_probe6 = 4) и в меню «Приложения»; исчезли они только после am force-stop com.dunehd.app. [^273]: fw-tv188b-261021-0117-r25.c205 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 (collect5) после rm -rf каталогов зондов kb_probe5* из /data/data/com.dunehd.app/flashdata/plugins и перечитывания по IP Control (cmd=main_screen + cmd=ir_code&ir_code=B24DBF00) в /tmp/run/installed_plugins.xml не было ни одной строки с kb_probe5 (grep -c = 0). [^274]: doc-sdk-plugins.c137 · doc · android; прошивка — · Текст документа буквально говорит: при установке на Android содержимое .platform.android удаляется, а содержимое .platform.87xx переносится в корень [^275]: doc-sdk-dune-store.c016 · doc · any-documented; прошивка — · type категории в документе принимает только значения plugins или skins. [^276]: doc-sdk-dune-store.c019 · doc · any-documented; прошивка — · Документ описывает элемент catalog/plugins/plugin полями name, caption, short_description, long_description, icon_path, badge_icon_url, poster_path, interface_language, language, country, strict_country, product, version_index, version, archive_path, space_needed. [^277]: doc-sdk-dune-store.c010 · doc · any-documented; прошивка — · Файлы плагинов и скинов скачиваются, когда приложение Dune Store просит STB запустить установку; URL строится из содержимого каталога и download URL prefix; стандартный префикс — http://online.dune-hd.com/dune_store/v1/ (примеры .../plugins/plugin_name/1.tgz и .../skins/Black/dune_skin_black.zip), кастомная прошивка может задать другой. [^278]: - doc-sdk-dune-custom-firmware.c004 · doc · any-documented; прошивка — · allowed_plugin_signer_ids задаёт разделённый запятыми список допустимых signer ID; если параметр не задан, разрешены все signer ID; умолчание — не задан, доступен с прошивок 130803_b8+. - fw-tv188b-260827-0003-r24--plugin-loader.c111 · doc · any-documented; прошивка — · SDK описывает ro_config-параметр allowed_plugin_signer_ids: список разрешённых signer id через запятую; если параметр не задан, разрешены все signer id. [^279]: fw-tv188b-261021-0117-r25--plugin-loader.c039 · inference · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 отсутствие dune_plugin.sign и dune_plugin_signer_id.txt не помешало штатной установке и регистрации kb_probe5_plat; это не доказывает, что подпись не проверяется у других плагинов, и не задаёт политику кастомных прошивок. [^280]: fw-tv188b-260827-0003-r24--plugin-loader.c114 · inference · tv188b, android-dune-fw; прошивка 260827_0003_r24 · На tv188b r24 без plugin_config.xml плагины без dune_plugin_signer_id.txt загружались; это согласуется с SDK (external_plugins_enabled по умолчанию all), но обобщение «подпись не нужна» верно только для розничной r24 без plugin_config.xml и не проверено на других моделях, кастомных прошивках и для dune_plugin.sign. [^281]: fw-tv188b-261021-0117-r25--plugin-loader.c040 · inference · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Лог r25 показывает DSA-проверку для dune-hd.tv и shell_ext; из него нельзя вывести, проверяются ли остальные плагины и почему выбраны эти два — нужен дизассемблер или эксперимент. [^282]: fw-tv188b-261021-0117-r25--plugin-loader.c077 · inference, disputed · tv188b, android-dune-fw; прошивка 261021_0117_r25 · DSA-проверка в логе r25 видна только у dune-hd.tv и shell_ext, вероятно, потому, что populate_plugins вызывает plugin_signer лишь для плагинов с strict_verify_needed=yes в манифеста (у dune-hd.tv флаг есть), а у остальных, включая kb_probe5_plat, флага нет; что свойства puVar3[7] — именно , и что у shell_ext r25 флаг есть, по листингам не видно. [^283]: fw-tv188b-261021-0117-r25--plugin-loader.c078 · inference, disputed · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Для стороннего плагина без strict_verify_needed populate_plugins r25 не проверяет dune_plugin.sign при загрузке, и в самой populate_plugins ro_config не читается; поэтому external_plugins_enabled=signed, если действует, должен действовать через фильтр «not permitted», через .bad_signature или в установщике, а не через проверку подписи загрузчиком — какой механизм, не установлено. Это расходится с SDK, по которому подписанный плагин с неверной подписью не используется всегда. [^284]: fw-tv188b-260827-0003-r24--plugin-loader.c113 · inference · tv188b, android-dune-fw; прошивка 260827_0003_r24 · По псевдокоду Ghidra ro_config_load_if_needed в libduneutil.so r24 читает external_plugins_enabled и allowed_plugin_signer_ids из /config/ro_config.properties или /firmware/config/ro_config.properties и различает значения signed и none; подтверждающего r2-листинга нет, поэтому это вывод. [^285]: - fw-tv188b-261021-0117-r25--plugin-loader.c079 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · ro_config_load_if_needed r25 сохраняет external_plugins_enabled в ro_config+0x1ec: signed (без учёта регистра) — 1, none — 2, отсутствующее или любое другое значение — 0. - fw-tv188b-261021-0117-r25--plugin-loader.c072 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Поле ro_config по смещению 0x1f0, из которого plugin_signer r25 берёт список допустимых signer_id, заполняется разборщиком ro_config_load_if_needed из свойства allowed_plugin_signer_ids. [^286]: fw-tv188b-260827-0003-r24--plugin-loader.c071 · inference · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Плагин без подписи: по SDK запрет неподписанных плагинов — настройка кастомных (операторских) прошивок; каким механизмом r24 его включает (strict_verify_needed, «signed» в plugin_config.xml), не установлено [^287]: - fw-tv188b-260827-0003-r24--plugin-loader.c108 · device · tv188b, android-dune-fw; прошивка 260827_0003_r24 · На tv188b r24 поиск по /system, /vendor и /data/data/com.dunehd.app не нашёл plugin_config.xml; в выводе только 10 файлов dune_plugin_signer_id.txt. - fw-tv188b-260827-0003-r24--plugin-loader.c109 · device · tv188b, android-dune-fw; прошивка 260827_0003_r24 · На tv188b r24 в /tmp/run/installed_plugins.xml загружены плагины, для которых поиск не нашёл dune_plugin_signer_id.txt, в том числе melange, play_in_apps, Filmix_api, Screenshoter, VPN и test_php-cgi; наличие dune_plugin.sign у них не проверялось. [^288]: fw-tv188b-260827-0003-r24--plugin-loader.c042 · inference, disputed · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Установщик может отказать в установке неподписанного плагина, в замене плагина с другим signer_id и в замене «hard-coded» плагина; что из этого действует по умолчанию (без plugin_config.xml), из строк не следует [^289]: fw-tv188b-260827-0003-r24--plugin-loader.c070 · inference · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Плагин с подписью, не прошедшей проверку: в r24 при загрузке есть ошибка «signature verification failed … but required» при флаге strict_verify_needed; по SDK подписанный плагин с неверной подписью система не использует вообще — что делает загрузчик r24 без этого флага, не установлено [^290]: fw-tv188b-260827-0003-r24--plugin-loader.c012 · inference, disputed · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Файл-флаг .bad_signature в каталоге плагина помечает плагин как не прошедший проверку подписи, и populate_plugins его пропускает [^291]: fw-tv188b-260827-0003-r24--plugin-loader.c075 · inference, disputed · tv188b, android-dune-fw; прошивка 260827_0003_r24 · plugin_config.xml задаёт политику для плагинов по имени (элементы с name; allow_install, signed, allow_delete, allow_replace, same_signer_id) с умолчаниями default_embedded и default_external [^292]: fw-tv188b-260827-0003-r24--plugin-loader.c076 · inference, disputed · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Файл /config/plugin_config.xml, вероятно, дополняет или перекрывает /firmware/config/plugin_config.xml; приоритет по строкам не виден [^293]: fw-tv188b-260827-0003-r24--plugin-loader.c084 · inference · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Подпись плагина считается по DSA по обычным файлам каталога плагина; нерегулярные файлы пропускаются [^294]: fw-tv188b-260827-0003-r24--plugin-loader.c086 · inference, disputed · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Загрузчик r24 ищет открытый ключ проверки подписи в /firmware/config/plugin_key.pem и /config/plugin_key.pem; путь /firmware/config совпадает с SDK для кастомного signer ID, роль /config/plugin_key.pem и приоритет не установлены [^295]: fw-tv188b-260827-0003-r24--plugin-loader.c087 · inference · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Проверка signer_id в r24 сравнивает требуемый signer_id с фактическим и может отклонить signer_id как не разрешённый; это согласуется с SDK (допустимы «com.dune-hd» и customer ID кастомной прошивки); при каком условии выдаётся «unsupported signer_id», не установлено [^296]: - fw-tv188b-261021-0117-r25--plugin-loader.c070 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · plugin_signer (0x002aa204) r25 читает signer_id из файла dune_plugin_signer_id.txt в каталоге плагина (FUN_002aa164); если его нет — «[plugin_signer] %s: the required signer_id is missing» и результат 0; если третий аргумент задан и не равен signer_id — «invalid signer_id: requied(%s) != actual(%s)» и 0 (populate_plugins передаёт 0, т. е. без требуемого signer_id). - fw-tv188b-261021-0117-r25--plugin-loader.c071 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · plugin_signer r25 проверяет signer_id по списку через запятую (FUN_002a9f64); список берётся из поля ro_config по смещению 0x1f0, а если оно пусто — «com.dune-hd» или «com.dune-hd,»; signer_id не из списка — «[plugin_signer] %s: signer_id '%s' not allowed» и 0. [^297]: doc-sdk-plugins--gui-actions.c089 · doc, disputed · any-documented; прошивка — · LaunchMediaUrl выбирает установщик, деинсталлятор или запускатель плагинов, если плейлист состоит из одного URL plugin_installer://*, plugin_uninstaller://* или plugin_launcher://* соответственно [^298]: - fw-tv188b-261021-0117-r25--plugin-loader.c053 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 IP Control launch_media_url с plugin_installer://HTTP-URL:::schema=zip&name=kb_probe11z&need_confirm_replace=0&close_on_success=1 заменил уже установленный kb_probe11z и зарегистрировал его как php. - fw-tv188b-261021-0117-r25--plugin-loader.c055 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 plugin_uninstaller://kb_probe11z по IP Control вызвал uninstall через sh bin/ga.sh uninstall; оболочка записала uninstall action finished with status 0. [^299]: fw-tv188b-260827-0003-r24--plugin-loader.c096 · inference · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Поля data_url, name, caption, space_needed, need_confirm_replace, need_launch, close_on_success, вероятно, — параметры URL plugin_installer:// (в синтаксисе {ключ=значение}, как у plugin_launcher://); точный формат installer-URL в строках не найден [^300]: fw-tv188b-260827-0003-r24--plugin-loader.c044 · inference · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Пакет плагина для установщика — ZIP-архив: он скачивается по URL во временный каталог как __plugin__.zip, распаковывается unzip, может сверяться по md5; затем каталог копируется или переименовывается в <хранилище>/plugins/ [^301]: fw-tv188b-260827-0003-r24--plugin-loader.c068 · inference · tv188b, android-dune-fw; прошивка 260827_0003_r24 · При разборе манифеста name сравнивается с именем каталога плагина; вероятный этап отказа — populate_plugins (строка 10497 «invalid plugin manifest from …»); отказ установщика не установлен. [^302]: fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c008 · inference · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Вероятно, require / required_firmware_features в plugin_version_descriptor задают условия на прошивку: дескриптор, не прошедший условия, отсеивается, и из кандидатов остаются «matches»; redirect, вероятно, отсылает к другому update info при совпадении условия [^303]: plg-hdtv-update-bootstrap.c022 · inference · unknown; прошивка — · Пакеты 22 каркасов неполные: PHP требует lib/default_dune_plugin_fw.php и starnet_plugin.php, но в пакете только dune_plugin.xml, PHP и значок, каталога lib/ нет; без обновления точка входа не выполнится. [^304]: doc-sdk-plugins.c142 · doc, disputed · any-documented; прошивка — · Перечитать плагины без перезапуска оболочки: в верхнем меню нажать ANGLE/ROTATE (или Refresh в POP UP MENU) либо по IP Control: cmd=main_screen, затем cmd=ir_code&ir_code=B24DBF00