ServiceFork Tizen

Материал из Браузер Fork - Wiki
Версия от 13:52, 28 октября 2026; Mentos (обсуждение | вклад) (FXML all_*: channel overrides global)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)
Перейти к навигации Перейти к поиску


ServiceFork — фоновый HTTP-сервис в приложении Fork browser на Samsung Tizen. Отдаёт страницы в формате FXML (JSON) с локального адреса http://127.0.0.1:8092/, без отдельного PHP-сервера.

См. также: Спецификация FXML · Репозиторий Fork browser

Назначение

  • Парсеры сайтов, каталоги и утилиты, работающие на TV (Node.js в Tizen service).
  • Тот же контракт, что у веб-портала: объект с title, массив channels[], глобальные поля (css, typeList, icon и др.) — см. модель FXML.
  • Плагины подключаются файлами в каталоге service/plugins/ проекта Tizen (в пакете приложения).

Архитектура

Компонент Описание
service/index.js Ядро ServiceFork: HTTP на порту 8092, загрузка плагинов, общий API (api.page, api.htmlChannel, HTTP-запросы, кеш).
service/plugins/<id>.js Один плагин = один модуль. Имя файла (без .js) = URL-путь: /<id>.
Fork browser (UI) Запрашивает playlist_url вида http://127.0.0.1:8092/rezka/... и отображает JSON как обычную FXML-страницу.

Запуск сервиса (Tizen): background service приложения, операция service, пакет вида <packageId>.servicefork (см. config.xml виджета). При старте вызываются onStart / onRequest из service/index.js.

Служебные URL:

Путь Ответ
/ Список загруженных плагинов
/status JSON: версия, список плагинов, плитки для стартового меню
/plugins FXML-страница со списком плагинов
/logs Просмотр логов service (FXML-страница)

Зарезервированные id: status, plugins, logs — нельзя использовать как имя плагина.

Быстрый старт: свой плагин

  1. В проекте Tizen Studio (например workspace/Forkbrowser/service/plugins/) скопируйте шаблон _template.js → myparser.js (файлы с префиксом _ не загружаются).
  2. Задайте в начале файла объект PLUGIN: id, name, version, навигацию nav[].
  3. Экспортируйте функцию module.exports = function (api) { return { ... }; } с полями:
    • name, version
    • home(base) — плитка на стартовом экране (через api.homeTile)
    • routes — обработчики путей: (главная), search, list и т.д.
  4. Соберите и установите .wgt на TV. Плагин будет доступен: http://127.0.0.1:8092/myparser
  5. В FXML укажите, например: "playlist_url": "http://127.0.0.1:8092/myparser" или добавьте плитку через /status → services.

Минимальный каркас (упрощённо):

module.exports = function (api) {
  var id = 'myparser';
  return {
    name: 'My Parser',
    version: '1.0.0',
    home: function (base) {
      return api.homeTile({
        id: id,
        base: base,
        title: 'My Parser',
        playlist_url: api.pluginUrl(base, id)
      });
    },
    routes: {
      '': function (ctx, cb) {
        cb(null, api.page('My Parser', [
          api.folder('Раздел', api.pluginUrl(ctx.base, id, 'list'))
        ]));
      },
      list: function (ctx, cb) {
        cb(null, api.page('Список', [
          api.stream('Пример', 'http://example.com/video.m3u8')
        ]));
      }
    }
  };
};

API ядра (кратко)

Плагин получает объект api из createApi в service/index.js.

Метод Назначение
api.page(title, channels, extra) Готовая FXML-страница (extra: css, typeList, icon)
api.folder(title, url, opts) Элемент с playlist_url
api.stream(title, url, opts) Элемент с stream_url, опционально parser
api.htmlChannel(cfg) Channel с position: html, template, menu, search_on
api.homeTile(cfg) Плитка для стартового меню Tizen
api.cardChannels(items, base, opts) Сетка карточек с шаблоном
api.getText / api.getTextCached HTTP GET HTML (User-Agent, редиректы, таймаут)
api.pluginUrl(base, id, route, params) Ссылка на свой или чужой маршрут плагина
api.linkTo(base, path, params) Query-string для внутренних URL
api.log.info / warn / error Логи → консоль, буфер, /logs

Маршруты (routes): ключ — путь после /<pluginId>/ (пустая строка = корень). Обработчик function (ctx, cb): ctx.q — GET-параметры, ctx.base — http://127.0.0.1:8092, cb(err, fxmlObject).

Прямые URL в адресной строке Fork: если playlist_url — полный http(s)://..., ServiceFork может перехватить запрос через matchUrl + handleUrl (см. плагины rezka, kinogo).

Иконки и оформление

  • Положите service/plugins/<id>.png (или .jpg) — ядро отдаст http://127.0.0.1:8092/<id>.png и подставит в плитку.
  • CSS страницы: передайте в api.page(..., { css: '...' }) — попадает в глобальный тег FXML css.
  • Шаблоны кнопок/карточек — через api.htmlChannel({ template: '...', before: '...' }), плейсхолдеры $title, $logo_30x30 (как в §6 FXML).

Отладка

  1. На TV откройте в Fork: http://127.0.0.1:8092/status — список плагинов и версия ServiceFork.
  2. http://127.0.0.1:8092/logs — логи (уровни error/warn/info/debug).
  3. Ошибки загрузки плагина пишутся в log с префиксом [pluginId].
  4. Логи также уходят в UI Fork через MessagePort (servicefork-log).

Связь с FXML

На сервере (PHP) ServiceFork (Tizen)
$_PL / $_CH api.page() / объекты channel
json_encode($_PL) sendJson(res, body) в HTTP-ответе
playlist_url на свой домен api.pluginUrl(...) → localhost:8092

Пользователь не видит разницы: Fork парсит JSON одинаково. Для гибридных сценариев портал может отдавать ссылки на http://127.0.0.1:8092/... только на Tizen (по box_client в GET — см. §7.1 FXML).

Примеры в проекте

  • service/plugins/_template.js — шаблон нового плагина
  • service/plugins/rezka.js, kinogo.js — полноценные парсеры с маршрутами, меню, поиском

Установка приложения с ServiceFork

Сборка виджета и установка на Samsung Tizen — инструкции по установке (Apps2Tizen, ForkTizenInstall, .wgt).