Kodi Community Forum
HTTP Live Streaming (HLS) / Reloading Media Playlist Files - Printable Version

+- Kodi Community Forum (https://forum.kodi.tv)
+-- Forum: Development (https://forum.kodi.tv/forumdisplay.php?fid=32)
+--- Forum: Kodi Application (https://forum.kodi.tv/forumdisplay.php?fid=93)
+--- Thread: HTTP Live Streaming (HLS) / Reloading Media Playlist Files (/showthread.php?tid=346347)



HTTP Live Streaming (HLS) / Reloading Media Playlist Files - jay.kody - 2019-08-16

Hi there!

I'm the developer of the SoundCloud plugin and encountered an issue regarding HLS playlists.

The SoundCloud plugin simply passes a m3u8 playlist to Kodi, which correctly plays it. But SoundCloud includes session tokens in the HLS playlist segments. These session tokens expire after 30 minutes.
Since Kodi doesn't periodically reload the m3u8 playlist, after 30 minutes the playlist segments can't be loaded anymore and the playback stops. Here is a shortened example of such a playlist:

Code:

#EXTM3U
#EXT-X-VERSION:6
#EXT-X-PLAYLIST-TYPE:VOD
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:1.985272,
https://cf-hls-media.sndcdn.com/media/0/31762/yLqAxuhvDNB8.128.mp3?Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiKjovL2NmLWhscy1tZWRpYS5zbmRjZG4uY29tL21lZGlhLyovKi95THFBeHVodkROQjguMTI4Lm1wMyIsIkNvbmRpdGlvbiI6eyJEYXRlTGVzc1RoYW4iOnsiQVdTOkVwb2NoVGltZSI6MTU2NTk2NzY4Nn19fV19&Signature=WOff1JuQ9x9PSRLNYzh4CJZC32aW~XzS9JiMZxhjwXbPcXOrNHvseW5sjiIICavYGzUSs-LUqVNgYa6cXpGDe-sywccBKUlUV1ompl0SeSfcKFVIAHyDdbP~xc4cKD6dJddwr7KD90EUjNFbECZ0av-qw6M~IzyelbDvflaZrwM2z8WGKdImH3c0asHflV64nDKh9W6hhJf6KNrSdk2o01dwKaiGTyyPhxOyUYqNp3OSOlfehVC4cziz5SdZZlR4uWA6hh4dt~wN7b1YORZ4QTY6yNarp0jXWBULg2sQSi-NGoqlD0U55PWEhfjYkhav2uyQIwBUiMIMhV8U676jhA__&Key-Pair-Id=APKAI6TU7MMXM5DG6EPQ
#EXTINF:2.977908,
https://cf-hls-media.sndcdn.com/media/31763/79410/yLqAxuhvDNB8.128.mp3?Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiKjovL2NmLWhscy1tZWRpYS5zbmRjZG4uY29tL21lZGlhLyovKi95THFBeHVodkROQjguMTI4Lm1wMyIsIkNvbmRpdGlvbiI6eyJEYXRlTGVzc1RoYW4iOnsiQVdTOkVwb2NoVGltZSI6MTU2NTk2NzY4Nn19fV19&Signature=WOff1JuQ9x9PSRLNYzh4CJZC32aW~XzS9JiMZxhjwXbPcXOrNHvseW5sjiIICavYGzUSs-LUqVNgYa6cXpGDe-sywccBKUlUV1ompl0SeSfcKFVIAHyDdbP~xc4cKD6dJddwr7KD90EUjNFbECZ0av-qw6M~IzyelbDvflaZrwM2z8WGKdImH3c0asHflV64nDKh9W6hhJf6KNrSdk2o01dwKaiGTyyPhxOyUYqNp3OSOlfehVC4cziz5SdZZlR4uWA6hh4dt~wN7b1YORZ4QTY6yNarp0jXWBULg2sQSi-NGoqlD0U55PWEhfjYkhav2uyQIwBUiMIMhV8U676jhA__&Key-Pair-Id=APKAI6TU7MMXM5DG6EPQ
#EXTINF:4.989302,
https://cf-hls-media.sndcdn.com/media/79411/159240/yLqAxuhvDNB8.128.mp3?Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiKjovL2NmLWhscy1tZWRpYS5zbmRjZG4uY29tL21lZGlhLyovKi95THFBeHVodkROQjguMTI4Lm1wMyIsIkNvbmRpdGlvbiI6eyJEYXRlTGVzc1RoYW4iOnsiQVdTOkVwb2NoVGltZSI6MTU2NTk2NzY4Nn19fV19&Signature=WOff1JuQ9x9PSRLNYzh4CJZC32aW~XzS9JiMZxhjwXbPcXOrNHvseW5sjiIICavYGzUSs-LUqVNgYa6cXpGDe-sywccBKUlUV1ompl0SeSfcKFVIAHyDdbP~xc4cKD6dJddwr7KD90EUjNFbECZ0av-qw6M~IzyelbDvflaZrwM2z8WGKdImH3c0asHflV64nDKh9W6hhJf6KNrSdk2o01dwKaiGTyyPhxOyUYqNp3OSOlfehVC4cziz5SdZZlR4uWA6hh4dt~wN7b1YORZ4QTY6yNarp0jXWBULg2sQSi-NGoqlD0U55PWEhfjYkhav2uyQIwBUiMIMhV8U676jhA__&Key-Pair-Id=APKAI6TU7MMXM5DG6EPQ
#EXTINF:9.978604,
https://cf-hls-media.sndcdn.com/media/159241/318900/yLqAxuhvDNB8.128.mp3?Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiKjovL2NmLWhscy1tZWRpYS5zbmRjZG4uY29tL21lZGlhLyovKi95THFBeHVodkROQjguMTI4Lm1wMyIsIkNvbmRpdGlvbiI6eyJEYXRlTGVzc1RoYW4iOnsiQVdTOkVwb2NoVGltZSI6MTU2NTk2NzY4Nn19fV19&Signature=WOff1JuQ9x9PSRLNYzh4CJZC32aW~XzS9JiMZxhjwXbPcXOrNHvseW5sjiIICavYGzUSs-LUqVNgYa6cXpGDe-sywccBKUlUV1ompl0SeSfcKFVIAHyDdbP~xc4cKD6dJddwr7KD90EUjNFbECZ0av-qw6M~IzyelbDvflaZrwM2z8WGKdImH3c0asHflV64nDKh9W6hhJf6KNrSdk2o01dwKaiGTyyPhxOyUYqNp3OSOlfehVC4cziz5SdZZlR4uWA6hh4dt~wN7b1YORZ4QTY6yNarp0jXWBULg2sQSi-NGoqlD0U55PWEhfjYkhav2uyQIwBUiMIMhV8U676jhA__&Key-Pair-Id=APKAI6TU7MMXM5DG6EPQ
#EXTINF:9.978604,
https://cf-hls-media.sndcdn.com/media/318901/478561/yLqAxuhvDNB8.128.mp3?Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiKjovL2NmLWhscy1tZWRpYS5zbmRjZG4uY29tL21lZGlhLyovKi95THFBeHVodkROQjguMTI4Lm1wMyIsIkNvbmRpdGlvbiI6eyJEYXRlTGVzc1RoYW4iOnsiQVdTOkVwb2NoVGltZSI6MTU2NTk2NzY4Nn19fV19&Signature=WOff1JuQ9x9PSRLNYzh4CJZC32aW~XzS9JiMZxhjwXbPcXOrNHvseW5sjiIICavYGzUSs-LUqVNgYa6cXpGDe-sywccBKUlUV1ompl0SeSfcKFVIAHyDdbP~xc4cKD6dJddwr7KD90EUjNFbECZ0av-qw6M~IzyelbDvflaZrwM2z8WGKdImH3c0asHflV64nDKh9W6hhJf6KNrSdk2o01dwKaiGTyyPhxOyUYqNp3OSOlfehVC4cziz5SdZZlR4uWA6hh4dt~wN7b1YORZ4QTY6yNarp0jXWBULg2sQSi-NGoqlD0U55PWEhfjYkhav2uyQIwBUiMIMhV8U676jhA__&Key-Pair-Id=APKAI6TU7MMXM5DG6EPQ
#EXTINF:7.052940,
https://cf-hls-media.sndcdn.com/media/2554147/2666995/yLqAxuhvDNB8.128.mp3?Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiKjovL2NmLWhscy1tZWRpYS5zbmRjZG4uY29tL21lZGlhLyovKi95THFBeHVodkROQjguMTI4Lm1wMyIsIkNvbmRpdGlvbiI6eyJEYXRlTGVzc1RoYW4iOnsiQVdTOkVwb2NoVGltZSI6MTU2NTk2NzY4Nn19fV19&Signature=WOff1JuQ9x9PSRLNYzh4CJZC32aW~XzS9JiMZxhjwXbPcXOrNHvseW5sjiIICavYGzUSs-LUqVNgYa6cXpGDe-sywccBKUlUV1ompl0SeSfcKFVIAHyDdbP~xc4cKD6dJddwr7KD90EUjNFbECZ0av-qw6M~IzyelbDvflaZrwM2z8WGKdImH3c0asHflV64nDKh9W6hhJf6KNrSdk2o01dwKaiGTyyPhxOyUYqNp3OSOlfehVC4cziz5SdZZlR4uWA6hh4dt~wN7b1YORZ4QTY6yNarp0jXWBULg2sQSi-NGoqlD0U55PWEhfjYkhav2uyQIwBUiMIMhV8U676jhA__&Key-Pair-Id=APKAI6TU7MMXM5DG6EPQ
#EXT-X-ENDLIST

So I took a closer look at the IETF HLS specification, which has its own section on reloading playlist files: https://tools.ietf.org/html/rfc8216#section-6.3.4
It states that

Code:

The client MUST periodically reload a Media Playlist file to learn what media is currently available,
unless it contains an EXT-X- PLAYLIST-TYPE tag with a value of VOD, or a value of EVENT and the EXT-X-ENDLIST tag is also present.

So Kodi does the right thing, since it doesn't have to reload the playlist according to the specification. The expiring SoundCloud session tokens are probably a spec violation, but I can't change that...
SoundCloud solves this issue by reloading the m3u8 playlist as soon as it encounters the first non 200 OK HTTP responses (which indicate expired session tokens).

I thought about implementing a fix in the SoundCloud plugin itself, but it feels cumbersome to track the time and trigger a replay (with an audible pause).

What do you think about this issue?
Is it worth to implement a m3u playlist reload feature? Or is there a simple way to solve this inside the plugin?


RE: HTTP Live Streaming (HLS) / Reloading Media Playlist Files - jay.kody - 2019-08-28

Maybe this should be handled by FFmpeg itself. I think I'll open an issue there.

Edit: I didn't open an issue there because a fix (which works around a spec violation issue) would probably be not accepted.