def test_create_a_variant_m3u8_with_iframe_with_video_range_playlists(): variant_m3u8 = m3u8.M3U8() for vrange in ['SDR', 'PQ', 'HLG']: playlist = m3u8.Playlist(uri='video-%s.m3u8' % vrange, stream_info={ 'bandwidth': 3000000, 'video_range': vrange }, media=[], base_uri='http://example.com/%s' % vrange) iframe_playlist = m3u8.IFramePlaylist( uri='video-%s-iframes.m3u8' % vrange, iframe_stream_info={ 'bandwidth': 3000000, 'video_range': vrange }, base_uri='http://example.com/%s' % vrange) variant_m3u8.add_playlist(playlist) variant_m3u8.add_iframe_playlist(iframe_playlist) expected_content = """\ #EXTM3U #EXT-X-STREAM-INF:BANDWIDTH=3000000,VIDEO-RANGE=SDR video-SDR.m3u8 #EXT-X-STREAM-INF:BANDWIDTH=3000000,VIDEO-RANGE=PQ video-PQ.m3u8 #EXT-X-STREAM-INF:BANDWIDTH=3000000,VIDEO-RANGE=HLG video-HLG.m3u8 #EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=3000000,VIDEO-RANGE=SDR,URI="video-SDR-iframes.m3u8" #EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=3000000,VIDEO-RANGE=PQ,URI="video-PQ-iframes.m3u8" #EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=3000000,VIDEO-RANGE=HLG,URI="video-HLG-iframes.m3u8" """ assert expected_content == variant_m3u8.dumps()
def test_create_a_variant_m3u8_with_iframe_with_hdcp_level_playlists(): variant_m3u8 = m3u8.M3U8() for hdcplv in ['NONE', 'TYPE-0', 'TYPE-1']: playlist = m3u8.Playlist( uri='video-%s.m3u8' % hdcplv, stream_info={'bandwidth': 3000000, 'hdcp_level': hdcplv}, media=[], base_uri='http://example.com/%s' % hdcplv ) iframe_playlist = m3u8.IFramePlaylist( uri='video-%s-iframes.m3u8' % hdcplv, iframe_stream_info={'bandwidth': 3000000, 'hdcp_level': hdcplv}, base_uri='http://example.com/%s' % hdcplv ) variant_m3u8.add_playlist(playlist) variant_m3u8.add_iframe_playlist(iframe_playlist) expected_content = """\ #EXTM3U #EXT-X-STREAM-INF:BANDWIDTH=3000000,HDCP-LEVEL=NONE video-NONE.m3u8 #EXT-X-STREAM-INF:BANDWIDTH=3000000,HDCP-LEVEL=TYPE-0 video-TYPE-0.m3u8 #EXT-X-STREAM-INF:BANDWIDTH=3000000,HDCP-LEVEL=TYPE-1 video-TYPE-1.m3u8 #EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=3000000,HDCP-LEVEL=NONE,URI="video-NONE-iframes.m3u8" #EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=3000000,HDCP-LEVEL=TYPE-0,URI="video-TYPE-0-iframes.m3u8" #EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=3000000,HDCP-LEVEL=TYPE-1,URI="video-TYPE-1-iframes.m3u8" """ assert expected_content == variant_m3u8.dumps()
def create_iframe_playlist(playlist): """ Creates a new I-frame playlist. """ try: subprocess.check_output('ffprobe -version', stderr=subprocess.STDOUT, shell=True) except subprocess.CalledProcessError: raise DependencyError('FFmpeg not installed correctly') iframe_playlist = generate_m3u8_for_iframes() total_bytes = 0 total_duration = 0 try: stream = m3u8.load(playlist.absolute_uri) except IOError: raise PlaylistLoadError('Invalid stream url') except AttributeError: raise BadPlaylistError('Invalid playlist - no absolute uri') for segment in stream.segments: iframe_segments, s_bytes, s_duration = create_iframe_segments(segment) for iframe_segment in iframe_segments: iframe_playlist.add_segment(iframe_segment) total_bytes += s_bytes total_duration += s_duration if total_bytes != 0 and total_duration != 0: iframe_bandwidth = str(int(total_bytes / total_duration * 8)) else: return (None, None) iframe_codecs = convert_codecs_for_iframes(playlist.stream_info.codecs) stream_info = {'bandwidth': iframe_bandwidth, 'codecs': iframe_codecs} iframe_playlist_uri = playlist.uri.replace('.m3u8', '-iframes.m3u8') new_iframe_playlist = m3u8.IFramePlaylist(base_uri=playlist.base_uri, uri=iframe_playlist_uri, iframe_stream_info=stream_info) return (new_iframe_playlist, { 'uri': iframe_playlist_uri, 'content': iframe_playlist.dumps() })
def test_create_a_variant_m3u8_with_iframe_with_average_bandwidth_playlists(): variant_m3u8 = m3u8.M3U8() subtitles = m3u8.Media('english_sub.m3u8', 'SUBTITLES', 'subs', 'en', 'English', 'YES', 'YES', 'NO', None) variant_m3u8.add_media(subtitles) low_playlist = m3u8.Playlist(uri='video-800k.m3u8', stream_info={ 'bandwidth': 800000, 'average_bandwidth': 555000, 'resolution': '624x352', 'codecs': 'avc1.4d001f, mp4a.40.5', 'subtitles': 'subs' }, media=[subtitles], base_uri='http://example.com/') low_iframe_playlist = m3u8.IFramePlaylist(uri='video-800k-iframes.m3u8', iframe_stream_info={ 'bandwidth': 151288, 'average_bandwidth': 111000, 'resolution': '624x352', 'codecs': 'avc1.4d001f' }, base_uri='http://example.com/') variant_m3u8.add_playlist(low_playlist) variant_m3u8.add_iframe_playlist(low_iframe_playlist) expected_content = """\ #EXTM3U #EXT-X-MEDIA:URI="english_sub.m3u8",TYPE=SUBTITLES,GROUP-ID="subs",\ LANGUAGE="en",NAME="English",DEFAULT=YES,AUTOSELECT=YES,FORCED=NO #EXT-X-STREAM-INF:BANDWIDTH=800000,AVERAGE-BANDWIDTH=555000,\ RESOLUTION=624x352,CODECS="avc1.4d001f, mp4a.40.5",SUBTITLES="subs" video-800k.m3u8 #EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=151288,\ AVERAGE-BANDWIDTH=111000,RESOLUTION=624x352,CODECS="avc1.4d001f",\ URI="video-800k-iframes.m3u8" """ assert expected_content == variant_m3u8.dumps()