ServiceFork Tizen
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 — нельзя использовать как имя плагина.
Быстрый старт: свой плагин
- В проекте Tizen Studio (например
workspace/Forkbrowser/service/plugins/) скопируйте шаблон_template.js→myparser.js(файлы с префиксом_не загружаются). - Задайте в начале файла объект
PLUGIN:id,name,version, навигациюnav[]. - Экспортируйте функцию
module.exports = function (api) { return { ... }; }с полями:name,versionhome(base)— плитка на стартовом экране (черезapi.homeTile)routes— обработчики путей:(главная),search,listи т.д.
- Соберите и установите .wgt на TV. Плагин будет доступен:
http://127.0.0.1:8092/myparser - В 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: '...' })— попадает в глобальный тег FXMLcss. - Шаблоны кнопок/карточек — через
api.htmlChannel({ template: '...', before: '...' }), плейсхолдеры$title,$logo_30x30(как в §6 FXML).
Отладка
- На TV откройте в Fork:
http://127.0.0.1:8092/status— список плагинов и версия ServiceFork. http://127.0.0.1:8092/logs— логи (уровни error/warn/info/debug).- Ошибки загрузки плагина пишутся в log с префиксом
[pluginId]. - Логи также уходят в 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).