среда, 1 мая 2019 г.

Обновил конвертер JTV в XMLTV

Несколько лет назад интернет-провайдер, который первым в нашем доме предложил интернет через Ethernet, предоставлял программу передач для IPTV только в формате JTV.
Формат JTV появился в одноименной программе польского разработчика Ярослава Ковальского для ТВ-тюнеров на базе чипов bt8x8. Это двоичный формат, база телепрограмм JTV обычно является архивом ZIP или RAR, содержащим пары файлов (с расширением NDX и PDT) для каждого телеканала.
Программа передач в формате XMLTV тогда провайдером не предоставлялась и собирать EPG из разных источников было проблемой. Я поискал в интернете и не найдя готового конвертера из JTV в XMLTV написал свой.

Спустя три года я подтянул свои знания в Python и решил в качестве практического упражнения обновить утилиту. Несколько часов ушло на рефакторинг кода и добавление тестов. Благодаря одному из них я нашел ошибку, которую не замечал несколько лет - в результирующем XML отстутствовала самая последняя передача.

Добавил tox для запуска проверок в изолированных окружениях. Последним штрихом реализовал поддержку python 3.x, которая стоила мне нескольких часов отладки проблем с кодировками в zipfile. Согласно .ZIP File Format Specification (Appendix D) при кодировании имен файлов допускается использовать cp437 либо UTF-8, но многие реализации zip отступают от стандарта и используют другие кодировки. В частности русскоязычная Windows использует cp866 для имен файлов содержащих кириллицу. А поскольку в JTV имя файла задает название канала, то важно правильно декодировать его.

В итоге я добавил поддержку python 3.x, тесты и пакет для Debian/Ubuntu. Пакет jtv2xmltv версии 0.1.1 для Debian/Ubuntu можно скачать из моего репозитария или с GitHub.

14 комментариев:

  1. Уже обрадовался, что нашел простой конвертер, но jtv от моего провайдера оказался не по зубам и конвертер в итоге не дал результат, выдав ошибку об неверном формате.

    ОтветитьУдалить
    Ответы
    1. А можно увидеть ссылку на файл с неверным форматом? Мне уже репортили похожую проблему (https://github.com/tataranovich/jtv2xmltv/issues/4) и там действительно кривой исходный файл оказался.

      Удалить
  2. Это конкретно, который не смог конвертировать
    https://drive.google.com/open?id=13R6DEopWDH7GV7TtQjtRxuwys6Q9AV0h
    Вообще от провайдера http://portal2.myttk.ru/jtv2.zip
    Но провайдер может ограничивать скачивание для локального сегмента.

    ОтветитьУдалить
  3. В этом формате какая то путаница с байтами в начальной части. У кого то 0x0A, а у кого то 0xA0. Но IP-TV Player нормально воспринимает мой экземпляр. По сути, нужно просто что бы оба воспринимались конвертером.

    ОтветитьУдалить
    Ответы
    1. Я добавил поддержку альтернативного заголовка JTV в v0.2.1 (https://github.com/tataranovich/jtv2xmltv/releases/tag/v0.2.1) и возможность указывать кодировку для EPG.

      Похоже у "сломанного" заголовка есть какой-то один источник: http://dkt.iptvportal.ru/jtv.zip

      Удалить
  4. а слить воедино с наработками https://github.com/snakefishh/mnn-xbmc-repo/tree/master/script.service.jtvtoxmltv не порывался?

    имхо в виде плагина для коди этож полезнее будет )

    ОтветитьУдалить
    Ответы
    1. До сегодняшнего дня я про этот плагин и знать не знал :) Да и IPTV у меня через TVHeadend реализовано, а не в Kodi.

      Удалить
  5. Помогите новичку, то биш тупому. Ubuntu 20.04.1 при попытке выполнить "python setup.py install" консоль ругается на 1 строку файлa - Traceback( most recent call last): File "setup.py", line 1, in
    from setuptools import setup, find_packages
    ImportError: No module named setuptools

    ОтветитьУдалить
    Ответы
    1. Лучше ставить из пакета https://github.com/tataranovich/jtv2xmltv/releases/download/v0.2.1/jtv2xmltv_0.2.1-1_all.deb

      Если хочется установить из исходников, то сначала нужно установить python3-setuptools и потом выполнить "python3 setup.py install"

      Удалить
  6. Здравствуйте, Андрей.

    По-моему, вы неправильно парсите JTV-программу.

    NDX-файл содержит смещения к строкам с названиями передач в PDT файле. Ваш парсер ожидает, что в NDX и PDT файлах одинаковое число записей — каждой паре дата/смещение в NDX соответствует ровно одна строка в PDT (см. 1). Но провайдер может уменьшить размер PDT-файла, объединив повторяющиеся строки в одну и поставив в соответствующие записи NDX смежение на неё. Совершенно логичная оптимизация, т.к. одни и те же программы часто повторяются по нескольку раз в неделю. У других парсеров при этом не возникнет проблем, а ваш подставит в XMLTV неправильное название передачи.

    1: https://github.com/tataranovich/jtv2xmltv/blob/7989355a5b3ffa9198507281eaf58858877a1d18/jtv2xmltv/convert.py#L52

    ОтветитьУдалить
    Ответы
    1. Похоже вы правы - заведите баг на гитхабе (https://github.com/tataranovich/jtv2xmltv/issues) и прикрепить пример "оптимизированного" JTV файла.

      Удалить
  7. А не подскажете, где можно описание этого стандарта/формата почитать? И не встречали ли вы примеров генераторов NDX и PDT на том же Python? Захотелось маленький pet-проектик собрать )

    ОтветитьУдалить
    Ответы
    1. Формального описания стандарта я не находил, а какое-никакое описание формата есть в репозитории: https://github.com/tataranovich/jtv2xmltv/blob/master/docs/JTV.md

      Удалить
    2. А насчёт генераторов лучше спрашивать у провайдеров EPG, которые предоставляют JTV.

      Удалить