<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://wiki.forkbrowser.top/w/index.php?action=history&amp;feed=atom&amp;title=ServiceFork_Tizen</id>
	<title>ServiceFork Tizen - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.forkbrowser.top/w/index.php?action=history&amp;feed=atom&amp;title=ServiceFork_Tizen"/>
	<link rel="alternate" type="text/html" href="https://wiki.forkbrowser.top/w/index.php?title=ServiceFork_Tizen&amp;action=history"/>
	<updated>2026-11-08T06:16:25Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>https://wiki.forkbrowser.top/w/index.php?title=ServiceFork_Tizen&amp;diff=2052&amp;oldid=prev</id>
		<title>Mentos: FXML all_*: channel overrides global</title>
		<link rel="alternate" type="text/html" href="https://wiki.forkbrowser.top/w/index.php?title=ServiceFork_Tizen&amp;diff=2052&amp;oldid=prev"/>
		<updated>2026-10-28T21:24:15Z</updated>

		<summary type="html">&lt;p&gt;FXML all_*: channel overrides global&lt;/p&gt;
&lt;a href=&quot;https://wiki.forkbrowser.top/w/index.php?title=ServiceFork_Tizen&amp;amp;diff=2052&amp;amp;oldid=2050&quot;&gt;Внесённые изменения&lt;/a&gt;</summary>
		<author><name>Mentos</name></author>
	</entry>
	<entry>
		<id>https://wiki.forkbrowser.top/w/index.php?title=ServiceFork_Tizen&amp;diff=2050&amp;oldid=prev</id>
		<title>Mentos: FXML all_*: channel overrides global</title>
		<link rel="alternate" type="text/html" href="https://wiki.forkbrowser.top/w/index.php?title=ServiceFork_Tizen&amp;diff=2050&amp;oldid=prev"/>
		<updated>2026-10-28T12:02:18Z</updated>

		<summary type="html">&lt;p&gt;FXML all_*: channel overrides global&lt;/p&gt;
&lt;a href=&quot;https://wiki.forkbrowser.top/w/index.php?title=ServiceFork_Tizen&amp;amp;diff=2050&amp;amp;oldid=2048&quot;&gt;Внесённые изменения&lt;/a&gt;</summary>
		<author><name>Mentos</name></author>
	</entry>
	<entry>
		<id>https://wiki.forkbrowser.top/w/index.php?title=ServiceFork_Tizen&amp;diff=2048&amp;oldid=prev</id>
		<title>Mentos: FXML all_*: channel overrides global</title>
		<link rel="alternate" type="text/html" href="https://wiki.forkbrowser.top/w/index.php?title=ServiceFork_Tizen&amp;diff=2048&amp;oldid=prev"/>
		<updated>2026-10-28T11:52:12Z</updated>

		<summary type="html">&lt;p&gt;FXML all_*: channel overrides global&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{DISPLAYTITLE:ServiceFork — плагины Tizen}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours&amp;quot; style=&amp;quot;width:100%; max-width:920px; padding:12px 16px; line-height:1.55;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;ServiceFork&amp;#039;&amp;#039;&amp;#039; — фоновый HTTP-сервис в приложении Fork browser на &amp;lt;b&amp;gt;Samsung Tizen&amp;lt;/b&amp;gt;. Отдаёт страницы в формате &amp;#039;&amp;#039;&amp;#039;FXML (JSON)&amp;#039;&amp;#039;&amp;#039; с локального адреса &amp;lt;code&amp;gt;http://127.0.0.1:8092/&amp;lt;/code&amp;gt;, без отдельного PHP-сервера.&lt;br /&gt;
&lt;br /&gt;
См. также: [[FXML|Спецификация FXML]] · [https://appfxml.com/ Репозиторий Fork browser]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Назначение ==&lt;br /&gt;
&lt;br /&gt;
* Парсеры сайтов, каталоги и утилиты, работающие &amp;#039;&amp;#039;&amp;#039;на TV&amp;#039;&amp;#039;&amp;#039; (Node.js в Tizen service).&lt;br /&gt;
* Тот же контракт, что у веб-портала: объект с &amp;lt;code&amp;gt;title&amp;lt;/code&amp;gt;, массив &amp;lt;code&amp;gt;channels[]&amp;lt;/code&amp;gt;, глобальные поля (&amp;lt;code&amp;gt;css&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;typeList&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;icon&amp;lt;/code&amp;gt; и др.) — см. [[FXML#3. Термины и модель данных|модель FXML]].&lt;br /&gt;
* Плагины подключаются файлами в каталоге &amp;lt;code&amp;gt;service/plugins/&amp;lt;/code&amp;gt; проекта Tizen (в пакете приложения).&lt;br /&gt;
&lt;br /&gt;
== Архитектура ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
! Компонент !! Описание&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;service/index.js&amp;lt;/code&amp;gt; || Ядро ServiceFork: HTTP на порту &amp;#039;&amp;#039;&amp;#039;8092&amp;#039;&amp;#039;&amp;#039;, загрузка плагинов, общий API (&amp;lt;code&amp;gt;api.page&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;api.htmlChannel&amp;lt;/code&amp;gt;, HTTP-запросы, кеш).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;service/plugins/&amp;amp;lt;id&amp;amp;gt;.js&amp;lt;/code&amp;gt; || Один плагин = один модуль. Имя файла (без &amp;lt;code&amp;gt;.js&amp;lt;/code&amp;gt;) = URL-путь: &amp;lt;code&amp;gt;/&amp;amp;lt;id&amp;amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Fork browser (UI) || Запрашивает &amp;lt;code&amp;gt;playlist_url&amp;lt;/code&amp;gt; вида &amp;lt;code&amp;gt;http://127.0.0.1:8092/rezka/...&amp;lt;/code&amp;gt; и отображает JSON как обычную FXML-страницу.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Запуск сервиса (Tizen):&amp;#039;&amp;#039;&amp;#039; background service приложения, операция &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt;, пакет вида &amp;lt;code&amp;gt;&amp;amp;lt;packageId&amp;amp;gt;.servicefork&amp;lt;/code&amp;gt; (см. &amp;lt;code&amp;gt;config.xml&amp;lt;/code&amp;gt; виджета). При старте вызываются &amp;lt;code&amp;gt;onStart&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;onRequest&amp;lt;/code&amp;gt; из &amp;lt;code&amp;gt;service/index.js&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Служебные URL:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Путь !! Ответ&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; || Список загруженных плагинов&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;/status&amp;lt;/code&amp;gt; || JSON: версия, список плагинов, плитки для стартового меню&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;/plugins&amp;lt;/code&amp;gt; || FXML-страница со списком плагинов&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;/logs&amp;lt;/code&amp;gt; || Просмотр логов service (FXML-страница)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Зарезервированные id: &amp;lt;code&amp;gt;status&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;plugins&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;logs&amp;lt;/code&amp;gt; — нельзя использовать как имя плагина.&lt;br /&gt;
&lt;br /&gt;
== Быстрый старт: свой плагин ==&lt;br /&gt;
&lt;br /&gt;
# В проекте Tizen Studio (например &amp;lt;code&amp;gt;workspace/Forkbrowser/service/plugins/&amp;lt;/code&amp;gt;) скопируйте шаблон &amp;lt;code&amp;gt;_template.js&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;myparser.js&amp;lt;/code&amp;gt; (файлы с префиксом &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt; &amp;#039;&amp;#039;&amp;#039;не&amp;#039;&amp;#039;&amp;#039; загружаются).&lt;br /&gt;
# Задайте в начале файла объект &amp;lt;code&amp;gt;PLUGIN&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;, навигацию &amp;lt;code&amp;gt;nav[]&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Экспортируйте функцию &amp;lt;code&amp;gt;module.exports = function (api) { return { ... }; }&amp;lt;/code&amp;gt; с полями:&lt;br /&gt;
#* &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt;&lt;br /&gt;
#* &amp;lt;code&amp;gt;home(base)&amp;lt;/code&amp;gt; — плитка на стартовом экране (через &amp;lt;code&amp;gt;api.homeTile&amp;lt;/code&amp;gt;)&lt;br /&gt;
#* &amp;lt;code&amp;gt;routes&amp;lt;/code&amp;gt; — обработчики путей: &amp;lt;code&amp;gt;&amp;#039;&amp;#039;&amp;lt;/code&amp;gt; (главная), &amp;lt;code&amp;gt;search&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;list&amp;lt;/code&amp;gt; и т.д.&lt;br /&gt;
# Соберите и установите .wgt на TV. Плагин будет доступен: &amp;lt;code&amp;gt;http://127.0.0.1:8092/myparser&amp;lt;/code&amp;gt;&lt;br /&gt;
# В FXML укажите, например: &amp;lt;code&amp;gt;&amp;quot;playlist_url&amp;quot;: &amp;quot;http://127.0.0.1:8092/myparser&amp;quot;&amp;lt;/code&amp;gt; или добавьте плитку через &amp;lt;code&amp;gt;/status&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;services&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Минимальный каркас (упрощённо):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;module.exports = function (api) {&lt;br /&gt;
  var id = &amp;#039;myparser&amp;#039;;&lt;br /&gt;
  return {&lt;br /&gt;
    name: &amp;#039;My Parser&amp;#039;,&lt;br /&gt;
    version: &amp;#039;1.0.0&amp;#039;,&lt;br /&gt;
    home: function (base) {&lt;br /&gt;
      return api.homeTile({&lt;br /&gt;
        id: id,&lt;br /&gt;
        base: base,&lt;br /&gt;
        title: &amp;#039;My Parser&amp;#039;,&lt;br /&gt;
        playlist_url: api.pluginUrl(base, id)&lt;br /&gt;
      });&lt;br /&gt;
    },&lt;br /&gt;
    routes: {&lt;br /&gt;
      &amp;#039;&amp;#039;: function (ctx, cb) {&lt;br /&gt;
        cb(null, api.page(&amp;#039;My Parser&amp;#039;, [&lt;br /&gt;
          api.folder(&amp;#039;Раздел&amp;#039;, api.pluginUrl(ctx.base, id, &amp;#039;list&amp;#039;))&lt;br /&gt;
        ]));&lt;br /&gt;
      },&lt;br /&gt;
      list: function (ctx, cb) {&lt;br /&gt;
        cb(null, api.page(&amp;#039;Список&amp;#039;, [&lt;br /&gt;
          api.stream(&amp;#039;Пример&amp;#039;, &amp;#039;http://example.com/video.m3u8&amp;#039;)&lt;br /&gt;
        ]));&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  };&lt;br /&gt;
};&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== API ядра (кратко) ==&lt;br /&gt;
&lt;br /&gt;
Плагин получает объект &amp;lt;code&amp;gt;api&amp;lt;/code&amp;gt; из &amp;lt;code&amp;gt;createApi&amp;lt;/code&amp;gt; в &amp;lt;code&amp;gt;service/index.js&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Метод !! Назначение&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;api.page(title, channels, extra)&amp;lt;/code&amp;gt; || Готовая FXML-страница (&amp;lt;code&amp;gt;extra&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;css&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;typeList&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;icon&amp;lt;/code&amp;gt;)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;api.folder(title, url, opts)&amp;lt;/code&amp;gt; || Элемент с &amp;lt;code&amp;gt;playlist_url&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;api.stream(title, url, opts)&amp;lt;/code&amp;gt; || Элемент с &amp;lt;code&amp;gt;stream_url&amp;lt;/code&amp;gt;, опционально &amp;lt;code&amp;gt;parser&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;api.htmlChannel(cfg)&amp;lt;/code&amp;gt; || Channel с &amp;lt;code&amp;gt;position: html&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;template&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;menu&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;search_on&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;api.homeTile(cfg)&amp;lt;/code&amp;gt; || Плитка для стартового меню Tizen&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;api.cardChannels(items, base, opts)&amp;lt;/code&amp;gt; || Сетка карточек с шаблоном&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;api.getText / api.getTextCached&amp;lt;/code&amp;gt; || HTTP GET HTML (User-Agent, редиректы, таймаут)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;api.pluginUrl(base, id, route, params)&amp;lt;/code&amp;gt; || Ссылка на свой или чужой маршрут плагина&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;api.linkTo(base, path, params)&amp;lt;/code&amp;gt; || Query-string для внутренних URL&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;api.log.info / warn / error&amp;lt;/code&amp;gt; || Логи → консоль, буфер, &amp;lt;code&amp;gt;/logs&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Маршруты (&amp;lt;code&amp;gt;routes&amp;lt;/code&amp;gt;):&amp;#039;&amp;#039;&amp;#039; ключ — путь после &amp;lt;code&amp;gt;/&amp;amp;lt;pluginId&amp;amp;gt;/&amp;lt;/code&amp;gt; (пустая строка = корень). Обработчик &amp;lt;code&amp;gt;function (ctx, cb)&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;ctx.q&amp;lt;/code&amp;gt; — GET-параметры, &amp;lt;code&amp;gt;ctx.base&amp;lt;/code&amp;gt; — &amp;lt;code&amp;gt;http://127.0.0.1:8092&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;cb(err, fxmlObject)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Прямые URL в адресной строке Fork:&amp;#039;&amp;#039;&amp;#039; если &amp;lt;code&amp;gt;playlist_url&amp;lt;/code&amp;gt; — полный &amp;lt;code&amp;gt;http(s)://...&amp;lt;/code&amp;gt;, ServiceFork может перехватить запрос через &amp;lt;code&amp;gt;matchUrl&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;handleUrl&amp;lt;/code&amp;gt; (см. плагины rezka, kinogo).&lt;br /&gt;
&lt;br /&gt;
== Иконки и оформление ==&lt;br /&gt;
&lt;br /&gt;
* Положите &amp;lt;code&amp;gt;service/plugins/&amp;amp;lt;id&amp;amp;gt;.png&amp;lt;/code&amp;gt; (или .jpg) — ядро отдаст &amp;lt;code&amp;gt;http://127.0.0.1:8092/&amp;amp;lt;id&amp;amp;gt;.png&amp;lt;/code&amp;gt; и подставит в плитку.&lt;br /&gt;
* CSS страницы: передайте в &amp;lt;code&amp;gt;api.page(..., { css: &amp;#039;...&amp;#039; })&amp;lt;/code&amp;gt; — попадает в глобальный тег FXML &amp;lt;code&amp;gt;css&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Шаблоны кнопок/карточек — через &amp;lt;code&amp;gt;api.htmlChannel({ template: &amp;#039;...&amp;#039;, before: &amp;#039;...&amp;#039; })&amp;lt;/code&amp;gt;, плейсхолдеры &amp;lt;code&amp;gt;$title&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;$logo_30x30&amp;lt;/code&amp;gt; (как в [[FXML#6. Оформление и вёрстка элементов|§6 FXML]]).&lt;br /&gt;
&lt;br /&gt;
== Отладка ==&lt;br /&gt;
&lt;br /&gt;
# На TV откройте в Fork: &amp;lt;code&amp;gt;http://127.0.0.1:8092/status&amp;lt;/code&amp;gt; — список плагинов и версия ServiceFork.&lt;br /&gt;
# &amp;lt;code&amp;gt;http://127.0.0.1:8092/logs&amp;lt;/code&amp;gt; — логи (уровни error/warn/info/debug).&lt;br /&gt;
# Ошибки загрузки плагина пишутся в log с префиксом &amp;lt;code&amp;gt;[pluginId]&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Логи также уходят в UI Fork через MessagePort (&amp;lt;code&amp;gt;servicefork-log&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
== Связь с FXML ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! На сервере (PHP) !! ServiceFork (Tizen)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;$_PL&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;$_CH&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;api.page()&amp;lt;/code&amp;gt; / объекты channel&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;json_encode($_PL)&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;sendJson(res, body)&amp;lt;/code&amp;gt; в HTTP-ответе&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;playlist_url&amp;lt;/code&amp;gt; на свой домен || &amp;lt;code&amp;gt;api.pluginUrl(...)&amp;lt;/code&amp;gt; → localhost:8092&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Пользователь не видит разницы: Fork парсит JSON одинаково. Для гибридных сценариев портал может отдавать ссылки на &amp;lt;code&amp;gt;http://127.0.0.1:8092/...&amp;lt;/code&amp;gt; только на Tizen (по &amp;lt;code&amp;gt;box_client&amp;lt;/code&amp;gt; в GET — см. [[FXML#7.1. Параметры GET от клиента|§7.1 FXML]]).&lt;br /&gt;
&lt;br /&gt;
== Примеры в проекте ==&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;service/plugins/_template.js&amp;lt;/code&amp;gt; — шаблон нового плагина&lt;br /&gt;
* &amp;lt;code&amp;gt;service/plugins/rezka.js&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;kinogo.js&amp;lt;/code&amp;gt; — полноценные парсеры с маршрутами, меню, поиском&lt;br /&gt;
&lt;br /&gt;
== Установка приложения с ServiceFork ==&lt;br /&gt;
&lt;br /&gt;
Сборка виджета и установка на Samsung Tizen — [[Браузер Fork - Wiki:Установить браузер Fork#Samsung Smart TV|инструкции по установке]] ([https://appfxml.com/ Apps2Tizen], ForkTizenInstall, .wgt).&lt;br /&gt;
&lt;br /&gt;
[[Category:FXML]]&lt;br /&gt;
&lt;/div&gt;</summary>
		<author><name>Mentos</name></author>
	</entry>
</feed>