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

Приёмы разработки плагинов Dune HD: сеть, данные, фон и веб

Часть каталога о сети, хранении и фоновой работе: HTTP-клиент и разбор ответов, настройки и DATA, фоновые процессы и системные действия, CGI и внешние приложения. Это разделы 9, 10, 13 и 15 общего каталога; их нумерация сохранена.

9. Сеть и HTTP

Объект: HTTP-клиенты, авторизация, разбор ответов и обход блокировок в PHP-плагинах (GlobalTV, Twitch TV, ProIPTV, altIPTV, Smart_, youtube_api/folder_cache, YouTube (Smart_), zlostnyi, MegaAnime, MegaRadio, RemTor и др.), в Android-приложении Jellyfin Bridge и во внешнем клиенте watch-sync; уровень code (отдельные строки — forum). Платформа и прошивка исполнения у большинства плагинов не установлены; факты о прошивке — tv188b r24 (code) и r25 (device).

Почти каждый сетевой плагин несёт свою копию HD::http_get_document поверх расширения curl PHP, и копии расходятся в тайм-аутах, User-Agent и реакции на ошибку. Встроенный в прошивку r24 метод по умолчанию отключает проверку TLS-сертификата, следует редиректам и применяет опции вызывающего поверх своих (код r24)1, а при ошибке curl или любом HTTP-коде, кроме 200, бросает DuneCurlException (код r24)2. На r25 (device) curl в PHP — 7.67.0 с OpenSSL 1.0.1u (устройство r25)3, и части констант (CURLOPT_ACCEPT_ENCODING, CURLOPT_RESOLVE, CURL_SSLVERSION_TLSv1_2 и др.) в нём нет (устройство r25)4; остальные сетевые грабли платформы (падение curl_multi к httpd самого плеера, CA-бандл, HTTP_HOST) — guide/pitfalls.md, «Сеть». Ошибки на экране — §17, хранение логинов и токенов — §10, локальный HTTP-API прошивки — §15 и guide/ip-control.md.

9.1. HTTP-клиент: своя копия HD::http_get_document и её варианты

Общий приём — один хелпер на curl для всех запросов плагина, с POST-обёрткой поверх него. Различаются три вещи: тайм-ауты, проверка TLS и то, что хелпер делает при ошибке, — от этого зависит, упадёт ли вся операция плагина.

Задача Приём Грабли и ограничения Плагины и claims
Сделать GET с тайм-аутами и редиректами HD::http_get_document на curl; тайм-ауты 10 с (Twitch TV, Apple Trailers, Anidub.Com, pirates_), 11/10 с (Widget Ext), 25 с (altIPTV, plugtv, zlostnyi), 30/60 с (GlobalTV), 30 с с gzip и User-Agent Chrome/80 (Bazinga3), 40 с (Smart_, Online Movies rus, копии zlostnyi) у GlobalTV, Twitch TV, Widget Ext, altIPTV, plugtv, zlostnyi, Smart_*, Online Movies (rus), Torrent Center, ProIPTV и Bazinga3 проверка TLS отключена (CURLOPT_SSL_VERIFYPEER, у части и VERIFYHOST) — так же, как в хелпере прошивки r24 GlobalTV (код)5; Twitch TV (код)6; Apple Trailers (код)7; Anidub.Com (код)8; pirates_* (код)9; Widget Ext (код)10; altIPTV (код)11; plugtv (код)12; zlostnyi (код)13; Smart_* (код)14; Online Movies (rus) (код)15; Torrent Center (код)16; ProIPTV (код)17; Bazinga3 (код)18
Дать вызывающему переопределить опции curl переданные opts применяются после стандартных curl_setopt стандартные тайм-ауты и TLS-флаги можно случайно заменить Widget Ext (код)19; Twitch TV (код)6; altIPTV (код)11; Smart_* (код)14
POST и JSON-RPC http_post_document = http_get_document + CURLOPT_POST/CURLOPT_POSTFIELDS; make_json_rpc_request строит jsonrpc = 2.0 с id из статического счётчика Polbox.tv: service_api_call → fetch_document(get_post_data()) — POST-JSON с CURLOPT_SSL_VERIFYPEER=0 и CURLOPT_SSL_VERIFYHOST=0 Widget Ext (код)20; Anidub.Com (код)21; Polbox.tv (код)22
Реакция на ошибку исключение при ошибке curl или коде ≠ 200 (Twitch TV, Apple Trailers, pirates_*, Widget Ext); DuneCurlException при коде вне 200/201 (GlobalTV); пустая строка вместо исключения (Anidub.Com); null на 404 и исключение на прочие (DunePlexCatalog); только запись в лог и возврат тела — throw закомментированы (altIPTV) при исключении операция плагина обрывается, при пустой строке вызывающий должен сам проверять результат Twitch TV (код)6; Apple Trailers (код)7; pirates_* (код)9; Widget Ext (код)10; GlobalTV (код)23; Anidub.Com (код)8; DunePlexCatalog (код)24; altIPTV (код)25
Сообщить сетевому монитору прошивки об ошибке при ошибке curl и наличии сетевого монитора атомарно записать 1 в /tmp/run/network_monitor/force_check_on_error — GlobalTV (код)26
Проверить ключ доступа одним запросом HD::check_token: curl, при ошибке или коде ≠ 200 строка nottoken, иначе тело возвращается строка, а не null — см. §19 zlostnyi (код)27
Быстро проверить доступность сервера HD::isDomainAvailible: HEAD (CURLOPT_NOBODY) с CONNECTTIMEOUT 10 с; для URL на /echo — вернуть тело — MegaTorrents (код)28
Обойтись без curl file_get_contents($url) + json_decode; при FALSE — DuneException с фатальным show_error ошибка закрывает плагин AceStreamSearch (код)29
Качать из shell-скрипта wget по http (OpenWeatherMap, Яндекс, rp5), curl -s --location -k по https (Gismeteo) у каждого сервиса свой разбор ответа Widget Ext (код)30
Взять curl под платформу в shell выбор бинарника по platform_kind из $FS_PREFIX/tmp/run/versions.txt: android → $FS_PREFIX/firmware/bin/curl, коды 87../864./867./865. → свои сборки, иначе CURL пуст вложенные curl — 7.19.5 (mipsel) и 7.36.0 (ARM); curl.864x побайтно совпадает с shell_ext/bin/curl прошивки tv188b r24 Widget Ext (код)31
Проверить, жив ли URL перед проверкой URL отрезать суффиксы \|Referer… и \|Cookie…, затем запрос с Range: bytes=0-10000 и тайм-аутом 1 с; при ошибке источник отбрасывается — Online Movies (eng) (код)32
Загрузить .torrent в TorrServer multipart file=@<путь> на /torrent/upload, hash — из JSON ответа при его наличии; ссылка — JSON action=add с link и save_to_db (сбрасывается при dontSave) — Torrent Center (код)33
Создать плейлист в аккаунте YouTube POST /playlists?part=snippet,status с описанием «Created on Dune HD! Enjoy!» и privacyStatus private, затем добавить видео POST /playlistItems?part=snippet через http_get_api_v3 — YouTube (Smart_*) (код)34
Сходить в сеть из отдельного процесса run.php вызывает curl с тайм-аутом 40 с и User-Agent Firefox 7.0.1 — Dune HD TV (код)35

9.2. User-Agent и сведения об устройстве в запросе

User-Agent в копиях хелпера разный: от честного DuneHD/1.0 до браузерных и мобильных строк, которые сервис принимает за своего клиента.

Задача Приём Грабли и ограничения Плагины и claims
Назвать себя Dune с моделью и прошивкой DuneHD/1.0 + строки product_id и firmware_version из /tmp/sysinfo.txt — GlobalTV (код)36; ProIPTV (ещё и подпись плагина app_caption + app_version) (код)17
Просто DuneHD/1.0 постоянная строка в хелпере — Twitch TV (код)6; Apple Trailers (код)7; DunePlexCatalog (код)24
Представиться браузером Firefox 7.0.1 (pirates_*, Online Movies rus), Firefox 7 (Anidub.Com), Firefox/53 (Widget Ext), Firefox 25 + DuneHD/1.0 (plugtv), Opera Mobi (zlostnyi) — pirates_* (код)9; Online Movies (rus) (код)15; Anidub.Com (код)8; Widget Ext (код)10; plugtv (код)12; zlostnyi (код)37
Притвориться TV-клиентом YouTube POST JSON-контекста TV-клиента с заголовками Origin/Referer youtube.com/tv зависит от разметки youtube.com/tv YouTube (Smart_*) (код)38
UA для веб-приложения параметр манифеста user_agent=DUNE (bonus-tv) или user_agent=dune (xsmart) регистр у пакетов разный веб-плагины (код)39

9.3. Авторизация, токены и сессии

Задача Приём Грабли и ограничения Плагины и claims
Авторизоваться системной строкой устройства содержимое /tmp/dune_auth.txt дописывается в query как есть — GlobalTV (код)40
Сменить учётку из настроек сохранить логин и пароль, сбросить сессию, try_login; DuneException → post_action — Юрта ТВ (код)41
Разделить фатальные и обычные ошибки API код 12 с текстом Authentification error, коды 17 и 5 → unset_login; остальные показываются с кодом и сообщением (в playback — только сообщением) — Moi-Dom.tv (код)42
Показать ошибки доступа сервиса коды сервера 201–204 → «нет доступа», «пробный период окончен», «пробный период недоступен» (с кнопкой оплаты), «сервис недоступен» — GlobalTV (код)43
Войти в аккаунт с пульта (OAuth device flow) POST на .../oauth2/device/code → диалог с адресом активации и кодом → опрос .../oauth2/token по timer(5000), пока в ответе error перед диалогом обработчик ждёт interval секунд через sleep YouTube (Smart_*) (код)44; по сообщениям пользователей, код вводится в браузере компьютера (форум)45
Обновить токен на error.code 401 при наличии access_token — grant_type=refresh_token — YouTube (Smart_*) (код)46
Несколько аккаунтов токены основного аккаунта в tokens, дополнительных — в user_plus_tokens[<имя>] — YouTube (Smart_*) (код)47
Протокол с session id в заголовке (Transmission RPC) GetSessionID: GET, ожидание 409, чтение X-Transmission-Session-Id; запросы — POST JSON {method, arguments} с этим заголовком и Basic auth 401 → E_AUTHENTICATION, 409 → E_SESSIONID; тайм-аут 10 с RemTor (код)48
Ключи и токены API зашиты в код (client_id Twitch, токены bazon/HDVB/Kodik, ключ Last.fm) — Twitch TV (код)49; Smart_* (link_api) (код)50; MegaRadio (код)51
Не логиниться повторно если существует cookie-файл tmp_dir_path/filmix_cooki, вход считается выполненным; иначе POST login_name/login_password с заголовком x-a-key=sinatra и этим cookie-файлом ошибкой считается наличие form action= в ответе Smart_* (Filmix) (код)52
Войти по коду из SMS api_login: POST v2/auth/otp с phone (ведущая 8 заменяется на 7) и паролем из SMS, access_token — из ответа; эндпоинты сессии — v2/otps, v2/auth/otp, v2/auth/login, v2/auth/device, v2/users/self/... — Dune HD TV (код)53
Привязать устройство к аккаунту POST v2/users/self/devices с vendor DUNE, моделью, версией плагина, device_type stb, серийным номером из первой строки /fconfig/dune_license.dlf (третье поле, без дефисов) и application_type dune; device_id хранится в plugin_cookies, без него используется серийный номер ответ 400 «Too many devices.» открывает экран списка устройств Dune HD TV (код)54
Поднять сессию по устройству при заданном device_id POST v2/auth/device, затем v2/users/self (id, phone, username, parental_code, provider) — Dune HD TV (код)55
Разделить коды ответа API api_call: JSON декодируется; коды 200, 400, 401, 403, 404 возвращаются вызывающему как данные, остальные — исключение с диалогом «Ошибка взаимодействия с сервером.» при наличии error.message 400/401/403/404 вызывающий разбирает сам Dune HD TV (код)56
Активировать устройство по коду при заданном selected_media_url: token_request с user_dev_* и пустым user_dev_token → адрес https://filmix.tech/console и user_code; do_slogin_action сохраняет token_request в DuneSystem::$properties["user_dev_token"] и HD::save_items('tokens'), затем запрашивает /user_profile, успех — наличие user_data по сообщениям пользователей, без регистрации доступно только 480p, для 720p нужна регистрация, выше — Pro-аккаунт Smart_* (Filmix_API) (код)57; по сообщениям пользователей (форум)58
Узнать версию Transmission RPC конструктор TransmissionRPC сразу вызывает sget() и сохраняет rpc_version; get_rpc_version делает пустой запрос и возвращает версию созданного клиента sget() уже выполнен в конструкторе RemTor (код)59
Переключить альтернативную скорость use_alt_speed читает general_info['alt-speed-enabled'] из сохранённого ответа, сравнивает со строкой 'true' и вызывает sset с противоположным значением результат get_session_stats игнорируется; сравнение со строкой 'true' RemTor (код)60

9.4. Разбор ответов: HTML без DOM, JSON в странице, XML, большие числа

Плагины разбирают сайты строковыми операциями, а не DOM-парсером; такие разборы привязаны к вёрстке конкретного сайта.

Задача Приём Грабли и ограничения Плагины и claims
Разобрать HTML-страницу strstr/explode по текстовым маркерам блоков (newstitle, dle-content, <div class="item">, div#menu и т. п.) в youtube_api/folder_cache 12 уникальных версий cursor.php на 15 пакетов; у karas — 20 decoder-файлов под сайты Anidub.Com (код)61; youtube_api/folder_cache (код)62; MegaAnime (код)63
Достать JSON из JS на странице регулярка di.app.start\((.*})\); + json_decode у 101.ru результат json_decode не проверяется 101.ru (код)64; MegaRadio (код)65
Пройти страницы каталога /page/<n>/ к URL раздела; поиск — один POST поиск возвращает только первую страницу Anidub.Com (код)66
Добраться до плеера через iframe GET страницы → <iframe src> → повторный GET — Smart_* (link_api) (код)67
Разобрать iframe-резолверы link_api tortuga: разбор file:'...' JSON с title/folder/file, кэш cacheLinkApiTR; videoframe: frameindex.php?kp=<id> → data-token и type → POST /loadvideo → HLS; kinoDom: переводы по data-link и pl:"...", сезоны и серии из JSON playlist, playbackUrl через sUtils::parseModStr у tortuga playbackUrl в ранней ветке (URL уже в static $sArr) заменяет https на http, после разбора страницы — нет; getTortugaIframe — заглушка; kinoDom использует прокси при Kinodom_Class::$proxy Smart_* (link_api) (код)68
Выбрать декодер хостинга по ссылке цепочка проверок подстроки в URL, иначе URL как есть; для файлообменника — скрытые поля формы, sleep 5–12 с, POST, регулярка file: "…" порядок проверок важен; задержка зашита в код youtube_api/folder_cache (код)69
Разобрать XML/plist HD::parse_xml_document/simplexml_load_string, пары key/value; при неудаче — регулярка по HTML (Apple Trailers) ожидаемый корневой узел проверяется: при несовпадении — исключение (DunePlexCatalog) Apple Trailers (код)70; Moi-Dom.tv (код)71; DunePlexCatalog (код)72
Сохранить большие числа JSON до json_decode переписать числа в строки регуляркой RemTor превращает в строки все целые; так же делает клиент TorrServer прошивки r25 для чисел от 10 цифр (API_OPT_LONG_INT_AS_STRING) Torrent Center (код)73; RemTor (код)74; прошивка r25 (код r25)75
Подсказки поиска Google/YouTube suggestqueries.google.com/complete/search (client=toolbar, ds=yt), разбор по <suggestion data=" ответ — не JSON Widget Ext (код)76
Очистить названия от «опасных» символов HD::get_repl_mips_bug: перечисленные emoji, обратный слэш и полноширинные ASCII → *, прочие символы вне \pL\pN\pP\pS\pZ → пробел исходные названия искажаются altSource (код)77

9.5. Блокировки, прокси, зеркала и сервисы-посредники

Задача Приём Грабли и ограничения Плагины и claims
Прокси по выбору сайтов настройки proxy, proxy_akk, curlopt_proxytype (HTTP/SOCKS5) и site_proxytype; хелпер ставит CURLOPT_PROXY только для URL, подходящих под режим у MegaAnime в режиме 2 исключены ссылки link_api, iframe, m3u8 и адреса торрент-клиентов; у Vimeo — googleapis/zona/myshows MegaAnime (код)78; Smart_* (код)79
Прокси для одного запроса содержимое <data_dir>/tvdb_proxy.txt → HTTP_PROXY перед get_episodes — Online Movies (eng) (код)80
Пустить аудиопоток через прокси URL http://127.0.0.1/cgi-bin/plugins/MegaRadio/proxy?<поток> → CGI с http_proxy и wget -O- адрес прокси зашит в CGI MegaRadio (код)81
Сайт через анонимайзер префикс CGI-прокси anonymouse.org в базовом URL префикс зашит во все основные URL youtube_api/folder_cache (код)82
Зеркало сайта сохранённый domen с адресом по умолчанию; адрес из Location ответа; адрес от удалённого hdrezka_mirror.php без Location остаётся адрес по умолчанию Smart_* (код)83
Сменить домен поставщика настройкой домен по умолчанию — константа в коде (Filmix — https://filmix.ac, Rezka — https://rezka.ag, Rutracker — https://rutracker.org, Kinozal — http://kinozal.tv), переопределяется настройкой <cName>DomainName — Bazinga3 (код)84
Выбрать домены по региону у подсемейства endpoints.json (antifriz, cbilling, glanz) конструктор вызывает loadEndpointsConfig() и скачивает http://zlostnyi.tech/dune/<каталог>/endpoints.json, заполняя домены api и playlist для world, ru, kz; antifriz показывает combobox «Выбор региона» (по умолчанию world) при каждом создании плагина — сетевой запрос zlostnyi (код)85
Подставить ключ и номер устройства в шаблон плейлиста шаблон на сервере автора (dune/<каталог>/playlist…), в шаблонах встречаются замены -token-, -pass-, --dev-- (cookie dev, по умолчанию 1), -srv- (cookie country_server), -ott_key-; shara-club при nottoken или пустом ответе повторяет запрос к playlist_2 зависимость от сервера автора; у shara-club при ошибке — два запроса zlostnyi (код)86
Настроить прокси для CGI proxy_settings читает www/cgi-bin/proxy, разбирает http_proxy, затем безусловно перезаписывает логин/пароль строкой «Login:Password»; do_proxy_action перезаписывает http_proxy, proxy_search парсит free-proxy.cz и проверяет прокси запросом к shoutcast.com проверка зависит от внешнего сайта MegaRadio (код)87
Сменить адрес сервиса без пересборки читать URL сначала из /config/ktv_stats_url.txt, затем из /firmware/config/... — Polbox.tv (код)88
Анти-бот cookie взять toNumbers("...") со страницы, посчитать значение на dune-club.info/tts2, кэшировать в /tmp/zonaRCPC зависит от внешнего сервиса Smart_* (link_api) (код)89
Подпись ссылок YouTube запрос dune-club.info/echo?message=<s> (старые пакеты) или переименование sig= в signature= внешний сервис или устаревший формат youtube_api/folder_cache (код)90; Anidub.Com (код)91
Картинки через конвертер dune-club.info/.../gif2jpg.php?url=… внешний сервис 101.ru (код)92
Определить страну country_code_3 из $FS_PREFIX/tmp/location_info.properties, при пустом — https://ifconfig.co/json понимает только RU/UA/BY FREE TV (код)93

9.6. Локальная сеть: IP Control, сетевые папки, multicast

Вызов IP Control из CGI плагина и из Android-приложения — §15.5.

Плагины и внешние программы обращаются к HTTP-API самой приставки (/cgi-bin/do) и к файлам сетевого менеджера. Команды IP Control — guide/ip-control.md; здесь — как ими пользуются.

Задача Приём Грабли и ограничения Плагины и claims
Нажать кнопку пульта из плагина GET http://<ip>/cgi-bin/do?cmd=ir_code&ir_code=… (IP из ifconfig у Screenshoter, 127.0.0.1 у Dune BackUp) Screenshoter ответ игнорирует; у Dune BackUp на APK — порт 11080 Screenshoter (код)94; Dune BackUp (код)95
Читать состояние плеера снаружи cmd=status (с result_syntax=json или разбором name="…" value="…") Jellyfin Bridge: ответ ≤ 65 536 символов, тайм-ауты 2 с Jellyfin Bridge (код)96; watch-sync (код)97
Перемотать на позицию cmd=set_playback_state&position=<сек>&timeout=1; успех — command_status ok или timeout — Jellyfin Bridge (код)98
Выключить по таймеру строка cron с wget …/cgi-bin/do?cmd=standby сброс таймеров переписывает весь crontab служебные установщики hdtv (код)99
Смонтировать сохранённую сетевую папку найти готовое монтирование в network_mount_list.xml, иначе файл-команда mount в /tmp/run/ipc__network_manager и чтение результата ожидание: sleep(1) у altSource; у Dune BackUp — до 5 повторов с паузой 2 с Dune BackUp (код)100; altSource (код)101
Список сохранённых сетевых папок разбор network_folders.properties (type 0 — smb, 1 — nfs) — Dune BackUp (код)102; altSource (код)103; Torrent Center (код)104; remote-control (код)105
Обзор SMB без своей библиотеки proc_open прошивочного smbtree с LD_LIBRARY_PATH=/tango/firmware/lib нужен бинарник прошивки remote-control (код)106
Обойти проверку SMB-каталога test -d вместо is_dir для платформ 8672, 8673 и 8758; при is_smb — opendir/closedir — Torrent Center (код)107
Хранить пароли сетевых папок HD::eney: base64 со сдвигом по зашитому ключу ключ в коде — это обфускация altSource (код)108
Объявить себя Plex-клиентом UDP HELLO * HTTP/1.0 на 239.0.0.250:32413 — DunePlexCatalog (код)109
Выбрать интерфейс для UPnP wlan0, если скрипт Wi-Fi AP check успешен, иначе eth0 — DLNA Renderer (код)110
Отличить плееры в сети по сообщениям пользователей, надёжный признак — netbios name из etc/samba/smb.conf — watch-sync (форум r22)111

9.7. Свой HTTP-эндпойнт плагина: локальные запросы и обратный прокси

Когда в плагин шлёт данные другое приложение на той же приставке, CGI плагина работает как маленький сервер. Веб-часть и CGI в целом — §15.

Задача Приём Грабли и ограничения Плагины и claims
Принимать POST только с самой приставки список адресов REMOTE_ADDR (127.0.0.1, ::1, ::ffff:127.0.0.1 в разных записях), иначе 403 local_requests_only GET до проверки отдаёт сведения о плагине Lampa bridge (код)112
Ограничить вход тело ≤ 262144 байт; 1–250 элементов; позиция 0–604800 с; длины строк в байтах UTF-8; URL только http/https до 16384 байт; управляющие символы C0, кроме TAB/LF/CR, вырезаются — Lampa bridge (код)113
Ответ JSON без кэша, ошибки машиночитаемо Content-Type: application/json; charset=utf-8, Cache-Control: no-store; при исключении 400 и {error: …} — Lampa bridge (код)114
Handshake с клиентом GET отдаёт plugin, version, protocol версия протокола своя Lampa bridge (код)115
Обойти CORS веб-приложения CGI пересылает GET/POST на внешний API через curl с cookie-jar и ставит Access-Control-Allow-Origin: * TLS-проверка выключена; отладочный лог пишется в /D/ веб-плагины (код)116
Запускать плагин по IP-доступу без включения ТВ страница http://<ip>/cgi-bin/plugins/<name>/do; по сообщениям пользователей, через неё стримы SomaFM и Radiopotok.ru играют без включения ТВ — surface_* (форум)117

9.8. Сетевые URL-обёртки для плеера

Часть сетевой работы плагины перекладывают на плеер, заворачивая URL в префиксы. Что эти префиксы значат для воспроизведения — §7.

Задача Приём Грабли и ограничения Плагины и claims
RTMP/RTSP/HDS/FLV через локальный CGI http://ts://127.0.0.1:81/cgi-bin/<proto>.sh?…; прочий http:// → http://ts:// https-варианты не меняются; CGI-скрипты даёт кодекпак — install-скрипт EvolutionTV скачивает его и запускает httpd на порту 81 EvolutionTV (код)118; youtube_api/folder_cache (код)119
Multicast через UDP-прокси udp://@ → http://ts://<proxy_ip>:<proxy_port>/udp/ при use_proxy=yes нужен внешний UDP-прокси EvolutionTV (код)120
Прямой mp4 префикс http://mp4://; Online Movies (eng) добавляет через dune_params параметр http_mp4_allow_other_formats:1, а .m3u8 не трогает — youtube_api/folder_cache (код)119; Online Movies (eng) (код)121
Аудиопоток радио http://audio_stream:// + host + :8000 + path — 101.ru (код)122

10. Настройки, хранение и кэш

Объект: экраны настроек, хранение настроек и данных, кэш в PHP-плагинах Dune HD (Widget Ext 1.5.6, GlobalTV 260130_1351, Screenshoter 1.0.6, ProIPTV 9.1, семейства Smart_, surface_, zlostnyi, youtube_api/folder_cache и другие; code, отдельные факты — forum); платформа и прошивка исполнения в основном не установлены. Опора на платформу — SDK плагинов (doc, any-documented).

Платформа даёт плагину два механизма хранения. Первый — cookies: каждый метод DunePlugin получает &$plugin_cookies по ссылке (SDK)123, а результат операции несёт поле plugin_cookies (SDK)124. Второй — каталоги из DuneSystem::$properties: tmp_dir_path и data_dir_path (SDK)125. tmp_dir_path лежит под /tmp, и Dune GUI гарантирует его существование (SDK)126; data_dir_path для постоянных данных на устройствах без System Storage и Flash Memory Storage не задан (SDK)127. Плагины строят поверх этого три слоя: простые значения в cookies (§10.3), свои файлы в DATA (§10.4–10.6) и кэш во временном каталоге или в DATA (§10.8). Экран настроек — control-папка, см. guide/gui-screens.md §2.8; контролы и обработка ввода — guide/input-dialogs.md §2.4.

10.1. Экран настроек: AbstractControlsScreen, сохранение и reset_controls

Фабрики контролов и каркас AbstractControlsScreen — §4.4; поля и диалоги — §5.

Схема, повторяющаяся в плагинах ниже: control-папка, обработчик ввода пишет значение и возвращает новые контролы. Различаются плагины тем, как применяют изменение к уже открытым спискам.

Задача Приём Грабли и ограничения Плагины и claims
Построить экран настроек папка PLUGIN_FOLDER_VIEW_CONTROLS с initial_sel_ndx = -1; в каркасах — наследник AbstractControlsScreen с ID setup экран без контролов: у WeburgTV код контролов закомментирован, и do_get_control_defs возвращает null Widget Ext (код)128; Twitch TV (код)129; Screenshoter (код)130; zlostnyi (код)131; WeburgTV (код)132
Собрать экран из готовых разделов altSource: папка DATA (выгрузить, загрузить, очистить), оформление, поиск, тема, PIN, прокси Kinopoisk, логин myShows, кнопка исправления цветов для alt:Silver; Jurt: логин, информация, буферизация 0…15000 мс, показ на главном экране, «мягкая» перезагрузка; rmfon.pl: bg_path/mode_path из файлов DATA, версия из dune_plugin.xml, IP-адрес и show_tv; MegaRadio: путь DATA и закачки, use_osk, additional_settings, pin_dialog, QR, mode_path, difm_login; Setup Wallpaper: DATA-диалог, dload_path, use_wll, use_osk, abyss_api_key, pin_dialog — altSource (код)133; Юрта ТВ (код)134; surface_* (код)135; MegaRadio (код)136; Smart Apps (код)137
Сделать отдельный диалог настроек show_dialog шириной 1100 с close_by_return = false; RETURN переназначен на close_dialog с флагом close_config_dialog_kbrd_q21, закрытие вызывает screen_render_after_config RETURN не закрывает диалог сам; после закрытия настройки перезагружаются и вызывается change_keyboard(0) Widget Ext (AdvKeyboard) (код)138
Вынести второстепенные настройки в отдельный экран additional_settings: timer_osd 1–29 с, use_osd 0–3, video_quality 360/480/720/1080, плюс переход в proxy_settings — MegaRadio (код)139
Дать выбрать качество видео MoviesTape: комбобокс video_quality закомментирован, обработчик всё равно сохраняет значение; Filmix_API: 360/480/720/1080, при HD::get_dash_platform_kind()==true ещё 1440p и 2160p; Vimeo: 360/480/720/1080 — Smart_* (код)140
Применить набор настроек списка apply_sections декодирует checked_idset/initial_checked_idset, обновляет и записывает sections_on_off; CFG_TS/EPF и reread_all_epfs(true) — только при результате записи 1 при результате записи ≠ 1 обновление EPF не выполняется GlobalTV (код)141
Сохранить изменение и перерисовать экран handle_user_input по action_type (confirm/apply) и control_id пишет значение в cookie и возвращает reset_controls с заново собранными defs Widget Ext возвращает reset_controls после каждого ввода; pirates_* — при любом action_type, в том числе не confirm; Twitch TV сохраняет только по apply на кнопке btnSave Widget Ext (код)142; Anidub.Com (код)143; pirates_* (код)144; 101.ru (код)145; Twitch TV (код)146
Применить настройку к открытому списку после записи cookie вернуть invalidate_folders нужных папок (и затем reset_controls) plugtv: Трофей HD при смене epg_server инвалидирует tv_channel_list, «Новый Мир» — нет, только сохраняет altIPTV (код)147; 101.ru (код)145; AceStreamSearch (код)148; rain_* (код)149; plugtv (код)150
Ввести ключ доступа с проверкой кнопка открывает диалог с text_field; обработчик сохраняет cookie, проверяет плейлист, перезагружает каналы и возвращает close_dialog_and_run(invalidate_folders(…, reset_controls)) при ответе nottoken или пустом — сообщение «Неправильный ключ доступа» zlostnyi (код)151
Разбить большую форму страницы: page_num 1–4 и reset_controls; или взаимоисключающие разделы: при выборе одного остальные сбрасываются в no — altIPTV (код)152; EvolutionTV (код)153
Показывать поля по условию поле строится, только если выбран режим: m3u_dir при m3u_type=2, proxy_ip/proxy_port при use_proxy=yes; набор полей по поставщику погоды — EvolutionTV (код)153; Kaban.tv (код)154; AceStreamSearch (код)155; Widget Ext (код)156
Вводить значение в удобных единицах в UI секунды, при сохранении *= 1000 (buffering_ms); epg_shift подписан в часах, хранится как $i*3600 секунд — AceStreamSearch (код)157; pirates_* (код)158

Грабли switch: в «Новом Мире» (plugtv) у case 'buf_time' нет break, и после сохранения буферизации открывается диалог перезагрузки (код)159.

10.2. Что ещё кладут на экран настроек: версия, «что нового», QR, лог, перезагрузка, пароль

Задача Приём Грабли и ограничения Плагины и claims
Показать версию плагина HD::ver() или разбор dune_plugin.xml из install_dir_path, версия — в подписи или метке это версия плагина, а не прошивки Screenshoter (код)160; surface_* (код)161; 101.ru (код)162; FREE TV (код)163
Показать «что нового» кнопка whats_new загружает http://dune-club.info/plugins/update/<plugin_name>/info.txt и показывает текст в диалоге; DI.FM — по B_GREEN на списке групп, текст в multiline-label и диалоге %tr%t5 URL собран из имени плагина; HD::http_get_document отключает проверку SSL Screenshoter (код)164; 101.ru (DI.FM) (код)165
Показать адрес веб-интерфейса и QR-код адрес — по IP из ifconfig (первый не 127.0.0.1) и HD_HTTP_LOCAL_PORT; QR скачивается с api.qrserver.com в tmp_dir_path/img.jpeg и показывается тегом <icon> в диалоге; MegaRadio строит QR через api.qrserver.com по http://<IP-плеера>/cgi-bin/plugins/MegaRadio/do внешний сервис QR; на не-Android вместо адреса — надпись «Plugin for Dune Android» Screenshoter (код)166; surface_* (код)167; MegaRadio (код)168
Показать лог и статус фоновых задач диалог с логом из tmp/run/*.log; статус cron — по наличию update_weather.sh/meminfo.sh в выводе bin/crontask.sh статус — по строке в cron, а не по живому процессу Widget Ext (код)169
Кнопки обслуживания кнопки запускают shell-скрипты (bin/meminfo.sh x, bin/update_weather.sh, bin/clean_old_fix.sh) — Widget Ext (код)170
«Мягкая» перезагрузка плеера кнопка выполняет shell_exec('killall shell') — AllTV (код)171; Юрта ТВ (код)172; кнопка restart — Anidub.Com (код)173, youtube_api/folder_cache (код)174
Закрыть настройки паролем при непустом PARAM_SETTINGS_PASSWORD перед экранами настроек — диалог с полем pass; неверный → err_bad_pass — ProIPTV (код)175
Сменить PIN старый PIN должен совпасть с cookie pin (по умолчанию 0000), новый вводится в отдельное поле; MegaRadio меняет pin, только когда pin1 и pin2 непусты и pin1 совпадает с текущим — liteIPTV (код)176; Smart_* (код)177; MegaRadio (код)178
Настройки на стороне сервиса экран показывает данные подписки из account, а изменения отправляет запросом settings_set.php код закрытых каналов (pcode) уходит в URL Moi-Dom.tv (код)179
Применить настройки, присланные сервером ActionFactory::change_settings($settings_to_apply, false, false, $post_action): stats_on, timeshift, buffering, bitrate, stream_server, server_address, login, password; upgrade_url пишется в /config/fw_online_upgrade_url.txt через временный файл и rename применяется только при непустом ответе; пустой URL удаляет файл и /tmp/fw_online_upgrade_last_autocheck_time, только если отличается от прежнего Polbox.tv (код)180

10.3. Простые настройки в plugin_cookies

Cookies — первый способ хранить настройки: SDK передаёт их в каждый метод (SDK)123 и прямо предлагает как постоянное хранилище для избранного ТВ (SDK)181.

Задача Приём Грабли и ограничения Плагины и claims
Хранить параметры с умолчаниями значение из cookie, а при его отсутствии — умолчание из кода (AceSearchConfig::item(), check_cookies) значения нормализуют: ext_torrserver без порта дополняется :8090 AceStreamSearch (код)182; RemTor (код)183; Online Movies (TV Series) (код)184; AllTV (код)185; liteIPTV (код)186; youtube_api/folder_cache (код)187; Anidub.Com (код)188
Отличать «не настроено» умолчание-маркер: token = '0' → вместо плейлиста группа-заглушка «Ключ доступа не найден!» — zlostnyi (код)189
Хранить список id через запятую (favorite_channels, favorite_categories, exclude_channels) FREE TV при загрузке удаляет из списков id, которых нет в плейлисте, а без cookie записывает 19 стартовых каналов GlobalTV (код)190; FREE TV (код)191
Накапливать значения новое значение дописывается к cookie через разделитель *** — Novosib-iptv (код)192
Спрятать значок плагина из главного меню show_cookie_name = main_icon и show_by_default = yes в манифесте + combobox, пишущий yes/no в main_icon; SDK допускает и lang(…) влияет на точку входа в root://applications; вторая точка в setup://applications без show_cookie_name остаётся; surface_* объявляет show_application, но этот cookie никто не пишет SDK (SDK)193; Screenshoter (код, SDK)194; служебные установщики hdtv (код)195; surface_* (код)196
Прочитать cookies вне PHP shell-скрипт разбирает /config/twitch_tv_plugin_cookies.properties строками ключ значение пустой auth_token даёт SHIC_PASS="oauth:" и проходит проверку Twitch TV (код)197
Задать показ на главном экране Jurt: show_in_main_screen=auto/yes/no; при auto пишется show_tv=lang(russian), иначе — выбранное значение — Юрта ТВ (код)198

Мёртвые cookies — частая находка: Anidub.Com пишет три cookie, которые нигде не читает (код)199, а Peers.TV и pirates_* читают show_vod, для которого нет контрола (код)200. Kohana-канал объявляет Cookie::init со ссылкой на $plugin_cookies, но get/set не вызывает и собственных настроек не читает (код)201.

10.4. Свои файлы в DATA: serialize, properties, INI, SQLite, XML

Когда настроек много или это массивы (избранное, история, токены), плагины пишут свои файлы в data_dir_path. Повторяющийся приём — хелперы HD::get_items/save_items, которые плагин несёт в своём lib/utils.php (код)202.

Задача Приём Грабли и ограничения Плагины и claims
Хранить массивы HD::get_items/save_items: PHP serialize/unserialize в файл под DATA; строки — get_item/save_item (пустая строка, если файла нет); Bazinga3: HD::saveItemsArr/getItemsArr — serialize-файлы в HD::get_data_path(), saveItemStr/getItemStr — строки отдельными файлами у Bazinga3 при macAdr=true к имени добавляется MAC без двоеточий Smart_* (код)203; служебные установщики hdtv (код)204; Widget Ext (код)205, языки и цвета AdvKeyboard (код)206; altIPTV (код)207; Torrent Center (код)208; YouTube (Smart_*) (код)209; MegaAnime (код)210; youtube_api/folder_cache (код)211; Bazinga3 (код)212; MegaRadio (repl_arr, строка DELETE очищает список) (код)213
Временные массивы get_items_tmp/save_items_tmp — те же файлы под tmp_dir_path; Bazinga3: saveItemTmpStr/saveItemsTmpArr пишут в DuneSystem tmp_dir_path — Smart_* (код)214; служебные установщики hdtv (код)204; MegaTorrents (код)215; Bazinga3 (код)216
Удалить файл и его кэш после подтверждения — shell_exec("rm -rf \"<path>\""); для video_file и папок дополнительно удаляются items/<series_id\|basename>.jpg и .json — altSource (код)217
Несколько плееров на одной DATA к имени файла добавляется MAC без двоеточий (macAdr) MAC берётся командой ifconfig eth0; youtube_api/folder_cache пишет избранное с MAC, а main_menu:fav читает legacy cookie — рассинхронизация Torrent Center (код)218; Widget Ext (код)219; MegaAnime (код)210; MegaTorrents (код)220; youtube_api/folder_cache (код)211
Свой файл «ключ = значение» settings.properties в data_dir_path, читается один раз при init(), при изменении перезаписывается целиком; INI plugin_settings_<name> через parse_ini_file запись Widget Ext — полная перезапись файла; load_settings возвращает false, если нет файла или ключа Widget Ext (код)221; служебные установщики hdtv (код)222
База настроек с типами SQLite: глобальное — common.db, по плейлисту — <playlist_id>.db (settings, cookies); в settings хранится gettype значения, при чтении — settype по типу умолчания для старых SQLite: page_size до первой страницы, cache_size до 3.7.10 в страницах, mmap_size с 3.7.17 ProIPTV (код)223
Конфиг редактора списков /config/lcfg_<config_id>.txt: до строки --- — +id/-id, после — порядок; нет файла → пустой конфиг — GlobalTV (код)224
Справочники в пакете список станций — локальный XML, категории — data/feed.xml: читаются из пакета, без сети; Kaban.tv грузит таблицы с удалённого DATA_PATH с запасным data/ в пакете (кроме файла 01), формат — gzip + XOR + unserialize — pirates_* (код)225; youtube_api/folder_cache (код)226; Kaban.tv (код)227
Править конфиг стороннего пакета str_replace строки в файле (START_TRANSMISSION=…, пути в settings.json/core.conf), пишется config.json с перезапуском сервера при переустановке LTU сначала задаёт умолчания, затем подгружает старый configure и пишет файл заново — значения пользователя сохраняются служебные установщики hdtv (код)228; Entware/Wallpaper (код)229; PeerflixServer (код)230
Слои конфигурации в каркасе файлы config из всех путей сливаются Arr::merge, более поздний (APPPATH) перекрывает модульные — Kohana-канал (код)231

Вне PHP: JS-плагин Lampa хранит сессию прогресса в localStorage под ключом dune_local_progress_v1, а вместо URL кладёт дайджест — по комментарию, URL и токены туда не попадают (код)232; при восстановлении отбрасываются сессии старше 12 часов и неверные элементы (код)233.

10.5. Где лежат данные: data_dir_path, перенос DATA, накопители и системные файлы

Штатный каталог — data_dir_path (SDK)125; на части устройств его нет (SDK)127. Плагины ниже дают пользователю перенести DATA на накопитель или в сетевую папку и читают системные файлы прошивки.

Задача Приём Грабли и ограничения Плагины и claims
Найти каталог данных вне PHP первый существующий из /persistfs/plugins_data/<name>, /flashdata/plugins_data/<name>, иначе /config/plugins_data/<name> — Online Movies (eng) (код)234
Перенести DATA в другое место в data_dir_path кладётся файл-дескриптор data_dir_path с выбранным путём; get_data_path() при его наличии берёт путь через smbtree::get_folder_info и кэширует; сброс — удалить дескриптор; Bazinga3 берёт путь так же: DuneSystem data_dir_path, а при наличии одноимённого файла — через smbtree::get_folder_info('data_dir_path') Smart_*: эталонный get_data_path значение не возвращает, а в YouTube — возвращает; TorrServe вызывает SmartConfig::get_data_path, которого в классе нет Torrent Center (код)235; Widget Ext (код)236; MegaTorrents (код)237; altSource (код)238; Smart_* (код)239; YouTube (Smart_*) (код)240; TorrServe (код)241; Bazinga3 (код)242
Выбрать хранилище из списка каталог плагина, /D, SMB или свой путь; несуществующий выбор → каталог плагина; для SMB — mount -t cifs с логином и паролем из cookies — altIPTV (код)243
Выбрать папку или файл экран file_list с save_data/save_file и фильтром extension; импорт конфига проверяет первую секцию на поле type rclone: файл без type даёт ошибку импорта; по сообщению пользователя, такая ошибка встречалась, и автор ответил примером секций с type DunePlexServer (код)244; surface_* (код)245; liteIPTV (код)246; Torrent Center (код)247; rclone (код, форум)248
Подключить сохранённые сетевые папки smbtree монтирует отсутствующие в df ресурсы: mount -t cifs в фоне, mount -t nfs с сохранённым протоколом surface_* хранит SMB-логины и пароли в сериализованных файлах DATA и передаёт их в mount -o username=…,password=…; для платформ 8672/8673/8758 liteIPTV проверяет SMB-каталог через test -d Smart_* (код)249; surface_* (код)250; liteIPTV (код)251
Сменить каталог кэша к выбранному каталогу добавляется /<plugin_name> (кроме data_dir_path), старый удаляется rm -rf — rclone (код)252
Сохранить файл пользователя на накопитель внешний /tmp/mnt/D (если есть /system/dunehd/init) или /D, затем внутренняя /sdcard; нужно больше 15000 байт свободно — Screenshoter (код)253
Общие данные нескольких плагинов search_items вычисляется в родительском каталоге data_dir_path: из пути убирается имя плагина имя файла добавляется без слэша Smart_* (код)254
Читать настройки прошивки /config/settings.properties («ключ = значение»): interface_language, widget_country, show_builtin_memory_item; country_code_2 — из /tmp/location_info.properties, иначе /config/…; tv_4k — из /tmp/run/tv_4k.txt — GlobalTV (код)255; Screenshoter (код)256; Online Movies (TV Series) (код)257
Писать настройки прошивки power_on_action в /config/settings.properties через INI::write INI::write выводит все секции и ключи заново, с сортировкой ksort remote-control (код)258
Хранить EPF во флеш-памяти GlobalTV: /flashdata/plugins_epfs/<имя плагина>, временные — в /tmp/plugins/<имя плагина>/epfs; id section_fav для избранного, section_<section_id> для остальных разделов — GlobalTV (код)259
Свои иконки библиотек иконки берутся из /D/dpc_custom_icons (только .png), выбранная копируется в /persistfs/plugins_data/<каталог плагина>/lib_icons/cust_icon_<lib>.png и в icons/ пакета; в диалоге Icons экрана Design доступны plex_standard, plex_composite и custom_icon, если иконка уже сохранена — DunePlexCatalog (код)260
Сохранить .torrent в папку закачки save_torrent: при пустой или несуществующей dload_dir_path открывается выбор папки dload_path, иначе get_torrent(series_id, <папка>/<имя>.torrent) и диалог «<имя> сохранен!» — MegaAnime (код)261
Загрузить ключ API с накопителя ищется /D/apikey.txt, затем первый /tmp/mnt/storage/*/apikey.txt; UTF-8 BOM в начале отбрасывается и значение обрезается trim берётся первый найденный файл Widget Ext (код)262
Понять метку времени истории просмотра по сообщениям пользователей, watch-sync на Solo 8K и Pro 8K Plus (Android-прошивка r22): timestamp — 16 цифр, unix-время в микросекундах; совпадает с mtime файла timestamp — watch-sync (форум r22)263
Прочитать отметки watched_*.txt по сообщениям пользователей, watch-sync на Solo 8K и Pro 8K Plus (Android-прошивка r22): строки «процентuid»; имя файла различается на плеерах файл почти не используется: у Pro одна строка 104 B, у Solo пустой watch-sync (форум r22)264

История просмотра Android-прошивки, по сообщениям пользователей, хранится только в приватном каталоге /data/data/com.dunehd.app/ (позиции — в config/watch_history/) (форум r22)265; внешний сервис watch-sync работает с ней через adb (код)266.

10.6. Выгрузка, загрузка и очистка DATA, восстановление

Бэкап как отдельная функция плагина (архивы настроек и системы) — §13.10.

Задача Приём Грабли и ограничения Плагины и claims
Выгрузить и загрузить DATA рекурсивное копирование HD::pCopyFolders (RecursiveDirectoryIterator + copy) между data_dir_path и выбранной папкой (altSource, liteIPTV — <папка>/<plugin_name>); MegaRadio: экспорт data_dir_path, импорт папки или файла и очистка DATA — Torrent Center (код)267; altSource (код)268; liteIPTV (код)269; MegaAnime (код)270; MegaRadio (код)271
То же в фоне cp -rf в фоне, у surface_* — через shell_exec(… > /dev/null &) — Smart_* (код)272; surface_* (код)273; altIPTV (код)274
Выгрузить и загрузить свои скрипты и иконки пункты «Выгрузить скрипты»/«Загрузить скрипты» копируют .sh и .png между plugins_data и выбранной папкой (при выгрузке — папка накопителя); при загрузке — chmod -R 777 и возврат !update_list! — Dune BackUp (код)275
Выгрузить на накопитель с проверками копирование data_dir_path в /D/YTV_data и обратно; без /D — сообщение подключить накопитель, нет /D/YTV_data — каталог создаётся при выгрузке, при загрузке — сообщение — youtube_api/folder_cache (код)276
Очистить DATA rm -rf <data_dir_path> и mkdir заново altSource при очистке сохраняет дескриптор data_dir_path liteIPTV (код)277; MegaAnime (код)270; surface_* (код)245; altSource (код)268
Вернуть стандартные данные удалить свой каталог данных и скопировать data из install_dir_path в фоне — altIPTV (код)278
Пережить порчу файла сравнить число элементов с копией .bak: больше — обновить .bak; текущий пуст, а .bak не пуст — диалог «восстановить» — MegaAnime (код)279
Перенести настройки старой версии install.sh/update.sh переносят старые файлы настроек в каталог данных миграция в комментарии описана для 1.0.0 и 1.0.1 Widget Ext (код)280
Очистить историю combobox clear_history: при confirm со значением yes история очищается и показывается диалог history_cleared — AceStreamSearch (код)281
Назвать папку и файл бэкапа Dune BackUp: папка <накопитель>/dune_bcp/bcp_ГГГГ_ММ_ДД (при файле settings/BackUp-separate-minute — с -ЧЧ.ММ), в конец имени — ID/модель с пробелами → _; файл <тип>-<число_элементов>_(<ID или модель>)_ГГГГ.ММ.ДД-ЧЧ.ММ_<флаг>.dbcp флаг присваивается последовательно s → S → A → N, каждое следующее перекрывает предыдущее: S при /persistfs/plugins, A при interface_language_synchronized, N при apk_interface_language_changed; при ключе A флаг A даже с /persistfs/plugins, при обоих ключах — N Dune BackUp (код)282
Переключить режим сохранения пункт «Выбор режима сохранения Бэкапов в папки» вызывает script save.sh change и возвращает !return_start! для перезапуска пункта режим — наличие файла BackUp-separate-minute Dune BackUp (код)283
Проверить, что бэкапить перед каждым бэкапом save.sh проверяет накопитель, непустоту списка и наличие каждого элемента; при пустом списке, отсутствии накопителя или элемента пишет ошибку в .sms и завершается; отдельно предупреждает о встроенной памяти Android и неверной дате раньше 2026-08-01 бэкап не блокируется, только предупреждает о дате и носителе Dune BackUp (код)284
Составить разделы бэкапа отдельные списки: «Моя коллекция» (config/movie_index_config.xml, fb_cache, movie_index, dunemdb_cache, image_cache, custom_mdb, my_collection.properties, lcfg_mc_categories.txt, mc/mdb/search_timestamp, mdb_image_state.json), «Сетевые папки» (network_folders.properties, lcfg_sources.txt), «Плагины» (flashdata/plugins*, D/dune_plugins, cookies, lcfg_*), «Избранное, Последнее» (main_screen_items, watch_history, lcfg_favorites.txt), «Настройки Dune Shell» (settings.properties, скины, сервисы, lcfg_*.txt и др.) epg_cache плагина proiptv исключается; без type в network_folders.properties базовый список очищается, но lcfg_sources.txt добавляется после; без movie_index_config.xml с id= список «Моей коллекции» очищается Dune BackUp (код)285
Обновить файлы перед записью удалить из папки всё, чьё имя начинается с того же типа (find ... -name "<тип>-*" -exec rm); при сохранении скачать свежий dune_plugin_Dune_backup.zip с dune-club.info (если файла нет в tmp и пинг домена успешен) и при изменении md5 скопировать архив в dune_bcp zip качается только при успешном пинге домена Dune BackUp (код)286
Восстановить из файла upload.sh: если передан каталог — искать ровно один файл <тип>-* (ноль или несколько — ошибка); если файл — тип из имени; число элементов — из имени после <тип>-, непустое целое, ноль отвергается — Dune BackUp (код)287
Нормализовать восстановленные данные для «Моей коллекции» и «Настроек» при флаге платформы не 1: пересобрать lcfg_mc_categories.txt (оставить folder: только с id из movie_index_config.xml, остальные строки сохранить), обновить mc_timestamp; для Bazinga3 заменить старый MAC в именах plugins_data/Bazinga3 на текущий из tmp/plugins/Dune_backup/mac_addr; for_php-cgi.sh заменить php-cgi в восстановленных плагинах (кроме test_php-cgi и каталогов с 86/87) на копию из test_php-cgi; for_common.setting.sh заменить в plugins_data файлах common.settings с ключом channels_list_path путь /persistfs/plugins или /flashdata/plugins на фактический с FS_PREFIX php-cgi меняется, только если размер, md5 или ссылка отличаются; нестандартный каталог DATA Bazinga3 — предупреждение Dune BackUp (код)288
Восстановить «сырые» файлы из корня накопителя пункт ищет в корне My_collection*, Network_folders*, Plugins*, Favorites+Recent*, Settings*, One_plugin_{*}*, при необходимости переименовывает _ после типа в дефис и вызывает upload.sh с маркером; маркеры в .sms: !OFF_ON! для «Моей коллекции» и «Настроек», !reboot! для остальных файлы должны лежать в корне Dune BackUp (код)289

10.7. Атомарная запись и файлы, общие с другими процессами

Файл, который читает другой процесс (оболочка, CGI, демон), пишут через временный файл и переименование — так читатель не увидит половину содержимого.

Задача Приём Грабли и ограничения Плагины и claims
Атомарно записать файл <path>.tmp + rename; вариант _if_changed сравнивает содержимое и не пишет без изменений при ошибке rename временный файл удаляется GlobalTV (код)290
Обмен с фоновым процессом через файлы результат — в res.json.part, затем переименование в res.json; командный файл удаляется после чтения; при старте оба файла удаляются — Online Movies (eng) (код)291
Подменить данные системного виджета строка пишется в .tmp и переносится mv -f в $FS_PREFIX/tmp/weather.txt — тем же приёмом и в том же формате, что встроенный run_widget.sh — Widget Ext (код)292
Не конфликтовать с процессом прошивки тот же lock-файл $FS_PREFIX/tmp/run/widget.lock и захват через set -C, что у run_widget.sh — Widget Ext (код)293
Файл состояния для CGI и GUI каталог 0700, временный файл 0600, при необходимости chown на владельца bridge.php, затем rename; сессия старше 12 часов отвергается по словам автора в комментарии кода, HTTP CGI на некоторых прошивках работает от root, а GUI PHP — от владельца плагина; каталог по умолчанию — /tmp/lampa_dune_bridge Lampa bridge (код, форум)294

10.8. Кэш и состояние между вызовами

Кэш у плагинов трёх видов: файлы в DATA (переживают перезагрузку), файлы во временном каталоге и статические или глобальные переменные PHP-процесса.

Задача Приём Грабли и ограничения Плагины и claims
Обновлять серверный кэш сначала сравнить cache.timestamp; затем скачать cache2.zip, распаковать (system("unzip")) в main_cache.json, rename в active_cache.json, метку перенести последней; URL переопределяются файлами в /config старый кэш сохраняется только при неудаче загрузки или записи архива; перед unzip active_cache.json и tv_cache*.json удаляются, так что ошибка распаковки или rename — ошибка загрузки кэша GlobalTV (код)295
Отдать список каналов файлом PluginTvInfo::channels_file = путь к tv_cache_<section>.json в DATA; при смене родительского пароля tv_cache_xxx.json и tv_cache_all.json удаляются — GlobalTV (код)296
Работать при недоступном сервере ответ /config кэшируется в config_cache.json и грузится в фоновом потоке — Online Movies (eng) (код)297
Кэш с временем жизни плейлист — пара .m3u8 + .db, устаревает по mtime + часы из настройки (PHP_INT_MAX — вечно); HTTP-ответы — файл по md5(url [+ post]) на file_cache_time часов, с If-None-Match по ETag из etags.db — ProIPTV (код)298
Кэш метаданных и обложек JSON и постер по id элемента в DATA; обложки и описания — в /persistfs/plugins_data/<плагин>/…, размер — du -h, очистка — rm; Bazinga3: разобранные данные фильма — в <data>/pluginCache/md5(movie_id.class_name).srz (при posterCashe=1 для избранного), постер — <md5(mUrl)>.jpg altSource: id папки — только basename, id видео — md5(dirname + basename) altSource (код)299; DunePlexCatalog (код)300; Bazinga3 (код)301
Кэш ответа API в /tmp ответ пишется в файл, при наличии файла сеть не запрашивается; при смене ключа файл удаляется itv: один файл /tmp/itv_api_new кэширует два разных ответа — кто запишет первым, тот и останется zlostnyi (код)302
Очистить кэш кнопка удаляет файлы временного каталога FREE TV «Очистить кэш EPG» удаляет все файлы tmp_dir_path, а не только EPG FREE TV (код)303
Кэш в памяти процесса глобальная переменная: если задана, база берётся из неё, иначе шесть лент загружаются заново диск не используется Apple Trailers (код)304
Кэш разбора страниц serialize в файл под tmp_dir_path, запись или чтение по наличию константы async_icon_loading kinokrad берёт чужое имя кэш-файла cacheLinkApiUst и пишет при незаданной переменной Smart_* (link_api) (код)305
Сбросить кэш при входе в список get_folder_view очищает кэш фильмов и счётчик перед загрузкой — Smart_* (код)306
Передать данные между экранами JSON после разделителя \|\| в media_url (HD::encode_user_data/decode_user_data); выбранный элемент приходит в selected_media_url без разделителя user_data = null Widget Ext (код)307
Состояние между вызовами поставщика private — JSON (pub_by_id, files_by_ep_key), который оболочка возвращает в следующий вызов; id файла — JSON {pub_id, file_url} без private — пустой список со статусом done Online Movies (rus) (код)308
Состояние в объекте плагина поля объекта или static (кэш торрентов фильма, фильтр файлов, данные стрима для get_vod_info) Twitch TV заполняет поля только в get_folder_view, а читает в get_vod_info; фильтр altSource — статическое поле Online Movies (TV Series) (код)309; Twitch TV (код)310; altSource (код)311
Периодически обновлять справочник файл с датой загрузки; повторная загрузка, если файла нет или прошло больше 604800 с — liteIPTV (код)312
Дождаться фонового кэша MainHelper задаёт в tmp_dir_path пути main_cache.json и wake_flag, URL кэша — http://dunemdb.dune-hd.com/dunehdtv/cache.json; EpfsHandler::wait_if_needed сразу выходит, если интернета нет или файл кэша уже есть, иначе до 100 раз по 0,1 с ждёт файл, проверяя интернет каждые 5 итераций — Dune HD TV (код)313

Как кэш папок обновляется со стороны платформы (invalidate_folders) — guide/gui-screens.md §2.7.

13. Фоновые процессы, демоны и системные действия

Объект: плагины Cleanup, DLNA Renderer, DunePlexServer, MPD, TorrServe, PeerflixServer, Entware/Wallpaper, служебные установщики hdtv (LTU_install, Codec_install, ExtendRC_install, Platform_install, umount, mark.it, DuneArc), Dune BackUp, Widget Ext, Torrent Center, rclone, altIPTV, liteIPTV, ProIPTV, GlobalTV, YouTube (Smart_*), altSource, MegaAnime, MegaTorrents, remote-control, Apple Trailers, Jellyfin Bridge и другие (code, кое-где forum); платформа и прошивка исполнения у большинства не установлены, ветки «Android»/«APK» — как написано в коде плагина. Поведение платформы — SDK плагинов (doc) и tv188b r25 (device).

PHP-вызов плагина идёт как операция с тайм-аутом (см. guide/plugin-operations.md §2), поэтому всё долгое и всё, что должно жить без экрана, плагины выносят наружу: в shell-скрипты в фоне, демоны, cron и загрузочные скрипты. Точка входа для кода без пользователя — global_actions: SDK называет события boot, install, update и uninstall (SDK)314, boot_end — с прошивки 130917_b9 (SDK)315, gui_start — с 130914_b8 (SDK)316; для boot поддерживается только plugin_system (SDK)317. На tv188b r25 boot и boot_end при повторных стартах приложения не выполняются (устройство r25)318, gui_start — при каждом старте (устройство r25)319; plugin_system запускается как sh <абсолютный путь> (устройство r25)320 под uid 1000 с FS_PREFIX=/data/data/com.dunehd.app (устройство r25)321. Подробнее — guide/plugin-packaging.md §3 «Действия плагина при установке». Управление демоном по HTTP (service_api) — §15.2, IP Control из плагина — §15.5.

13.1. Запуск при загрузке, старте GUI и установке: global_actions и /config/boot

Самый короткий приём — plain-плагин без экранов, весь код которого — скрипты в global_actions.

Задача Приём Грабли и ограничения Плагины и claims
Поднять демон в конце загрузки без PHP global_actions/boot_end → plugin_system с run_string bin/<скрипт> & — Cleanup (код)322; DLNA Renderer (код)323; TorrServe (код)324
Плагин без экранов манифест type plain без entry_points; только global_actions boot_end/install/update/uninstall install и update перезапускают демон (restart &), uninstall (cleanup) — без &, то есть синхронно DLNA Renderer (код)325
Стартовать сервис при загрузке через свой CGI boot → bin/t.sh &, скрипт делает wget на …/cgi-bin/plugins/<плагин>/service_api?cmd=plex_start в фоне CGI стартует сервер, только если есть файл plexlibrary_location DunePlexServer (код)326
Сделать что-то при каждом старте GUI gui_start.sh Dune BackUp перед запуском демона проверяет ps w и pidof, а при наличии /system/dunehd/dunehd_service запускает через dunehd_service do Widget Ext (код)327; Dune BackUp (код)328
Пересоздать свои задания после загрузки и убрать при удалении boot.sh пересоздаёт cron по сохранённым настройкам; uninstall.sh удаляет свои строки cron и восстанавливает системный run_widget.sh boot.sh проверяет /flashdata/plugins_data без $FS_PREFIX, остальные скрипты — с ним Widget Ext (код)329
Поставить сторонний пакет при установке плагина install/update → plugin_system bin/<установщик>.sh &, uninstall → bin/<деинсталлятор>.sh & у Codec_install и Platform_install из global_actions объявлен только uninstall — установка идёт с экрана LTU_install (код)330; ExtendRC_install (код)331; Codec_install (код)332; Platform_install (код)333; mark.it (install и boot → bin/start.sh &) (код)334
Автозапуск в обход манифеста скопировать загрузочный скрипт или демон в /config/boot Platform_install пишет /config/boot/platform.sh, но сам симлинк сразу не создаёт — лог просит перезагрузку; remote-control патчит скопированный скрипт (pushd в каталог CGI) LTU (код)335; Codec_install (код)336; ExtendRC (код)337; Platform_install (код)338; remote-control (код)339
Включать загрузочное действие правкой своего манифеста boot с пустым run_string; при настройке плагин заменяет в dune_plugin.xml пустой run_string на bin/start.sh &amp; и просит перезагрузку подхватит ли оболочка правку — не проверено (§19) umount (код)340
Запустить плагин при включении плеера auto_start с entry_point_media_url, force_on_start=black_screen, force_on_finish=main_screen среди веб-плагинов так сделан только amediateka веб-плагины (код)341

13.2. Автозапуск, который пользователь включает в настройках

Общий приём — поставлять загрузочный скрипт с закомментированной строкой запуска и из экрана настроек снимать или ставить комментарий; состояние переключателя читается из того же файла.

Задача Приём Грабли и ограничения Плагины и claims
Переключатель «автозапуск» без переустановки комбобокс правит строку в своём загрузочном скрипте: #wget/wget в bin/t.sh, #mpd-start/mpd-start, #export+#forever в bin/boot_end.sh; TorrServe перезаписывает bin/boot.sh целиком (start-stop-daemon либо exit 0) по умолчанию выключено: у TorrServe boot.sh — только exit 0, у PeerflixServer строки закомментированы; по сообщениям пользователей, на Neo 4K автостарт PeerflixServer после перезагрузки не срабатывал DunePlexServer (код)342; MPD (код)343; TorrServe (код)344; PeerflixServer (код, форум)345
Несколько сервисов в одном загрузочном скрипте строки #transmission-start, deluge-start/S80deluged, автозапуск tor и S55portmap/S56unfsd в bin/boot_end.sh — Entware (код)346
Свой планировщик пунктов «после загрузки / раз в день / неделю / месяц / по воскресеньям» блоки #<start> в auto_start.sh, режим в .if, дата последнего запуска в .ld; демон demon_as.sh раз в 60 с проверяет разрешение и запускает разницу дней считает своя count_minutes, потому что DMC неправильно обрабатывает date -d Dune BackUp (код)347
Сменить интервал периодической задачи экран меняет интервал регуляркой прямо в bin/start.sh нужна перезагрузка mark.it (код)348
Не стартовать фоновую задачу без интернета test_internet.sh считает интернет доступным, только если системная дата не раньше 2026-08-01 и хотя бы один запрос wget --spider к google.com/httpbin.org или ping yandex.ru успешен без интернета автостарт ждёт Dune BackUp (код)349

13.3. Демон: один экземпляр, pid-файл, остановка

Задача Приём Грабли и ограничения Плагины и claims
Не запустить второй экземпляр проверить процесс по имени перед стартом: killall -0 <имя>, pgrep, ps \| grep, ps w и pidof проверка идёт по имени процесса, а не по pid-файлу DLNA Renderer (код)350; Apple Trailers (код)351; remote-control (код)352; Dune BackUp (код)328
Запустить и остановить внешний бинарник start-stop-daemon -Sbvmp с pid-файлом /tmp/<имя>.pid; остановка — pidof + kill; статус — pidof; у DLNA Renderer Start запускает bin/gmediarender демоном с логом /tmp/plugins/dlna_renderer/gmediarender.log и ограничением лога 10 000 метка online на экране TorrServe ставится по pidof, а не по ответу сервера TorrServe (код)353; DLNA Renderer (код)354
Перезапустить свой фоновый процесс перед стартом убить прежний процесс: по сохранённому pid (ProIPTV, altIPTV) или найденный через ps ax (DunePlexCatalog: kill -9, затем bash … &) — ProIPTV (Sleep_Timer) (код)355; altIPTV (pid_inf) (код)356; DunePlexCatalog (код)357
Погасить демон корректно killall -INT, ожидание до 30 с, затем killall -9 — DLNA Renderer (код)358
Демон без PHP бесконечный цикл со sleep 60 — Cleanup (код)359
Найти и убить процесс другого плагина pid из /tmp/run/<плагин>.pid; имя плагина — из nav_state.txt или из ярлыка main_screen_items/<ярлык>/dune_folder.txt; затем убить дочерние процессы и shell-процесс плагина по сообщениям пользователей, демон задуман освобождать память каждую минуту Cleanup (код, форум)360
Не убить плагин, в котором находится пользователь исключить pid работающего плагина (RUNNING_PLUGIN_PID) из списка shell-процессов работает, только если pid определён Cleanup (код)361
Не убить плагин после переключения дважды снять stat -c %Y nav_state.txt до и после сканирования и убивать, только если mtime не изменился сравнение по mtime, а не по содержимому Cleanup (код)362
Убить дочерние процессы плагина искать по общим pipe-дескрипторам в /proc/<pid>/fd и по PPID через pgrep -P, объединить, убрать дубликаты и убить каждый только SIGTERM Cleanup (код)363
Остановить скрипт вместе с дочерними bin/kill_process_and_child.sh по имени .sh: pid через ps w, затем процесс и рекурсивно его дети; в журнал — pid, имя и время, при необходимости сообщение в .sms — Dune BackUp (код)364
Остановить свой демон после выхода из плеера check_stop.sh раз в 5 с читает player_state из $FS_PREFIX/tmp/run/ext_command.state и при состоянии непустом и не file_playback выполняет killall receive5; pid — в $FS_PREFIX/tmp/run/dunehdtv_check_stop.pid опрос раз в 5 с Dune HD TV (код)365
Убить старые процессы при установке bin/killr.sh выполняет killall -9 для receive2…receive5; вызывают install.sh и uninstall.sh — Dune HD TV (код)366
Остановить конкурирующие торрент-серверы перед стартом своего HD::check_*_kill: найти процесс и вызвать stop-команду service_api чужого плагина на 127.0.0.1 — MegaTorrents (код)367; TorrServe (код)368
Обновить модуль ядра вместе с плагином сравнить файл VERSION в каталогах установки и данных; при различии rmmod, остановка сервера ключом -t; перед стартом lsmod \| grep загрузочный скрипт при ошибке удаляется из /config/boot remote-control (код)369

13.4. Долгая операция вне PHP-вызова и возврат результата в GUI

Схема у всех одна: PHP запускает процесс в фоне и сразу возвращает действие, процесс пишет результат или ход работы в файл, а экран читает файл по GUI-таймеру. Прогресс-диалог оболочки — guide/plugin-operations.md §4.

Задача Приём Грабли и ограничения Плагины и claims
Запустить скрипт и не ждать shell_exec("<путь> > /dev/null &") вызов в фоне, результат не ждут Widget Ext (код)370
Сетевой запрос отдельным PHP-процессом HD::asyncExec держит proc_open на php-cgi -f www/cgi-bin/run.php; run.php пишет ответ в exec_result_<action>; экран обновляется таймером 1000 мс файл результата — один на action, не на задание Torrent Center (код)371
Вынести тяжёлый разбор в отдельный php-cgi HD::asyncExec запускает вложенный <install>/www/cgi-bin/php-cgi -f classActions.php action=getIframe class_name=… params=<urlencode json>; JSON пишется в /tmp/plugins/<name>/exec_result_<action>; так же работают действия getMovieScreenInf, loadM3uVod, getNewFavItems и запросы списков торрентов в run.php HD::asyncExec держит один статический процесс и при смене команды закрывает предыдущий; файл результата — один на action Bazinga3 (код)372
Shell-команда с результатом команда пишет JSON в exec_log, PHP читает status/descr; на Android команда идёт через /system/dunehd/dunehd_service do, иначе system() rclone_kill.sh всегда завершается с кодом 1 — об успехе судят только по JSON rclone (код)373
Понять, что фоновый скрипт закончил скрипт удаляет свой лог в конце; экран, пока файл есть, раз в секунду перерисовывает диалог (timer 1000 → close_dialog_and_run) и не запускает скрипт повторно — Platform_install (код)374; DuneArc (код)375
Передать скрипту параметры запуска команда собирается из пути скрипта, накопителя (с папкой при #<fold>), пути .sms, значения #<choice> и ID/модели; аргумент накопителя — только при $1_ok, все части в одинарных кавычках — Dune BackUp (код)376
Показать ход и ошибку фонового скрипта при обычном запуске скрипт идёт в фоне (Config::do_cmd($cmd.' > /dev/null &')) и помечается work; в базовом режиме без #<mode_full> открывается light_show_run, иначе экран переходит на timer; скрипт пишет .log и .err рядом с .sms, экран показывает до 10 последних строк (с переворотом при #<LGrv> и сжатием процентов при #<LG%%>), меняет иконку кадрами timer_NN, а при непустом .err и неработающем скрипте показывает error в базовом режиме или error/error2 в полном лог только 10 строк; при первом появлении ошибки в базовом режиме текст %tr%error_info дописывается в .sms Dune BackUp (код)377
Проверить условия до запуска скрипта каждое условие #<test> выполняется через shell; при ложном условии показывается заголовок скрипта и #<test.txt> (или стандартный текст), скрипт не запускается; в #<warning> и #<mesg> условие отделяется \?, в #<warning> подставляются $^1 (накопитель с папкой), $^3 (выбранное значение) и $^4 (ID/модель), в #<mesg> — $^4; в условиях и тексте через test_condition дополнительно доступны $^0 (путь скрипта) и $^2 (путь .sms) условие — произвольный exec; показывается только текст после \? при истинном условии Dune BackUp (код)378
Обновлять свои скрипты по URL при директиве #<update> плагин скачивает новый текст скрипта в tmp/load_script.sh, сравнивает md5_file с текущим и при различии копирует на место и перечитывает список; my_wget читает URL по очереди и пишет первый успешный результат, удаляя прежний файл скрипт копируется поверх текущего Dune BackUp (код)379
Длинная операция через свой CGI wget к своему do в фоне, затем диалог с timer(1000), который по GUI_EVENT_TIMER через close_dialog_and_run открывает себя заново — altIPTV (код)380
Тяжёлая индексация отдельным PHP JSON-конфиг в tmp, отдельный процесс <php> bin/index_epg.php <config> через shell_exec с логом; блокировка is_index_locked — ProIPTV (код)381
Скачать и распаковать силами оболочки действие wget с target_path и target_cmd (cd … && unzip … && rm -f …); результат приходит в user_input по ключам <prefix>status/text/url; цепочка запускается таймером topmenu_timer — GlobalTV (код)382
Очередь действий между срабатываниями таймера файл settings/post_action, по JSON-действию в строке; на каждом timer снимается и выполняется первое — Dune BackUp (код)383
Обновлять папку, пока идёт фон Action_Factory::timer(1000) в списках каналов и групп — ProIPTV (код)384
Скачать видео в фоне exec youtube_download.sh или iptv_record.sh (из bin/ плагина или /codecpack/script/), PATH и LD_LIBRARY_PATH на ffmpeg_install/bin — YouTube (код)385
Конвертировать видео в фоне по профилям пункт «Конвертирование медиа-файлов через ffmpeg» ищет в выбранной папке mp4, mkv, avi, mov, 3gp, m2ts, vob и mp3, предлагает профили по битрейту 360k/576k/1080k/2048k, CRF 18/23, замену аудио, удаление субтитров и обрезку; результат — в folder_out/<выбранный профиль>/<имя папки> рядом с исходной — Dune BackUp (код)386

13.5. Периодические задачи: cron и свой цикл

Задача Приём Грабли и ограничения Плагины и claims
Ставить cron переносимо crontask.sh: на Android — перезаписать $FS_PREFIX/tmp/cron/crontabs/root и перезапустить crond; при HD_APK=1 вместо crond — свой bin/crond.sh; вне Android — crontab -u root; без аргументов печатает расписание, -строка удаляет, +строка добавляет «-» удаляет все совпадающие строки; почему на APK свой цикл — §19 Widget Ext (код)387
Перевести интервал в расписание mkcron_fix.sh отображает минуты в cron-строку (по умолчанию 10 * * * *) вариант «1 min» включается только файлом /config/weather_ext_debug Widget Ext (код)388
Cron на Android-прошивке записать /tmp/cron/crontabs/root и перезапустить crond через dunehd_service do — Torrent Center (код)389
Периодически дёргать свой CGI дописать в /tmp/cron/crontabs/root */1 * * * * wget … /cgi-bin/plugins/<плагин>/do и выполнить crontab -e только при наличии /persistfs mark.it (код)348
Обойтись без cron свой демон с циклом раз в 60 с — Dune BackUp (код)390; Cleanup (код)359
Раз в сутки дёрнуть внешний счётчик www_counter: если дата в settings/last_act_data отличается и test_date.sh прошёл, ставится post_action run_every_day и запрашивается HD::http_get_document по URL из <check_update>/www_counter/url_all.txt (для русского) или url_mod.txt сам запрос не выполняется для каталога /storage/emulated/0/DuneHD/flashdata и версии с дефисом Dune BackUp (код)391

13.6. Таймер сна, перезагрузка, выключение и перезапуск оболочки

Задача Приём Грабли и ограничения Плагины и claims
Таймер сна через IP Control cron-строка с wget на локальный /cgi-bin/do?cmd=standby liteIPTV помечает строку #sleep <unix_time>, сам чистит просроченные и предупреждает, если осталось меньше 120 с; MegaRadio удаляет прежние #sleep, пишет crontab с chmod 0575 и выполняет crontab -e, а его таймер при sleep_warn = false (интервал 5000 мс или timer_osd) удаляет истёкшую строку и предупреждает при остатке меньше 120 с altIPTV (код)392; liteIPTV (код)393; Smart_* (код)394; MegaRadio (код)395
Таймер сна через ИК-код cron-строка echo A15EBF00 > /proc/ir/button с меткой #sleep вариант altSource «после текущей серии» выключает в playback_stop, если таймер не отложен Torrent Center (код)396; altSource (код)397
Таймер сна своим процессом bin/sleep_timer.sh в фоне с pid- и log-файлами; оставшееся время — в OSD — ProIPTV (код)355
Перезагрузить плеер shell_exec('reboot') из пункта меню или настроек MegaTorrents и YouTube возвращают вывод shell_exec как результат обработчика; plugtv предлагает в диалоге быструю (killall shell) и полную перезагрузку; у PeerflixServer popup do_hard_reset тоже выполняет reboot altSource (код)398; MegaAnime (код)399; MegaTorrents (код)400; rclone (код)401; YouTube (код)402; altIPTV (код)403; plugtv (код)404; umount (код)405; Platform_install (код)406; Bazinga3 (код)407; PeerflixServer (код)408
Перезапустить оболочку shell_exec('killall shell') killall shell убивает все процессы с именем shell, включая оболочки плагинов youtube_api/folder_cache (14 из 15 пакетов) (код)409; altIPTV (код)403; plugtv (код)404; umount (код)405; MPD (код)410
Перезапустить оболочку безопасно ActionFactorySafe::stb_shell_reboot(): если определён RESTART_ACTION_ID, вернуть действие с reboot=false, иначе попробовать change_settings(null, false, true) и лишь затем выполнить exec('killall shell') если RESTART_ACTION_ID не определён, fallback убивает shell FREE TV (код)411
Мягкий и полный рестарт на разных платформах меню: быстрый перезапуск — при before_r11 bin/restart.sh shell, иначе ActionFactory::change_settings с restart_gui; вне APK ещё полная перезагрузка (bin/restart.sh reboot → change_settings с reboot) и выключение (bin/restart.sh off) на APK полная перезагрузка и выключение недоступны — показывается перезапуск DMC (do_hard_reset_dune) Dune BackUp (код)412
Пункт «Выключить плеер» shell_exec('echo A15EBF00 > /proc/ir/button') что именно делает запись кода — не проверено (§19); IP Control-вариант — §15.5 MegaTorrents (код)413; MegaAnime (код)399; rclone (код)414; YouTube (код)415; altSource (код)398; Bazinga3 (код)407; PeerflixServer (код)408
Послать ИК-коды после действия запись EA15BF00 и E916BF00 в /proc/ir/button после zoom_apply значение кодов в базе не описано altIPTV (код)416

13.7. Запись ТВ по расписанию

Задача Приём Грабли и ограничения Плагины и claims
Записать канал внешний /codecpack/script/iptv_record.sh с протоколом, URL, именем и путём; имя фоновой записи — в background_rec_stop нужен Codec_install: liteIPTV при входе предлагает его поставить altIPTV (код)417; liteIPTV (код)418
Запланировать старт и стоп блок в /tmp/cron/crontabs/root (старт iptv_record.sh, запись имени, скрипт остановки) и crontab -e — altIPTV (код)419; liteIPTV (код)420

13.8. Система: накопители, монтирование, swap, FUSE, профиль, часовой пояс

Сюда попали приёмы, которые меняют систему плеера; почти все требуют root и /persistfs. На tv188b r25 встроенный PHP в shell_exec добавляет $FS_PREFIX к словам /tmp/…, /firmware/…, /config/…, /flashdata/… и к путям в одинарных кавычках, но не в двойных (устройство r25)421.

Задача Приём Грабли и ограничения Плагины и claims
Выбрать, куда ставить /persistfs, если он ровно один в /proc/mounts; иначе /flashdata, если /D не смонтирован и /flashdata существует; иначе /D — Codec_install (код)422
Требовать системный накопитель mountpoint -q /persistfs или file_exists('/persistfs/'); экран показывает состояние «нет накопителя / не установлено / нужна перезагрузка / готово» — LTU (код)423; ExtendRC (код)424; Platform_install (код)406
Выбрать сборку под CPU grep по /proc/cpuinfo (MIPS 74K, ARMv7) LTU пишет в лог одно и то же имя архива в обеих ветках LTU (код)425; Codec_install (код)426
Добавить подкачку файл 256 МБ в /persistfs, mkswap/swapon, хук /config/boot/swap_mount.sh (TorrServe ещё ставит vm.swappiness=10); выключение — swapoff и удаление обоих файлов только при /persistfs; у DunePlexServer экран вызывает bin/swap.sh, которого в пакете нет TorrServe (код)427; Entware (код)428; DunePlexServer (код)429
Подготовить FUSE и смонтировать облако modprobe fuse, иначе mknod /dev/fuse c 10 229; rclone mount --daemon … --ca-cert /firmware/certs/ca-bundle.crt; через 3 с фоновый rclone rc vfs/refresh если /etc/ssl/certs/ca-bundle.crt нет, скрипт rclone удаляет /etc/ssl/certs и делает ln -s /firmware/certs /etc/ssl rclone (код)430; Dune BackUp (код)431
Смонтировать сетевые папки пользователя прочитать /config/network_folders.properties и выполнить mount -t cifs -o username=…,password=… или mount -t nfs в /tmp/mnt/smb/<n>//tmp/mnt/network/<n> логин и пароль идут в командной строке mount DuneArc (код)432; umount (SMB в /D) (код)405
Попросить систему смонтировать сетевую папку Ipc::write_request публикует <cmd_name>.<pid>-<cmd_id>.cmd в /tmp/run/ipc__<server_id> через временный файл и rename; Ipc::network_mount передаёт сетевому менеджеру тип, сервер, каталог, имя пользователя, пароль и proto командой mount — Torrent Center (код)433
Найти SMB-шары прошивочный smbtree через proc_open с LD_LIBRARY_PATH, имена — nmblookup путь к бинарнику зависит от прошивки (/tango/firmware/bin, /tango3/firmware/bin, /firmware_ext/smbcommon/bin) DuneArc (код)434; altSource (код)435
Найти NFS-копию файла без настройки путей /tmp/run/network_mount_list.xml: mount с type=nfs и status=mounted; файл ищется по имени и размеру, URL — nfs-tcp:///nfs-udp:///nfs://server:export:путь нет файла или ошибка разбора — пустой список; одноимённый файл другого размера не считается совпадением; по README, при неудаче играется HTTP-URL Jellyfin, а NFS нужен, чтобы плеер видел соседние субтитры Jellyfin Bridge (код, форум)436
Показать накопители и место /tmp/run/storage_list.xml (только status=mounted, без /persistfs) или свой список каталогов; размер — disk_total_space/disk_free_space Dune BackUp ограничивает сканирование 30 с altSource (код)437; Dune BackUp (код)438
Безопасно извлечь накопитель список из df, затем umount <dev> && eject <dev> по справке плагина, SD-карта снова монтируется при возврате в меню umount (код, форум)439
Свой хук на выключение заменить ::shutdown в /etc/inittab на свой скрипт и kill -HUP 1 ExtendRC делает это, только если /sbin/onshutdown.sh (от LTU) нет LTU (код)440; ExtendRC (код)441
Окружение для консоли дописать подключение своего profile в /etc/profile, симлинки /ltu, /codecpack, /platform — LTU (код)440; Codec_install (код)336; Platform_install (код)338
Сетевой твик ядра 16384 87380 87380 в /proc/sys/net/ipv4/tcp_rmem при USE_FIX_TCP_RMEM обоснование — только комментарий автора («prevent kernel crash») LTU (код)442
Часовой пояс в PHP date_default_timezone_set("UTC"), смещение — из date +%z Peers.TV зашивает Etc/GMT+7 и сдвиг −7 ч в EPG GlobalTV (код)443; Peers.TV (код)444

13.9. Внешние бинарники и сервисы: установка и управление

Задача Приём Грабли и ограничения Плагины и claims
Поставить сервер, которого нет в пакете установщик качает архив или ELF (часто с dune-club.info), распаковывает в bin/, ставит права, пишет лог у DunePlexServer и MPD — только при /persistfs; у MPD в пакете нет самого mpd — только установщик; DunePlexServer удаляет лог в конце DunePlexServer (код)445; MPD (код)446; TorrServe (код)447
Запустить TorrServer, которого нет в пакете torrserve.php: на Android при наличии /data/data/ru.yourok.torrserve/files/torrserver и пустом pidof torrserver запускает его с -k -d /sdcard/Android/data/ru.yourok.torrserve/files; вне Android, если файла нет, при найденном в /tmp/run/installed_plugins.xml TorrServe вызывает http://127.0.0.1:<port>/cgi-bin/plugins/TorrServe/service_api?cmd=torrserve_start pidof torrserver == false трактуется как «TorrServer is running» — проверка инвертирована; если TorrServe не найден или файла нет на Android, возвращается status=false Bazinga3 (код)448
Показать версию и бэкенды внешнего бинарника пункт «Изменения» выполняет bin/rclone version --config <data_dir>/config, скачивает info.txt с dune-club.info и отдельной кнопкой выводит rclone help backends info.txt скачивается с dune-club.info rclone (код)449
Сделать миниатюру видео do.php mark.it при thumb_file=1 для файла, просмотренного больше чем на 5% и без готовой миниатюры, вызывает /codecpack/script/thumb.sh "<файл>" "<каталог>/.<имя>.jpg" 350 <процент> зависит от Codec_install: при включении опции экран требует /codecpack/version.txt с v ≥ 24, иначе предлагает обновить или установить mark.it (код)450
Обёртки управления в системе создать /usr/bin/mpd-start/mpd-stop/mpd-restart над своим mpd.rc — MPD (код)451
Управлять сервисами Entware экраны запуска/остановки по pidof, правка конфигов (/opt/etc/deluge/auth, /opt/etc/exports), OpenVPN --daemon --writepid с выбором *.conf/*.ovpn и .pass внешний IP OpenVPN-экран берёт со стороннего сайта; по сообщению автора, после установки Entware-ng включается telnet Entware (код, форум)452
Запустить локальный Transmission rc.transmission start/stop из LTU (/ltu/etc/init.d) или OPT (/opt/etc/init.d) через exec тип определяется по наличию файлов LTU/OPT RemTor (код)453
Telnet, root и монтирования на Android busybox telnetd через dunehd_service do и /config/telnetd; копирование .dsf; mount копий flashdata/config/tmp поверх …/emulated/0/DuneHD/<имя> — Dune BackUp (код)454
CLI-обёртка сервиса для ручного управления tscli.php status/start/stop/list_torrents/… start ждёт до 10 с, stop — до 3 с Online Movies (TV Series) (код)455

13.10. Бэкап и восстановление данных

Выгрузка, загрузка и очистка каталога DATA — §10.6.

Задача Приём Грабли и ограничения Плагины и claims
Бэкап своих настроек zip всех .db из каталога данных плюс lcfg_proiptv_epg_*.txt из /config; полный вариант — с кэшем картинок — ProIPTV (код)456
Восстановить с откатом проверить имя архива, распаковать во временный каталог, текущие .db → .prev, скопировать, при неудаче вернуть .prev; затем init_plugin(true) и ACTION_RELOAD принимается только имя proiptv_backup_<версия>_<дата>_<время>.zip ProIPTV (код)457
Архив данных плеера tar -z -v -c -p -f по списку путей; прогресс — find считает элементы, tar -v + awk; проверка tar -t, при ошибке файл удаляется — Dune BackUp (код)458
Восстановление на другой платформе сравнить флаги платформы в settings.properties и отказаться при различии; после распаковки чужого бэкапа или на Android — chown -R по каталогу и chmod -R 777 длинный список исключений (свой плагин, кэши, данные чужой платформы) Dune BackUp (код)459
Восстановить один плагин из общего архива tar -ztf → список плагинов → tar -x только путей выбранного, его plugins_data и cookies — Dune BackUp (код)460

15. Веб-интерфейс, CGI и внешние приложения

Объект: CGI и веб-страницы плагинов Screenshoter, remote-control, Torrent Center, 101.ru, MegaRadio, surface_, liteIPTV, ProIPTV, FREE TV, Smart_ (link_api), youtube_api/folder_cache, YouTube, TorrServe, MPD, служебных установщиков hdtv, веб-плагинов; запуск плагинов и Android-приложений в Online services/Megogo/Okko (dunemdb), MegaTorrents, MegaAnime, RemTor, Lampa bridge (dune-voice), Jellyfin Bridge; внешний инструмент watch-sync (code, кое-где forum). Платформа и прошивка исполнения у плагинов не установлены; поведение платформы — SDK (doc), код tv188b r24 и наблюдения на tv188b r25 (device).

Встроенный HTTP-сервер отдаёт www/* плагина по http://<STB>/plugins/<plugin_name>/* и исполняет www/cgi-bin/* по http://<STB>/cgi-bin/plugins/<plugin_name>/* (SDK)461, причём не только локально, но и из локальной сети (SDK)462. CGI-скрипт запускается run_plugin_cgi как shell-скрипт, поэтому PHP-обработчик плагин вызывает сам (код r24)463. На tv188b r25 CGI получает PLUGIN_NAME, PLUGIN_CGI_DIR и SCRIPT_FILENAME (устройство r25)464, текущий каталог — PLUGIN_CGI_DIR (устройство r25)465 и работает под root (устройство r25)466. Подробнее — guide/plugin-packaging.md §1 «Веб-часть плагина»; IP Control — guide/ip-control.md. Фоновые демоны, которыми управляют эти CGI, — §13.

15.1. Свой PHP в CGI: обёртка do, php-cgi, php.ini и DuneSystem

Многие разобранные плагины с веб-частью несут однотипную shell-обёртку www/cgi-bin/do (у части — с шапкой «Andrii Kopyniak» (код)467): она восстанавливает окружение плагина и запускает свой php-cgi на do.php.

Задача Приём Грабли и ограничения Плагины и claims
Восстановить окружение плагина в CGI имя плагина — третий с конца компонент $PWD, каталог установки — путь без www/cgi-bin; задаются PLUGIN_TMP_DIR_PATH, PLUGIN_WWW_URL и PLUGIN_CGI_URL (последние два — на 127.0.0.1, у Screenshoter и Bazinga3 — с $HD_HTTP_LOCAL_PORT); PLUGIN_DATA_DIR_PATH — /persistfs/plugins_data/<имя>, иначе …/flashdata/plugins_data/<имя>, иначе пусто; Bazinga3 дополнительно выводит PLUGIN_NAME и PLUGIN_INSTALL_DIR_PATH из PWD и дописывает в LD_LIBRARY_PATH ./lib, /usr/lib и /tango3/firmware_ext/flashlite/lib одни обёртки учитывают $FS_PREFIX и HD_HTTP_LOCAL_PORT (Screenshoter, Radiorecord.ru), другие зашивают /tmp/plugins и http://127.0.0.1 (remote-control, rmfon.pl) Screenshoter (код)468; remote-control (код)469; Torrent Center (код)470; 101.ru (код)471; youtube_api/folder_cache (код)472; Smart_* (код)473; surface_* (код)474; MegaRadio (код)475; altIPTV (код)476; TorrServe (код)477; LTU_install (код)478; Bazinga3 (код)479
Запустить свой php-cgi подменить SCRIPT_FILENAME на do.php (у index — дописать .php), при необходимости дополнить LD_LIBRARY_PATH, выполнить ./php-cgi; Bazinga3 держит по копии обёртки на каждый CGI-скрипт (do, classActions, doHeader, hlsProxy, torrserve), копии отличаются только именем .php в подмене Screenshoter пишет stderr в cgi_err.log с ротацией после 10000 байт; у Bazinga3 обёртка копируется на каждый скрипт Screenshoter (код)480; remote-control (код)481; Torrent Center (код)482; Smart_* (код)483; mark.it (код)484; Bazinga3 (код)485
То же на Android-прошивке FS_PREFIX по умолчанию /data/data/com.dunehd.app, LD_LIBRARY_PATH с firmware/lib, SCRIPT_FILENAME из PLUGIN_CGI_DIR, REDIRECT_STATUS=200, php-cgi с cgi.force_redirect=0 по комментариям автора, run_plugin_cgi вызывает файл через sh и на Android 11, а php-cgi предпочитает SCRIPT_FILENAME опции -f Lampa bridge (код, форум)486
Нести php-cgi в пакете свой ELF www/cgi-bin/php-cgi; у части пакетов две сборки — основная и .platform.87xx/www/cgi-bin/php-cgi в строках php-cgi Screenshoter есть libphp5.so; использует ли он системную библиотеку — §19 Screenshoter (код)487; Smart_* (код)488; MegaAnime (код)489; mark.it (код)490
Запустить PHP-скрипт поставщика cd <bin> и $FS_PREFIX/firmware_ext/php/php-cgi -c <bin> -f ./run.php; свой bin/php.ini php-cgi из .platform.87xx пакета — CGI-сборка PHP 5, загружающая libphp5.so Online Movies (TV Series) (код)491
Настроить PHP для CGI свой www/cgi-bin/php.ini: cgi.force_redirect = 0, max_execution_time = 0, error_reporting = 0, date.timezone = UTC (набор у пакетов немного различается) ошибки PHP не выводятся; время CGI-скриптов пакета — UTC Screenshoter (код)492; 101.ru (код)493; surface_* (код)494; MegaAnime (код)495; altIPTV (код)496; mark.it (код)484; Bazinga3 (код)497
Получить свойства плагина в CGI фреймворк плагина в CGI не подключается: do_config.php сам объявляет DuneSystem и заполняет DuneSystem::$properties из PLUGIN_* в $_ENV список переменных поддерживается вручную в обёртке и в do_config.php Screenshoter (код)498; Torrent Center (код)499; altIPTV (код)500; youtube_api/folder_cache (код)501
Использовать код плагина вне оболочки файл поставщика при отсутствии класса DuneSystem (например, из CGI) сам объявляет hd_print и DuneSystem и заполняет properties из __DIR__ (plugins/<name>/lib) и /persistfs или /flashdata — Bazinga3 (код)502

У встроенного shell_ext на tv188b r25 (android-dune-fw, 261021_0117_r25) свой www/cgi-bin/php.ini: 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 (код r25)503.

15.2. API плагина по HTTP: service_api, JSON и XML

Задача Приём Грабли и ограничения Плагины и claims
Взять данные из своего CGI в PHP-экране HD::http_get_document(plugin_cgi_url . 'service_api?cmd=…') и json_decode TorrServe после torrserve_start ждёт 5 с и показывает лог LTU_install (код)504; TorrServe (код)368
Управлять сервисом соседнего плеера запрос к http://<ip>/cgi-bin/plugins/LTU_install/service_api?cmd=transmission_start — RemTor (код)505
Отдавать файлы shell-CGI #!/bin/sh, FS_PREFIX, PATH_INFO; channels отдаёт файл или 404, epg ждёт до 120 × 0,1 с появления JSON, delay — иконку с Content-Length у channels дублирован заголовок Content-Type; epg ждёт файл, а не строит его ProIPTV (код)506
Отдать M3U по HTTP Content-type: audio/x-mpegurl и cat <data>/playlists${PATH_INFO} PATH_INFO не нормализуется (§19) remote-control (код)507
XML-API в стиле IP Control do.php отвечает text/xml с корнем command_result и protocol_version = 5, switch по cmd, пары <param name value> в успешном ответе player_state — имя команды, а не состояние плеера remote-control (код)508
JSON-API для своей веб-страницы do.php берёт action из GET или POST, отвечает application/json, без action — status=error del_el удаляет файл по пути из POST без проверки Screenshoter (код)509
Принять действия и загрузки с веб-страницы link.php по POST action; file пишет загруженный файл do_img.php передаёт img прямо в file_get_contents, file пишет по пути из имени поля формы; save_cutname и vsetvIDupd ответа не возвращают liteIPTV (код)510
Ответ PHP-помощника статус — return строк JSON, ответ service_api — echo при ложном pidof возвращается status=true Torrent Center (код)511

15.3. Прокси картинок и потоков через свой CGI

Задача Приём Грабли и ограничения Плагины и claims
Отдать постер через локальный URL в элементе — plugin_cgi_url . 'do?img=<url>'; do.php скачивает URL и отдаёт с Content-Type: image/jpeg тип фиксирован; у youtube_api/folder_cache и YouTube при GIF89a4 или ошибке запасная картинка дописывается после уже выведенного ответа; у Radiorecord.ru запасного файла в пакете нет Torrent Center (код)512; Smart_* (код)513; youtube_api/folder_cache (код)514; YouTube (код)515; surface_* (код)516
Грузить постер через прокси плагина при включённом прокси в элементе — <plugin_cgi_url>do?img=<url>&proxy=<cName>; do.php читает proxySettings (proxy, proxyType=SOCKS5 → CURLOPT_PROXYTYPE 7, proxyAccount), для относительного img при заданных cName и DomainName дополняет домен настройкой <cName>DomainName или переданным DomainName, при GIF89a4, ответе 40x или false отдаёт rPath либо icons/poster_none.png, иначе при savePath сохраняет картинку в файл при прокси относительный URL дополняется доменом Bazinga3 (код)517
Прокси на shell без php-cgi img.sh: curl --include $QUERY_STRING; curl выбирается по platform_kind из /tmp/run/versions.txt из сборок в bin/, иначе прошивочный Filmix_API направляет постеры через img.sh только при DUNE_FIRMWARE_BN < 11 FREE TV (код)518; Smart_* (Filmix_API) (код)519
Переписать HLS-плейлист на себя space.sh переписывает ссылки в .m3u8 на http://127.0.0.1:$HD_HTTP_LOCAL_PORT$SCRIPT_NAME?… запросы идут с User-Agent WINK и сторонним Origin FREE TV (код)520
Проксировать HLS своим CGI hlsProxy.php?path=<url>: cURL с Content-Type: application/vnd.apple.mpegurl, если в URL есть m3u8, иначе video/mpegts; опции — из сериализованного <tmp_dir_path>/hlsProxyArgs (['rp'] при rp и наличии ключа, иначе ['opts']); при rp строки плейлиста переписываются на <plugin_cgi_url>/hlsProxy?path=… вне hlsProxy.php в PHP-коде пакета нет ни ссылок на hlsProxy, ни записи hlsProxyArgs; кто их создаёт — §19 Bazinga3 (код)521
Отдать m3u8 с нужными заголовками do3.php/doHeader.php: cURL с Referer и User-Agent, ответ application/vnd.apple.mpegurl; резолвер возвращает <plugin_cgi_url>doHeaderBazon?path=…; у Bazinga3 doHeader.php проксирует path как m3u8 с зашитым Referer https://farsihd.pw и User-Agent Opera/9.80 прокси FilmHD1080.Net включается только для URL с vkuservideo.net; у Bazinga3 один зашитый Referer Smart_* (код)522; link_api (код)523; Bazinga3 (код)524
RTMP/RTSP/FLV через Codec_install поток через CGI codecpack на 127.0.0.1:81; при необходимости запустить httpd -h /codecpack/WWW -p 81 нужен установленный /codecpack; парсер KinoProfi без /codecpack и не на Android сразу возвращает false altIPTV (код)525; link_api (код)526

15.4. Веб-страница плагина в www/

Задача Приём Грабли и ограничения Плагины и claims
Страница с кнопками, вызывающими свой CGI index.php с кнопками; index.js зовёт do относительным URL; во время записи статус опрашивается раз в секунду — Screenshoter (код)527
Взять готовое веб-приложение для страницы do.php использует AudioAddict: application.css, remote.js, application.js, объект this.AudioAddict.API.Config, вызов di.app.start({}), событие start:module ChannelBrowserApp и контейнеры секций Favorites, User Radio, Radio Channels и Personal radio — 101.ru (код)528
Галерея файлов по HTTP симлинки <storage>/screenshots → www/dss, <imem>/screenshots → www/sdss; ссылки через PLUGIN_WWW_URL с IP устройства вместо 127.0.0.1 работа сервера по симлинкам — §19 Screenshoter (код)529
Запустить радио из браузера без ТВ список станций со ссылками javascript:playCode(…); link.php разрешает поток и вызывает http://127.0.0.1/cgi-bin/do?cmd=start_file_playback&media_url=… (MegaRadio — start_playlist_playback с M3U в /tmp/www; Radiopotok.ru вызывает start_file_playback прямо из JS) по сообщениям пользователей, так радио 101.ru запускается без включения ТВ 101.ru (код, форум)530; surface_* (код)531; MegaRadio (код)532
Веб-пульт keyCode() → http://<ip>/cgi-bin/do?cmd=ir_code&ir_code=<код>; IP устройства — из ifconfig коды зашиты в HTML; 101.ru и MegaRadio при открытии страницы шлют A05FBF00 101.ru (код)533; MegaRadio (код)534; surface_* (код)535
Добавить станцию с веб-формы POST send проверяет path/name и наличие http, добавляет станцию в начало плейлиста — MegaRadio (код)536
Переиспользовать веб-среду другого плагина побайтно одинаковые do, do_config.php, php.ini, переводы; отличаются do.php и remote.js — surface_* (код)537
Импорт файла пользователя и чтение cookies на странице первый user_radio.m3u по mount_path из /tmp/run/storage_list.xml; избранное — regex по /config/<plugin_name>_plugin_cookies.properties читается только первый найденный файл 101.ru (код)538
Админка плейлистов и архивов index.php (режимы full/sorted), playlists.php, arhive.php (URL, 1–20 дней, User-Agent) см. пути из запроса в §15.2 liteIPTV (код)539
Локальное веб-приложение как плагин страница на 127.0.0.1/plugins/<name>/ (index.html, у bonus-tv — ping.html), файлы — в www/; параметры background_color, input_handler — веб-плагины (код)540
Плагин-ярлык на внешний сайт ровно одна entry_point, её key_enter — launch_media_url с URL в actions/key_enter/data/url; у 12 php-плагинов main.php — 6 байт (только <?php), у plain-манифестов нет params/program точка входа целиком задана манифестом; 12 из 18 плагинов ведут на внешний сайт, 4 — на 127.0.0.1/plugins/<имя>/, 2 — на swf://plugin_file:// веб-плагины (код)541
Включить полноэкранный ТВ-режим веб-приложения для www:// документ перечисляет fullscreen, webapp_keys, zoom_level, overscan, user_agent, background_color, osd_size и рекомендует для полноэкранных ТВ-приложений fullscreen=1, webapp_keys=1, zoom_level=100, overscan=0, а для тёмных — background_color=black; fullscreen=1 — страница на весь экран, webapp_keys=1 — JS обрабатывает все клавиши (при 0 часть клавиш, например STOP, обрабатывает браузер), zoom_level=100 — без масштабирования, overscan=0 — без обрезки документ рекомендует эти значения для полноэкранных ТВ-приложений; user_agent переопределяет UA браузера, background_color по умолчанию white, osd_size задаёт разрешение отрисовки веб-плагины (SDK)542
Нестандартные параметры web-URL zoomby — единственный манифест с webapp_keys=2 и input_handler=1; impulstv запускает внешний URL с input_handler=0 и osd_size=1280x720, без exit_key, power_key и volume_handler; libduneshell.so r24 разбирает также input_handler, engine_flags, navigation_highlight, exit_key, power_key, auto_auth_cancel, volume_handler и hbbtv документ эти параметры не описывает веб-плагины (код)543
HTML/Flash-плагин без PHP type=plain, без program; main.php не нужен для чистых FlashLite/HTML-плагинов веб-плагины (код, SDK)544
Отдать сгенерированный файл плееру перезаписать www/<файл>.m3u, sync, вернуть plugin_file:///www/<файл>.m3u CGI у плагина нет DunePlexCatalog (код)545
Показать веб-интерфейс стороннего демона экран показывает адрес http://<ip>:<порт> (TorrServe 8090, peerflix-server 9000, Transmission 9091, Deluge 888, rclone 5572); rclone ждёт адрес до 120 опросов и строит QR через api.qrserver.com логин rclone по умолчанию admin/admin; по сообщениям пользователей, Dropbox через WEB GUI rclone не добавлялся, место на флеше выросло с 2 до 25 МБ, config после остановки пропадал TorrServe (код)546; PeerflixServer (код, форум)547; Entware (код)548; rclone (код, форум)549
Подменить CGI прошивки (Flash) install_cgi.sh: killall httpd, собрать /tmp/cgi-bin, смонтировать его поверх /firmware/ext_command/cgi-bin, запустить httpd заново требует bin/native.cgi и bin/curl.867x; меняет общий httpd прошивки веб-плагины (код)550
Плагин без веб-части и настроек в пакете нет www/, cgi-bin/, файлов настроек и кода их сохранения веб-интерфейса и собственных настроек нет Apple Trailers (код)551

15.5. IP Control из CGI плагина и из внешнего приложения

Другие обращения к сети приставки (сетевые папки, multicast) — §9.6.

IP Control — локальный /cgi-bin/do прошивки (guide/ip-control.md). На r25 его команды ждут конца идущей операции плагина (устройство r25)552.

Задача Приём Грабли и ограничения Плагины и claims
Запустить воспроизведение на плеере из своего CGI file_get_contents('http://127.0.0.1/cgi-bin/do?cmd=start_file_playback&media_url=…') — 101.ru (код)553; surface_* (код)554; MPD (поток http://127.0.0.1:8000) (код)555
Перезагрузить плеер снаружи cmd=ir_code с A15EBF00 раз в секунду до player_state=standby, затем A05FBF00 до выхода из standby вызов helper exec_do в rc_extension.bash закомментирован remote-control (код)556
Управлять курсором с телефона dune_rc_extension_mipsel слушает --port (по умолчанию 7777) и пишет x y buttons wheel в /sys/devices/platform/vms/coordinates; vmdriver_864x.ko, vmdriver_8671.ko и vmdriver_8674.ko — «Virtual mouse driver» Dune HD; rc_extension.bash по uname -r выбирает чип 864x/8671/8674/86??, снимает старый модуль rmmod, загружает новый insmod и перезапускает сервер нужен модуль ядра под конкретный чип remote-control (код)557
Найти IP Control из Android-приложения кэшированный порт, иначе перебор 80 и 11080; Proxy.NO_PROXY; принять ответ при HTTP 200, protocol_version и command_status=ok — Lampa bridge (dune-voice) (код)558
Следить за позицией плеера из JS cmd=status&result_syntax=json на 127.0.0.1 и 127.0.0.1:11080; ответ Dune — строки product_id/player_state, непустой product_name, protocol_version ≥ 5; опрос ~1 с, wake() на focus/pageshow/visibilitychange сессия ожидания истекает через 180 с, любая — через 12 часов Lampa bridge (код)559
Разбудить плеер перед командой при !power.isInteractive() — WakeActivity с FLAG_ACTIVITY_NEW_TASK и ожидание до 5 с standby не отправляется, если устройство уже в режиме ожидания Lampa bridge (dune-voice) (код)560
Управлять плеером и оболочкой home → cmd=main_screen, standby → cmd=standby; при player_state *_playback — playback_action&action=stop или set_playback_state&speed=0/256; вне воспроизведения — медиа-клавиши через AudioManager — Lampa bridge (dune-voice) (код)561

Таймер сна через cmd=standby — §13.6.

15.6. Запуск, установка и удаление других плагинов и встроенных приложений

Задача Приём Грабли и ограничения Плагины и claims
Открыть другой плагин или предложить установить проверить имя в /tmp/run/installed_plugins.xml; есть — plugin_launcher://<имя>, нет — plugin_installer://<url>:::name=…&space_needed=…&need_confirm_replace=0 — LTU_install (код)562; Entware (код)563
Открыть своё приложение из настроек кнопка go2app в AceSearchSetupScreen (ветка elseif action_type=apply) отправляет LAUNCH_MEDIA_URL_ACTION_ID с LaunchMediaUrlActionData::url = plugin_launcher://acestreamsearch ветка apply идёт после confirm AceStreamSearch (код)564
Поставить зависимость и сразу её открыть launch_media_url с plugin_installer://… и post_action plugin_launcher://<имя> на Android YouTube ставит другой пакет (ffmpeg_install) и вместо запуска делает reset_controls YouTube (код)565; liteIPTV (код)566
Поставить вспомогательный плагин из своего www/ записать файл install (version_index, space_needed, download_url) и запустить plugin_installer://<plugin_www_url>install:::schema=1&name=… — Dune BackUp (код)567
Ставить плагины и APK из внешнего списка коллекции Dune BackUp загружают список с dl.dropboxusercontent.com или dune-club.info через my_wget, затем устанавливают выбранное маркерами !install_plugin! или !install_apk! (или скачивают файл через curl), а для плагинов и APK возвращают !return_start!; «Коллекция файлов» качает выбранный URL прошивочным curl с прогрессом из tmp/log_curl установка управляется маркерами из внешнего списка Dune BackUp (код)568
Удалить плагин launch_media_url('plugin_uninstaller://<имя>') GlobalTV делает это только для страны CN GlobalTV (код)569; altSource (код)398
Передать задание другому плагину JSON {url, plugin} в /tmp/run/remtor.in, затем plugin_launcher://{name=rem_tor}; приёмник при входе видит файл, отвечает в remtor.out и возвращает plugin_launcher://<plugin>; отправитель принимает ответ только со своим plugin по сообщению автора, так RemTor принимает magnet от сторонних плагинов RemTor (код, форум)570
Настроить или переустановить чужой плагин из своего меню пункт меняет ext/TorrServer.php плагина dunemdb_supplier_online_movies (torrServAction 1/0), bin/rec.sh Screenshoter (1280x720/1920x1080), content_box_y темы иконок (400↔630; при установке 630 обнуляет cycle_mode_gap_width/cycle_mode_gap_icon_path), пишет выбранное зеркало Jackett в config/online_movies_jacket.txt (или удаляет файл для default), а также удаляет dunemdb_supplier_online_movies маркером !uninstall_plugin! и ставит выбранный архив mod_85.tar.gz/86.tgz маркером !install_plugin! правки файлов чужих плагинов; пункты возвращают !reboot!, переустановка online_movies — !OFF_ON! Dune BackUp (код)571
Запустить действие плагина из чужого плеера одноэлементный www/launch.m3u с plugin_launcher://{name=…}{action_id=play} по комментарию автора, выбор плеера Android не принимает схему plugin_launcher, поэтому нужен M3U; на r25 plugin_launcher в M3U передаёт from в user_input (guide/ip-control.md §2) Lampa bridge (код, форум)572; r25 (устройство r25)573
Открыть папку во встроенном файловом браузере embedded_app://{name=file_browser}{url=…}; /tmp/mnt/storage → storage_name://, SMB → smb://[user:password@]host, NFS → nfs-tcp:///nfs-udp:// — surface_* (код)574; YouTube (код)575

Поставщики dunemdb отвечают оболочке командой запуска приложения; оболочка запускает её через launch_ext_app, а error.missing_app превращает в установку приложения (код r24)576. На tv188b r25 строку am start … разбирает само приложение оболочки, без запуска am или sh (устройство r25)577. Протокол поставщика целиком — guide/movie-suppliers.md §4 и §8.

Задача Приём Грабли и ограничения Плагины и claims
Принять команду оболочки run.php: ровно один аргумент, JSON из stdin, JSON в stdout; поддержан только start_playback_app другое число аргументов — Usage и код 1; невалидный JSON и неизвестная команда — error Online services (код)578; Megogo (код)579; Okko (код)580
Ответить командой запуска {bin: "am start …", package, wait_app_start_delay: 10, title, indirect, urls} Online services берёт только первую публикацию; у Okko в run.py ответ без title/indirect/urls Online services (код)581; Megogo (код)582; Okko (код)583
Предложить установить приложение проверить пакет по $FS_PREFIX/tmp/applications/app_data.json или /data/data/<пакет>; нет — error.missing_app с title, package, indirect: true, urls Megogo выбирает URL по пакету только в run.py Online services (код)584; Megogo (код)585; Okko (код)586
Достать пакет из deeplink package=([^;]*), иначе часть component= до /, иначе таблица «сервис/домен → пакет»; замена com.netflix.ninja на com.netflix.mediaclient по HD_FW_APK/HD_APK компонент без / или с / в начале пакета не даёт Online services (код)587
Собрать am start по умолчанию am start '<deeplink>'; не intent:…#Intent — для http при пустом FS_PREFIX am start -d, при известном пакете -p '<package>'; либо явная форма -a VIEW -d megogo://video/<id> <пакет> или intent://…#Intent;scheme=…;package=…;end у Megogo в run.py три пакета, для net.megogo.box — своя activity и GLOBALSEARCH; Okko делит id публикации по :; в run.php Okko закомментирован старый вариант am start -d 'yotaplay://movie?…', рабочей остаётся intent-форма Online services (код)588; Megogo (код)589; Okko (код)590
Найти и запустить activity установленного приложения найти пакет в /tmp/applications/app_data.json и выполнить am start <package>/<activity> MegaTorrents после запуска ждёт 15 с и проверяет сервис MegaTorrents (код)591; Torrent Center (Transmission BTC) (код)592
Открыть файл внешним приложением по MIME am start -a android.intent.action.VIEW с video/*, audio/x-mpegurl, application/x-bittorrent, image/* — MegaAnime (код)593; Torrent Center (код)594
Отдавать .torrent Android-приложению дописать объект TORRENT в /config/app_by_file_ext.json меняется общий конфиг плеера Torrent Center (код)595
Голосовой ввод через отдельное приложение удалить our_file.txt в данных приложения через dunehd_service do, затем am start com.example.dunevoice -a android.intent.category.DEFAULT по сообщениям в теме, нужно поставить DuneVoice.apk YouTube (код, форум)596
Поставить APK из плагина ActionFactory::download_and_install_apk возвращает DOWNLOAD_AND_INSTALL_APK_ACTION_ID с caption, package, urls, indirect и post_action, если константа определена; Bazinga3 на Android при отсутствии /data/data/com.example.dunevoice, если не сработал ранний возврат диалога о доступе к Кинопоиску, plugin_cookies->duneVoiceAsk === 0 и не задан $user_input->install, показывает диалог установки DuneVoice с http://dune-club.info/plugins/update/_other/DuneVoice.apk при отсутствии константы действие — null; dontAsk пишет 1 в plugin_cookies->duneVoiceAsk Bazinga3 (код)597
Собрать APK и настройки установленных приложений пункт «Создать файлы apk» читает tmp/applications/app_data.json, берёт caption, package_name, version, source_dir и копирует найденные в /data/app/ файлы в dune_bcp/dune_apk_(<ID>)/<caption><version>.apk; пункты настроек копируют каталоги NUM, SmartTube и ButtonRemapper в dune_bcp/abcp_ГГГГ_ММ_ДД и обратно (при восстановлении удаляется прежний NUM) данные приложений не сохраняются Dune BackUp (код)598

15.8. Своё Android-приложение рядом с плагином: dune-voice и Jellyfin Bridge

Задача Приём Грабли и ограничения Плагины и claims
Видеть пакеты Dune и Lampa <queries> с com.dunehd.app и top.rootu.lampa; minSdkVersion 26, targetSdkVersion 30 — Lampa bridge (dune-voice) (код)599
Перехватить кнопку микрофона и выполнить «Назад» accessibility-сервис RemoteKeys (flagRequestFilterKeyEvents); «Назад» — performGlobalAction(GLOBAL_ACTION_BACK) без включённого сервиса — ошибка «Включите службу кнопки микрофона»; подробнее — guide/input-dialogs.md §4.6 Lampa bridge (dune-voice) (код)600
Открыть поиск в другом приложении Lampa — явный компонент и ACTION_SEARCH с extra query; YouTube-клиенты — ACTION_VIEW на youtube.com/results?search_query=… с setPackage SmartTube игнорирует ACTION_SEARCH Lampa bridge (dune-voice) (код)601
Громкость AudioManager.adjustStreamVolume(STREAM_MUSIC, ADJUST_*, FLAG_SHOW_UI) в главном потоке — Lampa bridge (dune-voice) (код)602
UI-действие из фонового потока сразу в главном Looper или FutureTask через Handler(mainLooper) с ожиданием до 5 с — Lampa bridge (dune-voice) (код)603
Не блокировать UI поиском файла поиск в рабочем потоке, запуск плеера — в главном, только если activity не isFinishing()/isDestroyed(); ошибка поиска — запуск по исходному URL — Jellyfin Bridge (код)604
Опрашивать статус плеера один планировщик: раз в 250 мс, пока начальная перемотка не подтверждена и прошло меньше 30 с, затем раз в 1000 мс — Jellyfin Bridge (код)605

15.9. JS-плагин для Lampa: подмена плеера на нативный плеер Dune

Объект: dune-native-player.js и dune-local-progress.js в Lampa bridge 1.0.1 (code).

Задача Приём Грабли и ограничения Плагины и claims
Подключиться и не сломать другой плагин не ставиться повторно при window.DuneNativePlayer или без AndroidJS; после appready заменить Lampa.Android.openPlayer обёрткой; destroy() возвращает исходный метод, только если на месте всё ещё обёртка — Lampa bridge (код)606
Не запустить плеер по устаревшему ответу счётчик sequence и флаг dead: поздние колбэки выходят, если id не текущий — Lampa bridge (код)607
Собрать карточку и плейлист для моста карточка из data.card → data.movie → активный экран; payload — только title, description, poster, items, index, position субтитры не передаются; название до 512, описание до 15000 символов Lampa bridge (код)608
Отказаться от нативного пути целиком headers, больше 250 элементов, невалидный элемент, ненайденный URL, выключенная настройка или молчание моста — вызвать исходный openPlayer без частичной подмены Lampa bridge (код)609
Передать плейлист и открыть нативную карточку запрос к CGI api; принять ответ только с plugin и точным launch_url; подменить URL на launch.m3u, удалить playlist и вызвать исходный openPlayer по комментарию автора, второй плейлист в Android APK строить нельзя: timeline-колбэки Lampa уже привязаны к исходному Lampa bridge (код, форум)610
Добавить настройки в Lampa при наличии Lampa.SettingsApi плагин добавляет компонент «Dune HD», addParam для dune_native_player_enabled (по умолчанию true) и dune_native_torrserver_url с подсказкой http://SERVER:8095 при изменении URL запоминается source — базовый URL выбранного в Lampa TorrServer (torrserver_url или torrserver_url_two по torrserver_use_link) Lampa bridge (код)611

15.10. Внешний инструмент по adb: синхронизация истории просмотра (watch-sync)

Объект: dune-hd-watch-sync 0.1.0 — Python-сервис на NAS, который пишет историю просмотра плеера по adb (code; поведение плеера — со слов автора, forum).

Задача Приём Грабли и ограничения Плагины и claims
Записать файл в каталог приложения adb push в /data/local/tmp/dunesync, затем cat tmp > target, chown system:system, chmod 644, restorecon, sync по сообщению автора, adb push прямо в каталог приложения делает файл root, а редирект сохраняет владельца, режим и SELinux-контекст watch-sync (код, форум r22)612
Заставить навигатор перечитать историю am force-stop com.dunehd.app, пауза 2 с, am start -n com.dunehd.app/com.dunehd.shell.MainActivity по сообщению автора, без force-stop запись не вступает в силу, без am start приложение поднимается полуинициализированным; am start не будит спящий плеер watch-sync (код, форум r22)613
Не потерять несброшенную историю писать, только если есть расхождения, плеер в navigator/standby/loading и mtime истории сдвинулся после конца file_playback по сообщению автора, force-stop может потерять ещё не сброшенный сеанс watch-sync (код, форум r22)614
Писать формат байт-в-байт шарды по 40 записей, %06d.json, одна запись на строку, UTF-8 без \u; удалённая запись — ровно {"deleted": 1}; timestamp — unix-время в микросекундах — watch-sync (код)615
Включать запись осторожно по умолчанию dry_run=true; write: false для плеера только для чтения; бэкап перед каждой записью, последние 30 на плеер — watch-sync (код)616
Вызывать adb из скрипта всегда stdin=/dev/null adb shell читает stdin и при запуске из пайпа съедает остаток скрипта watch-sync (код)617
Держать сервис запущенным watch.sh сканирует /proc, выходит, если python3 -m dunesync уже работает, иначе exec с логом — watch-sync (код)618

Расхождения

Объект: места, где плагины делают одно и то же по-разному или где код плагина расходится с документацией и кодом платформы; плагины (code, платформа и прошивка исполнения не установлены), SDK плагинов (doc) и прошивки, если на них есть ссылка. Связь conflicts_with указана там, где она заведена; где её нет — это кандидат для lead.

Сеть

  • Успешный HTTP-код в HD::http_get_document. Хелпер прошивки tv188b r24 бросает DuneCurlException при любом коде, кроме 200 (код r24)2; копия в GlobalTV считает успехом 200 и 201 (код)23. Связи conflicts_with нет (это разные реализации, а не спор источников о поведении).
  • Реакция хелпера на сетевую ошибку. Одноимённый HD::http_get_document в разных плагинах при ошибке бросает исключение (код)6, возвращает пустую строку (код)8, возвращает null на 404 (код)24 или только пишет лог и возвращает тело (код)25. Код, перенесённый из одного плагина в другой, меняет поведение при ошибке. Связи conflicts_with нет.

Настройки

  • Cookie видимости значка в surface_. SDK: видимость точки входа задаёт cookie из show_cookie_name (SDK)193; surface_ объявляет в манифесте show_application, но ни один из трёх плагинов его не пишет — rmfon.pl и wwcam пишут show_tv (код)196. Это несогласованность плагина с собственным манифестом, связи conflicts_with нет.
  • Две копии smbtree с разным списком «проблемных» платформ. В Radiorecord.ru копия в surface_file_screen.php проверяет только 8672, а копия в do_config.php — 8672, 8673 и 8758 (код)619; liteIPTV включает обход для 8672, 8673 и 8758 (код)251. Последствие для 8673/8758 — гипотеза, см. §19. Связи conflicts_with нет.
  • Путь к network_folders.properties. В remote-control модуль network_folder читает /config/network_folders.properties, а sources — /mnt/config/network_folders.properties; совпадают ли эти файлы на устройстве, не проверено (код)620. Torrent Center читает /config/… (код)104. Связи conflicts_with нет.
  • *get_data_path в семействе Smart_. В YouTube SmartConfig::get_data_path возвращает путь, а в эталоне семейства значение не возвращается (код)240; KinoFrance, MoviesTape и Vimeo строят путь тем же приёмом (код)239. Расхождение копий кода, связи conflicts_with нет.

Фон

  • Cron на Android-прошивке. Torrent Center пишет /tmp/cron/crontabs/root и перезапускает системный crond через dunehd_service do (код)389; Widget Ext при HD_APK=1 системный crond не запускает и крутит свой bin/crond.sh (код)621. Почему на APK нужен свой цикл — гипотеза, см. §19. Связи conflicts_with нет.
  • Таймер сна: IP Control или ИК-код. altIPTV, liteIPTV и Smart_* ставят в cron wget на cmd=standby (код)622; Torrent Center и altSource пишут в cron echo A15EBF00 > /proc/ir/button (код)623. Что делает запись кода — не проверено (§19). Это разные приёмы, а не противоречие; связи conflicts_with нет.
  • Действие на boot: только plugin_system или нет. SDK: для boot поддерживается только plugin_system (SDK)317; в r24 встроенный radiotime, по предположению, ставит в boot run_builtin — это inference (§19), поэтому вопрос не решён. Связи conflicts_with есть у обеих сторон.

Веб и приложения

  • Окружение CGI: вычислять из $PWD или брать готовое. Обёртки do многих плагинов вычисляют имя плагина как третий с конца компонент $PWD (код)624; на tv188b r25 (device) CGI сам получает PLUGIN_NAME, PLUGIN_CGI_DIR и SCRIPT_FILENAME (устройство r25)464, и обёртка Lampa bridge берёт SCRIPT_FILENAME из PLUGIN_CGI_DIR (код)625. Противоречия нет: старые обёртки просто не опираются на переменные прошивки; на каких прошивках эти переменные есть, кроме r25, в базе не описано. Связи conflicts_with нет.
  • Ответ поставщика Okko в двух вариантах. run.php возвращает bin, package, wait_app_start_delay, title, indirect и urls (код)626, run.py — только bin, package и wait_app_start_delay (код)627. Различие внутри одного пакета; связи conflicts_with нет.

Не проверено

Объект: гипотезы (inference) и оспоренные утверждения (disputed) из разборов плагинов, относящиеся к приёмам этой главы; платформа и прошивка — как в scope claim. Это кандидаты на проверку в коде или на устройстве; в разделах выше они не цитируются.

Утверждение Уровень, статус Claim Раздел
wget на устройствах, возможно, не умеет HTTPS — поэтому Widget Ext качает https-сервис Gismeteo отдельным curl inference (вывод)628 §9
Init-скрипты tv175u r24/r22 пишут /tmp/run/versions.txt строками key=value (формат, по которому Widget Ext выбирает curl) code, disputed (код r22, r24)629 §9
На Sigma-платформах platform_kind в versions.txt, вероятно, — 4-символьный код чипа (87xx/864x/867x/865x) inference (вывод)630 §9
zlostnyi: проверка ошибки медиатеки is_null($doc) не ловит строку nottoken от HD::check_token, и сообщение о неверном ключе не показывается inference (вывод)631 §9
RemTor: checkconnect может зациклиться, если get_session_stats вернёт пустой массив без исключения inference (вывод)632 §9
Twitch TV: при резервной регулярке HLS во второй группе оказывается запятая вместо RESOLUTION inference (вывод)633 §9, §17
Online Movies (rus): с упакованным link_api.php вызов zonaMobi::getRCPC() — фатальная ошибка inference (вывод)634 §9, §17
watch-sync: позицию во время воспроизведения можно получить только по HTTP (cmd=status), на диск она попадает после остановки inference (вывод r22)635 §9
MegaRadio: без LISTEN KEY категории DI.FM не заполняются inference (вывод)636 §9
Виджет погоды оболочки, вероятно, показывает данные из $FS_PREFIX/tmp/weather.txt, поэтому Widget Ext подменяет источник данных встроенного виджета, а не рисует свой inference, disputed (вывод)637 §10
WeburgTV: раз do_get_control_defs возвращает null, полей buffer_time и epg_shift на экране нет и ветки их сохранения недостижимы inference (вывод)638 §10
youtube_api/folder_cache (YouTubeMult): data_type, data_dir и SMB-поля не влияют на файлы избранного и поиска — lib/utils.php всегда пишет в data_dir_path inference (вывод)639 §10
MegaAnime: HD::pCopyFolders и ряд методов SmartConfig вызываются, но в пакете не определены; если link_api.php их не добавляет, выгрузка/загрузка DATA завершится fatal error inference (вывод)640 §10
PeerflixServer: пока config->tmp равен /D/torrent-stream, экран скрывает панель сервера — после установки нужно выбрать накопитель inference (вывод)641 §10
surface_* (Radiorecord.ru): на 8673 и 8758 файловый экран не включает обход бага SMB, потому что его копия get_bug_platform_kind() проверяет только 8672 inference (вывод)642 §10
Цикл crond.sh Widget Ext для APK — не настоящий cron: читает интервал из $FS_PREFIX/tmp/cron/interval и в бесконечном цикле со sleep вызывает скрипт погоды code, disputed (код)643 §13
При HD_APK=1 crontask.sh заменяет системный crond своим циклом, вероятно, потому что crond там недоступен без root; HD_APK=1 выставляет и Android-прошивка Dune, а не только сторонний APK inference, disputed (вывод r24)644 §13
umount монтирует сетевую папку при каждой загрузке через свой переписанный global_actions/boot; правка подхватывается, только если оболочка перечитывает dune_plugin.xml inference (вывод)645 §13
Автостарт PeerflixServer может не срабатывать там, где /bin/sh не понимает bash-подстроку ${ROOT_DIR::${#ROOT_DIR}-4} в bin/boot_end.sh inference (вывод)646 §13
Запись A15EBF00 в /proc/ir/button выключает плеер; запись IR-кода туда эмулирует нажатие кнопки пульта inference (вывод)647 §13
В r24 на событие boot, вероятно, допустимо не только plugin_system: встроенный radiotime ставит туда run_builtin inference (вывод r24)648 §13
HTTP-сервер устройства отдаёт файлы и по симлинкам www/dss/www/sdss, на чём строится галерея Screenshoter inference (вывод)649 §15
Bazinga3: hlsProxy.php и файл hlsProxyArgs включает внешний link_api.php, которого в пакете нет; в копии link_api ##673## запись hlsProxyArgs и URL hlsProxy?rp= есть, но закомментированы inference (вывод)650 §15
Через CGI playlists remote-control можно прочитать файл вне каталога плейлистов: PATH_INFO не нормализуется inference (вывод)651 §15, §17
www/cgi-bin/.htaccess 101.ru — чужой конфиг (пути Nextcloud), плагином не используется inference (вывод)652 §15
PeerflixServer не участвует в воспроизведении: торрент добавляется и раздаётся через веб-интерфейс peerflix-server на :9000 inference (вывод)653 §15
com.example.dunevoice в YouTube и org.duckdns.dunevoice.tv в dune-voice — разные сборки голосового ввода inference (вывод)654 §15
Ветка перезапуска своего плагина plugin_launcher://{name=<plugin_name>} в YouTube недостижима: control_id aplаy (с кириллической «а») нигде не создаётся inference (вывод)655 §15
watch-sync (Solo 8K, Pro 8K Plus, Android-прошивка r22): отметка «просмотрено» в навигаторе выводится из самих записей истории, а не из watched_files.txt/watched_movies.txt inference (вывод r22)656 §10

  1. 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_*; опции вызывающего применяются поверх ↩

  2. 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 ↩↩

  3. 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. ↩

  4. 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 определены. ↩

  5. plg-dc-globaltv.c075 · code · unknown; прошивка — · HD::http_get_document отключает проверку SSL-сертификатов (CURLOPT_SSL_VERIFYPEER = false) и следует редиректам; таймауты — 30 с на соединение и 60 с на запрос. ↩

  6. plg-gh-aspel-twitch-dune-plugin.c047 · code · unknown; прошивка — · HD::http_get_document выполняет запрос через curl с CURLOPT_SSL_VERIFYPEER = false, CURLOPT_CONNECTTIMEOUT = 10, CURLOPT_TIMEOUT = 10 и User-Agent DuneHD/1.0; второй аргумент $opts позволяет переопределить curl-опции; при ошибке curl или HTTP-коде, отличном от 200, пишет hd_print и бросает Exception. ↩↩↩↩↩

  7. plg-gh-sndpl-apple-trailers-dune-plugin.c051 · code · unknown; прошивка — · HD::http_get_document выполняет curl с connect- и общим таймаутом 10 с и User-Agent 'DuneHD/1.0', возвращает тело ответа, а при ошибке curl или HTTP-коде не 200 печатает сообщение hd_print и бросает Exception. ↩↩↩

  8. plg-gh-rpervykh-dune-plugin-anidub-com.c036 · code · unknown; прошивка — · HD::http_get_document делает запрос через curl с CONNECTTIMEOUT и TIMEOUT 10 с, FOLLOWLOCATION=1, ENCODING=1 и User-Agent Firefox 7; при ошибке curl или HTTP-коде не 200 возвращает пустую строку, а не исключение. ↩↩↩↩

  9. plg-hdtv-pirates-radio.c052 · code · unknown; прошивка — · HD::http_get_document в копии lib/ ставит CURLOPT_CONNECTTIMEOUT и CURLOPT_TIMEOUT по 10 секунд, следует редиректам, представляется User-Agent Firefox 7.0.1 и бросает Exception при ошибке curl или HTTP-коде, отличном от 200. ↩↩↩

  10. plg-dc-widget-ext.c042 · code · unknown; прошивка — · HD::http_get_document делает запрос через расширение curl PHP: SSL-проверка отключена, CONNECTTIMEOUT 11, TIMEOUT 10, User-Agent Firefox/53, при коде ≠ 200 бросает Exception ↩↩↩

  11. plg-gh-mdpuma-dune-plugin-altiptv.c076 · code · unknown; прошивка — · HD::http_get_document использует curl с SSL_VERIFYPEER=false, FOLLOWLOCATION=1 и таймаутами соединения/запроса по 25 секунд; переданные opts могут заменить параметры. ↩↩

  12. plg-hdtv-plugtv.c048 · code · unknown; прошивка — · В http_get_document отключена проверка TLS-сертификата, тайм-ауты увеличены до 25 с, включены редиректы и сжатие, User-Agent подменён на Firefox 25 + DuneHD/1.0. ↩↩

    • plg-hdtv-zlostnyi-iptv.c036 · code · unknown; прошивка — · HD::check_token и HD::http_get_document ставят одинаковые опции curl: CURLOPT_SSL_VERIFYPEER FALSE, connect/total timeout 25 с, FOLLOWLOCATION, User-Agent «Opera/9.80 (Windows NT 6.0; Opera Mobi/49; U; en) Presto/2.4.18 Version/10.00».
    • plg-hdtv-zlostnyi-iptv.c166 · code · unknown; прошивка — · Копии lib/ пяти M3U-пакетов (ottclub, shara-club, smile, sharavoz, tvteam) отличаются от bcu в 3–8 файлах из 43: общие — utils.php (HD::http_get_document с UA DuneHD/1.0 и таймаутом 40 с вместо Opera/25 с) и tv/tv_channel_list_screen.php (ссылка на свой setup-класс); в abstract_tv.php у shara-club, smile, sharavoz, tvteam буферизация по умолчанию 1000 мс вместо 500.

    ↩

  13. plg-hdtv-smart-vod.c117 · code · unknown; прошивка — · HD::http_get_document в lib/utils.php эталона задаёт cURL timeout/connecttimeout 40 с, followlocation=1 и SSL_VERIFYPEER/SSL_VERIFYHOST=0, после чего позволяет переданным opts переопределить параметры. ↩↩

  14. plg-dc-dunemdb-supplier-movies-rus.c034 · code · unknown; прошивка — · run.php определяет собственный класс HD с единственным методом http_get_document(): проверка SSL отключена (CURLOPT_SSL_VERIFYPEER/VERIFYHOST = 0), редиректы включены, таймауты 40 с, задан UA Firefox 7.0.1 и CURLOPT_ENCODING. ↩↩

  15. plg-dc-torrent-center.c135 · code · unknown; прошивка — · HD::http_get_document отключает проверку TLS peer и host перед cURL-запросом. ↩

  16. plg-gh-kocourkuba-proiptv.c059 · code · unknown; прошивка — · Curl_Wrapper по умолчанию отключает проверку SSL (VERIFYPEER/VERIFYHOST=0), следует до 5 редиректам, включает gzip и ставит User-Agent из HD::get_dune_user_agent(); connect/download timeouts и срок файлового кэша берутся из параметров плагина в Default_Dune_Plugin::reset_curl, а HD::http_init собирает UA 'DuneHD/1.0', который при наличии в /tmp/sysinfo.txt строк product_id/firmware_version дополняется ими и подписью плагина (app_caption + app_version). ↩↩

  17. plg-dc-bazinga3.c056 · code · unknown; прошивка — · HD::http_get_document делает cURL-запрос с отключённой проверкой TLS peer/host, таймаутами 30 с, редиректами, gzip и User-Agent Chrome/80; служебные ключи opts — getHttpCode, hideUrl, silent. ↩

  18. plg-dc-widget-ext--lib.c063 · code · unknown; прошивка — · HD::http_get_document применяет переданные opts после стандартных curl_setopt, позволяя заменить их значения. ↩

    • plg-dc-widget-ext--lib.c064 · code · unknown; прошивка — · HD::http_post_document вызывает http_get_document с CURLOPT_POST = true и CURLOPT_POSTFIELDS = post_data.
    • plg-dc-widget-ext--lib.c065 · code · unknown; прошивка — · HD::make_json_rpc_request создаёт массив jsonrpc = 2.0, id с предынкрементом статического счётчика, method и params.

    ↩

  19. plg-gh-rpervykh-dune-plugin-anidub-com.c037 · code · unknown; прошивка — · HD::http_post_document вызывает http_get_document с CURLOPT_POST=true и CURLOPT_POSTFIELDS=post_data. ↩

  20. plg-hdtv-polsky-tv.c024 · code · unknown; прошивка — · service_api_call отправляет запрос к сервису статистики через fetch_document с телом get_post_data() (JSON), то есть POST-JSON с отключённой проверкой сертификата (CURLOPT_SSL_VERIFYPEER=0 и CURLOPT_SSL_VERIFYHOST=0). ↩

  21. plg-dc-globaltv.c076 · code · unknown; прошивка — · HTTP-ответы с кодом, отличным от 200 и 201, HD::http_get_document считает ошибкой и бросает DuneCurlException. ↩↩

  22. plg-hdtv-duneplexcatalog.c037 · code · unknown; прошивка — · PL::http_get_document_t делает HTTP-запрос через curl с User-Agent DuneHD/1.0, CURLOPT_CONNECTTIMEOUT 0 и CURLOPT_TIMEOUT 120; ответ 404 возвращает null, прочие не-200 и ошибки curl бросают исключение. ↩↩↩

  23. plg-gh-mdpuma-dune-plugin-altiptv.c077 · code · unknown; прошивка — · При ошибке curl либо HTTP-коде, отличном от 200, HD::http_get_document пишет лог, но строки throw закомментированы и возвращается content. ↩↩

  24. plg-dc-globaltv.c094 · code · unknown; прошивка — · При сетевой ошибке curl плагин (при наличии сетевого монитора) атомарно записывает 1 в /tmp/run/network_monitor/force_check_on_error. ↩

  25. plg-hdtv-zlostnyi-iptv.c035 · code · unknown; прошивка — · HD::check_token (lib/utils.php, своё дополнение копии lib) делает curl-запрос и возвращает строку «nottoken», если curl_exec вернул false или HTTP-код не 200; иначе — тело ответа. ↩

  26. plg-hdtv-megatorrents.c040 · code · unknown; прошивка — · HD::isDomainAvailible проверяет URL через cURL с CONNECTTIMEOUT 10 с по умолчанию; для URL, оканчивающегося на /echo, возвращает тело ответа, для прочих делает HEAD (CURLOPT_NOBODY) и возвращает true/false. ↩

    • plg-gh-valerievitch-dune-plugin-acestreamsearch.c067 · code · unknown; прошивка — · AceSearchTv::ace_api_response получает документ через file_get_contents($url); при FALSE бросает DuneException 'HTTP network error' с фатальным действием show_error.
    • plg-gh-valerievitch-dune-plugin-acestreamsearch.c069 · code · unknown; прошивка — · AceSearchTv::ace_api_response при неудачном json_decode бросает DuneException 'Response parsing error' с сообщением 'Cannot parse data from remote search engine'.

    ↩

    • plg-dc-widget-ext.c099 · code · unknown; прошивка — · Погоду OpenWeatherMap, Яндекса и rp5 скрипты плагина качают по http через wget, а Gismeteo — по https через $CURL с ключом -k
    • plg-dc-widget-ext.c063 · code · unknown; прошивка — · Gismeteo запрашивается по HTTPS https://services.gismeteo.ru/inform-service/inf_chrome/forecast/?city=&lang=<…> через curl с ключами -s --location -k (без проверки сертификата)

    ↩

    • plg-dc-widget-ext.c065 · code · sigma-smp86xx, sigma-smp87xx, android; прошивка — · Скрипт gismeteo выбирает curl по platform_kind из $FS_PREFIX/tmp/run/versions.txt: android → $FS_PREFIX/firmware/bin/curl; 87.., 864., 867., 865. → собственные bin/curl.87xx, curl.864x, curl.867x, curl.865x; при любом другом platform_kind CURL остаётся пустым
    • plg-dc-widget-ext.c067 · code · sigma-smp86xx, sigma-smp87xx; прошивка — · Вложенные бинарники curl: curl.864x и curl.867x — curl 7.19.5 (mipsel-unknown-linux-gnu), curl.87xx — curl 7.36.0 (arm-buildroot-linux-gnueabi) из sigma-buildroot_2014.05 (bdk8756)
    • plg-dc-widget-ext.c068 · code · unknown; прошивка — · bin/curl.864x плагина побайтно совпадает (sha256 917d95cf…611a, 85377 байт) с shell_ext/bin/curl встроенного плагина прошивки tv188b 260827_0003_r24

    ↩

    • plg-dc-dunemdb-supplier-movies-eng.c057 · code · unknown; прошивка — · Перед проверкой URL плагин отрезает суффиксы «|Referer…» и «|Cookie…».
    • plg-dc-dunemdb-supplier-movies-eng.c058 · code · unknown; прошивка — · Каждый найденный URL проверяется HTTP-запросом Range bytes=0-10000 с таймаутом 1 с; при ошибке источник отбрасывается.

    ↩

    • plg-dc-torrent-center.c077 · code · unknown; прошивка — · torrserverActionUpload отправляет file=@<путь> на /torrent/upload и возвращает hash при наличии его в JSON.
    • plg-dc-torrent-center.c078 · code · unknown; прошивка — · torrserverActionAdd посылает на /torrents JSON action=add с link и save_to_db, который сбрасывается при dontSave.

    ↩

  27. plg-hdtv-youtube.c089 · code · unknown; прошивка — · Экраны YouTube создают плейлист аккаунта POST /playlists?part=snippet,status с описанием «Created on Dune HD! Enjoy!» и privacyStatus private и добавляют видео POST /playlistItems?part=snippet через http_get_api_v3. ↩

  28. plg-ds-dune-hd-tv.c059 · code · unknown; прошивка — · run.php ходит в сеть через curl с таймаутом 40 с и User-Agent «Mozilla/5.0 (Windows NT 5.1; rv:7.0.1) Gecko/20100101 Firefox/7.0.1». ↩

  29. plg-dc-globaltv.c093 · code · unknown; прошивка — · User-Agent HTTP-запросов плагина — DuneHD/1.0 с добавкой строк product_id и firmware_version из /tmp/sysinfo.txt. ↩

  30. plg-hdtv-zlostnyi-iptv.c036 · code · unknown; прошивка — · HD::check_token и HD::http_get_document ставят одинаковые опции curl: CURLOPT_SSL_VERIFYPEER FALSE, connect/total timeout 25 с, FOLLOWLOCATION, User-Agent «Opera/9.80 (Windows NT 6.0; Opera Mobi/49; U; en) Presto/2.4.18 Version/10.00». ↩

    • plg-hdtv-youtube.c068 · code · unknown; прошивка — · SmartConfig::getYtbTvApiReq YouTube собирает JSON-контекст TV-клиента (screenWidthPoints 3840, tvAppInfo и т. п.), добавляет continuation, browseId, params, playlistId, query, videoId и др. из аргументов и отправляет его POST на https://www.googleapis.com/youtubei/v1/?key=.
    • plg-hdtv-youtube.c069 · code · unknown; прошивка — · SmartConfig::http_get_ytb YouTube шлёт запросы с заголовками Content-Type application/json, Origin https://www.youtube.com, Referer https://www.youtube.com/tv, User-Agent SMART-TV Tizen 5.0 и X-Goog-Visitor-Id из visitor_data; Authorization добавляется только при наличии access_token и noLogIn == false.

    ↩

    • plg-hdtv-web-launchers.c022 · code · unknown; прошивка — · bonus-tv запускает локальную страницу ping.html с user_agent=DUNE и show_by_default=lang(russian,ukrainian); это единственный манифест с user_agent=DUNE.
    • plg-hdtv-web-launchers.c018 · code · unknown; прошивка — · xsmart запускает внешний URL http://app.xsmart.tv/?platform=dune&size=1280 с параметрами webapp_keys=1, user_agent=dune, osd_size=1280x720, background_color=black; это единственный внешний URL с параметром platform.

    ↩

  31. plg-dc-globaltv.c084 · code · unknown; прошивка — · Строку авторизации устройства плагин читает из /tmp/dune_auth.txt и дописывает в query-строку запросов к серверу как есть. ↩

  32. plg-hdtv-jurt.c031 · code · unknown; прошивка — · Сохранение логина и пароля: apply_subscription проверяет непустой user_name, пишет cookies user_name/password, сбрасывает сессию и пробует try_login; ошибка DuneException превращается в post_action. ↩

  33. plg-hdtv-moidom.c010 · code · unknown; прошивка — · api_exception для не-MoiDom_Exception возвращает DuneException с ActionFactory::show_error; для MoiDom_Exception фатальными считаются коды 12 при сообщении 'Authentification error', 17 и 5 — тогда вызывается unset_login; остальные ошибки для не-playback показываются с кодом и сообщением, для playback — только сообщением в заголовке. ↩

  34. plg-dc-globaltv.c098 · code · unknown; прошивка — · Коды ошибок сервера 201–204 плагин показывает как «нет доступа», «пробный период окончен», «пробный период недоступен» (с кнопкой оплаты) и «сервис недоступен»; остальные — как техработы. ↩

    • plg-hdtv-youtube.c073 · code · unknown; прошивка — · При control_id=do_login главное меню YouTube отправляет POST client_id и scope=http://gdata.youtube.com на https://www.youtube.com/o/oauth2/device/code; при получении user_code ждёт interval секунд (sleep) и переходит к login_page с verification_url, interval, device_code и user_code.
    • plg-hdtv-youtube.c074 · code · unknown; прошивка — · При control_id=login_page главное меню YouTube показывает диалог с адресом https://www.youtube.com/activate и кодом, опрашивает https://www.youtube.com/o/oauth2/token и, пока ответ содержит error, через timer(5000) повторяет login_page; при access_token и refresh_token сохраняет ответ в tokens (или user_plus_tokens) и инвалидирует main_menu.

    ↩

  35. plg-hdtv-youtube.c126 · forum · unknown; прошивка — · В первом посте темы 15724 (со ссылкой на dimaS1410) вход в аккаунт описан так: синяя кнопка показывает адрес и код, код вводится в браузере компьютера с выполненным входом, после чего Дюна сообщает OK. ↩

  36. plg-hdtv-youtube.c070 · code · unknown; прошивка — · http_get_ytb и http_get_api_v3 YouTube при ответе error.code 401 и наличии access_token обновляют токен POST-запросом grant_type=refresh_token на https://www.youtube.com/o/oauth2/token, сохраняют новый access_token через get_tokens и повторяют запрос. ↩

  37. plg-hdtv-youtube.c072 · code · unknown; прошивка — · SmartConfig::get_tokens YouTube хранит OAuth-токены основного аккаунта в HD-элементе tokens, а дополнительных пользователей — в user_plus_tokens[<имя>]; текущее имя — static uname (по умолчанию default). ↩

    • plg-hdtv-remtor.c110 · code · unknown; прошивка — · GetSessionID делает GET без тела, ждёт ответ 409 и извлекает значение заголовка X-Transmission-Session-Id в session_id.
    • plg-hdtv-remtor.c107 · code · unknown; прошивка — · TransmissionRPC отправляет JSON {method, arguments} методом POST с Content-type application/json и заголовком X-Transmission-Session-Id; при заданных username и password добавляет Authorization: Basic.
    • plg-hdtv-remtor.c108 · code · unknown; прошивка — · HTTP-контекст TransmissionRPC задаёт timeout 10 секунд, ignore_errors = true и User-Agent «TransmissionRPC for PHP/0.3».
    • plg-hdtv-remtor.c109 · code · unknown; прошивка — · При ответе 401 TransmissionRPC бросает исключение E_AUTHENTICATION, при 409 — E_SESSIONID с требованием вызвать GetSessionID.

    ↩

  38. plg-gh-aspel-twitch-dune-plugin.c041 · code · unknown; прошивка — · Плагин запрашивает Twitch Kraken API по адресам api.twitch.tv/kraken/games/top?limit=100, /kraken/streams?limit=100, /kraken/streams?game=&limit=100, /kraken/users/ и /kraken/streams/; в каждом запросе, кроме followed, жёстко задан client_id=9w0wfeb3nd0iuovyl0i32kpyyzktyh9. ↩

  39. plg-hdtv-smart-vod--link-api.c056 · code · unknown; прошивка — · В коде жёстко заданы ключи и токены: bazon c118eb5f8d36565b2b08b5342da97f79, HDVB f25f5636f9a8d8cf99b6367e14dff52e, Kodik b7cc4293ed475c4ad1fd599d114f4435, TheMovieDB d56e51fb77b081a9cb5192eaaa7823ad, Twitch client_id jzkbprff40iqj646a697cyrvl0zt2m6 и YouTube AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8. ↩

  40. plg-hdtv-megaradio.c152 · code · unknown; прошивка — · get_radio_stream_info для не-JSON названия вида «artist - track» ищет обложку через ws.audioscrobbler.com методом track.search с api_key 8077e41f067a717abb49db6159081cb5; обложки альбомов запрашивает artist.gettopalbums, текст — на lyrics.wikia.com; оба запроса выполняются только при actions = true и use_osd не равном 3, текст — дополнительно при use_osd не равном 2. ↩

  41. plg-hdtv-smart-vod.c270 · code · unknown; прошивка — · Filmix get_tlogin_check('filmix') сначала возвращает true, если существует cookie-файл tmp_dir_path/filmix_cooki; иначе читает login_settings и при отсутствии логина или пароля возвращает false, иначе отправляет POST login_name/login_password/login=submit с заголовком cookie x-a-key=sinatra и cookie-файлом tmp_dir_path/filmix_cooki; ошибкой считает наличие form action= в ответе. ↩

    • plg-ds-dune-hd-tv.c026 · code · unknown; прошивка — · Эндпоинты авторизации в I24hSession: v2/otps, v2/auth/otp, v2/auth/login, v2/auth/device, v2/users/self/devices, v2/users/self/network, v2/users/self/promokeys.
    • plg-ds-dune-hd-tv.c027 · code · unknown; прошивка — · Вход по телефону: api_login отправляет POST на v2/auth/otp с phone (ведущая 8 заменяется на 7) и token (пароль из SMS) и берёт access_token из ответа.

    ↩

    • plg-ds-dune-hd-tv.c029 · code · unknown; прошивка — · register_device отправляет POST v2/users/self/devices с vendor DUNE, model (product из versions.txt или 'dune'), version плагина, device_type stb, serial (из лицензии) и application_type dune; при ответе 400 «Too many devices.» или «Ограничение по количеству устройств.» открывает экран списка устройств.
    • plg-ds-dune-hd-tv.c031 · code · unknown; прошивка — · Серийный номер устройства плагин берёт из первой строки /fconfig/dune_license.dlf (третье поле, без дефисов); device_id хранится в plugin_cookies->device_id, а при его отсутствии используется серийный номер.

    ↩

  42. plg-ds-dune-hd-tv.c028 · code · unknown; прошивка — · verify_device при заданном в plugin_cookies device_id отправляет POST v2/auth/device с device_id; при успешном ответе берёт access_token и запрашивает v2/users/self (id, phone, username, parental_code, provider). ↩

  43. plg-ds-dune-hd-tv.c033 · code · unknown; прошивка — · api_call декодирует JSON-ответ; status_code вне 200, 400, 401, 403, 404 даёт исключение (с диалогом «Ошибка взаимодействия с сервером.», если есть error.message), а 400, 401, 403 и 404 возвращаются вызывающему как данные. ↩

  44. plg-hdtv-smart-vod.c335 · code · unknown; прошивка — · Активация Filmix_API: синяя кнопка главного меню «Активация» вызывает control_id=login; при заданном selected_media_url он запрашивает HOST_API_URL . "/token_request" с user_dev_apk, user_dev_id, user_dev_name, user_dev_os, пустым user_dev_token и user_dev_vendor и, если ответ не со status=error, показывает URL https://filmix.tech/console и user_code (иначе «Не удалось получить код.»); control_id=do_slogin_action при заданном selected_media_url сохраняет token_request в DuneSystem::$properties["user_dev_token"] и HD::save_items('tokens'), затем запрашивает "/user_profile" и при наличии user_data показывает «Успешно», иначе «Логин не удался». ↩

  45. plg-hdtv-smart-vod.c339 · forum · unknown; прошивка — · В первом посте темы Filmix_Api (19814) avenso пишет, что для качества 720p требуется регистрация на Filmix без оплаты, для более высокого качества — оплата Pro-аккаунта; в обоих случаях нужна активация устройства по кнопке «D» с добавлением устройства в личном кабинете; без регистрации доступно только 480p. ↩

    • plg-hdtv-remtor.c115 · code · unknown; прошивка — · Конструктор TransmissionRPC сразу вызывает sget() и сохраняет rpc_version из ответа.
    • plg-hdtv-remtor.c116 · code · unknown; прошивка — · RemoteTorrentClass::get_rpc_version выполняет пустой rpc_request и возвращает rpc_version созданного клиента.

    ↩

  46. plg-hdtv-remtor.c118 · code · unknown; прошивка — · use_alt_speed вызывает get_session_stats, но результат игнорирует; читает сохранённый general_info['alt-speed-enabled'], сравнивает его со строкой 'true' и вызывает sset с противоположным значением. ↩

    • plg-gh-rpervykh-dune-plugin-anidub-com.c087 · code · unknown; прошивка — · Cursor::parse_page разбирает HTML главной/категорийной страницы по маркерам div class="newstitle", a href, data-original и div class="title" itemprop="name"; при отсутствии data-original подставляет plugin_file://skins/no_cover.png.
    • plg-gh-rpervykh-dune-plugin-anidub-com.c100 · code · unknown; прошивка — · parse_season_info скачивает страницу сезона и вырезает блок от
      до

    ↩

    • plg-hdtv-folder-cache-vod.c031 · code · unknown; прошивка — · У ForumHouseTV, Stopham, SexyFilmWorld и YoutubeMetal (общий cursor.php) Cursor::parse_page() разбирает XML-ответ gdata YouTube через explode по , <link rel='alternate', <media:thumbnail, <media:description и и складывает сезоны в HD::encode_user_data.</li> <li>plg-hdtv-folder-cache-vod.c113 · code · unknown; прошивка — · HOST_API_URL плагина — https://streamit.ws; General_main() разбирает блок <div id="menu"> этой страницы, ссылки с «genre» направляет на http://www.live-stream.tv/, остальные — на HOST_API_URL + href, а в подписи заменяет «Mehr» на «TV».</li> <li>plg-hdtv-folder-cache-vod.c056 · code · unknown; прошивка — · cursor.php различается по сайтам: 12 уникальных версий на 15 пакетов; одна общая версия — у ForumHouseTV, Stopham, SexyFilmWorld и YoutubeMetal.</li> <li>plg-hdtv-folder-cache-vod.c054 · code · unknown; прошивка — · karas-avadim подключает 20 сайтовых decoder-файлов (mle_hd, vidx, stroka, kinokiste_decoder, vidstream, primeshare, streamcloud, videomega, youwatsch, faststream, youwatsch_embed, videobash, movshare, nowvideo, veetle, played, divxstage, allmyvideos, sockshare, movreel) и содержит старые копии cursor_old.php и deutsch_old.php.</li> </ul> <p><a class="footnote-backref" href="#fnref:62" title="Jump back to footnote 62 in the text">↩</a></p> </li> <li id="fn:63"> <p>plg-hdtv-megaanime.c039 · code · unknown; прошивка — · Категории Anime-Best парсятся из навигации главной страницы, AnimeVost — из блока «menu» до «Контакты» и подкатегорий по папкам, AniFilm — из формы /releases с параметрами title/status/category/season/genre/voice. <a class="footnote-backref" href="#fnref:63" title="Jump back to footnote 63 in the text">↩</a></p> </li> <li id="fn:64"> <p>plg-hdtv-101-ru.c090 · code · unknown; прошивка — · DemoTv::load_channels получает страницу http://www.di.fm/channels через HD::http_get_document; при совпадении регулярки |di.app.start((.*}));\s| извлекает JSON и вызывает json_decode без проверки результата, иначе $jsd не задаётся. <a class="footnote-backref" href="#fnref:64" title="Jump back to footnote 64 in the text">↩</a></p> </li> <li id="fn:65"> <p>plg-hdtv-megaradio.c076 · code · unknown; прошивка — · Пять каталогов DI.FM (difm, radiotunes, jazzradio, classicalradio, rockradio) получают список каналов из JSON внутри вызова di.app.start(...), а при заданном listenKey подставляют его в URL premium_high/<key>.pls; локальная переменная bitrate задаётся 320, для jazzradio и rockradio — 256, но в прочитанном коде дальше не используется. <a class="footnote-backref" href="#fnref:65" title="Jump back to footnote 65 in the text">↩</a></p> </li> <li id="fn:66"> <ul> <li>plg-gh-rpervykh-dune-plugin-anidub-com.c086 · code · unknown; прошивка — · Cursor для subcategory_ref запрашивает HOST_API_URL + subcategory_ref, добавляя /page/<m_feed+1>/ при m_feed > 0; для ser_feed делает только первую страницу POST-запроса; для main_menu:fav обходит fav_items по индексу m_feed.</li> <li>plg-gh-rpervykh-dune-plugin-anidub-com.c088 · code · unknown; прошивка — · Cursor::parse_page_search отправляет POST на HOST_API_URL . '/index.php?do=search' с телом do=search&subaction=search&search_start=1&full_search=1&result_from=1&titleonly=3&story=<запрос> и разбирает блоки newstitle и poster_img.</li> </ul> <p><a class="footnote-backref" href="#fnref:66" title="Jump back to footnote 66 in the text">↩</a></p> </li> <li id="fn:67"> <p>plg-hdtv-smart-vod--link-api.c021 · code · unknown; прошивка — · zFilmHD::getIframe при <code>$arg == 'video_id'</code> запрашивает страницу curl-ом с браузерными заголовками и Referer https://zfilm-hd.org, переходит по <code><iframe src></code> (если его нет — false), затем разбирает <code>file:</code> JSON (title/folder/file), кэширует cacheLinkApiZF, а playbackUrl отдаёт через parseHlsManifest. <a class="footnote-backref" href="#fnref:67" title="Jump back to footnote 67 in the text">↩</a></p> </li> <li id="fn:68"> <ul> <li>plg-hdtv-smart-vod--link-api.c020 · code · unknown; прошивка — · tortuga::getIframe разбирает <code>file:'...'</code> JSON с title/folder/file и кэширует cacheLinkApiTR; playbackUrl отдаёт через sUtils::parseHlsManifest — в ранней ветке (URL уже в static <code>$sArr</code>) с заменой https на http, после разбора страницы без замены; getTortugaIframe — заглушка, возвращающая false.</li> <li>plg-hdtv-smart-vod--link-api.c027 · code · unknown; прошивка — · videoframe::getVideoFrameIframe при kp_id открывает https://videoframe.space/frameindex.php?kp=<id>, берёт data-token и type, а playbackUrl получает POST-ом на /loadvideo с token и type и разбирает HLS-манифест.</li> <li>plg-hdtv-smart-vod--link-api.c030 · code · unknown; прошивка — · kinoDom::getKinoDomIframe из HTML собирает переводы по data-link и pl:"...", из JSON playlist — сезоны и серии, при наличии Kinodom_Class::$proxy использует прокси, а playbackUrl отдаёт через sUtils::parseModStr.</li> </ul> <p><a class="footnote-backref" href="#fnref:68" title="Jump back to footnote 68 in the text">↩</a></p> </li> <li id="fn:69"> <ul> <li>plg-hdtv-folder-cache-vod.c137 · code · unknown; прошивка — · get_episode_url() выбирает декодер по подстроке в media_url в порядке streamcloud, youwatch (при embed — youwatsch_embed_url, иначе youwatsch_url), primeshare, vodlocker, streamit, flashx, ecostream, vivo, mightyupload, youtube; если ни одно условие не сработало, возвращает URL как есть.</li> <li>plg-hdtv-folder-cache-vod.c138 · code · unknown; прошивка — · streamcloud-декодер: GET страницы; только если в ответе есть «imhuman», собирает скрытые поля op/usr_login/id/fname/referer/hash и imhuman, после sleep(12) шлёт POST на http://streamcloud.eu/<id> и берёт прямой URL из file: "…"; иначе возвращает входной URL.</li> <li>plg-hdtv-folder-cache-vod.c142 · code · unknown; прошивка — · vodlocker-декодер: при embed-…- в ссылке строит http://vodlocker.com/<id>, GET, разбирает скрытые usr_login/op/id/fname/referer/hash, после sleep(5) шлёт POST с op=d… и usr_logint (опечатка в имени поля), берёт file: "…".</li> </ul> <p><a class="footnote-backref" href="#fnref:69" title="Jump back to footnote 69 in the text">↩</a></p> </li> <li id="fn:70"> <ul> <li>plg-gh-sndpl-apple-trailers-dune-plugin.c040 · code · unknown; прошивка — · parseTrailerXml обходит элементы plist->dict->array; пары соседних дочерних элементов каждого trailerFile (сначала $trailerFile->children(), затем $trailerFile->dict->children()) складывает в $trailerInfo по ключу, берёт songName и URL, разворачивает список array_reverse; при Exception печатает сообщение hd_print и возвращает null.</li> <li>plg-gh-sndpl-apple-trailers-dune-plugin.c041 · code · unknown; прошивка — · parseTrailerHTML запрашивает 'http://trailers.apple.com' + $trailer->url + 'includes/playlists/web.inc', регуляркой выбирает ссылки на .mov с rel ./itsxml/[0-9]*-<type>.xml (type без пробелов в нижнем регистре) и текст после них, разворачивает список array_reverse; при Exception печатает сообщение hd_print и возвращает null.</li> </ul> <p><a class="footnote-backref" href="#fnref:70" title="Jump back to footnote 70 in the text">↩</a></p> </li> <li id="fn:71"> <p>plg-hdtv-moidom.c012 · code · unknown; прошивка — · json_fetch добавляет cookie к URL через ? или & (для islogin=0), запрашивает документ HD::http_get_document и разбирает его simplexml_load_string; при наличии error в XML бросает MoiDom_Exception с code/message. <a class="footnote-backref" href="#fnref:71" title="Jump back to footnote 71 in the text">↩</a></p> </li> <li id="fn:72"> <p>plg-hdtv-duneplexcatalog.c036 · code · unknown; прошивка — · PL::get_xml получает XML из кэша по cache_name или скачивает его, ожидает корневой узел MediaContainer (имя можно переопределить), при несовпадении бросает Invalid XML document и кэширует ответ по имени cache_name. <a class="footnote-backref" href="#fnref:72" title="Jump back to footnote 72 in the text">↩</a></p> </li> <li id="fn:73"> <p>plg-dc-torrent-center.c082 · code · unknown; прошивка — · torrserverActionGet перед json_decode переписывает в строки числовые значения после ключа из символов слова перед запятой, а отдельным выражением — значения length. <a class="footnote-backref" href="#fnref:73" title="Jump back to footnote 73 in the text">↩</a></p> </li> <li id="fn:74"> <p>plg-hdtv-remtor.c114 · code · unknown; прошивка — · При hack_big_int TransmissionRPC переписывает регулярным выражением целые числа JSON (значения вида "key":123) в строки, чтобы большие размеры не теряли точность. <a class="footnote-backref" href="#fnref:74" title="Jump back to footnote 74 in the text">↩</a></p> </li> <li id="fn:75"> <p>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-строки. <a class="footnote-backref" href="#fnref:75" title="Jump back to footnote 75 in the text">↩</a></p> </li> <li id="fn:76"> <ul> <li>plg-dc-widget-ext--adv-keyboard.c051 · code · unknown; прошивка — · YoutubeSuggestionsProvider по умолчанию использует country = ru и lang = ru и запрашивает HTTP suggestqueries.google.com с client=toolbar, hl, gl, ds=yt и rawurlencode(query).</li> <li>plg-dc-widget-ext--adv-keyboard.c052 · code · unknown; прошивка — · YoutubeSuggestionsProvider выделяет строки подсказок через explode по <suggestion data=" и mb_strstr до "/>; getSearchText возвращает строку без изменений.</li> </ul> <p><a class="footnote-backref" href="#fnref:76" title="Jump back to footnote 76 in the text">↩</a></p> </li> <li id="fn:77"> <p>plg-hdtv-altsource.c082 · code · unknown; прошивка — · Заголовки серий перед показом очищаются HD::get_repl_mips_bug: перечисленные в $repl emoji, обратный слэш и полноширинные ASCII-символы заменяются на *, а символы вне \pL\pN\pP\pS\pZ и NBSP — на пробел. <a class="footnote-backref" href="#fnref:77" title="Jump back to footnote 77 in the text">↩</a></p> </li> <li id="fn:78"> <p>plg-hdtv-megaanime.c027 · code · unknown; прошивка — · Прокси настраивается полями proxy, proxy_akk (логин:пароль), curlopt_proxytype (CURLPROXY_HTTP/CURLPROXY_SOCKS5) и site_proxytype: 0 не использовать, 1 для vk.com/mail.ru/ok.ru/videoembed, 2 для сайтов из proxy_site, 3 включается из popup конкретного источника. HD::http_get_document при непустом proxy, site_proxytype 1 или 2 и отсутствии CURLOPT_PROXY в opts ставит CURLOPT_PROXY, для CURLPROXY_SOCKS5 — тип, при proxy_akk — логин; для site_proxytype 2 URL с link_api, iframe, m3u8, assets, manifests, 8090/torrent/add и 9000/torrents прокси не получают. <a class="footnote-backref" href="#fnref:78" title="Jump back to footnote 78 in the text">↩</a></p> </li> <li id="fn:79"> <ul> <li>plg-hdtv-smart-vod.c133 · code · unknown; прошивка — · В CGI-копии HD::http_get_document эталона при непустом proxy и ((site_proxytype=0 и URL не содержит kinopoisk) либо (site_proxytype=1 и URL содержит kinopoisk) либо (site_proxytype=2 и URL содержит kinopoisk или yandex)) задаётся CURLOPT_PROXY; внутри этой ветки SOCKS5 включается при curlopt_proxytype=CURLPROXY_SOCKS5, а непустой proxy_akk передаётся в CURLOPT_PROXYUSERPWD.</li> <li>plg-hdtv-smart-vod.c350 · code · unknown; прошивка — · Копия lib/utils.php Vimeo в HD::http_get_document при непустом HD::get_item('proxy'), URL без googleapis/zona/myshows и условиях site_proxytype=0 без kinopoisk, site_proxytype=1 с kinopoisk без getmovie/googleusercontent либо site_proxytype=2 с kinopoisk без getmovie/googleusercontent задаёт CURLOPT_PROXY, SOCKS5 при curlopt_proxytype=CURLPROXY_SOCKS5 и CURLOPT_PROXYUSERPWD при непустом proxy_akk.</li> </ul> <p><a class="footnote-backref" href="#fnref:79" title="Jump back to footnote 79 in the text">↩</a></p> </li> <li id="fn:80"> <p>plg-dc-dunemdb-supplier-movies-eng.c034 · code · unknown; прошивка — · Перед get_episodes плагин читает <data_dir>/tvdb_proxy.txt и, если файл есть, кладёт его содержимое в HTTP_PROXY. <a class="footnote-backref" href="#fnref:80" title="Jump back to footnote 80 in the text">↩</a></p> </li> <li id="fn:81"> <ul> <li>plg-hdtv-megaradio.c054 · code · unknown; прошивка — · При непустом http_proxy в www/cgi-bin/proxy действие do_proxy_streams переключает отметку channel_id в HD::get_items('proxy_streams'), а get_radio_stream для отмеченного канала возвращает URL вида http://127.0.0.1/cgi-bin/plugins/MegaRadio/proxy?<поток>.</li> <li>plg-hdtv-megaradio.c125 · code · unknown; прошивка — · CGI-скрипт proxy задаёт http_proxy = http://144.217.48.75:3128, отдаёт Content-type audio/mpeg и передаёт QUERY_STRING в wget -c -q -O-.</li> </ul> <p><a class="footnote-backref" href="#fnref:81" title="Jump back to footnote 81 in the text">↩</a></p> </li> <li id="fn:82"> <p>plg-hdtv-folder-cache-vod.c055 · code · unknown; прошивка — · gozlan обращается к gozlan.eu через CGI-прокси anonymouse.org: этот префикс зашит в HOST_API_URL и во все основные URL плагина. <a class="footnote-backref" href="#fnref:82" title="Jump back to footnote 82 in the text">↩</a></p> </li> <li id="fn:83"> <ul> <li>plg-hdtv-smart-vod.c153 · code · unknown; прошивка — · В mosfilm HOST_API_URL берётся из непустого сохранённого domen, иначе равен https://mosfilm.ru.</li> <li>plg-hdtv-smart-vod.c237 · code · unknown; прошивка — · FilmHD1080.Net при отсутствии сохранённого domen берёт http://bot.filmhd1080.one; если ответ содержит заголовок Location, сохраняет его без завершающего слэша в domen и использует как базовый адрес.</li> <li>plg-hdtv-smart-vod.c155 · code · unknown; прошивка — · HDrezka при ещё не определённом HOST_API_URL читает hdrezka_mirror.php; при пустом ответе задаёт http://hdrezka720dhh.org, иначе использует ответ.</li> </ul> <p><a class="footnote-backref" href="#fnref:83" title="Jump back to footnote 83 in the text">↩</a></p> </li> <li id="fn:84"> <p>plg-dc-bazinga3.c034 · code · unknown; прошивка — · Домен поставщика задаётся настройкой <cName>DomainName, а при её отсутствии — константой в коде (Filmix — https://filmix.ac, Rezka — https://rezka.ag, Rutracker — https://rutracker.org, Kinozal — http://kinozal.tv). <a class="footnote-backref" href="#fnref:84" title="Jump back to footnote 84 in the text">↩</a></p> </li> <li id="fn:85"> <ul> <li>plg-hdtv-zlostnyi-iptv.c087 · code · unknown; прошивка — · Подсемейство endpoints.json (antifriz, cbilling, glanz): конструктор плагина вызывает <Класс>Config::loadEndpointsConfig(), который скачивает http://zlostnyi.tech/dune/<каталог>/endpoints.json и заполняет домены api и playlist для регионов world, ru и kz.</li> <li>plg-hdtv-zlostnyi-iptv.c089 · code · unknown; прошивка — · antifriz показывает combobox region «Выбор региона»: world «Все, кроме РФ и KZ», ru «Россия», kz «Казахстан» (по умолчанию world); по региону выбираются домен API и домен плейлиста.</li> </ul> <p><a class="footnote-backref" href="#fnref:85" title="Jump back to footnote 85 in the text">↩</a></p> </li> <li id="fn:86"> <ul> <li>plg-hdtv-zlostnyi-iptv.c032 · code · unknown; прошивка — · При наличии token BcuM3uTv скачивает с http://zlostnyi.tech/dune/bcu/playlist шаблон адреса плейлиста провайдера и подставляет token вместо «-token-»; затем HD::check_token(trim(...)) скачивает сам плейлист.</li> <li>plg-hdtv-zlostnyi-iptv.c083 · code · unknown; прошивка — · fox требует логин и пароль: диалог ключа содержит text_field current_pass, обработчик сохраняет cookie pass, а в шаблоне плейлиста dune/fox/playlist1 кроме «-token-» заменяется «-pass-».</li> <li>plg-hdtv-zlostnyi-iptv.c090 · code · unknown; прошивка — · antifriz: шаблон плейлиста — домен плейлиста региона с заменой «-token-» на token и «--dev--» на cookie dev (по умолчанию '1'); ошибка — «Ключ для плейлиста введён неправильно»; ключ вводится в поле current_pcode «Ключ для плейлиста».</li> <li>plg-hdtv-zlostnyi-iptv.c142 · code · unknown; прошивка — · ottclub при cookie ott_key, отличном от '0' (по умолчанию '0'), авторизуется по ОТТ-ключу: настройка пишет current_pcode в cookie ott_key, шаблон http://zlostnyi.tech/dune/i-ghost/playlist подставляет «-ott_key-» и «--dev--» (cookie dev, по умолчанию 1), а полученный адрес скачивается через HD::check_token; при ott_key = '0' показывается группа-заглушка «ОТТ Ключ не найден».</li> <li>plg-hdtv-zlostnyi-iptv.c143 · code · unknown; прошивка — · shura авторизуется по ОТТ-ключу и номеру сервера: шаблон http://zlostnyi.tech/dune/shura/playlist получает замены «-token-» → cookie ott_key и «-srv-» → cookie country_server (combobox Server #1/#2, по умолчанию 1), затем адрес скачивается через HD::check_token.</li> <li>plg-hdtv-zlostnyi-iptv.c144 · code · unknown; прошивка — · shara-club при cookie token, отличном от '0' (по умолчанию '0'), авторизуется логином и паролем: настройка пишет current_token/current_pass в cookie token/pass, шаблон dune/shara/playlist_1 получает замены «-token-» и «-pass-», а при ответе «nottoken» или пустом ответе плагин повторяет запрос к dune/shara/playlist_2; при token = '0' показывается группа-заглушка.</li> </ul> <p><a class="footnote-backref" href="#fnref:86" title="Jump back to footnote 86 in the text">↩</a></p> </li> <li id="fn:87"> <p>plg-hdtv-megaradio.c116 · code · unknown; прошивка — · proxy_settings читает www/cgi-bin/proxy, разбирает http_proxy, но затем безусловно перезаписывает логин/пароль строкой «Login:Password»; do_proxy_action перезаписывает строку http_proxy в этом файле, а proxy_search парсит free-proxy.cz и проверяет прокси запросом к shoutcast.com. <a class="footnote-backref" href="#fnref:87" title="Jump back to footnote 87 in the text">↩</a></p> </li> <li id="fn:88"> <p>plg-hdtv-polsky-tv.c014 · code · unknown; прошивка — · PtvSession задаёт адрес статистики по умолчанию https://service.syncdata24.net/api/json/stats; переопределение читается сначала из /config/ktv_stats_url.txt, затем из /firmware/config/ktv_stats_url.txt. <a class="footnote-backref" href="#fnref:88" title="Jump back to footnote 88 in the text">↩</a></p> </li> <li id="fn:89"> <p>plg-hdtv-smart-vod--link-api.c028 · code · unknown; прошивка — · zonaMobi::getRCPC получает cookie: при отсутствии /tmp/zonaRCPC запрашивает https://w124.zona.plus (или домен ZonaPlus_Class), извлекает toNumbers("...") и просит http://dune-club.info/tts2?a=...&b=...&c=..., сохраняя ответ в /tmp/zonaRCPC. <a class="footnote-backref" href="#fnref:89" title="Jump back to footnote 89 in the text">↩</a></p> </li> <li id="fn:90"> <ul> <li>plg-hdtv-folder-cache-vod.c033 · code · unknown; прошивка — · В пяти пакетах (ForumHouseTV, Stopham, SexyFilmWorld, YoutubeMetal, kinokrit) youtube_api.php использует gdata.youtube.com и ключ YOUTUBE_DEV_KEY, а при наличии &s= декодирует подпись запросом к http://dune-club.info/echo?message=<s>.</li> <li>plg-hdtv-folder-cache-vod.c034 · code · unknown; прошивка — · В gozlan, kinolist, seretil и veterok youtube_api.php не обращается к dune-club.info: подпись переименовывается из &sig= в &signature=, а прямой URL получает префикс http://mp4://.</li> </ul> <p><a class="footnote-backref" href="#fnref:90" title="Jump back to footnote 90 in the text">↩</a></p> </li> <li id="fn:91"> <p>plg-gh-rpervykh-dune-plugin-anidub-com.c120 · code · unknown; прошивка — · Youtube::retrieve_playback_url разбирает ytplayer.config, поле url_encoded_fmt_stream_map, оставляет itag 18/22/37/38, меняет sig= на signature=, при параметре &s= запрашивает подпись через http://dune-club.info/echo?message=<s>; если ytplayer.config не найден, возвращает http://groo.pp.ua/1.mp4. <a class="footnote-backref" href="#fnref:91" title="Jump back to footnote 91 in the text">↩</a></p> </li> <li id="fn:92"> <p>plg-hdtv-101-ru.c091 · code · unknown; прошивка — · Канал DI.FM строится из полей channels[] JSON: id, key (streaming_url), name, description; img — прокси http://dune-club.info/plugins/update/_s/gif2jpg.php?url=http:<asset_url>?size=250x250, images_compact — 'http:' + images->compact + '?size=250x250'. <a class="footnote-backref" href="#fnref:92" title="Jump back to footnote 92 in the text">↩</a></p> </li> <li id="fn:93"> <p>plg-hdtv-freetv.c064 · code · unknown; прошивка — · Страна определяется из <code>$FS_PREFIX/tmp/location_info.properties</code> (поле country_code_3); если пусто, делается запрос <code>https://ifconfig.co/json</code> через CGI img.sh, коды RU/UA/BY превращаются в RUS/UKR/BLR. <a class="footnote-backref" href="#fnref:93" title="Jump back to footnote 93 in the text">↩</a></p> </li> <li id="fn:94"> <ul> <li>plg-dc-screenshoter.c061 · code · unknown; прошивка — · HD::get_ip_address_wo_port() берёт первый не-127.0.0.1 адрес из вывода <code>ifconfig</code> (шаблон «inet addr:»); get_ip_address() добавляет :$HD_HTTP_LOCAL_PORT, если порт не 80</li> <li>plg-dc-screenshoter.c069 · code · unknown; прошивка — · В режиме IR-кода скриншот делается запросом http://<ip>/cgi-bin/do?cmd=ir_code&ir_code=ef10bf00; путь файла плагин не знает и возвращает screenPath = auto</li> </ul> <p><a class="footnote-backref" href="#fnref:94" title="Jump back to footnote 94 in the text">↩</a></p> </li> <li id="fn:95"> <p>plg-dc-dune-backup.c124 · code · unknown; прошивка — · Строку <no_choice> в списке #<choice> плагин блокирует, отправляя локальные IR-коды через http://127.0.0.1<:11080 при flag_apk>/cgi-bin/do?cmd=ir_code&ir_code=…: AF50BF00 и EB14BF00 при выборе, EA15BF00 и EB14BF00 при подтверждении. <a class="footnote-backref" href="#fnref:95" title="Jump back to footnote 95 in the text">↩</a></p> </li> <li id="fn:96"> <ul> <li>plg-gh-infinitygp-dune-jellyfin-bridge.c022 · code · android-dune-fw; прошивка — · DuneStatusClient обращается к локальному IP Control по базовому URL http://127.0.0.1/cgi-bin/do?; статус запрашивает строкой cmd=status&result_syntax=json, таймауты соединения и чтения — 2000 мс, размер ответа ограничен 65 536 символами (MAX_RESPONSE_CHARS).</li> <li>plg-gh-infinitygp-dune-jellyfin-bridge.c023 · code · android-dune-fw; прошивка — · request выполняет GET с заголовком Accept: application/json и без кеша, требует HTTP 200, читает тело в UTF-8; при теле больше 65 536 символов или невалидном JSON бросает IOException, а в finally разрывает соединение.</li> </ul> <p><a class="footnote-backref" href="#fnref:96" title="Jump back to footnote 96 in the text">↩</a></p> </li> <li id="fn:97"> <p>plg-gh-ytkachov-dune-hd-watch-sync.c046 · code · unknown; прошивка — · dunesync.player.Player.status делает GET http://<ip>/cgi-bin/do?cmd=status с таймаутом 5 с, разбирает параметры регуляркой name="…" value="…" и при любой ошибке возвращает пустой словарь. <a class="footnote-backref" href="#fnref:97" title="Jump back to footnote 97 in the text">↩</a></p> </li> <li id="fn:98"> <p>plg-gh-infinitygp-dune-jellyfin-bridge.c024 · code · android-dune-fw; прошивка — · seekToSeconds отвергает отрицательную позицию IllegalArgumentException, отправляет cmd=set_playback_state&position=<секунды>&timeout=1&result_syntax=json и считает команду принятой при command_status ok или timeout, иначе бросает IOException. <a class="footnote-backref" href="#fnref:98" title="Jump back to footnote 98 in the text">↩</a></p> </li> <li id="fn:99"> <ul> <li>plg-hdtv-utility-family.c100 · code · unknown; прошивка — · SleepWake ставит таймер выключения строкой в /tmp/cron/crontabs/root: «<мин> <час> <день> <месяц> <день недели> wget --quiet -O - "http://127.0.0.1/cgi-bin/do?cmd=standby"» между маркерами «#<em>#</em># Выключение в: …» и «#-#-#» (старая запись заменяется), chmod 0575 и shell_exec('crontab -e').</li> <li>plg-hdtv-utility-family.c104 · code · unknown; прошивка — · Сброс таймеров SleepWake (cleer_sleep) перезаписывает /tmp/cron/crontabs/root двумя строками «5 5 * * * //firmware/scripts/run_ntpclient.sh /» и «10 * * * * /firmware/scripts/run_widget.sh» — остальные записи crontab root теряются.</li> </ul> <p><a class="footnote-backref" href="#fnref:99" title="Jump back to footnote 99 in the text">↩</a></p> </li> <li id="fn:100"> <ul> <li>plg-dc-dune-backup.c053 · code · unknown; прошивка — · Смонтировать сетевую папку плагин просит у network_manager через файлы /tmp/run/ipc__network_manager: пишет команду mount.<pid>-<n>.cmd с парами ключ = значение, через 2 с удаляет ответный .res, если он появился, и до 5 раз повторяет запрос, пока в network_mount_list.xml не появится смонтированный путь.</li> <li>plg-dc-dune-backup.c054 · code · unknown; прошивка — · load_network_mounts читает <FS_PREFIX>/tmp/run/network_mount_list.xml и оставляет только mount с type smb|nfs и status mounted|mounting, извлекая path, server, dir, user_name, password, proto и mount_tm.</li> </ul> <p><a class="footnote-backref" href="#fnref:100" title="Jump back to footnote 100 in the text">↩</a></p> </li> <li id="fn:101"> <p>plg-hdtv-altsource.c024 · code · unknown; прошивка — · Для подключения сетевой папки FileList::write_request сначала ищет в /tmp/run/network_mount_list.xml среди smb/nfs-монтирований со статусом mounted или mounting папку с теми же server и dir и возвращает её path; иначе публикует файл /tmp/run/ipc__network_manager/mount.<pid>-<id>.cmd через временный файл и rename, ждёт sleep(1), читает .res и ищет в network_mount_list.xml mount с тем же id и типом, возвращая его path. <a class="footnote-backref" href="#fnref:101" title="Jump back to footnote 101 in the text">↩</a></p> </li> <li id="fn:102"> <p>plg-dc-dune-backup.c055 · code · unknown; прошивка — · load_network_folders разбирает <FS_PREFIX>/config/network_folders.properties: type 0 — smb, 1 — nfs; protocol 0 — udp, 1 — tcp; поле directory переименовывается в dir, protocol — в proto. <a class="footnote-backref" href="#fnref:102" title="Jump back to footnote 102 in the text">↩</a></p> </li> <li id="fn:103"> <p>plg-hdtv-altsource.c023 · code · unknown; прошивка — · Сохранённые сетевые папки плагин читает из /config/network_folders.properties: type 0 — smb, 1 — nfs; protocol 0 — udp, 1 — tcp; ключи directory и protocol сохраняются как dir и proto. <a class="footnote-backref" href="#fnref:103" title="Jump back to footnote 103 in the text">↩</a></p> </li> <li id="fn:104"> <p>plg-dc-torrent-center.c145 · code · unknown; прошивка — · SmartConfig читает накопители из /tmp/run/storage_list.xml, а сохранённые сетевые папки — из /config/network_folders.properties. <a class="footnote-backref" href="#fnref:104" title="Jump back to footnote 104 in the text">↩</a><a class="footnote-backref" href="#fnref2:104" title="Jump back to footnote 104 in the text">↩</a></p> </li> <li id="fn:105"> <p>plg-dune-remote-control.c042 · code · unknown; прошивка — · Команда sources собирает список из трёх источников: статического Network Browser (type network_browser), папок из /mnt/config/network_folders.properties (type network_folder) и всех каталогов /tmp/mnt/storage (type usb_storage, независимо от носителя). <a class="footnote-backref" href="#fnref:105" title="Jump back to footnote 105 in the text">↩</a></p> </li> <li id="fn:106"> <p>plg-dune-remote-control.c045 · code · unknown; прошивка — · smbtree запускает /tango/firmware/bin/smbtree через proc_open с cwd=/tmp и LD_LIBRARY_PATH=/tango/firmware/lib, добавляет -N (если no_pass) и --debuglevel, передаёт аргумент режима и разбирает stdout по строкам: до табуляции — name, после — comment. <a class="footnote-backref" href="#fnref:106" title="Jump back to footnote 106 in the text">↩</a></p> </li> <li id="fn:107"> <ul> <li>plg-dc-torrent-center.c133 · code · unknown; прошивка — · SmartFileSystemScreen использует shell test -d вместо is_dir для SMB-пути, если get_bug_platform_kind отмечает 8672, 8673 или 8758.</li> <li>plg-dc-torrent-center.c134 · code · unknown; прошивка — · SmartConfig::smart_is_dir при is_smb=true проверяет каталог через opendir/closedir вместо is_dir.</li> </ul> <p><a class="footnote-backref" href="#fnref:107" title="Jump back to footnote 107 in the text">↩</a></p> </li> <li id="fn:108"> <p>plg-hdtv-altsource.c068 · code · unknown; прошивка — · Логины и пароли сетевых папок и myShows плагин хранит в DATA в зашифрованном виде через HD::eney: base64 от строки, сдвинутой на байты ключа 24bbf7520df55afa88a18ff3e61e326f; обратное преобразование — HD::eney('l'|'p', ...). <a class="footnote-backref" href="#fnref:108" title="Jump back to footnote 108 in the text">↩</a></p> </li> <li id="fn:109"> <p>plg-hdtv-duneplexcatalog.c041 · code · unknown; прошивка — · PL::register_pleer отправляет по UDP на 239.0.0.250:32413 пять сообщений HELLO * HTTP/1.0 с Content-Type plex/media-player, Resource-Identifier из серийного номера, Device-Class HTPC, Name DPC (<product_id>), Port 3005, Product DunePlexCatalog и Protocol-Capabilities navigation,playback. <a class="footnote-backref" href="#fnref:109" title="Jump back to footnote 109 in the text">↩</a></p> </li> <li id="fn:110"> <p>plg-hdtv-dlna-renderer.c011 · code · unknown; прошивка — · Start выбирает сетевой интерфейс для UPnP: если /firmware_ext/wifi/wifi_ap/run.sh check завершился успешно, UPNP_IF=wlan0, иначе UPNP_IF=eth0. <a class="footnote-backref" href="#fnref:110" title="Jump back to footnote 110 in the text">↩</a></p> </li> <li id="fn:111"> <p>plg-gh-ytkachov-dune-hd-watch-sync.c063 · forum · Solo 8K, Pro 8K Plus, android-dune-fw; прошивка 250815_1012_r22 · Плеер надёжно опознаётся по netbios name из etc/samba/smb.conf; в эксперименте комнаты были перепутаны, и три визуальные проверки подряд ушли не на тот плеер. <a class="footnote-backref" href="#fnref:111" title="Jump back to footnote 111 in the text">↩</a></p> </li> <li id="fn:112"> <p>plg-gh-vladikshkwok-lampa-dune-plugins.c040 · code · android; прошивка — · api.php принимает POST только с адресов 127.0.0.1, ::1, [::1], ::ffff:127.0.0.1 или [::ffff:127.0.0.1]; POST без REMOTE_ADDR или с других адресов, а также прочие методы, кроме GET, получают 403 local_requests_only; GET до этой проверки отдаёт сведения о плагине. <a class="footnote-backref" href="#fnref:112" title="Jump back to footnote 112 in the text">↩</a></p> </li> <li id="fn:113"> <ul> <li>plg-gh-vladikshkwok-lampa-dune-plugins.c041 · code · android; прошивка — · api.php читает из php://input не более 262145 байт и отвергает тело длиннее 262144 байт исключением payload_too_large.</li> <li>plg-gh-vladikshkwok-lampa-dune-plugins.c027 · code · android; прошивка — · LampaDuneBridge::normalize() требует от 1 до 250 элементов items, у каждого — допустимый URL, и индекс в диапазоне 0…count(items)-1.</li> <li>plg-gh-vladikshkwok-lampa-dune-plugins.c028 · code · android; прошивка — · LampaDuneBridge::normalize() принимает position числом от 0 до 604800 (7 суток) и в остальных случаях бросает invalid_position.</li> <li>plg-gh-vladikshkwok-lampa-dune-plugins.c029 · code · android; прошивка — · LampaDuneBridge::normalize() ограничивает title и name 512 байтами UTF-8, а description — 16000.</li> <li>plg-gh-vladikshkwok-lampa-dune-plugins.c025 · code · android; прошивка — · LampaDuneBridge::url() принимает только строки http/https с непустым host, длиной до 16384 байт и без символов с кодом 0x00–0x20.</li> <li>plg-gh-vladikshkwok-lampa-dune-plugins.c026 · code · android; прошивка — · LampaDuneBridge::text() удаляет управляющие символы C0, кроме табуляции, LF и CR, и обрезает строку до заданного предела в байтах UTF-8.</li> </ul> <p><a class="footnote-backref" href="#fnref:113" title="Jump back to footnote 113 in the text">↩</a></p> </li> <li id="fn:114"> <ul> <li>plg-gh-vladikshkwok-lampa-dune-plugins.c112 · code · android; прошивка — · CGI api.php отдаёт ответы с Content-Type application/json; charset=utf-8 и Cache-Control: no-store.</li> <li>plg-gh-vladikshkwok-lampa-dune-plugins.c043 · code · android; прошивка — · При исключении api.php отвечает 400 Bad Request и JSON с текстом ошибки в поле error.</li> </ul> <p><a class="footnote-backref" href="#fnref:114" title="Jump back to footnote 114 in the text">↩</a></p> </li> <li id="fn:115"> <p>plg-gh-vladikshkwok-lampa-dune-plugins.c039 · code · android; прошивка — · На GET CGI api.php отвечает JSON с полями plugin=lampa_dune_bridge, version=1.0.1 и protocol=1. <a class="footnote-backref" href="#fnref:115" title="Jump back to footnote 115 in the text">↩</a></p> </li> <li id="fn:116"> <p>plg-hdtv-web-launchers.c044 · code · unknown; прошивка — · www/cgi-bin/do.php stream читает forward_proxy из etc/proxy.conf (иначе localhost), строит URL из PATH_INFO и QUERY_STRING, пересылает GET/POST через curl с cookie-jar в /flashdata/plugins_data/StreamRu, отключает проверку TLS (VERIFYHOST=0, VERIFYPEER=0), ставит Access-Control-Allow-Origin: * и пишет отладочный лог в /D/streamru-proxy<time>.log. <a class="footnote-backref" href="#fnref:116" title="Jump back to footnote 116 in the text">↩</a></p> </li> <li id="fn:117"> <p>plg-hdtv-surface-family.c119 · forum · unknown; прошивка — · В первых постах тем SomaFM (p356125, TrippyCat, 2016-05-23) и Radiopotok.ru (p457671, TrippyCat, 2019-09-30) автор пишет, что функции стандартные и что стримы можно запускать через IP-доступ по адресу http://ip плеера/cgi-bin/plugins/<name>/do без включения ТВ. <a class="footnote-backref" href="#fnref:117" title="Jump back to footnote 117 in the text">↩</a></p> </li> <li id="fn:118"> <ul> <li>plg-hdtv-evolutiontv.c020 · code · unknown; прошивка — · get_tv_stream_url оборачивает URL: http://ts://, http://ts//, http://mp4://, http://mp4// и https-варианты не меняются; URL с префиксом rtmp:// проходит str_ireplace, который заменяет rtmp://, rtmpt://, rtmpe:// и rtmpte:// на http://ts://127.0.0.1:81/cgi-bin/rtmp.sh?-r <схема>://; rtsp — через rtsp.sh, f4m — hds.sh, m3u9 — hls.sh, flv/mp3/avi/akacast/<em>mp3</em> — flv.sh, остальной http:// — http://ts://.</li> <li>plg-hdtv-evolutiontv.c025 · code · unknown; прошивка — · install-скрипт, если codecpack не установлен, version.txt не читается или серверная версия больше, скачивает codecpack.zip wget-ом, распаковывает unzip в /tmp, выбирает каталог установки /persistfs, иначе /flashdata по условию [[! -d /D] && [-d /flashdata]] (записано с ошибкой синтаксиса), иначе /D, перемещает codecpack в каталог, делает исполняемыми bin/, WWW/cgi-bin/ и script/, при неисполняемом /config/boot/rtmpboot.sh дописывает в него запуск httpd -h <dest>/codecpack/WWW -p 81 и запускает httpd.</li> </ul> <p><a class="footnote-backref" href="#fnref:118" title="Jump back to footnote 118 in the text">↩</a></p> </li> <li id="fn:119"> <p>plg-hdtv-folder-cache-vod.c049 · code · unknown; прошивка — · Прямые mp4-URL плагины отдают с префиксом http://mp4://, flv — через локальный CGI http://ts://127.0.0.1:81/cgi-bin/flv.sh?, mail.ru — через mail_ru.sh; kinostok при строке с « or » случайно выбирает один из двух URL. <a class="footnote-backref" href="#fnref:119" title="Jump back to footnote 119 in the text">↩</a><a class="footnote-backref" href="#fnref2:119" title="Jump back to footnote 119 in the text">↩</a></p> </li> <li id="fn:120"> <p>plg-hdtv-evolutiontv.c021 · code · unknown; прошивка — · Для UDP-потоков при use_proxy=yes get_tv_stream_url заменяет udp://@ на http://ts://<proxy_ip>:<proxy_port>/udp/. <a class="footnote-backref" href="#fnref:120" title="Jump back to footnote 120 in the text">↩</a></p> </li> <li id="fn:121"> <p>plg-dc-dunemdb-supplier-movies-eng.c060 · code · unknown; прошивка — · __url_prepare оставляет .m3u8 без изменений, а для http:// и https:// собирает «<scheme>mp4://<остаток>|||dune_params|||http_mp4_allow_other_formats:1». <a class="footnote-backref" href="#fnref:121" title="Jump back to footnote 121 in the text">↩</a></p> </li> <li id="fn:122"> <p>plg-hdtv-101-ru.c063 · code · unknown; прошивка — · link.php собирает поток как 'http://audio_stream://' + host + ':8000' + path; в ветке персонального канала query не добавляется, в ветке обычного канала добавляется '?' + query. <a class="footnote-backref" href="#fnref:122" title="Jump back to footnote 122 in the text">↩</a></p> </li> <li id="fn:123"> <p>doc-sdk-plugins.c056 · doc · any-documented; прошивка — · Каждый метод DunePlugin получает по ссылке &$plugin_cookies (Map: Key -> Value, [inout]) <a class="footnote-backref" href="#fnref:123" title="Jump back to footnote 123 in the text">↩</a><a class="footnote-backref" href="#fnref2:123" title="Jump back to footnote 123 in the text">↩</a></p> </li> <li id="fn:124"> <p>doc-sdk-plugins.c058 · doc · any-documented; прошивка — · Результат операции — PluginOutputData с полями has_data, data_type, data, plugin_cookies, is_error, error_action; при ошибке is_error = true и может быть задано error_action <a class="footnote-backref" href="#fnref:124" title="Jump back to footnote 124 in the text">↩</a></p> </li> <li id="fn:125"> <p>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 <a class="footnote-backref" href="#fnref:125" title="Jump back to footnote 125 in the text">↩</a><a class="footnote-backref" href="#fnref2:125" title="Jump back to footnote 125 in the text">↩</a></p> </li> <li id="fn:126"> <p>doc-sdk-plugins.c065 · doc · any-documented; прошивка — · tmp_dir_path — каталог под /tmp для временных данных плагина; Dune GUI гарантирует его существование <a class="footnote-backref" href="#fnref:126" title="Jump back to footnote 126 in the text">↩</a></p> </li> <li id="fn:127"> <p>doc-sdk-plugins.c066 · doc · any-documented; прошивка — · data_dir_path (постоянные данные) недоступен на устройствах без System Storage и Flash Memory Storage — тогда ключ не задан <a class="footnote-backref" href="#fnref:127" title="Jump back to footnote 127 in the text">↩</a><a class="footnote-backref" href="#fnref2:127" title="Jump back to footnote 127 in the text">↩</a></p> </li> <li id="fn:128"> <p>plg-dc-widget-ext.c020 · code · unknown; прошивка — · Экран настроек строится как папка вида PLUGIN_FOLDER_VIEW_CONTROLS: PluginControlsFolderView::defs и initial_sel_ndx = -1 <a class="footnote-backref" href="#fnref:128" title="Jump back to footnote 128 in the text">↩</a></p> </li> <li id="fn:129"> <p>plg-gh-aspel-twitch-dune-plugin.c034 · code · unknown; прошивка — · get_setup_folder_view возвращает PluginFolderView с view_kind = PLUGIN_FOLDER_VIEW_CONTROLS, multiple_views_supported = false, archive = null и data из defs и initial_sel_ndx = -1. <a class="footnote-backref" href="#fnref:129" title="Jump back to footnote 129 in the text">↩</a></p> </li> <li id="fn:130"> <p>plg-dc-screenshoter.c037 · code · unknown; прошивка — · SmartSetupScreen (ID = setup) наследует AbstractControlsScreen <a class="footnote-backref" href="#fnref:130" title="Jump back to footnote 130 in the text">↩</a></p> </li> <li id="fn:131"> <p>plg-hdtv-zlostnyi-iptv.c062 · code · unknown; прошивка — · BcuSetupScreen (AbstractControlsScreen, ID setup) показывает: кнопку edit_token «Активировать просмотр», combobox buffering_time (500…50000 мс), combobox epg_font_size (NORMAL/SMALL), кнопку pass_dialog «Пароль для взрослых каналов» и кнопку-подпись автора; выбор формата потока и сервера закомментирован. <a class="footnote-backref" href="#fnref:131" title="Jump back to footnote 131 in the text">↩</a></p> </li> <li id="fn:132"> <p>plg-gh-mikhail-ilin-dune-plugin-weburgtv.c073 · code · unknown; прошивка — · WeburgTVSetupScreen extends AbstractControlsScreen с ID «setup»; do_get_control_defs возвращает null — переменная $defs не инициализирована, потому что весь код контролов находится в блоке комментария. <a class="footnote-backref" href="#fnref:132" title="Jump back to footnote 132 in the text">↩</a></p> </li> <li id="fn:133"> <p>plg-hdtv-altsource.c047 · code · unknown; прошивка — · Экран настроек предлагает: папку DATA (выгрузить/загрузить/очистить), настройки оформления, настройки поиска, тему оформления (загрузить/выгрузить/очистить/ выгрузить по умолчанию), PIN родительского контроля, прокси для Kinopoisk и логин myShows; для скина alt:Silver добавляется кнопка исправления цветов. <a class="footnote-backref" href="#fnref:133" title="Jump back to footnote 133 in the text">↩</a></p> </li> <li id="fn:134"> <p>plg-hdtv-jurt.c028 · code · unknown; прошивка — · Экран настроек показывает версию 1.0.1 (релиз 01.11.2014), логин, кнопку «Редактировать...», информацию для клиентов, combobox буферизации (0…15000 мс), выбор показа на главном экране (auto/yes/no) и кнопку «мягкой» перезагрузки. <a class="footnote-backref" href="#fnref:134" title="Jump back to footnote 134 in the text">↩</a></p> </li> <li id="fn:135"> <p>plg-hdtv-surface-family.c044 · code · unknown; прошивка — · Экран настроек rmfon.pl (DemoSetupScreen) читает bg_path и mode_path как файлы в data_dir_path (по умолчанию yes и mosaic), показывает версию из dune_plugin.xml, IP-адрес http://<ip>/cgi-bin/plugins/<name>/do и сохраняет настройки прямым fopen/fwrite в те же файлы; переключатель show_tv пишет cookie show_tv. <a class="footnote-backref" href="#fnref:135" title="Jump back to footnote 135 in the text">↩</a></p> </li> <li id="fn:136"> <p>plg-hdtv-megaradio.c114 · code · unknown; прошивка — · Экран настроек показывает путь DATA, путь закачки dload_dir_path, переключатель use_osk, кнопки additional_settings, pin_dialog, QR-код веб-интерфейса, режим mode_path (mosaic/compact) и кнопку difm_login. <a class="footnote-backref" href="#fnref:136" title="Jump back to footnote 136 in the text">↩</a></p> </li> <li id="fn:137"> <p>plg-hdtv-smart-apps.c100 · code · unknown; прошивка — · Setup Wallpaper показывает папку DATA и кнопку data_dialog, в диалоге которой — export_data, import_data и clear_data; также показывает dload_path, выбор use_wll, use_osk, поле abyss_api_key и pin_dialog. <a class="footnote-backref" href="#fnref:137" title="Jump back to footnote 137 in the text">↩</a></p> </li> <li id="fn:138"> <ul> <li>plg-dc-widget-ext--adv-keyboard.c063 · code · unknown; прошивка — · Диалог настроек клавиатуры задаёт ширину 1100 и close_by_return = false; RETURN переназначен на close_dialog с флагом close_config_dialog_kbrd_q21.</li> <li>plg-dc-widget-ext--adv-keyboard.c064 · code · unknown; прошивка — · close_config_dialog возвращает закрытие с действием screen_render_after_config; обработчик этого действия загружает конфигурацию и вызывает change_keyboard(0).</li> </ul> <p><a class="footnote-backref" href="#fnref:138" title="Jump back to footnote 138 in the text">↩</a></p> </li> <li id="fn:139"> <p>plg-hdtv-megaradio.c115 · code · unknown; прошивка — · additional_settings задаёт timer_osd (1–29 секунд), use_osd (0–3) и video_quality (360/480/720/1080), а также открывает proxy_settings. <a class="footnote-backref" href="#fnref:139" title="Jump back to footnote 139 in the text">↩</a></p> </li> <li id="fn:140"> <ul> <li>plg-hdtv-smart-vod.c354 · code · unknown; прошивка — · В SmartSetupScreen MoviesTape отображаются папка DATA с кнопкой смены расположения, кнопка выгрузки/загрузки/очистки DATA, папка закачки и кнопка её смены при HD::get_dload_app()==true, комбобокс экранной клавиатуры use_osk, кнопки additional_settings и pin_dialog; комбобокс video_quality закомментирован, хотя обработчик control_id=video_quality сохраняет значение через HD::save_item.</li> <li>plg-hdtv-smart-vod.c355 · code · unknown; прошивка — · В SmartSetupScreen Filmix_API отображаются комбобоксы show_vod (по умолчанию yes) и video_quality (по умолчанию 3; варианты 360, 480, 720, 1080, а при HD::get_dash_platform_kind()==true также 1440p и 2160p) и кнопка pin_dialog; папок DATA и закачки в экране нет.</li> <li>plg-hdtv-smart-vod.c356 · code · unknown; прошивка — · В SmartSetupScreen Vimeo отображаются комбобоксы show_coment (по умолчанию no), use_osk (по умолчанию 1) и video_quality (по умолчанию 1; варианты 360, 480, 720, 1080), папка DATA и кнопка data_dialog, папка закачки и кнопка dload_path, кнопки additional_settings и pin_dialog; show_coment и video_quality хранятся в plugin_cookies/HD::save_item.</li> </ul> <p><a class="footnote-backref" href="#fnref:140" title="Jump back to footnote 140 in the text">↩</a></p> </li> <li id="fn:141"> <p>plg-dc-globaltv--list-config.c042 · code · unknown; прошивка — · apply_sections декодирует checked_idset/initial_checked_idset, обновляет и записывает sections_on_off; продолжает обновление CFG_TS/EPF и reread_all_epfs(true) только при результате записи 1. <a class="footnote-backref" href="#fnref:141" title="Jump back to footnote 141 in the text">↩</a></p> </li> <li id="fn:142"> <p>plg-dc-widget-ext.c023 · code · unknown; прошивка — · Экран настроек после каждого ввода возвращает ActionFactory::reset_controls(...) — действие RESET_CONTROLS_ACTION_ID с новыми defs <a class="footnote-backref" href="#fnref:142" title="Jump back to footnote 142 in the text">↩</a></p> </li> <li id="fn:143"> <p>plg-gh-rpervykh-dune-plugin-anidub-com.c047 · code · unknown; прошивка — · Изменение show_main_icon, video_quality, use_osk, skip_details и buf_time сохраняется в plugin_cookies и возвращает reset_controls с заново собранными control_defs. <a class="footnote-backref" href="#fnref:143" title="Jump back to footnote 143 in the text">↩</a></p> </li> <li id="fn:144"> <p>plg-hdtv-pirates-radio.c044 · code · unknown; прошивка — · При action_type = confirm handle_user_input читает control_id и сохраняет новое значение: если control_id = show_tv — в cookie show_tv, иначе если show_vod — в show_vod, иначе если epg_shift — в epg_shift; ActionFactory::reset_controls возвращается в любом случае, в том числе когда action_type не confirm. Вне экрана настроек cookies show_tv и show_vod не читаются. <a class="footnote-backref" href="#fnref:144" title="Jump back to footnote 144 in the text">↩</a></p> </li> <li id="fn:145"> <p>plg-hdtv-101-ru.c099 · code · unknown; прошивка — · Обработчик настроек DI.FM по action_type confirm/apply записывает show_tv в plugin_cookies; для listenKey пишет значение в plugin_cookies, показывает диалог '%tr%save_listen_key' и инвалидирует папку tv_group_list. <a class="footnote-backref" href="#fnref:145" title="Jump back to footnote 145 in the text">↩</a><a class="footnote-backref" href="#fnref2:145" title="Jump back to footnote 145 in the text">↩</a></p> </li> <li id="fn:146"> <p>plg-gh-aspel-twitch-dune-plugin.c035 · code · unknown; прошивка — · TwitchPlugin::handle_user_input при action_type === 'apply' и control_id === 'btnSave' записывает в plugin_cookies значения user_input->auth_token и user_input->username. <a class="footnote-backref" href="#fnref:146" title="Jump back to footnote 146 in the text">↩</a></p> </li> <li id="fn:147"> <p>plg-gh-mdpuma-dune-plugin-altiptv.c044 · code · unknown; прошивка — · При подтверждении show_hd настройки пишутся в plugin_cookies, затем инвалидируется tv_group_list с последующим reset_controls. <a class="footnote-backref" href="#fnref:147" title="Jump back to footnote 147 in the text">↩</a></p> </li> <li id="fn:148"> <p>plg-gh-valerievitch-dune-plugin-acestreamsearch.c060 · code · unknown; прошивка — · В AceSearchSetupScreen при confirm ветка else (после clear_history и use_local_search_engine) сохраняет значение в plugin_cookies под именем control_id, для buffering_ms предварительно умножает на 1000, затем показывает T::t('changes_saved') и инвалидирует папку AceSearchTvGroupListScreen. <a class="footnote-backref" href="#fnref:148" title="Jump back to footnote 148 in the text">↩</a></p> </li> <li id="fn:149"> <p>plg-hdtv-rain-tv.c030 · code · unknown; прошивка — · RainSetupScreen показывает combobox 'quality' со значениями из Config::$ICONS_GENRES_MAP и текущим значением cookie rain_quality_setting; при выборе пишет intval(user_input->quality) в cookie и инвалидирует экраны настроек и RainVodListScreen. <a class="footnote-backref" href="#fnref:149" title="Jump back to footnote 149 in the text">↩</a></p> </li> <li id="fn:150"> <p>plg-hdtv-plugtv.c034 · code · unknown; прошивка — · В trofey при смене epg_server обработчик возвращает ActionFactory::invalidate_folders(array('tv_channel_list')); в newworld такого вызова нет — там после сохранения epg_server выполняется break. <a class="footnote-backref" href="#fnref:150" title="Jump back to footnote 150 in the text">↩</a></p> </li> <li id="fn:151"> <ul> <li>plg-hdtv-zlostnyi-iptv.c063 · code · unknown; прошивка — · Ввод ключа: кнопка edit_token открывает диалог с text_field current_token и кнопкой pcode; обработчик pcode сохраняет cookie token (и pass), проверяет плейлист через HD::check_token, перезагружает каналы (unload_channels/load_channels) и при «nottoken» или пустом ответе показывает «Неправильный ключ доступа».</li> <li>plg-hdtv-zlostnyi-iptv.c064 · code · unknown; прошивка — · После успешного ввода ключа обработчик pcode возвращает ActionFactory::close_dialog_and_run(invalidate_folders (['tv_group_list'], действие reset_controls)).</li> </ul> <p><a class="footnote-backref" href="#fnref:151" title="Jump back to footnote 151 in the text">↩</a></p> </li> <li id="fn:152"> <p>plg-gh-mdpuma-dune-plugin-altiptv.c043 · code · unknown; прошивка — · DemoSetupScreen переключает page_num между четырьмя страницами и возвращает reset_controls с заново построенными контролами. <a class="footnote-backref" href="#fnref:152" title="Jump back to footnote 152 in the text">↩</a></p> </li> <li id="fn:153"> <p>plg-hdtv-evolutiontv.c010 · code · unknown; прошивка — · Настройки разделены на взаимоисключающие разделы option_edit, option_edit_2, pcode_edit и skin_load: при выборе одного остальные сбрасываются в no. В option_edit — show_tv, buf_time, epg_source (epg_source_ip — только при epg_source=2), epg_shift и кнопка codecpack_edit; в option_edit_2 — m3u_type (m3u_dir — только при m3u_type=2, m3u — при m3u_type=3), use_proxy (proxy_ip/proxy_port — только при use_proxy=yes), sort_channels. <a class="footnote-backref" href="#fnref:153" title="Jump back to footnote 153 in the text">↩</a><a class="footnote-backref" href="#fnref2:153" title="Jump back to footnote 153 in the text">↩</a></p> </li> <li id="fn:154"> <p>plg-hdtv-kaban.c022 · code · unknown; прошивка — · Экран настроек показывает версию, show_tv, epg_shift (-12…+12 часов), m3u_type; для m3u_type=2 — каталог /D, для 3 — ссылку на плейлист; при use_proxy=yes — proxy_ip/proxy_port. Скрытая настройка load_ex в UI не выводится. <a class="footnote-backref" href="#fnref:154" title="Jump back to footnote 154 in the text">↩</a></p> </li> <li id="fn:155"> <p>plg-gh-valerievitch-dune-plugin-acestreamsearch.c057 · code · unknown; прошивка — · Поля ace_proxy_ip, ace_proxy_port, remote_search_url, remote_search_api_version и remote_search_api_key показываются в настройках только при use_local_search_engine = нет. <a class="footnote-backref" href="#fnref:155" title="Jump back to footnote 155 in the text">↩</a></p> </li> <li id="fn:156"> <p>plg-dc-widget-ext.c111 · code · unknown; прошивка — · Если <code>/config/boot/fix_widget.sh</code> отсутствует и <code>fix_enabled != 'no'</code>, <code>createControlDefs</code> строит контролы: для openweathermap — поле apiKey и при пустом ключе кнопку загрузки ключа, для yandex — GEOID, для rp5 — ID, для gismeteo — кнопку выбора города; кнопка <code>update_weather</code> показывается только при <code>canUpdate</code> — для openweathermap при непустом apiKey, для yandex, rp5 и gismeteo всегда. <a class="footnote-backref" href="#fnref:156" title="Jump back to footnote 156 in the text">↩</a></p> </li> <li id="fn:157"> <ul> <li>plg-gh-valerievitch-dune-plugin-acestreamsearch.c056 · code · unknown; прошивка — · Экран настроек AceSearchSetupScreen содержит комбобоксы clear_history и use_local_search_engine, текстовые поля параметров Ace Proxy и поиска (только при use_local_search_engine = FALSE), поле buffering_ms в секундах и кнопку go2app.</li> <li>plg-gh-valerievitch-dune-plugin-acestreamsearch.c060 · code · unknown; прошивка — · В AceSearchSetupScreen при confirm ветка else (после clear_history и use_local_search_engine) сохраняет значение в plugin_cookies под именем control_id, для buffering_ms предварительно умножает на 1000, затем показывает T::t('changes_saved') и инвалидирует папку AceSearchTvGroupListScreen.</li> </ul> <p><a class="footnote-backref" href="#fnref:157" title="Jump back to footnote 157 in the text">↩</a></p> </li> <li id="fn:158"> <p>plg-hdtv-pirates-radio.c043 · code · unknown; прошивка — · Экран настроек содержит два комбобокса: show_tv («Показывать TV в главном меню:», Да/Нет) и epg_shift («Коррекция программы (час):», подписи от -12 до +12, значения $i*3600 секунд); show_vod читается из cookies, но контрола для него нет. <a class="footnote-backref" href="#fnref:158" title="Jump back to footnote 158 in the text">↩</a></p> </li> <li id="fn:159"> <p>plg-hdtv-plugtv.c033 · code · unknown; прошивка — · В newworld в обработчике настроек у case 'buf_time' нет break, поэтому после сохранения buf_time управление проваливается в case 'restart' и открывается диалог перезагрузки. <a class="footnote-backref" href="#fnref:159" title="Jump back to footnote 159 in the text">↩</a></p> </li> <li id="fn:160"> <p>plg-dc-screenshoter.c045 · code · unknown; прошивка — · HD::ver() берёт версию плагина из элемента version файла dune_plugin.xml в install_dir_path <a class="footnote-backref" href="#fnref:160" title="Jump back to footnote 160 in the text">↩</a></p> </li> <li id="fn:161"> <ul> <li>plg-hdtv-surface-family.c042 · code · unknown; прошивка — · Экран настроек Radiorecord.ru читает bg_path и mode_path через HD::get_item() (по умолчанию yes и mosaic), показывает версию и caption из dune_plugin.xml, IP-адрес вида http://<ip>/cgi-bin/plugins/<name>/do и путь DATA из Config::get_data_path().</li> <li>plg-hdtv-surface-family.c074 · code · unknown; прошивка — · Проверок версии прошивки в коде трёх плагинов нет; единственная проверка платформы — smbtree::get_bug_platform_kind() по строке platform_kind в /tmp/run/versions.txt (8672/8673/8758), а HD::ver() читает version из dune_plugin.xml и возвращает версию плагина.</li> </ul> <p><a class="footnote-backref" href="#fnref:161" title="Jump back to footnote 161 in the text">↩</a></p> </li> <li id="fn:162"> <p>plg-hdtv-101-ru.c098 · code · unknown; прошивка — · Экран настроек DI.FM показывает label с caption и version из dune_plugin.xml, combobox show_tv (значения yes/no) и текстовое поле listenKey с подписью 'Premium Listen_key:'; release_data, IP-адрес CGI и mode_ground в экран не добавлены. <a class="footnote-backref" href="#fnref:162" title="Jump back to footnote 162 in the text">↩</a></p> </li> <li id="fn:163"> <p>plg-hdtv-freetv.c022 · code · unknown; прошивка — · Экран настроек показывает версию из dune_plugin.xml, кнопки автозапуска ТВ, показа иконки фильмотеки (только branch_num >= 11), расширенного EPG, размера шрифта EPG, коррекции EPG PeersTV/VseTV (от -12 до +12 часов), очистки кэша EPG и перезагрузки плеера. <a class="footnote-backref" href="#fnref:163" title="Jump back to footnote 163 in the text">↩</a></p> </li> <li id="fn:164"> <ul> <li>plg-dc-screenshoter.c042 · code · unknown; прошивка — · Кнопка whats_new загружает http://dune-club.info/plugins/update/<plugin_name>/info.txt и показывает текст в диалоге</li> <li>plg-dc-screenshoter.c046 · code · unknown; прошивка — · HD::http_get_document в lib/utils.php работает через curl, отключает проверку SSL (CURLOPT_SSL_VERIFYPEER и VERIFYHOST = 0), ставит таймауты 40 с</li> </ul> <p><a class="footnote-backref" href="#fnref:164" title="Jump back to footnote 164 in the text">↩</a></p> </li> <li id="fn:165"> <p>plg-hdtv-101-ru.c101 · code · unknown; прошивка — · По B_GREEN на списке групп DI.FM обработчик info_view скачивает http://dune-club.info/plugins/update/<plugin_name>/info.txt, показывает текст в multiline-label и диалоге '%tr%t5'. <a class="footnote-backref" href="#fnref:165" title="Jump back to footnote 165 in the text">↩</a></p> </li> <li id="fn:166"> <ul> <li>plg-dc-screenshoter.c038 · code · android; прошивка — · Если HD::get_platform_kind() == 'android', экран setup показывает адрес веб-интерфейса http://<ip>/cgi-bin/plugins/Screenshoter/index и кнопку QR code</li> <li>plg-dc-screenshoter.c039 · code · unknown; прошивка — · На не-Android платформах экран setup вместо веб-интерфейса показывает надпись %tr%t12 «Plugin for Dune Android» (t12 = «Этот плагин для плееров на ARMv7:»)</li> <li>plg-dc-screenshoter.c041 · code · unknown; прошивка — · Кнопка QR code скачивает картинку с https://api.qrserver.com/v1/create-qr-code/ (data = адрес веб-интерфейса), сохраняет в tmp_dir_path/img.jpeg и показывает её в диалоге тегом <icon></li> <li>plg-dc-screenshoter.c061 · code · unknown; прошивка — · HD::get_ip_address_wo_port() берёт первый не-127.0.0.1 адрес из вывода <code>ifconfig</code> (шаблон «inet addr:»); get_ip_address() добавляет :$HD_HTTP_LOCAL_PORT, если порт не 80</li> </ul> <p><a class="footnote-backref" href="#fnref:166" title="Jump back to footnote 166 in the text">↩</a></p> </li> <li id="fn:167"> <p>plg-hdtv-surface-family.c042 · code · unknown; прошивка — · Экран настроек Radiorecord.ru читает bg_path и mode_path через HD::get_item() (по умолчанию yes и mosaic), показывает версию и caption из dune_plugin.xml, IP-адрес вида http://<ip>/cgi-bin/plugins/<name>/do и путь DATA из Config::get_data_path(). <a class="footnote-backref" href="#fnref:167" title="Jump back to footnote 167 in the text">↩</a></p> </li> <li id="fn:168"> <p>plg-hdtv-megaradio.c119 · code · unknown; прошивка — · QR-код в настройках и в difm_login строится через api.qrserver.com по адресу http://<IP-плеера>/cgi-bin/plugins/MegaRadio/do. <a class="footnote-backref" href="#fnref:168" title="Jump back to footnote 168 in the text">↩</a></p> </li> <li id="fn:169"> <ul> <li>plg-dc-widget-ext.c024 · code · unknown; прошивка — · Лог показывается диалогом ActionFactory::show_dialog(заголовок, defs, true, 1200) — действие SHOW_DIALOG_ACTION_ID</li> <li>plg-dc-widget-ext.c078 · code · unknown; прошивка — · Логи плагина: $FS_PREFIX/tmp/run/widget_ext.log (жизненный цикл, cron), widget_ext_weather.log (ротация при > 20000 байт), widget_ext_memory.log; последние два показываются в диалоге «Log of last actions»</li> <li>plg-dc-widget-ext.c110 · code · unknown; прошивка — · Экран настроек в диалоге лога (<code>createLogDefs</code>) проверяет, запущена ли cron-задача погоды или памяти, вызывая bin/crontask.sh и ища в его выводе update_weather.sh или meminfo.sh.</li> </ul> <p><a class="footnote-backref" href="#fnref:169" title="Jump back to footnote 169 in the text">↩</a></p> </li> <li id="fn:170"> <p>plg-dc-widget-ext.c115 · code · unknown; прошивка — · Кнопки обслуживания на экране настроек запускают shell-скрипты: «Clean-up memory now» — bin/meminfo.sh x, «Update weather now» — bin/update_weather.sh, очистка старого fix_widget — bin/clean_old_fix.sh. <a class="footnote-backref" href="#fnref:170" title="Jump back to footnote 170 in the text">↩</a></p> </li> <li id="fn:171"> <p>plg-hdtv-altv.c026 · code · unknown; прошивка — · Кнопка «мягкой» перезагрузки в настройках выполняет shell_exec('killall shell'). <a class="footnote-backref" href="#fnref:171" title="Jump back to footnote 171 in the text">↩</a></p> </li> <li id="fn:172"> <p>plg-hdtv-jurt.c030 · code · unknown; прошивка — · Кнопка «мягкой» перезагрузки выполняет shell_exec('killall shell'). <a class="footnote-backref" href="#fnref:172" title="Jump back to footnote 172 in the text">↩</a></p> </li> <li id="fn:173"> <p>plg-gh-rpervykh-dune-plugin-anidub-com.c045 · code · unknown; прошивка — · Экран настроек содержит кнопку версии/изменений, combobox show_main_icon, video_quality, use_osk, skip_details, buf_time и кнопку «Перезагрузить плеер». <a class="footnote-backref" href="#fnref:173" title="Jump back to footnote 173 in the text">↩</a></p> </li> <li id="fn:174"> <p>plg-hdtv-folder-cache-vod.c022 · code · unknown; прошивка — · У ForumHouseTV, Stopham, SexyFilmWorld и YoutubeMetal экран настроек (do_get_control_defs) содержит поля show_main_icon, video_quality, use_osk, skip_details, buf_time и skin, кнопку info_release с версией и кнопку restart «Перезагрузить плеер». <a class="footnote-backref" href="#fnref:174" title="Jump back to footnote 174 in the text">↩</a></p> </li> <li id="fn:175"> <p>plg-gh-kocourkuba-proiptv.c070 · code · unknown; прошивка — · Если PARAM_SETTINGS_PASSWORD не пуст, entry handler перед открытием экранов настроек показывает диалог с полем pass (show_protect_settings_dialog); handle_protect_action сверяет введённый pass с параметром и при неверном возвращает err_bad_pass, а при верном открывает запрошенный экран. <a class="footnote-backref" href="#fnref:175" title="Jump back to footnote 175 in the text">↩</a></p> </li> <li id="fn:176"> <p>plg-hdtv-liteiptv.c057 · code · unknown; прошивка — · Смена PIN в настройках требует, чтобы введённый pin1 совпал с текущим cookie pin (по умолчанию 0000), и сохраняет pin2; при пустом поле или несовпадении показывает сообщение об ошибке. <a class="footnote-backref" href="#fnref:176" title="Jump back to footnote 176 in the text">↩</a></p> </li> <li id="fn:177"> <p>plg-hdtv-smart-vod.c120 · code · unknown; прошивка — · При control_id=pin_apply эталон меняет plugin_cookies->pin лишь когда pin1 и pin2 непусты и pin1 совпадает с текущим pin (по умолчанию 0000). <a class="footnote-backref" href="#fnref:177" title="Jump back to footnote 177 in the text">↩</a></p> </li> <li id="fn:178"> <p>plg-hdtv-megaradio.c118 · code · unknown; прошивка — · При control_id = pin_apply код меняет plugin_cookies->pin только когда pin1 и pin2 непусты и pin1 совпадает с текущим pin (по умолчанию 0000). <a class="footnote-backref" href="#fnref:178" title="Jump back to footnote 178 in the text">↩</a></p> </li> <li id="fn:179"> <ul> <li>plg-hdtv-moidom.c021 · code · unknown; прошивка — · Экран настроек показывает логин, название пакета и дату окончания подписки из account, а для авторизованного пользователя — combobox-ы http_caching (буферизация), timeshift, bitrate и stream_server, значения и списки которых берутся из account->settings; кнопки edit_subscription и edit_pcode открывают диалоги.</li> <li>plg-hdtv-moidom.c023 · code · unknown; прошивка — · set_settings отправляет settings_set.php: для control_id=pcode — ?var=pcode<строка с &old_code/&new_code/&confirm_code>, для остальных — ?var=<id>&val=<value>; при ответе code=4 обновляет settings (кроме pcode), иначе бросает MoiDom_Exception.</li> </ul> <p><a class="footnote-backref" href="#fnref:179" title="Jump back to footnote 179 in the text">↩</a></p> </li> <li id="fn:180"> <p>plg-hdtv-polsky-tv.c020 · code · unknown; прошивка — · Ответ сервиса обрабатывается так: при наличии upgrade_url он пишется в /config/fw_online_upgrade_url.txt через временный файл и rename; пустой URL удаляет файл и /tmp/fw_online_upgrade_last_autocheck_time, только если отличается от прежнего. Поля stats_on, timeshift, buffering, bitrate, stream_server, server_address, login и password при наличии применяются действием ActionFactory::change_settings. <a class="footnote-backref" href="#fnref:180" title="Jump back to footnote 180 in the text">↩</a></p> </li> <li id="fn:181"> <p>doc-sdk-plugins--operations.c046 · doc · any-documented; прошивка — · Реализация change_tv_favorites() должна сохранять список избранных каналов в постоянное хранилище (например, в cookies) <a class="footnote-backref" href="#fnref:181" title="Jump back to footnote 181 in the text">↩</a></p> </li> <li id="fn:182"> <p>plg-gh-valerievitch-dune-plugin-acestreamsearch.c055 · code · unknown; прошивка — · AceSearchConfig::item возвращает значение из plugin_cookies, если оно там задано, иначе значение по умолчанию из AceSearchConfig::defaults. <a class="footnote-backref" href="#fnref:182" title="Jump back to footnote 182 in the text">↩</a></p> </li> <li id="fn:183"> <p>plg-hdtv-remtor.c089 · code · unknown; прошивка — · check_cookies задаёт отсутствующие умолчания plugin_cookies: torrent_ip 127.0.0.1, torrent_port 9091, пустые user и password, refresh_interval 5, loglevel 0, dunefolder 'ask'; kind_connection, если не задан, выводится как kc_local_dune для 127.0.0.1 и kc_std_transmission иначе. <a class="footnote-backref" href="#fnref:183" title="Jump back to footnote 183 in the text">↩</a></p> </li> <li id="fn:184"> <p>plg-dc-dunemdb-supplier-online-movies.c070 · code · unknown; прошивка — · Настройки плагина — sort_video_streams, max_quality, min_quality, min_availability и ext_torrserver — хранятся в plugin_cookies; значения по умолчанию — auto, auto, any, 0 и пустая строка соответственно; ext_torrserver без двоеточия дополняется портом 8090. <a class="footnote-backref" href="#fnref:184" title="Jump back to footnote 184 in the text">↩</a></p> </li> <li id="fn:185"> <p>plg-hdtv-altv.c019 · code · unknown; прошивка — · Значения по умолчанию настроек: show_tv=yes, epg_shift=0, buf_time=0, load_sex=no, pass_sex=0000 (если соответствующих cookie нет). <a class="footnote-backref" href="#fnref:185" title="Jump back to footnote 185 in the text">↩</a></p> </li> <li id="fn:186"> <p>plg-hdtv-liteiptv.c100 · code · unknown; прошивка — · Cookie плагина: start_tv, sort_channels, buf_time, epg_shift, epg_font и pin; liteIPTVplus добавляет epgIp; значения по умолчанию — start_tv 0, sort_channels 0, buf_time 0, epg_shift 0, pin '0000'. <a class="footnote-backref" href="#fnref:186" title="Jump back to footnote 186 in the text">↩</a></p> </li> <li id="fn:187"> <p>plg-hdtv-folder-cache-vod.c047 · code · unknown; прошивка — · Настройки плагина хранятся в полях $plugin_cookies (main_icon, use_osk, skip_details, video_quality, buf_time, skin); умолчания — main_icon=yes, use_osk=yes, skip_details=no, buf_time=0, video_quality=1 (у kinokrit — 4). <a class="footnote-backref" href="#fnref:187" title="Jump back to footnote 187 in the text">↩</a></p> </li> <li id="fn:188"> <p>plg-gh-rpervykh-dune-plugin-anidub-com.c044 · code · unknown; прошивка — · Настройки по умолчанию — main_icon yes, use_osk yes, skip_details no, video_quality 1 и buf_time 0. <a class="footnote-backref" href="#fnref:188" title="Jump back to footnote 188 in the text">↩</a></p> </li> <li id="fn:189"> <p>plg-hdtv-zlostnyi-iptv.c031 · code · unknown; прошивка — · Если в plugin_cookies нет token (значение по умолчанию '0'), BcuM3uTv::load_channels создаёт одну группу с заголовком «Ключ доступа не найден! Перейдите в настройки» и не запрашивает плейлист. <a class="footnote-backref" href="#fnref:189" title="Jump back to footnote 189 in the text">↩</a></p> </li> <li id="fn:190"> <p>plg-dc-globaltv.c106 · code · unknown; прошивка — · Избранные каналы плагин хранит в plugin_cookies под ключом favorite_channels (через запятую), избранные категории — под favorite_categories. <a class="footnote-backref" href="#fnref:190" title="Jump back to footnote 190 in the text">↩</a></p> </li> <li id="fn:191"> <ul> <li>plg-hdtv-freetv.c069 · code · unknown; прошивка — · Избранные и исключённые каналы хранятся в cookie <code>favorite_channels</code> и <code>exclude_channels</code> как id через запятую; get_tv_info при загрузке удаляет из обоих списков id, которых нет в текущем плейлисте.</li> <li>plg-hdtv-freetv.c063 · code · unknown; прошивка — · Если cookie favorite_channels нет, load_channels записывает 19 стартовых избранных каналов (id 21381677, 21185671, 60995105, …, 24984577_2) и очищает exclude_channels.</li> </ul> <p><a class="footnote-backref" href="#fnref:191" title="Jump back to footnote 191 in the text">↩</a></p> </li> <li id="fn:192"> <p>plg-hdtv-novosib-iptv.c031 · code · unknown; прошивка — · Смена m3u-ссылки или каталога дописывает значение к cookie m3u_dir через разделитель '***' и перезапускает плагин действием plugin_launcher://Novosib-iptv. <a class="footnote-backref" href="#fnref:192" title="Jump back to footnote 192 in the text">↩</a></p> </li> <li id="fn:193"> <p>doc-sdk-plugins.c039 · doc · any-documented; прошивка — · Видимость точки входа задаёт show_cookie_name — имя cookie плагина со значением yes | no | lang(<lang1>,...,<langN>); если cookie не задан, используется show_by_default <a class="footnote-backref" href="#fnref:193" title="Jump back to footnote 193 in the text">↩</a><a class="footnote-backref" href="#fnref2:193" title="Jump back to footnote 193 in the text">↩</a></p> </li> <li id="fn:194"> <ul> <li>plg-dc-screenshoter.c017 · code · unknown; прошивка — · Первая точка входа задаёт show_cookie_name = main_icon и show_by_default = yes</li> <li>plg-dc-screenshoter.c043 · code · unknown; прошивка — · Комбобокс main_icon (%tr%t3 «Показывать пункт меню:») сохраняет выбор yes/no в $plugin_cookies->main_icon</li> <li>plg-dc-screenshoter.c044 · doc · unknown; прошивка — · Cookie main_icon вместе с show_cookie_name = main_icon в манифесте управляет показом значка плагина в root://applications</li> </ul> <p><a class="footnote-backref" href="#fnref:194" title="Jump back to footnote 194 in the text">↩</a></p> </li> <li id="fn:195"> <ul> <li>plg-hdtv-utility-family.c013 · code · unknown; прошивка — · Комбобокс show_main_icon на экране настроек пишет выбранное yes/no в $plugin_cookies->main_icon (по умолчанию yes) — так в LTU_install, Codec_install, ExtendRC_install, Platform_install, ffmpeg_install, SleepWake и mark.it.</li> <li>plg-hdtv-utility-family.c014 · code · unknown; прошивка — · Манифесты всех 9 пакетов связывают видимость точки входа в root:// с cookie main_icon: show_cookie_name main_icon и show_by_default yes — так плагин прячет свою иконку из главного меню.</li> <li>plg-hdtv-utility-family.c015 · code · unknown; прошивка — · Семь пакетов (кроме umount и DuneArc) объявляют две точки входа на тот же экран setup_screen: в root://applications и в setup://applications; у второй нет show_cookie_name (иконка остаётся в настройках).</li> </ul> <p><a class="footnote-backref" href="#fnref:195" title="Jump back to footnote 195 in the text">↩</a></p> </li> <li id="fn:196"> <p>plg-hdtv-surface-family.c046 · code · unknown; прошивка — · Ни один из трёх плагинов не записывает cookie show_application, указанный в манифесте как show_cookie_name; rmfon.pl и wwcam пишут cookie show_tv, а Radiorecord.ru переключателя show_tv не имеет. <a class="footnote-backref" href="#fnref:196" title="Jump back to footnote 196 in the text">↩</a><a class="footnote-backref" href="#fnref2:196" title="Jump back to footnote 196 in the text">↩</a></p> </li> <li id="fn:197"> <p>plg-gh-aspel-twitch-dune-plugin.c048 · code · unknown; прошивка — · bin/irc.sh в цикле while read -r name value разбирает /config/twitch_tv_plugin_cookies.properties: если name == 'username', кладёт value в SHIC_NICK; elif name == 'auth_token' — в SHIC_PASS с префиксом "oauth:"; затем завершается с кодом 1, если SHIC_NICK пуст или SHIC_PASS не задан; пустой auth_token даёт непустой SHIC_PASS="oauth:" и проверку проходит. <a class="footnote-backref" href="#fnref:197" title="Jump back to footnote 197 in the text">↩</a></p> </li> <li id="fn:198"> <ul> <li>plg-hdtv-jurt.c028 · code · unknown; прошивка — · Экран настроек показывает версию 1.0.1 (релиз 01.11.2014), логин, кнопку «Редактировать...», информацию для клиентов, combobox буферизации (0…15000 мс), выбор показа на главном экране (auto/yes/no) и кнопку «мягкой» перезагрузки.</li> <li>plg-hdtv-jurt.c029 · code · unknown; прошивка — · При выборе show_in_main_screen=auto плагин пишет show_tv=lang(russian), иначе — выбранное значение.</li> </ul> <p><a class="footnote-backref" href="#fnref:198" title="Jump back to footnote 198 in the text">↩</a></p> </li> <li id="fn:199"> <p>plg-gh-rpervykh-dune-plugin-anidub-com.c048 · code · unknown; прошивка — · При show_main_icon=yes плагин выставляет show_channels_v4, show_search_v4 и show_favorites в no, иначе в yes; других обращений к этим трём cookie в пакете нет. <a class="footnote-backref" href="#fnref:199" title="Jump back to footnote 199 in the text">↩</a></p> </li> <li id="fn:200"> <ul> <li>plg-hdtv-peerstv.c017 · code · unknown; прошивка — · Экран настроек DemoSetupScreen показывает только один combobox show_tv (Да/Нет), по умолчанию yes; show_vod читается, но контрол для него не создаётся.</li> <li>plg-hdtv-pirates-radio.c043 · code · unknown; прошивка — · Экран настроек содержит два комбобокса: show_tv («Показывать TV в главном меню:», Да/Нет) и epg_shift («Коррекция программы (час):», подписи от -12 до +12, значения $i*3600 секунд); show_vod читается из cookies, но контрола для него нет.</li> </ul> <p><a class="footnote-backref" href="#fnref:200" title="Jump back to footnote 200 in the text">↩</a></p> </li> <li id="fn:201"> <p>plg-hdtv-kohana-channel.c086 · code · unknown; прошивка — · Cookie::init сохраняет ссылку на $plugin_cookies в статическом поле, но методы Cookie::get и Cookie::set в шаблоне не вызываются; собственных настроек плагин не читает и не пишет. <a class="footnote-backref" href="#fnref:201" title="Jump back to footnote 201 in the text">↩</a></p> </li> <li id="fn:202"> <ul> <li>plg-hdtv-utility-family.c010 · code · unknown; прошивка — · В DuneArc lib/utils.php дополнен хелперами HD::get_items/save_items (serialize/unserialize в файл под data_dir_path), save_items_tmp/get_items_tmp (под tmp_dir_path), save_item/get_item, а также HD::get_filesize_str.</li> <li>plg-hdtv-smart-vod.c115 · code · unknown; прошивка — · Локальные HD::get_items/save_items эталона читают unserialize и записывают serialize в файлы data_dir_path/<path>.</li> </ul> <p><a class="footnote-backref" href="#fnref:202" title="Jump back to footnote 202 in the text">↩</a></p> </li> <li id="fn:203"> <p>plg-hdtv-smart-vod.c115 · code · unknown; прошивка — · Локальные HD::get_items/save_items эталона читают unserialize и записывают serialize в файлы data_dir_path/<path>. <a class="footnote-backref" href="#fnref:203" title="Jump back to footnote 203 in the text">↩</a></p> </li> <li id="fn:204"> <p>plg-hdtv-utility-family.c010 · code · unknown; прошивка — · В DuneArc lib/utils.php дополнен хелперами HD::get_items/save_items (serialize/unserialize в файл под data_dir_path), save_items_tmp/get_items_tmp (под tmp_dir_path), save_item/get_item, а также HD::get_filesize_str. <a class="footnote-backref" href="#fnref:204" title="Jump back to footnote 204 in the text">↩</a><a class="footnote-backref" href="#fnref2:204" title="Jump back to footnote 204 in the text">↩</a></p> </li> <li id="fn:205"> <ul> <li>plg-dc-widget-ext.c043 · code · unknown; прошивка — · HD::get_items/HD::save_items читают/пишут сериализованные данные: при $path == 'data_dir_path' файл — DuneSystem::$properties['data_dir_path']/$path, иначе — HD::get_data_path()/$path (в том числе adv_kbrd_colors).</li> <li>plg-dc-widget-ext--lib.c059 · code · unknown; прошивка — · HD::get_item читает обычное содержимое файла под get_data_path и возвращает пустую строку при отсутствии файла.</li> </ul> <p><a class="footnote-backref" href="#fnref:205" title="Jump back to footnote 205 in the text">↩</a></p> </li> <li id="fn:206"> <p>plg-dc-widget-ext--adv-keyboard.c061 · code · unknown; прошивка — · Для adv_kbrd_lang и adv_kbrd_colors методы HD::get_items/save_items читают и пишут PHP serialize в файле под HD::get_data_path(). <a class="footnote-backref" href="#fnref:206" title="Jump back to footnote 206 in the text">↩</a></p> </li> <li id="fn:207"> <p>plg-gh-mdpuma-dune-plugin-altiptv.c047 · code · unknown; прошивка — · HD::get_items/save_items читают и записывают сериализованные PHP-массивы в altiptv_data/data_file/<path>. <a class="footnote-backref" href="#fnref:207" title="Jump back to footnote 207 in the text">↩</a></p> </li> <li id="fn:208"> <p>plg-dc-torrent-center.c118 · code · unknown; прошивка — · HD::saveItemsArr сохраняет массивы serialize, а HD::getItemsArr читает их unserialize из DATA. <a class="footnote-backref" href="#fnref:208" title="Jump back to footnote 208 in the text">↩</a></p> </li> <li id="fn:209"> <ul> <li>plg-hdtv-youtube.c119 · code · unknown; прошивка — · Избранное YouTube хранится через HD::get_items/save_items с именем favorite_movies (как в эталоне).</li> <li>plg-hdtv-youtube.c072 · code · unknown; прошивка — · SmartConfig::get_tokens YouTube хранит OAuth-токены основного аккаунта в HD-элементе tokens, а дополнительных пользователей — в user_plus_tokens[<имя>]; текущее имя — static uname (по умолчанию default).</li> </ul> <p><a class="footnote-backref" href="#fnref:209" title="Jump back to footnote 209 in the text">↩</a></p> </li> <li id="fn:210"> <p>plg-hdtv-megaanime.c063 · code · unknown; прошивка — · HD::get_items/save_items при истинном macAdr дописывают к имени файла MAC без двоеточий и хранят serialize-данные в каталоге DATA; get_item/save_item хранят сырую строку. Адреса TorrServe, Peerflix, Transmission и AceStream читаются с macAdr = 1. <a class="footnote-backref" href="#fnref:210" title="Jump back to footnote 210 in the text">↩</a><a class="footnote-backref" href="#fnref2:210" title="Jump back to footnote 210 in the text">↩</a></p> </li> <li id="fn:211"> <p>plg-hdtv-folder-cache-vod.c087 · code · unknown; прошивка — · Избранное (fav_items, fav_items_link) и история поиска (search_items) пишутся сериализованными через HD::save_items, а сортировка (sort_page) — сырым значением через HD::save_item в файлы data_dir_path; третьим аргументом (macAdr) передаётся объект $plugin_cookies, поэтому к имени файла добавляется MAC, но main_menu:fav читает legacy $plugin_cookies->fav_items через ListUtil::string_to_list. <a class="footnote-backref" href="#fnref:211" title="Jump back to footnote 211 in the text">↩</a><a class="footnote-backref" href="#fnref2:211" title="Jump back to footnote 211 in the text">↩</a></p> </li> <li id="fn:212"> <p>plg-dc-bazinga3.c038 · code · unknown; прошивка — · HD::saveItemsArr/getItemsArr хранят массивы настроек serialize-файлами в каталоге HD::get_data_path(), а saveItemStr/getItemStr — строки отдельными файлами; при macAdr=true к имени добавляется MAC без двоеточий. <a class="footnote-backref" href="#fnref:212" title="Jump back to footnote 212 in the text">↩</a></p> </li> <li id="fn:213"> <p>plg-hdtv-megaradio.c055 · code · unknown; прошивка — · Исключения RDS хранятся в HD::get_items('repl_arr'); действие add_rds_exceptions_apply добавляет введённую строку, а строка DELETE очищает весь список. <a class="footnote-backref" href="#fnref:213" title="Jump back to footnote 213 in the text">↩</a></p> </li> <li id="fn:214"> <p>plg-hdtv-smart-vod.c116 · code · unknown; прошивка — · Локальные HD::get_items_tmp/save_items_tmp эталона используют сериализованные файлы в tmp_dir_path. <a class="footnote-backref" href="#fnref:214" title="Jump back to footnote 214 in the text">↩</a></p> </li> <li id="fn:215"> <p>plg-hdtv-megatorrents.c029 · code · unknown; прошивка — · HD::get_item/save_item/get_items/save_items при истинном macAdr дописывают к имени файла MAC без двоеточий (get_mac_addr(1)) и хранят файл в SmartConfig::get_data_path(); *_tmp-варианты — в tmp_dir_path. <a class="footnote-backref" href="#fnref:215" title="Jump back to footnote 215 in the text">↩</a></p> </li> <li id="fn:216"> <p>plg-dc-bazinga3.c040 · code · unknown; прошивка — · Временные данные (saveItemTmpStr, saveItemsTmpArr) пишутся в DuneSystem tmp_dir_path. <a class="footnote-backref" href="#fnref:216" title="Jump back to footnote 216 in the text">↩</a></p> </li> <li id="fn:217"> <p>plg-hdtv-altsource.c046 · code · unknown; прошивка — · Удаление файла или папки выполняется shell-командой rm -rf по выбранному пути; после этого кэш-постер и JSON-описание в DATA/items удаляются только для video_file (по series_id) и папки (по basename). <a class="footnote-backref" href="#fnref:217" title="Jump back to footnote 217 in the text">↩</a></p> </li> <li id="fn:218"> <p>plg-dc-torrent-center.c119 · code · unknown; прошивка — · HD::saveItemStr при macAdr=true добавляет к имени настройки MAC-адрес без двоеточий. <a class="footnote-backref" href="#fnref:218" title="Jump back to footnote 218 in the text">↩</a></p> </li> <li id="fn:219"> <ul> <li>plg-dc-widget-ext--lib.c061 · code · unknown; прошивка — · При macAdr == true методы HD::get_items/save_items/get_item добавляют к имени файла результат get_mac_addr(1).</li> <li>plg-dc-widget-ext--lib.c062 · code · unknown; прошивка — · HD::get_mac_addr получает и кэширует адрес shell-командой ifconfig eth0 через head/sed; при arg == true удаляет двоеточия из самого кэша.</li> </ul> <p><a class="footnote-backref" href="#fnref:219" title="Jump back to footnote 219 in the text">↩</a></p> </li> <li id="fn:220"> <ul> <li>plg-hdtv-megatorrents.c029 · code · unknown; прошивка — · HD::get_item/save_item/get_items/save_items при истинном macAdr дописывают к имени файла MAC без двоеточий (get_mac_addr(1)) и хранят файл в SmartConfig::get_data_path(); *_tmp-варианты — в tmp_dir_path.</li> <li>plg-hdtv-megatorrents.c030 · code · unknown; прошивка — · HD::get_mac_addr получает MAC командой ifconfig eth0 | head -1 | sed "s/^.*HWaddr //" и при истинном аргументе удаляет двоеточия.</li> <li>plg-hdtv-megatorrents.c032 · code · unknown; прошивка — · Адреса торрент-серверов плагин читает через HD::get_item(<ключ>, 1), то есть с привязкой к MAC: torrserve_ip, dune_torrserve_ip, peerflix_ip, dune_peerflix_ip, transmission_ip, dune_transmission_ip, acestream_ip, dune_acestream_ip, add_torrserve_inf.</li> </ul> <p><a class="footnote-backref" href="#fnref:220" title="Jump back to footnote 220 in the text">↩</a></p> </li> <li id="fn:221"> <ul> <li>plg-dc-widget-ext.c031 · code · unknown; прошивка — · Плагин берёт каталог данных из DuneSystem::$properties['data_dir_path'] и хранит там настройки в файле settings.properties</li> <li>plg-dc-widget-ext.c034 · code · unknown; прошивка — · Настройки хранятся строками «ключ = значение»; ключи: fix_enabled, apiKey, weatherUpdateInterval, showMemInfo, cleanMemoryThreshold, ignoredPlugins, yandex_cityId, rp5_cityId, gismeteo_cityId, gismeteo_cityNames, addInfoType</li> <li>plg-dc-widget-ext.c112 · code · unknown; прошивка — · Класс Settings читает settings.properties один раз при первом init() и при каждом изменении перезаписывает файл целиком, собирая все ключи заново.</li> </ul> <p><a class="footnote-backref" href="#fnref:221" title="Jump back to footnote 221 in the text">↩</a></p> </li> <li id="fn:222"> <p>plg-hdtv-utility-family.c011 · code · unknown; прошивка — · В mark.it lib/utils.php есть HD::save_settings/load_settings: настройки хранятся INI-файлом <data_dir_path>/plugin_settings_<plugin_name> (parse_ini_file, запись «key = value»); load_settings возвращает false, если файла или ключа нет. <a class="footnote-backref" href="#fnref:222" title="Jump back to footnote 222 in the text">↩</a></p> </li> <li id="fn:223"> <ul> <li>plg-gh-kocourkuba-proiptv.c055 · code · unknown; прошивка — · Настройки плагина лежат в SQLite: глобальные параметры — common.db (таблица parameters), настройки и cookies плейлиста — в <playlist_id>.db (таблицы settings и cookies); init_parameters создаёт таблицы common.db, put_settings — таблицу settings, а safe_sql_cookies при явном playlist_id, чья БД не совпадает с БД активного плейлиста, открывает её на один запрос.</li> <li>plg-gh-kocourkuba-proiptv.c056 · code · unknown; прошивка — · Таблица settings хранит не только name/value, но и type: set_setting пишет gettype(value), а get_setting читает value и type и приводит значение к типу default через settype; отсутствующая настройка возвращает default.</li> <li>plg-gh-kocourkuba-proiptv.c057 · code · unknown; прошивка — · Sql_Wrapper ограничивает кэш страниц SQLite 1500 КиБ на соединение, выставляет page_size=4096 до первой страницы и journal_mode=MEMORY/WAL; для SQLite < 3.7.10 отрицательный cache_size считается в страницах, а mmap_size не используется (до 3.7.17).</li> </ul> <p><a class="footnote-backref" href="#fnref:223" title="Jump back to footnote 223 in the text">↩</a></p> </li> <li id="fn:224"> <ul> <li>plg-dc-globaltv--list-config.c010 · code · unknown; прошивка — · ConfigHolder строит id настроек как <plugin_name><em>sections для разделов и <plugin_name></em><section_id>_categories для категорий.</li> <li>plg-dc-globaltv--list-config.c011 · code · unknown; прошивка — · ListUtils::config_file_path задаёт путь /config/lcfg_<config_id>.txt.</li> <li>plg-dc-globaltv--list-config.c015 · code · unknown; прошивка — · read_config_file начинает с объекта id/changes/order; отсутствующий файл или ложный результат file() возвращают этот пустой конфиг.</li> <li>plg-dc-globaltv--list-config.c016 · code · unknown; прошивка — · read_config_file до строки с префиксом --- сохраняет +id/-id в changes; после неё каждую непустую обрезанную строку добавляет в order.</li> </ul> <p><a class="footnote-backref" href="#fnref:224" title="Jump back to footnote 224 in the text">↩</a></p> </li> <li id="fn:225"> <p>plg-hdtv-pirates-radio.c026 · code · unknown; прошивка — · load_channels читает список станций локально через file_get_contents(DemoConfig::CHANNEL_LIST_URL) и требует, чтобы корневой элемент XML назывался tv_info. <a class="footnote-backref" href="#fnref:225" title="Jump back to footnote 225 in the text">↩</a></p> </li> <li id="fn:226"> <p>plg-hdtv-folder-cache-vod.c023 · code · unknown; прошивка — · У ForumHouseTV, Stopham и SexyFilmWorld главное меню — три пункта: «Категории» (main_menu:videos), «Поиск» (main_menu:search) и «Избранное» (main_menu:fav); категории читаются из локального data/feed.xml, а не из сети. <a class="footnote-backref" href="#fnref:226" title="Jump back to footnote 226 in the text">↩</a></p> </li> <li id="fn:227"> <p>plg-hdtv-kaban.c014 · code · unknown; прошивка — · load_channels при load_ex=yes (по умолчанию) пытается загрузить DemoConfig::DATA_PATH.'01' и не имеет локального fallback для 01; файлы 02, 03 и 04 читаются так же с удалённого DATA_PATH, при неудаче — из локального data/; данные распаковываются compress.zlib:// и расшифровываются XOR-ключом 'bynthtcyj?' с последующим unserialize. <a class="footnote-backref" href="#fnref:227" title="Jump back to footnote 227 in the text">↩</a></p> </li> <li id="fn:228"> <ul> <li>plg-hdtv-utility-family.c035 · code · unknown; прошивка — · Если на экране LTU_install /persistfs/ltu/ существует, экран читает /ltu/configure и показывает комбобоксы автозапуска Transmission и Aria2 RPC; выбор заменяет строку START_TRANSMISSION=…/START_ARIA_RPC=… в /ltu/configure (str_replace и перезапись файла).</li> <li>plg-hdtv-utility-family.c026 · code · unknown; прошивка — · ltu_install.sh переписывает /persistfs/ltu/configure: задаёт значения по умолчанию (LOCALE_UTF8=1, START_TELNET=1, START_SSH=0, START_TRANSMISSION=0, START_ARIA_RPC=0, USE_FTP_SERVER=1, HDD_SPINDOWN_TIME=30 и др.), поверх них подгружает существующий configure и записывает файл заново с комментариями — пользовательские значения сохраняются.</li> </ul> <p><a class="footnote-backref" href="#fnref:228" title="Jump back to footnote 228 in the text">↩</a></p> </li> <li id="fn:229"> <p>plg-hdtv-smart-apps.c037 · code · unknown; прошивка — · apply_path_dialog Entware при заданном transmission_dir правит /opt/etc/transmission/settings.json заменой путей watch/downloads и создаёт каталоги transmission/watch|complete|incomplete, при заданном deluge_dir — /opt/etc/deluge/core.conf заменой /D/Downloads и каталог Downloads; при отсутствии целевого файла показывает диалог %tr%t157/%tr%t158. <a class="footnote-backref" href="#fnref:229" title="Jump back to footnote 229 in the text">↩</a></p> </li> <li id="fn:230"> <ul> <li>plg-hdtv-peerflixserver.c036 · code · unknown; прошивка — · Настройки сервера хранятся в <data>/home/.config/peerflix-server/config.json; при отсутствии файла используются значения tmp=/D/torrent-stream и verify=true, а connections не задаётся.</li> <li>plg-hdtv-peerflixserver.c038 · code · unknown; прошивка — · Пункт connections_peerflix при выбранном connections: 0 удаляет ключ и означает «Неограничено», 1..50 пишется в config->connections; если configObg сохранил настройки и сервер запущен, перезапускает его.</li> </ul> <p><a class="footnote-backref" href="#fnref:230" title="Jump back to footnote 230 in the text">↩</a></p> </li> <li id="fn:231"> <p>plg-hdtv-kohana-channel.c055 · code · unknown; прошивка — · Для группы config Rise::find_file возвращает файлы во всех путях в обратном порядке (SYSPATH → folder → dune → dune_lib → APPPATH), Config_File_Reader объединяет их через Arr::merge, а Arr::merge заменяет ассоциативные значения более поздним файлом; поэтому application/config перекрывает модульные настройки. <a class="footnote-backref" href="#fnref:231" title="Jump back to footnote 231 in the text">↩</a></p> </li> <li id="fn:232"> <ul> <li>plg-gh-vladikshkwok-lampa-dune-plugins.c077 · code · android; прошивка — · Сессия прогресса хранится в localStorage под ключом dune_local_progress_v1 с id, created, state и items; при остановке или истечении сессии ключ удаляется.</li> <li>plg-gh-vladikshkwok-lampa-dune-plugins.c074 · code · android; прошивка — · identity() принимает только http(s)-строки до 16384 символов: при pathname с /stream/, link из 40 hex и положительном index возвращает torrent:<hash>:<index>, иначе хеширует URL без фрагмента в url:<digest>; прочие строки дают null.</li> <li>plg-gh-vladikshkwok-lampa-dune-plugins.c075 · code · android; прошивка — · digest() считает четыре независимые 32-битные дорожки; комментарий говорит, что URL и токены никогда не попадают в localStorage.</li> </ul> <p><a class="footnote-backref" href="#fnref:232" title="Jump back to footnote 232 in the text">↩</a></p> </li> <li id="fn:233"> <p>plg-gh-vladikshkwok-lampa-dune-plugins.c078 · code · android; прошивка — · restore() принимает сохранённую сессию, если items — массив не длиннее 250, created числовой, сессия не старше 12 часов и после фильтра остаётся хотя бы один элемент, и отбрасывает элементы, у которых hash не вида -?\d{1,20} или равен строке '0', key неверный, а profile не является неотрицательным числом. <a class="footnote-backref" href="#fnref:233" title="Jump back to footnote 233 in the text">↩</a></p> </li> <li id="fn:234"> <p>plg-dc-dunemdb-supplier-movies-eng.c033 · code · unknown; прошивка — · Каталог данных плагина выбирается по первому существующему из /persistfs/plugins_data/<name>, /flashdata/plugins_data/<name>, иначе /config/plugins_data/<name>. <a class="footnote-backref" href="#fnref:234" title="Jump back to footnote 234 in the text">↩</a></p> </li> <li id="fn:235"> <p>plg-dc-torrent-center.c120 · code · unknown; прошивка — · HD::get_data_path использует DuneSystem data_dir_path либо переопределение из файла data_dir_path через smbtree::get_folder_info. <a class="footnote-backref" href="#fnref:235" title="Jump back to footnote 235 in the text">↩</a></p> </li> <li id="fn:236"> <p>plg-dc-widget-ext--lib.c058 · code · unknown; прошивка — · HD::get_data_path кэширует data_dir_path; reset == true очищает кэш; при наличии файла data_dir_path вызывается smbtree::get_folder_info. <a class="footnote-backref" href="#fnref:236" title="Jump back to footnote 236 in the text">↩</a></p> </li> <li id="fn:237"> <p>plg-hdtv-megatorrents.c031 · code · unknown; прошивка — · SmartConfig::get_data_path берёт data_dir_path и, если в нём есть файл data_dir_path, заменяет путь на smbtree::get_folder_info('data_dir_path'); результат кэшируется в static и возвращается. <a class="footnote-backref" href="#fnref:237" title="Jump back to footnote 237 in the text">↩</a></p> </li> <li id="fn:238"> <p>plg-hdtv-altsource.c048 · code · unknown; прошивка — · Расположение папки DATA можно изменить: выбранный путь сохраняется JSON-строкой в файл <data_dir_path>/data_dir_path; HD::get_data_path при наличии этого файла берёт путь через FileList::get_folder_info, а действие resetDataPath удаляет файл и возвращает штатный data_dir_path. <a class="footnote-backref" href="#fnref:238" title="Jump back to footnote 238 in the text">↩</a></p> </li> <li id="fn:239"> <ul> <li>plg-hdtv-smart-vod.c179 · code · unknown; прошивка — · KinoFrance SmartConfig::get_data_path при первом вычислении начинает с data_dir_path и при наличии файла data_dir_path/data_dir_path заменяет путь результатом smbtree::get_folder_info.</li> <li>plg-hdtv-smart-vod.c357 · code · unknown; прошивка — · get_data_path MoviesTape при первом вычислении берёт DuneSystem::$properties['data_dir_path'] и, если существует файл data_dir_path/data_dir_path, заменяет путь результатом smbtree::get_folder_info('data_dir_path').</li> <li>plg-hdtv-smart-vod.c358 · code · unknown; прошивка — · get_data_path Vimeo при первом вычислении берёт DuneSystem::$properties['data_dir_path'] и, если существует файл data_dir_path/data_dir_path, заменяет путь результатом smbtree::get_folder_info('data_dir_path').</li> </ul> <p><a class="footnote-backref" href="#fnref:239" title="Jump back to footnote 239 in the text">↩</a><a class="footnote-backref" href="#fnref2:239" title="Jump back to footnote 239 in the text">↩</a></p> </li> <li id="fn:240"> <p>plg-hdtv-youtube.c118 · code · unknown; прошивка — · SmartConfig::get_data_path YouTube возвращает data_dir_path, заменяя его на smbtree::get_folder_info('data_dir_path'), если существует файл data_dir_path/data_dir_path, — в отличие от эталона, где значение не возвращается. <a class="footnote-backref" href="#fnref:240" title="Jump back to footnote 240 in the text">↩</a><a class="footnote-backref" href="#fnref2:240" title="Jump back to footnote 240 in the text">↩</a></p> </li> <li id="fn:241"> <p>plg-hdtv-torrserve.c041 · code · unknown; прошивка — · Метод SmartConfig::get_data_path вызывается в Smart_file_screen.php, но класс SmartConfig такого метода не объявляет. <a class="footnote-backref" href="#fnref:241" title="Jump back to footnote 241 in the text">↩</a></p> </li> <li id="fn:242"> <p>plg-dc-bazinga3.c039 · code · unknown; прошивка — · HD::get_data_path() берёт DuneSystem data_dir_path, а при наличии файла data_dir_path в нём — путь из smbtree::get_folder_info('data_dir_path'). <a class="footnote-backref" href="#fnref:242" title="Jump back to footnote 242 in the text">↩</a></p> </li> <li id="fn:243"> <ul> <li>plg-gh-mdpuma-dune-plugin-altiptv.c045 · code · unknown; прошивка — · DemoConfig::get_altiptv_data_path выбирает altiptv_data в каталоге данных плагина, /D, SMB либо указанном пути; при отсутствии выбранного каталога возвращает каталог данных плагина.</li> <li>plg-gh-mdpuma-dune-plugin-altiptv.c046 · code · unknown; прошивка — · Для SMB-хранилища DemoConfig формирует mount -t cifs с username/password из cookies на /tmp/mnt/smb/path_m, если каталог данных ещё не существует.</li> </ul> <p><a class="footnote-backref" href="#fnref:243" title="Jump back to footnote 243 in the text">↩</a></p> </li> <li id="fn:244"> <p>plg-hdtv-duneplexserver.c023 · code · unknown; прошивка — · Ручной выбор папки библиотеки открывает file_list с save_data plexlibrary; выбор папки сохраняется через HD::save_item в ветке save_folder и показывает диалог с перезапуском плагина через plugin_launcher://DunePlexServer. <a class="footnote-backref" href="#fnref:244" title="Jump back to footnote 244 in the text">↩</a></p> </li> <li id="fn:245"> <p>plg-hdtv-surface-family.c043 · code · unknown; прошивка — · SurfaceSetupScreen пакета Radiorecord.ru сохраняет bg_path и mode_path через HD::save_item, открывает экран file_list для выбора data_dir_path и dload_dir_path, а кнопка «Очистить DATA» выполняет shell_exec("rm -rf " . data_dir_path) и затем создаёт каталог заново. <a class="footnote-backref" href="#fnref:245" title="Jump back to footnote 245 in the text">↩</a><a class="footnote-backref" href="#fnref2:245" title="Jump back to footnote 245 in the text">↩</a></p> </li> <li id="fn:246"> <p>plg-hdtv-liteiptv.c084 · code · unknown; прошивка — · save_folder обрабатывает четыре режима: export_data копирует DATA в выбранную папку/<plugin_name> через HD::pCopyFolders, import_data копирует выбранную папку в DATA, pl_folder сохраняет выбранный каталог плейлистов в pl_folder, data_dir_path сохраняет выбранный каталог данных. <a class="footnote-backref" href="#fnref:246" title="Jump back to footnote 246 in the text">↩</a></p> </li> <li id="fn:247"> <p>plg-dc-torrent-center.c075 · code · unknown; прошивка — · Экран TorrServer открывает file_list с фильтром extension=torrent для добавления локального или сетевого файла. <a class="footnote-backref" href="#fnref:247" title="Jump back to footnote 247 in the text">↩</a></p> </li> <li id="fn:248"> <ul> <li>plg-hdtv-rclone.c073 · code · unknown; прошивка — · Импорт конфигурации открывает файловый браузер в режиме save_file с extension=conf и parent=setup, action=import_conf.</li> <li>plg-hdtv-rclone.c074 · code · unknown; прошивка — · При импорте плагин берёт первую секцию parse_ini_file, требует поле type и при его отсутствии показывает «Файл ... не является файлом конфигурации rclone»; иначе копирует выбранный файл целиком в <data_dir>/config.</li> <li>plg-hdtv-rclone.c100 · forum · unknown; прошивка — · Пользователь .Play.Boy. сообщает об ошибке импорта «файл rclone.config не является файлом конфигурации rclone»; автор отвечает примером секций [mega]/[drbox] с полем type.</li> </ul> <p><a class="footnote-backref" href="#fnref:248" title="Jump back to footnote 248 in the text">↩</a></p> </li> <li id="fn:249"> <ul> <li>plg-hdtv-smart-vod.c202 · code · unknown; прошивка — · smbtree::get_mount_smb эталона для каждого сохранённого SMB-ресурса, отсутствующего в результате get_df_smb, запускает фоновый mount -t cifs с posixpaths,rsize=32768,wsize=130048.</li> <li>plg-hdtv-smart-vod.c203 · code · unknown; прошивка — · smbtree::get_mount_nfs эталона для сохранённого NFS-ресурса, отсутствующего в результате get_df_nfs, вызывает mount -t nfs с сохранённым protocol и путём /tmp/mnt/network/<n>.</li> </ul> <p><a class="footnote-backref" href="#fnref:249" title="Jump back to footnote 249 in the text">↩</a></p> </li> <li id="fn:250"> <p>plg-hdtv-surface-family.c079 · code · unknown; прошивка — · SurfaceFileSystemScreen пакета Radiorecord.ru хранит SMB-пароли и имена пользователей в сериализованных файлах каталога данных (ключи user/password в дескрипторе папки) и передаёт их в mount -t cifs -o username=...,password=..., а также собирает URL smb://user:password@host. <a class="footnote-backref" href="#fnref:250" title="Jump back to footnote 250 in the text">↩</a></p> </li> <li id="fn:251"> <p>plg-hdtv-liteiptv.c086 · code · unknown; прошивка — · SMB/NFS-обзор использует класс smbtree; для platform_kind 8672, 8673 и 8758 проверка каталога SMB заменяется на shell-команду test -d, а файловый размер не запрашивается. <a class="footnote-backref" href="#fnref:251" title="Jump back to footnote 251 in the text">↩</a><a class="footnote-backref" href="#fnref2:251" title="Jump back to footnote 251 in the text">↩</a></p> </li> <li id="fn:252"> <ul> <li>plg-hdtv-rclone.c078 · code · unknown; прошивка — · Диалог настройки монтирования последовательно спрашивает каталог кеша (системный накопитель или каталоги /tmp/mnt/storage/*), режим кеша writes/full/readOnly, размер частей чтения и буфера, vfs-cache-poll-interval, максимальный размер кеша и автозапуск.</li> <li>plg-hdtv-rclone.c079 · code · unknown; прошивка — · При сохранении настроек монтирования SmartConfig::save_cache_dir_path добавляет /<plugin_name> к выбранному каталогу кеша, только если он не равен data_dir_path; при смене каталога удаляет старый командой rm -rf (для прежнего data_dir_path — <data_dir_path>/vfs); остальные параметры сохраняются через HD::save_item, кроме autostart_cache_max_size (его пишет SmartConfig::save_cache_max_size).</li> </ul> <p><a class="footnote-backref" href="#fnref:252" title="Jump back to footnote 252 in the text">↩</a></p> </li> <li id="fn:253"> <ul> <li>plg-dc-screenshoter.c065 · code · unknown; прошивка — · do.php: storage_path() = /tmp/mnt/D, если существует /system/dunehd/init, иначе /D</li> <li>plg-dc-screenshoter.c066 · code · unknown; прошивка — · do.php: imem_path() = /sdcard без HD_APK; с HD_APK — /sdcard/DuneHD, если в /config/settings.properties есть «show_builtin_memory_item = dunehd_folder», иначе /sdcard</li> <li>plg-dc-screenshoter.c067 · code · unknown; прошивка — · Снимки и видео сохраняются в <storage>/screenshots (сначала storage_path, затем imem_path); требуется более 15000 байт свободного места</li> </ul> <p><a class="footnote-backref" href="#fnref:253" title="Jump back to footnote 253 in the text">↩</a></p> </li> <li id="fn:254"> <p>plg-hdtv-smart-vod.c252 · code · unknown; прошивка — · Во всех девяти полных пакетах lib/utils.php для путей search_items и search_item вычисляет файл в родительском каталоге data_dir_path: из пути удаляется имя плагина, затем добавляется имя файла без слэша. <a class="footnote-backref" href="#fnref:254" title="Jump back to footnote 254 in the text">↩</a></p> </li> <li id="fn:255"> <ul> <li>plg-dc-globaltv.c112 · code · unknown; прошивка — · Язык интерфейса и страну виджета плагин читает из /config/settings.properties (ключи interface_language, noncustom_interface_language, widget_country, формат «ключ = значение»).</li> <li>plg-dc-globaltv.c113 · code · unknown; прошивка — · Код страны плагин берёт из country_code_2 в /tmp/location_info.properties, а при отсутствии — в /config/location_info.properties; двухбуквенный widget_country имеет приоритет.</li> </ul> <p><a class="footnote-backref" href="#fnref:255" title="Jump back to footnote 255 in the text">↩</a></p> </li> <li id="fn:256"> <p>plg-dc-screenshoter.c066 · code · unknown; прошивка — · do.php: imem_path() = /sdcard без HD_APK; с HD_APK — /sdcard/DuneHD, если в /config/settings.properties есть «show_builtin_memory_item = dunehd_folder», иначе /sdcard <a class="footnote-backref" href="#fnref:256" title="Jump back to footnote 256 in the text">↩</a></p> </li> <li id="fn:257"> <p>plg-dc-dunemdb-supplier-online-movies.c071 · code · unknown; прошивка — · Settings::apply_if_dirty пересчитывает min_s, min_q, max_q и ext_torrserver и сбрасывает закэшированный IP TorrServer; max_quality=auto выбирает 1080p при tv_4k=0 и 2160p иначе, а tv_4k читается из /tmp/run/tv_4k.txt. <a class="footnote-backref" href="#fnref:257" title="Jump back to footnote 257 in the text">↩</a></p> </li> <li id="fn:258"> <ul> <li>plg-dune-remote-control.c055 · code · unknown; прошивка — · power_on_action записывает в /config/settings.properties ключ power_on_action = favorite:<name>; power_off_action записывает default; get_power_on_action читает это значение из того же файла.</li> <li>plg-dune-remote-control.c057 · code · unknown; прошивка — · INI::write пишет каждую секцию как [key], затем ключи, отсортированные ksort, с вложенными именами через точку; true/false превращаются в строки true/false, переводы строк в значениях экранируются обратным слэшем.</li> </ul> <p><a class="footnote-backref" href="#fnref:258" title="Jump back to footnote 258 in the text">↩</a></p> </li> <li id="fn:259"> <ul> <li>plg-dc-globaltv--rows-epf.c035 · code · unknown; прошивка — · EpfsHandler сопоставляет разделу избранного EPF id section_fav, остальным разделам — section_<section_id>.</li> <li>plg-dc-globaltv.c122 · code · unknown; прошивка — · Встраиваемые папки (EPF) плагин хранит в /flashdata/plugins_epfs/<имя плагина>, временные — в /tmp/plugins/<имя плагина>/epfs.</li> </ul> <p><a class="footnote-backref" href="#fnref:259" title="Jump back to footnote 259 in the text">↩</a></p> </li> <li id="fn:260"> <p>plg-hdtv-duneplexcatalog.c057 · code · unknown; прошивка — · Кастомные иконки библиотек плагин берёт из /D/dpc_custom_icons (только .png), копирует выбранную в /persistfs/plugins_data/<каталог плагина>/lib_icons/cust_icon_<lib>.png и в icons/cust_icon_<lib>.png пакета; в диалоге Icons экрана Design для библиотеки можно выбрать plex_standard, plex_composite или custom_icon, если для неё уже сохранена иконка. <a class="footnote-backref" href="#fnref:260" title="Jump back to footnote 260 in the text">↩</a></p> </li> <li id="fn:261"> <p>plg-hdtv-megaanime.c052 · code · unknown; прошивка — · save_torrent при пустой или несуществующей папке dload_dir_path открывает выбор папки (dload_path), иначе вызывает get_torrent(series_id, <папка>/<имя>.torrent) и показывает диалог «<имя> сохранен!». <a class="footnote-backref" href="#fnref:261" title="Jump back to footnote 261 in the text">↩</a></p> </li> <li id="fn:262"> <p>plg-dc-widget-ext.c071 · code · unknown; прошивка — · Ключ API OpenWeatherMap можно загрузить из файла /D/apikey.txt или первого найденного /tmp/mnt/storage/*/apikey.txt; UTF-8 BOM в начале отбрасывается <a class="footnote-backref" href="#fnref:262" title="Jump back to footnote 262 in the text">↩</a></p> </li> <li id="fn:263"> <p>plg-gh-ytkachov-dune-hd-watch-sync.c019 · forum · Solo 8K, Pro 8K Plus, android-dune-fw; прошивка 250815_1012_r22 · Файл timestamp содержит 16 цифр — unix-время в микросекундах; значение совпадает с mtime самого файла, то есть это момент последней записи истории. <a class="footnote-backref" href="#fnref:263" title="Jump back to footnote 263 in the text">↩</a></p> </li> <li id="fn:264"> <p>plg-gh-ytkachov-dune-hd-watch-sync.c020 · forum · Solo 8K, Pro 8K Plus, android-dune-fw; прошивка 250815_1012_r22 · watched_files.txt / watched_movies.txt — строки «процент<TAB>uid» (например, 100%<TAB>smb://…); имя файла различается на плеерах, и файл почти не используется: у Pro одна строка 104 B, у Solo файл пустой. <a class="footnote-backref" href="#fnref:264" title="Jump back to footnote 264 in the text">↩</a></p> </li> <li id="fn:265"> <ul> <li>plg-gh-ytkachov-dune-hd-watch-sync.c006 · forum · Solo 8K, Pro 8K Plus, android-dune-fw; прошивка 250815_1012_r22 · История и позиции хранятся только на самом плеере, в приватном каталоге /data/data/com.dunehd.app/; на NAS ничего не записывается.</li> <li>plg-gh-ytkachov-dune-hd-watch-sync.c007 · forum · Solo 8K, Pro 8K Plus, android-dune-fw; прошивка 250815_1012_r22 · Позиции воспроизведения есть ровно в одном месте — config/watch_history/; в flashdata/ поля pos нет ни в индексе, ни в кэше папок, ни в кэше метаданных.</li> </ul> <p><a class="footnote-backref" href="#fnref:265" title="Jump back to footnote 265 in the text">↩</a></p> </li> <li id="fn:266"> <p>plg-gh-ytkachov-dune-hd-watch-sync.c049 · code · unknown; прошивка — · push_history отказывается писать историю, если в источнике нет *.json-файлов, кладёт шарды в /data/local/tmp/dunesync и заливает их туда через adb push. <a class="footnote-backref" href="#fnref:266" title="Jump back to footnote 266 in the text">↩</a></p> </li> <li id="fn:267"> <ul> <li>plg-dc-torrent-center.c143 · code · unknown; прошивка — · Экспорт и импорт DATA в SmartFileSystemScreen копируют каталог через HD::pCopyFolders между data_dir_path и выбранной папкой.</li> <li>plg-dc-torrent-center.c144 · code · unknown; прошивка — · HD::pCopyFolders обходит исходный каталог через RecursiveDirectoryIterator, создаёт каталоги и копирует файлы функцией copy.</li> </ul> <p><a class="footnote-backref" href="#fnref:267" title="Jump back to footnote 267 in the text">↩</a></p> </li> <li id="fn:268"> <p>plg-hdtv-altsource.c049 · code · unknown; прошивка — · Экспорт DATA копирует data_dir_path в выбранную папку рекурсивно через HD::pCopyFolders, импорт — обратно из <папка>/<plugin_name>; очистка DATA удаляет data_dir_path и создаёт его заново, сохраняя файл data_dir_path. <a class="footnote-backref" href="#fnref:268" title="Jump back to footnote 268 in the text">↩</a><a class="footnote-backref" href="#fnref2:268" title="Jump back to footnote 268 in the text">↩</a></p> </li> <li id="fn:269"> <ul> <li>plg-hdtv-liteiptv.c084 · code · unknown; прошивка — · save_folder обрабатывает четыре режима: export_data копирует DATA в выбранную папку/<plugin_name> через HD::pCopyFolders, import_data копирует выбранную папку в DATA, pl_folder сохраняет выбранный каталог плейлистов в pl_folder, data_dir_path сохраняет выбранный каталог данных.</li> <li>plg-hdtv-liteiptv.c088 · code · unknown; прошивка — · HD::pCopyFolders рекурсивно копирует каталог через RecursiveDirectoryIterator/RecursiveIteratorIterator, создаёт отсутствующие каталоги и возвращает строку с числом скопированных файлов и папок.</li> </ul> <p><a class="footnote-backref" href="#fnref:269" title="Jump back to footnote 269 in the text">↩</a></p> </li> <li id="fn:270"> <p>plg-hdtv-megaanime.c026 · code · unknown; прошивка — · Диалог «Папка DATA» предлагает выгрузить DATA в выбранную папку, загрузить DATA из папки или файла и очистить DATA; выгрузка и загрузка из папки вызывают HD::pCopyFolders, очистка — shell_exec "rm -rf <data_dir_path>" и mkdir. <a class="footnote-backref" href="#fnref:270" title="Jump back to footnote 270 in the text">↩</a><a class="footnote-backref" href="#fnref2:270" title="Jump back to footnote 270 in the text">↩</a></p> </li> <li id="fn:271"> <p>plg-hdtv-megaradio.c117 · code · unknown; прошивка — · Настройки DATA позволяют экспортировать папку data_dir_path, импортировать папку или файл и очистить DATA; clear_data выполняет rm -rf каталога data_dir_path и создаёт его заново с правами 0777. <a class="footnote-backref" href="#fnref:271" title="Jump back to footnote 271 in the text">↩</a></p> </li> <li id="fn:272"> <ul> <li>plg-hdtv-smart-vod.c141 · code · unknown; прошивка — · При control_id=save_folder и save_data=export_data эталон запускает cp -rf data_dir_path в выбранный filepath в фоне.</li> <li>plg-hdtv-smart-vod.c142 · code · unknown; прошивка — · При control_id=save_folder, save_data, отличном от export_data, и save_data=import_data эталон запускает фоновый cp -rf filepath/* в data_dir_path.</li> </ul> <p><a class="footnote-backref" href="#fnref:272" title="Jump back to footnote 272 in the text">↩</a></p> </li> <li id="fn:273"> <p>plg-hdtv-surface-family.c086 · code · unknown; прошивка — · Экспорт и импорт DATA в SurfaceFileSystemScreen пакета Radiorecord.ru выполняются командой cp -rf в фоне через shell_exec(... > /dev/null &): export_data копирует data_dir_path в выбранную папку, import_data — из выбранной папки в data_dir_path. <a class="footnote-backref" href="#fnref:273" title="Jump back to footnote 273 in the text">↩</a></p> </li> <li id="fn:274"> <p>plg-gh-mdpuma-dune-plugin-altiptv.c096 · code · unknown; прошивка — · Настройки export_myiptv_channels_id/import_myiptv_channels_id запускают фоновое копирование altiptv_data на /D либо с /D/altiptv_data обратно. <a class="footnote-backref" href="#fnref:274" title="Jump back to footnote 274 in the text">↩</a></p> </li> <li id="fn:275"> <p>plg-dc-dune-backup.c110 · code · unknown; прошивка — · Пункт «Выгрузить скрипты» копирует .sh и .png из plugins_data плагина в выбранную папку накопителя; пункт «Загрузить скрипты» копирует .sh и .png из выбранной папки в plugins_data, выставляет chmod -R 777 и возвращает !update_list! для обновления списка. <a class="footnote-backref" href="#fnref:275" title="Jump back to footnote 275 in the text">↩</a></p> </li> <li id="fn:276"> <p>plg-hdtv-folder-cache-vod.c090 · code · unknown; прошивка — · Действия export_ytv_data и import_ytv_data копируют содержимое data_dir_path в /D/YTV_data и обратно; export при отсутствии /D показывает сообщение подключить накопитель, при отсутствии /D/YTV_data создаёт каталог, а import при отсутствии /D/YTV_data/ показывает сообщение. <a class="footnote-backref" href="#fnref:276" title="Jump back to footnote 276 in the text">↩</a></p> </li> <li id="fn:277"> <p>plg-hdtv-liteiptv.c058 · code · unknown; прошивка — · Диалог DATA позволяет выбрать каталог данных, выгрузить DATA в выбранную папку, загрузить папку или файл в DATA и очистить DATA командой rm -rf с последующим mkdir. <a class="footnote-backref" href="#fnref:277" title="Jump back to footnote 277 in the text">↩</a></p> </li> <li id="fn:278"> <p>plg-gh-mdpuma-dune-plugin-altiptv.c106 · code · unknown; прошивка — · del_alt_logo удаляет каталог altiptv_data и запускает фоновое копирование стандартного data из install_dir_path. <a class="footnote-backref" href="#fnref:278" title="Jump back to footnote 278 in the text">↩</a></p> </li> <li id="fn:279"> <p>plg-hdtv-megaanime.c022 · code · unknown; прошивка — · Проверка check для viewed_items и файлов из check_items (save_folder, favorite_movies и пользовательские избранные включаются в него в настройках) сравнивает количество элементов с копией .bak: если текущий файл больше, он сохраняется в .bak; если текущий пуст, а .bak не пуст, показывается диалог с кнопками «Востановить из резервного файла» (restore_yes) и «Не востанавливать» (restore_no). <a class="footnote-backref" href="#fnref:279" title="Jump back to footnote 279 in the text">↩</a></p> </li> <li id="fn:280"> <p>plg-dc-widget-ext.c079 · code · unknown; прошивка — · install.sh и update.sh переносят настройки старых версий (из /tmp/run/widget_ext.properties или <плагин>/conf/settings.properties) в каталог данных; комментарий: «Needed for upgrade from 1.0.0 and 1.0.1» <a class="footnote-backref" href="#fnref:280" title="Jump back to footnote 280 in the text">↩</a></p> </li> <li id="fn:281"> <p>plg-gh-valerievitch-dune-plugin-acestreamsearch.c058 · code · unknown; прошивка — · В AceSearchSetupScreen при confirm и control_id=clear_history со значением yes история очищается, после чего показывается диалог T::t('history_cleared') с пересозданными контролами. <a class="footnote-backref" href="#fnref:281" title="Jump back to footnote 281 in the text">↩</a></p> </li> <li id="fn:282"> <ul> <li>plg-dc-dune-backup.c060 · code · unknown; прошивка — · Папка бэкапа создаётся как <накопитель>/dune_bcp/bcp_ГГГГ_ММ_ДД, а при наличии файла settings/BackUp-separate-minute — с добавкой -ЧЧ.ММ; в конец имени добавляется ID/модель с заменой пробелов на подчёркивания.</li> <li>plg-dc-dune-backup.c061 · code · unknown; прошивка — · Файл бэкапа получает имя <тип>-<число_элементов>_(<ID или модель>)<em>ГГГГ.ММ.ДД-ЧЧ.ММ</em><флаг>.dbcp; флаг присваивается последовательно в порядке приоритета s → S → A → N, где каждое следующее присваивание перекрывает предыдущее — s по умолчанию, S при наличии /persistfs/plugins, A при interface_language_synchronized, N при apk_interface_language_changed в config/settings.properties; поэтому при ключе A флаг A даже на системе с /persistfs/plugins, а при наличии обоих ключей — N.</li> </ul> <p><a class="footnote-backref" href="#fnref:282" title="Jump back to footnote 282 in the text">↩</a></p> </li> <li id="fn:283"> <ul> <li>plg-dc-dune-backup.c073 · code · unknown; прошивка — · Служебный script save.sh при вызове без трёх аргументов выполняет служебные режимы mesg, warning, setup, date, future, info_now, info_fut, change, test_date и test_storage; режим change переключает файл BackUp-separate-minute.</li> <li>plg-dc-dune-backup.c074 · code · unknown; прошивка — · Пункт «Выбор режима сохранения Бэкапов в папки» переключает режим через script save.sh change и возвращает !return_start! для перезапуска текущего пункта.</li> </ul> <p><a class="footnote-backref" href="#fnref:283" title="Jump back to footnote 283 in the text">↩</a></p> </li> <li id="fn:284"> <ul> <li>plg-dc-dune-backup.c058 · code · unknown; прошивка — · script save.sh предупреждает, что для бэкапов нежелательно использовать встроенную память Android (/data/media/0/DuneHD или /sdcard/DuneHD), и сообщает о неверной системной дате, если она раньше 2026-08-01.</li> <li>plg-dc-dune-backup.c072 · code · unknown; прошивка — · Перед созданием каждого бэкапа script save.sh проверяет доступность накопителя, непустоту списка данных и наличие каждого его элемента; при пустом списке, отсутствии накопителя или элемента пишет сообщение об ошибке в .sms и завершается.</li> </ul> <p><a class="footnote-backref" href="#fnref:284" title="Jump back to footnote 284 in the text">↩</a></p> </li> <li id="fn:285"> <ul> <li>plg-dc-dune-backup.c067 · code · unknown; прошивка — · В бэкап «Моя коллекция» входят config/movie_index_config.xml, каталоги flashdata (или persistfs) fb_cache, movie_index, dunemdb_cache, image_cache, custom_mdb, config/my_collection.properties, lcfg_mc_categories.txt и файлы mc/mdb/search_timestamp, mdb_image_state.json; без movie_index_config.xml с id= список очищается.</li> <li>plg-dc-dune-backup.c068 · code · unknown; прошивка — · В бэкап «Сетевые папки» входят config/network_folders.properties и config/lcfg_sources.txt; если в properties нет type, базовый список очищается, но lcfg_sources.txt добавляется после этого, если файл есть.</li> <li>plg-dc-dune-backup.c069 · code · unknown; прошивка — · В бэкап «Плагины» входят flashdata/plugins/, flashdata/plugins_data/ (на persistfs — соответствующие каталоги), D/dune_plugins/, все config/<em>_plugin_cookies.properties, config/lcfg_dune_apps_type</em>.txt, lcfg_all_apps.txt, lcfg_type*_android_apps.txt и lcfg_android_apps.txt; epg_cache плагина proiptv исключается.</li> <li>plg-dc-dune-backup.c070 · code · unknown; прошивка — · В бэкап «Избранное, Последнее» входят flashdata или persistfs main_screen_items/, config/watch_history/ и config/lcfg_favorites.txt.</li> <li>plg-dc-dune-backup.c071 · code · unknown; прошивка — · В бэкап «Настройки Dune Shell» входят config/settings.properties, android_apps_plugin_cookies.properties, bg.jpg, flashdata или persistfs dune_skin/, services_effective_config.json, services_default_config.json, services_on_off.txt, user_folder_settings.json, shell_ext_plugin_cookies.properties, plugins_data/shell_ext/, bluray_plugin_cookies.properties, plugins_data/bluray/, sections_menu_renamed.txt, hidden_plugins.txt, dunemdb_supplier_online_movies_plugin_cookies.properties и все config/lcfg_*.txt.</li> </ul> <p><a class="footnote-backref" href="#fnref:285" title="Jump back to footnote 285 in the text">↩</a></p> </li> <li id="fn:286"> <ul> <li>plg-dc-dune-backup.c065 · code · unknown; прошивка — · Перед записью нового бэкапа плагин удаляет из папки все файлы и каталоги, имя которых начинается с того же типа (find ... -name "<тип>-*" -exec rm).</li> <li>plg-dc-dune-backup.c066 · code · unknown; прошивка — · При сохранении плагин пытается скачать свежий dune_plugin_Dune_backup.zip с http://dune-club.info/usersl/Dune_backup/dune_plugin_Dune_backup.zip (если файла нет в tmp и пинг домена успешен) и при изменении md5 копирует архив в dune_bcp.</li> </ul> <p><a class="footnote-backref" href="#fnref:286" title="Jump back to footnote 286 in the text">↩</a></p> </li> <li id="fn:287"> <ul> <li>plg-dc-dune-backup.c080 · code · unknown; прошивка — · Если передан каталог, script upload.sh ищет в нём ровно один файл <тип>-*; отсутствие файла или несколько файлов считаются ошибкой. Если передан файл, тип берётся из его имени.</li> <li>plg-dc-dune-backup.c081 · code · unknown; прошивка — · Число элементов бэкапа script upload.sh извлекает из имени файла после <тип>-, требует непустое целое и отвергает нулевое значение.</li> </ul> <p><a class="footnote-backref" href="#fnref:287" title="Jump back to footnote 287 in the text">↩</a></p> </li> <li id="fn:288"> <ul> <li>plg-dc-dune-backup.c088 · code · unknown; прошивка — · Для My_collection и Settings при флаге платформы не 1 script upload.sh, если существует config/lcfg_mc_categories.txt, пересобирает его: строки folder: оставляет только при наличии id в config/movie_index_config.xml, остальные строки сохраняет; если существует config/mc_timestamp, пишет в него текущий timestamp.</li> <li>plg-dc-dune-backup.c089 · code · unknown; прошивка — · Для плагина Bazinga3 при восстановлении script upload.sh заменяет в именах файлов plugins_data/Bazinga3 старый MAC на текущий из tmp/plugins/Dune_backup/mac_addr и предупреждает об нестандартном каталоге DATA.</li> <li>plg-dc-dune-backup.c090 · code · unknown; прошивка — · После восстановления for_php-cgi.sh заменяет php-cgi в плагинах из списка восстановленных (file_tar_log), кроме test_php-cgi и каталогов с 86/87 в имени, на копию php-cgi из плагина test_php-cgi (или символическую ссылку с тем же target, если там ссылка), если размер, md5 или ссылка отличаются.</li> <li>plg-dc-dune-backup.c091 · code · unknown; прошивка — · for_common.setting.sh ищет в plugins_data файлы common.settings с сериализованным ключом channels_list_path и заменяет в них путь /persistfs/plugins или /flashdata/plugins на фактический путь текущей платформы с префиксом FS_PREFIX.</li> </ul> <p><a class="footnote-backref" href="#fnref:288" title="Jump back to footnote 288 in the text">↩</a></p> </li> <li id="fn:289"> <ul> <li>plg-dc-dune-backup.c094 · code · unknown; прошивка — · Пункт «Восстановить Бэкапы из файлов» ищет в корне выбранного накопителя файлы My_collection<em>, Network_folders</em>, Plugins<em>, Favorites+Recent</em>, Settings* и One_plugin_{<em>}</em>, при необходимости переименовывает подчёркивание после типа в дефис и для каждого файла вызывает script upload.sh с соответствующим маркером перезагрузки.</li> <li>plg-dc-dune-backup.c096 · code · unknown; прошивка — · Пункты восстановления выставляют маркеры в .sms: My_collection и Settings — !OFF_ON!, Network_folders, Plugins, Favorites+Recent и одиночный плагин — !reboot!.</li> </ul> <p><a class="footnote-backref" href="#fnref:289" title="Jump back to footnote 289 in the text">↩</a></p> </li> <li id="fn:290"> <p>plg-dc-globaltv.c161 · code · unknown; прошивка — · HD::write_to_file_using_tmp пишет <path>.tmp и заменяет файл через rename, удаляя tmp при ошибке rename; write_to_file_using_tmp_if_changed перед записью сравнивает содержимое и возвращает 0 без записи, 1 после замены или -1 при ошибке записи/rename. <a class="footnote-backref" href="#fnref:290" title="Jump back to footnote 290 in the text">↩</a></p> </li> <li id="fn:291"> <ul> <li>plg-dc-dunemdb-supplier-movies-eng.c047 · code · unknown; прошивка — · FileAPI.writeResult пишет результат в res.json.part и переименовывает его в res.json; getCmd читает cmd-файл и удаляет его.</li> <li>plg-dc-dunemdb-supplier-movies-eng.c046 · code · unknown; прошивка — · FileAPI при создании удаляет командный файл и файл результата и создаёт их родительский каталог.</li> </ul> <p><a class="footnote-backref" href="#fnref:291" title="Jump back to footnote 291 in the text">↩</a></p> </li> <li id="fn:292"> <ul> <li>plg-dc-widget-ext.c055 · code · unknown; прошивка — · Результат погоды плагин пишет в $FS_PREFIX/tmp/weather.txt одной строкой «<температура> <тип> <подпись>» атомарно: через .tmp и mv -f</li> <li>plg-dc-widget-ext.c095 · code · android-dune-fw; прошивка 260827_0003_r24 · Встроенный плагин прошивки widget (bin/run_widget.sh) пишет погоду в тот же файл $FS_PREFIX/tmp/weather.txt, что и Widget Ext, в том же формате «temp type city» и тем же приёмом (.tmp и mv -f)</li> </ul> <p><a class="footnote-backref" href="#fnref:292" title="Jump back to footnote 292 in the text">↩</a></p> </li> <li id="fn:293"> <p>plg-dc-widget-ext.c058 · code · unknown; прошивка — · Скрипт OpenWeatherMap берёт тот же lock-файл $FS_PREFIX/tmp/run/widget.lock и тем же приёмом (set -C), что и run_widget.sh прошивки tv188b <a class="footnote-backref" href="#fnref:293" title="Jump back to footnote 293 in the text">↩</a></p> </li> <li id="fn:294"> <ul> <li>plg-gh-vladikshkwok-lampa-dune-plugins.c032 · code · android; прошивка — · LampaDuneBridge::save() создаёт каталог с правами 0700, пишет временный файл с правами 0600, при необходимости меняет владельца на владельца bridge.php и переименовывает файл в session.json.</li> <li>plg-gh-vladikshkwok-lampa-dune-plugins.c031 · forum · android; прошивка — · Комментарий bridge.php объясняет смену владельца каталога сессии тем, что HTTP CGI Dune на некоторых прошивках работает от root, а GUI-обработчик PHP — от владельца плагина.</li> <li>plg-gh-vladikshkwok-lampa-dune-plugins.c033 · code · android; прошивка — · LampaDuneBridge::load() отвергает сессию старше 43200 секунд (12 часов) исключением no_recent_session.</li> <li>plg-gh-vladikshkwok-lampa-dune-plugins.c024 · code · android; прошивка — · Каталог сессии моста — /tmp/lampa_dune_bridge, если переменная окружения LAMPA_DUNE_TEST_DIR не задана.</li> </ul> <p><a class="footnote-backref" href="#fnref:294" title="Jump back to footnote 294 in the text">↩</a></p> </li> <li id="fn:295"> <ul> <li>plg-dc-globaltv.c088 · code · unknown; прошивка — · Список каналов плагин скачивает как архив cache2.zip, проверяя изменения по cache.timestamp; оба URL можно переопределить файлами /config/globaltv_cache_url и /config/globaltv_ts_url.</li> <li>plg-dc-globaltv.c089 · code · unknown; прошивка — · Архив кэша плагин распаковывает shell-командой unzip через system() в каталоге данных; результат — main_cache.json, переименовываемый в active_cache.json.</li> <li>plg-dc-globaltv.c162 · code · unknown; прошивка — · Обновление кэша каналов сохраняет старый active_cache.json только при неудаче загрузки архива или записи main_cache.zip: если файл уже существует, плагин продолжает работать со старым кэшем. Перед unzip active_cache.json и tv_cache*.json удаляются, поэтому ошибка распаковки, отсутствие main_cache.json или ошибка rename приводят к ошибке загрузки кэша. При успехе main_cache.json заменяет active_cache.json через rename, затем переносится метка timestamp.</li> </ul> <p><a class="footnote-backref" href="#fnref:295" title="Jump back to footnote 295 in the text">↩</a></p> </li> <li id="fn:296"> <ul> <li>plg-dc-globaltv.c103 · code · unknown; прошивка — · Плагин отдаёт список каналов не в ответе get_tv_info, а файлом: PluginTvInfo::channels_file = путь к tv_cache_<section>.json в каталоге данных.</li> <li>plg-dc-globaltv.c172 · code · unknown; прошивка — · MainTv::ensure_tv_cache перед проверкой файла вызывает sync_xxx_cache; если пароль из /config/parental_control_password.txt отличается от <data_dir>/tv_password.txt, плагин удаляет tv_cache_xxx.json и tv_cache_all.json, а затем записывает новый пароль или удаляет tv_password.txt при пустом пароле.</li> </ul> <p><a class="footnote-backref" href="#fnref:296" title="Jump back to footnote 296 in the text">↩</a></p> </li> <li id="fn:297"> <p>plg-dc-dunemdb-supplier-movies-eng.c054 · code · unknown; прошивка — · OMServerClient читает порядок источников из <serverUrl>/config, кэширует ответ в config_cache.json и загружает его в фоновом потоке order_lists_loader. <a class="footnote-backref" href="#fnref:297" title="Jump back to footnote 297 in the text">↩</a></p> </li> <li id="fn:298"> <ul> <li>plg-gh-kocourkuba-proiptv.c058 · code · unknown; прошивка — · is_playlist_cache_expired считает кэш плейлиста (пара .m3u8 + .db в data/playlist_cache) устаревшим, если файлов нет или mtime + настройка PARAM_PLAYLIST_CACHE_TIME_IPTV/VOD (часы) не больше текущего времени; для is_tv при активном провайдере с непустым id, отличным от PARAM_DEFAULT_CONFIG_PLAYLIST_ID, к имени настройки добавляется суффикс _<id>, а PHP_INT_MAX означает вечный кэш.</li> <li>plg-gh-kocourkuba-proiptv.c060 · code · unknown; прошивка — · При флаге CACHE_RESPONSE и режиме GET_CONTENT Curl_Wrapper кэширует тело ответа в файле data/curl_cache/<subdir>/<md5(url [+ post body])> на file_cache_time часов; при флаге USE_ETAG и наличии сохранённой копии тела и ETag в SQLite etags.db отправляет If-None-Match, а ответ 304 или совпавший ETag для GET_CONTENT отдаёт сохранённую копию.</li> </ul> <p><a class="footnote-backref" href="#fnref:298" title="Jump back to footnote 298 in the text">↩</a></p> </li> <li id="fn:299"> <ul> <li>plg-hdtv-altsource.c066 · code · unknown; прошивка — · Кэш метаданных элемента — JSON <data_dir_path>/items/<itemId>.json и постер <itemId>.jpg; JSON содержит caption, caption_original, year, рейтинги, country, description, myShowsID и другие поля Kinopoisk.</li> <li>plg-hdtv-altsource.c067 · code · unknown; прошивка — · Идентификатор элемента для кэша — basename папки, а для видео/аудио — series_id; series_id вычисляет FileList::getFileId как md5(dirname + basename) и кэширует до 1000 значений.</li> </ul> <p><a class="footnote-backref" href="#fnref:299" title="Jump back to footnote 299 in the text">↩</a></p> </li> <li id="fn:300"> <ul> <li>plg-hdtv-duneplexcatalog.c045 · code · unknown; прошивка — · DPC_cache хранит файлы в /persistfs/plugins_data/<basename плагина>/<id>/; для info, thumb и photo создаются отдельные каталоги, set_to_cache_url скачивает URL в файл и возвращает локальный путь.</li> <li>plg-hdtv-duneplexcatalog.c046 · code · unknown; прошивка — · DN::get_cache_size и DN::clear_cache управляют кэшем shell-командами du -h /persistfs/plugins_data/dpc/<cache> и rm /persistfs/plugins_data/dpc/<cache>/*.</li> </ul> <p><a class="footnote-backref" href="#fnref:300" title="Jump back to footnote 300 in the text">↩</a></p> </li> <li id="fn:301"> <p>plg-dc-bazinga3.c041 · code · unknown; прошивка — · SmartVod::try_load_movie кэширует разобранные данные фильма в <data>/pluginCache/md5(movie_id.class_name).srz (при posterCashe=1 для избранного) и подставляет кэшированный постер <md5(mUrl)>.jpg. <a class="footnote-backref" href="#fnref:301" title="Jump back to footnote 301 in the text">↩</a></p> </li> <li id="fn:302"> <ul> <li>plg-hdtv-zlostnyi-iptv.c109 · code · unknown; прошивка — · itv получает список каналов JSON: шаблон http://zlostnyi.tech/dune/itv/playlist с заменой «-ottkey-» на ott_key даёт URL, который читается file_get_contents и кэшируется в /tmp/itv_api_new; при наличии файла сеть не запрашивается.</li> <li>plg-hdtv-zlostnyi-iptv.c116 · code · unknown; прошивка — · При сохранении ключа (ott_key_apply) itv записывает cookie ott_key, удаляет /tmp/itv_api_new (unlink) и перезагружает каналы.</li> <li>plg-hdtv-zlostnyi-iptv.c117 · code · unknown; прошивка — · В itv один файл /tmp/itv_api_new служит кэшем двум разным ответам: списку каналов (load_channels, экран настроек) и USER_INFO api.itv.live/data/<ключ> (get_tv_playback_url) — кто запишет первым, тот и останется.</li> </ul> <p><a class="footnote-backref" href="#fnref:302" title="Jump back to footnote 302 in the text">↩</a></p> </li> <li id="fn:303"> <p>plg-hdtv-freetv.c023 · code · unknown; прошивка — · Кнопка «Очистить кэш EPG» удаляет все файлы из DuneSystem::$properties['tmp_dir_path'] через array_map('unlink', glob(...)). <a class="footnote-backref" href="#fnref:303" title="Jump back to footnote 303 in the text">↩</a></p> </li> <li id="fn:304"> <ul> <li>plg-gh-sndpl-apple-trailers-dune-plugin.c035 · code · unknown; прошивка — · TrailerDatabase переиспользует глобальную переменную $appleTrailerDatabase: если она задана, конструктор берёт базу оттуда, иначе loadTrailers загружает ленты и записывает результат в эту глобальную переменную.</li> <li>plg-gh-sndpl-apple-trailers-dune-plugin.c033 · code · unknown; прошивка — · loadTrailers загружает шесть лент trailers.apple.com: studios.json, just_added.json, genres.json, exclusive.json, just_hd.json, most_pop.json.</li> </ul> <p><a class="footnote-backref" href="#fnref:304" title="Jump back to footnote 304 in the text">↩</a></p> </li> <li id="fn:305"> <ul> <li>plg-hdtv-smart-vod--link-api.c017 · code · unknown; прошивка — · uStore::getIframe кэширует разобранную структуру в файле cacheLinkApiUst: при неопределённой константе PluginRegularFolderView::async_icon_loading пишет serialize($sArr), а при определённой читает и удаляет файл.</li> <li>plg-hdtv-smart-vod--link-api.c024 · code · unknown; прошивка — · kinokrad::getIframe разбирает filmSource и JSON playlist, но в качестве кэш-файла берёт cacheLinkApiUst (как uStore), а запись выполняет только при isset($cacheLinkApiKT), которая в функции не задана.</li> </ul> <p><a class="footnote-backref" href="#fnref:305" title="Jump back to footnote 305 in the text">↩</a></p> </li> <li id="fn:306"> <p>plg-hdtv-smart-vod.c111 · code · unknown; прошивка — · При get_folder_view списка фильмов эталон очищает кэш фильмов и счётчик total, сбрасывает m_feed в 0 перед folder_entered и родительским get_folder_view. <a class="footnote-backref" href="#fnref:306" title="Jump back to footnote 306 in the text">↩</a></p> </li> <li id="fn:307"> <ul> <li>plg-dc-widget-ext.c029 · code · unknown; прошивка — · Выбранный элемент папки передаётся в handle_user_input как $user_input->selected_media_url; плагин кодирует в media_url пользовательские данные через HD::encode_user_data / HD::decode_user_data</li> <li>plg-dc-widget-ext--lib.c055 · code · unknown; прошивка — · HD::encode_user_data добавляет к media_url разделитель || и JSON user_data; при единственном аргументе-массиве префикс media_url пустой.</li> <li>plg-dc-widget-ext--lib.c056 · code · unknown; прошивка — · HD::decode_user_data разбивает строку по первому || и json_decode суффикса; без разделителя user_data равен null.</li> </ul> <p><a class="footnote-backref" href="#fnref:307" title="Jump back to footnote 307 in the text">↩</a></p> </li> <li id="fn:308"> <ul> <li>plg-dc-dunemdb-supplier-movies-rus.c044 · code · unknown; прошивка — · get_episodes собирает ответ из сезонов с номерами 0…99 и эпизодов 0…999, сортирует их strnatcmp и возвращает seasons (у сезона number и episodes, у эпизода только number) плюс private — JSON с pub_by_id и files_by_ep_key.</li> <li>plg-dc-dunemdb-supplier-movies-rus.c045 · code · unknown; прошивка — · В ветке series + video do_file_search берёт pub_by_id и files_by_ep_key из private, строит ключ s<season>e<episode> (по умолчанию -1) и возвращает пустой список со status done, если private нет, он не разобран, в нём нет files_by_ep_key/pub_by_id или нет ключа.</li> <li>plg-dc-dunemdb-supplier-movies-rus.c046 · code · unknown; прошивка — · В ветке series + video для каждого файла эпизода do_file_search резолвит поток и при null от do_get_stream_url файл пропускает; в files кладёт объект с id = JSON {pub_id, file_url}, order, caption публикации с « - Season S» при season >= 0 и « - Episode E» при episode >= 0 и quality HD; файл с pub_id из валидного fileId ставится первым, а если pub_id файла нет в pub_by_id, возвращается уже собранный список со status done.</li> </ul> <p><a class="footnote-backref" href="#fnref:308" title="Jump back to footnote 308 in the text">↩</a></p> </li> <li id="fn:309"> <p>plg-dc-dunemdb-supplier-online-movies.c072 · code · unknown; прошивка — · State::enter_movie кэширует навигационный MovieTorrents и переиспользует play_mts/playstart_mts только при is_playing, совпадении movie->id и отсутствии dirty; иначе создаёт MovieTorrents и при неудаче open возвращает пустой массив. <a class="footnote-backref" href="#fnref:309" title="Jump back to footnote 309 in the text">↩</a></p> </li> <li id="fn:310"> <p>plg-gh-aspel-twitch-dune-plugin.c057 · code · unknown; прошивка — · TwitchPlugin::get_vod_info использует поля stream_name, img, status_stream и game_name, которые заполняются только в ветке streams: метода get_folder_view; других присваиваний этим полям в пакете нет. <a class="footnote-backref" href="#fnref:310" title="Jump back to footnote 310 in the text">↩</a></p> </li> <li id="fn:311"> <p>plg-hdtv-altsource.c029 · code · unknown; прошивка — · Жёлтая кнопка циклически переключает статический фильтр файлов: false (все) → video_file → audio_file → image_file → all; в истории фильтр не показывается. <a class="footnote-backref" href="#fnref:311" title="Jump back to footnote 311 in the text">↩</a></p> </li> <li id="fn:312"> <p>plg-hdtv-liteiptv.c059 · code · unknown; прошивка — · Обновление vsetv скачивает http://www.vsetv.com/channels.html, разбирает option value=channel_<id>, сохраняет vsetv_channels_id, vsetv_channels и vsetv_date; при входе та же загрузка выполняется, если файла vsetv_channels_id нет или прошло больше 604800 секунд. <a class="footnote-backref" href="#fnref:312" title="Jump back to footnote 312 in the text">↩</a></p> </li> <li id="fn:313"> <p>plg-ds-dune-hd-tv.c062 · code · unknown; прошивка — · Кэш rows-экрана: MainHelper задаёт в tmp_dir_path плагина пути main_cache.json и wake_flag и URL основного кэша http://dunemdb.dune-hd.com/dunehdtv/cache.json; EpfsHandler::wait_if_needed сразу выходит, если интернета нет или файл кэша уже есть, иначе до 100 раз по 0,1 с ждёт файл кэша, проверяя интернет каждые 5 итераций. <a class="footnote-backref" href="#fnref:313" title="Jump back to footnote 313 in the text">↩</a></p> </li> <li id="fn:314"> <p>doc-sdk-plugins.c143 · doc · any-documented; прошивка — · Global plugin actions поддерживают системные события boot, install, update и uninstall <a class="footnote-backref" href="#fnref:314" title="Jump back to footnote 314 in the text">↩</a></p> </li> <li id="fn:315"> <p>doc-sdk-plugins.c144 · doc · any-documented; прошивка — · Событие boot_end (в самом конце холодной загрузки) доступно с прошивки 130917_b9 <a class="footnote-backref" href="#fnref:315" title="Jump back to footnote 315 in the text">↩</a></p> </li> <li id="fn:316"> <p>doc-sdk-plugins.c145 · doc · any-documented; прошивка — · Событие gui_start (при старте родного GUI Dune) доступно с прошивки 130914_b8 <a class="footnote-backref" href="#fnref:316" title="Jump back to footnote 316 in the text">↩</a></p> </li> <li id="fn:317"> <p>doc-sdk-plugins.c146 · doc · any-documented; прошивка — · Для события boot поддерживается только действие plugin_system <a class="footnote-backref" href="#fnref:317" title="Jump back to footnote 317 in the text">↩</a><a class="footnote-backref" href="#fnref2:317" title="Jump back to footnote 317 in the text">↩</a></p> </li> <li id="fn:318"> <p>fw-tv188b-261021-0117-r25.c077 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 при следующих стартах приложения (после am force-stop и после restart_gui) boot и boot_end плагина test_plugin5 не выполнялись повторно — в shell.log «[plugin] test_plugin5: boot action already executed» и «[plugin] test_plugin5: GUI boot action already executed». <a class="footnote-backref" href="#fnref:318" title="Jump back to footnote 318 in the text">↩</a></p> </li> <li id="fn:319"> <p>fw-tv188b-261021-0117-r25.c079 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 gui_start плагина test_plugin5 выполнялся при каждом старте приложения Dune в прогоне — 13:24:29, 13:35:32, 13:40:55 (после am force-stop) и 13:45:18 (после restart_gui); строки «already executed» для него нет. <a class="footnote-backref" href="#fnref:319" title="Jump back to footnote 319 in the text">↩</a></p> </li> <li id="fn:320"> <p>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/test_plugin5/bin/ga.sh boot)» — с префиксом sh и абсолютным путём каталога плагина. <a class="footnote-backref" href="#fnref:320" title="Jump back to footnote 320 in the text">↩</a></p> </li> <li id="fn:321"> <p>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 — абсолютный путь скрипта. <a class="footnote-backref" href="#fnref:321" title="Jump back to footnote 321 in the text">↩</a></p> </li> <li id="fn:322"> <p>plg-hdtv-cleanup.c002 · code · unknown; прошивка — · global_actions/boot_end объявляет plugin_system с run_string bin/cleanup_daemon.sh & — демон очистки запускается в конце загрузки в фоне. <a class="footnote-backref" href="#fnref:322" title="Jump back to footnote 322 in the text">↩</a></p> </li> <li id="fn:323"> <p>plg-hdtv-dlna-renderer.c002 · code · unknown; прошивка — · global_actions/boot_end объявляет plugin_system с run_string bin/gmediarender-ctl start & — рендерер запускается в конце загрузки. <a class="footnote-backref" href="#fnref:323" title="Jump back to footnote 323 in the text">↩</a></p> </li> <li id="fn:324"> <p>plg-hdtv-torrserve.c002 · code · unknown; прошивка — · global_actions/boot_end объявляет действие plugin_system с run_string bin/boot.sh &, то есть при завершении загрузки оболочка запускает скрипт плагина в фоне. <a class="footnote-backref" href="#fnref:324" title="Jump back to footnote 324 in the text">↩</a></p> </li> <li id="fn:325"> <ul> <li>plg-hdtv-dlna-renderer.c007 · code · unknown; прошивка — · Манифест объявляет type plain; params/program, entry_points, version, version_index и check_update в нём отсутствуют.</li> <li>plg-hdtv-dlna-renderer.c003 · code · unknown; прошивка — · global_actions/install объявляет plugin_system с run_string bin/gmediarender-ctl restart &.</li> <li>plg-hdtv-dlna-renderer.c004 · code · unknown; прошивка — · global_actions/update объявляет plugin_system с run_string bin/gmediarender-ctl restart &.</li> <li>plg-hdtv-dlna-renderer.c005 · code · unknown; прошивка — · global_actions/uninstall объявляет plugin_system с run_string bin/gmediarender-ctl cleanup — без завершающего &, то есть команда запускается синхронно.</li> </ul> <p><a class="footnote-backref" href="#fnref:325" title="Jump back to footnote 325 in the text">↩</a></p> </li> <li id="fn:326"> <ul> <li>plg-hdtv-duneplexserver.c002 · code · unknown; прошивка — · global_actions/boot объявляет действие plugin_system с run_string bin/t.sh & — при загрузке оболочка запускает скрипт плагина в фоне.</li> <li>plg-hdtv-duneplexserver.c015 · code · unknown; прошивка — · При загрузке bin/t.sh делает wget на http://127.0.0.1/cgi-bin/plugins/DunePlexServer/service_api?cmd=plex_start в фоне и завершается.</li> <li>plg-hdtv-duneplexserver.c025 · code · unknown; прошивка — · CGI-команда plex_start запускает bin/plex start с путём из файла <data_dir>/plexlibrary_location, только если этот файл существует.</li> </ul> <p><a class="footnote-backref" href="#fnref:326" title="Jump back to footnote 326 in the text">↩</a></p> </li> <li id="fn:327"> <p>plg-dc-widget-ext.c080 · code · unknown; прошивка — · gui_start.sh при старте GUI запускает update_weather.sh, если погодный сервис включён <a class="footnote-backref" href="#fnref:327" title="Jump back to footnote 327 in the text">↩</a></p> </li> <li id="fn:328"> <p>plg-dc-dune-backup.c048 · code · unknown; прошивка — · bin/gui_start.sh запрещает повторный запуск demon_as.sh (проверка ps w и pidof), затем запускает демон через /system/dunehd/dunehd_service do, если этот файл есть, иначе напрямую. <a class="footnote-backref" href="#fnref:328" title="Jump back to footnote 328 in the text">↩</a><a class="footnote-backref" href="#fnref2:328" title="Jump back to footnote 328 in the text">↩</a></p> </li> <li id="fn:329"> <ul> <li>plg-dc-widget-ext.c081 · code · unknown; прошивка — · boot.sh при загрузке пересоздаёт cron погоды (mkcron_fix.sh) и памяти (mkcron_meminfo.sh) по сохранённым настройкам</li> <li>plg-dc-widget-ext.c082 · code · unknown; прошивка — · uninstall.sh восстанавливает системный cron run_widget.sh, удаляет свои строки cron и запускает $FS_PREFIX/firmware/scripts/run_widget.sh</li> <li>plg-dc-widget-ext.c086 · code · unknown; прошивка — · boot.sh проверяет каталог /flashdata/plugins_data без $FS_PREFIX, а остальные скрипты — $FS_PREFIX/flashdata/plugins_data</li> </ul> <p><a class="footnote-backref" href="#fnref:329" title="Jump back to footnote 329 in the text">↩</a></p> </li> <li id="fn:330"> <p>plg-hdtv-utility-family.c020 · code · unknown; прошивка — · LTU_install объявляет global_actions install, uninstall и update типа plugin_system: install и update запускают bin/ltu_install.sh &, uninstall — bin/ltu_uninstall.sh &. <a class="footnote-backref" href="#fnref:330" title="Jump back to footnote 330 in the text">↩</a></p> </li> <li id="fn:331"> <p>plg-hdtv-utility-family.c063 · code · unknown; прошивка — · Манифест ExtendRC_install: name ExtendRC_install, version 1.0.0, version_index 1; global_actions install (bin/dune_service_extendrc_install.sh &) и uninstall (bin/dune_service_extendrc_remove.sh &), оба plugin_system. <a class="footnote-backref" href="#fnref:331" title="Jump back to footnote 331 in the text">↩</a></p> </li> <li id="fn:332"> <p>plg-hdtv-utility-family.c047 · code · unknown; прошивка — · Манифест Codec_install: name Codec_install, version «5.2.0 (31.05.16)», version_index 15; из global_actions объявлен только uninstall (plugin_system, bin/dune_service_codecs_uninstall.sh &) — install-действия нет. <a class="footnote-backref" href="#fnref:332" title="Jump back to footnote 332 in the text">↩</a></p> </li> <li id="fn:333"> <p>plg-hdtv-utility-family.c072 · code · unknown; прошивка — · Манифест Platform_install: name Platform_install, version «1.0.1 (29.02.16)», version_index 2; из global_actions — только uninstall (plugin_system, bin/uninstall_platform.sh &). <a class="footnote-backref" href="#fnref:333" title="Jump back to footnote 333 in the text">↩</a></p> </li> <li id="fn:334"> <p>plg-hdtv-utility-family.c114 · code · unknown; прошивка — · Манифест mark.it: name mark.it, version «1.0.1 (29.04.16)», version_index 14; global_actions install и boot типа plugin_system запускают bin/start.sh &. <a class="footnote-backref" href="#fnref:334" title="Jump back to footnote 334 in the text">↩</a></p> </li> <li id="fn:335"> <p>plg-hdtv-utility-family.c028 · code · unknown; прошивка — · rc install пакета LTU (ltu/rc в архиве) создаёт симлинк /ltu → /persistfs/ltu, копирует загрузочный демон /persistfs/ltu/boot/ltubd в /config/boot, снимает метку boot/.disabled и подгружает etc/profile; затем выполняет func_start. <a class="footnote-backref" href="#fnref:335" title="Jump back to footnote 335 in the text">↩</a></p> </li> <li id="fn:336"> <p>plg-hdtv-utility-family.c051 · code · unknown; прошивка — · Установка кодеков: unzip в /tmp, перенос каталога codecpack в <dest>/ (старый удаляется), chmod +x для bin/, WWW/cgi-bin/ и script/; затем пишется загрузочный скрипт /config/boot/rtmpboot.sh (симлинки /codecpack и /lib/libmcrypt.so.4, httpd -h <dest>/codecpack/WWW -p 81, подключение /codecpack/profile в /etc/profile), те же действия выполняются сразу. <a class="footnote-backref" href="#fnref:336" title="Jump back to footnote 336 in the text">↩</a><a class="footnote-backref" href="#fnref2:336" title="Jump back to footnote 336 in the text">↩</a></p> </li> <li id="fn:337"> <p>plg-hdtv-utility-family.c066 · code · unknown; прошивка — · extendrc.sh install (ExtendRC 0.7.5) копирует загрузочный демон boot/extendrcbd в /config/boot и выполняет start: запускает portmap (etc/init.d/K19portmap), симлинкует bin/dunerc как /tmp/www/cgi-bin/do2, bin/getfile как /tmp/www/cgi-bin/do2getfile, share/client как /tmp/www/rc и запускает dunerc daemon, если он не запущен. <a class="footnote-backref" href="#fnref:337" title="Jump back to footnote 337 in the text">↩</a></p> </li> <li id="fn:338"> <p>plg-hdtv-utility-family.c074 · code · unknown; прошивка — · install_platform.sh пишет загрузочный скрипт /config/boot/platform.sh: симлинк /platform → /persistfs/platform и подключение /platform/etc/profile в /etc/profile; сам симлинк сразу не создаётся — лог просит перезагрузить плеер. <a class="footnote-backref" href="#fnref:338" title="Jump back to footnote 338 in the text">↩</a><a class="footnote-backref" href="#fnref2:338" title="Jump back to footnote 338 in the text">↩</a></p> </li> <li id="fn:339"> <ul> <li>plg-dune-remote-control.c060 · code · unknown; прошивка — · rc_extension::setup: путь autorun — /config/boot/rc_extension.bash, boot script — <install>/www/cgi-bin/rc_extension.bash; после clean_up, если autorun уже исполняем, скрипт запускается как есть; иначе создаётся /config/boot, boot script получает chmod 0755, копируется в autorun, патчится и запускается; при любой неудаче возвращается FAILURE.</li> <li>plg-dune-remote-control.c061 · code · unknown; прошивка — · patch_boot_script делает autorun исполняемым (0755), вставляет после shebang проверку наличия <install>/bin и pushd в <install>/www/cgi-bin, а в конец — popd.</li> </ul> <p><a class="footnote-backref" href="#fnref:339" title="Jump back to footnote 339 in the text">↩</a></p> </li> <li id="fn:340"> <ul> <li>plg-hdtv-utility-family.c091 · code · unknown; прошивка — · Манифест umount: name umount, version 2.0.0, version_index 5; единственная точка входа — в root://sources; global action boot типа plugin_system с пустым run_string.</li> <li>plg-hdtv-utility-family.c092 · code · unknown; прошивка — · umount правит собственный манифест: smb_apply пишет bin/start.sh («mount -t cifs -o rw,username=…,password=… "//<ip_path>" /D/») с chmod 0744 и заменяет в <install_dir_path>/dune_plugin.xml пустой <run_string></run_string> на bin/start.sh & (при пустом ip_path — наоборот и удаляет start.sh); затем просит перезагрузку.</li> </ul> <p><a class="footnote-backref" href="#fnref:340" title="Jump back to footnote 340 in the text">↩</a></p> </li> <li id="fn:341"> <p>plg-hdtv-web-launchers.c023 · code · unknown; прошивка — · amediateka — единственный плагин с auto_start: entry_point_media_url=entry_point1, run_action_before_auto_resume=yes, ip_address_required=yes, force_on_start=black_screen, force_on_finish=main_screen и action launch_media_url на ту же локальную страницу. <a class="footnote-backref" href="#fnref:341" title="Jump back to footnote 341 in the text">↩</a></p> </li> <li id="fn:342"> <p>plg-hdtv-duneplexserver.c016 · code · unknown; прошивка — · Комбобокс auto_run определяет автозапуск по отсутствию #wget в bin/t.sh; при включении строка #wget заменяется на wget, при выключении — обратно. <a class="footnote-backref" href="#fnref:342" title="Jump back to footnote 342 in the text">↩</a></p> </li> <li id="fn:343"> <ul> <li>plg-hdtv-mpd.c012 · code · unknown; прошивка — · bin/t.sh создаёт /usr/bin/mpd-start, mpd-stop и mpd-restart как обёртки над <install_dir>/bin/mpd.rc; сам mpd при загрузке не запускается, строка запуска закомментирована (#mpd-start).</li> <li>plg-hdtv-mpd.c018 · code · unknown; прошивка — · При music_directory не repl комбобокс autostart_mpd определяет автозапуск по наличию #mpd-start в bin/t.sh; при включении строка заменяется на mpd-start, при выключении — обратно.</li> </ul> <p><a class="footnote-backref" href="#fnref:343" title="Jump back to footnote 343 in the text">↩</a></p> </li> <li id="fn:344"> <ul> <li>plg-hdtv-torrserve.c015 · code · unknown; прошивка — · Поставляемый bin/boot.sh содержит только shebang и exit 0 — по умолчанию автозапуск TorrServe выключен.</li> <li>plg-hdtv-torrserve.c027 · code · unknown; прошивка — · Комбобокс auto_run определяет автозапуск по наличию start-stop-daemon в bin/boot.sh; при yes скрипт перезаписывается запуском start-stop-daemon, при no — «#!/bin/sh\nexit 0».</li> </ul> <p><a class="footnote-backref" href="#fnref:344" title="Jump back to footnote 344 in the text">↩</a></p> </li> <li id="fn:345"> <ul> <li>plg-hdtv-peerflixserver.c040 · code · unknown; прошивка — · Автостарт переключается правкой bin/boot_end.sh: при включении снимаются комментарии с #export и #forever, при выключении ставится обратно; статус «включён» определяется отсутствием строки #forever в файле.</li> <li>plg-hdtv-peerflixserver.c045 · code · unknown; прошивка — · bin/boot_end.sh вычисляет каталог установки, отрезая четыре последних символа пути к своему каталогу, берёт имя плагина из имени каталога и задаёт данные /flashdata/plugins_data/<name>; строки export и forever закомментированы, поэтому по умолчанию скрипт ничего не запускает.</li> <li>plg-hdtv-peerflixserver.c059 · forum · Dune Smart Box 4K, Dune Neo 4K, android; прошивка — · По сообщениям темы, на Smart Box онлайн-файл грузится 4–5 минут, а на Neo 4K автостарт после перезагрузки не срабатывает, хотя в настройках стоит «Да»; автор отвечает, что на Amlogic-устройствах не тестировал.</li> </ul> <p><a class="footnote-backref" href="#fnref:345" title="Jump back to footnote 345 in the text">↩</a></p> </li> <li id="fn:346"> <ul> <li>plg-hdtv-smart-apps.c048 · code · unknown; прошивка — · Экран приложения Entware app_creen строится по app_scr; для transmission он показывает кнопку start/stop по pidof transmission-daemon, автозапуск через строку #transmission-start в bin/boot_end.sh, выбор каталога, адрес http://<ip>:9091 и кнопку rem_tor: при наличии rem_tor в /tmp/run/installed_plugins.xml — plugin_launcher://rem_tor, иначе plugin_installer://...</li> <li>plg-hdtv-smart-apps.c049 · code · unknown; прошивка — · Для Deluge экран Entware показывает http://<ip>:888; при запущенном deluged — кнопку stop_deluge, иначе start_deluge и start_deluge_daemon; переключает строки deluge-start и S80deluged в bin/boot_end.sh, а диалог deluged_login правит /opt/etc/deluge/auth.</li> <li>plg-hdtv-smart-apps.c051 · code · unknown; прошивка — · Для tor экран Entware проверяет pidof tor, показывает SOCKS-адрес 127.0.0.1:9050 или <ip>:9100 в зависимости от закомментированной строки SOCKSPort в /opt/etc/tor/torrc, запускает bin/run_tor.sh, останавливает через service_api cmd=tor_stop и умеет включать автозапуск в bin/boot_end.sh.</li> <li>plg-hdtv-smart-apps.c053 · code · unknown; прошивка — · Для unfs3 экран Entware читает /opt/etc/exports, добавляет и редактирует записи (ro/rw), запускает и останавливает сервер командами S55portmap и S56unfsd, а также переключает их автозапуск в bin/boot_end.sh.</li> </ul> <p><a class="footnote-backref" href="#fnref:346" title="Jump back to footnote 346 in the text">↩</a></p> </li> <li id="fn:347"> <ul> <li>plg-dc-dune-backup.c045 · code · unknown; прошивка — · Автостарт хранится в data_dir_path/auto_start.sh блоками #<start>; в файле .if лежит режим запуска, в .ld — дата последнего запуска; плагин добавляет блок с командой и амперсандом, а для режима «после» снимает амперсанд с предыдущего блока; при удалении пункта переносит амперсанд с удалённого блока на предыдущий, если удалённый блок был фоновым, иначе снимает амперсанд с предыдущего; если блок остаётся один — удаляет .sh, .if и .ld; файл автостарта можно запустить вручную.</li> <li>plg-dc-dune-backup.c046 · code · unknown; прошивка — · Демон автостарта bin/demon_as.sh ждёт 10 секунд и готовности даты/интернета, проверяет флаг boot, затем в цикле раз в 60 секунд вызывает valid_auto_start.sh и при разрешении запускает auto_start.sh, записывая дату в .ld.</li> <li>plg-dc-dune-backup.c047 · code · unknown; прошивка — · valid_auto_start.sh разрешает запуск по режиму .if: «when boot» требует аргумент boot; Always — разница дней ≥ 0, Once a day — ≥ 1, Once a week — ≥ 7, Once a month — ≥ 30, Only on Sunday — воскресенье и разница ≥ 1 либо прошлый запуск не в воскресенье; разницу дней считает count_minutes, потому что DMC неправильно обрабатывает date -d (проверка дня недели всё же вызывает date -d +%u).</li> </ul> <p><a class="footnote-backref" href="#fnref:347" title="Jump back to footnote 347 in the text">↩</a></p> </li> <li id="fn:348"> <p>plg-hdtv-utility-family.c115 · code · unknown; прошивка — · bin/start.sh mark.it при наличии /persistfs дописывает в /tmp/cron/crontabs/root задание «*/1 * * * * wget --quiet -O - "http://127.0.0.1/cgi-bin/plugins/mark.it/do"» и выполняет crontab -e; интервал (1–60 мин) экран меняет регуляркой прямо в start.sh и просит перезагрузку. <a class="footnote-backref" href="#fnref:348" title="Jump back to footnote 348 in the text">↩</a><a class="footnote-backref" href="#fnref2:348" title="Jump back to footnote 348 in the text">↩</a></p> </li> <li id="fn:349"> <ul> <li>plg-dc-dune-backup.c123 · code · unknown; прошивка — · test_internet.sh считает интернет доступным, только если системная дата не раньше 2026-08-01 и хотя бы один из запросов wget --spider к http://google.com, http://httpbin.org или ping yandex.ru успешен.</li> <li>plg-dc-dune-backup.c046 · code · unknown; прошивка — · Демон автостарта bin/demon_as.sh ждёт 10 секунд и готовности даты/интернета, проверяет флаг boot, затем в цикле раз в 60 секунд вызывает valid_auto_start.sh и при разрешении запускает auto_start.sh, записывая дату в .ld.</li> </ul> <p><a class="footnote-backref" href="#fnref:349" title="Jump back to footnote 349 in the text">↩</a></p> </li> <li id="fn:350"> <ul> <li>plg-hdtv-dlna-renderer.c009 · code · unknown; прошивка — · Функция IsRunning проверяет процесс через killall -0 gmediarender; status печатает Running, а при отсутствии процесса — Not running и выходит с кодом 1.</li> <li>plg-hdtv-dlna-renderer.c010 · code · unknown; прошивка — · Start не запускает второй экземпляр, если gmediarender уже работает; создаёт /tmp/plugins/dlna_renderer, переходит в каталог плагина и подставляет --friendly-name только при непустой переменной friendly_name.</li> </ul> <p><a class="footnote-backref" href="#fnref:350" title="Jump back to footnote 350 in the text">↩</a></p> </li> <li id="fn:351"> <p>plg-gh-sndpl-apple-trailers-dune-plugin.c043 · code · unknown; прошивка — · PlayTrailer::startServer запускает внешний сервер только если pgrep dunetrailers не нашёл процессов: берёт путь DuneSystem::$properties['install_dir_path'] + '/bin' и выполняет в фоне '( cd <path>; ./dunetrailers ) &> /dev/null 2>&1 &'. <a class="footnote-backref" href="#fnref:351" title="Jump back to footnote 351 in the text">↩</a></p> </li> <li id="fn:352"> <p>plg-dune-remote-control.c063 · code · unknown; прошивка — · rc_extension::run делает бинарник <install>/bin/dune_rc_extension_mipsel исполняемым (chmod 0755 при необходимости), проверяет ps | grep по его имени; если процесс уже есть — true, иначе запускает бинарник с -vv и возвращает false при ненулевом коде. <a class="footnote-backref" href="#fnref:352" title="Jump back to footnote 352 in the text">↩</a></p> </li> <li id="fn:353"> <ul> <li>plg-hdtv-torrserve.c022 · code · unknown; прошивка — · CGI-команда torrserve_start запускает bin/TorrServe через start-stop-daemon -Sbvmp с pid-файлом /tmp/TorrServe.pid.</li> <li>plg-hdtv-torrserve.c023 · code · unknown; прошивка — · CGI-команды torrserve_stop и torrserve_restart останавливают процесс по pidof TorrServe через kill, а restart затем снова запускает его тем же start-stop-daemon.</li> <li>plg-hdtv-torrserve.c024 · code · unknown; прошивка — · Команда torrserve в CGI возвращает 1, если pidof TorrServe находит процесс, и 0 иначе; экран настроек при найденном процессе показывает в подписи ответ HD::isDomainAvailible("http://127.0.0.1:8090/echo"), а метку (online) ставит по pidof, а не по ответу /echo.</li> </ul> <p><a class="footnote-backref" href="#fnref:353" title="Jump back to footnote 353 in the text">↩</a></p> </li> <li id="fn:354"> <p>plg-hdtv-dlna-renderer.c012 · code · unknown; прошивка — · Start запускает bin/gmediarender в режиме демона с логом /tmp/plugins/dlna_renderer/gmediarender.log и ограничением лога 10 000. <a class="footnote-backref" href="#fnref:354" title="Jump back to footnote 354 in the text">↩</a></p> </li> <li id="fn:355"> <p>plg-gh-kocourkuba-proiptv.c063 · code · unknown; прошивка — · Sleep_Timer::set_sleep_timer сначала убивает прежний процесс по pid-файлу, затем при положительном времени запускает bin/sleep_timer.sh в фоне через shell_exec с pid- и log-файлами и сохраняет pid; create_estimated_timer_box добавляет в OSD оставшееся время, если не активирован playback browser и либо force, либо 0 < timer <= self::$show_time; get_sleep_timer не возвращает отрицательное значение. <a class="footnote-backref" href="#fnref:355" title="Jump back to footnote 355 in the text">↩</a><a class="footnote-backref" href="#fnref2:355" title="Jump back to footnote 355 in the text">↩</a></p> </li> <li id="fn:356"> <p>plg-gh-mdpuma-dune-plugin-altiptv.c088 · code · unknown; прошивка — · do.php хранит PID в pid_inf, перед стартом пытается убить предыдущий PID и обновляет scan_inf в tmp_dir_path по ходу работы. <a class="footnote-backref" href="#fnref:356" title="Jump back to footnote 356 in the text">↩</a></p> </li> <li id="fn:357"> <p>plg-hdtv-duneplexcatalog.c048 · code · unknown; прошивка — · DN::start_notifier ищет процесс plex_notifier через ps ax, убивает найденный PID командой kill -9 и запускает /bin/bash bin/plex_notifier.sh <адрес Plex> <ключ> <serial_number> "DPC (<product_id>)" в фоне. <a class="footnote-backref" href="#fnref:357" title="Jump back to footnote 357 in the text">↩</a></p> </li> <li id="fn:358"> <p>plg-hdtv-dlna-renderer.c013 · code · unknown; прошивка — · Stop посылает gmediarender SIGINT через killall -INT, ждёт до 30 секунд, после чего добивает процесс killall -9. <a class="footnote-backref" href="#fnref:358" title="Jump back to footnote 358 in the text">↩</a></p> </li> <li id="fn:359"> <p>plg-hdtv-cleanup.c008 · code · unknown; прошивка — · Демон работает в бесконечном цикле: каждые 60 секунд печатает разделитель и дату, проверяет состояние и спит. <a class="footnote-backref" href="#fnref:359" title="Jump back to footnote 359 in the text">↩</a><a class="footnote-backref" href="#fnref2:359" title="Jump back to footnote 359 in the text">↩</a></p> </li> <li id="fn:360"> <ul> <li>plg-hdtv-cleanup.c010 · code · unknown; прошивка — · parse_nav читает первые две строки nav_state.txt (тип и элемент); если элемент — plugin://, извлекает имя плагина и читает pid из /tmp/run/<plugin>.pid.</li> <li>plg-hdtv-cleanup.c011 · code · unknown; прошивка — · Если тип в nav_state.txt — path = root:favorites, parse_nav берёт элемент root_shortcut://…, читает /persistfs/main_screen_items/<shortcut>/dune_folder.txt и извлекает имя плагина из media_url = plugin_launcher://{name=...}, затем читает его pid.</li> <li>plg-hdtv-cleanup.c014 · code · unknown; прошивка — · check_family находит pid-файл, в котором записан pid, удаляет его, затем убивает дочерние процессы и сам shell-процесс плагина.</li> <li>plg-hdtv-cleanup.c018 · forum · Dune HD Base 3D, unknown; прошивка — · Плагин задуман как демон, который при входе пользователя в плагин убивает процессы остальных плагинов, освобождая память, и работает с момента загрузки каждую минуту.</li> </ul> <p><a class="footnote-backref" href="#fnref:360" title="Jump back to footnote 360 in the text">↩</a></p> </li> <li id="fn:361"> <p>plg-hdtv-cleanup.c012 · code · unknown; прошивка — · Если найден работающий плагин, parse_nav исключает его pid из списка SHELL_PIDS, чтобы не убить плагин, в котором находится пользователь. <a class="footnote-backref" href="#fnref:361" title="Jump back to footnote 361 in the text">↩</a></p> </li> <li id="fn:362"> <p>plg-hdtv-cleanup.c015 · code · unknown; прошивка — · Перед убийством процессов демон дважды снимает mtime nav_state.txt и убивает только если файл не изменился между проверками; иначе пишет, что файл изменился, и пропускает цикл. <a class="footnote-backref" href="#fnref:362" title="Jump back to footnote 362 in the text">↩</a></p> </li> <li id="fn:363"> <ul> <li>plg-hdtv-cleanup.c013 · code · unknown; прошивка — · check_children добирает дочерние процессы двумя способами: по общим pipe-файловым дескрипторам из /proc/<pid>/fd и по PPID через pgrep -P, объединяет их, убирает дубликаты и убивает каждый через kill.</li> <li>plg-hdtv-cleanup.c016 · code · unknown; прошивка — · Демон завершает процессы через kill (SIGTERM) и нигде не использует kill -9.</li> </ul> <p><a class="footnote-backref" href="#fnref:363" title="Jump back to footnote 363 in the text">↩</a></p> </li> <li id="fn:364"> <p>plg-dc-dune-backup.c044 · code · unknown; прошивка — · Остановка скрипта выполняется bin/kill_process_and_child.sh по имени .sh: скрипт находит pid через ps w, убивает процесс и рекурсивно его детей, пишет журнал pid|имя|время и при необходимости сообщает об остановке в .sms. <a class="footnote-backref" href="#fnref:364" title="Jump back to footnote 364 in the text">↩</a></p> </li> <li id="fn:365"> <p>plg-ds-dune-hd-tv.c044 · code · unknown; прошивка — · bin/check_stop.sh раз в 5 с читает player_state из $FS_PREFIX/tmp/run/ext_command.state и выполняет killall receive5, когда состояние непустое и не file_playback; pid хранит в $FS_PREFIX/tmp/run/dunehdtv_check_stop.pid. <a class="footnote-backref" href="#fnref:365" title="Jump back to footnote 365 in the text">↩</a></p> </li> <li id="fn:366"> <p>plg-ds-dune-hd-tv.c047 · code · unknown; прошивка — · bin/killr.sh выполняет killall -9 для receive2, receive3, receive4 и receive5; его вызывают install.sh и uninstall.sh. <a class="footnote-backref" href="#fnref:366" title="Jump back to footnote 366 in the text">↩</a></p> </li> <li id="fn:367"> <p>plg-hdtv-megatorrents.c075 · code · unknown; прошивка — · Помощники HD::check_transmission_kill, check_noxbit_kill, check_acestream_kill, check_peerflix_kill и check_torrserve_kill при обнаружении процесса (pidof, /tmp/run/NOXBIT.pid, ps autostart.sh, ответ :9000/torrents) вызывают stop-команды service_api соответствующих плагинов (Transmission/Entware<em>/LTU_install, Noxbit, AceStream, Entware</em>, TorrServe) на 127.0.0.1. <a class="footnote-backref" href="#fnref:367" title="Jump back to footnote 367 in the text">↩</a></p> </li> <li id="fn:368"> <p>plg-hdtv-torrserve.c021 · code · unknown; прошивка — · Кнопка запуска torrserve_start сначала вызывает HD::check_transmission_kill, HD::check_noxbit_kill, HD::check_acestream_kill и HD::check_peerflix_kill, затем GET plugin_cgi_url service_api?cmd=torrserve_start, ждёт 5 секунд и показывает лог. <a class="footnote-backref" href="#fnref:368" title="Jump back to footnote 368 in the text">↩</a><a class="footnote-backref" href="#fnref2:368" title="Jump back to footnote 368 in the text">↩</a></p> </li> <li id="fn:369"> <ul> <li>plg-dune-remote-control.c006 · code · unknown; прошивка — · rc_extension сравнивает VERSION из каталога установки и из каталога данных; если одного файла нет или версии различаются, он копирует новый VERSION в каталог данных, делает rmmod vmdriver и запускает сервер с -t (остановка), а при совпадении версий этого не делает.</li> <li>plg-dune-remote-control.c062 · code · unknown; прошивка — · exec_boot_script сначала проверяет lsmod | grep vmdriver; если модуля нет, запускает boot script, а при его ошибке удаляет /config/boot/rc_extension.bash и возвращает false; setup при успешном copy и exec_boot_script возвращает FIRST_TIME_SUCCESS, только если php_uname('r') = 2.6.32.15-27-sigma, иначе SUCCESS; при неудаче copy или exec_boot_script — FAILURE.</li> </ul> <p><a class="footnote-backref" href="#fnref:369" title="Jump back to footnote 369 in the text">↩</a></p> </li> <li id="fn:370"> <p>plg-dc-widget-ext.c041 · code · unknown; прошивка — · Плагин вызывает свои shell-скрипты из PHP через shell_exec("<путь> > /dev/null &") — в фоне, без ожидания <a class="footnote-backref" href="#fnref:370" title="Jump back to footnote 370 in the text">↩</a></p> </li> <li id="fn:371"> <ul> <li>plg-dc-torrent-center.c079 · code · unknown; прошивка — · TorrServer::actionGetTorrentList запускает вложенный php-cgi -f www/cgi-bin/run.php с action=torrentTorrServList через HD::asyncExec.</li> <li>plg-dc-torrent-center.c106 · code · unknown; прошивка — · HD::asyncExec держит статический proc_open и при завершении команды с action= читает exec_result_<action> из tmp_dir_path.</li> <li>plg-dc-torrent-center.c107 · code · unknown; прошивка — · run.php выполняет сетевую операцию по $<em>REQUEST[action] и сохраняет ответ в /tmp/plugins/<name>/exec_result</em><action>.</li> <li>plg-dc-torrent-center.c108 · code · unknown; прошивка — · Представление экрана TorrServer задаёт GUI-таймер с delay_ms=1000.</li> </ul> <p><a class="footnote-backref" href="#fnref:371" title="Jump back to footnote 371 in the text">↩</a></p> </li> <li id="fn:372"> <ul> <li>plg-dc-bazinga3.c067 · code · unknown; прошивка — · classActions.php подключает класс lib/wox или lib/wow по REQUEST class_name (иначе все lib/wox), подключает link_api.php из persistfs/flashdata/tmp и выполняет action getIframe, getMovieScreenInf, loadM3uVod, getNewFavItems, записывая JSON в /tmp/plugins/<name>/exec_result_<action>.</li> <li>plg-dc-bazinga3.c068 · code · unknown; прошивка — · Поиск источников видео (SmartConfig) запускает вложенный <install>/www/cgi-bin/php-cgi -f classActions.php action=getIframe class_name=… params=<urlencode json> через HD::asyncExec и разбирает JSON urls.</li> <li>plg-dc-bazinga3.c069 · code · unknown; прошивка — · HD::asyncExec держит один статический процесс; при смене команды закрывает предыдущий процесс.</li> <li>plg-dc-bazinga3.c070 · code · unknown; прошивка — · run.php по REQUEST action (torrentTorrServList, torrentPeerflixServerList, torrentPeerflixSeries, transmissionUPnPList, transmissionUPnPSeries) делает HTTP-запрос к серверу и пишет ответ в /tmp/plugins/<name>/exec_result_<action>.</li> <li>plg-dc-bazinga3.c076 · code · unknown; прошивка — · php-cgi вызывается двумя путями: веб-сервером через shell-обёртки www/cgi-bin и напрямую из PHP плагина как php-cgi -f <скрипт> key=value (HD::do_cmd через popen, HD::asyncExec).</li> </ul> <p><a class="footnote-backref" href="#fnref:372" title="Jump back to footnote 372 in the text">↩</a></p> </li> <li id="fn:373"> <ul> <li>plg-hdtv-rclone.c081 · code · unknown; прошивка — · SmartConfig::do_cmd удаляет старый exec_log, а на android выполняет команду через /system/dunehd/dunehd_service do с экранированием двойных кавычек; на остальных платформах — через system().</li> <li>plg-hdtv-rclone.c082 · code · unknown; прошивка — · Результат shell-команд передаётся в PHP через JSON-файл exec_log: do_exec_log декодирует его json_decode и складывает поля в $this->execLogObj, откуда вызывающий код читает status/descr.</li> <li>plg-hdtv-rclone.c058 · code · unknown; прошивка — · bin/rclone_kill.sh всегда завершается с кодом 1 (exit 1), независимо от результата; PHP-код судит об успехе по JSON в exec_log.</li> </ul> <p><a class="footnote-backref" href="#fnref:373" title="Jump back to footnote 373 in the text">↩</a></p> </li> <li id="fn:374"> <p>plg-hdtv-utility-family.c075 · code · unknown; прошивка — · install_platform.sh ведёт лог в /tmp/platform_install и в конце удаляет его (rm -rf $res); экран считает установку идущей, пока этот файл существует: platform_install не запускает скрипт повторно при наличии файла и каждую секунду перерисовывает диалог прогресса (timer 1000 → close_dialog_and_run). <a class="footnote-backref" href="#fnref:374" title="Jump back to footnote 374 in the text">↩</a></p> </li> <li id="fn:375"> <ul> <li>plg-hdtv-utility-family.c107 · code · unknown; прошивка — · fsScreen DuneArc показывает содержимое архива: для *.rar — shell_exec("<install_dir>/bin/unrar lb <файл>"), для *.zip — unzip -lq; кнопка «Извлечь» запускает в фоне bin/unrar.sh --start_rar|--start_zip <файл> <каталог архива> и каждую секунду (timer 1000) показывает прогресс.</li> <li>plg-hdtv-utility-family.c108 · code · unknown; прошивка — · bin/unrar.sh DuneArc пишет ход работы в /tmp/plugins/DuneArc/exec_arc и удаляет его по завершении; unrar запускается как «cd <каталог> && unrar -o+ -y x <архив>», zip — «unzip -o <архив> -d <каталог>»; повторный старт при работающем процессе вызывает stop (kill по ps unrar/unzip).</li> </ul> <p><a class="footnote-backref" href="#fnref:375" title="Jump back to footnote 375 in the text">↩</a></p> </li> <li id="fn:376"> <p>plg-dc-dune-backup.c038 · code · unknown; прошивка — · Команда запуска скрипта собирается из пути скрипта, накопителя (с добавлением папки, если задана #<fold>), пути .sms, выбранного значения #<choice> и ID/модели; аргумент накопителя передаётся только при $1_ok, все части заключаются в одинарные кавычки. <a class="footnote-backref" href="#fnref:376" title="Jump back to footnote 376 in the text">↩</a></p> </li> <li id="fn:377"> <ul> <li>plg-dc-dune-backup.c039 · code · unknown; прошивка — · При обычном запуске (flag_autostart = 0) скрипт запускается в фоне командой Config::do_cmd($cmd.' > /dev/null &'), после чего помечается как work; в базовом режиме без #<mode_full> открывается лёгкое окно light_show_run, иначе экран переходит на timer.</li> <li>plg-dc-dune-backup.c042 · code · unknown; прошивка — · Вывод скрипта пишется самим скриптом в файлы .log и .err рядом с .sms; экран читает .log и показывает до 10 последних строк в правой панели, переворачивая порядок при #<LGrv> и сжимая процентные строки при #<LG%%>.</li> <li>plg-dc-dune-backup.c043 · code · unknown; прошивка — · Пока скрипт работает, его иконка заменяется кадрами timer_NN; при непустом .err и неработающем скрипте показывается error (в базовом режиме) или error/error2 (в полном), а при первом появлении ошибки в базовом режиме плагин пишет текст %tr%error_info в .sms.</li> </ul> <p><a class="footnote-backref" href="#fnref:377" title="Jump back to footnote 377 in the text">↩</a></p> </li> <li id="fn:378"> <ul> <li>plg-dc-dune-backup.c040 · code · unknown; прошивка — · Перед запуском плагин выполняет каждое условие #<test> через shell; при ложном условии показывает заголовок скрипта и #<test.txt> (или стандартный текст) и не запускает скрипт.</li> <li>plg-dc-dune-backup.c041 · code · unknown; прошивка — · Строки #<warning> и #<mesg> могут содержать условие до символов \?; в #<warning> плагин подставляет $^1 (накопитель с папкой), $^3 (выбранное значение) и $^4 (ID/модель), в #<mesg> — $^4; в условиях и тексте через test_condition также подставляются $^0 (путь скрипта) и $^2 (путь .sms); условие выполняется через shell (exec), и показывается только текст после \? при истинном условии.</li> </ul> <p><a class="footnote-backref" href="#fnref:378" title="Jump back to footnote 378 in the text">↩</a></p> </li> <li id="fn:379"> <ul> <li>plg-dc-dune-backup.c120 · code · unknown; прошивка — · my_wget по очереди читает URL из списка через file_get_contents и записывает первый успешный результат в файл, удаляя прежний; это используется для самообновления скриптов и списков коллекций.</li> <li>plg-dc-dune-backup.c121 · code · unknown; прошивка — · Если у пункта задана директива #<update> с URL, перед запуском плагин скачивает новый текст скрипта в tmp/load_script.sh, сравнивает md5 с текущим файлом и при различии копирует его на место и перечитывает список.</li> </ul> <p><a class="footnote-backref" href="#fnref:379" title="Jump back to footnote 379 in the text">↩</a></p> </li> <li id="fn:380"> <ul> <li>plg-gh-mdpuma-dune-plugin-altiptv.c089 · code · unknown; прошивка — · new_back_scan формирует URL plugin_cgi_url/do с диапазоном и запускает wget в фоне, затем возвращает действие info_back_scan.</li> <li>plg-gh-mdpuma-dune-plugin-altiptv.c090 · code · unknown; прошивка — · Диалог info_back_scan использует timer(1000) и GUI_EVENT_TIMER→close_dialog_and_run для повторного открытия обновлённой информации.</li> </ul> <p><a class="footnote-backref" href="#fnref:380" title="Jump back to footnote 380 in the text">↩</a></p> </li> <li id="fn:381"> <p>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 и запускает отдельный процесс '<platform php> bin/index_epg.php <config>' через shell_exec с перенаправлением в лог; check_and_run_bg_indexing выставляет plugin_cookies->ticker, когда индексация запущена. <a class="footnote-backref" href="#fnref:381" title="Jump back to footnote 381 in the text">↩</a></p> </li> <li id="fn:382"> <ul> <li>plg-dc-globaltv.c125 · code · unknown; прошивка — · По таймеру topmenu_timer плагин скачивает cache.timestamp действием wget с result_key_prefix update1_, затем при смене метки — архив кэша действием wget с target_path и target_cmd «cd <dir> && unzip <zip> && rm -f <zip>».</li> <li>plg-dc-globaltv.c126 · code · unknown; прошивка — · Результат wget плагин читает из user_input по ключам <prefix>status (succeeded при успехе), <prefix>text и <prefix>url.</li> <li>plg-dc-globaltv.c018 · code · unknown; прошивка — · embeddable_plugin_folders/topmenu_timer_action вызывает plugin_handle_user_input с control_id=topmenu_timer; topmenu_timer_delay = 1200, topmenu_timer_delay_after_refresh = 30.</li> <li>plg-dc-globaltv.c173 · code · unknown; прошивка — · После успешного шага topmenu_update2 (status=succeeded и наличие main_cache.json) плагин заменяет active_cache.json через rename, переносит метку timestamp, удаляет все tv_cache_*.json, пишет DATA_TS и файл epfs_changed, затем возвращает status(0); при неуспешном wget, отсутствии main_cache.json или ошибке rename возвращает status(1).</li> </ul> <p><a class="footnote-backref" href="#fnref:382" title="Jump back to footnote 382 in the text">↩</a></p> </li> <li id="fn:383"> <p>plg-dc-dune-backup.c137 · code · unknown; прошивка — · Очередь post_action хранится построчно в settings/post_action как JSON-действия; при каждом timer плагин снимает первое действие, выполняет его и перезаписывает остаток или удаляет файл. <a class="footnote-backref" href="#fnref:383" title="Jump back to footnote 383 in the text">↩</a></p> </li> <li id="fn:384"> <p>plg-gh-kocourkuba-proiptv.c062 · code · unknown; прошивка — · Списки ТВ-каналов и групп возвращают Action_Factory::timer(1000), то есть просят оболочку обновлять папку раз в секунду; timer() добавляет reset_on_keypress и clear_on_keypress только при истинных аргументах. <a class="footnote-backref" href="#fnref:384" title="Jump back to footnote 384 in the text">↩</a></p> </li> <li id="fn:385"> <ul> <li>plg-hdtv-youtube.c101 · code · unknown; прошивка — · SmartConfig::mamaLubaDavayDavay YouTube запускает загрузку видео через exec скрипта /flashdata/plugins/<plugin_name>/bin/youtube_download.sh (при его наличии, иначе /codecpack/script/youtube_download.sh) с режимами --start_mp4 (dload_url), --start_dash (video+audio) и --start_audio в каталог dload_dir_path, а для "stop" — --stop.</li> <li>plg-hdtv-youtube.c102 · code · unknown; прошивка — · mamaLubaDavayDavay YouTube для dload_url с .m3u8 вызывает iptv_record.sh (из bin/ плагина или /codecpack/script/) с --ytb <url> <имя> <каталог>/, предварительно создав /tmp/plugins/youtube.</li> <li>plg-hdtv-youtube.c104 · code · unknown; прошивка — · bin/youtube_download.sh YouTube (автор micha86) добавляет /flashdata/plugins/ffmpeg_install/bin в PATH и LD_LIBRARY_PATH, если каталог есть, и поддерживает команды --start_dash, --start_mp4, --start_audio и --stop.</li> </ul> <p><a class="footnote-backref" href="#fnref:385" title="Jump back to footnote 385 in the text">↩</a></p> </li> <li id="fn:386"> <p>plg-dc-dune-backup.c112 · code · unknown; прошивка — · Пользовательский пункт «Конвертирование медиа-файлов через ffmpeg» ищет в выбранной папке mp4, mkv, avi, mov, 3gp, m2ts, vob и mp3, предлагает набор профилей (битрейт 360k/576k/1080k/2048k, CRF 18/23, замена аудио, удаление субтитров, обрезка) и складывает результат в подпапку folder_out/<выбранный профиль>/<имя папки> рядом с исходной (в сообщениях папка называется FFMPEG_OUT). <a class="footnote-backref" href="#fnref:386" title="Jump back to footnote 386 in the text">↩</a></p> </li> <li id="fn:387"> <ul> <li>plg-dc-widget-ext.c051 · code · android; прошивка — · На Android плагин ведёт crontab в файле $FS_PREFIX/tmp/cron/crontabs/root и перезапускает crond -b -c <каталог>; на APK (HD_APK=1) вместо crond запускается свой bin/crond.sh</li> <li>plg-dc-widget-ext.c052 · code · unknown; прошивка — · Вне Android плагин правит расписание через crontab -u root -l / crontab -u root -</li> <li>plg-dc-widget-ext.c109 · code · unknown; прошивка — · crontask.sh без аргументов печатает текущее расписание, аргументы с префиксом «-» удаляют совпадающие строки, с «+» добавляют новую; на Android файл <code>$FS_PREFIX/tmp/cron/crontabs/root</code> перезаписывается, после чего перезапускается <code>crond</code> (на APK вместо него — <code>bin/crond.sh</code>); вне Android та же правка выполняется через <code>crontab -u root</code>.</li> </ul> <p><a class="footnote-backref" href="#fnref:387" title="Jump back to footnote 387 in the text">↩</a></p> </li> <li id="fn:388"> <ul> <li>plg-dc-widget-ext.c046 · code · unknown; прошивка — · mkcron_fix.sh переводит интервал в расписание cron (по умолчанию «10 * * * <em>», 15 → «</em>/15 * * * *», 120 → «10 */2 * * *» …), удаляет строки run_widget.sh и update_weather.sh и добавляет свою строку update_weather.sh</li> <li>plg-dc-widget-ext.c045 · code · unknown; прошивка — · Интервал обновления погоды — 15, 30, 60, 120, 180 или 360 минут; вариант «1 min» появляется только при наличии файла /config/weather_ext_debug</li> </ul> <p><a class="footnote-backref" href="#fnref:388" title="Jump back to footnote 388 in the text">↩</a></p> </li> <li id="fn:389"> <p>plg-dc-torrent-center.c150 · code · android; прошивка — · HD::actionCrontabs в Android-ветке записывает /tmp/cron/crontabs/root и перезапускает crond через dunehd_service do. <a class="footnote-backref" href="#fnref:389" title="Jump back to footnote 389 in the text">↩</a><a class="footnote-backref" href="#fnref2:389" title="Jump back to footnote 389 in the text">↩</a></p> </li> <li id="fn:390"> <p>plg-dc-dune-backup.c046 · code · unknown; прошивка — · Демон автостарта bin/demon_as.sh ждёт 10 секунд и готовности даты/интернета, проверяет флаг boot, затем в цикле раз в 60 секунд вызывает valid_auto_start.sh и при разрешении запускает auto_start.sh, записывая дату в .ld. <a class="footnote-backref" href="#fnref:390" title="Jump back to footnote 390 in the text">↩</a></p> </li> <li id="fn:391"> <p>plg-dc-dune-backup.c139 · code · unknown; прошивка — · www_counter раз в сутки (если дата в settings/last_act_data отличается и test_date.sh прошёл) ставит post_action run_every_day и, кроме случая каталога /storage/emulated/0/DuneHD/flashdata или версии с дефисом, запрашивает HD::http_get_document по URL из <check_update>/www_counter/url_all.txt (для русского) или url_mod.txt (для остальных), взяв сам URL из этого файла. <a class="footnote-backref" href="#fnref:391" title="Jump back to footnote 391 in the text">↩</a></p> </li> <li id="fn:392"> <p>plg-gh-mdpuma-dune-plugin-altiptv.c084 · code · unknown; прошивка — · Sleep-таймер записывает cron-команду wget к локальному IP Control cmd=standby. <a class="footnote-backref" href="#fnref:392" title="Jump back to footnote 392 in the text">↩</a></p> </li> <li id="fn:393"> <p>plg-hdtv-liteiptv.c048 · code · unknown; прошивка — · Sleep-таймер пишется строкой cron с маркером #sleep <unix_time> и командой wget на http://127.0.0.1/cgi-bin/do?cmd=standby в /tmp/cron/crontabs/root; при timer-событии плагин сам удаляет просроченные записи и предупреждает, если до выключения меньше 120 секунд. <a class="footnote-backref" href="#fnref:393" title="Jump back to footnote 393 in the text">↩</a></p> </li> <li id="fn:394"> <p>plg-hdtv-smart-vod.c200 · code · unknown; прошивка — · При control_id=sleep_time эталон читает /config/settings.properties и /tmp/cron/crontabs/root, формирует запись wget к локальному cmd=standby, заменяя помеченный блок при наличии «Выключение» либо добавляя блок иначе, затем вызывает crontab -e. <a class="footnote-backref" href="#fnref:394" title="Jump back to footnote 394 in the text">↩</a></p> </li> <li id="fn:395"> <ul> <li>plg-hdtv-megaradio.c095 · code · unknown; прошивка — · При control_id = save_sleep_time SmartM3uTv читает /tmp/cron/crontabs/root, удаляет строки с #sleep, при sleep_time = after только включает флаг sleep_after, при другом ненулевом значении добавляет строку wget к http://127.0.0.1/cgi-bin/do?cmd=standby, затем записывает файл, ставит chmod 0575 и выполняет crontab -e.</li> <li>plg-hdtv-megaradio.c096 · code · unknown; прошивка — · Обработчик timer при sleep_warn = false проверяет файл crontab (интервал 5000 мс или timer_osd): строку с истёкшим временем удаляет, а при остатке менее 120 секунд показывает предупреждение sleep_warn.</li> </ul> <p><a class="footnote-backref" href="#fnref:395" title="Jump back to footnote 395 in the text">↩</a></p> </li> <li id="fn:396"> <p>plg-dc-torrent-center.c128 · code · unknown; прошивка — · Для ненулевого числового sleep_time Movie создаёт cron-строку выключения через echo A15EBF00 > /proc/ir/button с пометкой #sleep. <a class="footnote-backref" href="#fnref:396" title="Jump back to footnote 396 in the text">↩</a></p> </li> <li id="fn:397"> <p>plg-hdtv-altsource.c071 · code · unknown; прошивка — · Sleep-таймер в Movie записывает в cron-файл строку с echo A15EBF00 > /proc/ir/button и меткой #sleep <timestamp>; вариант «после текущей серии» при >98 % просмотра показывает уведомление, а плеер выключается в playback_stop, если таймер не отложен; остальные варианты — по времени. <a class="footnote-backref" href="#fnref:397" title="Jump back to footnote 397 in the text">↩</a></p> </li> <li id="fn:398"> <p>plg-hdtv-altsource.c053 · code · unknown; прошивка — · Обработчик entry по control_id выполняет reboot через shell_exec('reboot'), power_off через echo A15EBF00 > /proc/ir/button, do_setup через open_folder('setup'), unInstallPlugin через launch_media_url('plugin_uninstaller://altSource') после подтверждения. <a class="footnote-backref" href="#fnref:398" title="Jump back to footnote 398 in the text">↩</a><a class="footnote-backref" href="#fnref2:398" title="Jump back to footnote 398 in the text">↩</a><a class="footnote-backref" href="#fnref3:398" title="Jump back to footnote 398 in the text">↩</a></p> </li> <li id="fn:399"> <p>plg-hdtv-megaanime.c023 · code · unknown; прошивка — · Пункт do_hard_reset обработчика entry выполняет shell_exec('reboot'), пункт power_off — shell_exec('echo A15EBF00 > /proc/ir/button'), пункт do_setup открывает SmartSetupScreen. <a class="footnote-backref" href="#fnref:399" title="Jump back to footnote 399 in the text">↩</a><a class="footnote-backref" href="#fnref2:399" title="Jump back to footnote 399 in the text">↩</a></p> </li> <li id="fn:400"> <p>plg-hdtv-megatorrents.c018 · code · unknown; прошивка — · Пункты do_hard_reset и power_off обработчика entry выполняют shell_exec('reboot') и shell_exec('echo A15EBF00 > /proc/ir/button') и возвращают их вывод как результат обработчика. <a class="footnote-backref" href="#fnref:400" title="Jump back to footnote 400 in the text">↩</a></p> </li> <li id="fn:401"> <p>plg-hdtv-rclone.c028 · code · unknown; прошивка — · При control_id do_hard_reset обработчик entry выполняет shell_exec('reboot'). <a class="footnote-backref" href="#fnref:401" title="Jump back to footnote 401 in the text">↩</a></p> </li> <li id="fn:402"> <p>plg-hdtv-youtube.c036 · code · unknown; прошивка — · При control_id=do_hard_reset SmartEntryHandler вызывает shell_exec('reboot') и возвращает его вывод как результат handle_user_input. <a class="footnote-backref" href="#fnref:402" title="Jump back to footnote 402 in the text">↩</a></p> </li> <li id="fn:403"> <p>plg-gh-mdpuma-dune-plugin-altiptv.c107 · code · unknown; прошивка — · Действия restart_pl и reboot_pl в настройках выполняют killall shell и reboot соответственно. <a class="footnote-backref" href="#fnref:403" title="Jump back to footnote 403 in the text">↩</a><a class="footnote-backref" href="#fnref2:403" title="Jump back to footnote 403 in the text">↩</a></p> </li> <li id="fn:404"> <p>plg-hdtv-plugtv.c032 · code · unknown; прошивка — · Пункт «Перезагрузка» открывает диалог с кнопками «Быстрая перезагрузка» (shell_exec killall shell), «Полная перезагрузка» (shell_exec reboot) и «Отмена». <a class="footnote-backref" href="#fnref:404" title="Jump back to footnote 404 in the text">↩</a><a class="footnote-backref" href="#fnref2:404" title="Jump back to footnote 404 in the text">↩</a></p> </li> <li id="fn:405"> <p>plg-hdtv-utility-family.c095 · code · unknown; прошивка — · umount: smb_one монтирует SMB-папку в /D разово (mount -t cifs … /D/), smb_umount выполняет umount /D; kill_all — shell_exec('killall shell') («Перезагрузка оболочки»), reboot — shell_exec('reboot'). <a class="footnote-backref" href="#fnref:405" title="Jump back to footnote 405 in the text">↩</a><a class="footnote-backref" href="#fnref2:405" title="Jump back to footnote 405 in the text">↩</a><a class="footnote-backref" href="#fnref3:405" title="Jump back to footnote 405 in the text">↩</a></p> </li> <li id="fn:406"> <p>plg-hdtv-utility-family.c076 · code · unknown; прошивка — · Состояния экрана Platform_install: нет /persistfs/ — «устанавливается на системный накопитель», установка невозможна; нет /persistfs/platform/ — кнопка «Установить Platform»; есть /persistfs/platform/, но нет /platform/ — «Необходима перезагрузка» и кнопка reboot (shell_exec('reboot')); есть оба — Peerflix, обновление и удаление. <a class="footnote-backref" href="#fnref:406" title="Jump back to footnote 406 in the text">↩</a><a class="footnote-backref" href="#fnref2:406" title="Jump back to footnote 406 in the text">↩</a></p> </li> <li id="fn:407"> <p>plg-dc-bazinga3.c020 · code · unknown; прошивка — · SmartEntryHandler (handler_id entry) на reboot выполняет shell_exec('reboot'), на power_off пишет код A15EBF00 в /proc/ir/button, на do_setup открывает папку setup. <a class="footnote-backref" href="#fnref:407" title="Jump back to footnote 407 in the text">↩</a><a class="footnote-backref" href="#fnref2:407" title="Jump back to footnote 407 in the text">↩</a></p> </li> <li id="fn:408"> <p>plg-hdtv-peerflixserver.c034 · code · unknown; прошивка — · Пункты popup do_hard_reset и power_off выполняют shell_exec('reboot') и shell_exec('echo A15EBF00 > /proc/ir/button'). <a class="footnote-backref" href="#fnref:408" title="Jump back to footnote 408 in the text">↩</a><a class="footnote-backref" href="#fnref2:408" title="Jump back to footnote 408 in the text">↩</a></p> </li> <li id="fn:409"> <p>plg-hdtv-folder-cache-vod.c046 · code · unknown; прошивка — · 14 из 15 плагинов (кроме karas-avadim) содержат действие restart, которое выполняет shell_exec('killall shell'). <a class="footnote-backref" href="#fnref:409" title="Jump back to footnote 409 in the text">↩</a></p> </li> <li id="fn:410"> <p>plg-hdtv-mpd.c024 · code · unknown; прошивка — · CGI-команда killall выполняет killall shell — убивает все процессы с именем shell, включая оболочки плагинов. <a class="footnote-backref" href="#fnref:410" title="Jump back to footnote 410 in the text">↩</a></p> </li> <li id="fn:411"> <p>plg-hdtv-freetv.c024 · code · unknown; прошивка — · Кнопка «Перезагрузить плеер» вызывает ActionFactorySafe::stb_shell_reboot(): если определён RESTART_ACTION_ID, возвращает действие с reboot=false, иначе пробует change_settings(null, false, true) и лишь затем выполняет exec('killall shell'). <a class="footnote-backref" href="#fnref:411" title="Jump back to footnote 411 in the text">↩</a></p> </li> <li id="fn:412"> <p>plg-dc-dune-backup.c049 · code · unknown; прошивка — · Меню перезагрузки предлагает быстрый перезапуск: при before_r11 — do_hard_reset_shell (bin/restart.sh shell), иначе ActionFactory::change_settings с restart_gui. Вне APK меню также предлагает полную перезагрузку (при before_r11 — bin/restart.sh reboot, затем change_settings с reboot) и выключение (bin/restart.sh off); на APK вместо полной перезагрузки и выключения показывается перезапуск DMC (do_hard_reset_dune). <a class="footnote-backref" href="#fnref:412" title="Jump back to footnote 412 in the text">↩</a></p> </li> <li id="fn:413"> <ul> <li>plg-hdtv-megatorrents.c005 · code · unknown; прошивка — · popup_menu первой точки входа содержит три пункта plugin_handle_user_input с handler_id entry: «Настройки плагина MegaTorrents» (control_id do_setup, setup.aai), «Перезагрузить плеер» (do_hard_reset, service_file.aai) и «Выключить плеер» (power_off, power.aai).</li> <li>plg-hdtv-megatorrents.c018 · code · unknown; прошивка — · Пункты do_hard_reset и power_off обработчика entry выполняют shell_exec('reboot') и shell_exec('echo A15EBF00 > /proc/ir/button') и возвращают их вывод как результат обработчика.</li> </ul> <p><a class="footnote-backref" href="#fnref:413" title="Jump back to footnote 413 in the text">↩</a></p> </li> <li id="fn:414"> <p>plg-hdtv-rclone.c029 · code · unknown; прошивка — · При control_id power_off обработчик entry выполняет shell_exec('echo A15EBF00 > /proc/ir/button'). <a class="footnote-backref" href="#fnref:414" title="Jump back to footnote 414 in the text">↩</a></p> </li> <li id="fn:415"> <p>plg-hdtv-youtube.c037 · code · unknown; прошивка — · При control_id=power_off SmartEntryHandler выполняет shell_exec('echo A15EBF00 > /proc/ir/button'). <a class="footnote-backref" href="#fnref:415" title="Jump back to footnote 415 in the text">↩</a></p> </li> <li id="fn:416"> <p>plg-gh-mdpuma-dune-plugin-altiptv.c085 · code · unknown; прошивка — · После zoom_apply плагин пишет EA15BF00 и E916BF00 в /proc/ir/button через shell_exec. <a class="footnote-backref" href="#fnref:416" title="Jump back to footnote 416 in the text">↩</a></p> </li> <li id="fn:417"> <p>plg-gh-mdpuma-dune-plugin-altiptv.c082 · code · unknown; прошивка — · Для background_rec плагин формирует команду /codecpack/script/iptv_record.sh с типом протокола, URL, именем и путём записи и выполняет её shell_exec. <a class="footnote-backref" href="#fnref:417" title="Jump back to footnote 417 in the text">↩</a></p> </li> <li id="fn:418"> <ul> <li>plg-hdtv-liteiptv.c049 · code · unknown; прошивка — · Запись канала выполняется внешним /codecpack/script/iptv_record.sh с выбором протокола http/udp/rtp/rtsp/hls/flv/rtmp или dvbt по URL, а фоновая запись дополнительно сохраняет имя в tmp_dir_path/background_rec_stop.</li> <li>plg-hdtv-liteiptv.c051 · code · unknown; прошивка — · При входе (entry_enter/entry_play) плагин проверяет наличие /codecpack или DATA/codec_install: при отсутствии на не-Android предлагает установить Codec_install через plugin_installer://…Codec_install_v5.0.0.tar.gz, на Android сразу выполняет run; если /codecpack нет, но установлена папка Codec_install, предлагает запустить её через plugin_launcher://Codec_install.</li> </ul> <p><a class="footnote-backref" href="#fnref:418" title="Jump back to footnote 418 in the text">↩</a></p> </li> <li id="fn:419"> <p>plg-gh-mdpuma-dune-plugin-altiptv.c083 · code · unknown; прошивка — · new_rec_apply добавляет в /tmp/cron/crontabs/root задания старта записи, записи имени в background_rec_stop и остановки через /tmp/<rec_name>_iptvrecord.sh, затем вызывает crontab -e. <a class="footnote-backref" href="#fnref:419" title="Jump back to footnote 419 in the text">↩</a></p> </li> <li id="fn:420"> <p>plg-hdtv-liteiptv.c050 · code · unknown; прошивка — · Запланированная запись добавляет в /tmp/cron/crontabs/root блок с маркером ###<title> <inf>, запуском iptv_record.sh и записью имени в background_rec_stop, затем вызывает crontab -e. <a class="footnote-backref" href="#fnref:420" title="Jump back to footnote 420 in the text">↩</a></p> </li> <li id="fn:421"> <p>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"). <a class="footnote-backref" href="#fnref:421" title="Jump back to footnote 421 in the text">↩</a></p> </li> <li id="fn:422"> <p>plg-hdtv-utility-family.c050 · code · unknown; прошивка — · Место установки кодеков в dune_service_codecs_install.sh: /persistfs, если в /proc/mounts ровно одна строка с persistfs; иначе /flashdata, если /D не смонтирован и /flashdata существует; иначе /D. <a class="footnote-backref" href="#fnref:422" title="Jump back to footnote 422 in the text">↩</a></p> </li> <li id="fn:423"> <p>plg-hdtv-utility-family.c023 · code · unknown; прошивка — · ltu_install.sh требует смонтированный системный накопитель: если /persistfs нет или это не точка монтирования (mountpoint -q), удаляет оба архива LTU из каталога плагина, пишет «ERROR: System storage (/persistfs) not installed!» и выходит с кодом 1. <a class="footnote-backref" href="#fnref:423" title="Jump back to footnote 423 in the text">↩</a></p> </li> <li id="fn:424"> <p>plg-hdtv-utility-family.c064 · code · unknown; прошивка — · dune_service_extendrc_install.sh требует смонтированный /persistfs, ищет dune-extendrc-0.7.5.tar.gz сначала в /persistfs/plugins/ExtendRC_install/bin/, затем в корне каждого /tmp/mnt/storage/*, удаляет прежний /persistfs/extendrc и распаковывает архив в /persistfs (успех — по extendrc/extendrc.sh). <a class="footnote-backref" href="#fnref:424" title="Jump back to footnote 424 in the text">↩</a></p> </li> <li id="fn:425"> <p>plg-hdtv-utility-family.c022 · code · unknown; прошивка — · bin/ltu_install.sh выбирает архив по /proc/cpuinfo: если в нём нет строки «MIPS 74K» — bin/dune53-ltu-0.4.9.tar.gz, иначе bin/dune-ltu-0.4.9.tar.gz (оба из /persistfs/plugins/LTU_install/bin/); в лог в обеих ветках пишется «dune53-ltu-0.4.9». <a class="footnote-backref" href="#fnref:425" title="Jump back to footnote 425 in the text">↩</a></p> </li> <li id="fn:426"> <p>plg-hdtv-utility-family.c049 · code · unknown; прошивка — · dune_service_codecs_install.sh выбирает сборку по /proc/cpuinfo: при строке ARMv7 — каталог codecpack_arm, иначе codecpack; скачивает http://www.igores.ru/dune/micha86/apps/<prefix>/codecpack.zip (wget в /tmp) и сверяет версию по …/<prefix>/version.txt. <a class="footnote-backref" href="#fnref:426" title="Jump back to footnote 426 in the text">↩</a></p> </li> <li id="fn:427"> <ul> <li>plg-hdtv-torrserve.c030 · code · unknown; прошивка — · При наличии /persistfs скрипт bin/swap.sh создаёт в нём файл подкачки 256 МБ, форматирует его mkswap, включает swapon и пишет /config/boot/swap_mount.sh, который при загрузке снова включает swap и ставит vm.swappiness=10.</li> <li>plg-hdtv-torrserve.c031 · code · unknown; прошивка — · Экран настроек показывает кнопку создания swap только при наличии /persistfs; если есть и /persistfs/swap, и /config/boot/swap_mount.sh, выключение делает swapoff и удаляет оба файла.</li> </ul> <p><a class="footnote-backref" href="#fnref:427" title="Jump back to footnote 427 in the text">↩</a></p> </li> <li id="fn:428"> <ul> <li>plg-hdtv-smart-apps.c041 · code · unknown; прошивка — · Setup Entware при наличии /persistfs показывает кнопку swap: disable_swap, если существуют /persistfs/swap и /config/boot/swap_mount.sh, иначе make_swap, который запускает bin/swap.sh в фоне.</li> <li>plg-hdtv-smart-apps.c068 · code · unknown; прошивка — · swap.sh Entware создаёт в /persistfs файл swap размером 256 МБ, включает его swapon и записывает /config/boot/swap_mount.sh с повторным swapon при загрузке.</li> </ul> <p><a class="footnote-backref" href="#fnref:428" title="Jump back to footnote 428 in the text">↩</a></p> </li> <li id="fn:429"> <p>plg-hdtv-duneplexserver.c029 · code · unknown; прошивка — · В пакете нет bin/swap.sh, хотя экран настроек вызывает его для make_swap; в дереве только inst.sh, plex и t.sh. <a class="footnote-backref" href="#fnref:429" title="Jump back to footnote 429 in the text">↩</a></p> </li> <li id="fn:430"> <ul> <li>plg-hdtv-rclone.c054 · code · unknown; прошивка — · Перед монтированием bin/rclone_mount.sh проверяет /dev/fuse и при отсутствии выполняет modprobe fuse, затем при неудаче mknod /dev/fuse c 10 229.</li> <li>plg-hdtv-rclone.c052 · code · unknown; прошивка — · bin/rclone_mount.sh вызывает rclone mount с --daemon, --config, --cache-dir, --vfs-cache-max-size, --vfs-cache-mode, --vfs-read-chunk-size, --vfs-cache-poll-interval, --buffer-size, --vfs-read-chunk-size-limit 1G, --uid 0, --gid 9997, --umask 022, --allow-other, --vfs-cache-max-age 675h, --dir-cache-time 672h, --no-check-certificate, --ca-cert /firmware/certs/ca-bundle.crt и --rc.</li> <li>plg-hdtv-rclone.c055 · code · unknown; прошивка — · После запуска rclone mount скрипт пишет в exec_log JSON со status=true и через 3 с фоново выполняет rclone rc vfs/refresh recursive=true.</li> <li>plg-hdtv-rclone.c061 · code · unknown; прошивка — · При наличии /persistfs/plugins_data/<plugin_name> bin/rclone_rcdstart.sh, если нет /etc/ssl/certs/ca-bundle.crt, создаёт каталог /etc/ssl (если его нет), удаляет /etc/ssl/certs и выполняет ln -s /firmware/certs /etc/ssl.</li> </ul> <p><a class="footnote-backref" href="#fnref:430" title="Jump back to footnote 430 in the text">↩</a></p> </li> <li id="fn:431"> <p>plg-dc-dune-backup.c111 · code · unknown; прошивка — · Пункт RCLONE ищет rclone.conf в корне встроенной памяти DuneHD или в папке RCLONE локального накопителя, строит по секциям [имя] список подключений и монтирует их, проверяя работу через rclone rc vfs/refresh. <a class="footnote-backref" href="#fnref:431" title="Jump back to footnote 431 in the text">↩</a></p> </li> <li id="fn:432"> <p>plg-hdtv-utility-family.c109 · code · unknown; прошивка — · DuneArc сам монтирует сетевые папки: читает /config/network_folders.properties (type 0 — SMB, 1 — NFS, protocol 1 — tcp) и выполняет mount -t cifs -o username=…,password=…,posixpaths,rsize=32768,wsize=130048 в /tmp/mnt/smb/<n> (по умолчанию guest/guest) или mount -t nfs -o <udp|tcp> в /tmp/mnt/network/<n>. <a class="footnote-backref" href="#fnref:432" title="Jump back to footnote 432 in the text">↩</a></p> </li> <li id="fn:433"> <ul> <li>plg-dc-torrent-center.c146 · code · unknown; прошивка — · Ipc::write_request публикует файл <cmd_name>.<pid>-<cmd_id>.cmd в /tmp/run/ipc__<server_id> через временный файл и rename.</li> <li>plg-dc-torrent-center.c147 · code · unknown; прошивка — · Ipc::network_mount отправляет тип, сервер, каталог, имя пользователя, пароль и proto командой mount сетевому менеджеру.</li> </ul> <p><a class="footnote-backref" href="#fnref:433" title="Jump back to footnote 433 in the text">↩</a></p> </li> <li id="fn:434"> <p>plg-hdtv-utility-family.c110 · code · unknown; прошивка — · Класс smbtree DuneArc ищет SMB-шары прошивочным /tango/firmware/bin/smbtree через proc_open с LD_LIBRARY_PATH /tango/firmware/lib и флагом -N, а имена хостов разрешает /firmware/bin/nmblookup (-S, -R) с LD_LIBRARY_PATH=/firmware/lib. <a class="footnote-backref" href="#fnref:434" title="Jump back to footnote 434 in the text">↩</a></p> </li> <li id="fn:435"> <p>plg-hdtv-altsource.c022 · code · unknown; прошивка — · «Браузер Сети» обходит SMB через smbtree: -D для рабочих групп, -W для серверов, -U guest% -b --server-shares для ресурсов; бинарник берётся из /firmware_ext/smbcommon/bin/smbtree или /tango3/firmware/bin/smbtree. <a class="footnote-backref" href="#fnref:435" title="Jump back to footnote 435 in the text">↩</a></p> </li> <li id="fn:436"> <ul> <li>plg-gh-infinitygp-dune-jellyfin-bridge.c033 · code · android-dune-fw; прошивка — · NfsMediaResolver читает список сетевых монтирований из /tmp/run/network_mount_list.xml; учитывает только элементы mount с type=nfs и status=mounted, беря атрибуты path, server, dir, proto и mount_tm; при отсутствии файла или ошибке разбора возвращает пустой список и логирует причину.</li> <li>plg-gh-infinitygp-dune-jellyfin-bridge.c036 · code · android-dune-fw; прошивка — · resolve берёт имя файла из suppliedFileName (пустое имя — null), читает список NFS-монтирований (пустой — null), узнаёт ожидаемый размер HEAD-запросом к http(s)-URL Jellyfin (2 с, только 2xx и Content-Length, иначе -1), перебирает монтирования и возвращает первый непустой toNfsUrl; не найдя файл, возвращает null.</li> <li>plg-gh-infinitygp-dune-jellyfin-bridge.c038 · code · android-dune-fw; прошивка — · searchDirectory принимает файл только при точном совпадении имени и размера; при неизвестном размере (-1) размер не проверяется, а одноимённый файл другого размера не считается совпадением; каталоги обходятся в порядке tv/shows/series, затем movies/films/anime, затем остальные, внутри группы — по имени без учёта регистра.</li> <li>plg-gh-infinitygp-dune-jellyfin-bridge.c035 · code · android-dune-fw; прошивка — · toNfsUrl строит URL только для файла внутри локального корня монтирования и без управляющих символов; схема выбирается nfs-tcp при proto tcp, nfs-udp при udp, иначе nfs; формат — scheme://server:exportPath:relativePath.</li> <li>plg-gh-infinitygp-dune-jellyfin-bridge.c050 · forum · android-dune-fw; прошивка — · README описывает назначение bridge: Jellyfin for Android TV использует штатный плеер Dune, сохраняя resume и watched; при наличии NFS-копии медиа bridge открывает её напрямую, чтобы Dune видел соседние файлы субтитров.</li> <li>plg-gh-infinitygp-dune-jellyfin-bridge.c052 · forum · android-dune-fw; прошивка — · README рекомендует прямой NFS-режим и утверждает, что маппинг путей Jellyfin→NFS не настраивается: перед каждым воспроизведением bridge ищет файл в активных NFS-монтированиях Dune по имени и, если доступен, размеру; при неудаче использует HTTP-URL Jellyfin; resume и прогресс работают и по HTTP, но соседние NFS-субтитры тогда недоступны.</li> </ul> <p><a class="footnote-backref" href="#fnref:436" title="Jump back to footnote 436 in the text">↩</a></p> </li> <li id="fn:437"> <p>plg-hdtv-altsource.c021 · code · unknown; прошивка — · FileList::getRootList читает /tmp/run/storage_list.xml, пропускает /persistfs и накопители не в статусе mounted, берёт secondary_mount_path, убирает из имени суффикс _<uuid> и считает свободное/полное место через disk_free_space и disk_total_space. <a class="footnote-backref" href="#fnref:437" title="Jump back to footnote 437 in the text">↩</a></p> </li> <li id="fn:438"> <ul> <li>plg-dc-dune-backup.c051 · code · unknown; прошивка — · Список накопителей включает /tmp/mnt/storage, внутреннюю память Android (/data/media/0/DuneHD или /sdcard/DuneHD), сетевые каталоги /tmp/mnt/smb, /tmp/mnt/network и /tmp/mnt/nfs с пометкой сетевой.</li> <li>plg-dc-dune-backup.c052 · code · unknown; прошивка — · Диалог выбора накопителя сканирует каталоги из drive_arr, отбрасывает скрытые и недоступные, ограничивает сканирование 30 секундами и показывает размер; сетевые папки из network_folders.properties (с размерами по network_mount_list.xml) добавляются, только если не flag_apk и не before_r11.</li> <li>plg-dc-dune-backup.c057 · code · unknown; прошивка — · Размер и свободное место накопителя плагин получает через disk_total_space и disk_free_space и форматирует в B…YB.</li> </ul> <p><a class="footnote-backref" href="#fnref:438" title="Jump back to footnote 438 in the text">↩</a></p> </li> <li id="fn:439"> <ul> <li>plg-hdtv-utility-family.c094 · code · unknown; прошивка — · Экран umount строит список накопителей из вывода df (shell_exec('df > /tmp/plugins/umount/mount_pl.df'), regex /dev/… /tmp/mnt/…), показывает размер в ГБ; выбор в комбобоксе inpUsbDrive выполняет shell_exec("umount <dev> && eject <dev>").</li> <li>plg-hdtv-utility-family.c098 · forum · unknown; прошивка — · Справка umount (translations/help_russian.txt): SD-карта после размонтирования снова монтируется при возврате в меню Dune, поэтому её нужно извлечь до выхода из плагина; SATA HDD не рекомендуется извлекать при включённом плеере.</li> </ul> <p><a class="footnote-backref" href="#fnref:439" title="Jump back to footnote 439 in the text">↩</a></p> </li> <li id="fn:440"> <p>plg-hdtv-utility-family.c029 · code · unknown; прошивка — · func_start пакета LTU меняет систему плеера: дописывает подключение /ltu/etc/profile в /etc/profile, ставит симлинк /usr/lib/locale, копирует hotplug и hdd-tune в /sbin (если /sbin/hotplug нет), копирует power_off.sh и onshutdown.sh в /sbin и заменяет в /etc/inittab «::shutdown:/bin/umount -a -r» на /sbin/onshutdown.sh с kill -HUP 1. <a class="footnote-backref" href="#fnref:440" title="Jump back to footnote 440 in the text">↩</a><a class="footnote-backref" href="#fnref2:440" title="Jump back to footnote 440 in the text">↩</a></p> </li> <li id="fn:441"> <p>plg-hdtv-utility-family.c067 · code · unknown; прошивка — · extendrc.sh start правит /etc/inittab только если /sbin/onshutdown.sh отсутствует (комментарий «if not LTU installed»): копирует sbin/extendrc_onshutdown.sh в /sbin и заменяет «::shutdown:/bin/umount -a -r» на него с kill -HUP 1; extendrc_onshutdown.sh останавливает extendrc, делает sync и umount -a -r. <a class="footnote-backref" href="#fnref:441" title="Jump back to footnote 441 in the text">↩</a></p> </li> <li id="fn:442"> <p>plg-hdtv-utility-family.c032 · code · unknown; прошивка — · Комментарий пакета LTU связывает USE_FIX_TCP_RMEM с падением ядра: «use fixed TCP receive window for prevent kernel crash»; при USE_FIX_TCP_RMEM≠0 func_start пишет «16384 87380 87380» в /proc/sys/net/ipv4/tcp_rmem. <a class="footnote-backref" href="#fnref:442" title="Jump back to footnote 442 in the text">↩</a></p> </li> <li id="fn:443"> <ul> <li>plg-dc-globaltv.c071 · code · unknown; прошивка — · Комментарий в библиотеке: PHP на Dune требует явного указания часового пояса (встроенной информации о часовых поясах, видимо, нет).</li> <li>plg-dc-globaltv.c072 · code · unknown; прошивка — · Плагин вызывает date_default_timezone_set("UTC"), а смещение пояса вычисляет из вывода shell-команды date +%z.</li> </ul> <p><a class="footnote-backref" href="#fnref:443" title="Jump back to footnote 443 in the text">↩</a></p> </li> <li id="fn:444"> <ul> <li>plg-hdtv-peerstv.c013 · code · unknown; прошивка — · В load_channels жёстко устанавливается часовой пояс Etc/GMT+7 (date_default_timezone_set).</li> <li>plg-hdtv-peerstv.c012 · code · unknown; прошивка — · Запись .ndx разбирается как 2-байтовое число программ, затем по 12 байт на программу (unpack 'x2/V2time/voffset'); .pdt — 2-байтовая длина заголовка и строка CP1251. Время пересчитывается по формуле от эпохи (при time1<0 добавляется 429.4967296), округляется до 10 с и сдвигается на -7 часов (комментарий «NSK GMT offset»).</li> </ul> <p><a class="footnote-backref" href="#fnref:444" title="Jump back to footnote 444 in the text">↩</a></p> </li> <li id="fn:445"> <ul> <li>plg-hdtv-duneplexserver.c018 · code · unknown; прошивка — · bin/inst.sh устанавливает Plex только при наличии /persistfs: скачивает plex.tgz и plex_ver, при наличии bin/Application удаляет прежние Application, Library, www, service.sh и plex_ver, распаковывает tar и пишет лог /tmp/plugins/DunePlexServer/logs.</li> <li>plg-hdtv-duneplexserver.c019 · code · unknown; прошивка — · bin/inst.sh в конце всегда удаляет временный лог; если каталог /D существует, перед этим копирует лог в /D/plex_install.log, удалив старый файл.</li> </ul> <p><a class="footnote-backref" href="#fnref:445" title="Jump back to footnote 445 in the text">↩</a></p> </li> <li id="fn:446"> <ul> <li>plg-hdtv-mpd.c013 · code · unknown; прошивка — · bin/inst.sh устанавливает mpd только при наличии /persistfs: скачивает mpd.tar.gz с dune-club.info, распаковывает его в bin/ и создаёт те же обёртки /usr/bin/mpd-*.</li> <li>plg-hdtv-mpd.c027 · code · unknown; прошивка — · В пакете нет bin/mpd.rc, bin/bin/mpd и bin/etc/mpd.conf; код плагина ожидает их после распаковки mpd.tar.gz и проверяет только bin/bin/mpd.</li> </ul> <p><a class="footnote-backref" href="#fnref:446" title="Jump back to footnote 446 in the text">↩</a></p> </li> <li id="fn:447"> <ul> <li>plg-hdtv-torrserve.c016 · code · unknown; прошивка — · install.sh останавливает запущенный TorrServe через pidof/kill и удаляет прежние bin/TorrServe и bin/ver перед скачиванием новой версии.</li> <li>plg-hdtv-torrserve.c017 · code · unknown; прошивка — · install.sh скачивает исполняемый файл TorrServe и файл ver с dune-club.info, выставляет chmod -R 777 на TorrServe и пишет ход в /tmp/plugins/TorrServe/logs, завершая строкой Welldone.</li> </ul> <p><a class="footnote-backref" href="#fnref:447" title="Jump back to footnote 447 in the text">↩</a></p> </li> <li id="fn:448"> <ul> <li>plg-dc-bazinga3.c071 · code · unknown; прошивка — · torrserve.php при наличии /data/data/ru.yourok.torrserve/files/torrserver и отсутствии pid torrserver запускает его с -k -d /sdcard/Android/data/ru.yourok.torrserve/files; если файла нет и platform_kind не содержит android, при наличии TorrServe в /tmp/run/installed_plugins.xml вызывает http://127.0.0.1:<port>/cgi-bin/plugins/TorrServe/service_api?cmd=torrserve_start, а если TorrServe не найден — возвращает status=false; при отсутствии файла на android — status=false; если файл есть и pidof torrserver непуст — не возвращает ничего.</li> <li>plg-dc-bazinga3.c072 · code · unknown; прошивка — · В torrserve.php результат pidof torrserver == false трактуется как «TorrServer is running» — проверка инвертирована.</li> </ul> <p><a class="footnote-backref" href="#fnref:448" title="Jump back to footnote 448 in the text">↩</a></p> </li> <li id="fn:449"> <p>plg-hdtv-rclone.c069 · code · unknown; прошивка — · Пункт «Изменения» выполняет bin/rclone version --config <data_dir>/config, скачивает info.txt с dune-club.info и отдельной кнопкой выводит rclone help backends. <a class="footnote-backref" href="#fnref:449" title="Jump back to footnote 449 in the text">↩</a></p> </li> <li id="fn:450"> <p>plg-hdtv-utility-family.c120 · code · unknown; прошивка — · При thumb_file=1 do.php mark.it для файла, просмотренного больше чем на 5%, без готовой миниатюры вызывает /codecpack/script/thumb.sh "<файл>" "<каталог>/.<имя>.jpg" 350 <процент> — то есть зависит от Codec_install; экран при включении опции требует /codecpack/version.txt с v ≥ 24, иначе предлагает обновить или установить Codec_install. <a class="footnote-backref" href="#fnref:450" title="Jump back to footnote 450 in the text">↩</a></p> </li> <li id="fn:451"> <p>plg-hdtv-mpd.c012 · code · unknown; прошивка — · bin/t.sh создаёт /usr/bin/mpd-start, mpd-stop и mpd-restart как обёртки над <install_dir>/bin/mpd.rc; сам mpd при загрузке не запускается, строка запуска закомментирована (#mpd-start). <a class="footnote-backref" href="#fnref:451" title="Jump back to footnote 451 in the text">↩</a></p> </li> <li id="fn:452"> <ul> <li>plg-hdtv-smart-apps.c049 · code · unknown; прошивка — · Для Deluge экран Entware показывает http://<ip>:888; при запущенном deluged — кнопку stop_deluge, иначе start_deluge и start_deluge_daemon; переключает строки deluge-start и S80deluged в bin/boot_end.sh, а диалог deluged_login правит /opt/etc/deluge/auth.</li> <li>plg-hdtv-smart-apps.c053 · code · unknown; прошивка — · Для unfs3 экран Entware читает /opt/etc/exports, добавляет и редактирует записи (ro/rw), запускает и останавливает сервер командами S55portmap и S56unfsd, а также переключает их автозапуск в bin/boot_end.sh.</li> <li>plg-hdtv-smart-apps.c056 · code · unknown; прошивка — · Запуск OpenVPN из списка Entware убивает прежний процесс по openvpn.pid или, при флаге running, killall openvpn; если openvpn.path указывает на тот же конфиг и это не автозапуск, вместо запуска останавливает его; иначе при auth-user-pass в конфиге предлагает ввести логин/пароль, при наличии up /etc/openvpn/update-resolv-conf комментирует его и выполняет openvpn --daemon --writepid с записью пути конфига в openvpn.path.</li> <li>plg-hdtv-smart-apps.c059 · code · unknown; прошивка — · Каталог OpenVPN в Entware строится из файлов *.conf и *.ovpn в ovpn_path; при наличии одноимённого .pass элемент получает pass и описание %tr%t118, иначе %tr%t119.</li> <li>plg-hdtv-smart-apps.c052 · code · unknown; прошивка — · Для openvpn экран Entware берёт каталог из smbtree::get_folder_info('ovpn_path') — при непустом каталоге показывает кнопки выбора каталога и запуска, иначе только выбор каталога; в обоих случаях показывает текущий внешний IP, полученный с http://igores.ru/dune/micha86/ip/myip.php.</li> <li>plg-hdtv-smart-apps.c043 · code · unknown; прошивка — · install_dialog2 Entware удаляет существующий <install_dir>/Entware-<arg> и создаёт симлинк /opt на этот каталог; install_dialog3 запускает bin/<platform>_<arg>.sh, стартует telnetd и создаёт /config/telnetd.</li> <li>plg-hdtv-smart-apps.c125 · forum · unknown; прошивка — · Первый пост Entware сообщает, что после установки Entware-ng на плеере включается доступ по telnet.</li> </ul> <p><a class="footnote-backref" href="#fnref:452" title="Jump back to footnote 452 in the text">↩</a></p> </li> <li id="fn:453"> <ul> <li>plg-hdtv-remtor.c119 · code · unknown; прошивка — · Тип локального Transmission определяется по файлам /ltu/etc/init.d/rc.transmission (LTU) и /opt/bin/transmission-daemon (OPT) при kind_connection = kc_local_dune.</li> <li>plg-hdtv-remtor.c120 · code · unknown; прошивка — · start_local_transmission запускает /ltu/etc/init.d/rc.transmission start или /opt/etc/init.d/rc.transmission start через exec, а для kc_remote_dune запрашивает http://<ip>/cgi-bin/plugins/LTU_install/service_api?cmd=transmission_start.</li> <li>plg-hdtv-remtor.c121 · code · unknown; прошивка — · stop_local_transmission выполняет те же команды с аргументом stop и запрашивает service_api?cmd=transmission_stop для kc_remote_dune.</li> </ul> <p><a class="footnote-backref" href="#fnref:453" title="Jump back to footnote 453 in the text">↩</a></p> </li> <li id="fn:454"> <ul> <li>plg-dc-dune-backup.c107 · code · unknown; прошивка — · Пункт «Telnet» запускает busybox telnetd через /system/dunehd/dunehd_service do, при отсутствии pidof telnetd запускает telnetd напрямую и создаёт /config/telnetd.</li> <li>plg-dc-dune-backup.c106 · code · unknown; прошивка — · Пункт «Root» копирует файл dune_service_android_su_install.dsf из users/files в /data/media/0/DuneHD и сообщает «Успешно» или «Ошибка».</li> <li>plg-dc-dune-backup.c108 · code · unknown; прошивка — · Пункт «Монтирование копий: flashdata, config, tmp» монтирует каталоги FS_PREFIX/<имя> поверх /mnt/runtime/default/emulated/0/DuneHD/<имя> (при непустом FS_PREFIX — поверх /mnt/user/0/emulated/0/DuneHD/<имя>), если оба каталога существуют и точка ещё не смонтирована.</li> </ul> <p><a class="footnote-backref" href="#fnref:454" title="Jump back to footnote 454 in the text">↩</a></p> </li> <li id="fn:455"> <p>plg-dc-dunemdb-supplier-online-movies.c112 · code · unknown; прошивка — · Tscli.php — отдельная CLI-обёртка TorrServer с командами status, start, stop, list_torrents, get, drop, settings, set_setting; start запускает /flashdata/ts/ts с --port 8095 и ждёт до 10 с, stop — до 3 с. <a class="footnote-backref" href="#fnref:455" title="Jump back to footnote 455 in the text">↩</a></p> </li> <li id="fn:456"> <p>plg-gh-kocourkuba-proiptv.c071 · code · unknown; прошивка — · do_backup_settings упаковывает в zip все .db из каталога данных и lcfg_proiptv_epg_*.txt из /config, а при complete=true — ещё кэш картинок и skin_backup; при complete=true имя содержит версию и время (иначе proiptv_backup.zip), готовый архив копируется в выбранную папку, а экран бэкапа выбирает её через folder screen с расширением zip. <a class="footnote-backref" href="#fnref:456" title="Jump back to footnote 456 in the text">↩</a></p> </li> <li id="fn:457"> <p>plg-gh-kocourkuba-proiptv.c072 · code · unknown; прошивка — · Восстановление принимает только файл с именем proiptv_backup_<версия><em><дата></em><время>.zip, распаковывает его во временный каталог и проверяет непустоту; затем переименовывает текущие .db в .prev, копирует файлы архива и, если какие-то файлы не скопировались, возвращает .prev на место; после успеха вызывает init_plugin(true) и ACTION_RELOAD. <a class="footnote-backref" href="#fnref:457" title="Jump back to footnote 457 in the text">↩</a></p> </li> <li id="fn:458"> <ul> <li>plg-dc-dune-backup.c062 · code · unknown; прошивка — · Архив бэкапа создаётся утилитой tar с ключами -z -v -c -p -f (gzip), всегда с исключением */bin/rclone и */bin/ffmpeg и с дополнительным шаблоном exclude, переданным вызывающим скриптом.</li> <li>plg-dc-dune-backup.c063 · code · unknown; прошивка — · Прогресс бэкапа плагин считает по числу найденных элементов: tar -v печатает каждый файл, awk выводит процент каждые 10 строк, а число элементов заранее считается командой find по списку in_list с учётом exclude.</li> <li>plg-dc-dune-backup.c064 · code · unknown; прошивка — · После создания архива плагин проверяет его чтением оглавления tar -t; при любой ошибке в потоке stderr удаляет файл бэкапа и завершает скрипт сообщением об ошибке.</li> </ul> <p><a class="footnote-backref" href="#fnref:458" title="Jump back to footnote 458 in the text">↩</a></p> </li> <li id="fn:459"> <ul> <li>plg-dc-dune-backup.c083 · code · unknown; прошивка — · Для бэкапа Settings script upload.sh сравнивает флаги платформы в текущем config/settings.properties и в settings.properties из архива; флаг присваивается последовательно в порядке приоритета 1 → 2 → 3, где каждое следующее присваивание перекрывает предыдущее — 1 по умолчанию, 2 при interface_language_synchronized, 3 при apk_interface_language_changed, поэтому при обоих ключах значение 3, а 2 — только при первом ключе без второго; при различии флагов плагин отказывается восстанавливать бэкап как несовместимый.</li> <li>plg-dc-dune-backup.c087 · code · unknown; прошивка — · После распаковки, если бэкап не родной (fl_norm непуст) или задан FS_PREFIX (Android), script upload.sh для существующих каталогов config, flashdata и persistfs рекурсивно выставляет владельца по каталогу и права 777 (chown -R, chmod -R 777).</li> <li>plg-dc-dune-backup.c085 · code · unknown; прошивка — · При восстановлении script upload.sh исключает из архива каталоги самого плагина Dune_backup и test_php-cgi, настройки Dune_backup, flashdata/<em>/dunemdb_supplier_</em>, */image_cache/index.db, данные чужой платформы, dunestore, кэши proiptv (curl, epg, playlist, skin) и etag_cache.dat; для не-Settings дополнительно исключает cookies android_apps/shell_ext/bluray и каталоги plugins_data/shell_ext и bluray.</li> </ul> <p><a class="footnote-backref" href="#fnref:459" title="Jump back to footnote 459 in the text">↩</a></p> </li> <li id="fn:460"> <p>plg-dc-dune-backup.c093 · code · unknown; прошивка — · Пункт «Восстановить Один плагин из общего Бэкапа плагинов» читает оглавление архива Plugins-* (tar -ztf), строит список плагинов, исключая dunemdb_supplier_, tv_, test_php-cgi, node, bluray, dunestore и smotreshka.tv, и передаёт script upload.sh только пути выбранного плагина, его plugins_data и cookies. <a class="footnote-backref" href="#fnref:460" title="Jump back to footnote 460 in the text">↩</a></p> </li> <li id="fn:461"> <p>doc-sdk-plugins.c095 · doc · any-documented; прошивка — · Встроенный HTTP-сервер отдаёт $install_dir_path/www/* по http://<STB>/plugins/<plugin_name>/* и исполняет CGI из www/cgi-bin/* по http://<STB>/cgi-bin/plugins/<plugin_name>/* <a class="footnote-backref" href="#fnref:461" title="Jump back to footnote 461 in the text">↩</a></p> </li> <li id="fn:462"> <p>doc-sdk-plugins.c096 · doc · any-documented; прошивка — · Файлы www/ и CGI из www/cgi-bin/ плагина доступны по HTTP не только локально, но и из локальной сети <a class="footnote-backref" href="#fnref:462" title="Jump back to footnote 462 in the text">↩</a></p> </li> <li id="fn:463"> <p>fw-tv188b-260827-0003-r24--http-api.c008 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · CGI-скрипт плагина запускается run_plugin_cgi как shell-скрипт (sh), а не напрямую: PHP-обработчик плагин должен вызвать сам <a class="footnote-backref" href="#fnref:463" title="Jump back to footnote 463 in the text">↩</a></p> </li> <li id="fn:464"> <p>fw-tv188b-261021-0117-r25.c149 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 CGI-скрипт плагина, вызванный через http://<IP>/cgi-bin/plugins/<p>/<файл>, получает PLUGIN_NAME=<p>, а PLUGIN_CGI_DIR и SCRIPT_FILENAME — реальные пути $FS_PREFIX/flashdata/plugins/<p>/www/cgi-bin и …/www/cgi-bin/<файл>, а не /tmp/www/plugins/<p>/… <a class="footnote-backref" href="#fnref:464" title="Jump back to footnote 464 in the text">↩</a><a class="footnote-backref" href="#fnref2:464" title="Jump back to footnote 464 in the text">↩</a></p> </li> <li id="fn:465"> <p>fw-tv188b-261021-0117-r25.c150 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 CGI-скрипт плагина запускается с $0, равным абсолютному SCRIPT_FILENAME ($FS_PREFIX/flashdata/plugins/<p>/www/cgi-bin/<файл>), и текущим каталогом PLUGIN_CGI_DIR ($FS_PREFIX/flashdata/plugins/<p>/www/cgi-bin). <a class="footnote-backref" href="#fnref:465" title="Jump back to footnote 465 in the text">↩</a></p> </li> <li id="fn:466"> <p>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. <a class="footnote-backref" href="#fnref:466" title="Jump back to footnote 466 in the text">↩</a></p> </li> <li id="fn:467"> <ul> <li>plg-dc-screenshoter.c051 · code · unknown; прошивка — · CGI-обёртки www/cgi-bin/do и index — shell-скрипты с шапкой «@author: Andrii Kopyniak», ctime 17.09.2012</li> <li>plg-hdtv-utility-family.c116 · code · unknown; прошивка — · CGI www/cgi-bin/do mark.it (bash, автор Andrii Kopyniak) восстанавливает окружение плагина из $PWD, подставляет SCRIPT_FILENAME на do.php и запускает собственный ./php-cgi из каталога cgi-bin; php.ini плагина ставит cgi.force_redirect = 0, max_execution_time = 0, error_reporting = 0.</li> </ul> <p><a class="footnote-backref" href="#fnref:467" title="Jump back to footnote 467 in the text">↩</a></p> </li> <li id="fn:468"> <ul> <li>plg-dc-screenshoter.c052 · code · unknown; прошивка — · Обёртка do выводит PLUGIN_NAME и PLUGIN_INSTALL_DIR_PATH из $PWD (имя плагина — третий с конца компонент пути)</li> <li>plg-dc-screenshoter.c053 · code · unknown; прошивка — · Обёртка do задаёт PLUGIN_TMP_DIR_PATH=$FS_PREFIX/tmp/plugins/$PLUGIN_NAME, PLUGIN_WWW_URL=http://127.0.0.1:$HD_HTTP_LOCAL_PORT/plugins/$PLUGIN_NAME/ и PLUGIN_CGI_URL=…/cgi-bin/plugins/$PLUGIN_NAME/; порт по умолчанию 80</li> <li>plg-dc-screenshoter.c054 · code · unknown; прошивка — · Обёртка do выбирает PLUGIN_DATA_DIR_PATH: /persistfs/plugins_data/$PLUGIN_NAME, если каталог есть, иначе $FS_PREFIX/flashdata/plugins_data/$PLUGIN_NAME, иначе пусто</li> </ul> <p><a class="footnote-backref" href="#fnref:468" title="Jump back to footnote 468 in the text">↩</a></p> </li> <li id="fn:469"> <ul> <li>plg-dune-remote-control.c013 · code · unknown; прошивка — · CGI-обёртка www/cgi-bin/do вычисляет имя плагина как третий с конца компонент $PWD, а PLUGIN_INSTALL_DIR_PATH — как путь без двух последних компонентов (www/cgi-bin), то есть каталог плагина.</li> <li>plg-dune-remote-control.c014 · code · unknown; прошивка — · Обёртка do задаёт PLUGIN_TMP_DIR_PATH=/tmp/plugins/$PLUGIN_NAME, PLUGIN_WWW_URL=http://127.0.0.1/plugins/$PLUGIN_NAME/ и PLUGIN_CGI_URL=http://127.0.0.1/cgi-bin/plugins/$PLUGIN_NAME/.</li> <li>plg-dune-remote-control.c015 · code · unknown; прошивка — · Обёртка do выбирает PLUGIN_DATA_DIR_PATH: /persistfs/plugins_data/$PLUGIN_NAME, если каталог есть, иначе /flashdata/plugins_data/$PLUGIN_NAME, если есть, иначе пустую строку.</li> </ul> <p><a class="footnote-backref" href="#fnref:469" title="Jump back to footnote 469 in the text">↩</a></p> </li> <li id="fn:470"> <ul> <li>plg-dc-torrent-center.c110 · code · unknown; прошивка — · CGI do выводит PLUGIN_NAME и PLUGIN_INSTALL_DIR_PATH из PWD и экспортирует временные пути и loopback URL плагина.</li> <li>plg-dc-torrent-center.c111 · code · unknown; прошивка — · CGI do выбирает PLUGIN_DATA_DIR_PATH из существующих /persistfs/plugins_data/<name> или /flashdata/plugins_data/<name>, иначе пустую строку.</li> </ul> <p><a class="footnote-backref" href="#fnref:470" title="Jump back to footnote 470 in the text">↩</a></p> </li> <li id="fn:471"> <p>plg-hdtv-101-ru.c048 · code · unknown; прошивка — · CGI-обёртки www/cgi-bin/do и www/cgi-bin/link — shell-скрипты: PLUGIN_NAME берётся как третий с конца компонент PWD, PLUGIN_INSTALL_DIR_PATH — как префикс пути, PLUGIN_TMP_DIR_PATH равен /tmp/plugins/<name>, PLUGIN_WWW_URL — http://127.0.0.1/plugins/<name>/, PLUGIN_CGI_URL — http://127.0.0.1/cgi-bin/plugins/<name>/; PLUGIN_DATA_DIR_PATH равен /persistfs/plugins_data/<name>, если каталог существует, иначе /flashdata/plugins_data/<name>, если существует, иначе пустой строке; затем SCRIPT_FILENAME подменяется на do.php или link.php и запускается ./php-cgi. <a class="footnote-backref" href="#fnref:471" title="Jump back to footnote 471 in the text">↩</a></p> </li> <li id="fn:472"> <p>plg-hdtv-folder-cache-vod.c098 · code · unknown; прошивка — · CGI-обёртка do вычисляет PLUGIN_NAME и PLUGIN_INSTALL_DIR_PATH из PWD, экспортирует PLUGIN_TMP_DIR_PATH, PLUGIN_WWW_URL, PLUGIN_CGI_URL и PLUGIN_DATA_DIR_PATH (persistfs, иначе flashdata, иначе пусто), затем выставляет LD_LIBRARY_PATH, подменяет SCRIPT_FILENAME на do.php и запускает ./php-cgi. <a class="footnote-backref" href="#fnref:472" title="Jump back to footnote 472 in the text">↩</a></p> </li> <li id="fn:473"> <p>plg-hdtv-smart-vod.c131 · code · unknown; прошивка — · cgi_plugin_env эталона вычисляет PLUGIN_NAME и пути install/tmp/www/cgi из PWD; PLUGIN_DATA_DIR_PATH выбирает существующий persistfs, иначе существующий flashdata, иначе пустую строку. <a class="footnote-backref" href="#fnref:473" title="Jump back to footnote 473 in the text">↩</a></p> </li> <li id="fn:474"> <ul> <li>plg-hdtv-surface-family.c054 · code · unknown; прошивка — · CGI-лаунчер do во всех пакетах с www вычисляет PLUGIN_NAME из PWD, экспортирует PLUGIN_INSTALL_DIR_PATH, PLUGIN_TMP_DIR_PATH, PLUGIN_WWW_URL, PLUGIN_CGI_URL и PLUGIN_DATA_DIR_PATH (persistfs, иначе flashdata, иначе пусто) и запускает ./php-cgi.</li> <li>plg-hdtv-surface-family.c055 · code · unknown; прошивка — · CGI-лаунчер Radiorecord.ru использует $FS_PREFIX в путях tmp и данных, подставляет HD_HTTP_LOCAL_PORT=80 при пустой переменной и перенаправляет stderr в <tmp>/plugins/<name>/cgi_err.log с ротацией после 10000 байт; rmfon.pl этих действий не делает и использует фиксированные /tmp и http://127.0.0.1.</li> </ul> <p><a class="footnote-backref" href="#fnref:474" title="Jump back to footnote 474 in the text">↩</a></p> </li> <li id="fn:475"> <p>plg-hdtv-megaradio.c120 · code · unknown; прошивка — · CGI-обёртка do вычисляет PLUGIN_NAME и PLUGIN_INSTALL_DIR_PATH из PWD, задаёт PLUGIN_TMP_DIR_PATH, PLUGIN_WWW_URL, PLUGIN_CGI_URL и PLUGIN_DATA_DIR_PATH (persistfs, иначе flashdata), после чего запускает ./php-cgi. <a class="footnote-backref" href="#fnref:475" title="Jump back to footnote 475 in the text">↩</a></p> </li> <li id="fn:476"> <p>plg-gh-mdpuma-dune-plugin-altiptv.c086 · code · unknown; прошивка — · CGI-обёртка do вычисляет PLUGIN_NAME из PWD, экспортирует install/tmp/www/cgi/data пути и запускает ./php-cgi для do.php. <a class="footnote-backref" href="#fnref:476" title="Jump back to footnote 476 in the text">↩</a></p> </li> <li id="fn:477"> <p>plg-hdtv-torrserve.c035 · code · unknown; прошивка — · CGI service_api вычисляет каталог плагина и его данные из текущего пути (PWD): PLUGIN_NAME — третий сегмент с конца, install_dir — остаток пути, data_dir — /persistfs/plugins_data/<name> или /flashdata/plugins_data/<name>, tmp_dir — /tmp/plugins/<name>. <a class="footnote-backref" href="#fnref:477" title="Jump back to footnote 477 in the text">↩</a></p> </li> <li id="fn:478"> <p>plg-hdtv-utility-family.c040 · code · unknown; прошивка — · service_api восстанавливает окружение плагина из $PWD CGI (PLUGIN_NAME — третий с конца элемент пути, PLUGIN_TMP_DIR_PATH=/tmp/plugins/<name>, PLUGIN_CGI_URL=http://127.0.0.1/cgi-bin/plugins/<name>/) и выбирает PLUGIN_DATA_DIR_PATH: /persistfs/plugins_data/<name>, иначе /flashdata/plugins_data/<name>, иначе пусто. <a class="footnote-backref" href="#fnref:478" title="Jump back to footnote 478 in the text">↩</a></p> </li> <li id="fn:479"> <ul> <li>plg-dc-bazinga3.c060 · code · unknown; прошивка — · Обёртка do выводит PLUGIN_NAME и PLUGIN_INSTALL_DIR_PATH из PWD, экспортирует PLUGIN_TMP_DIR_PATH, PLUGIN_WWW_URL, PLUGIN_CGI_URL на 127.0.0.1:$HD_HTTP_LOCAL_PORT и PLUGIN_DATA_DIR_PATH из /persistfs или /flashdata.</li> <li>plg-dc-bazinga3.c061 · code · unknown; прошивка — · Обёртка do дописывает в LD_LIBRARY_PATH ./lib, /usr/lib и /tango3/firmware_ext/flashlite/lib.</li> </ul> <p><a class="footnote-backref" href="#fnref:479" title="Jump back to footnote 479 in the text">↩</a></p> </li> <li id="fn:480"> <ul> <li>plg-dc-screenshoter.c055 · code · unknown; прошивка — · Обёртка do подменяет SCRIPT_FILENAME на do.php, пишет stderr в $FS_PREFIX/tmp/plugins/Screenshoter/cgi_err.log (ротация при >10000 байт) и запускает ./php-cgi из пакета</li> <li>plg-dc-screenshoter.c056 · code · unknown; прошивка — · Обёртка index дописывает .php к SCRIPT_FILENAME (index → index.php) и запускает ./php-cgi</li> </ul> <p><a class="footnote-backref" href="#fnref:480" title="Jump back to footnote 480 in the text">↩</a></p> </li> <li id="fn:481"> <p>plg-dune-remote-control.c016 · code · unknown; прошивка — · Обёртка do добавляет к LD_LIBRARY_PATH ./lib, /usr/lib и /tango3/firmware_ext/flashlite/lib, подменяет SCRIPT_FILENAME на do.php в каталоге скрипта и запускает ./php-cgi. <a class="footnote-backref" href="#fnref:481" title="Jump back to footnote 481 in the text">↩</a></p> </li> <li id="fn:482"> <p>plg-dc-torrent-center.c112 · code · unknown; прошивка — · CGI do переписывает SCRIPT_FILENAME на do.php и выполняет ./php-cgi. <a class="footnote-backref" href="#fnref:482" title="Jump back to footnote 482 in the text">↩</a></p> </li> <li id="fn:483"> <p>plg-hdtv-smart-vod.c130 · code · unknown; прошивка — · CGI-обёртка do эталона после cgi_plugin_env задаёт LD_LIBRARY_PATH, перенаправляет SCRIPT_FILENAME на do.php и запускает ./php-cgi. <a class="footnote-backref" href="#fnref:483" title="Jump back to footnote 483 in the text">↩</a></p> </li> <li id="fn:484"> <p>plg-hdtv-utility-family.c116 · code · unknown; прошивка — · CGI www/cgi-bin/do mark.it (bash, автор Andrii Kopyniak) восстанавливает окружение плагина из $PWD, подставляет SCRIPT_FILENAME на do.php и запускает собственный ./php-cgi из каталога cgi-bin; php.ini плагина ставит cgi.force_redirect = 0, max_execution_time = 0, error_reporting = 0. <a class="footnote-backref" href="#fnref:484" title="Jump back to footnote 484 in the text">↩</a><a class="footnote-backref" href="#fnref2:484" title="Jump back to footnote 484 in the text">↩</a></p> </li> <li id="fn:485"> <p>plg-dc-bazinga3.c059 · code · unknown; прошивка — · www/cgi-bin содержит shell-обёртки do, classActions, doHeader, hlsProxy, torrserve; каждая — копия скрипта Andrii Kopyniak, отличающаяся только именем .php в замене SCRIPT_FILENAME перед запуском ./php-cgi. <a class="footnote-backref" href="#fnref:485" title="Jump back to footnote 485 in the text">↩</a></p> </li> <li id="fn:486"> <ul> <li>plg-gh-vladikshkwok-lampa-dune-plugins.c044 · code · android; прошивка — · CGI-обёртка api задаёт FS_PREFIX по умолчанию /data/data/com.dunehd.app и добавляет в LD_LIBRARY_PATH каталоги firmware/lib, lib и системные.</li> <li>plg-gh-vladikshkwok-lampa-dune-plugins.c045 · code · android; прошивка — · CGI-обёртка api подставляет SCRIPT_FILENAME из PLUGIN_CGI_DIR (или каталога скрипта), ставит REDIRECT_STATUS=200 и запускает php-cgi с cgi.force_redirect=0.</li> <li>plg-gh-vladikshkwok-lampa-dune-plugins.c046 · forum · android; прошивка — · Комментарии CGI-обёртки api утверждают, что run_plugin_cgi вызывает файл через sh даже на Android 11, а php-cgi предпочитает SCRIPT_FILENAME опции -f при наличии REQUEST_METHOD.</li> </ul> <p><a class="footnote-backref" href="#fnref:486" title="Jump back to footnote 486 in the text">↩</a></p> </li> <li id="fn:487"> <p>plg-dc-screenshoter.c057 · code · unknown; прошивка — · Пакет несёт собственный ELF www/cgi-bin/php-cgi (51724 байта); в его строках есть libphp5.so, /lib/ld-linux.so.3 и секции .ARM.exidx <a class="footnote-backref" href="#fnref:487" title="Jump back to footnote 487 in the text">↩</a></p> </li> <li id="fn:488"> <p>plg-hdtv-smart-vod.c134 · code · unknown; прошивка — · tree.tsv HdKinoTeatr.Com отмечает два ELF php-cgi: основной www/cgi-bin/php-cgi (55889 байт) и .platform.87xx/www/cgi-bin/php-cgi (51724 байта). <a class="footnote-backref" href="#fnref:488" title="Jump back to footnote 488 in the text">↩</a></p> </li> <li id="fn:489"> <p>plg-hdtv-megaanime.c010 · code · unknown; прошивка — · tree.tsv пакета отмечает два ELF php-cgi: www/cgi-bin/php-cgi (55889 байт) и .platform.87xx/www/cgi-bin/php-cgi (51724 байта). <a class="footnote-backref" href="#fnref:489" title="Jump back to footnote 489 in the text">↩</a></p> </li> <li id="fn:490"> <p>plg-hdtv-utility-family.c117 · code · unknown; прошивка — · mark.it содержит две сборки php-cgi: www/cgi-bin/php-cgi и .platform.87xx/www/cgi-bin/php-cgi (ELF разного размера). <a class="footnote-backref" href="#fnref:490" title="Jump back to footnote 490 in the text">↩</a></p> </li> <li id="fn:491"> <ul> <li>plg-dc-dunemdb-supplier-online-movies.c029 · code · unknown; прошивка — · Команда запуска поставщика в описателе — cd <каталог bin> и $FS_PREFIX/firmware_ext/php/php-cgi -c <каталог bin> -f ./run.php.</li> <li>plg-dc-dunemdb-supplier-online-movies.c037 · code · unknown; прошивка — · bin/php.ini отключает перенаправление CGI (cgi.force_redirect = 0) и задаёт cgi.redirect_status_env = yes.</li> <li>plg-dc-dunemdb-supplier-online-movies.c023 · code · sigma-smp87xx; прошивка — · php-cgi из .platform.87xx — CGI-сборка PHP 5, загружающая libphp5.so и поддерживающая режим CGI/FastCGI.</li> </ul> <p><a class="footnote-backref" href="#fnref:491" title="Jump back to footnote 491 in the text">↩</a></p> </li> <li id="fn:492"> <p>plg-dc-screenshoter.c059 · code · unknown; прошивка — · www/cgi-bin/php.ini: cgi.force_redirect = 0, max_execution_time = 0, error_reporting = 0, date.timezone = UTC <a class="footnote-backref" href="#fnref:492" title="Jump back to footnote 492 in the text">↩</a></p> </li> <li id="fn:493"> <p>plg-hdtv-101-ru.c049 · code · unknown; прошивка — · www/cgi-bin/php.ini отключает cgi.force_redirect, задаёт cgi.redirect_status_env=yes, max_execution_time=0, error_reporting=0 и date.timezone=UTC. <a class="footnote-backref" href="#fnref:493" title="Jump back to footnote 493 in the text">↩</a></p> </li> <li id="fn:494"> <p>plg-hdtv-surface-family.c062 · code · unknown; прошивка — · php.ini CGI-среды Radiorecord.ru задаёт cgi.force_redirect = 0, max_execution_time = 0, error_reporting = 0, date.timezone = UTC и отключает magic_quotes_*. <a class="footnote-backref" href="#fnref:494" title="Jump back to footnote 494 in the text">↩</a></p> </li> <li id="fn:495"> <p>plg-hdtv-megaanime.c070 · code · unknown; прошивка — · CGI-конфиг www/cgi-bin/php.ini задаёт date.timezone = UTC, max_execution_time = 0 и cgi.force_redirect = 0; это фиксирует время у всех CGI-скриптов плагина. <a class="footnote-backref" href="#fnref:495" title="Jump back to footnote 495 in the text">↩</a></p> </li> <li id="fn:496"> <p>plg-gh-mdpuma-dune-plugin-altiptv.c109 · code · unknown; прошивка — · Локальный www/cgi-bin/php.ini задаёт max_execution_time=0, error_reporting=0 и date.timezone=UTC. <a class="footnote-backref" href="#fnref:496" title="Jump back to footnote 496 in the text">↩</a></p> </li> <li id="fn:497"> <p>plg-dc-bazinga3.c062 · code · unknown; прошивка — · php.ini CGI задаёт cgi.force_redirect=0, max_execution_time=0, error_reporting=0 и date.timezone=UTC. <a class="footnote-backref" href="#fnref:497" title="Jump back to footnote 497 in the text">↩</a></p> </li> <li id="fn:498"> <p>plg-dc-screenshoter.c060 · code · unknown; прошивка — · В CGI фреймворк плагина не подключается: do_config.php сам объявляет класс DuneSystem и заполняет DuneSystem::$properties из $_ENV (PLUGIN_NAME, PLUGIN_INSTALL_DIR_PATH, …) <a class="footnote-backref" href="#fnref:498" title="Jump back to footnote 498 in the text">↩</a></p> </li> <li id="fn:499"> <p>plg-dc-torrent-center.c113 · code · unknown; прошивка — · do_config.php сам объявляет DuneSystem и заполняет properties из PLUGIN_* в $_ENV. <a class="footnote-backref" href="#fnref:499" title="Jump back to footnote 499 in the text">↩</a></p> </li> <li id="fn:500"> <p>plg-gh-mdpuma-dune-plugin-altiptv.c108 · code · unknown; прошивка — · CGI do_config.php заполняет DuneSystem::$properties значениями PLUGIN_* из $_ENV вместо обращения к объекту окружения PHP-плагина. <a class="footnote-backref" href="#fnref:500" title="Jump back to footnote 500 in the text">↩</a></p> </li> <li id="fn:501"> <p>plg-hdtv-folder-cache-vod.c099 · code · unknown; прошивка — · www/cgi-bin/do_config.php — CGI-копия общей библиотеки: класс DuneSystem читает PLUGIN_* из $_ENV, do_config задаёт PROTOCOL_VERSION=5, HD::http_get_document умеет прокси, а smbtree запускает /tango/firmware/bin/smbtree и читает /proc/mounts и /config/network_folders.properties для SMB/NFS. <a class="footnote-backref" href="#fnref:501" title="Jump back to footnote 501 in the text">↩</a></p> </li> <li id="fn:502"> <p>plg-dc-bazinga3.c036 · code · unknown; прошивка — · Файл поставщика при отсутствии класса DuneSystem (запуск вне оболочки, например из CGI) сам объявляет hd_print и DuneSystem и заполняет properties из пути <strong>DIR</strong> (plugins/<name>/lib) и /persistfs или /flashdata. <a class="footnote-backref" href="#fnref:502" title="Jump back to footnote 502 in the text">↩</a></p> </li> <li id="fn:503"> <p>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. <a class="footnote-backref" href="#fnref:503" title="Jump back to footnote 503 in the text">↩</a></p> </li> <li id="fn:504"> <ul> <li>plg-hdtv-utility-family.c042 · code · unknown; прошивка — · SettingManager::get_usb_list LTU_install запрашивает свой CGI по адресу DuneSystem::$properties['plugin_cgi_url'] + 'service_api?cmd=usb_list' через HD::http_get_document и возвращает поле result из json_decode.</li> <li>plg-hdtv-utility-family.c041 · code · unknown; прошивка — · Команда usb_list service_api строит JSON-массив из вывода df -h по строкам с /tmp/mnt/storage: name (часть пути после /tmp/mnt/storage/), size, used, available.</li> </ul> <p><a class="footnote-backref" href="#fnref:504" title="Jump back to footnote 504 in the text">↩</a></p> </li> <li id="fn:505"> <ul> <li>plg-hdtv-remtor.c120 · code · unknown; прошивка — · start_local_transmission запускает /ltu/etc/init.d/rc.transmission start или /opt/etc/init.d/rc.transmission start через exec, а для kc_remote_dune запрашивает http://<ip>/cgi-bin/plugins/LTU_install/service_api?cmd=transmission_start.</li> <li>plg-hdtv-remtor.c121 · code · unknown; прошивка — · stop_local_transmission выполняет те же команды с аргументом stop и запрашивает service_api?cmd=transmission_stop для kc_remote_dune.</li> </ul> <p><a class="footnote-backref" href="#fnref:505" title="Jump back to footnote 505 in the text">↩</a></p> </li> <li id="fn:506"> <p>plg-gh-kocourkuba-proiptv.c066 · code · unknown; прошивка — · CGI плагина — shell-скрипты в www/cgi-bin: channels отдаёт $FS_PREFIX/tmp/plugins/<плагин>/channel_ids.txt (или 404) с заголовком 'Content-Type: Content-Type: text/xml' (дубль), epg по PATH_INFO ждёт до 120 итераций по 0,1 с появления JSON в $FS_PREFIX/tmp/ext_epg и отдаёт его, delay отдаёт иконку delay_channel.png с Content-Length; channels и delay берут имя плагина из пути к своему каталогу. <a class="footnote-backref" href="#fnref:506" title="Jump back to footnote 506 in the text">↩</a></p> </li> <li id="fn:507"> <p>plg-dune-remote-control.c069 · code · unknown; прошивка — · CGI playlists отдаёт Content-type audio/x-mpegurl и выводит файл <PLUGIN_DATA_DIR_PATH>/playlists${PATH_INFO} через cat. <a class="footnote-backref" href="#fnref:507" title="Jump back to footnote 507 in the text">↩</a></p> </li> <li id="fn:508"> <ul> <li>plg-dune-remote-control.c020 · code · unknown; прошивка — · do.php отвечает XML с Content-type text/xml; charset=utf-8 и корнем command_result, в котором первым параметром идёт protocol_version = 5.</li> <li>plg-dune-remote-control.c025 · code · unknown; прошивка — · do.php разбирает команду через switch (strtolower($CMD)) и реализует ровно восемь значений: pls, ls, sources, network_browser, smb, network_folder, favorites, rc_extension; остальные значения дают ошибку unknown_command.</li> <li>plg-dune-remote-control.c026 · code · unknown; прошивка — · Ответ собирается из элементов <param name=… value=…>: make_ok добавляет command_status=ok, player_state=<cmd> и переданные пары, make_error — command_status=failed, error_kind, error_description и player_state=navigator.</li> <li>plg-dune-remote-control.c027 · code · unknown; прошивка — · В успешном ответе player_state равен имени выполненной команды (например, favorites), а не состоянию плеера; при ошибке player_state=navigator.</li> </ul> <p><a class="footnote-backref" href="#fnref:508" title="Jump back to footnote 508 in the text">↩</a></p> </li> <li id="fn:509"> <ul> <li>plg-dc-screenshoter.c095 · code · unknown; прошивка — · CGI-скрипт do.php принимает action из GET (screenshot, rec, stop_rec, status_rec, get_save_content) или из POST (<code>del_el</code> с <code>href</code>), отвечает JSON с Content-Type application/json и, если action нет ни в GET, ни в POST, возвращает status=error.</li> <li>plg-dc-screenshoter.c079 · code · unknown; прошивка — · del_el удаляет файл install_dir/www + часть POST-параметра href после имени плагина, без проверки пути</li> </ul> <p><a class="footnote-backref" href="#fnref:509" title="Jump back to footnote 509 in the text">↩</a></p> </li> <li id="fn:510"> <ul> <li>plg-hdtv-liteiptv.c091 · code · unknown; прошивка — · link.php принимает POST action и обрабатывает grups_id, save_vsetvid, save_cutname, vsetvIDupd, save_sorted, clear_sorted, save_arhive, clear_arhive, save_playlist, dell_playlist, add_new_playlist и hide_playlist; JSON со status/error возвращают grups_id, save_sorted, clear_sorted, save_arhive, clear_arhive, save_playlist, dell_playlist, add_new_playlist и hide_playlist, save_vsetvid — JSON с updated, а save_cutname и vsetvIDupd ответа не возвращают.</li> <li>plg-hdtv-liteiptv.c095 · code · unknown; прошивка — · do_img.php отдаёт содержимое файла из параметра img с Content-Type image/png для .png и image/jpeg иначе, а PHP-скрипт file принимает загруженный файл, записывает его по пути из имени поля и возвращает JSON со status, icon_status, icon_path_upload и icon_src.</li> <li>plg-hdtv-liteiptv.c117 · code · unknown; прошивка — · do_img.php передаёт значение GET-параметра img напрямую в file_get_contents и отдаёт файл, а PHP-скрипт file записывает загруженный файл по пути из имени поля формы.</li> </ul> <p><a class="footnote-backref" href="#fnref:510" title="Jump back to footnote 510 in the text">↩</a></p> </li> <li id="fn:511"> <ul> <li>plg-dc-torrent-center.c152 · code · unknown; прошивка — · torrserve.php использует верхнеуровневые return строк JSON для сообщений статуса, а ответ service_api выводит через echo.</li> <li>plg-dc-torrent-center.c091 · code · unknown; прошивка — · После попытки запуска torrserve.php при ложном результате pidof torrserver возвращает строку status=true, msg=TorrServer is running.</li> </ul> <p><a class="footnote-backref" href="#fnref:511" title="Jump back to footnote 511 in the text">↩</a></p> </li> <li id="fn:512"> <p>plg-dc-torrent-center.c114 · code · unknown; прошивка — · do.php для GET img запрашивает изображение через HD::http_get_document и выводит его с Content-Type: image/jpeg. <a class="footnote-backref" href="#fnref:512" title="Jump back to footnote 512 in the text">↩</a></p> </li> <li id="fn:513"> <ul> <li>plg-hdtv-smart-vod.c132 · code · unknown; прошивка — · При заданном GET img do.php эталона возвращает Content-Type image/jpeg и скачанное HD::http_get_document содержимое; при совпадении GIF89a4 либо ложном ответе читает icons/poster_none.png.</li> <li>plg-hdtv-smart-vod.c183 · code · unknown; прошивка — · В do_parse_page Futbik.Net третий аргумент вызова new ShortMovie записан как plugin_cgi_url + do?img= + img.</li> </ul> <p><a class="footnote-backref" href="#fnref:513" title="Jump back to footnote 513 in the text">↩</a></p> </li> <li id="fn:514"> <p>plg-hdtv-folder-cache-vod.c097 · code · unknown; прошивка — · CGI-скрипт do.php по GET-параметру img скачивает URL (при отсутствии схемы добавляет https://) и сразу отдаёт его с Content-Type image/jpeg, а затем при GIF89a4 или ошибке чтения дополнительно выводит файл install_dir_path/icons/logo.png. <a class="footnote-backref" href="#fnref:514" title="Jump back to footnote 514 in the text">↩</a></p> </li> <li id="fn:515"> <ul> <li>plg-hdtv-youtube.c083 · code · unknown; прошивка — · parse_video_page YouTube направляет постеры через CGI плагина: plugin_cgi_url + do?img=<urlencode URL картинки>.</li> <li>plg-hdtv-youtube.c084 · code · unknown; прошивка — · www/cgi-bin/do.php YouTube при GET img декодирует URL, дописывает https:// к адресу без http-префикса, отдаёт Content-Type image/jpeg и содержимое file_get_contents (в эталоне — HD::http_get_document).</li> <li>plg-hdtv-youtube.c085 · code · unknown; прошивка — · do.php YouTube выводит полученное содержимое echo сразу, а при GIF89a4 или false затем дописывает ещё и icons/logo.png вторым echo, не заменяя первый вывод.</li> </ul> <p><a class="footnote-backref" href="#fnref:515" title="Jump back to footnote 515 in the text">↩</a></p> </li> <li id="fn:516"> <ul> <li>plg-hdtv-surface-family.c060 · code · unknown; прошивка — · do_img.php пакета Radiorecord.ru отдаёт Content-Type image/jpeg и проксирует URL из GET-параметра img через HD::http_get_document; если в ответе встречается GIF89a4 или запрос не удался, подставляет файл icons/poster_none.png, которого в пакете нет.</li> <li>plg-hdtv-surface-family.c075 · code · unknown; прошивка — · В пакете Radiorecord.ru код ссылается на отсутствующие файлы icons/template.png и icons/line.png, а do_img.php — на icons/poster_none.png; каталога icons/ в пакете нет.</li> </ul> <p><a class="footnote-backref" href="#fnref:516" title="Jump back to footnote 516 in the text">↩</a></p> </li> <li id="fn:517"> <ul> <li>plg-dc-bazinga3.c057 · code · unknown; прошивка — · Rezka_Class::http_get_img при self::$proxy == true для относительного URL отдаёт <plugin_cgi_url>do?img=<домен><url>&proxy=<cName>, для абсолютного URL с хостом домена — <plugin_cgi_url>do?img=<url>&proxy=<cName>; иначе (прокси выключен или URL чужого хоста) — <plugin_cgi_url>do?img=<url>, причём относительный URL дополняется доменом.</li> <li>plg-dc-bazinga3.c058 · code · unknown; прошивка — · do.php для GET img при наличии proxy читает proxySettings (proxy, proxyType=SOCKS5 → CURLOPT_PROXYTYPE 7, proxyAccount); относительный img при заданных cName и DomainName дополняет настройкой <cName>DomainName или переданным DomainName; при GIF89a4, ответе 40x или false отдаёт rPath либо icons/poster_none.png, иначе при savePath сохраняет картинку в файл.</li> </ul> <p><a class="footnote-backref" href="#fnref:517" title="Jump back to footnote 517 in the text">↩</a></p> </li> <li id="fn:518"> <ul> <li>plg-hdtv-freetv.c029 · code · unknown; прошивка — · CGI img.sh отдаёт клиенту ответ выбранного curl по строке QUERY_STRING вместе с заголовками (--include) и без переписывания URL.</li> <li>plg-hdtv-freetv.c031 · code · unknown; прошивка — · img.sh и space.sh выбирают curl по platform_kind из /tmp/run/versions.txt: 87xx → bin/curl.87xx, 864x → bin/curl.864x, 867x → bin/curl.867x, 865x → bin/curl.865x, иначе $FS_PREFIX/firmware/bin/curl.</li> <li>plg-hdtv-freetv.c032 · code · unknown; прошивка — · В пакет входят четыре сборки curl: 864x и 867x — curl 7.19.5 (mipsel), 87xx — curl 7.36.0 (arm-buildroot-linux-gnueabi); 865x — отдельный ELF без строки версии в извлечённых strings.</li> </ul> <p><a class="footnote-backref" href="#fnref:518" title="Jump back to footnote 518 in the text">↩</a></p> </li> <li id="fn:519"> <ul> <li>plg-hdtv-smart-vod.c333 · code · unknown; прошивка — · parse_video_page Filmix_API переписывает домен постера на thumbs.filmixapp.cyou и при DUNE_FIRMWARE_BN < 11 направляет постер через plugin_cgi_url . "img.sh?<URL>"; www/cgi-bin/img.sh выбирает curl по platform_kind: android → /firmware/bin/curl, 87.. → ../../bin/curl.87xx, 864. → curl.864x, 867. → curl.867x, 865. → curl.865x, и вызывает его с -s --location -k --include $QUERY_STRING.</li> <li>plg-hdtv-smart-vod.c352 · code · unknown; прошивка — · В tree.tsv Filmix_API единственный путь www/… — www/cgi-bin/img.sh; php-cgi, do, do.php, do_config.php и php.ini в пакете отсутствуют, в отличие от эталона.</li> </ul> <p><a class="footnote-backref" href="#fnref:519" title="Jump back to footnote 519 in the text">↩</a></p> </li> <li id="fn:520"> <p>plg-hdtv-freetv.c030 · code · unknown; прошивка — · CGI space.sh проксирует HLS: для запроса с .m3u8, если ответ содержит строки, начинающиеся с http, переписывает их на http://127.0.0.1:$HD_HTTP_LOCAL_PORT$SCRIPT_NAME?http..., иначе переписывает строки с m3u8/ts через BASE_URL; запрос без .m3u8 отдаёт как есть. Запрос идёт с User-Agent «WINK/1.55.1 (AndroidTV/9) HlsWinkPlayer» и Origin https://sansa.allarknow.online. <a class="footnote-backref" href="#fnref:520" title="Jump back to footnote 520 in the text">↩</a></p> </li> <li id="fn:521"> <ul> <li>plg-dc-bazinga3.c063 · code · unknown; прошивка — · hlsProxy.php при непустом GET path проксирует URL через cURL (Content-Type application/vnd.apple.mpegurl, если в URL есть m3u8, иначе video/mpegts); опции берёт из сериализованного <tmp_dir_path>/hlsProxyArgs: ['rp'] при rp и наличии ключа, иначе ['opts']; с rp переписывает строки плейлиста на <plugin_cgi_url>/hlsProxy?path=…</li> <li>plg-dc-bazinga3.c064 · code · unknown; прошивка — · В PHP-коде пакета вне hlsProxy.php нет ни ссылок на hlsProxy, ни записи файла hlsProxyArgs.</li> </ul> <p><a class="footnote-backref" href="#fnref:521" title="Jump back to footnote 521 in the text">↩</a></p> </li> <li id="fn:522"> <ul> <li>plg-hdtv-smart-vod.c182 · code · unknown; прошивка — · CGI do3.php BestKino принимает GET path, возвращает Content-Type application/vnd.apple.mpegurl и результат cURL-функции get_url.</li> <li>plg-hdtv-smart-vod.c301 · code · unknown; прошивка — · В knigavuhe файлы doHeader и doHeader.php повторяют CGI-обёртку do: doHeader задаёт PLUGIN_* и PLUGIN_DATA_DIR_PATH, подменяет SCRIPT_FILENAME на doHeader.php и запускает ./php-cgi; doHeader.php отдаёт Content-Type application/vnd.apple.mpegurl и скачивает переданный GET path через cURL с Referer https://farsihd.pw и User-Agent Opera.</li> <li>plg-hdtv-smart-vod.c302 · code · unknown; прошивка — · В Ex-Fs.Net и FilmHD1080.Net файлы doHeader и doHeader.php побайтно совпадают с knigavuhe (те же doHeader.php и Referer farsihd.pw); дополнительно FilmHD1080.Net содержит do3 и do3.php, где do3.php отдаёт m3u8 и при непустом proxy применяет прокси только к URL с vkuservideo.net (SOCKS5 и proxy_akk), а User-Agent — Chrome/67.</li> </ul> <p><a class="footnote-backref" href="#fnref:522" title="Jump back to footnote 522 in the text">↩</a></p> </li> <li id="fn:523"> <ul> <li>plg-hdtv-smart-vod--link-api.c023 · code · unknown; прошивка — · bazon playbackUrl собирает поток через sUtils::parseOrStr и при найденном потоке возвращает <code><plugin_cgi_url>doHeaderBazon?path=<urlencoded>&referer=<urlencoded>&ar=.m3u8</code>; замену <code>3h=</code> на <code>?hash=</code> делает только ветка с уже сохранённым в static <code>$sArr</code> URL, после разбора страницы возврат идёт без неё.</li> <li>plg-hdtv-smart-vod--link-api.c057 · code · unknown; прошивка — · Кроме внешних API, резолверы используют CGI и локальные обёртки: <plugin_cgi_url>do3?path=..., <plugin_cgi_url>doHeaderBazon?path=..., http://ts://127.0.0.1:81/cgi-bin/flv.sh?, http://ts://127.0.0.1:81/cgi-bin/hls.sh? и yt.sh из /codecpack или ffmpeg_install.</li> </ul> <p><a class="footnote-backref" href="#fnref:523" title="Jump back to footnote 523 in the text">↩</a></p> </li> <li id="fn:524"> <p>plg-dc-bazinga3.c066 · code · unknown; прошивка — · doHeader.php проксирует GET path как m3u8 через cURL с заголовком Referer https://farsihd.pw и UA Opera/9.80. <a class="footnote-backref" href="#fnref:524" title="Jump back to footnote 524 in the text">↩</a></p> </li> <li id="fn:525"> <ul> <li>plg-gh-mdpuma-dune-plugin-altiptv.c057 · code · unknown; прошивка — · get_tv_stream_url направляет RTMP, RTSP и FLV через CGI codecpack на 127.0.0.1:81.</li> <li>plg-gh-mdpuma-dune-plugin-altiptv.c058 · code · unknown; прошивка — · При URL с 127.0.0.1:81/cgi-bin get_tv_stream_url вызывает HD::get_codec_start_info, который при результате проверки процессов ≤1 запускает httpd -h /codecpack/WWW -p 81.</li> </ul> <p><a class="footnote-backref" href="#fnref:525" title="Jump back to footnote 525 in the text">↩</a></p> </li> <li id="fn:526"> <ul> <li>plg-hdtv-smart-vod--link-api.c052 · code · unknown; прошивка — · KinoProfi::getIframe при отсутствии /codecpack и sUtils::is_android()!=true сразу возвращает false; при video_id берёт data-key и POST-ит key[id]=...&pl_type=movie&session=d43hbrj4raf1b3cnu4anbhk4p0 на https://api.kinoprofi.vip/getplay; playbackUrl в формате <code>[качество]URL</code> разбирает через sUtils::parseMod2Str, иначе на Android возвращает как есть, а на не-Android — через hls.sh с заменой m3u8→m3u9.</li> <li>plg-hdtv-smart-vod--link-api.c013 · code · unknown; прошивка — · sUtils::is_android возвращает true только при наличии файла <code>/system/dunehd/init</code>; sUtils::getHttpStatusCode делает curl-запрос без тела с отключённой проверкой сертификата и печатает HTTP-код в вывод.</li> </ul> <p><a class="footnote-backref" href="#fnref:526" title="Jump back to footnote 526 in the text">↩</a></p> </li> <li id="fn:527"> <ul> <li>plg-dc-screenshoter.c062 · code · unknown; прошивка — · Веб-интерфейс index.php: кнопки «Сделать скриншот» и «Записать видео», запись видео помечена как экспериментальная и работающая не во всех плеерах</li> <li>plg-dc-screenshoter.c064 · code · unknown; прошивка — · index.js обращается к CGI do (относительный URL) с action = screenshot, rec, stop_rec, status_rec, get_save_content (GET) и del_el</li> <li>plg-dc-screenshoter.c096 · code · unknown; прошивка — · Веб-интерфейс при загрузке запрашивает галерею и статус записи, а во время записи опрашивает action=status_rec раз в секунду и обновляет кнопку обратным отсчётом.</li> </ul> <p><a class="footnote-backref" href="#fnref:527" title="Jump back to footnote 527 in the text">↩</a></p> </li> <li id="fn:528"> <p>plg-hdtv-101-ru.c060 · code · unknown; прошивка — · Страница do.php использует веб-приложение AudioAddict: application.css, remote.js, application.js, объект this.AudioAddict.API.Config, вызов di.app.start({}), событие start:module ChannelBrowserApp и контейнеры секций Favorites, User Radio, Radio Channels и Personal radio. <a class="footnote-backref" href="#fnref:528" title="Jump back to footnote 528 in the text">↩</a></p> </li> <li id="fn:529"> <p>plg-dc-screenshoter.c077 · code · unknown; прошивка — · get_save_content делает симлинки <storage>/screenshots → <install_dir>/www/dss и <imem>/screenshots → www/sdss и отдаёт ссылки через PLUGIN_WWW_URL, заменяя 127.0.0.1 на IP устройства <a class="footnote-backref" href="#fnref:529" title="Jump back to footnote 529 in the text">↩</a></p> </li> <li id="fn:530"> <ul> <li>plg-hdtv-101-ru.c055 · code · unknown; прошивка — · Список всех каналов do.php получает с http://101.ru/api/channel/ListChannels/channel/0/0/?dataFormat=json; для каждого result берёт rus_name в caption, logo в icon_url, id в streaming_url вида javascript:playCode('<id>','<ip>').</li> <li>plg-hdtv-101-ru.c059 · code · unknown; прошивка — · www/lib/remote.js определяет playCode, который шлёт GET на http://<ip>/cgi-bin/plugins/101.ru/link?n1=<id>, и keyCode, который шлёт GET на http://<ip>/cgi-bin/do?cmd=ir_code&ir_code=<код>.</li> <li>plg-hdtv-101-ru.c064 · code · unknown; прошивка — · link.php печатает собранный streaming_url и затем запрашивает http://127.0.0.1/cgi-bin/do?cmd=start_file_playback&media_url=<streaming_url>, запуская воспроизведение на самом устройстве.</li> <li>plg-hdtv-101-ru.c071 · forum · unknown; прошивка — · Автор темы TrippyCat пишет, что с IP-управлением Dune радиоплагин можно запускать без включения ТВ, и в первом посте указан адрес http://<ip плеера>/cgi-bin/plugins/101.ru/do.</li> </ul> <p><a class="footnote-backref" href="#fnref:530" title="Jump back to footnote 530 in the text">↩</a></p> </li> <li id="fn:531"> <ul> <li>plg-hdtv-surface-family.c056 · code · unknown; прошивка — · do.php Radiorecord.ru собирает HTML-страницу из статического www/lib/channel_list.xml, подставляет ссылки javascript:playCode('<streaming_url>','<ip>'), IP берёт из ifconfig с портом $LOCAL_PORT, режим — из mode_path, а в шапке выводит кнопки Power/Volume-/Mute/Volume+/Stop/Record через keyCode() с ir_code.</li> <li>plg-hdtv-surface-family.c058 · code · unknown; прошивка — · do.php rmfon.pl запрашивает http://www.rmfon.pl/xml/stations.txt, строит список станций и подставляет ссылки javascript:playCode('<station id>','<ip>'); remote.js этого пакета вызывает не /cgi-bin/do, а /cgi-bin/plugins/rmfon.pl/link?n1=<station id>.</li> <li>plg-hdtv-surface-family.c059 · code · unknown; прошивка — · link.php rmfon.pl принимает GET-параметр n1 (id станции), запрашивает http://www.rmfon.pl/stacje/flash_aac_<n1>.xml.txt, выбирает случайный URL через array_rand и запускает его командой http://127.0.0.1/cgi-bin/do?cmd=start_file_playback&media_url=<url> через file_get_contents.</li> <li>plg-hdtv-surface-family.c115 · code · unknown; прошивка — · Веб-интерфейс SomaFM строит do.php из живого http://somafm.com/channels.xml: title и largeimage/image/xlimage, ссылка playCode(<highestpls|fastpls>); remote.js отправляет её на /cgi-bin/plugins/SomaFM/link?n1=<pls>, а link.php скачивает PLS и, если «FileN=» нашлись, запускает случайный URL через cmd=start_file_playback&media_url=, иначе — install_dir_path/www/lib/logo/nostream.png.</li> <li>plg-hdtv-surface-family.c116 · code · unknown; прошивка — · Веб-интерфейс Radiopotok.ru строит do.php из http://radiopotok.ru/app3/all/: name и stream каждой станции, иконка www/lib/logo/radio.png; remote.js запускает поток напрямую через /cgi-bin/do?cmd=start_file_playback&media_url=<stream>; отдельного link.php в пакете нет.</li> </ul> <p><a class="footnote-backref" href="#fnref:531" title="Jump back to footnote 531 in the text">↩</a></p> </li> <li id="fn:532"> <ul> <li>plg-hdtv-megaradio.c121 · code · unknown; прошивка — · do.php формирует список станций из HD::get_items('my_playlist'), кодирует id станции в base64 для data-streamurl и отдаёт HTML-страницу с jQuery, index.js и формой добавления станции send.php.</li> <li>plg-hdtv-megaradio.c123 · code · unknown; прошивка — · link.php декодирует base64-параметр n1, разрешает URL через mUrl::get_link для youtube либо SmartConfig::get_radio_stream, пишет его в /tmp/www/mr.m3u и вызывает /cgi-bin/do?cmd=start_playlist_playback&media_url=http://127.0.0.1/mr.m3u.</li> </ul> <p><a class="footnote-backref" href="#fnref:532" title="Jump back to footnote 532 in the text">↩</a></p> </li> <li id="fn:533"> <ul> <li>plg-hdtv-101-ru.c059 · code · unknown; прошивка — · www/lib/remote.js определяет playCode, который шлёт GET на http://<ip>/cgi-bin/plugins/101.ru/link?n1=<id>, и keyCode, который шлёт GET на http://<ip>/cgi-bin/do?cmd=ir_code&ir_code=<код>.</li> <li>plg-hdtv-101-ru.c061 · code · unknown; прошивка — · Кнопки веб-пульта в do.php отправляют IR-коды: Power on/off BC43BF00, Volume- AC53BF00, Mute B946BF00, Volume+ AD52BF00, Stop E619BF00, Record 9F60BF00.</li> <li>plg-hdtv-101-ru.c051 · code · unknown; прошивка — · do.php в начале работы вычисляет IP устройства из вывода ifconfig (регулярка /inet6? addr: ?([^ ]+)/, берётся первый адрес) и при отрисовке страницы запрашивает http://<ip>/cgi-bin/do?cmd=ir_code&ir_code=A05FBF00.</li> </ul> <p><a class="footnote-backref" href="#fnref:533" title="Jump back to footnote 533 in the text">↩</a></p> </li> <li id="fn:534"> <ul> <li>plg-hdtv-megaradio.c126 · code · unknown; прошивка — · index.js отправляет IR-коды POST/GET-параметром cmd=ir_code на http://<ip>/cgi-bin/do и запускает станцию запросом link с параметром n1 (base64 id).</li> <li>plg-hdtv-megaradio.c127 · code · unknown; прошивка — · Веб-страница do.php содержит IR-коды power BC43BF00, Volume- AC53BF00, Mute B946BF00, Volume+ AD52BF00, Stop E619BF00 и Record 9F60BF00, а при открытии страницы отправляет IR-код A05FBF00.</li> </ul> <p><a class="footnote-backref" href="#fnref:534" title="Jump back to footnote 534 in the text">↩</a></p> </li> <li id="fn:535"> <p>plg-hdtv-surface-family.c056 · code · unknown; прошивка — · do.php Radiorecord.ru собирает HTML-страницу из статического www/lib/channel_list.xml, подставляет ссылки javascript:playCode('<streaming_url>','<ip>'), IP берёт из ifconfig с портом $LOCAL_PORT, режим — из mode_path, а в шапке выводит кнопки Power/Volume-/Mute/Volume+/Stop/Record через keyCode() с ir_code. <a class="footnote-backref" href="#fnref:535" title="Jump back to footnote 535 in the text">↩</a></p> </li> <li id="fn:536"> <p>plg-hdtv-megaradio.c122 · code · unknown; прошивка — · CGI-скрипт send (PHP, запускается обёрткой send.php) принимает POST path, name, image и info, проверяет непустые path/name и наличие http в path; если image = «* Image Path», подставляет логотип radio.png, если info = «* Station Description» — пустое описание; затем добавляет станцию в начало my_playlist и сохраняет. <a class="footnote-backref" href="#fnref:536" title="Jump back to footnote 536 in the text">↩</a></p> </li> <li id="fn:537"> <p>plg-hdtv-surface-family.c117 · code · unknown; прошивка — · CGI-среда SomaFM и Radiopotok.ru — та же, что у rmfon.pl: www/cgi-bin/do, do_config.php, php.ini, .htaccess, www/lib/application.css, application.js, шрифты и translations/dune_language_{russian,english}.txt (24 ключа) совпадают побайтно; отличаются do.php и remote.js, у SomaFM ещё переписанный link.php и лишний www/lib/channel_list.xml, а у Radiopotok.ru нет link и link.php. <a class="footnote-backref" href="#fnref:537" title="Jump back to footnote 537 in the text">↩</a></p> </li> <li id="fn:538"> <ul> <li>plg-hdtv-101-ru.c053 · code · unknown; прошивка — · patch_to_user_list() читает /tmp/run/storage_list.xml, перебирает storages/storage/mount_path и возвращает первый <mount_path>/user_radio.m3u, если файл существует; иначе false.</li> <li>plg-hdtv-101-ru.c054 · code · unknown; прошивка — · Пользовательское радио разбирается из m3u: каждый блок после '#EXTINF' даёт caption из строки после запятой и URL из следующей строки; '://' заменяется на '://audio_stream://', URL оборачивается в http://<ip>/cgi-bin/do?cmd=start_file_playback&media_url=…, логотип берётся из 'logotip=' или подставляется screensaver.png с ddaaff.mydune.ru.</li> <li>plg-hdtv-101-ru.c058 · code · unknown; прошивка — · Блок избранного do.php строит только при существовании /config/<plugin_name><em>plugin_cookies.properties и совпадении regex 'favorite_channels = (.*?)'; список режется по запятой, элементы с шаблоном '\d</em>' превращаются в playCode('<часть до _>'), остальные теряют 'http://', после чего каждый элемент ищется regex-ом в streaming_url всех собранных каналов и совпадения выводятся секцией Favorites.</li> </ul> <p><a class="footnote-backref" href="#fnref:538" title="Jump back to footnote 538 in the text">↩</a></p> </li> <li id="fn:539"> <ul> <li>plg-hdtv-liteiptv.c090 · code · unknown; прошивка — · Веб-интерфейс index.php поддерживает три режима: обычный список без дублей, index?full с дублями и index?sorted для сортировки; таблица показывает номер, название, группу, gr.ID, ссылку на поток, vsetvID, флаг ручного id, загрузку PNG и статус логотипа.</li> <li>plg-hdtv-liteiptv.c092 · code · unknown; прошивка — · playlists.php показывает URL-плейлисты из pl_folder и локальные m3u-файлы; URL-плейлисты можно добавлять, редактировать и удалять, а отключать/включать через stopList — и URL, и локальные.</li> <li>plg-hdtv-liteiptv.c093 · code · unknown; прошивка — · arhive.php показывает каналы без дублей и позволяет задать для каждого URL архива, количество дней (1–20) и UserAgent, сохраняя их в arc_channels; отдельная кнопка очищает все ссылки архивов.</li> </ul> <p><a class="footnote-backref" href="#fnref:539" title="Jump back to footnote 539 in the text">↩</a></p> </li> <li id="fn:540"> <ul> <li>plg-hdtv-web-launchers.c015 · code · unknown; прошивка — · Локальные webapp-плагины запускают свою страницу по адресу 127.0.0.1/plugins/<name>/: bonus-tv — ping.html, tvzavr — index.html, stream — index.html, amediateka — index.html.</li> <li>plg-hdtv-web-launchers.c027 · code · unknown; прошивка — · tvzavr запускает локальный index.html без background_color и без input_handler; stream — тоже локальный index.html, но с background_color=black и input_handler=0.</li> </ul> <p><a class="footnote-backref" href="#fnref:540" title="Jump back to footnote 540 in the text">↩</a></p> </li> <li id="fn:541"> <ul> <li>plg-hdtv-web-launchers.c002 · code · unknown; прошивка — · У 16 из 18 манифестов type=php, у zoomby и amediateka — plain; у plain-плагинов нет params/program.</li> <li>plg-hdtv-web-launchers.c003 · code · unknown; прошивка — · Все 18 манифестов содержат ровно одну entry_point, и её key_enter имеет type=launch_media_url; URL действия записан в actions/key_enter/data/url.</li> <li>plg-hdtv-web-launchers.c012 · code · unknown; прошивка — · 12 php-плагинов (шесть ott-play, impulstv, vivat-tv, real-tv, bonus-tv, mymagictv, stream) имеют main.php размером 6 байт — только строку <?php; их точка входа целиком задана манифестом.</li> <li>plg-hdtv-web-launchers.c014 · code · unknown; прошивка — · По способу запуска 18 плагинов делятся так: 12 ведут на внешний сайт (шесть ott-play, impulstv, vivat-tv, real-tv, mymagictv, xsmart, zoomby), 4 — на локальный http://127.0.0.1/plugins/<имя>/ (bonus-tv, tvzavr, stream, amediateka), 2 — на swf://plugin_file:// (vkmusic, moskva-fm).</li> </ul> <p><a class="footnote-backref" href="#fnref:541" title="Jump back to footnote 541 in the text">↩</a></p> </li> <li id="fn:542"> <ul> <li>plg-hdtv-web-launchers.c060 · doc · any-documented; прошивка — · Для www:// документ перечисляет параметры fullscreen (0|1, по умолчанию 0), webapp_keys (0|1, по умолчанию 0), zoom_level (N, по умолчанию из настроек), overscan (N, по умолчанию из настроек), user_agent (строка, по умолчанию браузерный), background_color (цвет, по умолчанию white), osd_size (720x480|720x576|1280x720|1920x1080, по умолчанию текущий видеорежим).</li> <li>plg-hdtv-web-launchers.c061 · doc · any-documented; прошивка — · fullscreen=1 означает, что HTML-страница занимает весь экран без элементов браузера; документ рекомендует 1 для полноэкранных ТВ-приложений.</li> <li>plg-hdtv-web-launchers.c062 · doc · any-documented; прошивка — · webapp_keys=1 означает, что JavaScript в HTML-странице обрабатывает все клавиши; при 0 часть клавиш (например, STOP) обрабатывает сам браузер. Для полноэкранных ТВ-приложений рекомендуется 1.</li> <li>plg-hdtv-web-launchers.c063 · doc · any-documented; прошивка — · zoom_level=100 — без масштабирования, overscan=0 — без обрезки (100% экрана); документ рекомендует эти значения для полноэкранных ТВ-приложений.</li> <li>plg-hdtv-web-launchers.c064 · doc · any-documented; прошивка — · user_agent переопределяет строку User-Agent браузера; background_color задаёт цвет фона (по умолчанию white, для тёмных полноэкранных приложений рекомендован black); osd_size задаёт разрешение, под которое отрисована страница.</li> </ul> <p><a class="footnote-backref" href="#fnref:542" title="Jump back to footnote 542 in the text">↩</a></p> </li> <li id="fn:543"> <ul> <li>plg-hdtv-web-launchers.c019 · code · unknown; прошивка — · zoomby — единственный манифест с webapp_keys=2 и input_handler=1; запускает http://www.zoomby.ru/ce/dune/dune.html, type=plain.</li> <li>plg-hdtv-web-launchers.c020 · code · unknown; прошивка — · impulstv запускает внешний http://impulstv.micro.im/ с input_handler=0 и osd_size=1280x720; exit_key, power_key и volume_handler в URL не заданы.</li> <li>plg-hdtv-web-launchers.c067 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · libduneshell.so r24 разбирает у www:// не только документированные fullscreen, webapp_keys, zoom_level, user_agent, overscan, osd_size и background_color, но и input_handler, engine_flags, navigation_highlight, exit_key, power_key, auto_auth_cancel, volume_handler и hbbtv; формат лога перечисляет их в одном сообщении «Opening URL '%s' (…)».</li> </ul> <p><a class="footnote-backref" href="#fnref:543" title="Jump back to footnote 543 in the text">↩</a></p> </li> <li id="fn:544"> <ul> <li>plg-hdtv-web-launchers.c002 · code · unknown; прошивка — · У 16 из 18 манифестов type=php, у zoomby и amediateka — plain; у plain-плагинов нет params/program.</li> <li>plg-hdtv-web-launchers.c058 · doc · any-documented; прошивка — · Для чистых FlashLite/HTML-плагинов SDK разрешает type=plain вместо php: PHP-программа и параметр program в этом случае не нужны.</li> </ul> <p><a class="footnote-backref" href="#fnref:544" title="Jump back to footnote 544 in the text">↩</a></p> </li> <li id="fn:545"> <ul> <li>plg-hdtv-duneplexcatalog.c047 · code · unknown; прошивка — · DN::set_m3u_file перезаписывает <каталог плагина>/www/dpc_play_list.m3u: пишет #EXTM3U, строки #EXTINF и пути, вызывает shell-команду sync и возвращает plugin_file:///www/dpc_play_list.m3u.</li> <li>plg-hdtv-duneplexcatalog.c066 · code · unknown; прошивка — · В пакете есть каталог www только с файлом dpc_play_list.m3u (пример плейлиста NFS); CGI-скриптов и каталога www/cgi-bin нет, плагин перезаписывает этот файл при воспроизведении и отдаёт его как plugin_file:///www/dpc_play_list.m3u.</li> </ul> <p><a class="footnote-backref" href="#fnref:545" title="Jump back to footnote 545 in the text">↩</a></p> </li> <li id="fn:546"> <p>plg-hdtv-torrserve.c029 · code · unknown; прошивка — · Пункт additional_settings показывает адреса веб-сервера TorrServe на порту 8090: корень, /cache, /settings и /stat с текущим IP плеера. <a class="footnote-backref" href="#fnref:546" title="Jump back to footnote 546 in the text">↩</a></p> </li> <li id="fn:547"> <ul> <li>plg-hdtv-peerflixserver.c035 · code · unknown; прошивка — · Если config->tmp не равен /D/torrent-stream, экран setup показывает адрес веб-интерфейса http://<ip>:9000 с иконкой online или offline, кнопку запуска при ложном peerflixServerStatus() либо кнопки остановки и перезапуска при истинном, и свободное место в папке временных файлов.</li> <li>plg-hdtv-peerflixserver.c058 · forum · unknown; прошивка — · По словам автора, веб-интерфейс у плагина — это веб-интерфейс самого peerflix-server (его адрес указан в плагине), а запуск, остановка, перезапуск и статус сервера доступны GET-запросами.</li> </ul> <p><a class="footnote-backref" href="#fnref:547" title="Jump back to footnote 547 in the text">↩</a></p> </li> <li id="fn:548"> <ul> <li>plg-hdtv-smart-apps.c048 · code · unknown; прошивка — · Экран приложения Entware app_creen строится по app_scr; для transmission он показывает кнопку start/stop по pidof transmission-daemon, автозапуск через строку #transmission-start в bin/boot_end.sh, выбор каталога, адрес http://<ip>:9091 и кнопку rem_tor: при наличии rem_tor в /tmp/run/installed_plugins.xml — plugin_launcher://rem_tor, иначе plugin_installer://...</li> <li>plg-hdtv-smart-apps.c049 · code · unknown; прошивка — · Для Deluge экран Entware показывает http://<ip>:888; при запущенном deluged — кнопку stop_deluge, иначе start_deluge и start_deluge_daemon; переключает строки deluge-start и S80deluged в bin/boot_end.sh, а диалог deluged_login правит /opt/etc/deluge/auth.</li> </ul> <p><a class="footnote-backref" href="#fnref:548" title="Jump back to footnote 548 in the text">↩</a></p> </li> <li id="fn:549"> <ul> <li>plg-hdtv-rclone.c070 · code · unknown; прошивка — · WEB GUI открывается по адресу http://<IP плеера>:5572; логин и пароль по умолчанию admin/admin, хранятся в файле login_settings через HD::get_items/HD::save_items.</li> <li>plg-hdtv-rclone.c071 · code · unknown; прошивка — · Запуск WEB GUI выполняет bin/rclone_rcdstart.sh <IP> <login> <pass> и опрашивает адрес через HD::isDomainAvailible раз в секунду, пока counter не превысит 120; остановка берёт PID rclone rcd и вызывает bin/rclone_kill.sh <pid>.</li> <li>plg-hdtv-rclone.c072 · code · unknown; прошивка — · Для WEB GUI плагин строит QR-код, запрашивая https://api.qrserver.com/v1/create-qr-code/?size=450x450&format=jpeg&data=<адрес http://<IP>:5572>.</li> <li>plg-hdtv-rclone.c097 · forum · unknown; прошивка — · Автор темы пишет, что WEB GUI rclone работает только с простыми облаками (Mega, Яндекс.Диск через WebDAV), а Dropbox через него добавить не удалось, поэтому добавлен импорт конфигурации, созданной на ПК.</li> <li>plg-hdtv-rclone.c098 · forum · unknown; прошивка — · Пользователь braverheart74 сообщает, что после установки плагина занятое место во флеше выросло с 2 до 25 МБ; автор отвечает, что «это вебинтерфес туда качается».</li> <li>plg-hdtv-rclone.c101 · forum · unknown; прошивка — · Пользователь .Play.Boy. сообщает, что после остановки WEB GUI созданный в нём config пропадал.</li> </ul> <p><a class="footnote-backref" href="#fnref:549" title="Jump back to footnote 549 in the text">↩</a></p> </li> <li id="fn:550"> <ul> <li>plg-hdtv-web-launchers.c030 · code · unknown; прошивка — · Обработчик FlashliteCgiTestEntryHandler при отсутствии user_input->control_id возвращает null; при control_id=="root" (ветка launch проверяется раньше) запускает system("PLUGIN_PATH=$install_dir $install_dir/bin/install_cgi.sh"), при ненулевом коде возвращает show_error "Failed to install CGI", иначе показывает диалог с полем url, кнопками Launch и Cancel.</li> <li>plg-hdtv-web-launchers.c032 · code · unknown; прошивка — · install_cgi.sh требует наличия bin/native.cgi и bin/curl.867x, при работающем httpd убивает его (killall httpd) и ждёт до 5 секунд, а при tmpfs на firmware/ext_command/cgi-bin и существующем каталоге размонтирует его, иначе завершается с ошибкой.</li> <li>plg-hdtv-web-launchers.c033 · code · unknown; прошивка — · install_cgi.sh собирает /tmp/cgi-bin из /firmware/ext_command/cgi-bin/do (если есть), native.cgi и curl.867x, делает их исполняемыми, монтирует /tmp/cgi-bin поверх /firmware/ext_command/cgi-bin и запускает /firmware/bin/httpd -h /firmware/ext_command.</li> </ul> <p><a class="footnote-backref" href="#fnref:550" title="Jump back to footnote 550 in the text">↩</a></p> </li> <li id="fn:551"> <p>plg-gh-sndpl-apple-trailers-dune-plugin.c055 · code · unknown; прошивка — · В пакете нет каталогов www/ и cgi-bin/, файлов настроек и кода их сохранения: веб-интерфейса и собственных настроек у плагина нет. <a class="footnote-backref" href="#fnref:551" title="Jump back to footnote 551 in the text">↩</a></p> </li> <li id="fn:552"> <p>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-секундной операции, получил ответ только после её конца — и для точки входа того же плагина, и для другого плагина. <a class="footnote-backref" href="#fnref:552" title="Jump back to footnote 552 in the text">↩</a></p> </li> <li id="fn:553"> <p>plg-hdtv-101-ru.c064 · code · unknown; прошивка — · link.php печатает собранный streaming_url и затем запрашивает http://127.0.0.1/cgi-bin/do?cmd=start_file_playback&media_url=<streaming_url>, запуская воспроизведение на самом устройстве. <a class="footnote-backref" href="#fnref:553" title="Jump back to footnote 553 in the text">↩</a></p> </li> <li id="fn:554"> <p>plg-hdtv-surface-family.c059 · code · unknown; прошивка — · link.php rmfon.pl принимает GET-параметр n1 (id станции), запрашивает http://www.rmfon.pl/stacje/flash_aac_<n1>.xml.txt, выбирает случайный URL через array_rand и запускает его командой http://127.0.0.1/cgi-bin/do?cmd=start_file_playback&media_url=<url> через file_get_contents. <a class="footnote-backref" href="#fnref:554" title="Jump back to footnote 554 in the text">↩</a></p> </li> <li id="fn:555"> <p>plg-hdtv-mpd.c022 · code · unknown; прошивка — · CGI-команда stream запускает воспроизведение http://127.0.0.1:8000 на самом плеере через IP-control /cgi-bin/do?cmd=start_file_playback. <a class="footnote-backref" href="#fnref:555" title="Jump back to footnote 555 in the text">↩</a></p> </li> <li id="fn:556"> <ul> <li>plg-dune-remote-control.c067 · code · unknown; прошивка — · reboot.bash отправляет в /firmware/ext_command/cgi-bin/do запросы cmd=ir_code&ir_code=… с кодами DISCRETE_POWER_OFF=A15EBF00 и DISCRETE_POWER_ON=A05FBF00 раз в секунду: сначала до player_state=standby, затем до выхода из standby.</li> <li>plg-dune-remote-control.c068 · code · unknown; прошивка — · В rc_extension.bash определён helper exec_do, который шлёт запрос в /firmware/ext_command/cgi-bin/do и извлекает command_status, но его вызов для чипа 8674 (cmd=standby и cmd=main_screen) закомментирован и не выполняется.</li> </ul> <p><a class="footnote-backref" href="#fnref:556" title="Jump back to footnote 556 in the text">↩</a></p> </li> <li id="fn:557"> <ul> <li>plg-dune-remote-control.c064 · code · sigma-smp86xx; прошивка — · strings dune_rc_extension_mipsel описывают демон «Remote-control extenstion is used to control the player Dune HD» с опциями --foreground, --stop и --port (по умолчанию 7777); в нём есть путь /sys/devices/platform/vms/coordinates, куда пишутся координаты.</li> <li>plg-dune-remote-control.c065 · code · sigma-smp86xx; прошивка — · Три модуля vmdriver_864x.ko, vmdriver_8671.ko и vmdriver_8674.ko — «Virtual mouse driver» авторства Dune HD corporation; их vermagic — 2.6.22.19-27-sigma, 2.6.29.6-18-sigma и 2.6.32.15-27-sigma соответственно, все MIPS32_R2.</li> <li>plg-dune-remote-control.c066 · code · sigma-smp86xx; прошивка — · rc_extension.bash по uname -r выбирает чип 864x, 8671, 8674 или 86??, проверяет наличие ./vmdriver_<чип>.ko и совпадение <name> из dune_plugin.xml с PLUGIN_NAME, снимает старый vmdriver через rmmod, загружает новый insmod, останавливает старый сервер ключом -t и запускает новый с -vv.</li> </ul> <p><a class="footnote-backref" href="#fnref:557" title="Jump back to footnote 557 in the text">↩</a></p> </li> <li id="fn:558"> <p>plg-gh-vladikshkwok-lampa-dune-plugins.c098 · code · android; прошивка — · Actions.status() при ненулевом localPort пробует его, а при нулевом или ошибке перебирает порты 80 и 11080; запрос идёт на http://127.0.0.1:<порт>/cgi-bin/do?cmd=status&result_syntax=json&timeout=2 через Proxy.NO_PROXY, а ответ принимается только при HTTP 200, наличии protocol_version и command_status=ok. <a class="footnote-backref" href="#fnref:558" title="Jump back to footnote 558 in the text">↩</a></p> </li> <li id="fn:559"> <ul> <li>plg-gh-vladikshkwok-lampa-dune-plugins.c072 · code · android; прошивка — · Позиция и состояние плеера читаются с двух локальных адресов http://127.0.0.1/cgi-bin/do?cmd=status&result_syntax=json и http://127.0.0.1:11080/cgi-bin/do?cmd=status&result_syntax=json.</li> <li>plg-gh-vladikshkwok-lampa-dune-plugins.c073 · code · android; прошивка — · Ответ status считается ответом Dune, если product_id и player_state — строки, product_name — непустая строка, а protocol_version числом не меньше 5; адреса перебираются в порядке 80 → 11080.</li> <li>plg-gh-vladikshkwok-lampa-dune-plugins.c090 · code · android; прошивка — · Сессия ожидания истекает через 180000 мс, любая сессия — через 12 часов; опрос идёт примерно раз в секунду, запрос status имеет timeout 2000 мс и watchdog 3000 мс.</li> <li>plg-gh-vladikshkwok-lampa-dune-plugins.c116 · code · android; прошивка — · dune-local-progress.js возобновляет опрос при возврате в приложение: wake() планирует poll через 50 мс, если сессия есть и нет текущего запроса; события focus, pageshow и visibilitychange вызывают wake(), а destroy() снимает эти обработчики.</li> </ul> <p><a class="footnote-backref" href="#fnref:559" title="Jump back to footnote 559 in the text">↩</a></p> </li> <li id="fn:560"> <ul> <li>plg-gh-vladikshkwok-lampa-dune-plugins.c122 · code · android; прошивка — · Перед любой командой, кроме cancel и standby, при power.isInteractive() = false dune-voice запускает WakeActivity с FLAG_ACTIVITY_NEW_TASK и ждёт до 5 с (50 × 100 мс) включения экрана; если экран не включился, бросает «Dune не проснулась».</li> <li>plg-gh-vladikshkwok-lampa-dune-plugins.c099 · code · android; прошивка — · dune-voice для home при необходимости будит устройство и после успешного status() вызывает IP Control cmd=main_screen, а для standby при включённом устройстве после успешного status() — cmd=standby; если устройство уже в режиме ожидания, команда не отправляется.</li> </ul> <p><a class="footnote-backref" href="#fnref:560" title="Jump back to footnote 560 in the text">↩</a></p> </li> <li id="fn:561"> <ul> <li>plg-gh-vladikshkwok-lampa-dune-plugins.c099 · code · android; прошивка — · dune-voice для home при необходимости будит устройство и после успешного status() вызывает IP Control cmd=main_screen, а для standby при включённом устройстве после успешного status() — cmd=standby; если устройство уже в режиме ожидания, команда не отправляется.</li> <li>plg-gh-vladikshkwok-lampa-dune-plugins.c100 · code · android; прошивка — · Для pause/resume/stop при player_state, оканчивающемся на _playback, dune-voice шлёт IP Control playback_action&action=stop либо set_playback_state&speed=0/256.</li> <li>plg-gh-vladikshkwok-lampa-dune-plugins.c101 · code · android; прошивка — · Вне воспроизведения pause/resume/stop dune-voice отправляет медиа-клавиши KEYCODE_MEDIA_PAUSE, KEYCODE_MEDIA_PLAY и KEYCODE_MEDIA_STOP через AudioManager.</li> </ul> <p><a class="footnote-backref" href="#fnref:561" title="Jump back to footnote 561 in the text">↩</a></p> </li> <li id="fn:562"> <p>plg-hdtv-utility-family.c038 · code · unknown; прошивка — · Кнопка open_remtor LTU_install читает /tmp/run/installed_plugins.xml; если в нём есть «rem_tor», запускает plugin_launcher://rem_tor, иначе показывает диалог установки, который вызывает plugin_installer://http://vadimkell.dlinkddns.com/update.tgz:::name=rem_tor&space_needed=1009680&need_confirm_replace=0. <a class="footnote-backref" href="#fnref:562" title="Jump back to footnote 562 in the text">↩</a></p> </li> <li id="fn:563"> <p>plg-hdtv-smart-apps.c048 · code · unknown; прошивка — · Экран приложения Entware app_creen строится по app_scr; для transmission он показывает кнопку start/stop по pidof transmission-daemon, автозапуск через строку #transmission-start в bin/boot_end.sh, выбор каталога, адрес http://<ip>:9091 и кнопку rem_tor: при наличии rem_tor в /tmp/run/installed_plugins.xml — plugin_launcher://rem_tor, иначе plugin_installer://... <a class="footnote-backref" href="#fnref:563" title="Jump back to footnote 563 in the text">↩</a></p> </li> <li id="fn:564"> <p>plg-gh-valerievitch-dune-plugin-acestreamsearch.c061 · code · unknown; прошивка — · Кнопка go2app в AceSearchSetupScreen в ветке elseif action_type=apply (после ветки confirm) при control_id=go2app отправляет LAUNCH_MEDIA_URL_ACTION_ID с LaunchMediaUrlActionData::url = plugin_launcher://acestreamsearch. <a class="footnote-backref" href="#fnref:564" title="Jump back to footnote 564 in the text">↩</a></p> </li> <li id="fn:565"> <ul> <li>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').</li> <li>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 вместо запуска плагина.</li> <li>plg-hdtv-youtube.c093 · code · unknown; прошивка — · Экран настроек YouTube показывает папку загрузок (dload_path) только при наличии /codecpack/script/youtube_download.sh или /flashdata/plugins/ffmpeg_install/bin/wget; иначе показывает кнопку installPlug с именем плагина ffmpeg_install (Android) или Codec_install.</li> </ul> <p><a class="footnote-backref" href="#fnref:565" title="Jump back to footnote 565 in the text">↩</a></p> </li> <li id="fn:566"> <p>plg-hdtv-liteiptv.c051 · code · unknown; прошивка — · При входе (entry_enter/entry_play) плагин проверяет наличие /codecpack или DATA/codec_install: при отсутствии на не-Android предлагает установить Codec_install через plugin_installer://…Codec_install_v5.0.0.tar.gz, на Android сразу выполняет run; если /codecpack нет, но установлена папка Codec_install, предлагает запустить её через plugin_launcher://Codec_install. <a class="footnote-backref" href="#fnref:566" title="Jump back to footnote 566 in the text">↩</a></p> </li> <li id="fn:567"> <p>plg-dc-dune-backup.c122 · code · unknown; прошивка — · При первом срабатывании таймера плагин проверяет наличие ../test_php-cgi/www/cgi-bin/php-cgi; если файла нет, пишет файл install (путь tmp_dir_path с заменой подстроки tmp/plugins/ на tmp/www/plugins/) со строками version_index=1, space_needed=100000 и download_url=<plugin_www_url>dune_plugin_test_php-cgi.tar.gz и запускает plugin_installer://<plugin_www_url>install:::schema=1&name=test_php-cgi&need_confirm_replace=0. <a class="footnote-backref" href="#fnref:567" title="Jump back to footnote 567 in the text">↩</a></p> </li> <li id="fn:568"> <ul> <li>plg-dc-dune-backup.c118 · code · unknown; прошивка — · Коллекции «Коллекция плагинов для Dune HD», «Коллекция приложений Android» и «Коллекция файлов» сначала загружают список с dl.dropboxusercontent.com или dune-club.info через my_wget, затем устанавливают выбранное маркерами !install_plugin! или !install_apk! (или скачивают файл через curl), а для плагинов и APK возвращают !return_start!.</li> <li>plg-dc-dune-backup.c119 · code · unknown; прошивка — · Пункт «Коллекция файлов для Dune HD» скачивает выбранный URL через $FS_PREFIX/firmware/bin/curl с прогрессом из tmp/log_curl (проценты из вывода curl) в выбранную папку накопителя.</li> </ul> <p><a class="footnote-backref" href="#fnref:568" title="Jump back to footnote 568 in the text">↩</a></p> </li> <li id="fn:569"> <ul> <li>plg-dc-globaltv.c029 · code · unknown; прошивка — · При установке в стране CN плагин, если установлен tv_app_supplier_globaltv, удаляет его (и сам globaltv) действиями launch_media_url с URL plugin_uninstaller://<имя>.</li> <li>plg-dc-globaltv.c030 · code · unknown; прошивка — · Список установленных плагинов плагин читает из XML-файла /tmp/run/installed_plugins.xml (элементы name дочерних узлов).</li> </ul> <p><a class="footnote-backref" href="#fnref:569" title="Jump back to footnote 569 in the text">↩</a></p> </li> <li id="fn:570"> <ul> <li>plg-hdtv-remtor.c083 · code · unknown; прошивка — · Внешний интерфейс remtor_Ext использует файлы /tmp/run/remtor.in, /tmp/run/remtor.tmp.torrent и /tmp/run/remtor.out.</li> <li>plg-hdtv-remtor.c084 · code · unknown; прошивка — · remtor_Ext::run_remtor записывает в remtor.in JSON с полями url и plugin (имя текущего плагина) и при успешной записи запускает plugin_launcher://{name=rem_tor}.</li> <li>plg-hdtv-remtor.c085 · code · unknown; прошивка — · remtor_Ext::get_result_remtor читает remtor.out, принимает результат только при совпадении поля plugin с именем текущего плагина и удаляет файл.</li> <li>plg-hdtv-remtor.c086 · code · unknown; прошивка — · Если /tmp/run/remtor.in существует, get_action_close_ext читает его, удаляет remtor.in и remtor.tmp.torrent (если есть), пишет в remtor.out result и message и при наличии plugin возвращает plugin_launcher://<plugin>.</li> <li>plg-hdtv-remtor.c087 · code · unknown; прошивка — · Обработчик entry_id = start экрана rt_torrents при наличии /tmp/run/remtor.in вызывает open_torrent, иначе открывает папку rt_torrents.</li> <li>plg-hdtv-remtor.c088 · code · unknown; прошивка — · open_torrent читает remtor.in, декодирует JSON и, если получился массив, передаёт поле url в get_add_torrent_dialog.</li> <li>plg-hdtv-remtor.c137 · forum · unknown; прошивка — · В changelog версии 0.0.19 (p221846) автор указал приём magnet-ссылок от сторонних плагинов и настройку DHT в параметрах Transmission.</li> </ul> <p><a class="footnote-backref" href="#fnref:570" title="Jump back to footnote 570 in the text">↩</a></p> </li> <li id="fn:571"> <ul> <li>plg-dc-dune-backup.c113 · code · unknown; прошивка — · Пользовательский пункт «Выбрать Jackett для ОФиС» формирует список зеркал Jackett в файле выбора, сохраняет выбранный адрес в config/online_movies_jacket.txt (или удаляет файл для default) и возвращает !reboot!.</li> <li>plg-dc-dune-backup.c114 · code · unknown; прошивка — · Пункт «Изменить пункты выбора в разделе Фильмы» удаляет установленное расширение dunemdb_supplier_online_movies маркером !uninstall_plugin!, устанавливает выбранный архив (mod_85.tar.gz или 86.tgz) маркером !install_plugin! и требует !OFF_ON!.</li> <li>plg-dc-dune-backup.c115 · code · unknown; прошивка — · Пункт Torrserver меняет в ext/TorrServer.php плагина dunemdb_supplier_online_movies значение torrServAction между 1 (Проиграть) и 0 (Добавить и проиграть) и возвращает !reboot!.</li> <li>plg-dc-dune-backup.c116 · code · unknown; прошивка — · Пункт Screenshoter меняет в bin/rec.sh разрешение записи между 1280x720 и 1920x1080 и возвращает !reboot!.</li> <li>plg-dc-dune-backup.c117 · code · unknown; прошивка — · Пункт «Изменить расположение иконок в теме» при выборе «внизу» (content_box_y = 400) ставит content_box_y = 630 и обнуляет cycle_mode_gap_width и cycle_mode_gap_icon_path, а при выборе «в середине» (content_box_y = 630) ставит content_box_y = 400; при изменении возвращает !reboot!.</li> </ul> <p><a class="footnote-backref" href="#fnref:571" title="Jump back to footnote 571 in the text">↩</a></p> </li> <li id="fn:572"> <ul> <li>plg-gh-vladikshkwok-lampa-dune-plugins.c047 · code · android; прошивка — · www/launch.m3u — плейлист EXTM3U из одного элемента с URL plugin_launcher://{name=lampa_dune_bridge}{action_id=play}.</li> <li>plg-gh-vladikshkwok-lampa-dune-plugins.c042 · code · android; прошивка — · Успешный POST api.php сохраняет плейлист через LampaDuneBridge::save() и отвечает launch_url plugin_launcher://{name=lampa_dune_bridge}{action_id=play}.</li> <li>plg-gh-vladikshkwok-lampa-dune-plugins.c064 · forum · android; прошивка — · При успешном ответе CGI request() заменяет /cgi-bin/plugins/ на /plugins/ и /api на /launch.m3u; комментарий объясняет это тем, что выбор плеера Android разрешает только обычные медиа-схемы, а Dune понимает одноэлементный M3U с plugin_launcher.</li> </ul> <p><a class="footnote-backref" href="#fnref:572" title="Jump back to footnote 572 in the text">↩</a></p> </li> <li id="fn:573"> <p>fw-tv188b-261021-0117-r25--media-player.c068 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 IP Control launch_media_url с одноэлементным M3U по HTTP (компьютер либо www плагина), содержащим plugin_launcher, вызывает действие b3 и передаёт from в user_input. <a class="footnote-backref" href="#fnref:573" title="Jump back to footnote 573 in the text">↩</a></p> </li> <li id="fn:574"> <p>plg-hdtv-surface-family.c087 · code · unknown; прошивка — · SurfaceDloadScreen пакета Radiorecord.ru открывает папку закачек через ActionFactory::launch_media_url() с URL embedded_app://{name=file_browser}{url=...}; путь переводится из /tmp/mnt/storage в storage_name://, из /tmp/mnt/smb — в smb://user:password@host при заданных user и password (иначе в smb://host/…), из /tmp/mnt/network — в nfs-tcp:// или nfs-udp:// при заданном nfs_protocol. <a class="footnote-backref" href="#fnref:574" title="Jump back to footnote 574 in the text">↩</a></p> </li> <li id="fn:575"> <p>plg-hdtv-youtube.c100 · code · unknown; прошивка — · Экраны YouTube (SmartFileSystemScreen и VOD-экраны при control_id=open_folder) открывают папку загрузок во встроенном файловом браузере launch_media_url('embedded_app://{name=file_browser}{url=<путь>}{caption=File Browser}'), переводя /tmp/mnt/storage/ в storage_name://, SMB в smb:// и NFS в nfs-tcp:// или nfs-udp://. <a class="footnote-backref" href="#fnref:575" title="Jump back to footnote 575 in the text">↩</a></p> </li> <li id="fn:576"> <ul> <li>fw-tv188b-260827-0003-r24--movie-suppliers.c046 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Успешный ответ start_playback_app: bin (команда запуска), package, wait_app_start_delay, title; приложение ищется по package, не найдено — ошибка; запуск через ActionFactory::launch_ext_app</li> <li>fw-tv188b-260827-0003-r24--movie-suppliers.c045 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Ответ start_playback_app с error.missing_app (title, package, непустой urls; необязательно indirect, intro_dialog_urls) и !$repeat превращается в действие «скачать и установить приложение»; иначе показывается error.message, а если его нет — errmsg_failed_to_start_playback</li> </ul> <p><a class="footnote-backref" href="#fnref:576" title="Jump back to footnote 576 in the text">↩</a></p> </li> <li id="fn:577"> <p>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. <a class="footnote-backref" href="#fnref:577" title="Jump back to footnote 577 in the text">↩</a></p> </li> <li id="fn:578"> <ul> <li>plg-ds-dunemdb-supplier-generic.c014 · code · unknown; прошивка — · run.php принимает ровно один аргумент команды; при другом числе аргументов печатает Usage и завершается с кодом 1.</li> <li>plg-ds-dunemdb-supplier-generic.c015 · code · unknown; прошивка — · run.php читает JSON из stdin; пустой или невалидный JSON даёт {error:{message:"Invalid data on standard input (<cmd>)"}}, команда start_playback_app обрабатывается, любая другая даёт {error:{message:"Internal error 02 (<cmd>)"}}.</li> </ul> <p><a class="footnote-backref" href="#fnref:578" title="Jump back to footnote 578 in the text">↩</a></p> </li> <li id="fn:579"> <p>plg-ds-dunemdb-supplier-megogo.c018 · code · android; прошивка — · run.php принимает ровно один аргумент, читает JSON из stdin (пустой или невалидный — error "Invalid data on standard input"), обрабатывает только start_playback_app, иная команда — error "Internal error 02 (<cmd>)". <a class="footnote-backref" href="#fnref:579" title="Jump back to footnote 579 in the text">↩</a></p> </li> <li id="fn:580"> <p>plg-ds-dunemdb-supplier-okko.c018 · code · android; прошивка — · run.php принимает ровно один аргумент, читает JSON из stdin (пустой или невалидный — error "Invalid data on standard input"), обрабатывает только start_playback_app, иная команда — error "Internal error 02 (<cmd>)". <a class="footnote-backref" href="#fnref:580" title="Jump back to footnote 580 in the text">↩</a></p> </li> <li id="fn:581"> <ul> <li>plg-ds-dunemdb-supplier-generic.c016 · code · unknown; прошивка — · start_playback_app берёт первую публикацию movieInfo.publications и вызывает do_start_playback_app(sup_id, deeplink); если публикаций нет — возвращает error "Internal error 01".</li> <li>plg-ds-dunemdb-supplier-generic.c023 · code · android; прошивка — · Успешный ответ start_playback_app — JSON с bin (команда am start), package, wait_app_start_delay = 10, title = sup_id, indirect = true и urls = [http://online.dune-hd.com/apk/generic/<sup_id>.txt].</li> </ul> <p><a class="footnote-backref" href="#fnref:581" title="Jump back to footnote 581 in the text">↩</a></p> </li> <li id="fn:582"> <p>plg-ds-dunemdb-supplier-megogo.c021 · code · android; прошивка — · При установленном пакете start_megogo возвращает команду am start -a android.intent.action.VIEW -f 0x10808000 -d megogo://video/<id> com.megogo.application и ответ с bin, package, wait_app_start_delay = 10, title = Megogo, indirect = true и urls = [http://online.dune-hd.com/apk/megogo_app.txt]. <a class="footnote-backref" href="#fnref:582" title="Jump back to footnote 582 in the text">↩</a></p> </li> <li id="fn:583"> <ul> <li>plg-ds-dunemdb-supplier-okko.c021 · code · android; прошивка — · При установленном пакете start_okko делит id публикации по ':' на тип и идентификатор (list($okko_type, $okko_id) = explode(':', $id)) и возвращает команду am start 'intent://movie?uid=<id>&type=<type>#Intent;scheme=yotaplay;package=<package>;end', а также bin, package, wait_app_start_delay = 10, title = Okko, indirect = true и urls = [http://online.dune-hd.com/apk/okko_more.txt].</li> <li>plg-ds-dunemdb-supplier-okko.c024 · code · android; прошивка — · run.py при найденном пакете делит id по ':' и формирует ту же intent-команду yotaplay, что run.php: am start 'intent://movie?uid=<id>&type=<type>#Intent;scheme=yotaplay;package=<package>;end'; успешный ответ содержит только bin, package и wait_app_start_delay = 10 (без title, indirect и urls, которые есть в ответе run.php).</li> </ul> <p><a class="footnote-backref" href="#fnref:583" title="Jump back to footnote 583 in the text">↩</a></p> </li> <li id="fn:584"> <p>plg-ds-dunemdb-supplier-generic.c022 · code · android; прошивка — · Если package непустой и не установлен, ответ — error.missing_app с title = sup_id, package, indirect = true, urls = [http://online.dune-hd.com/apk/generic/<sup_id>.txt] и message "<sup_id> not installed". <a class="footnote-backref" href="#fnref:584" title="Jump back to footnote 584 in the text">↩</a></p> </li> <li id="fn:585"> <ul> <li>plg-ds-dunemdb-supplier-megogo.c020 · code · android; прошивка — · start_megogo проверяет установку com.megogo.application по $FS_PREFIX/tmp/applications/app_data.json; если пакета нет, возвращает error.missing_app (title = Megogo, package = com.megogo.application, indirect = true, urls = [http://online.dune-hd.com/apk/megogo_app.txt]) и message "Megogo not installed".</li> <li>plg-ds-dunemdb-supplier-megogo.c023 · code · android; прошивка — · Если newgui2021 нет в /tmp/firmware_features.txt и ни один из трёх каталогов не найден, run.py читает пакет из /tmp/megogo_package.txt, при пустом значении берёт com.megogo.application и выбирает URL установки: megogo_app.txt для com.megogo.application, megogo.txt для net.megogo.box, megogo_atv.txt для net.megogo.tv; возвращает error.missing_app с title Megogo, package, indirect = true и этими urls, message "Megogo not installed".</li> </ul> <p><a class="footnote-backref" href="#fnref:585" title="Jump back to footnote 585 in the text">↩</a></p> </li> <li id="fn:586"> <ul> <li>plg-ds-dunemdb-supplier-okko.c020 · code · android; прошивка — · start_okko строит набор установленных пакетов из $FS_PREFIX/tmp/applications/app_data.json по package_name и выбирает ru.more.play, если он есть, иначе tv.okko.androidtv; если не найден ни один — error.missing_app (title = Okko, package = ru.more.play, indirect = true, urls = [http://online.dune-hd.com/apk/okko_more.txt]) и message "Okko not installed".</li> <li>plg-ds-dunemdb-supplier-okko.c023 · code · android; прошивка — · run.py выбирает пакет по каталогам: ru.more.play, если есть /data/data/ru.more.play, иначе tv.okko.androidtv при /data/data/tv.okko.androidtv; при отсутствии обоих возвращает error.missing_app с title Okko, package ru.more.play, indirect = true, urls = [http://online.dune-hd.com/apk/okko_more.txt] и message "Okko not installed".</li> </ul> <p><a class="footnote-backref" href="#fnref:586" title="Jump back to footnote 586 in the text">↩</a></p> </li> <li id="fn:587"> <ul> <li>plg-ds-dunemdb-supplier-generic.c017 · code · android; прошивка — · do_start_playback_app извлекает package из deeplink регуляркой package=([^;]<em>) и component из component=([^;]</em>); если package пуст, component задан, в нём есть '/' и strpos('/') не равен 0, package становится частью component до первого '/'.</li> <li>plg-ds-dunemdb-supplier-generic.c018 · code · android; прошивка — · Если package не извлечён, do_start_playback_app выбирает его в порядке else if: Amazon — только по домену deeplink (app.primevideo.com, watch.amazon) → com.amazon.amazonvideo.livingroom; далее по sup_id или домену: Ivi/www.ivi.ru → ru.ivi.client; Kinopoisk/hd.kinopoisk.ru → ru.kinopoisk.tv; Premier/premier.one → gpm.tnt_premier; AppleTV/tv.apple.com → com.apple.atve.androidtv.appletv; FlixFling/www.flixfling.com → com.flixfling; HBOMax/play.hbomax.com → com.hbo.hbonow; Max/play.max.com → com.wbd.stream; Joyn/JoynPlus/www.joyn.de → de.prosiebensat1digital.seventv; My5/www.my5.tv → com.channel5.my5.</li> <li>plg-ds-dunemdb-supplier-generic.c019 · code · android; прошивка — · После выбора package run.php читает HD_APK и HD_FW_APK, проверяет установку и при package == com.netflix.ninja и (HD_FW_APK непустой или HD_APK пустой) заменяет package на com.netflix.mediaclient, повторно проверяет установку и делает str_replace в deeplink.</li> </ul> <p><a class="footnote-backref" href="#fnref:587" title="Jump back to footnote 587 in the text">↩</a></p> </li> <li id="fn:588"> <p>plg-ds-dunemdb-supplier-generic.c020 · code · android; прошивка — · Команда запуска строится так: по умолчанию am start '<deeplink>'; если deeplink не соответствует /intent:(.*)#Intent/, то при пустом FS_PREFIX и deeplink, начинающемся с http, команда заменяется на am start -d '<deeplink>', а при непустом package в конец дописывается -p '<package>'. <a class="footnote-backref" href="#fnref:588" title="Jump back to footnote 588 in the text">↩</a></p> </li> <li id="fn:589"> <ul> <li>plg-ds-dunemdb-supplier-megogo.c021 · code · android; прошивка — · При установленном пакете start_megogo возвращает команду am start -a android.intent.action.VIEW -f 0x10808000 -d megogo://video/<id> com.megogo.application и ответ с bin, package, wait_app_start_delay = 10, title = Megogo, indirect = true и urls = [http://online.dune-hd.com/apk/megogo_app.txt].</li> <li>plg-ds-dunemdb-supplier-megogo.c022 · code · android; прошивка — · run.py выбирает пакет так: при наличии newgui2021 в /tmp/firmware_features.txt или каталога /data/data/com.megogo.application — am start -W с megogo://video/<id> для com.megogo.application; иначе при каталоге /data/data/net.megogo.box — am start -W -a GLOBALSEARCH на net.megogo.box/net.megogo.tv.activities.VideoDetailsActivity; иначе при каталоге /data/data/net.megogo.tv — am start -W -a android.intent.action.VIEW -d megogo://video/<id> для net.megogo.tv.</li> </ul> <p><a class="footnote-backref" href="#fnref:589" title="Jump back to footnote 589 in the text">↩</a></p> </li> <li id="fn:590"> <ul> <li>plg-ds-dunemdb-supplier-okko.c021 · code · android; прошивка — · При установленном пакете start_okko делит id публикации по ':' на тип и идентификатор (list($okko_type, $okko_id) = explode(':', $id)) и возвращает команду am start 'intent://movie?uid=<id>&type=<type>#Intent;scheme=yotaplay;package=<package>;end', а также bin, package, wait_app_start_delay = 10, title = Okko, indirect = true и urls = [http://online.dune-hd.com/apk/okko_more.txt].</li> <li>plg-ds-dunemdb-supplier-okko.c022 · code · android; прошивка — · В run.php закомментирована альтернативная команда запуска # $cmd = "am start -d 'yotaplay://movie?uid=$okko_id&type=$okko_type'"; рабочей остаётся intent-форма yotaplay из c021.</li> </ul> <p><a class="footnote-backref" href="#fnref:590" title="Jump back to footnote 590 in the text">↩</a></p> </li> <li id="fn:591"> <ul> <li>plg-hdtv-megatorrents.c056 · code · android; прошивка — · При start/restart, check_local_torrserve(1) == true и platform_kind android server_action_torrserve при dune_torrserve_ip == 2 читает собственный CGI http://127.0.0.1/cgi-bin/plugins/<plugin_name>/torrserve, иначе ищет в /tmp/applications/app_data.json пакет с подстрокой torrserve и выполняет am start <package>/<activity>.</li> <li>plg-hdtv-megatorrents.c081 · code · android; прошивка — · start_transmission при transmission_ip 127.0.0.1 или IP плеера (порт отрезается по «:»), platform_kind android и dune_transmission_ip == 2 ищет com.ap.transmission.btc в app_data.json, выполняет am start <package>/<activity>, ждёт 15 с и возвращает доступность /transmission/rpc; без пакета — false.</li> <li>plg-hdtv-megatorrents.c090 · code · android; прошивка — · При отсутствии ответа, platform_kind android и acestream_ip 127.0.0.1 или IP плеера check_local_acestream ищет в app_data.json пакет с подстрокой acestream, выполняет am start <package>/<activity>, ждёт 15 с и повторяет опрос.</li> </ul> <p><a class="footnote-backref" href="#fnref:591" title="Jump back to footnote 591 in the text">↩</a></p> </li> <li id="fn:592"> <p>plg-dc-torrent-center.c159 · code · unknown; прошивка — · TransmissionUPnP::startTransmissionUPnP запускает MainActivity приложения com.ap.transmission.btc командой am start. <a class="footnote-backref" href="#fnref:592" title="Jump back to footnote 592 in the text">↩</a></p> </li> <li id="fn:593"> <p>plg-hdtv-megaanime.c056 · code · android; прошивка — · get_android_action запускает внешний просмотрщик через am start с MIME video/* (video), audio/x-mpegurl (m3u), application/x-bittorrent (torrent) и image/* (image). <a class="footnote-backref" href="#fnref:593" title="Jump back to footnote 593 in the text">↩</a></p> </li> <li id="fn:594"> <p>plg-dc-torrent-center.c130 · code · unknown; прошивка — · HD::get_android_action для action=video запускает am start с MIME video/* и android.intent.action.VIEW. <a class="footnote-backref" href="#fnref:594" title="Jump back to footnote 594 in the text">↩</a></p> </li> <li id="fn:595"> <p>plg-dc-torrent-center.c129 · code · unknown; прошивка — · SmartSetupScreen включает обработку .torrent Android-приложением, дописывая объект TORRENT из базового app_by_file_ext.json в /config/app_by_file_ext.json. <a class="footnote-backref" href="#fnref:595" title="Jump back to footnote 595 in the text">↩</a></p> </li> <li id="fn:596"> <ul> <li>plg-hdtv-youtube.c096 · code · unknown; прошивка — · При голосовом поиске экран поиска YouTube через /system/dunehd/dunehd_service do удаляет /data/data/com.example.dunevoice/files/our_file.txt (если он есть), запускает shell_exec('am start com.example.dunevoice -a android.intent.category.DEFAULT') и переходит к control_id dunevoice_search.</li> <li>plg-hdtv-youtube.c129 · forum · android; прошивка — · По первому посту темы 15724, голосовой поиск на Android требует установки приложения DuneVoice.apk (http://dune-club.info/plugins/update/_other/DuneVoice.apk).</li> </ul> <p><a class="footnote-backref" href="#fnref:596" title="Jump back to footnote 596 in the text">↩</a></p> </li> <li id="fn:597"> <ul> <li>plg-dc-bazinga3.c080 · code · unknown; прошивка — · ActionFactory::download_and_install_apk возвращает DOWNLOAD_AND_INSTALL_APK_ACTION_ID с caption, package, urls, indirect и post_action, если константа определена, иначе null.</li> <li>plg-dc-bazinga3.c081 · code · unknown; прошивка — · SmartSearchScreen::meinMenuOpenFolderDialog при HD::is_android() и отсутствии /data/data/com.example.dunevoice, если не сработал ранний возврат диалога о доступе к Кинопоиску (Kinopoisk_Class::checkKpAccess() == 'false' при !isset($user_input->closed_dialog) и alertOff == false), plugin_cookies->duneVoiceAsk === 0 и не задан $user_input->install, показывает диалог установки APK DuneVoice с http://dune-club.info/plugins/update/_other/DuneVoice.apk; при dontAsk в plugin_cookies->duneVoiceAsk записывается 1.</li> </ul> <p><a class="footnote-backref" href="#fnref:597" title="Jump back to footnote 597 in the text">↩</a></p> </li> <li id="fn:598"> <ul> <li>plg-dc-dune-backup.c076 · code · unknown; прошивка — · Пункт «Создать файлы apk» читает tmp/applications/app_data.json, берёт caption, package_name, version и source_dir, копирует найденные в /data/app/ файлы в dune_bcp/dune_apk_(<ID>)/<caption><version>.apk и не сохраняет данные приложений.</li> <li>plg-dc-dune-backup.c077 · code · unknown; прошивка — · Пункт сохранения настроек Android-приложений копирует на накопитель каталоги NUM (/storage/emulated/0/NUM или Documents/NUM), SmartTube (Android/media/org.smarttube.stable) и ButtonRemapper (Android/data/com.irishin.buttonsremapper) в dune_bcp/abcp_ГГГГ_ММ_ДД.</li> <li>plg-dc-dune-backup.c078 · code · unknown; прошивка — · Пункт восстановления настроек Android-приложений копирует NUM, SmartTube и ButtonRemapper из выбранной папки обратно в их каталоги во внутренней памяти, удаляя прежний NUM.</li> </ul> <p><a class="footnote-backref" href="#fnref:598" title="Jump back to footnote 598 in the text">↩</a></p> </li> <li id="fn:599"> <ul> <li>plg-gh-vladikshkwok-lampa-dune-plugins.c093 · code · android; прошивка — · Android-приложение dune-voice объявляет пакет org.duckdns.dunevoice.tv, minSdkVersion 26 и targetSdkVersion 30.</li> <li>plg-gh-vladikshkwok-lampa-dune-plugins.c094 · code · android; прошивка — · Манифест dune-voice объявляет в queries пакеты com.dunehd.app и top.rootu.lampa.</li> </ul> <p><a class="footnote-backref" href="#fnref:599" title="Jump back to footnote 599 in the text">↩</a></p> </li> <li id="fn:600"> <ul> <li>plg-gh-vladikshkwok-lampa-dune-plugins.c095 · code · android; прошивка — · dune-voice регистрирует accessibility-сервис RemoteKeys с правом BIND_ACCESSIBILITY_SERVICE и описанием @xml/remote_keys.</li> <li>plg-gh-vladikshkwok-lampa-dune-plugins.c096 · code · android; прошивка — · RemoteKeys перехватывает KEYCODE_SEARCH, KEYCODE_ASSIST и KEYCODE_VOICE_ASSIST и по первому нажатию открывает VoiceActivity.</li> <li>plg-gh-vladikshkwok-lampa-dune-plugins.c097 · code · android; прошивка — · remote_keys.xml настраивает accessibility-сервис на typeWindowStateChanged, flagRequestFilterKeyEvents и canRequestFilterKeyEvents=true при canRetrieveWindowContent=false.</li> <li>plg-gh-vladikshkwok-lampa-dune-plugins.c119 · code · android; прошивка — · Команда back dune-voice вызывает AccessibilityService.performGlobalAction(GLOBAL_ACTION_BACK) у текущего сервиса RemoteKeys; если сервис не включён (RemoteKeys.current не установлен) или performGlobalAction вернул false, возвращается ошибка «Включите службу кнопки микрофона».</li> </ul> <p><a class="footnote-backref" href="#fnref:600" title="Jump back to footnote 600 in the text">↩</a></p> </li> <li id="fn:601"> <ul> <li>plg-gh-vladikshkwok-lampa-dune-plugins.c102 · code · android; прошивка — · Поиск в Lampa dune-voice открывает компонент top.rootu.lampa/top.rootu.lampa.MainActivity действием ACTION_SEARCH и кладёт запрос в extra query.</li> <li>plg-gh-vladikshkwok-lampa-dune-plugins.c117 · code · android; прошивка — · Для команды youtube dune-voice перебирает пакеты SmartTube (org.smarttube.stable, org.smarttube.beta, com.liskovsoft.smarttubetv.beta), com.teamsmart.videomanager.tv и com.google.android.youtube.tv; при непустом запросе открывает ACTION_VIEW на https://www.youtube.com/results?search_query=<encode(query)> с setPackage, потому что SmartTube игнорирует ACTION_SEARCH.</li> </ul> <p><a class="footnote-backref" href="#fnref:601" title="Jump back to footnote 601 in the text">↩</a></p> </li> <li id="fn:602"> <p>plg-gh-vladikshkwok-lampa-dune-plugins.c118 · code · android; прошивка — · Команды louder/quieter/mute/unmute dune-voice выполняют AudioManager.adjustStreamVolume(STREAM_MUSIC, ADJUST_RAISE/ADJUST_LOWER/ ADJUST_MUTE/ADJUST_UNMUTE, FLAG_SHOW_UI) в главном потоке. <a class="footnote-backref" href="#fnref:602" title="Jump back to footnote 602 in the text">↩</a></p> </li> <li id="fn:603"> <p>plg-gh-vladikshkwok-lampa-dune-plugins.c120 · code · android; прошивка — · Actions.mainThread выполняет Runnable сразу, если уже в главном Looper, иначе постит FutureTask в Handler главного потока и ждёт его до 5 с, пробрасывая исходное исключение. <a class="footnote-backref" href="#fnref:603" title="Jump back to footnote 603 in the text">↩</a></p> </li> <li id="fn:604"> <p>plg-gh-infinitygp-dune-jellyfin-bridge.c013 · code · android; прошивка — · resolveMediaAndLaunchPlayer в рабочем потоке вызывает NfsMediaResolver.resolve(mediaUrl, filename); RuntimeException логирует как «NFS media resolution failed; using Jellyfin stream», после чего на главном потоке запускает плеер с NFS-URL или с исходным URL, только если activity не isFinishing() и не isDestroyed(). <a class="footnote-backref" href="#fnref:604" title="Jump back to footnote 604 in the text">↩</a></p> </li> <li id="fn:605"> <p>plg-gh-infinitygp-dune-jellyfin-bridge.c018 · code · android-dune-fw; прошивка — · Если tracker == null, pollStatus выходит сразу после fetch(); иначе опрашивает DuneStatusClient.fetch(), передаёт статус в PlaybackProgressTracker.onStatus(status, SystemClock.elapsedRealtime()) и обрабатывает результат; любое исключение логирует как «Dune status poll failed»; следующий опрос планируется, только если worker не остановлен, — через 250 мс, пока начальная перемотка не подтверждена и с запуска прошло меньше 30 с, иначе через 1000 мс. <a class="footnote-backref" href="#fnref:605" title="Jump back to footnote 605 in the text">↩</a></p> </li> <li id="fn:606"> <ul> <li>plg-gh-vladikshkwok-lampa-dune-plugins.c050 · code · android; прошивка — · dune-native-player.js не устанавливается повторно, если window.DuneNativePlayer уже существует или глобальная AndroidJS не определена.</li> <li>plg-gh-vladikshkwok-lampa-dune-plugins.c051 · code · android; прошивка — · После appready и появления Lampa.Android.httpReq скрипт заменяет Lampa.Android.openPlayer обёрткой; destroy() возвращает исходный метод, только если openPlayer всё ещё обёртка, и удаляет window.DuneNativePlayer.</li> <li>plg-gh-vladikshkwok-lampa-dune-plugins.c071 · code · android; прошивка — · dune-local-progress.js не устанавливается повторно при наличии window.DuneLocalProgress или отсутствии AndroidJS.</li> <li>plg-gh-vladikshkwok-lampa-dune-plugins.c091 · code · android; прошивка — · init() при наличии Lampa.Android.openPlayer, Lampa.Android.httpReq и Lampa.Timeline.update заменяет Lampa.Android.openPlayer обёрткой, которая сначала начинает сессию прогресса и сразу вызывает исходный метод, не ожидая сети; при наличии функции Lampa.Torserver.parse и Lampa.Utils.hash подменяет и его; destroy() возвращает подменённые методы, только если они всё ещё обёртки, снимает обработчики и таймеры и удаляет window.DuneLocalProgress.</li> </ul> <p><a class="footnote-backref" href="#fnref:606" title="Jump back to footnote 606 in the text">↩</a></p> </li> <li id="fn:607"> <p>plg-gh-vladikshkwok-lampa-dune-plugins.c114 · code · android; прошивка — · Обёртка dune-native-player.js хранит sequence и dead: каждый вызов openPlayer получает id = ++sequence, а асинхронные продолжения после prepare и request выходят, если dead или id не равен текущему sequence, поэтому поздний ответ не запускает плеер после destroy или нового вызова. <a class="footnote-backref" href="#fnref:607" title="Jump back to footnote 607 in the text">↩</a></p> </li> <li id="fn:608"> <ul> <li>plg-gh-vladikshkwok-lampa-dune-plugins.c115 · code · android; прошивка — · card() берёт карточку из data.card, затем data.movie, затем из активного экрана Lampa (Lampa.Activity.active().card или .movie), иначе возвращает пустой объект.</li> <li>plg-gh-vladikshkwok-lampa-dune-plugins.c055 · code · android; прошивка — · payload() берёт название из movie.title, movie.name или data.title (иначе 'Lampa'), а описание — из movie.overview или data.description; оба текста очищаются от HTML-тегов и обрезаются (название до 512, описание до 15000 символов).</li> <li>plg-gh-vladikshkwok-lampa-dune-plugins.c057 · code · android; прошивка — · Обложка берётся из data.poster или movie.poster, а если она пуста, есть movie.poster_path и доступны Lampa.TMDB.image — из Lampa.TMDB.image('t/p/w500' + movie.poster_path); результат проверяется url() как http/https URL.</li> <li>plg-gh-vladikshkwok-lampa-dune-plugins.c058 · code · android; прошивка — · Позиция для моста берётся из data.timeline или timeline выбранного элемента, при наличии Lampa.Timeline — через Lampa.Timeline.view(hash).time; значение ограничивается диапазоном 0…604800 секунд.</li> <li>plg-gh-vladikshkwok-lampa-dune-plugins.c111 · code · android; прошивка — · payload() возвращает только title, description, poster, items, index и position; полей субтитров в нём нет.</li> </ul> <p><a class="footnote-backref" href="#fnref:608" title="Jump back to footnote 608 in the text">↩</a></p> </li> <li id="fn:609"> <ul> <li>plg-gh-vladikshkwok-lampa-dune-plugins.c053 · code · android; прошивка — · payload() отказывается от нативного пути и возвращает null, если выбранный URL не http/https, элементов плейлиста больше 250 или у data либо любого элемента есть непустые headers.</li> <li>plg-gh-vladikshkwok-lampa-dune-plugins.c054 · code · android; прошивка — · payload() сохраняет плейлист Lampa целиком: если хоть один элемент не прошёл проверку или выбранный URL не найден, возвращается null и используется обычный путь запуска.</li> <li>plg-gh-vladikshkwok-lampa-dune-plugins.c067 · code · android; прошивка — · Если мост не ответил или плагин выключен настройкой dune_native_player_enabled, обёртка вызывает исходный Lampa.Android.openPlayer с исходными link и data.</li> </ul> <p><a class="footnote-backref" href="#fnref:609" title="Jump back to footnote 609 in the text">↩</a></p> </li> <li id="fn:610"> <ul> <li>plg-gh-vladikshkwok-lampa-dune-plugins.c063 · code · android; прошивка — · request() перебирает локальные адреса по порядку, ставит watchdog 2000 мс и timeout проверки на устройстве мс и принимает ответ только с plugin=lampa_dune_bridge и точным launch_url plugin_launcher://{name=lampa_dune_bridge}{action_id=play}.</li> <li>plg-gh-vladikshkwok-lampa-dune-plugins.c064 · forum · android; прошивка — · При успешном ответе CGI request() заменяет /cgi-bin/plugins/ на /plugins/ и /api на /launch.m3u; комментарий объясняет это тем, что выбор плеера Android разрешает только обычные медиа-схемы, а Dune понимает одноэлементный M3U с plugin_launcher.</li> <li>plg-gh-vladikshkwok-lampa-dune-plugins.c065 · code · android; прошивка — · При успехе обёртка подменяет в копии data url на launch.m3u и удаляет playlist, затем вызывает исходный Lampa.Android.openPlayer; если window.DuneLocalProgress.track есть, передаёт ему исходные link и data.</li> <li>plg-gh-vladikshkwok-lampa-dune-plugins.c066 · code · android; прошивка — · Комментарий обёртки говорит, что timeline-колбэки Lampa уже зарегистрированы на исходный HTTP-плейлист, а сериями занимается нативный компаньон, поэтому второй плейлист в Android APK строить нельзя.</li> </ul> <p><a class="footnote-backref" href="#fnref:610" title="Jump back to footnote 610 in the text">↩</a></p> </li> <li id="fn:611"> <ul> <li>plg-gh-vladikshkwok-lampa-dune-plugins.c068 · code · android; прошивка — · При наличии Lampa.SettingsApi настройки плагина добавляют компонент «Dune HD», переключатель dune_native_player_enabled (по умолчанию true) и поле dune_native_torrserver_url с подсказкой http://SERVER:8095.</li> <li>plg-gh-vladikshkwok-lampa-dune-plugins.c069 · code · android; прошивка — · При изменении dune_native_torrserver_url плагин запоминает source — базовый URL выбранного в Lampa TorrServer (torrserver_url или torrserver_url_two по torrserver_use_link).</li> </ul> <p><a class="footnote-backref" href="#fnref:611" title="Jump back to footnote 611 in the text">↩</a></p> </li> <li id="fn:612"> <ul> <li>plg-gh-ytkachov-dune-hd-watch-sync.c049 · code · unknown; прошивка — · push_history отказывается писать историю, если в источнике нет *.json-файлов, кладёт шарды в /data/local/tmp/dunesync и заливает их туда через adb push.</li> <li>plg-gh-ytkachov-dune-hd-watch-sync.c050 · code · unknown; прошивка — · push_history удаляет на плеере лишние шарды, создаёт отсутствующие, копирует каждый файл через <code>cat</code> в целевой (редирект), при необходимости пишет timestamp в микросекундах, затем делает chown system:system, chmod 644, restorecon и sync.</li> <li>plg-gh-ytkachov-dune-hd-watch-sync.c034 · forum · Solo 8K, Pro 8K Plus, android-dune-fw; прошивка 250815_1012_r22 · Писать в каталог приложения через adb push нельзя — файл станет root; автор кладёт файл в /data/local/tmp и пишет <code>cat tmp > target</code>, что сохраняет inode, владельца, режим и SELinux-контекст (system:system, u:object_r:system_app_data_file:s0).</li> </ul> <p><a class="footnote-backref" href="#fnref:612" title="Jump back to footnote 612 in the text">↩</a></p> </li> <li id="fn:613"> <ul> <li>plg-gh-ytkachov-dune-hd-watch-sync.c051 · code · unknown; прошивка — · restart_navigator делает am force-stop com.dunehd.app, ждёт 2 с и запускает com.dunehd.shell.MainActivity через am start; am start не будит спящий плеер.</li> <li>plg-gh-ytkachov-dune-hd-watch-sync.c032 · forum · Solo 8K, Pro 8K Plus, android-dune-fw; прошивка 250815_1012_r22 · Запись в watch_history вступает в силу только после am force-stop com.dunehd.app; без перезапуска навигатор файл не перечитывает. Побочный эффект — браузер коллекции возвращается на верхний экран.</li> <li>plg-gh-ytkachov-dune-hd-watch-sync.c037 · forum · Solo 8K, Pro 8K Plus, android-dune-fw; прошивка 250815_1012_r22 · После force-stop нужен явный am start .../MainActivity: без него приложение поднимается полуинициализированным и передняя панель показывает прошедшее время вместо оставшегося; am start не будит спящий плеер.</li> </ul> <p><a class="footnote-backref" href="#fnref:613" title="Jump back to footnote 613 in the text">↩</a></p> </li> <li id="fn:614"> <ul> <li>plg-gh-ytkachov-dune-hd-watch-sync.c055 · code · unknown; прошивка — · dunesync пишет плееру, только если есть расхождения, dry_run выключен, плеер writable, его player_state ∈ {navigator, standby, loading} и его сессии сброшены на диск; иначе только логирует и откладывает до следующего цикла.</li> <li>plg-gh-ytkachov-dune-hd-watch-sync.c054 · code · unknown; прошивка — · PlayerWatch.poll запоминает mtime истории при переходе в file_playback и считает сеанс завершённым при выходе из file_playback; flushed() истинно, если сеанс не ожидает сброса (awaiting_flush ложно), а после завершения сеанса — когда mtime истории стал больше запомненного.</li> <li>plg-gh-ytkachov-dune-hd-watch-sync.c036 · forum · Solo 8K, Pro 8K Plus, android-dune-fw; прошивка 250815_1012_r22 · Каждая запись тянет за собой force-stop, который сбрасывает браузер коллекции и может потерять ещё не сброшенную на диск историю; поэтому автор пишет только когда состояние разошлось, плеер в navigator и его сеансы уже сброшены (mtime шарда сдвинулся после последнего file_playback).</li> </ul> <p><a class="footnote-backref" href="#fnref:614" title="Jump back to footnote 614 in the text">↩</a></p> </li> <li id="fn:615"> <ul> <li>plg-gh-ytkachov-dune-hd-watch-sync.c042 · code · unknown; прошивка — · dunesync.history.to_shards сортирует записи по start и режет на шарды по 40; последний шард содержит от 1 до 40 записей.</li> <li>plg-gh-ytkachov-dune-hd-watch-sync.c043 · code · unknown; прошивка — · dunesync пишет обычную запись JSON без пробелов, а запись, у которой deleted истинно и это единственное поле, — ровно <code>{"deleted": 1}</code> с пробелом после двоеточия.</li> <li>plg-gh-ytkachov-dune-hd-watch-sync.c044 · code · unknown; прошивка — · dunesync пишет шарды с именами %06d.json, по одной записи на строку, в виде <code>[\n<записи через ,\n>\n]\n</code> в UTF-8 без \u-экранирования.</li> <li>plg-gh-ytkachov-dune-hd-watch-sync.c050 · code · unknown; прошивка — · push_history удаляет на плеере лишние шарды, создаёт отсутствующие, копирует каждый файл через <code>cat</code> в целевой (редирект), при необходимости пишет timestamp в микросекундах, затем делает chown system:system, chmod 644, restorecon и sync.</li> </ul> <p><a class="footnote-backref" href="#fnref:615" title="Jump back to footnote 615 in the text">↩</a></p> </li> <li id="fn:616"> <ul> <li>plg-gh-ytkachov-dune-hd-watch-sync.c058 · code · unknown; прошивка — · По умолчанию dry_run=true, poll_seconds=25, flush_grace_seconds=20, keep_backups=30; --write и --dry-run перекрывают настройку в обе стороны; конфиг без players отклоняется.</li> <li>plg-gh-ytkachov-dune-hd-watch-sync.c071 · code · unknown; прошивка — · Запись можно отключить отдельному плееру полем write: false в его записи конфига: история такого плеера участвует в слиянии, но обратно на него ничего не пишется.</li> <li>plg-gh-ytkachov-dune-hd-watch-sync.c057 · code · unknown; прошивка — · Перед каждой записью сервис копирует свежеснятую историю в backup_dir с меткой времени и именем плеера и хранит последние keep_backups бэкапов на плеер (по умолчанию 30; 0 — без ограничения).</li> </ul> <p><a class="footnote-backref" href="#fnref:616" title="Jump back to footnote 616 in the text">↩</a></p> </li> <li id="fn:617"> <p>plg-gh-ytkachov-dune-hd-watch-sync.c066 · code · unknown; прошивка — · dunesync всегда передаёт adb stdin=/dev/null: <code>adb shell</code> читает stdin, и при запуске из пайпа молча съедает остаток скрипта. <a class="footnote-backref" href="#fnref:617" title="Jump back to footnote 617 in the text">↩</a></p> </li> <li id="fn:618"> <p>plg-gh-ytkachov-dune-hd-watch-sync.c059 · code · unknown; прошивка — · watch.sh идемпотентен: сканирует /proc и выходит, если уже запущен python3 -m dunesync; иначе exec python3 -u -m dunesync --config config.json --write с логом watch.log. <a class="footnote-backref" href="#fnref:618" title="Jump back to footnote 618 in the text">↩</a></p> </li> <li id="fn:619"> <p>plg-hdtv-surface-family.c052 · code · unknown; прошивка — · Класс smbtree продублирован в пакете Radiorecord.ru дважды — в www/cgi-bin/do_config.php и в surface_file_screen.php; копия в surface_file_screen.php считает проблемной только платформу 8672 (условие 8672 || 8672), а копия в do_config.php — 8672, 8673 и 8758. <a class="footnote-backref" href="#fnref:619" title="Jump back to footnote 619 in the text">↩</a></p> </li> <li id="fn:620"> <p>plg-dune-remote-control.c048 · code · unknown; прошивка — · Два модуля читают файл сетевых папок по разным путям: network_folder — /config/network_folders.properties, sources — /mnt/config/network_folders.properties; совпадение этих файлов на устройстве не проверено. <a class="footnote-backref" href="#fnref:620" title="Jump back to footnote 620 in the text">↩</a></p> </li> <li id="fn:621"> <p>plg-dc-widget-ext.c051 · code · android; прошивка — · На Android плагин ведёт crontab в файле $FS_PREFIX/tmp/cron/crontabs/root и перезапускает crond -b -c <каталог>; на APK (HD_APK=1) вместо crond запускается свой bin/crond.sh <a class="footnote-backref" href="#fnref:621" title="Jump back to footnote 621 in the text">↩</a></p> </li> <li id="fn:622"> <ul> <li>plg-gh-mdpuma-dune-plugin-altiptv.c084 · code · unknown; прошивка — · Sleep-таймер записывает cron-команду wget к локальному IP Control cmd=standby.</li> <li>plg-hdtv-liteiptv.c048 · code · unknown; прошивка — · Sleep-таймер пишется строкой cron с маркером #sleep <unix_time> и командой wget на http://127.0.0.1/cgi-bin/do?cmd=standby в /tmp/cron/crontabs/root; при timer-событии плагин сам удаляет просроченные записи и предупреждает, если до выключения меньше 120 секунд.</li> <li>plg-hdtv-smart-vod.c200 · code · unknown; прошивка — · При control_id=sleep_time эталон читает /config/settings.properties и /tmp/cron/crontabs/root, формирует запись wget к локальному cmd=standby, заменяя помеченный блок при наличии «Выключение» либо добавляя блок иначе, затем вызывает crontab -e.</li> </ul> <p><a class="footnote-backref" href="#fnref:622" title="Jump back to footnote 622 in the text">↩</a></p> </li> <li id="fn:623"> <ul> <li>plg-dc-torrent-center.c128 · code · unknown; прошивка — · Для ненулевого числового sleep_time Movie создаёт cron-строку выключения через echo A15EBF00 > /proc/ir/button с пометкой #sleep.</li> <li>plg-hdtv-altsource.c071 · code · unknown; прошивка — · Sleep-таймер в Movie записывает в cron-файл строку с echo A15EBF00 > /proc/ir/button и меткой #sleep <timestamp>; вариант «после текущей серии» при >98 % просмотра показывает уведомление, а плеер выключается в playback_stop, если таймер не отложен; остальные варианты — по времени.</li> </ul> <p><a class="footnote-backref" href="#fnref:623" title="Jump back to footnote 623 in the text">↩</a></p> </li> <li id="fn:624"> <ul> <li>plg-dc-screenshoter.c052 · code · unknown; прошивка — · Обёртка do выводит PLUGIN_NAME и PLUGIN_INSTALL_DIR_PATH из $PWD (имя плагина — третий с конца компонент пути)</li> <li>plg-dune-remote-control.c013 · code · unknown; прошивка — · CGI-обёртка www/cgi-bin/do вычисляет имя плагина как третий с конца компонент $PWD, а PLUGIN_INSTALL_DIR_PATH — как путь без двух последних компонентов (www/cgi-bin), то есть каталог плагина.</li> </ul> <p><a class="footnote-backref" href="#fnref:624" title="Jump back to footnote 624 in the text">↩</a></p> </li> <li id="fn:625"> <p>plg-gh-vladikshkwok-lampa-dune-plugins.c045 · code · android; прошивка — · CGI-обёртка api подставляет SCRIPT_FILENAME из PLUGIN_CGI_DIR (или каталога скрипта), ставит REDIRECT_STATUS=200 и запускает php-cgi с cgi.force_redirect=0. <a class="footnote-backref" href="#fnref:625" title="Jump back to footnote 625 in the text">↩</a></p> </li> <li id="fn:626"> <p>plg-ds-dunemdb-supplier-okko.c021 · code · android; прошивка — · При установленном пакете start_okko делит id публикации по ':' на тип и идентификатор (list($okko_type, $okko_id) = explode(':', $id)) и возвращает команду am start 'intent://movie?uid=<id>&type=<type>#Intent;scheme=yotaplay;package=<package>;end', а также bin, package, wait_app_start_delay = 10, title = Okko, indirect = true и urls = [http://online.dune-hd.com/apk/okko_more.txt]. <a class="footnote-backref" href="#fnref:626" title="Jump back to footnote 626 in the text">↩</a></p> </li> <li id="fn:627"> <p>plg-ds-dunemdb-supplier-okko.c024 · code · android; прошивка — · run.py при найденном пакете делит id по ':' и формирует ту же intent-команду yotaplay, что run.php: am start 'intent://movie?uid=<id>&type=<type>#Intent;scheme=yotaplay;package=<package>;end'; успешный ответ содержит только bin, package и wait_app_start_delay = 10 (без title, indirect и urls, которые есть в ответе run.php). <a class="footnote-backref" href="#fnref:627" title="Jump back to footnote 627 in the text">↩</a></p> </li> <li id="fn:628"> <p>plg-dc-widget-ext.c100 · inference · unknown; прошивка — · wget на устройствах, возможно, не умеет HTTPS — поэтому для https-сервиса Gismeteo автор взял отдельный curl <a class="footnote-backref" href="#fnref:628" title="Jump back to footnote 628 in the text">↩</a></p> </li> <li id="fn:629"> <p>plg-dc-widget-ext.c097 · code, disputed · android; прошивка 260724_0207_r24, 240619_0210_r22 · Init-скрипты прошивок tv175u (260724_0207_r24 и 240619_0210_r22) пишут /tmp/run/versions.txt строками key=value: product, firmware_version, platform_kind, android_platform; на Android platform_kind=android; такой файл можно подключить через source, как делает weather_gismeteo.sh <a class="footnote-backref" href="#fnref:629" title="Jump back to footnote 629 in the text">↩</a></p> </li> <li id="fn:630"> <p>plg-dc-widget-ext.c098 · inference · sigma-smp86xx, sigma-smp87xx; прошивка — · На Sigma-платформах platform_kind в versions.txt, вероятно, — 4-символьный код чипа вида 87xx/864x/867x/865x (так его проверяют weather_gismeteo.sh и ConfigUtils::platform_kind_to_group прошивки) <a class="footnote-backref" href="#fnref:630" title="Jump back to footnote 630 in the text">↩</a></p> </li> <li id="fn:631"> <p>plg-hdtv-zlostnyi-iptv.c070 · inference · unknown; прошивка — · Проверка ошибки медиатеки — is_null($doc), а HD::check_token при ошибке возвращает строку «nottoken», не null, поэтому сообщение «Неправильный логин или пароль» не показывается, а в /tmp/vod_playlist.m3u пишется «nottoken». <a class="footnote-backref" href="#fnref:631" title="Jump back to footnote 631 in the text">↩</a></p> </li> <li id="fn:632"> <p>plg-hdtv-remtor.c125 · inference · unknown; прошивка — · Если get_session_stats вернёт пустой массив без исключения, checkconnect не выйдет из while (True): успешный return требует count($res)>0, а return false стоит только в ветке catch. <a class="footnote-backref" href="#fnref:632" title="Jump back to footnote 632 in the text">↩</a></p> </li> <li id="fn:633"> <p>plg-gh-aspel-twitch-dune-plugin.c059 · inference · unknown; прошивка — · Если первая регулярка HLS не дала совпадений (if (!$match_video[0])) и сработала резервная BANDWIDTH=(\d+)(,)VIDEO="(\w+)", массив $match_video содержит группы захвата 1=BANDWIDTH, 2=запятая, 3=VIDEO и добавленный массив URL в индексе 4, а GameQuality читает $matches[2] как RESOLUTION (получает «,»), $matches[3] как VIDEO и $matches[4] как URL — в подписи на месте RESOLUTION оказывается запятая, а URL извлекается верно. <a class="footnote-backref" href="#fnref:633" title="Jump back to footnote 633 in the text">↩</a></p> </li> <li id="fn:634"> <p>plg-dc-dunemdb-supplier-movies-rus.c043 · inference · unknown; прошивка — · Если загружен упакованный link_api.php (custom-прошивка или dune-club.info недоступен и нет /tmp/plugins/link_api.php), вызов zonaMobi::getRCPC() — фатальная ошибка PHP: get_episodes при наличии публикаций и do_file_search для не series+video, когда do_get_publications идёт по не-tvseries URL, не вернут JSON; do_file_search в ветке series+video и для tvseries-публикаций getRCPC не вызывает. <a class="footnote-backref" href="#fnref:634" title="Jump back to footnote 634 in the text">↩</a></p> </li> <li id="fn:635"> <p>plg-gh-ytkachov-dune-hd-watch-sync.c062 · inference · Solo 8K, Pro 8K Plus, android-dune-fw; прошивка 250815_1012_r22 · Позицию во время воспроизведения можно получать только по HTTP: на диск она попадает лишь после остановки. <a class="footnote-backref" href="#fnref:635" title="Jump back to footnote 635 in the text">↩</a></p> </li> <li id="fn:636"> <p>plg-hdtv-megaradio.c150 · inference · unknown; прошивка — · В get_difm_categories массив $channels заполняется только внутри условия listenKey != '', поэтому при пустом LISTEN KEY категории DI.FM, RadioTunes, JazzRadio, ClassicalRadio и RockRadio не получают ни одной станции. <a class="footnote-backref" href="#fnref:636" title="Jump back to footnote 636 in the text">↩</a></p> </li> <li id="fn:637"> <p>plg-dc-widget-ext.c096 · inference, disputed · unknown; прошивка — · Виджет погоды оболочки, вероятно, показывает данные из $FS_PREFIX/tmp/weather.txt, поэтому Widget Ext подменяет источник данных встроенного виджета, а не рисует свой <a class="footnote-backref" href="#fnref:637" title="Jump back to footnote 637 in the text">↩</a></p> </li> <li id="fn:638"> <p>plg-gh-mikhail-ilin-dune-plugin-weburgtv.c075 · inference · unknown; прошивка — · Поскольку do_get_control_defs возвращает null (переменная $defs не инициализирована), на экране настроек нет полей buffer_time и epg_shift; ветки их сохранения в handle_user_input недостижимы через этот экран. <a class="footnote-backref" href="#fnref:638" title="Jump back to footnote 638 in the text">↩</a></p> </li> <li id="fn:639"> <p>plg-hdtv-folder-cache-vod.c088 · inference · unknown; прошивка — · Настройки data_type, data_dir и SMB-поля (data_ip_path/data_smb_user/data_smb_pass) не влияют на файлы избранного и поиска: lib/utils.php всегда использует DuneSystem::$properties['data_dir_path'], а get_data_path() есть только в www/cgi-bin/do_config.php, который main-файл не подключает. <a class="footnote-backref" href="#fnref:639" title="Jump back to footnote 639 in the text">↩</a></p> </li> <li id="fn:640"> <p>plg-hdtv-megaanime.c069 · inference · unknown; прошивка — · В пакете вызываются HD::pCopyFolders (выгрузка/загрузка DATA), SmartConfig::parse_zonamobi_stream_url, SmartConfig::get_search_myshows_episodes и SmartConfig::getSeasonId, но определений этих методов в PHP-файлах пакета нет; если link_api.php их не добавляет, соответствующие ветки завершатся fatal error. <a class="footnote-backref" href="#fnref:640" title="Jump back to footnote 640 in the text">↩</a></p> </li> <li id="fn:641"> <p>plg-hdtv-peerflixserver.c053 · inference · unknown; прошивка — · Пока config->tmp равен значению по умолчанию /D/torrent-stream, экран setup скрывает панель сервера и показывает кнопку выбора папки, а также общие элементы main_icon и whats_new; после установки нужно выбрать накопитель, иначе кнопок запуска нет. <a class="footnote-backref" href="#fnref:641" title="Jump back to footnote 641 in the text">↩</a></p> </li> <li id="fn:642"> <p>plg-hdtv-surface-family.c053 · inference · unknown; прошивка — · На платформах 8673 и 8758 файловый экран Radiorecord.ru не включает обход бага SMB, потому что его копия get_bug_platform_kind() проверяет только 8672. <a class="footnote-backref" href="#fnref:642" title="Jump back to footnote 642 in the text">↩</a></p> </li> <li id="fn:643"> <p>plg-dc-widget-ext.c053 · code, disputed · android; прошивка — · crond.sh для APK — не настоящий cron: читает интервал в минутах из $FS_PREFIX/tmp/cron/interval, находит скрипт update_weather в crontab и вызывает его в бесконечном цикле с sleep <a class="footnote-backref" href="#fnref:643" title="Jump back to footnote 643 in the text">↩</a></p> </li> <li id="fn:644"> <p>plg-dc-widget-ext.c054 · inference, disputed · android, android-dune-fw; прошивка 260827_0003_r24 · При HD_APK=1 crontask.sh не запускает системный crond, а заменяет его циклом crond.sh — вероятно, потому что crond там недоступен или его нельзя запустить без root-привилегий (priv пуст, нет dunehd_service do); HD_APK=1 выставляет и собственная Android-прошивка Dune (tv188b: HD_FW_APK=1), а не только сторонний APK <a class="footnote-backref" href="#fnref:644" title="Jump back to footnote 644 in the text">↩</a></p> </li> <li id="fn:645"> <p>plg-hdtv-utility-family.c093 · inference · unknown; прошивка — · Вывод: umount монтирует сетевую папку в /D при каждой загрузке через свой global action boot, переписанный в манифесте (а не через /config/boot); действие подхватывается только если оболочка перечитывает dune_plugin.xml после правки. <a class="footnote-backref" href="#fnref:645" title="Jump back to footnote 645 in the text">↩</a></p> </li> <li id="fn:646"> <p>plg-hdtv-peerflixserver.c054 · inference · unknown; прошивка — · Автостарт может не сработать на прошивках, где /bin/sh не поддерживает конструкцию ${ROOT_DIR::${#ROOT_DIR}-4}: bin/boot_end.sh объявлен как #!/bin/sh, но использует bash-синтаксис подстроки; на форуме описан отказ автостарта на Neo 4K. <a class="footnote-backref" href="#fnref:646" title="Jump back to footnote 646 in the text">↩</a></p> </li> <li id="fn:647"> <ul> <li>plg-hdtv-youtube.c038 · inference · unknown; прошивка — · Запись IR-кода A15EBF00 в /proc/ir/button выключает плеер (пункт меню подписан %tr%t3 «Выключить плеер»).</li> <li>plg-dc-screenshoter.c089 · inference · unknown; прошивка — · Запись IR-кода в /proc/ir/button, вероятно, эмулирует нажатие кнопки пульта (тот же файл использует команда ir_code HTTP-API прошивки)</li> <li>plg-dc-screenshoter.c090 · inference · unknown; прошивка — · A15EBF00, вероятно, — IR-код кнопки питания: его пишет пункт меню с подписью t77 «Выключить Dune»; таблицы кодов в репозитории нет</li> </ul> <p><a class="footnote-backref" href="#fnref:647" title="Jump back to footnote 647 in the text">↩</a></p> </li> <li id="fn:648"> <p>fw-tv188b-260827-0003-r24--plugin-loader--manifest.c062 · inference · tv188b, android-dune-fw; прошивка 260827_0003_r24 · В r24 на событие boot, вероятно, допустимо не только plugin_system: встроенный radiotime ставит туда run_builtin; по SDK для boot поддерживается только plugin_system <a class="footnote-backref" href="#fnref:648" title="Jump back to footnote 648 in the text">↩</a></p> </li> <li id="fn:649"> <p>plg-dc-screenshoter.c088 · inference · unknown; прошивка — · HTTP-сервер устройства, вероятно, отдаёт файлы и по симлинкам www/dss и www/sdss, которые плагин создаёт на каталоги снимков: на этом строится галерея <a class="footnote-backref" href="#fnref:649" title="Jump back to footnote 649 in the text">↩</a></p> </li> <li id="fn:650"> <p>plg-dc-bazinga3.c065 · inference · unknown; прошивка — · Предположительно hlsProxy и hlsProxyArgs использует внешний link_api.php, которого в пакете нет: в копии link_api ##673## (oth-hdtv-smart-link-api) запись hlsProxyArgs и URL hlsProxy?rp= есть, но закомментированы. <a class="footnote-backref" href="#fnref:650" title="Jump back to footnote 650 in the text">↩</a></p> </li> <li id="fn:651"> <p>plg-dune-remote-control.c070 · inference · unknown; прошивка — · Вероятно, через playlists можно прочитать файл за пределами каталога плейлистов: PATH_INFO подставляется в путь к cat без нормализации и проверки, поэтому .. в URL не отсекается. <a class="footnote-backref" href="#fnref:651" title="Jump back to footnote 651 in the text">↩</a></p> </li> <li id="fn:652"> <p>plg-hdtv-101-ru.c050 · inference · unknown; прошивка — · В www/cgi-bin/.htaccess лежит конфигурация с ErrorDocument /core/templates/403.php и RewriteRule на remote.php — пути, характерные для Nextcloud; в PHP-коде плагина файл не упоминается. <a class="footnote-backref" href="#fnref:652" title="Jump back to footnote 652 in the text">↩</a></p> </li> <li id="fn:653"> <p>plg-hdtv-peerflixserver.c049 · inference · unknown; прошивка — · Плагин не участвует в воспроизведении: в достижимом коде точек входа и setup нет вызовов vod_play, tv_play или launch_media_url, а единственный адрес, который он сообщает, — веб-интерфейс peerflix-server на :9000. Отсюда следует, что торрент добавляется и раздаётся через peerflix-server, а не силами PHP-плагина. <a class="footnote-backref" href="#fnref:653" title="Jump back to footnote 653 in the text">↩</a></p> </li> <li id="fn:654"> <p>plg-hdtv-youtube.c097 · inference · unknown; прошивка — · YouTube использует пакет com.example.dunevoice, а Android-приложение dune-voice из lampa-dune-plugins объявляет org.duckdns.dunevoice.tv: это разные сборки голосового ввода. <a class="footnote-backref" href="#fnref:654" title="Jump back to footnote 654 in the text">↩</a></p> </li> <li id="fn:655"> <p>plg-hdtv-youtube.c099 · inference · unknown; прошивка — · Ветка 'aplаy' SmartFileSystemScreen YouTube недостижима из кода пакета: action с таким control_id нигде не создаётся. <a class="footnote-backref" href="#fnref:655" title="Jump back to footnote 655 in the text">↩</a></p> </li> <li id="fn:656"> <p>plg-gh-ytkachov-dune-hd-watch-sync.c021 · inference · Solo 8K, Pro 8K Plus, android-dune-fw; прошивка 250815_1012_r22 · Автор предполагает (не подтверждено экспериментально), что отметка «просмотрено» в навигаторе выводится из самих записей истории, а не из watched_files.txt / watched_movies.txt. <a class="footnote-backref" href="#fnref:656" title="Jump back to footnote 656 in the text">↩</a></p> </li> </ol> </div> </article> </div> <script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script> </div> <button type="button" class="md-top md-icon" data-md-component="top" hidden> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8z"/></svg> К началу </button> </main> <footer class="md-footer"> <div class="md-footer-meta md-typeset"> <div class="md-footer-meta__inner md-grid"> <div class="md-copyright"> <div class="md-copyright__highlight"> Текст и данные — CC BY 4.0 (dunehd-plugin-notes, https://dunehd-plugin-notes.pages.dev/); примеры кода — MIT-0. Проект не связан с Dune HD. <a href="/license/">Лицензия</a> </div> Made with <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener"> Material for MkDocs </a> </div> </div> </div> </footer> </div> <div class="md-dialog" data-md-component="dialog"> <div class="md-dialog__inner md-typeset"></div> </div> <script id="__config" type="application/json">{"annotate": null, "base": "..", "features": ["navigation.sections", "navigation.top", "search.highlight", "content.code.copy"], "search": "../assets/javascripts/workers/search.a7633da7.min.js", "tags": null, "translations": {"clipboard.copied": "\u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u0432 \u0431\u0443\u0444\u0435\u0440", "clipboard.copy": "\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 \u0431\u0443\u0444\u0435\u0440", "search.result.more.one": "\u0415\u0449\u0451 1 \u043d\u0430 \u044d\u0442\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435", "search.result.more.other": "\u0415\u0449\u0451 # \u043d\u0430 \u044d\u0442\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435", "search.result.none": "\u0421\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0439 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e", "search.result.one": "\u041d\u0430\u0439\u0434\u0435\u043d\u043e 1 \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0435", "search.result.other": "\u041d\u0430\u0439\u0434\u0435\u043d\u043e \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0439: #", "search.result.placeholder": "\u041d\u0430\u0447\u043d\u0438\u0442\u0435 \u043f\u0435\u0447\u0430\u0442\u0430\u0442\u044c \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430", "search.result.term.missing": "\u041e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442", "select.version": "\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0432\u0435\u0440\u0441\u0438\u044e"}, "version": null}</script> <script src="../assets/javascripts/bundle.c21346df.min.js"></script> </body> </html>