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

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

Часть каталога о контенте и воспроизведении: каталоги и поиск, избранное и история, потоки и плеер, ТВ и EPG, торренты и загрузки. Это разделы 6–8 и 14 общего каталога; их нумерация сохранена.

6. Контент: каталоги, поиск, избранное, история, сериалы

Объект: VOD- и ТВ-плагины (Smart_*, youtube_api/folder_cache, Anidub.Com, FREE TV, MegaAnime, altSource, altIPTV, GlobalTV, zlostnyi и другие) и поставщики фильмов dunemdb (Online Movies, Online services, Megogo, Okko); уровень code, отдельные наблюдения — по сообщениям пользователей; платформа и прошивка исполнения в большинстве единиц не установлены. Платформенные факты — по tv188b r24/r25.

Эта область — всё, что плагин показывает как «контент»: откуда берутся категории и списки фильмов, как устроены поиск, избранное, история и родительский контроль, как фильм попадает в поиск оболочки через поставщика. Экраны, на которых это живёт, — §4 и guide/gui-screens.md; передача фильма в плеер — §7 и guide/playback.md; где хранить списки и куки — §10. Поставщики фильмов как механизм оболочки описаны в guide/movie-suppliers.md, здесь — только приёмы плагинов.

6.1. Поставщик фильмов dunemdb: описатель и регистрация

Поставщик — плагин, который оболочка опрашивает при поиске фильма; регистрация и ключи описателя на стороне прошивки — guide/movie-suppliers.md §2–§3 и §8. Сторонние поставщики поддерживают два пути: скрипт movie_suppliers_update.sh, который на r24 запускает оболочка с парами <id> <caption> (код r24)1, и собственную запись описателя в /tmp/movie_suppliers для прошивок без этой возможности.

Задача Приём Грабли и ограничения Плагины и claims
Описать поставщика-приложение JSON с plugin, caption (%tr%-ключ), langs, supported_video_types=video, server_managed=true, location_handling=skip_unmatched_publications, playback_type=app, special_category, иконками — Megogo (код)2; Okko (код)3; Online services — тот же набор плюс logo_icon_url (код)4
Описать потоковый поставщик plugin, langs, caption=%tr%title_supplier, bin, get_publications_supported=true в bin подставлен абсолютный путь каталога bin плагина Online Movies (eng) (код)5
Запускать команды поставщика из своего каталога bin = cd <каталог bin> && $FS_PREFIX/firmware_ext/php/php-cgi -f ./run.php; Megogo и Okko при пустом FS_PREFIX ставят ./run.py на r25 команды стороннего поставщика с bin без cd выполняются с текущим каталогом / (устройство r25)6 Online services (код)7; Online Movies (TV Series) — с -c <каталог bin> (код)8; Megogo (код)9; Okko (код)10
Зарегистрироваться на прошивке без movie_suppliers_update global_actions boot_end/install/update с if="not(firmware_feature(movie_suppliers_update))" запускают скрипт, который пишет описатель в $FS_PREFIX/tmp/movie_suppliers/<id> на прошивке с этой возможностью действия не выполняются; Online services дополнительно выходит без php-cgi или без newgui2021 в firmware_features.txt Online services (код)11; Megogo (код)12; Okko (код)13
Поддержать оба пути регистрации movie_suppliers_update.sh пишет описатель в $FS_PREFIX/flashdata/plugins_data/<плагин>/movie_suppliers/<id>, register_supplier.sh — тот же описатель в /tmp/movie_suppliers описатель задан в двух скриптах Megogo (код)14; Okko (код)15; Online Movies (TV Series) (код)16
Старый путь: писать описатель всегда boot_end/install/update без условия → register_supplier.sh пишет JSON (plugin, caption, langs, bin) в /tmp/movie_suppliers/movies_rus; params/movie_suppliers в манифесте нет r24 перечитывает поставщиков по /tmp/movie_suppliers_changed.flag (код r24)17; что из этого следует для плагина — в §19 Online Movies (rus) (код)18
Убрать описатель при удалении global_actions/uninstall → rm -f /tmp/movie_suppliers/movies_rus удаляется только описатель в /tmp Online Movies (rus) (код)19
Собрать набор поставщиков из конфигурации сервисов update_movie_suppliers.php читает /flashdata/movie_services/config.json и /config/services_effective_config.json, берёт сервисы своего plugin_name, пишет описатели включённых и удаляет выключенных без любого из файлов или при ошибке разбора — только сообщение, изменений нет Online services (код)20
Не трогать описатель без изменений запись через <path>.tmp и rename, только если содержимое изменилось — Online services (код)4
Не зависеть от протокола bin play_action на entry/play своего GUI-плагина, playback_type=stream_special; два описателя — автоматический и ручной (manual=1) bin/run.php — заглушка: все команды завершаются unknown command; автоматический поставщик в старом скрипте включается файлом online_movies_full.txt Online Movies (TV Series) (код)21
Встроить видеотеку в медиатеку прошивки install.sh при newgui2021 вызывает register_movie_suppliers.sh; скрипты register_supplier_amediateka.sh и register_supplier_start.sh при найденном php-cgi пишут JSON-описатели DuneHDTVAmediateka и DuneHDTVStart в $FS_PREFIX/tmp/movie_suppliers; play_action — plugin_handle_user_input с handler_id=entry, control_id=ensure_logged_in, entry_id=movie_supplier — DUNE-HD.TV (код)22
Выбрать php-cgi для поставщика $FS_PREFIX/firmware_ext/php/php-cgi при HD_APK=1 или platform_kind android, иначе bin/87xx/php-cgi или bin/86xx/php-cgi по первым двум цифрам platform_kind, иначе exit 1; bin поставщика — <php-cgi> -f <bin>/run.php каталогов bin/87xx и bin/86xx в пакете нет DUNE-HD.TV (код)23
Сделать отдельный процесс поставщика bin/run.php принимает одну команду (get_episodes, do_file_search, get_stream_url), JSON-вход читает из stdin и печатает JSON; токен берёт из supplier_state.properties, иначе POST /auth/device с device_id из dune-hd.tv_plugin_cookies.properties, если он там есть, и сохраняет обратно ошибка — {"error":{"message":…}} DUNE-HD.TV (код)24
Сообщить оболочке об изменении поставщиков register_movie_suppliers.sh пишет время в $FS_PREFIX/config/mdb_timestamp и создаёт $FS_PREFIX/tmp/plugins/shell_ext/update_epfs_if_needed_flag; uninstall.sh при newgui2021 делает то же в register_movie_suppliers.sh удаление DuneHDTVMegogo/DuneHDTVMegogoKids идёт по "$dirpath/…", но dirpath не задана DUNE-HD.TV (код)25
Хранить описатели постоянно bin/movie_suppliers_update.sh при найденном php-cgi пишет те же описатели в $FS_PREFIX/flashdata/plugins_data/dune-hd.tv/movie_suppliers, bin — cd <bin> && <php-cgi> -f <bin>/run.php скрипт внутри пакета ничем не вызывается DUNE-HD.TV (код)26

6.2. Поставщик изнутри: публикации, серии и порядок источников

Команды, которые оболочка шлёт поставщику (get_episodes, do_file_search и другие), описаны в guide/movie-suppliers.md §4 и §7. Плагины реализуют их так.

Задача Приём Грабли и ограничения Плагины и claims
Найти публикации по Кинопоиску из movieInfo.movieExtId берётся kinopoisk:<id>, по нему — поиск в Solr сайта и замена хоста и пути без kinopoisk: или с id <= 0 публикаций нет Online Movies (rus) (код)27
Принять публикацию фильма или сериала фильм — player data-id из HTML страницы; сериал — URL, если в одной из первых трёх строк get_headers() есть код 200 зависит от вёрстки сайта Online Movies (rus) (код)28
Отдать сезоны и серии без своего API get_episodes строит список через вендорный индексатор, группирует по int(season) при пустом списке seasons = None; title сезона — '' Online Movies (eng) (код)29
Разрешать источники параллельно очередь и 10 потоков resolver_thread stop() только выставляет флаг, suspend() — пауза Online Movies (eng) (код)30
Упорядочить источники как на сервере карты providers_order/sources_order из <serverUrl>/config (кэш config_cache.json), QUALITY_ORDER, sortKey — Online Movies (eng) (код)31
Не зависеть от адреса поискового сервиса шаблон запроса берётся с сервера автора и кэшируется на 7200 с; локальный файл в /config заменяет шаблон шаблон принимается только с http:///https:// и ровно одним %s Online Movies (TV Series) (код)32
Убрать дубли и неподходящие раздачи ключ source:S:L:size:title; при языке не ru/uk/kk отбрасываются раздачи с кириллицей и нулевой пригодностью год в запрос не передаётся (support_search_with_year = false) Online Movies (TV Series) (код)33
Выбрать лучший поток cmp_torrents: bonus, invalid, good_ids, настройки качества, затем seeders/quality/size; режим quality — до двух раздач на разрешение, максимум 8; зелёная кнопка переключает режим — Online Movies (TV Series) (код)34
Разобрать movieExtId на imdb/tvdb movieExtId — список пар «ключ:значение» через запятую, плагин использует только imdb и tvdb пустые id заменяются на 0 Online Movies (eng) (код)35
Выдать файл по публикации do_file_search для остальных типов заново получает публикации, резолвит поток по pub->id и кладёт файл с id = JSON {pub_id, file_url = pub->id}, caption публикации и quality HD; неудачные публикации пропускаются — Online Movies (rus) (код)36
Закодировать качество раздачи числом TorrentInfo: разрешение QRES_2160P=700…QRES_SD=100, тип QTYPE_BLURAY=90…QTYPE_HDRIP=10, HDR QDR_*, DVD QSD_*; итоговое quality — их сумма — Online Movies (TV Series) (код)37
Проверить, подходит ли раздача под серию TorrentInfo::has_episode: false для invalid; для single_episode требует совпадения s и e; для диапазона проверяет сезон и границы episodes.from/to с поправкой на сумму эпизодов предыдущих сезонов — Online Movies (TV Series) (код)38

6.3. Каталог VOD: категории, списки, пагинация, карточка

Каталог — дерево папок «категории → список → карточка»; виды папок и ленивая отдача элементов — в guide/gui-screens.md §2.2 и §2.9. Источник данных плагины берут очень разный: зашитый массив, XML демо-сервера Dune, JSON API провайдера, M3U или HTML сайта.

Задача Приём Грабли и ограничения Плагины и claims
Категории без API массив категорий и жанров в коде список не приходит с сервера FREE TV — 4 категории и 33 жанра (код)39; zlostnyi (bcu) — одна категория плюс «Избранное» и «Поиск» (код)40
Видеотека на XML демо-сервера Dune vod_categories (вложенные — подкатегории), movie_list/movies, movie_info с series/item; разбор через simplexml_load_string адреса указывают на online.dune-hd.com/demo2 или flussonic2; в bcu константы есть, но не используются Peers.TV (код)41; pirates_* (код)42; zlostnyi (код)43; AllTV — /demo2/vod_categories.pl, /demo2/movie_list.pl, /demo2/movie_info.pl (код)44
Видеотека на JSON API провайдера категории → жанры → список с page=N, карточка, ссылка на файл Moi-Dom.tv игнорирует URL из vod_geturl и отдаёт исходный playback_url с http://mp4://; Юрта ТВ строит карточку из кэша списка Moi-Dom.tv (код)45; zlostnyi (ottclub, shara-club) (код)46; Юрта ТВ (код)47; MegaAnime (SmotretAnime) (код)48; Smart_* (Vimeo) — категории из /categories (код)49
Видеотека из M3U фильмы — строки #EXTINF с group-title = категория, id фильма — номер строки, одна серия; или плейлист в /tmp и воспроизведение с http://mp4:// описаний, года и рейтингов нет zlostnyi (bcu, smile) (код)50
Категории из HTML сайта разбор меню сайта; фиксированные пункты плюс спарсенные блоки; замена путей после переименования разделов сайта зависит от вёрстки; порядок блоков задаёт группу Smart_* (код)51; surface_* (Radiorecord.ru) (код)52; MegaAnime — Shikimori /animes/menu и /studios, AniDUB — фиксированные пути и списки жанров/даберов/годов, Animedia.tv и Tracker — /ajax/search_result* (код)53
Отличить подкатегорию от списка фильмов пункт с URL на http открывает список, иначе — подкатегорию; порядок — ksort по group_list или индексам от 1000 перед URL проверяется hide_id Smart_* (код)54
Фильтр «только русские» к category_id дописывается &country_id=5 для animation/tv и поиска фильтр сбрасывается FREE TV (код)55
Пагинация номером страницы номер страницы хранится в m_feed и подставляется в запрос — FREE TV (код)56; Entware/Wallpaper (код)57; Юрта ТВ — 24 на страницу (код)58; Smart_* (MoviesTape) — page/(m_feed+1) в DLE-каталоге (код)59
Пагинация токеном nextPageToken → m_next_ref, без токена — stop; Vimeo — paging->next в m_feed, иначе _end_ у плейлистов добор страниц в do-while продолжается только при $i == 25; desktoppr листается по pagination->next, alphacoders — по success == 1 youtube_api/folder_cache (код)60; Smart_* (Vimeo) (код)61; Entware/Wallpaper (код)62
Отдать часть каталога по head/tail DirectoryIterator::seek(head), пока tail > head++ tail <= head превращается в head+1 remote-control (код)63
Карточка фильма PluginMovieFolderView с полями PluginMovie из разбора страницы, right_button для избранного, has_multiple_series по числу серий Anidub.Com: actors пуст, duration_min = 0; youtube_api/folder_cache: n_series всегда '2', поэтому has_multiple_series всегда истинно Anidub.Com (код)64; youtube_api/folder_cache (код)65
Дополнить карточку внешними данными статистика YouTube из /videos; отзывы постранично с кнопкой «Далее -->»; описание и постер по Kinopoisk ID с внешнего сервиса комментарии YouTube — старым gdata-адресом; HD::http_get_document altSource отключает проверку TLS youtube_api/folder_cache (код)66; MegaAnime (код)67; altSource (код)68; Smart_* (Zona.mobi) — рекомендации relap.io (код)69
Отдать фильм в VOD-плеер get_vod_info → PluginVodInfo с PluginVodSeriesInfo на каждый файл; запуск — PLUGIN_VOD_PLAY Apple Trailers играет через локальный сервер http://mp4://127.0.0.1:7070/, которого нет в пакете Torrent Center (код)70; Anidub.Com (код)71; youtube_api/folder_cache (код)72; Apple Trailers (код)73
Плейлист из текущей папки при pl_create ≠ no серии собираются из элементов папки, при 2 — в обратном порядке — youtube_api/folder_cache (код)74
Достать MP4/FLV из страницы VK если URL содержит vk.com, get_vod_stream_url читает video_no_flv и video_host; для не-FLV — video_uid, video_vtag, video_max_hd и ограничение качества, для FLV — assets/videos/…vk.flv — Anidub.Com (код)75
Не парсить файлы трейлера заранее getTrailerFiles берёт кэш $trailer->trailerFiles, иначе разбирает XML, при null переходит на HTML и сохраняет в кэш результат, отличный от null; generatePlayInfo затем берёт файл по fileIndex если трейлер не найден, файлов нет Apple Trailers (код)76
Разобрать конфиг YouTube-плеера Youtube_api.php ищет /yt.playerConfig = ({.*});/ у SmotriMultik и Videokub, в остальных вариантах — /ytplayer.config = ({.*});/ — youtube_api/folder_cache (код)77
Построить каталог на YouTube Data API v3 /channels, /search, /videos, /playlistItems; с channelId — меню канала по /channels и /search; без него — готовый category_info из tmp или сборка из data/channel_list.xml: [videos]/[playlists] через /search, [live] при totalResults > 0 кэш в tmp теряется при перезагрузке youtube_api/folder_cache (код)78
Выбрать качество потока в VOD в ветках /validate/, obrut, ALLOHA, videoseedcdn.com cookie video_quality 4/3/2/1 = 1080/720/480/360, по умолчанию 4; в /validate/ и videoseedcdn.com берётся максимальная дорожка не выше выбранной — FREE TV (код)79
Взять обои из Desktoppr и Wallpaper Abyss Desktoppr — https://api.desktoppr.co/1/wallpapers?page=; Alphacoders — wall.alphacoders.com с методами random, newest, highest_rated, by_views, by_favorites, popular, featured, category_list, collection_list; подкатегории — sub_category_list, списки — method=category&id= и method=sub_category&id= с page — Entware/Wallpaper (код)80
Собрать источники фильма из HTML и vkArr HdKinoTeatr.Com берёт категории из class="cats" и ссылок href; при совпадении var vkArr в parse_video_page массив декодируется как JSON, а file/comment его элементов дают источники — Smart_* (код)81
Разобрать каталог аудиокниг knigavuhe каталог — ссылки a.index_genre с количеством книг в index_genre_count, «Авторы» и «Исполнители» — из списка букв _letters; списки кэшируются по категориям — Smart_* (knigavuhe) (код)82
Разобрать книгу knigavuhe блоки bookkitem, обложка через do?img=, автор из author_label, время из bookkitem_meta_time, жанр и описание — Smart_* (knigavuhe) (код)83
Показать авторов и исполнителей knigavuhe ссылки _item с количеством книг _item_books_count, иконка author.png или reader.png по сегменту URL — Smart_* (knigavuhe) (код)84
Читать JSON-каталог Filmix /catalog?orderby=year&filter=<cat>, &page= при m_feed > 0, "[]" заканчивает список; поля poster, title, id, year, quality, original_title, countries, categories; /w220/ заменяется на /w160/, _0.jpg на .jpg — Smart_* (Filmix_API) (код)85
Сделать VOD из тех же данных RainVod::load_movies создаёт на каждый элемент Config::$ICONS_GENRES_MAP ShortMovie и Movie с series_data (playback_url = stream_url, playback_url_is_stream_url=true) класс в RainPlugin не создаётся rain_* (код)86
Не подключать готовую VOD-библиотеку в пакетах Radiopotok.ru и LSS лежат 9 файлов lib/vod/, но surface_plugin.php не подключает VOD VOD-классы и экраны не используются surface_* (код)87

6.4. Поиск: диалог, история запросов, поиск по сайту, подсказки

Экран поиска с пунктом «новый запрос» и историей прошлых запросов встречается в шести плагинах (строка «История запросов» ниже); диалог с текстовым полем и экранной клавиатурой описан в guide/input-dialogs.md §2.5. Историю хранят по-разному: AceStreamSearch — в plugin_cookies->history (код)88, zlostnyi — файлом в data_dir_path (код)89 (см. §10).

Задача Приём Грабли и ограничения Плагины и claims
Диалог поиска текстовое поле, has_osk по настройке, кнопки «Искать»/«Отмена»; запрос сохраняется и упаковывается в media_url (ser_feed) открываемой папки при OSK Anidub.Com ставит вертикальный отступ 500, иначе 50 Anidub.Com (код)90; youtube_api/folder_cache — handle_user_input разбирает control_id, неизвестный открывает папку (код)91
История запросов список search_items: новый запрос — в начало без повторов, первым пунктом «[Новый запрос]» или «[Искать]»; кнопки «Поднять»/«Опустить»/«Удалить» zlostnyi (bcu) хранит его через HD::save_items файлом в data_dir_path Anidub.Com (код)92; MegaAnime (код)93; Entware/Wallpaper (код)94; Smart_* (код)95; FREE TV — через HD::save_items (код)96; zlostnyi (bcu) (код)97
История с сортировкой и удалением JSON в plugin_cookies->history; режимы alphabet/usage_count/last_used/added; удаление с подтверждением сравнение — strnatcasecmp по строковому значению; при пустой истории создаются три начальные записи AceStreamSearch (код)98
Переиспользовать экран поиска VOD для ТВ наследник VodSearchScreen вызывает конструктор AbstractControlsScreen напрямую и подставляет объект ТВ в $this->vod базовый экран вызывает у объекта get_search_media_url_str AceStreamSearch (код)99
Искать на сайте с постраничной выдачей POST DLE /index.php?do=search с result_from, GET /search/… или /?s= с номером страницы; конец — по маркеру на странице или _end_ в m_feed; Zona.mobi при m_feed != _end_ запрашивает search/<genre_id> с X-Requested-With: XMLHttpRequest и ставит _end_ при current_page == total_pages шаг выдачи у сайтов разный (10, 70, 12); у части сайтов поиск одноразовый; заголовки и фильтры зашиты в код (Filmix — годы 1902–2018); по сообщениям пользователей, в karas-avadim 1.0.0 поиск не работает Smart_* (код)100; Anidub.Com (код)101; youtube_api/folder_cache (karas-avadim) (форум)102
Искать через внешний поисковик или агрегатор Google Custom Search с ключом в коде; POST на агрегатор плееров по Кинопоиску; перебор нескольких сайтов подряд ключ и подпись зашиты в код Smart_* (MoviesTape) (код)103; Smart_* (link_api) (код)104; MegaAnime (код)105
Искать через API YouTube /search с maxResults=50; AceStream — локальный движок 127.0.0.1:6878 с токеном или удалённый с API-ключом, page_size=50; Filmix_API — одноразовый /suggest?word=<keyword>; Alphacoders — search с term и width=1920&height=1080 удалённый ключ по умолчанию test_api_key; Filmix_API и Alphacoders отдают только одну страницу youtube_api/folder_cache (код)106; AceStreamSearch (код)107; Smart_* (Filmix_API) (код)108; Entware/Wallpaper (код)109
Искать трек на YouTube из радио при control_id = yt_search берутся artist и track, склеиваются через « - » и открывается SmartVodListScreen с category_id=search, genre_id = строка и name=youtube_search; класс Youtube — во внешнем link_api.php по сообщениям пользователей, возврат из окна поиска даёт чёрный экран MegaRadio (код, форум)110
Искать в локальном списке подстрока без учёта регистра (mb_strtolower) по названиям из M3U — zlostnyi (bcu) (код)111
Искать каналы по словам запрос из куки, trim, нижний регистр UTF-8; для каждого слова — префиксное совпадение со словом имени; результат — rows-папка section_id=search строка __favorites при поиске не фильтруется GlobalTV (код)112
Подсказки при вводе своя клавиатура AdvKeyboard с поставщиком подсказок SuggestionsProvider (пять методов, пустая реализация DummySuggestionsProvider); поставщики Kinopoisk и Gismeteo Kinopoisk при captcha возвращает пустой список; Gismeteo разрешает поиск только по подсказке Widget Ext (код)113; altSource — AdvKeyboard с подсказками файлов при useOsk = 2 (код)114

6.5. Избранное

Избранное — список id в куках или в файле плюс стандартные операции оболочки над ним. Одно и то же имя favorite_movies плагины хранят и в plugin_cookies, и в файлах HD::get_items — см. §18.

Задача Приём Грабли и ограничения Плагины и claims
Хранить избранное в куках favorite_movies или favorite_channels в plugin_cookies — id через запятую (preg_split/join) — Torrent Center (код)115; Moi-Dom.tv (код)116; Peers.TV — пустые id отбрасываются (код)117; pirates_* (код)118; zlostnyi (код)119; WeburgTV (код)120; surface_* (SomaFM, Radiopotok.ru) (код)121; Bazinga (SmartVod) (код)122; AllTV — пустые id отбрасываются (код)123
Хранить избранное в файле HD::get_items/HD::save_items('favorite_movies'), у altSource — список media_url в DATA, у altIPTV — сериализованный файл при fav_save=1 у Smart_* методы с суффиксом from/to_cookies на деле пишут файлы FREE TV (код)124; Smart_* (код)125; Entware/Wallpaper (код)126; surface_* (Radiorecord.ru) (код)127; altSource (код)128; altIPTV (код)129
Хранить избранные серверы Speedtest /opt/bin/speedtest-cli --list, избранные — в speedtest_favs; запуск — --share --server <id>, ссылка берётся из строки «Share results» — Entware/Wallpaper (код)130
Добавить, удалить, переставить канал change_tv_favorites обрабатывает PLUGIN_FAVORITES_OP_ADD/REMOVE/MOVE_UP/MOVE_DOWN и сохраняет список WeburgTV: FavoritesGroup вызывает get_fav_channel_ids() без обязательного &$plugin_cookies altIPTV (код)131; WeburgTV (код)132; pirates_* (код)133
Добавить с проверкой дубля при повторе — сообщение «уже в избранном», иначе добавить и обновить элемент или папку — WeburgTV (код)134; Anidub.Com (код)135
Отмечать новые серии у сериала в избранном при добавлении сохранить episode_ref всех серий в куку <video_id>; серия, которой нет в списке, получает [NEW], просмотренная — [VIEWED] — Anidub.Com (код)136; youtube_api/folder_cache (код)137
Удалить и поднять в избранном своё popup-меню «Переместить вверх»/«Удалить»; при удалении чистятся связанные куки, папка помечается просроченной пока список строится, операция показывает «Подождите окончания построения списка!» Anidub.Com (код)138
Отключить избранное константы TV_FAVORITES_SUPPORTED/VOD_FAVORITES_SUPPORTED = false; действия избранного добавляются только при поддержке Юрта ТВ: избранное VOD вызывает несуществующие методы api_vod_favadd/api_vod_favsub plugtv (код)139; surface_* (LSS) (код)140; zlostnyi (sharavoz, tvteam) (код)141; Юрта ТВ (код)142
Добавить пункт на главный экран Dune подкаталог в main_screen_items с dune_folder.txt (media_url, media_url_check=no, media_action=browse); удаление — dune_folder.txt и rmdir с прошивки 130515 и build ≥ 2104 — три каталога, persistfs только если смонтирован, иначе только /config/main_screen_items; если ни один каталог не открылся, ответ без command_status remote-control (код)143

6.6. История просмотра, позиция и «Продолжить»

Позиция и события во время самого воспроизведения — §7.6.

Плагины ведут историю сами или подключаются к истории оболочки; как оболочка связывает историю с поставщиком — guide/movie-suppliers.md §11.

Задача Приём Грабли и ограничения Плагины и claims
Продолжить с места остановки сохранить позицию (Torrent Center — при playback_stop); при запуске задать initial_position_ms Torrent Center сбрасывает в ноль позицию не дальше 5 с от конца; MegaAnime для player.tree.tv использует ключ md5(series_name) Torrent Center (код)144; MegaAnime (код)145
Применить одну позицию ко всем сериям при playback_switched опросить локальный cmd=status и послать cmd=set_playback_state с позицией — Torrent Center (код)146
Своя история просмотра запись в itemsHistory на первом событии таймера VOD; экран истории с удалением одного элемента или всей истории история обрезается до 310 элементов; DUNE-HD.TV хранит историю просмотра архива в plugin_cookies->prodhist — JSON, до 8 записей type/product_id, новые — в начало altSource (код)147; DUNE-HD.TV (код)148
Попасть в «Продолжить» оболочки запрос shell_ext find_recent с uids/tags/result_file, затем post_update_wh читает файл при action_status = 1; для сериалов — eps-тег r24 требует result_action и result_file (код r24)149 Online Movies (TV Series) (код)150
Отмечать просмотр серий URL просмотренной серии добавляется в куку <video_id>.viewed только для элементов из избранного Anidub.Com (код)151
Отметка «просмотрено» на медиасервере Plex /:/scrobble и /:/unscrobble; автоматически — после 95 % длительности по словам автора, для многосерийных фильмов в одной папке отметка не работает (форум)152 DunePlexCatalog (код)153
Скробблинг в myShows OAuth (password/refresh_token), JSON-RPC; при playback_stop — manage.CheckEpisode; сезон и серия — из имени файла набором регулярок; импорт логина из DATA Bazinga (unserialize) client_secret в коде altSource (код)154
Слить историю нескольких плееров брать записи с uid на smb://, группировать по uid, побеждает наибольший start, но «касание» (watched < 120 с и pos/len < 5%) уступает более поздней записи с долей > 5 %; network_folder_id:// переписывается по network_folders.properties по сообщениям пользователей, переносимы только записи smb://, а online_movies: и storage_name: — нет (форум r22)155; по тем же сообщениям, на реальных данных защита поймала 14 из 15 откатов (форум r22)156 watch-sync (код)157

6.7. Сезоны и серии

Задача Приём Грабли и ограничения Плагины и claims
Список серий со страницы сезона разрезать HTML по <option value=", на каждую серию — episode_ref/episode_title, упакованные в user_data; число серий — по числу option страница сезона скачивается при каждом вызове get_vod_info Anidub.Com (код)158
Сезоны и серии по ссылкам сайта регулярки по ссылкам сезонов, затем на странице сезона — эпизоды по data-episode/data-id ветка «один выбранный сезон» использует незаданную переменную $id Online Movies (rus) (код)159
Несколько плееров и источников серий ключ плеера в md5 и &&sc=<md5>; JSON-плейлист /embeds/playlist-j.txt; список торрентов или var videoList — своя ветка на каждый сайт — MegaAnime (код)160
Выбрать файл раздачи и серию AddTorrentDialog::apply_series читает info_by_name из detect_series и проставляет s/e найденным файлам; вне switch_mode при count(series)==1, season<0 и chosen_op не play/download сразу запускает vod_play; play открывает torrent_files с выбранным файлом, download запускает download_torrent, иначе открывается папка torrent_files — Online Movies (TV Series) (код)161
Запустить выбранную серию и поток do_play: choice_auto = resume/auto_choose/auto_start; при choice_auto и s/e ≥ 0 входит в сезон/эпизод; без torrent_uid и при user_choice != resume берёт recent_or_first_torrent_uid; при disable_switch и найденном tor — ensure_own_torrserver (если нет torrserver_checked) и open_torrent, иначе vod_play всех эпизодов; get_vod_stream_url бросает DuneException с действием choose_playback_stream и playback_url — Online Movies (TV Series) (код)162
Разобрать сезоны Filmix из /post /post/<video_id>?; при пустом player_links->playlist перебирает player_links->movie и строит серии по title/translation/quality из квадратных скобок; иначе playlist по сезонам, переводам и сериям, %s заменяется на [<qualities>]; Movie получает серии или сезоны-папки — Smart_* (Filmix_API) (код)163
Отслеживать новые серии в сохранённой папке VodSeriesListScreen эталона: при control_id=save_folder удалить сохранённую папку фильма, если она есть, иначе при заданной movie.series_list сохранить HD::baseitem URL серий под movie_id/season_id; в списке фильмов эталона для фильма, присутствующего в save_folder, сравнить полученные parse_season_items URL с сохранёнными и пометить отсутствующий [NEW] и цветом 18 — Smart_* (код)164
Выделить несколько серий VodSeriesListScreen эталона при control_id=select и заданном selected_media_url переключает ключ series_id в select_url, затем инвалидирует vod_series — Smart_* (код)165

6.8. Родительский контроль и PIN

Для каналов плагины делают так: канал помечается is_protected = 1, а get_tv_playback_url сравнивает переданный protect_code с сохранённым кодом и при несовпадении не отдаёт URL.

Задача Приём Грабли и ограничения Плагины и claims
Закрыть каналы кодом protected=1 в списке или защищённая группа → is_protected = 1; при неверном protect_code — пустая строка, false или строка protected AllTV, altIPTV и EvolutionTV хранят код в куке (pass_sex, pin — по умолчанию 0000, current_pcode_save) AllTV (код)166; altIPTV (код)167; EvolutionTV (код)168; GlobalTV (код)169
Использовать встроенный родительский контроль при defined('PluginTvInfo::builtin_pcontrol_enabled') — пароль из /config/parental_control_password.txt в PluginTvInfo::entered_pcode, иначе своя проверка цепочка диалогов «18+» и установки кода держит флаги в plugin_cookies GlobalTV (код)170
Сменить код диалог «старый/новый (и подтверждение)»; новый сохраняется, только если старый совпал EvolutionTV: пустой сохранённый код совпадает с пустым вводом AllTV (код)171; EvolutionTV (код)172
Поле ввода кода add_text_field с numeric=true, has_osk=false, fixed_osk_id='numeric' — GlobalTV (код)173
Закрыть папки и категории PIN-кодом PIN как md5 в plugin_cookies, заблокированные категории — в сериализованном lockCat; ключ зависит от типа категории — altSource (код)174

6.9. Порядок, группы и редакторы списков

Задача Приём Грабли и ограничения Плагины и claims
Порядок каналов на сервере провайдера (act=up/down/reset), затем перезагрузка каналов; или локальные режимы сортировки общего списка и групп altIPTV пропускает объект __favorites при сортировке групп Moi-Dom.tv (код)175; altIPTV (код)176
Поднять элемент в начало корня список media_url в DATA (n_link), «Сбросить» очищает — altSource (код)177
Сортировка разделов и редактор списков выбор порядка в куке, затем change_list_config_reset_to_default или change_list_config_replace_order; редактор разделов и категорий с группами и EDIT_LIST_CONFIG_OPT_REMOVE_UNCHECKED для избранного пустой массив порядка в действие не попадает GlobalTV (код)178
Свои категории, скрытие и переименование каналов имя категории — в сериализованном data_file; скрытие — по ключу <плейлист>\|<канал>; переименование — прямо в M3U по паре название+URL переименование запрещено для HTTP-плейлиста (m3u_type=3) altIPTV (код)179
Привязать канал к группам tv_category_id → intval, поиск группы в HashedArray, add_group/add_channel; или одна группа __all_channels — pirates_* (код)180; rain_* (код)181
Прокручиваемый список на GComponents GCompList хранит <id>.sel/<id>.top, строит окно top…top+preload_size и шлёт ChangeGCompDef с remove/children_insert_after_id; клавиши page_up/page_down/up/down/left/right get_text_props возвращает ключи text_size/color, не совпадающие с полями GCompTtfLabelDef GlobalTV (код)182
Список установленных плагинов с игнор-листом разбор /tmp/run/installed_plugins.xml; ENTER и синяя кнопка переключают имя в строке ignoredPlugins, затем PLUGIN_UPDATE_FOLDER_ACTION_ID игнор-лист — строка через запятую Widget Ext (код)183
Сортировать подписи без учёта регистра usort с strtolower и строковым сравнением — Apple Trailers (код)184

6.10. Сопутствующий контент: «что нового», справка, чат, платный доступ

Задача Приём Грабли и ограничения Плагины и claims
Показать «что нового» скачать info.txt с сервера автора и показать в диалоге (strip_tags или многострочная метка) — Torrent Center (код)185; youtube_api/folder_cache (код)186
Показать историю версий update_info.xml из каталога установки, последние 16 версий, changelog на языке интерфейса с запасными english/russian — RemTor (код)187
Показать версию плагина HD::ver() читает version из dune_plugin.xml в install_dir_path при неудачном чтении — 'n/a' plugtv (код)188
Листаемые подсказки диалог «Полезно знать», стрелки влево/вправо, иконки из install_dir_path/icons HD::mb_str2arr принимает один аргумент и переносит по 65 символов, второй аргумент игнорируется plugtv (код)189
Скачать руководство в фоне фоновый wget PDF на /D с логом в /tmp/run только при наличии /D altIPTV (код)190
Ссылки из описания видео разбор описания и endscreen: плейлисты, каналы, видео; goo.gl раскрывается через get_headers экран называется vod_top500, но топ не строит YouTube (Smart_*) (код)191
Чат канала поверх видео при входе в канал запускается bin/irc.sh start (IRC через /dev/tcp, лог в /tmp/tw_irc.log); действие chat показывает диалог, который по GUI_EVENT_TIMER каждые 2000 мс закрывается и открывается заново; stop_irc останавливает демон перед записью лог обрезается до последних 7 строк; пустой auth_token проходит проверку Twitch TV (код)192
Выдать пробный период после регистрации устройства активируются промокоды NEWUSER30D (не Android) или NEWUSER90D (Android) и дополнительно NU30M — DUNE-HD.TV (код)193

Гипотезы по этой области (регистрация поставщика старым путём, сезоны без списка, пустой поиск в rows, клавиши экрана WeburgTV) собраны в §19.

7. Воспроизведение и потоки

Объект: приёмы воспроизведения в PHP-плагинах (Smart_* и link_api, YouTube (Smart_*), youtube_api/folder_cache, ProIPTV, altIPTV, liteIPTV, zlostnyi, FREE TV, GlobalTV, Kaban.tv, plugtv, MegaTorrents, altSource, DunePlexCatalog и другие) и в Android-приложениях Jellyfin Bridge и Lampa bridge; уровень code, отдельные сведения — forum. Платформа и прошивка исполнения у большинства плагинов не установлены; где плагин ветвится по платформе (Android/APK, Sigma), это сказано в строке.

Плагин сам не декодирует видео: он отдаёт плееру URL — через PluginVodInfo и PluginTvInfo, через launch_media_url или интентом Android — и при необходимости переписывает его так, чтобы плеер выбрал нужный демультиплексор. Что понимает плеер, какие действия запускают VOD и ТВ и какие события приходят во время воспроизведения, описано в guide/playback.md §1–§4; ниже — как это используют плагины. Торрент-потоки, AceStream и загрузки — в §14, EPG и разбор плейлистов — в §8.

7.1. Обёртки URL: http://mp4://, http://ts://, audio_stream и |||dune_params|||

SDK рекомендует для MP4 по HTTP схему http://mp4://host…, для TS — http://ts://…, а для multicast — udp:/@ip:port (SDK)194; параметры плееру дописываются после магии |||dune_params||| через запятую (код r25)195. Подробно — guide/playback.md §2.1. Плагины делают это так:

Задача Приём Грабли и ограничения Плагины и claims
Отдать MP4 по HTTP заменить http(s):// на http(s)://mp4://; большинство плагинов — только для URL на .mp4, не .m3u8 и ещё не обёрнутого проверка «уже обёрнут» нужна, иначе получится двойная схема Online Movies (rus) (код)196; ProIPTV (код)197; YouTube (Smart_) (код)198; MegaTorrents (код)199; Smart_ (Zona.mobi, MoviesTape, Filmix_API, Vimeo) (код)200; link_api (Seasonvar) (код)201; youtube_api/folder_cache (код)202; Entware/Wallpaper (код)203
Отдать TS по HTTP (live, MPEG-TS) заменить http:// на http://ts://; ProIPTV делает это для .ts/.mpeg/mpegts или по настройке «force TS» liteIPTV не трогает m3u8, http://ts://, http://audio_stream:// и http://mp4://; ProIPTV не трогает уже обёрнутые URL ProIPTV (код)197; altIPTV (код)204; liteIPTV (код)205; Kaban.tv (код)206; plugtv (код)207; zlostnyi (код)208; AceStreamSearch (код)209; youtube_api/folder_cache (sat-elit) (код)210
Отдать локальный поток с localhost //127.0.0.1:/ → //localhost:/, затем http://localhost: → http://ts://localhost: — GlobalTV (код)211
Отдать аудиопоток схема http://audio_stream://… в myradio так записаны 122 из 600 потоков, остальные — обычный http://; knigavuhe ставит https://audio_stream:// только на Android pirates_* (код)212; Smart_* (knigavuhe) (код)213
Передать плееру параметры суффикс \|\|\|dune_params\|\|\|key:value,…; ProIPTV собирает его из настройки плейлиста, конфига провайдера, #EXTVLCOPT dune-params и зума канала ProIPTV формирует пары через http_build_query с заменой = на : ProIPTV (код)214
Задать буфер buffering_ms:<мс> в dune_params при выбранном формате MPEG-TS или ненулевом buf_time — plugtv (код)207; zlostnyi (bcu) (код)215
Задать режим индексации и движок bufind_mode:1 всегда; engine:1 на Android; mediainfo:0 для архива — GlobalTV (код)216
Сохранить зум канала zoom: в dune_params из настройки канала, иначе из записи плейлиста в altIPTV сохранённая настройка приоритетнее плейлиста altIPTV (код)217; liteIPTV (код)218
Передать User-Agent и заголовки http_headers в dune_params в ProIPTV #EXTVLCOPT http-user-agent перезаписывает http_headers, а запятые в UA из #EXTHTTP экранируются как ,, ProIPTV (код)219; liteIPTV (архив) (код)220
Передать User-Agent без dune_params направить live-URL в локальный hls.sh с параметром user_agent; UA берётся из канала, затем плейлиста, затем записи другая транспортная цепочка, чем у ProIPTV altIPTV (код)221
HLS live с перемоткой \|\|\|dune_params\|\|\|protocol:hls,hls_seek_live:1 при HD::get_versions() === true, иначе при hls_seek_live == 2 — локальный hls.sh (§7.2) выбор ветки зависит от настройки hls_seek_live YouTube (Smart_*) (код)222
Тип HLS-потока для архива hls_forced_type:event в dune_params ставится не для всех сервисов, а в отдельных ветках zlostnyi (edem) (код)223; FREE TV (код)224
Параметры TS-архива psi_opt:2,ss_for_http_ts:1,keep_pic:0 вместе с http://ts:// и timeshift_abs-<ts>.ts/timeshift_rel-<смещение>.ts только для TS-сервисов в архивной ветке FREE TV (код)225
Настроить плеер под платформу в get_tv_playback_url (ветка $restrict_ch, не-passive канал) после ответа API с hls/local/local_low к URL добавляется \|\|\|dune_params\|\|\| с ll_prebuf_for_http_ts:1, psi_opt:2, ss_for_http_ts:1, keep_pic:0 и опциями платформы; I24hTv добавляет lower_cpu_load:1, если в /tmp/sysinfo.txt нет solo4k и _r11; вне Android и на Amlogic — buffering_ms:300, на Amlogic ещё frame_rate:25000, на s905l2 к HLS — engine:1 Android определяется по /system/dunehd/init или HD_APK=1, Amlogic — по префиксу s905 в /firmware/config/android_platform.txt dune-hd-tv (код)226
Разделить буферизацию VOD и ТВ BtvVod::get_buffering_ms читает plugin_cookies->http_caching (по умолчанию 3000), а ТВ берёт значение из статического BTV::$buffering_time, который выставляется только настройкой два разных механизма в одном плагине Юрта ТВ (код)227
Проверить двойную схему в streams.stream в firstmuzru и pik-tv значение начинается с http://ts:// — две схемы в одном URL значение приведено как есть; поведение плеера с такой строкой не проверено Kohana-канал (код)228
Переключать формат канала HLS/MPEG-TS tvteam при format = 'hls' переводит URL на http://ts://, при format = 'mpeg' заменяет mono.m3u8 на mpegts; при archive_ts > 0 в архиве format = 'hls' даёт index-<ts>-7200.m3u8, а format = 'mpeg' — archive-<ts>-7200.ts пункт MPEG-TS в настройках помечен «не работает» zlostnyi (код)229

7.2. Локальные CGI-конвертеры: flv.sh, rtmp, hls.sh, proxy.sh, DASH → HLS

Форматы, которые плеер не берёт напрямую, плагины пропускают через локальный CGI: URL вида http://ts://127.0.0.1:81/cgi-bin/<скрипт>?<исходный URL> или CGI самого плагина. Скрипты на порту 81 входят в codecpack, поэтому плагины проверяют или ставят его.

Задача Приём Грабли и ограничения Плагины и claims
Проиграть FLV http://ts://127.0.0.1:81/cgi-bin/flv.sh?<URL> для URL с .flv (без flv.sh) MoviesTape формирует такой URL, хотя www/cgi-bin/flv.sh в его пакете нет Anidub.Com (код)230; youtube_api/folder_cache (код)202; MegaTorrents (код)199; Entware/Wallpaper (код)203; Smart_* (MoviesTape, Vimeo) (код)231
Проиграть RTMP, RTSP, FLV в IPTV http://ts://127.0.0.1:81/cgi-bin/<протокол>.sh на входе liteIPTV проверяет /codecpack и предлагает поставить Codec_install (на Android сразу запускает) liteIPTV (код)232
RTMP своим CGI CGI плагина www/cgi-bin/rtmp: распаковывает ffmpeg и librtmp из data/, отдаёт video/H264 и гонит ffmpeg -re … -f mpegts путь зашит под каталог Kaban_TV; скрипт убивает все ffmpeg Kaban.tv (код)233
HLS через локальный прокси http://ts://127.0.0.1:81/cgi-bin/hls.sh?<URL> (YouTube заменяет m3u8 на m3u9); для moonwalk — hls_moonwalk.sh из codecpack нужен codecpack; у moonwalk фолбэк с /persistfs/codecpack на /D/codecpack YouTube (Smart_*) (код)234; youtube_api/folder_cache (kinokrit, kinolist) (код)235
Отдать m3u8 через свой CGI CGI do3?path=<url> качает манифест curl и отдаёт как application/vnd.apple.mpegurl применяется для player.tree.tv при mUrl::get_versions() == false MegaAnime (код)236; Entware/Wallpaper (код)203
Перемотка аудиопотока на Sigma proxy.sh берёт позицию из строки «SAES: successful seek to» в /tmp/run/shell.log и шлёт Range: bytes=<позиция>- зависит от формата строки shell.log Smart_* (knigavuhe) (код)237
Транскодировать в MP3 proxy2.sh: killall -e ffmpeg, затем /codecpack/bin/ffmpeg -f mp3 pipe:1 — Smart_* (knigavuhe) (код)238
Склеить DASH-видео и аудио CGI yt.sh режет поток на 5-секундные сегменты ffmpeg -ss … -c copy -f mpegts; потребитель — dash_to_hls() в shell_ext/music/link_api.php прошивки tv188b r24 путь к ffmpeg жёстко /flashdata/plugins/ffmpeg_install/bin; скрипт убивает все ffmpeg (kill -9) служебные установщики hdtv (код)239
Поставить codecpack одной кнопкой скрипт качает codecpack.zip, выбирает /persistfs, /flashdata или /D, поднимает httpd -p 81 и дописывает его в boot-скрипт условие выбора /flashdata записано с синтаксической ошибкой; в uninstall-скрипте проверка [ ! -x "BOOTRTMP" ] смотрит на литерал EvolutionTV (код)240
Подать поток через локальный receive5 get_tv_stream_url при URL, начинающемся с /, запускает bin/play.sh и, если он что-то вывел, отдаёт http://ts://localhost:8081<URL> с dune_params; play.sh поднимает receive5 -h 18883, если процесс ещё не запущен (бинарник из $FS_PREFIX/firmware/bin/receive5, иначе из пакета); строки ELF receive5 содержат usage с -h <http_port> и сообщения HTTP-сервера порт URL 8081 ≠ 18883; play.sh убивает receive5, если у него больше 3 сокетов; check_stop.sh раз в 5 с гасит его при непустом player_state, не равном file_playback; firmware/bin/receive5 есть в APK r24 dune-hd-tv (код)241
Собрать rtmp-URL из распакованного JW player streams/javedecoder.php распаковывает eval-пакет (unpackjs(), decode()); flashx после POST и sleep(10) берёт meta base и video src из .smil и собирает http://ts://127.0.0.1:81/cgi-bin/rtmp.sh?<base> playpath=<src> swfUrl=…; live-stream.tv делает то же из streamer и file у flashx при неудаче первого шаблона smil.*?file.*?" скачивается отдельный .smil; swfUrl зашит youtube_api/folder_cache (код)242

7.3. Где получать URL: get_*_playback_url, get_*_stream_url, резолверы

URL можно отдать сразу в описании канала или серии, а можно вычислять перед стартом. Признак playback_url_is_stream_url говорит, считать ли playback_url готовым потоком; когда он false, плагин вызывает свой get_tv_stream_url/get_vod_stream_url (схема действий — guide/playback.md §1.2–§1.3).

Задача Приём Грабли и ограничения Плагины и claims
Live без своего кода унаследованный AbstractTv::get_tv_playback_url возвращает streaming_url канала архив и protect_code не учитываются; у pirates_* унаследованный get_tv_stream_url бросает исключение Peers.TV (код)243; pirates_* (код)244
Один поток из конфига get_tv_playback_url при каждом вызове читает streams.stream из конфигурации channel_id, archive_ts и protect_code игнорируются Kohana-канал (код)245
Разрешать URL перед стартом playback_url_is_stream_url = false, get_tv_stream_url запрашивает API с &format=json и берёт playback_url из ответа id канала вырезается подстрокой после infohash= без проверки (см. §19) AceStreamSearch (код)246
Получить URL у API провайдера get_tv_playback_url делает запрос с id канала (и archive_ts/gmt, protect_code) и берёт URL из JSON Moi-Dom.tv режет ответ по " :" и чинит http/ → http:// GlobalTV (код)247; Moi-Dom.tv (код)248
Не закэшировать протухший URL кэш URL воспроизведения сбрасывается после одного использования — GlobalTV (код)249
Построить HLS-URL по смещению offset = time() - archive_ts (0 для live) прямо в пути манифеста streaming_url канала не используется WeburgTV (код)250
Подставить ключ или query на лету заменить в URL метку (00000000000000 → ott_key, localhost → хост) или дописать query, снятый со страницы канала у plugtv при недоступной странице переменная параметров остаётся неопределённой zlostnyi (edem) (код)251; plugtv (Трофей HD) (код)252
Разнести каналы по серверам для группы каналов хранить отдельный сервер в cookies — zlostnyi (antifriz) (код)253
Проиграть PLS скачать .pls, разобрать parse_ini_string, взять File1 101.ru держит listenKey в cookies 101.ru (код)254
Отдать live-поток через VOD пункт с действием PLUGIN_VOD_PLAY_ACTION_ID → get_vod_info возвращает PluginVodInfo с одной серией и playback_url_is_stream_url=true — Twitch TV (код)255
Вынести парсеры видеохостингов внешний link_api.php скачивается в /tmp/plugins/ и подключается; поток даёт mUrl::get_link(url, quality) у HdKinoTeatr.Com резервного корневого link_api.php в пакете нет Smart_* (код)256; youtube_api/folder_cache (код)257
Не гонять готовый HLS через резолвер для .m3u8 вернуть входной playback_url, иначе mUrl::get_link — Smart_* (Futbik.Net, MegaMult.Net, KinoHold.Com, BestKino) (код)258
Выбрать резолвер по провайдеру по префиксу (EpisodId_) вызвать <класс>::getIframe; по доменной сигнатуре iframe выбрать videocdn, Collaps, HDVB, Kodik; по kpId — yohoho-поиск список доменов зашит в коде Smart_* (код)259
Выбрать качество video_quality из cookies; Filmix_API при отсутствии нужного качества понижает до первого доступного, Zona.mobi берёт lqUrl при video_quality=1 у старого youtube_api только hd1080/hd720/medium и itag 18, 22, 37, 38 Smart_* (Filmix_API, Zona.mobi) (код)260; youtube_api/folder_cache (код)261
Не упасть на долгом разборе set_time_limit(0) в резолвере и главной функции — youtube_api/folder_cache (код)262
Закрыть канал кодом get_tv_playback_url возвращает false либо заглушку http://mp4://…/1.mp4, если protect_code не совпал liteIPTV хранит PIN в cookie (по умолчанию 0000) EvolutionTV (код)263; liteIPTV (код)264
Отдавать URL лениво при playback_url_is_stream_url=false get_vod_stream_url вызывает mUrl::get_link(playback_url, качество), только если URL или качество отличаются от предыдущих, иначе отдаёт сохранённый результат; качество — filmix_quality для filmix, иначе video_quality (по умолчанию 1) get_vod_info строит серии с полями name/playback_url/playback_url_is_stream_url и пропускает playback_url=dummy; буферизация — 3000 мс Bazinga3 (код)265
Получить ссылку через Zona getZonaMobiIframe(..., 'playbackUrl', 'https://w113.zona.plus') шлёт HEAD на /ajax/video с зашитым Cookie ZONAMOBI=…, затем GET /ajax/video/<id>?client_time=<из dune-club.info/tts> с JSON-заголовками ответ, содержащий dune-club.info, считается ошибкой (заглушка) Online Movies (rus) (код)266
Включить видео-предпросмотр канала в playback_urls добавляется plugin_tv://globaltv/<MediaURL> с preview=1 только при доступном pf_playback и не-adult канале; в get_tv_info наличие preview переключает выдачу с channels_file на встроенные groups/channels — одна группа и один канал с playback_url_is_stream_url=1 для adult и имён с префиксом XXX предпросмотра нет GlobalTV (код)267
Выбрать качество ТВ-потока combobox stream_type (local «Наилучшее», local_low «Хорошее», hls «Авто», по умолчанию hls) сохраняется в plugin_cookies->stream_type; в ветке $restrict_ch (канал не защищён, родительский контроль выключен или код 0000, либо protect_code верен) для не-passive канала get_tv_playback_url запрашивает v2/channels/<id>/stream с type из forced_stream_type или этой настройки и берёт hls, иначе local, иначе local_low иное значение заменяется на hls dune-hd-tv (код)268
Показать заглушку вместо потока при исключении «403» возвращается http://mp4://media.zt.platform24.tv/Dune/geo_matras.mp4, иначе .../Dune/matras.mp4; для канала со streaming_url passive — тоже matras.mp4 — dune-hd-tv (код)269
Разделить playback URL и stream URL get_tv_stream_url возвращает playback_url без изменений, а URL потока формирует get_tv_playback_url → generate_stream_url($channel_row, $archive_tm_sec) — ProIPTV (код)270
Вытащить URL из JS-строки для veterok.tv прямой URL берётся из JavaScript-строки files["N"]="…"; YouZeeK.com/?sid= и youtube-embed заменяются на youtube watch?v= — youtube_api/folder_cache (код)271
Разобрать youwatch: embed и страница embed-декодер возвращает строку между file: " и следующей кавычкой; обычная страница разбирает скрытые op/usr_login/id/fname/referer/hash/imhuman, после sleep(11) шлёт POST и собирает http://<url[3]>.youwatch.org:<url[2]>/<url[1]>/video.mp4 из file: или блока mp4\|video две разные ветки одного хостинга youtube_api/folder_cache (код)272
Резолверы FilmixNext, Kinogo и KinoTochka Filmix получает ссылку через FilmixNext::getIframe (карточка, сезон, перевод), при .m3u8 возвращает URL без изменений, иначе mUrl::get_link; Kinogo.so — по числовому id из /<id>- в URL карточки, серии через getEpisodesKinoGo; KinoTochka.Club — kinotochka::getKinoTochkaIframe с режимами doc/seasons/episodes и cookie-файлом tmp_dir_path/kinotochka_cooki у Filmix качество 1080/1440p/2160p предлагается только при успешном входе, 1440p/2160p — при HD::get_dash_platform_kind; у KinoTochka постер идёт через CGI do?img= Smart_* (код)273
Добавить источники MoviesTape в обход карточки parse_video_page разбирает fs.to iframe (file : '…', pl : '…', f-play/rel); parse_other_sources добавляет moonwalk по kp_id (videos.json, iframe_url как серия, CamRip при camrip=1) и tree.tv (test.tree.tv/api по name_original/name, getfilm по page_id при совпадении year, качества 1080→360) токен moonwalk зашит в коде; структура ответов API на живых сервисах не проверялась Smart_* (MoviesTape) (код)274
Разобрать player_links Filmix parse_video_page запрашивает HOST_API_URL . "/post/<video_id>?" и разбирает JSON: при пустом playlist перебирает movie (title/translation/quality из квадратных скобок), иначе — сезоны, переводы и серии, заменяя %s на [<qualities>] структура ответа API не проверялась на живом сервисе Smart_* (Filmix_API) (код)163
Подключить dune_stb_api lib/dune_stb_api.php — «Dune STB API» Brigadir (2017, обновление 2019) с обёртками FolderViewItemParams/FolderViewParams, get_platform_kind, get_android_platform, get_product_id, get_firmware_version, get_parsed_firmware_ver, send_ir_code, get_player_state в эталоне файла нет; в Smart_config.php используется только get_parsed_firmware_ver Smart_* (Filmix_API) (код)275
Подписать запросы через dune-club.info link_api обращается к dune-club.info: /echo — подпись YouTube, /tts2 — Zona RCPC, /tts — client_time для Zona внешний сервис Smart_* (link_api) (код)276

7.4. Несколько источников, multicast-прокси и автопереключение

Задача Приём Грабли и ограничения Плагины и claims
Перебирать источники канала циклический индекс по списку URL канала, сброс при смене канала; закреплённый источник приоритетнее — altIPTV (код)277
Запоминать выбранный источник выбор хранится в ch_select[id] и общем ch_select_all; после пяти переключений — циклический перебор — liteIPTV (код)278
Помнить источник канала выбор пишется в cookie src_<channel_id>, затем tv_play — Novosib-iptv (код)279
Пустить multicast через UDP-прокси udp://@…/RTP → http://ts://<proxy_ip>:<proxy_port>/udp/ (или /rtp/) при use_proxy=yes — altIPTV (код)280; Kaban.tv (код)206
Найти UDP-прокси сканированием перебор адресов /24 через fsockopen с тайм-аутом 0,2 с, найденное — в файл; диапазон берётся из whois Novosib-iptv запускает сканер в фоне только при наличии /codecpack/bin/php и не чаще раза в 100 с Novosib-iptv (код)281; altIPTV (код)282
Сменить источник при долгой буферизации пороги open/start/seek/buffering и «частая буферизация» (6 раз за 60 с); по истечении — SwitchDialog, который берёт позицию из plugin_vod_stop_position и открывает следующий торрент по умолчанию включено только при /config/online_movies_full.flag; диалог открывается только при активном OSD Online Movies (TV Series) (код)283
Переключиться на следующий поток при ошибке повторный запрос того же playback_url с тем же качеством инкрементирует $counter: если предыдущий ответ — массив, берётся $stream_urls[$counter], иначе отдаётся тот же результат; при отсутствии элемента или $counter > 4 — заглушка http://mp4://dune-club.info/plugins/update/1.mp4 после пяти попыток — mp4-заглушка Bazinga3 (код)284

7.5. Архив ТВ: шаблоны catchup в URL

Здесь только то, как плагины строят URL архива; откуда берутся archive_ts, EPG и атрибуты плейлиста — §8.

Задача Приём Грабли и ограничения Плагины и claims
Выбрать тип catchup приоритет: канал > настройка пользователя > M3U/провайдер; шаблоны shift (utc=…&lutc=…), timeshift, archive, flussonic, xtream codes у flussonic окно 14400 с, у xtream в пути /240/ ProIPTV (код)285
Архив flussonic заменить имя манифеста на video-<ts>-<длительность>.m3u8, archive-<ts>-<длительность>.ts или .mpd длительность зашита (1800–10800 с, по сервису) zlostnyi (код)286
Архив по catchup-source взять catchup-source канала из плейлиста и подставить video-<ts>-7200 вместо video-{start}-{duration} длительность фиксирована; без catchup-source URL не меняется zlostnyi (bcu, lightiptv) (код)287
Архив параметрами ?utc=<ts>&lutc=<now> либо ?archive=<ts>&lutc=<now> вариант archive должен понимать сервер zlostnyi (fox, edem, shura) (код)288
Архив шаблоном из базы URL архива хранится как PHP-шаблон с $start/$stop/$offset/$time и вычисляется через eval eval над данными; $stop ограничен четырьмя часами liteIPTV (код)220
Длина архивного фрагмента серверу передаётся duration_m — до конца передачи по EPG, но не меньше 3600 с — GlobalTV (код)289

7.6. Позиция, «продолжить», события и OSD во время воспроизведения

История просмотра и «Продолжить» в каталоге — §6.6.

SDK предлагает запоминать позицию по GUI_EVENT_TIMER, сохранять по GUI_EVENT_PLAYBACK_STOP и подставлять в initial_position_ms (SDK)290, а поле playback_position файла /tmp/run/ext_command.state называет временным решением вне официального API (SDK)291. OSD и информационный блок — действия PluginUpdateOsdAction и PluginUpdateInfoBlockAction (SDK)292; поведение на прошивках — guide/playback.md §4.

Задача Приём Грабли и ограничения Плагины и claims
Запомнить позицию и продолжить таймер VOD читает /tmp/run/ext_command.state; позиция сохраняется по playback_stop и отдаётся в initial_position_ms позиция ближе 5 с к концу (или pos+5 ≥ duration) сбрасывается в 0; altSource не хранит прогресс для части аудиоформатов (wav, ogg, flac…) и картинок altSource (код)293; Smart_* (код)294; YouTube (Smart_*) (код)295
Вести историю просмотра на первом тике таймера или по playback_stop добавить запись в историю altSource обрезает историю до 310 записей; Smart_* удаляет последний элемент, только когда размер ровно 31 altSource (код)296; Smart_* (код)297
Отметить просмотренное вручную переключать viewed_items[<серия>] кнопкой у altSource переключается viewedItemsArr[series_id], и только для видео и аудио altSource (код)298; Smart_* (код)299
Читать состояние плеера из ext_command.state разбор key = value с умолчаниями mark.it читает значения из фиксированных строк 5, 7, 8, 13, 14 Screenshoter (код)300; служебные установщики hdtv (код)301
Свои клавиши в плеере PluginVodInfo::actions с GUI_EVENT_KEY_*, GUI_EVENT_PLAYBACK_STOP, GUI_EVENT_TIMER; timer.delay_ms 500 YouTube добавляет PLAYBACK_GOING_TO_SWITCH, PLAYBACK_SWITCHED, KEY_SUBTITLE, KEY_INFO, KEY_TOP_MENU только при HD::get_versions() === true; в Twitch TV chat/stop_irc — control_id YouTube (Smart_*) (код)302; Twitch TV (код)303
Остановить движок по STOP GUI_EVENT_PLAYBACK_STOP → command_url?method=stop, затем очистка инфоблока ветки playback_switched/playback_going_to_switch есть, но их регистрация закомментирована AceStreamSearch (код)304
Часы, прогресс, инфо поверх видео update_osd + change_behaviour с таймером 1000 мс; полоса прогресса из .aai-картинок altSource хранит настройку OSD с привязкой к MAC; YouTube без данных берёт позицию из ext_command.state Torrent Center (код)305; altSource (код)306; YouTube (Smart_*) (код)307
Свои субтитры строка субтитров по playback_position из ext_command.state, перенос по 80 символов, OSD с таймером 500 мс — YouTube (Smart_*) (код)308
Статистика потока в инфоблоке таймер 5 с читает stat_url и отдаёт PluginUpdateInfoBlockActionData «N peers, M MBit/s» перезапуск таймера через CHANGE_BEHAVIOUR_ACTION_ID AceStreamSearch (код)309; Torrent Center (зелёная кнопка переключает статистику TorrServer/Peerflix) (код)310
Ждать начала трансляции диалог с timer(1000), на 1-м и каждом 10-м тике повторный запрос URL; пока приходит заглушка — ждать, иначе vod_play() по сообщениям пользователей (первый пост темы), функция появилась в версии 6.7.7 YouTube (Smart_*) (код, форум)311
Взять позицию из своей истории Movie::get_vod_info сливает viewedItemsTmpArr в viewedItemsArr и для серии с записью отдаёт префикс [ПРОСМ] при viewed, иначе initial_position_ms = p × 1000; отрицательная позиция и позиция в пределах 5 с от конца сбрасываются в 0 — Bazinga3 (код)312
Восстановить позицию после переключения на playback_switched при ims == 0 и сохранённом saveSeasonTimes[plugin_vod_id] плагин опрашивает http://127.0.0.1:<port>/cgi-bin/do?cmd=status до 130 раз по 50 мс до playback_state=playing, затем на Android ждёт ещё 0,8 с и шлёт cmd=set_playback_state&position=…&speed=256 до 130 опросов по 50 мс; ветка только при ims == 0 Bazinga3 (код)313
Записать экран во время воспроизведения bin/rec.sh запускает screenrecord --size 1280x720 в фоне; stop_rec ищет pidof screenrecord и шлёт kill -2; status_rec отсчитывает 180 секунд; состояние (путь, время старта) — JSON rec_data в tmp_dir_path через HD::save_items_tmp при HD_APK запись запрещена Screenshoter (код)314
Включать кнопки и OSD по условиям при проигрывании VOD/YouTube Movie::get_vod_info отдаёт actions с playback_stop watched, D_BLUE sleep и таймером 3000 мс; B_GREEN sound_info — только при наличии /firmware/bin/ffmpeg или /codeckpack/bin/ffmpeg, CLEAR yt_search — только при HD::get_versions() = true; OSD обновляется при HD::get_versions() = true, use_osd != 0 и id без youtube — MegaRadio (код)315

7.7. Запуск вне VOD/TV: launch_media_url, m3u, файлы и браузер

Задача Приём Грабли и ограничения Плагины и claims
Файл как VOD с сериями и resume видео/аудио → vod_play с сериями из файлов того же типа (file://…); образы, плейлисты, BDMV/VIDEO_TS → launch_media_url — altSource (код)316
Плейлист из нескольких файлов записать m3u в www/ плагина (sync) и запустить launch_media_url на plugin_file://…m3u или playlist_play с индексом даже один файл заворачивается в m3u DunePlexCatalog (код)317
Открыть DVD/BD как диск по /BDMV/, /STREAM/, /VIDEO_TS/ в пути вернуть родительскую папку и запустить её эвристика по строке пути DunePlexCatalog (код)318
Отдать файл с удалённого торрент-клиента сопоставить путь сервера с локальным (paths_map from→to; /transmission → storage_name://) и launch_media_url одна пара на подключение; пустой результат сопоставления проверяется только на is_null и уходит в launch_media_url RemTor (код)319
Запустить поток с другого процесса IP Control cmd=start_file_playback с media_url (по cron — после ir_code включения) по словам автора, управление MPD-потоком отстаёт на пару секунд; в SleepWake коды включения в двух ветках разные MPD (код, форум)320; служебные установщики hdtv (код)321
Открыть во внешнем плеере Android am start -a android.intent.action.VIEW -t <mime> -d <url>; URL без dune_params и обёрток ProIPTV скрывает пункт при is_limited_apk() ProIPTV (код)322; MegaTorrents (код)323
Вызвать штатный плеер Dune из своего приложения копия входящего интента с компонентом com.dunehd.app/com.dunehd.shell.PlayerProxyActivity; снять FLAG_ACTIVITY_NEW_TASK, FORWARD_RESULT, PREVIOUS_IS_TOP; отключить свой resume Dune extra com.dunehd.playback.dune_params = skip_resume_position:1 на tv188b r25 явный запуск PlayerProxyActivity без action VIEW VOD не запустил (устройство r25)324; действие skip_resume_position в базе не проверено Jellyfin Bridge (код)325
Отдать серии нативному плееру из веб-приложения каждая серия с playback_url_is_stream_url=true, initial_series_ndx, initial_position_ms, buffering_ms 3000, keep_playing_on_reenter=true — Lampa bridge (код)326
Видео из HTML-приложения объект application/x-dune-stb-api: init(), enableVideo(), play(url), опрос getPlaybackState() без успешного init() и IP amediateka показывает ошибку; выход — exitBrowser веб-плагины (код)327
Запустить FlashLite-приложение media_url вида swf://{URL}[:::{параметры}] параметры SWF-URL документ отсылает к внешнему flashlite_info.txt; поддержка по платформам — §19 веб-плагины (SDK)328
Запустить URL через GUI ActionFactory::launch_media_url возвращает LAUNCH_MEDIA_URL_ACTION_ID с url и post_action; в обработчике playDirectly проверяется bareword is_stream_url, после чего возвращается launch_media_url(playback_url) runtime-эффект не проверен Torrent Center (код)329
Собрать действие запуска ActionFactory собирает массивы действий: tv_play — только PLUGIN_TV_PLAY_ACTION_ID, vod_play(vod_info) — PLUGIN_VOD_PLAY_ACTION_ID, launch_media_url(url, post_action) — LAUNCH_MEDIA_URL_ACTION_ID, launch_m3u(url, start_index) — PLAYLIST_PLAY_ACTION_ID — Widget Ext (код)330
Запускать фильм с телефона PHP-код плагина не вызывает IP Control: обращения к /firmware/ext_command/cgi-bin/do есть только в rc_extension.bash (exec_do, вызов закомментирован) и reboot.bash (cmd=ir_code) механизм запуска в PHP-коде плагина не найден — §19 Dune Remote Control (код)331
Открыть папку и сразу включить серию get_vod_info отдаёт plugin_vod_info из LampaDuneBridge::vod(LampaDuneBridge::load()); на command=play плагин возвращает plugin_open_folder с media_url=session и post_action=plugin_vod_play — Lampa bridge (код)332
Назначить ENTER/PLAY запуск серии VodSeriesListScreen эталона назначает ENTER/PLAY действию ActionFactory::vod_play, SELECT — select, зелёную — viewed, жёлтую — qlt_item; локальный ActionFactory::vod_play эталона кладёт vod_info в PluginVodPlayActionData::vod_info, а Movie::get_vod_info эталона отдаёт PluginVodInfo с series, initial_series_ndx, buffering_ms, actions, timer.delay_ms=5000 и initial_position_ms — Smart_* (код)333
Показать фотографии Plex через transcode экран фото получает список через PL::get_photos_list и кладёт в m3u URL transcode Plex; ENTER (control_id play) запускает launch_media_url на m3u с выбранного индекса, Play (control_id show) открывает одиночный URL; обложки и фоны запрашиваются через /photo/:/transcode с width, height, url=<BaseUrl><pic_url> и кэшируются (thumb/info, фото — photo) для папки (file = null) открывается папка DunePlexCatalog (код)334
Собрать плейлист YouTube из текущей папки при create_playlist == 1 (по умолчанию), l == false и заданном urls.video_url get_vod_info перестраивает series_list из адреса папки (add_url_items_series_data) и берёт имя, описание и постер плейлиста из родительского media_url; иначе — имя, описание и первую картинку фильма — YouTube (Smart_*) (код)335

7.8. Отслеживание воспроизведения из Android-приложения: cmd=status

Приложения рядом с плеером (Jellyfin Bridge, Lampa bridge) узнают позицию опросом статуса плеера и сами решают, чьё это воспроизведение и когда оно закончилось.

Задача Приём Грабли и ограничения Плагины и claims
Разобрать статус десять ключей (player_state, playback_state, playback_url, playback_position, playback_duration, android_app_active, video_enabled и др.); позиции — неотрицательные числа, секунды → мс; флаги — Boolean или 1/0/true/false отрицательные и нечисловые значения → null Jellyfin Bridge (код)336
Понять, идёт ли и видно ли воспроизведение активно: не stopped и (позиция известна или player_state на _playback); видимость — по android_app_active, иначе по video_enabled/playback_window_fullscreen; перематывать — только при активном, видимом и duration > 0 — Jellyfin Bridge (код)337
Сопоставить статус со своим медиа по имени файла из playback_url (для http(s) хвост после ?/# отрезается), по playback_caption или полному URL если ожидаемых значений нет, своим считается любой активный статус Jellyfin Bridge (код)338; Lampa bridge (player_state=file_playback и identity(playback_url)) (код)339
Принимать только правдоподобную позицию числовые позиция и длительность, duration > 0, position ≤ duration + 5; при остановке сохранить последний реальный sample, а не 100 % — Lampa bridge (код)340
Применить resume и не откатить прогресс подтверждение перемотки в пределах 5000 мс, повтор SEEK не чаще 2 с, после 10 попыток — сдаться; позиции около нуля до подтверждения игнорировать; для http(s) повторить перемотку при сбросе в 15-секундном окне — Jellyfin Bridge (код)341
Определить конец просмотра после первого наблюдения воспроизведения считать непрерывное несовпадение статуса; ≥1000 мс → один раз PLAYBACK_ENDED совпавший статус сбрасывает отсчёт Jellyfin Bridge (код)342
Различить серии, которые веб-приложение не разобрало обёртка парсера имён: шаблоны S01E01, 1x01, E01, «Серия N»; если номер не найден и файлов несколько — ключ прогресса = путь файла по комментарию автора в коде (forum), Lampa даёт всем сериям сезона episode 0 Lampa bridge (код, форум)343
Вернуть пользователя в приложение после просмотра на PLAYBACK_ENDED BridgeActivity на главном потоке вызывает returnToJellyfin: при setPlaybackResult() == true и activityManager != null — ActivityManager.moveTaskToFront(getTaskId(), 0) (лог «Bringing the existing Jellyfin task to the foreground», SecurityException логируется), затем finish(); при уже доставленном результате метод ничего не делает — Jellyfin Bridge (код)344

7.9. DRM: Verimatrix и DASH с ключом

Задача Приём Грабли и ограничения Плагины и claims
Передать параметры Verimatrix ini rostelecom_verimatrix.ini и сертификат в корне пакета ini ссылается на rootcert.pem, а файл в пакете называется rostelecom_rootcert.pem (в обоих плагинах) FREE TV (код)345; Novosib-iptv (код)346
Определить поддержку DRM наличие /firmware/lib/libvmclient.so и модель не из solo4k/sololite/duo4k; /tmp/verimatrix/hls_verimatrix_web.properties создаётся или удаляется по шаблону _r<цифра> в версии прошивки на прошивках с _r каталог /tmp/verimatrix удаляется FREE TV (код)347
Ключ и флаг DRM в URL decryption_key (MPD при cenc и DUNE_FIRMWARE_BN >= 21) или vmx_drm:1 (HLS) в dune_params наборы разные по сервисам FREE TV (код)224
DASH с правкой манифеста только на Android/APK и branch_num >= 21: поправить cenc:default_KID, отдать через локальный /index.mpd; иначе заглушки not_support.ts/update_firmware.ts ветка правки есть только для strm.yandex.ru/*.mpd FREE TV (код)348
Подогнать URL под сервис отдельные ветки преобразования URL для перечня сервисов и доменов (peers.tv, beeline, edem, flussonic, ok.ru, jwplatform и др.) перечень зашит в коде FREE TV (код)349
Объявить DRM веб-приложения drm_defs/drm_def с type=verimatrix_web в манифесте params пустые; смысл id не разобран веб-плагины (код)350

8. ТВ, IPTV, плейлисты и EPG

Объект: ТВ-режим PHP-плагинов: IPTV-плагины (altIPTV 5.2.9, ProIPTV 9.1, WeburgTV 2.1.0, AceStreamSearch, AllTV 1.4.0, EvolutionTV 1.4.0, FREE TV 1.1.4, Юрта ТВ 1.0.1, Kaban.tv, liteIPTV 1.8.5 и liteIPTVplus, Moi-Dom.tv 0.9.4, Novosib-iptv-2, Peers.TV 2.0.0, семейство zlostnyi, GlobalTV 260130_1351), одноканальные плагины (rain_, plugtv, Kohana-канал) и радио, отданное как ТВ (101.ru, MegaRadio, pirates_, surface_*). Уровень — code (отдельные строки — forum); платформа и прошивка исполнения не установлены. Это факты кода плагинов, а не поведение прошивки.

ТВ-режим плагина держится на трёх вызовах оболочки: get_tv_info() отдаёт PluginTvInfo с группами и каналами, get_tv_playback_url() — URL канала (live или архив), get_day_epg() — программу на день; минимум для ТВ по SDK — get_tv_info() и get_tv_playback_url() (SDK)351. Поля PluginTvInfo/PluginTvChannel, разделение playback URL и stream URL и каркас shell_ext прошивки описаны в guide/playback.md §1.3, параметры dune_params — там же, §2.1. Ниже — как плагины собирают список каналов из плейлистов и API, разбирают M3U/XSPF, строят архив и добывают EPG. Экраны и виды папок — §4, хранение cookie и кэша — §10, фоновые задачи (cron) — §13.

8.1. Каркас AbstractTv: PluginTvInfo, каналы, группы, радио как ТВ

Большинство плагинов не заполняют PluginTvInfo вручную, а наследуют библиотечный AbstractTv и описывают канал классом поверх DefaultChannel; так же отдают платформе радиостанции.

Задача Приём Грабли и ограничения Плагины и claims
собрать PluginTvInfo из объектов AbstractTv::get_tv_info строит PluginTvChannel (id, caption, group_ids, icon_url, number, архив, защита, дни EPG, буферизация, timeshift_hours, playback_url_is_stream_url), PluginTvGroup и PluginTvInfo в копии 101.ru get_tv_info() возвращает null, полная реализация — в копии DI altIPTV (код)352; liteIPTV (код)353; 101.ru (код)354
выбрать режим «канал в одной / в нескольких группах» константы MODE_CHANNELS_1_TO_N (false) и MODE_CHANNELS_N_TO_M (true); избранное и playback_url_is_stream_url — аргументы конструктора у rain_* своё private $mode не присвоено, и в show_group_channels_only уходит null 101.ru (код)355; MegaRadio (код)356; Юрта ТВ (код)357; rain_* (код)358
описать канал своими полями DemoChannel расширяет DefaultChannel (number, past_epg_days, future_epg_days, has_archive, epg_cod, description); SmartChannel хранит number, past_epg_days, future_epg_days, has_archive и buf_time SmartChannel::get_timeshift_hours всегда 4, а SDK называет timeshift_hours нереализованным (SDK)359; у plugtv epg_cod и description читаются из list.xml, но нигде не используются 101.ru (код)360; FREE TV (код)361; MegaRadio (код)362; plugtv (код)363
заполнить PluginTvInfo вручную, без загрузки списка канал — массив в конфиге и класс implements Channel; группы, каналы, initial_channel_id из media_url, избранное и архив выключены каналы из зашитого в конфиг массива (у Kohana — один), номер k+1 rain_* (код)364; Kohana-канал (код)365
дать выбор качества одного канала четыре tv_channel («Высокое качество», «Среднее качество», «Низкое качество», «Авто качество») в одной категории в list.xml нет number, hide, archive; ch_hide читается, но не используется plugtv (код)366
не уронить плагин при переключении канала при одновременных channel_id и group_id в media_url get_tv_info оставляет в groups только текущую группу обоснование — комментарий автора о падении AceStreamSearch (код)367
пронумеровать каналы последовательный номер с 1 по порядку ответа поиска сортировка по номеру отключена: usort закомментирован AceStreamSearch (код)368; WeburgTV — номер -1 (код)369
отдать радиостанции как ТВ-каналы AbstractTv + DemoChannel/SmartChannel в режиме MODE_CHANNELS_N_TO_M; станции — каналы со своими полями (номер, дни EPG, архив) у MegaRadio playback_url_is_stream_url=false 101.ru (код)370; MegaRadio (код)356; pirates_* (код)371; surface_* (код)372
описать контракт ТВ в своей библиотеке интерфейс Tv (каналы, группы, TV/EPG, архив, избранное, hooks) и EpgIterator это контракт, а не реализация загрузки каналов Widget Ext (код)373
Сверить копию AbstractTv с r24 AbstractTv плагина имеет публичный конструктор с favorites_supported; r24 реализует Tv и имеет protected-конструктор с mode, favorites_supported, playback_url_is_stream_url; get_fav_channel_ids плагина отбрасывает пустые элементы через get_ids_from_comma_split_str, r24 возвращает preg_split без фильтра — GlobalTV (код r24)374
Сверить TvFavoritesScreen с r24 TvFavoritesScreen плагина принимает tv и folder_views, r24 — типизированный Tv и берёт виды через get_tv_channel_list_folder_views; ENTER/PLAY у плагина — create_action(play_tv), у r24 — ActionFactory::tv_play(); канал плагин читает через get_channel_by_id как массив с id/name, r24 — через get_channel с get_id/get_title — GlobalTV (код r24)375
Сверить AbstractEpfsHandler с r24 поля plugin_name, dir_path, base_tmp_path, tmp_epfs_path в плагине private static, в r24 protected static; get_epfs_ts_path в плагине всегда dir_path/id=tv, r24 выбирает tmp_epfs_path/dir_path и id=main; write_data_ts без ts — make_monotonic_ts (%010d.%06d) против sec.usec; RMC — rows_menu_config.json в каталоге плагина против rows_menu_config_<name>.json в EPFS_BASE — GlobalTV (код r24)376
Сверить Conf и DefaultArchive с r24 Conf::set_default в плагине печатает предупреждение о недостающем ключе, в r24 hd_print закомментирован; DefaultArchive при чтении versions.txt плагин вызывает HD::http_get_document только с URL, r24 передаёт ещё HD::get_dune_opts(); чтение size.txt в плагине без try/catch, r24 ловит Exception и подставляет doc=null — GlobalTV (код r24)377
Сделать несколько видов списка каналов два элемента в массиве folder_views: у групп — сетка 7×2 и 2×4, у каналов — сетка 5×3 и один столбец на 10 строк; get_next_folder_view листает и пишет cookie screen.<screen_id>.view_idx, после последнего вида сбрасывает в 0 индекс хранится в plugin_cookies 101.ru (код)378
Показать подробности канала в списке ViewItemParams::item_detailed_info с %tr%station_title и, если desc непустой, %tr%station_description; starred — по is_favorite_channel_id; plugtv показывает поток, разрешение и источник EPG (epg_server: 1 — «Внешний источник», 2 — «От провайдера», иначе «N/A») newworld берёт разрешение из сегмента URL, trofey — из названия канала 101.ru (код)379; plugtv (код)380
Отдать каналы оболочке массивами get_tv_info отдаёт каждый канал массивом ExtTvChannel с id, caption, group_ids, icon_url, number, have_archive, is_protected, past_epg_days/future_epg_days, archive_past_sec, archive_delay_sec, buffering_ms, timeshift_hours, playback_url_is_stream_url=true и ext_epg_enabled=true; исключённые каналы — в группе id_bin («Корзина») — FREE TV (код)381
Собрать действия OSD и инфоблока ActionFactory::add_osd_image добавляет PluginOsdComponent с image_url, координатами и размерами; add_osd_text — текстовый компонент с PLUGIN_FONT_NORMAL, цветом "15" и text_halo=false; update_osd передаёт components и post_action; update_info_block — text_above, text_color, text_halo, text_y_offset, post_action; status — аргумент status у add_osd_image размеры по умолчанию 0 Widget Ext (код)382

8.2. Откуда взять список каналов и как разобрать M3U/XSPF

Список каналов плагины берут из файла в пакете, из API провайдера или из пользовательских плейлистов; M3U в разобранных плагинах чаще всего разбирают собственными регулярками.

Задача Приём Грабли и ограничения Плагины и claims
хранить список в пакете XML с корнем tv_info: tv_categories/tv_category и tv_channels/tv_channel локальный файл в пакете; у AllTV при cookie load_sex = yes читается другой файл AllTV (код)383; pirates_* (код)371; surface_* (LSS) (код)384; plugtv (код)385
получить список из API два запроса — categories/list и channels/list — и раскладка по category_id; либо один channel_list.php с группами Moi-Dom.tv пропускает группу с id 12 Юрта ТВ (код)386; Moi-Dom.tv (код)387
получить станции из JSON или XML-фида HD::http_get_document + json_decode или simplexml_load_string; у SomaFM — iconv из ISO-8859-1 Radiopotok разбирает ответ @json_decode; при недоступном фиде — исключение surface_* (код)388
Построить категории DI.FM по channel_filters id и name категории — из channel_filters (кроме name = All); картинка категории — images_compact первого канала категории без шаблона {?size,height,width,quality,pad} канал попадает в категорию только при наличии streaming_url 101.ru (DI.FM) (код)389
получить плейлист с сервера и пережить его недоступность запрос с User-Agent DuneHD/1.0 и заголовком SN: <серийный номер>, непустой ответ кэшируется в файл (base64 с префиксом md5(S/N)) при пустом ответе — локальная копия, без неё — сообщение и выход FREE TV (код)390
выбрать плейлист по стране country из /tmp/location_info.properties, затем /config/location_info.properties; варианты из внешнего XML состав зависит от внешнего XML altIPTV (код)391
читать плейлисты из пакета, каталога или по URL cookie m3u_type: 1 — playlists/ пакета, 2 — каталог m3u_dir, 3 — одна ссылка; у liteIPTV — каталоги, файлы, ссылки и pls.txt; altIPTV собирает входы из prov_pl, каталогов, pls.txt, SMB и прямых URL по m3u_type у Kaban.tv имя источника должно соответствовать /^[a-zA-Z0-9-_]+$/, пустая ссылка откатывает тип 3 на 1 Kaban.tv (код)392; liteIPTV (код)393; altIPTV (код)394
поддержать вложенные плейлисты строка, оканчивающаяся на .m3u, добавляется в список источников и загружается рекурсивно по сообщениям пользователей, так задумано как «самообновляемые плейлисты» (форум)395 liteIPTV (код)396
разобрать M3U регулярками #EXTINF: название после запятой, атрибуты tvg-logo/tvg-id/group-title/catchup-days (WeburgTV), logo/id/epg_shift/group_id (Kaban.tv, EvolutionTV), cn-id/cn-records/logotip (FREE TV); URL — следующая строка WeburgTV принимает URL, только если он начинается с http://, и не сбрасывает поля между итерациями; liteIPTV пропускает #EXTVLCOPT, #EXTGRP, #EXT-INETRA и перекодирует не-UTF-8 строки из WINDOWS-1251 WeburgTV (код)397; Kaban.tv (код)398; EvolutionTV (код)399; FREE TV (код)400; liteIPTV (код)401
разобрать M3U без регулярок explode по имя=" и strstr до кавычки; нет атрибута — значение по умолчанию — zlostnyi (код)402
принять сдвиг EPG из плейлиста атрибут epg_shift в часах с проверкой диапазона EvolutionTV принимает [-24, 24]; у Kaban.tv условие ошибочно и epg_shift всегда 0; altIPTV дважды сравнивает с -24 без верхней границы EvolutionTV (код)399; Kaban.tv (код)403; altIPTV (код)404
разобрать XSPF trackList/track: title, location, атрибуты из extension через xpath в пространстве имён myiptv Peers.TV читает extension в пространстве имён VLC и прибавляет к id 1; каналы привязываются по tid из вложенных элементов того же extension Kaban.tv (код)405; EvolutionTV (код)406; Peers.TV (код)407
разобрать M3U v1 и v2 сторонний m3uParser 2.1.3: #EXTM3U → v2 с длиной и заголовком из #EXTINF:, иначе каждая строка — URL без файла — die; при подключении error_reporting(0) и set_time_limit(15) перекрывают настройки вызывающего кода remote-control (код)408
отделить из плейлиста не-ТВ группа «Промо» отбрасывается до создания канала; группы «Медиатека»/«BCU Кинопремьера» пропускаются в ТВ и выбираются в VOD — WeburgTV (код)409; zlostnyi (код)410
кэшировать плейлист для архива ответ пишется в /tmp/playlist.m3u; для архива плагин перечитывает файл и ищет строку канала — zlostnyi (код)411
добавить DVB-T каналы в общий список media_url из dune_folder.txt в /persistfs/DVBT_channels или /flashdata/DVBT_channels экспортируется в dvb-t2.m3u — altIPTV (код)412
хранить данные плейлиста зашифрованными gzip-поток с XOR; при недоступном сервере — локальные копии data/02…data/04 — Novosib-iptv (код)413
Держать запасной M3U-источник I24hConfig::USE_M3U_FILE — режим списка из http://online.dune-hd.com/i24h2/m3u/iptv.utf8.m3u в этой версии режим выключен (USE_M3U_FILE = false) DUNE-HD.TV (код)414
Выбрать формат плейлиста по имени parse_playlist выбирает XSPF при совпадении /xspf/i в имени входа, иначе M3U; запись parse_m3u содержит URL, caption, logo, group, tvg_name, user_agent, dune_zoom, group_title, id, parental и epg_shift признак — имя входа altIPTV (код)415
Разобрать M3U и XSPF своими парсерами в M3U читает атрибуты logo, a_id, id, pass, epg_shift, group_id; в XSPF — title, location, myiptv:id, epg_shift, logo, group_id — Novosib-iptv (код)416
Добавить M3U поверх XML wwcam читает локальный channel_list.xml, затем добавляет каналы из двух M3U (https://iptvmaster.ru/webcams.m3u, https://iptvlist.ru/2762.m3u, строки EXTINF и URL) и tv_item из XML parse_m3u() и clean_up_text_for_display() определены, но load_channels() их не вызывает surface_* (wwcam) (код)417
Хранить RTMP-каналы в XML рядом с SWF rtmp-player — не плагин, а rtmps.xml и SWF; в rtmps.xml 40 элементов channel с name и link, все ссылки rtmp:// по словам 300n, ENTER показывает список каналов, RETURN выходит; версия 0.2 добавила неограниченное число каналов, управление звуком и формат 3x4 веб-плагины (код, форум)418

8.3. Идентификатор канала, склейка источников и группы

Id канала хранится в избранном (код)419, входит в имя файла кэша EPG (код)420 и в карту channel_ids.txt для внешнего EPG (код)421, поэтому его стабильность важна; плагины чаще всего выводят его из названия.

Задача Приём Грабли и ограничения Плагины и claims
получить стабильный id из названия md5 от названия в нижнем регистре без пробелов, кавычек и переводов строк (liteIPTV убирает ещё дефисы и точки); у link_api createIdKey переводит кириллицу в латиницу id зависит от названия; AllTV при отсутствии хеша в таблице channels_id даёт 1000 + порядковый номер AllTV (код)422; liteIPTV (код)423; Smart_* (link_api) (код)424; WeburgTV (код)425
совместить название и tvg-id id = base64(название) . "&&" . tvg-id; EPG берёт часть после && — zlostnyi (код)426
склеить один канал из нескольких плейлистов ключ — нормализованное название; URL хранятся по источнику, выбранный источник — cookie src_<ключ>, если он есть среди URL канала; у Novosib-iptv ключ — md5(strtolower(caption)) без пробелов, кавычек и переводов строк, URL — в global_channels[key]['urls'][source] одинаковые после нормализации названия склеиваются Kaban.tv (код)427; EvolutionTV (код)428; liteIPTV (код)429; Novosib-iptv (код)430
Различать каналы и дубли в ветке group_tv при group_tv=1/4 id канала — alt_<epg_shift>_<id>%<crc32 группы><crc32 названия>; при double_tv=2 добавляется crc32 URL имена и URL входят в id altIPTV (код)431
выбрать источник канала из меню popup_menu экрана каналов, пункт select_source_<src>, сохранение в cookie в ветке info Kaban.tv вызывает get_tv_stream_url с неверными аргументами Kaban.tv (код)432
связать канал с группами группы из XML-категорий по tv_category_id, канал может быть в нескольких группах; у WeburgTV и MegaRadio id группы — md5 названия, у AllTV — intval категории — AllTV (код)433; WeburgTV (код)434; MegaRadio (код)435
сопоставить группы сервера с группами плагина фиксированный список из 15 групп; канал попадает в группу при точном совпадении group-title с названием на сервере; плюс FavoritesGroup и AllChannelsGroup канал с другим названием группы ни в одну обычную группу не попадает FREE TV (код)436
дать базовые и свои группы 14 базовых групп из %tr%, пользовательские из group_names, «Без группы» — 8888; группа ищется по id без суффикса _HD — liteIPTV (код)437
добавить группу «HD Каналы» канал с « HD» в названии дополнительно добавляется в группу 99 — Novosib-iptv (код)438
подобрать иконку группы по подстрокам названия («порт» → sport, «етский» → kinder …), иначе 0.png; либо URL <сервер>/icons/<base64(группа)>.png; либо цвет из API — WeburgTV (код)439; zlostnyi (код)440; Юрта ТВ (код)441
получить логотипы каналов logotip из плейлиста (https — через CGI img.sh), иначе logoURL из channels.json, иначе empty.jpg в запрос метаданных идут только id > 1000 без суффикса _N FREE TV (код)442
кэшировать иконки на диске сравнить свободное место с size.txt и отдать DefaultArchive('ico', ARCHIVE_URL) при нехватке места иконки берутся с запасного домена Moi-Dom.tv (код)443

8.4. Избранное, скрытие, родительский контроль, порядок каналов

Задача Приём Грабли и ограничения Плагины и claims
включить ТВ-избранное FavoritesGroup + список favorite_channels + операции PLUGIN_FAVORITES_OP_ADD/REMOVE/MOVE_UP/MOVE_DOWN с invalidate_folders экрана избранного 101.ru: FavoritesGroup::get_channels() зовёт get_fav_channel_ids() без plugin_cookies, хотя интерфейс их требует 101.ru (код)444; MegaRadio (код)445; Юрта ТВ (код)441
где хранить избранное cookie favorite_channels (строка id через запятую) или файл в каталоге данных через HD::get_items()/save_items() в одном семействе встречаются оба варианта 101.ru (код)419; MegaRadio (код)446; surface_* (код)447
сделать экран избранного B_GREEN/C_YELLOW — вверх/вниз, D_BLUE — удалить, POPUP_MENU — меню; после операции список перестраивается со сдвигом выделения пустые id и каналы, которых нет в списке, пропускаются с предупреждением в лог 101.ru (код)448
скрыть каналы и группы списки hide_ch (по id) и hide_groups; у MegaRadio — очистка всех или одного у MegaRadio скрытые видны в поиске с суффиксом «(hide)» liteIPTV (код)449; MegaRadio (код)450
защитить канал кодом отметка в parental или parental_group; при pin = 1111 защита снимается MegaRadio при неверном коде подменяет URL на nopass.png; снять отметку можно только с верным pin liteIPTV (код)451; MegaRadio (код)452
скрыть взрослые каналы атрибут pass из M3U и cookie show_xxx — Novosib-iptv (код)453
задать порядок каналов 4 режима сортировки (без, по названию, по номеру из chnmbr_list, номер и алфавит), переключение cookie sort_channels; у MegaRadio — обмен соседних элементов массива ручной порядок — только в режимах 2 и 3 liteIPTV (код)454; MegaRadio (код)455
переименовать каналы название из списков vsetv по id и удаление подстрок cutname_list через str_ireplace — liteIPTV (код)449
перенести несколько каналов в категорию выделение select_id и group_move — MegaRadio (код)456
искать по плейлисту и выгрузить его mb_stripos по плейлисту с переходом jump к найденному; экспорт в MegaRadio.m3u с разрешением потоков при экспорте YouTube-каналы пропускаются MegaRadio (код)457

8.5. Воспроизведение канала: playback URL, stream URL, буферизация

По SDK при playback_url_is_stream_url == false оболочка дополнительно зовёт get_tv_stream_url() (SDK)458, а при TRUE не зовёт никогда (SDK)459; разделение нужно, когда URL потока получается удалённым вызовом (SDK)460. Каркас shell_ext r25 по умолчанию возвращает streaming_url канала, а get_tv_stream_url бросает исключение (код r25)461; так же устроена библиотечная копия в 101.ru (код)462.

Задача Приём Грабли и ограничения Плагины и claims
отдать готовый URL get_tv_playback_url возвращает streaming_url канала; у rain_* — HLS .m3u8 при playback_url_is_stream_url=true у 101.ru и rain_* archive_ts и protect_code не используются 101.ru (код)463; AllTV (код)464; rain_* (код)465; Юрта ТВ — protect_code игнорируется (код)466
получить реальный поток через API get_tv_stream_url снимает префикс http://ts:///http://mp4://, запрашивает API и берёт uri до первого пробела или кавычки — Юрта ТВ (код)467
Получать поток через API провайдера в DemoTv объявлены методы get_voka, get_spbtv, token_starnet, get_telecola, get_slotos; get_tv_playback_url вызывает get_spbtv, token_starnet и get_telecola get_voka и get_slotos не вызываются; в get_slotos зашиты логин, пароль и прокси FREE TV (код)468
выбрать живой поток из нескольких перебор playlist/item, fopen и чтение 500 байт, первый ответивший URL если ни один не ответил, функция завершается без return surface_* (rmfon) (код)469
играть станцию из PLS PLS скачивается, из FileN= берётся случайный URL; при неудаче — картинка nostream.png библиотечный abstract_tv.php изменён, хотя playback_url_is_stream_url = true surface_* (SomaFM) (код)470
вызвать резолвер по префиксу URL get_tv_stream_url при префикс::::аргумент вызывает функцию по имени, иначе возвращает URL как есть — surface_* (LSS) (код)471
достать поток со страницы streamdays_pars:<ссылка> → разбор страницы, iframe с Referer, <source> → .m3u8 при неудаче возвращается logo.png surface_* (wwcam) (код)472
подставить рабочий сервер провайдера host:port из URL канала заменяется на адрес из cookie novosib + :1234 завязано на формат drm://…/http://ts://host:port/… Novosib-iptv (код)473
объявить двухшаговую схему без преобразования playback_url_is_stream_url = false, а get_tv_stream_url возвращает вход без изменений — Novosib-iptv (код)474
задать буферизацию канала buffering_ms канала из cookie buf_time (FREE TV — по умолчанию 1000); AllTV дописывает к URL \|\|\|dune_params\|\|\|buffering_ms:<ms>; AceStreamSearch — одно статическое значение на все каналы AllTV добавляет суффикс только при buf_time != '0' FREE TV (код)361; MegaRadio (код)475; Moi-Dom.tv (код)387; AllTV (код)476; AceStreamSearch (код)477
Отдать live-трансляцию YouTube при playlistItem=0 и liveBroadcastContent=live parse_season вызывает Youtube::retrieve_playback_url и перебирает $media_urls[1] (snippet.resourceId.videoId) и $media_urls[2] (URL); при наличии $plugin_cookies-><season_ref> [NEW] ставится с первого videoId, которого нет в этом списке флаг [NEW] не сбрасывается youtube_api/folder_cache (код)478

Поле PluginTvChannel::buffering_ms по SDK — время предбуферизации канала (SDK)479; суффикс dune_params описан в guide/playback.md §2.1.

8.6. Архив (catchup)

Шаблоны URL архива у разных сервисов (flussonic, catchup-source, utc/archive) — §7.5.

По SDK have_archive требует поддержки архива в get_tv_playback_url() (SDK)480, а archive_past_sec и archive_delay_sec задают глубину и задержку архива (SDK)481.

Задача Приём Грабли и ограничения Плагины и claims
задать глубину архива из плейлиста has_archive = past_epg_days > 0, archive_past_sec = past_epg_days*86400+86400, задержка 15 с; past_epg_days — из catchup-days — WeburgTV (код)482
задать архив в коде Юрта ТВ — 14 суток и 31 минута задержки, Novosib-iptv — 100 часов без задержки Юрта ТВ ставит have_archive=true всем каналам, чтение поля API закомментировано Юрта ТВ (код)483; Novosib-iptv (код)484
взять глубину архива из плейлиста провайдера атрибут cn-records (часы архива) в #EXTINF — FREE TV (код)400
построить URL архива при archive_ts > 0 — URL из таблицы с utcstart/utcend, конец не позже текущего времени и начала + 35999 с; либо отдельный URL программы API — altIPTV (код)485; Юрта ТВ (код)466
включить перемотку в архиве HLS при archive_ts > 0 дописать \|\|\|dune_params\|\|\|hls_seek_live:1 — surface_* (LSS) (код)471

8.7. EPG: источники, итератор, кэш, часовой пояс

Объект: get_day_epg и get_day_epg_iterator в IPTV- и радиоплагинах (code; платформа и прошивка не установлены).

Плагины, построенные на AbstractTv, реализуют get_day_epg_iterator, а AbstractTv::get_day_epg превращает его элементы в PluginTvEpgProgram с start_tm_sec, end_tm_sec, name, description (код)486. Повторный запрос дня, который уже загружается, исполнитель операций r24 не дублирует (код r24)487 (см. guide/plugin-operations.md); кэш EPG в памяти плеера обновляет PluginUpdateEpgAction (SDK)488.

Задача Приём Грабли и ограничения Плагины и claims
ограничить выдачу днём EpgIterator($items, $day_start_ts, $day_start_ts + 86400); WeburgTV, 101.ru и plugtv берут правую границу +100400 итератор Widget Ext сравнивает только время начала, а не пересечение с интервалом; у Peers.TV последняя программа получает start+3600 Widget Ext (код)489; rain_* (код)490; Peers.TV (код)491; WeburgTV (код)492; 101.ru (код)493; plugtv (код)494
взять EPG с vsetv.com страница schedule_channel_<id>_day_<date>_nsc_1.html, перекодировка WINDOWS-1251 → UTF-8, strip_tags и регулярка «ЧЧ:ММ текст» работает только для числового id < 1000 (AllTV, pirates_*); у plugtv id канала зашит AllTV (код)495; Kaban.tv (код)496; liteIPTV (код)497; pirates_* (код)498; plugtv (код)499; Smart_* (link_api) (код)500; altIPTV (код)501; Novosib-iptv (код)502
взять EPG с tvsapi JSON tvsapi.cellmp.de/getProgram_1_3.php; Kaban.tv и Novosib-iptv шлют User-Agent Apache-HttpClient/UNAVAILABLE (java 1.4), Kaban.tv срезает BOM и разбирает время как strtotime('… CEST') — Kaban.tv (код)503; Novosib-iptv (код)502; altIPTV (код)504; EvolutionTV (код)505
выбрать источник по id или настройке диапазоны числового id (Novosib-iptv: 0 — пусто, 1..1199 — vsetv, ≥ 1200 — tvsapi; altIPTV — 12000–12999 для point.md); префикс epg_url (FREE TV, 17 маркеров); настройка epg_server (plugtv) или epg_source (EvolutionTV); у EvolutionTV parse_id понимает префиксы vsetv_, tvs_ и moi_ ветка tvs_ в parse_id не возвращает id: $channel_id сравнивается с true Novosib-iptv (код)502; altIPTV (код)506; FREE TV (код)507; plugtv (код)508; EvolutionTV (код)509
взять EPG у провайдера JSON или XML по id канала и дате: program.xml (WeburgTV), programs/list (Юрта ТВ), epg.php (Moi-Dom.tv), /api/channel/<id> на хосте первого URL плейлиста (zlostnyi/ottclub), дневной JSON <epg_id>/<YYYY-MM-DD> по карте channel_ids.txt (GlobalTV), XML /xml/tv/* (rain_*), all_tv.xml (plugtv) rain_* бросает исключение при недоступном или битом XML WeburgTV (код)510; Юрта ТВ (код)511; Moi-Dom.tv (код)512; zlostnyi (код)513; GlobalTV (код)514; rain_* (код)515; plugtv (код)516
пережить смену EPG-сервера основной и запасной URL: при исключении — второй источник, при второй ошибке — пустой массив у shura прежний источник закомментирован в конфиге zlostnyi (код)517
прочитать JTV из ZIP ZIP в /tmp/schedule.zip, PHP zip API, пары .ndx/.pdt; у Peers.TV — unpack 12-байтовых записей и CP1251, у altIPTV — имена CP866 путь /tmp/schedule.zip фиксирован; у Peers.TV формула времени и сдвиг -7 часов зашиты altIPTV (код)518; Peers.TV (код)519
взять EPG из TVheadend http://<ip>:9981/epg?…&channel=<link>, ответ обрезается до JSON-массива IP задаётся вручную EvolutionTV (код)505
показать «сейчас в эфире» без расписания одна программа «ON AIR» на сутки с описанием канала; DI.FM — история последних 100 треков плюс запись On AIR; AceStreamSearch — одна текущая передача из ответа поиска у surface_* и MegaRadio начало сдвинуто на -10800 с MegaRadio (код)520; surface_* (код)521; 101.ru (DI.FM) (код)522; AceStreamSearch (код)523
подставить заглушку вместо пустого EPG GlobalTV для канала с архивом строит почасовые программы с датой в заголовке; liteIPTV для id с буквами — «On Air» на каждый час от -24 до +23 — GlobalTV (код)524; liteIPTV (код)525
отключить EPG get_day_epg возвращает array(), дни EPG = 0 у pirates_* в плейлисте нет тегов дней EPG, и intval(null) даёт 0 Kohana-канал (код)526; surface_* (Radiorecord) (код)527; pirates_* (код)528
кэшировать EPG в файле файл channel_<id>_<day_start_ts> в /tmp или tmp_dir_path (zlostnyi — bcu_channel<tvg-id>_<day_start_ts>), обычно serialize; при повторном запросе того же дня сеть не нужна; zlostnyi пишет только непустой результат — AllTV (код)420; Kaban.tv (код)496; EvolutionTV (код)529; Novosib-iptv (код)530; pirates_* (код)531; liteIPTV (код)497; altIPTV (код)532; zlostnyi (код)533
кэшировать EPG в памяти по каналу и дню в памяти процесса; FREE TV — в DuneSystem::$properties; Peers.TV — не дольше 3600 с GlobalTV сохраняет и пустой результат, и последующие вызовы его возвращают; mail-ветка FREE TV при устаревшем кэше удаляет все файлы временного каталога GlobalTV (код)534; FREE TV (код)535; Peers.TV (код)536
учесть часовой пояс источника время vsetv разбирается как EEST и к нему прибавляется cookie epg_shift в секундах; rain_* разбирает время в Europe/Moscow rain_* не применяет смещение +TZ из строки AllTV (код)537; pirates_* (код)538; rain_* (код)490
узнать часовой пояс устройства TZ=\cat /etc/TZ` date +%zилиdate +%zи ручной разбор±hhmm` в секунды plugtv инвертирует знак; Moi-Dom.tv сдвигает на смещение границы итератора plugtv (код)539; Moi-Dom.tv (код)512
дать пользователю сдвиг программы combobox epg_shift от -12 до +12 часов в настройках; у pirates_* значение хранится в секундах Novosib-iptv складывает cookie epg_shift и epg_shift из плейлиста (часы × 3600) pirates_* (код)540; plugtv (код)541; Novosib-iptv (код)530
задать шрифт EPG cookie → PluginTvInfo::epg_font_size (PLUGIN_FONT_SMALL/NORMAL) у plugtv настройка epg_font хранится в cookie set_font plugtv (код)542; liteIPTV (код)353
починить текст EPG удалить UTF-8 BOM перед json_decode, заменить HTML-сущности по таблице немецкие буквы заменяются на строки в двойной перекодировке zlostnyi (код)543
Сделать экран телегида DemoTvgScreen строит телегид на выбранную дату: комбобокс дат от -2 до +7 дней; если cookie tvg_date равен текущей дате, подпись «Сегодня» и отметка текущей передачи префиксом -> файл plugtv_tvg_screen.php нигде не подключается, экран tvg не регистрируется — мёртвый код plugtv (код)544
Обновлять экран по таймеру SurfaceM3uTv реализует UserInputHandler, get_actions добавляет GUI_EVENT_TIMER (content_timer) и GUI_EVENT_KEY_SETUP (setup_time), get_tv_info задаёт таймер 10000 мс; по SETUP открывается диалог «Задать время записи:» с combobox epg_shift от -12 до 12 часов, значение сохраняется в cookie epg_shift — surface_* (LSS) (код)545
Обновить EPG действием оболочки ActionFactory::update_epg задаёт channel_id, clear, day_start_tm_sec, programs и post_action в PLUGIN_UPDATE_EPG_ACTION_ID — Widget Ext (код)546

8.8. Внешний EPG оболочки (ext_epg) и свой EPG-сервер

Вместо get_day_epg плагин может отдать EPG по HTTP: оболочке — через поля ext_epg_* в PluginTvInfo (в dune_api.php r24 они есть (код r24)547), другим плагинам — через свой CGI-сервер.

Задача Приём Грабли и ограничения Плагины и claims
включить внешний EPG оболочки get_tv_info пишет channel_ids.txt во временный каталог и задаёт ext_epg_enabled=true, ext_epg_base_url (CGI плагина), ext_epg_channel_ids_url; CGI channels отдаёт файл или 404 — ProIPTV (код)421
отдать оболочке JSON-файлы EPG get_tv_info создаёт shell-скрипт /tmp/www/cgi-bin/epg, который отдаёт tmp/ext_epg/<channel>-<date>.json; base_url — http://127.0.0.1/cgi-bin/ при DUNE_FIRMWARE_BN >= 11 ext_epg_enabled включается только при наличии /tmp/www/channel_ids.txt и скрипта FREE TV (код)548
не доверять «мёртвой» ветке внешнего EPG — в GlobalTV ветка внешнего EPG в ensure_tv_cache никогда не срабатывает: каналы — массивы, а условие проверяет свойство объекта GlobalTV (код)549
сделать отдельный плагин-сервер EPG myEPGserver: точки входа в root://applications и setup://applications с ip_address_required = yes, CGI getEpg отдаёт программу другим плагинам по сети по сообщениям пользователей, сервер отдаёт EPG любому приложению на плеере (форум)550 и поддерживает одну ссылку EPG (форум)551 liteIPTV (код)552
вести список источников xmltv http-адрес (проверка только ^http, дубликат отклоняется) или локальный .xml/.gz; отключение (skipArrEpg) и перестановка вверх/вниз из popup-меню для http-источника проверяется только префикс http liteIPTV (код)553
разобрать большой xmltv перебор источников, .gz через compress.zlib://; канал — ключ createIdKey(display-name), id_name = md5(xmlfile . epgId); программы складываются по дням если имя уже занято каналом из другого файла, программы этого канала пропускаются liteIPTV (код)554
хранить программу по каналам JSON <jsonsPath>/<id_name>.json по дням, сброс на диск пачками по 10 каналов; при слиянии дни старше 7 суток удаляются; после обновления удаляются JSON, которых нет в карте ошибочная карта удалит файлы каналов liteIPTV (код)555
отдать программу и логотипы getEpg ищет канал по caption, tvgid или idname; нет дня — 48 программ «On Air»; getLogoArr и getlogo отдают карту и файлы логотипов; clear удаляет каталог EPG все ответы, включая JSON, идут с Content-Type text/html; clear удаляет все файлы каталога командой rm -f; без каталога EPG — {"err":"404"} liteIPTV (код)556
подключить клиент к EPG-серверу liteIPTVplus: поле epgIp в настройках (по умолчанию 127.0.0.1), запросы getLogoArr, getlogo, day_start_ts&caption; сервер реализует все три, формат title/desc и резервный name/desc клиент принимает «+» в названии заменяется на plus liteIPTV (код)557
обновлять EPG по расписанию строка с маркером #myEPGserver в /tmp/cron/crontabs/root, на Android перезапуск crond через dunehd_service; на boot update_cron.sh восстанавливает задание в setcrontab.php используется неопределённая $autoScanFolders; подробнее о cron — §13 liteIPTV (код)558; по сообщениям пользователей — раз в неделю в заданные день и время (форум)559
дать веб-интерфейс сервера index.php: таблица каналов, источники, кнопки обновления и очистки, поиск на клиенте — liteIPTV (код)560
Подключить внешний EPG при наличии плагина ext_epg get_tv_info включает ext_epg_enabled и ext_epg_channel_ids_url = "dunehdtv_channel_ids.txt", если определено PluginTvInfo::ext_epg_channel_ids_url и есть /firmware_ext/plugins/ext_epg/dune_plugin.xml файл dunehdtv_channel_ids.txt в коде не создаётся и в пакете отсутствует DUNE-HD.TV (код)561
Настроить EPG-сервер экран настроек всегда содержит выбор каталога EPG (setJsonsPath), main_icon и whats_new; при непустом jsonsPath добавляются addDelXmltvEpg, updateXmltvEpg, showEpgAvailableChannels, autoUpdateXmltvEpg, showEpgUpdateLog и clearXmltvEpg; без jsonsPath берётся data_dir_path/dataFiles при отсутствии /persistfs путь очищается; если нет и /persistfs, и /D, показывается предупреждение о накопителе liteIPTV (код)562
Обновить EPG-сервер updateXmltvEpg запускает обновление фоновой командой wget на plugin_cgi_url/do; showEpgUpdateLog читает DATA-файл do.log и каждую секунду перезапускает себя, пока в логе нет «Script stop» — liteIPTV (код)563
Показать каналы и программы EPG-сервера экран каналов при пустом media_url показывает myEPGserverIDs; media_url с id_name открывает JSON-файл канала (дни), с id_name и day — программы дня, с epgList — список источников с пунктом «Добавить xmltv EPG» — liteIPTV (код)564
Подключить link_api.php в CGI EPG-сервера CGI getEpg и do при наличии /tmp/plugins/link_api.php подключают его, иначе локальный link_api.php; локальная копия содержит только mUrl::createIdKey остальных методов mUrl в локальной копии нет liteIPTV (код)565
Учесть правки библиотеки myEPGserver show_dialog всегда задаёт DIALOG_FRAME_STYLE_GLASS, чтение dialog_params закомментировано; add_label создаёт элемент с пустым GuiControlDef::name, заголовок передаёт в title; http_get_document задаёт CONNECTTIMEOUT и TIMEOUT по 40 с, UA Firefox 7.0.1 и печатает через echo — liteIPTV (код)566

14. Торренты и загрузки

Объект: работа плагинов с TorrServer, Peerflix, Transmission, AceStream и Noxbit, облачным монтированием rclone и фоновыми загрузками — Online Movies (TV Series), Torrent Center, MegaTorrents, MegaAnime, Smart_*, liteIPTV, AceStreamSearch, Entware/Wallpaper, rclone, Lampa bridge; уровень code, отдельные сведения — forum. Платформа и прошивка исполнения не установлены; ветки по Android/APK названы в строках.

Торрент плагин не проигрывает сам: он передаёт раздачу движку (TorrServer, Peerflix, Transmission, AceStream) и отдаёт плееру HTTP-URL потока (§7.3). Встроенный в прошивку TorrServer, его адрес и менеджер загрузок dl_manager описаны в guide/downloads-torrserver.md; ниже — как плагины работают с движками сами.

14.1. TorrServer: установить, запустить, настроить

На tv188b r25 (device) $P/flashdata/ts/ts оказался симлинком на bin/ts плагина Online Movies, а $P/firmware/bin/ts — на libxxx_ts.so прошивки (устройство r25)567; подробнее — guide/downloads-torrserver.md §1.

Задача Приём Грабли и ограничения Плагины и claims
Поставить свой TorrServer взять ссылку android-arm7 из server_release.json (releases.yourok.ru), скачать wget-действием в /flashdata/ts/ts.loading, заменить /flashdata/ts/ts если статус загрузки не succeeded, ts.loading удаляется и показывается ошибка Online Movies (TV Series) (код)568
Запустить TorrServer ts --port 8095 -k -d /flashdata/ts -l /tmp/run/ts.log, вне APK — через /system/dunehd/dunehd_service do; ждать до 40 с, опрашивая порт на APK при отсутствии /flashdata/ts/ts делается симлинк на пакетный bin/ts, а вне APK функция возвращает false; что такое пакетный bin/ts — §14.9 и §19 Online Movies (TV Series) (код)569
Запустить TorrServer на Android при dune_torrserve_ip=2 свой CGI при наличии файла /data/data/ru.yourok.torrserve/files/torrserver и отсутствии процесса запускает его, иначе am start пакета с torrserve из /tmp/applications/app_data.json; Torrent Center при наличии Android-приложения и отсутствии pid запускает внешний torrserver -k -d /sdcard/Android/data/ru.yourok.torrserve/files — MegaTorrents (код)570; Torrent Center (код)571
Запустить TorrServer на другом плеере HTTP-запрос к CGI плагина или к service_api плагина TorrServe на удалённом Dune; Torrent Center пробует CGI torrserve текущего плагина, затем Bazinga на хосте настроенного TorrServer, а при отсутствии Android-приложения и вне Android шлёт service_api?cmd=torrserve_start — MegaTorrents (код)572; Torrent Center (код)573
Управлять сервером start/restart (POST /shutdown, 5 с, запуск), stop, soft_restart (GET /torrent/restart), settings_read/settings_write в форме настроек CacheSize и PreloadBufferSize показываются в МБ и при сохранении умножаются на 1024×1024 MegaAnime (код)574; Torrent Center (код)575
Настроить кэш поправить head/tail кэша (head ≥ 60 МБ, tail ≥ 30 МБ), DisableUpload=true; дисковый кэш /flashdata/ts_cache при MemTotal < 1100000 КБ или значении 1 в /config/ts_disk_cache.txt по комментарию в коде, прошивки без исправления 2024-11-04 r22 сбрасывают остальные настройки ts Online Movies (TV Series) (код)576
Найти установленный TorrServer на platform=android getInstallTorrServer проверяет файл приложения ru.yourok.torrserve через dunehd_service do; на platform=87xx ищет TorrServe в /tmp/run/installed_plugins.xml пути и platform_kind конкретны для этих веток Torrent Center (код)577

14.2. Версии API TorrServer и добавление раздачи

Задача Приём Грабли и ограничения Плагины и claims
Поддержать старый и новый API число из /echo как версия: > 1025 — ключ Link вместо Magnet; < 1054 — POST на /torrent/add, иначе — новый путь добавления версия трактуется как число без точек MegaTorrents (код)578; MegaAnime (код)579
Работать с API новых версий /torrents (add/get/list/drop/rem), /torrent/upload, /viewed, /shutdown, /settings — Online Movies (TV Series) (код)580; Torrent Center (код)581
Дождаться метаданных диалог «Добавление» с timer(1000), повтор по GUI_EVENT_TIMER, пока /torrent/get не вернёт Files — MegaTorrents (код)582
Получить список файлов torrserverActionGet до json_decode переписывает числовые значения в строки, тайм-аут 1 с; id файла — md5(path) предупреждения заглушены Online Movies (TV Series) (код)583
Не добавлять раздачу повторно кэш hash по uid в /tmp/run/…hash_by_uid.json; при отсутствии или неполных данных — добавить заново — Online Movies (TV Series) (код)584
Передать .torrent серверу в сети сохранить файл в /tmp/www/temp.torrent и отдать URL http://<IP плеера>/temp.torrent (или загрузить файлом на /torrent/upload) у Torrent Center путь фиксирован — /tmp/www/temp.torrent, MegaTorrents пишет туда же по умолчанию; .torrent с kinozal (при логине), nnmclub и rutracker dl.php он качает с cookie-файлом трекера, с hdreactor — с Referer Online Movies (TV Series) (код)585; Torrent Center (код)586; MegaTorrents (код)587; MegaAnime (код)588
Получить .torrent из magnet для magnet с 40 hex и пути, отличного от /tmp/www/temp.torrent, скачать http://itorrents.org/torrent/<btih>.torrent внешний сервис MegaTorrents (код)589
Принять .torrent из файлового менеджера глобальный обработчик file_popup добавляет меню только для расширения torrent после проверки обязательных полей и исключения оптического диска; get_file_popup_action собирает абсолютный путь из mount_path источника и selected_file_path требуется mount_path источника Torrent Center (код)590
Принять magnet, URL или файл get_add_torrent_dialog различает три источника: URL, проходящий проверку strspn($fn,'http://',0,7) == 7 (после HD::http_get_document скачивается во временный файл), magnet сохраняется как add_torrent_fn, локальный файл проверяется Torrent::is_torrent и разбирается конструктором Torrent проверка http:// через strspn — набор символов, а не строковый префикс RemTor (код)591
Проверить и разобрать .torrent Torrent::is_torrent считает файл торрентом, если первые 11 байт — d8:announce; для .torrent размер берётся через Torrent::size, список файлов — Torrent::content, все файлы помечаются need = true, общий каталог отрезается последовательным dirname — RemTor (код)592

14.3. URL потока, прогрев буфера и позиция

Задача Приём Грабли и ограничения Плагины и claims
Сформировать URL потока TorrServer <server>/stream/<имя с %20>?link=<hash>&index=<id>&play — та же форма, что у downloads прошивки r25 (код r25)593 Torrent Center помечает URL как is_stream_url=false Online Movies (TV Series) (код)594; Torrent Center (код)595
Пропустить готовый URL движка get_vod_stream_url не трогает адреса 9000/torrents/, 8090/torrent/, 9092/torrent — MegaTorrents (код)596
Прогреть буфер перед стартом фоновый wget по URL с &preload (или torrent/preload) и опрос stat//torrent/stat; старт по переходу stat 2→3, заполнению > 98 % или концу предзагрузки — Torrent Center (код)597; MegaTorrents (код)598
Обойти прокси TorrServer веб-приложения переписать URL /stream/… с 40-hex link, index и play на прямой адрес после read-only POST /torrents {action:'get', hash} с тайм-аутом 1000 мс URL с логином/паролем не переписывается; при неудаче остаётся прокси-ссылка Lampa bridge (код)599
Отдать позицию в TorrServer viewedSet для ключа torrent:<40 hex>:<index>: после 30 с, затем не чаще раза в 30 с, сразу при перемотке > 30 с и при остановке http-адрес на https-странице пропускается; по комментарию в коде, это тот же POST /viewed, что Lampa шлёт при закрытии плеера Lampa bridge (код)600

14.4. Peerflix и Transmission

Задача Приём Грабли и ограничения Плагины и claims
Добавить торрент в Peerflix POST {"link":"<url>"} на :9000/torrents, до 10 повторов через 4 с до infoHash; или POST file=@… на /upload URL файла — адрес сервера + files[].link, is_stream_url=true MegaTorrents (код)601; MegaAnime (код)602; Torrent Center (код)603
Поднять Peerflix из Entware service_api?cmd=peerflix_start плагина Entware и ожидание до 10×4 с MegaAnime перед локальным запуском гасит transmission, noxbit, acestream и torrserve MegaTorrents (код)604; MegaAnime (код)602; Torrent Center (код)605
Отправить торрент в Transmission JSON-RPC на <ip>/transmission/rpc: method/arguments, заголовок X-Transmission-Session-Id, Basic auth при заданных логине и пароле у MegaTorrents запуск локального transmission-daemon в обеих ветках возвращает false Torrent Center (код)606; MegaAnime (код)607; MegaTorrents (код)608; RemTor (код)609
Смотреть через Transmission с UPnP RPC на отдельном порту (по умолчанию 9091), поток — <UPnP>/torrent/<id>/<index>.<ext>; список — M3U :9092/playlist на Android при локальном IP и dune_transmission_ip=2 без ответа MegaTorrents запускает com.ap.transmission.btc через am start Torrent Center (код)610; MegaTorrents (код)611; MegaAnime (код)612
Не конфликтовать с другой установкой Transmission при выбранном install_script install_transmission (ENTER/PLAY) проверить /ltu и Transmission в /tmp/run/installed_plugins.xml; при наличии — диалог проверка вхождения Transmission регуляркой по содержимому файла Entware/Wallpaper (код)613
Включить проверку торрента Peerflix пункт verify_peerflix при выбранном verify пишет config->verify=true только для true, иначе false; если настройки сохранены и сервер запущен, он перезапускается по словам автора, у Peerflix нет кеша в памяти — файл качается целиком на диск; при включённой проверке после перезапуска идёт перехеширование, при выключенной ранее закачанное отбрасывается и закачка начинается заново PeerflixServer (код, форум)614
Фильтровать торренты по статусу фильтр списка предлагает группы tr_kind_all, tr_kind_active, tr_kind_downloading, tr_kind_inactive, tr_kind_stopped, tr_kind_error со счётчиками TotalCnt, ActiveCnt, DownCnt, StoppedCnt, ErrorCnt — RemTor (код)615
Менять параметры Transmission страница download экрана setup_trans показывает download-dir, rename-partial-files, seedRatioLimit, idle-seeding-limit и cache-size-mb из session-get; страница network — peer-port, peer-port-random-on-start, port-forwarding-enabled, encryption, dht-enabled и кнопку tr_test_port; применение после checkconnect вызывает set_session_arg с парой control_id => new_value port_test возвращает истину при port-is-open = 1, но в ветке catch вызывает несуществующий test_port() RemTor (код)616
Выбрать .torrent файловым браузером пункт tr_add_torrent ставит DuneBrowserDirClass::filemask = '.torrent', action_ok — close_and_run действия tr_select_torrent, и открывает gl_browser; экран хранит каталог в plugin_cookies->browse_setting как JSON, фильтрует файлы по filemask и возвращает выбранный путь в result_link tr_select_torrent монтирует SMB-шару в /tmp/mnt/smb/rem_tor и заменяет путь на точку монтирования RemTor (код)617
Выбрать каталог закачки каталог по умолчанию — download-dir из session-get; кнопка смены показывает подкаталоги через DuneFileUtils::get_folder с OnlyDir, путь для показа переводится map_rem_to_local по записи в changelog 0.0.18 (p221846), выбор ограничен первыми 15 поддиректориями из-за отсутствия скроллинга RemTor (код, форум)618
Показать файлы раздачи экран rt_files получает файлы вызовом get_torrent_array_bint с полями id, hashString, name, files, fileStats; общий каталог отрезается последовательным dirname по первым элементам; строка показывает размер, процент для неполного файла, приоритет или «не загружать», иконку completed.aai/downloading/*.aai/skip.aai по wanted и bytesCompleted — RemTor (код)619
Менять приоритет файлов после проверки selected_media_url обработчик tr_set_priority вызывает set_priority_file с setpriority и списком выбранных файлов, а при пустом выборе — с одним file_id — RemTor (код)620

14.5. AceStream и Noxbit

Задача Приём Грабли и ограничения Плагины и claims
Поток AceStream по content_id http://<ip>:6878/ace/getstream?id=<id>&format=json; acestream:// → /ace/getstream?id= в меню MegaAnime AceStream — только на Android MegaAnime (код)621; liteIPTV (код)218
Получить content_id из .torrent base64 файла POST на api.torrentstream.net/upload/raw при отсутствии content_id функция возвращает null (нет return) MegaTorrents (код)622
Поднять движок на Android при неответе get_version найти пакет с acestream в app_data.json, am start, ждать 15 с и повторить запрос — liteIPTV (код)623
Noxbit URL stream?cid= распознаётся отдельно по сообщениям пользователей (первый пост), порт Noxbit — 6689, AceStream — 6878 liteIPTV (код, форум)624
Заставить указать адрес Ace Proxy при пустом IP таймер папки 100 мс показывает диалог с кнопкой «Настройки»; load_channels бросает фатальную ошибку диалог повторяется при каждом входе, пока IP пуст AceStreamSearch (код)625

Статистика пиров в инфоблоке и остановка движка по STOP — §7.6.

14.6. Выбор движка для раздачи

Задача Приём Грабли и ограничения Плагины и claims
Действие по умолчанию для торрента настройка 0–6: Transmission, Peerflix, сохранить .torrent, AceStream, TorrServe, «открыть через Android» AceStream и Android-вариант — только на Android MegaAnime (код)626
Меню серии с движками popup с вариантами Transmission, RemTor, Peerflix, TorrServe, AceStream, сохранить файл Android-пункты показываются только на Android MegaAnime (код)627
Перейти в другой плагин или поставить его проверить плагин в /tmp/run/installed_plugins.xml, открыть plugin_launcher://rem_tor, иначе предложить plugin_installer://<url>/update.tgz установка — с внешнего хоста автора MegaAnime (код)628
Открыть .torrent в Android-приложении сохранить в /tmp/www/temp.torrent и отдать интентом application/x-bittorrent с file://… — MegaTorrents (код)629

14.7. Фоновые загрузки: aria2c, curl, wget

Плагины ниже качают файлы своими процессами, без менеджера загрузок прошивки (он описан в guide/downloads-torrserver.md §4).

Задача Приём Грабли и ограничения Плагины и claims
Скачать файл в фоне aria2c -x2 --continue=true … --dir=<dload_dir_path> с выводом в aria.log бинарник — /ltu/bin/aria2c (внешняя зависимость LTU) или /opt/bin/aria2c; MoviesTape включает загрузку только при /codecpack/script/mw_download MegaTorrents (код)630; Smart_* (код)631
Показать прогресс диалог с timer(3000) повторно читает состояние; разбор хвоста текстового лога aria2 без aria.log выводится «Закачки остановленны» Smart_* (код)632; MegaTorrents (код)633
Предупредить об отсутствии загрузчика перед открытием папки проверить /ltu/bin/aria2c или флаг установки, иначе предупреждение — Smart_* (Zona.mobi) (код)634
Качать без aria2 curl -C - -O -# с бинарником по platform_kind из /tmp/run/versions.txt, прогресс — в /tmp/curlDload.txt, остановка — скриптом curlDloadTerminate.sh прогресс — последний процент из лога Smart_* (knigavuhe) (код)635
Показать процент в списке серий CGI run.php отдаёт JSON {url: "NN%"}, список меняет иконку и выводит процент в item_extra_info — Smart_* (knigavuhe) (код)636
Играть скачанное, если оно есть get_vod_stream_url сначала ищет файл в папке загрузок и возвращает file:// — Smart_* (knigavuhe) (код)213
Качать wget со скриптом остановки wget_dload --start … пишет лог и .kill-скрипт в /tmp/plugins/Vimeo/ список загрузок читает /tmp/plugins/vimeo/ строчными — регистр не совпадает Smart_* (Vimeo) (код)637
Убрать загрузку из пакета в списке серий нет обработчиков aria_download/aria_download_all/aria_stop/open_folder; менеджер загрузок отключён флагом DlState::ENABLED = false — Smart_* (код)638; Online Movies (TV Series) (код)639
Найти основной накопитель читать /tmp/run/storage_list.xml, пропустить is_persistfs_capable=1, основным считать mount_path /tmp/mnt/D — Online Movies (TV Series) (код)640

14.8. Облако как папка: rclone mount

Задача Приём Грабли и ограничения Плагины и claims
Смонтировать облако rclone mount --daemon с VFS-кэшем и --allow-other; --read-only, если нет файла autostart_write_mode кэш по умолчанию 32M; по сообщениям пользователей, прочитанный файл сначала целиком грузится в кэш, и на это время плеер не реагирует на пульт rclone (код, форум)641
Показать смонтированное пользователю launch_media_url встроенного файлового браузера: internal_memory://<путь> на Android, префикс tmpfs вне Android по сообщениям пользователей, на RTD1619 папка пуста и видна только через builtin_memory в браузере сети rclone (код, форум)642

14.9. Что проверить в чужом коде

Online Movies запускает /flashdata/ts/ts как TorrServer (код)643, но в строках пакетного bin/ts, на который на APK ставится симлинк, есть rmmpegdemux и librmmpegdemux.so, а строк HTTP или TorrServer нет (код)644. Работает ли такой запуск — §19.

Расхождения

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

Контент

  • Где лежит favorite_movies. Torrent Center, Moi-Dom.tv, Peers.TV, pirates_* и zlostnyi держат избранное в plugin_cookies строкой id через запятую (код)645; FREE TV и Smart_* под тем же именем пишут файлы через HD::get_items/HD::save_items, причём у Smart_* методы названы from/to_cookies (код)646. При переносе кода между плагинами проверяйте, куда на деле пишет favorite_movies. Связи conflicts_with нет.
  • Регистрация поставщика без флага перечитывания. Online Movies (rus) пишет описатель прямо в /tmp/movie_suppliers/movies_rus, без params/movie_suppliers и movie_suppliers_update.sh (код)647; r24 перечитывает поставщиков при наличии /tmp/movie_suppliers_changed.flag (код r24)17. Появится ли такой поставщик после boot_end — не доказано (см. §19). Связи conflicts_with нет.
  • Копия lib GlobalTV против r24. T::t1 плагина вставляет значение без strip_param, тогда как r24 обрабатывает префиксы %tr%/%ext% (код r24)648; ListUtils плагина использует ключи all_list/def_list/on_off/avoid_empty, а r24 — all_services/def_ids/on_idset/off_idset (код r24)649, и только плагин возвращает def_idset при пустом наборе (код r24)650. Связи conflicts_with нет.

Воспроизведение

  • Запуск штатного плеера через PlayerProxyActivity. Jellyfin Bridge копирует входящий интент, задаёт компонент com.dunehd.app/com.dunehd.shell.PlayerProxyActivity и добавляет skip_resume_position:1 в com.dunehd.playback.dune_params (код)651; на tv188b r25 (device) явный запуск PlayerProxyActivity с HTTP MP4 без action VIEW (в том числе с skip_resume_position:1) VOD не запустил (устройство r25)324. Есть ли action VIEW у копии интента Jellyfin Bridge, claims не говорят. Связи conflicts_with нет.

ТВ и EPG

  • get_tv_info() у радиоплагина 101.ru. SDK: минимальное ТВ-воспроизведение требует get_tv_info() и get_tv_playback_url() (SDK)351; библиотечный AbstractTv в 101.ru возвращает из get_tv_info() null (код)652, тогда как в копии DI метод реализован полностью (код)653. Как оболочка ведёт себя с null, в базе не проверено. Связи conflicts_with нет.
  • Единицы сдвига EPG. Cookie epg_shift AllTV и pirates_* прибавляется к времени в секундах (код)654; атрибут epg_shift плейлиста у EvolutionTV задан в часах с ограничением [-24, 24] (код)399; Novosib-iptv складывает cookie и атрибут плейлиста (часы × 3600) (код)530. Это разные соглашения плагинов, а не противоречие источников; связи conflicts_with нет.

Торренты

  • Пакетный bin/ts Online Movies — TorrServer или нет. Код плагина запускает /flashdata/ts/ts как TorrServer с --port 8095 (код)643, а на APK при отсутствии файла ставит симлинк на пакетный bin/ts (код)655; в строках этого ELF есть rmmpegdemux и librmmpegdemux.so, но нет строк HTTP или TorrServer (код)644. На tv188b r25 (device) $P/flashdata/ts/ts — симлинк на bin/ts плагина Online Movies (устройство r25)567. Связи conflicts_with нет; вывод о неработоспособности — inference (§19).

Не проверено

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

Утверждение Уровень, статус Claim Раздел
В shell_ext r24 описатель поставщика без playback_type, supported_video_types и play_action получает stream, video и пустой play_action, то есть участвует в поиске видео inference (вывод r24)656 §6
Поставщик, который пишет описатель прямо в /tmp/movie_suppliers без /tmp/movie_suppliers_changed.flag, может не появиться на r24 после boot_end inference (вывод)657 §6
Online Movies (TV Series): в filter_all_torrents стоит безусловный return до кода фильтрации, поэтому invalid-торренты не отфильтровываются inference (вывод)658 §6
У сериала с одним выбранным сезоном без списка сезонов Online Movies (rus) получает пустой URL сезона и не собирает эпизоды inference (вывод)659 §6
Без PluginRowsPane::headers сообщение msg_search_empty в GlobalTV, вероятно, не появится даже при пустом результате поиска inference (вывод)660 §6
AceStreamSearch: если в media_url нет infohash=, get_tv_stream_url, вероятно, возьмёт подстроку с 9-го символа — неверный id канала inference (вывод)661 §7
vkmusic и moskva-fm запускают FlashLite через swf://; по SDK, SMP87xx и Android FlashLite не поддерживают — на устройстве не проверено inference (вывод)662 §7
Screenshoter: screenrecord сам останавливает запись через 180 секунд — поэтому плагин показывает обратный отсчёт inference, disputed (вывод)663 §7
dune-hd-tv: receive5, вероятно, локальный HTTP-ретранслятор потока — play.sh поднимает его на 18883, а плагин отдаёт URL на localhost inference (вывод)664 §7
Dune Remote Control: плагин сам не запускает воспроизведение — каталог, избранное, папки и плейлисты отдаёт он, а просмотр и удалённый запуск выполняет мобильное приложение; механизм запуска в источнике не назван inference (вывод)665 §7
remote-control: pls с put/append на устройстве, вероятно, не работает — тело POST читается только из $HTTP_RAW_POST_DATA inference (вывод)666 §8
remote-control: через pls, вероятно, можно читать и перезаписывать любые .m3u/.m3u8, доступные CGI inference (вывод)667 §8, §17
WeburgTV: строка #EXTINF без tvg-id/tvg-logo/group-title получит значения предыдущего канала (влияет и на фильтр «Промо») inference (вывод)668 §8
WeburgTV: при совпадении tvg-id список покажет дубли, а get_channel вернёт последний inference (вывод)669 §8
WeburgTV: при ошибке HTTP EPG за день будет пустым, обработки ошибки нет inference (вывод)670 §8
MegaRadio: импорт M3U добавляет только последнюю станцию — запись идёт после цикла inference (вывод)671 §8
pirates_*: без M3U_ID_FILE_URL и data/myiptv_channels_id все каналы получат id ≥ 1000 и останутся без EPG inference (вывод)672 §8
plugtv: без number в list.xml все каналы получают номер 0, сортировка по номеру их не различает inference (вывод)673 §8
plugtv: при недоступном list.xml file_get_contents не бросает исключение, поэтому будет предупреждение PHP, затем simplexml_load_string(false) и исключение «Illegal XML document» inference (вывод)674 §8
surface_* (Radiorecord): архивный трек не получит URL — arcUrl заполняется только в недостижимом коде inference (вывод)675 §8
surface_* (LSS): cookie epg_shift из диалога на EPG не влияет inference (вывод)676 §8
myEPGserver: ветки export_data/import_data файлового экрана вызывают HD::pCopyFolders, которого нет в lib/utils.php; из интерфейса плагина эти ветки не открываются inference (вывод)677 §8
zlostnyi: формат «H:m:s» в окне EPG сдвигает границы на номер месяца в минутах inference (вывод)678 §8
Пакетный bin/ts Online Movies по содержимому не TorrServer, поэтому запуск TorrServer из него на APK, вероятно, не работает inference (вывод)679 §14
Экран загрузок Online Movies (DownloadsScreen) недоступен: DlState выключен, обработчик игнорируется, entry_point закомментирован inference (вывод)680 §14
MegaTorrents: acestream_action проверяет только check === true, поэтому при незапущенном движке, вероятно, идёт дальше без сообщения inference (вывод)681 §14
rclone сам не запускает воспроизведение: единственный путь к файлам — встроенный файловый браузер inference (вывод)682 §14

  1. fw-tv188b-260827-0003-r24--movie-suppliers.c010 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · do_movie_suppliers_update запускает «sh /bin/movie_suppliers_update.sh» с парами аргументов (через escape_shell_arg) — только если строка «version_index:id1-id2…» отличается от сохранённой в /flashdata/plugins_data/<плагин>/movie_suppliers_params.txt; после запуска строка записывается туда ↩

  2. plg-ds-dunemdb-supplier-megogo.c016 · code · android; прошивка — · Описатель megogo задаёт plugin = dunemdb_supplier_megogo, caption = %tr%title_supplier, langs = russian,ukrainian, supported_video_types = video, server_managed = true, location_handling = skip_unmatched_publications, playback_type = app, special_category = true, special_category_caption = %tr%title_supplier_category и иконки category/sticker/logo. ↩

  3. plg-ds-dunemdb-supplier-okko.c016 · code · android; прошивка — · Описатель okko задаёт plugin = dunemdb_supplier_okko, caption = %tr%title_supplier, langs = russian,ukrainian, supported_video_types = video, server_managed = true, location_handling = skip_unmatched_publications, playback_type = app, special_category = true, special_category_caption = %tr%title_supplier_category и иконки category/sticker/logo. ↩

  4. plg-ds-dunemdb-supplier-generic.c027 · code · unknown; прошивка — · Для включённых id скрипт пишет описатель в /tmp/movie_suppliers/ (ключи plugin, caption, supported_video_types, bin, server_managed, location_handling, playback_type, special_category, special_category_icon_url, sticker_icon_url, logo_icon_url) через временный файл и rename, только если содержимое изменилось; bin = cd <каталог bin> && $FS_PREFIX/firmware_ext/php/php-cgi -f ./run.php. ↩↩

    • plg-dc-dunemdb-supplier-movies-eng.c019 · code · unknown; прошивка — · Описатель поставщика содержит ключи plugin = dunemdb_supplier_movies_eng и langs = english.
    • plg-dc-dunemdb-supplier-movies-eng.c020 · code · unknown; прошивка — · Описатель задаёт caption = %tr%title_supplier.
    • plg-dc-dunemdb-supplier-movies-eng.c021 · code · unknown; прошивка — · Описатель задаёт bin = «cd $mydir && ./run.sh», где $mydir подставлен абсолютным путём каталога bin плагина.
    • plg-dc-dunemdb-supplier-movies-eng.c022 · code · unknown; прошивка — · Описатель задаёт get_publications_supported = true.

    ↩

  5. fw-tv188b-261021-0117-r25.c179 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 команды поставщика из стороннего плагина (bin без cd) выполняются с uid 1000 и текущим каталогом /. ↩

    • plg-ds-dunemdb-supplier-generic.c027 · code · unknown; прошивка — · Для включённых id скрипт пишет описатель в /tmp/movie_suppliers/ (ключи plugin, caption, supported_video_types, bin, server_managed, location_handling, playback_type, special_category, special_category_icon_url, sticker_icon_url, logo_icon_url) через временный файл и rename, только если содержимое изменилось; bin = cd <каталог bin> && $FS_PREFIX/firmware_ext/php/php-cgi -f ./run.php.
    • plg-ds-dunemdb-supplier-generic.c029 · code · unknown; прошивка — · movie_suppliers_update.sh разбирает аргументы парами id caption и пишет описатель в $FS_PREFIX/flashdata/plugins_data/dunemdb_supplier_generic/movie_suppliers/ с теми же ключами, что update_movie_suppliers.php, но sticker_icon_url = icons/sticker_.png и bin = cd <каталог bin> && $FS_PREFIX/firmware_ext/php/php-cgi -f ./run.php.

    ↩

  6. plg-dc-dunemdb-supplier-online-movies.c029 · code · unknown; прошивка — · Команда запуска поставщика в описателе — cd <каталог bin> и $FS_PREFIX/firmware_ext/php/php-cgi -c <каталог bin> -f ./run.php. ↩

  7. plg-ds-dunemdb-supplier-megogo.c015 · code · android; прошивка — · movie_suppliers_update.sh с зашитыми id = megogo и caption = %tr%title_supplier пишет описатель в $FS_PREFIX/flashdata/plugins_data/dunemdb_supplier_megogo/movie_suppliers/megogo; bin = cd <каталог bin> && , где run_cmd — ./run.py при пустом FS_PREFIX, иначе $FS_PREFIX/firmware_ext/php/php-cgi -f ./run.php. ↩

  8. plg-ds-dunemdb-supplier-okko.c015 · code · android; прошивка — · movie_suppliers_update.sh с зашитыми id = okko и caption = %tr%title_supplier пишет описатель в $FS_PREFIX/flashdata/plugins_data/dunemdb_supplier_okko/movie_suppliers/okko; bin = cd <каталог bin> && , где run_cmd — ./run.py при пустом FS_PREFIX, иначе $FS_PREFIX/firmware_ext/php/php-cgi -f ./run.php. ↩

    • plg-ds-dunemdb-supplier-generic.c004 · code · unknown; прошивка — · В global_actions действия boot_end, install и update (type plugin_system) запускают bin/update_movie_suppliers.sh с условием if="not(firmware_feature(movie_suppliers_update))".
    • plg-ds-dunemdb-supplier-generic.c024 · code · unknown; прошивка — · update_movie_suppliers.sh завершается с кодом 1 без $FS_PREFIX/firmware_ext/php/php-cgi и с кодом 0, если в $FS_PREFIX/tmp/firmware_features.txt нет newgui2021; иначе exec php-cgi -f <каталог плагина>/bin/update_movie_suppliers.php с переданными аргументами.

    ↩

    • plg-ds-dunemdb-supplier-megogo.c004 · code · android; прошивка — · В global_actions действия boot_end, install и update (type plugin_system) запускают bin/register_supplier.sh с условием if="not(firmware_feature(movie_suppliers_update))".
    • plg-ds-dunemdb-supplier-megogo.c017 · code · android; прошивка — · register_supplier.sh создаёт $FS_PREFIX/tmp/movie_suppliers (если каталога нет) и пишет в файл megogo тот же описатель, что movie_suppliers_update.sh; команда bin тоже выбирается по FS_PREFIX: ./run.py или $FS_PREFIX/firmware_ext/php/php-cgi -f ./run.php.

    ↩

    • plg-ds-dunemdb-supplier-okko.c004 · code · android; прошивка — · В global_actions действия boot_end, install и update (type plugin_system) запускают bin/register_supplier.sh с условием if="not(firmware_feature(movie_suppliers_update))".
    • plg-ds-dunemdb-supplier-okko.c017 · code · android; прошивка — · register_supplier.sh создаёт $FS_PREFIX/tmp/movie_suppliers (если каталога нет) и пишет в файл okko тот же описатель, что movie_suppliers_update.sh; команда bin тоже выбирается по FS_PREFIX: ./run.py или $FS_PREFIX/firmware_ext/php/php-cgi -f ./run.php.

    ↩

    • plg-ds-dunemdb-supplier-megogo.c015 · code · android; прошивка — · movie_suppliers_update.sh с зашитыми id = megogo и caption = %tr%title_supplier пишет описатель в $FS_PREFIX/flashdata/plugins_data/dunemdb_supplier_megogo/movie_suppliers/megogo; bin = cd <каталог bin> && , где run_cmd — ./run.py при пустом FS_PREFIX, иначе $FS_PREFIX/firmware_ext/php/php-cgi -f ./run.php.
    • plg-ds-dunemdb-supplier-megogo.c017 · code · android; прошивка — · register_supplier.sh создаёт $FS_PREFIX/tmp/movie_suppliers (если каталога нет) и пишет в файл megogo тот же описатель, что movie_suppliers_update.sh; команда bin тоже выбирается по FS_PREFIX: ./run.py или $FS_PREFIX/firmware_ext/php/php-cgi -f ./run.php.

    ↩

    • plg-ds-dunemdb-supplier-okko.c015 · code · android; прошивка — · movie_suppliers_update.sh с зашитыми id = okko и caption = %tr%title_supplier пишет описатель в $FS_PREFIX/flashdata/plugins_data/dunemdb_supplier_okko/movie_suppliers/okko; bin = cd <каталог bin> && , где run_cmd — ./run.py при пустом FS_PREFIX, иначе $FS_PREFIX/firmware_ext/php/php-cgi -f ./run.php.
    • plg-ds-dunemdb-supplier-okko.c017 · code · android; прошивка — · register_supplier.sh создаёт $FS_PREFIX/tmp/movie_suppliers (если каталога нет) и пишет в файл okko тот же описатель, что movie_suppliers_update.sh; команда bin тоже выбирается по FS_PREFIX: ./run.py или $FS_PREFIX/firmware_ext/php/php-cgi -f ./run.php.

    ↩

    • plg-dc-dunemdb-supplier-online-movies.c028 · code · unknown; прошивка — · Скрипт bin/movie_suppliers_update.sh пишет описатели поставщиков в $FS_PREFIX/flashdata/plugins_data/<имя плагина>/movie_suppliers (mkdir -p) и делает chmod 777 для $FS_PREFIX/tmp/plugins/<имя плагина>, но сам этот каталог не создаёт.
    • plg-dc-dunemdb-supplier-online-movies.c033 · code · unknown; прошивка — · Устаревший bin/register_supplier.sh пишет описатели напрямую в $FS_PREFIX/tmp/movie_suppliers и включает автоматический поставщик, если файл $FS_PREFIX/config/online_movies_full.txt содержит 1 или отсутствует.

    ↩

  9. fw-tv188b-260827-0003-r24--movie-suppliers.c035 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Перечитывание поставщиков: при наличии /tmp/movie_suppliers_changed.flag (reload_suppliers_if_changed); в первый раз ждёт файл suppliers_prepared_path до 30 раз по 0,1 с ↩↩

    • plg-dc-dunemdb-supplier-movies-rus.c005 · code · unknown; прошивка — · global_actions boot_end, install и update запускают bin/register_supplier.sh действием plugin_system.
    • plg-dc-dunemdb-supplier-movies-rus.c018 · code · unknown; прошивка — · bin/register_supplier.sh создаёт каталог /tmp/movie_suppliers и пишет в файл movies_rus JSON с ключами plugin, caption, langs, bin.
    • plg-dc-dunemdb-supplier-movies-rus.c023 · code · unknown; прошивка — · Плагин регистрируется старым путём: пишет описатель прямо в /tmp/movie_suppliers/movies_rus; элемента params/movie_suppliers в манифесте нет, файла bin/movie_suppliers_update.sh в пакете нет.

    ↩

  10. plg-dc-dunemdb-supplier-movies-rus.c006 · code · unknown; прошивка — · global_actions/uninstall удаляет описатель поставщика командой /bin/rm -f /tmp/movie_suppliers/movies_rus. ↩

    • plg-ds-dunemdb-supplier-generic.c025 · code · unknown; прошивка — · update_movie_suppliers.php читает /flashdata/movie_services/config.json (movie_services_config.services) и /config/services_effective_config.json (services); при отсутствии любого файла или ошибке разбора печатает сообщение и завершается без изменений.
    • plg-ds-dunemdb-supplier-generic.c026 · code · unknown; прошивка — · Скрипт берёт только сервисы с plugin_name == dunemdb_supplier_generic; если у сервиса есть suppliers, регистрирует каждый supplier (caption по умолчанию равен id), иначе — сам сервис (id и caption); включённость определяется по id сервиса в списке services эффективного конфига — если сервис включён, включаются все его suppliers или сам сервис.
    • plg-ds-dunemdb-supplier-generic.c028 · code · unknown; прошивка — · Для выключенных id скрипт удаляет /tmp/movie_suppliers/, считает число изменений и печатает итоговую строку Finished: changes.

    ↩

    • plg-dc-dunemdb-supplier-online-movies.c030 · code · unknown; прошивка — · Автоматический поставщик online_movies описан как потоковый (playback_type stream_special) с play_action на handler entry и control_id play.
    • plg-dc-dunemdb-supplier-online-movies.c031 · code · unknown; прошивка — · Ручной поставщик online_movies_manual отличается тем же play_action с параметром manual=1 и подписью %tr%title_supplier_manual.
    • plg-dc-dunemdb-supplier-online-movies.c036 · code · unknown; прошивка — · В bin/run.php все ветки команд get_episodes, do_file_search, get_stream_url и остальные закомментированы, поэтому любая команда завершается ошибкой unknown command.
    • plg-dc-dunemdb-supplier-online-movies.c033 · code · unknown; прошивка — · Устаревший bin/register_supplier.sh пишет описатели напрямую в $FS_PREFIX/tmp/movie_suppliers и включает автоматический поставщик, если файл $FS_PREFIX/config/online_movies_full.txt содержит 1 или отсутствует.

    ↩

    • plg-ds-dune-hd-tv.c048 · code · unknown; прошивка — · install.sh завершается, если в $FS_PREFIX/tmp/firmware_features.txt нет newgui2021; иначе вызывает register_movie_suppliers.sh.
    • plg-ds-dune-hd-tv.c049 · code · unknown; прошивка — · register_supplier_amediateka.sh и register_supplier_start.sh при найденном php-cgi пишут JSON-описатели $FS_PREFIX/tmp/movie_suppliers/DuneHDTVAmediateka и DuneHDTVStart с ключами plugin, key_show_only_one, caption, langs, supported_video_types, bin, playback_type stream_special, play_action, server_managed, special_category, special_category_caption, sticker_icon_url, logo_icon_url.
    • plg-ds-dune-hd-tv.c050 · code · unknown; прошивка — · play_action описателя поставщика — plugin_handle_user_input плагина dune-hd.tv с handler_id entry, control_id ensure_logged_in, entry_id movie_supplier и supplier_id.

    ↩

    • plg-ds-dune-hd-tv.c051 · code · unknown; прошивка — · Скрипты поставщиков выбирают php-cgi: $FS_PREFIX/firmware_ext/php/php-cgi при HD_APK=1 или platform_kind android, $mydir/87xx/php-cgi или $mydir/86xx/php-cgi по первым двум цифрам platform_kind, иначе exit 1; bin поставщика — « -f /run.php».
    • plg-ds-dune-hd-tv.c052 · code · unknown; прошивка — · В пакете нет каталогов bin/87xx и bin/86xx с php-cgi, на которые ссылаются скрипты поставщиков.

    ↩

    • plg-ds-dune-hd-tv.c057 · code · unknown; прошивка — · bin/run.php — отдельная программа поставщика: принимает ровно один аргумент-команду (get_episodes, do_file_search, get_stream_url), JSON-вход читает из stdin и печатает JSON-результат; ошибка — {"error":{"message":…}}.
    • plg-ds-dune-hd-tv.c058 · code · unknown; прошивка — · run.php берёт access_token из /tmp/plugins/dune-hd.tv/supplier_state.properties, а при отсутствии — POST /auth/device с device_id из /config/dune-hd.tv_plugin_cookies.properties (если device_id там есть), и сохраняет токен обратно в файл состояния.

    ↩

    • plg-ds-dune-hd-tv.c055 · code · unknown; прошивка — · register_movie_suppliers.sh записывает текущее время в $FS_PREFIX/config/mdb_timestamp и создаёт флаг $FS_PREFIX/tmp/plugins/shell_ext/update_epfs_if_needed_flag; uninstall.sh удаляет описатели DuneHDTVMegogo, DuneHDTVMegogoKids, DuneHDTVAmediateka, DuneHDTVStart, а при наличии newgui2021 тоже пишет время и создаёт флаг.
    • plg-ds-dune-hd-tv.c056 · code · unknown; прошивка — · В register_movie_suppliers.sh удаление DuneHDTVMegogo и DuneHDTVMegogoKids идёт по "$dirpath/…", но переменная dirpath в скрипте не задана.

    ↩

    • plg-ds-dune-hd-tv.c053 · code · unknown; прошивка — · bin/movie_suppliers_update.sh при найденном php-cgi пишет те же описатели DuneHDTVAmediateka и DuneHDTVStart в $FS_PREFIX/flashdata/plugins_data/dune-hd.tv/movie_suppliers, причём bin — «cd && -f /run.php».
    • plg-ds-dune-hd-tv.c054 · code · unknown; прошивка — · Скрипт bin/movie_suppliers_update.sh внутри пакета ничем не вызывается; имя movie_suppliers_update встречается только в условиях манифеста not(firmware_feature(movie_suppliers_update)).

    ↩

    • plg-dc-dunemdb-supplier-movies-rus.c035 · code · unknown; прошивка — · get_episodes требует movieInfo.movieExtId; из списка через запятую берётся первый элемент kinopoisk:; если его нет или id <= 0, публикаций нет и функция возвращает пустой список.
    • plg-dc-dunemdb-supplier-movies-rus.c036 · code · unknown; прошивка — · do_get_publications ищет kinopoisk id в Solr на zsolr3.zonasearch.com и берёт mobi_url; при непустом type заменяет http://zona.mobi на https://w122.zona.plus, /movies/ на /tvseries/ и убирает ?pid=ios.

    ↩

    • plg-dc-dunemdb-supplier-movies-rus.c037 · code · unknown; прошивка — · Для не-сериала do_get_publications загружает страницу с Cookie из zonaMobi::getRCPC() и делает публикацией найденный в HTML player data-id; подпись — movieInfo.title.ru, type = video.
    • plg-dc-dunemdb-supplier-movies-rus.c038 · code · unknown; прошивка — · Для сериала do_get_publications проверяет get_headers() и принимает URL публикацией, если в одной из первых трёх строк заголовков есть код 200; id публикации — сам URL.

    ↩

    • plg-dc-dunemdb-supplier-movies-eng.c037 · code · unknown; прошивка — · get_episodes строит OMEpisodes по movieInfo.title.en, year, imdb и tvdb и возвращает {"seasons": <список сезонов; None, если серий нет>}.
    • plg-dc-dunemdb-supplier-movies-eng.c067 · code · unknown; прошивка — · OMEpisodes получает список серий из indexers.episodes.episodes().get(title, year, imdb, tvdb, idx=False).
    • plg-dc-dunemdb-supplier-movies-eng.c068 · code · unknown; прошивка — · seasons() группирует серии по int(season), сортирует сезоны и серии и отдаёт элементы {number, title: '', episodes: [{number, premiered, title}]}; при пустом списке серий возвращает None.

    ↩

    • plg-dc-dunemdb-supplier-movies-eng.c056 · code · unknown; прошивка — · Поиск источников обслуживают 10 потоков resolver_thread, запускаемых __start_resolve_threads(RESOLVE_THREADS_COUNT).
    • plg-dc-dunemdb-supplier-movies-eng.c059 · code · unknown; прошивка — · Поток-резолвер вызывает sourcesResolve для элемента, добавляет пустой debrid, отбрасывает пустой URL и не прошедший проверку, затем добавляет результат через __process_resolved.
    • plg-dc-dunemdb-supplier-movies-eng.c064 · code · unknown; прошивка — · stop() только выставляет флаг stopped (комментарий #TODO: make real stop?), suspend() выставляет паузу резолверов, resume() её снимает.

    ↩

    • plg-dc-dunemdb-supplier-movies-eng.c052 · code · unknown; прошивка — · Порядок источников задаётся картами providers_order и sources_order от сервера, качество — QUALITY_ORDER = [1080p, hd, sd]; sortKey = quality_num1000000 + provider_num1000 + sources_num.
    • plg-dc-dunemdb-supplier-movies-eng.c054 · code · unknown; прошивка — · OMServerClient читает порядок источников из /config, кэширует ответ в config_cache.json и загружает его в фоновом потоке order_lists_loader.

    ↩

    • plg-dc-dunemdb-supplier-online-movies.c080 · code · unknown; прошивка — · JacketDB получает шаблон запроса из http://dune-club.info/plugins/ext/plugins/dunemdb_supplier_online_movies/config.txt; по умолчанию используется https://s1.dune-club.info/plugins/dunemdb_supplier_online_movies/q?q=%s.
    • plg-dc-dunemdb-supplier-online-movies.c081 · code · unknown; прошивка — · Шаблон запроса JacketDB кэшируется в /config.txt на 7200 с; файл /config/online_movies_jacket.txt, если существует, полностью заменяет шаблон.
    • plg-dc-dunemdb-supplier-online-movies.c082 · code · unknown; прошивка — · JacketDB принимает шаблон запроса только с префиксом http:// или https:// и ровно одним плейсхолдером %s; иначе считает его невалидным и повторяет запрос через 60 с.

    ↩

    • plg-dc-dunemdb-supplier-online-movies.c085 · code · unknown; прошивка — · JacketDB отбрасывает дубли по строке source:S:L:size:title, формирует group_id из simplify(title,64), md5(title.source) и size_raw, а также пишет отладочный список в /tmp/run/omov_last_list.json.
    • plg-dc-dunemdb-supplier-online-movies.c098 · code · unknown; прошивка — · LangHelper при языке не ru/uk/kk включает avoid_cyr, отбрасывает раздачи с кириллицей и нулевой пригодностью и сортирует остальные: +4 за «+ original», +2 за «оригинальный видеоряд», +1 за eng; записи без кириллицы получают 99.
    • plg-dc-dunemdb-supplier-online-movies.c120 · code · unknown; прошивка — · JacketDB::support_search_with_year возвращает false, поэтому MovieTorrents ищет только по названию (год в запрос JacketDB не передаётся); TorLookDB возвращает true.

    ↩

    • plg-dc-dunemdb-supplier-online-movies.c075 · code · unknown; прошивка — · MovieTorrents::cmp_torrents сортирует сначала по bonus, затем по invalid, затем по good_ids, затем по числу несовпадений с настройками min_s/min_q/max_q; при sort_video_streams=availability сравнивает seeders, при auto — коэффициент s_coef(seeders, качество), дальше quality, seeders, size_mb (больше — раньше), имя и id.
    • plg-dc-dunemdb-supplier-online-movies.c076 · code · unknown; прошивка — · make_reordered_torrents при sort_video_streams=quality пропускает invalid и не входящие в good_ids торренты и набирает до двух торрентов каждого разрешения (2160p, 1080p, 720p, SD), максимум 8; если ничего не набрано, берёт первые 10; выбранные ставятся в начало списка.
    • plg-dc-dunemdb-supplier-online-movies.c109 · code · unknown; прошивка — · TorrentsScreen по зелёной кнопке переключает sort_video_streams и инвалидирует папку; в режиме chosen_only при выборе торрента вне «схлопнутого» списка открывает папку all с post_action на выбранный торрент.

    ↩

    • plg-dc-dunemdb-supplier-movies-eng.c036 · code · unknown; прошивка — · movieExtId разбирается как список пар «ключ:значение» через запятую; плагин использует только imdb и tvdb.
    • plg-dc-dunemdb-supplier-movies-eng.c066 · code · unknown; прошивка — · OMEpisodes по умолчанию подставляет imdb = 0 и tvdb = 0, если соответствующий id пуст или None.

    ↩

  11. plg-dc-dunemdb-supplier-movies-rus.c047 · code · unknown; прошивка — · Для остальных типов do_file_search заново получает публикации, резолвит поток по pub->id и кладёт файл с id = JSON {pub_id, file_url = pub->id}, caption публикации и quality HD; неудачные публикации пропускаются. ↩

  12. plg-dc-dunemdb-supplier-online-movies.c078 · code · unknown; прошивка — · TorrentInfo кодирует разрешение константами QRES_2160P=700 … QRES_SD=100, тип источника — QTYPE_BLURAY=90 … QTYPE_HDRIP=10, HDR — QDR_, DVD — QSD_; итоговое quality = res + type + hdr/sd. ↩

  13. plg-dc-dunemdb-supplier-online-movies.c079 · code · unknown; прошивка — · TorrentInfo::has_episode возвращает false для invalid, для single_episode требует совпадения s и e, для диапазона эпизодов проверяет сезон и границы episodes.from/to с поправкой на сумму эпизодов предыдущих сезонов. ↩

  14. plg-hdtv-freetv.c025 · code · unknown; прошивка — · Категории видеотеки заданы в коде: «Фильмы», «Сериалы», «Мультфильмы», «Аниме» с URL MEDIA_URL + /film/?type=..., а для фильмов и сериалов — 33 жанра с genre_id. ↩

  15. plg-hdtv-zlostnyi-iptv.c071 · code · unknown; прошивка — · Категории медиатеки bcu заданы в коде, а не из плейлиста: единственная категория «BCU Кинопремьера» (строка «Медиатека» закомментирована); перед ней — пункты «Избранное» (если VOD_FAVORITES_SUPPORTED и корень) и «Поиск» с media_url 'search_screen'. ↩

  16. plg-hdtv-peerstv.c015 · code · unknown; прошивка — · VOD-категории читаются XML-документом с корнем vod_categories, вложенные vod_categories дают подкатегории; список фильмов — XML с корнем movies, карточка фильма — movie_info с полями caption, description, poster_url, length, year, director, actors, genres, рейтингами и series/item. ↩

    • plg-hdtv-pirates-radio.c046 · code · unknown; прошивка — · Категории VOD запрашиваются с online.dune-hd.com/demo2/vod_categories.pl, рекурсивно разбираются по вложенным vod_categories и превращаются в DemoVodCategory с id, caption и icon_url; для категории без подкатегорий список фильмов запрашивается с movie_list.pl?category_id=, а категория с подкатегориями открывает их список.
    • plg-hdtv-pirates-radio.c047 · code · unknown; прошивка — · Карточка фильма запрашивается с movie_info.pl?movie_id=; из ответа movie_info заполняются поля Movie (caption, description, poster, length, year, director, actors, genres, рейтинги, страна, бюджет), а из series/item добавляются серии с playback_url.

    ↩

    • plg-hdtv-zlostnyi-iptv.c107 · code · unknown; прошивка — · Медиатека edem — демо-VOD Dune: категории из DemoConfig::VOD_CATEGORIES_URL (http://online.dune-hd.com/demo2/vod_categories.pl, XML через simplexml_load_string).
    • plg-hdtv-zlostnyi-iptv.c161 · code · unknown; прошивка — · Медиатека shura — та же демо-VOD Dune, что у edem: константы VOD_CATEGORIES_URL, MOVIE_LIST_URL_FORMAT и MOVIE_INFO_URL_FORMAT указывают на http://online.dune-hd.com/demo2/…, разбор XML через simplexml_load_string.
    • plg-hdtv-zlostnyi-iptv.c164 · code · unknown; прошивка — · Медиатека sharavoz — демо-VOD Dune: категории, список фильмов и карточка фильма читаются XML с http://online.dune-hd.com/flussonic2/… через simplexml_load_string; поиск и избранное VOD отключены (VOD_FAVORITES_SUPPORTED = false, файла *_search_screen.php нет).
    • plg-hdtv-zlostnyi-iptv.c165 · code · unknown; прошивка — · Медиатека tvteam — демо-VOD Dune: категории, список фильмов и карточка фильма читаются XML с http://online.dune-hd.com/flussonic2/… через simplexml_load_string; поиск и избранное VOD отключены (VOD_FAVORITES_SUPPORTED = false, файла *_search_screen.php нет).
    • plg-hdtv-zlostnyi-iptv.c027 · code · unknown; прошивка — · BcuConfig содержит URL демо-VOD Dune (online.dune-hd.com/flussonic2: vod_categories.pl, movie_list.pl, movie_info.pl), но в bcu эти константы нигде не используются — медиатека строится из M3U.

    ↩

  17. plg-hdtv-altv.c029 · code · unknown; прошивка — · Видеотека плагина — демонстрационная: категории, список фильмов и карточка фильма запрашиваются у online.dune-hd.com по путям /demo2/vod_categories.pl, /demo2/movie_list.pl и /demo2/movie_info.pl. ↩

    • plg-hdtv-moidom.c017 · code · unknown; прошивка — · VOD-каталог: экран категорий предлагает «Избранное», «Поиск», «Все фильмы» и «Категории» (жанры); список фильмов запрашивается vod_list.php с type=text (поиск), type=last (все) или type=last&genre=; карточка — vod_info.php?id=, ссылка на файл — vod_geturl.php?fileid=.
    • plg-hdtv-moidom.c018 · code · unknown; прошивка — · try_load_movie формирует Movie из data->film (name, description, poster с базой http://iptv.myvnc.com, lenght, year, director, actors, genre_str, country->name, budget) и добавляет серии из data->film->videos->item с URL из get_vod_url(item->id); get_vod_stream_url игнорирует полученный API-URL и возвращает playback_url с заменой http:// на http://mp4://.

    ↩

    • plg-hdtv-zlostnyi-iptv.c160 · code · unknown; прошивка — · Медиатека ottclub — JSON API http://api.iptvx.tv: категории из корня, жанры из /cat//genres, список из /genres/?page=N, новинки из /filter/new, поиск из /filter/by_name?name=…; при воспроизведении к URL фильма добавляются хост из cookie server и «?ott_key=».
    • plg-hdtv-zlostnyi-iptv.c162 · code · unknown; прошивка — · Медиатека shara-club — JSON: шаблоны dune/shara/vod_playlist1 и vod_playlist2 дают базовый URL (второй — при ответе первого «nottoken» или пустом ответе), к URL приклеиваются «-», ответ кэшируется в /tmp/shara_vod_playlist.json; категории и фильмы разбираются из полей category/id/series_id этого JSON.

    ↩

    • plg-hdtv-jurt.c024 · code · unknown; прошивка — · VOD-список BtvVodListScreen запрашивает по 24 элемента на страницу; page_name last/best/search/genres выбирает api_vod_list_last/best/search/genres, остальные значения — ошибка.
    • plg-hdtv-jurt.c025 · code · unknown; прошивка — · Карточка VOD-фильма строится из закэшированного ответа videos/list: name, description, thumbnail_big, duration/60, year, director, actors, genre; файлы video->files становятся сериями.

    ↩

  18. plg-hdtv-megaanime.c040 · code · unknown; прошивка — · SmotretAnime отдаёт JSON через api/series (поля id, titleLines, posterUrl, year, genres, numberOfEpisodes, myAnimeListScore, worldArtScore) и api/translations; озвучка voiceRu превращается в /api/translations/embed/, а обложки идут через do_img. ↩

  19. plg-hdtv-smart-vod.c341 · code · unknown; прошивка — · get_catalog_сategories Vimeo при первом вызове (static $categories и $subcategories ещё null) запрашивает API_URL . "/categories?access_token=" и для каждой категории сохраняет name→uri, а также подкатегории из metadata->connections (ключи с ucfirst) и из поля subcategories (uri . "/videos"); get_main_subcategories при category_id=catalog_сategories возвращает этот список. ↩

    • plg-hdtv-zlostnyi-iptv.c072 · code · unknown; прошивка — · BcuConfig::getVideoList отбирает из /tmp/vod_playlist.m3u строки #EXTINF с group-title = category_id; id фильма — номер строки в файле, постер — tvg-logo (по умолчанию mov_unset.png).
    • plg-hdtv-zlostnyi-iptv.c073 · code · unknown; прошивка — · BcuVod::try_load_movie находит фильм по номеру строки, URL берёт из следующей строки и создаёт Movie с одной серией (add_series_data); описания, года и рейтингов нет — поля пустые.
    • plg-hdtv-zlostnyi-iptv.c163 · code · unknown; прошивка — · Медиатека smile — M3U: шаблон dune/smile/playlist_vod1 получает замены «--token--» и «--pass--», скачанный плейлист пишется в /tmp/smile_vod_playlist.m3u, а фильм воспроизводится с префиксом «http://mp4://».

    ↩

    • plg-hdtv-smart-vod.c278 · code · unknown; прошивка — · Kinogo.so строит меню категорий из шести фиксированных пунктов (Все, Премьеры, Все Сериалы, Аниме, Мультфильмы, TV) и блоков i style=font-size:14px, пропуская ссылки action=mobile; ответы сайта конвертируются из WINDOWS-1251 в UTF-8.
    • plg-hdtv-smart-vod.c283 · code · unknown; прошивка — · KinoStorm.Net строит категории из блоков div.nav-title и разбивает вложенные ссылки на /film, /serial и /multfilm по порядковому номеру группы 0, 1 и 2.
    • plg-hdtv-smart-vod.c286 · code · unknown; прошивка — · KinoTochka.Club строит категории из ссылок fa-film и блока /topusers/: ссылки collections пропускает, на ссылке # начинает новую category_N, на anime или show сбрасывает её, при сброшенной категории добавляет обычный пункт с HOST_API_URL, иначе — подкатегорию с заменой /cartoon/ на /cartoons/; пути /new/, /films/, /series/, /cartoon/ заменяются на /premieres/, /allfilms/, /serials/, /cartoons/.

    ↩

  20. ↩

    • plg-hdtv-megaanime.c036 · code · unknown; прошивка — · Категории Shikimori строятся из HTML-меню https://shikimori.org/animes/menu (kind/season) и списка студий /studios; пункты kind/season ведут на /animes/kind/ и /animes/season/, а обложки студий проксируются через do_img.
    • plg-hdtv-megaanime.c037 · code · unknown; прошивка — · Категории AniDUB заданы фиксированными путями https://anidub.tv/anime/anime_ongoing/, /anime/full/, /anime/, /anime_movie/, /anime_ova/, /dorama/ и списками жанров, даберов и годов, которые парсятся из главной страницы.
    • plg-hdtv-megaanime.c038 · code · unknown; прошивка — · Категории Animedia.tv (online.animedia.tv) и Animedia.tv Tracker (tt.animedia.tv) заданы AJAX-путями /ajax/search_result*, а жанры, озвучка, студии и годы парсятся из /search или /catalog и превращаются в /ajax/search_result(_search_page)/P0?limit=12&….

    ↩

    • plg-hdtv-smart-vod.c108 · code · unknown; прошивка — · get_all_folder_items категорий эталона для пункта, отсутствующего в hide_id, с URL, начинающимся с http, строит адрес SmartVodListScreen; проверка hide_id предшествует проверке URL.
    • plg-hdtv-smart-vod.c109 · code · unknown; прошивка — · get_all_folder_items категорий эталона упорядочивает элементы через ksort по позициям из group_list либо последовательным индексам от 1000.

    ↩

  21. plg-hdtv-freetv.c026 · code · unknown; прошивка — · В списке фильмов кнопка «Все/RUS» добавляет к category_id суффикс &country_id=5; для animation/tv и поиска фильтр сбрасывается. ↩

  22. plg-hdtv-freetv.c061 · code · unknown; прошивка — · В DemoTv объявлены статические методы, которые вызывает пакет: getVideoList (список фильмов по category_id/genre_id, номер страницы — в m_feed), getSearchList (поиск MEDIA_URL/film/poisk.php?q=), parse_video_page (карточка фильма; для kinopoisk.ru/api/person — SERVER/free_tv/Kinobase.php), get_vvod_stream_url (выбор HLS-дорожки по cookie video_quality). ↩

  23. plg-hdtv-smart-apps.c107 · code · unknown; прошивка — · Список фильмов Wallpaper листает каталог через m_feed; вне поиска (category_id != 'search') при auto_bookmark==1 сохраняет в tmp autoBookmarkArr позицию m_feed-3 для desktoppr и m_feed-2 для wallpaperabyss. ↩

  24. plg-hdtv-jurt.c024 · code · unknown; прошивка — · VOD-список BtvVodListScreen запрашивает по 24 элемента на страницу; page_name last/best/search/genres выбирает api_vod_list_last/best/search/genres, остальные значения — ошибка. ↩

  25. plg-hdtv-smart-vod.c318 · code · unknown; прошивка — · getVideoList MoviesTape при m_feed, отличном от end, запрашивает HOST_API_URL . category_id, при m_feed>0 добавляет page/(m_feed+1), конвертирует ответ WINDOWS-1251→UTF-8 и ставит m_feed=end, если в тексте есть span>  →, иначе увеличивает m_feed; do_parse_page берёт блок div id='dle-content' до div class="r-block" и строит ShortMovie по src/title/href. ↩

    • plg-hdtv-folder-cache-vod.c085 · code · unknown; прошивка — · Cursor::parse_page разбирает JSON YouTube API: nextPageToken сохраняется в m_next_ref (иначе stop), id.videoId/playlistId/channelId задают тип элемента, а snippet даёт title, description, channelTitle, channelId, publishedAt, thumbnails и liveBroadcastContent; поиск строится как /search?order=…&part=snippet&q=…&type=…&maxResults=50&pageToken=….
    • plg-hdtv-folder-cache-vod.c094 · code · unknown; прошивка — · Для плейлиста parse_season и parse_season_info запрашивают /playlistItems по 50 элементов и добирают страницы по nextPageToken в цикле do-while, который продолжается только при $i == 25.

    ↩

    • plg-hdtv-smart-vod.c342 · code · unknown; прошивка — · getVideoList Vimeo при m_feed=end возвращает пустой массив; при m_feed=0 выбирает URL по genre_id: tag_url — API_URL . category_id . "?access_token=…", related — тот же URL с filter=related, иначе с sort=; при другом m_feed использует его как URL; при наличии paging->next ставит m_feed = API_URL . paging->next, иначе end; do_shortmovie строит элементы по uri, name, pictures->sizes[2]->link, width/height, duration, release_time/modified_time, user и tags.
    • plg-hdtv-smart-vod.c343 · code · unknown; прошивка — · getSearchList Vimeo при m_feed=end возвращает пустой массив; при category='' и m_feed=0 запрашивает API_URL . "/videos?query=&sort=&access_token=…", иначе API_URL . "/?query=…"; при m_feed, отличном от 0, использует m_feed как URL; paging->next сохраняется в m_feed, иначе end.

    ↩

  26. plg-hdtv-smart-apps.c085 · code · unknown; прошивка — · getVideoList Wallpaper листает desktoppr по наличию pagination->next, alphacoders — по success==1; при отсутствии признака следующей страницы m_feed становится end. ↩

  27. plg-dune-remote-control.c039 · code · unknown; прошивка — · Пагинация ls: при непустом head список строит list_directory_contents с head и tail, иначе scandir; в list_directory_contents head приводится к int и при head<0 становится 0, tail<=head — head+1, DirectoryIterator seek(head) отдаёт имена, пока tail>head++. ↩

    • plg-gh-rpervykh-dune-plugin-anidub-com.c065 · code · unknown; прошивка — · ex_view_info открывает папку с info=1 и video_id/season_ref выбранного элемента только при наличии video_id.
    • plg-gh-rpervykh-dune-plugin-anidub-com.c076 · code · unknown; прошивка — · Если не сработали предыдущие ветви, а user_data содержит info (в том числе при season_ref), плагин возвращает movie-папку с полями PluginMovie из parse_season_info, right_button для добавления или удаления из избранного, has_multiple_series = (n_series > 1) и series_media_url с season_ref, season_title и n_series.
    • plg-gh-rpervykh-dune-plugin-anidub-com.c101 · code · unknown; прошивка — · parse_season_info извлекает title, image_src, «Описание», «Год», «Перевод», «Страна», «Жанр» и «Режиссер»; actors остаётся пустым, duration_min = 0.

    ↩

    • plg-hdtv-folder-cache-vod.c155 · code · unknown; прошивка — · parse_season_info() для streamit собирает title, IMDb-постер, description, actors (со страницы «Mehr Infos»), duration, year, country, genre, original title, votes, director и IMDb-рейтинг и возвращает HD::encode_user_data с video_id, n_series, page_ref, video_image_url, title, genre, country, year, duration, duration_min, director, actors, description, name_original, kp_rating, fullscreen и imdb_rating.
    • plg-hdtv-folder-cache-vod.c156 · code · unknown; прошивка — · parse_season_info() во всех трёх ветках безусловно ставит n_series = '2', поэтому PluginMovieFolderView::has_multiple_series (n_series > 1) всегда истинно.

    ↩

  28. plg-hdtv-folder-cache-vod.c095 · code · unknown; прошивка — · parse_season_info для видео берёт /videos с part=snippet,contentDetails,statistics,status, показывает duration, likeCount, dislikeCount, viewCount и commentCount, а при show_comment=yes и commentCount>0 запрашивает комментарии старым gdata-адресом http://gdata.youtube.com/feeds/api/videos//comments. ↩

  29. plg-hdtv-megaanime.c045 · code · unknown; прошивка — · Отзывы в карточке фильма загружаются parse_film_review постранично для AniFilm, AnimeVost, Anime-Best, AniMedia/Tracker (JSON /ajax/comment), Shikimori (/summaries) и AniDUB (/engine/ajax/comments.php); VodMovieScreen::handle_user_input показывает по одному отзыву с кнопкой «Далее -->» и запоминает страницу в commentСounter. ↩

    • plg-hdtv-altsource.c064 · code · unknown; прошивка — · Информацию о фильме по Kinopoisk ID плагин берёт с https://filmov.ml/filmov.php?method=info&id= и переносит в поля caption, caption_original, year, country, genres, scenario, director, actors, description, rate_kinopoisk, rate_imdb и class_info/trailers; постер — http://st.kp.yandex.net/images/film_iphone/iphone360_.jpg.
    • plg-hdtv-altsource.c065 · code · unknown; прошивка — · Поиск Kinopoisk ID идёт через http://www.kinopoisk.ru/api/suggest/v2/?query=<...> с заголовком x-requested-with: XMLHttpRequest; из ответа берутся только typename Film и TvSeries (для персон — Person).
    • plg-hdtv-altsource.c070 · code · unknown; прошивка — · HD::http_get_document отключает проверку TLS-сертификата и хоста (CURLOPT_SSL_VERIFYPEER=0, CURLOPT_SSL_VERIFYHOST=0), ставит таймауты 30 с, следует редиректам, представляется Chrome 80 и возвращает тело ответа даже при HTTP-коде, отличном от 200, печатая ошибку в stdout.

    ↩

  30. plg-hdtv-smart-vod.c176 · code · unknown; прошивка — · parse_recommend_items Zona.mobi получает рекомендации через https://relap.io/api/v6/similar_pages.js с widget_id и URL страницы. ↩

    • plg-dc-torrent-center.c103 · code · unknown; прошивка — · Movie::get_vod_info заполняет series из PluginVodSeriesInfo с playback_url и playback_url_is_stream_url каждого файла.
    • plg-dc-torrent-center.c104 · code · unknown; прошивка — · ActionFactory::vod_play возвращает PLUGIN_VOD_PLAY_ACTION_ID с параметром PluginVodPlayActionData::vod_info.

    ↩

  31. plg-gh-rpervykh-dune-plugin-anidub-com.c106 · code · unknown; прошивка — · get_vod_info возвращает PluginVodInfo с name, description, poster_url, initial_series_ndx из ndx_series, buffering_ms из cookie buf_time и series; playback_url каждой серии — episode_ref с добавленным &season_ref=, playback_url_is_stream_url=false. ↩

  32. plg-hdtv-folder-cache-vod.c025 · code · unknown; прошивка — · get_vod_info() для media_url, отличного от dummy, возвращает PluginVodInfo с name, description, poster_url, initial_series_ndx, buffering_ms и series; при dummy — пустой массив, а без season_ref и video_id — исключение; каждая серия — PluginVodSeriesInfo с name, playback_url и playback_url_is_stream_url=false. ↩

    • plg-gh-sndpl-apple-trailers-dune-plugin.c045 · code · unknown; прошивка — · generatePlayInfo возвращает PluginVodInfo: name = название фильма, description = '', poster_url = постер фильма, series из одной PluginVodSeriesInfo с name = тип трейлера, initial_series_ndx = 0, initial_position_ms = 0, advert_mode = false, ip_address_required = true, valid_time_required = false.
    • plg-gh-sndpl-apple-trailers-dune-plugin.c046 · code · unknown; прошивка — · Серия PluginVodSeriesInfo получает playback_url 'http://mp4://127.0.0.1:7070/?trailer=' и playback_url_is_stream_url = true.
    • plg-gh-sndpl-apple-trailers-dune-plugin.c048 · code · unknown; прошивка — · В пакет не входят каталог bin/ и файл dunetrailers: внешний сервер плагин ожидает в install_dir/bin.

    ↩

  33. plg-hdtv-folder-cache-vod.c096 · code · unknown; прошивка — · При playlistItem=0, pl_create, отличном от no, и сохранённом oMediaUrl parse_season собирает плейлист из элементов текущей папки; при pl_create=2 переворачивает их порядок, а playAll=1 ставится в обоих случаях. ↩

  34. plg-gh-rpervykh-dune-plugin-anidub-com.c110 · code · unknown; прошивка — · Иначе, если URL содержит vk.com, get_vod_stream_url скачивает страницу и читает video_no_flv и video_host; при не-FLV читает video_uid, video_vtag и video_max_hd, собирает URL с префиксом mp4:// и ограничивает качество значением video_max_hd; при FLV собирает assets/videos/ с vtag и vkid и суффиксом .vk.flv. ↩

    • plg-gh-sndpl-apple-trailers-dune-plugin.c038 · code · unknown; прошивка — · getTrailerFiles возвращает файлы только если трейлер найден: сначала берёт закэшированный $trailer->trailerFiles, иначе парсит XML, при null переходит на HTML, и результат, отличный от null, сохраняет в $trailer->trailerFiles.
    • plg-gh-sndpl-apple-trailers-dune-plugin.c044 · code · unknown; прошивка — · generatePlayInfo сначала вызывает startServer, затем находит фильм по location, трейлер по location и type и берёт файл по fileIndex из getTrailerFiles.

    ↩

  35. plg-hdtv-folder-cache-vod.c035 · code · unknown; прошивка — · Youtube_api.php в SmotriMultik и Videokub ищет конфиг плеера по regex /yt.playerConfig = ({.});/, а в остальных вариантах — по /ytplayer.config = ({.});/. ↩

    • plg-hdtv-folder-cache-vod.c079 · code · unknown; прошивка — · Корневой utils.php YouTubeMult задаёт HOST_API_URL https://www.googleapis.com/youtube/v3; плагин запрашивает у этого API методы /channels, /search, /videos и /playlistItems.
    • plg-hdtv-folder-cache-vod.c084 · code · unknown; прошивка — · Если в media_url есть channelId, General_main строит меню канала по /channels и /search. Иначе при наличии tmp-файла category_info он берёт готовый список через HD::get_items_tmp, а без него строит категории из data/channel_list.xml: для каждого item с username или external_id запрашивает /channels, добавляет пункты [videos] и [playlists] через /search, а [live] — по /search?eventType=live при totalResults > 0, после чего кэширует список в category_info.

    ↩

  36. plg-hdtv-freetv.c062 · code · unknown; прошивка — · В ветках /validate/, obrut, ALLOHA и videoseedcdn.com get_vvod_stream_url выбирает дорожку по cookie video_quality: 4=1080, 3=720, 2=480, 1=360 (по умолчанию 4); в /validate/ и videoseedcdn.com из RESOLUTION= берётся максимальная дорожка не выше выбранной. ↩

    • plg-hdtv-smart-apps.c082 · code · unknown; прошивка — · Для desktoppr Wallpaper использует https://api.desktoppr.co/1/wallpapers?page= и desktoppr_random; для wallpaperabyss — API wall.alphacoders.com с методами random, newest, highest_rated, by_views, by_favorites, popular, featured, а также category_list и collection_list.
    • plg-hdtv-smart-apps.c083 · code · unknown; прошивка — · Подкатегории wallpaperabyss загружаются методами API category_list, collection_list и sub_category_list; для категории и подкатегории используются method=category&id= и method=sub_category&id= с параметром page.

    ↩

    • plg-hdtv-smart-vod.c126 · code · unknown; прошивка — · HdKinoTeatr.Com извлекает категории из HTML главной страницы через class="cats" и ссылки href.
    • plg-hdtv-smart-vod.c128 · code · unknown; прошивка — · При совпадении шаблона var vkArr в parse_video_page HdKinoTeatr.Com массив декодируется как JSON; последующий foreach использует file/comment его элементов для формирования источников фильма.

    ↩

  37. plg-hdtv-smart-vod.c289 · code · unknown; прошивка — · knigavuhe строит каталог из ссылок a.index_genre с количеством книг в index_genre_count, а разделы «Авторы» и «Исполнители» — из списка букв блока _letters соответствующей страницы; список кэшируется отдельно для каждой категории. ↩

  38. plg-hdtv-smart-vod.c291 · code · unknown; прошивка — · knigavuhe разбирает список книг по блокам bookkitem, подставляет обложку через CGI do?img=, берёт автора из author_label, время из bookkitem_meta_time, жанр и описание. ↩

  39. plg-hdtv-smart-vod.c292 · code · unknown; прошивка — · knigavuhe разбирает страницу авторов и исполнителей по ссылкам _item с количеством книг _item_books_count и подставляет иконку author.png либо reader.png в зависимости от сегмента author или reader в URL. ↩

  40. plg-hdtv-smart-vod.c330 · code · unknown; прошивка — · get_main_subcategories Filmix_API при cat=s0, s7 или s14 строит URL каталога HOST_API_URL . "/catalog?orderby=year&filter=" для пункта «Все», "...&filter=-q4" для «4K» и "...&filter=-" для остальных; getVideoList при m_feed, отличном от end, добавляет &page= при m_feed>0, ставит end при ответе "[]" и иначе увеличивает m_feed; do_parse_page читает JSON-поля poster, title, id, year, quality, original_title, countries, categories и заменяет /w220/ на /w160/ и _0.jpg на .jpg. ↩

  41. plg-hdtv-rain-tv.c027 · code · unknown; прошивка — · RainVod::load_movies создаёт на каждый элемент Config::$ICONS_GENRES_MAP ShortMovie(id, name, null) и Movie с series_data (playback_url = stream_url, playback_url_is_stream_url=true); класс в RainPlugin не создаётся. ↩

    • plg-hdtv-surface-family.c114 · code · unknown; прошивка — · В LSS объявлены VOD_MOVIE_PAGE_SUPPORTED = true и VOD_FAVORITES_SUPPORTED = true и лежат 9 файлов lib/vod/, но surface_plugin.php не подключает VOD и регистрирует единственный экран SurfaceTvChannelListScreen; www/, translations/ и setup_screen.php в пакете отсутствуют.
    • plg-hdtv-surface-family.c122 · code · unknown; прошивка — · В пакете Radiopotok.ru лежат 9 файлов lib/vod/, но surface_plugin.php не подключает VOD и регистрирует только SurfaceTvChannelListScreen и DemoSetupScreen; VOD-классы и VOD-экраны не используются, как и у LSS.

    ↩

  42. plg-gh-valerievitch-dune-plugin-acestreamsearch.c090 · code · unknown; прошивка — · AceSearchTv::history_delete при наличии истории удаляет запрос из JSON-объекта и записывает обновлённый JSON обратно в plugin_cookies->history. ↩

  43. plg-hdtv-zlostnyi-iptv.c077 · code · unknown; прошивка — · HD::get_items/save_items/get_item/save_item (дополнение копии lib) хранят данные файлами в DuneSystem::$properties['data_dir_path'] . '/' . <имя>; списки — через serialize. ↩

    • plg-gh-rpervykh-dune-plugin-anidub-com.c052 · code · unknown; прошивка — · Диалог поиска содержит текстовое поле search с has_osk в зависимости от use_osk, кнопку «Искать» (close_dialog_and_apply) и «Отмена»; при use_osk=yes добавляется вертикальный отступ 500, иначе 50.
    • plg-gh-rpervykh-dune-plugin-anidub-com.c053 · code · unknown; прошивка — · Ввод search сохраняет последний запрос в plugin_cookies->search и перерисовывает диалог через reset_controls.
    • plg-gh-rpervykh-dune-plugin-anidub-com.c054 · code · unknown; прошивка — · perform_new_search кодирует последний запрос через urlencode, упаковывает его в media_url как ser_feed и открывает папку PLUGIN_OPEN_FOLDER_ACTION_ID.

    ↩

  44. plg-hdtv-folder-cache-vod.c021 · code · unknown; прошивка — · handle_user_input() разбирает user_input->control_id в switch (search, setup, skin, restart, video_quality, add_favorite, remove_fav, just_play, play_item, view_series, mark_viewed и др.); если control_id не задан или не совпал ни с одним case, возвращает действие PLUGIN_OPEN_FOLDER_ACTION_ID для selected_media_url. ↩

    • plg-gh-rpervykh-dune-plugin-anidub-com.c055 · code · unknown; прошивка — · do_new_search добавляет запрос в историю search_items и инвалидирует текущую папку с post_action perform_new_search.
    • plg-gh-rpervykh-dune-plugin-anidub-com.c057 · code · unknown; прошивка — · remove_search и move_search_top меняют search_items по ser_feed выбранного элемента и обновляют папку main_menu:search через update_regular_folder.
    • plg-gh-rpervykh-dune-plugin-anidub-com.c097 · code · unknown; прошивка — · В main_menu:search плагин первым пунктом добавляет «[Новый запрос]» с пустым ser_feed, затем элементы истории search_items с подписью «поиск: <текст>» и urlencode в ser_feed.

    ↩

  45. plg-hdtv-megaanime.c032 · code · unknown; прошивка — · Экран поиска показывает пункт «[Искать]» и историю запросов из search_items; запрос можно поднять, опустить или удалить, а при поиске с search_choice == 1 и без media_url->name выбирается сайт из getSiteArr либо общий поиск. ↩

  46. plg-hdtv-smart-apps.c103 · code · unknown; прошивка — · Экран поиска Wallpaper хранит историю запросов в search_items; ENTER для сохранённого запроса открывает его папку, для пункта поиска и PLAY — диалог ввода (с экранной клавиатурой при use_osk==1); do_new_search запускает run_search, который сохраняет запрос в search_item и search_items и открывает SmartVodListScreen('search', <текст>, ). ↩

  47. plg-hdtv-smart-vod.c118 · code · unknown; прошивка — · При control_id=run_search эталон удаляет прежний дубль запроса, помещает запрос в начало search_items, сохраняет его и возвращает открытие поиска после инвалидирования search_screen. ↩

  48. plg-hdtv-freetv.c027 · code · unknown; прошивка — · Экран поиска хранит историю запросов в HD::get_items('search_items')/HD::save_items('search_items'), а последний запрос — в HD::save_item('search_item'). ↩

    • plg-hdtv-zlostnyi-iptv.c076 · code · unknown; прошивка — · BcuSearchScreen ведёт историю запросов: run_search сохраняет последний запрос HD::save_item('search_item') и список HD::save_items('search_items') (новый — в начало, без повторов) и открывает BcuVodListScreen('search', запрос); кнопки: ENTER — открыть/поиск, PLAY — клавиатура, B_GREEN «Поднять», C_YELLOW «Опустить», D_BLUE «Удалить».
    • plg-hdtv-zlostnyi-iptv.c077 · code · unknown; прошивка — · HD::get_items/save_items/get_item/save_item (дополнение копии lib) хранят данные файлами в DuneSystem::$properties['data_dir_path'] . '/' . <имя>; списки — через serialize.

    ↩

    • plg-gh-valerievitch-dune-plugin-acestreamsearch.c034 · code · unknown; прошивка — · AceSearchTvGroupListScreen задаёт четыре режима сортировки истории: alphabet, usage_count, last_used, added; текущий режим хранится в статическом $sort_mode.
    • plg-gh-valerievitch-dune-plugin-acestreamsearch.c091 · code · unknown; прошивка — · AceSearchTv::history_sort_cb сравнивает элементы истории по текущему режиму сортировки через strnatcasecmp($b[$mode], $a[$mode]) — по убыванию строкового значения.
    • plg-gh-valerievitch-dune-plugin-acestreamsearch.c038 · code · unknown; прошивка — · В AceSearchTvGroupListScreen обработчик history_delete при выбранной группе показывает диалог подтверждения с кнопками really_history_delete и cancel; ветка really_history_delete (elseif после history_delete) удаляет запрос из истории и инвалидирует папку экрана.
    • plg-gh-valerievitch-dune-plugin-acestreamsearch.c090 · code · unknown; прошивка — · AceSearchTv::history_delete при наличии истории удаляет запрос из JSON-объекта и записывает обновлённый JSON обратно в plugin_cookies->history.
    • plg-gh-valerievitch-dune-plugin-acestreamsearch.c092 · code · unknown; прошивка — · AceSearchTv::load_groups при отсутствии plugin_cookies->history создаёт три начальные записи: Discovery, "Футбол 1 HD" и "Футбол 2 HD" (комментарий TODO).

    ↩

    • plg-gh-valerievitch-dune-plugin-acestreamsearch.c031 · code · unknown; прошивка — · AceSearchScreen наследует VodSearchScreen, но вызывает конструктор AbstractControlsScreen напрямую (AbstractControlsScreen::__construct(self::ID)) и вручную присваивает $this->vod = $tv, обходя конструктор VodSearchScreen(Vod $vod).
    • plg-gh-valerievitch-dune-plugin-acestreamsearch.c032 · code · unknown; прошивка — · Базовый VodSearchScreen по action_type=apply и control_id=pattern сохраняет шаблон в plugin_cookies->vod_search_pattern и открывает папку, полученную от $this->vod->get_search_media_url_str($pattern).

    ↩

    • plg-hdtv-smart-vod.c127 · code · unknown; прошивка — · getSearchList HdKinoTeatr.Com при m_feed, отличном от end, посылает POST поиска на /index.php?do=search с search_start=m_feed+1 и result_from=1 либо m_feed*10+1 при m_feed>0.
    • plg-hdtv-smart-vod.c156 · code · unknown; прошивка — · Futbik.Net при m_feed, отличном от end, использует POST поиска с шагом result_from=m_feed*70+1 для m_feed>0, иначе result_from=1.
    • plg-hdtv-smart-vod.c161 · code · unknown; прошивка — · Indiakino.net при m_feed, отличном от end, использует POST поиска с шагом result_from=m_feed*12+1 для m_feed>0, иначе result_from=1.
    • plg-hdtv-smart-vod.c157 · code · unknown; прошивка — · KinoKrad.Co после единственного POST поиска безусловно ставит m_feed=end; при входном end возвращает пустой массив.
    • plg-hdtv-smart-vod.c158 · code · unknown; прошивка — · KinoProfi.Org при m_feed, отличном от end, ищет через /search/f:, добавляя /page// при m_feed>0.
    • plg-hdtv-smart-vod.c279 · code · unknown; прошивка — · Kinogo.so ищет DLE-запросом POST /index.php?do=search с result_from=m_feed*10+1 и набором браузерных заголовков (origin, referer, accept-language), конец пагинации — по наличию Позже.
    • plg-hdtv-smart-vod.c275 · code · unknown; прошивка — · Gidonline.net.ua ищет через /?s=<запрос>, для следующих страниц — /page//?s=<запрос>; конец пагинации определяет по отсутствию class='nextpostslink'.
    • plg-hdtv-smart-vod.c271 · code · unknown; прошивка — · Filmix ищет через POST /engine/ajax/sphinx_search.php с scf=fx, story, search_start и фиксированными фильтрами years_ot=1902/years_do=2018, kpi_ot=1/kpi_do=10, imdb_ot=1/imdb_do=10, заголовками X-Requested-With, Referer, Origin и Cookie FILMIXNET из cookie-файла.
    • plg-hdtv-smart-vod.c172 · code · unknown; прошивка — · Zona.mobi при поиске с m_feed, отличным от end, запрашивает search/ с X-Requested-With: XMLHttpRequest и декодирует JSON; при равенстве current_page и total_pages ставит end.

    ↩

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

  50. plg-hdtv-folder-cache-vod.c065 · forum · unknown; прошивка — · В теме 15561 karas-avadim назван «оживлённым плагином от karas71» к немецким сайтам (szene-streams.com, kkiste.to, filmpalast.to, burning-seri.es, live-stream.tv); поиск в версии 1.0.0 не работает. ↩

  51. plg-hdtv-smart-vod.c319 · code · unknown; прошивка — · getSearchList MoviesTape при m_feed>0 или m_feed=end возвращает пустой массив; иначе запрашивает Google Custom Search JSON API по адресу https://www.googleapis.com/customsearch/v1element с key, cx, sig и cse_tok из кода, ставит m_feed=end и оставляет только результаты с URL, оканчивающимся на .html и содержащим /katalog, /erotic/, /dokumentalnyj, /treilers/, /korotkometrazhky/ или /ukrainian/. ↩

  52. plg-hdtv-smart-vod--link-api.c014 · code · unknown; прошивка — · videoSearcher::yohohoVideoSearch отправляет POST на https://ahoy.yohoho.cc с kinopoisk= или title= и списком плееров collaps,bazon,ustore,alloha,hdvb,videocdn,kodik и др., а из ответа строит карту service → iframe. ↩

  53. plg-hdtv-megaanime.c035 · code · unknown; прошивка — · Общий поиск по умолчанию (category == '') перебирает shikimori_search, anidub_search, animediatv_search, tranimediatv_search, animebest_search и animevost_search, затем из ветки animevost_search переходит к smotretanime_search и далее к anifilm_search; getSiteArr smotretanime_search не содержит. ↩

  54. plg-hdtv-folder-cache-vod.c085 · code · unknown; прошивка — · Cursor::parse_page разбирает JSON YouTube API: nextPageToken сохраняется в m_next_ref (иначе stop), id.videoId/playlistId/channelId задают тип элемента, а snippet даёт title, description, channelTitle, channelId, publishedAt, thumbnails и liveBroadcastContent; поиск строится как /search?order=…&part=snippet&q=…&type=…&maxResults=50&pageToken=…. ↩

    • plg-gh-valerievitch-dune-plugin-acestreamsearch.c053 · code · unknown; прошивка — · AceSearchConfig::defaults для удалённого поиска задаёт use_local_search_engine = FALSE, remote_search_url = https://search.acestream.net, remote_search_api_version = 1.0, remote_search_api_key = test_api_key.
    • plg-gh-valerievitch-dune-plugin-acestreamsearch.c065 · code · unknown; прошивка — · При use_local_search_engine = TRUE AceSearchTv::ace_search обращается к http://127.0.0.1:6878/server/api?method=get_api_access_token, берёт токен из result.token и формирует запрос method=search с этим токеном.
    • plg-gh-valerievitch-dune-plugin-acestreamsearch.c066 · code · unknown; прошивка — · При use_local_search_engine = FALSE AceSearchTv::ace_search формирует запрос method=search к remote_search_url с api_version, api_key, общими параметрами и urlencode(query).
    • plg-gh-valerievitch-dune-plugin-acestreamsearch.c064 · code · unknown; прошивка — · AceSearchTv::ace_search передаёт поисковому API общие параметры group_by_channels=1, show_epg=1, page_size=50.

    ↩

  55. plg-hdtv-smart-vod.c331 · code · unknown; прошивка — · getSearchList Filmix_API при m_feed=end возвращает пустой массив; иначе запрашивает HOST_API_URL . "/suggest?word=", сразу ставит m_feed=end и разбирает JSON тем же do_parse_page. ↩

  56. plg-hdtv-smart-apps.c084 · code · unknown; прошивка — · Поиск Wallpaper вызывает API alphacoders методом search с term=urlencode(keyword) и width=1920&height=1080; после одного ответа m_feed становится end. ↩

    • plg-hdtv-megaradio.c092 · code · unknown; прошивка — · Класс Youtube в пакете MegaRadio не определён; Smart_vod.php перед использованием подключает внешний /tmp/plugins/link_api.php (или локальный link_api.php), поэтому youtube_search зависит от этого внешнего файла.
    • plg-hdtv-megaradio.c098 · code · unknown; прошивка — · При control_id = yt_search SmartM3uTv берёт из SmartConfig::get_radio_stream_info поля artist и track (если заданы), склеивает их через « - » и открывает SmartVodListScreen с category_id = search, genre_id = полученная строка и name = youtube_search.
    • plg-hdtv-megaradio.c147 · forum · unknown; прошивка — · Автор предупреждает, что возврат из окна поиска трека на YouTube даёт чёрный экран и требует нажать стоп на треке.

    ↩

  57. plg-hdtv-zlostnyi-iptv.c075 · code · unknown; прошивка — · Поиск bcu (getSearchList) ищет подстроку без учёта регистра (mb_strtolower) в названиях фильмов групп «Медиатека» и «BCU Кинопремьера» из /tmp/vod_playlist.m3u. ↩

    • plg-dc-globaltv--rows-epf.c051 · code · unknown; прошивка — · Диалог поиска заполняет поле search_channels_text из cookie last_search_channels_text и передаёт section_id кнопке search_channels_submit_dialog.
    • plg-dc-globaltv--rows-epf.c052 · code · unknown; прошивка — · Обработчик отправки поиска применяет trim, отклоняет пустую строку, затем приводит текст к нижнему регистру UTF-8 и закрывает диалог с запуском поиска; section_id по умолчанию all.
    • plg-dc-globaltv--rows-epf.c053 · code · unknown; прошивка — · search_channels_submit открывает rows-папку screen_id=tv, section_id=search, base_section_id=<раздел>, text=<запрос>; сохраняет запрос в cookie, кроме раздела xxx.
    • plg-dc-globaltv--rows-epf.c055 · code · unknown; прошивка — · channel_name_contains_text приводит имя к нижнему регистру UTF-8 и требует для каждого слова запроса префиксное совпадение с одним из слов имени; совпавшее слово удаляется, при отсутствии совпадения возвращается false.
    • plg-dc-globaltv--rows-epf.c059 · code · unknown; прошивка — · При поиске строка __favorites (ветка item_ndx=-1) получает весь список избранных каналов, а вызов filter_channels находится только в else для обычной категории.

    ↩

    • plg-dc-widget-ext--adv-keyboard.c044 · code · unknown; прошивка — · SuggestionsProvider задаёт пять методов: получение подсказок, их представления, поискового текста, дополнительных параметров действия и признака поиска только по подсказке.
    • plg-dc-widget-ext--adv-keyboard.c045 · code · unknown; прошивка — · DummySuggestionsProvider возвращает пустой массив подсказок, null для представления, текста и параметров, false для isSearchBySuggestionOnly.
    • plg-dc-widget-ext--adv-keyboard.c046 · code · unknown; прошивка — · KinopoiskSuggestionsProvider при непустом query запрашивает JSON через HD::http_get_document по handler_search.php с urlencode(query), topsuggest=true и ajax=1.
    • plg-dc-widget-ext--adv-keyboard.c047 · code · unknown; прошивка — · KinopoiskSuggestionsProvider при наличии captcha в декодированном ответе возвращает пустой массив.
    • plg-dc-widget-ext--adv-keyboard.c057 · code · unknown; прошивка — · GismeteoSuggestionsProvider всегда возвращает true из isSearchBySuggestionOnly, а YoutubeSuggestionsProvider — false.

    ↩

    • plg-hdtv-altsource.c056 · code · unknown; прошивка — · Поиск открывается диалогом с текстовым полем doNewSearch; если useOsk = 2 и не передан openStandartSearch, вместо стандартной клавиатуры запускается AdvKeyboard с подсказками файлов (suggSite = fileSearch).
    • plg-hdtv-altsource.c058 · code · unknown; прошивка — · Настройки поиска хранятся в searchSettings: useOsk 0 (нет), 1 (стандартная), 2 (продвинутая текстовая); kpSearchMetod 0–2 (варианты 1–3: быстрый, медленный с капчей, быстрый с малой выдачей); по умолчанию useOsk = 1, kpSearchMetod = 0 (вариант 1).

    ↩

  58. plg-dc-torrent-center.c123 · code · unknown; прошивка — · SmartVod сохраняет favorite_movies в plugin_cookies как строку идентификаторов, разделённых запятыми. ↩

  59. plg-hdtv-moidom.c019 · code · unknown; прошивка — · Избранные фильмы хранятся в cookie favorite_movies как id через запятую; load_favorites догружает недостающие карточки, set_fav_movie_ids_to_cookies записывает список обратно. ↩

  60. plg-hdtv-peerstv.c016 · code · unknown; прошивка — · Избранные фильмы хранятся в plugin_cookies в поле favorite_movies как список id через запятую; пустые элементы отбрасываются. ↩

  61. plg-hdtv-pirates-radio.c048 · code · unknown; прошивка — · Избранные фильмы хранятся в cookie favorite_movies одной строкой id через запятую: если cookie задана, при чтении строка делится preg_split('/,/'), элементы без непробельных символов отбрасываются, при записи массив склеивается join(','), а при отсутствии cookie возвращается пустой массив. ↩

  62. plg-hdtv-zlostnyi-iptv.c074 · code · unknown; прошивка — · Избранные фильмы bcu хранятся в cookie favorite_movies — id через запятую. ↩

  63. plg-gh-mikhail-ilin-dune-plugin-weburgtv.c097 · code · unknown; прошивка — · AbstractTv хранит избранное в plugin_cookies->favorite_channels строкой через запятую: get_fav_channel_ids разбивает по /,/, set_fav_channel_ids склеивает join(','). ↩

  64. plg-hdtv-surface-family.c123 · code · unknown; прошивка — · SomaFM и Radiopotok.ru поддерживают избранное каналов (TV_FAVORITES_SUPPORTED = true) и хранят его в cookie favorite_channels как rmfon.pl: abstract_tv.php разбирает cookie через preg_split('/,/', ...) и сохраняет join(',', ...). ↩

  65. plg-dc-bazinga3.c042 · code · unknown; прошивка — · SmartVod хранит избранное в plugin_cookies->favorite_movies строкой id через запятую. ↩

  66. plg-hdtv-altv.c030 · code · unknown; прошивка — · Избранные фильмы хранятся в cookie favorite_movies одной строкой id через запятую; пустые элементы отбрасываются, при сохранении список склеивается через join(','). ↩

  67. plg-hdtv-freetv.c028 · code · unknown; прошивка — · Избранные фильмы видеотеки хранятся через HD::get_items('favorite_movies') и HD::save_items('favorite_movies', $ids). ↩

  68. plg-hdtv-smart-vod.c114 · code · unknown; прошивка — · Избранное HdKinoTeatr.Com читается и записывается через HD::get_items/save_items с именем favorite_movies, несмотря на имя методов с суффиксом from/to_cookies. ↩

  69. plg-hdtv-smart-apps.c104 · code · unknown; прошивка — · SmartVod Wallpaper наследует AbstractVod с тремя true, хранит избранное в favorite_movies, кэш фильмов — в saved_movie, а try_load_movie при отсутствии фильма в saved_movie вызывает SmartConfig::parse_video_page. ↩

  70. plg-hdtv-surface-family.c068 · code · unknown; прошивка — · VodSeriesListScreen пакета Radiorecord.ru хранит избранные треки в файле favorites через HD::get_items()/HD::save_items(); select доступен всегда, удаление и перемещение up/down — только в списке favorites (movie_id == 'favorites'), а пункт «Скачать» в popup_menu показывается только при существовании /ltu/bin/aria2c. ↩

  71. plg-hdtv-altsource.c032 · code · unknown; прошивка — · Избранное хранится в DATA под ключом favorite_movies как список media_url; синяя кнопка/пункт меню добавляет или удаляет выбранный элемент и показывает диалог «Добавленно в Избранное» или «Удалено из Избранного». ↩

  72. plg-gh-mdpuma-dune-plugin-altiptv.c048 · code · unknown; прошивка — · AbstractTv хранит favorite_channels в сериализованном файле при fav_save=1, иначе — в plugin_cookies строкой с разделителем запятая. ↩

  73. plg-hdtv-smart-apps.c057 · code · unknown; прошивка — · Speedtest в Entware получает список серверов командой /opt/bin/speedtest-cli --list, хранит избранные в speedtest_favs, запускает /opt/bin/speedtest-cli --share --server и показывает ссылку из строки Share results. ↩

  74. plg-gh-mdpuma-dune-plugin-altiptv.c124 · code · unknown; прошивка — · AbstractTv::change_tv_favorites обрабатывает PLUGIN_FAVORITES_OP_ADD/REMOVE/MOVE_UP/MOVE_DOWN и передаёт изменённый список в set_fav_channel_ids. ↩

    • plg-gh-mikhail-ilin-dune-plugin-weburgtv.c098 · code · unknown; прошивка — · AbstractTv::change_tv_favorites обрабатывает PLUGIN_FAVORITES_OP_ADD, REMOVE, MOVE_UP и MOVE_DOWN, затем сохраняет список и возвращает invalidate_folders для TvFavoritesScreen.
    • plg-gh-mikhail-ilin-dune-plugin-weburgtv.c104 · code · unknown; прошивка — · FavoritesGroup::get_channels вызывает tv->get_fav_channel_ids() без аргумента plugin_cookies и собирает каналы по id; метод get_fav_channel_ids объявлен с обязательным &$plugin_cookies.

    ↩

  75. plg-hdtv-pirates-radio.c016 · code · unknown; прошивка — · DefaultDunePlugin направляет операции оболочки в зарегистрированные экраны (get_folder_view, get_next_folder_view, get_regular_folder_items), в объект Tv (get_tv_info, get_tv_stream_url, get_tv_playback_url, get_day_epg, change_tv_favorites), в объект Vod (get_vod_info, get_vod_stream_url) и в UserInputHandlerRegistry (handle_user_input). ↩

  76. plg-gh-mikhail-ilin-dune-plugin-weburgtv.c067 · code · unknown; прошивка — · handle_user_input экрана каналов при control_id == 'add_favorite': возвращает null без selected_media_url; декодирует media_url и берёт channel_id; если канал уже в избранном — показывает «Канал уже находится в Избранном» с обновлением элемента; иначе вызывает change_tv_favorites(PLUGIN_FAVORITES_OP_ADD) и показывает «Канал добавлен в Избранное» с обновлением. ↩

    • plg-gh-rpervykh-dune-plugin-anidub-com.c058 · code · unknown; прошивка — · add_favorite требует selected_media_url, берёт video_id из parent или selected media_url, добавляет его в fav_items и складывает все episode_ref сезона в cookie с именем video_id.
    • plg-gh-rpervykh-dune-plugin-anidub-com.c059 · code · unknown; прошивка — · add_favorite при уже существующем video_id показывает «Видео уже в избранном»; при добавлении с right_button инвалидирует parent-папку, иначе показывает диалог «Видео добавлено в избранное».

    ↩

    • plg-gh-rpervykh-dune-plugin-anidub-com.c058 · code · unknown; прошивка — · add_favorite требует selected_media_url, берёт video_id из parent или selected media_url, добавляет его в fav_items и складывает все episode_ref сезона в cookie с именем video_id.
    • plg-gh-rpervykh-dune-plugin-anidub-com.c104 · code · unknown; прошивка — · parse_season для каждой option извлекает episode_ref (до кавычки) и episode_title (после «">» до «</»), помечает is_new, если episode_ref нет в cookie с именем season_ref, и кодирует episode_title, episode_ref, season_title, season_ref, ndx_series, poster_url и description.
    • plg-gh-rpervykh-dune-plugin-anidub-com.c083 · code · unknown; прошивка — · Если season_ref и fav отсутствуют, а также не сработали ветви category_ref и subcategory_ref/ser_feed/main_menu:fav, при video_id get_regular_folder_items берёт закэшированный media_url из VideoCache, вызывает get_vod_info и отдаёт серии с подписями [NEW] или [VIEWED] по спискам video_id и video_id.viewed.

    ↩

    • plg-hdtv-folder-cache-vod.c048 · code · unknown; прошивка — · Избранное хранится в $plugin_cookies->fav_items как список через '|', список просмотренных серий — в поле $plugin_cookies->; ListUtil::add_item() ставит новый элемент в начало списка.
    • plg-hdtv-folder-cache-vod.c118 · code · unknown; прошивка — · Избранное streamit — список video_id в $plugin_cookies->fav_items; при добавлении плагин вызывает parse_season($video_id) и складывает episode_ref каждой серии в $plugin_cookies-> через ListUtil::add_item.

    ↩

    • plg-gh-rpervykh-dune-plugin-anidub-com.c060 · code · unknown; прошивка — · remove_fav при fav_build_in_progess показывает «Подождите окончания построения списка!»; иначе удаляет video_id из fav_items, cookie серии, cookie video_id.viewed и помечает папку main_menu:fav просроченной.
    • plg-gh-rpervykh-dune-plugin-anidub-com.c061 · code · unknown; прошивка — · move_fav_top добавляет выбранный video_id в начало fav_items и инвалидирует parent-папку; при fav_build_in_progess показывает то же предупреждение.
    • plg-gh-rpervykh-dune-plugin-anidub-com.c067 · code · unknown; прошивка — · Карта действий избранного отличается от обычной: ENTER=view_series или ex_view_info по skip_details, PLAY=play_item, A_RED=switch_view, POPUP_MENU=show_popup_menu с пунктами «Переместить вверх» и «Удалить».

    ↩

    • plg-hdtv-plugtv.c010 · code · unknown; прошивка — · DemoConfig задаёт константы VOD_MOVIE_PAGE_SUPPORTED=false, VOD_FAVORITES_SUPPORTED=false, TV_FAVORITES_SUPPORTED=false, CHANNEL_LIST_URL='list.xml' и сортировку каналов по номеру через DemoConfig::sort_channels_cb.
    • plg-hdtv-plugtv.c037 · code · unknown; прошивка — · В списке каналов ENTER и PLAY запускают tv_play; зелёная кнопка показывает диалог с версией, жёлтая открывает настройки, синяя — «Полезно знать»; действия избранного добавляются только при is_favorites_supported().

    ↩

  77. plg-hdtv-surface-family.c113 · code · unknown; прошивка — · LSS отключает избранное каналов: Config::TV_FAVORITES_SUPPORTED = false, хотя константа FAV_CHANNEL_GROUP_ICON_PATH указывает на plugin_file://icons/fav.png, а get_fav_icon_url() возвращает её; файла icons/fav.png в пакете нет. ↩

    • plg-hdtv-zlostnyi-iptv.c164 · code · unknown; прошивка — · Медиатека sharavoz — демо-VOD Dune: категории, список фильмов и карточка фильма читаются XML с http://online.dune-hd.com/flussonic2/… через simplexml_load_string; поиск и избранное VOD отключены (VOD_FAVORITES_SUPPORTED = false, файла *_search_screen.php нет).
    • plg-hdtv-zlostnyi-iptv.c165 · code · unknown; прошивка — · Медиатека tvteam — демо-VOD Dune: категории, список фильмов и карточка фильма читаются XML с http://online.dune-hd.com/flussonic2/… через simplexml_load_string; поиск и избранное VOD отключены (VOD_FAVORITES_SUPPORTED = false, файла *_search_screen.php нет).

    ↩

  78. plg-hdtv-jurt.c026 · code · unknown; прошивка — · VOD-избранное фактически отключено: load_favorites возвращает пустой массив и не читает сервер, а do_add_favorite_movie/do_remove_favorite_movie вызывают несуществующие методы BtvSession::api_vod_favadd/api_vod_favsub. ↩

    • plg-dune-remote-control.c051 · code · unknown; прошивка — · При cmd=favorites и menu=add плагин требует непустые name и media_url, затем по версии прошивки выбирает ветку; новая ветка обходит три каталога main_screen_items, пропускает persistfs, если он не смонтирован, и создаёт /dune_folder.txt в первом каталоге, где после remove_item такого подкаталога ещё нет, с media_url, media_url_check=no и media_action=browse, если у media_url нет расширения; при ошибке mkdir или fopen в очередном каталоге переходит к следующему, а если не удалось ни в одном — false.
    • plg-dune-remote-control.c053 · code · unknown; прошивка — · Порог поведения избранного — date >= 130515 и build >= 2104 (status b6 записан в таблице, но в условии не участвует): при выполнении обоих условий add_item и remove_item работают с тремя каталогами main_screen_items (persistfs пропускается, если не смонтирован), иначе — только с /config/main_screen_items; remove в новой ветке удаляет dune_folder.txt и затем rmdir, в старой — то же в config.
    • plg-dune-remote-control.c054 · code · unknown; прошивка — · is_persistfs_mounted считает /persistfs смонтированным, если sed по /proc/mounts находит строку, где второй столбец — /persistfs.
    • plg-dune-remote-control.c050 · code · unknown; прошивка — · Если при cmd=favorites (default-ветка menu) ни один из трёх каталогов main_screen_items не открывается, плагин не вызывает make_ok и не создаёт items: ответ содержит только protocol_version, без command_status и player_state.

    ↩

    • plg-dc-torrent-center.c124 · code · unknown; прошивка — · Movie при playback_stop переносит накопленную playback_info в сериализованный viewedItemsArr.
    • plg-dc-torrent-center.c125 · code · unknown; прошивка — · Movie задаёт initial_position_ms из сохранённой позиции выбранного файла; отрицательную позицию и позицию не далее пяти секунд от конца сбрасывает в ноль.

    ↩

  79. plg-hdtv-megaanime.c064 · code · unknown; прошивка — · Просмотренные элементы хранятся в файле viewed_items: для player.tree.tv ключом служит md5(series_name), для остальных — playback_url; get_vod_info использует это для метки [ПРОСМ] и initial_position_ms, а doSaveViewedItems перезаписывает запись. ↩

  80. plg-dc-torrent-center.c149 · code · unknown; прошивка — · Movie при playback_switched и заданном saveSeasonTimes опрашивает локальный cmd=status, затем посылает cmd=set_playback_state с position и speed=256. ↩

    • plg-hdtv-altsource.c042 · code · unknown; прошивка — · На первом событии таймера VOD-воспроизведения Movie добавляет запись в itemsHistory с history_path, history_str («Просмотрено: <дата>»), а также csi и current_network_folder при их наличии; запись ставится в начало, история обрезается до 310 элементов.
    • plg-hdtv-altsource.c033 · code · unknown; прошивка — · История просмотра хранится в DATA под ключом itemsHistory; экран истории по history_path определяет basename и type элемента, показывает history_str и позволяет удалить один элемент или очистить всю историю.

    ↩

  81. plg-ds-dune-hd-tv.c066 · code · unknown; прошивка — · История просмотра архива хранится в plugin_cookies->prodhist (JSON, до 8 записей type/product_id, новые — в начало). ↩

  82. fw-tv188b-260827-0003-r24--shell-ext--entry-handler.c103 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · find_recent принимает JSON uids/tags/eps и обязательные result_action/result_file; force_reload выбирает reload истории вместо ensure_loaded. ↩

    • plg-dc-dunemdb-supplier-online-movies.c054 · code · unknown; прошивка — · update_wh запрашивает у shell_ext действие find_recent, передавая uids (только при наличии tfs), tags всех торрентов, result_action и result_file; uids для play_tfs добавляются только при with_play_tfs, наличии play_mts/play_tfs и — если nav tfs есть — несовпадении torrent_id с ним.
    • plg-dc-dunemdb-supplier-online-movies.c055 · code · unknown; прошивка — · Для сериалов есть отдельный update_eps_wh: он запрашивает find_recent с eps-тегом, force_reload false, result_action post_update_wh и result_file; update_wh используется для обычной истории.
    • plg-dc-dunemdb-supplier-online-movies.c056 · code · unknown; прошивка — · post_update_wh при action_status = 1 и существующем result_file читает файл, удаляет его и разбирает JSON; при eps_mode вызывает set_eps, иначе set; затем выполняет post_action из входа.
    • plg-dc-dunemdb-supplier-online-movies.c074 · code · unknown; прошивка — · TorrentHistory формирует uid файла как online_movies:::, тег торрента — online_movies:tuid:, эпизодный тег — online_movies::: (при s < 0 берётся s = 1); история сохраняется в /wh.json и /eps_wh.json.

    ↩

  83. plg-gh-rpervykh-dune-plugin-anidub-com.c062 · code · unknown; прошивка — · mark_viewed учитывает только элементы из fav_items; video_id берётся из video_id или season_ref, просмотренный url — из url_series или episode_ref, и добавляется в cookie video_id.viewed, после чего обновляется parent-папка. ↩

  84. plg-hdtv-duneplexcatalog.c075 · forum · unknown; прошивка — · По словам автора, ручная и автоматическая отметка просмотра не работает для многосерийных фильмов, объединённых в одну папку, потому что Plex не даёт такой возможности. ↩

    • plg-hdtv-duneplexcatalog.c040 · code · unknown; прошивка — · Отметку просмотра плагин ставит запросом /:/scrobble?key=&identifier= com.plexapp.plugins.library, снимает — /:/unscrobble с теми же параметрами.
    • plg-hdtv-duneplexcatalog.c051 · code · unknown; прошивка — · Если playback_duration больше 60, notifier вычисляет seen_threshold = duration*95/100 и помечает фильм просмотренным запросом /:/scrobble, когда playback_position превысил порог и отметка ещё не отправлялась.

    ↩

    • plg-hdtv-altsource.c060 · code · unknown; прошивка — · Вход myShows выполняется OAuth-запросом к https://myshows.me/oauth/token: grant_type=password для логина и grant_type=refresh_token для обновления; client_id — base64_decode('bXlzaG93c196aXZpbw'), client_secret — cUvxSKgAkxMceEd5Dq5Vt2f6; полученные токены сохраняются в mShowsA.
    • plg-hdtv-altsource.c061 · code · unknown; прошивка — · myShows-интеграция использует JSON-RPC https://api.myshows.me/v2/rpc/ методами shows.Search, shows.GetById, profile.Get, profile.Episodes, manage.CheckEpisode и manage.UnCheckEpisode; методы profile.* и manage.* передают заголовок Authorization: Bearer .
    • plg-hdtv-altsource.c062 · code · unknown; прошивка — · Если у файла задан myShowsShowID и он ещё не отмечен, playback_stop вызывает manage.CheckEpisode в myShows и сбрасывает кэш просмотренных серий (getWatchedMyShows('clear')).
    • plg-hdtv-altsource.c081 · code · unknown; прошивка — · Номер сезона и серии для myShows плагин извлекает из имени файла набором регулярных выражений: sNNNeNNN, [NxN], «N Сезон N Серия», «Сезон N Серия N», украинские варианты и обратный порядок «серия … сезон».
    • plg-hdtv-altsource.c063 · code · unknown; прошивка — · Импорт myShows из DATA Bazinga читает файл mShowsA через unserialize, при нескольких аккаунтах сопоставляет их с userFavList и сохраняет выбранный аккаунт в mShowsA как JSON.

    ↩

  85. plg-gh-ytkachov-dune-hd-watch-sync.c015 · forum · Solo 8K, Pro 8K Plus, android-dune-fw; прошивка 250815_1012_r22 · Между плеерами переносимы только записи с uid, начинающимся на smb://; online_movies: (онлайн-сервисы) и storage_name: (локальный USB) синхронизировать нельзя. ↩

  86. plg-gh-ytkachov-dune-hd-watch-sync.c067 · forum · Solo 8K, Pro 8K Plus, android-dune-fw; прошивка 250815_1012_r22 · На реальных данных 35% самых новых записей (116 из 330) — сеансы короче двух минут; наивное «побеждает наибольший start» откатило бы 15 файлов с «просмотрено ≥90%» на «только начато», 6 из них — из-за синхронизации между плеерами; защита от отката ловит 14 из 15. ↩

    • plg-gh-ytkachov-dune-hd-watch-sync.c040 · code · unknown; прошивка — · dunesync.history.merge оставляет только записи с uid, начинающимся на smb://, группирует их по uid и выбирает по одной записи pick_winner; возвращает также список предотвращённых откатов.
    • plg-gh-ytkachov-dune-hd-watch-sync.c041 · code · unknown; прошивка — · dunesync считает запись «касанием» при watched<120 с и pos/len<5%; если победитель по start — касание и среди остальных есть запись с долей >5%, выбирается самая поздняя из них, иначе остаётся победитель.
    • plg-gh-ytkachov-dune-hd-watch-sync.c052 · code · unknown; прошивка — · network_folders разбирает config/network_folders.properties как key.field=value и возвращает словарь id → (server, directory) для записей, где есть id, server и directory.
    • plg-gh-ytkachov-dune-hd-watch-sync.c053 · code · unknown; прошивка — · rewrite_url переписывает только url с префиксом network_folder_id://: source id → (server, directory) → target id; возвращает None, если пары нет, и оставляет прочие схемы как есть.
    • plg-gh-ytkachov-dune-hd-watch-sync.c056 · code · unknown; прошивка — · _history_for добавляет к слитым записям собственные непереносимые записи плеера (USB, онлайн-сервисы) и пропускает записи, для которых не нашлось соответствующей сетевой папки (url не переписался).

    ↩

    • plg-gh-rpervykh-dune-plugin-anidub-com.c102 · code · unknown; прошивка — · parse_season_info считает n_series по числу вхождений <option value=" в блоке и кодирует в user_data поля video_id, n_series, page_ref, video_image_url, title, genre, country, year, duration, duration_min, director, actors, description и name_original.
    • plg-gh-rpervykh-dune-plugin-anidub-com.c103 · code · unknown; прошивка — · parse_season скачивает страницу сезона, убирает префикс http://cdn у option value, нормализует selected option и iframe film_main в option value и режет блок по <option value=".
    • plg-gh-rpervykh-dune-plugin-anidub-com.c104 · code · unknown; прошивка — · parse_season для каждой option извлекает episode_ref (до кавычки) и episode_title (после «">» до «</»), помечает is_new, если episode_ref нет в cookie с именем season_ref, и кодирует episode_title, episode_ref, season_title, season_ref, ndx_series, poster_url и description.
    • plg-gh-rpervykh-dune-plugin-anidub-com.c105 · code · unknown; прошивка — · get_vod_info при media_url != 'dummy' берёт season_ref из user_data->season_ref или user_data->video_id, бросает Exception «No season_ref or video_id», если нет обоих, и вызывает parse_season для получения серий; для 'dummy' возвращает пустой массив.

    ↩

    • plg-dc-dunemdb-supplier-movies-rus.c039 · code · unknown; прошивка — · В ветке со списком сезонов do_get_episodes разбирает HTML регуляркой по <a class="entity-season…href="…">, а затем на странице каждого сезона берёт эпизоды по data-episode/data-id с непустым data-id; ссылки сезонов получают префикс https://w122.zona.plus, а file_url эпизода — это data-id.
    • plg-dc-dunemdb-supplier-movies-rus.c040 · code · unknown; прошивка — · В ветке else if (список сезонов не найден, но найден ) do_get_episodes присваивает $seasons[$v] значение переменной $id, которая в run.php нигде не задаётся.

    ↩

    • plg-hdtv-megaanime.c041 · code · unknown; прошивка — · Сезоны AniDUB строятся из option-значений страницы: ключ Stormo плеер или Cтарый плеер sibnet кодируется md5, а список серий возвращается по URL с &&sc=; у Shikimori плееры берутся из play.shikimori.org//video_online по ссылкам class="working".
    • plg-hdtv-megaanime.c042 · code · unknown; прошивка — · AniMedia.tv и Animedia.tv Tracker отдают серии JSON-плейлистом по /embeds/playlist-j.txt/ (поле file и poster), а страница фильма содержит data-entry_id и вкладки, из которых строятся URL /ajax/episodes///undefined.
    • plg-hdtv-megaanime.c043 · code · unknown; прошивка — · AniFilm отдаёт список торрентов в urls/torrents_list (ссылки /releases/...), AnimeVost — серии через http://play.aniland.org/?player=7, Anime-Best — через var videoList и поле link.

    ↩

  87. plg-dc-dunemdb-supplier-online-movies.c105 · code · unknown; прошивка — · AddTorrentDialog::apply_series читает info_by_name из результата detect_series, проставляет s/e найденным файлам; в обычном режиме (не switch_mode) для одиночного файла (count(series)==1, season<0, chosen_op вне play/download) сразу запускает vod_play; при chosen_op=play выполняет enter-действие torrent_files с выбранным файлом, при chosen_op=download запускает download_torrent, иначе открывает папку torrent_files с выбранным элементом. ↩

    • plg-dc-dunemdb-supplier-online-movies.c118 · code · unknown; прошивка — · do_play после выбора: choice_auto = resume/auto_choose/auto_start; при choice_auto и s/e >= 0 входит в сезон/эпизод; при отсутствии torrent_uid и user_choice != resume берёт recent_or_first_torrent_uid(chosen_s, chosen_e), и если uid не найден — показывает ошибку. Если disable_switch и tor найден — сначала ensure_own_torrserver (если нет torrserver_checked), затем open_torrent с chosen_file и play; иначе готовит playback и запускает vod_play всех эпизодов. Без choice_auto открывает папку seasons/torrents с выбранным элементом.
    • plg-dc-dunemdb-supplier-online-movies.c102 · code · unknown; прошивка — · Playback::get_vod_stream_url не отдаёт URL сразу, а бросает DuneException с действием choose_playback_stream и playback_url; choose_playback_stream при отсутствии server_checked сначала вызывает ensure_own_torrserver.

    ↩

  88. plg-hdtv-smart-vod.c332 · code · unknown; прошивка — · parse_video_page Filmix_API запрашивает HOST_API_URL . "/post/?" и разбирает JSON; при пустом player_links->playlist перебирает player_links->movie и строит series по title/translation/quality из квадратных скобок link; иначе перебирает playlist по сезонам, переводам и сериям, заменяет %s на "[]" и складывает sezon; затем Movie получает series при отсутствии sezon либо сезоны с типом folder при его наличии. ↩↩

    • plg-hdtv-smart-vod.c212 · code · unknown; прошивка — · При control_id=save_folder VodSeriesListScreen эталона удаляет сохранённую папку фильма, если она уже есть; иначе при заданной movie.series_list сохраняет HD::baseitem URL серий под movie_id/season_id.
    • plg-hdtv-smart-vod.c195 · code · unknown; прошивка — · В списке фильмов эталона для фильма, присутствующего в save_folder, сравниваются полученные parse_season_items URL с сохранёнными через HD::baseitem; если очередного URL нет в сохранённых, ставятся [NEW] и цвет 18.

    ↩

  89. plg-hdtv-smart-vod.c209 · code · unknown; прошивка — · При control_id=select и заданном selected_media_url VodSeriesListScreen эталона переключает ключ series_id в select_url и инвалидирует vod_series. ↩

  90. plg-hdtv-altv.c018 · code · unknown; прошивка — · Для канала с protected=1 get_tv_playback_url возвращает пустую строку, если переданный protect_code не совпадает с cookie pass_sex. ↩

  91. plg-gh-mdpuma-dune-plugin-altiptv.c062 · code · unknown; прошивка — · Для защищённого канала get_tv_playback_url возвращает false при protect_code, не равном cookie pin (по умолчанию 0000). ↩

  92. plg-hdtv-evolutiontv.c012 · code · unknown; прошивка — · В load_channels защищённость канала вычисляется так: если cookie gid_save равна группе канала и cookie current_pcode_save непуста, канал получает is_protected=1, иначе 0; cookie buf_time передаётся в DemoChannel как buffering_ms. ↩

    • plg-dc-globaltv.c108 · code · unknown; прошивка — · Защищёнными плагин считает группы с id 500 или с префиксом 500_ (помечено в коде XXX TODO); их каналы получают is_protected = 1.
    • plg-dc-globaltv.c109 · code · unknown; прошивка — · Без встроенного родительского контроля get_tv_playback_url для защищённого канала при неверном protect_code возвращает строку protected.

    ↩

    • plg-dc-globaltv.c058 · code · unknown; прошивка — · Встроенный родительский контроль плагин определяет проверкой defined('PluginTvInfo::builtin_pcontrol_enabled').
    • plg-dc-globaltv.c110 · code · unknown; прошивка — · Пароль родительского контроля плагин читает из /config/parental_control_password.txt; при встроенном контроле передаёт его в PluginTvInfo::entered_pcode для раздела xxx.
    • plg-dc-globaltv.c165 · code · unknown; прошивка — · MainHelper::show_xxx_dialog_if_needed для защищённого канала: control_id xxx_18_one_dialog_shown запускает временный диалог, xxx_18_dialogs_shown ставит флаг plugin_cookies, xxx_code_dialog_shown ставит флаг, но при code_changed=false возвращает null; затем, если xxx_18_dialogs_shown не установлен, показывается диалог 18+, иначе при неустановленном xxx_code_dialog_shown и пустом /config/parental_control_password.txt — диалог установки кода; control_id восстанавливается из prev_control_id, если он непустой.

    ↩

  93. plg-hdtv-altv.c028 · code · unknown; прошивка — · Смена пароля закрытых каналов идёт через отдельный диалог: новый пароль сохраняется, только если введённый «старый» совпадает с cookie pass_sex; иначе показывается «Пароль не изменен!». ↩

  94. plg-hdtv-evolutiontv.c011 · code · unknown; прошивка — · Родительский контроль: код хранится в cookie current_pcode_save; смена кода проходит, только если введённый текущий код совпадает с сохранённым и новый код совпадает с подтверждением. Группа gid_save сохраняется, только если current_pcode_save совпадает с введённым current_pcode (пустой сохранённый код тоже совпадает с пустым вводом). ↩

  95. plg-dc-globaltv.c167 · code · unknown; прошивка — · Для ввода кода родительского контроля GlobalTvTvSectionListScreen вызывает ControlFactory::add_text_field с numeric=true, has_osk=false, always_active=true и params fixed_osk_id='numeric'. ↩

  96. plg-hdtv-altsource.c055 · code · unknown; прошивка — · PIN родительского контроля хранится как md5 в plugin_cookies->parentalControl; заблокированные категории — в сериализованном lockCat по ключу lockItem (basename пути, сервер/рабочая группа/smbBrouser, папка сети или screen_id избранного/истории); разблокировка требует ввода PIN в текстовом поле hide_pin_control. ↩

  97. plg-hdtv-moidom.c020 · code · unknown; прошивка — · Список каналов поддерживает перемещение канала вверх/вниз (API set_channels_order.php с act=up/down) и сброс порядка (act=reset, id=-1); после изменения каналы выгружаются и перезагружаются, экран обновляется через update_regular_folder. Клавиши: зелёная — назад, жёлтая — вперёд, popup-меню — добавить в избранное/сбросить порядок. ↩

  98. plg-gh-mdpuma-dune-plugin-altiptv.c103 · code · unknown; прошивка — · При sort_channels=1 load_channels сортирует общий список по CHANNEL_SORT_FUNC_CB; при значениях 2–4 также сортирует группы выбранным CB/BC/BA, пропуская объект с id=__favorites. ↩

  99. plg-hdtv-altsource.c035 · code · unknown; прошивка — · Порядок элементов корня хранится в DATA под ключом n_link: «В начало списка» переносит выбранный media_url в начало, «Сбросить» очищает список. ↩

    • plg-dc-globaltv--list-config.c043 · code · unknown; прошивка — · sort_sections возвращает null при прежнем sections_order_by (по умолчанию size), иначе сохраняет новый порядок в cookie и без list config сразу возвращает sort_sections_apply.
    • plg-dc-globaltv--list-config.c044 · code · unknown; прошивка — · При сортировке разделов с list config, но без lcfg_v2, вызывается change_list_config_reset_to_default для конфига разделов с callback sort_sections_apply.
    • plg-dc-globaltv--list-config.c045 · code · unknown; прошивка — · При сортировке с lcfg_v2 из старого order сохраняются только fav, all и id основных разделов; результат передаётся change_list_config_replace_order с callback sort_sections_apply.
    • plg-dc-globaltv--list-config.c007 · code · unknown; прошивка — · change_list_config записывает order только при defined ChangeListConfigActionData::order и истинном $order; пустой массив порядка в действие не попадает.
    • plg-dc-globaltv--list-config.c024 · code · unknown; прошивка — · ListHelper::edit_sections_list передаёт редактору fav и все разделы как all_items и checked_ids, с группой main и, при непустом other_ids, other, options=0, текущим sel_id и callback apply_list_config.
    • plg-dc-globaltv--list-config.c028 · code · unknown; прошивка — · edit_cats_list передаёт EDIT_LIST_CONFIG_OPT_REMOVE_UNCHECKED только для избранного, для прочих разделов — options=0; close_item_params и sel_id передаются null.

    ↩

    • plg-gh-mdpuma-dune-plugin-altiptv.c102 · code · unknown; прошивка — · add_category_apply добавляет имя пользовательской категории в сериализованный data_file/group_names, затем инвалидирует tv_group_list.
    • plg-gh-mdpuma-dune-plugin-altiptv.c101 · code · unknown; прошивка — · hide_ch_apply сохраняет скрытие канала в data_file/hide_ch по ключу <имя плейлиста>|<название канала> и инвалидирует список групп.
    • plg-gh-mdpuma-dune-plugin-altiptv.c100 · code · unknown; прошивка — · rename_ch_apply заменяет название канала непосредственно в M3U по паре название+URL и запрещает операцию при m3u_type=3 (HTTP-ссылка).

    ↩

  100. plg-hdtv-pirates-radio.c029 · code · unknown; прошивка — · Канал привязывается к группам по tv_channel/tv_categories/tv_category_id: id приводится к int, группа ищется в HashedArray, затем вызываются channel->add_group(group) и group->add_channel(channel). ↩

  101. plg-hdtv-rain-tv.c014 · code · unknown; прошивка — · RainTV::get_groups возвращает одну группу с id Config::ALL_CHANNELS_GROUP, caption «Выбрать Канал» и иконкой канала с sochinskayatrk.ru. ↩

    • plg-dc-globaltv--gcomps-controls.c039 · code · unknown; прошивка — · GCompList хранит выбор и верхний индекс в свойствах состояния ".sel"/".top"; get_sel_state клонирует базовый объект и заменяет эти два свойства.
    • plg-dc-globaltv--gcomps-controls.c040 · code · unknown; прошивка — · GCompList::get_panel_def создаёт элементы с индексами от top до top+min(num_items-top,preload_size), не включая верхнюю границу, и помещает их в panel с id списка.
    • plg-dc-globaltv--gcomps-controls.c042 · code · unknown; прошивка — · GCompList::add_insert_actions добавляет дочерний компонент через ChangeGCompDef::children_merge_mode=true и children_insert_after_id, равный id элемента с индексом ndx-1.
    • plg-dc-globaltv--gcomps-controls.c043 · code · unknown; прошивка — · При перестройке диапазона GCompList::handle_op записывает ChangeGCompDef::remove для старого элемента как результат проверки i=new_top+preload_size.
    • plg-dc-globaltv--gcomps-controls.c045 · code · unknown; прошивка — · GCompList::handle_op распознаёт page_up/page_down/up/down/left/right и префикс sel:; шаг page_up/page_down равен floor((page_size+1)/2), left выбирает 0, right — num_items-1.
    • plg-dc-globaltv--gcomps-controls.c050 · code · unknown; прошивка — · GCompList::get_text_props возвращает массив с ключами text_size и color, а не с полями GCompTtfLabelDef::font_size и GCompTtfLabelDef::text_color.

    ↩

    • plg-dc-widget-ext.c030 · code · unknown; прошивка — · Список установленных плагинов читается из /tmp/run/installed_plugins.xml: берётся каждого дочернего элемента корня
    • plg-dc-widget-ext.c027 · code · unknown; прошивка — · На экране plugins_screen клавиши GUI_EVENT_KEY_D_BLUE и GUI_EVENT_KEY_ENTER привязаны к одному действию ignore_unignore_plugin
    • plg-dc-widget-ext.c028 · code · unknown; прошивка — · После переключения плагин перерисовывает список действием PLUGIN_UPDATE_FOLDER_ACTION_ID с range, need_refresh и sel_ndx
    • plg-dc-widget-ext.c113 · code · unknown; прошивка — · Список игнорируемых плагинов хранится в настройке ignoredPlugins строкой через запятую; экран настроек показывает их количество, а экран plugins_screen для выбранного элемента по ENTER или синей кнопке убирает имя из списка при state = 'ignored' и добавляет иначе, затем перерисовывает список.

    ↩

  102. plg-gh-sndpl-apple-trailers-dune-plugin.c024 · code · unknown; прошивка — · BaseMenu::CompareCaption сравнивает caption без учёта регистра через strtolower: при равенстве возвращает 0, иначе +1 или -1. ↩

  103. plg-dc-torrent-center.c136 · code · unknown; прошивка — · Обработчик whats_new получает http://dune-club.info/plugins/update//info.txt и выводит очищенный strip_tags текст. ↩

  104. plg-hdtv-folder-cache-vod.c091 · code · unknown; прошивка — · info_release скачивает http://dune-club.info/plugins/update/YouTubeMult/info.txt и показывает его через ControlFactory::add_multiline_label с 15 строками. ↩

    • plg-hdtv-remtor.c099 · code · unknown; прошивка — · Экран tr_log читает update_info.xml каталога установки, берёт последние 16 версий через array_slice(xpath('//version'), -16) и строит меню версий и языков.
    • plg-hdtv-remtor.c100 · code · unknown; прошивка — · Для выбранной версии tr_log берёт changelog с языком интерфейса, при отсутствии — english, затем russian; отображает его в виде Movie с левой кнопкой версии и правой кнопкой языка.

    ↩

    • plg-hdtv-plugtv.c026 · code · unknown; прошивка — · HD::ver читает dune_plugin.xml из DuneSystem::$properties['install_dir_path'], и если file_get_contents вернул null, пишет в лог и возвращает 'n/a'; иначе разбирает документ через HD::parse_xml_document и возвращает version, а при ошибке разбора бросает исключение.
    • plg-hdtv-plugtv.c035 · code · unknown; прошивка — · Диалог «Информация о плагине» берёт версию через HD::ver(), показывает строку «Это первая версия плагина» и автора «Nuhim (http://forum.hdtv.ru).».

    ↩

    • plg-hdtv-plugtv.c038 · code · unknown; прошивка — · Диалог «Полезно знать» листает подсказки стрелками влево/вправо и рисует иконки навигации из DuneSystem::$properties['install_dir_path']/icons; текст переносится вызовом HD::mb_str2arr($label2, 42).
    • plg-hdtv-plugtv.c060 · code · unknown; прошивка — · HD::mb_str2arr($str) принимает один аргумент и переносит строку по 65 символов, поэтому переданный в tv_channel_list_screen второй аргумент 42 игнорируется.

    ↩

  105. plg-gh-mdpuma-dune-plugin-altiptv.c097 · code · unknown; прошивка — · Настройка dload_help при наличии /D запускает фоновый wget help_altIPTV.pdf с логом /tmp/run/altwget.log. ↩

  106. plg-hdtv-youtube.c087 · code · unknown; прошивка — · VodTop500Screen YouTube (ID vod_top500) вопреки имени не строит «топ-500»: при action=videoTips он разбирает endscreen и ссылки в описании видео (Youtube::getYtInfArr) — goo.gl через get_headers Location, list=, user/, /c/, /channel/ и 11-символьные id — в пункты плейлистов, каналов и видео. ↩

    • plg-gh-aspel-twitch-dune-plugin.c027 · code · unknown; прошивка — · В той же ветке streams: плагин берёт DuneSystem::$properties['install_dir_path'] в поле install_dir и запускает shell_exec($install_dir . "/bin/irc.sh start " . $stream_name).
    • plg-gh-aspel-twitch-dune-plugin.c036 · code · unknown; прошивка — · Если control_id == 'chat' (отдельный if после блока apply/btnSave), handle_user_input читает /tmp/tw_irc.log, добавляет многострочную метку на 15 строк и возвращает show_dialog с заголовком "#", close_by_return=true, шириной 1500, стилем DIALOG_FRAME_STYLE_GLASS, действием GUI_EVENT_TIMER → close_dialog_and_run(chat) и таймером 2000 мс.
    • plg-gh-aspel-twitch-dune-plugin.c037 · code · unknown; прошивка — · Если control_id == 'stop_irc' (отдельный if после ветки chat), handle_user_input выполняет shell_exec($install_dir . "/bin/irc.sh stop") и не возвращает действие.
    • 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:" и проверку проходит.
    • plg-gh-aspel-twitch-dune-plugin.c049 · code · unknown; прошивка — · bin/irc.sh подключается к irc.twitch.tv:6667 через /dev/tcp, отправляет PASS с oauth-токеном, NICK и USER с ником, затем JOIN #<канал> (канал берётся из $2).
    • plg-gh-aspel-twitch-dune-plugin.c050 · code · unknown; прошивка — · bin/irc.sh хранит лог чата в /tmp/tw_irc.log: перед записью обрезает файл до последних 7 строк через tail -n 7, затем дописывает новую строку; на PING отвечает PONG, на PRIVMSG пишет " ", прочие строки — в формате " >< ".
    • plg-gh-aspel-twitch-dune-plugin.c051 · code · unknown; прошивка — · bin/irc.sh поддерживает команды start, stop, restart и status; pid хранится в /tmp/twitch_irc.pid; start и restart сначала вызывают StopDaemon, затем StartDaemon; StartDaemon при наличии pid-файла не запускает второй демон, stop убивает процесс по pid и удаляет файл.

    ↩

  107. plg-ds-dune-hd-tv.c030 · code · unknown; прошивка — · После регистрации устройства плагин активирует промокоды: NEWUSER30D (platform_kind не android) или NEWUSER90D (android) и дополнительно NU30M. ↩

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

    ↩

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

  109. plg-dc-dunemdb-supplier-movies-rus.c051 · code · unknown; прошивка — · При наличии в ответе lqUrl или url ветка playbackUrl возвращает его с заменой http(s):// на http(s)://mp4://, а если id пуст или в ответе нет ни lqUrl, ни url — заглушку http://mp4://dune-club.info/plugins/update/1.mp4. ↩

  110. plg-gh-kocourkuba-proiptv.c043 · code · unknown; прошивка — · make_ts() переписывает http(s)://… в http(s)://mp4://… для URL на .mp4 и в http(s)://ts://… для .ts/.mpeg/mpegts или при принудительном режиме (настройка PARAM_DUNE_FORCE_TS или поток MPEG-TS у провайдера); уже обёрнутые URL не трогает. ↩↩

  111. plg-hdtv-youtube.c054 · code · unknown; прошивка — · get_vod_stream_url YouTube заменяет http:// на http://mp4://, если URL содержит .mp4, не содержит .m3u8 и ещё не начинается с http://mp4://. ↩

  112. plg-hdtv-megatorrents.c107 · code · unknown; прошивка — · get_vod_stream_url добавляет префикс http://mp4:// к URL с .mp4 (кроме .m3u8 и уже префиксованных), а URL с .flv (без flv.sh) заворачивает в http://ts://127.0.0.1:81/cgi-bin/flv.sh?. ↩↩

    • plg-hdtv-smart-vod.c174 · code · unknown; прошивка — · get_vod_stream_url Zona.mobi после разрешения URL, не начинающегося с http://, заменяет http:// на http://mp4://, если результат оканчивается на mp4 и ещё не начинается с http://mp4://.
    • plg-hdtv-smart-vod.c323 · code · unknown; прошивка — · get_vod_stream_url MoviesTape не вызывает mUrl: если URL совпадает с .mp4, не совпадает с .m3u8 и не начинается с http://mp4://, он заменяет http:// на http://mp4://; если URL совпадает с .flv и не содержит flv.sh, возвращает http://ts://127.0.0.1:81/cgi-bin/flv.sh?; иначе возвращает URL без изменений.
    • plg-hdtv-smart-vod.c334 · code · unknown; прошивка — · get_vod_stream_url Filmix_API берёт video_quality из plugin_cookies (по умолчанию 3), в parseQltyArr извлекает список качеств из квадратных скобок playback_url, перебирает соответствие 6→2160, 5→1440, 4→1080, 3→720, 2→480, 1→360, 0→240, понижая индекс до первого заданного качества, и возвращает поток с этим качеством, иначе после ksort — первый элемент; затем заменяет http:// и https:// на http://mp4://.
    • plg-hdtv-smart-vod.c345 · code · unknown; прошивка — · get_vod_stream_url Vimeo при playback_url без http добавляет префикс https://vimeo.com, затем вызывает mUrl::get_link(playback_url, video_quality), где video_quality — HD::get_item('video_quality') или 1; после этого .mp4 без .m3u8 и без префикса http://mp4:// переводится в http://mp4://, а .flv без flv.sh — в http://ts://127.0.0.1:81/cgi-bin/flv.sh?.

    ↩

  113. plg-hdtv-smart-vod--link-api.c033 · code · unknown; прошивка — · Seasonvar::getSeasonvarIframe получает secureMark и time со страницы, POST-ит player.php с id/serial/type=html5/secure/time, собирает плейлисты /playls2/.../plist.txt, а playbackUrl возвращает с http://mp4://. ↩

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

  115. plg-hdtv-smart-apps.c106 · code · unknown; прошивка — · get_vod_stream_url Wallpaper для mp4 (не m3u8 и не уже mp4://) добавляет схему http://mp4://, для flv (не flv.sh) подставляет http://ts://127.0.0.1:81/cgi-bin/flv.sh, а при mUrl::get_versions()==false и player.tree.tv в playback_url направляет поток через plugin_cgi_url do3. ↩↩↩

  116. plg-gh-mdpuma-dune-plugin-altiptv.c055 · code · unknown; прошивка — · get_tv_stream_url оборачивает обычный http:// в http://ts:// после веток для специальных протоколов. ↩

  117. plg-hdtv-liteiptv.c045 · code · unknown; прошивка — · get_tv_stream_url для udp:// с цифрой заменяет префикс на udp://@, оставляет m3u8, http://ts://, http://audio_stream:// и http://mp4:// как есть, а rtmp/rtsp/flv направляет через локальный http://ts://127.0.0.1:81/cgi-bin/<протокол>.sh; обычные http:// переписываются в http://ts://. ↩

  118. plg-hdtv-kaban.c018 · code · unknown; прошивка — · get_tv_stream_url отбрасывает первые 31 символ playback_uid, берёт URL выбранного источника; при use_proxy=yes заменяет udp://@ на http://ts://:/udp/, затем оборачивает http:// в http://ts://, оставляет http://ts://, http://ts//, http://mp4://, http://mp4//, а rtmp/rtmpt/rtmpe/rtmpte направляет через http://ts://127.0.0.1/cgi-bin/plugins/Kaban_TV/rtmp с суффиксом live=1. ↩↩

  119. plg-hdtv-plugtv.c028 · code · unknown; прошивка — · get_tv_playback_url берёт streaming_url канала, заменяет в нём http:// на http://ts:// и при buf_time>0 дописывает суффикс |||dune_params|||buffering_ms:<значение>; archive_ts и protect_code не используются. ↩↩

    • plg-hdtv-zlostnyi-iptv.c047 · code · unknown; прошивка — · get_tv_playback_url bcu берёт из cookies format (по умолчанию 'hls') и buffering_time (по умолчанию '500'); при format 'hls' URL канала не меняется, при 'mpeg' — http:// заменяется на http://ts:// и дописывается «|||dune_params|||buffering_ms:».
    • plg-hdtv-zlostnyi-iptv.c093 · code · unknown; прошивка — · antifriz пересобирает URL потока по формату: hls1 — http://ts:////video.m3u8?token=; hls2 — исходный URL с http://ts://; mpeg — http://ts://:80//mpegts?token=…; dash — http:////index.mpd?token=…; формат по умолчанию hls1.

    ↩

  120. plg-gh-valerievitch-dune-plugin-acestreamsearch.c084 · code · unknown; прошивка — · AceSearchTv::get_tv_stream_url сохраняет playback_url из ответа Ace API, заменив '://' на '://ts://'. ↩

  121. plg-hdtv-folder-cache-vod.c153 · code · unknown; прошивка — · Для sat-elit parse_season() берёт из страницы playlist: '…', добавляет префикс http://iptv.sat-elit.net, скачивает плейлист с cookie playlist.txt, разбирает , в file="…" заменяет http:// на http://ts:// и берёт title. ↩

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

  123. plg-hdtv-pirates-radio.c024 · code · unknown; прошивка — · В myradio 122 из 600 потоков записаны как http://audio_stream://, остальные 478 — обычные http:// (например, Radio Record http://air.radiorecord.ru:8102/teo_128). ↩

  124. plg-hdtv-smart-vod.c294 · code · unknown; прошивка — · SmartVod::get_vod_stream_url knigavuhe при непустом dload_dir_path сначала проверяет наличие скачанного файла dload_dir_path/<очищенное имя книги>/ и возвращает file://; иначе на Android заменяет http:// или https:// на https://audio_stream://, а на остальных платформах отдаёт CGI-адрес proxy.sh?. ↩↩

  125. plg-gh-kocourkuba-proiptv.c041 · code · unknown; прошивка — · Параметры плееру плагин дописывает к URL через разделитель DUNE_PARAMS_MAGIC = "|||dune_params|||" в виде key:value через запятую (http_build_query с заменой '=' на ':'); источники — настройка плейлиста dune_params, конфиг провайдера, #EXTVLCOPT dune-params=…, зум канала. ↩

  126. plg-hdtv-zlostnyi-iptv.c047 · code · unknown; прошивка — · get_tv_playback_url bcu берёт из cookies format (по умолчанию 'hls') и buffering_time (по умолчанию '500'); при format 'hls' URL канала не меняется, при 'mpeg' — http:// заменяется на http://ts:// и дописывается «|||dune_params|||buffering_ms:». ↩

  127. plg-dc-globaltv.c079 · code · unknown; прошивка — · К URL воспроизведения плагин добавляет суффикс |||dune_params|||: bufind_mode:1 всегда; на Android ещё engine:1 (и для live, и для архива); для архива ещё mediainfo:0. ↩

  128. plg-gh-mdpuma-dune-plugin-altiptv.c061 · code · unknown; прошивка — · get_tv_playback_url дописывает |||dune_params|||zoom: из сохранённой настройки канала, иначе из dune_zoom записи плейлиста. ↩

  129. plg-hdtv-liteiptv.c044 · code · unknown; прошивка — · При воспроизведении без архива перед выдачей URL плагин распознаёт stream?cid= (Noxbit), acestream:// или /ace/getstream?id= (AceStream) и youtube (mUrl::get_link), а запись zoom канала добавляет к URL параметр dune_params zoom. ↩↩

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

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

  132. plg-gh-mdpuma-dune-plugin-altiptv.c060 · code · unknown; прошивка — · Для live (archive_ts=-1) get_tv_playback_url выбирает User-Agent канала, затем плейлиста, затем записи канала и направляет URL в hls.sh с user_agent. ↩

    • plg-hdtv-youtube.c055 · code · unknown; прошивка — · get_vod_stream_url YouTube для URL с .m3u8 без 127.0.0.1 при HD::get_versions() === true и hls_seek_live == 1 возвращает URL с суффиксом |||dune_params|||protocol:hls,hls_seek_live:1.
    • plg-hdtv-youtube.c056 · code · unknown; прошивка — · get_vod_stream_url YouTube для URL с .m3u8 без 127.0.0.1, если не сработала ветка dune_params (get_versions не true или hls_seek_live != 1), при hls_seek_live == 2 возвращает http://ts://127.0.0.1:81/cgi-bin/hls.sh?.

    ↩

  133. plg-hdtv-zlostnyi-iptv.c104 · code · unknown; прошивка — · Архив edem: при $archive_ts > 0 к URL дописывается «?utc=&lutc=|||dune_params|||hls_forced_type:event». ↩

  134. plg-hdtv-freetv.c070 · code · unknown; прошивка — · В dune_params плагин передаёт разные наборы: для MPD Забавы при наличии cenc и DUNE_FIRMWARE_BN >= 21 — decryption_key, для HLS-варианта Забавы (hls/CH_) — vmx_drm:1, для отдельных HLS-веток (например, vod.mors.by) — hls_forced_type:event, для отдельных прокси — buffering_ms:60 вместе с hls_forced_type:event. ↩↩

  135. plg-hdtv-freetv.c056 · code · unknown; прошивка — · В архивной ветке (archive_ts > 0) для TS-сервисов плагин заменяет имя HLS-плейлиста на timeshift_abs-<archive_ts>.ts или timeshift_rel-<смещение>.ts, меняет схему http:// на http://ts:// (локальный TS-прокси) и добавляет |||dune_params||| с psi_opt:2,ss_for_http_ts:1,keep_pic:0; варианты dune_params для DRM и HLS — в c070. ↩

    • plg-ds-dune-hd-tv.c034 · code · unknown; прошивка — · Конструктор I24hTv читает /tmp/sysinfo.txt: если там нет solo4k и нет _r11, к dune_params добавляется lower_cpu_load:1.
    • plg-ds-dune-hd-tv.c035 · code · unknown; прошивка — · Android плагин определяет по наличию /system/dunehd/init или HD_APK=1; при Android Amlogic определяется по префиксу s905 в /firmware/config/android_platform.txt. Вне Android и на Amlogic добавляется buffering_ms:300, на Amlogic ещё frame_rate:25000; на s905l2 к HLS-URL добавляется engine:1.
    • plg-ds-dune-hd-tv.c037 · code · unknown; прошивка — · В get_tv_playback_url в ветке $restrict_ch для не-passive канала после ответа API с полем hls, local или local_low к URL дописывается |||dune_params||| с ll_prebuf_for_http_ts:1, (lower_cpu_load:1,) psi_opt:2, опциями платформы, ss_for_http_ts:1 и keep_pic:0, а http://localhost: заменяет на http://ts://localhost:.

    ↩

  136. plg-hdtv-jurt.c027 · code · unknown; прошивка — · BtvVod::get_buffering_ms читает PluginOutputData::plugin_cookies->http_caching (по умолчанию 3000), а ТВ берёт буферизацию из статического BTV::$buffering_time, который выставляется только настройкой. ↩

  137. plg-hdtv-kohana-channel.c037 · code · unknown; прошивка — · В plg-hdtv-firstmuzru и plg-hdtv-pik-tv streams.stream начинается с «http://ts://» — двух схем в одном URL; значение приведено как есть. ↩

  138. plg-hdtv-zlostnyi-iptv.c159 · code · unknown; прошивка — · tvteam при format = 'hls' переводит URL на «http://ts://», при format = 'mpeg' заменяет «mono.m3u8» на «mpegts»; при archive_ts > 0 и format = 'hls' подставляет «index--7200.m3u8», при archive_ts > 0 и format = 'mpeg' — «archive--7200.ts»; группа канала берётся из второй строки EXTINF вида «N. <группа>», а пункт MPEG-TS в настройках помечен «не работает». ↩

  139. plg-gh-rpervykh-dune-plugin-anidub-com.c117 · code · unknown; прошивка — · Ветка UNKNOWN в get_vod_stream_url скачивает URL и берёт download_url; ветка по умолчанию подставляет http://igores.ru/playlist/images/net1.jpg, а URL с flv оборачивает в http://ts://127.0.0.1:81/cgi-bin/flv.sh?. ↩

    • plg-hdtv-smart-vod.c323 · code · unknown; прошивка — · get_vod_stream_url MoviesTape не вызывает mUrl: если URL совпадает с .mp4, не совпадает с .m3u8 и не начинается с http://mp4://, он заменяет http:// на http://mp4://; если URL совпадает с .flv и не содержит flv.sh, возвращает http://ts://127.0.0.1:81/cgi-bin/flv.sh?; иначе возвращает URL без изменений.
    • plg-hdtv-smart-vod.c325 · code · unknown; прошивка — · В tree.tsv MoviesTape нет ни одного пути www/…, в том числе нет www/cgi-bin/flv.sh; get_vod_stream_url для .flv формирует URL http://ts://127.0.0.1:81/cgi-bin/flv.sh?.
    • plg-hdtv-smart-vod.c345 · code · unknown; прошивка — · get_vod_stream_url Vimeo при playback_url без http добавляет префикс https://vimeo.com, затем вызывает mUrl::get_link(playback_url, video_quality), где video_quality — HD::get_item('video_quality') или 1; после этого .mp4 без .m3u8 и без префикса http://mp4:// переводится в http://mp4://, а .flv без flv.sh — в http://ts://127.0.0.1:81/cgi-bin/flv.sh?.

    ↩

    • plg-hdtv-liteiptv.c045 · code · unknown; прошивка — · get_tv_stream_url для udp:// с цифрой заменяет префикс на udp://@, оставляет m3u8, http://ts://, http://audio_stream:// и http://mp4:// как есть, а rtmp/rtsp/flv направляет через локальный http://ts://127.0.0.1:81/cgi-bin/<протокол>.sh; обычные http:// переписываются в http://ts://.
    • 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.

    ↩

    • plg-hdtv-kaban.c018 · code · unknown; прошивка — · get_tv_stream_url отбрасывает первые 31 символ playback_uid, берёт URL выбранного источника; при use_proxy=yes заменяет udp://@ на http://ts://:/udp/, затем оборачивает http:// в http://ts://, оставляет http://ts://, http://ts//, http://mp4://, http://mp4//, а rtmp/rtmpt/rtmpe/rtmpte направляет через http://ts://127.0.0.1/cgi-bin/plugins/Kaban_TV/rtmp с суффиксом live=1.
    • plg-hdtv-kaban.c019 · code · unknown; прошивка — · CGI www/cgi-bin/rtmp — shell-скрипт: убивает ffmpeg, если /var/run/librtmp.so.0 или /var/run/ffmpeg не исполняемый, распаковывает соответствующий zcat-ом из ../../../Kaban_TV/data/08 или data/09, отдаёт Content-type video/H264 и запускает ffmpeg с -re -i URL -vcodec copy -acodec copy -f mpegts.

    ↩

  140. plg-hdtv-youtube.c056 · code · unknown; прошивка — · get_vod_stream_url YouTube для URL с .m3u8 без 127.0.0.1, если не сработала ветка dune_params (get_versions не true или hls_seek_live != 1), при hls_seek_live == 2 возвращает http://ts://127.0.0.1:81/cgi-bin/hls.sh?. ↩

  141. plg-hdtv-folder-cache-vod.c071 · code · unknown; прошивка — · kinokrit и kinolist для moonwalk.cc запускают внешний скрипт /persistfs/codecpack/WWW/cgi-bin/hls_moonwalk.sh с m3u8-манифестом и качеством, с фолбэком на /D/codecpack/WWW/cgi-bin/hls_moonwalk.sh; kinokrit — только если не удалось разобрать ↩

  142. plg-hdtv-megaanime.c066 · code · unknown; прошивка — · CGI do3 принимает ?path=, скачивает URL через curl и отдаёт его с Content-Type application/vnd.apple.mpegurl; прокси применяется только для URL с vkuservideo.net. Он используется в get_vod_stream_url для player.tree.tv при mUrl::get_versions() == false. ↩

  143. plg-hdtv-smart-vod.c298 · code · unknown; прошивка — · www/cgi-bin/proxy.sh выбирает curl тем же способом по platform_kind, читает последнюю позицию перемотки из /tmp/run/shell.log по строке «SAES: successful seek to», очищает её от точек и передаёт как заголовок Range: bytes=<позиция>- вместе с --include. ↩

  144. plg-hdtv-smart-vod.c299 · code · unknown; прошивка — · www/cgi-bin/proxy2.sh отдаёт Content-type audio/mpeg, останавливает прежний ffmpeg через killall -e ffmpeg и транскодирует URL из QUERY_STRING в mp3 через /codecpack/bin/ffmpeg -f mp3 pipe:1. ↩

    • plg-hdtv-utility-family.c087 · code · unknown; прошивка — · yt.sh с LINE=<смещение> убивает все процессы ffmpeg (kill -9), берёт URL видео и аудио из /tmp/plugins/yt_Dash_video и /tmp/plugins/yt_Dash_audio и, если смещение отличается от предыдущего в /tmp/plugins/meter.txt не на 5 (то есть это перемотка или старт), отдаёт video/mpegts от ffmpeg -ss <смещение> … -c copy -vbsf h264_mp4toannexb -f mpegts pipe:1; при шаге ровно 5 отдаёт файл empty.
    • plg-hdtv-utility-family.c088 · code · android; прошивка — · yt.sh добавляет в PATH жёстко заданный /flashdata/plugins/ffmpeg_install/bin и различает платформу: при android_platform=rtd1295 в /tmp/run/versions.txt запускает ffmpeg без -re у второго входа, иначе с -re.
    • plg-hdtv-utility-family.c089 · code · android-dune-fw; прошивка 260827_0003_r24 · Потребитель yt.sh — прошивка: в tv188b r24 shell_ext/music/link_api.php dash_to_hls() возвращает http://127.0.0.1/cgi-bin/plugins/ffmpeg_install, если существует /flashdata/plugins/ffmpeg_install/www/cgi-bin/yt.sh (после проверки /codecpack/WWW/cgi-bin/yt.sh), а retrieve_playback_url пишет URL в /tmp/plugins/yt_Dash_video и yt_Dash_audio и возвращает «$dash_to_hls/yt.sh?<длительность>=.m3u8».

    ↩

    • plg-hdtv-evolutiontv.c024 · code · unknown; прошивка — · Настройки codecpack показывают локальную версию из первого существующего /persistfs/codecpack/version.txt, /D/codecpack/version.txt или /flashdata/codecpack/version.txt и, если fopen открывает http://micha86.square7.ch/Dune/codecpack/version.txt, удалённую версию; кнопки установки/удаления запускают bin/dune_service_codecs_install.sh и bin/dune_service_codecs_uninstall.sh, только если удалённый codecpack.zip доступен через fopen.
    • 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 /codecpack/WWW -p 81 и запускает httpd.
    • plg-hdtv-evolutiontv.c026 · code · unknown; прошивка — · uninstall-скрипт выбирает /persistfs или /D по mount (если нет ни того, ни другого — выходит с кодом 1), удаляет /codecpack при его наличии, убивает httpd на порту 81 и пытается удалить /config/boot/rtmpboot.sh; проверка if [ ! -x "BOOTRTMP" ] сравнивает литерал без $, поэтому условие не зависит от /config/boot/rtmpboot.sh.

    ↩

    • plg-ds-dune-hd-tv.c040 · code · unknown; прошивка — · get_tv_stream_url выполняет shell_exec(/bin/play.sh /bin), только если URL от api_get_stream_url начинается с '/'; get_tv_playback_url — только при $restrict_ch (канал не защищён, родительский контроль выключен или код 0000, либо protect_code верен).
    • plg-ds-dune-hd-tv.c041 · code · unknown; прошивка — · get_tv_stream_url: если API вернул URL, начинающийся с '/', и play.sh что-то вывел, плагин возвращает 'http://ts://localhost:8081' + URL с dune_params; при пустом выводе — error://internal_error/01.
    • plg-ds-dune-hd-tv.c042 · code · unknown; прошивка — · bin/play.sh запускает receive5 с ключом -h 18883, если процесс ещё не запущен; бинарник берётся из $FS_PREFIX/firmware/bin/receive5, а при его отсутствии — ./receive5 из пакета; перед этим убивает receive5, если у него больше 3 сокетов.
    • plg-ds-dune-hd-tv.c043 · code · android-dune-fw; прошивка 260724-0207-r24 · В прошивке APK r24 есть firmware/bin/receive5 (отображается на libxxx_receive5.so), т. е. путь, который play.sh проверяет первым, существует хотя бы в этой прошивке.
    • 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.
    • plg-ds-dune-hd-tv.c045 · code · unknown; прошивка — · Строки ELF bin/receive5 содержат usage «receive -d -i -r -o -p -h -u [remote_url:port]» и сообщения HTTP-сервера (HTTP bind error, accepted http connection).

    ↩

    • plg-hdtv-folder-cache-vod.c144 · code · unknown; прошивка — · flashx-декодер: GET, разбирает hash/op/id/fname/referer/usr_login, после sleep(10) шлёт POST; если первый шаблон smil.?file.?" не сработал, по smil|…| скачивает http://www.flashx.tv/.smil, берёт meta base и video src и собирает URL http://ts://127.0.0.1:81/cgi-bin/rtmp.sh? playpath= swfUrl=http://static.flashx.tv/player6/jwplayer.flash.swf pageUrl=.
    • plg-hdtv-folder-cache-vod.c149 · code · unknown; прошивка — · streams/javedecoder.php реализует распаковщик JW player: unpackjs() делит список ключей по | и для i от c-1 до 0 заменяет слово с номером i (в системе счисления a) на k[i]; decode() переводит число в строку цифрами 0-9a-zA-Z.
    • plg-hdtv-folder-cache-vod.c152 · code · unknown; прошивка — · Для live-stream.tv parse_season() читает страницу file_get_contents, берёт логотип, title и описание из трёх блоков «время-канал», затем из tvguide/nownext достаёт iframe, скачивает его, распаковывает eval(function(p,a,c,k,e…)) через unpackjs, из streamer и file собирает URL http://ts://127.0.0.1:81/cgi-bin/rtmp.sh? playpath= swfUrl=http://static.live-stream.tv/player/player.swf pageUrl=#tab2-tab.

    ↩

  145. plg-hdtv-peerstv.c018 · code · unknown; прошивка — · Live-воспроизведение канала обеспечивает AbstractTv::get_tv_playback_url: он загружает каналы при необходимости и возвращает streaming_url канала; archive_ts и protect_code не используются. ↩

    • plg-hdtv-pirates-radio.c035 · code · unknown; прошивка — · Воспроизведение идёт напрямую по streaming_url: AbstractTv::get_tv_playback_url после ensure_channels_loaded возвращает get_streaming_url() канала, а DemoTv передал в конструктор playback_url_is_stream_url = true.
    • plg-hdtv-pirates-radio.c036 · code · unknown; прошивка — · DemoTv не переопределяет get_tv_stream_url, поэтому вызывается унаследованный AbstractTv::get_tv_stream_url, который всегда бросает исключение "get_tv_stream_url() is not supported.".

    ↩

  146. plg-hdtv-kohana-channel.c072 · code · unknown; прошивка — · Welcome::get_tv_playback_url игнорирует channel_id, archive_ts и protect_code и каждый раз возвращает streams.stream из конфигурации. ↩

    • plg-gh-valerievitch-dune-plugin-acestreamsearch.c025 · code · unknown; прошивка — · AceSearchTv создаётся с режимом AbstractTv::MODE_CHANNELS_1_TO_N, без поддержки избранного (favorites_supported = false) и с playback_url_is_stream_url = false.
    • plg-gh-valerievitch-dune-plugin-acestreamsearch.c083 · code · unknown; прошивка — · AceSearchTv::get_tv_stream_url извлекает id канала из media_url как подстроку после 'infohash=' и запрашивает media_url с добавленным '&format=json'.
    • plg-gh-valerievitch-dune-plugin-acestreamsearch.c084 · code · unknown; прошивка — · AceSearchTv::get_tv_stream_url сохраняет playback_url из ответа Ace API, заменив '://' на '://ts://'.

    ↩

  147. plg-dc-globaltv.c082 · code · unknown; прошивка — · URL потока плагин получает GET-запросом cmd/get_playback_url с параметрами stream_id, region, содержимым dune_auth и, для архива, archive_ts и duration_m; ответ — JSON с полями status, url, error_code, error. ↩

  148. plg-hdtv-moidom.c014 · code · unknown; прошивка — · get_tv_playback_url сначала загружает каналы и проверяет логин, затем вызывает API get_url.php?with_ts=1&cid=, добавляя &gmt=, если archive_ts >= 0, и &protect_code=, если protect_code задан; из ответа берётся data->url, обрезается по ' :' и заменяет 'http/' на 'http://'. ↩

  149. plg-dc-globaltv.c077 · code · unknown; прошивка — · Комментарий автора: кэш URL воспроизведения сбрасывается после одного использования, чтобы не сохранять старые нерабочие URL. ↩

    • plg-gh-mikhail-ilin-dune-plugin-weburgtv.c055 · code · unknown; прошивка — · WeburgHLSTv::get_tv_playback_url вычисляет offset = 0 при archive_ts <= 0, иначе time()-archive_ts, и возвращает http://playlist.tv.planeta.tc/playlist/hls/$channel_id-live-$offset-master.m3u8?abs&videoOnly=true&quality=max; streaming_url канала не используется.
    • plg-gh-mikhail-ilin-dune-plugin-weburgtv.c056 · code · unknown; прошивка — · WeburgHLSTv::get_tv_stream_url возвращает входной media_url без изменений.

    ↩

  150. plg-hdtv-zlostnyi-iptv.c103 · code · unknown; прошивка — · edem не подставляет ключ в адрес плейлиста: в URL канала строка «00000000000000» заменяется на cookie ott_key, а «localhost» — на junior.edmonst.net при каждом воспроизведении. ↩

    • plg-hdtv-plugtv.c029 · code · unknown; прошивка — · В trofey get_tv_playback_url перед заменой схемы дописывает к URL значение $plugin_cookies->params, а load_channels заполняет его вызовом HD::params().
    • plg-hdtv-plugtv.c030 · code · unknown; прошивка — · HD::params скачивает http://trofey.net/video/telekanal-trofey; если в ответе есть строка с <source type='video/mp4', делит её по апострофам, берёт четвёртый элемент и оставляет подстроку с первого '?' (включая его), а если строки нет, $p остаётся неопределённой (возвращается null). Полученная query-строка затем дописывается к потоку.

    ↩

  151. plg-hdtv-zlostnyi-iptv.c095 · code · unknown; прошивка — · antifriz для каналов группы «Deutschland» запоминает отдельный сервер (cookie germanServer, id в german_ids) и при воспроизведении таких каналов подставляет его вместо server. ↩

  152. plg-hdtv-101-ru.c095 · code · unknown; прошивка — · DemoTv::get_tv_playback_url собирает http://listen.di.fm/premium_high/.pls?, где listenKey берётся из plugin_cookies (иначе пустая строка); для .pls скачивает документ, оборачивает значения TitleN в кавычки, разбирает parse_ini_string и возвращает File1. ↩

    • plg-gh-aspel-twitch-dune-plugin.c030 · code · unknown; прошивка — · TwitchPlugin::get_vod_info обрабатывает только media_url с префиксом stream_name: — создаёт GamePlay(substr($media_url, 12), stream_name, img, status_stream, game_name) и возвращает generatePlayInfo($q); для остальных media_url возвращает null.
    • plg-gh-aspel-twitch-dune-plugin.c031 · code · unknown; прошивка — · GamePlay::generatePlayInfo возвращает PluginVodInfo с name "$streamName - $streamGameName", description = streamStatus, poster_url = streamIMG, одной серией (name = streamName, playback_url = streamURL, playback_url_is_stream_url = true), initial_series_ndx 0, initial_position_ms 0, advert_mode false, ip_address_required true, actions = переданный массив q, valid_time_required false.
    • plg-gh-aspel-twitch-dune-plugin.c040 · code · unknown; прошивка — · GameQuality::generate_menu для каждого элемента с непустым $matches[2][$i] строит пункт с подписью "

    ↩

    • plg-hdtv-smart-vod.c124 · code · unknown; прошивка — · Smart_vod.php эталона вызывает link_api(), затем требует возвращённый файл, если он существует, иначе link_api.php.
    • plg-hdtv-smart-vod.c125 · code · unknown; прошивка — · link_api эталона вызывает fwrite для /tmp/plugins/link_api.php при $vers1==true и (($matches1[1]==true и $upd==true) либо отсутствии локального файла); $upd становится true при существующем локальном файле и $matches1[1]>$matches2[1].
    • plg-hdtv-smart-vod.c208 · code · unknown; прошивка — · В tree.tsv HdKinoTeatr.Com корневого link_api.php нет, хотя Smart_vod.php предусматривает require этого файла как резервный вариант.
    • plg-hdtv-smart-vod.c113 · code · unknown; прошивка — · get_vod_stream_url HdKinoTeatr.Com передаёт playback_url и cookie video_quality (при отсутствии — 360) в mUrl::get_link.

    ↩

  153. plg-hdtv-folder-cache-vod.c092 · code · unknown; прошивка — · get_vod_stream_url получает прямой URL через mUrl::get_link('https://www.youtube.com/watch?v=' . $media_url, $video_quality) и печатает исходный и полученный URL в echo. ↩

    • plg-hdtv-smart-vod.c168 · code · unknown; прошивка — · get_vod_stream_url в futbik-net при совпадении .m3u8 возвращает входной playback_url, иначе вызывает mUrl::get_link.
    • plg-hdtv-smart-vod.c169 · code · unknown; прошивка — · get_vod_stream_url в megamult-net при совпадении .m3u8 возвращает входной playback_url, иначе вызывает mUrl::get_link.
    • plg-hdtv-smart-vod.c170 · code · unknown; прошивка — · get_vod_stream_url в kinohold-com при совпадении .m3u8 возвращает входной playback_url, иначе вызывает mUrl::get_link.
    • plg-hdtv-smart-vod.c171 · code · unknown; прошивка — · get_vod_stream_url в bestkino при совпадении .m3u8 возвращает входной playback_url, иначе вызывает mUrl::get_link.

    ↩

    • plg-hdtv-smart-vod.c205 · code · unknown; прошивка — · В комплектном link_api.php HDrezka mUrl::get_link после преобразования качества вызывает ::getIframe(media_url, playbackUrl, quality), если URL содержит EpisodId_, класс из префикса существует и у него есть getIframe.
    • plg-hdtv-smart-vod.c268 · code · unknown; прошивка — · FilmHD1080.Net выбирает обработчик iframe по доменной сигнатуре: svetacdn/videocdn/the-cinema.best/ tvmovies/?kp_id/ — videocdn, videoframe — videoframe, placehere/tobaco/delivembed/buildplayer/ synchroncode — Collaps, vid…/serial/<64 hex>/iframe и vid…/movie/<32 hex>/iframe — HDVB, hdrise/kodik — Kodik, yout/trailer-cdn — трейлер; для trailer-cdn отдельно скачивается страница и из неё берётся file:"…".
    • plg-hdtv-smart-vod.c285 · code · unknown; прошивка — · KinoStorm.Net разбирает iframe-плееры svetacdn/videocdn/the-cinema.best/tvmovies/?kp_id=, videoframe, Collaps, HDVB и Kodik; yohoho-поиск по kpId в этом файле не вызывается.
    • plg-hdtv-smart-vod.c262 · code · unknown; прошивка — · Baskino.Me в parse_video_page сначала обрабатывает iframe с voidboost (voidboost::getIframe; ответы с EpisodId_ — в series, остальные — в urls), а затем, если в документе есть ссылка /kp/, вызывает videoSearcher::yohohoVideoSearch и разбирает плееры trailer, iframe, collaps, videocdn, hdvb, kodik: videocdn, iframe и collaps кладут ответы с EpisodId_ в series, остальные — в urls; hdvb при URL с serial кладёт ответы в urls, иначе — маркер hdvbEpisodId_ в series; kodik — в urls; trailer — в series.

    ↩

    • plg-hdtv-smart-vod.c334 · code · unknown; прошивка — · get_vod_stream_url Filmix_API берёт video_quality из plugin_cookies (по умолчанию 3), в parseQltyArr извлекает список качеств из квадратных скобок playback_url, перебирает соответствие 6→2160, 5→1440, 4→1080, 3→720, 2→480, 1→360, 0→240, понижая индекс до первого заданного качества, и возвращает поток с этим качеством, иначе после ksort — первый элемент; затем заменяет http:// и https:// на http://mp4://.
    • plg-hdtv-smart-vod.c173 · code · unknown; прошивка — · parse_video_stream_url Zona.mobi при непустом playback_url запрашивает ajax/video/ и выбирает lqUrl только при video_quality=1 и наличии lqUrl, иначе url.

    ↩

    • plg-hdtv-folder-cache-vod.c036 · code · unknown; прошивка — · Youtube::retrieve_playback_url() выбирает качество по plugin_cookies->video_quality: 4 → hd1080, 3 → hd720, иначе medium; из потока принимаются только itag 18, 22, 37 и 38.
    • plg-hdtv-folder-cache-vod.c086 · code · unknown; прошивка — · Экран настроек YouTubeMult содержит video_quality (0 smallest, 1=360, 2=480, 3=720, 4 maximum; по умолчанию 1), use_osk, skip_details, pl_create, show_comment, buf_time (0/500…10000 мс), data_type (1 плагин, /D, 2 SMB, смонтированные каталоги) и skin default/juniperus; data_dir показывается при data_type не 1 и не 2, а при data_type=2 кнопка data_path_smb открывает диалог с полями data_ip_path, data_smb_user и data_smb_pass.

    ↩

  154. plg-hdtv-folder-cache-vod.c050 · code · unknown; прошивка — · Youtube::retrieve_playback_url() и General_main() снимают ограничение времени через set_time_limit(0); в Youtube это подписано комментарием «no more plugin restarts». ↩

  155. plg-hdtv-evolutiontv.c013 · code · unknown; прошивка — · get_tv_playback_url возвращает streaming_url канала, но если канал защищён и protect_code не равен cookie current_pcode_save, возвращает false. ↩

    • plg-hdtv-liteiptv.c041 · code · unknown; прошивка — · get_tv_playback_url для защищённого канала возвращает заглушку http://mp4://dune-club.info/plugins/update/1.mp4, если переданный protect_code не совпадает с cookie pin (по умолчанию '0000').
    • plg-hdtv-liteiptv.c057 · code · unknown; прошивка — · Смена PIN в настройках требует, чтобы введённый pin1 совпал с текущим cookie pin (по умолчанию 0000), и сохраняет pin2; при пустом поле или несовпадении показывает сообщение об ошибке.

    ↩

    • plg-dc-bazinga3.c044 · code · unknown; прошивка — · SmartVod::get_vod_stream_url вызывает mUrl::get_link(playback_url, качество) только если playback_url или качество отличаются от предыдущих (статические $old_playback_url/$old_video_quality); иначе отдаёт сохранённый в статическом $stream_urls результат. Качество — filmix_quality для URL с filmix, иначе video_quality, по умолчанию 1.
    • plg-dc-bazinga3.c053 · code · unknown; прошивка — · AbstractVod::get_vod_info передаёт в Movie::get_vod_info буферизацию 3000 мс; Movie::get_vod_info строит series из PluginVodSeriesInfo name/playback_url/playback_url_is_stream_url и пропускает playback_url=dummy.

    ↩

    • plg-dc-dunemdb-supplier-movies-rus.c049 · code · unknown; прошивка — · do_get_stream_url резолвит поток через zonaMobi::getZonaMobiIframe(..., 'playbackUrl', 'https://w113.zona.plus') и считает ошибкой результат, содержащий dune-club.info (то есть заглушку).
    • plg-dc-dunemdb-supplier-movies-rus.c050 · code · unknown; прошивка — · Ветка playbackUrl при непустом id в zonaMobi::getZonaMobiIframe шлёт HEAD-запрос на /ajax/video с зашитым Cookie ZONAMOBI=jao7v3r6fu5ap8tcchbdko5qq0, затем GET /ajax/video/?client_time=<значение из http://dune-club.info/tts> с JSON-заголовками.

    ↩

    • plg-dc-globaltv--rows-epf.c049 · code · unknown; прошивка — · URL предпросмотра plugin_tv://globaltv/ добавляется в playback_urls только при доступном pf_playback и не adult-канале (adult либо имя с префиксом XXX); в MediaURL устанавливается preview=1.
    • plg-dc-globaltv--rows-epf.c050 · code · unknown; прошивка — · В get_tv_info наличие preview переключает выдачу с channels_file на встроенные groups/channels: одну all_channels_group и один выбранный канал с playback_url_is_stream_url=1.

    ↩

    • plg-ds-dune-hd-tv.c036 · code · unknown; прошивка — · get_tv_playback_url в ветке $restrict_ch (канал не защищён, родительский контроль выключен или код 0000, либо protect_code верен) для канала с streaming_url ≠ passive запрашивает у API v2/channels//stream с ts архива (пустой или -1 — 0) и type из $this->forced_stream_type, иначе из plugin_cookies->stream_type (local, local_low или hls; иное заменяется на hls), и берёт из ответа поле hls, иначе local, иначе local_low.
    • plg-ds-dune-hd-tv.c065 · code · unknown; прошивка — · Экран настроек предлагает «Качество картинки» (combobox stream_type: local «Наилучшее», local_low «Хорошее», hls «Авто», по умолчанию hls) и сохраняет выбор в plugin_cookies->stream_type.

    ↩

  156. plg-ds-dune-hd-tv.c038 · code · unknown; прошивка — · При ошибке запроса потока плагин возвращает видео-заглушку: при исключении «403» — http://mp4://media.zt.platform24.tv/Dune/geo_matras.mp4, иначе .../Dune/matras.mp4; для канала со streaming_url passive — тоже matras.mp4. ↩

  157. plg-gh-kocourkuba-proiptv.c039 · code · unknown; прошивка — · get_tv_stream_url плагина возвращает playback_url без изменений; URL потока формирует get_tv_playback_url → generate_stream_url($channel_row, $archive_tm_sec). ↩

  158. plg-hdtv-folder-cache-vod.c072 · code · unknown; прошивка — · veterok для veterok.tv вытаскивает прямой URL из JavaScript-строки files["N"]="…" и заменяет YouZeeK.com/?sid= и youtube-embed на youtube watch?v=. ↩

    • plg-hdtv-folder-cache-vod.c139 · code · unknown; прошивка — · youwatch-декодер: GET страницы, разбирает скрытые op/usr_login/id/fname/referer/hash/ imhuman, после sleep(11) шлёт POST; URL берёт из file: "…mp4" либо из блока mp4|video и собирает http://.youwatch.org://video.mp4.
    • plg-hdtv-folder-cache-vod.c140 · code · unknown; прошивка — · youwatch embed-декодер: GET embed-страницы и возвращает строку между file: " и следующей кавычкой.

    ↩

    • plg-hdtv-smart-vod.c273 · code · unknown; прошивка — · Filmix получает ссылку через FilmixNext::getIframe для карточки, сезона и перевода; при наличии .m3u8 get_vod_stream_url возвращает URL без изменений, иначе вызывает mUrl::get_link с качеством из cookie. Качество 1080/1440p/2160p предлагается только при успешном входе, а 1440p/2160p — дополнительно при HD::get_dash_platform_kind.
    • plg-hdtv-smart-vod.c281 · code · unknown; прошивка — · Kinogo.so получает ссылки через kinoGo::getIframe по числовому id, извлечённому из /- в URL карточки; ответ с SeasonId_ становится сезоном, с EpisodId_ — серией, а если вложенная ссылка содержит тот же id, дополнительно вызывается kinoGo::getIframe(..., 'seasons'); серии сезона берутся через kinoGo::getEpisodesKinoGo.
    • plg-hdtv-smart-vod.c288 · code · unknown; прошивка — · KinoTochka.Club при загрузке карточки использует cookie-файл tmp_dir_path/kinotochka_cooki, а ссылки получает через kinotochka::getKinoTochkaIframe с режимами doc, seasons и episodes; постер подставляется через CGI do?img=.

    ↩

    • plg-hdtv-smart-vod.c320 · code · unknown; прошивка — · parse_video_page MoviesTape при совпадении iframe src="http://fs…" запрашивает этот адрес; при file : '…' добавляет серию с именем caption, при pl : '…' загружает JSON и, если playlist[0]->file задан, добавляет серии по comment, иначе сохраняет playlist в urls; после блока iframe при наличии div class="f-play" и rel="…" добавляет серию caption→rel.
    • plg-hdtv-smart-vod.c321 · code · unknown; прошивка — · parse_other_sources MoviesTape при непустом movie->kp_id и отсутствии поля error в ответе moonwalk запрашивает http://moonwalk.cc/api/videos.json с kinopoisk_id и api_token 997e626ac4d9ce453e6c920785db8f45 и добавляет каждый iframe_url как источник с title_ru/title_en, пометкой CamRip при camrip=1, переводчиком и added_at.
    • plg-hdtv-smart-vod.c322 · code · unknown; прошивка — · parse_other_sources MoviesTape ищет фильм через http://test.tree.tv/api (maska=&index=1), выбирает page_id только при совпадении year, затем запрашивает http://api.tree.tv/index/getfilm с idVideo; при наличии film_window перебирает качества 1080→720→480→360 по video_quality (1 = 360) и при найденных ссылках добавляет серии other_sources, иначе возвращает false.

    ↩

  159. plg-hdtv-smart-vod.c337 · code · unknown; прошивка — · В Filmix_API есть отдельный lib/dune_stb_api.php — «Dune STB API» автора Brigadir (forum.mydune.ru) с датой 23-07-2017 и последним обновлением 25-10-2019; файл содержит обёртки FolderViewItemParams/FolderViewParams и функции get_platform_kind, get_android_platform, get_product_id, get_firmware_version, get_parsed_firmware_ver, send_ir_code, get_player_state и другие. ↩

  160. plg-hdtv-smart-vod--link-api.c058 · code · unknown; прошивка — · Для расшифровки подписей и получения cookie код обращается к dune-club.info: /echo (YouTube signature), /tts2 (Zona RCPC) и /tts (client_time для Zona). ↩

  161. plg-gh-mdpuma-dune-plugin-altiptv.c104 · code · unknown; прошивка — · В режиме group_tv=5 get_tv_playback_url при отсутствии закреплённого источника циклически выбирает URL из global_channels и сбрасывает индекс при смене channel_id. ↩

  162. plg-hdtv-liteiptv.c043 · code · unknown; прошивка — · При воспроизведении без архива, если у канала несколько источников, выбор хранится в ch_select[id] и общий — в ch_select_all; после пяти переключений плагин начинает циклически перебирать остальные URL из urls. ↩

  163. plg-hdtv-novosib-iptv.c029 · code · unknown; прошивка — · Список найденных прокси хранится в /tmp/proxy_list_novosib и в cookie proxy_list; выбор источника пишется в cookie src_ и novosib, затем запускает tv_play. ↩

  164. plg-gh-mdpuma-dune-plugin-altiptv.c056 · code · unknown; прошивка — · При use_proxy=yes get_tv_stream_url переписывает UDP/RTP multicast URL в http://ts://:/udp/ либо /rtp/. ↩

    • plg-hdtv-novosib-iptv.c027 · code · unknown; прошивка — · proxy.php — сканер прокси: перебирает адреса в диапазоне /24 (n3..end_scann) и 0..255, проверяет fsockopen с таймаутом 0.2 с, дописывает найденные адреса в файл-список через '+' и останавливает перебор примерно через 56 с.
    • plg-hdtv-novosib-iptv.c028 · code · unknown; прошивка — · Кнопка сканирования после подтверждения в диалоге запускает /codecpack/bin/php proxy.php в фоне для случайных /24-подсетей (или полного диапазона) только при наличии /codecpack/bin/php и если с прошлого запуска прошло больше 100 с; при отсутствии симлинка создаёт /lib/libidn.so.11 и ждёт 50 с.

    ↩

    • plg-gh-mdpuma-dune-plugin-altiptv.c087 · code · unknown; прошивка — · do.php получает GET n1,n2,an,en,port,plf,prov, проверяет адреса диапазона fsockopen с таймаутом 0.2 с и дописывает найденные IP:port в plf.
    • plg-gh-mdpuma-dune-plugin-altiptv.c091 · code · unknown; прошивка — · Для поиска прокси экран каналов обращается к 1whois.ru/?url= и извлекает диапазон и провайдера из ответа.

    ↩

    • plg-dc-dunemdb-supplier-online-movies.c067 · code · unknown; прошивка — · Настройки Config читаются из /config/omov_config.txt; autoswitch_enabled по умолчанию равен 1 при наличии файла /config/online_movies_full.flag и 0 без него, но значение из /config/omov_config.txt имеет приоритет.
    • plg-dc-dunemdb-supplier-online-movies.c068 · code · unknown; прошивка — · Пороги авто-переключения по умолчанию: open 10 с, start 15 с, seek 30 с, start buffering 30 с, seek buffering 40 с, buffering 10 с, частое буферизирование — 6 раз за 60 с.
    • plg-dc-dunemdb-supplier-online-movies.c100 · code · unknown; прошивка — · Playback при state=buffering выбирает лимит: первый буферинг после старта — switch_long_start_buffering; буферинг в пределах 10 с после initializing — тот же лимит; в пределах 10 с после seeking — switch_long_seek_buffering; в пределах 10 с после SwitchAudioTrack — тот же; быстро повторный буферинг склеивается с предыдущим; иначе — switch_long_buffering с проверкой частоты.
    • plg-dc-dunemdb-supplier-online-movies.c101 · code · unknown; прошивка — · Playback::perform_work открывает SwitchDialog при истечении state_limit_tm или debug_forced_switch_delay, только если switch_enabled и osd_active; при уже открытом диалоге действие не повторяется.
    • plg-dc-dunemdb-supplier-online-movies.c103 · code · unknown; прошивка — · SwitchDialog при playback_stop без opened/confirmed просто закрывается; иначе берёт позицию из plugin_vod_stop_position либо последнюю известную и запускает switch_torrent, который перебирает следующие торренты через get_next_torrent и open_torrent с позицией.

    ↩

  165. plg-dc-bazinga3.c045 · code · unknown; прошивка — · При повторном запросе того же playback_url с тем же качеством get_vod_stream_url инкрементирует $counter: если предыдущий ответ — массив, берёт $stream_urls[$counter], иначе отдаёт тот же $stream_urls; при отсутствии элемента в массиве или $counter > 4 возвращает заглушку http://mp4://dune-club.info/plugins/update/1.mp4. ↩

  166. plg-gh-kocourkuba-proiptv.c040 · code · unknown; прошивка — · Для архива generate_stream_url выбирает тип catchup (канал > пользовательская настройка > M3U/конфиг провайдера; для URL с mpegts — flussonic; по умолчанию shift) и строит шаблон: shift — utc=${start}&lutc=${timestamp}, timeshift — timeshift=${start}&timenow=${timestamp}, archive — archive=${start}&archive_end=${end}, flussonic — …/archive-${start}-14400.ts или <имя>-${start}-14400, xtream codes — /timeshift///240/{Y}-{m}-{d}:{H}-{M}/.. ↩

    • plg-hdtv-zlostnyi-iptv.c049 · code · unknown; прошивка — · Архив bcu при $archive_ts > 0 и format 'mpeg' (ветка else if после hls-ветки): в URL «mpegts» заменяется на «archive--7200.ts».
    • plg-hdtv-zlostnyi-iptv.c085 · code · unknown; прошивка — · great строит архив HLS заменой video.m3u8 на video--10800.m3u8, MPEG-TS — archive--7200.ts; VOD-константы указывают на online.dune-hd.com/demo2.
    • plg-hdtv-zlostnyi-iptv.c094 · code · unknown; прошивка — · Архив antifriz: hls1 — video--10800.m3u8, hls2 — ?utc=&lutc=, dash — archive--1800.mpd, mpeg — archive--10800.ts (все при $archive_ts > 0 и соответствующем format).
    • plg-hdtv-zlostnyi-iptv.c158 · code · unknown; прошивка — · sharavoz подставляет token вместо «flussonic_token»; при format = 'hls' заменяет «mpegts» на «index.m3u8», при archive_ts > 0 и format = 'hls' — «index.m3u8» на «archive--10800.m3u8», а при archive_ts > 0 и format = 'mpeg' — «mpegts» на «archive--10800.ts»; дни архива — из catchup-days, для не-VIP добавляется канал Info с роликом vip_3.mp4.

    ↩

    • plg-hdtv-zlostnyi-iptv.c048 · code · unknown; прошивка — · Архив bcu при $archive_ts > 0 и format 'hls': плагин заново читает /tmp/playlist.m3u, находит строку канала по id (base64(название)&&tvg-id), берёт её catchup-source (без «$») и заменяет «video-{start}-{duration}» на «video--7200»; если catchup-source нет — URL не меняется.
    • plg-hdtv-zlostnyi-iptv.c086 · code · unknown; прошивка — · lightiptv строит архив как bcu: catchup-source канала из /tmp/playlist.m3u с заменой video-{start}-{duration} на video--7200.

    ↩

    • plg-hdtv-zlostnyi-iptv.c084 · code · unknown; прошивка — · fox строит архив HLS через параметры ?utc=&lutc=, а MPEG-TS — заменой mpegts на archive--7200.ts.
    • plg-hdtv-zlostnyi-iptv.c104 · code · unknown; прошивка — · Архив edem: при $archive_ts > 0 к URL дописывается «?utc=&lutc=|||dune_params|||hls_forced_type:event».
    • plg-hdtv-zlostnyi-iptv.c155 · code · unknown; прошивка — · shura при archive_ts > 0 добавляет к URL «?archive=&lutc=» (не utc); дни архива считает из атрибута catchup-time как часы/24; id канала извлекает regex '/.+\/(.*)\/hls/' из URL, а если совпадения нет — берёт номер строки $i; логотип берёт с http://list.iptv-ott.ru/img/channel_icons/.png.

    ↩

  167. plg-dc-globaltv.c080 · code · unknown; прошивка — · Для архива плагин передаёт серверу длительность duration_m — до конца передачи по EPG, но не меньше 3600 с. ↩

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

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

    • doc-sdk-plugins--gui-actions.c134 · doc · any-documented; прошивка — · Данные PluginUpdateOsdAction — класс PluginUpdateOsdActionData: components (тип записан как PluginOsdComponenetList) и необязательный post_action; действие доступно с прошивки 150528_r10
    • doc-sdk-plugins--gui-actions.c125 · doc · any-documented; прошивка — · Данные PluginUpdateInfoBlockAction — класс PluginUpdateInfoBlockActionData: text_above и необязательные text_color (по умолчанию 15), text_halo (false), text_y_offset (0), post_action; действие доступно с прошивки 150526_r10

    ↩

    • plg-hdtv-altsource.c041 · code · unknown; прошивка — · Movie::get_vod_info задаёт PluginVodInfo::initial_position_ms из сохранённой позиции viewedItemsArr (p × 1000); если позиция в пределах 5 секунд от конца, она сбрасывается в 0.
    • plg-hdtv-altsource.c043 · code · unknown; прошивка — · Обработчик playback_stop переносит накопленные playback_info (p и d) в viewedItemsArr и сохраняет их, кроме файлов с расширениями wav/ogg/flac/midi/rm/aac/ wma/mka/ape/jpg/png.

    ↩

    • plg-hdtv-smart-vod.c196 · code · unknown; прошивка — · При control_id=timer эталон читает /tmp/run/ext_command.state; playback_info присваивается только если найдены playback_position и playback_duration и оба значения больше нуля.
    • plg-hdtv-smart-vod.c197 · code · unknown; прошивка — · Movie::get_vod_info эталона при наличии viewed_items для URL и значении, отличном от viewed, вычисляет initial_position_ms из сохранённой позиции; pos<0 и pos+5>=duration заменяются нулём.

    ↩

  170. plg-hdtv-youtube.c060 · code · unknown; прошивка — · Movie::get_vod_info YouTube при watched == 1 помечает серии из viewed_items префиксом [ПРОСМ] или [ПРОСМ позиция/длительность] и задаёт initial_position_ms из сохранённой позиции; pos<0 и pos+5 ≥ длительности сбрасываются в 0. ↩

  171. plg-hdtv-altsource.c042 · code · unknown; прошивка — · На первом событии таймера VOD-воспроизведения Movie добавляет запись в itemsHistory с history_path, history_str («Просмотрено: <дата>»), а также csi и current_network_folder при их наличии; запись ставится в начало, история обрезается до 310 элементов. ↩

  172. plg-hdtv-smart-vod.c198 · code · unknown; прошивка — · При control_id=watched, заданной ненулевой playback_info и заданном playback_stop_pressed эталон сохраняет фильм в history_items; если после вставки размер ровно 31, удаляет последний элемент. ↩

  173. plg-hdtv-altsource.c045 · code · unknown; прошивка — · Кнопка «Просм./Не просм.» переключает viewedItemsArr[series_id] только для video_file и audio_file; для остальных типов показывается сообщение, что отметки используются только для аудио и видео. ↩

  174. plg-hdtv-smart-vod.c210 · code · unknown; прошивка — · При control_id=viewed и заданном selected_media_url VodSeriesListScreen эталона переключает запись viewed_items[HD::baseitem(series_id)] между отсутствием и строкой viewed, сохраняет её и инвалидирует vod_series. ↩

    • plg-dc-screenshoter.c097 · code · unknown; прошивка — · Функция get_prop_from_file() читает значение ключа из файла формата «key = value» построчно, возвращая заданное значение по умолчанию при отсутствии файла или ключа.
    • plg-dc-screenshoter.c068 · code · android; прошивка — · Скриншот через IR-код выбирается при HD_APK без HD_FW_APK, а при HD_FW_APK — если в /tmp/run/ext_command.state player_state = file_playback и в /tmp/run/ext_command.android.state android_app_active = 0

    ↩

  175. plg-hdtv-utility-family.c118 · code · unknown; прошивка — · do.php mark.it по cron читает /tmp/run/ext_command.state: если в 5-й строке есть playback_url, состояние не dvd_playback, файл не аудио и путь не начинается с http|udp|rtp|dvb:///|rstp и не в игнор-списке, — берёт playback_duration, playback_position, playback_video_width/height из строк 7, 8, 13, 14 и считает процент просмотра. ↩

    • plg-hdtv-youtube.c059 · code · unknown; прошивка — · Movie::get_vod_info YouTube возвращает PluginVodInfo с id, name, description, poster_url, series, initial_series_ndx, buffering_ms, actions (get_movie_actions), timer.delay_ms=500 и initial_position_ms (у эталона timer — 5000).
    • plg-hdtv-youtube.c061 · code · unknown; прошивка — · get_movie_actions YouTube назначает плееру GUI_EVENT_KEY_B_GREEN (menu2), CLEAR (sleep либо key_clear при clock 1/2), PLAYBACK_STOP, D_BLUE (menu), C_YELLOW (video_info при show_vxp == 1) и GUI_EVENT_TIMER (event_timer).
    • plg-hdtv-youtube.c062 · code · unknown; прошивка — · get_movie_actions YouTube только при HD::get_versions() === true добавляет GUI_EVENT_PLAYBACK_GOING_TO_SWITCH, GUI_EVENT_PLAYBACK_SWITCHED, GUI_EVENT_KEY_SUBTITLE, GUI_EVENT_KEY_INFO (при extendedInfo == 1) и GUI_EVENT_KEY_TOP_MENU (при top_menu == 1).

    ↩

    • plg-gh-aspel-twitch-dune-plugin.c029 · code · unknown; прошивка — · TwitchPlugin::get_vod_info назначает на GUI_EVENT_KEY_CLEAR действие chat, а на GUI_EVENT_PLAYBACK_GOING_TO_SWITCH и GUI_EVENT_PLAYBACK_STOP — действие stop_irc.
    • plg-gh-aspel-twitch-dune-plugin.c053 · code · unknown; прошивка — · UserInputHandlerRegistry::create_action собирает действие PLUGIN_HANDLE_USER_INPUT_ACTION_ID с params handler_id (из get_handler_id) и control_id (имя контрола), добавляя переданные add_params.

    ↩

    • plg-gh-valerievitch-dune-plugin-acestreamsearch.c051 · code · unknown; прошивка — · В AceSearchTv::handle_user_input ветка elseif playback_stop (после ветки timer) при наличии command_url запрашивает command_url?method=stop; затем независимо от этого сбрасывает self::$playing_channel_id и возвращает действие очистки информационного блока (text_above = '').
    • plg-gh-valerievitch-dune-plugin-acestreamsearch.c052 · code · unknown; прошивка — · Регистрация обработчиков GUI_EVENT_PLAYBACK_SWITCHED и GUI_EVENT_PLAYBACK_GOING_TO_SWITCH закомментирована, хотя ветки playback_switched и playback_going_to_switch в handle_user_input есть и только пишут в лог.

    ↩

    • plg-dc-torrent-center.c127 · code · unknown; прошивка — · timeInfoShowRend формирует OSD часов и прогресса, затем возвращает update_osd с change_behaviour и интервалом 1000 мс.
    • plg-dc-torrent-center.c117 · code · unknown; прошивка — · timeInfoShowRend рисует полосу прогресса из icons/selection_top.aai и icons/selection_dimmed_top.aai.
    • plg-dc-torrent-center.c164 · code · unknown; прошивка — · ActionFactory::update_osd возвращает PLUGIN_UPDATE_OSD_ACTION_ID с components и post_action.
    • plg-dc-torrent-center.c165 · code · unknown; прошивка — · ActionFactory::change_behaviour возвращает CHANGE_BEHAVIOUR_ACTION_ID с actions, timer и post_action.

    ↩

  176. plg-hdtv-altsource.c072 · code · unknown; прошивка — · OSD-часы и процент просмотра настраиваются в timeInfoShowRendSettings (цвет, halo, фон, шрифт, положение, режим clock, показ процента/остатка) и рисуются HD::timeInfoShowRend через update_osd/change_behaviour; настройка хранится с привязкой к MAC-адресу. ↩

  177. plg-hdtv-youtube.c063 · code · unknown; прошивка — · SmartConfig::getInfoRend YouTube рисует поверх видео OSD (update_osd с change_behaviour, таймер 1000 мс); без jsd->prsnt позицию, длительность и размер кадра он берёт регулярными выражениями из /tmp/run/ext_command.state. ↩

  178. plg-hdtv-youtube.c064 · code · unknown; прошивка — · SmartConfig::getSubtitleRend YouTube выводит субтитры как OSD-текст: по playback_position из /tmp/run/ext_command.state выбирает строку subArr['data'] (при отсутствии — ближайшую предыдущую), переносит по 80 символов и обновляет OSD с таймером 500 мс. ↩

    • plg-gh-valerievitch-dune-plugin-acestreamsearch.c048 · code · unknown; прошивка — · Обработчик timer в AceSearchTv читает stat_url канала; при наличии в ответе поля peers сохраняет его в acestream_data канала, а при наличии speed_down сохраняет его значение под ключом speed.
    • plg-gh-valerievitch-dune-plugin-acestreamsearch.c049 · code · unknown; прошивка — · Обработчик timer формирует PluginUpdateInfoBlockActionData с текстом « peers, MBit/s», text_color = 19 и text_halo = TRUE.
    • plg-gh-valerievitch-dune-plugin-acestreamsearch.c050 · code · unknown; прошивка — · Обработчик timer перезапускает себя действием CHANGE_BEHAVIOUR_ACTION_ID с таймером 5000 мс и post_action — обновлением информационного блока.

    ↩

  179. plg-dc-torrent-center.c126 · code · unknown; прошивка — · Обработчик key_b_green у Movie переключает статистику TorrServer/Peerflix через getInfoRend. ↩

    • plg-hdtv-youtube.c065 · code · unknown; прошивка — · При control_id=expect_stream VodTop500Screen YouTube показывает диалог с таймером 1000 мс; на 1-м и каждом 10-м тике вызывает Youtube::retrieve_playback_url и, пока результат равен заглушке http://mp4://dune-club.info/plugins/update/1.mp4, повторяет expect_stream, иначе выполняет vod_play().
    • plg-hdtv-youtube.c128 · forum · unknown; прошивка — · По первому посту темы 15724, в 6.7.7 добавлена функция «Ожидать стрим», проверяющая доступность стрима или премьеры каждые 10 с (через popup menu).

    ↩

  180. plg-dc-bazinga3.c054 · code · unknown; прошивка — · Movie::get_vod_info сливает viewedItemsTmpArr в viewedItemsArr и для серии с записью в viewedItemsArr при значении 'viewed' даёт префикс [ПРОСМ], иначе берёт позицию p ×1000 мс, сбрасывая отрицательную и позицию в пределах 5 с от конца d в 0. ↩

  181. plg-dc-bazinga3.c055 · code · unknown; прошивка — · На событии playback_switched при $this->ims == 0 и наличии saveSeasonTimes[$user_input->plugin_vod_id] Movie опрашивает http://127.0.0.1:/cgi-bin/do?cmd=status до 130 раз по 50 мс до playback_state=playing, затем при HD::is_android() ждёт ещё 0,8 с и шлёт cmd=set_playback_state&position=…&speed=256. ↩

    • plg-dc-screenshoter.c072 · code · unknown; прошивка — · Запись видео (action rec) запрещена при HD_APK; иначе запускается bin/rec.sh, который вызывает screenrecord --size 1280x720 в фоне
    • plg-dc-screenshoter.c073 · code · unknown; прошивка — · Остановка записи: pidof screenrecord и kill -2 (SIGINT) найденного PID
    • plg-dc-screenshoter.c074 · code · unknown; прошивка — · status_rec отсчитывает 180 секунд от начала записи (tts = 180 - прошедшее время)
    • plg-dc-screenshoter.c076 · code · unknown; прошивка — · Состояние записи (путь файла, время старта) хранится в JSON-файле rec_data в tmp_dir_path через HD::save_items_tmp

    ↩

  182. plg-hdtv-megaradio.c135 · code · unknown; прошивка — · При проигрывании VOD/YouTube Movie::get_vod_info отдаёт actions с playback_stop watched, D_BLUE sleep и таймером 3000 мс; B_GREEN sound_info назначается только при наличии /firmware/bin/ffmpeg или /codeckpack/bin/ffmpeg, CLEAR yt_search — только при HD::get_versions() = true; OSD обновляется через get_radio_stream_info только при HD::get_versions() = true, use_osd не равен 0 и id не содержит youtube. ↩

    • plg-hdtv-altsource.c037 · code · unknown; прошивка — · Обработчик add_action проверяет PIN родительского контроля, необходимость mount для network_folder и существование пути (иначе delete_item), затем video_file/audio_file отправляет в vod_play, disk_image, image_file, playlist_file и папки BDMV/VIDEO_TS — в launch_media_url, остальные известные типы возвращают null, а папки без типа открывает через open_folder.
    • plg-hdtv-altsource.c038 · code · unknown; прошивка — · Для video_file и audio_file плагин запускает VOD-воспроизведение действием ActionFactory::vod_play, а диски/образы, image_file, playlist_file, папки BDMV/STREAM и VIDEO_TS/VIDEO_TS.IFO открывает как media_url через ActionFactory::launch_media_url.
    • plg-hdtv-altsource.c040 · code · unknown; прошивка — · SmartVod::try_load_movie строит Movie из FileList::getPlayFiles: для каждого файла того же типа в папке добавляет серию с playback_url file:// и is_stream_url=true; если файлов больше одного, подпись и иконка берутся у папки.

    ↩

    • plg-hdtv-duneplexcatalog.c023 · code · unknown; прошивка — · Экран фильмов по Enter/Play при parts <> 1 возвращает open_folder (для многотомных — экран частей); при parts = 1 получает реальный путь, запускает notifier и для типа FILE отдаёт launch_media_url на m3u-файл, для DVD/BD — launch_media_url на путь папки. По Info открывает карточку VodMovieScreen, по жёлтой клавише ставит/снимает отметку просмотра.
    • plg-hdtv-duneplexcatalog.c024 · code · unknown; прошивка — · Экран частей фильма получает части через PL::get_movies_parts_ex, для каждой части вычисляет реальный путь и складывает в m3u-список, а по Play запускает playlist_play с выбранного индекса; если movie_id — папка (DVD/BD), открывает её через launch_media_url.
    • plg-hdtv-duneplexcatalog.c026 · code · unknown; прошивка — · Экран эпизодов строит m3u-список реальных путей и карту путь → l_key; при resume=dune по Enter/Play получает реальный путь, для типа FILE отдаёт launch_media_url на m3u, срезанный с выбранного индекса, и сохраняет карту в /tmp/dpc_files.list, для DVD/BD — launch_media_url на путь папки; notifier запускается в обоих случаях.
    • plg-hdtv-duneplexcatalog.c027 · code · unknown; прошивка — · Музыка идёт по цепочке artist list → album list → track list; на экране альбома треки складываются в m3u-список реальных путей, а Play вызывает playlist_play с выбранного индекса.
    • 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.

    ↩

  183. plg-hdtv-duneplexcatalog.c044 · code · unknown; прошивка — · PL::get_real_path при совпадении префикса пути Plex с ключом из DN::$connections заменяет его на URL соединения и определяет тип медиа: путь с /BDMV/ или /STREAM/ — BD, с /VIDEO_TS/ или /VIDEO_TS. — DVD, иначе FILE; для BD/DVD возвращается родительская папка. ↩

    • plg-hdtv-remtor.c122 · code · unknown; прошивка — · map_rem_to_local читает paths_map выбранного подключения и при совпадении префикса from заменяет его на to, сохраняя остаток пути.
    • plg-hdtv-remtor.c123 · code · unknown; прошивка — · Для kc_local_dune путь, начинающийся с /transmission, переводится через readlink('/transmission') в storage_name://<имя накопителя><путь>.
    • plg-hdtv-remtor.c095 · code · unknown; прошивка — · Экран rt_setup_connection хранит одну пару сопоставления путей paths_map[0] с полями from и to; поля tr_paths_map_from и tr_paths_map_to обновляют её.
    • plg-hdtv-remtor.c074 · code · unknown; прошивка — · Воспроизведение файла на экране rt_files показывает диалог «Not supported», только когда get_torrent_array вернул ложь (тогда $fname = NULL); если торрент найден, путь downloadDir/name переводится map_rem_to_local и всегда передаётся в ActionFactory::launch_media_url, даже если map_rem_to_local вернул пустую строку.
    • plg-hdtv-remtor.c124 · code · unknown; прошивка — · map_rem_to_local при отсутствии совпадения возвращает пустую строку, а обработчик play экрана rt_files проверяет только is_null, поэтому пустая строка проходит проверку и передаётся в ActionFactory::launch_media_url.

    ↩

    • plg-hdtv-mpd.c022 · code · unknown; прошивка — · CGI-команда stream запускает воспроизведение http://127.0.0.1:8000 на самом плеере через IP-control /cgi-bin/do?cmd=start_file_playback.
    • plg-hdtv-mpd.c030 · forum · Dune Solo, Dune Solo Lite, unknown; прошивка — · По словам автора, MPD не аудиофильский: аудиофайлы транслируются по HTTP на плеер, из-за чего управление (перемотка, пауза, громкость) отстаёт на пару секунд.

    ↩

    • plg-hdtv-utility-family.c102 · code · unknown; прошивка — · Таймер включения SleepWake без пути к файлу пишет в cron wget к cmd=ir_code с кодом A05FBF00, если запись «Включение» уже есть (замена), и с кодом BC43BF00 при первой записи (append) — коды в двух ветках различаются.
    • plg-hdtv-utility-family.c103 · code · unknown; прошивка — · С заданным путём (cookie pl_path, пробелы → «+») таймер включения SleepWake пишет /tmp/scripts/wake.sh: wget cmd=ir_code&ir_code=A05FBF00, sleep 10, wget cmd=start_file_playback&media_url=<путь>; cron вызывает wake.sh.

    ↩

    • plg-gh-kocourkuba-proiptv.c044 · code · unknown; прошивка — · Внешний плеер плагин запускает командой оболочки am start -a android.intent.action.VIEW -t "video/*" -d (start_external_player), передавая URL без dune_params и обёрток ts://.
    • plg-gh-kocourkuba-proiptv.c035 · code · unknown; прошивка — · При is_limited_apk() плагин скрывает пункт «внешний плеер» и «media info» в меню серий VOD, а в выборе папок передаёт PARAM_ALLOW_NETWORK = false (сетевые папки недоступны).

    ↩

    • plg-hdtv-megatorrents.c101 · code · android; прошивка — · SmartConfig::get_android_action запускает внешний просмотрщик через am start -d "" -t -a android.intent.action.VIEW с MIME video/* (video), audio/x-mpegurl (m3u), application/x-bittorrent (torrent) и image/* (image).
    • plg-hdtv-megatorrents.c102 · code · android; прошивка — · При control_id play, platform_kind android, cookie android_action == 1, series_id != dummy и без dune_player VodSeriesListScreen вместо vod_play вызывает select_android_action с android_play=1.
    • plg-hdtv-megatorrents.c103 · code · android; прошивка — · select_android_action серий при android_play берёт URL после &turl=, либо сам playback_url для 9000/torrents/, .jpg и 8090/torrent/, иначе mUrl::get_link; заменяет http://mp4:// на http:// и отдаёт его интентом image (jpg/png) или video; при all=torrserve — m3u-плейлист TorrServe (/view/ → /playlist/ + m3u); затем отмечает просмотр (viewed).
    • plg-hdtv-megatorrents.c104 · code · android; прошивка — · select_android_action экрана сезонов при torrent получает .torrent через get_torrent(series_id, 'android_action') в /tmp/www/temp.torrent и открывает его интентом torrent с URL file:///tmp/www/temp.torrent.

    ↩

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

    • plg-gh-infinitygp-dune-jellyfin-bridge.c014 · code · android-dune-fw; прошивка — · launchDunePlayer копирует входящий Intent, задаёт компонент com.dunehd.app/com.dunehd.shell.PlayerProxyActivity и при наличии NFS-URL подменяет data, сохраняя mime type.
    • plg-gh-infinitygp-dune-jellyfin-bridge.c015 · code · android; прошивка — · Перед запуском Dune из флагов интента убираются FLAG_ACTIVITY_NEW_TASK, FLAG_ACTIVITY_FORWARD_RESULT и FLAG_ACTIVITY_PREVIOUS_IS_TOP, остальные флаги сохраняются.
    • 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.c016 · code · android-dune-fw; прошивка — · Приложение добавляет к интенту плеера extra com.dunehd.playback.dune_params со значением skip_resume_position:1; если extra уже непустой и не содержит этот параметр, значение дописывается через запятую, а повторно тот же параметр не добавляется.

    ↩

    • plg-gh-vladikshkwok-lampa-dune-plugins.c034 · code · android; прошивка — · LampaDuneBridge::vod() превращает каждый элемент сессии в серию с name, playback_url и playback_url_is_stream_url=true.
    • plg-gh-vladikshkwok-lampa-dune-plugins.c036 · code · android; прошивка — · LampaDuneBridge::vod() задаёт initial_series_ndx из index, initial_position_ms = round(position × 1000), buffering_ms 3000, keep_playing_on_reenter=true и пустой actions.

    ↩

    • plg-hdtv-web-launchers.c047 · code · unknown; прошивка — · tvzavr — HTML/JS-приложение, которое создаёт объект application/x-dune-stb-api (id player), вызывает init(), getScreenSize(), enableVideo(), play(url), getPlaybackState(), getLengthInSeconds(), getPositionInSeconds(), Stop() и exitBrowser(EXIT_BROWSER_MODE_CLOSE).
    • plg-hdtv-web-launchers.c051 · code · unknown; прошивка — · amediateka index.html создаёт объект application/x-dune-stb-api, проверяет наличие init(), вызывает stb.init(); при успешном init() (ready) каждые 500 мс проверяет stb.getIpAddress() и при наличии IP переходит на http://tv.amediateka.ru; при ошибке показывает сообщение и предлагает перезапуск.
    • plg-hdtv-web-launchers.c052 · code · unknown; прошивка — · amediateka при ошибке соединения или STB (waitForIpAddress) вызывает keyDown(), который для userAgent arora вешает onkeydown, для opera — onkeypress; keyHandler: Enter — reloadConnect(), Stop/TopMenu/Return — stb.exitBrowser(stb.EXIT_BROWSER_MODE_CLOSE).

    ↩

    • plg-hdtv-web-launchers.c059 · doc · any-documented; прошивка — · media_url для FlashLite-приложения имеет вид swf://{HTTP-or-file-URL}[:::{parameters}], для веб-браузера — www://{HTTP-or-file-URL}[:::{parameters}]; параметры дописываются после «:::».
    • plg-hdtv-web-launchers.c066 · doc · any-documented; прошивка — · Параметры SWF-URL документ не описывает, а отправляет к внешнему flashlite_info.txt (http://dune-hd.com/firmware/flash/flashlite_info.txt).

    ↩

    • plg-dc-torrent-center.c161 · code · unknown; прошивка — · В обработчике playDirectly проверяется bareword is_stream_url, после чего возвращается launch_media_url(playback_url).
    • plg-dc-torrent-center.c163 · code · unknown; прошивка — · ActionFactory::launch_media_url возвращает LAUNCH_MEDIA_URL_ACTION_ID с url и post_action.

    ↩

    • plg-dc-widget-ext--lib.c002 · code · unknown; прошивка — · ActionFactory::tv_play создаёт массив только с handler_string_id = PLUGIN_TV_PLAY_ACTION_ID.
    • plg-dc-widget-ext--lib.c003 · code · unknown; прошивка — · ActionFactory::vod_play передаёт vod_info (по умолчанию null) в PLUGIN_VOD_PLAY_ACTION_ID.
    • plg-dc-widget-ext--lib.c017 · code · unknown; прошивка — · ActionFactory::launch_media_url передаёт url и post_action в LAUNCH_MEDIA_URL_ACTION_ID.
    • plg-dc-widget-ext--lib.c018 · code · unknown; прошивка — · ActionFactory::launch_m3u передаёт url и start_index (по умолчанию null) в PLAYLIST_PLAY_ACTION_ID.

    ↩

  185. plg-dune-remote-control.c077 · code · unknown; прошивка — · PHP-код плагина не вызывает IP Control; единственные обращения к /firmware/ext_command/cgi-bin/do — в rc_extension.bash (exec_do, вызов закомментирован) и reboot.bash (cmd=ir_code), то есть в shell-скриптах, а не в do.php. ↩

    • plg-gh-vladikshkwok-lampa-dune-plugins.c016 · code · android; прошивка — · Для операции get_vod_info плагин отдаёт данные типа plugin_vod_info из LampaDuneBridge::vod(LampaDuneBridge::load()).
    • plg-gh-vladikshkwok-lampa-dune-plugins.c020 · code · android; прошивка — · Для прочих операций при input_data.command = play плагин возвращает действие plugin_open_folder с media_url session и post_action plugin_vod_play.

    ↩

    • plg-hdtv-smart-vod.c186 · code · unknown; прошивка — · Локальный ActionFactory::vod_play эталона принимает vod_info и помещает его в PluginVodPlayActionData::vod_info.
    • plg-hdtv-smart-vod.c194 · code · unknown; прошивка — · VodSeriesListScreen эталона назначает ENTER/PLAY действию ActionFactory::vod_play, SELECT — select, зелёную — viewed и жёлтую — qlt_item.
    • plg-hdtv-smart-vod.c199 · code · unknown; прошивка — · Movie::get_vod_info эталона возвращает PluginVodInfo с series, initial_series_ndx, buffering_ms, actions, timer.delay_ms=5000 и initial_position_ms.

    ↩

    • plg-hdtv-duneplexcatalog.c028 · code · unknown; прошивка — · Экран фото получает список через PL::get_photos_list и для каждой фотографии (file не null) кладёт в m3u-список URL transcode Plex; по Enter (control_id play) для фотографии запускает launch_media_url на m3u-файл, срезанный с выбранного индекса, для папки (file null) открывает её, а по клавише Play (control_id show) открывает одиночный URL фотографии.
    • plg-hdtv-duneplexcatalog.c039 · code · unknown; прошивка — · Обложки (thumb) и фоны (art) плагин запрашивает у Plex через /photo/:/transcode с параметрами width, height и url=; результат складывается в кэш thumb/info (фото — в кэш photo).

    ↩

  186. plg-hdtv-youtube.c058 · code · unknown; прошивка — · Movie::get_vod_info YouTube при create_playlist == 1 (по умолчанию), l == false и заданном urls.video_url перестраивает series_list из адреса папки (add_url_items_series_data) и берёт имя, описание и постер плейлиста из родительского media_url; иначе — имя, описание и первую картинку фильма. ↩

    • plg-gh-infinitygp-dune-jellyfin-bridge.c025 · code · android-dune-fw; прошивка — · DuneStatus.parse читает из JSON десять ключей: command_status, player_state, playback_state, playback_url, playback_caption, playback_position, playback_duration, android_app_active, video_enabled и playback_window_fullscreen; отсутствующие строковые ключи дают пустую строку.
    • plg-gh-infinitygp-dune-jellyfin-bridge.c026 · code · android-dune-fw; прошивка — · playback_position и playback_duration парсятся как неотрицательные числа — Number или строка с trim — и переводятся из секунд в миллисекунды умножением на 1000; отсутствующее, нечисловое или отрицательное значение даёт null.
    • plg-gh-infinitygp-dune-jellyfin-bridge.c027 · code · android-dune-fw; прошивка — · android_app_active, video_enabled и playback_window_fullscreen принимаются как Boolean; иначе строка значения после trim, равная «1»/«true» или «0»/«false» без учёта регистра (включая целые числа 1 и 0), даёт true/false, любое иное значение — null.

    ↩

    • plg-gh-infinitygp-dune-jellyfin-bridge.c028 · code · android-dune-fw; прошивка — · isPlaybackActive возвращает false, если playback_state равен stopped; иначе считает воспроизведение активным при известной playback_position или при player_state, оканчивающемся на «_playback».
    • plg-gh-infinitygp-dune-jellyfin-bridge.c029 · code · android-dune-fw; прошивка — · isPlaybackVisible отдаёт приоритет android_app_active: при известном значении воспроизведение видимо только если оно активно и android_app_active=false; если android_app_active неизвестен и оба флага video_enabled и playback_window_fullscreen неизвестны, видимость равна активности; иначе видимо при video_enabled=true или playback_window_fullscreen=true.
    • plg-gh-infinitygp-dune-jellyfin-bridge.c030 · code · android-dune-fw; прошивка — · isReadyForSeek требует одновременно активного и видимого воспроизведения, известной playback_duration и playback_duration > 0.

    ↩

    • plg-gh-infinitygp-dune-jellyfin-bridge.c031 · code · android-dune-fw; прошивка — · matchesMedia при активном воспроизведении считает статус своим, если fileName совпал с baseName(playback_url) (для http/https хвост после ? или # отрезается), или title совпал с playback_caption, или expectedUrl совпал с playback_url целиком; если ни одного ожидаемого значения нет, совпадением считается любой активный статус.
    • plg-gh-infinitygp-dune-jellyfin-bridge.c032 · code · android-dune-fw; прошивка — · DuneStatus.baseName для http/https URL отрезает хвост после первого «?» или «#», а базовое имя берёт как часть после последнего «/» или «\», поэтому имя файла с этими символами в локальном пути не искажается.

    ↩

  187. plg-gh-vladikshkwok-lampa-dune-plugins.c080 · code · android; прошивка — · consume() принимает позицию только при player_state=file_playback и совпадении identity(playback_url) с элементом сессии, требует числовые playback_position и playback_duration, duration > 0 и position не больше duration + 5. ↩

    • plg-gh-vladikshkwok-lampa-dune-plugins.c080 · code · android; прошивка — · consume() принимает позицию только при player_state=file_playback и совпадении identity(playback_url) с элементом сессии, требует числовые playback_position и playback_duration, duration > 0 и position не больше duration + 5.
    • plg-gh-vladikshkwok-lampa-dune-plugins.c083 · code · android; прошивка — · Когда сессия в состоянии playing и player_state перестаёт быть file_playback, она завершается с последним реальным sample; комментарий подчёркивает, что остановка не означает «просмотрено полностью».

    ↩

    • plg-gh-infinitygp-dune-jellyfin-bridge.c039 · code · android-dune-fw; прошивка — · Конструктор PlaybackProgressTracker приводит начальную позицию к неотрицательной и кладёт её в lastPositionMillis; startupResetExpected=true только для expectedUrl, начинающегося с http:// или https://; initialSeekConfirmed=true сразу только при начальной позиции 0.
    • plg-gh-infinitygp-dune-jellyfin-bridge.c041 · code · android-dune-fw; прошивка — · После обработки статуса lastPositionMillis обновляется значением playback_position, только если начальная перемотка уже подтверждена или новая позиция больше текущей; позиции около нуля до подтверждения перемотки игнорируются.
    • plg-gh-infinitygp-dune-jellyfin-bridge.c042 · code · android-dune-fw; прошивка — · applyInitialSeek сбрасывает initialSeekConfirmed и seekConfirmedMillis и возвращает none, если статус не готов к перемотке; при позиции в пределах 5000 мс от начальной подтверждает перемотку; иначе при номере попытки больше 0 и позиции не меньше 30 000 мс считает перемотку ручной; иначе после 10 попыток сдаётся; повторную попытку отправляет не чаще чем раз в 2000 мс; в SEEK передаёт initialPositionMillis / 1000.
    • plg-gh-infinitygp-dune-jellyfin-bridge.c043 · code · android-dune-fw; прошивка — · positionResetDuringStabilityWindow возвращает true, только если ожидаемый URL — http(s), начальная позиция больше 30 000 мс, перемотка была подтверждена, текущая позиция не больше 15 000 мс и с подтверждения прошло не больше 15 000 мс; в этом случае onStatus снова запускает applyInitialSeek.

    ↩

    • plg-gh-infinitygp-dune-jellyfin-bridge.c040 · code · android-dune-fw; прошивка — · onStatus при несовпадении статуса с медиа уходит в onUnmatchedStatus; при совпадении сбрасывает таймер несовпадений, выставляет playbackObserved=true, когда статус видим, и до первого наблюдения воспроизведения возвращает Update.none().
    • plg-gh-infinitygp-dune-jellyfin-bridge.c044 · code · android-dune-fw; прошивка — · onUnmatchedStatus ничего не делает до первого наблюдения воспроизведения или после уже отправленного конца; после первого несовпадения запускает отсчёт, и если статус не совпадает непрерывно не меньше 1000 мс, один раз возвращает PLAYBACK_ENDED; совпавший статус сбрасывает отсчёт.
    • plg-gh-infinitygp-dune-jellyfin-bridge.c045 · code · android-dune-fw; прошивка — · Update.action принимает значения NONE, SEEK, CONFIRMED, USER_OVERRIDE, GAVE_UP и PLAYBACK_ENDED; SEEK несёт позицию в секундах и номер попытки, остальные действия — нули.

    ↩

    • plg-gh-vladikshkwok-lampa-dune-plugins.c087 · code · android; прошивка — · fixParse() оборачивает Lampa.Torserver.parse и, если result есть, data не is_file, movie.number_of_seasons задан и result.episode = 0, пытается восстановить номер серии из имени файла шаблонами S01E01, 1x01, Ep/Episode и «Серия/эпизод».
    • plg-gh-vladikshkwok-lampa-dune-plugins.c089 · code · android; прошивка — · Если result.episode = 0, data не is_file, movie.number_of_seasons задан, шаблон серии в имени файла не найден, а в торренте больше одного файла, fixParse() берёт hash_string = data.path, чтобы у каждого файла был свой прогресс.
    • plg-gh-vladikshkwok-lampa-dune-plugins.c088 · forum · android; прошивка — · Комментарий fixParse() объясняет обход тем, что Lampa не разбирает имена вида Show.S01E.01 или S01.E01 и даёт всем сериям сезона episode 0, то есть один общий timeline hash.

    ↩

  188. plg-gh-infinitygp-dune-jellyfin-bridge.c021 · code · android-dune-fw; прошивка — · При действии PLAYBACK_ENDED BridgeActivity на главном потоке вызывает returnToJellyfin: если setPlaybackResult() вернул true, activity при activityManager != null вызывает ActivityManager.moveTaskToFront(getTaskId(), 0) с логом «Bringing the existing Jellyfin task to the foreground» (SecurityException логируется), затем finish(); при уже доставленном результате returnToJellyfin ничего не делает. ↩

    • plg-hdtv-freetv.c034 · code · unknown; прошивка — · rostelecom_verimatrix.ini задаёт COMPANY=Rostelecom, SERVERADDRESS=vmx.svc.iptv.rt.ru, PREFERRED_VKS=vmx.svc.iptv.rt.ru/12699, SERVERPORT=12697, TIMEOUT=15, ROOTCERT=rootcert.pem.
    • plg-hdtv-freetv.c035 · code · unknown; прошивка — · В пакете лежит сертификат rostelecom_rootcert.pem, а ini ссылается на rootcert.pem; файла с таким именем в пакете нет.

    ↩

    • plg-hdtv-novosib-iptv.c032 · code · unknown; прошивка — · rostelecom_verimatrix.ini задаёт COMPANY=Rostelecom, SERVERADDRESS=vmx.svc.iptv.rt.ru, PREFERRED_VKS=vmx.svc.iptv.rt.ru/12699, SERVERPORT=12697, TIMEOUT=1, ROOTCERT=rootcert.pem.
    • plg-hdtv-novosib-iptv.c033 · code · unknown; прошивка — · В пакете лежит сертификат rostelecom_rootcert.pem, а ini ссылается на rootcert.pem; файла с таким именем в пакете нет.

    ↩

    • plg-hdtv-freetv.c065 · code · unknown; прошивка — · drm_iptv возвращает true, если существует /firmware/lib/libvmclient.so и product из versions.txt не solo4k/sololite/duo4k, иначе false; результат сохраняется в константу DRM_IPTV.
    • plg-hdtv-freetv.c066 · code · unknown; прошивка — · set_verimarix: если firmware_version из /tmp/sysinfo.txt содержит _r<цифра> и файл /tmp/verimatrix/hls_verimatrix_web.properties существует, удаляет каталог /tmp/verimatrix; если шаблона _r нет и файла ещё нет — создаёт properties с boot_address=vmxott.svc.iptv.rt.ru, company_name=Rostelecom и файл-маркер hls_verimatrix_web.

    ↩

  189. plg-hdtv-freetv.c057 · code · unknown; прошивка — · Ветки MPD/DASH (cdn.ngenix.net/mdrm/CH_, strm.yandex.ru/*.mpd): на не-Android и не-APK плагин возвращает заглушку .../free_tv/Logo/not_support.ts, на Android/APK при DUNE_FIRMWARE_BN < 21 — .../update_firmware.ts; только в ветке strm.yandex.ru/*.mpd на Android/APK и branch_num >= 21 манифест правится (cenc:default_KID, https→http) и отдаётся через локальный /index.mpd на HD_HTTP_LOCAL_PORT; в ветке cdn.ngenix.net/mdrm/CH_ для стран вне RUS/BLR/UKR хост заменяется на s17548.cdn.ngenix.net. ↩

  190. plg-hdtv-freetv.c055 · code · unknown; прошивка — · get_tv_playback_url содержит отдельные ветки преобразования URL для сервисов и доменов: peers.tv, cdn.ngenix.net (HLS и MPD), URL вида :NNNN/hls/CH_, beeline, persik.by и dvr.persik.by, limehd.tv, strm.yandex.ru (HLS и DASH), iptvstream.site, voka.tv и 46.53.200., otv.im и ljpvv.hdme.top, spbtv.com, edem (/iptv/ и 213.183.46.195), cdntv.online, play-x.ru, spacetv (ottclub), fe.svc.ott.zala.by и 178.124.183., ottg.tv, spr24.net, iptv.monster и online24.pm, telecolatv (helper get_telecola), satbiling и only4.tv, iptvx.tv, itvlive, flussonic, antifriz.tv, lifeyosso и rapidnas, ?yosso, token=free, stalker, clientbox.online, anonymoustv.club и ipro.tv, hls.stb.md, vimax.tv, beetv.kz, spovt.ru и setanta-1.ru, api.iptv2021.com, URL вида http://host:port/ch/, vod.mors.by, 212.115.255.* (fregat), kineskop, 141.105.133., hlsN.onlineott.tv и 46.174.189. (TVOE), srvru.play-x.ru, ok.ru, jwplatform, tools/m3u/play.php, onlineott.tv, api.catcast.tv и earthtv.com. ↩

  191. plg-hdtv-web-launchers.c024 · code · unknown; прошивка — · amediateka объявляет drm_defs/drm_def с id=spbtv, type=verimatrix_web и пустым params. ↩

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

    • plg-gh-mdpuma-dune-plugin-altiptv.c063 · code · unknown; прошивка — · AbstractTv формирует PluginTvChannel с id, caption, group_ids, icon_url, number, флагами архива/защиты, диапазонами EPG, буферизацией, timeshift_hours и playback_url_is_stream_url.
    • plg-gh-mdpuma-dune-plugin-altiptv.c115 · code · unknown; прошивка — · AbstractTv возвращает PluginTvInfo с groups/channels, параметрами избранного и начального канала/группы, epg_font_size и archive.
    • plg-gh-mdpuma-dune-plugin-altiptv.c123 · code · unknown; прошивка — · AbstractTv формирует PluginTvGroup с id, caption и icon_url из объектов групп.

    ↩

  193. plg-hdtv-liteiptv.c081 · code · unknown; прошивка — · AbstractTv::get_tv_info отдаёт оболочке массивы PluginTvGroup и PluginTvChannel с id, caption, group_ids, icon_url, number, have_archive, is_protected, past/future EPG days, archive_past_sec, archive_delay_sec, buffering_ms, timeshift_hours и playback_url_is_stream_url, а также epg_font_size из cookie. ↩↩

    • plg-hdtv-101-ru.c022 · code · unknown; прошивка — · AbstractTv::get_tv_info() возвращает null.
    • plg-hdtv-101-ru.c106 · code · unknown; прошивка — · В копии DI lib/tv/abstract_tv.php get_tv_info реализован полностью: загружает каналы, собирает PluginTvChannel (id, caption, group_ids, icon_url, number, have_archive, is_protected, past/future_epg_days, archive_past_sec, archive_delay_sec, buffering_ms, timeshift_hours, playback_url_is_stream_url), PluginTvGroup и возвращает PluginTvInfo (show_group_channels_only, groups, channels, favorites_supported, favorites_icon_url, initial_channel_id/group_id/is_favorite, favorite_channel_ids, archive); в копии 101.ru метод возвращал null.

    ↩

  194. plg-hdtv-101-ru.c021 · code · unknown; прошивка — · AbstractTv объявляет два режима: MODE_CHANNELS_1_TO_N = false и MODE_CHANNELS_N_TO_M = true; поля favorites_supported и playback_url_is_stream_url задаются конструктором. ↩

  195. plg-hdtv-megaradio.c028 · code · unknown; прошивка — · Класс SmartM3uTv расширяет AbstractTv и реализует UserInputHandler с handler_id = «tv»; в конструкторе выбран режим MODE_CHANNELS_N_TO_M с поддержкой избранного SmartConfig::TV_FAVORITES_SUPPORTED и playback_url_is_stream_url = false. ↩↩

  196. plg-hdtv-jurt.c018 · code · unknown; прошивка — · BtvTv использует AbstractTv::MODE_CHANNELS_1_TO_N; в load_channels он принудительно ставит have_archive=true для всех каналов, хотя рядом есть закомментированное чтение c->have_archive. ↩

    • plg-hdtv-rain-tv.c012 · code · unknown; прошивка — · RainTV extends AbstractTv и вызывает parent::__construct(true, false, true): режим MODE_CHANNELS_N_TO_M, избранное выключено, playback_url_is_stream_url включён.
    • plg-hdtv-rain-tv.c017 · code · unknown; прошивка — · Собственное private-свойство RainTV::$mode нигде не присваивается, поэтому в PluginTvInfo::show_group_channels_only уходит null, а не режим родителя.

    ↩

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

  198. plg-hdtv-101-ru.c027 · code · unknown; прошивка — · DemoChannel расширяет DefaultChannel и добавляет поля number, _desc, past_epg_days, future_epg_days и has_archive с геттерами get_number, get_desc, get_past_epg_days, get_future_epg_days, has_archive. ↩

  199. plg-hdtv-freetv.c052 · code · unknown; прошивка — · Канал создаётся как DemoChannel(id, caption, icon, archive, play_url, number=0, past_epg_days=8, future_epg_days=6, is_protected=0, timeshift_hours=0, buffering_ms из cookie buf_time (по умолчанию 1000), desc, epg_url). ↩↩

  200. plg-hdtv-megaradio.c031 · code · unknown; прошивка — · SmartChannel хранит number, past_epg_days, future_epg_days, is_protected, buf_time и has_archive; get_timeshift_hours всегда возвращает 4. ↩

    • plg-hdtv-plugtv.c016 · code · unknown; прошивка — · Класс DemoChannel (наследник DefaultChannel) хранит number, past_epg_days, future_epg_days, epg_cod, description и has_archive и отдаёт их геттерами; конструктор повторно записывает streaming_url.
    • plg-hdtv-plugtv.c059 · code · unknown; прошивка — · Поля epg_cod и description читаются из list.xml и хранятся в DemoChannel, но нигде не используются: get_epg_cod() и get_description() не вызываются, EPG строится без кода канала.

    ↩

    • plg-hdtv-rain-tv.c013 · code · unknown; прошивка — · RainTV::get_local_channels создаёт по одному RainChannel на каждый элемент Config::$ICONS_GENRES_MAP; число каналов равно числу элементов массива.
    • plg-hdtv-rain-tv.c015 · code · unknown; прошивка — · RainTV::get_tv_info заполняет PluginTvChannel полями id, caption, group_ids, icon_url, number (k+1), have_archive, is_protected, past_epg_days, future_epg_days, archive_past_sec, archive_delay_sec, buffering_ms, timeshift_hours и playback_url_is_stream_url.
    • plg-hdtv-rain-tv.c016 · code · unknown; прошивка — · RainTV::get_tv_info возвращает PluginTvInfo с groups и channels, favorites_supported=false, favorites_icon_url='', initial_channel_id из media_url, initial_group_id=null, initial_is_favorite=0, favorite_channel_ids=null и archive=null.
    • plg-hdtv-rain-tv.c019 · code · unknown; прошивка — · RainChannel реализует Channel и берёт id, title, stream_url и icon_url из массива конфига; get_groups всегда возвращает [Config::ALL_CHANNELS_GROUP], has_archive и is_protected — false, past_epg_days 0, future_epg_days 7, archive_past_sec/archive_delay_sec/buffering_ms 0, timeshift_hours 4.

    ↩

  201. plg-hdtv-kohana-channel.c068 · code · unknown; прошивка — · Канал в Welcome::playTV имеет id '1', group_ids ['0'], number -1, have_archive=false, is_protected=false, past_epg_days/future_epg_days/archive_past_sec/archive_delay_sec/ buffering_ms/timeshift_hours = 0 и playback_url_is_stream_url=true; caption и icon_url задаются в каждом пакете отдельно. ↩

    • plg-hdtv-plugtv.c012 · code · unknown; прошивка — · list.xml задаёт одну категорию General и четыре канала — «Высокое качество», «Среднее качество», «Низкое качество», «Авто качество» — с num_past_epg_days=6, num_future_epg_days=6 и привязкой к категории 1.
    • plg-hdtv-plugtv.c015 · code · unknown; прошивка — · В блоках tv_channel файла list.xml нет элементов number, hide, archive и epg_cod, а description пуст; иконки категории и каналов заданы через plugin_file://icons/.
    • plg-hdtv-plugtv.c056 · code · unknown; прошивка — · В load_channels обоих пакетов значение $ch_hide читается из XML, но не используется; в newworld проверка if ($ch_hide == 1) continue закомментирована, а в trofey её нет — скрытие каналов не реализовано.

    ↩

  202. plg-gh-valerievitch-dune-plugin-acestreamsearch.c046 · code · unknown; прошивка — · AceSearchTv::get_tv_info при одновременных channel_id и group_id в media_url оставляет в PluginTvInfo::groups только текущую группу; комментарий автора объясняет это падением плагина. ↩

    • plg-gh-valerievitch-dune-plugin-acestreamsearch.c077 · code · unknown; прошивка — · AceSearchTv::load_channels создаёт AceSearchChannel с id = infohash, caption, icon, потоком, последовательным номером с 1 и самим item, добавляет канал в группу и в HashedArray channels.
    • plg-gh-valerievitch-dune-plugin-acestreamsearch.c078 · code · unknown; прошивка — · Сортировка каналов в AceSearchTv::load_channels отключена: вызов $this->channels->usort(AceSearchConfig::CHANNEL_SORT_FUNC_CB) закомментирован, хотя callback sort_channels_cb сравнивает номера каналов.

    ↩

  203. plg-gh-mikhail-ilin-dune-plugin-weburgtv.c049 · code · unknown; прошивка — · load_channels создаёт WeburgTVChannel(id, caption, logo, media_url, -1, past_epg_days, 3) — номер -1, будущих дней EPG 3. ↩

    • plg-hdtv-101-ru.c021 · code · unknown; прошивка — · AbstractTv объявляет два режима: MODE_CHANNELS_1_TO_N = false и MODE_CHANNELS_N_TO_M = true; поля favorites_supported и playback_url_is_stream_url задаются конструктором.
    • plg-hdtv-101-ru.c027 · code · unknown; прошивка — · DemoChannel расширяет DefaultChannel и добавляет поля number, _desc, past_epg_days, future_epg_days и has_archive с геттерами get_number, get_desc, get_past_epg_days, get_future_epg_days, has_archive.

    ↩

  204. plg-hdtv-pirates-radio.c028 · code · unknown; прошивка — · Станция читается из tv_info/tv_channels/tv_channel: caption, icon_url, streaming_url, number, num_past_epg_days и num_future_epg_days передаются в конструктор DemoChannel. ↩↩

    • plg-hdtv-surface-family.c029 · code · unknown; прошивка — · Radiorecord.ru в load_channels() запрашивает http://www.radiorecord.ru/api/stations, разбирает JSON через json_decode и для каждой станции result->stations берёт prefix (id), title (очищенный HD::str_remove_tag), tooltip (описание), icon_fill_white (иконку через CGI do_img) и stream_320 (https заменяется на http); number = -1, past/future EPG = 0, has_archive = 1.
    • plg-hdtv-surface-family.c032 · code · unknown; прошивка — · rmfon.pl load_channels() запрашивает http://www.rmfon.pl/xml/stations.txt, разбирает XML simplexml_load_string, и для каждого station задаёт id = индекс $i, title = station['name'], desc = station['link'], icon = plugin_file://www/lib/logo/logo.png, streaming_url = station['id'], number = $i+1, past_epg_days = 0, future_epg_days = 10, epg_url = false.

    ↩

    • plg-dc-widget-ext--lib.c068 · code · unknown; прошивка — · Интерфейс Tv объявляет операции каналов, групп, TV/EPG, архива, избранного и hooks folder_entered/add_special_groups.
    • plg-dc-widget-ext--lib.c069 · code · unknown; прошивка — · EpgIterator выбирает программы, для которых get_start_time попадает в включительный интервал from <= t <= till.

    ↩

    • plg-dc-globaltv--lib.c051 · code · android-dune-fw; прошивка 260827_0003_r24 · AbstractTv плагина имеет публичный конструктор с favorites_supported; AbstractTv r24 реализует Tv и имеет protected-конструктор с mode/favorites_supported/playback_url_is_stream_url.
    • plg-dc-globaltv--lib.c052 · code · android-dune-fw; прошивка 260827_0003_r24 · AbstractTv::get_fav_channel_ids плагина отбрасывает пустые элементы списка cookie через get_ids_from_comma_split_str; r24 возвращает результат preg_split без такого фильтра.

    ↩

    • plg-dc-globaltv--lib.c053 · code · android-dune-fw; прошивка 260827_0003_r24 · TvFavoritesScreen плагина принимает tv и folder_views, а r24 принимает типизированный Tv и получает виды через get_tv_channel_list_folder_views.
    • plg-dc-globaltv--lib.c054 · code · android-dune-fw; прошивка 260827_0003_r24 · В карте TvFavoritesScreen плагина ENTER/PLAY направлены на create_action(play_tv), а в r24 напрямую на ActionFactory::tv_play().
    • plg-dc-globaltv--lib.c055 · code · android-dune-fw; прошивка 260827_0003_r24 · TvFavoritesScreen плагина читает канал через get_channel_by_id как массив с id/name, а r24 вызывает get_channel и использует get_id/get_title объекта.

    ↩

    • plg-dc-globaltv--lib.c019 · code · android-dune-fw; прошивка 260827_0003_r24 · Поля plugin_name, dir_path, base_tmp_path и tmp_epfs_path в AbstractEpfsHandler плагина private static, а в r24 protected static.
    • plg-dc-globaltv--lib.c020 · code · android-dune-fw; прошивка 260827_0003_r24 · AbstractEpfsHandler::get_epfs_ts_path в плагине использует постоянный dir_path и id=tv, а r24 выбирает tmp_epfs_path или dir_path по аргументу tmp и имеет id=main.
    • plg-dc-globaltv--lib.c021 · code · android-dune-fw; прошивка 260827_0003_r24 · AbstractEpfsHandler::write_data_ts при отсутствии ts в плагине использует make_monotonic_ts с форматом %010d.%06d, а r24 при ложном ts соединяет sec и usec через точку.
    • plg-dc-globaltv--lib.c022 · code · android-dune-fw; прошивка 260827_0003_r24 · Плагин записывает RMC через write_rmc в каталог конкретного плагина как rows_menu_config.json; r24 предоставляет get_rows_menu_config_path(name) для rows_menu_config_.json в EPFS_BASE.

    ↩

    • plg-dc-globaltv--lib.c023 · code · android-dune-fw; прошивка 260827_0003_r24 · В Conf::set_default плагин печатает предупреждение об отсутствующем ключе, а в r24 тот же вызов hd_print закомментирован.
    • plg-dc-globaltv--lib.c024 · code · android-dune-fw; прошивка 260827_0003_r24 · DefaultArchive при чтении versions.txt в плагине вызывает HD::http_get_document только с URL, а r24 дополнительно передаёт HD::get_dune_opts().
    • plg-dc-globaltv--lib.c025 · code · android-dune-fw; прошивка 260827_0003_r24 · Чтение size.txt в DefaultArchive плагина не обёрнуто отдельным try/catch, а r24 перехватывает Exception этого чтения и подставляет doc=null.

    ↩

    • plg-hdtv-101-ru.c017 · code · unknown; прошивка — · Первый вид списка групп: сетка 7×2, paint_details false, sandwich-обложка plugin_file://icons/sandwich_base.png 200×200, подпись под иконкой, без async-загрузки иконок.
    • plg-hdtv-101-ru.c018 · code · unknown; прошивка — · Второй вид списка групп: сетка 2×4, paint_details true, zoom_detailed_icon false, иконка 145×145, подпись шириной 400, без async-загрузки иконок.
    • plg-hdtv-101-ru.c019 · code · unknown; прошивка — · Первый вид списка каналов: сетка 5×3, async_icon_loading true, paint_details true, sandwich 145×145, детальная информация с автопереносом и цветом 11.
    • plg-hdtv-101-ru.c020 · code · unknown; прошивка — · Второй вид списка каналов: один столбец, 10 строк, async_icon_loading true, paint_details true, иконка 55×55, подпись шириной 1070, детальная информация с автопереносом.
    • plg-hdtv-101-ru.c075 · code · unknown; прошивка — · Смена вида папки хранится в plugin_cookies по ключу screen..view_idx: get_next_folder_view увеличивает индекс, при выходе за число видов сбрасывает его в 0 и записывает cookie.

    ↩

  205. plg-hdtv-101-ru.c031 · code · unknown; прошивка — · Элемент списка каналов содержит media_url с channel_id и group_id, caption, icon_path и item_detailed_icon_path, item_detailed_info с '%tr%station_title' и (если desc непустой) '%tr%station_description', а также starred по is_favorite_channel_id. ↩

    • plg-hdtv-plugtv.c040 · code · unknown; прошивка — · Карточка канала показывает «Поток», «Разрешение» и «Источник телепрограммы»; название источника берётся из cookie epg_server (1 — «Внешний источник», 2 — «От провайдера», иначе «N/A»).
    • plg-hdtv-plugtv.c041 · code · unknown; прошивка — · В newworld разрешение в карточке определяется по элементу $url_arr[4] URL потока: nw_576p → 1024 x 576, nw_480p → 854 x 480, nw_360p → 640 x 386, nw_abr → «Переменное», иначе «Переменное».
    • plg-hdtv-plugtv.c042 · code · unknown; прошивка — · В trofey разрешение определяется по названию канала: «Высокое качество» → 1920 x 1080, «Среднее качество» → 1280 x 720, «Низкое качество» → 854 x 480, иначе «Переменное».

    ↩

  206. plg-hdtv-freetv.c068 · code · unknown; прошивка — · get_tv_info отдаёт каждый канал как массив ExtTvChannel с id, caption, group_ids, icon_url, number, have_archive, is_protected, past/future_epg_days, archive_past_sec, archive_delay_sec, buffering_ms, timeshift_hours, playback_url_is_stream_url=true и ext_epg_enabled=true; исключённые каналы попадают в группу id_bin («Корзина»). ↩

    • plg-dc-widget-ext--lib.c011 · code · unknown; прошивка — · ActionFactory::status передаёт аргумент status в StatusActionData действия STATUS_ACTION_ID.
    • plg-dc-widget-ext--lib.c022 · code · unknown; прошивка — · ActionFactory::update_info_block задаёт text_above, text_color, text_halo, text_y_offset и post_action в PLUGIN_UPDATE_INFO_BLOCK_ACTION_ID.
    • plg-dc-widget-ext--lib.c024 · code · unknown; прошивка — · ActionFactory::add_osd_image добавляет в comps компонент PluginOsdComponent с image_url, координатами и размерами изображения (размеры по умолчанию 0).
    • plg-dc-widget-ext--lib.c025 · code · unknown; прошивка — · ActionFactory::add_osd_text добавляет в comps текстовый PluginOsdComponent; умолчания оформления — PLUGIN_FONT_NORMAL, цвет "15", text_halo = false.
    • plg-dc-widget-ext--lib.c026 · code · unknown; прошивка — · ActionFactory::update_osd передаёт components и post_action в PLUGIN_UPDATE_OSD_ACTION_ID.

    ↩

    • plg-hdtv-altv.c011 · code · unknown; прошивка — · Список каналов читается из локального файла data/channel_list.php; при cookie load_sex = yes вместо него берётся data/channel_all.php.
    • plg-hdtv-altv.c012 · code · unknown; прошивка — · Плейлист — XML с корнем tv_info: группы читаются из tv_categories/tv_category (id, caption, icon_url), каналы — из tv_channels/tv_channel.

    ↩

  207. plg-hdtv-surface-family.c107 · code · unknown; прошивка — · SurfaceM3uTv пакета LSS читает список из локального lib/channels_list.xml через file_get_contents(dirname(FILE).'/lib/channels_list.xml'); при is_null или simplexml false бросает исключение, а узел не tv_item считает ошибкой. Канал берёт id, caption, description, icon_url и streaming_url из XML, number = i+1, EPG-поля 0/false, has_archive = 0. В файле 11 станций soundsession.center:8000/-hq. ↩

    • plg-hdtv-plugtv.c012 · code · unknown; прошивка — · list.xml задаёт одну категорию General и четыре канала — «Высокое качество», «Среднее качество», «Низкое качество», «Авто качество» — с num_past_epg_days=6, num_future_epg_days=6 и привязкой к категории 1.
    • plg-hdtv-plugtv.c018 · code · unknown; прошивка — · load_channels читает локальный list.xml через file_get_contents, разбирает его simplexml_load_string и проверяет корневой элемент tv_info; catch (Exception) вокруг file_get_contents бросает DuneException с диалогом «Ошибка связи», а при $xml === false или неверном корневом элементе бросает исключение.

    ↩

  208. plg-hdtv-jurt.c017 · code · unknown; прошивка — · Список категорий и каналов плагин получает двумя запросами categories/list и channels/list; каналы раскладываются по категориям по полю channel->category_id. ↩

  209. plg-hdtv-moidom.c013 · code · unknown; прошивка — · get_channel_list запрашивает channel_list.php?have_sepg=0; MoiDomTv пропускает группу с id 12, для каждой группы создаёт DefaultGroup с иконкой tv_.png, для канала — MoiDom_Channel с id, name, иконкой .png, past_epg_days=7, future_epg_days=4, buffering из cookie buf_time, флагами protected/have_archive/is_video. ↩↩

    • plg-hdtv-surface-family.c029 · code · unknown; прошивка — · Radiorecord.ru в load_channels() запрашивает http://www.radiorecord.ru/api/stations, разбирает JSON через json_decode и для каждой станции result->stations берёт prefix (id), title (очищенный HD::str_remove_tag), tooltip (описание), icon_fill_white (иконку через CGI do_img) и stream_320 (https заменяется на http); number = -1, past/future EPG = 0, has_archive = 1.
    • plg-hdtv-surface-family.c032 · code · unknown; прошивка — · rmfon.pl load_channels() запрашивает http://www.rmfon.pl/xml/stations.txt, разбирает XML simplexml_load_string, и для каждого station задаёт id = индекс $i, title = station['name'], desc = station['link'], icon = plugin_file://www/lib/logo/logo.png, streaming_url = station['id'], number = $i+1, past_epg_days = 0, future_epg_days = 10, epg_url = false.
    • plg-hdtv-surface-family.c101 · code · unknown; прошивка — · SurfaceM3uTv пакета SomaFM загружает каналы из http://somafm.com/channels.xml: ответ перекодируется iconv из ISO-8859-1 в UTF-8 и разбирается simplexml_load_string с LIBXML_NOCDATA; при false бросается исключение. Канал берёт title->{0}, description (к нему при наличии дописываются «||Genre|» и «||Listeners|»), иконку из largeimage, иначе image, иначе xlimage, поток из highestpls->{0}, иначе fastpls->{0}; id = i (с 0), number = i+1, past/future EPG = 0, epg_url = false.
    • plg-hdtv-surface-family.c104 · code · unknown; прошивка — · SurfaceM3uTv пакета Radiopotok.ru загружает каналы из http://radiopotok.ru/app3/all/: если HD::http_get_document() вернул null, бросается «Can not fetch playlist»; ответ разбирается @json_decode; у станции берутся name и stream, описание пустое, иконка plugin_file://www/lib/logo/radio.png, id = i (с 0), number = i+1, EPG-поля = 0/false.

    ↩

  210. plg-hdtv-101-ru.c092 · code · unknown; прошивка — · Категории DI.FM берутся из channel_filters (кроме name = All): id и name категории, картинка — images_compact первого канала категории без шаблона {?size,height,width,quality,pad}; канал получает категорию только при наличии streaming_url. ↩

    • plg-hdtv-freetv.c044 · code · unknown; прошивка — · get_playlist запрашивает http://<SERVER>/free_tv/get_playlist_new.php с User-Agent DuneHD/1.0 и заголовком SN: <серийный номер>; при непустом ответе кэширует его в локальном файле d2cb1ebf7e72e3749053af2966d8946c (/tmp/plugins, /persistfs/plugins_data или /flashdata/plugins_data) как base64 с заменой l на | и префиксом md5(S/N).
    • plg-hdtv-freetv.c045 · code · unknown; прошивка — · Если get_playlist вернул пустую строку, load_channels восстанавливает плейлист из той же локальной копии: убирает префикс md5(S/N), меняет | на l и делает base64_decode; без файла выводит «Нет доступа к плейлисту!!!» и завершает работу.

    ↩

    • plg-gh-mdpuma-dune-plugin-altiptv.c050 · code · unknown; прошивка — · HD::load_prov_info получает altiptv_prov_country.xml и строит варианты caption|playlist_url из секции страны и общей секции tv_items.
    • plg-gh-mdpuma-dune-plugin-altiptv.c051 · code · unknown; прошивка — · HD::load_location_info ищет country сначала в /tmp/location_info.properties, затем в /config/location_info.properties; пробелы заменяет подчёркиваниями.

    ↩

  211. plg-hdtv-kaban.c015 · code · unknown; прошивка — · Источник плейлистов выбирается cookie m3u_type: 1 — все M3U/XSPF из playlists/ пакета, 2 — из каталога m3u_dir (по умолчанию /D), 3 — один плейлист по ссылке m3u; если m3u_type=3 и m3u пуст, тип принудительно становится 1. Имя источника — имя файла без расширения, оно должно соответствовать /^[a-zA-Z0-9-_]+$/. ↩

  212. plg-hdtv-liteiptv.c029 · code · unknown; прошивка — · HD::get_m3u читает сериализованный файл pl_folder в data_dir_path и поддерживает элементы-каталоги, file_name, pl_url, файл pls.txt со списком ссылок; при вызове без аргумента записи из stopList пропускаются. ↩

  213. plg-gh-mdpuma-dune-plugin-altiptv.c049 · code · unknown; прошивка — · load_channels собирает список входных плейлистов из выбранного prov_pl, каталогов M3U/XSPF, pls.txt, SMB и прямых URL по m3u_type. ↩

  214. plg-hdtv-liteiptv.c107 · forum · unknown; прошивка — · По первому посту liteIPTV поддерживает самообновляемые плейлисты: если в m3u встречается ссылка на другой m3u, плагин загружает и его, рекурсивно продолжая, пока встречаются вложенные плейлисты. ↩

  215. plg-hdtv-liteiptv.c032 · code · unknown; прошивка — · Если строка плейлиста оканчивается на .m3u, плагин добавляет её в список источников и переходит к следующей строке, то есть рекурсивно загружает вложенные m3u по http или из файла. ↩

    • plg-gh-mikhail-ilin-dune-plugin-weburgtv.c046 · code · unknown; прошивка — · Для строки, совпадающей с /^#EXTINF:[^,]*,(.+)$/, load_channels берёт caption из группы 1 и удаляет из него кавычки; при наличии в той же строке tvg-logo, tvg-id, group-title и catchup-days заполняет logo, id, group_name и past_epg_days.
    • plg-gh-mikhail-ilin-dune-plugin-weburgtv.c047 · code · unknown; прошивка — · После #EXTINF цикл увеличивает индекс и принимает следующую строку как media_url только если она начинается с http://; иначе media_url остаётся null.
    • plg-gh-mikhail-ilin-dune-plugin-weburgtv.c052 · code · unknown; прошивка — · В цикле load_channels переменные caption, logo, id и group_name не сбрасываются в начале итерации: они присваиваются только при совпадении соответствующих regex.

    ↩

  216. plg-hdtv-kaban.c010 · code · unknown; прошивка — · parse_m3u читает строки файла, пропускает #EXTM3U, из #EXTINF берёт caption после запятой и атрибуты logo, id, epg_shift, group_id; следующая строка — URL; id прогоняется через parse_id (vsetv_NNN при NNN<1000, tvs_ИМЯ). ↩

  217. plg-hdtv-evolutiontv.c014 · code · unknown; прошивка — · parse_m3u читает caption после запятой в #EXTINF и атрибуты logo, id, epg_shift, group_id; epg_shift принимается только в диапазоне [-24, 24] часов, иначе 0 (в отличие от Kaban.tv, где условие всегда истинно). ↩↩↩

  218. plg-hdtv-freetv.c046 · code · unknown; прошивка — · Плейлист разбирается как список блоков #EXTINF: id канала — значение cn-id=, подпись — текст после ,, число часов архива — cn-records=, группа — group-title="…", логотип — logotip=. ↩↩

  219. plg-hdtv-liteiptv.c031 · code · unknown; прошивка — · Разбор m3u пропускает строки #EXTM3U, #EXTVLCOPT, #EXTGRP и #EXT-INETRA, берёт название из #EXTINF до запятой, а строки не в UTF-8 перекодирует из WINDOWS-1251. ↩

    • plg-hdtv-zlostnyi-iptv.c038 · code · unknown; прошивка — · Из #EXTINF bcu берёт название (после первой запятой), tvg-logo (по умолчанию plugin_file://icons/bcu_logo.png), tvg-id (пробелы → %20) и group-title (по умолчанию «Разное»); id канала — base64(название) . "&&" . tvg-id.
    • plg-hdtv-zlostnyi-iptv.c039 · code · unknown; прошивка — · BcuConfig::tryGetAttribute извлекает атрибут M3U простым explode по «имя="» и strstr до следующей кавычки, без регулярных выражений; если атрибута нет — значение по умолчанию.

    ↩

  220. plg-hdtv-kaban.c012 · code · unknown; прошивка — · В parse_m3u и parse_xspf epg_shift всегда обнуляется: условие (shift < -24 || shift > -24) ложно только при shift == -24, и тогда записывается -24 + 24 = 0, а при любом другом значении сразу записывается 0, поэтому итог всегда 0. ↩

  221. plg-gh-mdpuma-dune-plugin-altiptv.c113 · code · unknown; прошивка — · В обоих парсерах проверка epg_shift дважды сравнивает значение с -24; проверки верхней границы в этой строке нет. ↩

  222. plg-hdtv-kaban.c013 · code · unknown; прошивка — · parse_xspf разбирает trackList/track, а id, epg_shift, logo и group_id берёт из extension через xpath в пространстве имён myiptv. ↩

  223. plg-hdtv-evolutiontv.c016 · code · unknown; прошивка — · parse_xspf разбирает trackList/track; caption — title, URL — location, а id, epg_shift, logo и group_id — из extension через xpath myiptv:*. Для epg_shift действует то же ограничение [-24, 24] часов. ↩

    • plg-hdtv-peerstv.c008 · code · unknown; прошивка — · load_channels скачивает плейлист через HD::http_get_document, разбирает его simplexml_load_string и требует корневой элемент playlist.
    • plg-hdtv-peerstv.c009 · code · unknown; прошивка — · Канал XSPF берётся из trackList/track: id — значение extension в пространстве VLC (http://www.videolan.org/vlc/playlist/ns/0/) плюс 1, номер — psfile, также читаются title, image и location; канал создаётся как DemoChannel с past_epg_days=2 и future_epg_days=2.
    • plg-hdtv-peerstv.c010 · code · unknown; прошивка — · Группы каналов читаются из extension в пространстве VLC: title группы — атрибут title, id — порядковый номер с 1; каналы привязываются по tid из вложенных элементов. Для 14 названий групп (Эфирные, Информационные, …, Радио) заданы иконки plugin_file://icons/N.png.

    ↩

    • plg-dune-remote-control.c010 · code · unknown; прошивка — · m3u.class.php — сторонний m3uParser 2.1.3 Роберта Уиддика (Robert Widdick) под GNU GPL 3.0.
    • plg-dune-remote-control.c073 · code · unknown; прошивка — · m3uParser требует существующий файл (иначе die), считает версию 2, если первая строка — #EXTM3U, иначе 1; в версии 2 длина и заголовок берутся из #EXTINF:, а URL — из следующей строки, в версии 1 каждая строка считается URL с длиной -1 и пустым заголовком.
    • plg-dune-remote-control.c074 · code · unknown; прошивка — · При подключении m3u.class.php выполняет error_reporting(0) и set_time_limit(15), перекрывая error_reporting(E_ALL), заданный в do.php.

    ↩

  224. plg-gh-mikhail-ilin-dune-plugin-weburgtv.c048 · code · unknown; прошивка — · Если group_name равен «Промо», load_channels пропускает канал до создания объекта (continue). ↩

    • plg-hdtv-zlostnyi-iptv.c040 · code · unknown; прошивка — · Строки M3U с group-title «Медиатека» или «BCU Кинопремьера» пропускаются при загрузке каналов — это фильмы медиатеки.
    • plg-hdtv-zlostnyi-iptv.c072 · code · unknown; прошивка — · BcuConfig::getVideoList отбирает из /tmp/vod_playlist.m3u строки #EXTINF с group-title = category_id; id фильма — номер строки в файле, постер — tvg-logo (по умолчанию mov_unset.png).

    ↩

    • plg-hdtv-zlostnyi-iptv.c033 · code · unknown; прошивка — · Если HD::check_token вернул «nottoken», load_channels возвращает ActionFactory::show_title_dialog(«Неправильный ключ доступа»); иначе ответ пишется в /tmp/playlist.m3u и читается file() построчно.
    • plg-hdtv-zlostnyi-iptv.c048 · code · unknown; прошивка — · Архив bcu при $archive_ts > 0 и format 'hls': плагин заново читает /tmp/playlist.m3u, находит строку канала по id (base64(название)&&tvg-id), берёт её catchup-source (без «$») и заменяет «video-{start}-{duration}» на «video--7200»; если catchup-source нет — URL не меняется.

    ↩

  225. plg-gh-mdpuma-dune-plugin-altiptv.c095 · code · unknown; прошивка — · Настройка dvbt_channels читает media_url из dune_folder.txt в /persistfs/DVBT_channels либо /flashdata/DVBT_channels и экспортирует dvb-t2.m3u. ↩

    • plg-hdtv-novosib-iptv.c021 · code · unknown; прошивка — · Загрузка каналов при load_ex = 'rr' читает global_channels (01), а всегда — channels_id (02), id_to_link (04) и group_defs (03); каждый файл — gzip-поток с XOR-ключом 'bynthtcyj?' и unserialize.
    • plg-hdtv-novosib-iptv.c022 · code · unknown; прошивка — · Если скачать зашифрованные файлы с DATA_PATH не удаётся, плагин читает локальные копии dirname(FILE).'/data/02', '/data/03' и '/data/04'.

    ↩

  226. plg-ds-dune-hd-tv.c069 · code · unknown; прошивка — · Плагин содержит альтернативный режим списка каналов из M3U (I24hConfig::USE_M3U_FILE, URL http://online.dune-hd.com/i24h2/m3u/iptv.utf8.m3u), но в этой версии он выключен (USE_M3U_FILE = false). ↩

    • plg-gh-mdpuma-dune-plugin-altiptv.c052 · code · unknown; прошивка — · parse_playlist выбирает XSPF при совпадении /xspf/i в имени входа, иначе M3U.
    • plg-gh-mdpuma-dune-plugin-altiptv.c054 · code · unknown; прошивка — · Запись результата parse_m3u содержит URL, caption, logo, group, tvg_name, user_agent, dune_zoom, group_title, id, parental и epg_shift.

    ↩

  227. plg-hdtv-novosib-iptv.c014 · code · unknown; прошивка — · Плагин разбирает плейлисты .m3u и .xspf; в m3u читает атрибуты logo, a_id, id, pass, epg_shift и group_id, в xspf — title, location, myiptv:id, epg_shift, logo, group_id. ↩

    • plg-hdtv-surface-family.c035 · code · unknown; прошивка — · wwcam load_channels() читает локальный channel_list.xml из install_dir_path + Config::CHANNEL_LIST_URL, затем добавляет каналы из двух M3U-плейлистов https://iptvmaster.ru/webcams.m3u и https://iptvlist.ru/2762.m3u (строки EXTINF и URL), после чего добавляет tv_item из XML.
    • plg-hdtv-surface-family.c040 · code · unknown; прошивка — · В wwcam методы parse_m3u() (плейлист http://urlcut.ru/FreeWebCamsWorld.m3u) и clean_up_text_for_display() определены, но load_channels() их не вызывает.

    ↩

    • plg-hdtv-web-launchers.c055 · code · unknown; прошивка — · rtmp-player — не плагин, а набор из rtmps.xml и SWF rtmp_player0_2__1920x1080__720p.swf; rtmps.xml содержит 40 элементов channel с name и link (все ссылки rtmp://).
    • plg-hdtv-web-launchers.c076 · forum · unknown; прошивка — · По словам 300n, rtmp-player сделан на Flash: запускаемый файл rtmp_player0_1…swf, рядом xml-файл с именами каналов и ссылками; в версии 0.2 добавлены неограниченное число каналов, управление звуком и формат 3x4. ENTER показывает список каналов, RETURN выходит из списка.

    ↩

  228. plg-hdtv-101-ru.c025 · code · unknown; прошивка — · Избранное хранится в plugin_cookies->favorite_channels как строка id через запятую; операции PLUGIN_FAVORITES_OP_ADD, REMOVE, MOVE_UP и MOVE_DOWN меняют массив, после чего выполняется invalidate_folders для TvFavoritesScreen. ↩↩

  229. plg-hdtv-altv.c021 · code · unknown; прошивка — · Разобранный EPG кэшируется в /tmp/channel__ через serialize; при повторном запросе того же дня файл читается и unserialize вместо сети. ↩↩

  230. plg-gh-kocourkuba-proiptv.c047 · code · unknown; прошивка — · При is_ext_epg_enabled() get_tv_info пишет channel_ids.txt (строки =-) во временный каталог и задаёт PluginTvInfo::ext_epg_enabled=true, ext_epg_base_url — CGI-адрес плагина, ext_epg_channel_ids_url — CGI channels; www/cgi-bin/channels отдаёт $FS_PREFIX/tmp/plugins/<плагин>/channel_ids.txt или 404. ↩↩

    • plg-hdtv-altv.c014 · code · unknown; прошивка — · Идентификатор канала — md5 от strtolower(caption) без переводов строк, двойных кавычек и пробелов; по этому хешу плагин берёт число из таблицы channels_id, иначе — 1000 + порядковый номер, и строит id вида _.
    • plg-hdtv-altv.c015 · code · unknown; прошивка — · Таблицу соответствий caption → id плагин пытается получить через HD::http_get_document(M3U_ID_FILE_URL), при ошибке читает локальный data/channels_id и разбирает его через unserialize.

    ↩

  231. plg-hdtv-liteiptv.c033 · code · unknown; прошивка — · Идентификатор канала — md5 от названия, приведённого HD::get_id_key к нижнему регистру с удалением пробелов (включая неразрывный), дефисов, кавычек, точек и переводов строк; найденное соответствие в vsetv_channels_id или my_channels_id заменяет этот ключ. ↩

  232. plg-hdtv-smart-vod--link-api.c067 · code · unknown; прошивка — · mUrl::createIdKey нормализует название канала (кириллица → латиница, удаление пробелов и знаков) и возвращает md5; mUrl::parse_yturl извлекает 11-символьный id из youtu.be, youtube.com/embed, /v/, /watch?v= или /watch?<другие параметры>&v=. ↩

  233. plg-gh-mikhail-ilin-dune-plugin-weburgtv.c051 · code · unknown; прошивка — · make_id_key вычисляет md5 от strtolower названия после удаления \r, \n, двойных кавычек и пробелов. ↩

    • plg-hdtv-zlostnyi-iptv.c038 · code · unknown; прошивка — · Из #EXTINF bcu берёт название (после первой запятой), tvg-logo (по умолчанию plugin_file://icons/bcu_logo.png), tvg-id (пробелы → %20) и group-title (по умолчанию «Разное»); id канала — base64(название) . "&&" . tvg-id.
    • plg-hdtv-zlostnyi-iptv.c051 · code · unknown; прошивка — · EPG bcu: из id канала берётся часть после «&&» (tvg-id); программа на день запрашивается с http://api.zlostnyi.tech/bcu/methods/epg/_date=.json; при исключении — с http://api.zlostnyi.tech/univ/methods/epg/no_epg_date=<дата>.json, при второй ошибке — пустой массив.

    ↩

  234. plg-hdtv-kaban.c016 · code · unknown; прошивка — · Каналы разных плейлистов объединяются по ключу md5(strtolower(caption без пробелов, кавычек и переводов строк)); id канала — из плейлиста, иначе из channels_id_parsed по тому же ключу; URL хранятся по источнику, а выбранный источник — cookie src_<ключ>, если он есть среди urls канала. ↩

  235. plg-hdtv-evolutiontv.c019 · code · unknown; прошивка — · Каналы из разных плейлистов объединяются по md5 от caption в нижнем регистре без пробелов, кавычек и переводов строк; URL хранятся по имени источника, выбранный источник — cookie src_<ключ>, если он есть среди urls канала. Группа берётся из group_id плейлиста, иначе из group_defs по id. ↩

  236. plg-hdtv-liteiptv.c038 · code · unknown; прошивка — · Для одного канала плагин хранит несколько пар «URL потока → название канала» в global_channels[id]['urls'] и ['caption']; у нескрытого канала первый источник создаёт объект SmartChannel, остальные добавляются к тому же id. ↩

  237. plg-hdtv-novosib-iptv.c015 · code · unknown; прошивка — · Каналы из разных плейлистов склеиваются по ключу md5(strtolower(caption без пробелов, кавычек и переводов строк)); URL каждого источника складываются в global_channels[key]['urls'][source]. ↩

  238. plg-gh-mdpuma-dune-plugin-altiptv.c105 · code · unknown; прошивка — · В ветке загрузки group_tv=1/4 идентификатор DemoChannel собирается как alt__%; при double_tv=2 добавляется компонент crc32 URL. ↩

  239. plg-hdtv-kaban.c023 · code · unknown; прошивка — · Экран списка каналов обрабатывает info (показывает source и URL), popup_menu (выбор источника через cookie src_), select_source_ и add_favorite (PLUGIN_FAVORITES_OP_ADD); в ветке info вызывается $this->tv->get_tv_stream_url($plugin_cookies) с одним аргументом: $plugin_cookies попадает в $playback_uid, а второй аргумент (&$plugin_cookies) не передан. ↩

  240. plg-hdtv-altv.c013 · code · unknown; прошивка — · Канал привязывается к группам по tv_channel/tv_categories/tv_category_id: плагин ищет группу по intval идентификатора и добавляет канал в неё и группу в канал. ↩

  241. plg-gh-mikhail-ilin-dune-plugin-weburgtv.c050 · code · unknown; прошивка — · group_id вычисляется через make_id_key(group_name), иконка — getIkonPath(group_name); если group_id ещё нет в groups, создаётся DefaultGroup и добавляется в groups, иначе берётся существующая; затем канал добавляется в группу, а группа — в канал. ↩

  242. plg-hdtv-megaradio.c048 · code · unknown; прошивка — · Новая категория каналов получает id md5(имени), сохраняется в group_names, после чего плагин открывает выбор PNG-иконки для этой категории. ↩

    • plg-hdtv-freetv.c049 · code · unknown; прошивка — · Обычные группы каналов заданы списком из 15 названий (Общие, Кино и сериалы, Кинозал, Познавательные, Спортивные, Детские, Развлекательные, Музыка и стиль, Бизнес и новости, Региональные, Германия, Армения, Азербайджан, Зарубежные, Корзина); канал попадает в группу, только если его group-title совпадает с соответствующим названием сервера из cats_on_server, а «Корзина» получает индекс id_bin.
    • plg-hdtv-freetv.c073 · code · unknown; прошивка — · Помимо 15 обычных групп, DemoTv::load_channels добавляет FavoritesGroup с id __favorites (если is_favorites_supported()) и AllChannelsGroup с подписью из FreeTvConfig.

    ↩

    • plg-hdtv-liteiptv.c028 · code · unknown; прошивка — · SmartConfig::get_group формирует 14 базовых названий групп (%tr%t22…%tr%t35), добавляет пользовательские из group_names со сдвигом 14 и группу 8888 «Без группы».
    • plg-hdtv-liteiptv.c034 · code · unknown; прошивка — · Группа канала берётся из grups_id по id без суффикса _HD, иначе назначается 8888; при pin = 1111 защита снимается, иначе канал защищён по parental_group или parental.

    ↩

  243. plg-hdtv-novosib-iptv.c023 · code · unknown; прошивка — · Группы каналов строятся из AllChannelsGroup, FavoritesGroup и отдельной группы 99 «HD Каналы»; канал с caption, содержащим « HD», дополнительно добавляется в группу 99. ↩

    • plg-gh-mikhail-ilin-dune-plugin-weburgtv.c031 · code · unknown; прошивка — · WeburgTVConfig::GROUP_ICON_PATH — шаблон plugin_file://icons/%s.png.
    • plg-gh-mikhail-ilin-dune-plugin-weburgtv.c033 · code · unknown; прошивка — · WeburgTVConfig::getIkonPath выбирает иконку группы по подстрокам названия: «порт» → sport, «етский»/«етям» → kinder, «иасат» → viasat, «vip» → filmvip, «агазин» → shop, «узыка»/«music» → music, «влечения» → hobby, «искавери» → diskavery, «естселлер» → best, «фир» → air, «адио» → radio, «ополнительный» → add, «нформационный» → inform, «ознавательный» → science, «азвлекательный» → relax, «взрослых» → adult, «ино» → film, «ланета» → planeta, «hd+» → hdplus, «hd» → hd; иначе 0, затем подставляет имя в GROUP_ICON_PATH.

    ↩

  244. plg-hdtv-zlostnyi-iptv.c041 · code · unknown; прошивка — · Группа создаётся при первом появлении group-title; её иконка — http://zlostnyi.tech/dune/bcu/icons/.png с сервера автора. ↩

  245. plg-hdtv-jurt.c019 · code · unknown; прошивка — · BtvTv::load_channels создаёт группы «Избранное» и «Все каналы» с иконками по цветам (eb178f и ffffff), а категории API — как DefaultGroup с цветом из поля color. ↩↩

    • plg-hdtv-freetv.c050 · code · unknown; прошивка — · Метаданные каналов (title, description, logoURL) берутся из http://195.189.238.120/tvguide/2/channels.json?channel=<ids>&fields=title,description,logoURL; в запрос идут id без суффикса _N.
    • plg-hdtv-freetv.c051 · code · unknown; прошивка — · Иконка канала: logotip из плейлиста; если он начинается с https — через CGI img.sh, иначе http://<logo>; без logotip — logoURL из channels.json; иначе plugin_file://icons/empty.jpg.
    • plg-hdtv-freetv.c072 · code · unknown; прошивка — · В строку channel_ids для запроса метаданных channels.json попадают только каналы с intval(cn-id) > 1000; перед запросом из неё удаляются суффиксы _N.

    ↩

  246. plg-hdtv-moidom.c015 · code · unknown; прошивка — · test_free_space сравнивает свободное место в каталоге установки (disk_free_space(DuneSystem::$properties['install_dir_path'])) с числом из /size.txt; при достаточном месте disk_space=1. get_archive при disk_space=1 отдаёт DefaultArchive('ico', ARCHIVE_URL), иначе null; get_icon берёт URL из архива, иначе http://iptv.new-rus.tv/_logos/duneLogos/CACHE_NEWRUS/. ↩

    • plg-hdtv-101-ru.c016 · code · unknown; прошивка — · DemoConfig задаёт TV_FAVORITES_SUPPORTED = true, CHANNEL_LIST_URL '/www/lib/channel_list.xml', подписи групп '%tr%all_channel' и '%tr%tv_fav', иконки icons/icon/all.png и icons/icon/fav.png.
    • plg-hdtv-101-ru.c025 · code · unknown; прошивка — · Избранное хранится в plugin_cookies->favorite_channels как строка id через запятую; операции PLUGIN_FAVORITES_OP_ADD, REMOVE, MOVE_UP и MOVE_DOWN меняют массив, после чего выполняется invalidate_folders для TvFavoritesScreen.
    • plg-hdtv-101-ru.c026 · code · unknown; прошивка — · FavoritesGroup::get_channels() вызывает $this->tv->get_fav_channel_ids() без аргумента plugin_cookies, тогда как интерфейс Tv объявляет get_fav_channel_ids(&$plugin_cookies).

    ↩

    • plg-hdtv-megaradio.c030 · code · unknown; прошивка — · load_channels добавляет группу избранного FavoritesGroup и группу всех каналов AllChannelsGroup, а канал с непустым gid получает DefaultGroup с иконкой SmartConfig::get_plugin_ico(gid).
    • plg-hdtv-megaradio.c039 · code · unknown; прошивка — · Избранные ТВ-каналы хранятся в HD::get_items('favorite_channels') и сохраняются через HD::save_items; change_tv_favorites поддерживает добавление, удаление и перестановку вверх/вниз с инвалидацией TvFavoritesScreen.

    ↩

  247. plg-hdtv-megaradio.c039 · code · unknown; прошивка — · Избранные ТВ-каналы хранятся в HD::get_items('favorite_channels') и сохраняются через HD::save_items; change_tv_favorites поддерживает добавление, удаление и перестановку вверх/вниз с инвалидацией TvFavoritesScreen. ↩

  248. plg-hdtv-surface-family.c028 · code · unknown; прошивка — · Избранные каналы Radiorecord.ru хранит в файле favorite_channels каталога данных через HD::get_items()/HD::save_items(), а rmfon.pl и wwcam — в cookie favorite_channels (строка id через запятую) через plugin_cookies. ↩

    • plg-hdtv-101-ru.c032 · code · unknown; прошивка — · Экран избранного: ENTER и PLAY — tv_play; B_GREEN — move_backward_favorite («Вверх»), C_YELLOW — move_forward_favorite («Вниз»), D_BLUE — remove_favorite, POPUP_MENU — меню с пунктом «Удалить из избранного».
    • plg-hdtv-101-ru.c033 · code · unknown; прошивка — · При наличии selected_media_url обработчик TvFavoritesScreen по move_backward_favorite выполняет PLUGIN_FAVORITES_OP_MOVE_UP, по move_forward_favorite — MOVE_DOWN, по remove_favorite — REMOVE; после каждой операции перестраивает список со сдвигом выделения -1, +1 или 0, без selected_media_url возвращает null.
    • plg-hdtv-101-ru.c034 · code · unknown; прошивка — · Список избранного пропускает пустые id (preg_match '/^\s*$/') и каналы, которых нет в текущем списке: get_channel в try/catch, при Exception пишет hd_print Warning и переходит к следующему.

    ↩

  249. plg-hdtv-liteiptv.c035 · code · unknown; прошивка — · Скрытие канала задаётся списками hide_ch (по id) и hide_groups (по группе); название заменяется значением из объединения vsetv_channels и vsetv_list по id (при совпадении побеждает vsetv_list), а из названия удаляются подстроки из cutname_list через str_ireplace. ↩↩

    • plg-hdtv-megaradio.c046 · code · unknown; прошивка — · Скрытие канала добавляет его id в HD::get_items('hide_ch') и сохраняет; cleer_hide_all очищает hide_ch, cleer_hide удаляет один ключ.
    • plg-hdtv-megaradio.c053 · code · unknown; прошивка — · Поиск по плейлисту run_search перебирает my_playlist через mb_stripos, помечает скрытые каналы суффиксом «(hide)» и по действию jump обновляет папку all_channels с переходом на найденный индекс.

    ↩

  250. plg-hdtv-liteiptv.c034 · code · unknown; прошивка — · Группа канала берётся из grups_id по id без суффикса _HD, иначе назначается 8888; при pin = 1111 защита снимается, иначе канал защищён по parental_group или parental. ↩

    • plg-hdtv-megaradio.c029 · code · unknown; прошивка — · load_channels строит каналы из HD::get_items('my_playlist') и группы из grups_id; каналы, отмеченные в hide_ch, пропускаются; группа канала берётся из grups_id (иначе all), защита — из parental при pin, отличном от 1111, буферизация — из cookie buf_time.
    • plg-hdtv-megaradio.c032 · code · unknown; прошивка — · get_tv_playback_url возвращает streaming_url канала, но при is_protected и несовпадении protect_code с pin подменяет URL на /icons/nopass.png.
    • plg-hdtv-megaradio.c047 · code · unknown; прошивка — · Родительский контроль канала хранится в HD::get_items('parental') как отметка для channel_id; add_parental_apply при заданном selected_media_url и отсутствии id в parental добавляет отметку, а del_parent_apply удаляет её только при совпадении введённого pin с pin из cookie.

    ↩

  251. plg-hdtv-novosib-iptv.c024 · code · unknown; прошивка — · Cookie show_xxx=no скрывает каналы с pass != 0; при show_xxx=yes добавляются все; порог pass берётся из m3u-атрибута pass. ↩

    • plg-hdtv-liteiptv.c036 · code · unknown; прошивка — · Поддерживаются четыре режима сортировки: 0 — без сортировки, 1 — по названию, 2 — по номеру из chnmbr_list, 3 — номер и алфавит; для режимов 2 и 3 плагин сохраняет порядок id в chnmbr_list.
    • plg-hdtv-liteiptv.c077 · code · unknown; прошивка — · Сортировка списка каналов циклически переключает cookie sort_channels 0→1→2→3→0; в группе __all_channels при режимах 2 и 3 меню предлагает подъём, спуск, перенос в начало/конец и очистку порядка через chnmbr_list.

    ↩

  252. plg-hdtv-megaradio.c044 · code · unknown; прошивка — · move_item меняет местами выбранный канал с соседним в массиве my_playlist (шаг 1 — вниз, иначе вверх), пересохраняет массив и инвалидирует tv_group_list. ↩

  253. plg-hdtv-megaradio.c049 · code · unknown; прошивка — · group_move записывает выбранную категорию group_type в grups_id для всех выделенных каналов (select_id) либо для текущего канала, пустое значение удаляет запись. ↩

    • plg-hdtv-megaradio.c053 · code · unknown; прошивка — · Поиск по плейлисту run_search перебирает my_playlist через mb_stripos, помечает скрытые каналы суффиксом «(hide)» и по действию jump обновляет папку all_channels с переходом на найденный индекс.
    • plg-hdtv-megaradio.c050 · code · unknown; прошивка — · При существующей папке закачки save_m3u формирует «#EXTM3U» и запускает пошаговое сохранение run_save_m3u, который для каждого не-youtube канала разрешает поток через SmartConfig::get_radio_stream; файл MegaRadio.m3u пишет unloading_m3u в папку smbtree::get_folder_info('dload_dir_path').

    ↩

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

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

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

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

    • plg-hdtv-101-ru.c023 · code · unknown; прошивка — · AbstractTv::get_tv_stream_url() всегда бросает Exception с текстом 'Error: get_tv_stream_url() is not supported.'.
    • plg-hdtv-101-ru.c024 · code · unknown; прошивка — · AbstractTv::get_tv_playback_url() загружает каналы, берёт канал по id и возвращает его streaming_url; параметры archive_ts и protect_code не используются.

    ↩

  258. plg-hdtv-101-ru.c024 · code · unknown; прошивка — · AbstractTv::get_tv_playback_url() загружает каналы, берёт канал по id и возвращает его streaming_url; параметры archive_ts и protect_code не используются. ↩

  259. plg-hdtv-altv.c016 · code · unknown; прошивка — · get_tv_playback_url возвращает streaming_url выбранного канала; отдельного get_tv_stream_url плагин не определяет. ↩

    • plg-hdtv-rain-tv.c012 · code · unknown; прошивка — · RainTV extends AbstractTv и вызывает parent::__construct(true, false, true): режим MODE_CHANNELS_N_TO_M, избранное выключено, playback_url_is_stream_url включён.
    • plg-hdtv-rain-tv.c018 · code · unknown; прошивка — · RainTV::get_tv_playback_url перебирает $this->channels и возвращает get_streaming_url() первого канала с совпавшим id; archive_ts и protect_code не используются.
    • plg-hdtv-rain-tv.c021 · code · unknown; прошивка — · Config::$ICONS_GENRES_MAP в 43Kanal содержит один канал: id 0, name «"43 Канал" г.Туапсе», stream_url http://sochi-strk.ru:1936/strk/43Kanal.stream/playlist.m3u8, icon_url http://sochinskayatrk.ru/logs/43Kanal.png.
    • plg-hdtv-rain-tv.c022 · code · unknown; прошивка — · Config::$ICONS_GENRES_MAP в CTPK содержит один канал: id 0, name «"СТРК Сочи-HD» без закрывающей кавычки, stream_url http://sochi-strk.ru:1936/strk/strk.stream/playlist.m3u8, icon_url http://sochinskayatrk.ru/logs/STRK_LOG.png.

    ↩

  260. plg-hdtv-jurt.c020 · code · unknown; прошивка — · get_tv_playback_url для архива (archive_ts > 0) возвращает BTV_PROGRAM_URL, для live — BTV_CHANNEL_URL; protect_code игнорируется, проверка кода закомментирована. ↩↩

  261. plg-hdtv-jurt.c021 · code · unknown; прошивка — · get_tv_stream_url вызывает api_get_stream_url: снимает префикс http://ts:// или http://mp4://, запрашивает API, берёт doc->uri до первого пробела или кавычки и заменяет http/ts:// на http://. ↩

  262. plg-hdtv-freetv.c067 · code · unknown; прошивка — · В DemoTv объявлены методы для API провайдеров: get_voka — api.voka.tv/v1/devices.json и channels/<id>/stream.json; get_spbtv — spbtv.com/vplayer и api.spbtv.com/v1/...; token_starnet — token.stb.md/api/Flussonic/stream/N4_H264/metadata.json; get_telecola — o96889no.beget.tech/telecola.php?get=sid; get_slotos — tv.voon.eu (логин pacunaju%40trimsj.com, пароль zx12345678) через прокси proxy-nossl.antizapret.prostovpn.org:29976; в get_tv_playback_url вызываются get_spbtv, token_starnet и get_telecola, а get_voka и get_slotos — нет. ↩

  263. plg-hdtv-surface-family.c033 · code · unknown; прошивка — · rmfon.pl get_tv_stream_url() запрашивает http://www.rmfon.pl/stacje/flash_aac_.xml.txt, перебирает playlist/item, заменяет https на http, открывает каждый URL через fopen(), читает 500 байт и возвращает первый URL с непустым ответом; если ни один не ответил, функция завершается без return. ↩

  264. plg-hdtv-surface-family.c103 · code · unknown; прошивка — · У SomaFM playback_url_is_stream_url = true, а lib/tv/abstract_tv.php изменён: get_tv_playback_url() не возвращает streaming_url напрямую, а запрашивает его через HD::http_get_document(), извлекает regex «File\d=(.*)» все совпадения и возвращает случайное; если совпадений нет — plugin_file-путь install_dir_path/www/lib/logo/nostream.png. ↩

  265. plg-hdtv-surface-family.c108 · code · unknown; прошивка — · У LSS playback_url_is_stream_url = false. get_tv_stream_url() при совпадении «(.?)::::(.)» вызывает функцию по имени из HD::$matches[1] с аргументом matches[2], иначе возвращает URL как есть; при совпадении «127.0.0.1:81/cgi-bin» дополнительно вызывает HD::get_codec_start_info(). get_tv_playback_url() при archive_ts > 0 дописывает к URL «|||dune_params|||hls_seek_live:1». ↩↩

    • plg-hdtv-surface-family.c037 · code · unknown; прошивка — · wwcam при воспроизведении канала с URL вида streamdays_pars:<ссылка> передаёт ссылку в HD::get_stream_link() и возвращает полученный прямой поток; перед возвратом печатает URL через echo.
    • plg-hdtv-surface-family.c038 · code · unknown; прошивка — · HD::get_stream_link() в wwcam разбирает streamdays двумя путями: для ссылки ::streamdays:: берёт как страницу streamdays, иначе запрашивает саму ссылку и находит streamdays.com/… → http://live.streamdays.com/<часть>; затем берёт iframe src, запрашивает его с Referer, берёт , запрашивает поток и при наличии m3u8 возвращает найденный URL m3u8. Если разобрать страницу, iframe или не удалось — plugin_file://logo/logo.png.

    ↩

  266. plg-hdtv-novosib-iptv.c017 · code · unknown; прошивка — · get_tv_playback_url для источника novosib берёт cookie novosib (по умолчанию '176.51.0.0', если не задан), разбирает URL канала через explode('/', …) и получает девятый элемент $udp[8] — host:port, считая 'drm:' и пустой элемент после '//'; str_replace заменяет в URL все вхождения этой строки на cookie novosib + ':1234'. ↩

    • plg-hdtv-novosib-iptv.c019 · code · unknown; прошивка — · DemoChannel (novosib) объявляет playback_url_is_stream_url = false и хранит number, past/future EPG days, has_archive, a_id; архив — 100 часов, задержка 0.
    • plg-hdtv-novosib-iptv.c018 · code · unknown; прошивка — · get_tv_stream_url возвращает переданный playback_uid без изменений; отдельного преобразования URL потока нет.

    ↩

  267. plg-hdtv-megaradio.c029 · code · unknown; прошивка — · load_channels строит каналы из HD::get_items('my_playlist') и группы из grups_id; каналы, отмеченные в hide_ch, пропускаются; группа канала берётся из grups_id (иначе all), защита — из parental при pin, отличном от 1111, буферизация — из cookie buf_time. ↩

  268. plg-hdtv-altv.c017 · code · unknown; прошивка — · Если cookie buf_time не равно '0', к playback URL добавляется суффикс '|||dune_params|||buffering_ms:'. ↩

    • plg-gh-valerievitch-dune-plugin-acestreamsearch.c079 · code · unknown; прошивка — · AceSearchTv::ace_search устанавливает статическое AceSearchChannel::$buffering_ms из настройки buffering_ms; комментарий автора называет это hack.
    • plg-gh-valerievitch-dune-plugin-acestreamsearch.c080 · code · unknown; прошивка — · AceSearchChannel хранит номер канала и acestream_data, возвращает номер через get_number(), а get_buffering_ms() — статическое значение $buffering_ms.

    ↩

  269. plg-hdtv-folder-cache-vod.c093 · code · unknown; прошивка — · При playlistItem=0 и liveBroadcastContent=live parse_season вызывает Youtube::retrieve_playback_url и перебирает $media_urls[1] (snippet.resourceId.videoId) и $media_urls[2] (URL); при наличии $plugin_cookies-> ставит [NEW] начиная с первого videoId, которого нет в списке (флаг не сбрасывается). ↩

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

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

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

    • plg-gh-mikhail-ilin-dune-plugin-weburgtv.c046 · code · unknown; прошивка — · Для строки, совпадающей с /^#EXTINF:[^,]*,(.+)$/, load_channels берёт caption из группы 1 и удаляет из него кавычки; при наличии в той же строке tvg-logo, tvg-id, group-title и catchup-days заполняет logo, id, group_name и past_epg_days.
    • plg-gh-mikhail-ilin-dune-plugin-weburgtv.c064 · code · unknown; прошивка — · WeburgTVChannel::has_archive возвращает past_epg_days > 0; get_archive_past_sec — past_epg_days*86400+86400; get_archive_delay_sec — 15.

    ↩

    • plg-hdtv-jurt.c018 · code · unknown; прошивка — · BtvTv использует AbstractTv::MODE_CHANNELS_1_TO_N; в load_channels он принудительно ставит have_archive=true для всех каналов, хотя рядом есть закомментированное чтение c->have_archive.
    • plg-hdtv-jurt.c023 · code · unknown; прошивка — · BtvChannel задаёт архив 14 суток (get_archive_past_sec = 14*86400), задержку 31 минуту, 14 прошедших и 7 будущих дней EPG.

    ↩

  273. plg-hdtv-novosib-iptv.c019 · code · unknown; прошивка — · DemoChannel (novosib) объявляет playback_url_is_stream_url = false и хранит number, past/future EPG days, has_archive, a_id; архив — 100 часов, задержка 0. ↩

  274. plg-gh-mdpuma-dune-plugin-altiptv.c059 · code · unknown; прошивка — · При archive_ts>0 get_tv_playback_url строит URL из таблицы arc с utcstart и utcend, ограничивая конец меньшим из текущего времени и начала+35999 секунд. ↩

    • plg-gh-mdpuma-dune-plugin-altiptv.c064 · code · unknown; прошивка — · AbstractTv::get_day_epg преобразует элементы итератора в PluginTvEpgProgram с start_tm_sec, end_tm_sec, name и description.
    • plg-gh-valerievitch-dune-plugin-acestreamsearch.c118 · code · unknown; прошивка — · AbstractTv::get_day_epg преобразует элементы EpgIterator в PluginTvEpgProgram с полями start_tm_sec, end_tm_sec, name и description.
    • plg-hdtv-101-ru.c035 · code · unknown; прошивка — · AbstractTv::get_day_epg() перебирает итератор get_day_epg_iterator и отдаёт массив с ключами PluginTvEpgProgram::start_tm_sec, end_tm_sec, name и description из методов элемента EPG.

    ↩

  275. fw-tv188b-260827-0003-r24--plugin-loader--php-runtime--opexec.c026 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Запросы get_day_epg (тип 5) исполнитель дедуплицирует и ограничивает по числу: если такой же день уже загружается активной операцией — «ignoring epg req, day already loading as %s» и запрос не создаётся; такой же запрос в очереди удаляется («q-removing %s: same EPG day request»); лишние удаляются с «q-removing #%d, %s: too many epg requests». ↩

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

  277. plg-dc-widget-ext--lib.c069 · code · unknown; прошивка — · EpgIterator выбирает программы, для которых get_start_time попадает в включительный интервал from <= t <= till. ↩

  278. plg-hdtv-rain-tv.c026 · code · unknown; прошивка — · EPG разбирается как /xml/tv/*: берутся только узлы programme, имя — title; у start вида YYYYMMDDHHMMSS +TZ берётся часть до ' +' и форматируется как MM/DD/YYYY HH:MM, strtotime разбирает её в часовом поясе Europe/Moscow (смещение +TZ не применяется); программа оформляется DefaultEpgItem(name, '', start, -1), а EpgIterator ограничивается сутками day_start_ts…day_start_ts+86400. ↩↩

  279. plg-hdtv-peerstv.c014 · code · unknown; прошивка — · EPG-программа заканчивается временем следующей программы, а последняя — start+3600; в iterator попадают только программы с началом в [day_start_ts, day_start_ts+86400]. ↩

  280. plg-gh-mikhail-ilin-dune-plugin-weburgtv.c061 · code · unknown; прошивка — · get_day_epg_iterator возвращает EpgIterator с границами day_start_ts и day_start_ts+100400. ↩

  281. plg-hdtv-101-ru.c097 · code · unknown; прошивка — · EPG DI.FM дополняется записью On AIR/music на время started+length элемента $di_object[0] (первого в ответе), сортируется по времени, каждый элемент становится DefaultEpgItem(name, desc, time + epg_shift, -1), результат отдаётся через EpgIterator на диапазон day_start_ts … day_start_ts + 100400. ↩

  282. plg-hdtv-plugtv.c021 · code · unknown; прошивка — · Разбор EPG общий: регулярное выражение выделяет строки «ЧЧ:ММ текст», имя и описание делятся по «|», время собирается как strtotime("$epg_date $time $local_tz") + $ch_shift (зависит от источника), к началу прибавляется $epg_shift, при переходе через полночь прибавляются сутки, затем массив сортируется по времени и превращается в DefaultEpgItem с finish_time=-1 и EpgIterator с границами day_start_ts-локальное смещение и day_start_ts+100400. ↩

    • plg-hdtv-altv.c020 · code · unknown; прошивка — · При отсутствии кэша EPG для каналов с id < 1000 плагин берёт с vsetv.com по шаблону schedule_channel_day_nsc_1.html, перекодирует из WINDOWS-1251 в UTF-8, вырезает HTML и разбирает строки времени и названия.
    • plg-hdtv-altv.c023 · code · unknown; прошивка — · Для каналов с внутренним id >= 1000 get_day_epg_iterator сразу возвращает пустой массив (у них нет соответствия в vsetv).

    ↩

  283. plg-hdtv-kaban.c020 · code · unknown; прошивка — · При отсутствии кэша /tmp/channel_ для канала с ненулевым id<1000 get_day_epg_iterator скачивает HTML vsetv.com, перекодирует WINDOWS-1251→UTF-8, заменяет div-классы desc/onair/pasttime/time и br на разделители, извлекает время и название регуляркой, а результат сериализует в /tmp/channel_. ↩↩

  284. plg-hdtv-liteiptv.c047 · code · unknown; прошивка — · HD::get_vsetv_epg при отсутствии файла кэша скачивает страницу vsetv schedule_channel_daynsc_1.html, перекодирует WINDOWS-1251 в UTF-8, подставляет данные jquery-gs.js и кэширует результат в tmp_dir_path/channel_ через serialize. ↩↩

    • plg-hdtv-pirates-radio.c033 · code · unknown; прошивка — · get_day_epg_iterator отделяет числовой id канала после "_" и для id >= 1000 сразу возвращает пустой массив.
    • plg-hdtv-pirates-radio.c039 · code · unknown; прошивка — · Для канала с числовым id < 1000 при отсутствии кэша EPG плагин запрашивает vsetv.com по шаблону schedule_channel_day_nsc_1.html, перекодирует ответ из WINDOWS-1251 в UTF-8, заменяет HTML-блоки разделителями, снимает теги и разбирает строки регуляркой "ЧЧ:ММ текст".

    ↩

  285. plg-hdtv-plugtv.c024 · code · unknown; прошивка — · Внешний EPG обоих плагинов берётся с vsetv.com: newworld — schedule_channel_1158, trofey — schedule_channel_1098; страница перекодируется из WINDOWS-1251 в UTF-8, заменяется набором regex и очищается strip_tags. ↩

  286. plg-hdtv-smart-vod--link-api.c066 · code · unknown; прошивка — · mUrl::get_vsetv_epg запрашивает http://www.vsetv.com/schedule_channel_daynsc_1.html, заменяет иконки времени на 0/5, разбирает время, название и описание и кэширует serialize в файл channel_. ↩

  287. plg-gh-mdpuma-dune-plugin-altiptv.c112 · code · unknown; прошивка — · HD::get_day_epg в utils.php обращается к vsetv.com/schedule_channel_day_nsc_1.html и при разборе может выполнить HTTP POST на URL vsetv.com из ответа. ↩

  288. plg-hdtv-novosib-iptv.c025 · code · unknown; прошивка — · Для канала с id 0 get_day_epg_iterator сразу возвращает пустой массив; для id 1..1199 EPG берётся с vsetv (WINDOWS-1251 → UTF-8, разбор HTML), для id >= 1200 — из tvsapi.cellmp.de с User-Agent Apache-HttpClient/UNAVAILABLE (java 1.4) и JSON-полями anfangsdatum/titel/genre/jahr/land. ↩↩↩

  289. plg-hdtv-kaban.c021 · code · unknown; прошивка — · При отсутствии кэша /tmp/channel__ для канала с id>=1000 EPG берётся с http://tvsapi.cellmp.de/getProgram_1_3.php?date=<дата>&channel=[""]&time=05:00 с User-Agent 'Apache-HttpClient/UNAVAILABLE (java 1.4)'; BOM срезается, JSON разбирается, время — strtotime(' CEST'), название — titel, описание — genre+jahr+land. ↩

  290. plg-gh-mdpuma-dune-plugin-altiptv.c071 · code · unknown; прошивка — · В своей ветке EPG DemoM3uTv запрашивает расписание через http://tvsapi.cellmp.de/getProgram_1_3.php с идентификатором канала и параметрами даты. ↩

  291. plg-hdtv-evolutiontv.c022 · code · unknown; прошивка — · get_day_epg_iterator поддерживает два источника: при epg_source=1 для ненулевого числового id<1000 — vsetv.com, иначе tvsapi.cellmp.de; при epg_source=2 — TVheadend по адресу http://:9981/epg?start=0&limit=200&channel=. Для TVheadend ответ берётся с первого '[' без последнего символа и разбирается json_decode; времена и названия берутся из start/title/description. ↩↩

    • plg-gh-mdpuma-dune-plugin-altiptv.c065 · code · unknown; прошивка — · get_day_epg_iterator выбирает EPG по числовым диапазонам id; для 12000–12999 назначает epg_type=13 (point.md), если не выбран JTV.
    • plg-gh-mdpuma-dune-plugin-altiptv.c067 · code · unknown; прошивка — · В своей ветке EPG DemoM3uTv запрашивает расписание через http://www.teleman.pl/program-tv/stacje/ с идентификатором канала и параметрами даты.
    • plg-gh-mdpuma-dune-plugin-altiptv.c072 · code · unknown; прошивка — · В своей ветке EPG DemoM3uTv запрашивает расписание через http://tv.mail.ru/ajax/channel/ с идентификатором канала и параметрами даты.

    ↩

    • plg-hdtv-freetv.c047 · code · unknown; прошивка — · Разбор #EXTINF распознаёт 17 маркеров EPG и кладёт соответствующий epg_url: vsetv_id, smartlabs, mail_tv (регулярка mail), yandex_tv, tvs, ott_play, wink, wink_portal, voc-tv, sharavoz, stalker, lightiptv, shura, itv.live, iptvx, yosso_tv, gabbarit.
    • plg-hdtv-freetv.c058 · code · unknown; прошивка — · get_day_epg_iterator выбирает источник EPG по префиксу epg_url: vsetv_id, smartlabs, mail_tv, wink_portal, voc-tv, wink, yosso_tv, gabbarit (drm-play), yandex_tv, stalker, ott_play, lightiptv, shura, itv.live, iptvx, tvs и sharavoz.

    ↩

    • plg-hdtv-plugtv.c020 · code · unknown; прошивка — · get_day_epg_iterator выбирает источник EPG по cookie epg_server: '1' — ET::get_epg_vsetv, '2' — EPG провайдера (get_epg_newworld или get_epg_trofey); по умолчанию '1'.
    • plg-hdtv-plugtv.c031 · code · unknown; прошивка — · Экран настроек DemoSetupScreen содержит комбобоксы show_tv (Показать/Спрятать), epg_server (Внешний источник/От провайдера), epg_shift (от -12 до 12 часов), epg_font (Нормальный/Мелкий, хранится в set_font), buf_time (0…10000 мс), кнопки информации о плагине и канале и перезагрузки.

    ↩

    • plg-hdtv-evolutiontv.c022 · code · unknown; прошивка — · get_day_epg_iterator поддерживает два источника: при epg_source=1 для ненулевого числового id<1000 — vsetv.com, иначе tvsapi.cellmp.de; при epg_source=2 — TVheadend по адресу http://:9981/epg?start=0&limit=200&channel=. Для TVheadend ответ берётся с первого '[' без последнего символа и разбирается json_decode; времена и названия берутся из start/title/description.
    • plg-hdtv-evolutiontv.c015 · code · unknown; прошивка — · parse_id, кроме vsetv_ (число <1000) и tvs_, поддерживает новый префикс moi_: значение после moi_ возвращается как id канала; ветка tvs_ из-за проверки $channel_id === true не возвращает id.

    ↩

    • plg-gh-mikhail-ilin-dune-plugin-weburgtv.c059 · code · unknown; прошивка — · get_day_epg_iterator запрашивает file_get_contents http://ott.tv.planeta.tc/epg/program.xml?channelId=$channel_id&fields=desc&extended и разбирает ответ simplexml_load_string.
    • plg-gh-mikhail-ilin-dune-plugin-weburgtv.c060 · code · unknown; прошивка — · В цикле по programme get_day_epg_iterator берёт start/stop через strtotime, оставляет программы с start >= day_start_ts и start < day_start_ts+86400 и создаёт DefaultEpgItem(title, desc, start, stop).

    ↩

  292. plg-hdtv-jurt.c022 · code · unknown; прошивка — · EPG запрашивается по BTV_EPG_URL с датой в формате %d.%m.%Y (gmstrftime); поля programs begin_time/name/description превращаются в DefaultEpgItem с end=-1. ↩

  293. plg-hdtv-moidom.c016 · code · unknown; прошивка — · get_day_epg_iterator вычисляет часовой пояс командой date +%z (часы и минуты), берёт дату gmstrftime('%d%m%y'), запрашивает epg.php?cid=&day=&with_ts=1&tz=<±hhmm>; элементы epg/item разбираются как progname (первая строка — название, остальное — описание) и ut_start, конец программы -1; границы EpgIterator сдвинуты на tz_sec. ↩↩

  294. plg-hdtv-zlostnyi-iptv.c148 · code · unknown; прошивка — · ottclub берёт EPG у провайдера: адрес http:///api/channel/, где server — хост из первого URL плейлиста, ответ JSON с массивом epg_data (time, name, descr), кэш — /tmp/ottclub_channel_ через serialize. ↩

    • plg-dc-globaltv.c085 · code · unknown; прошивка — · EPG плагин берёт с http://s1.dune-club.info/plugins/globaltv/epg/: файл channel_ids.txt (строки stream_id = epg_id) и JSON программы по адресу /.
    • plg-dc-globaltv.c086 · code · unknown; прошивка — · JSON дневного EPG — объект «start_tm → запись» с полями len (по умолчанию 3600), title, sub-title, desc, year.

    ↩

    • plg-hdtv-rain-tv.c025 · code · unknown; прошивка — · RainTV::get_day_epg_iterator получает EPG через HD::http_get_document(Config::TV_EPG_URL); при null бросает Exception «Can not fetch movie list», при неразбираемом XML — «Error: can not parse XML document», при корне не 'xml' — «Invalid XML Document».
    • plg-hdtv-rain-tv.c026 · code · unknown; прошивка — · EPG разбирается как /xml/tv/*: берутся только узлы programme, имя — title; у start вида YYYYMMDDHHMMSS +TZ берётся часть до ' +' и форматируется как MM/DD/YYYY HH:MM, strtotime разбирает её в часовом поясе Europe/Moscow (смещение +TZ не применяется); программа оформляется DefaultEpgItem(name, '', start, -1), а EpgIterator ограничивается сутками day_start_ts…day_start_ts+86400.

    ↩

    • plg-hdtv-plugtv.c022 · code · unknown; прошивка — · EPG провайдера newworld получается с http://n-w.tv/all_tv.xml: из узлов programme берутся title, desc и атрибут start, смещение часового пояса из start вычитается, а в текст попадают только программы запрошенной даты.
    • plg-hdtv-plugtv.c023 · code · unknown; прошивка — · EPG провайдера trofey получается с http://trofey.net/index.php?option=com_tvguide… в формате raw: JSON декодируется, из значений удаляются теги и нормализуются переводы строк, текст склеивается; в get_day_epg_iterator для него задан ch_shift = local_tz_offset - 10800.

    ↩

    • plg-hdtv-zlostnyi-iptv.c051 · code · unknown; прошивка — · EPG bcu: из id канала берётся часть после «&&» (tvg-id); программа на день запрашивается с http://api.zlostnyi.tech/bcu/methods/epg/_date=.json; при исключении — с http://api.zlostnyi.tech/univ/methods/epg/no_epg_date=<дата>.json, при второй ошибке — пустой массив.
    • plg-hdtv-zlostnyi-iptv.c149 · code · unknown; прошивка — · shura берёт EPG с http://epg.propg.net//epg2/; в конфиге закомментирован прежний источник http://s1.tvshka.net//epg/range9-2.json.
    • plg-hdtv-zlostnyi-iptv.c150 · code · unknown; прошивка — · shara-club берёт EPG с http://api.sramtv.com/epg/read//, при ошибке — с https://api.gazoni1.com/epg/read//; кэш — /tmp/shara_channel_.
    • plg-hdtv-zlostnyi-iptv.c152 · code · unknown; прошивка — · sharavoz берёт EPG с http://epg.arlekino.tv/api/program?epg=&date=, при сбое — с http://api.program.spr24.net/api/program?epg=&date=; кэш — /tmp/sharavoz_channel_.

    ↩

  295. plg-gh-mdpuma-dune-plugin-altiptv.c075 · code · unknown; прошивка — · Ветка JTV сохраняет архив url_tvg в /tmp/schedule.zip и извлекает .ndx/.pdt через PHP zip API, перекодируя имена CP866→UTF-8. ↩

    • plg-hdtv-peerstv.c011 · code · unknown; прошивка — · get_day_epg_iterator скачивает ZIP с DemoConfig::EPG_URL в /tmp/schedule.zip и читает из него пары файлов .ndx/.pdt (имена без расширения — ключ канала); данные кэшируются в памяти не дольше 3600 секунд.
    • 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»).

    ↩

    • plg-hdtv-megaradio.c034 · code · unknown; прошивка — · ЭПГ радиостанции — один элемент DefaultEpgItem с названием «ON AIR» и описанием из поля info плейлиста, где «||» заменяются переводом строки, а «|» — пробелом.
    • plg-hdtv-megaradio.c035 · code · unknown; прошивка — · get_day_epg_iterator сдвигает начало дня на 10800 секунд назад и задаёт интервал программы 86400 секунд.

    ↩

    • plg-hdtv-surface-family.c039 · code · unknown; прошивка — · wwcam get_day_epg_iterator() не использует данные канала: возвращает один DefaultEpgItem «ON AIR» с пустым описанием на день, сдвинутый на -10800 секунд от day_start_ts и длиной 86400 секунд; код чтения description закомментирован.
    • plg-hdtv-surface-family.c102 · code · unknown; прошивка — · SomaFM строит EPG как одну программу «ON AIR» на сутки: описание берётся из сохранённого aDesc[channel_id], начало сдвинуто на -10800 секунд, конец — начало + 86400.
    • plg-hdtv-surface-family.c105 · code · unknown; прошивка — · Radiopotok.ru строит EPG как одну программу «ON AIR» на сутки с пустым описанием; начало сдвинуто на -10800 секунд, конец — начало + 86400.

    ↩

    • plg-hdtv-101-ru.c096 · code · unknown; прошивка — · DemoTv::get_day_epg_iterator запрашивает историю треков канала с http://api.audioaddict.com/v1/di/track_history/channel/.json?per_page=100, берёт track как name и artist как desc и пропускает записи ADWTAG_, More of the show и Choose premium.
    • plg-hdtv-101-ru.c097 · code · unknown; прошивка — · EPG DI.FM дополняется записью On AIR/music на время started+length элемента $di_object[0] (первого в ответе), сортируется по времени, каждый элемент становится DefaultEpgItem(name, desc, time + epg_shift, -1), результат отдаётся через EpgIterator на диапазон day_start_ts … day_start_ts + 100400.

    ↩

    • plg-gh-valerievitch-dune-plugin-acestreamsearch.c081 · code · unknown; прошивка — · AceSearchChannel::getEpg при непустом acestream_data['epg'] строит DefaultEpgItem из полей name, start, stop, а при отсутствии данных возвращает NULL.
    • plg-gh-valerievitch-dune-plugin-acestreamsearch.c086 · code · unknown; прошивка — · AceSearchTv::get_day_epg_iterator берёт единственный EPG-элемент канала (getEpg) и оборачивает его в EpgIterator на сутки от day_start_ts.

    ↩

  296. plg-dc-globaltv.c087 · code · unknown; прошивка — · Если EPG для канала с архивом пуст, плагин подставляет фиктивную программу из часовых интервалов с заголовком-датой (d.m.Y H:i). ↩

  297. plg-hdtv-liteiptv.c046 · code · unknown; прошивка — · get_day_epg_iterator для id без латинских букв запрашивает mUrl::get_vsetv_epg(id без _HD, day_start_ts), а для id с буквами генерирует по одному пункту «On Air» на каждый час от -24 до +23; к времени добавляется cookie epg_shift. ↩

    • plg-hdtv-kohana-channel.c068 · code · unknown; прошивка — · Канал в Welcome::playTV имеет id '1', group_ids ['0'], number -1, have_archive=false, is_protected=false, past_epg_days/future_epg_days/archive_past_sec/archive_delay_sec/ buffering_ms/timeshift_hours = 0 и playback_url_is_stream_url=true; caption и icon_url задаются в каждом пакете отдельно.
    • plg-hdtv-kohana-channel.c070 · code · unknown; прошивка — · Welcome::get_day_epg игнорирует аргументы и возвращает пустой массив — EPG у канала нет.

    ↩

  298. plg-hdtv-surface-family.c030 · code · unknown; прошивка — · Radiorecord.ru get_day_epg_iterator() сразу возвращает array(); расположенный после return код запроса http://history.radiorecord.ru/index-onstation.php и заполнения $this->arcUrl недостижим. ↩

  299. plg-hdtv-pirates-radio.c038 · code · unknown; прошивка — · В обоих списках станций нет тегов num_past_epg_days и num_future_epg_days, поэтому intval(null) даёт 0 и DemoChannel отдаёт платформе 0 дней EPG в обе стороны. ↩

  300. plg-hdtv-evolutiontv.c023 · code · unknown; прошивка — · EPG кэшируется в /tmp/channel__ как serialize-массив; при повторном запросе читается из файла. Итоговый EpgIterator строится по времени start с учётом epg_shift, конец программы — -1. ↩

  301. plg-hdtv-novosib-iptv.c026 · code · unknown; прошивка — · EPG кэшируется в /tmp/channel__; к времени каждого пункта прибавляются cookie epg_shift и epg_shift из плейлиста (в часах × 3600). ↩↩↩

  302. plg-hdtv-pirates-radio.c040 · code · unknown; прошивка — · Для канала с числовым id < 1000 разобранный EPG кэшируется в /tmp/channel__ через serialize; при повторном запросе того же дня файл читается и unserialize вместо сети. ↩

  303. plg-gh-mdpuma-dune-plugin-altiptv.c066 · code · unknown; прошивка — · Ветка point.md читает EPG из tmp_dir_path/channel__, иначе получает страницу point.md и сохраняет сериализованный результат. ↩

  304. plg-hdtv-zlostnyi-iptv.c052 · code · unknown; прошивка — · EPG кэшируется в файле /tmp/bcu_channel_ (serialize массива); если файл есть, сеть не запрашивается; записывается только непустой результат. ↩

  305. plg-dc-globaltv.c171 · code · unknown; прошивка — · MainTv::get_day_eepg кэширует в памяти результат try_get_day_eepg по ch_id и дню; при исключении или отсутствии результата сохраняет пустой массив, а последующие вызовы возвращают сохранённое значение. ↩

  306. plg-hdtv-freetv.c059 · code · unknown; прошивка — · get_day_epg кэширует непустой результат в DuneSystem::$properties[_], а mail_tv-ветка — в файле tmp_dir_path/; при устаревшем кэше mail_tv удаляет array_map("unlink", glob(tmp_dir_path."/*")) все файлы временного каталога. ↩

  307. plg-hdtv-peerstv.c011 · code · unknown; прошивка — · get_day_epg_iterator скачивает ZIP с DemoConfig::EPG_URL в /tmp/schedule.zip и читает из него пары файлов .ndx/.pdt (имена без расширения — ключ канала); данные кэшируются в памяти не дольше 3600 секунд. ↩

  308. plg-hdtv-altv.c022 · code · unknown; прошивка — · Время программ EPG разбирается как EEST, а к каждому пункту прибавляется cookie epg_shift (коррекция в секундах). ↩

  309. plg-hdtv-pirates-radio.c041 · code · unknown; прошивка — · Для канала с числовым id < 1000 при разборе ответа vsetv.com время программ EPG считается как EEST, а к каждому элементу прибавляется cookie epg_shift (коррекция в секундах). ↩

    • plg-hdtv-plugtv.c025 · code · unknown; прошивка — · HD::get_local_time_zone выполняет shell-команду TZ=cat /etc/TZ date +%z и возвращает строку вида ±HHMM; HD::get_local_time_zone_offset разбирает её в секунды, инвертируя знак (комментарий: TZ='GMT+12:00' соответствует -1200).
    • plg-hdtv-plugtv.c021 · code · unknown; прошивка — · Разбор EPG общий: регулярное выражение выделяет строки «ЧЧ:ММ текст», имя и описание делятся по «|», время собирается как strtotime("$epg_date $time $local_tz") + $ch_shift (зависит от источника), к началу прибавляется $epg_shift, при переходе через полночь прибавляются сутки, затем массив сортируется по времени и превращается в DefaultEpgItem с finish_time=-1 и EpgIterator с границами day_start_ts-локальное смещение и day_start_ts+100400.

    ↩

  310. plg-hdtv-pirates-radio.c043 · code · unknown; прошивка — · Экран настроек содержит два комбобокса: show_tv («Показывать TV в главном меню:», Да/Нет) и epg_shift («Коррекция программы (час):», подписи от -12 до +12, значения $i*3600 секунд); show_vod читается из cookies, но контрола для него нет. ↩

  311. plg-hdtv-plugtv.c031 · code · unknown; прошивка — · Экран настроек DemoSetupScreen содержит комбобоксы show_tv (Показать/Спрятать), epg_server (Внешний источник/От провайдера), epg_shift (от -12 до 12 часов), epg_font (Нормальный/Мелкий, хранится в set_font), buf_time (0…10000 мс), кнопки информации о плагине и канале и перезагрузки. ↩

    • plg-hdtv-plugtv.c027 · code · unknown; прошивка — · В AbstractTv::get_tv_info размер шрифта EPG берётся из cookie set_font: '2' → PLUGIN_FONT_SMALL, иначе PLUGIN_FONT_NORMAL; значение уходит в PluginTvInfo::epg_font_size.
    • plg-hdtv-plugtv.c031 · code · unknown; прошивка — · Экран настроек DemoSetupScreen содержит комбобоксы show_tv (Показать/Спрятать), epg_server (Внешний источник/От провайдера), epg_shift (от -12 до 12 часов), epg_font (Нормальный/Мелкий, хранится в set_font), buf_time (0…10000 мс), кнопки информации о плагине и канале и перезагрузки.

    ↩

    • plg-hdtv-zlostnyi-iptv.c053 · code · unknown; прошивка — · Ответ EPG разбирается как JSON-массив объектов с полями start, title, desc после удаления UTF-8 BOM (chr(239).chr(187).chr(191)); берутся передачи с start от (day_start − 1 ч) до (day_start + 1 сутки).
    • plg-hdtv-zlostnyi-iptv.c056 · code · unknown; прошивка — · Перед выдачей EPG bcu заменяет HTML-сущности по таблице (' → ', " → ", латышские/литовские ā … ļ; немецкие Ä … ü — на строки в двойной перекодировке вида «Г„»).

    ↩

    • plg-hdtv-plugtv.c043 · code · unknown; прошивка — · Файл plugtv_tvg_screen.php объявляет экран DemoTvgScreen (ID 'tvg'), но нигде не подключается и не регистрируется в DemoPlugin — это мёртвый код.
    • plg-hdtv-plugtv.c044 · code · unknown; прошивка — · DemoTvgScreen строит телегид на выбранную дату: комбобокс дат от -2 до +7 дней; если cookie tvg_date равен текущей дате, подпись «Сегодня» и отметка текущей передачи префиксом «->».

    ↩

  312. plg-hdtv-surface-family.c109 · code · unknown; прошивка — · SurfaceM3uTv пакета LSS реализует UserInputHandler и регистрируется в реестре; get_actions() добавляет GUI_EVENT_TIMER (content_timer) и GUI_EVENT_KEY_SETUP (setup_time), get_tv_info() задаёт таймер 10000 мс. По SETUP открывается диалог «Задать время записи:» с combobox epg_shift от -12 до 12 часов и кнопкой «Применить»; выбор сохраняется в cookie epg_shift. ↩

  313. plg-dc-widget-ext--lib.c023 · code · unknown; прошивка — · ActionFactory::update_epg задаёт channel_id, clear, day_start_tm_sec, programs и post_action в PLUGIN_UPDATE_EPG_ACTION_ID. ↩

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

  315. plg-hdtv-freetv.c060 · code · unknown; прошивка — · При EXT_EPG_AVAILABLE get_tv_info создаёт в /tmp/www/cgi-bin/epg shell-скрипт, если его ещё нет; скрипт ждёт JSON FS_PREFIX/tmp/ext_epg/<channel>-<date>.json и отдаёт его; при DUNE_FIRMWARE_BN >= 11 ext_epg_enabled включается только при наличии /tmp/www/channel_ids.txt и этого скрипта, base_url — http://127.0.0.1/cgi-bin/. ↩

  316. plg-dc-globaltv.c073 · code · unknown; прошивка — · Ветка внешнего EPG в ensure_tv_cache содержит ошибки и никогда не срабатывает: каналы — ассоциативные массивы (json_decode(..., true) в cache.php), а условие проверяет свойство объекта isset($c->epg_id); кроме того, присваивается неопределённая переменная $eepg_id. ↩

  317. plg-hdtv-liteiptv.c109 · forum · unknown; прошивка — · Первый пост темы thr-hdtv-19237 описывает myEPGserver как отдельный плагин-сервер EPG с поддержкой xmltv, который может получать EPG из локального файла или по http и отдавать его любому приложению на плеере и другим плагинам по сети. ↩

  318. plg-hdtv-liteiptv.c111 · forum · unknown; прошивка — · Автор liteIPTVplus в теме thr-hdtv-19237 пишет, что пока поддерживается только одна ссылка EPG: при вводе нового адреса и запуске загрузки старые файлы очищаются. ↩

    • plg-hdtv-liteiptv.c125 · code · unknown; прошивка — · Первая точка входа манифеста myEPGserver задаёт parent_media_url = root://applications и media_url = setup_app.
    • plg-hdtv-liteiptv.c129 · code · unknown; прошивка — · Первая точка входа myEPGserver задаёт show_cookie_name = main_icon, show_by_default = yes и ip_address_required = yes.
    • plg-hdtv-liteiptv.c130 · code · unknown; прошивка — · Вторая точка входа myEPGserver задаёт parent_media_url = setup://applications, media_url = setup, caption «myEPGserver», icon_url plugin_file://icons/logo.png и badge_icon_url plugin_file://icons/default.png.
    • plg-hdtv-liteiptv.c132 · code · unknown; прошивка — · Вторая точка входа myEPGserver задаёт ip_address_required = yes и не содержит popup_menu.

    ↩

    • plg-hdtv-liteiptv.c139 · code · unknown; прошивка — · Список источников xmltv хранится в DATA-файле xmltvEpgPaths массивом записей с полями p (путь или URL) и t = 'xmltv'; для http-источника отдельно сохраняется запись md5(p) с полем filepath, а для локального выбранного пути — с filepath или параметрами SMB/NFS-монтирования.
    • plg-hdtv-liteiptv.c140 · code · unknown; прошивка — · Отключённый источник записывается в DATA-файл skipArrEpg значением 1 по ключу p, и do.php пропускает такой источник при обновлении.
    • plg-hdtv-liteiptv.c141 · code · unknown; прошивка — · CGI folders.php обслуживает добавление источника (action=addDelXmltvEpg): принимает только значение, начинающееся с http, отвергает дубликат с ошибкой «Такой http адрес источника EPG уже существует» и сохраняет источник; action=delXmltvEpg удаляет запись из xmltvEpgPaths и соответствующий md5-файл.
    • plg-hdtv-liteiptv.c142 · code · unknown; прошивка — · В экране каналов источник можно добавить двумя путями: ввести http-адрес в поле saveAddDelXmltvEpg (проверка ^http и дубликата) или выбрать локальный файл .xml/.gz через файловый браузер (тоже с проверкой дубликата); локальный путь (или SMB/NFS-монтирование) сохраняется записью md5(p).
    • plg-hdtv-liteiptv.c143 · code · unknown; прошивка — · Если в media_url выбранного элемента есть epgSourceId, popup-меню источника EPG в экране каналов позволяет поднять или опустить источник (когда он не первый/не последний), включить или отключить его и удалить; для перемещения обработчик queue при action = up/down меняет местами соседние элементы xmltvEpgPaths.

    ↩

    • plg-hdtv-liteiptv.c144 · code · unknown; прошивка — · Если каталог EPG существует и список xmltvEpgPaths непуст, do.php перебирает его, пропускает источники из skipArrEpg, получает путь через smbtree::get_folder_info(md5(p)), принимает только существующий файл или адрес, начинающийся с http, и обрабатывает только источники с t = 'xmltv'; файл .gz открывается через compress.zlib://.
    • plg-hdtv-liteiptv.c145 · code · unknown; прошивка — · При разборе элемента channel do.php для каждого display-name вычисляет ключ mUrl::createIdKey и сохраняет в myEPGserverIDs запись с display_name, id_name = md5(xmlfile . epgId), epgId и xmlfile; пара epgId → id_name дополнительно пишется в epgId2epgIdName. Если имя уже занято каналом из другого файла, программы этого канала помечаются к пропуску через nSaveChannels.
    • plg-hdtv-liteiptv.c146 · code · unknown; прошивка — · При разборе элемента programme do.php вычисляет id_name = md5(xmlfile . channel), день date("Ymd", start) и складывает передачу в массив по ключу start с полями start, stop, title и desc (desc — только если есть); передачи каналов из nSaveChannels пропускаются.

    ↩

    • plg-hdtv-liteiptv.c147 · code · unknown; прошивка — · do.php сбрасывает накопленный массив на диск, когда в нём уже 10 разных id_name и начинается передача нового канала, а также в конце обновления; при слиянии с существующим файлом удаляет дни старше семи суток (DateTime('-7 days')) и пишет JSON в /.json.
    • plg-hdtv-liteiptv.c148 · code · unknown; прошивка — · После обновления do.php удаляет из каталога EPG все *.json, которых нет среди значений epgId2epgIdName.

    ↩

    • plg-hdtv-liteiptv.c150 · code · unknown; прошивка — · getEpg при наличии day_start_ts выбирает способ поиска: caption → mUrl::createIdKey(urldecode(caption)) и запись myEPGserverIDs[id_name]; tvgid → epgId2epgIdName; idname → имя JSON-файла напрямую.
    • plg-hdtv-liteiptv.c151 · code · unknown; прошивка — · Для найденного канала getEpg отдаёт массив дня $dayEpgArr[date("Ymd", day_start_ts)]; если дня нет, echoDayEpgHourArr возвращает 48 передач «On Air» с пустым desc на каждый час от -24 до +23 от day_start_ts.
    • plg-hdtv-liteiptv.c152 · code · unknown; прошивка — · getEpg?getLogoArr сканирует /logo/*, строит карту createIdKey(имя файла без .png/.jpeg) → имя файла (префикс /logo/ убирается, + заменяется на plus) и добавляет в массив элемент [1]; если каталога logo нет, создаёт его и возвращает [1].
    • plg-hdtv-liteiptv.c153 · code · unknown; прошивка — · getEpg?getlogo= возвращает файл логотипа с Content-Type image/jpeg, заменяя plus на + в значении параметра; если файла нет, отдаёт icons/0.png из каталога установки плагина.
    • plg-hdtv-liteiptv.c154 · code · unknown; прошивка — · getEpg?clear удаляет все файлы в каталоге EPG командой shell_exec("rm -f /*") и отвечает JSON {"clear":"1"}.
    • plg-hdtv-liteiptv.c155 · code · unknown; прошивка — · getEpg отвечает JSON {"err":"404"}, если каталог EPG не существует или если на устройстве нет /persistfs, а jsonsPath остался по умолчанию (data_dir_path/dataFiles).
    • plg-hdtv-liteiptv.c156 · code · unknown; прошивка — · Все ответы getEpg, включая JSON, отдаются с Content-Type text/html; charset=utf-8; только ветка getlogo переопределяет заголовок на image/jpeg.

    ↩

    • plg-hdtv-liteiptv.c061 · code · unknown; прошивка — · В liteIPTVplus SmartM3uTv::get_icon_path стал публичным и принимает channel_id, caption и plugin_cookies; при первом вызове он загружает массив логотипов с http:///cgi-bin/plugins/myEPGserver/getEpg?getLogoArr (epgIp по умолчанию 127.0.0.1).
    • plg-hdtv-liteiptv.c063 · code · unknown; прошивка — · В liteIPTVplus get_day_epg_iterator запрашивает http:///cgi-bin/plugins/myEPGserver/getEpg?day_start_ts=&caption=, где «+» в названии заменён на «plus», и разбирает JSON-ответ.
    • plg-hdtv-liteiptv.c064 · code · unknown; прошивка — · В liteIPTVplus экран настроек добавляет текстовое поле epgIp с подписью «IP адрес плеера с myEPGserver» и сохраняет его в cookie при вводе.
    • plg-hdtv-liteiptv.c164 · code · unknown; прошивка — · liteIPTVplus запрашивает у myEPGserver три ветки API: getEpg?getLogoArr для карты логотипов, getEpg?getlogo= для файла логотипа и getEpg?day_start_ts=&caption= для программы дня; все три ветки реализованы в getEpg.php сервера.
    • plg-hdtv-liteiptv.c165 · code · unknown; прошивка — · Программа дня, которую отдаёт сервер, — объект с ключами start, stop, title и (при наличии) desc; liteIPTVplus читает title или name и desc, поэтому формат сервера (title/desc) и резервный формат On Air (name/desc) оба принимаются клиентом.

    ↩

    • plg-hdtv-liteiptv.c133 · code · unknown; прошивка — · Глобальное действие boot манифеста myEPGserver имеет тип plugin_system и запускает bin/update_cron.sh.
    • plg-hdtv-liteiptv.c159 · code · unknown; прошивка — · При изменении setAutoUpdateXmltvEpg, autoUpdateEpg_hour или autoUpdateEpg_day плагин сохраняет режим (n или manually) в DATA-файле manuallyAutoUpdateXmltvEpg, а при manually и заданном autoUpdateEpg_hour — ещё час и день; addCronTask при режиме n удаляет строку с маркером #myEPGserver, а при manually добавляет в /tmp/cron/crontabs/root строку «0 * * wget -O - do > /dev/null #myEPGserver». На Android файл создаётся через echo и crond перезапускается командой /system/dunehd/dunehd_service do crond -b -c /tmp/cron/crontabs; на остальных платформах файл пишется и вызывается crontab -e.
    • plg-hdtv-liteiptv.c160 · code · unknown; прошивка — · При загрузке плагина bin/update_cron.sh запрашивает CGI setcrontab; setcrontab.php читает manuallyAutoUpdateXmltvEpg и заново добавляет в cron строку с маркером #myEPGserver, используя в условии переменную $autoScanFolders, которая в файле не определена.

    ↩

  319. plg-hdtv-liteiptv.c166 · forum · unknown; прошивка — · Автор myEPGserver в первом посте темы пишет, что EPG можно получать вручную или по расписанию раз в неделю в указанный день и указанное время (utc +0 time). ↩

  320. plg-hdtv-liteiptv.c161 · code · unknown; прошивка — · Веб-интерфейс index.php показывает таблицу каналов из myEPGserverIDs (display_name, epgId, id_name), список источников xmltvEpgPaths и модальное окно их добавления/удаления; кнопка обновления шлёт запрос на do, кнопка очистки — GET getEpg?clear, поиск фильтрует строки таблицы на клиенте. ↩

    • plg-ds-dune-hd-tv.c060 · code · unknown; прошивка — · get_tv_info включает внешний EPG (ext_epg_enabled, ext_epg_channel_ids_url = "dunehdtv_channel_ids.txt"), если определена PluginTvInfo::ext_epg_channel_ids_url и есть /firmware_ext/plugins/ext_epg/dune_plugin.xml.
    • plg-ds-dune-hd-tv.c061 · code · unknown; прошивка — · Файл dunehdtv_channel_ids.txt в коде плагина нигде не создаётся и в пакете отсутствует.

    ↩

  321. plg-hdtv-liteiptv.c157 · code · unknown; прошивка — · Экран настроек myEPGserver всегда содержит выбор каталога EPG (setJsonsPath), выбор main_icon и пункт whats_new; при непустом jsonsPath он добавляет addDelXmltvEpg, updateXmltvEpg, showEpgAvailableChannels, autoUpdateXmltvEpg, showEpgUpdateLog и clearXmltvEpg. Если jsonsPath не задан, берётся data_dir_path/dataFiles, но при отсутствии /persistfs этот путь очищается; если нет одновременно /persistfs и /D, показывается предупреждение о необходимости накопителя. ↩

  322. plg-hdtv-liteiptv.c158 · code · unknown; прошивка — · Пункт updateXmltvEpg запускает обновление фоновой командой wget на plugin_cgi_url/do; диалог showEpgUpdateLog читает DATA-файл do.log и каждую секунду перезапускает себя, пока в логе нет «Script stop» (если не передан showLog). ↩

  323. plg-hdtv-liteiptv.c162 · code · unknown; прошивка — · Экран каналов при пустом media_url показывает список каналов из myEPGserverIDs; media_url с id_name открывает JSON-файл канала (дни), с id_name и day — программы дня, а с epgList — список источников с пунктом «Добавить xmltv EPG». ↩

  324. plg-hdtv-liteiptv.c163 · code · unknown; прошивка — · CGI getEpg и do при наличии /tmp/plugins/link_api.php подключают его, иначе — локальный link_api.php; локальная копия определяет только класс mUrl с методом createIdKey. ↩

    • plg-hdtv-liteiptv.c167 · code · unknown; прошивка — · В lib/action_factory.php myEPGserver show_dialog принудительно задаёт frame_style = DIALOG_FRAME_STYLE_GLASS, а строка, читающая dialog_params из $attrs, закомментирована.
    • plg-hdtv-liteiptv.c168 · code · unknown; прошивка — · В lib/control_factory.php myEPGserver метод add_label создаёт элемент с пустым GuiControlDef::name, а заголовок передаёт в GuiControlDef::title.
    • plg-hdtv-liteiptv.c169 · code · unknown; прошивка — · В lib/utils.php myEPGserver http_get_document задаёт CONNECTTIMEOUT и TIMEOUT по 40 секунд, User-Agent Firefox 7.0.1 и печатает сообщения через echo, а не через hd_print.

    ↩

  325. fw-tv188b-261021-0117-r25--network-services.c064 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В прогоне collect8 (2026-10-30) на tv188b r25 $P/firmware/bin/ts — симлинк на $P/lib/libxxx_ts.so, а $P/flashdata/ts/ts — симлинк на $P/flashdata/plugins/dunemdb_supplier_online_movies/bin/ts; у работающего процесса ts (pid 32670) снят только argv (ts --port 8095 ...), /proc/<pid>/exe не снят, поэтому тождество бинарников не установлено. ↩↩

    • plg-dc-dunemdb-supplier-online-movies.c057 · code · unknown; прошивка — · install_ts читает server_release.json с releases.yourok.ru, берёт ссылку android-arm7, сохраняет версию в /flashdata/ts/version и качает бинарник wget-действием с тайм-аутом 600 с в /flashdata/ts/ts.loading, показывая диалог ожидания.
    • plg-dc-dunemdb-supplier-online-movies.c058 · code · unknown; прошивка — · apply_ltsb при ltsb_status не succeeded удаляет ts.loading и показывает ошибку; иначе заменяет /flashdata/ts/ts файлом ts.loading, запускает TorrServer и при успехе вызывает configure_ts.

    ↩

    • plg-dc-dunemdb-supplier-online-movies.c060 · code · unknown; прошивка — · do_ensure_own_torrserver создаёт /flashdata/ts; если /flashdata/ts/ts нет, на APK делает symlink на /bin/ts, а на не-APK возвращает false. При наличии ts выставляет 0755, запускает ts с --port 8095 -k -d /flashdata/ts -l /tmp/run/ts.log (на не-APK через /system/dunehd/dunehd_service do) и ждёт до 40 с по 0,4 с.
    • plg-dc-dunemdb-supplier-online-movies.c039 · code · unknown; прошивка — · Код плагина использует файл /flashdata/ts/ts как TorrServer — запускает его с параметрами --port 8095 -k -d /flashdata/ts -l /tmp/run/ts.log и затем опрашивает HTTP-порт.

    ↩

    • 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//torrserve, иначе ищет в /tmp/applications/app_data.json пакет с подстрокой torrserve и выполняет am start /.
    • plg-hdtv-megatorrents.c060 · code · android; прошивка — · torrserve.php при наличии /data/data/ru.yourok.torrserve/files/torrserver и отсутствии процесса (pidof torrserver) запускает его в фоне с ключами -k -d /sdcard/Android/data/ru.yourok.torrserve/files и отвечает «TorrServe started», при работающем — «TorrServe started earlier».

    ↩

  326. plg-dc-torrent-center.c089 · code · unknown; прошивка — · torrserve.php при наличии файла Android-приложения и отсутствии pid torrserver запускает внешний torrserver с -k -d /sdcard/Android/data/ru.yourok.torrserve/files. ↩

  327. plg-hdtv-megatorrents.c058 · code · unknown; прошивка — · Для удалённого TorrServe (check_local_torrserve(1) == false) start при dune_torrserve_ip == 2 вызывает CGI MegaTorrents на удалённом плеере (/cgi-bin/plugins//torrserve), при == 1 — service_api TorrServe-плагина там же; результат пишется в tmp_dir_path/logs. ↩

    • plg-dc-torrent-center.c088 · code · unknown; прошивка — · getStartSlaveTorrServer пробует CGI torrserve текущего плагина, затем Bazinga на хосте настроенного TorrServer.
    • plg-dc-torrent-center.c090 · code · unknown; прошивка — · При отсутствии файла Android-приложения и не-Android platform_kind torrserve.php вызывает service_api?cmd=torrserve_start установленного плагина TorrServe.

    ↩

    • plg-hdtv-megaanime.c053 · code · unknown; прошивка — · server_action_torrserve реализует start/restart (restart сначала POST-ит /shutdown и ждёт 5 с, затем запуск через CGI, am start или service_api TorrServe), torrent_list, settings, settings_read, settings_write, settings_html, rem, add, get, stat, preload (фоновый wget), stop (POST /shutdown) и soft_restart (GET /torrent/restart).
    • plg-hdtv-megaanime.c054 · code · unknown; прошивка — · Настройки TorrServe читаются через settings_read (JSON) и settings_html (HTML), поля строятся по именам/типам из HTML, CacheSize и PreloadBufferSize показываются в МБ, а при сохранении умножаются на 1024*1024 и отправляются в settings_write.

    ↩

  328. plg-dc-torrent-center.c085 · code · unknown; прошивка — · torrserverActionSettingsRead посылает POST action=get на /settings. ↩

    • plg-dc-dunemdb-supplier-online-movies.c061 · code · unknown; прошивка — · configure_ts читает настройки TorrServer, поправляет head/tail кэша (комментарий: прошивки без исправления 2024-11-04 r22 сбрасывают остальные настройки ts), ставит DisableUpload=true, настраивает дисковый кэш и записывает настройки обратно.
    • plg-dc-dunemdb-supplier-online-movies.c062 · code · unknown; прошивка — · Кэш TorrServer держится в памяти, если /config/ts_disk_cache.txt отсутствует и MemTotal не меньше 1100000 КБ; при меньшем MemTotal или значении 1 в файле включается дисковый кэш /flashdata/ts_cache с правами 0777, UseDisk=true, TorrentsSavePath и RemoveCacheOnDrop=true.
    • plg-dc-dunemdb-supplier-online-movies.c063 · code · unknown; прошивка — · ensure_head_and_tail требует CacheSize > 0, ReaderReadAHead и PreloadCache в диапазоне 0..100, считает head = CacheSize*ReaderReadAHead/100 и tail = остаток; при head < 60000000 или tail < 30000000 увеличивает размер до минимумов, округляет до мегабайта и пересчитывает проценты, ограничивая ReaderReadAHead 1..99.

    ↩

    • plg-dc-torrent-center.c086 · code · android; прошивка — · На ветке platform=android getInstallTorrServer проверяет файл приложения ru.yourok.torrserve через dunehd_service do.
    • plg-dc-torrent-center.c087 · code · sigma-smp87xx; прошивка — · На ветке platform=87xx getInstallTorrServer ищет TorrServe в /tmp/run/installed_plugins.xml.

    ↩

    • plg-hdtv-megatorrents.c051 · code · unknown; прошивка — · Ответ /echo плагин трактует как версию TorrServe: число без точек > 1025 выбирает ключ Link вместо Magnet, а при числе < 1054 плагин сам посылает cURL POST {"":""} на /torrent/add (CONNECTTIMEOUT 25) и по Hash открывает папку серий с season_id torrserve_.
    • plg-hdtv-megatorrents.c052 · code · unknown; прошивка — · При версии TorrServe ≥ 1054 плагин добавляет торрент через server_action_torrserve('add'), передавая Info с name/img/descr/info_name/myShowId (urlencode(json_encode)), только если версия > 1065 и add_torrserve_inf == 1; затем запускает цикл add_torrserve_action с полученным hash.

    ↩

  329. plg-hdtv-megaanime.c050 · code · unknown; прошивка — · torrserve_action при пустом torrserve_ip открывает выбор действия; иначе опрашивает http://:8090/echo и, если check_local_torrserve(2) и сервер не отвечает, запускает его через server_action_torrserve('start'); получает торрент, выбирает ключ Magnet (версия <= 1025) или Link; для версии < 1054 POST-ит {"<ключ>":""} на /torrent/add и открывает VodSeriesListScreen с season_id torrserve_, для более новой зовёт server_action_torrserve('add', …) и ждёт файлы через add_torrserve_action. ↩

  330. plg-dc-dunemdb-supplier-online-movies.c092 · code · unknown; прошивка — · TorrServer-адаптер плагина обращается к /torrent/upload (file=@..., save), /torrents (add/get/list/drop/rem), /viewed, /shutdown и /settings (action=get|set). ↩

  331. plg-dc-torrent-center.c083 · code · unknown; прошивка — · TorrServer-адаптер посылает action=drop, rem или get вместе с hash на /torrents. ↩

  332. plg-hdtv-megatorrents.c053 · code · unknown; прошивка — · add_torrserve_action показывает диалог «Добавление» со счётчиком и кнопкой «Удалить» и через timer(1000) по GUI_EVENT_TIMER повторяет себя, пока /torrent/get не вернёт Files; затем (при add_torrserve_inf == 1 и без torrserve_inf) сохраняет описание в torrserve_infs[hash] и открывает папку torrserve_. ↩

    • plg-dc-dunemdb-supplier-online-movies.c093 · code · unknown; прошивка — · torrserverActionGet перед json_decode переписывает числовые значения после ключей в строки; запрос ограничен тайм-аутом 1 с, предупреждения заглушены.
    • plg-dc-dunemdb-supplier-online-movies.c094 · code · unknown; прошивка — · TorrServer::do_get_series_list оставляет только файлы с расширениями видео/аудио, id файла — md5(path), size_mb считается из length, playback_url — /stream/?link=<hash>&index=<id>&play, список сортируется по пути.</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-dc-dunemdb-supplier-online-movies.c125 · code · unknown; прошивка — · TorrentHelper::open_torrent проверяет TorrServer через getOnlineStatusServer, берёт ссылку через MainHelper::$tordb->get_torrent_file, ищет hash в кэше по uid, при отсутствии hash или неполных данных добавляет торрент с dontSave=1, сохраняет hash в /tmp/run/dunemdb_supplier_online_movies_hash_by_uid.json и запускает AddTorrentDialog; ошибки 1/2/3 означают «сервер не запущен», «ссылка не получена», «торрент не добавлен». <a class="footnote-backref" href="#fnref:584" title="Jump back to footnote 584 in the text">↩</a></p> </li> <li id="fn:585"> <p>plg-dc-dunemdb-supplier-online-movies.c091 · code · unknown; прошивка — · TorrServer::torrserverAddTorrent при действии 1 не сохраняет в БД; если IP сервера не содержит первый октет локального IP, ссылка не magnet и адрес не 127.0.0.1, торрент загружается файлом /tmp/www/temp.torrent на /torrent/upload, иначе добавляется ссылкой через /torrents. <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-dc-torrent-center.c094 · code · unknown; прошивка — · Transmission::transmissionActionSaveTorrentFile сохраняет входной .torrent в /tmp/www/temp.torrent и создаёт Torrent для его разбора.</li> <li>plg-dc-torrent-center.c095 · code · unknown; прошивка — · Transmission::transmissionActionAddTorrent по умолчанию передаёт torrent_location=http://<IP плеера>/temp.torrent помощнику transmissionActions.php action=add_file.</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"> <p>plg-hdtv-megatorrents.c041 · code · unknown; прошивка — · SmartConfig::get_torrent по умолчанию сохраняет .torrent в /tmp/www/temp.torrent; для URL kinozal (при get_login_check('kinozal')), nnmclub, rutracker dl.php (при логине) — с cookie-файлом трекера в tmp_dir_path, для hdreactor — с Referer, для прочих не-magnet — простым GET; при пути по умолчанию возвращает http://<IP плеера>/temp.torrent. <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-hdtv-megaanime.c059 · code · unknown; прошивка — · При выборе локального .torrent файла SmartFileSystemScreen отправляет его в TorrServe: копирует в /tmp/www/temp.torrent, отдаёт серверу URL http://<ip>/temp.torrent и для версии < 1054 POST-ит /torrent/add, иначе server_action_torrserve('add'); для Peerflix — multipart POST /upload, затем открывает список торрентов. <a class="footnote-backref" href="#fnref:588" title="Jump back to footnote 588 in the text">↩</a></p> </li> <li id="fn:589"> <p>plg-hdtv-megatorrents.c043 · code · unknown; прошивка — · Для magnet:?xt=urn:btih:<40 символов> и пути, отличного от /tmp/www/temp.torrent, get_torrent скачивает http://itorrents.org/torrent/<hash>.torrent; при пути acestream возвращает get_acestream_content_id, при android_action пишет файл в /tmp/www/temp.torrent и возвращает true. <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-dc-torrent-center.c072 · code · unknown; прошивка — · Глобальный file_popup обработчик добавляет меню только для расширения torrent после проверки обязательных полей и исключения оптического диска.</li> <li>plg-dc-torrent-center.c073 · code · unknown; прошивка — · get_file_popup_action собирает абсолютный путь из mount_path источника и selected_file_path.</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-remtor.c077 · code · unknown; прошивка — · get_add_torrent_dialog различает три источника: URL, проходящий проверку strspn по набору 'http://', при успешном HD::http_get_document и записи скачивается во временный файл; magnet-ссылка сохраняется как add_torrent_fn; локальный файл проверяется Torrent::is_torrent и разбирается конструктором Torrent.</li> <li>plg-hdtv-remtor.c147 · code · unknown; прошивка — · Для проверки, что аргумент начинается с http://, get_add_torrent_dialog использует strspn($fn,'http://',0,7) == 7, то есть проверяет набор символов, а не строковый префикс.</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"> <ul> <li>plg-hdtv-remtor.c078 · code · unknown; прошивка — · Для .torrent плагин берёт общий размер через Torrent::size, список файлов через Torrent::content, помечает все файлы need = true и отрезает общий каталог, вычисленный последовательным dirname.</li> <li>plg-hdtv-remtor.c134 · code · unknown; прошивка — · Torrent::is_torrent считает файл торрентом, если первые 11 байт равны «d8:announce».</li> </ul> <p><a class="footnote-backref" href="#fnref:592" title="Jump back to footnote 592 in the text">↩</a></p> </li> <li id="fn:593"> <p>fw-tv188b-261021-0117-r25--downloads.c042 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · do_get_series_list возвращает отсортированный по пути массив с title, id=md5(path), size/size_mb при наличии length и URL /stream/<имя>?link=<hash>&index=<id>&play; filter_extensions по умолчанию true. <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-dunemdb-supplier-online-movies.c094 · code · unknown; прошивка — · TorrServer::do_get_series_list оставляет только файлы с расширениями видео/аудио, id файла — md5(path), size_mb считается из length, playback_url — <server>/stream/<title с %20>?link=<hash>&index=<id>&play, список сортируется по пути. <a class="footnote-backref" href="#fnref:594" title="Jump back to footnote 594 in the text">↩</a></p> </li> <li id="fn:595"> <ul> <li>plg-dc-torrent-center.c080 · code · unknown; прошивка — · TorrServer::get_series_list собирает playback_url как <server>/stream/<basename>?link=<movie_id>&index=<file.id>&play, заменяя пробелы имени на %20.</li> <li>plg-dc-torrent-center.c081 · code · unknown; прошивка — · TorrServer::get_series_list помечает сформированный playback_url как is_stream_url=false.</li> </ul> <p><a class="footnote-backref" href="#fnref:595" title="Jump back to footnote 595 in the text">↩</a></p> </li> <li id="fn:596"> <p>plg-hdtv-megatorrents.c106 · code · unknown; прошивка — · SmartVod::get_vod_stream_url возвращает часть после from_src=android&turl=, либо playback_url без изменений для адресов 9000/torrents/, .jpg, 8090/torrent/ и 9092/torrent; иначе mUrl::get_link с video_quality из HD::get_item (по умолчанию 1). <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-torrent-center.c084 · code · unknown; прошивка — · torrserverActionPreload запускает фоновый wget по URL потока, заменив &play на &preload.</li> <li>plg-dc-torrent-center.c105 · code · unknown; прошивка — · Для TorrServer при включённом preloadTorrServ экран файлов запускает preload и переходит к doPreload вместо немедленного vod_play.</li> <li>plg-dc-torrent-center.c148 · code · unknown; прошивка — · doPreload запускает vod_play при переходе stat=2→3 или при заполнении preload_size более чем на 98 процентов.</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-hdtv-megatorrents.c055 · code · unknown; прошивка — · Действие preload server_action_torrserve запускает фоновый exec('wget --quiet -O - "<url>" > /dev/null &') — прогрев буфера чтением потока.</li> <li>plg-hdtv-megatorrents.c064 · code · unknown; прошивка — · При control_id play и series_id вида http://<ip>:8090/torrent/view/<hash>/ VodSeriesListScreen проверяет <ip>:8090/echo; при ответе и PreloadBufferSize > 0 из settings_read запускает preload (torrent/view → torrent/preload) и цикл do_torrserve_preload; без ответа — диалог «TorrServe <ip> не запущен!».</li> <li>plg-hdtv-megatorrents.c065 · code · unknown; прошивка — · do_torrserve_preload запрашивает /torrent/stat и повторяется, пока (PreloadLength > PreloadSize и IsPreload == 1) или IsGettingInfo == 1, показывая буфер и пиров; иначе загружает фильм и возвращает ActionFactory::vod_play().</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.c059 · code · android; прошивка — · directStream() переписывает URL TorrServer на прямой адрес только если путь содержит /stream/, origin и префикс пути совпадают с сохранённым source, link — 40 hex, index — положительное число и есть параметр play.</li> <li>plg-gh-vladikshkwok-lampa-dune-plugins.c060 · code · android; прошивка — · directStream() не переписывает URL с логином/паролем и URL, у которого после /stream/ нет сегмента пути или их больше одного.</li> <li>plg-gh-vladikshkwok-lampa-dune-plugins.c061 · code · android; прошивка — · prepare() перед подменой прокси делает read-only запрос POST <target>/torrents с {action:'get', hash} через Lampa.Android.httpReq (timeout 1000, общий watchdog 1200) и переписывает URL только при совпадении hash в ответе.</li> <li>plg-gh-vladikshkwok-lampa-dune-plugins.c062 · code · android; прошивка — · Если target или source не заданы, выбранный URL не проходит directStream(source, target) или проверка hash в ответе не удалась, prepare() возвращает исходное тело и прокси-ссылки не меняются.</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.c084 · code · android; прошивка — · share() пишет позицию в TorrServer через Lampa.Torserver.viewedSet только для ключа torrent:<40 hex>:<index> и при наличии Lampa.Torserver, Lampa.Storage.field, функций viewedSet и url и включённом torrserver_tracktimecode; пустой base и http-адрес на https-странице пропускаются.</li> <li>plg-gh-vladikshkwok-lampa-dune-plugins.c085 · code · android; прошивка — · share() при обычном просмотре отправляет timecode после 30 секунд, затем не чаще раза в 30 секунд, сразу при перемотке, сдвигающей время больше чем на 30 секунд от ожидаемого, и принудительно при остановке; повтор того же timecode и первое значение без force не отправляются.</li> <li>plg-gh-vladikshkwok-lampa-dune-plugins.c086 · code · android; прошивка — · Комментарий share() утверждает, что это тот же запрос, который Lampa делает при закрытии своего плеера: POST <torrserver>/viewed с {action:'set', hash, file_index, timecode} в целых секундах; другие клиенты читают его при открытии списка файлов.</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"> <p>plg-hdtv-megatorrents.c072 · code · unknown; прошивка — · peerflix_action посылает {"link":"<url>"} с Content-type application/json на http://<peerflix_ip>:9000/torrents, при пустом infoHash повторяет до 10 раз через 4 с и открывает папку серий с season_id = infoHash. <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-hdtv-megaanime.c049 · code · unknown; прошивка — · peerflix_action при пустом peerflix_ip открывает выбор действия, а при локальном peerflix_ip (127.0.0.1 или IP устройства) удаляет старый лог и гасит transmission, noxbit, acestream и torrserve; для 127.0.0.1 проверяет store.js, а сервер поднимает через /cgi-bin/plugins/<Entware>/service_api?cmd=peerflix_start, если store.js есть при 127.0.0.1 или dune_peerflix_ip == 1 и /torrents недоступен; затем POST-ит {"link":"<url>"} на http://<ip>:9000/torrents и до 10 раз по 4 с ждёт infoHash. <a class="footnote-backref" href="#fnref:602" title="Jump back to footnote 602 in the text">↩</a><a class="footnote-backref" href="#fnref2:602" title="Jump back to footnote 602 in the text">↩</a></p> </li> <li id="fn:603"> <ul> <li>plg-dc-torrent-center.c092 · code · unknown; прошивка — · PeerflixServer загружает .torrent через POST file=@<путь> на /upload и возвращает infoHash.</li> <li>plg-dc-torrent-center.c093 · code · unknown; прошивка — · PeerflixServer::get_series_list формирует playback_url как адрес сервера плюс files[].link, с is_stream_url=true.</li> </ul> <p><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-hdtv-megatorrents.c071 · code · unknown; прошивка — · Если (store.js есть и peerflix_ip 127.0.0.1) или dune_peerflix_ip == 1, а http://<ip>:9000/torrents не отвечает, плагин вызывает http://<ip>/cgi-bin/plugins/<get_entware_ver()>/service_api?cmd=peerflix_start и до 10 раз через 4 с ждёт ответа; иначе (не локальный и не Dune) при недоступном :9000/torrents/ — диалог ошибки. <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-dc-torrent-center.c158 · code · unknown; прошивка — · PeerflixServer::startPeerflixServer для настроенного хоста запускает wget на service_api?cmd=peerflix_start выбранного служебного плагина. <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-dc-torrent-center.c096 · code · unknown; прошивка — · transmissionActions.php создаёт TransmissionRPC на <transmissionIp>/transmission/rpc с переданными login/pass.</li> <li>plg-dc-torrent-center.c097 · code · unknown; прошивка — · TransmissionRPC упаковывает запрос в JSON method/arguments и отправляет POST с X-Transmission-Session-Id.</li> <li>plg-dc-torrent-center.c098 · code · unknown; прошивка — · TransmissionRPC добавляет Authorization: Basic, если заданы username и password.</li> <li>plg-dc-torrent-center.c099 · code · unknown; прошивка — · transmissionActions.php различает операции get/getFile, remove, add_file, sget, sstats и setPriorityHigh.</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-hdtv-megaanime.c048 · code · unknown; прошивка — · transmission_action при пустом transmission_ip показывает настройки, иначе проверяет http://<ip>/transmission/rpc, при необходимости запускает start_transmission, создаёт TransmissionRPC("http://<ip>/transmission/rpc", login, pass), получает торрент через SmartConfig::get_torrent и отправляет его $rpc->add(). <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-hdtv-megatorrents.c077 · code · unknown; прошивка — · transmission_action создаёт TransmissionRPC("http://<transmission_ip>/transmission/rpc", login, pass) и передаёт ему результат get_torrent через $rpc->add(), то есть URL temp.torrent на плеере или magnet-ссылку.</li> <li>plg-hdtv-megatorrents.c082 · code · unknown; прошивка — · Для локального Transmission вне ветки Android BTC start_transmission при pidof transmission-daemon == false выполняет shell_exec('transmission-start') и до 10 раз через 4 с проверяет /transmission/rpc, но в обеих ветках результата возвращает false.</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-hdtv-remtor.c080 · code · unknown; прошивка — · При action_type confirm/apply после успешного checkconnect в case btnOk magnet-ссылка добавляется вызовом add_torrent с filename, download-dir и paused; .torrent — вызовом add_metainfo с base64-содержимым, download-dir, paused, files-wanted и files-unwanted.</li> <li>plg-hdtv-remtor.c081 · code · unknown; прошивка — · При ответе Transmission с arguments->torrent-duplicate плагин закрывает внешний вызов результатом «Torrent duplicate».</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-dc-torrent-center.c100 · code · unknown; прошивка — · TransmissionUPnP::get_series_list строит URL <UPnP server>/torrent/<movie_id>/<file_index>.<extension> с is_stream_url=true.</li> <li>plg-dc-torrent-center.c101 · code · unknown; прошивка — · TransmissionUPnP получает список файлов через php-cgi transmissionActions.php action=getFile на адресе getTransmissionBtcIp.</li> <li>plg-dc-torrent-center.c157 · code · unknown; прошивка — · TransmissionUPnP::getTransmissionBtcIp берёт host адреса UPnP и отдельный transmissionPort для RPC, по умолчанию 9091.</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-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.c087 · code · unknown; прошивка — · Экран vod_peerflix с first_arg transmission_upnp читает M3U http://<transmission_ip без порта>:9092/playlist (#EXTINF → подпись) и создаёт элементы upnp_transmission_<url>; при dune_transmission_ip == 2, локальном IP и android без ответа сначала выполняет am start com.ap.transmission.btc/com.ap.transmission.btc.activities.MainActivity и ждёт 10 с.</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"> <p>plg-hdtv-megaanime.c055 · code · unknown; прошивка — · Экран vod_peerflix для first_arg transmission_upnp читает M3U http://<ip>:9092/playlist и строит элементы upnp_transmission_<url>; для first_arg torrserve читает /torrent/list, показывает «Загрузить торрент файл» и список торрентов с размером и датой добавления. <a class="footnote-backref" href="#fnref:612" title="Jump back to footnote 612 in the text">↩</a></p> </li> <li id="fn:613"> <p>plg-hdtv-smart-apps.c032 · code · unknown; прошивка — · При actions_app (ENTER/PLAY) установка Transmission из Entware блокируется диалогом %tr%t54/%tr%t58, если существует /ltu или /tmp/run/installed_plugins.xml содержит Transmission, и выбран install_script install_transmission. <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-hdtv-peerflixserver.c039 · code · unknown; прошивка — · Пункт verify_peerflix при выбранном verify пишет config->verify=true только для значения true, иначе false; если configObg сохранил настройки и сервер запущен, перезапускает его.</li> <li>plg-hdtv-peerflixserver.c057 · forum · unknown; прошивка — · По словам автора, у пирфликса нет кеша в памяти: он качает файл целиком на диск; при включённой «проверке торрента» после перезапуска идёт перехеширование, при выключенной ранее закачанное отбрасывается и закачка начинается заново, резервируя место по размеру торрента.</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"> <p>plg-hdtv-remtor.c056 · code · unknown; прошивка — · Фильтр списка торрентов предлагает группы tr_kind_all, tr_kind_active, tr_kind_downloading, tr_kind_inactive, tr_kind_stopped и tr_kind_error со счётчиками TotalCnt, ActiveCnt, DownCnt, StoppedCnt и ErrorCnt. <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-hdtv-remtor.c096 · code · unknown; прошивка — · Страница download экрана setup_trans показывает поля download-dir, rename-partial-files, seedRatioLimit, idle-seeding-limit и cache-size-mb из ответа session-get.</li> <li>plg-hdtv-remtor.c097 · code · unknown; прошивка — · Страница network экрана setup_trans показывает поля peer-port, peer-port-random-on-start, port-forwarding-enabled, encryption и dht-enabled, а также кнопку tr_test_port.</li> <li>plg-hdtv-remtor.c098 · code · unknown; прошивка — · При action_type confirm/apply изменение любого поля setup_trans после checkconnect вызывает set_session_arg с парой control_id => new_value; кнопка tr_test_port вызывает port_test и показывает tr_test_true/tr_test_false.</li> <li>plg-hdtv-remtor.c117 · code · unknown; прошивка — · port_test возвращает истину, если port-is-open = 1; в ветке catch после успешного try_connect вызывается несуществующий метод test_port(), а не port_test().</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"> <ul> <li>plg-hdtv-remtor.c075 · code · unknown; прошивка — · Пункт tr_add_torrent выставляет DuneBrowserDirClass::filemask = '.torrent', задаёт action_ok через close_and_run действия tr_select_torrent и action_cancel, затем открывает экран gl_browser.</li> <li>plg-hdtv-remtor.c076 · code · unknown; прошивка — · После выбора .torrent по SMB-пути tr_select_torrent монтирует шару через DuneFileUtils::net_mount_smb в /tmp/mnt/smb/rem_tor и заменяет путь на точку монтирования.</li> <li>plg-hdtv-remtor.c146 · code · unknown; прошивка — · Экран gl_browser хранит текущий каталог в plugin_cookies->browse_setting как JSON, фильтрует файлы по filemask, при SMB монтирует шару через net_mount_smb и возвращает выбранный путь в result_link.</li> </ul> <p><a class="footnote-backref" href="#fnref:617" title="Jump back to footnote 617 in the text">↩</a></p> </li> <li id="fn:618"> <ul> <li>plg-hdtv-remtor.c082 · code · unknown; прошивка — · Каталог закачки по умолчанию берётся из session-get поля download-dir; кнопка смены каталога показывает подкаталоги через DuneFileUtils::get_folder с OnlyDir, а путь для показа переводится map_rem_to_local.</li> <li>plg-hdtv-remtor.c138 · forum · unknown; прошивка — · В changelog 0.0.18 (p221846) указано, что при добавлении торрента можно изменить директорию, но выбор ограничен первыми 15 поддиректориями из-за отсутствия скроллинга.</li> </ul> <p><a class="footnote-backref" href="#fnref:618" title="Jump back to footnote 618 in the text">↩</a></p> </li> <li id="fn:619"> <ul> <li>plg-hdtv-remtor.c070 · code · unknown; прошивка — · Экран rt_files получает файлы торрента вызовом get_torrent_array_bint с полями id, hashString, name, files и fileStats; отдельно берёт item_files и item_stats.</li> <li>plg-hdtv-remtor.c071 · code · unknown; прошивка — · Экран rt_files отрезает у имён файлов общий каталог, вычисленный последовательным dirname по первым элементам списка.</li> <li>plg-hdtv-remtor.c072 · code · unknown; прошивка — · Строка файла торрента показывает размер, процент выполнения для неполного файла, приоритет (high/normal/low) или «не загружать»; иконка completed.aai, downloading/*.aai или skip.aai выбирается по wanted и bytesCompleted, а priority задаёт подпись high/normal/low у загружаемого файла.</li> </ul> <p><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-hdtv-remtor.c073 · code · unknown; прошивка — · После проверки selected_media_url обработчик tr_set_priority экрана rt_files вызывает set_priority_file с setpriority и списком выбранных файлов, а при пустом выборе — с одним file_id. <a class="footnote-backref" href="#fnref:620" title="Jump back to footnote 620 in the text">↩</a></p> </li> <li id="fn:621"> <ul> <li>plg-hdtv-megaanime.c051 · code · unknown; прошивка — · acestream_action вызывает check_local_acestream: при select_action открывает выбор действия, при true показывает ошибку; иначе получает content_id через get_torrent(series_id, 'acestream') и открывает VodSeriesListScreen с season_id acestream_<id>. parse_acestream_page после успешной проверки читает http://<ip>:6878/ace/getstream?id=<id>&format=json, а при ответе без #EXTM3U добавляет одну серию с этим URL.</li> <li>plg-hdtv-megaanime.c047 · code · unknown; прошивка — · popup торрент-серии предлагает действия «Открыть через Android» (только Android), «Скачать через Transmission», «Перейти в RemTor», «Смотреть через Peerflix-server», «Смотреть через TorrServe», «Смотреть через Ace Stream» (только Android) и «Сохранить торрент файл».</li> </ul> <p><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-hdtv-megatorrents.c045 · code · unknown; прошивка — · get_acestream_content_id посылает base64 содержимого .torrent POST-запросом (Content-Type application/octet-stream) на http://api.torrentstream.net/upload/raw и возвращает content_id из JSON.</li> <li>plg-hdtv-megatorrents.c046 · code · unknown; прошивка — · При отсутствии content_id get_acestream_content_id выполняет выражение «else false;» без return, то есть функция возвращает null.</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"> <p>plg-hdtv-liteiptv.c115 · code · android; прошивка — · При platform_kind = android, локальном IP AceStream и неудачном первом запросе get_version плагин ищет package_name с acestream в /tmp/applications/app_data.json, запускает его через am start, ждёт 15 секунд и повторно запрашивает /webui/api/service?method=get_version. <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-hdtv-liteiptv.c044 · code · unknown; прошивка — · При воспроизведении без архива перед выдачей URL плагин распознаёт stream?cid= (Noxbit), acestream:// или /ace/getstream?id= (AceStream) и youtube (mUrl::get_link), а запись zoom канала добавляет к URL параметр dune_params zoom.</li> <li>plg-hdtv-liteiptv.c105 · forum · unknown; прошивка — · По первому посту liteIPTV проверяет доступность Noxbit и AceStream и пытается запустить их на локальном плеере Dune или плеере в сети; для acestream:// указывается IP сервера AceStream 3.1+, по умолчанию порт 6878, для Noxbit — 6689 (это же следует из кода настроек).</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"> <ul> <li>plg-gh-valerievitch-dune-plugin-acestreamsearch.c036 · code · unknown; прошивка — · Если ace_proxy_ip пуст и use_local_search_engine выключен, AceSearchTvGroupListScreen в get_folder_view ставит таймер PluginRegularFolderView с задержкой 100 мс.</li> <li>plg-gh-valerievitch-dune-plugin-acestreamsearch.c037 · code · unknown; прошивка — · В AceSearchTvGroupListScreen в цепочке elseif после history_delete, really_history_delete и history_sort обработчик timer показывает диалог T::t('enter_ace_proxy_ip') с кнопкой setup, а обработчик setup (elseif после timer) открывает папку setup.</li> <li>plg-gh-valerievitch-dune-plugin-acestreamsearch.c071 · code · unknown; прошивка — · AceSearchTv::load_channels при пустом ace_proxy_ip и выключенном use_local_search_engine сбрасывает plugin_cookies->query и бросает DuneException 'Empty Ace Proxy address' с фатальным show_error T::t('enter_ace_proxy_ip').</li> </ul> <p><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-hdtv-megaanime.c046 · code · unknown; прошивка — · Действие по умолчанию для торрентов и magnet-ссылок выбирается из списка: 0 не выбрано, 1 Transmission, 2 Peerflix-server, 3 сохранить .torrent, 4 Ace Stream (только Android), 5 TorrServe, 6 открыть через Android (только Android). <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-hdtv-megaanime.c047 · code · unknown; прошивка — · popup торрент-серии предлагает действия «Открыть через Android» (только Android), «Скачать через Transmission», «Перейти в RemTor», «Смотреть через Peerflix-server», «Смотреть через TorrServe», «Смотреть через Ace Stream» (только Android) и «Сохранить торрент файл». <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-hdtv-megaanime.c057 · code · unknown; прошивка — · Пункт open_remtor проверяет наличие rem_tor в /tmp/run/installed_plugins.xml и запускает plugin_launcher://rem_tor; если плагина нет, предлагает установить его из plugin_installer://http://vadimkell.dlinkddns.com/update.tgz. <a class="footnote-backref" href="#fnref:628" title="Jump back to footnote 628 in the text">↩</a></p> </li> <li id="fn:629"> <ul> <li>plg-hdtv-megatorrents.c104 · code · android; прошивка — · select_android_action экрана сезонов при torrent получает .torrent через get_torrent(series_id, 'android_action') в /tmp/www/temp.torrent и открывает его интентом torrent с URL file:///tmp/www/temp.torrent.</li> <li>plg-hdtv-megatorrents.c101 · code · android; прошивка — · SmartConfig::get_android_action запускает внешний просмотрщик через am start -d "<url>" -t <mime> -a android.intent.action.VIEW с MIME video/* (video), audio/x-mpegurl (m3u), application/x-bittorrent (torrent) и image/* (image).</li> </ul> <p><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-hdtv-megatorrents.c098 · code · unknown; прошивка — · При control_id aria_download, заданном selected_media_url и существующем dload_dir_path SmartDloadScreen берёт folder_movie (не-http URL разрешает parse_video_stream_url) и запускает в фоне <get_dload_app()> -x2 --file-allocation=none --continue=true --log-level=info <url> --dir=<dload_dir_path> с выводом в tmp_dir_path/aria.log. <a class="footnote-backref" href="#fnref:630" title="Jump back to footnote 630 in the text">↩</a></p> </li> <li id="fn:631"> <ul> <li>plg-hdtv-smart-vod.c138 · code · unknown; прошивка — · При control_id=aria_download, заданном selected_media_url и существующем dload_dir_path эталон запускает фоновый /ltu/bin/aria2c с -x2, continue=true и логом tmp_dir_path/aria.log.</li> <li>plg-hdtv-smart-vod.c327 · code · unknown; прошивка — · В lib/vod/movie.php MoviesTape пункт меню «Скачать» показывается при HD::get_dload_app()==true, а обработчик dload запускает найденный путь с -x2, file-allocation=none, continue=true и логом tmp_dir_path/aria.log; get_dload_app в lib/utils.php возвращает /opt/bin/aria2c либо /ltu/bin/aria2c, но только при существовании /codecpack/script/mw_download, иначе false.</li> </ul> <p><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-smart-vod.c201 · code · unknown; прошивка — · При заданном selected_media_url, control_id=aria_inf и status=false диалог загрузок эталона назначает timer(3000) и GUI_EVENT_TIMER на повторный aria_inf через close_dialog_and_run. <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-hdtv-megatorrents.c099 · code · unknown; прошивка — · HD::get_aria2c_dload_info оставляет в aria.log только хвост после последней строки «====…», разбирает строки #<n> (SIZE, SPD, ETA, DL), «Download complete:», «FILE:», таблицу «n|status|speed|name» и «download completed»; без aria.log сообщает «Закачки остановленны». <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-hdtv-smart-vod.c175 · code · unknown; прошивка — · В Zona.mobi при control_id, отличном от run и run_ltu_install, и handler_id=entry обработчик открывает папку, если существует /ltu/bin/aria2c либо файл get_data_path()/ltu_install; иначе, при отсутствии aria2c, показывает предупреждение LTU. <a class="footnote-backref" href="#fnref:634" title="Jump back to footnote 634 in the text">↩</a></p> </li> <li id="fn:635"> <ul> <li>plg-hdtv-smart-vod.c295 · code · unknown; прошивка — · knigavuhe загружает книги через действие dload: при selectFolder открывает file_list с save_data=dload_dir_path; если папка не выбрана — предлагает выбрать; при del запрашивает подтверждение, при deleteY удаляет папку книги, при openDir открывает её через embedded_app file_browser, при stop выполняет /tmp/curlDloadTerminate.sh; иначе (в том числе при all) создаёт каталог с очищенным именем книги и запускает bin/curlDload.sh в фоне.</li> <li>plg-hdtv-smart-vod.c297 · code · unknown; прошивка — · bin/curlDload.sh читает platform_kind из /tmp/run/versions.txt и выбирает curl: для android — /firmware/bin/curl, для 87.. — ./curl.87xx, для 864. — ./curl.864x, для 867. — ./curl.867x, для 865. — ./curl.865x; каждый URL скачивается командой curl -C - -O -# <url> --insecure, прогресс пишется в /tmp/curlDload.txt, а /tmp/curlDloadTerminate.sh завершает процесс.</li> </ul> <p><a class="footnote-backref" href="#fnref:635" title="Jump back to footnote 635 in the text">↩</a></p> </li> <li id="fn:636"> <ul> <li>plg-hdtv-smart-vod.c296 · code · unknown; прошивка — · Прогресс загрузок knigavuhe читается через CGI-вызов php-cgi -f www/cgi-bin/run.php; run.php читает /tmp/curlDload.txt, разбирает строки по \r, берёт текущий URL и последний процент, возвращает JSON вида {url: "NN%"} или [].</li> <li>plg-hdtv-smart-vod.c304 · code · unknown; прошивка — · В knigavuhe экран серий показывает прогресс загрузки из actionGetDloadList: если существует /tmp/curlDload.txt и для URL серии в результате есть запись, иконка меняется на download.png, цвет на 19, а процент выводится в item_extra_info, если определено ViewItemParams::item_extra_info (иначе — префиксом [NN%] в caption); при непустом dload_dir_path, готовом файле в папке загрузок и отсутствии активной загрузки ($dp == false) ставится hdd.png.</li> </ul> <p><a class="footnote-backref" href="#fnref:636" title="Jump back to footnote 636 in the text">↩</a></p> </li> <li id="fn:637"> <ul> <li>plg-hdtv-smart-vod.c348 · code · unknown; прошивка — · bin/wget_dload Vimeo запускает /usr/bin/wget <video_url> -O <download_dir>/<name>.mp4, пишет лог в /tmp/plugins/Vimeo/<md5>.wget и скрипт остановки в /tmp/plugins/Vimeo/<md5>.kill; при --stop выполняет "<name>.kill". lib/vod/vod_list_screen.php при control_id=video_dload, заданном selected_media_url и непустом существующем dload_dir_path, а lib/vod/movie.php в той же ветке по series_list вызывают его с --start <name> <dload_dir_path> <file_url> md5(name), где file_url — результат mUrl::get_link после удаления mp4://.</li> <li>plg-hdtv-smart-vod.c349 · code · unknown; прошивка — · get_dload_list Vimeo читает glob('/tmp/plugins/vimeo/*.wget') со строчной «vimeo», тогда как bin/wget_dload пишет в /tmp/plugins/Vimeo/ с заглавной «Vimeo»; кроме того, главное меню в ветке dload_list ссылается на SmartDloadScreen, но в tree.tsv пакета нет Smart_dload_screen.php.</li> </ul> <p><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-hdtv-smart-vod.c253 · code · unknown; прошивка — · В lib/vod/vod_series_list_screen.php всех девяти полных пакетов нет обработчиков aria_download, aria_download_all, aria_stop и open_folder, которые были в эталоне; у восьми VOD-пакетов список серий назначает SETUP, ENTER/PLAY, зелёную viewed, жёлтую qlt_item и POPUP_MENU, а у knigavuhe жёлтая кнопка назначена собственному действию dload. <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-dc-dunemdb-supplier-online-movies.c066 · code · unknown; прошивка — · При DlState::ENABLED = false обработчик игнорирует control_id downloads, download_torrent, delete_torrent_data и show_in_folder, поэтому менеджер загрузок плагина выключен. <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-dc-dunemdb-supplier-online-movies.c097 · code · unknown; прошивка — · StorageHelper читает /tmp/run/storage_list.xml, пропускает хранилища с is_persistfs_capable=1 и считает основным только хранилище с mount_path /tmp/mnt/D. <a class="footnote-backref" href="#fnref:640" title="Jump back to footnote 640 in the text">↩</a></p> </li> <li id="fn:641"> <ul> <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.c053 · code · unknown; прошивка — · bin/rclone_mount.sh добавляет --read-only, если в каталоге данных нет файла autostart_write_mode.</li> <li>plg-hdtv-rclone.c105 · code · unknown; прошивка — · Значения по умолчанию для монтирования: кеш 32M, режим writes, размер части чтения 16M, буфер 32M, интервал опроса кеша 60 с.</li> <li>plg-hdtv-rclone.c099 · forum · unknown; прошивка — · В первом посте автор описывает кеш rclone: прочитанный файл сначала загружается в каталог кеша и хранится там 48 часов, а на время загрузки видео плеер не реагирует на пульт; кеш 32 МБ на системной флешке для видео не рекомендуется.</li> </ul> <p><a class="footnote-backref" href="#fnref:641" title="Jump back to footnote 641 in the text">↩</a></p> </li> <li id="fn:642"> <ul> <li>plg-hdtv-rclone.c043 · code · android; прошивка — · На android SmartConfig::remote_open открывает встроенный файловый браузер по internal_memory://<путь монтирования>.</li> <li>plg-hdtv-rclone.c044 · code · unknown; прошивка — · Вне android SmartConfig::remote_open использует префикс tmpfs для URL встроенного файлового браузера.</li> <li>plg-hdtv-rclone.c045 · code · unknown; прошивка — · remote_open отдаёт URL встроенного файлового браузера действием ActionFactory::launch_media_url.</li> <li>plg-hdtv-rclone.c095 · forum · Dune HD Pro 4K II, Dune HD Pro 4K Plus II, Dune HD Ultra Vision 4K, Dune HD Max Vision 4K, Dune HD Pro Vision 4K Solo, Dune HD Real Vision 4K, unknown; прошивка — · Автор темы указывает, что на плеерах Realtek RTD1619 после монтирования содержимое папки не появляется, но доступно через браузер сети → этот плеер → builtin_memory → папка подключения.</li> </ul> <p><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-dunemdb-supplier-online-movies.c039 · code · unknown; прошивка — · Код плагина использует файл /flashdata/ts/ts как TorrServer — запускает его с параметрами --port 8095 -k -d /flashdata/ts -l /tmp/run/ts.log и затем опрашивает HTTP-порт. <a class="footnote-backref" href="#fnref:643" title="Jump back to footnote 643 in the text">↩</a><a class="footnote-backref" href="#fnref2:643" title="Jump back to footnote 643 in the text">↩</a></p> </li> <li id="fn:644"> <p>plg-dc-dunemdb-supplier-online-movies.c038 · code · unknown; прошивка — · Пакетный bin/ts — ELF; в его строках есть исходник playback/rmmpegdemux/src/rmmpegdemux.c, библиотека librmmpegdemux.so и функции RMMPEGDemuxOpen/RMMPEGDemuxSendData, но нет строк HTTP или TorrServer. <a class="footnote-backref" href="#fnref:644" title="Jump back to footnote 644 in the text">↩</a><a class="footnote-backref" href="#fnref2:644" title="Jump back to footnote 644 in the text">↩</a></p> </li> <li id="fn:645"> <ul> <li>plg-dc-torrent-center.c123 · code · unknown; прошивка — · SmartVod сохраняет favorite_movies в plugin_cookies как строку идентификаторов, разделённых запятыми.</li> <li>plg-hdtv-moidom.c019 · code · unknown; прошивка — · Избранные фильмы хранятся в cookie favorite_movies как id через запятую; load_favorites догружает недостающие карточки, set_fav_movie_ids_to_cookies записывает список обратно.</li> <li>plg-hdtv-peerstv.c016 · code · unknown; прошивка — · Избранные фильмы хранятся в plugin_cookies в поле favorite_movies как список id через запятую; пустые элементы отбрасываются.</li> <li>plg-hdtv-pirates-radio.c048 · code · unknown; прошивка — · Избранные фильмы хранятся в cookie favorite_movies одной строкой id через запятую: если cookie задана, при чтении строка делится preg_split('/,/'), элементы без непробельных символов отбрасываются, при записи массив склеивается join(','), а при отсутствии cookie возвращается пустой массив.</li> <li>plg-hdtv-zlostnyi-iptv.c074 · code · unknown; прошивка — · Избранные фильмы bcu хранятся в cookie favorite_movies — id через запятую.</li> </ul> <p><a class="footnote-backref" href="#fnref:645" title="Jump back to footnote 645 in the text">↩</a></p> </li> <li id="fn:646"> <ul> <li>plg-hdtv-freetv.c028 · code · unknown; прошивка — · Избранные фильмы видеотеки хранятся через HD::get_items('favorite_movies') и HD::save_items('favorite_movies', $ids).</li> <li>plg-hdtv-smart-vod.c114 · code · unknown; прошивка — · Избранное HdKinoTeatr.Com читается и записывается через HD::get_items/save_items с именем favorite_movies, несмотря на имя методов с суффиксом from/to_cookies.</li> </ul> <p><a class="footnote-backref" href="#fnref:646" title="Jump back to footnote 646 in the text">↩</a></p> </li> <li id="fn:647"> <p>plg-dc-dunemdb-supplier-movies-rus.c023 · code · unknown; прошивка — · Плагин регистрируется старым путём: пишет описатель прямо в /tmp/movie_suppliers/movies_rus; элемента params/movie_suppliers в манифесте нет, файла bin/movie_suppliers_update.sh в пакете нет. <a class="footnote-backref" href="#fnref:647" title="Jump back to footnote 647 in the text">↩</a></p> </li> <li id="fn:648"> <p>plg-dc-globaltv--lib.c033 · code · android-dune-fw; прошивка 260827_0003_r24 · T::t1 в плагине непосредственно вставляет v1 в локальный ключ, а r24 предварительно применяет strip_param, который преобразует префиксы %tr% и %ext%. <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-globaltv--lib.c034 · code · android-dune-fw; прошивка 260827_0003_r24 · Для получения enabled-набора ListUtils плагина использует all_list/def_list/on_off/avoid_empty, а r24 — all_services/def_ids/on_idset/off_idset. <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-globaltv--lib.c035 · code · android-dune-fw; прошивка 260827_0003_r24 · Плагин при пустом enabled-наборе и avoid_empty возвращает def_idset; r24 get_enabled_idset удаляет off_idset из набора и возвращает результат без такого fallback. <a class="footnote-backref" href="#fnref:650" title="Jump back to footnote 650 in the text">↩</a></p> </li> <li id="fn:651"> <ul> <li>plg-gh-infinitygp-dune-jellyfin-bridge.c014 · code · android-dune-fw; прошивка — · launchDunePlayer копирует входящий Intent, задаёт компонент com.dunehd.app/com.dunehd.shell.PlayerProxyActivity и при наличии NFS-URL подменяет data, сохраняя mime type.</li> <li>plg-gh-infinitygp-dune-jellyfin-bridge.c016 · code · android-dune-fw; прошивка — · Приложение добавляет к интенту плеера extra com.dunehd.playback.dune_params со значением skip_resume_position:1; если extra уже непустой и не содержит этот параметр, значение дописывается через запятую, а повторно тот же параметр не добавляется.</li> </ul> <p><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.c022 · code · unknown; прошивка — · AbstractTv::get_tv_info() возвращает null. <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-101-ru.c106 · code · unknown; прошивка — · В копии DI lib/tv/abstract_tv.php get_tv_info реализован полностью: загружает каналы, собирает PluginTvChannel (id, caption, group_ids, icon_url, number, have_archive, is_protected, past/future_epg_days, archive_past_sec, archive_delay_sec, buffering_ms, timeshift_hours, playback_url_is_stream_url), PluginTvGroup и возвращает PluginTvInfo (show_group_channels_only, groups, channels, favorites_supported, favorites_icon_url, initial_channel_id/group_id/is_favorite, favorite_channel_ids, archive); в копии 101.ru метод возвращал null. <a class="footnote-backref" href="#fnref:653" title="Jump back to footnote 653 in the text">↩</a></p> </li> <li id="fn:654"> <ul> <li>plg-hdtv-altv.c022 · code · unknown; прошивка — · Время программ EPG разбирается как EEST, а к каждому пункту прибавляется cookie epg_shift (коррекция в секундах).</li> <li>plg-hdtv-pirates-radio.c041 · code · unknown; прошивка — · Для канала с числовым id < 1000 при разборе ответа vsetv.com время программ EPG считается как EEST, а к каждому элементу прибавляется cookie epg_shift (коррекция в секундах).</li> </ul> <p><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-dc-dunemdb-supplier-online-movies.c060 · code · unknown; прошивка — · do_ensure_own_torrserver создаёт /flashdata/ts; если /flashdata/ts/ts нет, на APK делает symlink на <install_dir>/bin/ts, а на не-APK возвращает false. При наличии ts выставляет 0755, запускает ts с --port 8095 -k -d /flashdata/ts -l /tmp/run/ts.log (на не-APK через /system/dunehd/dunehd_service do) и ждёт до 40 с по 0,4 с. <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-dc-dunemdb-supplier-movies-eng.c070 · inference · android-dune-fw; прошивка 260827_0003_r24 · В shell_ext r24 описатель плагина без playback_type, supported_video_types и play_action получает playback_type = stream, supported_video_types = video и play_action = '', то есть плагин участвует в поиске видео, а не трейлеров или дополнительных материалов. <a class="footnote-backref" href="#fnref:656" title="Jump back to footnote 656 in the text">↩</a></p> </li> <li id="fn:657"> <p>plg-dc-dunemdb-supplier-movies-rus.c057 · inference · unknown; прошивка — · Плагин пишет описатель прямо в /tmp/movie_suppliers и не пишет /tmp/movie_suppliers_changed.flag; на r24 оболочка перечитывает поставщиков по этому флагу, поэтому появление поставщика после boot_end не доказано. <a class="footnote-backref" href="#fnref:657" title="Jump back to footnote 657 in the text">↩</a></p> </li> <li id="fn:658"> <p>plg-dc-dunemdb-supplier-online-movies.c119 · inference · unknown; прошивка — · MovieTorrents::filter_all_torrents содержит безусловный return до кода фильтрации (после if ($this->movie->series_type) return; стоит ещё return;), поэтому фильтрация invalid-торрентов недостижима. <a class="footnote-backref" href="#fnref:658" title="Jump back to footnote 658 in the text">↩</a></p> </li> <li id="fn:659"> <p>plg-dc-dunemdb-supplier-movies-rus.c041 · inference · unknown; прошивка — · Поэтому для сериала, у которого на странице нет списка сезонов, а только один выбранный сезон, URL сезона пустой и эпизоды не собираются. <a class="footnote-backref" href="#fnref:659" title="Jump back to footnote 659 in the text">↩</a></p> </li> <li id="fn:660"> <p>plg-dc-globaltv--rows-epf.c061 · inference · unknown; прошивка — · Без PluginRowsPane::headers сообщение msg_search_empty, вероятно, не появится даже при отсутствии найденных каналов: rows уже содержит начальный VGAP. <a class="footnote-backref" href="#fnref:660" title="Jump back to footnote 660 in the text">↩</a></p> </li> <li id="fn:661"> <p>plg-gh-valerievitch-dune-plugin-acestreamsearch.c124 · inference · unknown; прошивка — · AceSearchTv::get_tv_stream_url вычисляет channel_id как substr(media_url, strpos(media_url, 'infohash=') + 9); если в media_url нет 'infohash=', strpos вернёт false и будет взята подстрока с 9-го символа, то есть неверный id. <a class="footnote-backref" href="#fnref:661" title="Jump back to footnote 661 in the text">↩</a></p> </li> <li id="fn:662"> <p>plg-hdtv-web-launchers.c040 · inference · unknown; прошивка — · vkmusic и moskva-fm запускают FlashLite-приложение через swf:// (vkmusic_ver…swf и moskva_fm_ver…swf); rtmp-player содержит SWF rtmp_player0_2…swf, но манифеста и swf://-действия у него нет. SDK указывает, что SMP87xx и Android не поддерживают FlashLite. <a class="footnote-backref" href="#fnref:662" title="Jump back to footnote 662 in the text">↩</a></p> </li> <li id="fn:663"> <p>plg-dc-screenshoter.c075 · inference, disputed · unknown; прошивка — · screenrecord сам останавливает запись через 180 секунд — поэтому плагин показывает обратный отсчёт от 180 <a class="footnote-backref" href="#fnref:663" title="Jump back to footnote 663 in the text">↩</a></p> </li> <li id="fn:664"> <p>plg-ds-dune-hd-tv.c046 · inference · unknown; прошивка — · receive5, вероятно, — локальный HTTP-ретранслятор потока: play.sh поднимает его на порту 18883, а плагин отдаёт плееру URL на localhost. <a class="footnote-backref" href="#fnref:664" title="Jump back to footnote 664 in the text">↩</a></p> </li> <li id="fn:665"> <p>plg-dune-remote-control.c078 · inference · unknown; прошивка — · Плагин сам не запускает воспроизведение и не управляет воспроизведением: он отдаёт каталог, избранное, сетевые папки и плейлисты, а просмотр и удалённый запуск воспроизведения выполняет мобильное приложение; конкретный механизм запуска в источнике не назван. <a class="footnote-backref" href="#fnref:665" title="Jump back to footnote 665 in the text">↩</a></p> </li> <li id="fn:666"> <p>plg-dune-remote-control.c032 · inference · unknown; прошивка — · Вероятно, put/append на устройстве не работают: код читает тело POST только из $HTTP_RAW_POST_DATA, а в php.ini рядом с php-cgi нет always_populate_raw_post_data и php://input нигде не используется — тогда разбирается пустой <empty> и возвращается operation_failed. <a class="footnote-backref" href="#fnref:666" title="Jump back to footnote 666 in the text">↩</a></p> </li> <li id="fn:667"> <p>plg-dune-remote-control.c072 · inference · unknown; прошивка — · Вероятно, через pls можно читать и перезаписывать любые файлы .m3u/.m3u8, доступные процессу CGI, а не только плейлисты плагина. <a class="footnote-backref" href="#fnref:667" title="Jump back to footnote 667 in the text">↩</a></p> </li> <li id="fn:668"> <p>plg-gh-mikhail-ilin-dune-plugin-weburgtv.c053 · inference · unknown; прошивка — · Если очередная строка #EXTINF не содержит tvg-id, tvg-logo или group-title, канал получит значения из предыдущей строки; для group_name это также влияет на проверку «Промо». <a class="footnote-backref" href="#fnref:668" title="Jump back to footnote 668 in the text">↩</a></p> </li> <li id="fn:669"> <p>plg-gh-mikhail-ilin-dune-plugin-weburgtv.c054 · inference · unknown; прошивка — · При совпадении tvg-id двух каналов HashedArray::put оставляет оба элемента в последовательности, но map указывает на последний: список покажет дубли, а get_channel вернёт последний. <a class="footnote-backref" href="#fnref:669" title="Jump back to footnote 669 in the text">↩</a></p> </li> <li id="fn:670"> <p>plg-gh-mikhail-ilin-dune-plugin-weburgtv.c062 · inference · unknown; прошивка — · При ошибке HTTP file_get_contents возвращает false, simplexml_load_string не даёт programme, и EPG за день будет пустым; обработки этой ошибки в ветке нет. <a class="footnote-backref" href="#fnref:670" title="Jump back to footnote 670 in the text">↩</a></p> </li> <li id="fn:671"> <p>plg-hdtv-megaradio.c052 · inference · unknown; прошивка — · В Smart_file_screen.php импорт m3u в my_playlist выполняется после цикла foreach по строкам файла и использует последние значения $line и $name, а не добавляет каждую станцию внутри цикла. <a class="footnote-backref" href="#fnref:671" title="Jump back to footnote 671 in the text">↩</a></p> </li> <li id="fn:672"> <p>plg-hdtv-pirates-radio.c034 · inference · unknown; прошивка — · Если M3U_ID_FILE_URL недоступен, а data/myiptv_channels_id в пакете нет, все каналы получают id >= 1000 и EPG для них не запрашивается. <a class="footnote-backref" href="#fnref:672" title="Jump back to footnote 672 in the text">↩</a></p> </li> <li id="fn:673"> <p>plg-hdtv-plugtv.c057 · inference · unknown; прошивка — · list.xml не задаёт number ни одному каналу, поэтому intval($xml_tv_channel->number) даёт 0 для всех четырёх каналов, и сортировка по get_number() не различает их. <a class="footnote-backref" href="#fnref:673" title="Jump back to footnote 673 in the text">↩</a></p> </li> <li id="fn:674"> <p>plg-hdtv-plugtv.c058 · inference · unknown; прошивка — · В блоке try/catch вокруг file_get_contents нет проверки результата: file_get_contents не бросает исключение при ошибке, поэтому при недоступном list.xml будет предупреждение PHP, а затем simplexml_load_string(false) и исключение «Illegal XML document». <a class="footnote-backref" href="#fnref:674" title="Jump back to footnote 674 in the text">↩</a></p> </li> <li id="fn:675"> <p>plg-hdtv-surface-family.c031 · inference · unknown; прошивка — · В Radiorecord.ru get_tv_playback_url() при archive_ts > 0 берёт URL из $this->arcUrl[$archive_ts], но этот массив заполняется только в недостижимом коде get_day_epg_iterator(), поэтому архивный трек не получит URL. <a class="footnote-backref" href="#fnref:675" title="Jump back to footnote 675 in the text">↩</a></p> </li> <li id="fn:676"> <p>plg-hdtv-surface-family.c110 · inference · unknown; прошивка — · Cookie epg_shift, сохраняемый диалогом LSS, при построении EPG не читается: в get_day_epg_iterator() строка с $epg_shift и её использование закомментированы, а в handle_user_input() значение читается только как начальное для combobox, поэтому коррекция программы не влияет на выдаваемый EPG. <a class="footnote-backref" href="#fnref:676" title="Jump back to footnote 676 in the text">↩</a></p> </li> <li id="fn:677"> <p>plg-hdtv-liteiptv.c170 · inference · unknown; прошивка — · Ветки export_data и import_data файлового экрана myEPGserver вызывают HD::pCopyFolders, но в lib/utils.php этой копии такого метода нет; из интерфейса плагина эти ветки не открываются — setup передаёт только save_data = jsonsPath, а экран каналов — save_file action = select_file. <a class="footnote-backref" href="#fnref:677" title="Jump back to footnote 677 in the text">↩</a></p> </li> <li id="fn:678"> <p>plg-hdtv-zlostnyi-iptv.c054 · inference · unknown; прошивка — · В формате даты EPG-окна стоит «H:m:s» (m — месяц, а не минуты), поэтому границы окна сдвинуты на номер месяца в минутах. <a class="footnote-backref" href="#fnref:678" title="Jump back to footnote 678 in the text">↩</a></p> </li> <li id="fn:679"> <p>plg-dc-dunemdb-supplier-online-movies.c040 · inference · unknown; прошивка — · Пакетный bin/ts по содержимому не является TorrServer, поэтому запуск TorrServer из него на APK, вероятно, не работает; проверка — запуск на устройстве и HTTP-запрос к порту 8095. <a class="footnote-backref" href="#fnref:679" title="Jump back to footnote 679 in the text">↩</a></p> </li> <li id="fn:680"> <p>plg-dc-dunemdb-supplier-online-movies.c124 · inference · unknown; прошивка — · Класс DownloadsScreen и файл downloads_screen.php присутствуют, но экран недоступен: DlState выключен, обработчик downloads игнорируется, а entry_point downloads закомментирован в манифесте. <a class="footnote-backref" href="#fnref:680" title="Jump back to footnote 680 in the text">↩</a></p> </li> <li id="fn:681"> <p>plg-hdtv-megatorrents.c093 · inference · unknown; прошивка — · acestream_action проверяет только check === true, поэтому при неудачном запуске (возврат строки acestream_ip) поток продолжается к получению content_id без сообщения о незапущенном движке. <a class="footnote-backref" href="#fnref:681" title="Jump back to footnote 681 in the text">↩</a></p> </li> <li id="fn:682"> <p>plg-hdtv-rclone.c109 · inference · unknown; прошивка — · Плагин сам не вызывает воспроизведение: единственный путь к смонтированным файлам — открыть каталог встроенным файловым браузером (ActionFactory::launch_media_url с embedded_app://{name=file_browser}); действий vod_play или иного плеера в пакете нет. <a class="footnote-backref" href="#fnref:682" title="Jump back to footnote 682 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>