UNPKG

m3u8

Version:

streaming m3u8 parser for Apple's HTTP Live Streaming protocol

134 lines (107 loc) 4.17 kB
var m3u8 = require('../parser'), sinon = require('sinon'), should = require('should'); describe('parser', function() { it('should error if not valid M3U first line', function(done) { var parser = getParser(); parser.on('error', function(error) { error.message.should.containEql('Non-valid M3U file. First line: '); done(); }); parser.write('NOT VALID\n'); }); describe('#parseLine', function() { it('should call known tags', function() { var parser = getParser(); var mock = sinon.mock(parser); mock.expects('EXT-X-MEDIA').once().returns(45); parser.parseLine('#EXT-X-MEDIA:GROUP-ID="600k", LANGUAGE="eng"'); mock.verify(); }); it('should set data on m3u on unknown tags', function() { var parser = getParser(); parser.parseLine('#THIS-IS-A-TAG:some value'); parser.m3u.get('THIS-IS-A-TAG').should.eql('some value'); }); it('should split on first colon only', function() { var parser = getParser(); parser.parseLine('#THIS-IS-A-TAG:http://www.ted.com'); parser.m3u.get('THIS-IS-A-TAG').should.eql('http://www.ted.com'); }); }); describe('#addItem', function() { it('should make currentItem the added item', function() { var parser = getParser(); var item = new m3u8.M3U.PlaylistItem; parser.addItem(item); parser.currentItem.should.eql(item); }); }); describe('#EXTINF', function() { it('should create a new Playlist item', function() { var parser = getParser(); parser.EXTINF('4.5,some title'); parser.currentItem.constructor.name.should.eql('PlaylistItem'); parser.currentItem.get('duration').should.eql(4.5); parser.currentItem.get('title').should.eql('some title'); }); }); describe('#EXT-X-BYTERANGE', function() { it('should set byteRange on currentItem', function() { var parser = getParser(); parser.EXTINF('4.5,'); parser['EXT-X-BYTERANGE']('45@90'); parser.currentItem.get('byteRange').should.eql('45@90'); }); }); describe('#EXT-X-DISCONTINUITY', function() { it('should indicate discontinuation on subsequent playlist item', function() { var parser = getParser(); parser['EXT-X-DISCONTINUITY'](); parser.EXTINF('4.5,some title'); parser.currentItem.constructor.name.should.eql('PlaylistItem'); parser.currentItem.get('duration').should.eql(4.5); parser.currentItem.get('title').should.eql('some title'); parser.currentItem.get('discontinuity').should.eql(true); }); }); describe('#EXT-X-STREAM-INF', function() { it('should create a new Stream item', function() { var parser = getParser(); parser['EXT-X-STREAM-INF']('NAME="I am a stream!"'); parser.currentItem.constructor.name.should.eql('StreamItem'); parser.currentItem.get('name').should.eql('I am a stream!'); }); }); describe('#EXT-X-I-FRAME-STREAM-INF', function() { it('should create a new Iframe Stream item', function() { var parser = getParser(); parser['EXT-X-I-FRAME-STREAM-INF']('NAME="I am an iframe stream!"'); parser.currentItem.constructor.name.should.eql('IframeStreamItem'); parser.currentItem.get('name').should.eql('I am an iframe stream!'); }); }); describe('#EXT-X-MEDIA-INF', function() { it('should create a new Media item', function() { var parser = getParser(); parser['EXT-X-MEDIA']('NAME="I am a media item!"'); parser.currentItem.constructor.name.should.eql('MediaItem'); parser.currentItem.get('name').should.eql('I am a media item!'); }); }); describe('#parseAttributes', function() { it('should return an array of key-values', function() { var parser = getParser(); var keyValues = parser.parseAttributes( 'KEY="I, am a value",RESOLUTION=640x360,FORCED=NO' ); keyValues[0].key.should.eql('KEY'); keyValues[0].value.should.eql('"I, am a value"'); keyValues[2].value.should.eql('NO'); }); }); }); function getParser() { var parser = m3u8.createStream(); return parser; }