ServiceFork Tizen
На Samsung Tizen Fork browser запускает фоновый HTTP-сервис ServiceFork (порт 8092): в нём Node.js парсит сайты и отдаёт страницы в формате FXML (JSON) с http://127.0.0.1:8092/ — без PHP на хостинге.
Каждый файл-плагин в service/plugins/ — отдельный локальный парсер. Если задана функция home(), плитка парсера появляется на домашней странице Fork browser в секции Локально.
См. также: Спецификация FXML · Репозиторий Fork browser
Назначение
- Локальные парсеры — каталоги, поиск, просмотр: логика выполняется на TV в Tizen background service (Node.js).
- Ответ — тот же JSON, что у веб-портала:
title,channels[], глобальные поля (css,typeList,icon…) — см. модель FXML. - Один файл
service/plugins/<id>.js= один парсер с URLhttp://127.0.0.1:8092/<id>.
Домашняя страница: секция «Локально»
При старте Fork browser (Tizen) запрашивает http://127.0.0.1:8092/status. ServiceFork собирает массив services из функций home() всех загруженных плагинов (homeServices в service/index.js) и отдаёт плитки в формате FXML-channel (source: service, playlist_url, иконка, меню).
Клиент добавляет эти плитки в блок ch.service стартовой страницы — в интерфейсе это секция Локально (рядом с USB, играми и другими локальными пунктами).
Важно: без home() парсер доступен только по прямому URL (/<id> или ссылка playlist_url в другом портале), на домашний экран он не попадёт.
Архитектура
| Компонент | Описание |
|---|---|
service/index.js |
Ядро ServiceFork: HTTP 8092, загрузка плагинов, createApi, маршрутизация, /status → services.
|
service/plugins/<id>.js |
Модуль парсера: routes (страницы FXML), опционально home() (плитка «Локально»), matchUrl / handleUrl для перехвата внешних ссылок.
|
| Fork browser (UI) | Открывает playlist_url плитки или любой http://127.0.0.1:8092/… и рисует JSON как обычную FXML-страницу.
|
Tizen: background service приложения (config.xml, пакет <packageId>.servicefork), точки входа onStart / onRequest в service/index.js.
Служебные URL:
| Путь | Ответ |
|---|---|
/status |
JSON: ok, версия, список плагинов, services — плитки для секции «Локально»
|
/, /plugins |
Список парсеров (FXML или JSON) |
/logs |
Логи service (FXML-страница) |
Зарезервированные id: status, plugins, logs.
Быстрый старт: свой парсер
- В Tizen Studio (
workspace/Forkbrowser/service/plugins/) скопируйте_template.js→myparser.js(файлы с_в начале имени не загружаются). - Опишите парсер:
name,version, маршруты вroutes(— главная,search,list…). - Реализуйте
home(base)и вернитеapi.homeTile({…})— так парсер появится в Локально после установки .wgt. - Соберите виджет и установите на TV. Парсер:
http://127.0.0.1:8092/myparser - Иконка: положите
service/plugins/myparser.pngрядом с .js — подставится в плитку.
Минимальный каркас:
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')
]));
}
}
};
};
При необходимости парсер можно вызывать и с удалённого портала — укажите в JSON "playlist_url": "http://127.0.0.1:8092/myparser" (актуально только на устройстве, где запущен ServiceFork).
API ядра (кратко)
Плагин получает объект api из createApi (service/index.js).
| Метод | Назначение |
|---|---|
api.page(title, channels, extra) |
FXML-страница (css, typeList, icon в extra)
|
api.folder(title, url, opts) |
Элемент с playlist_url
|
api.stream(title, url, opts) |
Элемент с stream_url, опционально parser
|
api.htmlChannel(cfg) |
Channel с position: html, шаблон, меню, поиск
|
api.homeTile(cfg) |
Плитка для секции «Локально» (source: service)
|
api.cardChannels(items, base, opts) |
Сетка карточек |
api.getText / api.getTextCached |
HTTP GET HTML |
api.pluginUrl(base, id, route, params) |
URL маршрута парсера |
api.log.info / warn / error |
Логи → /logs и UI Fork
|
Маршруты: ключ — путь после /<pluginId>/; обработчик (ctx, cb), cb(err, fxmlObject).
Внешние ссылки: matchUrl + handleUrl — перехват полного http(s)://… в адресной строке Fork (см. rezka.js, kinogo.js).
Иконки и оформление
service/plugins/<id>.png(или .jpg) →http://127.0.0.1:8092/<id>.png- CSS страницы:
api.page(..., { css: '...' }) - Шаблоны карточек:
api.htmlChannel({ template: '...' })— плейсхолдеры как в §6 FXML
Отладка
http://127.0.0.1:8092/status— версия, список плагинов, массивservices(то, что уходит в «Локально»).http://127.0.0.1:8092/logs— логи; ошибки плагина с префиксом[pluginId].- В Fork логи service также приходят через MessagePort (
servicefork-log).
Связь с FXML
| PHP-портал | ServiceFork (Tizen) |
|---|---|
$_PL / $_CH |
api.page()
|
json_encode |
sendJson в HTTP-ответе
|
| Ссылки на свой домен | api.pluginUrl → 127.0.0.1:8092
|
Для пользователя JSON выглядит одинаково; разница только в том, что парсер крутится локально на TV.
Примеры в проекте
service/plugins/_template.js— шаблон парсера сhome()иroutesservice/plugins/rezka.js,kinogo.js— полные парсеры (меню, поиск,matchUrl)
Установка приложения с ServiceFork
Сборка .wgt и установка на Samsung Tizen — инструкции по установке (Apps2Tizen, ForkTizenInstall).