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

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

Часть каталога об отладке: куда писать лог, как показывать ошибку и ход долгой операции, как проверить сервис и отлаживать без устройства, какие ошибки чаще всего копируют из чужого кода. Это раздел 17 общего каталога; его нумерация сохранена.

17. Отладка, ошибки и логи

Объект: логирование, обработка и показ ошибок, диагностика и типовые ошибки кода в плагинах ProIPTV, Widget Ext, Screenshoter, RemTor, remote-control, Twitch TV, Apple Trailers, Kohana-канал, altIPTV, GlobalTV, Юрта ТВ, поставщиках Online Movies и dunemdb, MegaTorrents, TorrServe, DunePlexServer, PeerflixServer, MPD и других; уровень code, часть фактов сторонних проектов — заявления README (forum). Платформа и прошивка исполнения, как правило, не установлены. Платформенные факты — по SDK (doc) и tv188b r22/r24/r25.

У плагина нет отладчика на устройстве: всё, что разработчик видит, — это лог плагина, диалог ошибки и ответ CGI. Поэтому плагины строят свою инфраструктуру: переключаемый уровень лога (§17.1), единый перехват исключений с показом ошибки (§17.2), лог фоновой операции с опросом из диалога (§17.3), проверку «жив ли сервис» (§17.4) и локальные стенды и тесты (§17.5). §17.6 — утечки и небезопасные приёмы, §17.7 — ошибки, которые повторяются в разобранных пакетах и которые стоит проверить при копировании чужого кода. Сводка платформенных граблей — guide/pitfalls.md; гипотезы — в §19.

17.1. Лог плагина: куда писать, как включать и ротировать

По SDK лог плагина — /tmp/run/<plugin_name>.log, его смотрят tail -F через telnet (на Android — busybox tail -F через telnet или ADB) (SDK)1. На tv188b r25 (device) php_server пишет его в /data/data/com.dunehd.app/tmp/run/<плагин>.log с пределом 3072000 байт (устройство r25)2. У внешних поставщиков VOD stderr дописывается в /tmp/run/<id>__supplier.log, а stdout — это ответ (код r24)3; подробно — guide/movie-suppliers.md.

Задача Приём Грабли и ограничения Плагины и claims
Писать в лог плагина hd_print() — Widget Ext (код)4; AceStreamSearch (код)5
Видеть место вызова обёртка hd_debug_print: префикс из строки, класса и функции вызывающего, массивы форматируются, вывод через hd_print — ProIPTV (код)6
Писать версии в лог link_api() печатает версию плагина, версию парсеров и содержимое /tmp/run/versions.txt — Bazinga3 (код)7
Включать отладку без пересборки cookie-флаг: ProIPTV — PARAM_COOKIE_ENABLE_DEBUG (переключатель в расширенных настройках; debug=true в манифесте принудительно включает); RemTor — cookie loglevel → is_debug ProIPTV вызывает set_debug_log на каждом вводе; у RemTor loglevel по умолчанию 0, а контрол уровня в настройках закомментирован ProIPTV (код)8; RemTor (код)9
Включать отладку файлом-флагом <data_dir>/debuglog.flag → --debugLog: логируется каждый urllib2.urlopen, лимит лога 20 480 → 204 800 байт — Online Movies (eng) (код)10
Отдельный лог CGI при debug_level != 0 — /tmp/run/<plugin_name>_cgi.log (FILE_APPEND \| LOCK_EX) и служебные пути плагина в самом ответе; Screenshoter — /tmp/plugins/Screenshoter/cgi.log у Screenshoter лог не пишется в режиме HD_APK без HD_FW_APK remote-control (код)11; Screenshoter (код)12
Ограничить размер своего лога переименование по размеру: Screenshoter — при ≥ 10000 байт, Widget Ext — weather при > 20000 байт, Online Movies (eng) — RotatingFileHandler 20 480 байт × 1 бэкап Cleanup пишет /tmp/run/cleanup.log без ротации; по сообщениям участника темы, её можно добавить по размеру 102400 Screenshoter (код)12; Widget Ext (код)13; Online Movies (eng) (код)14; Cleanup (код, форум)15
Не раздувать лог прогрессом у лога с #<LG%%> сверх 1000 строк (Android) или 100 (прочие) удаляются строки, оканчивающиеся на % — Dune BackUp (код)16
Лог shell-части отдельно при наличии /D/dune_plugin_logs notifier пишет туда отладочный лог пишет только bash-часть DunePlexCatalog (код)17
Логировать внешнего поставщика PHP: вывод hd_print перенаправлен в php://stderr (hd_redirect_output), в stdout — только JSON; Python: logging.basicConfig(level=DEBUG) своя ротация redirect_log_if_needed() на php://stderr не срабатывает (is_file ложно) Online Movies (rus) (код)18; Online services (код)19; Megogo (код)20; Okko (код)21
Не печатать в stdout PHP-плагина — Kohana-канал перед возвратом результата делает echo имени операции в stdout Kohana-канал (код)22

17.2. Ошибка: вернуть оболочке и показать пользователю

По SDK результат операции — PluginOutputData; при ошибке is_error = true и может быть задан error_action (SDK)23. Действие PluginShowErrorAction несёт fatal, title и необязательные msg_lines (SDK)24; в меню оно показывает диалог, при воспроизведении — одну строку в центре экрана (SDK)25, а fatal == true останавливает воспроизведение и выводит в верхнее меню (SDK)26. Плагины опираются на это одним и тем же каркасом.

Задача Приём Грабли и ограничения Плагины и claims
Перехватить все исключения в одном месте call_plugin_impl каркаса ловит DuneException (берёт его error_action) и прочие Exception, возвращает is_error = true и ActionFactory::show_error Apple Trailers отдельно обрабатывает исключение в create_plugin; Kohana ловит ещё ErrorException, тексты жёсткие («System error»/«Ошибка»); копия altSource без text_utils.php — с английскими строками Twitch TV (код)27; Apple Trailers (код)28; Kohana-канал (код)29; altIPTV (код)30; Widget Ext (код)31; altSource (код)32
Показать понятную ошибку вместо пустого экрана при исключении call_plugin возвращает is_error = true и error_action plugin_show_error с заголовком Lampa и текстом «Нет подготовленного видео. Запустите его из Lampa.» — Lampa bridge (код)33
Превратить сетевые сбои в понятный диалог Session: DuneException — как есть, DuneCurlException → show_error(msg_connect_failed), прочие — с текстом, зависящим от is_playback — GlobalTV (код)34
Разобрать коды ошибок API коды 1/2/103/401 → свои тексты, 2 ещё и logout; при коде 131 (превышен лимит запросов) запрос повторяется повтор при 131 бесконечный Юрта ТВ (код)35
Перевести системные ошибки на русский при показе .err заменяет сообщения tar и ФС: short write → «вероятно, нехватка места», write error → «ошибка записи», No space left on device → «нехватка места», can't create directory → «не удается создать каталог» замена выполняется при русском языке интерфейса Dune BackUp (код)36
Показать ошибку списка, не ломая экран папка из одного элемента ERROR: <last_error_msg>; при сбое подключения — диалог с последней ошибкой и кнопками запуска, подключения, настроек — RemTor (код)37
Вернуть ошибку из внешнего поставщика неизвестный метод и любое исключение → {"error":{"message":…}} в stdout, traceback — в лог ненулевой код выхода или не-JSON на stdout оболочка считает ошибкой с результатом null; у Online Movies (rus) warning/notice через set_error_handler только пишутся в лог Online Movies (eng) (код)38; Online Movies (rus) (код)39; платформа (код r24)40
Не глушить ошибку HTTP — HD::http_get_document altIPTV при ошибке curl или коде ≠ 200 пишет лог, но throw закомментирован и возвращается content; throw_m3u_error WeburgTV объявлен, но нигде не вызывается altIPTV (код)41; WeburgTV (код)42
Обозначить отсутствие потока встроенный link_api.php youtube r22 при неудаче возвращает заглушку http://mp4://dune-club.info/plugins/update/1.mp4, которую YoutubeStreamAPI считает ошибкой прошивка tv188b, r22 (код r22)43

17.3. Показать ход долгой операции: лог и опрос таймером

Установка демона или запуск сервера длится дольше одной операции плагина, поэтому плагины пишут ход в файл в фоне, а GUI перечитывает его по таймеру. Механика таймеров и диалогов — guide/input-dialogs.md.

Задача Приём Грабли и ограничения Плагины и claims
Показать лог установки install.sh в фоне пишет в /tmp/plugins/TorrServe/logs; экран раз в секунду показывает лог и по строке Welldone переходит дальше — TorrServe (код)44
Показать ход установки файлом по install_dialog плагин пишет Start! в tmp_dir_path/mpd_install и запускает bin/inst.sh в фоне; по install_dialog2 раз в 1000 мс читает файл в обратном порядке когда файл исчез (его удаляет inst.sh), показывается итоговый диалог; результат установки код не проверяет MPD (код)45
Опрашивать лог из диалога show_log: таймер 1000 мс + GUI_EVENT_TIMER → close_dialog_and_run, перечитать tmp_dir_path/logs, вычистить ANSI-коды, выйти по ключевым строкам — MegaTorrents (код)46
Сохранить лог установки inst.sh в конце удаляет временный лог, а при наличии /D копирует его в /D/plex_install.log без /D лог не сохраняется DunePlexServer (код)47
Мониторинг ресурсов окно вызывает bin/info.sh по таймеру каждые 3 с: CPU, температура thermal_zone0/1, память — Dune BackUp (код)48

17.4. Проверить, жив ли сервис

Задача Приём Грабли и ограничения Плагины и claims
Статус Node-сервера pidof node и существование .forever/pids/PeerflixServer.pid → status=true достаточно любого процесса node и наличия pid-файла PeerflixServer (код)49
Статус демона по pid-файлу bin/plex status с pid-файлом /tmp/Apps/plex/pid.txt; экран запрашивает статус только при выбранном конкретном пути библиотеки — DunePlexServer (код)50
Переключить сервис одной командой CGI mpd: pidof mpd нашёл процесс → mpd-stop, иначе mpd-start — MPD (код)51
Проверить сеть страницей ping.html подключает jQuery 1.4.1, jquery.tools и ping.js, показывает сообщение «Возникла ошибка. Проверьте подключение к интернету» и кнопку Ok; ping.js подключает внешний http://bonus-tv.ru/api/ping и через 4 с показывает окно ошибки — bonus-tv (web-launchers) (код)52

17.5. Отлаживать без устройства и снаружи

Задача Приём Грабли и ограничения Плагины и claims
Запускать PHP-код плагина на ПК plugin_test_env.php: include_path из ./php и ./dune_plugin, подключение bootstrap.php/dune_api.php; в репозитории — копии фреймворка php_r22/, php_r24/, побайтно совпадающие с файлами прошивок tv188b /php и /php_r25 исключены .gitignore; копии различаются возможностями (r24 обрабатывает PLUGIN_OP_GET_VOD_STREAM_INFO, r22 — нет) ProIPTV (код)53
Тестировать протокол поставщика test_run.py гоняет ./run.sh с JSON на stdin, test_searcher.py — поисковик — Online Movies (eng) (код)54
Отладочная площадка в пакете index.php в корне пакета подключает отсутствующие в пакете dune_core/dune_api.php и dune_core/bootstrap.php и содержит захардкоженные адреса <адрес в LAN>/<адрес в LAN> манифест его не использует; каталога dune_core/ в пакете нет DunePlexCatalog (код)55
Юнит-тесты Android-моста JVM-тесты разбора статуса Dune, сопоставления файлов NFS, трекера прогресса и логики Activity — Jellyfin Bridge (код)56
Смотреть состояние плеера снаружи по README — curl '.../cgi-bin/do?cmd=status&result_syntax=json' и adb logcat по тегу приложения заявление README Jellyfin Bridge (форум)57
Диагностика JS-плагина объекты диагностики с версией и счётчиками (state, launches; polls, samples, shared, last) — Lampa bridge (код)58
Разбирать данные оболочки, не трогая плеер read-only инструменты по снятой копии истории; свежесть — по максимуму stat -c %Y файлов *.json, а не по mtime каталога по замеру автора, запись истории появляется через секунды после остановки воспроизведения watch-sync (код, форум r22)59
Разбирать статистику просмотров из файла оболочки load_stat только при play_statistics_enabled.<service_id> = yes отправляет статистику и читает /tmp/run/playback_statistics.txt: первая строка num_items=<N>, далее тройки строк при неверном числе строк возвращается пустой список; записи других service_id и строки с неверным форматом пропускаются Polsky TV (код)60
Сохранять входные данные для разбора JSON фильма — в torlog/<id>.json, если каталог torlog существует — Online Movies (TV Series) (код)61
Получать логи от пользователей send_log_to_developer: zip временных логов, кэша плейлиста, shell.log, логов плагина и бэкапа настроек → upload с Content-Type: application/zip, затем удаление zip URL загрузки хранится строкой base64 ProIPTV (код)62

17.6. Утечки и небезопасные приёмы

Раздел — список того, что проверить в своём и в заимствованном коде, чтобы плагин не раскрывал данные пользователя и не исполнял чужие команды. Платформа — tv188b r24/r25, где не сказано иное.

Две платформенные причины, по которым это важно. Лог плагина — обычный файл /tmp/run/<plugin_name>.log, который по SDK читают через telnet или ADB (SDK)1; на tv188b r25 php_server пишет его в /data/data/com.dunehd.app/tmp/run/<плагин>.log (устройство r25)2. CGI плагина на tv188b r25 вызывается по HTTP-адресу плеера http://<IP>/cgi-bin/plugins/<p>/<файл> (устройство r25)63, получает строку запроса (устройство r25)64 и работает под uid 0 (root) (устройство r25)65, тогда как php_server того же плагина — под uid 1000 (устройство r25)66.

Что проверить Почему Как сделать
Секреты в логе лог — файл, доступный через telnet или ADB (SDK)1 не печатать user_input целиком и значения полей с логином, паролем, токеном или ключом доступа; не печатать полные URL потоков, если в них есть ключ; вместо значения — имя поля и маска
CGI плагина на r25 CGI вызывается по HTTP-адресу плеера (устройство r25)63 и работает от root (устройство r25)65 сверять параметры запроса со списком допустимых значений; не отдавать в ответе пароли, токены и служебные пути; не читать и не отдавать файл по пути из запроса без проверки, что путь остаётся в каталоге плагина
Строки в shell CGI работает от root (устройство r25)65, php_server — от uid 1000 (устройство r25)66 любую строку из ввода пользователя, плейлиста, URL или ответа сервера передавать в shell_exec/exec только через escapeshellarg; где можно — фиксированная команда без подстановок
Проверка TLS HD::http_get_document по умолчанию ставит CURLOPT_SSL_VERIFYPEER=false на r24 (код r24)67 и r25 (код r25)68; при CURLOPT_SSL_VERIFYPEER=true для https хелпер подставляет CURLOPT_CAINFO=/firmware/certs/ca-bundle.crt (код)69 для запросов с логином, паролем или токеном передавать CURLOPT_SSL_VERIFYPEER=true; в своей копии хелпера проверить CURLOPT_SSL_VERIFYPEER и CURLOPT_SSL_VERIFYHOST; подробно — guide/php-http.md и §9.1
Файлы настроек оболочки по сообщениям пользователей, config/network_folders.properties хранит логин и пароль NAS открытым текстом, а устаревшие записи истории встраивают их в поле url (форум r22)70 не публиковать дампы config/ и истории просмотра; в отправляемых логах и бэкапах — без этих файлов или с замаскированными паролями
Отправка данных наружу — в заимствованном коде найти все запросы на внешние серверы и проверить, что уходит: статистика просмотров, логи, идентификаторы устройства, данные учётной записи
Системные действия из меню — перезагрузку, выключение и другие команды, которые прерывают работу плеера, запускать только после диалога подтверждения

17.7. Типовые ошибки в чужом коде: что проверить при копировании

Разобранные пакеты часто собраны копированием каркасов, и вместе с каркасом копируются ошибки. Это не приёмы, а список того, что стоит проверить в заимствованном коде.

Класс ошибки Пример Плагины и claims
Необъявленные переменные и свойства $url/$season_title в get_next_fav, необъявленное m_items_count, неинициализированный $menu_items; $stream_name в конструкторах; $id вместо $channel_id в сообщении об ошибке Anidub.Com (код)71; Twitch TV (код)72; pirates_* (код)73
Логика условий $control_id === 'stream_server' \|\| 'http_caching' … всегда истинно; foreach без скобок охватывает только if; присваивание адреса в условии Moi-Dom.tv (код)74; MegaTorrents (код)75; Torrent Center (код)76
Кэш, обнуляемый при повторной загрузке ConfigHolder::cats_lcfg_reload и cats_lcfg_ensure_loaded обнуляют cats_lcfg_map, если карта уже isset влияние на производительность не проверялось
Флаг изменения на возврате к исходному changed отражает факт переключения, а не разницу наборов: do_apply при changed=false возвращает null после cleanup, иначе передаёт JSON текущего и исходного наборов в checked_idset/initial_checked_idset сохранённого apply_action и очищает состояние; apply_sections обновляет и записывает sections_on_off, а обновление CFG_TS/EPF и reread_all_epfs(true) продолжает только при результате записи 1 изменение содержимого отдельно проверяется при записи файла
Действие без обработчика клавиша B_GREEN создаёт do_search_menu, ветки в handle_user_input нет Anidub.Com (код)79
Вызов несуществующего SmartConfig::classAction; опечатка add_custom_close_dialog_and_apply_buffon; HD::get_versions и VodPeerflixScreen, которых нет в пакете; класс ExUa в PlaybackUrlCache altSource (код)80; Twitch TV (код)81; PeerflixServer (код)82; youtube_api/folder_cache (код)83; Anidub.Com (код)84
Пути без $FS_PREFIX и неопределённые переменные shell /flashdata в boot.sh и /firmware/scripts/run_widget.sh в PHP без $FS_PREFIX; $BASEDIR не определён в rmcron_meminfo.sh; loadLanguage() подключает файл по непроверенному языку Widget Ext (код)85
Подавление ошибок m3u.class.php выполняет error_reporting(0), перекрывая E_ALL из do.php remote-control (код)86
Вводящие в заблуждение тексты проверка корня movies с текстом про vod_categories; диалог «логин на NNM-Club» для Kinozal pirates_* (код)87; MegaTorrents (код)88
Копипаста в манифесте caption «1HD» у шести пакетов; name и caption vevo3 расходятся; по сообщению участника темы, одинаковый name двух пакетов приводит к конфликту Kohana-канал (код, форум)89
Остатки чужих плагинов демо-конфиг SDK и ссылка на отсутствующую иконку; диалог баланса с неопределённой CHECK_BALANCE_URL; второй неиспользуемый класс Plugin; lib/1utils.php — копия старого класса HD в четырёх пакетах avadim71; неподключённые decoder.php с istream_url() и compat/kinokiste_decoder.php, побайтовая копия streams/kinokiste_decoder.php Screenshoter (код)90; zlostnyi (код)91; Kohana-канал (код)92; folder-cache-vod (код)93
Мёртвая настройка и константа show_tv сохраняется в plugin_cookies и читается только как начальное значение combobox show_tv в radio_setup_screen.php, больше нигде не используется; константа DemoConfig::CHANNEL_LIST_URL /www/lib/channel_list.xml не используется, каталога www в пакете нет —

По сообщению автора youtube_api/folder_cache, при частом переключении фильмов сервер источника начинает блокировать запросы (форум)95.

Не проверено

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

Утверждение Уровень, статус Claim Раздел
TorrServer::actionGetTorrentListAsync Online Movies (TV Series) ссылается на отсутствующий в пакете www/cgi-bin inference (вывод)96 §17
Экран file_list недостижим из интерфейса Screenshoter inference, verified (вывод)97 §17
php_r22/, php_r24/ в репозитории ProIPTV — эталонные копии фреймворка, которые разработчик копирует в ./php для локальной отладки inference (вывод)98 §17
WeburgTV при недоступном плейлисте не показывает диалог ошибки: file() не проверяется inference (вывод)99 §17
try/catch вокруг json_decode в AceStreamSearch не ловит повреждённый JSON: json_decode возвращает NULL, а не бросает исключение inference (вывод)100 §17
Экран list_screen PeerflixServer при открытии вызовет необъявленный SmartConfig::rclone_mount — фатальная ошибка inference (вывод)101 §17

  1. doc-sdk-plugins.c139 · doc · sigma-smp86xx, sigma-smp87xx, android; прошивка — · Лог плагина — /tmp/run/.log (Sigma: tail -F через telnet; Android: busybox tail -F через telnet/ADB) ↩↩↩

  2. fw-tv188b-261021-0117-r25.c329 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 php_server при старте пишет «Starting logging to '/data/data/com.dunehd.app/tmp/run/<плагин>.log' (<= 3072000)»; в окружении php_server LOG_DIR=/tmp/run и LOG_MAX_FILE_SIZE=3072000. ↩↩

  3. fw-tv188b-260827-0003-r24--movie-suppliers.c036 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Оболочка вызывает поставщика командой « <команда>» через proc_open: входной объект — JSON в stdin, результат — JSON из stdout, stderr дописывается в /tmp/run/__supplier.log ↩

  4. plg-dc-widget-ext.c033 · code · unknown; прошивка — · Для отладочного вывода используется функция hd_print() ↩

  5. plg-gh-valerievitch-dune-plugin-acestreamsearch.c122 · code · unknown; прошивка — · Плагин пишет в лог через hd_print: сообщения об ошибке декодирования истории и о завершении загрузки каналов. ↩

  6. plg-gh-kocourkuba-proiptv.c077 · code · unknown; прошивка — · hd_debug_print формирует префикс из номера строки, класса и функции вызывающего (при вызове без аргумента — ещё и из вызвавшей функции/строки), форматирует массивы/Json_Serializer и пишет строку через hd_print. ↩

  7. plg-dc-bazinga3.c050 · code · unknown; прошивка — · link_api() печатает в лог версию плагина, версию парсеров и содержимое /tmp/run/versions.txt. ↩

  8. plg-gh-kocourkuba-proiptv.c078 · code · unknown; прошивка — · Отладочный лог включается cookie PARAM_COOKIE_ENABLE_DEBUG: entry handler при каждом вводе вызывает set_debug_log по этому cookie, переключатель в расширенных настройках меняет cookie и сразу вызывает set_debug_log, а при manifest debug=true конструктор плагина принудительно ставит cookie в on. ↩

    • plg-hdtv-remtor.c050 · code · unknown; прошивка — · remote_torrent_Plugin::get_folder_view устанавливает is_debug из plugin_cookies->loglevel, декодирует user_data через HD::decode_user_data, сохраняет action_ok = ActionFactory::open_folder(media_url) и передаёт вызов parent::get_folder_view.
    • 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 иначе.
    • plg-hdtv-remtor.c092 · code · unknown; прошивка — · Экран rt_setup_url показывает кнопки версии/changelog, выбора подключения, настроек Transmission (download, network), поле refresh_interval; cbLogLevel и cbDuneFolder закомментированы.

    ↩

    • plg-dc-dunemdb-supplier-movies-eng.c035 · code · unknown; прошивка — · Файл /debuglog.flag включает дополнительный --debugLog у omsearcher.py.
    • plg-dc-dunemdb-supplier-movies-eng.c065 · code · unknown; прошивка — · В режиме --debugLog omsearcher.py оборачивает urllib2.urlopen логированием и увеличивает предельный размер лога с 20 480 до 204 800 байт.

    ↩

    • plg-dune-remote-control.c022 · code · unknown; прошивка — · debug_log пишет строку в /tmp/run/_cgi.log (FILE_APPEND | LOCK_EX) и делает это только при debug_level != 0.
    • plg-dune-remote-control.c021 · code · unknown; прошивка — · При debug_level != 0 ответ дополняется элементами debug с plugin_name, install_dir_path, tmp_dir_path, plugin_www_url, plugin_cgi_url, data_dir_path, а в конце — end_time_in_seconds.

    ↩

  9. plg-dc-screenshoter.c080 · code · unknown; прошивка — · do.php пишет лог в /tmp/plugins/Screenshoter/cgi.log (ротация при ≥10000 байт), кроме режима HD_APK без HD_FW_APK ↩↩

  10. 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» ↩

  11. plg-dc-dunemdb-supplier-movies-eng.c069 · code · unknown; прошивка — · run.py инициализирует логгер log.init_logger(LOG_FILE); log.init_logger по умолчанию использует RotatingFileHandler с maxBytes 20 480, backupCount 1 и форматом «[время] [уровень] сообщение». ↩

    • plg-hdtv-cleanup.c017 · code · unknown; прошивка — · Скрипт пишет лог в /tmp/run/cleanup.log без проверки размера и ротации: каждый цикл добавляет дату, разделитель и найденные pid.
    • plg-hdtv-cleanup.c020 · forum · unknown; прошивка — · В теме участник micha86 предлагает ротацию лога: если размер cleanup.log ≥ 102400, переименовать его в cleanup.log.old.

    ↩

  12. plg-dc-dune-backup.c140 · code · unknown; прошивка — · Если лог помечен # и в нём больше 1000 строк на Android или больше 100 на других платформах, каждый четвёртый кадр анимации запускает bin/clear_%_in_log.sh, который удаляет строки, оканчивающиеся на %, и сохраняет остальные, обрезая хвост процентного вывода. ↩

  13. plg-hdtv-duneplexcatalog.c053 · code · unknown; прошивка — · Notifier использует /usr/bin/wget и передаёт заголовки X-Plex-Client-Identifier и X-Plex-Device-Name; при наличии каталога /D/dune_plugin_logs пишет отладочный лог в /D/dune_plugin_logs/dpc_bash.log. ↩

    • plg-dc-dunemdb-supplier-movies-rus.c032 · code · unknown; прошивка — · После hd_redirect_output("php://stderr") весь вывод hd_print буферизуется и сбрасывается в stderr, а в stdout уходит только итоговый JSON.
    • plg-dc-dunemdb-supplier-movies-rus.c058 · code · unknown; прошивка — · Собственная ротация лога в redirect_log_if_needed() не срабатывает при выводе в php://stderr: функция проверяет is_file($path), а для php://stderr это false, поэтому файл не переименовывается.

    ↩

  14. plg-ds-dunemdb-supplier-generic.c030 · code · unknown; прошивка — · run.php пишет отладочные строки в stderr через собственный log_print (php://stderr), включая полный вход start_playback_app через print_r. ↩

  15. plg-ds-dunemdb-supplier-megogo.c026 · code · android; прошивка — · run.php пишет отладку в stderr через log_print, run.py включает logging.basicConfig(level=DEBUG) и пишет события через logging.info. ↩

  16. plg-ds-dunemdb-supplier-okko.c026 · code · android; прошивка — · run.php пишет отладку в stderr через log_print, run.py включает logging.basicConfig(level=DEBUG) и пишет события через logging.info. ↩

  17. plg-hdtv-kohana-channel.c048 · code · unknown; прошивка — · Controller перед возвратом результата печатает в stdout имя операции: echo 'get_tv_info: ' . $media_url и аналогичные строки в get_folder_view, get_next_folder_view, get_tv_stream_url, get_vod_info, get_vod_stream_url, get_regular_folder_items, get_day_epg, get_tv_playback_url, change_tv_favorites. ↩

  18. doc-sdk-plugins.c058 · doc · any-documented; прошивка — · Результат операции — PluginOutputData с полями has_data, data_type, data, plugin_cookies, is_error, error_action; при ошибке is_error = true и может быть задано error_action ↩

  19. doc-sdk-plugins--gui-actions.c043 · doc · any-documented; прошивка — · Данные PluginShowErrorAction — класс PluginShowErrorActionData: fatal (Boolean), title (String), msg_lines (List, необязательно) ↩

  20. doc-sdk-plugins--gui-actions.c044 · doc · any-documented; прошивка — · PluginShowErrorAction в режиме воспроизведения показывает одну строку текста в центре экрана, а в меню Dune — диалог с заголовком и строками сообщения ↩

  21. doc-sdk-plugins--gui-actions.c045 · doc · any-documented; прошивка — · При fatal == true PluginShowErrorAction планирует выход из плагина по фатальной ошибке: воспроизведение останавливается, браузер Dune переходит в верхнее меню ↩

  22. plg-gh-aspel-twitch-dune-plugin.c056 · code · unknown; прошивка — · DefaultDunePluginFw::call_plugin_impl создаёт экземпляр плагина один раз (static $plugin, create_plugin при is_null) и при DuneException или Exception возвращает PluginOutputData с has_data=false, plugin_cookies, is_error=true и error_action. ↩

    • plg-gh-sndpl-apple-trailers-dune-plugin.c018 · code · unknown; прошивка — · call_plugin_impl обрабатывает ошибки тремя ветками: при исключении в create_plugin возвращает is_error=true и ActionFactory::show_error(true, T::t('title_application_error'), [T::t('msg_plugin_init_failed')]); при DuneException — is_error=true и error_action из get_error_action(); при прочих Exception — is_error=true и show_error с T::t('msg_unhandled_plugin_error').
    • plg-gh-sndpl-apple-trailers-dune-plugin.c053 · code · unknown; прошивка — · ActionFactory::show_error собирает GUI-действие PLUGIN_SHOW_ERROR_ACTION_ID с полями PluginShowErrorActionData::fatal, ::title и ::msg_lines.

    ↩

  23. plg-hdtv-kohana-channel.c046 · code · unknown; прошивка — · call_plugin_impl перехватывает DuneException, ErrorException и Exception и возвращает PluginOutputData с is_error=true и error_action; для DuneException берётся $e->get_error_action(), для остальных — ActionFactory::show_error с текстами «System error»/«Ошибка». ↩

  24. plg-gh-mdpuma-dune-plugin-altiptv.c037 · code · unknown; прошивка — · При DuneException адаптер возвращает error_action из исключения и is_error=true. ↩

    • plg-dc-widget-ext.c015 · code · unknown; прошивка — · Исключения плагина перехватываются и возвращаются как is_error = true с error_action ActionFactory::show_error(...); для DuneException берётся $e->get_error_action()
    • plg-dc-widget-ext--lib.c052 · code · unknown; прошивка — · DuneException хранит переданный error_action и возвращает его методом get_error_action.

    ↩

  25. plg-hdtv-altsource.c074 · code · unknown; прошивка — · lib/default_dune_plugin_fw.php — копия каркаса из прошивки, но без lib/text_utils.php: вместо T::t(...) в сообщениях об ошибках стоят английские строки «System error», «Can not create PHP plugin instance.» и «Unhandled PHP plugin error.». ↩

  26. plg-gh-vladikshkwok-lampa-dune-plugins.c022 · code · android; прошивка — · При исключении call_plugin возвращает is_error=true и error_action plugin_show_error с заголовком Lampa и текстом «Нет подготовленного видео. Запустите его из Lampa.». ↩

  27. plg-dc-globaltv.c164 · code · unknown; прошивка — · Session задаёт общий cookie-файл /tmp/24h2.cookies для GET/POST; dune_api_exception возвращает DuneException как есть, DuneCurlException превращает в DuneException с show_error (msg_connect_failed), а прочие исключения — в DuneException с show_error: при is_playback=true заголовок msg_connect_failed и пустой текст, иначе error_dialog_title и строки msg_connect_failed/dune_tv_check_connection. ↩

    • plg-hdtv-jurt.c014 · code · unknown; прошивка — · api_call повторяет запрос бесконечно при коде ошибки 131 (ECODE_QUERY_LIMIT_EXCEEDED), а для положительных кодов 1, 2, 103, 401 и прочих бросает BtvException('Error from API', $ecode).
    • plg-hdtv-jurt.c015 · code · unknown; прошивка — · dune_api_exception различает коды 1 (неверный логин/пароль), 2 (в доступе отказано; также logout), 103 (неверный прежний код) и 401 (неверный код); для остальных показывает описание и код.

    ↩

  28. plg-dc-dune-backup.c128 · code · unknown; прошивка — · При показе .err на русском языке плагин заменяет английские сообщения tar и ФС: short write — «вероятно, нехватка места», write error — «ошибка записи», No space left on device — «нехватка места», can't create directory — «не удается создать каталог». ↩

    • plg-hdtv-remtor.c065 · code · unknown; прошивка — · get_folder_range экрана rt_torrents формирует элементы из всего массива torrent_list и не использует параметр from_ndx для среза; при ошибке возвращает один элемент с caption «ERROR: ».
    • plg-hdtv-remtor.c145 · code · unknown; прошивка — · get_connection_dialog показывает диалог с последней ошибкой last_error_msg и кнопками запуска локального Transmission (если локальный тип определён), подключения к демону, перехода в настройки и закрытия.

    ↩

    • plg-dc-dunemdb-supplier-movies-eng.c031 · code · unknown; прошивка — · Неизвестный метод возвращает {"error": {"message": "undefined method: <имя>"}}.
    • plg-dc-dunemdb-supplier-movies-eng.c032 · code · unknown; прошивка — · Любое исключение при обработке команды перехватывается и возвращается как {"error": {"message": <текст исключения>}}; в лог пишется traceback.

    ↩

  29. plg-dc-dunemdb-supplier-movies-rus.c033 · code · unknown; прошивка — · Ошибки приложения возвращаются как {"error":{"message":"…"}}; E_USER_ERROR дополнительно превращается в такой JSON и завершает процесс, а перехваченные set_error_handler() ошибки (warning/notice и т. п.) пишутся в лог и подавляются (обработчик возвращает true). ↩

  30. fw-tv188b-260827-0003-r24--movie-suppliers.c037 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Ненулевой код выхода bin или не-JSON на stdout — результат команды null (ошибка) ↩

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

  32. plg-gh-mikhail-ilin-dune-plugin-weburgtv.c111 · code · unknown; прошивка — · webtv.php объявляет throw_m3u_error, который бросает DuneException с ActionFactory::show_error(true, «Ошибка M3U», списком строк); в пакете нет вызовов этой функции. ↩

  33. fw-tv188b-260827-0003-r24--movie-suppliers--stream-protocol.c071 · code · tv188b, android-dune-fw; прошивка 250815_1012_r22 · Встроенный link_api.php youtube r22 имеет версию ##673## и начинается с класса Youtube (retrieve_playback_url($url_id, $vQuality, …)); при неудаче он возвращает заглушку http://mp4://dune-club.info/plugins/update/1.mp4, которую YoutubeStreamAPI считает ошибкой ↩

    • plg-hdtv-torrserve.c017 · code · unknown; прошивка — · install.sh скачивает исполняемый файл TorrServe и файл ver с dune-club.info, выставляет chmod -R 777 на TorrServe и пишет ход в /tmp/plugins/TorrServe/logs, завершая строкой Welldone.
    • plg-hdtv-torrserve.c018 · code · unknown; прошивка — · Кнопка install_dialog запускает bin/install.sh в фоне и затем каждую секунду показывает его лог; по строке Welldone переходит к install_dialog4.

    ↩

  34. plg-hdtv-mpd.c032 · code · unknown; прошивка — · Установка mpd показывает ход через файл: по control_id install_dialog плагин пишет «Start!» в tmp_dir_path/mpd_install и запускает bin/inst.sh в фоне, а по control_id install_dialog2 раз в 1000 мс читает этот файл в обратном порядке; когда файл исчез (inst.sh удаляет его в конце), показывается итоговый диалог, результат установки код не проверяет. ↩

  35. plg-hdtv-megatorrents.c095 · code · unknown; прошивка — · show_log каждые 1000 мс (timer + GUI_EVENT_TIMER → close_dialog_and_run) перечитывает tmp_dir_path/logs, вычищая ANSI-коды, и завершает цикл по строкам «TorrServe st» (→ torrserve_setup) либо Сompleted/OK/KILLED/Starting/stopped (→ select_action). ↩

  36. plg-hdtv-duneplexserver.c019 · code · unknown; прошивка — · bin/inst.sh в конце всегда удаляет временный лог; если каталог /D существует, перед этим копирует лог в /D/plex_install.log, удалив старый файл. ↩

  37. plg-dc-dune-backup.c050 · code · unknown; прошивка — · Окно «Мониторинг ресурсов» вызывает bin/info.sh, обновляется таймером каждые 3 секунды и показывает загрузку CPU, температуру thermal_zone0/1 и доступную память. ↩

  38. plg-hdtv-peerflixserver.c043 · code · unknown; прошивка — · peerflix_status возвращает JSON status=true только если pidof node нашёл процесс и существует файл /home/.forever/pids/PeerflixServer.pid; иначе status=false. ↩

    • plg-hdtv-duneplexserver.c027 · code · unknown; прошивка — · bin/plex задаёт окружение Plex Media Server: LD_LIBRARY_PATH и PLEX_MEDIA_SERVER_HOME в bin/Application, до 6 plugin-процессов, pid-файл /tmp/Apps/plex/pid.txt, PLEX_BROWSER_ROOT=/tmp/mnt, TMPDIR в каталоге библиотеки, ulimit -s 3000; версия 1.3.3.3148-b38628e.
    • plg-hdtv-duneplexserver.c024 · code · unknown; прошивка — · При установленной копии (bin/Application) экран читает библиотеку через HD::get_item('plexlibrary_location'); если путь конкретный (не пусто и не 1), читает статус через bin/plex status и при Plex:Running показывает адрес http://:32400 и кнопку остановки, при Process dead — остановку, иначе — запуск.

    ↩

  39. plg-hdtv-mpd.c021 · code · unknown; прошивка — · CGI-команда mpd переключает состояние: если pidof mpd находит процесс, вызывает mpd-stop, иначе mpd-start; отдельные команды mpd_start и mpd_stop вызывают соответствующие обёртки. ↩

    • plg-hdtv-web-launchers.c053 · code · unknown; прошивка — · bonus-tv запускает локальную ping.html, которая подключает jQuery 1.4.1, jquery.tools и ping.js, показывает сообщение «Возникла ошибка. Проверьте подключение к интернету» и кнопку Ok.
    • plg-hdtv-web-launchers.c054 · code · unknown; прошивка — · bonus-tv ping.js подключает внешний скрипт http://bonus-tv.ru/api/ping, через 4 секунды показывает окно ошибки, создаёт объект application/x-dune-stb-api и по клавишам 13/8 вызывает stb.exitBrowser(stb.EXIT_BROWSER_MODE_CLOSE).

    ↩

    • plg-gh-kocourkuba-proiptv.c019 · code · unknown; прошивка — · plugin_test_env.php (окружение локальной отладки на Windows) добавляет в include_path каталоги ./php и ./dune_plugin, подключает bootstrap.php, dune_api.php, dune_plugin.php, dune_plugin_fw.php и эмулирует окружение плагина переменными FS_PREFIX=./dune_fs, PLUGIN_NAME, PLUGIN_INSTALL_DIR_PATH, PLUGIN_DATA_DIR_PATH, PLUGIN_TMP_DIR_PATH, PLUGIN_WWW_URL, PLUGIN_CGI_URL и PHP_EXTERNAL.
    • plg-gh-kocourkuba-proiptv.c020 · code · unknown; прошивка — · .gitignore репозитория исключает каталоги /php и /php_r25 (в git есть только php_r22/, php_r24/, php_apk_r22/).
    • plg-gh-kocourkuba-proiptv.c022 · code · android-dune-fw; прошивка 250815_1012_r22 · php_r22/dune_api.php и php_r22/dune_plugin_fw.php побайтно совпадают с dune_api.php и dune_plugin_fw.php прошивки tv188b 250815_1012_r22 (одинаковые sha256 в tree.tsv); копии php_apk_r22/ этих файлов — те же.
    • plg-gh-kocourkuba-proiptv.c023 · code · android-dune-fw; прошивка 260827_0003_r24, 260724_0207_r24 (APK), 261021_0117_r25 · php_r24/dune_api.php, php_r24/dune_plugin_fw.php и php_r24/include/dunelib/{config_utils,utils}.php побайтно совпадают с одноимёнными файлами прошивки tv188b 260827_0003_r24 и APK 260724_0207_r24 (одинаковые sha256 в tree.tsv); с r25 (261021_0117) dune_api.php и dune_plugin_fw.php уже не совпадают.
    • plg-gh-kocourkuba-proiptv.c025 · code · android-dune-fw; прошивка 250815_1012_r22, 260827_0003_r24 · Копия php_r24/dune_plugin_fw.php обрабатывает операцию PLUGIN_OP_GET_VOD_STREAM_INFO (вызов get_vod_stream_info плагина), а php_r22/dune_plugin_fw.php — нет.

    ↩

  40. plg-dc-dunemdb-supplier-movies-eng.c075 · code · unknown; прошивка — · В пакет входят интеграционные тесты: test_run.py вызывает ./run.sh с JSON на stdin и проверяет команды протокола, а test_searcher.py запускает omsearcher.py и проверяет поток внешним ffmpeg -i. ↩

  41. plg-hdtv-duneplexcatalog.c063 · code · unknown; прошивка — · Файл index.php в корне пакета — отладочная площадка: он подключает отсутствующие в пакете dune_core/dune_api.php и dune_core/bootstrap.php и содержит захардкоженные адреса <адрес в LAN>/<адрес в LAN>; манифест его не использует. ↩

    • plg-gh-infinitygp-dune-jellyfin-bridge.c046 · code · android; прошивка — · BridgeActivityTest проверяет три вещи: grace-период запуска 5000 мс (3000 мс на второй секунде и 0 на пятой), overlay-разрешение требуется только с SDK 29 при canDrawOverlays=false, а flagsForDunePlayer снимает NEW_TASK, FORWARD_RESULT и PREVIOUS_IS_TOP, сохраняя GRANT_READ_URI_PERMISSION и EXCLUDE_FROM_RECENTS.
    • plg-gh-infinitygp-dune-jellyfin-bridge.c047 · code · android-dune-fw; прошивка — · DuneStatusTest ожидает, что парсер принимает строковые и числовые playback_position и playback_duration, игнорирует unknown и отрицательные позиции, считает stopped неактивным, hidden (video_enabled=0 и playback_window_fullscreen=0) невидимым, nativeDunePlayback видимым при android_app_active=0, matchingPlaybackBehindAndroidApp невидимым при android_app_active=1, а command_status timeout — принятой командой.
    • plg-gh-infinitygp-dune-jellyfin-bridge.c048 · code · android-dune-fw; прошивка — · NfsMediaResolverTest ожидает выбор одноимённого файла с совпадающим размером, отказ при другом размере, совпадение по имени при неизвестном размере, фильтрацию mount по type=nfs и status=mounted с сортировкой по mount_tm (новые первыми), а также URL nfs-tcp/nfs-udp/nfs и отказ для файла вне корня монтирования.
    • plg-gh-infinitygp-dune-jellyfin-bridge.c049 · code · android-dune-fw; прошивка — · PlaybackProgressTrackerTest ожидает: чужие медиа игнорируются; SEEK повторяется не чаще чем раз в 2 с и не больше 10 раз, CONFIRMED наступает при возврате к начальной позиции; ручная позиция не меньше 30 с даёт USER_OVERRIDE; на NFS сброс к началу не запускает повторный SEEK, а позиция принимается как 0; для HTTP сброс к началу в течение 15 с после подтверждения вызывает повторный SEEK; после 10 попыток приходит GAVE_UP; конец воспроизведения — после 1000 мс непрерывных несовпадений.

    ↩

  42. plg-gh-infinitygp-dune-jellyfin-bridge.c056 · forum · android-dune-fw; прошивка — · README предлагает смотреть состояние Dune без изменения его состояния запросом curl 'http:///cgi-bin/do?cmd=status&result_syntax=json', а логи bridge читать через adb logcat -d -s DuneJellyfinBridge:I. ↩

    • plg-gh-vladikshkwok-lampa-dune-plugins.c070 · code · android; прошивка — · Диагностика dune-native-player.js имеет версию 1.0.1 и хранит state и число запусков launches.
    • plg-gh-vladikshkwok-lampa-dune-plugins.c092 · code · android; прошивка — · Диагностика dune-local-progress.js имеет версию 1.3.0 и считает polls, samples, shared, endpoint и last.

    ↩

    • plg-gh-ytkachov-dune-hd-watch-sync.c070 · code · unknown; прошивка — · В tools/ лежат три read-only инструмента: inspect_watch_history.py сводит шарды и частоты полей по снятому каталогу, compare_histories.py сравнивает две истории и показывает риск откатов по тем же правилам слияния, measure_flush_latency.sh пассивно (HTTP и stat по adb) замеряет задержку сброса истории.
    • plg-gh-ytkachov-dune-hd-watch-sync.c048 · code · unknown; прошивка — · history_mtime берёт максимум stat -c %Y по файлам *.json в каталоге истории; mtime каталога для этого не годится, так как не меняется при перезаписи существующего шарда.
    • plg-gh-ytkachov-dune-hd-watch-sync.c024 · forum · Solo 8K, Pro 8K Plus, android-dune-fw; прошивка 250815_1012_r22 · Во время воспроизведения на диск ничего не пишется; после остановки запись появляется в течение секунд (16:06:33 остановка → 16:06:36 обновлён timestamp, запись на диске).

    ↩

  43. plg-hdtv-polsky-tv.c019 · code · unknown; прошивка — · load_stat отправляет статистику только при play_statistics_enabled. = yes; читает /tmp/run/playback_statistics.txt, где первая строка — num_items=, далее тройки строк (при неверном общем числе строк возвращается пустой список); записи других service_id и строки с неверным форматом пропускаются. ↩

  44. plg-dc-dunemdb-supplier-online-movies.c073 · code · unknown; прошивка — · State::enter_movie при существующем каталоге /flashdata/plugins_data//torlog сохраняет полученный movie JSON в .json; непустой season_numbers приводится к массиву с комментарием hack-workaround. ↩

  45. plg-gh-kocourkuba-proiptv.c079 · code · unknown; прошивка — · send_log_to_developer собирает в zip временные .txt/.log, кэш плейлиста *.m3u8, shell.log, логи плагина из трёх возможных каталогов и бэкап настроек, затем загружает архив на URL из base64-строки ('https://iptv.proiptv.info/upload/') через Curl_Wrapper с Content-Type: application/zip и удаляет временный zip. ↩

  46. fw-tv188b-261021-0117-r25.c149 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 CGI-скрипт плагина, вызванный через http:///cgi-bin/plugins/

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

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

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

    /… ↩↩

  47. fw-tv188b-261021-0117-r25.c155 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 запрос http:///cgi-bin/plugins/test_plugin5/env.sh?kbp5=1 выполнил скрипт www/cgi-bin/env.sh плагина: его вывод вернулся с HTTP 200, QUERY_STRING=kbp5=1 и REQUEST_URI переданы скрипту. ↩

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

  49. fw-tv188b-261021-0117-r25.c240 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 PHP-скрипт CGI плагина (php-cgi через CGI-обёртку) работает с posix_getuid() = 0, а php_server того же плагина — с uid 1000. ↩↩

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

  51. fw-tv188b-261021-0117-r25.c366 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В r25 HD::http_get_document() и HD::http_server_responding() по умолчанию ставят CURLOPT_SSL_VERIFYPEER=false. ↩

    • fw-tv188b-260827-0003-r24--php-framework.c057 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Если вызывающий передал CURLOPT_SSL_VERIFYPEER=true для https-URL, HD::http_get_document подставляет CURLOPT_CAINFO=/firmware/certs/ca-bundle.crt
    • fw-tv188b-261021-0117-r25.c367 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В r25 HD::http_get_document() добавляет CURLOPT_CAINFO=/firmware/certs/ca-bundle.crt только если в $opts передан истинный CURLOPT_SSL_VERIFYPEER и URL начинается с https://, после чего применяет $opts к хендлу; вызывающий может включить проверку, но CAINFO принудительно становится бандлом прошивки (переданный в $opts CAINFO перезаписывается).

    ↩

  52. plg-gh-ytkachov-dune-hd-watch-sync.c064 · forum · Solo 8K, Pro 8K Plus, android-dune-fw; прошивка 250815_1012_r22 · config/network_folders.properties хранит логин и пароль NAS открытым текстом, а устаревшие записи истории встраивают их в поле url. ↩

    • plg-gh-rpervykh-dune-plugin-anidub-com.c090 · code · unknown; прошивка — · В Cursor::get_next_fav переменная $url не определена до сборки episode_ref, поэтому проверка новых серий избранного сравнивает cookie с URL вида «?fileId=».
    • plg-gh-rpervykh-dune-plugin-anidub-com.c091 · code · unknown; прошивка — · В anidubPlugin::get_next_fav переменные $url и $season_title не определены; функция режет ref по &, скачивает страницу, ищет селектор fileId и возвращает один элемент избранного с is_has_new.
    • plg-gh-rpervykh-dune-plugin-anidub-com.c127 · code · unknown; прошивка — · Плагин увеличивает $this->m_items_count в parse_season и get_next_fav, но свойство m_items_count в anidubPlugin не объявлено.
    • plg-gh-rpervykh-dune-plugin-anidub-com.c128 · code · unknown; прошивка — · get_search_action_map и get_fav_action_map добавляют пункты в массив $menu_items без его предварительной инициализации.

    ↩

  53. plg-gh-aspel-twitch-dune-plugin.c058 · code · unknown; прошивка — · В конструкторах Tw_Search_All_favorite, Tw_Search_All_stream и Tw_Search_stream есть присваивание $this->streamName = $stream_name, где переменная $stream_name не определена; свойство streamName затем нигде не читается. ↩

  54. plg-hdtv-pirates-radio.c042 · code · unknown; прошивка — · В сообщении об ошибке загрузки EPG используется неопределённая переменная $id вместо $channel_id, поэтому в лог попадёт пустое значение id. ↩

  55. plg-hdtv-moidom.c022 · code · unknown; прошивка — · В обработчике настроек ветка else if ($control_id === 'stream_server' || 'http_caching' || 'bitrate' || 'timeshift') всегда истинна, потому что непустые строковые литералы в PHP истинны; поэтому при action_type=confirm любое нажатие (кроме show_tv/show_vod) вызывает set_settings с текущим control_id. ↩

  56. plg-hdtv-megatorrents.c084 · code · unknown; прошивка — · Цикл foreach по trans_plugins в start_transmission без фигурных скобок охватывает только if с echo, поэтому цикл ожидания /transmission/rpc выполняется один раз после перебора всех плагинов. ↩

  57. plg-dc-torrent-center.c151 · code · unknown; прошивка — · В TorrServer::setup условие перед подсказкой о локальном сервере использует присваивание $torrservIp = http://127.0.0.1:8090. ↩

  58. plg-dc-globaltv--list-config.c014 · code · unknown; прошивка — · Оба метода ConfigHolder::cats_lcfg_reload и cats_lcfg_ensure_loaded обнуляют cats_lcfg_map, если карта уже isset. ↩

    • plg-dc-globaltv--list-config.c041 · code · unknown; прошивка — · do_apply возвращает null после cleanup при changed=false; иначе передаёт JSON текущего и исходного наборов в params checked_idset/initial_checked_idset сохранённого apply_action и очищает состояние.
    • 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.

    ↩

  59. plg-gh-rpervykh-dune-plugin-anidub-com.c130 · code · unknown; прошивка — · В карте обычного элемента папки B_GREEN создаёт действие с control_id do_search_menu, но ветки case 'do_search_menu' в handle_user_input нет; нажатие уходит в общий переход по selected_media_url. ↩

  60. plg-hdtv-altsource.c079 · code · unknown; прошивка — · В lib/vod/movie.php обработчик control_id classAction вызывает SmartConfig::classAction, но такого метода в Smart_config.php нет — ветка упадёт с фатальной ошибкой PHP, если в user_input нет indiClass. ↩

  61. plg-gh-aspel-twitch-dune-plugin.c060 · code · unknown; прошивка — · ActionFactory::show_title_dialog вызывает ControlFactory::add_custom_close_dialog_and_apply_buffon, хотя в ControlFactory метод называется add_custom_close_dialog_and_apply_button; show_title_dialog в пакете нигде не вызывается. ↩

  62. plg-hdtv-peerflixserver.c026 · code · unknown; прошивка — · Smart_file_screen.php вызывает HD::get_versions и класс VodPeerflixScreen, которых в пакете нет. ↩

  63. plg-hdtv-folder-cache-vod.c032 · code · unknown; прошивка — · PlaybackUrlCache кэширует по video_id список серий, полученный из ExUa::retrieve_playback_url(), но класса ExUa нет ни в одном из 15 пакетов и ни один main-файл не вызывает PlaybackUrlCache::get() — файл подключён, но мёртв. ↩

  64. plg-gh-rpervykh-dune-plugin-anidub-com.c093 · code · unknown; прошивка — · PlaybackUrlCache в playback_url_cache.php подключается в anidub.php, но нигде не вызывается; обращается к неопределённому классу ExUa; конструктор присваивает локальную $map вместо $this->map. ↩

    • plg-dc-widget-ext.c086 · code · unknown; прошивка — · boot.sh проверяет каталог /flashdata/plugins_data без $FS_PREFIX, а остальные скрипты — $FS_PREFIX/flashdata/plugins_data
    • plg-dc-widget-ext.c087 · code · unknown; прошивка — · PHP-часть вызывает /firmware/scripts/run_widget.sh без $FS_PREFIX, а shell-скрипты — $FS_PREFIX/firmware/scripts/run_widget.sh
    • plg-dc-widget-ext.c085 · code · unknown; прошивка — · Ошибка в rmcron_meminfo.sh: используется $BASEDIR, который в этом скрипте не определён (в отличие от остальных скриптов)
    • plg-dc-widget-ext.c039 · code · unknown; прошивка — · В loadLanguage() проверенное значение $currentLanguage не используется: подключается lang/<$v>.php по сырому interface_language, так что для неподдерживаемого языка include_once ищет несуществующий файл

    ↩

  65. plg-dune-remote-control.c074 · code · unknown; прошивка — · При подключении m3u.class.php выполняет error_reporting(0) и set_time_limit(15), перекрывая error_reporting(E_ALL), заданный в do.php. ↩

  66. plg-hdtv-pirates-radio.c049 · code · unknown; прошивка — · В pirates_vod_list_screen.php проверяется корень movies, но текст ошибки ожидает vod_categories — сообщение вводит в заблуждение при разборе ответа. ↩

  67. plg-hdtv-megatorrents.c042 · code · unknown; прошивка — · Для URL kinozal без логина get_torrent возвращает диалог с текстом «Необходим логин на NNM-Club!», а не Kinozal. ↩

    • plg-hdtv-kohana-channel.c034 · code · unknown; прошивка — · В plg-hdtv-hight-one-hd, plg-hdtv-oui-tv, plg-hdtv-rougetv, plg-hdtv-vevo, plg-hdtv-vevo2 и plg-hdtv-vevo3 caption точки входа — «1HD», хотя локализованные caption и имя пакета другие; это след копирования шаблона 1HD.
    • plg-hdtv-kohana-channel.c035 · code · unknown; прошивка — · В plg-hdtv-vevo3 name=Vevo3, а caption и caption lang="russian" — «Vevo» и «Vevo3» соответственно; имя пакета и видимая подпись расходятся.
    • plg-hdtv-kohana-channel.c083 · forum · unknown; прошивка — · boabor объясняет конфликт pik_tv с 1-м музыкальным одинаковым name=first_muz_ru в манифесте и советует заменить его на pik_tv; по его словам, в Москве канал не работает.

    ↩

    • plg-dc-screenshoter.c049 · code · unknown; прошивка — · Smart_config.php содержит конфиг демо-плагина ТВ/VOD с адресами http://online.dune-hd.com/demo2/ (channel_list.pl, epg.pl, vod_categories.pl, m3u)
    • plg-dc-screenshoter.c050 · code · unknown; прошивка — · Smart_file_screen.php ссылается на plugin_file://icons/line.png, которого нет в пакете (в icons/ только default.png и logo.png)

    ↩

  68. plg-hdtv-zlostnyi-iptv.c169 · code · unknown; прошивка — · В ottclub, sharavoz и tvteam остался мёртвый диалог баланса: метод _check_balance_dialog обращается к неопределённой константе CHECK_BALANCE_URL, а вызов действия в get_action_map закомментирован; grep по трём пакетам находит только эти обращения, определения константы нет. ↩

  69. plg-hdtv-kohana-channel.c049 · code · unknown; прошивка — · В system/classes/plugin.php лежит второй класс Plugin implements DunePlugin: get_folder_view, get_next_folder_view, get_tv_info, get_vod_info, get_regular_folder_items и handle_user_input делегируют в Screen, get_tv_stream_url/get_vod_stream_url/get_tv_playback_url возвращают пустую строку, get_day_epg — array(), change_tv_favorites ничего не делает; bootstrap назначает классом плагина Controller, Plugin нигде не создаётся. ↩

    • plg-hdtv-folder-cache-vod.c004 · code · unknown; прошивка — · lib/1utils.php лежит только в четырёх пакетах avadim71 (gozlan, kinolist, seretil, veterok), дублирует старый класс HD и ни одним файлом пакета не подключается.
    • plg-hdtv-folder-cache-vod.c129 · code · unknown; прошивка — · decoder.php с функцией istream_url() не подключён в streamit.php и не входит в разбор get_episode_url(); копия compat/kinokiste_decoder.php побайтово совпадает с streams/kinokiste_decoder.php и тоже не подключается — мёртвый код.

    ↩

  70. plg-hdtv-101-ru.c109 · code · unknown; прошивка — · show_tv в DI.FM сохраняется в plugin_cookies и читается только как начальное значение combobox show_tv в radio_setup_screen.php, больше нигде не используется; константа DemoConfig::CHANNEL_LIST_URL '/www/lib/channel_list.xml' не используется, каталога www в пакете нет. ↩

  71. plg-hdtv-folder-cache-vod.c135 · forum · unknown; прошивка — · Автор предупреждает (p195125), что при частом переключении фильмов сервер начинает блокировать и лучше выбрать фильм и смотреть, а не скакать туда-сюда. ↩

  72. plg-dc-dunemdb-supplier-online-movies.c123 · inference · unknown; прошивка — · Метод TorrServer::actionGetTorrentListAsync ссылается на /www/cgi-bin/php-cgi и /www/cgi-bin/run.php, но каталога www в пакете нет; метод в main-коде не вызывается. ↩

  73. plg-dc-screenshoter.c048 · inference · unknown; прошивка — · Экран file_list недостижим из интерфейса Screenshoter: open_folder на него вызывается только из самого SmartFileSystemScreen ↩

  74. plg-gh-kocourkuba-proiptv.c021 · inference · unknown; прошивка — · Вероятно, php_r22/, php_r24/ и php_apk_r22/ — эталонные копии PHP-фреймворка прошивок для локальной отладки: разработчик копирует нужную в ./php (она в .gitignore), а plugin_test_env.php подключает её; в пакет плагина они не входят (пакет собирается только из dune_plugin/), и на устройстве плагин ветку не выбирает — работает с фреймворком самой прошивки. ↩

  75. plg-gh-mikhail-ilin-dune-plugin-weburgtv.c112 · inference · unknown; прошивка — · load_channels вызывает file() без проверки результата и не использует throw_m3u_error; при недоступном плейлисте диалог ошибки не показывается, а разбор идёт по значению false (поведение зависит от версии PHP). ↩

  76. plg-gh-valerievitch-dune-plugin-acestreamsearch.c123 · inference · unknown; прошивка — · Try/catch вокруг json_decode(plugin_cookies->history) не перехватывает повреждённый JSON: json_decode возвращает NULL и не бросает Exception, поэтому в $history окажется NULL, а не сообщение 'Error decoding history'. ↩

  77. plg-hdtv-peerflixserver.c052 · inference · unknown; прошивка — · Если экран list_screen всё же открыть, он вызовет необъявленный SmartConfig::rclone_mount и другие отсутствующие методы; для PHP это фатальная ошибка, поэтому экран неработоспособен. ↩