kodi-czsk / plugin.video.ivysilani

MIT License
20 stars 22 forks source link

nefunkční přehrávání - master playlist odkazuje na relativní URL pro chunk playlisty #22

Closed zajdee closed 6 years ago

zajdee commented 6 years ago

Dobré dopoledne,

OSMC rbp2-mediacenter-osmc, verze 17.6.0-24 (Raspberry Pi). iVysilani plug-in verze 2018-01-28 [1.3.5].

Při pokusu o přehrání jakéhokoli videa se stáhne master playlist na disk (do /home/osmc/.kodi/userdata/addon_data/plugin.video.ivysilani/playlist.m3u8).

Pak se spouští přehrávač v OSMC. Ten spouští knihovní funkce ffmpegu, které se pokouší stáhnout playlisty jednotlivých kvalit. To se ale nepodaří, protože se používá relativní URL vůči existujícímu master playlistu (tedy lokální disk), kde playlisty kvalit s odkazem na jednotlivé media chunky nejsou - a i kdyby byly, tak v playlistu s chunky absolutní URL nejsou, tedy problém by se opakoval.

Výsledek je, že nehraje žádné video z iVysílání.

Jak jsem to ohackoval:

--- addons/plugin.video.ivysilani/addon.py.bak  2018-04-28 09:58:36.431796183 +0200
+++ addons/plugin.video.ivysilani/addon.py  2018-04-28 09:58:48.861486569 +0200
@@ -285,7 +285,7 @@
         playlist_file_path = xbmc.translatePath(os.path.join(_addon_.getAddonInfo('profile'), "playlist.m3u8"))
         urllib.urlretrieve(url, playlist_file_path)
         player = xbmc.Player()
-        player.play(playlist_file_path, li)
+        player.play(url, li)
         if subtitles:
             while not player.isPlaying():
                 xbmc.sleep(2000)

Player v OSMC umí master playlist zpracovat, takže si sám vybere nejvyšší kvalitu, stáhne playlist s chunky z webu a pak začne stahovat jednotlivé chunky a hrát je.

Jak by to šlo líp:

Data pro debugging:

Master playlist:

#EXTM3U
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=6108783,RESOLUTION=1920x1080,FRAME-RATE=25.000,CODECS="avc1.4d4028,mp4a.40.2"
index-f1-v1-a1.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=3620635,RESOLUTION=1280x720,FRAME-RATE=25.000,CODECS="avc1.4d401f,mp4a.40.2"
index-f2-v1-a1.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=2127260,RESOLUTION=1024x576,FRAME-RATE=25.000,CODECS="avc1.4d401f,mp4a.40.2"
index-f3-v1-a1.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1129606,RESOLUTION=720x404,FRAME-RATE=25.000,CODECS="avc1.4d401e,mp4a.40.2"
index-f4-v1-a1.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=646832,RESOLUTION=512x288,FRAME-RATE=25.000,CODECS="avc1.42c015,mp4a.40.2"
index-f5-v1-a1.m3u8

#EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=1024873,RESOLUTION=1920x1080,CODECS="avc1.4d4028",URI="iframes-f1-v1-a1.m3u8"
#EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=650430,RESOLUTION=1280x720,CODECS="avc1.4d401f",URI="iframes-f2-v1-a1.m3u8"
#EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=425262,RESOLUTION=1024x576,CODECS="avc1.4d401f",URI="iframes-f3-v1-a1.m3u8"
#EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=232993,RESOLUTION=720x404,CODECS="avc1.4d401e",URI="iframes-f4-v1-a1.m3u8"
#EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=135104,RESOLUTION=512x288,CODECS="avc1.42c015",URI="iframes-f5-v1-a1.m3u8"

Playlist konkrétní kvality:

# curl -v 'http://vod2.cdn77-ivysilani.cz/Ilqyj7V1drcp76GCuGYyCg==,2147483647/547600/0/hls/,8DGE7R0Y/0/16/547600_1080p,1SH4X7HZ/0/16/547600_720p,8DGESZ6H/0/16/547600_576p,8DGE7N8Y/0/16/547600_404p,8DGG5U9Y/0/16/547600_288p,.mp4.urlset/index-f1-v1-a1.m3u8'
*   Trying 62.129.62.105...
* TCP_NODELAY set
* Connected to vod2.cdn77-ivysilani.cz (62.129.62.105) port 80 (#0)
> GET /Ilqyj7V1drcp76GCuGYyCg==,2147483647/547600/0/hls/,8DGE7R0Y/0/16/547600_1080p,1SH4X7HZ/0/16/547600_720p,8DGESZ6H/0/16/547600_576p,8DGE7N8Y/0/16/547600_404p,8DGG5U9Y/0/16/547600_288p,.mp4.urlset/index-f1-v1-a1.m3u8 HTTP/1.1
> Host: vod2.cdn77-ivysilani.cz
> User-Agent: curl/7.52.1
> Accept: */*
>
< HTTP/1.1 200 OK
< Date: Sat, 28 Apr 2018 07:54:50 GMT
< Content-Type: application/vnd.apple.mpegurl
< Content-Length: 2507
< Connection: keep-alive
< ETag: "-1-9cb"
< Expires: Wed, 10 Aug 2039 12:14:28 GMT
< Cache-Control: max-age=671932800
< X-SD-ID: 1
< Access-Control-Allow-Headers: *
< Access-Control-Expose-Headers: Server,range,Content-Length,Content-Range
< Access-Control-Allow-Methods: GET, HEAD, OPTIONS
< Access-Control-Allow-Origin: *
< X-CT-OP-ID: 1
< X-CT-OP-Cache: HIT
< X-CT-OP-Age: 61167
< Server: CDN77-Turbo
< X-Edge-IP: 95.168.223.202
< X-Edge-Location: pragueCZ
< X-Cache: HIT
< X-Age: 182455
< Accept-Ranges: bytes
<
#EXTM3U
#EXT-X-TARGETDURATION:10
#EXT-X-ALLOW-CACHE:YES
#EXT-X-PLAYLIST-TYPE:VOD
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:1
#EXTINF:10.000,
seg-1-f1-v1-a1.ts
#EXTINF:10.000,
seg-2-f1-v1-a1.ts
#EXTINF:10.000,
seg-3-f1-v1-a1.ts
(...atd...)

Debug log OSMC (vybrané záznamy):

09:41:45.053 T:1417880320    INFO: CPythonInvoker(27, /home/osmc/.kodi/addons/plugin.video.ivysilani/addon.py): script successfully run
09:41:45.120 T:1925413376   DEBUG: Loading settings for /home/osmc/.kodi/userdata/addon_data/plugin.video.ivysilani/playlist.m3u8
09:41:45.131 T:1925413376   DEBUG: CPlayerCoreFactory::GetPlayers(/home/osmc/.kodi/userdata/addon_data/plugin.video.ivysilani/playlist.m3u8)
09:41:45.136 T:1925413376   DEBUG: Radio UECP (RDS) Processor - new CDVDRadioRDSData
09:41:45.136 T:1925413376  NOTICE: VideoPlayer: Opening: /home/osmc/.kodi/userdata/addon_data/plugin.video.ivysilani/playlist.m3u8
09:41:45.136 T:1925413376 WARNING: CDVDMessageQueue(player)::Put MSGQ_NOT_INITIALIZED
09:41:45.137 T:1925413376   DEBUG: CMMALRenderer::CMMALRenderer
09:41:45.138 T:1925413376   DEBUG: CMMALRenderer::UnInitMMAL
09:41:45.138 T:1925413376   DEBUG: CMMALRenderer::PreInit
09:41:45.138 T:1488065280   DEBUG: Thread VideoPlayer start, auto delete: false
09:41:45.138 T:1488065280  NOTICE: Creating InputStream
09:41:45.140 T:1488065280   DEBUG: ScanForExternalSubtitles: Searching for subtitles...
09:41:45.141 T:1488065280   DEBUG: ScanForExternalSubtitles: END (total time: 1 ms)
09:41:45.141 T:1488065280  NOTICE: Creating Demuxer
09:41:45.142 T:1488065280   DEBUG: Open - probing detected format [hls,applehttp]
09:41:45.142 T:1488065280    INFO: ffmpeg[58B21300]: [hls,applehttp] Opening '/home/osmc/.kodi/userdata/addon_data/plugin.video.ivysilani/index-f1-v1-a1.m3u8' for reading
09:41:45.142 T:1488065280   ERROR: Open - Error, could not open file /home/osmc/.kodi/userdata/addon_data/plugin.video.ivysilani/playlist.m3u8
09:41:45.142 T:1488065280   ERROR: OpenDemuxStream - Error creating demuxer
09:41:45.142 T:1488065280  NOTICE: CVideoPlayer::OnExit()
09:41:45.142 T:1488065280   DEBUG: OnPlayBackStopped: play state was 1, starting 1
09:41:45.142 T:1488065280   DEBUG: Thread VideoPlayer 1488065280 terminating

Informativní log z ffprobe, stejná chyba jako při přehrávání v OSMC (No such file or directory):

# ffprobe  /home/osmc/.kodi/userdata/addon_data/plugin.video.ivysilani/playlist.m3u8
ffprobe version 3.2.10-1~deb9u1 Copyright (c) 2007-2018 the FFmpeg developers
  built with gcc 6.3.0 (Debian 6.3.0-18) 20170516
  configuration: --prefix=/usr --extra-version='1~deb9u1' --toolchain=hardened --libdir=/usr/lib/arm-linux-gnueabihf --incdir=/usr/include/arm-linux-gnueabihf --enable-gpl --disable-stripping --enable-avresample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libebur128 --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmp3lame --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-omx --enable-openal --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libopencv --enable-libx264 --enable-shared
  libavutil      55. 34.101 / 55. 34.101
  libavcodec     57. 64.101 / 57. 64.101
  libavformat    57. 56.101 / 57. 56.101
  libavdevice    57.  1.100 / 57.  1.100
  libavfilter     6. 65.100 /  6. 65.100
  libavresample   3.  1.  0 /  3.  1.  0
  libswscale      4.  2.100 /  4.  2.100
  libswresample   2.  3.100 /  2.  3.100
  libpostproc    54.  1.100 / 54.  1.100
[hls,applehttp @ 0x11d7e00] Opening '/home/osmc/.kodi/userdata/addon_data/plugin.video.ivysilani/index-f1-v1-a1.m3u8' for reading
/home/osmc/.kodi/userdata/addon_data/plugin.video.ivysilani/playlist.m3u8: No such file or directory
phracek commented 6 years ago

Otestuju to jakmile se připojim přes ssh.

S474N commented 6 years ago

Zkouseno na RPi s OpenElec, Kodi 15.x a bohuzel nefunkcni.

zajdee commented 6 years ago

Dnes vyzkoušeno na další RPi+OSMC a iVysilání po patchi funguje.

JimmyS83 commented 6 years ago

Rpi2 + LibreElec, Kodi 16.1, patch nefunguje..

zajdee commented 6 years ago

Potvrzuju, na KODI 16 skutečně nefunguje. Bude to zřejmě jiným přehrávačem (KODI 17 má VideoPlayer, KODI -16 DVDPlayer, který nejspíš očekává jen lokální playlisty). Pro KODI 16 a starší by zafungovalo stažení nejlepšího možného playlistu s chunky a jeho přepsání - změna URL z relativní adresy na adresy absolutní. To by si nicméně vyžádalo mnohem víc práce (a času).

phracek commented 6 years ago

Tak jsem tu opravu dnes aplikoval na OpenElec 8.0.4 a vse jede bez problem. Super prace.

stefanides commented 6 years ago

rbp1-mediacenter-osmc 17.6.0-24 alias 17.6. na Pi Zero funguje podle předpokladu taky. Co mi přijde divné - plugin je z 2018-01-28, mediacenter je ze začátku února, od poloviny března neproběhla ani žádná jiná aktualizace - ale chyba se projevila až někdy před týdnem..? (Aneb ještě nějaká změna zvenku např. na ČT API, která to způsobila?)

JimmyS83 commented 6 years ago

Já zaregistroval chybu až před pár dny. Předpokládám, že se něco změnilo na straně ČT. Je fajn, že už je patch pro Kodi 17 a více; doufejme, že bude brzo opraveno i pro starší (a lepší :) verze.

zajdee commented 6 years ago

Vysvětlení je tady: https://www.lupa.cz/aktuality/ceska-televize-bude-od-kvetna-vyuzivat-noveho-poskytovatele-ivysilani/

CDN77 kromě jiného zvýšila kvalitu vysílaných i zaznamenaných pořadů na 1080p, což je fajn (kromě toho, že na 8 Mbps ADSL lince se přehrávání trhá :-)). Nevýhoda pak je v tom, že se nejspíš mírně změnilo API.

tukanos commented 6 years ago

Chyba se začala objevovat 28.4. v podvečer (změna určitě nastala na straně ČT). Patch funguje na LibreElec 8.2.5 (Kodi 17.x) a Odroid-C2.

otava5 commented 6 years ago

na LE 8.2 funkční. Děkuji....

vhumpa commented 6 years ago

Taky potvrzuji, patch funguje, freshinstall LE 8.2.5.

petr-fischer commented 6 years ago

Potvrzuji funkčnost i z FreeBSD + Kodi 17.6. Možná by autoři mohli zveřejnit tento mikrofix alespoň pro ty, co mají aktuální Kodi. Zatím co ostatní budou čekat na nějakej geniální fix, aktuální již můžou v klidu čučet na ČT.

mencak commented 6 years ago

Zkoušel jsem ohackovat stejně jako zajdee na starém OpenELEC 5.0.8.0 (Odroid U3 a Kodi 14), ale bohužel nefunguje. Nakonec jsem ohackoval takto a jede:

    def playUrl(title, url, image, subtitles=False):
        try:
            xlistitem = xbmcgui.ListItem(title, iconImage="DefaultVideo.png", path=url)
        except:
            xlistitem = xbmcgui.ListItem(title, iconImage="DefaultVideo.png", )
        xlistitem.setInfo("video", { "Title": title })

        playlist = xbmc.PlayList(xbmc.PLAYLIST_VIDEO)
        playlist.clear()
        page = urllib.urlopen(url)
        playlist.add(page.geturl(), xlistitem)

        xbmcPlayer = xbmc.Player()
        xbmcPlayer.play(playlist)
        if subtitles:
            while not player.isPlaying():
                xbmc.sleep(2000)
            player.setSubtitles(_subtitles_path_)

Doufám, že pomůže někomu se starým Kodi -- 14, 15, 16?

Edit1: odsazení Edit2: odstranění player_type = xbmc.PLAYER_CORE_AUTO

S474N commented 6 years ago

Pokud to dobre chapu, tak puvodni odstavec z radku 282 az 292 nahradit tim tvym? Zkousel jsem to na OpenElec 6.0.3 a rovnou to napise chybu doplnku a ani ho nespusti.

V logu to haze tuto chybu:

19:47:37 40.503319 T:839496768 NOTICE: -->Python Interpreter Initialized<-- 19:47:37 40.530392 T:839496768 ERROR: EXCEPTION Thrown (PythonToCppException) : -->Python callback/script returned the following error<--

  • NOTE: IGNORING THIS CAN LEAD TO MEMORY LEAKS! Error Type: <type 'exceptions.SyntaxError'> Error Contents: ('invalid syntax', ('/storage/.kodi/addons/plugin.video.ivysilani/addon.py', 282, 3, 'def playUrl(title, url, image, subtitles=False):\n')) SyntaxError: ('invalid syntax', ('/storage/.kodi/addons/plugin.video.ivysilani/addon.py', 282, 3, 'def playUrl(title, url, image, subtitles=False):\n')) -->End of Python script error report<-- 19:47:37 40.567009 T:1967169536 ERROR: GetDirectory - Error getting plugin://plugin.video.ivysilani/ 19:47:37 40.569096 T:1967169536 ERROR: CGUIMediaWindow::GetDirectory(plugin://plugin.video.ivysilani/) failed 19:47:37 40.595860 T:839496768 NOTICE: Thread BackgroundLoader start, auto delete: false 19:47:44 47.688091 T:831108160 NOTICE: Thread LanguageInvoker start, auto delete: false 19:47:44 47.712891 T:1967169536 ERROR: Control 50 in window 10025 has been asked to focus, but it can't
JimmyS83 commented 6 years ago

Oprava: Potvrzuju funkčnost v Kodi 16.1 s opraveným odsazením. Díky moc! Volbu kvality jsem detailněji nezkoumal, ale mám nastavené 720, a přehrávané video hlásilo 720 :)

mencak commented 6 years ago

Ano, pouze nahradit funkci playUrl. V puvodním textu jsem neměl odsazení o 4 mezery. Upravil jsem. Celý addon.py zde: https://pastebin.com/242e7sA0

Edit: doporučuji vyzkoušet #23, bez player_type = xbmc.PLAYER_CORE_AUTO

S474N commented 6 years ago

Potvrzuji funkcnost na KODI 15 (OpenElec 6.0.3).

mr-flibble commented 6 years ago

Děkuji @zajdee a potvrzuji funkčnost nahraní řádku

player.play(playlist_file_path, li)
za
player.play(url, li)

Přehrávání začalo fungovat. Kodi 17.6 (Xbian, RPI3)

@mencak Zkoušel jsem také nahradit celý addon.py tím z pastebinu, ale při pokusu něco přehrát jsem dostal chybu: File "/storage/.kodi/addons/plugin.video.ivysilani/addon.py", line 294, in playUrl\n player_type = xbmc.PLAYER_CORE_AUTO\n', "AttributeError: 'module' object has no attribute 'PLAYER_CORE_AUTO'\n"]

mencak commented 6 years ago

@mr-flibble zkus(te) prosím https://github.com/kodi-czsk/plugin.video.ivysilani/pull/23 . vypada to, xbmc.PLAYER_CORE_AUTO se kodi 17 nelíbí. PR23 jsem testoval s Kodi 14 a bez problémů.

JimmyS83 commented 6 years ago

23 potvrzuji 16.1 bez problémů

mr-flibble commented 6 years ago

@mencak díky za odkaz. Potvrzuji že přehrávání s #23 na Kodi 17.6 (Xbian, RPI3) funguje

zvirek commented 6 years ago

Ahoj, také mám problém s ivysíláním na RPi s poslední verzí LibreElec ( kodi 17.6 ). ( Na PC s kodi funguje OK ). Jen naprosto netuším, jak co ##kde opatchovat, jak si píšete výše. Mohu poprosit trochu polopaticky o postup ? s Linuxem nemám žádné zkušenosti. Předem díky.

zajdee commented 6 years ago

Pro informaci všem: Česká Televize se vrátila s iVysíláním k O2 (https://www.lupa.cz/aktuality/ceska-televize-vypovedela-smlouvu-s-provozovatelem-ivysilani-firmou-supernetwork/). Už upravené pluginy by snad stále mohly fungovat, a těm z vás, kterým se plugin nepodařilo upravit, by mělo přehrávání zase začít fungovat.

Jestli je to stav dočasný nebo trvalý, to nevíme.

zajdee commented 6 years ago

V registru smluv se objevila smlouva s O2 na provoz iVysílání do ledna 2022. Dokud tedy O2 neudělá nějakou změnu v infrastruktuře, bude dál fungovat původní plug-in. Navrhuji tedy tuto issue uzavřít a děkuji všem za účast.