spec/lib/m3u8/reader_spec.rb in m3u8-0.7.0 vs spec/lib/m3u8/reader_spec.rb in m3u8-0.7.1
- old
+ new
@@ -1,241 +1,259 @@
+# frozen_string_literal: true
require 'spec_helper'
describe M3u8::Reader do
- it 'should parse master playlist' do
- file = File.open 'spec/fixtures/master.m3u8'
- reader = M3u8::Reader.new
- playlist = reader.read file
- expect(playlist.master?).to be true
+ describe '#read' do
+ it 'should parse master playlist' do
+ file = File.open('spec/fixtures/master.m3u8')
+ reader = M3u8::Reader.new
+ playlist = reader.read(file)
+ expect(playlist.master?).to be true
- expect(playlist.independent_segments).to be true
+ expect(playlist.independent_segments).to be true
- item = playlist.items[0]
- expect(item).to be_a(M3u8::SessionKeyItem)
- expect(item.method).to eq('AES-128')
- expect(item.uri).to eq('https://priv.example.com/key.php?r=52')
+ item = playlist.items[0]
+ expect(item).to be_a(M3u8::SessionKeyItem)
+ expect(item.method).to eq('AES-128')
+ expect(item.uri).to eq('https://priv.example.com/key.php?r=52')
- item = playlist.items[1]
- expect(item).to be_a(M3u8::PlaybackStart)
- expect(item.time_offset).to eq(20.2)
+ item = playlist.items[1]
+ expect(item).to be_a(M3u8::PlaybackStart)
+ expect(item.time_offset).to eq(20.2)
- item = playlist.items[2]
- expect(item).to be_a(M3u8::PlaylistItem)
- expect(item.uri).to eq('hls/1080-7mbps/1080-7mbps.m3u8')
- expect(item.program_id).to eq('1')
- expect(item.width).to eq(1920)
- expect(item.height).to eq(1080)
- expect(item.resolution).to eq('1920x1080')
- expect(item.codecs).to eq('avc1.640028,mp4a.40.2')
- expect(item.bandwidth).to eq(5_042_000)
- expect(item.iframe).to be false
- expect(item.average_bandwidth).to be_nil
+ item = playlist.items[2]
+ expect(item).to be_a(M3u8::PlaylistItem)
+ expect(item.uri).to eq('hls/1080-7mbps/1080-7mbps.m3u8')
+ expect(item.program_id).to eq('1')
+ expect(item.width).to eq(1920)
+ expect(item.height).to eq(1080)
+ expect(item.resolution).to eq('1920x1080')
+ expect(item.codecs).to eq('avc1.640028,mp4a.40.2')
+ expect(item.bandwidth).to eq(5_042_000)
+ expect(item.iframe).to be false
+ expect(item.average_bandwidth).to be_nil
- item = playlist.items[7]
- expect(item).to be_a(M3u8::PlaylistItem)
- expect(item.uri).to eq('hls/64k/64k.m3u8')
- expect(item.program_id).to eq('1')
- expect(item.width).to be_nil
- expect(item.height).to be_nil
- expect(item.resolution).to be_nil
- expect(item.codecs).to eq('mp4a.40.2')
- expect(item.bandwidth).to eq(6400)
- expect(item.iframe).to be false
- expect(item.average_bandwidth).to be_nil
+ item = playlist.items[7]
+ expect(item).to be_a(M3u8::PlaylistItem)
+ expect(item.uri).to eq('hls/64k/64k.m3u8')
+ expect(item.program_id).to eq('1')
+ expect(item.width).to be_nil
+ expect(item.height).to be_nil
+ expect(item.resolution).to be_nil
+ expect(item.codecs).to eq('mp4a.40.2')
+ expect(item.bandwidth).to eq(6400)
+ expect(item.iframe).to be false
+ expect(item.average_bandwidth).to be_nil
- expect(playlist.items.size).to eq(8)
+ expect(playlist.items.size).to eq(8)
- item = playlist.items.last
- expect(item.resolution).to be_nil
- end
+ item = playlist.items.last
+ expect(item.resolution).to be_nil
+ end
- it 'should parse master playlist with I-Frames' do
- file = File.open 'spec/fixtures/master_iframes.m3u8'
- reader = M3u8::Reader.new
- playlist = reader.read file
- expect(playlist.master?).to be true
+ it 'should parse master playlist with I-Frames' do
+ file = File.open('spec/fixtures/master_iframes.m3u8')
+ reader = M3u8::Reader.new
+ playlist = reader.read(file)
+ expect(playlist.master?).to be true
- expect(playlist.items.size).to eq(7)
+ expect(playlist.items.size).to eq(7)
- item = playlist.items[1]
- expect(item).to be_a(M3u8::PlaylistItem)
- expect(item.bandwidth).to eq(86_000)
- expect(item.iframe).to be true
- expect(item.uri).to eq 'low/iframe.m3u8'
- end
+ item = playlist.items[1]
+ expect(item).to be_a(M3u8::PlaylistItem)
+ expect(item.bandwidth).to eq(86_000)
+ expect(item.iframe).to be true
+ expect(item.uri).to eq('low/iframe.m3u8')
+ end
- it 'should parse segment playlist' do
- file = File.open 'spec/fixtures/playlist.m3u8'
- reader = M3u8::Reader.new
- playlist = reader.read file
- expect(playlist.master?).to be false
- expect(playlist.version).to eq 4
- expect(playlist.sequence).to eq 1
- expect(playlist.cache).to be false
- expect(playlist.target).to eq 12
- expect(playlist.type).to eq 'VOD'
+ it 'should parse segment playlist' do
+ file = File.open('spec/fixtures/playlist.m3u8')
+ reader = M3u8::Reader.new
+ playlist = reader.read(file)
+ expect(playlist.master?).to be false
+ expect(playlist.version).to eq(4)
+ expect(playlist.sequence).to eq(1)
+ expect(playlist.cache).to be false
+ expect(playlist.target).to eq(12)
+ expect(playlist.type).to eq('VOD')
- item = playlist.items[0]
- expect(item).to be_a(M3u8::SegmentItem)
- expect(item.duration).to eq 11.344644
- expect(item.comment).to be_nil
+ item = playlist.items[0]
+ expect(item).to be_a(M3u8::SegmentItem)
+ expect(item.duration).to eq(11.344644)
+ expect(item.comment).to be_nil
- item = playlist.items[4]
- expect(item).to be_a(M3u8::TimeItem)
- expect(item.time).to eq(Time.iso8601('2010-02-19T14:54:23Z'))
+ item = playlist.items[4]
+ expect(item).to be_a(M3u8::TimeItem)
+ expect(item.time).to eq(Time.iso8601('2010-02-19T14:54:23Z'))
- expect(playlist.items.size).to eq 140
- end
+ expect(playlist.items.size).to eq(140)
+ end
- it 'should parse I-Frame playlist' do
- file = File.open 'spec/fixtures/iframes.m3u8'
- reader = M3u8::Reader.new
- playlist = reader.read file
+ it 'should parse I-Frame playlist' do
+ file = File.open('spec/fixtures/iframes.m3u8')
+ reader = M3u8::Reader.new
+ playlist = reader.read(file)
- expect(playlist.iframes_only).to be true
- expect(playlist.items.size).to eq 3
+ expect(playlist.iframes_only).to be true
+ expect(playlist.items.size).to eq(3)
- item = playlist.items[0]
- expect(item).to be_a(M3u8::SegmentItem)
- expect(item.duration).to eq 4.12
- expect(item.byterange.length).to eq 9400
- expect(item.byterange.start).to eq 376
- expect(item.segment).to eq 'segment1.ts'
+ item = playlist.items[0]
+ expect(item).to be_a(M3u8::SegmentItem)
+ expect(item.duration).to eq(4.12)
+ expect(item.byterange.length).to eq(9400)
+ expect(item.byterange.start).to eq(376)
+ expect(item.segment).to eq('segment1.ts')
- item = playlist.items[1]
- expect(item.byterange.length).to eq 7144
- expect(item.byterange.start).to be_nil
- end
+ item = playlist.items[1]
+ expect(item.byterange.length).to eq(7144)
+ expect(item.byterange.start).to be_nil
+ end
- it 'should parse segment playlist with comments' do
- file = File.open 'spec/fixtures/playlist_with_comments.m3u8'
- reader = M3u8::Reader.new
- playlist = reader.read file
- expect(playlist.master?).to be false
- expect(playlist.version).to be 4
- expect(playlist.sequence).to be 1
- expect(playlist.cache).to be false
- expect(playlist.target).to be 12
- expect(playlist.type).to eq 'VOD'
+ it 'should parse segment playlist with comments' do
+ file = File.open('spec/fixtures/playlist_with_comments.m3u8')
+ reader = M3u8::Reader.new
+ playlist = reader.read(file)
+ expect(playlist.master?).to be false
+ expect(playlist.version).to eq(4)
+ expect(playlist.sequence).to eq(1)
+ expect(playlist.cache).to be false
+ expect(playlist.target).to eq(12)
+ expect(playlist.type).to eq('VOD')
- item = playlist.items[0]
- expect(item).to be_a(M3u8::SegmentItem)
- expect(item.duration).to eq 11.344644
- expect(item.comment).to eq 'anything'
+ item = playlist.items[0]
+ expect(item).to be_a(M3u8::SegmentItem)
+ expect(item.duration).to eq(11.344644)
+ expect(item.comment).to eq('anything')
- item = playlist.items[1]
- expect(item).to be_a(M3u8::DiscontinuityItem)
+ item = playlist.items[1]
+ expect(item).to be_a(M3u8::DiscontinuityItem)
- expect(playlist.items.size).to eq 139
- end
+ expect(playlist.items.size).to eq(139)
+ end
- it 'should parse variant playlist with audio options and groups' do
- file = File.open 'spec/fixtures/variant_audio.m3u8'
- reader = M3u8::Reader.new
- playlist = reader.read file
+ it 'should parse variant playlist with audio options and groups' do
+ file = File.open('spec/fixtures/variant_audio.m3u8')
+ reader = M3u8::Reader.new
+ playlist = reader.read(file)
- expect(playlist.master?).to be true
- expect(playlist.items.size).to eq 10
+ expect(playlist.master?).to be true
+ expect(playlist.items.size).to eq(10)
- item = playlist.items[0]
- expect(item).to be_a M3u8::MediaItem
- expect(item.type).to eq 'AUDIO'
- expect(item.group_id).to eq 'audio-lo'
- expect(item.language).to eq 'eng'
- expect(item.assoc_language).to eq 'spoken'
- expect(item.name).to eq 'English'
- expect(item.autoselect).to be true
- expect(item.default).to be true
- expect(item.uri).to eq 'englo/prog_index.m3u8'
- expect(item.forced).to be true
- end
+ item = playlist.items[0]
+ expect(item).to be_a(M3u8::MediaItem)
+ expect(item.type).to eq('AUDIO')
+ expect(item.group_id).to eq('audio-lo')
+ expect(item.language).to eq('eng')
+ expect(item.assoc_language).to eq('spoken')
+ expect(item.name).to eq('English')
+ expect(item.autoselect).to be true
+ expect(item.default).to be true
+ expect(item.uri).to eq('englo/prog_index.m3u8')
+ expect(item.forced).to be true
+ end
- it 'should parse variant playlist with camera angles' do
- file = File.open 'spec/fixtures/variant_angles.m3u8'
- reader = M3u8::Reader.new
- playlist = reader.read file
+ it 'should parse variant playlist with camera angles' do
+ file = File.open('spec/fixtures/variant_angles.m3u8')
+ reader = M3u8::Reader.new
+ playlist = reader.read(file)
- expect(playlist.master?).to be true
- expect(playlist.items.size).to eq 11
+ expect(playlist.master?).to be true
+ expect(playlist.items.size).to eq(11)
- item = playlist.items[1]
- expect(item).to be_a M3u8::MediaItem
- expect(item.type).to eq 'VIDEO'
- expect(item.group_id).to eq '200kbs'
- expect(item.language).to be_nil
- expect(item.name).to eq 'Angle2'
- expect(item.autoselect).to be true
- expect(item.default).to be false
- expect(item.uri).to eq 'Angle2/200kbs/prog_index.m3u8'
+ item = playlist.items[1]
+ expect(item).to be_a(M3u8::MediaItem)
+ expect(item.type).to eq('VIDEO')
+ expect(item.group_id).to eq('200kbs')
+ expect(item.language).to be_nil
+ expect(item.name).to eq('Angle2')
+ expect(item.autoselect).to be true
+ expect(item.default).to be false
+ expect(item.uri).to eq('Angle2/200kbs/prog_index.m3u8')
- item = playlist.items[9]
- expect(item.average_bandwidth).to eq 300_001
- expect(item.audio).to eq 'aac'
- expect(item.video).to eq '200kbs'
- expect(item.closed_captions).to eq 'captions'
- expect(item.subtitles).to eq 'subs'
- end
+ item = playlist.items[9]
+ expect(item.average_bandwidth).to eq(300_001)
+ expect(item.audio).to eq('aac')
+ expect(item.video).to eq('200kbs')
+ expect(item.closed_captions).to eq('captions')
+ expect(item.subtitles).to eq('subs')
+ end
- it 'should process multiple reads as separate playlists' do
- file = File.open 'spec/fixtures/master.m3u8'
- reader = M3u8::Reader.new
- playlist = reader.read file
+ it 'should process multiple reads as separate playlists' do
+ file = File.open('spec/fixtures/master.m3u8')
+ reader = M3u8::Reader.new
+ playlist = reader.read(file)
- expect(playlist.items.size).to eq(8)
+ expect(playlist.items.size).to eq(8)
- file = File.open 'spec/fixtures/master.m3u8'
- playlist = reader.read file
+ file = File.open('spec/fixtures/master.m3u8')
+ playlist = reader.read(file)
- expect(playlist.items.size).to eq(8)
- end
+ expect(playlist.items.size).to eq(8)
+ end
- it 'should parse playlist with session data' do
- file = File.open 'spec/fixtures/session_data.m3u8'
- reader = M3u8::Reader.new
- playlist = reader.read file
+ it 'should parse playlist with session data' do
+ file = File.open('spec/fixtures/session_data.m3u8')
+ reader = M3u8::Reader.new
+ playlist = reader.read(file)
- expect(playlist.items.size).to eq 3
+ expect(playlist.items.size).to eq(3)
- item = playlist.items[0]
- expect(item).to be_a M3u8::SessionDataItem
- expect(item.data_id).to eq 'com.example.lyrics'
- expect(item.uri).to eq 'lyrics.json'
- end
+ item = playlist.items[0]
+ expect(item).to be_a(M3u8::SessionDataItem)
+ expect(item.data_id).to eq('com.example.lyrics')
+ expect(item.uri).to eq('lyrics.json')
+ end
- it 'should parse encrypted playlist' do
- file = File.open 'spec/fixtures/encrypted.m3u8'
- reader = M3u8::Reader.new
- playlist = reader.read file
+ it 'should parse encrypted playlist' do
+ file = File.open('spec/fixtures/encrypted.m3u8')
+ reader = M3u8::Reader.new
+ playlist = reader.read(file)
- expect(playlist.items.size).to eq 6
+ expect(playlist.items.size).to eq(6)
- item = playlist.items[0]
- expect(item).to be_a M3u8::KeyItem
- expect(item.method).to eq 'AES-128'
- expect(item.uri).to eq 'https://priv.example.com/key.php?r=52'
- end
+ item = playlist.items[0]
+ expect(item).to be_a(M3u8::KeyItem)
+ expect(item.method).to eq('AES-128')
+ expect(item.uri).to eq('https://priv.example.com/key.php?r=52')
+ end
- it 'should parse map (media intialization section) playlists' do
- file = File.open 'spec/fixtures/map_playlist.m3u8'
- reader = M3u8::Reader.new
- playlist = reader.read file
+ it 'should parse map (media intialization section) playlists' do
+ file = File.open('spec/fixtures/map_playlist.m3u8')
+ reader = M3u8::Reader.new
+ playlist = reader.read(file)
- expect(playlist.items.size).to eq 1
+ expect(playlist.items.size).to eq(1)
- item = playlist.items[0]
- expect(item).to be_a M3u8::MapItem
- expect(item.uri).to eq 'frelo/prog_index.m3u8'
- expect(item.byterange.length).to eq 4500
- expect(item.byterange.start).to eq 600
- end
+ item = playlist.items[0]
+ expect(item).to be_a(M3u8::MapItem)
+ expect(item.uri).to eq('frelo/prog_index.m3u8')
+ expect(item.byterange.length).to eq(4500)
+ expect(item.byterange.start).to eq(600)
+ end
- it 'should read segment with timestamp' do
- file = File.open 'spec/fixtures/timestamp_playlist.m3u8'
- reader = M3u8::Reader.new
- playlist = reader.read file
- expect(playlist.items.count).to eq 6
+ it 'should read segment with timestamp' do
+ file = File.open('spec/fixtures/timestamp_playlist.m3u8')
+ reader = M3u8::Reader.new
+ playlist = reader.read(file)
+ expect(playlist.items.count).to eq(6)
- item_date_time = playlist.items.first.program_date_time
- expect(item_date_time).to be_a M3u8::TimeItem
- expect(item_date_time.time).to eq Time.iso8601('2016-04-11T15:24:31Z')
+ item_date_time = playlist.items.first.program_date_time
+ expect(item_date_time).to be_a(M3u8::TimeItem)
+ expect(item_date_time.time).to eq(Time.iso8601('2016-04-11T15:24:31Z'))
+ end
+
+ context 'playlist with daterange' do
+ it 'parses playlist' do
+ file = File.open('spec/fixtures/date_range_scte35.m3u8')
+ reader = M3u8::Reader.new
+ playlist = reader.read(file)
+ expect(playlist.items.count).to eq(5)
+
+ item = playlist.items[0]
+ expect(item).to be_a(M3u8::DateRangeItem)
+
+ item = playlist.items[4]
+ expect(item).to be_a(M3u8::DateRangeItem)
+ end
+ end
end
end