Jump to content
Cesbo Community
  • Announcements

    • RadioSintetica

      News!   12/10/17

      If you have any questions related to installation and purchase, please check our documentation https://cesbo.com/en/astra/docs/ and terms of service https://cesbo.com/en/terms/
      Also, we have an official Telegram chat: https://t.me/cesbo_en  you can ask any questions or share your experience with colleagues Если у вас возникли вопросы по установке и покупке, ознакомьтесь пожалуйста с документацией по адресу https://cesbo.com/ru/astra/docs/ и условиями использования https://cesbo.com/ru/terms/
      Так же, обращаю внимание, что у нас есть официальный Телеграмм чат: https://t.me/cesbo_ru в котором можно задать вопросы - или поделиться своим опытом с коллегами
fyrer

Модуль к астре для сборки EPG / XMLTV

Recommended Posts

Написал модуль который собирает и обновляет epg на лету. Данные сохраняются в формате xmltv.

Что-бы попробовать в работе, необходимо закинуть содержимое архива в исходники astra, после чего пере собрать.
Пример использования:

require("epg")


local _save_file = function(path, data)
      local fd = assert(io.open(path, "w"));      
      fd:write(data);
      fd:close();   
end




local _send_http = function(addr, data)
  local req = {
     port    = addr.port,
     host    = addr.host,
     path    = addr.path,     
     method  = "POST",     
     headers =  {
   "User-Agent: Astra",       
   "Content-Type: text/plain",    
   "Host: " .. addr.host .. ":" .. addr.port,
   "Connection: close",
   "Content-Length: " .. string.len(data)
     },     
     content  = data,
     callback = function(self, resp) return end          
  }
  http_request(req)
  return  
end


adapter_1 = dvb_tune({
    type = "S2",
    adapter = 81,
    event = true,
    tp = "12303:l:27500",
    lnb = "10750:10750:10750"
})


epgcoll   = epg_collector({
     name     = "epgcoll1",
     
     format   = "xmltv", --[[ =xmltv / =json / =table ]]
     
     sleep_tm = 120, --[[ждем 120сек после появления новой программы перед вызовом callback]]
     
     callback = function(data)
        -- нужное раскоментировать
     
        -- сохранить на диск     
        _save_file("test.xml", data) 

        --вывод в консоль
        -- print(data) 

        --Отправка на сервер по HTTP POST
        --[[
        _send_http({
            host = "192.168.0.55",
            port = 80,
            path = "/"
        }, data);
        ]]

     end
})




make_channel({
    name = "Channel #3",
    input = {
        "dvb://adapter_1#pnr=3"
    },
    output = {
        "udp://192.168.50.247:4000#rtp",
        "epg://epgcoll#pid=18&name=name"
        --[[
        pid=18 - default; DVB-стандарт
        pid=57 - sirius; костыль, для провайдеров которые стандары презирают


        title=pnr  - default, использовать pnr канала как имя;
        title=name - использовать имя канала, в данном примере "Channel #3"
        title=some_string - произвольное название канала
        ]]
    }
})


make_channel({
    name = "Channel #400",
    input = {
        "dvb://adapter_1#pnr=400"
    },
    output = {
        "udp://192.168.50.247:4001#rtp",
        "epg://epgcoll#pid=18&title=test_ch"
    }
})




--[[
TODO
1. timezone
2. add tags: date / category / rating / audio
3. helper для снятие epg всех каналов с транспондера
]]

 

Новая версия совместимая с последней астрой из git 
https://www.dropbox....015.tar.gz?dl=0

 

Старая версия:

https://www.dropbox.com/s/a4ud7o0goeh7g6p/astra_epg.tar.gz?dl=0

 

Пожелания и критика принимаются  :)

Share this post


Link to post
Share on other sites

Попробовал заработало.
Спасибо что опубликовали!!!
Интересно, а можно сделать что бы делать изменения в базе данных, а вот от туда генерировать XML?

Share this post


Link to post
Share on other sites

Интересно, а можно сделать что бы делать изменения в базе данных, а вот от туда генерировать XML?

Да без проблем. Вернусь с отпуска допишу lua скрипт. Если честно мне xml то же до лампачки , буду посылать json по http на сервер с мидлварем

Share this post


Link to post
Share on other sites

Отлично, работает, спасибо!

Осталось только xmltv id передавать сейчас в качестве id используется pnr, pnr не пойдет - потому как он может быть одинаковый на каналах с разных транспондеров.

 

По таймеру xml файл пересоздается или дописываются программы передач в существующий?

Share this post


Link to post
Share on other sites

Отлично, работает, спасибо!

Осталось только xmltv id передавать сейчас в качестве id используется pnr, pnr не пойдет - потому как он может быть одинаковый на каналах с разных транспондеров.

 

По таймеру xml файл пересоздается или дописываются программы передач в существующий?

1>>пользуйтесь на здоровье!

2>>добавлю параметр name в еpg://..

3>>алгоритм следующий : при появлении нового eit- пакета происходит замена старого для данного канала с тем же номером. После чего выжедается sleep_tm и пересоздается xml. То есть происходит актуализация, а не добавление. Старые передачи исчезают из файла

 

Пс новую версию где-то в начале недели выложу

Share this post


Link to post
Share on other sites

Спасибо за модуль, из замечаний или пожеланий:
не получилось запустить на частично закрытом mpts с параметром "no_analyze",

и можно ли выбирать все целиком EPG из потока. без разбивки по каналам?

Share this post


Link to post
Share on other sites

Спасибо за модуль, из замечаний или пожеланий:

не получилось запустить на частично закрытом mpts с параметром "no_analyze",

и можно ли выбирать все целиком EPG из потока. без разбивки по каналам?

Можно, но придется переделать скрипт epg.lua 

 

Есть правда одна теоретическая проблема:

по стандарту EIT-пакеты единственная из стандартных сервисных таблиц которая допускает скрэмблирование, хотя на практике не разу не встречал

Share this post


Link to post
Share on other sites

Новая версия доступна по ссылке на dropbox
Добавлено:
1. формат вывода (xmltv, json-custom format, table-lua table )

2. Добавил пример отправки на HTTP сервер

3. Возможность указания имени канала

4. Поправил баг с указанием нестандартного PID'a

Share this post


Link to post
Share on other sites

подскажите, как его правильно применить в случае без dvb? udp - > http

Да по идеи так-же как и и с dvb. Не проверял правда, но должно работать 

Share this post


Link to post
Share on other sites

пробую по аналогии сделать,но получаю PANIC: unprotected error in call to Lua API ([main] /etc/astra/scripts/epg.lua:271: table index is nil)

может конечно проблема вообще не связана с dvb или без

Share this post


Link to post
Share on other sites

пробую по аналогии сделать,но получаю PANIC: unprotected error in call to Lua API ([main] /etc/astra/scripts/epg.lua:271: table index is nil)

может конечно проблема вообще не связана с dvb или без

 

На выходных протестирую и допилю. 

Share this post


Link to post
Share on other sites

Я заметил такую ерунду, бывает так астра говорит
ERROR: [newcamd NTV] connection timeout
думал что виноват шаринг, но по времени совпадает до секунды когда приходит обновление EPG и время XML перезаписи совпадает.
Так же поставил астру без EPG и там шаринг не пропадает. Что может быть не так?

Share this post


Link to post
Share on other sites

А пишется в файл или по http отправляется?
Есть мысль , что дело в блокировки потока, во время записи. Попробую отловить у себя подобное.
Можно пример логов. На всех провайдерах проявляется или на каком-то одном?

Share this post


Link to post
Share on other sites

Сконфигурировано так:

epgcoll   = epg_collector({
        name = "epgcoll1",
        format = "xmltv",
        sleep_tm = 120,
        callback = function(data)
                -- print(data)
                local fd = io.open("/home/astra/12399R.xml", "w");
                fd:write(data);
                fd:close();
        end
})

shara_111 =  newcamd({ name = "NTV-111", host = "x.x.x.x", port = "xxxx", user = "xxx", pass = "xxx", key = "0102030405060708091011121314", cas_data = "040600", disable_emm=true, })
make_channel({
        name = "ТНТ",
        map = { "video=1000", "rus=1001", "eng=1002", },
        input  = {
                "dvb://adapter_0#pnr=10302&cas_data=040600&cam=shara_111",
                "file:///home/astra/grid.ts#loop",
        },
        output = {
                "udp://225.2.225.111:1234#ttl=30&sync",
                "epg://epgcoll#pid=18",
        },
        enable = true,
})


Версия:
# ~astra/astra4 -v
Nov 06 15:21:47: INFO: Starting Astra 4.3.118

У меня на каждый канал свое подключение. Пропадают все соединения на этой астре в момент сохранения XML

Share this post


Link to post
Share on other sites

попробуй закоментить временно запись:

напиши будет проявляться баг или нет

        callback = function(data)
                print("new XMLTV")
                --local fd = io.open("/home/astra/12399R.xml", "w");
                --fd:write(data);
                --fd:close();
        end

Как вариант попробовать писать в tmpfs. 

А так скорее всего придется разбивать data на чанки и писать в несколько заходов. Если конечно предположение подтвердится

Share this post


Link to post
Share on other sites

Получилось воспроизвести баг, но только синтетически. Увеличил размер записываемого файла до 150мб, похоже у вас проблемы с файловой системой.

Полечилось при помощи записи в tmpfs:

 local fd = io.open("/tmp/12399R.xml", "w");

Подумаю как организовать неблокирующую запись на диск. Но в этом плане LUA редкостный обрубок. Нет ни трэдов, ни нормального эвентлупа кака в nodejs.
Если кто знает как подскажите. Но чувствую , что придется на си писать функцию для работы с диском(( 

Share this post


Link to post
Share on other sites
vnc    1

снимаем ЕПГ по немцам S19.2E транспондер 11464:h:22000
на  каналах ProSieben HD, SAT.1 HD, kabel eins HD, SIXX HD - EPG и выглядят так:

<programme channel="Das Erste HD DE" start="20141114002000 +0000" stop="20141114004500 +0000">
        <title lang="de">unknown charset: 0x054E616368746D6167617A696E</title>
        <sub-title lang="de">unknown charset: 0x054D6F64657261746F723A205376656E204C6F726967</sub-title>
        <desc lang="de">unknown charset: 0x055468656D656E3A8A2A204265726C696E3A2042756E64657374616720646562617474696572742068F66368737420656D6F74696F6E616C20FC626572205
</programme>

 

Есть идеи как подправить кодировку?

Share this post


Link to post
Share on other sites

Есть идеи как подправить кодировку?

У вас идет в кодировке ISO 8859-9. Она в астре отсутствует. Я писал в свое время функцию для ISO 8859-4. 

Сейчас к сожалению нет времени.

Можно сделать небольшой хак

 

modules/astra/iso8859.c

    else if(charset_id < 0x10)
    {
        switch(charset_id)
        {
            case 0x01: return (char *)iso8859_5_decode(&data[1], size - 1); // Cyrillic
            case 0x03: return (char *)iso8859_7_decode(&data[1], size - 1); // Greek
++          case 0x05: return (char *)iso8859_1_decode(&data[1], size - 1); // hack for iso 8859_9
            default: break;
        }

8859_9 -практически  идентична 8859_1 за исключением того, что 4 символа исландского языка заменены на турецкие. Вам для немецкого всего должно хватить. 

 

 

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now


×