• Vítejte na XBMC-Kodi.cz
  • Česko-slovenská komunita fanoušků XBMC/Kodi
Vítejte návštevníku! Přihlášení Registrace


Hodnocení tématu:
  • 0 Hlas(ů) - 0 Průměr
  • 1
  • 2
  • 3
  • 4
  • 5
Fake EPG
#1
Byl jsme postaven před zajímavý úkol, vytvořit ručně EPG pro zbytek internetových radií, které si kamarád přidal dle mého návodu do Tvheadend serveru, a pro které jsme nikde nenašel odpovídající zdroj. Důvody byly víceméně malicherné, ale s ohledem na to, že jsem ho k tomu, aby si Kodi a Tvheadend serevr pořídil přesvědčil, příliš jsem s ním nediskutoval a slíbil, že se o to postarám. Řešení jsme měl už odzkoušené, nicméně do nějaké poloprovozní fáze jsem ho nikdy nedostal.

Ještě k tomu, proč vlastně kamarád to EPG tak důsledně vyžaduje. Souvisí to především s funkcí timeshift. Nemáte-li u daného radiového kanálu EPG, tak z nějakého mně neznámého důvodu nefunguje timeshift. Je o zvláštní, u TV kanálů to neplatí, tam timeshift funguje, i když pro daný kanál nemáte EPG, a já jsme bohužel ještě nepřišel na to, co s tím udělat. A kdo si na timeshift zvykne, dá mi za pravdu, že je to funkce veskrze užitečná. Poněkud malicherným důvodem, i když pro někoho důležitým pak je, že máte-li desítky radiových kanálů, a u většiny z nich EPG, tak ta vás ta "díra" při procházení Guide prostě štve.

Řešení problém se dá rozdělit do několika částí:
  • jak získat data o vysílání - to je jednoduché, buď má daná stanice nějaké víceméně pevné schéma nebo si prostě to schéma vymyslíte. Na dále uvedeném příkladu jsou použity oba přístupy. Radio Bonton jsme si vymysleli, Radio Relax jsme opsali z týdenního programu z jejich webových stránek (+ si tam něco málo také domysleli)
  • Jak vygenerovat xmltv soubor - jeho struktura je celkem známá a lze ji hypoteticky vytvořit ručně. To jsme ostatně, když jsem před časem celý princip testoval, také udělal. Mým cílem ale bylo, aby se EPG generovalo automaticky, vždy na celý týden dopředu. Jistě, měl existovat nějaký obecný popis vysílacího schématu jednotlivých stanic, ale ten měl být vytvořený na principu týdenního modelu a měl by být jednoduše editovatelný.
  • Poslední otázkou bylo, jak vygenerovaný xmltv.xml dostat do Tvheadend serveru - variantou bylo, přidat ho k již existujícímu xmltv souboru, ale to se mi moc nechtělo. Soubor si sice generuji také sám, ale s použitím aplikace WebGrab+Plus. Přidávat do něj další soubor mi připadalo příliš komplikované a nepraktické i vzhledem k údržbě. Zbyla tedy poslední možnost, použít další z graberů Tvheadend. Externí graber, do kterého se data posílají přes xmltv.sock.
Pro řešení jsme si stanovil obvyklé kritérium, aby ho šlo realizovat v prostředí LibreELEC bez toho, že by bylo třeba cokoliv dalšího instalovat. Nejsem programátor ani Linuxový znalec, proto jsou mé možnosti omezené. Podle toho také moje řešení vypadá.

Model programového schématu

Struktura modelu je odvozena od struktury samotného xmltv, obsahuje tedy dva typy objektů (řádků), popis kanálu a popis programu. Protože jsem celé řešení postavil na sh shellu, o kterém mám jen omezené znalosti, měl jsem tím pádem i značně omezené možnosti. Dvě z nich jsou zásadní (a jejich řešení nepříliš elegantní). Řetězce textu, který se předává jako parametr do vnořeného scriptu, musí být bez mezer. Proto se ve všech textech místo mezer používá znak "_". Po vygenerování xmltv souboru jsou všechny výskyty znaku "_" nahrazeny mezerami. Pokud mi někdo poradí, jak to obejít, budu vděčný. Podobně je to s koncem řádků, kde musí být vždy mezera, jinak se v posledním parametru objeví znak konce řádku, s kterým si nedokážu poradit.

Model:
Kód:
C Bonton
P Bonton 7 0000 0600 Po_půlnoci Blok_pořadů_mezi_půlnocí_a_probuzením.
P Bonton 7 0600 0900 Ranní_vysílání Pořady_po_probuzení,_pro_start_do_nového_dne.
P Bonton 7 0900 1200 Dopolední_vysílání Vysílání_před_obědem.
P Bonton 7 1200 1500 Po_obědě Po_dobrém_obědě_k_odpolední_siestě.
P Bonton 7 1500 1900 Do_večera Od_pozdního_odpoledne_až_k_večeru.
P Bonton 7 1900 2359 Večerní_vysílání Pořady_pro_večerní_klid_a_pohodu.
C Radio_Relax
P Radio_Relax W 0600 0900 Ranní_show Honza_Lukavský_a_Aleš_Švarc._Ranní_horoskopy,_ranní_soutež.
P Radio_Relax W 0900 1200 Dopolední_relax Dan_Adam._Motomix,_dopolední_soutež.
P Radio_Relax W 1200 1600 Odpolední_siesta Michal_Pospíchal._Relax_extra,_odpolední_soutež.
P Radio_Relax W 1600 2000 Odpolední_relax Honza_Ladra_nebo_Lukáš_Frölich._Odpolední_soutež,_písničky_na_přání.
P Radio_Relax W 2000 0600 Večerní_a_noční_vysílání Večerní_a_noční_vysílání.
P Radio_Relax E 0600 0800 Víkednové_ranní-vysílání Víkednové_ranní-vysílání_pro_dobré ráno.
P Radio_Relax E 0800 1200 Víkednový_Relax Michal_Pospíchal_a_Lukáš_Frölich._Relax_Extra,_dopolední soutež.
P Radio_Relax E 1200 1600 Víkednový_Relax Petr_Molík._Písničky_na_přání,_odpolední_soutež.
P Radio_Relax E 1600 2000 Víkednový_Relax Jirka_Sládková._Odpolední_soutěž,_Pejskostránka.
P Radio_Relax E 2000 0600 Večerní_a_noční_vysílání Večerní_a_noční_vysílání.

Význam je následující:

C řádek popisuje kanál, má jeden parametr:

Kanál - zde tedy Bonton nebo Radio Relax

P řádek popisuje program, má následující parametry:

Kanál, musí odpovídat jménu uvedenému v řádku C
Kód dne, kde může být použito
  Číslo  7 - den v týdnu, pro který se daný program vygeneruje (1 = Pondělí, atd.)
  Znak W - program se vygeneruje pro všechny pracovní dny v týdnu (Po - Pá, 1 až 5). Svátky ani žádné jiné volné dny bohužel v modelu podchycené nemám.
  Znak E - program se vygeneruje pouze pro dny víkendu (So + Ne, 6 a 7)
  Znak A - program se vygeneruje pro všechny dny v týdnu (Po - Ne, 1 až 7)
Čas začátku programu ve formátu HHMM
Čas konce programu ve formátu HHMM. pokud čas konce přeteče do druhé dne (resp. čas začátku > čas konce), tak se ve výsledném xmltv změní i datum konce programu. *)
Program - název programu, text bez mezer
Popis - popis programu, text bez mezer

*) Je jasné, že takto nelze definovat programy, které by byly delší než 24 hodin.

Generace xmltv souboru

Generátor řádky čte a analyzuje, nekontroluje však žádné konflikty ani vícenásobné definice nebo neexistující definice kanálů, které jsou použity v definici programů!

Po vygenerování souboru xmltv se v první řadě nahradí všechny "_" mezerami a pak se soubor překonvertuje a přenese do Tvheadend serveru. Ten musí mít samozřejmě uvolněný příslušný externí graber. Generují se data vždy pro celý týden, počínaje aktuálním datem.

Já mám testovací verzi generátoru EPG uloženu v adresáři .../.config, proto jsou veškeré odkazy orientovány na toto umístění.


Vlastní úloha generátoru Fakepg.sh:
Kód:
#! /bin/sh
XMLTVGEN="/storage/.config/xmltv.sh"
XMLTVDAT="/storage/.config/xmltv.dat"
XMLTVTMP="/storage/.config/xmltv.tmp"
XMLTVXML="/storage/.config/xmltv.xml"

XMLTVSOCK="/storage/.kodi/userdata/addon_data/service.tvheadend42/epggrab/xmltv.sock"
FAKEURL="http://google.com"

printf "<?xml version=\"1.0\" encoding=\"UFT-8\"?>\n" > $XMLTVTMP
printf "<tv>\n" >> $XMLTVTMP
while read line; do
    $XMLTVGEN $XMLTVTMP $line
done < $XMLTVDAT
printf "</tv>\n" >> $XMLTVTMP

sed "s/_/ /g" $XMLTVTMP > $XMLTVXML
curl -d @$XMLTVXML -X POST -m 5 --unix-socket $XMLTVSOCK $FAKEURL
rm -f $XMLTVTMP

Script pro parsování řádků definičního souboru xmltv.sh:
Kód:
#! /bin/sh
# Fakepg parser & xmltv generator
FILE=$1
TYPE=$2
CHANNEL=$3
DAYW=$4
START=$5
STOP=$6
TITLE=$7
DESC=$8

case $TYPE in
    C)
        printf "\t<channel id=\"%s\">\n" $CHANNEL >> $FILE
        printf "\t\t<display-name lang=\"cs\">%s</display-name>\n" $CHANNEL >> $FILE
        printf "\t</channel>\n" >> $FILE
        ;;
    P)
        now=$(date +%s)
        daywnow=$(date +%u)
        case $DAYW in
            A)
                DAYW="1 2 3 4 5 6 7"
                ;;
            W)
                DAYW="1 2 3 4 5"
                ;;
            E)
                DAYW="6 7"
                ;;
            *)
                ;;
        esac
        for dayw in $DAYW
        do
            daywadd=$((dayw-daywnow))
            [ $daywadd -lt 0 ] && daywadd=$((daywadd+7))
            start=$((now+daywadd*86400))
            daystart=$(date -d @$start +%Y%m%d)
            stop=$start
            [ $STOP -lt $START ] && stop=$((stop+1*86400))
            daystop=$(date -d @$stop +%Y%m%d)
            printf "\t<programme start=\"%s%s00 +0200\" stop=\"%s%s00 +0200\" channel=\"%s\">\n" $daystart $START $daystop $STOP $CHANNEL >> $FILE
            printf "\t\t<title lang=\"cs\">%s</title>\n" $TITLE >> $FILE
            printf "\t\t<desc lang=\"cs\">%s</desc>\n" $DESC >> $FILE
            printf "\t</programme>\n" >> $FILE
        done
        ;;
    *)
        ;;
esac

Přenos dat do Tvheadend serveru

Jak už bylo napsáno, používá se komunikace přes xmltv.sock. Tvheadend pro to poskytuje tzv. externí graber, který nedělá nic jiného, než že data takto zaslaná přijme a uloží je do databáze EPG Tvheadend. Pak už se  s nimi pracuje stejně jako s daty z interního graberu.

Pro přenos se používá volání aplikace curl.

Po volání curl se objeví hláška:

curl: (28) Operation timed out after 5001 milliseconds with 0 bytes received

která není v daném případě významná a je možné ji ignorovat.

Pokud data vložíte (a jsou v pořádku), objeví se okamžitě na stránce Programy EPG graberu. Zvolíte-li správně název, tak se automaticky přiřadí k příslušnému programu. Do Kodi se pak data EPG pro vložené kanály přenesou v další periodě aktualizace EPG.

Závěr

Jak už jsem napsal, program je velice jednoduchý, postrádá téměř jakékoliv kontroly. Šlo mi v dané chvíli o to, vyzkoušet si základní principy řešení, což se povedlo. Nabízím tedy toto řešení jako inspiraci pro někoho programátorsky zdatnějšího.
 
Citovat
  


Přejít na fórum:


Prochází: 1 host(ů)