2014-02-08 16:08:39 +01:00
|
|
|
#!/usr/bin/python
|
|
|
|
# ex:ts=4:sw=4:sts=4:et
|
|
|
|
# -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*-
|
|
|
|
|
|
|
|
# The unittest framwork doesn't play nice with pylint:
|
|
|
|
# pylint: disable-msg=C0103
|
|
|
|
|
2016-04-03 19:06:45 +02:00
|
|
|
# We're a test, we go where ever we want (within reason, of course):
|
|
|
|
# pylint: disable-msg=protected-access
|
|
|
|
|
2014-02-08 16:08:39 +01:00
|
|
|
from __future__ import absolute_import
|
|
|
|
import unittest
|
|
|
|
import svtplay_dl.fetcher.hls as hls
|
2018-01-05 21:47:42 +01:00
|
|
|
from svtplay_dl.fetcher.hls import M3U8
|
2015-09-15 20:10:32 +02:00
|
|
|
|
2018-01-19 18:33:14 +01:00
|
|
|
# Example HLS playlist, source:
|
|
|
|
# loosly inspired by
|
|
|
|
# https://devstreaming-cdn.apple.com/videos/streaming/examples/bipbop_4x3/bipbop_4x3_variant.m3u8
|
|
|
|
M3U_EXAMPLE = '''#EXTM3U
|
|
|
|
|
|
|
|
|
|
|
|
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=232370,CODECS="mp4a.40.2, avc1.4d4015"
|
|
|
|
something1/else.m3u8
|
|
|
|
|
|
|
|
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=649879,CODECS="mp4a.40.2, avc1.4d401e"
|
|
|
|
something2/else.m3u8
|
|
|
|
|
|
|
|
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=991714,CODECS="mp4a.40.2, avc1.4d401e"
|
|
|
|
something3/else.m3u8
|
|
|
|
|
|
|
|
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1927833,CODECS="mp4a.40.2, avc1.4d401f"
|
|
|
|
something4/else.m3u8
|
|
|
|
|
|
|
|
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=41457,CODECS="mp4a.40.2"
|
|
|
|
something0/else.m3u8
|
|
|
|
'''
|
|
|
|
|
2018-01-30 20:11:37 +01:00
|
|
|
|
2014-02-08 16:08:39 +01:00
|
|
|
class HlsTest(unittest.TestCase):
|
|
|
|
def test_get_full_url_1(self):
|
|
|
|
for test in [
|
|
|
|
# full http:// url as media segment in playlist
|
|
|
|
{
|
|
|
|
'srcurl': 'INVALID',
|
|
|
|
'segment': 'http://example.com/',
|
|
|
|
'expected': 'http://example.com/'
|
|
|
|
},
|
|
|
|
# full https:// url as media segment in playlist
|
|
|
|
{
|
|
|
|
'srcurl': 'INVALID',
|
|
|
|
'segment': 'https://example.com/',
|
|
|
|
'expected': 'https://example.com/'
|
|
|
|
},
|
|
|
|
# filename as media segment in playlist (http)
|
|
|
|
{
|
|
|
|
'srcurl': 'http://example.com/',
|
|
|
|
'segment': 'foo.ts',
|
|
|
|
'expected': 'http://example.com/foo.ts'
|
|
|
|
},
|
|
|
|
# filename as media segment in playlist (https)
|
|
|
|
{
|
|
|
|
'srcurl': 'https://example.com/',
|
|
|
|
'segment': 'foo.ts',
|
|
|
|
'expected': 'https://example.com/foo.ts'
|
|
|
|
},
|
|
|
|
# replacing srcurl file
|
|
|
|
{
|
|
|
|
'srcurl': 'http://example.com/bar',
|
|
|
|
'segment': 'foo.ts',
|
|
|
|
'expected': 'http://example.com/foo.ts'
|
|
|
|
},
|
|
|
|
# with query parameters
|
|
|
|
{
|
|
|
|
'srcurl': 'http://example.com/bar?baz=qux',
|
|
|
|
'segment': 'foo.ts',
|
2016-03-28 21:11:32 +02:00
|
|
|
'expected': 'http://example.com/foo.ts'
|
2014-02-08 16:08:39 +01:00
|
|
|
},
|
|
|
|
]:
|
|
|
|
self.assertEqual(
|
|
|
|
hls._get_full_url(test['segment'], test['srcurl']),
|
|
|
|
test['expected'])
|
2018-01-05 21:47:42 +01:00
|
|
|
|
|
|
|
def test_parse_m3u8(self):
|
2018-01-19 18:33:14 +01:00
|
|
|
self.maxDiff = None
|
2018-01-05 21:47:42 +01:00
|
|
|
for test in [
|
|
|
|
# full http:// url as media segment in playlist
|
|
|
|
{
|
2018-01-19 18:33:14 +01:00
|
|
|
'playlist': M3U_EXAMPLE,
|
|
|
|
'expected': [
|
2018-01-30 20:11:37 +01:00
|
|
|
{"PROGRAM-ID": "1", "BANDWIDTH": "232370", "TAG": "EXT-X-STREAM-INF",
|
|
|
|
"URI": "something1/else.m3u8", "CODECS": "mp4a.40.2, avc1.4d4015"},
|
|
|
|
{"PROGRAM-ID": "1", "BANDWIDTH": "649879", "TAG": "EXT-X-STREAM-INF",
|
|
|
|
"URI": "something2/else.m3u8", "CODECS": "mp4a.40.2, avc1.4d401e"},
|
|
|
|
{"PROGRAM-ID": "1", "BANDWIDTH": "991714", "TAG": "EXT-X-STREAM-INF",
|
|
|
|
"URI": "something3/else.m3u8", "CODECS": "mp4a.40.2, avc1.4d401e"},
|
|
|
|
{"PROGRAM-ID": "1", "BANDWIDTH": "1927833", "TAG": "EXT-X-STREAM-INF",
|
|
|
|
"URI": "something4/else.m3u8", "CODECS": "mp4a.40.2, avc1.4d401f"},
|
|
|
|
{"PROGRAM-ID": "1", "BANDWIDTH": "41457", "TAG": "EXT-X-STREAM-INF",
|
|
|
|
"URI": "something0/else.m3u8", "CODECS": "mp4a.40.2"}
|
2018-01-19 18:33:14 +01:00
|
|
|
]
|
2018-01-05 21:47:42 +01:00
|
|
|
}
|
|
|
|
# More examples can be found on "https://developer.apple.com/streaming/examples/"
|
|
|
|
]:
|
|
|
|
self.assertEqual(
|
2018-01-19 18:33:14 +01:00
|
|
|
M3U8(test['playlist']).master_playlist,
|
|
|
|
test['expected']
|
|
|
|
)
|