• 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
Tvheadend a placená IPTV - idea řešení
#81
@otava5 Já asi nejsem ten správný člověk, abych dával rady jak používat grep, sed, awk, atd. Bojuji s tím sám docela fest... Ale jestli ti jde o to, vytvářet nepřímé odkazy na playlist, tak já to dělám trochu jinak. Tak, jak to výše nastínil @mobilemanic.

Je to řešení z mého addon playlist, který mi poskytuje službu generace playlistů pro Tvheadend. Upravuji ho podle námětů v tomto vlákně, tedy tak, aby v Tvheadend byl statický playlist, ve kterém budou odkazy na playlist s měnícím se obsahem definice adres streamů (tedy hlavně tokenů). V Tvheadend mám zadanou adresu playlistu, který vypadá takto:
Kód:
#EXTM3U
...
#EXTINF:0,Sport 1
pipe:///storage/.kodi/addons/service.playlist/provider/zapni.tv/parse.sh Sport 1
...

V parse.sh je jednoduché vyhledávání podle názvu programu, který se zadává jako jeho parametr. Vyhledá řádek, ve kterém je na konci řádku název programu a vrací řádek pokud začíná ffmpeg. Parse je specifický pro každého providera, jednak je v něm odkaz na vlastní playlist, jednak může být logika vyhledávání upravena podle potřeby a specifik daného playlistu a providera.
Kód:
#! /bin/sh
command=`grep -A 1 "$*$" /storage/.kodi/userdata/addon_data/service.playlist/zapni.tv/zapni.tv.playlist.m3u8 | grep "^ffmpeg"`
$command

Vlastní playlist s adresami streamů, který parse.sh prohledává, je stažen ze serveru providera a upraven podle potřeb Tvheadend:
Kód:
#EXTM3U
...
#EXTINF:0,Sport 1
ffmpeg -re -fflags +genpts -i http://proxy2.zapni.tv/live.m3u8?tv=204&q=lq&stor=2&auth=XXX -acodec copy -vcodec copy -f mpegts -mpegts_service_type digital_tv -metadata service_provider=zapni.tv -metadata service_name=http://proxy2.zapni.tv/live.m3u8?tv=204&q=lq&stor=2&auth=XXX pipe:1
...

Celé to řešení funguje v pluginu vlastně obráceně, než je zde pospáno. Nejdřív se stáhne palylist od providera a upraví se podle potřeb Tvheadend. Zároveň se automaticky vytvoří generický playlist pro Tvheadend, do kterého se nakopírují #EXTINF řádky ze staženého playlistu providera a do řádku za ně, místo původního streamu, se vloží volání toho parser.sh s parametrem jména programu. Tím se ten stažený a upravený playlist propojí s tím generickým.

Ještě také používám alternativní variantu. Ručně si vytvořím kopii generického playlistu a zedituji si ho podle potřeb, vyházím nepotřebné streamy, přejmenuji programy a do #EXTINF si zadám další parametry (štítky, čísla programů, atp.), viz Rozšířené parametry IPTV playlistu - řádek #EXTINF: Není to tak dynamické, pokud se změní playlist od providera, tak se to do Tvheadned automaticky nepromítne, ale zase to dává možnost některé parametry zafixovat, jiné změnit (např. jména programů), případně nastavit podle konkrétní potřeb (např. odkaz to XMLTV).
 
Citovat
#82
JiRo: rozumím tomu dobře že script najde Sport 1 a řádek pod ním použije pokud obsahuje slovo začínající ffmpeg?

Jak by vypadal script pro vyhledání ?:


Kód:
#EXTM3U
...
#EXTINF:0,Sport 1
http://80.188.229.198/at/f05721f3d5ef16004c692f5919b49564/1521385201794/subscr/postpaid%3A3373094/4a197cfe-bcf2-4bee-a60c-729b362c84b5/5004-tv-pc.m3u8
 
Citovat
#83
@otava5 Ano, rozumíš tomu dobře. 6

No, pro tebe by stačilo místo "^ffmpeg" dát "^http". Ale ono je to možná zbytečně složité a není důvod kontrolovat, čím řádek začíná. To byla taková moje prvotní idea, udělat to hodně univerzální. Pokud má ten playlist normální strukturu, tzn. za řádkem #EXTINF následuje hned řádek se streamem, stačí vzít hned následující řádek. Pak by ten parser mohl například vypadat:

Kód:
#! /bin/sh
command=`grep -A 1 "$*$" ...playlist.m3u8 | head -n 2 | tail -n 1`
$command

Ten head -n 2 je tam pro jistotu, kdybys měl v playlistu řádky se stejným jménem programu. Takže pokud tam někde budou dva stejné programy, vezme se jen ten první z nich a o ten druhý prostě přijdeš. Ale to by se v běžném playlistu stávat nemělo, tak jsem to neřešil.

Já jsem ale odkaz přímo na http: stream nezkoušel. Zatím jedu vždy přes ffmpeg, ale podle mne by to fungovat mělo. Kdyby něco, tak napiš.

EDIT: Informace v tomto postu je nesprávná, objasněno v dalších postech...
 
Citovat
#84
JiRo: má chyba...jak by vypadal ne řádek pod Sport 1 ale druhý řádek pod Sport 1?
 
Citovat
#85
@otava Aha, já myslel, že ti jde o to nepřímé adresování playlistu se streamy s tokenem ze statického playlistu přes ten parser, u kterého se tím pádem nebude nebude měnit obsah při změně tokenu...

A co je to, stream? Musíš taky vědět, co je to za kontejner. Respektive, jestli je to ts. Pokud ano, tak ho tvheadend sežere bez úpravy. To si můžeš vyzkoušet tak, že ho zadáš ručně do muxu a uvidíš, jestli ho oscanuje a budeš ho moci přijímat. Pokud ne, tak to musíš prohnat přes ffmpeg jako já v tom mém postu.
 
Citovat
#86
JiRo: s ffmpeg mi to funguje bez něj ne e...

ještě jsem zkoušel ve VLC a zdá se mi že rychlost je o 4s pomalejší náběh programu přes parser než když je to přímo....
 
Citovat
#87
@otava5 No, včera večer jsem to taky zkoušel, a také mi to řešení, pokud tam není ffmpeg, nefunguje. Buď tam chybí ten agent, ale já nevím, jak ho tam dostat nebo je problém ještě někde jinde. Musím popřemýšlet a něco vymyslet. Tedy jestli se vůbec něco vymyslet dá.

Pokud jedeš přes ffmpeg, tak je začátek vždycky pomalejší. Někde se to tady už řešilo... Podívám se do historie.

EDIT: Pokoušel jsme se něco vymyslet, ale nevedlo to k cíli a ani nemohlo. Tak jsem včerejší doporučení v tomto postu zeditoval. Byly to blbosti a stejně na to nikdo zatím nereagoval tak nebude kontinuita diskuse porušena. V agentovi problém není.

Problém je v tom, že to volání přes parser, když se použije ffmpeg, funguje proto, protože parser spouští ffmpeg, který posílá stream přes rouru - proto je v parametrech ffmpeg pipe:1 a v Tvheadend pipe://. To v případě, když v playlistu ffmpeg nemáš, takhle fungovat nemůže.

Já to chápu tak, že pokud se v playlist pro Tvheadend objeví pipe://, očekává tvheadend na vstupu rovnou stream. A ten mu tam posílá ffmpeg díky parametru pipe:1. V případě použití mého jednoduchého parseru se tedy musí zajistit, aby "něco" z adresy ve staženém playlistu ten stream do Tvheadend posílalo. Napadá mě, vložit tam např. wget. U něj to zpoždění možná nebude tak velké jako u ffmpeg. Ale je to jen má laická úvaha, tady by asi mohl pomoci někdo zkušenější. Přesto to vyzkouším. Ale až zase večer, běžím do práce. 10

EDIT2nd: Tak jsem ještě rychle vyzkoušel wget. wget -qO - <adresa staženého streamu> by asi mohlo fungovat.

EDIT3rd: Ještě mě napadlo, že by bylo možné to volání wget zaintegrovat do parseru a neřešit vůbec playlist. Ten bych nechal beze změny tak, jak ho stáhneš od providera.

EDIT4th: Ještě jsem zapomněl na odkaz diskuse, kde se řešilo zpoždění při použití ffmpeg. Najdeš to zde Tvheadend a internetová rádia, hned na první stránce, příspěvky od @marhycz a @mobilemanic. Ale už tenkrát jsme myslím usoudili, že to zkrácení náběhu streamu, které se podaří optimalizací běhu ffmpeg, není nijak významné. Prostě jakmile použiješ ffmpeg, musíš počítat s nějakou tou sekundou navíc. A je jasné, že ten parser tomu taky něco přidá. 10
 
Citovat
#88
@otava5 Tak nepřímý odkaz na playlist bez ffmpeg definitivně odzkoušen a funguje podle předpokladů. Věnoval jsem se tomu jen krátce dnes ráno, takže jsem nestihl otestovat reakci rychlost náběhu obrazu po přepnutí kanálu. Snad se k tomu dostanu večer.

Parse.sh script pak vypadá následovně:
Kód:
#! /bin/sh
stream=`grep -A 1 "$*$" .../playlist.m3u8 | head -n 2 | tail -n 1`
wget -qO - $stream

Jen poznámka a možná otázka pro geeky. Nemůžu za boha tu adresu streamu do wget dostat přes rouru. Podle helpu v LibreELEC to vypadá, že wget v LE tuto možnost snad ani nemá. Zkoušel jsem přepínač a parametr "-i -" a ten mi nefungoval. Poradí někdo? Když ne, nevadí, jen je to škoda, mohlo to být na jednom řádku. 6
 
Citovat
#89
JiRo: ta pomlčka je u wgetu... ffmpeg má pro pipování zvláštní vlastní označování, nejspíš asi umí využít více pipe současně (nikdy jsem nezkoušel). Tedy "pipe:<číslo_pipe>", je to jak pro výstup, tak pro vstupy.. číslo není nutné, stačí napsat "pipe:", asi to vezme pipe č.1

Ale takhle přes proměnnou ${stream}, jak to máš, je to lepší - bude to fungovat vždycky, protože wgetem datový stream třeba z takového HLS zdroje neuděláš, pokud vím, ani omylem. Kdežto ffmpeg v parametru -i si s tím poradí.
 
Citovat
#90
@mobilemanic Asi jsme se nějak "minuli" 10, já píšu o wget, ne o ffmpeg, ten je nám už, řekl bych, jasný. Ale i tak díky za názor.
 
Citovat
#91
Jééé, blbě jsem to pochopil :/

Tak to asi takhle:
Kód:
wget -qO - ` grep -A 1 "$*$" .../playlist.m3u8 | head -n 2 | tail -n 1`

či moderněji takhle:
Kód:
wget -qO - $(grep -A 1 "$*$" .../playlist.m3u8 | head -n 2 | tail -n 1)
 
Citovat
#92
@mobilemanic Díky*1000!  No vždyť říkám, lama. Linux neznám a čerpám jen z toho, co si přečtu v příručkách. I když, upřímně, ta první forma mě taky mohla napadnout, vždyť je vlastně logická. 10
 
Citovat
#93
Lama určitě nebudeš, ty se tu schovávají v tématu IPTV - free streamy :-) Ono je to často jasné, ale proč a jak to je tak jak to je člověku často dojde teprve, až to vidí funkční. Stává se mi to 20x denně :-)
 
Citovat
#94
JiRo / mobilemanic: děkuji borci jakmile přijdu z noční otestuji....velké díky Vám že jste na fóru :-)
 
Citovat
#95
JiRo: TVH mi píše "scan no data, failed" ale "parse.sh JOJ" funguje vshellu....ale v TVH dám pipe:///storage...m3u8 JOJ a hlásí chybu

ale přes file:///storage...m3u8 JOJ by to mělo fungovat,ale nenaskenuje (iptv: unable to open file '/storage/.kodi/userdata/parse.sh JOJ')
 
Citovat
#96
@otava5 Tak teď jsem to možná úplně nepochopil. Ale zkusím to nějak rozebrat.

Mícháš tady dvě věci. Playlist (.m3u8) a script (.sh). Parametr sítě URL: definující playlist, musí začínat file:///....m3u8. V "druhých" řádcích toho playlistu (následující vždy po #EXTINF), kde je v normálním playlistu adresa streamu, budou v tomto případě vložena volání scriptu a ty řádky tedy musí vypadat nějak takto pipe:///....sh JOJ.

Jestli ti není jasný význam pipe://, tak se podívej K čemu je pipe:// v parametrech muxu?, kde jsme se to pokusil nějak vysvětlit.

Já jsme si tu variantu bez ffmpeg přebalování streamů vyzkoušel u playlistu Sledovanitv.cz (zjistil jsem teprve teď 10, že to už posílají v ts kontejneru), stream tedy spouštím přes wget a odezva po přepnutí je u většiny streamů téměř okamžitá. Rozhodně pod 1 s.
 
Citovat
#97
aha tak u mě se skrývá toto:
Kód:
LibreELEC:~ # /storage/.kodi/userdata/parse.sh JOJ
#EXTM3U
#EXT-X-VERSION:2
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=2000000
http://80.188.229.198:80/aa/415d7d7a5418daf510e6c5d294b7d9a5/1524103202182/91fcd5562e311d95d1d070f6b242c0e5/dna-5007-tv-pc/hls/1402u0.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=700000
http://80.188.229.198:80/aa/415d7d7a5418daf510e6c5d294b7d9a5/1524103202182/91fcd5562e311d95d1d070f6b242c0e5/dna-5007-tv-pc/hls/1401u0.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=4500000
http://80.188.229.198:80/aa/415d7d7a5418daf510e6c5d294b7d9a5/1524103202182/91fcd5562e311d95d1d070f6b242c0e5/dna-5007-tv-pc/hls/1404u0.m3u8
LibreELEC:~ #
takže to přes wget a pipe nejde  8
 
Citovat
#98
otava5: to víš, že to jde, jen musíš ten skript víc vyladit... O2TV je normální HLS, takže se musíš prokousat až na ten playlist pro konkrétní rychlost a na konci ho prohnat přes ffmpeg... pak ti potečou přímo data...

Poslal bych ti to hotové, ale bohužel O2 udělané nemám, neměl jsem účet :)
 
Citovat
#99
@otava5 Aha, takže ty máš HLS? Ale to jsem nevěděl. Tak to ti přes wget fungovat skutečně nebude, jedině ffmpeg. Tady asi moje rady končí, o HLS toho zas tolik nevím. Tvheadend HLS umí, to ještě vím, ale já žádný zdroj nemám, tak jsem bez zkušeností. Občas jsem narazil na popisy php scriptů, na spojování jednotlivých HLS segmentů, ale do toho bych se už tuplem nechtěl pouštět... 1 Takže jedině to ffmpeg.

@otava Jen drobné info o stavu mé mysli. Přechod na ten "dvoustupňový" playlist mě inspiroval k modifikaci řešení. Žádné úpravy a editace playlistu, jakékoliv úpravy adres streamů přesouvám do scriptu (původně parse.sh, nyní to bude streamer.sh) a budu to dělat (on the fly) v něm. Do Tvheadend budu posílat už jenom proud dat.

A ještě něco, když jsem se díval na začátek tohoto vlákna, našel jsem tam v jednom postu od @mobilemanic tento odstavec, a v něm informace, které jsem tenkrát nedokázal dostatečně ocenit.

"HTTP(S) klient v tvheadendu není na všech konfiguracích vždy stabilní, někdy bezdůvodně v náhodných intervalech ukončuje spojení i když zdrojový stream by normálně jel dál... Přes pipe:// se tohle neděje a datový tok je narozdíl od integrovaného HTTP(S) klienta v TVH 100% stabilní (pokud nechci pipe://ffmpeg, tak je vždy bezpečnější použít alespoň "pipe://wget -O - -q http://adresa.serveru.tld")"
 
Citovat
díky chlapy...jasný přes ten ffmpeg to jede....to ano
 
Citovat
  


Přejít na fórum:


Prochází: 1 host(ů)