bundle.js 176 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586
  1. (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
  2. 'use strict';
  3. var _lineStream = require('./line-stream');
  4. var _lineStream2 = _interopRequireDefault(_lineStream);
  5. var _parseStream = require('./parse-stream');
  6. var _parseStream2 = _interopRequireDefault(_parseStream);
  7. var _parser = require('./parser');
  8. var _parser2 = _interopRequireDefault(_parser);
  9. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
  10. module.exports = {
  11. LineStream: _lineStream2['default'],
  12. ParseStream: _parseStream2['default'],
  13. Parser: _parser2['default']
  14. }; /**
  15. * @file m3u8/index.js
  16. *
  17. * Utilities for parsing M3U8 files. If the entire manifest is available,
  18. * `Parser` will create an object representation with enough detail for managing
  19. * playback. `ParseStream` and `LineStream` are lower-level parsing primitives
  20. * that do not assume the entirety of the manifest is ready and expose a
  21. * ReadableStream-like interface.
  22. */
  23. },{"./line-stream":2,"./parse-stream":3,"./parser":4}],2:[function(require,module,exports){
  24. 'use strict';
  25. Object.defineProperty(exports, "__esModule", {
  26. value: true
  27. });
  28. var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
  29. var _stream = require('./stream');
  30. var _stream2 = _interopRequireDefault(_stream);
  31. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
  32. function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
  33. function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
  34. function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /**
  35. * @file m3u8/line-stream.js
  36. */
  37. /**
  38. * A stream that buffers string input and generates a `data` event for each
  39. * line.
  40. *
  41. * @class LineStream
  42. * @extends Stream
  43. */
  44. var LineStream = function (_Stream) {
  45. _inherits(LineStream, _Stream);
  46. function LineStream() {
  47. _classCallCheck(this, LineStream);
  48. var _this = _possibleConstructorReturn(this, (LineStream.__proto__ || Object.getPrototypeOf(LineStream)).call(this));
  49. _this.buffer = '';
  50. return _this;
  51. }
  52. /**
  53. * Add new data to be parsed.
  54. *
  55. * @param {String} data the text to process
  56. */
  57. _createClass(LineStream, [{
  58. key: 'push',
  59. value: function push(data) {
  60. var nextNewline = void 0;
  61. this.buffer += data;
  62. nextNewline = this.buffer.indexOf('\n');
  63. for (; nextNewline > -1; nextNewline = this.buffer.indexOf('\n')) {
  64. this.trigger('data', this.buffer.substring(0, nextNewline));
  65. this.buffer = this.buffer.substring(nextNewline + 1);
  66. }
  67. }
  68. }]);
  69. return LineStream;
  70. }(_stream2['default']);
  71. exports['default'] = LineStream;
  72. },{"./stream":5}],3:[function(require,module,exports){
  73. 'use strict';
  74. Object.defineProperty(exports, "__esModule", {
  75. value: true
  76. });
  77. var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
  78. var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
  79. var _stream = require('./stream');
  80. var _stream2 = _interopRequireDefault(_stream);
  81. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
  82. function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
  83. function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
  84. function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /**
  85. * @file m3u8/parse-stream.js
  86. */
  87. /**
  88. * "forgiving" attribute list psuedo-grammar:
  89. * attributes -> keyvalue (',' keyvalue)*
  90. * keyvalue -> key '=' value
  91. * key -> [^=]*
  92. * value -> '"' [^"]* '"' | [^,]*
  93. */
  94. var attributeSeparator = function attributeSeparator() {
  95. var key = '[^=]*';
  96. var value = '"[^"]*"|[^,]*';
  97. var keyvalue = '(?:' + key + ')=(?:' + value + ')';
  98. return new RegExp('(?:^|,)(' + keyvalue + ')');
  99. };
  100. /**
  101. * Parse attributes from a line given the seperator
  102. *
  103. * @param {String} attributes the attibute line to parse
  104. */
  105. var parseAttributes = function parseAttributes(attributes) {
  106. // split the string using attributes as the separator
  107. var attrs = attributes.split(attributeSeparator());
  108. var result = {};
  109. var i = attrs.length;
  110. var attr = void 0;
  111. while (i--) {
  112. // filter out unmatched portions of the string
  113. if (attrs[i] === '') {
  114. continue;
  115. }
  116. // split the key and value
  117. attr = /([^=]*)=(.*)/.exec(attrs[i]).slice(1);
  118. // trim whitespace and remove optional quotes around the value
  119. attr[0] = attr[0].replace(/^\s+|\s+$/g, '');
  120. attr[1] = attr[1].replace(/^\s+|\s+$/g, '');
  121. attr[1] = attr[1].replace(/^['"](.*)['"]$/g, '$1');
  122. result[attr[0]] = attr[1];
  123. }
  124. return result;
  125. };
  126. /**
  127. * A line-level M3U8 parser event stream. It expects to receive input one
  128. * line at a time and performs a context-free parse of its contents. A stream
  129. * interpretation of a manifest can be useful if the manifest is expected to
  130. * be too large to fit comfortably into memory or the entirety of the input
  131. * is not immediately available. Otherwise, it's probably much easier to work
  132. * with a regular `Parser` object.
  133. *
  134. * Produces `data` events with an object that captures the parser's
  135. * interpretation of the input. That object has a property `tag` that is one
  136. * of `uri`, `comment`, or `tag`. URIs only have a single additional
  137. * property, `line`, which captures the entirety of the input without
  138. * interpretation. Comments similarly have a single additional property
  139. * `text` which is the input without the leading `#`.
  140. *
  141. * Tags always have a property `tagType` which is the lower-cased version of
  142. * the M3U8 directive without the `#EXT` or `#EXT-X-` prefix. For instance,
  143. * `#EXT-X-MEDIA-SEQUENCE` becomes `media-sequence` when parsed. Unrecognized
  144. * tags are given the tag type `unknown` and a single additional property
  145. * `data` with the remainder of the input.
  146. *
  147. * @class ParseStream
  148. * @extends Stream
  149. */
  150. var ParseStream = function (_Stream) {
  151. _inherits(ParseStream, _Stream);
  152. function ParseStream() {
  153. _classCallCheck(this, ParseStream);
  154. return _possibleConstructorReturn(this, (ParseStream.__proto__ || Object.getPrototypeOf(ParseStream)).call(this));
  155. }
  156. /**
  157. * Parses an additional line of input.
  158. *
  159. * @param {String} line a single line of an M3U8 file to parse
  160. */
  161. _createClass(ParseStream, [{
  162. key: 'push',
  163. value: function push(line) {
  164. var match = void 0;
  165. var event = void 0;
  166. // strip whitespace
  167. line = line.replace(/^[\u0000\s]+|[\u0000\s]+$/g, '');
  168. if (line.length === 0) {
  169. // ignore empty lines
  170. return;
  171. }
  172. // URIs
  173. if (line[0] !== '#') {
  174. this.trigger('data', {
  175. type: 'uri',
  176. uri: line
  177. });
  178. return;
  179. }
  180. // Comments
  181. if (line.indexOf('#EXT') !== 0) {
  182. this.trigger('data', {
  183. type: 'comment',
  184. text: line.slice(1)
  185. });
  186. return;
  187. }
  188. // strip off any carriage returns here so the regex matching
  189. // doesn't have to account for them.
  190. line = line.replace('\r', '');
  191. // Tags
  192. match = /^#EXTM3U/.exec(line);
  193. if (match) {
  194. this.trigger('data', {
  195. type: 'tag',
  196. tagType: 'm3u'
  197. });
  198. return;
  199. }
  200. match = /^#EXTINF:?([0-9\.]*)?,?(.*)?$/.exec(line);
  201. if (match) {
  202. event = {
  203. type: 'tag',
  204. tagType: 'inf'
  205. };
  206. if (match[1]) {
  207. event.duration = parseFloat(match[1]);
  208. }
  209. if (match[2]) {
  210. event.title = match[2];
  211. }
  212. this.trigger('data', event);
  213. return;
  214. }
  215. match = /^#EXT-X-TARGETDURATION:?([0-9.]*)?/.exec(line);
  216. if (match) {
  217. event = {
  218. type: 'tag',
  219. tagType: 'targetduration'
  220. };
  221. if (match[1]) {
  222. event.duration = parseInt(match[1], 10);
  223. }
  224. this.trigger('data', event);
  225. return;
  226. }
  227. match = /^#ZEN-TOTAL-DURATION:?([0-9.]*)?/.exec(line);
  228. if (match) {
  229. event = {
  230. type: 'tag',
  231. tagType: 'totalduration'
  232. };
  233. if (match[1]) {
  234. event.duration = parseInt(match[1], 10);
  235. }
  236. this.trigger('data', event);
  237. return;
  238. }
  239. match = /^#EXT-X-VERSION:?([0-9.]*)?/.exec(line);
  240. if (match) {
  241. event = {
  242. type: 'tag',
  243. tagType: 'version'
  244. };
  245. if (match[1]) {
  246. event.version = parseInt(match[1], 10);
  247. }
  248. this.trigger('data', event);
  249. return;
  250. }
  251. match = /^#EXT-X-MEDIA-SEQUENCE:?(\-?[0-9.]*)?/.exec(line);
  252. if (match) {
  253. event = {
  254. type: 'tag',
  255. tagType: 'media-sequence'
  256. };
  257. if (match[1]) {
  258. event.number = parseInt(match[1], 10);
  259. }
  260. this.trigger('data', event);
  261. return;
  262. }
  263. match = /^#EXT-X-DISCONTINUITY-SEQUENCE:?(\-?[0-9.]*)?/.exec(line);
  264. if (match) {
  265. event = {
  266. type: 'tag',
  267. tagType: 'discontinuity-sequence'
  268. };
  269. if (match[1]) {
  270. event.number = parseInt(match[1], 10);
  271. }
  272. this.trigger('data', event);
  273. return;
  274. }
  275. match = /^#EXT-X-PLAYLIST-TYPE:?(.*)?$/.exec(line);
  276. if (match) {
  277. event = {
  278. type: 'tag',
  279. tagType: 'playlist-type'
  280. };
  281. if (match[1]) {
  282. event.playlistType = match[1];
  283. }
  284. this.trigger('data', event);
  285. return;
  286. }
  287. match = /^#EXT-X-BYTERANGE:?([0-9.]*)?@?([0-9.]*)?/.exec(line);
  288. if (match) {
  289. event = {
  290. type: 'tag',
  291. tagType: 'byterange'
  292. };
  293. if (match[1]) {
  294. event.length = parseInt(match[1], 10);
  295. }
  296. if (match[2]) {
  297. event.offset = parseInt(match[2], 10);
  298. }
  299. this.trigger('data', event);
  300. return;
  301. }
  302. match = /^#EXT-X-ALLOW-CACHE:?(YES|NO)?/.exec(line);
  303. if (match) {
  304. event = {
  305. type: 'tag',
  306. tagType: 'allow-cache'
  307. };
  308. if (match[1]) {
  309. event.allowed = !/NO/.test(match[1]);
  310. }
  311. this.trigger('data', event);
  312. return;
  313. }
  314. match = /^#EXT-X-MAP:?(.*)$/.exec(line);
  315. if (match) {
  316. event = {
  317. type: 'tag',
  318. tagType: 'map'
  319. };
  320. if (match[1]) {
  321. var attributes = parseAttributes(match[1]);
  322. if (attributes.URI) {
  323. event.uri = attributes.URI;
  324. }
  325. if (attributes.BYTERANGE) {
  326. var _attributes$BYTERANGE = attributes.BYTERANGE.split('@'),
  327. _attributes$BYTERANGE2 = _slicedToArray(_attributes$BYTERANGE, 2),
  328. length = _attributes$BYTERANGE2[0],
  329. offset = _attributes$BYTERANGE2[1];
  330. event.byterange = {};
  331. if (length) {
  332. event.byterange.length = parseInt(length, 10);
  333. }
  334. if (offset) {
  335. event.byterange.offset = parseInt(offset, 10);
  336. }
  337. }
  338. }
  339. this.trigger('data', event);
  340. return;
  341. }
  342. match = /^#EXT-X-STREAM-INF:?(.*)$/.exec(line);
  343. if (match) {
  344. event = {
  345. type: 'tag',
  346. tagType: 'stream-inf'
  347. };
  348. if (match[1]) {
  349. event.attributes = parseAttributes(match[1]);
  350. if (event.attributes.RESOLUTION) {
  351. var split = event.attributes.RESOLUTION.split('x');
  352. var resolution = {};
  353. if (split[0]) {
  354. resolution.width = parseInt(split[0], 10);
  355. }
  356. if (split[1]) {
  357. resolution.height = parseInt(split[1], 10);
  358. }
  359. event.attributes.RESOLUTION = resolution;
  360. }
  361. if (event.attributes.BANDWIDTH) {
  362. event.attributes.BANDWIDTH = parseInt(event.attributes.BANDWIDTH, 10);
  363. }
  364. if (event.attributes['PROGRAM-ID']) {
  365. event.attributes['PROGRAM-ID'] = parseInt(event.attributes['PROGRAM-ID'], 10);
  366. }
  367. }
  368. this.trigger('data', event);
  369. return;
  370. }
  371. match = /^#EXT-X-MEDIA:?(.*)$/.exec(line);
  372. if (match) {
  373. event = {
  374. type: 'tag',
  375. tagType: 'media'
  376. };
  377. if (match[1]) {
  378. event.attributes = parseAttributes(match[1]);
  379. }
  380. this.trigger('data', event);
  381. return;
  382. }
  383. match = /^#EXT-X-ENDLIST/.exec(line);
  384. if (match) {
  385. this.trigger('data', {
  386. type: 'tag',
  387. tagType: 'endlist'
  388. });
  389. return;
  390. }
  391. match = /^#EXT-X-DISCONTINUITY/.exec(line);
  392. if (match) {
  393. this.trigger('data', {
  394. type: 'tag',
  395. tagType: 'discontinuity'
  396. });
  397. return;
  398. }
  399. match = /^#EXT-X-PROGRAM-DATE-TIME:?(.*)$/.exec(line);
  400. if (match) {
  401. event = {
  402. type: 'tag',
  403. tagType: 'program-date-time'
  404. };
  405. if (match[1]) {
  406. event.dateTimeString = match[1];
  407. event.dateTimeObject = new Date(match[1]);
  408. }
  409. this.trigger('data', event);
  410. return;
  411. }
  412. match = /^#EXT-X-KEY:?(.*)$/.exec(line);
  413. if (match) {
  414. event = {
  415. type: 'tag',
  416. tagType: 'key'
  417. };
  418. if (match[1]) {
  419. event.attributes = parseAttributes(match[1]);
  420. // parse the IV string into a Uint32Array
  421. if (event.attributes.IV) {
  422. if (event.attributes.IV.substring(0, 2).toLowerCase() === '0x') {
  423. event.attributes.IV = event.attributes.IV.substring(2);
  424. }
  425. event.attributes.IV = event.attributes.IV.match(/.{8}/g);
  426. event.attributes.IV[0] = parseInt(event.attributes.IV[0], 16);
  427. event.attributes.IV[1] = parseInt(event.attributes.IV[1], 16);
  428. event.attributes.IV[2] = parseInt(event.attributes.IV[2], 16);
  429. event.attributes.IV[3] = parseInt(event.attributes.IV[3], 16);
  430. event.attributes.IV = new Uint32Array(event.attributes.IV);
  431. }
  432. }
  433. this.trigger('data', event);
  434. return;
  435. }
  436. match = /^#EXT-X-CUE-OUT-CONT:?(.*)?$/.exec(line);
  437. if (match) {
  438. event = {
  439. type: 'tag',
  440. tagType: 'cue-out-cont'
  441. };
  442. if (match[1]) {
  443. event.data = match[1];
  444. } else {
  445. event.data = '';
  446. }
  447. this.trigger('data', event);
  448. return;
  449. }
  450. match = /^#EXT-X-CUE-OUT:?(.*)?$/.exec(line);
  451. if (match) {
  452. event = {
  453. type: 'tag',
  454. tagType: 'cue-out'
  455. };
  456. if (match[1]) {
  457. event.data = match[1];
  458. } else {
  459. event.data = '';
  460. }
  461. this.trigger('data', event);
  462. return;
  463. }
  464. match = /^#EXT-X-CUE-IN:?(.*)?$/.exec(line);
  465. if (match) {
  466. event = {
  467. type: 'tag',
  468. tagType: 'cue-in'
  469. };
  470. if (match[1]) {
  471. event.data = match[1];
  472. } else {
  473. event.data = '';
  474. }
  475. this.trigger('data', event);
  476. return;
  477. }
  478. // unknown tag type
  479. this.trigger('data', {
  480. type: 'tag',
  481. data: line.slice(4)
  482. });
  483. }
  484. }]);
  485. return ParseStream;
  486. }(_stream2['default']);
  487. exports['default'] = ParseStream;
  488. },{"./stream":5}],4:[function(require,module,exports){
  489. 'use strict';
  490. Object.defineProperty(exports, "__esModule", {
  491. value: true
  492. });
  493. var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
  494. var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
  495. var _stream = require('./stream');
  496. var _stream2 = _interopRequireDefault(_stream);
  497. var _lineStream = require('./line-stream');
  498. var _lineStream2 = _interopRequireDefault(_lineStream);
  499. var _parseStream = require('./parse-stream');
  500. var _parseStream2 = _interopRequireDefault(_parseStream);
  501. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
  502. function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
  503. function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
  504. function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /**
  505. * @file m3u8/parser.js
  506. */
  507. /**
  508. * A parser for M3U8 files. The current interpretation of the input is
  509. * exposed as a property `manifest` on parser objects. It's just two lines to
  510. * create and parse a manifest once you have the contents available as a string:
  511. *
  512. * ```js
  513. * var parser = new m3u8.Parser();
  514. * parser.push(xhr.responseText);
  515. * ```
  516. *
  517. * New input can later be applied to update the manifest object by calling
  518. * `push` again.
  519. *
  520. * The parser attempts to create a usable manifest object even if the
  521. * underlying input is somewhat nonsensical. It emits `info` and `warning`
  522. * events during the parse if it encounters input that seems invalid or
  523. * requires some property of the manifest object to be defaulted.
  524. *
  525. * @class Parser
  526. * @extends Stream
  527. */
  528. var Parser = function (_Stream) {
  529. _inherits(Parser, _Stream);
  530. function Parser() {
  531. _classCallCheck(this, Parser);
  532. var _this = _possibleConstructorReturn(this, (Parser.__proto__ || Object.getPrototypeOf(Parser)).call(this));
  533. _this.lineStream = new _lineStream2['default']();
  534. _this.parseStream = new _parseStream2['default']();
  535. _this.lineStream.pipe(_this.parseStream);
  536. /* eslint-disable consistent-this */
  537. var self = _this;
  538. /* eslint-enable consistent-this */
  539. var uris = [];
  540. var currentUri = {};
  541. // if specified, the active EXT-X-MAP definition
  542. var currentMap = void 0;
  543. // if specified, the active decryption key
  544. var _key = void 0;
  545. var noop = function noop() {};
  546. var defaultMediaGroups = {
  547. 'AUDIO': {},
  548. 'VIDEO': {},
  549. 'CLOSED-CAPTIONS': {},
  550. 'SUBTITLES': {}
  551. };
  552. // group segments into numbered timelines delineated by discontinuities
  553. var currentTimeline = 0;
  554. // the manifest is empty until the parse stream begins delivering data
  555. _this.manifest = {
  556. allowCache: true,
  557. discontinuityStarts: [],
  558. segments: []
  559. };
  560. // update the manifest with the m3u8 entry from the parse stream
  561. _this.parseStream.on('data', function (entry) {
  562. var mediaGroup = void 0;
  563. var rendition = void 0;
  564. ({
  565. tag: function tag() {
  566. // switch based on the tag type
  567. (({
  568. 'allow-cache': function allowCache() {
  569. this.manifest.allowCache = entry.allowed;
  570. if (!('allowed' in entry)) {
  571. this.trigger('info', {
  572. message: 'defaulting allowCache to YES'
  573. });
  574. this.manifest.allowCache = true;
  575. }
  576. },
  577. byterange: function byterange() {
  578. var byterange = {};
  579. if ('length' in entry) {
  580. currentUri.byterange = byterange;
  581. byterange.length = entry.length;
  582. if (!('offset' in entry)) {
  583. this.trigger('info', {
  584. message: 'defaulting offset to zero'
  585. });
  586. entry.offset = 0;
  587. }
  588. }
  589. if ('offset' in entry) {
  590. currentUri.byterange = byterange;
  591. byterange.offset = entry.offset;
  592. }
  593. },
  594. endlist: function endlist() {
  595. this.manifest.endList = true;
  596. },
  597. inf: function inf() {
  598. if (!('mediaSequence' in this.manifest)) {
  599. this.manifest.mediaSequence = 0;
  600. this.trigger('info', {
  601. message: 'defaulting media sequence to zero'
  602. });
  603. }
  604. if (!('discontinuitySequence' in this.manifest)) {
  605. this.manifest.discontinuitySequence = 0;
  606. this.trigger('info', {
  607. message: 'defaulting discontinuity sequence to zero'
  608. });
  609. }
  610. if (entry.duration > 0) {
  611. currentUri.duration = entry.duration;
  612. }
  613. if (entry.duration === 0) {
  614. currentUri.duration = 0.01;
  615. this.trigger('info', {
  616. message: 'updating zero segment duration to a small value'
  617. });
  618. }
  619. this.manifest.segments = uris;
  620. },
  621. key: function key() {
  622. if (!entry.attributes) {
  623. this.trigger('warn', {
  624. message: 'ignoring key declaration without attribute list'
  625. });
  626. return;
  627. }
  628. // clear the active encryption key
  629. if (entry.attributes.METHOD === 'NONE') {
  630. _key = null;
  631. return;
  632. }
  633. if (!entry.attributes.URI) {
  634. this.trigger('warn', {
  635. message: 'ignoring key declaration without URI'
  636. });
  637. return;
  638. }
  639. if (!entry.attributes.METHOD) {
  640. this.trigger('warn', {
  641. message: 'defaulting key method to AES-128'
  642. });
  643. }
  644. // setup an encryption key for upcoming segments
  645. _key = {
  646. method: entry.attributes.METHOD || 'AES-128',
  647. uri: entry.attributes.URI
  648. };
  649. if (typeof entry.attributes.IV !== 'undefined') {
  650. _key.iv = entry.attributes.IV;
  651. }
  652. },
  653. 'media-sequence': function mediaSequence() {
  654. if (!isFinite(entry.number)) {
  655. this.trigger('warn', {
  656. message: 'ignoring invalid media sequence: ' + entry.number
  657. });
  658. return;
  659. }
  660. this.manifest.mediaSequence = entry.number;
  661. },
  662. 'discontinuity-sequence': function discontinuitySequence() {
  663. if (!isFinite(entry.number)) {
  664. this.trigger('warn', {
  665. message: 'ignoring invalid discontinuity sequence: ' + entry.number
  666. });
  667. return;
  668. }
  669. this.manifest.discontinuitySequence = entry.number;
  670. currentTimeline = entry.number;
  671. },
  672. 'playlist-type': function playlistType() {
  673. if (!/VOD|EVENT/.test(entry.playlistType)) {
  674. this.trigger('warn', {
  675. message: 'ignoring unknown playlist type: ' + entry.playlist
  676. });
  677. return;
  678. }
  679. this.manifest.playlistType = entry.playlistType;
  680. },
  681. map: function map() {
  682. currentMap = {};
  683. if (entry.uri) {
  684. currentMap.uri = entry.uri;
  685. }
  686. if (entry.byterange) {
  687. currentMap.byterange = entry.byterange;
  688. }
  689. },
  690. 'stream-inf': function streamInf() {
  691. this.manifest.playlists = uris;
  692. this.manifest.mediaGroups = this.manifest.mediaGroups || defaultMediaGroups;
  693. if (!entry.attributes) {
  694. this.trigger('warn', {
  695. message: 'ignoring empty stream-inf attributes'
  696. });
  697. return;
  698. }
  699. if (!currentUri.attributes) {
  700. currentUri.attributes = {};
  701. }
  702. _extends(currentUri.attributes, entry.attributes);
  703. },
  704. media: function media() {
  705. this.manifest.mediaGroups = this.manifest.mediaGroups || defaultMediaGroups;
  706. if (!(entry.attributes && entry.attributes.TYPE && entry.attributes['GROUP-ID'] && entry.attributes.NAME)) {
  707. this.trigger('warn', {
  708. message: 'ignoring incomplete or missing media group'
  709. });
  710. return;
  711. }
  712. // find the media group, creating defaults as necessary
  713. var mediaGroupType = this.manifest.mediaGroups[entry.attributes.TYPE];
  714. mediaGroupType[entry.attributes['GROUP-ID']] = mediaGroupType[entry.attributes['GROUP-ID']] || {};
  715. mediaGroup = mediaGroupType[entry.attributes['GROUP-ID']];
  716. // collect the rendition metadata
  717. rendition = {
  718. 'default': /yes/i.test(entry.attributes.DEFAULT)
  719. };
  720. if (rendition['default']) {
  721. rendition.autoselect = true;
  722. } else {
  723. rendition.autoselect = /yes/i.test(entry.attributes.AUTOSELECT);
  724. }
  725. if (entry.attributes.LANGUAGE) {
  726. rendition.language = entry.attributes.LANGUAGE;
  727. }
  728. if (entry.attributes.URI) {
  729. rendition.uri = entry.attributes.URI;
  730. }
  731. if (entry.attributes['INSTREAM-ID']) {
  732. rendition.instreamId = entry.attributes['INSTREAM-ID'];
  733. }
  734. if (entry.attributes.CHARACTERISTICS) {
  735. rendition.characteristics = entry.attributes.CHARACTERISTICS;
  736. }
  737. if (entry.attributes.FORCED) {
  738. rendition.forced = /yes/i.test(entry.attributes.FORCED);
  739. }
  740. // insert the new rendition
  741. mediaGroup[entry.attributes.NAME] = rendition;
  742. },
  743. discontinuity: function discontinuity() {
  744. currentTimeline += 1;
  745. currentUri.discontinuity = true;
  746. this.manifest.discontinuityStarts.push(uris.length);
  747. },
  748. 'program-date-time': function programDateTime() {
  749. this.manifest.dateTimeString = entry.dateTimeString;
  750. this.manifest.dateTimeObject = entry.dateTimeObject;
  751. },
  752. targetduration: function targetduration() {
  753. if (!isFinite(entry.duration) || entry.duration < 0) {
  754. this.trigger('warn', {
  755. message: 'ignoring invalid target duration: ' + entry.duration
  756. });
  757. return;
  758. }
  759. this.manifest.targetDuration = entry.duration;
  760. },
  761. totalduration: function totalduration() {
  762. if (!isFinite(entry.duration) || entry.duration < 0) {
  763. this.trigger('warn', {
  764. message: 'ignoring invalid total duration: ' + entry.duration
  765. });
  766. return;
  767. }
  768. this.manifest.totalDuration = entry.duration;
  769. },
  770. 'cue-out': function cueOut() {
  771. currentUri.cueOut = entry.data;
  772. },
  773. 'cue-out-cont': function cueOutCont() {
  774. currentUri.cueOutCont = entry.data;
  775. },
  776. 'cue-in': function cueIn() {
  777. currentUri.cueIn = entry.data;
  778. }
  779. })[entry.tagType] || noop).call(self);
  780. },
  781. uri: function uri() {
  782. currentUri.uri = entry.uri;
  783. uris.push(currentUri);
  784. // if no explicit duration was declared, use the target duration
  785. if (this.manifest.targetDuration && !('duration' in currentUri)) {
  786. this.trigger('warn', {
  787. message: 'defaulting segment duration to the target duration'
  788. });
  789. currentUri.duration = this.manifest.targetDuration;
  790. }
  791. // annotate with encryption information, if necessary
  792. if (_key) {
  793. currentUri.key = _key;
  794. }
  795. currentUri.timeline = currentTimeline;
  796. // annotate with initialization segment information, if necessary
  797. if (currentMap) {
  798. currentUri.map = currentMap;
  799. }
  800. // prepare for the next URI
  801. currentUri = {};
  802. },
  803. comment: function comment() {
  804. // comments are not important for playback
  805. }
  806. })[entry.type].call(self);
  807. });
  808. return _this;
  809. }
  810. /**
  811. * Parse the input string and update the manifest object.
  812. *
  813. * @param {String} chunk a potentially incomplete portion of the manifest
  814. */
  815. _createClass(Parser, [{
  816. key: 'push',
  817. value: function push(chunk) {
  818. this.lineStream.push(chunk);
  819. }
  820. /**
  821. * Flush any remaining input. This can be handy if the last line of an M3U8
  822. * manifest did not contain a trailing newline but the file has been
  823. * completely received.
  824. */
  825. }, {
  826. key: 'end',
  827. value: function end() {
  828. // flush any buffered input
  829. this.lineStream.push('\n');
  830. }
  831. }]);
  832. return Parser;
  833. }(_stream2['default']);
  834. exports['default'] = Parser;
  835. },{"./line-stream":2,"./parse-stream":3,"./stream":5}],5:[function(require,module,exports){
  836. 'use strict';
  837. Object.defineProperty(exports, "__esModule", {
  838. value: true
  839. });
  840. var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
  841. function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
  842. /**
  843. * @file stream.js
  844. */
  845. /**
  846. * A lightweight readable stream implemention that handles event dispatching.
  847. *
  848. * @class Stream
  849. */
  850. var Stream = function () {
  851. function Stream() {
  852. _classCallCheck(this, Stream);
  853. this.listeners = {};
  854. }
  855. /**
  856. * Add a listener for a specified event type.
  857. *
  858. * @param {String} type the event name
  859. * @param {Function} listener the callback to be invoked when an event of
  860. * the specified type occurs
  861. */
  862. _createClass(Stream, [{
  863. key: 'on',
  864. value: function on(type, listener) {
  865. if (!this.listeners[type]) {
  866. this.listeners[type] = [];
  867. }
  868. this.listeners[type].push(listener);
  869. }
  870. /**
  871. * Remove a listener for a specified event type.
  872. *
  873. * @param {String} type the event name
  874. * @param {Function} listener a function previously registered for this
  875. * type of event through `on`
  876. * @return {Boolean} if we could turn it off or not
  877. */
  878. }, {
  879. key: 'off',
  880. value: function off(type, listener) {
  881. if (!this.listeners[type]) {
  882. return false;
  883. }
  884. var index = this.listeners[type].indexOf(listener);
  885. this.listeners[type].splice(index, 1);
  886. return index > -1;
  887. }
  888. /**
  889. * Trigger an event of the specified type on this stream. Any additional
  890. * arguments to this function are passed as parameters to event listeners.
  891. *
  892. * @param {String} type the event name
  893. */
  894. }, {
  895. key: 'trigger',
  896. value: function trigger(type) {
  897. var callbacks = this.listeners[type];
  898. var i = void 0;
  899. var length = void 0;
  900. var args = void 0;
  901. if (!callbacks) {
  902. return;
  903. }
  904. // Slicing the arguments on every invocation of this method
  905. // can add a significant amount of overhead. Avoid the
  906. // intermediate object creation for the common case of a
  907. // single callback argument
  908. if (arguments.length === 2) {
  909. length = callbacks.length;
  910. for (i = 0; i < length; ++i) {
  911. callbacks[i].call(this, arguments[1]);
  912. }
  913. } else {
  914. args = Array.prototype.slice.call(arguments, 1);
  915. length = callbacks.length;
  916. for (i = 0; i < length; ++i) {
  917. callbacks[i].apply(this, args);
  918. }
  919. }
  920. }
  921. /**
  922. * Destroys the stream and cleans up.
  923. */
  924. }, {
  925. key: 'dispose',
  926. value: function dispose() {
  927. this.listeners = {};
  928. }
  929. /**
  930. * Forwards all `data` events on this stream to the destination stream. The
  931. * destination stream should provide a method `push` to receive the data
  932. * events as they arrive.
  933. *
  934. * @param {Stream} destination the stream that will receive all `data` events
  935. * @see http://nodejs.org/api/stream.html#stream_readable_pipe_destination_options
  936. */
  937. }, {
  938. key: 'pipe',
  939. value: function pipe(destination) {
  940. this.on('data', function (data) {
  941. destination.push(data);
  942. });
  943. }
  944. }]);
  945. return Stream;
  946. }();
  947. exports['default'] = Stream;
  948. },{}],6:[function(require,module,exports){
  949. (function (global){
  950. 'use strict';
  951. var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
  952. var _src = require('../src');
  953. var _qunit = (typeof window !== "undefined" ? window['QUnit'] : typeof global !== "undefined" ? global['QUnit'] : null);
  954. var _qunit2 = _interopRequireDefault(_qunit);
  955. var _testExpected = require('./test-expected.js');
  956. var _testExpected2 = _interopRequireDefault(_testExpected);
  957. var _testManifests = require('./test-manifests.js');
  958. var _testManifests2 = _interopRequireDefault(_testManifests);
  959. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
  960. _qunit2['default'].module('LineStream', {
  961. beforeEach: function beforeEach() {
  962. this.lineStream = new _src.LineStream();
  963. }
  964. });
  965. _qunit2['default'].test('empty inputs produce no tokens', function () {
  966. var data = false;
  967. this.lineStream.on('data', function () {
  968. data = true;
  969. });
  970. this.lineStream.push('');
  971. _qunit2['default'].ok(!data, 'no tokens were produced');
  972. });
  973. _qunit2['default'].test('splits on newlines', function () {
  974. var lines = [];
  975. this.lineStream.on('data', function (line) {
  976. lines.push(line);
  977. });
  978. this.lineStream.push('#EXTM3U\nmovie.ts\n');
  979. _qunit2['default'].strictEqual(2, lines.length, 'two lines are ready');
  980. _qunit2['default'].strictEqual('#EXTM3U', lines.shift(), 'the first line is the first token');
  981. _qunit2['default'].strictEqual('movie.ts', lines.shift(), 'the second line is the second token');
  982. });
  983. _qunit2['default'].test('empty lines become empty strings', function () {
  984. var lines = [];
  985. this.lineStream.on('data', function (line) {
  986. lines.push(line);
  987. });
  988. this.lineStream.push('\n\n');
  989. _qunit2['default'].strictEqual(2, lines.length, 'two lines are ready');
  990. _qunit2['default'].strictEqual('', lines.shift(), 'the first line is empty');
  991. _qunit2['default'].strictEqual('', lines.shift(), 'the second line is empty');
  992. });
  993. _qunit2['default'].test('handles lines broken across appends', function () {
  994. var lines = [];
  995. this.lineStream.on('data', function (line) {
  996. lines.push(line);
  997. });
  998. this.lineStream.push('#EXTM');
  999. _qunit2['default'].strictEqual(0, lines.length, 'no lines are ready');
  1000. this.lineStream.push('3U\nmovie.ts\n');
  1001. _qunit2['default'].strictEqual(2, lines.length, 'two lines are ready');
  1002. _qunit2['default'].strictEqual('#EXTM3U', lines.shift(), 'the first line is the first token');
  1003. _qunit2['default'].strictEqual('movie.ts', lines.shift(), 'the second line is the second token');
  1004. });
  1005. _qunit2['default'].test('stops sending events after deregistering', function () {
  1006. var temporaryLines = [];
  1007. var temporary = function temporary(line) {
  1008. temporaryLines.push(line);
  1009. };
  1010. var permanentLines = [];
  1011. var permanent = function permanent(line) {
  1012. permanentLines.push(line);
  1013. };
  1014. this.lineStream.on('data', temporary);
  1015. this.lineStream.on('data', permanent);
  1016. this.lineStream.push('line one\n');
  1017. _qunit2['default'].strictEqual(temporaryLines.length, permanentLines.length, 'both callbacks receive the event');
  1018. _qunit2['default'].ok(this.lineStream.off('data', temporary), 'a listener was removed');
  1019. this.lineStream.push('line two\n');
  1020. _qunit2['default'].strictEqual(1, temporaryLines.length, 'no new events are received');
  1021. _qunit2['default'].strictEqual(2, permanentLines.length, 'new events are still received');
  1022. });
  1023. _qunit2['default'].module('ParseStream', {
  1024. beforeEach: function beforeEach() {
  1025. this.lineStream = new _src.LineStream();
  1026. this.parseStream = new _src.ParseStream();
  1027. this.lineStream.pipe(this.parseStream);
  1028. }
  1029. });
  1030. _qunit2['default'].test('parses comment lines', function () {
  1031. var manifest = '# a line that starts with a hash mark without "EXT" is a comment\n';
  1032. var element = void 0;
  1033. this.parseStream.on('data', function (elem) {
  1034. element = elem;
  1035. });
  1036. this.lineStream.push(manifest);
  1037. _qunit2['default'].ok(element, 'an event was triggered');
  1038. _qunit2['default'].strictEqual(element.type, 'comment', 'the type is comment');
  1039. _qunit2['default'].strictEqual(element.text, manifest.slice(1, manifest.length - 1), 'the comment text is parsed');
  1040. });
  1041. _qunit2['default'].test('parses uri lines', function () {
  1042. var manifest = 'any non-blank line that does not start with a hash-mark is a URI\n';
  1043. var element = void 0;
  1044. this.parseStream.on('data', function (elem) {
  1045. element = elem;
  1046. });
  1047. this.lineStream.push(manifest);
  1048. _qunit2['default'].ok(element, 'an event was triggered');
  1049. _qunit2['default'].strictEqual(element.type, 'uri', 'the type is uri');
  1050. _qunit2['default'].strictEqual(element.uri, manifest.substring(0, manifest.length - 1), 'the uri text is parsed');
  1051. });
  1052. _qunit2['default'].test('parses unknown tag types', function () {
  1053. var manifest = '#EXT-X-EXAMPLE-TAG:some,additional,stuff\n';
  1054. var element = void 0;
  1055. this.parseStream.on('data', function (elem) {
  1056. element = elem;
  1057. });
  1058. this.lineStream.push(manifest);
  1059. _qunit2['default'].ok(element, 'an event was triggered');
  1060. _qunit2['default'].strictEqual(element.type, 'tag', 'the type is tag');
  1061. _qunit2['default'].strictEqual(element.data, manifest.slice(4, manifest.length - 1), 'unknown tag data is preserved');
  1062. });
  1063. // #EXTM3U
  1064. _qunit2['default'].test('parses #EXTM3U tags', function () {
  1065. var manifest = '#EXTM3U\n';
  1066. var element = void 0;
  1067. this.parseStream.on('data', function (elem) {
  1068. element = elem;
  1069. });
  1070. this.lineStream.push(manifest);
  1071. _qunit2['default'].ok(element, 'an event was triggered');
  1072. _qunit2['default'].strictEqual(element.type, 'tag', 'the line type is tag');
  1073. _qunit2['default'].strictEqual(element.tagType, 'm3u', 'the tag type is m3u');
  1074. });
  1075. // #EXTINF
  1076. _qunit2['default'].test('parses minimal #EXTINF tags', function () {
  1077. var manifest = '#EXTINF\n';
  1078. var element = void 0;
  1079. this.parseStream.on('data', function (elem) {
  1080. element = elem;
  1081. });
  1082. this.lineStream.push(manifest);
  1083. _qunit2['default'].ok(element, 'an event was triggered');
  1084. _qunit2['default'].strictEqual(element.type, 'tag', 'the line type is tag');
  1085. _qunit2['default'].strictEqual(element.tagType, 'inf', 'the tag type is inf');
  1086. });
  1087. _qunit2['default'].test('parses #EXTINF tags with durations', function () {
  1088. var manifest = '#EXTINF:15\n';
  1089. var element = void 0;
  1090. this.parseStream.on('data', function (elem) {
  1091. element = elem;
  1092. });
  1093. this.lineStream.push(manifest);
  1094. _qunit2['default'].ok(element, 'an event was triggered');
  1095. _qunit2['default'].strictEqual(element.type, 'tag', 'the line type is tag');
  1096. _qunit2['default'].strictEqual(element.tagType, 'inf', 'the tag type is inf');
  1097. _qunit2['default'].strictEqual(element.duration, 15, 'the duration is parsed');
  1098. _qunit2['default'].ok(!('title' in element), 'no title is parsed');
  1099. manifest = '#EXTINF:21,\n';
  1100. this.lineStream.push(manifest);
  1101. _qunit2['default'].ok(element, 'an event was triggered');
  1102. _qunit2['default'].strictEqual(element.type, 'tag', 'the line type is tag');
  1103. _qunit2['default'].strictEqual(element.tagType, 'inf', 'the tag type is inf');
  1104. _qunit2['default'].strictEqual(element.duration, 21, 'the duration is parsed');
  1105. _qunit2['default'].ok(!('title' in element), 'no title is parsed');
  1106. });
  1107. _qunit2['default'].test('parses #EXTINF tags with a duration and title', function () {
  1108. var manifest = '#EXTINF:13,Does anyone really use the title attribute?\n';
  1109. var element = void 0;
  1110. this.parseStream.on('data', function (elem) {
  1111. element = elem;
  1112. });
  1113. this.lineStream.push(manifest);
  1114. _qunit2['default'].ok(element, 'an event was triggered');
  1115. _qunit2['default'].strictEqual(element.type, 'tag', 'the line type is tag');
  1116. _qunit2['default'].strictEqual(element.tagType, 'inf', 'the tag type is inf');
  1117. _qunit2['default'].strictEqual(element.duration, 13, 'the duration is parsed');
  1118. _qunit2['default'].strictEqual(element.title, manifest.substring(manifest.indexOf(',') + 1, manifest.length - 1), 'the title is parsed');
  1119. });
  1120. _qunit2['default'].test('parses #EXTINF tags with carriage returns', function () {
  1121. var manifest = '#EXTINF:13,Does anyone really use the title attribute?\r\n';
  1122. var element = void 0;
  1123. this.parseStream.on('data', function (elem) {
  1124. element = elem;
  1125. });
  1126. this.lineStream.push(manifest);
  1127. _qunit2['default'].ok(element, 'an event was triggered');
  1128. _qunit2['default'].strictEqual(element.type, 'tag', 'the line type is tag');
  1129. _qunit2['default'].strictEqual(element.tagType, 'inf', 'the tag type is inf');
  1130. _qunit2['default'].strictEqual(element.duration, 13, 'the duration is parsed');
  1131. _qunit2['default'].strictEqual(element.title, manifest.substring(manifest.indexOf(',') + 1, manifest.length - 2), 'the title is parsed');
  1132. });
  1133. // #EXT-X-TARGETDURATION
  1134. _qunit2['default'].test('parses minimal #EXT-X-TARGETDURATION tags', function () {
  1135. var manifest = '#EXT-X-TARGETDURATION\n';
  1136. var element = void 0;
  1137. this.parseStream.on('data', function (elem) {
  1138. element = elem;
  1139. });
  1140. this.lineStream.push(manifest);
  1141. _qunit2['default'].ok(element, 'an event was triggered');
  1142. _qunit2['default'].strictEqual(element.type, 'tag', 'the line type is tag');
  1143. _qunit2['default'].strictEqual(element.tagType, 'targetduration', 'the tag type is targetduration');
  1144. _qunit2['default'].ok(!('duration' in element), 'no duration is parsed');
  1145. });
  1146. _qunit2['default'].test('parses #EXT-X-TARGETDURATION with duration', function () {
  1147. var manifest = '#EXT-X-TARGETDURATION:47\n';
  1148. var element = void 0;
  1149. this.parseStream.on('data', function (elem) {
  1150. element = elem;
  1151. });
  1152. this.lineStream.push(manifest);
  1153. _qunit2['default'].ok(element, 'an event was triggered');
  1154. _qunit2['default'].strictEqual(element.type, 'tag', 'the line type is tag');
  1155. _qunit2['default'].strictEqual(element.tagType, 'targetduration', 'the tag type is targetduration');
  1156. _qunit2['default'].strictEqual(element.duration, 47, 'the duration is parsed');
  1157. });
  1158. // #EXT-X-VERSION
  1159. _qunit2['default'].test('parses minimal #EXT-X-VERSION tags', function () {
  1160. var manifest = '#EXT-X-VERSION:\n';
  1161. var element = void 0;
  1162. this.parseStream.on('data', function (elem) {
  1163. element = elem;
  1164. });
  1165. this.lineStream.push(manifest);
  1166. _qunit2['default'].ok(element, 'an event was triggered');
  1167. _qunit2['default'].strictEqual(element.type, 'tag', 'the line type is tag');
  1168. _qunit2['default'].strictEqual(element.tagType, 'version', 'the tag type is version');
  1169. _qunit2['default'].ok(!('version' in element), 'no version is present');
  1170. });
  1171. _qunit2['default'].test('parses #EXT-X-VERSION with a version', function () {
  1172. var manifest = '#EXT-X-VERSION:99\n';
  1173. var element = void 0;
  1174. this.parseStream.on('data', function (elem) {
  1175. element = elem;
  1176. });
  1177. this.lineStream.push(manifest);
  1178. _qunit2['default'].ok(element, 'an event was triggered');
  1179. _qunit2['default'].strictEqual(element.type, 'tag', 'the line type is tag');
  1180. _qunit2['default'].strictEqual(element.tagType, 'version', 'the tag type is version');
  1181. _qunit2['default'].strictEqual(element.version, 99, 'the version is parsed');
  1182. });
  1183. // #EXT-X-MEDIA-SEQUENCE
  1184. _qunit2['default'].test('parses minimal #EXT-X-MEDIA-SEQUENCE tags', function () {
  1185. var manifest = '#EXT-X-MEDIA-SEQUENCE\n';
  1186. var element = void 0;
  1187. this.parseStream.on('data', function (elem) {
  1188. element = elem;
  1189. });
  1190. this.lineStream.push(manifest);
  1191. _qunit2['default'].ok(element, 'an event was triggered');
  1192. _qunit2['default'].strictEqual(element.type, 'tag', 'the line type is tag');
  1193. _qunit2['default'].strictEqual(element.tagType, 'media-sequence', 'the tag type is media-sequence');
  1194. _qunit2['default'].ok(!('number' in element), 'no number is present');
  1195. });
  1196. _qunit2['default'].test('parses #EXT-X-MEDIA-SEQUENCE with sequence numbers', function () {
  1197. var manifest = '#EXT-X-MEDIA-SEQUENCE:109\n';
  1198. var element = void 0;
  1199. this.parseStream.on('data', function (elem) {
  1200. element = elem;
  1201. });
  1202. this.lineStream.push(manifest);
  1203. _qunit2['default'].ok(element, 'an event was triggered');
  1204. _qunit2['default'].strictEqual(element.type, 'tag', 'the line type is tag');
  1205. _qunit2['default'].strictEqual(element.tagType, 'media-sequence', 'the tag type is media-sequence');
  1206. _qunit2['default'].ok(element.number, 109, 'the number is parsed');
  1207. });
  1208. // #EXT-X-PLAYLIST-TYPE
  1209. _qunit2['default'].test('parses minimal #EXT-X-PLAYLIST-TYPE tags', function () {
  1210. var manifest = '#EXT-X-PLAYLIST-TYPE:\n';
  1211. var element = void 0;
  1212. this.parseStream.on('data', function (elem) {
  1213. element = elem;
  1214. });
  1215. this.lineStream.push(manifest);
  1216. _qunit2['default'].ok(element, 'an event was triggered');
  1217. _qunit2['default'].strictEqual(element.type, 'tag', 'the line type is tag');
  1218. _qunit2['default'].strictEqual(element.tagType, 'playlist-type', 'the tag type is playlist-type');
  1219. _qunit2['default'].ok(!('playlistType' in element), 'no playlist type is present');
  1220. });
  1221. _qunit2['default'].test('parses #EXT-X-PLAYLIST-TYPE with mutability info', function () {
  1222. var manifest = '#EXT-X-PLAYLIST-TYPE:EVENT\n';
  1223. var element = void 0;
  1224. this.parseStream.on('data', function (elem) {
  1225. element = elem;
  1226. });
  1227. this.lineStream.push(manifest);
  1228. _qunit2['default'].ok(element, 'an event was triggered');
  1229. _qunit2['default'].strictEqual(element.type, 'tag', 'the line type is tag');
  1230. _qunit2['default'].strictEqual(element.tagType, 'playlist-type', 'the tag type is playlist-type');
  1231. _qunit2['default'].strictEqual(element.playlistType, 'EVENT', 'the playlist type is EVENT');
  1232. manifest = '#EXT-X-PLAYLIST-TYPE:VOD\n';
  1233. this.lineStream.push(manifest);
  1234. _qunit2['default'].ok(element, 'an event was triggered');
  1235. _qunit2['default'].strictEqual(element.type, 'tag', 'the line type is tag');
  1236. _qunit2['default'].strictEqual(element.tagType, 'playlist-type', 'the tag type is playlist-type');
  1237. _qunit2['default'].strictEqual(element.playlistType, 'VOD', 'the playlist type is VOD');
  1238. manifest = '#EXT-X-PLAYLIST-TYPE:nonsense\n';
  1239. this.lineStream.push(manifest);
  1240. _qunit2['default'].ok(element, 'an event was triggered');
  1241. _qunit2['default'].strictEqual(element.type, 'tag', 'the line type is tag');
  1242. _qunit2['default'].strictEqual(element.tagType, 'playlist-type', 'the tag type is playlist-type');
  1243. _qunit2['default'].strictEqual(element.playlistType, 'nonsense', 'the playlist type is parsed');
  1244. });
  1245. // #EXT-X-BYTERANGE
  1246. _qunit2['default'].test('parses minimal #EXT-X-BYTERANGE tags', function () {
  1247. var manifest = '#EXT-X-BYTERANGE\n';
  1248. var element = void 0;
  1249. this.parseStream.on('data', function (elem) {
  1250. element = elem;
  1251. });
  1252. this.lineStream.push(manifest);
  1253. _qunit2['default'].ok(element, 'an event was triggered');
  1254. _qunit2['default'].strictEqual(element.type, 'tag', 'the line type is tag');
  1255. _qunit2['default'].strictEqual(element.tagType, 'byterange', 'the tag type is byterange');
  1256. _qunit2['default'].ok(!('length' in element), 'no length is present');
  1257. _qunit2['default'].ok(!('offset' in element), 'no offset is present');
  1258. });
  1259. _qunit2['default'].test('parses #EXT-X-BYTERANGE with length and offset', function () {
  1260. var manifest = '#EXT-X-BYTERANGE:45\n';
  1261. var element = void 0;
  1262. this.parseStream.on('data', function (elem) {
  1263. element = elem;
  1264. });
  1265. this.lineStream.push(manifest);
  1266. _qunit2['default'].ok(element, 'an event was triggered');
  1267. _qunit2['default'].strictEqual(element.type, 'tag', 'the line type is tag');
  1268. _qunit2['default'].strictEqual(element.tagType, 'byterange', 'the tag type is byterange');
  1269. _qunit2['default'].strictEqual(element.length, 45, 'length is parsed');
  1270. _qunit2['default'].ok(!('offset' in element), 'no offset is present');
  1271. manifest = '#EXT-X-BYTERANGE:108@16\n';
  1272. this.lineStream.push(manifest);
  1273. _qunit2['default'].ok(element, 'an event was triggered');
  1274. _qunit2['default'].strictEqual(element.type, 'tag', 'the line type is tag');
  1275. _qunit2['default'].strictEqual(element.tagType, 'byterange', 'the tag type is byterange');
  1276. _qunit2['default'].strictEqual(element.length, 108, 'length is parsed');
  1277. _qunit2['default'].strictEqual(element.offset, 16, 'offset is parsed');
  1278. });
  1279. // #EXT-X-ALLOW-CACHE
  1280. _qunit2['default'].test('parses minimal #EXT-X-ALLOW-CACHE tags', function () {
  1281. var manifest = '#EXT-X-ALLOW-CACHE:\n';
  1282. var element = void 0;
  1283. this.parseStream.on('data', function (elem) {
  1284. element = elem;
  1285. });
  1286. this.lineStream.push(manifest);
  1287. _qunit2['default'].ok(element, 'an event was triggered');
  1288. _qunit2['default'].strictEqual(element.type, 'tag', 'the line type is tag');
  1289. _qunit2['default'].strictEqual(element.tagType, 'allow-cache', 'the tag type is allow-cache');
  1290. _qunit2['default'].ok(!('allowed' in element), 'no allowed is present');
  1291. });
  1292. _qunit2['default'].test('parses valid #EXT-X-ALLOW-CACHE tags', function () {
  1293. var manifest = '#EXT-X-ALLOW-CACHE:YES\n';
  1294. var element = void 0;
  1295. this.parseStream.on('data', function (elem) {
  1296. element = elem;
  1297. });
  1298. this.lineStream.push(manifest);
  1299. _qunit2['default'].ok(element, 'an event was triggered');
  1300. _qunit2['default'].strictEqual(element.type, 'tag', 'the line type is tag');
  1301. _qunit2['default'].strictEqual(element.tagType, 'allow-cache', 'the tag type is allow-cache');
  1302. _qunit2['default'].ok(element.allowed, 'allowed is parsed');
  1303. manifest = '#EXT-X-ALLOW-CACHE:NO\n';
  1304. this.lineStream.push(manifest);
  1305. _qunit2['default'].ok(element, 'an event was triggered');
  1306. _qunit2['default'].strictEqual(element.type, 'tag', 'the line type is tag');
  1307. _qunit2['default'].strictEqual(element.tagType, 'allow-cache', 'the tag type is allow-cache');
  1308. _qunit2['default'].ok(!element.allowed, 'allowed is parsed');
  1309. });
  1310. // #EXT-X-MAP
  1311. _qunit2['default'].test('parses minimal #EXT-X-MAP tags', function () {
  1312. var manifest = '#EXT-X-MAP:URI="init.m4s"\n';
  1313. var element = void 0;
  1314. this.parseStream.on('data', function (elem) {
  1315. element = elem;
  1316. });
  1317. this.lineStream.push(manifest);
  1318. _qunit2['default'].ok(element, 'an event was triggered');
  1319. _qunit2['default'].strictEqual(element.type, 'tag', 'the line type is tag');
  1320. _qunit2['default'].strictEqual(element.tagType, 'map', 'the tag type is map');
  1321. _qunit2['default'].strictEqual(element.uri, 'init.m4s', 'parsed the uri');
  1322. });
  1323. _qunit2['default'].test('parses #EXT-X-MAP tags with a byterange', function () {
  1324. var manifest = '#EXT-X-MAP:URI="0.m4s", BYTERANGE="1000@23"\n';
  1325. var element = void 0;
  1326. this.parseStream.on('data', function (elem) {
  1327. element = elem;
  1328. });
  1329. this.lineStream.push(manifest);
  1330. _qunit2['default'].ok(element, 'an event was triggered');
  1331. _qunit2['default'].strictEqual(element.uri, '0.m4s', 'parsed the uri');
  1332. _qunit2['default'].strictEqual(element.byterange.length, 1000, 'parsed the byterange length');
  1333. _qunit2['default'].strictEqual(element.byterange.offset, 23, 'parsed the byterange offset');
  1334. });
  1335. _qunit2['default'].test('parses #EXT-X-MAP tags with arbitrary attributes', function () {
  1336. var manifest = '#EXT-X-MAP:URI="init.mp4", SOMETHING=YES,BYTERANGE="720@0"\n';
  1337. var element = void 0;
  1338. this.parseStream.on('data', function (elem) {
  1339. element = elem;
  1340. });
  1341. this.lineStream.push(manifest);
  1342. _qunit2['default'].ok(element, 'an event was triggered');
  1343. _qunit2['default'].strictEqual(element.uri, 'init.mp4', 'parsed the uri');
  1344. _qunit2['default'].strictEqual(element.byterange.length, 720, 'parsed the byterange length');
  1345. _qunit2['default'].strictEqual(element.byterange.offset, 0, 'parsed the byterange offset');
  1346. });
  1347. // #EXT-X-STREAM-INF
  1348. _qunit2['default'].test('parses minimal #EXT-X-STREAM-INF tags', function () {
  1349. var manifest = '#EXT-X-STREAM-INF\n';
  1350. var element = void 0;
  1351. this.parseStream.on('data', function (elem) {
  1352. element = elem;
  1353. });
  1354. this.lineStream.push(manifest);
  1355. _qunit2['default'].ok(element, 'an event was triggered');
  1356. _qunit2['default'].strictEqual(element.type, 'tag', 'the line type is tag');
  1357. _qunit2['default'].strictEqual(element.tagType, 'stream-inf', 'the tag type is stream-inf');
  1358. _qunit2['default'].ok(!('attributes' in element), 'no attributes are present');
  1359. });
  1360. // #EXT-X-PROGRAM-DATE-TIME
  1361. _qunit2['default'].test('parses minimal EXT-X-PROGRAM-DATE-TIME tags', function () {
  1362. var manifest = '#EXT-X-PROGRAM-DATE-TIME\n';
  1363. var element = void 0;
  1364. this.parseStream.on('data', function (elem) {
  1365. element = elem;
  1366. });
  1367. this.lineStream.push(manifest);
  1368. _qunit2['default'].ok(element, 'an event was triggered');
  1369. _qunit2['default'].strictEqual(element.type, 'tag', 'the line type is tag');
  1370. _qunit2['default'].strictEqual(element.tagType, 'program-date-time', 'the tag type is date-time');
  1371. _qunit2['default'].ok(!('dateTimeString' in element), 'no dateTime is present');
  1372. });
  1373. _qunit2['default'].test('parses EXT-X-PROGRAM-DATE-TIME tags with valid date-time formats', function () {
  1374. var manifest = '#EXT-X-PROGRAM-DATE-TIME:2016-06-22T09:20:16.166-04:00\n';
  1375. var element = void 0;
  1376. this.parseStream.on('data', function (elem) {
  1377. element = elem;
  1378. });
  1379. this.lineStream.push(manifest);
  1380. _qunit2['default'].ok(element, 'an event was triggered');
  1381. _qunit2['default'].strictEqual(element.type, 'tag', 'the line type is tag');
  1382. _qunit2['default'].strictEqual(element.tagType, 'program-date-time', 'the tag type is date-time');
  1383. _qunit2['default'].strictEqual(element.dateTimeString, '2016-06-22T09:20:16.166-04:00', 'dateTimeString is parsed');
  1384. _qunit2['default'].deepEqual(element.dateTimeObject, new Date('2016-06-22T09:20:16.166-04:00'), 'dateTimeObject is parsed');
  1385. manifest = '#EXT-X-PROGRAM-DATE-TIME:2016-06-22T09:20:16.16389Z\n';
  1386. this.lineStream.push(manifest);
  1387. _qunit2['default'].ok(element, 'an event was triggered');
  1388. _qunit2['default'].strictEqual(element.type, 'tag', 'the line type is tag');
  1389. _qunit2['default'].strictEqual(element.tagType, 'program-date-time', 'the tag type is date-time');
  1390. _qunit2['default'].strictEqual(element.dateTimeString, '2016-06-22T09:20:16.16389Z', 'dateTimeString is parsed');
  1391. _qunit2['default'].deepEqual(element.dateTimeObject, new Date('2016-06-22T09:20:16.16389Z'), 'dateTimeObject is parsed');
  1392. });
  1393. _qunit2['default'].test('parses #EXT-X-STREAM-INF with common attributes', function () {
  1394. var manifest = '#EXT-X-STREAM-INF:BANDWIDTH=14400\n';
  1395. var element = void 0;
  1396. this.parseStream.on('data', function (elem) {
  1397. element = elem;
  1398. });
  1399. this.lineStream.push(manifest);
  1400. _qunit2['default'].ok(element, 'an event was triggered');
  1401. _qunit2['default'].strictEqual(element.type, 'tag', 'the line type is tag');
  1402. _qunit2['default'].strictEqual(element.tagType, 'stream-inf', 'the tag type is stream-inf');
  1403. _qunit2['default'].strictEqual(element.attributes.BANDWIDTH, 14400, 'bandwidth is parsed');
  1404. manifest = '#EXT-X-STREAM-INF:PROGRAM-ID=7\n';
  1405. this.lineStream.push(manifest);
  1406. _qunit2['default'].ok(element, 'an event was triggered');
  1407. _qunit2['default'].strictEqual(element.type, 'tag', 'the line type is tag');
  1408. _qunit2['default'].strictEqual(element.tagType, 'stream-inf', 'the tag type is stream-inf');
  1409. _qunit2['default'].strictEqual(element.attributes['PROGRAM-ID'], 7, 'program-id is parsed');
  1410. manifest = '#EXT-X-STREAM-INF:RESOLUTION=396x224\n';
  1411. this.lineStream.push(manifest);
  1412. _qunit2['default'].ok(element, 'an event was triggered');
  1413. _qunit2['default'].strictEqual(element.type, 'tag', 'the line type is tag');
  1414. _qunit2['default'].strictEqual(element.tagType, 'stream-inf', 'the tag type is stream-inf');
  1415. _qunit2['default'].strictEqual(element.attributes.RESOLUTION.width, 396, 'width is parsed');
  1416. _qunit2['default'].strictEqual(element.attributes.RESOLUTION.height, 224, 'heigth is parsed');
  1417. manifest = '#EXT-X-STREAM-INF:CODECS="avc1.4d400d, mp4a.40.2"\n';
  1418. this.lineStream.push(manifest);
  1419. _qunit2['default'].ok(element, 'an event was triggered');
  1420. _qunit2['default'].strictEqual(element.type, 'tag', 'the line type is tag');
  1421. _qunit2['default'].strictEqual(element.tagType, 'stream-inf', 'the tag type is stream-inf');
  1422. _qunit2['default'].strictEqual(element.attributes.CODECS, 'avc1.4d400d, mp4a.40.2', 'codecs are parsed');
  1423. });
  1424. _qunit2['default'].test('parses #EXT-X-STREAM-INF with arbitrary attributes', function () {
  1425. var manifest = '#EXT-X-STREAM-INF:NUMERIC=24,ALPHA=Value,MIXED=123abc\n';
  1426. var element = void 0;
  1427. this.parseStream.on('data', function (elem) {
  1428. element = elem;
  1429. });
  1430. this.lineStream.push(manifest);
  1431. _qunit2['default'].ok(element, 'an event was triggered');
  1432. _qunit2['default'].strictEqual(element.type, 'tag', 'the line type is tag');
  1433. _qunit2['default'].strictEqual(element.tagType, 'stream-inf', 'the tag type is stream-inf');
  1434. _qunit2['default'].strictEqual(element.attributes.NUMERIC, '24', 'numeric attributes are parsed');
  1435. _qunit2['default'].strictEqual(element.attributes.ALPHA, 'Value', 'alphabetic attributes are parsed');
  1436. _qunit2['default'].strictEqual(element.attributes.MIXED, '123abc', 'mixed attributes are parsed');
  1437. });
  1438. // #EXT-X-ENDLIST
  1439. _qunit2['default'].test('parses #EXT-X-ENDLIST tags', function () {
  1440. var manifest = '#EXT-X-ENDLIST\n';
  1441. var element = void 0;
  1442. this.parseStream.on('data', function (elem) {
  1443. element = elem;
  1444. });
  1445. this.lineStream.push(manifest);
  1446. _qunit2['default'].ok(element, 'an event was triggered');
  1447. _qunit2['default'].strictEqual(element.type, 'tag', 'the line type is tag');
  1448. _qunit2['default'].strictEqual(element.tagType, 'endlist', 'the tag type is stream-inf');
  1449. });
  1450. // #EXT-X-KEY
  1451. _qunit2['default'].test('parses valid #EXT-X-KEY tags', function () {
  1452. var manifest = '#EXT-X-KEY:METHOD=AES-128,URI="https://priv.example.com/key.php?r=52"\n';
  1453. var element = void 0;
  1454. this.parseStream.on('data', function (elem) {
  1455. element = elem;
  1456. });
  1457. this.lineStream.push(manifest);
  1458. _qunit2['default'].ok(element, 'an event was triggered');
  1459. _qunit2['default'].deepEqual(element, {
  1460. type: 'tag',
  1461. tagType: 'key',
  1462. attributes: {
  1463. METHOD: 'AES-128',
  1464. URI: 'https://priv.example.com/key.php?r=52'
  1465. }
  1466. }, 'parsed a valid key');
  1467. manifest = '#EXT-X-KEY:URI="https://example.com/key#1",METHOD=FutureType-1024\n';
  1468. this.lineStream.push(manifest);
  1469. _qunit2['default'].ok(element, 'an event was triggered');
  1470. _qunit2['default'].deepEqual(element, {
  1471. type: 'tag',
  1472. tagType: 'key',
  1473. attributes: {
  1474. METHOD: 'FutureType-1024',
  1475. URI: 'https://example.com/key#1'
  1476. }
  1477. }, 'parsed the attribute list independent of order');
  1478. manifest = '#EXT-X-KEY:IV=1234567890abcdef1234567890abcdef\n';
  1479. this.lineStream.push(manifest);
  1480. _qunit2['default'].ok(element.attributes.IV, 'detected an IV attribute');
  1481. _qunit2['default'].deepEqual(element.attributes.IV, new Uint32Array([0x12345678, 0x90abcdef, 0x12345678, 0x90abcdef]), 'parsed an IV value');
  1482. });
  1483. _qunit2['default'].test('parses minimal #EXT-X-KEY tags', function () {
  1484. var manifest = '#EXT-X-KEY:\n';
  1485. var element = void 0;
  1486. this.parseStream.on('data', function (elem) {
  1487. element = elem;
  1488. });
  1489. this.lineStream.push(manifest);
  1490. _qunit2['default'].ok(element, 'an event was triggered');
  1491. _qunit2['default'].deepEqual(element, {
  1492. type: 'tag',
  1493. tagType: 'key'
  1494. }, 'parsed a minimal key tag');
  1495. });
  1496. _qunit2['default'].test('parses lightly-broken #EXT-X-KEY tags', function () {
  1497. var manifest = '#EXT-X-KEY:URI=\'https://example.com/single-quote\',METHOD=AES-128\n';
  1498. var element = void 0;
  1499. this.parseStream.on('data', function (elem) {
  1500. element = elem;
  1501. });
  1502. this.lineStream.push(manifest);
  1503. _qunit2['default'].strictEqual(element.attributes.URI, 'https://example.com/single-quote', 'parsed a single-quoted uri');
  1504. element = null;
  1505. manifest = '#EXT-X-KEYURI="https://example.com/key",METHOD=AES-128\n';
  1506. this.lineStream.push(manifest);
  1507. _qunit2['default'].strictEqual(element.tagType, 'key', 'parsed the tag type');
  1508. _qunit2['default'].strictEqual(element.attributes.URI, 'https://example.com/key', 'inferred a colon after the tag type');
  1509. element = null;
  1510. manifest = '#EXT-X-KEY: URI = "https://example.com/key",METHOD=AES-128\n';
  1511. this.lineStream.push(manifest);
  1512. _qunit2['default'].strictEqual(element.attributes.URI, 'https://example.com/key', 'trims and removes quotes around the URI');
  1513. });
  1514. _qunit2['default'].test('parses prefixed with 0x or 0X #EXT-X-KEY:IV tags', function () {
  1515. var manifest = void 0;
  1516. var element = void 0;
  1517. this.parseStream.on('data', function (elem) {
  1518. element = elem;
  1519. });
  1520. manifest = '#EXT-X-KEY:IV=0x1234567890abcdef1234567890abcdef\n';
  1521. this.lineStream.push(manifest);
  1522. _qunit2['default'].ok(element.attributes.IV, 'detected an IV attribute');
  1523. _qunit2['default'].deepEqual(element.attributes.IV, new Uint32Array([0x12345678, 0x90abcdef, 0x12345678, 0x90abcdef]), 'parsed an IV value with 0x');
  1524. manifest = '#EXT-X-KEY:IV=0X1234567890abcdef1234567890abcdef\n';
  1525. this.lineStream.push(manifest);
  1526. _qunit2['default'].ok(element.attributes.IV, 'detected an IV attribute');
  1527. _qunit2['default'].deepEqual(element.attributes.IV, new Uint32Array([0x12345678, 0x90abcdef, 0x12345678, 0x90abcdef]), 'parsed an IV value with 0X');
  1528. });
  1529. _qunit2['default'].test('ignores empty lines', function () {
  1530. var manifest = '\n';
  1531. var event = false;
  1532. this.parseStream.on('data', function () {
  1533. event = true;
  1534. });
  1535. this.lineStream.push(manifest);
  1536. _qunit2['default'].ok(!event, 'no event is triggered');
  1537. });
  1538. _qunit2['default'].module('m3u8 parser');
  1539. _qunit2['default'].test('can be constructed', function () {
  1540. _qunit2['default'].notStrictEqual(_typeof(new _src.Parser()), 'undefined', 'parser is defined');
  1541. });
  1542. _qunit2['default'].test('attaches cue-out data to segment', function () {
  1543. var parser = new _src.Parser();
  1544. var manifest = ['#EXTM3U', '#EXTINF:5,', '#COMMENT', 'ex1.ts', '#EXT-X-CUE-OUT:10', '#EXTINF:5,', 'ex2.ts', '#EXT-X-CUE-OUT15', '#EXT-UKNOWN-TAG', '#EXTINF:5,', 'ex3.ts', '#EXT-X-CUE-OUT', '#EXTINF:5,', 'ex3.ts', '#EXT-X-ENDLIST'].join('\n');
  1545. parser.push(manifest);
  1546. _qunit2['default'].equal(parser.manifest.segments[1].cueOut, '10', 'parser attached cue out tag');
  1547. _qunit2['default'].equal(parser.manifest.segments[2].cueOut, '15', 'cue out without : seperator');
  1548. _qunit2['default'].equal(parser.manifest.segments[3].cueOut, '', 'cue out without data');
  1549. });
  1550. _qunit2['default'].test('attaches cue-out-cont data to segment', function () {
  1551. var parser = new _src.Parser();
  1552. var manifest = ['#EXTM3U', '#EXTINF:5,', '#COMMENT', 'ex1.ts', '#EXT-X-CUE-OUT-CONT:10/60', '#EXTINF:5,', 'ex2.ts', '#EXT-X-CUE-OUT-CONT15/30', '#EXT-UKNOWN-TAG', '#EXTINF:5,', 'ex3.ts', '#EXT-X-CUE-OUT-CONT', '#EXTINF:5,', 'ex3.ts', '#EXT-X-ENDLIST'].join('\n');
  1553. parser.push(manifest);
  1554. _qunit2['default'].equal(parser.manifest.segments[1].cueOutCont, '10/60', 'parser attached cue out cont tag');
  1555. _qunit2['default'].equal(parser.manifest.segments[2].cueOutCont, '15/30', 'cue out cont without : seperator');
  1556. _qunit2['default'].equal(parser.manifest.segments[3].cueOutCont, '', 'cue out cont without data');
  1557. });
  1558. _qunit2['default'].test('attaches cue-in data to segment', function () {
  1559. var parser = new _src.Parser();
  1560. var manifest = ['#EXTM3U', '#EXTINF:5,', '#COMMENT', 'ex1.ts', '#EXT-X-CUE-IN', '#EXTINF:5,', 'ex2.ts', '#EXT-X-CUE-IN:15', '#EXT-UKNOWN-TAG', '#EXTINF:5,', 'ex3.ts', '#EXT-X-CUE-IN=abc', '#EXTINF:5,', 'ex3.ts', '#EXT-X-ENDLIST'].join('\n');
  1561. parser.push(manifest);
  1562. _qunit2['default'].equal(parser.manifest.segments[1].cueIn, '', 'parser attached cue in tag');
  1563. _qunit2['default'].equal(parser.manifest.segments[2].cueIn, '15', 'cue in with data');
  1564. _qunit2['default'].equal(parser.manifest.segments[3].cueIn, '=abc', 'cue in without colon seperator');
  1565. });
  1566. _qunit2['default'].test('parses characteristics attribute', function () {
  1567. var parser = new _src.Parser();
  1568. var manifest = ['#EXTM3U', '#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID="subs",CHARACTERISTICS="char",NAME="test"', '#EXT-X-STREAM-INF:BANDWIDTH=1,CODECS="mp4a.40.2, avc1.4d400d",SUBTITLES="subs"', 'index.m3u8'].join('\n');
  1569. parser.push(manifest);
  1570. _qunit2['default'].equal(parser.manifest.mediaGroups.SUBTITLES.subs.test.characteristics, 'char', 'parsed CHARACTERISTICS attribute');
  1571. });
  1572. _qunit2['default'].test('parses FORCED attribute', function () {
  1573. var parser = new _src.Parser();
  1574. var manifest = ['#EXTM3U', '#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID="subs",CHARACTERISTICS="char",NAME="test",FORCED=YES', '#EXT-X-STREAM-INF:BANDWIDTH=1,CODECS="mp4a.40.2, avc1.4d400d",SUBTITLES="subs"', 'index.m3u8'].join('\n');
  1575. parser.push(manifest);
  1576. _qunit2['default'].ok(parser.manifest.mediaGroups.SUBTITLES.subs.test.forced, 'parsed FORCED attribute');
  1577. });
  1578. _qunit2['default'].module('m3u8s');
  1579. _qunit2['default'].test('parses static manifests as expected', function () {
  1580. var key = void 0;
  1581. for (key in _testManifests2['default']) {
  1582. if (_testExpected2['default'][key]) {
  1583. var parser = new _src.Parser();
  1584. parser.push(_testManifests2['default'][key]);
  1585. _qunit2['default'].deepEqual(parser.manifest, _testExpected2['default'][key], key + '.m3u8 was parsed correctly');
  1586. }
  1587. }
  1588. });
  1589. }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
  1590. },{"../src":1,"./test-expected.js":7,"./test-manifests.js":8}],7:[function(require,module,exports){
  1591. "use strict";
  1592. Object.defineProperty(exports, "__esModule", {
  1593. value: true
  1594. });
  1595. exports["default"] = {
  1596. "absoluteUris": {
  1597. "allowCache": true,
  1598. "mediaSequence": 0,
  1599. "playlistType": "VOD",
  1600. "segments": [{
  1601. "duration": 10,
  1602. "timeline": 0,
  1603. "uri": "http://example.com/00001.ts"
  1604. }, {
  1605. "duration": 10,
  1606. "timeline": 0,
  1607. "uri": "https://example.com/00002.ts"
  1608. }, {
  1609. "duration": 10,
  1610. "timeline": 0,
  1611. "uri": "//example.com/00003.ts"
  1612. }, {
  1613. "duration": 10,
  1614. "timeline": 0,
  1615. "uri": "http://example.com/00004.ts"
  1616. }],
  1617. "targetDuration": 10,
  1618. "endList": true,
  1619. "discontinuitySequence": 0,
  1620. "discontinuityStarts": []
  1621. },
  1622. "allowCache": {
  1623. "allowCache": true,
  1624. "mediaSequence": 0,
  1625. "playlistType": "VOD",
  1626. "segments": [{
  1627. "byterange": {
  1628. "length": 522828,
  1629. "offset": 0
  1630. },
  1631. "duration": 10,
  1632. "timeline": 0,
  1633. "uri": "hls_450k_video.ts"
  1634. }, {
  1635. "byterange": {
  1636. "length": 587500,
  1637. "offset": 522828
  1638. },
  1639. "duration": 10,
  1640. "timeline": 0,
  1641. "uri": "hls_450k_video.ts"
  1642. }, {
  1643. "byterange": {
  1644. "length": 713084,
  1645. "offset": 1110328
  1646. },
  1647. "duration": 10,
  1648. "timeline": 0,
  1649. "uri": "hls_450k_video.ts"
  1650. }, {
  1651. "byterange": {
  1652. "length": 476580,
  1653. "offset": 1823412
  1654. },
  1655. "duration": 10,
  1656. "timeline": 0,
  1657. "uri": "hls_450k_video.ts"
  1658. }, {
  1659. "byterange": {
  1660. "length": 535612,
  1661. "offset": 2299992
  1662. },
  1663. "duration": 10,
  1664. "timeline": 0,
  1665. "uri": "hls_450k_video.ts"
  1666. }, {
  1667. "byterange": {
  1668. "length": 207176,
  1669. "offset": 2835604
  1670. },
  1671. "duration": 10,
  1672. "timeline": 0,
  1673. "uri": "hls_450k_video.ts"
  1674. }, {
  1675. "byterange": {
  1676. "length": 455900,
  1677. "offset": 3042780
  1678. },
  1679. "duration": 10,
  1680. "timeline": 0,
  1681. "uri": "hls_450k_video.ts"
  1682. }, {
  1683. "byterange": {
  1684. "length": 657248,
  1685. "offset": 3498680
  1686. },
  1687. "duration": 10,
  1688. "timeline": 0,
  1689. "uri": "hls_450k_video.ts"
  1690. }, {
  1691. "byterange": {
  1692. "length": 571708,
  1693. "offset": 4155928
  1694. },
  1695. "duration": 10,
  1696. "timeline": 0,
  1697. "uri": "hls_450k_video.ts"
  1698. }, {
  1699. "byterange": {
  1700. "length": 485040,
  1701. "offset": 4727636
  1702. },
  1703. "duration": 10,
  1704. "timeline": 0,
  1705. "uri": "hls_450k_video.ts"
  1706. }, {
  1707. "byterange": {
  1708. "length": 709136,
  1709. "offset": 5212676
  1710. },
  1711. "duration": 10,
  1712. "timeline": 0,
  1713. "uri": "hls_450k_video.ts"
  1714. }, {
  1715. "byterange": {
  1716. "length": 730004,
  1717. "offset": 5921812
  1718. },
  1719. "duration": 10,
  1720. "timeline": 0,
  1721. "uri": "hls_450k_video.ts"
  1722. }, {
  1723. "byterange": {
  1724. "length": 456276,
  1725. "offset": 6651816
  1726. },
  1727. "duration": 10,
  1728. "timeline": 0,
  1729. "uri": "hls_450k_video.ts"
  1730. }, {
  1731. "byterange": {
  1732. "length": 468684,
  1733. "offset": 7108092
  1734. },
  1735. "duration": 10,
  1736. "timeline": 0,
  1737. "uri": "hls_450k_video.ts"
  1738. }, {
  1739. "byterange": {
  1740. "length": 444996,
  1741. "offset": 7576776
  1742. },
  1743. "duration": 10,
  1744. "timeline": 0,
  1745. "uri": "hls_450k_video.ts"
  1746. }, {
  1747. "byterange": {
  1748. "length": 331444,
  1749. "offset": 8021772
  1750. },
  1751. "duration": 10,
  1752. "timeline": 0,
  1753. "uri": "hls_450k_video.ts"
  1754. }, {
  1755. "byterange": {
  1756. "length": 44556,
  1757. "offset": 8353216
  1758. },
  1759. "duration": 1.4167,
  1760. "timeline": 0,
  1761. "uri": "hls_450k_video.ts"
  1762. }],
  1763. "targetDuration": 10,
  1764. "endList": true,
  1765. "discontinuitySequence": 0,
  1766. "discontinuityStarts": []
  1767. },
  1768. "allowCacheInvalid": {
  1769. "allowCache": true,
  1770. "mediaSequence": 0,
  1771. "playlistType": "VOD",
  1772. "segments": [{
  1773. "byterange": {
  1774. "length": 522828,
  1775. "offset": 0
  1776. },
  1777. "duration": 10,
  1778. "timeline": 0,
  1779. "uri": "hls_450k_video.ts"
  1780. }],
  1781. "targetDuration": 10,
  1782. "endList": true,
  1783. "discontinuitySequence": 0,
  1784. "discontinuityStarts": []
  1785. },
  1786. "alternateAudio": {
  1787. allowCache: true,
  1788. discontinuityStarts: [],
  1789. mediaGroups: {
  1790. // TYPE
  1791. AUDIO: {
  1792. // GROUP-ID
  1793. "audio": {
  1794. // NAME
  1795. "English": {
  1796. language: 'eng',
  1797. autoselect: true,
  1798. "default": true,
  1799. uri: "eng/prog_index.m3u8"
  1800. },
  1801. // NAME
  1802. "Français": {
  1803. language: "fre",
  1804. autoselect: true,
  1805. "default": false,
  1806. uri: "fre/prog_index.m3u8"
  1807. },
  1808. // NAME
  1809. "Espanol": {
  1810. language: "sp",
  1811. autoselect: true,
  1812. "default": false,
  1813. uri: "sp/prog_index.m3u8"
  1814. }
  1815. }
  1816. },
  1817. VIDEO: {},
  1818. "CLOSED-CAPTIONS": {},
  1819. SUBTITLES: {}
  1820. },
  1821. playlists: [{
  1822. attributes: {
  1823. "PROGRAM-ID": 1,
  1824. BANDWIDTH: 195023,
  1825. CODECS: "avc1.42e00a,mp4a.40.2",
  1826. AUDIO: 'audio'
  1827. },
  1828. timeline: 0,
  1829. uri: "lo/prog_index.m3u8"
  1830. }, {
  1831. attributes: {
  1832. "PROGRAM-ID": 1,
  1833. BANDWIDTH: 591680,
  1834. CODECS: "avc1.42e01e,mp4a.40.2",
  1835. AUDIO: 'audio'
  1836. },
  1837. timeline: 0,
  1838. uri: "hi/prog_index.m3u8"
  1839. }],
  1840. segments: []
  1841. },
  1842. "alternateVideo": {
  1843. allowCache: true,
  1844. discontinuityStarts: [],
  1845. mediaGroups: {
  1846. AUDIO: {
  1847. aac: {
  1848. English: {
  1849. autoselect: true,
  1850. "default": true,
  1851. language: "eng",
  1852. uri: "eng/prog_index.m3u8"
  1853. }
  1854. }
  1855. },
  1856. VIDEO: {
  1857. "500kbs": {
  1858. Angle1: {
  1859. autoselect: true,
  1860. "default": true
  1861. },
  1862. Angle2: {
  1863. autoselect: true,
  1864. "default": false,
  1865. uri: "Angle2/500kbs/prog_index.m3u8"
  1866. },
  1867. Angle3: {
  1868. autoselect: true,
  1869. "default": false,
  1870. uri: "Angle3/500kbs/prog_index.m3u8"
  1871. }
  1872. }
  1873. },
  1874. "CLOSED-CAPTIONS": {},
  1875. SUBTITLES: {}
  1876. },
  1877. playlists: [{
  1878. attributes: {
  1879. "PROGRAM-ID": 1,
  1880. BANDWIDTH: 754857,
  1881. CODECS: "mp4a.40.2,avc1.4d401e",
  1882. AUDIO: "aac",
  1883. VIDEO: "500kbs"
  1884. },
  1885. timeline: 0,
  1886. uri: "Angle1/500kbs/prog_index.m3u8"
  1887. }],
  1888. segments: []
  1889. },
  1890. "brightcove": {
  1891. "allowCache": true,
  1892. "playlists": [{
  1893. "attributes": {
  1894. "PROGRAM-ID": 1,
  1895. "BANDWIDTH": 240000,
  1896. "RESOLUTION": {
  1897. "width": 396,
  1898. "height": 224
  1899. }
  1900. },
  1901. "timeline": 0,
  1902. "uri": "http://c.brightcove.com/services/mobile/streaming/index/rendition.m3u8?assetId=1824686811001&videoId=1824650741001"
  1903. }, {
  1904. "attributes": {
  1905. "PROGRAM-ID": 1,
  1906. "BANDWIDTH": 40000
  1907. },
  1908. "timeline": 0,
  1909. "uri": "http://c.brightcove.com/services/mobile/streaming/index/rendition.m3u8?assetId=1824683759001&videoId=1824650741001"
  1910. }, {
  1911. "attributes": {
  1912. "PROGRAM-ID": 1,
  1913. "BANDWIDTH": 440000,
  1914. "RESOLUTION": {
  1915. "width": 396,
  1916. "height": 224
  1917. }
  1918. },
  1919. "timeline": 0,
  1920. "uri": "http://c.brightcove.com/services/mobile/streaming/index/rendition.m3u8?assetId=1824686593001&videoId=1824650741001"
  1921. }, {
  1922. "attributes": {
  1923. "PROGRAM-ID": 1,
  1924. "BANDWIDTH": 1928000,
  1925. "RESOLUTION": {
  1926. "width": 960,
  1927. "height": 540
  1928. }
  1929. },
  1930. "timeline": 0,
  1931. "uri": "http://c.brightcove.com/services/mobile/streaming/index/rendition.m3u8?assetId=1824687660001&videoId=1824650741001"
  1932. }],
  1933. "discontinuityStarts": [],
  1934. "mediaGroups": {
  1935. "VIDEO": {},
  1936. "AUDIO": {},
  1937. "CLOSED-CAPTIONS": {},
  1938. "SUBTITLES": {}
  1939. },
  1940. "segments": []
  1941. },
  1942. "byteRange": {
  1943. "allowCache": true,
  1944. "mediaSequence": 0,
  1945. "playlistType": "VOD",
  1946. "segments": [{
  1947. "duration": 10,
  1948. "timeline": 0,
  1949. "uri": "hls_450k_video.ts"
  1950. }, {
  1951. "byterange": {
  1952. "length": 587500,
  1953. "offset": 522828
  1954. },
  1955. "duration": 10,
  1956. "timeline": 0,
  1957. "uri": "hls_450k_video.ts"
  1958. }, {
  1959. "byterange": {
  1960. "length": 713084,
  1961. "offset": 0
  1962. },
  1963. "duration": 10,
  1964. "timeline": 0,
  1965. "uri": "hls_450k_video2.ts"
  1966. }, {
  1967. "byterange": {
  1968. "length": 476580,
  1969. "offset": 1823412
  1970. },
  1971. "duration": 10,
  1972. "timeline": 0,
  1973. "uri": "hls_450k_video.ts"
  1974. }, {
  1975. "byterange": {
  1976. "length": 535612,
  1977. "offset": 2299992
  1978. },
  1979. "duration": 10,
  1980. "timeline": 0,
  1981. "uri": "hls_450k_video.ts"
  1982. }, {
  1983. "byterange": {
  1984. "length": 207176,
  1985. "offset": 2835604
  1986. },
  1987. "duration": 10,
  1988. "timeline": 0,
  1989. "uri": "hls_450k_video.ts"
  1990. }, {
  1991. "byterange": {
  1992. "length": 455900,
  1993. "offset": 3042780
  1994. },
  1995. "duration": 10,
  1996. "timeline": 0,
  1997. "uri": "hls_450k_video.ts"
  1998. }, {
  1999. "byterange": {
  2000. "length": 657248,
  2001. "offset": 3498680
  2002. },
  2003. "duration": 10,
  2004. "timeline": 0,
  2005. "uri": "hls_450k_video.ts"
  2006. }, {
  2007. "byterange": {
  2008. "length": 571708,
  2009. "offset": 4155928
  2010. },
  2011. "duration": 10,
  2012. "timeline": 0,
  2013. "uri": "hls_450k_video.ts"
  2014. }, {
  2015. "byterange": {
  2016. "length": 485040,
  2017. "offset": 4727636
  2018. },
  2019. "duration": 10,
  2020. "timeline": 0,
  2021. "uri": "hls_450k_video.ts"
  2022. }, {
  2023. "byterange": {
  2024. "length": 709136,
  2025. "offset": 5212676
  2026. },
  2027. "duration": 10,
  2028. "timeline": 0,
  2029. "uri": "hls_450k_video.ts"
  2030. }, {
  2031. "byterange": {
  2032. "length": 730004,
  2033. "offset": 5921812
  2034. },
  2035. "duration": 10,
  2036. "timeline": 0,
  2037. "uri": "hls_450k_video.ts"
  2038. }, {
  2039. "byterange": {
  2040. "length": 456276,
  2041. "offset": 6651816
  2042. },
  2043. "duration": 10,
  2044. "timeline": 0,
  2045. "uri": "hls_450k_video.ts"
  2046. }, {
  2047. "byterange": {
  2048. "length": 468684,
  2049. "offset": 7108092
  2050. },
  2051. "duration": 10,
  2052. "timeline": 0,
  2053. "uri": "hls_450k_video.ts"
  2054. }, {
  2055. "byterange": {
  2056. "length": 444996,
  2057. "offset": 7576776
  2058. },
  2059. "duration": 10,
  2060. "timeline": 0,
  2061. "uri": "hls_450k_video.ts"
  2062. }, {
  2063. "byterange": {
  2064. "length": 331444,
  2065. "offset": 8021772
  2066. },
  2067. "duration": 10,
  2068. "timeline": 0,
  2069. "uri": "hls_450k_video.ts"
  2070. }, {
  2071. "byterange": {
  2072. "length": 44556,
  2073. "offset": 8353216
  2074. },
  2075. "duration": 1.4167,
  2076. "timeline": 0,
  2077. "uri": "hls_450k_video.ts"
  2078. }],
  2079. "targetDuration": 10,
  2080. "endList": true,
  2081. "discontinuitySequence": 0,
  2082. "discontinuityStarts": []
  2083. },
  2084. "dateTime": {
  2085. "allowCache": false,
  2086. "mediaSequence": 0,
  2087. "playlistType": "VOD",
  2088. "segments": [{
  2089. "duration": 10,
  2090. "timeline": 0,
  2091. "uri": "hls_450k_video.ts"
  2092. }],
  2093. "targetDuration": 10,
  2094. "endList": true,
  2095. "dateTimeString": "2016-06-22T09:20:16.166-04:00",
  2096. "dateTimeObject": new Date("2016-06-22T09:20:16.166-04:00"),
  2097. "discontinuitySequence": 0,
  2098. "discontinuityStarts": []
  2099. },
  2100. "disallowCache": {
  2101. "allowCache": false,
  2102. "mediaSequence": 0,
  2103. "playlistType": "VOD",
  2104. "segments": [{
  2105. "byterange": {
  2106. "length": 522828,
  2107. "offset": 0
  2108. },
  2109. "duration": 10,
  2110. "timeline": 0,
  2111. "uri": "hls_450k_video.ts"
  2112. }],
  2113. "targetDuration": 10,
  2114. "endList": true,
  2115. "discontinuitySequence": 0,
  2116. "discontinuityStarts": []
  2117. },
  2118. "disc-sequence": {
  2119. "allowCache": true,
  2120. "mediaSequence": 0,
  2121. "discontinuitySequence": 3,
  2122. "segments": [{
  2123. "duration": 10,
  2124. "timeline": 3,
  2125. "uri": "001.ts"
  2126. }, {
  2127. "duration": 19,
  2128. "timeline": 3,
  2129. "uri": "002.ts"
  2130. }, {
  2131. "discontinuity": true,
  2132. "duration": 10,
  2133. "timeline": 4,
  2134. "uri": "003.ts"
  2135. }, {
  2136. "duration": 11,
  2137. "timeline": 4,
  2138. "uri": "004.ts"
  2139. }],
  2140. "targetDuration": 19,
  2141. "endList": true,
  2142. "discontinuityStarts": [2]
  2143. },
  2144. "discontinuity": {
  2145. "allowCache": true,
  2146. "mediaSequence": 0,
  2147. "discontinuitySequence": 0,
  2148. "segments": [{
  2149. "duration": 10,
  2150. "timeline": 0,
  2151. "uri": "001.ts"
  2152. }, {
  2153. "duration": 19,
  2154. "timeline": 0,
  2155. "uri": "002.ts"
  2156. }, {
  2157. "discontinuity": true,
  2158. "duration": 10,
  2159. "timeline": 1,
  2160. "uri": "003.ts"
  2161. }, {
  2162. "duration": 11,
  2163. "timeline": 1,
  2164. "uri": "004.ts"
  2165. }, {
  2166. "discontinuity": true,
  2167. "duration": 10,
  2168. "timeline": 2,
  2169. "uri": "005.ts"
  2170. }, {
  2171. "duration": 10,
  2172. "timeline": 2,
  2173. "uri": "006.ts"
  2174. }, {
  2175. "duration": 10,
  2176. "timeline": 2,
  2177. "uri": "007.ts"
  2178. }, {
  2179. "discontinuity": true,
  2180. "duration": 10,
  2181. "timeline": 3,
  2182. "uri": "008.ts"
  2183. }, {
  2184. "duration": 16,
  2185. "timeline": 3,
  2186. "uri": "009.ts"
  2187. }],
  2188. "targetDuration": 19,
  2189. "endList": true,
  2190. "discontinuityStarts": [2, 4, 7]
  2191. },
  2192. "domainUris": {
  2193. "allowCache": true,
  2194. "mediaSequence": 0,
  2195. "playlistType": "VOD",
  2196. "segments": [{
  2197. "duration": 10,
  2198. "timeline": 0,
  2199. "uri": "/00001.ts"
  2200. }, {
  2201. "duration": 10,
  2202. "timeline": 0,
  2203. "uri": "/subdir/00002.ts"
  2204. }, {
  2205. "duration": 10,
  2206. "timeline": 0,
  2207. "uri": "/00003.ts"
  2208. }, {
  2209. "duration": 10,
  2210. "timeline": 0,
  2211. "uri": "/00004.ts"
  2212. }],
  2213. "targetDuration": 10,
  2214. "endList": true,
  2215. "discontinuitySequence": 0,
  2216. "discontinuityStarts": []
  2217. },
  2218. "empty": {
  2219. "allowCache": true,
  2220. "discontinuityStarts": [],
  2221. "segments": []
  2222. },
  2223. "emptyAllowCache": {
  2224. "allowCache": true,
  2225. "mediaSequence": 0,
  2226. "playlistType": "VOD",
  2227. "segments": [{
  2228. "byterange": {
  2229. "length": 522828,
  2230. "offset": 0
  2231. },
  2232. "duration": 10,
  2233. "timeline": 0,
  2234. "uri": "hls_450k_video.ts"
  2235. }],
  2236. "targetDuration": 10,
  2237. "endList": true,
  2238. "discontinuitySequence": 0,
  2239. "discontinuityStarts": []
  2240. },
  2241. "emptyMediaSequence": {
  2242. "allowCache": true,
  2243. "mediaSequence": 0,
  2244. "playlistType": "VOD",
  2245. "segments": [{
  2246. "duration": 6.64,
  2247. "timeline": 0,
  2248. "uri": "/test/ts-files/tvy7/8a5e2822668b5370f4eb1438b2564fb7ab12ffe1-hi720.ts"
  2249. }, {
  2250. "duration": 6.08,
  2251. "timeline": 0,
  2252. "uri": "/test/ts-files/tvy7/56be1cef869a1c0cc8e38864ad1add17d187f051-hi720.ts"
  2253. }, {
  2254. "duration": 6.6,
  2255. "timeline": 0,
  2256. "uri": "/test/ts-files/tvy7/549c8c77f55f049741a06596e5c1e01dacaa46d0-hi720.ts"
  2257. }, {
  2258. "duration": 5,
  2259. "timeline": 0,
  2260. "uri": "/test/ts-files/tvy7/6cfa378684ffeb1c455a64dae6c103290a1f53d4-hi720.ts"
  2261. }],
  2262. "targetDuration": 8,
  2263. "endList": true,
  2264. "discontinuitySequence": 0,
  2265. "discontinuityStarts": []
  2266. },
  2267. "emptyPlaylistType": {
  2268. "allowCache": true,
  2269. "mediaSequence": 0,
  2270. "segments": [{
  2271. "duration": 10,
  2272. "timeline": 0,
  2273. "uri": "/test/ts-files/zencoder/haze/Haze_Mantel_President_encoded_1200-00001.ts"
  2274. }, {
  2275. "duration": 10,
  2276. "timeline": 0,
  2277. "uri": "/test/ts-files/zencoder/haze/Haze_Mantel_President_encoded_1200-00002.ts"
  2278. }, {
  2279. "duration": 10,
  2280. "timeline": 0,
  2281. "uri": "/test/ts-files/zencoder/haze/Haze_Mantel_President_encoded_1200-00003.ts"
  2282. }, {
  2283. "duration": 10,
  2284. "timeline": 0,
  2285. "uri": "/test/ts-files/zencoder/haze/Haze_Mantel_President_encoded_1200-00004.ts"
  2286. }, {
  2287. "duration": 10,
  2288. "timeline": 0,
  2289. "uri": "/test/ts-files/zencoder/haze/Haze_Mantel_President_encoded_1200-00005.ts"
  2290. }, {
  2291. "duration": 8,
  2292. "timeline": 0,
  2293. "uri": "/test/ts-files/zencoder/haze/Haze_Mantel_President_encoded_1200-00006.ts"
  2294. }],
  2295. "targetDuration": 10,
  2296. "endList": true,
  2297. "discontinuitySequence": 0,
  2298. "discontinuityStarts": []
  2299. },
  2300. "emptyTargetDuration": {
  2301. "allowCache": true,
  2302. "playlists": [{
  2303. "attributes": {
  2304. "PROGRAM-ID": 1,
  2305. "BANDWIDTH": 240000,
  2306. "RESOLUTION": {
  2307. "width": 396,
  2308. "height": 224
  2309. }
  2310. },
  2311. "timeline": 0,
  2312. "uri": "http://c.brightcove.com/services/mobile/streaming/index/rendition.m3u8?assetId=1824686811001&videoId=1824650741001"
  2313. }, {
  2314. "attributes": {
  2315. "PROGRAM-ID": 1,
  2316. "BANDWIDTH": 40000
  2317. },
  2318. "timeline": 0,
  2319. "uri": "http://c.brightcove.com/services/mobile/streaming/index/rendition.m3u8?assetId=1824683759001&videoId=1824650741001"
  2320. }, {
  2321. "attributes": {
  2322. "PROGRAM-ID": 1,
  2323. "BANDWIDTH": 440000,
  2324. "RESOLUTION": {
  2325. "width": 396,
  2326. "height": 224
  2327. }
  2328. },
  2329. "timeline": 0,
  2330. "uri": "http://c.brightcove.com/services/mobile/streaming/index/rendition.m3u8?assetId=1824686593001&videoId=1824650741001"
  2331. }, {
  2332. "attributes": {
  2333. "PROGRAM-ID": 1,
  2334. "BANDWIDTH": 1928000,
  2335. "RESOLUTION": {
  2336. "width": 960,
  2337. "height": 540
  2338. }
  2339. },
  2340. "timeline": 0,
  2341. "uri": "http://c.brightcove.com/services/mobile/streaming/index/rendition.m3u8?assetId=1824687660001&videoId=1824650741001"
  2342. }],
  2343. "discontinuityStarts": [],
  2344. "mediaGroups": {
  2345. "VIDEO": {},
  2346. "AUDIO": {},
  2347. "CLOSED-CAPTIONS": {},
  2348. "SUBTITLES": {}
  2349. },
  2350. "segments": []
  2351. },
  2352. "encrypted": {
  2353. "allowCache": true,
  2354. "mediaSequence": 7794,
  2355. "discontinuitySequence": 0,
  2356. "discontinuityStarts": [],
  2357. "segments": [{
  2358. "duration": 2.833,
  2359. "timeline": 0,
  2360. "key": {
  2361. "method": "AES-128",
  2362. "uri": "https://priv.example.com/key.php?r=52"
  2363. },
  2364. "uri": "http://media.example.com/fileSequence52-A.ts"
  2365. }, {
  2366. "duration": 15,
  2367. "timeline": 0,
  2368. "key": {
  2369. "method": "AES-128",
  2370. "uri": "https://priv.example.com/key.php?r=52"
  2371. },
  2372. "uri": "http://media.example.com/fileSequence52-B.ts"
  2373. }, {
  2374. "duration": 13.333,
  2375. "timeline": 0,
  2376. "key": {
  2377. "method": "AES-128",
  2378. "uri": "https://priv.example.com/key.php?r=52"
  2379. },
  2380. "uri": "http://media.example.com/fileSequence52-C.ts"
  2381. }, {
  2382. "duration": 15,
  2383. "timeline": 0,
  2384. "key": {
  2385. "method": "AES-128",
  2386. "uri": "https://priv.example.com/key.php?r=53"
  2387. },
  2388. "uri": "http://media.example.com/fileSequence53-A.ts"
  2389. }, {
  2390. "duration": 14,
  2391. "timeline": 0,
  2392. "key": {
  2393. "method": "AES-128",
  2394. "uri": "https://priv.example.com/key.php?r=54",
  2395. "iv": new Uint32Array([0, 0, 331, 3063767524])
  2396. },
  2397. "uri": "http://media.example.com/fileSequence53-B.ts"
  2398. }, {
  2399. "duration": 15,
  2400. "timeline": 0,
  2401. "uri": "http://media.example.com/fileSequence53-B.ts"
  2402. }],
  2403. "targetDuration": 15
  2404. },
  2405. "event": {
  2406. "allowCache": true,
  2407. "mediaSequence": 0,
  2408. "playlistType": "EVENT",
  2409. "segments": [{
  2410. "duration": 10,
  2411. "timeline": 0,
  2412. "uri": "/test/ts-files/zencoder/haze/Haze_Mantel_President_encoded_1200-00001.ts"
  2413. }, {
  2414. "duration": 10,
  2415. "timeline": 0,
  2416. "uri": "/test/ts-files/zencoder/haze/Haze_Mantel_President_encoded_1200-00002.ts"
  2417. }, {
  2418. "duration": 10,
  2419. "timeline": 0,
  2420. "uri": "/test/ts-files/zencoder/haze/Haze_Mantel_President_encoded_1200-00003.ts"
  2421. }, {
  2422. "duration": 10,
  2423. "timeline": 0,
  2424. "uri": "/test/ts-files/zencoder/haze/Haze_Mantel_President_encoded_1200-00004.ts"
  2425. }, {
  2426. "duration": 10,
  2427. "timeline": 0,
  2428. "uri": "/test/ts-files/zencoder/haze/Haze_Mantel_President_encoded_1200-00005.ts"
  2429. }, {
  2430. "duration": 8,
  2431. "timeline": 0,
  2432. "uri": "/test/ts-files/zencoder/haze/Haze_Mantel_President_encoded_1200-00006.ts"
  2433. }],
  2434. "targetDuration": 10,
  2435. "endList": true,
  2436. "discontinuitySequence": 0,
  2437. "discontinuityStarts": []
  2438. },
  2439. "extXPlaylistTypeInvalidPlaylist": {
  2440. "allowCache": true,
  2441. "mediaSequence": 1,
  2442. "segments": [{
  2443. "duration": 6.64,
  2444. "timeline": 0,
  2445. "uri": "/test/ts-files/tvy7/8a5e2822668b5370f4eb1438b2564fb7ab12ffe1-hi720.ts"
  2446. }],
  2447. "targetDuration": 8,
  2448. "endList": true,
  2449. "discontinuitySequence": 0,
  2450. "discontinuityStarts": []
  2451. },
  2452. "extinf": {
  2453. "allowCache": true,
  2454. "mediaSequence": 0,
  2455. "playlistType": "VOD",
  2456. "segments": [{
  2457. "byterange": {
  2458. "length": 522828,
  2459. "offset": 0
  2460. },
  2461. "duration": 10,
  2462. "timeline": 0,
  2463. "uri": "hls_450k_video.ts"
  2464. }, {
  2465. "byterange": {
  2466. "length": 587500,
  2467. "offset": 522828
  2468. },
  2469. "duration": 10,
  2470. "timeline": 0,
  2471. "uri": "hls_450k_video.ts"
  2472. }, {
  2473. "byterange": {
  2474. "length": 713084,
  2475. "offset": 1110328
  2476. },
  2477. "duration": 5,
  2478. "timeline": 0,
  2479. "uri": "hls_450k_video.ts"
  2480. }, {
  2481. "byterange": {
  2482. "length": 476580,
  2483. "offset": 1823412
  2484. },
  2485. "duration": 9.7,
  2486. "timeline": 0,
  2487. "uri": "hls_450k_video.ts"
  2488. }, {
  2489. "byterange": {
  2490. "length": 535612,
  2491. "offset": 2299992
  2492. },
  2493. "duration": 10,
  2494. "timeline": 0,
  2495. "uri": "hls_450k_video.ts"
  2496. }, {
  2497. "byterange": {
  2498. "length": 207176,
  2499. "offset": 2835604
  2500. },
  2501. "duration": 10,
  2502. "timeline": 0,
  2503. "uri": "hls_450k_video.ts"
  2504. }, {
  2505. "byterange": {
  2506. "length": 455900,
  2507. "offset": 3042780
  2508. },
  2509. "duration": 10,
  2510. "timeline": 0,
  2511. "uri": "hls_450k_video.ts"
  2512. }, {
  2513. "byterange": {
  2514. "length": 657248,
  2515. "offset": 3498680
  2516. },
  2517. "duration": 10,
  2518. "timeline": 0,
  2519. "uri": "hls_450k_video.ts"
  2520. }, {
  2521. "byterange": {
  2522. "length": 571708,
  2523. "offset": 4155928
  2524. },
  2525. "duration": 10,
  2526. "timeline": 0,
  2527. "uri": "hls_450k_video.ts"
  2528. }, {
  2529. "byterange": {
  2530. "length": 485040,
  2531. "offset": 4727636
  2532. },
  2533. "duration": 10,
  2534. "timeline": 0,
  2535. "uri": "hls_450k_video.ts"
  2536. }, {
  2537. "byterange": {
  2538. "length": 709136,
  2539. "offset": 5212676
  2540. },
  2541. "duration": 10,
  2542. "timeline": 0,
  2543. "uri": "hls_450k_video.ts"
  2544. }, {
  2545. "byterange": {
  2546. "length": 730004,
  2547. "offset": 5921812
  2548. },
  2549. "duration": 10,
  2550. "timeline": 0,
  2551. "uri": "hls_450k_video.ts"
  2552. }, {
  2553. "byterange": {
  2554. "length": 456276,
  2555. "offset": 6651816
  2556. },
  2557. "duration": 10,
  2558. "timeline": 0,
  2559. "uri": "hls_450k_video.ts"
  2560. }, {
  2561. "byterange": {
  2562. "length": 468684,
  2563. "offset": 7108092
  2564. },
  2565. "duration": 10,
  2566. "timeline": 0,
  2567. "uri": "hls_450k_video.ts"
  2568. }, {
  2569. "byterange": {
  2570. "length": 444996,
  2571. "offset": 7576776
  2572. },
  2573. "duration": 10,
  2574. "timeline": 0,
  2575. "uri": "hls_450k_video.ts"
  2576. }, {
  2577. "byterange": {
  2578. "length": 331444,
  2579. "offset": 8021772
  2580. },
  2581. "duration": 10,
  2582. "timeline": 0,
  2583. "uri": "hls_450k_video.ts"
  2584. }, {
  2585. "byterange": {
  2586. "length": 44556,
  2587. "offset": 8353216
  2588. },
  2589. "duration": 10,
  2590. "timeline": 0,
  2591. "uri": "hls_450k_video.ts"
  2592. }],
  2593. "targetDuration": 10,
  2594. "endList": true,
  2595. "discontinuitySequence": 0,
  2596. "discontinuityStarts": []
  2597. },
  2598. "fmp4": {
  2599. "allowCache": true,
  2600. "mediaSequence": 1,
  2601. "playlistType": "VOD",
  2602. "targetDuration": 6,
  2603. "discontinuitySequence": 0,
  2604. "discontinuityStarts": [],
  2605. "segments": [{
  2606. "byterange": {
  2607. "length": 5666510,
  2608. "offset": 720
  2609. },
  2610. "duration": 6.006,
  2611. "timeline": 0,
  2612. "uri": "main.mp4",
  2613. "map": {
  2614. "byterange": {
  2615. "length": 720,
  2616. "offset": 0
  2617. },
  2618. "uri": "main.mp4"
  2619. }
  2620. }, {
  2621. "byterange": {
  2622. "length": 5861577,
  2623. "offset": 5667230
  2624. },
  2625. "duration": 6.006,
  2626. "timeline": 0,
  2627. "uri": "main.mp4",
  2628. "map": {
  2629. "byterange": {
  2630. "length": 720,
  2631. "offset": 0
  2632. },
  2633. "uri": "main.mp4"
  2634. }
  2635. }],
  2636. "endList": true
  2637. },
  2638. "headerOnly": {
  2639. "allowCache": true,
  2640. "discontinuityStarts": [],
  2641. "segments": []
  2642. },
  2643. "invalidAllowCache": {
  2644. "allowCache": true,
  2645. "mediaSequence": 0,
  2646. "playlistType": "VOD",
  2647. "segments": [{
  2648. "byterange": {
  2649. "length": 522828,
  2650. "offset": 0
  2651. },
  2652. "duration": 10,
  2653. "timeline": 0,
  2654. "uri": "hls_450k_video.ts"
  2655. }],
  2656. "targetDuration": 10,
  2657. "endList": true,
  2658. "discontinuitySequence": 0,
  2659. "discontinuityStarts": []
  2660. },
  2661. "invalidMediaSequence": {
  2662. "allowCache": true,
  2663. "mediaSequence": 0,
  2664. "playlistType": "VOD",
  2665. "segments": [{
  2666. "duration": 6.64,
  2667. "timeline": 0,
  2668. "uri": "/test/ts-files/tvy7/8a5e2822668b5370f4eb1438b2564fb7ab12ffe1-hi720.ts"
  2669. }, {
  2670. "duration": 6.08,
  2671. "timeline": 0,
  2672. "uri": "/test/ts-files/tvy7/56be1cef869a1c0cc8e38864ad1add17d187f051-hi720.ts"
  2673. }, {
  2674. "duration": 6.6,
  2675. "timeline": 0,
  2676. "uri": "/test/ts-files/tvy7/549c8c77f55f049741a06596e5c1e01dacaa46d0-hi720.ts"
  2677. }, {
  2678. "duration": 5,
  2679. "timeline": 0,
  2680. "uri": "/test/ts-files/tvy7/6cfa378684ffeb1c455a64dae6c103290a1f53d4-hi720.ts"
  2681. }],
  2682. "targetDuration": 8,
  2683. "endList": true,
  2684. "discontinuitySequence": 0,
  2685. "discontinuityStarts": []
  2686. },
  2687. "invalidPlaylistType": {
  2688. "allowCache": true,
  2689. "mediaSequence": 0,
  2690. "segments": [{
  2691. "duration": 10,
  2692. "timeline": 0,
  2693. "uri": "/test/ts-files/zencoder/haze/Haze_Mantel_President_encoded_1200-00001.ts"
  2694. }, {
  2695. "duration": 10,
  2696. "timeline": 0,
  2697. "uri": "/test/ts-files/zencoder/haze/Haze_Mantel_President_encoded_1200-00002.ts"
  2698. }, {
  2699. "duration": 10,
  2700. "timeline": 0,
  2701. "uri": "/test/ts-files/zencoder/haze/Haze_Mantel_President_encoded_1200-00003.ts"
  2702. }, {
  2703. "duration": 10,
  2704. "timeline": 0,
  2705. "uri": "/test/ts-files/zencoder/haze/Haze_Mantel_President_encoded_1200-00004.ts"
  2706. }, {
  2707. "duration": 10,
  2708. "timeline": 0,
  2709. "uri": "/test/ts-files/zencoder/haze/Haze_Mantel_President_encoded_1200-00005.ts"
  2710. }, {
  2711. "duration": 8,
  2712. "timeline": 0,
  2713. "uri": "/test/ts-files/zencoder/haze/Haze_Mantel_President_encoded_1200-00006.ts"
  2714. }],
  2715. "targetDuration": 10,
  2716. "endList": true,
  2717. "discontinuitySequence": 0,
  2718. "discontinuityStarts": []
  2719. },
  2720. "invalidTargetDuration": {
  2721. "allowCache": true,
  2722. "mediaSequence": 0,
  2723. "playlistType": "VOD",
  2724. "segments": [{
  2725. "byterange": {
  2726. "length": 522828,
  2727. "offset": 0
  2728. },
  2729. "duration": 10,
  2730. "timeline": 0,
  2731. "uri": "hls_450k_video.ts"
  2732. }, {
  2733. "byterange": {
  2734. "length": 587500,
  2735. "offset": 522828
  2736. },
  2737. "duration": 10,
  2738. "timeline": 0,
  2739. "uri": "hls_450k_video.ts"
  2740. }, {
  2741. "byterange": {
  2742. "length": 713084,
  2743. "offset": 1110328
  2744. },
  2745. "duration": 10,
  2746. "timeline": 0,
  2747. "uri": "hls_450k_video.ts"
  2748. }, {
  2749. "byterange": {
  2750. "length": 476580,
  2751. "offset": 1823412
  2752. },
  2753. "duration": 10,
  2754. "timeline": 0,
  2755. "uri": "hls_450k_video.ts"
  2756. }, {
  2757. "byterange": {
  2758. "length": 535612,
  2759. "offset": 2299992
  2760. },
  2761. "duration": 10,
  2762. "timeline": 0,
  2763. "uri": "hls_450k_video.ts"
  2764. }, {
  2765. "byterange": {
  2766. "length": 207176,
  2767. "offset": 2835604
  2768. },
  2769. "duration": 10,
  2770. "timeline": 0,
  2771. "uri": "hls_450k_video.ts"
  2772. }, {
  2773. "byterange": {
  2774. "length": 455900,
  2775. "offset": 3042780
  2776. },
  2777. "duration": 10,
  2778. "timeline": 0,
  2779. "uri": "hls_450k_video.ts"
  2780. }, {
  2781. "byterange": {
  2782. "length": 657248,
  2783. "offset": 3498680
  2784. },
  2785. "duration": 10,
  2786. "timeline": 0,
  2787. "uri": "hls_450k_video.ts"
  2788. }, {
  2789. "byterange": {
  2790. "length": 571708,
  2791. "offset": 4155928
  2792. },
  2793. "duration": 10,
  2794. "timeline": 0,
  2795. "uri": "hls_450k_video.ts"
  2796. }, {
  2797. "byterange": {
  2798. "length": 485040,
  2799. "offset": 4727636
  2800. },
  2801. "duration": 10,
  2802. "timeline": 0,
  2803. "uri": "hls_450k_video.ts"
  2804. }, {
  2805. "byterange": {
  2806. "length": 709136,
  2807. "offset": 5212676
  2808. },
  2809. "duration": 10,
  2810. "timeline": 0,
  2811. "uri": "hls_450k_video.ts"
  2812. }, {
  2813. "byterange": {
  2814. "length": 730004,
  2815. "offset": 5921812
  2816. },
  2817. "duration": 10,
  2818. "timeline": 0,
  2819. "uri": "hls_450k_video.ts"
  2820. }, {
  2821. "byterange": {
  2822. "length": 456276,
  2823. "offset": 6651816
  2824. },
  2825. "duration": 10,
  2826. "timeline": 0,
  2827. "uri": "hls_450k_video.ts"
  2828. }, {
  2829. "byterange": {
  2830. "length": 468684,
  2831. "offset": 7108092
  2832. },
  2833. "duration": 10,
  2834. "timeline": 0,
  2835. "uri": "hls_450k_video.ts"
  2836. }, {
  2837. "byterange": {
  2838. "length": 444996,
  2839. "offset": 7576776
  2840. },
  2841. "duration": 10,
  2842. "timeline": 0,
  2843. "uri": "hls_450k_video.ts"
  2844. }, {
  2845. "byterange": {
  2846. "length": 331444,
  2847. "offset": 8021772
  2848. },
  2849. "duration": 10,
  2850. "timeline": 0,
  2851. "uri": "hls_450k_video.ts"
  2852. }, {
  2853. "byterange": {
  2854. "length": 44556,
  2855. "offset": 8353216
  2856. },
  2857. "duration": 1.4167,
  2858. "timeline": 0,
  2859. "uri": "hls_450k_video.ts"
  2860. }],
  2861. "endList": true,
  2862. "discontinuitySequence": 0,
  2863. "discontinuityStarts": []
  2864. },
  2865. "liveMissingSegmentDuration": {
  2866. "allowCache": true,
  2867. "mediaSequence": 0,
  2868. "playlistType": "VOD",
  2869. "segments": [{
  2870. "duration": 6.64,
  2871. "timeline": 0,
  2872. "uri": "/test/ts-files/tvy7/8a5e2822668b5370f4eb1438b2564fb7ab12ffe1-hi720.ts"
  2873. }, {
  2874. "duration": 8,
  2875. "timeline": 0,
  2876. "uri": "/test/ts-files/tvy7/56be1cef869a1c0cc8e38864ad1add17d187f051-hi720.ts"
  2877. }, {
  2878. "duration": 8,
  2879. "timeline": 0,
  2880. "uri": "/test/ts-files/tvy7/549c8c77f55f049741a06596e5c1e01dacaa46d0-hi720.ts"
  2881. }],
  2882. "targetDuration": 8,
  2883. "discontinuitySequence": 0,
  2884. "discontinuityStarts": []
  2885. },
  2886. "liveStart30sBefore": {
  2887. "allowCache": true,
  2888. "mediaSequence": 0,
  2889. "segments": [{
  2890. "duration": 10,
  2891. "timeline": 0,
  2892. "uri": "001.ts"
  2893. }, {
  2894. "duration": 19,
  2895. "timeline": 0,
  2896. "uri": "002.ts"
  2897. }, {
  2898. "duration": 10,
  2899. "timeline": 0,
  2900. "uri": "003.ts"
  2901. }, {
  2902. "duration": 11,
  2903. "timeline": 0,
  2904. "uri": "004.ts"
  2905. }, {
  2906. "duration": 10,
  2907. "timeline": 0,
  2908. "uri": "005.ts"
  2909. }, {
  2910. "duration": 10,
  2911. "timeline": 0,
  2912. "uri": "006.ts"
  2913. }, {
  2914. "duration": 10,
  2915. "timeline": 0,
  2916. "uri": "007.ts"
  2917. }, {
  2918. "duration": 10,
  2919. "timeline": 0,
  2920. "uri": "008.ts"
  2921. }, {
  2922. "duration": 16,
  2923. "timeline": 0,
  2924. "uri": "009.ts"
  2925. }],
  2926. "targetDuration": 10,
  2927. "discontinuitySequence": 0,
  2928. "discontinuityStarts": []
  2929. },
  2930. "manifestExtTTargetdurationNegative": {
  2931. "allowCache": true,
  2932. "mediaSequence": 0,
  2933. "segments": [{
  2934. "duration": 10,
  2935. "timeline": 0,
  2936. "uri": "/test/ts-files/zencoder/gogo/00001.ts"
  2937. }],
  2938. "endList": true,
  2939. "discontinuitySequence": 0,
  2940. "discontinuityStarts": []
  2941. },
  2942. "manifestExtXEndlistEarly": {
  2943. "allowCache": true,
  2944. "mediaSequence": 0,
  2945. "segments": [{
  2946. "duration": 10,
  2947. "timeline": 0,
  2948. "uri": "/test/ts-files/zencoder/gogo/00001.ts"
  2949. }, {
  2950. "duration": 10,
  2951. "timeline": 0,
  2952. "uri": "/test/ts-files/zencoder/gogo/00002.ts"
  2953. }, {
  2954. "duration": 10,
  2955. "timeline": 0,
  2956. "uri": "/test/ts-files/zencoder/gogo/00003.ts"
  2957. }, {
  2958. "duration": 10,
  2959. "timeline": 0,
  2960. "uri": "/test/ts-files/zencoder/gogo/00004.ts"
  2961. }, {
  2962. "duration": 10,
  2963. "timeline": 0,
  2964. "uri": "/test/ts-files/zencoder/gogo/00005.ts"
  2965. }],
  2966. "targetDuration": 10,
  2967. "endList": true,
  2968. "discontinuitySequence": 0,
  2969. "discontinuityStarts": []
  2970. },
  2971. "manifestNoExtM3u": {
  2972. "allowCache": true,
  2973. "mediaSequence": 0,
  2974. "segments": [{
  2975. "duration": 10,
  2976. "timeline": 0,
  2977. "uri": "/test/ts-files/zencoder/gogo/00001.ts"
  2978. }],
  2979. "targetDuration": 10,
  2980. "endList": true,
  2981. "discontinuitySequence": 0,
  2982. "discontinuityStarts": []
  2983. },
  2984. "master-fmp4": {
  2985. allowCache: true,
  2986. discontinuityStarts: [],
  2987. mediaGroups: {
  2988. AUDIO: {
  2989. aud1: {
  2990. English: {
  2991. autoselect: true,
  2992. "default": true,
  2993. language: "eng",
  2994. uri: "a1/prog_index.m3u8"
  2995. }
  2996. },
  2997. aud2: {
  2998. English: {
  2999. autoselect: true,
  3000. "default": true,
  3001. language: "eng",
  3002. uri: "a2/prog_index.m3u8"
  3003. }
  3004. },
  3005. aud3: {
  3006. English: {
  3007. autoselect: true,
  3008. "default": true,
  3009. language: "eng",
  3010. uri: "a3/prog_index.m3u8"
  3011. }
  3012. }
  3013. },
  3014. VIDEO: {},
  3015. "CLOSED-CAPTIONS": {
  3016. cc1: {
  3017. English: {
  3018. autoselect: true,
  3019. "default": true,
  3020. language: "eng",
  3021. instreamId: "CC1"
  3022. }
  3023. }
  3024. },
  3025. SUBTITLES: {
  3026. sub1: {
  3027. English: {
  3028. autoselect: true,
  3029. "default": true,
  3030. language: "eng",
  3031. uri: 's1/eng/prog_index.m3u8',
  3032. forced: false
  3033. }
  3034. }
  3035. }
  3036. },
  3037. playlists: [{
  3038. attributes: {
  3039. "AVERAGE-BANDWIDTH": "2165224",
  3040. BANDWIDTH: 2215219,
  3041. CODECS: "avc1.640020,mp4a.40.2",
  3042. RESOLUTION: {
  3043. width: 960,
  3044. height: 540
  3045. },
  3046. "FRAME-RATE": "59.940",
  3047. "CLOSED-CAPTIONS": "cc1",
  3048. AUDIO: "aud1",
  3049. SUBTITLES: "sub1"
  3050. },
  3051. timeline: 0,
  3052. uri: "v4/prog_index.m3u8"
  3053. }, {
  3054. "attributes": {
  3055. "AUDIO": "aud1",
  3056. "AVERAGE-BANDWIDTH": "7962844",
  3057. "BANDWIDTH": 7976430,
  3058. "CLOSED-CAPTIONS": "cc1",
  3059. "CODECS": "avc1.64002a,mp4a.40.2",
  3060. "FRAME-RATE": "59.940",
  3061. "RESOLUTION": {
  3062. "height": 1080,
  3063. "width": 1920
  3064. },
  3065. "SUBTITLES": "sub1"
  3066. },
  3067. "timeline": 0,
  3068. "uri": "v8/prog_index.m3u8"
  3069. }, {
  3070. "attributes": {
  3071. "AUDIO": "aud1",
  3072. "AVERAGE-BANDWIDTH": "6165024",
  3073. "BANDWIDTH": 6181885,
  3074. "CLOSED-CAPTIONS": "cc1",
  3075. "CODECS": "avc1.64002a,mp4a.40.2",
  3076. "FRAME-RATE": "59.940",
  3077. "RESOLUTION": {
  3078. "height": 1080,
  3079. "width": 1920
  3080. },
  3081. "SUBTITLES": "sub1"
  3082. },
  3083. "timeline": 0,
  3084. "uri": "v7/prog_index.m3u8"
  3085. }, {
  3086. "attributes": {
  3087. "AUDIO": "aud1",
  3088. "AVERAGE-BANDWIDTH": "4664459",
  3089. "BANDWIDTH": 4682666,
  3090. "CLOSED-CAPTIONS": "cc1",
  3091. "CODECS": "avc1.64002a,mp4a.40.2",
  3092. "FRAME-RATE": "59.940",
  3093. "RESOLUTION": {
  3094. "height": 1080,
  3095. "width": 1920
  3096. },
  3097. "SUBTITLES": "sub1"
  3098. },
  3099. "timeline": 0,
  3100. "uri": "v6/prog_index.m3u8"
  3101. }, {
  3102. "attributes": {
  3103. "AUDIO": "aud1",
  3104. "AVERAGE-BANDWIDTH": "3164759",
  3105. "BANDWIDTH": 3170746,
  3106. "CLOSED-CAPTIONS": "cc1",
  3107. "CODECS": "avc1.640020,mp4a.40.2",
  3108. "FRAME-RATE": "59.940",
  3109. "RESOLUTION": {
  3110. "height": 720,
  3111. "width": 1280
  3112. },
  3113. "SUBTITLES": "sub1"
  3114. },
  3115. "timeline": 0,
  3116. "uri": "v5/prog_index.m3u8"
  3117. }, {
  3118. "attributes": {
  3119. "AUDIO": "aud1",
  3120. "AVERAGE-BANDWIDTH": "1262552",
  3121. "BANDWIDTH": 1276223,
  3122. "CLOSED-CAPTIONS": "cc1",
  3123. "CODECS": "avc1.64001e,mp4a.40.2",
  3124. "FRAME-RATE": "29.970",
  3125. "RESOLUTION": {
  3126. "height": 432,
  3127. "width": 768
  3128. },
  3129. "SUBTITLES": "sub1"
  3130. },
  3131. "timeline": 0,
  3132. "uri": "v3/prog_index.m3u8"
  3133. }, {
  3134. "attributes": {
  3135. "AUDIO": "aud1",
  3136. "AVERAGE-BANDWIDTH": "893243",
  3137. "BANDWIDTH": 904744,
  3138. "CLOSED-CAPTIONS": "cc1",
  3139. "CODECS": "avc1.64001e,mp4a.40.2",
  3140. "FRAME-RATE": "29.970",
  3141. "RESOLUTION": {
  3142. "height": 360,
  3143. "width": 640
  3144. },
  3145. "SUBTITLES": "sub1"
  3146. },
  3147. "timeline": 0,
  3148. "uri": "v2/prog_index.m3u8"
  3149. }, {
  3150. "attributes": {
  3151. "AUDIO": "aud1",
  3152. "AVERAGE-BANDWIDTH": "527673",
  3153. "BANDWIDTH": 538201,
  3154. "CLOSED-CAPTIONS": "cc1",
  3155. "CODECS": "avc1.640015,mp4a.40.2",
  3156. "FRAME-RATE": "29.970",
  3157. "RESOLUTION": {
  3158. "height": 270,
  3159. "width": 480
  3160. },
  3161. "SUBTITLES": "sub1"
  3162. },
  3163. "timeline": 0,
  3164. "uri": "v1/prog_index.m3u8"
  3165. }, {
  3166. "attributes": {
  3167. "AUDIO": "aud2",
  3168. "AVERAGE-BANDWIDTH": "2390334",
  3169. "BANDWIDTH": 2440329,
  3170. "CLOSED-CAPTIONS": "cc1",
  3171. "CODECS": "avc1.640020,ac-3",
  3172. "FRAME-RATE": "59.940",
  3173. "RESOLUTION": {
  3174. "height": 540,
  3175. "width": 960
  3176. },
  3177. "SUBTITLES": "sub1"
  3178. },
  3179. "timeline": 0,
  3180. "uri": "v4/prog_index.m3u8"
  3181. }, {
  3182. "attributes": {
  3183. "AUDIO": "aud2",
  3184. "AVERAGE-BANDWIDTH": "8187954",
  3185. "BANDWIDTH": 8201540,
  3186. "CLOSED-CAPTIONS": "cc1",
  3187. "CODECS": "avc1.64002a,ac-3",
  3188. "FRAME-RATE": "59.940",
  3189. "RESOLUTION": {
  3190. "height": 1080,
  3191. "width": 1920
  3192. },
  3193. "SUBTITLES": "sub1"
  3194. },
  3195. "timeline": 0,
  3196. "uri": "v8/prog_index.m3u8"
  3197. }, {
  3198. "attributes": {
  3199. "AUDIO": "aud2",
  3200. "AVERAGE-BANDWIDTH": "6390134",
  3201. "BANDWIDTH": 6406995,
  3202. "CLOSED-CAPTIONS": "cc1",
  3203. "CODECS": "avc1.64002a,ac-3",
  3204. "FRAME-RATE": "59.940",
  3205. "RESOLUTION": {
  3206. "height": 1080,
  3207. "width": 1920
  3208. },
  3209. "SUBTITLES": "sub1"
  3210. },
  3211. "timeline": 0,
  3212. "uri": "v7/prog_index.m3u8"
  3213. }, {
  3214. "attributes": {
  3215. "AUDIO": "aud2",
  3216. "AVERAGE-BANDWIDTH": "4889569",
  3217. "BANDWIDTH": 4907776,
  3218. "CLOSED-CAPTIONS": "cc1",
  3219. "CODECS": "avc1.64002a,ac-3",
  3220. "FRAME-RATE": "59.940",
  3221. "RESOLUTION": {
  3222. "height": 1080,
  3223. "width": 1920
  3224. },
  3225. "SUBTITLES": "sub1"
  3226. },
  3227. "timeline": 0,
  3228. "uri": "v6/prog_index.m3u8"
  3229. }, {
  3230. "attributes": {
  3231. "AUDIO": "aud2",
  3232. "AVERAGE-BANDWIDTH": "3389869",
  3233. "BANDWIDTH": 3395856,
  3234. "CLOSED-CAPTIONS": "cc1",
  3235. "CODECS": "avc1.640020,ac-3",
  3236. "FRAME-RATE": "59.940",
  3237. "RESOLUTION": {
  3238. "height": 720,
  3239. "width": 1280
  3240. },
  3241. "SUBTITLES": "sub1"
  3242. },
  3243. "timeline": 0,
  3244. "uri": "v5/prog_index.m3u8"
  3245. }, {
  3246. "attributes": {
  3247. "AUDIO": "aud2",
  3248. "AVERAGE-BANDWIDTH": "1487662",
  3249. "BANDWIDTH": 1501333,
  3250. "CLOSED-CAPTIONS": "cc1",
  3251. "CODECS": "avc1.64001e,ac-3",
  3252. "FRAME-RATE": "29.970",
  3253. "RESOLUTION": {
  3254. "height": 432,
  3255. "width": 768
  3256. },
  3257. "SUBTITLES": "sub1"
  3258. },
  3259. "timeline": 0,
  3260. "uri": "v3/prog_index.m3u8"
  3261. }, {
  3262. "attributes": {
  3263. "AUDIO": "aud2",
  3264. "AVERAGE-BANDWIDTH": "1118353",
  3265. "BANDWIDTH": 1129854,
  3266. "CLOSED-CAPTIONS": "cc1",
  3267. "CODECS": "avc1.64001e,ac-3",
  3268. "FRAME-RATE": "29.970",
  3269. "RESOLUTION": {
  3270. "height": 360,
  3271. "width": 640
  3272. },
  3273. "SUBTITLES": "sub1"
  3274. },
  3275. "timeline": 0,
  3276. "uri": "v2/prog_index.m3u8"
  3277. }, {
  3278. "attributes": {
  3279. "AUDIO": "aud2",
  3280. "AVERAGE-BANDWIDTH": "752783",
  3281. "BANDWIDTH": 763311,
  3282. "CLOSED-CAPTIONS": "cc1",
  3283. "CODECS": "avc1.640015,ac-3",
  3284. "FRAME-RATE": "29.970",
  3285. "RESOLUTION": {
  3286. "height": 270,
  3287. "width": 480
  3288. },
  3289. "SUBTITLES": "sub1"
  3290. },
  3291. "timeline": 0,
  3292. "uri": "v1/prog_index.m3u8"
  3293. }, {
  3294. "attributes": {
  3295. "AUDIO": "aud3",
  3296. "AVERAGE-BANDWIDTH": "2198334",
  3297. "BANDWIDTH": 2248329,
  3298. "CLOSED-CAPTIONS": "cc1",
  3299. "CODECS": "avc1.640020,ec-3",
  3300. "FRAME-RATE": "59.940",
  3301. "RESOLUTION": {
  3302. "height": 540,
  3303. "width": 960
  3304. },
  3305. "SUBTITLES": "sub1"
  3306. },
  3307. "timeline": 0,
  3308. "uri": "v4/prog_index.m3u8"
  3309. }, {
  3310. "attributes": {
  3311. "AUDIO": "aud3",
  3312. "AVERAGE-BANDWIDTH": "7995954",
  3313. "BANDWIDTH": 8009540,
  3314. "CLOSED-CAPTIONS": "cc1",
  3315. "CODECS": "avc1.64002a,ec-3",
  3316. "FRAME-RATE": "59.940",
  3317. "RESOLUTION": {
  3318. "height": 1080,
  3319. "width": 1920
  3320. },
  3321. "SUBTITLES": "sub1"
  3322. },
  3323. "timeline": 0,
  3324. "uri": "v8/prog_index.m3u8"
  3325. }, {
  3326. "attributes": {
  3327. "AUDIO": "aud3",
  3328. "AVERAGE-BANDWIDTH": "6198134",
  3329. "BANDWIDTH": 6214995,
  3330. "CLOSED-CAPTIONS": "cc1",
  3331. "CODECS": "avc1.64002a,ec-3",
  3332. "FRAME-RATE": "59.940",
  3333. "RESOLUTION": {
  3334. "height": 1080,
  3335. "width": 1920
  3336. },
  3337. "SUBTITLES": "sub1"
  3338. },
  3339. "timeline": 0,
  3340. "uri": "v7/prog_index.m3u8"
  3341. }, {
  3342. "attributes": {
  3343. "AUDIO": "aud3",
  3344. "AVERAGE-BANDWIDTH": "4697569",
  3345. "BANDWIDTH": 4715776,
  3346. "CLOSED-CAPTIONS": "cc1",
  3347. "CODECS": "avc1.64002a,ec-3",
  3348. "FRAME-RATE": "59.940",
  3349. "RESOLUTION": {
  3350. "height": 1080,
  3351. "width": 1920
  3352. },
  3353. "SUBTITLES": "sub1"
  3354. },
  3355. "timeline": 0,
  3356. "uri": "v6/prog_index.m3u8"
  3357. }, {
  3358. "attributes": {
  3359. "AUDIO": "aud3",
  3360. "AVERAGE-BANDWIDTH": "3197869",
  3361. "BANDWIDTH": 3203856,
  3362. "CLOSED-CAPTIONS": "cc1",
  3363. "CODECS": "avc1.640020,ec-3",
  3364. "FRAME-RATE": "59.940",
  3365. "RESOLUTION": {
  3366. "height": 720,
  3367. "width": 1280
  3368. },
  3369. "SUBTITLES": "sub1"
  3370. },
  3371. "timeline": 0,
  3372. "uri": "v5/prog_index.m3u8"
  3373. }, {
  3374. "attributes": {
  3375. "AUDIO": "aud3",
  3376. "AVERAGE-BANDWIDTH": "1295662",
  3377. "BANDWIDTH": 1309333,
  3378. "CLOSED-CAPTIONS": "cc1",
  3379. "CODECS": "avc1.64001e,ec-3",
  3380. "FRAME-RATE": "29.970",
  3381. "RESOLUTION": {
  3382. "height": 432,
  3383. "width": 768
  3384. },
  3385. "SUBTITLES": "sub1"
  3386. },
  3387. "timeline": 0,
  3388. "uri": "v3/prog_index.m3u8"
  3389. }, {
  3390. "attributes": {
  3391. "AUDIO": "aud3",
  3392. "AVERAGE-BANDWIDTH": "926353",
  3393. "BANDWIDTH": 937854,
  3394. "CLOSED-CAPTIONS": "cc1",
  3395. "CODECS": "avc1.64001e,ec-3",
  3396. "FRAME-RATE": "29.970",
  3397. "RESOLUTION": {
  3398. "height": 360,
  3399. "width": 640
  3400. },
  3401. "SUBTITLES": "sub1"
  3402. },
  3403. "timeline": 0,
  3404. "uri": "v2/prog_index.m3u8"
  3405. }, {
  3406. "attributes": {
  3407. "AUDIO": "aud3",
  3408. "AVERAGE-BANDWIDTH": "560783",
  3409. "BANDWIDTH": 571311,
  3410. "CLOSED-CAPTIONS": "cc1",
  3411. "CODECS": "avc1.640015,ec-3",
  3412. "FRAME-RATE": "29.970",
  3413. "RESOLUTION": {
  3414. "height": 270,
  3415. "width": 480
  3416. },
  3417. "SUBTITLES": "sub1"
  3418. },
  3419. "timeline": 0,
  3420. "uri": "v1/prog_index.m3u8"
  3421. }],
  3422. segments: []
  3423. },
  3424. "master": {
  3425. "allowCache": true,
  3426. "playlists": [{
  3427. "attributes": {
  3428. "PROGRAM-ID": 1,
  3429. "BANDWIDTH": 240000,
  3430. "RESOLUTION": {
  3431. "width": 396,
  3432. "height": 224
  3433. }
  3434. },
  3435. "timeline": 0,
  3436. "uri": "media.m3u8"
  3437. }, {
  3438. "attributes": {
  3439. "PROGRAM-ID": 1,
  3440. "BANDWIDTH": 40000
  3441. },
  3442. "timeline": 0,
  3443. "uri": "media1.m3u8"
  3444. }, {
  3445. "attributes": {
  3446. "PROGRAM-ID": 1,
  3447. "BANDWIDTH": 440000,
  3448. "RESOLUTION": {
  3449. "width": 396,
  3450. "height": 224
  3451. }
  3452. },
  3453. "timeline": 0,
  3454. "uri": "media2.m3u8"
  3455. }, {
  3456. "attributes": {
  3457. "PROGRAM-ID": 1,
  3458. "BANDWIDTH": 1928000,
  3459. "RESOLUTION": {
  3460. "width": 960,
  3461. "height": 540
  3462. }
  3463. },
  3464. "timeline": 0,
  3465. "uri": "media3.m3u8"
  3466. }],
  3467. "discontinuityStarts": [],
  3468. "mediaGroups": {
  3469. "VIDEO": {},
  3470. "AUDIO": {},
  3471. "CLOSED-CAPTIONS": {},
  3472. "SUBTITLES": {}
  3473. },
  3474. segments: []
  3475. },
  3476. "media": {
  3477. "allowCache": true,
  3478. "mediaSequence": 0,
  3479. "playlistType": "VOD",
  3480. "segments": [{
  3481. "duration": 10,
  3482. "timeline": 0,
  3483. "uri": "media-00001.ts"
  3484. }, {
  3485. "duration": 10,
  3486. "timeline": 0,
  3487. "uri": "media-00002.ts"
  3488. }, {
  3489. "duration": 10,
  3490. "timeline": 0,
  3491. "uri": "media-00003.ts"
  3492. }, {
  3493. "duration": 10,
  3494. "timeline": 0,
  3495. "uri": "media-00004.ts"
  3496. }],
  3497. "targetDuration": 10,
  3498. "endList": true,
  3499. "discontinuitySequence": 0,
  3500. "discontinuityStarts": []
  3501. },
  3502. "mediaSequence": {
  3503. "allowCache": true,
  3504. "mediaSequence": 0,
  3505. "playlistType": "VOD",
  3506. "segments": [{
  3507. "duration": 6.64,
  3508. "timeline": 0,
  3509. "uri": "/test/ts-files/tvy7/8a5e2822668b5370f4eb1438b2564fb7ab12ffe1-hi720.ts"
  3510. }, {
  3511. "duration": 6.08,
  3512. "timeline": 0,
  3513. "uri": "/test/ts-files/tvy7/56be1cef869a1c0cc8e38864ad1add17d187f051-hi720.ts"
  3514. }, {
  3515. "duration": 6.6,
  3516. "timeline": 0,
  3517. "uri": "/test/ts-files/tvy7/549c8c77f55f049741a06596e5c1e01dacaa46d0-hi720.ts"
  3518. }, {
  3519. "duration": 5,
  3520. "timeline": 0,
  3521. "uri": "/test/ts-files/tvy7/6cfa378684ffeb1c455a64dae6c103290a1f53d4-hi720.ts"
  3522. }],
  3523. "targetDuration": 8,
  3524. "endList": true,
  3525. "discontinuitySequence": 0,
  3526. "discontinuityStarts": []
  3527. },
  3528. "missingEndlist": {
  3529. "allowCache": true,
  3530. "mediaSequence": 0,
  3531. "segments": [{
  3532. "duration": 10,
  3533. "timeline": 0,
  3534. "uri": "00001.ts"
  3535. }, {
  3536. "duration": 10,
  3537. "timeline": 0,
  3538. "uri": "00002.ts"
  3539. }],
  3540. "targetDuration": 10,
  3541. "discontinuitySequence": 0,
  3542. "discontinuityStarts": []
  3543. },
  3544. "missingExtinf": {
  3545. "allowCache": true,
  3546. "mediaSequence": 0,
  3547. "playlistType": "VOD",
  3548. "segments": [{
  3549. "duration": 10,
  3550. "timeline": 0,
  3551. "uri": "hls_450k_video.ts"
  3552. }, {
  3553. "duration": 10,
  3554. "timeline": 0,
  3555. "uri": "hls_450k_video.ts"
  3556. }, {
  3557. "duration": 10,
  3558. "timeline": 0,
  3559. "uri": "hls_450k_video.ts"
  3560. }],
  3561. "targetDuration": 10,
  3562. "endList": true,
  3563. "discontinuitySequence": 0,
  3564. "discontinuityStarts": []
  3565. },
  3566. "missingMediaSequence": {
  3567. "allowCache": true,
  3568. "mediaSequence": 0,
  3569. "playlistType": "VOD",
  3570. "segments": [{
  3571. "duration": 6.64,
  3572. "timeline": 0,
  3573. "uri": "/test/ts-files/tvy7/8a5e2822668b5370f4eb1438b2564fb7ab12ffe1-hi720.ts"
  3574. }, {
  3575. "duration": 6.08,
  3576. "timeline": 0,
  3577. "uri": "/test/ts-files/tvy7/56be1cef869a1c0cc8e38864ad1add17d187f051-hi720.ts"
  3578. }, {
  3579. "duration": 6.6,
  3580. "timeline": 0,
  3581. "uri": "/test/ts-files/tvy7/549c8c77f55f049741a06596e5c1e01dacaa46d0-hi720.ts"
  3582. }, {
  3583. "duration": 5,
  3584. "timeline": 0,
  3585. "uri": "/test/ts-files/tvy7/6cfa378684ffeb1c455a64dae6c103290a1f53d4-hi720.ts"
  3586. }],
  3587. "targetDuration": 8,
  3588. "endList": true,
  3589. "discontinuitySequence": 0,
  3590. "discontinuityStarts": []
  3591. },
  3592. "missingSegmentDuration": {
  3593. "allowCache": true,
  3594. "mediaSequence": 0,
  3595. "playlistType": "VOD",
  3596. "segments": [{
  3597. "duration": 6.64,
  3598. "timeline": 0,
  3599. "uri": "/test/ts-files/tvy7/8a5e2822668b5370f4eb1438b2564fb7ab12ffe1-hi720.ts"
  3600. }, {
  3601. "duration": 8,
  3602. "timeline": 0,
  3603. "uri": "/test/ts-files/tvy7/56be1cef869a1c0cc8e38864ad1add17d187f051-hi720.ts"
  3604. }, {
  3605. "duration": 8,
  3606. "timeline": 0,
  3607. "uri": "/test/ts-files/tvy7/549c8c77f55f049741a06596e5c1e01dacaa46d0-hi720.ts"
  3608. }, {
  3609. "duration": 8,
  3610. "timeline": 0,
  3611. "uri": "/test/ts-files/tvy7/6cfa378684ffeb1c455a64dae6c103290a1f53d4-hi720.ts"
  3612. }],
  3613. "targetDuration": 8,
  3614. "endList": true,
  3615. "discontinuitySequence": 0,
  3616. "discontinuityStarts": []
  3617. },
  3618. "multipleAudioGroups": {
  3619. allowCache: true,
  3620. discontinuityStarts: [],
  3621. mediaGroups: {
  3622. AUDIO: {
  3623. "audio-lo": {
  3624. "English": {
  3625. autoselect: true,
  3626. "default": true,
  3627. language: "eng",
  3628. uri: "englo/prog_index.m3u8"
  3629. },
  3630. "Français": {
  3631. autoselect: true,
  3632. "default": false,
  3633. language: "fre",
  3634. uri: "frelo/prog_index.m3u8"
  3635. },
  3636. "Espanol": {
  3637. autoselect: true,
  3638. "default": false,
  3639. language: "sp",
  3640. uri: "splo/prog_index.m3u8"
  3641. }
  3642. },
  3643. "audio-hi": {
  3644. "English": {
  3645. autoselect: true,
  3646. "default": true,
  3647. language: "eng",
  3648. uri: "eng/prog_index.m3u8"
  3649. },
  3650. "Français": {
  3651. autoselect: true,
  3652. "default": false,
  3653. language: "fre",
  3654. uri: "fre/prog_index.m3u8"
  3655. },
  3656. "Espanol": {
  3657. autoselect: true,
  3658. "default": false,
  3659. language: "sp",
  3660. uri: "sp/prog_index.m3u8"
  3661. }
  3662. }
  3663. },
  3664. VIDEO: {},
  3665. "CLOSED-CAPTIONS": {},
  3666. SUBTITLES: {}
  3667. },
  3668. playlists: [{
  3669. attributes: {
  3670. "PROGRAM-ID": 1,
  3671. BANDWIDTH: 195023,
  3672. CODECS: "mp4a.40.5",
  3673. AUDIO: "audio-lo"
  3674. },
  3675. timeline: 0,
  3676. uri: "lo/prog_index.m3u8"
  3677. }, {
  3678. attributes: {
  3679. "PROGRAM-ID": 1,
  3680. BANDWIDTH: 260000,
  3681. CODECS: "avc1.42e01e,mp4a.40.2",
  3682. AUDIO: "audio-lo"
  3683. },
  3684. timeline: 0,
  3685. uri: "lo2/prog_index.m3u8"
  3686. }, {
  3687. attributes: {
  3688. "PROGRAM-ID": 1,
  3689. BANDWIDTH: 591680,
  3690. CODECS: "mp4a.40.2, avc1.64001e",
  3691. AUDIO: "audio-hi"
  3692. },
  3693. timeline: 0,
  3694. uri: "hi/prog_index.m3u8"
  3695. }, {
  3696. attributes: {
  3697. "PROGRAM-ID": 1,
  3698. BANDWIDTH: 650000,
  3699. CODECS: "avc1.42e01e,mp4a.40.2",
  3700. AUDIO: "audio-hi"
  3701. },
  3702. timeline: 0,
  3703. uri: "hi2/prog_index.m3u8"
  3704. }],
  3705. segments: []
  3706. },
  3707. "multipleAudioGroupsCombinedMain": {
  3708. allowCache: true,
  3709. discontinuityStarts: [],
  3710. mediaGroups: {
  3711. AUDIO: {
  3712. "audio-lo": {
  3713. "English": {
  3714. autoselect: true,
  3715. "default": true,
  3716. language: "eng"
  3717. },
  3718. "Français": {
  3719. autoselect: true,
  3720. "default": false,
  3721. language: "fre",
  3722. uri: "frelo/prog_index.m3u8"
  3723. },
  3724. "Espanol": {
  3725. autoselect: true,
  3726. "default": false,
  3727. language: "sp",
  3728. uri: "splo/prog_index.m3u8"
  3729. }
  3730. },
  3731. "audio-hi": {
  3732. "English": {
  3733. autoselect: true,
  3734. "default": true,
  3735. language: "eng",
  3736. uri: "eng/prog_index.m3u8"
  3737. },
  3738. "Français": {
  3739. autoselect: true,
  3740. "default": false,
  3741. language: "fre",
  3742. uri: "fre/prog_index.m3u8"
  3743. },
  3744. "Espanol": {
  3745. autoselect: true,
  3746. "default": false,
  3747. language: "sp",
  3748. uri: "sp/prog_index.m3u8"
  3749. }
  3750. }
  3751. },
  3752. VIDEO: {},
  3753. "CLOSED-CAPTIONS": {},
  3754. SUBTITLES: {}
  3755. },
  3756. playlists: [{
  3757. attributes: {
  3758. "PROGRAM-ID": 1,
  3759. BANDWIDTH: 195023,
  3760. CODECS: "mp4a.40.5",
  3761. AUDIO: "audio-lo"
  3762. },
  3763. timeline: 0,
  3764. uri: "lo/prog_index.m3u8"
  3765. }, {
  3766. attributes: {
  3767. "PROGRAM-ID": 1,
  3768. BANDWIDTH: 260000,
  3769. CODECS: "avc1.42e01e,mp4a.40.2",
  3770. AUDIO: "audio-lo"
  3771. },
  3772. timeline: 0,
  3773. uri: "lo2/prog_index.m3u8"
  3774. }, {
  3775. attributes: {
  3776. "PROGRAM-ID": 1,
  3777. BANDWIDTH: 591680,
  3778. CODECS: "mp4a.40.2, avc1.64001e",
  3779. AUDIO: "audio-hi"
  3780. },
  3781. timeline: 0,
  3782. uri: "hi/prog_index.m3u8"
  3783. }, {
  3784. attributes: {
  3785. "PROGRAM-ID": 1,
  3786. BANDWIDTH: 650000,
  3787. CODECS: "avc1.42e01e,mp4a.40.2",
  3788. AUDIO: "audio-hi"
  3789. },
  3790. timeline: 0,
  3791. uri: "hi2/prog_index.m3u8"
  3792. }],
  3793. segments: []
  3794. },
  3795. "multipleTargetDurations": {
  3796. "allowCache": true,
  3797. "mediaSequence": 0,
  3798. "targetDuration": 10,
  3799. "segments": [{
  3800. "uri": "001.ts",
  3801. "timeline": 0
  3802. }, {
  3803. "uri": "002.ts",
  3804. "duration": 9,
  3805. "timeline": 0
  3806. }, {
  3807. "uri": "003.ts",
  3808. "duration": 7,
  3809. "timeline": 0
  3810. }, {
  3811. "uri": "004.ts",
  3812. "duration": 10,
  3813. "timeline": 0
  3814. }],
  3815. "discontinuitySequence": 0,
  3816. "discontinuityStarts": []
  3817. },
  3818. "multipleVideo": {
  3819. allowCache: true,
  3820. discontinuityStarts: [],
  3821. mediaGroups: {
  3822. AUDIO: {
  3823. aac: {
  3824. English: {
  3825. autoselect: true,
  3826. "default": true,
  3827. language: "eng",
  3828. uri: "eng/prog_index.m3u8"
  3829. }
  3830. }
  3831. },
  3832. VIDEO: {
  3833. "200kbs": {
  3834. Angle1: {
  3835. autoselect: true,
  3836. "default": true
  3837. },
  3838. Angle2: {
  3839. autoselect: true,
  3840. "default": false,
  3841. uri: "Angle2/200kbs/prog_index.m3u8"
  3842. },
  3843. Angle3: {
  3844. autoselect: true,
  3845. "default": false,
  3846. uri: "Angle3/200kbs/prog_index.m3u8"
  3847. }
  3848. },
  3849. "500kbs": {
  3850. Angle1: {
  3851. autoselect: true,
  3852. "default": true
  3853. },
  3854. Angle2: {
  3855. autoselect: true,
  3856. "default": false,
  3857. uri: "Angle2/500kbs/prog_index.m3u8"
  3858. },
  3859. Angle3: {
  3860. autoselect: true,
  3861. "default": false,
  3862. uri: "Angle3/500kbs/prog_index.m3u8"
  3863. }
  3864. }
  3865. },
  3866. "CLOSED-CAPTIONS": {},
  3867. SUBTITLES: {}
  3868. },
  3869. playlists: [{
  3870. attributes: {
  3871. "PROGRAM-ID": 1,
  3872. BANDWIDTH: 300000,
  3873. CODECS: "mp4a.40.2,avc1.4d401e",
  3874. AUDIO: "aac",
  3875. VIDEO: "200kbs"
  3876. },
  3877. timeline: 0,
  3878. uri: "Angle1/200kbs/prog_index.m3u"
  3879. }, {
  3880. attributes: {
  3881. "PROGRAM-ID": 1,
  3882. BANDWIDTH: 754857,
  3883. CODECS: "mp4a.40.2,avc1.4d401e",
  3884. AUDIO: "aac",
  3885. VIDEO: "500kbs"
  3886. },
  3887. timeline: 0,
  3888. uri: "Angle1/500kbs/prog_index.m3u8"
  3889. }],
  3890. segments: []
  3891. },
  3892. "negativeMediaSequence": {
  3893. "allowCache": true,
  3894. "mediaSequence": -11,
  3895. "playlistType": "VOD",
  3896. "segments": [{
  3897. "duration": 6.64,
  3898. "timeline": 0,
  3899. "uri": "/test/ts-files/tvy7/8a5e2822668b5370f4eb1438b2564fb7ab12ffe1-hi720.ts"
  3900. }, {
  3901. "duration": 6.08,
  3902. "timeline": 0,
  3903. "uri": "/test/ts-files/tvy7/56be1cef869a1c0cc8e38864ad1add17d187f051-hi720.ts"
  3904. }, {
  3905. "duration": 6.6,
  3906. "timeline": 0,
  3907. "uri": "/test/ts-files/tvy7/549c8c77f55f049741a06596e5c1e01dacaa46d0-hi720.ts"
  3908. }, {
  3909. "duration": 5,
  3910. "timeline": 0,
  3911. "uri": "/test/ts-files/tvy7/6cfa378684ffeb1c455a64dae6c103290a1f53d4-hi720.ts"
  3912. }],
  3913. "targetDuration": 8,
  3914. "endList": true,
  3915. "discontinuitySequence": 0,
  3916. "discontinuityStarts": []
  3917. },
  3918. "playlist": {
  3919. "allowCache": true,
  3920. "mediaSequence": 0,
  3921. "playlistType": "VOD",
  3922. "segments": [{
  3923. "byterange": {
  3924. "length": 522828,
  3925. "offset": 0
  3926. },
  3927. "duration": 10,
  3928. "timeline": 0,
  3929. "uri": "hls_450k_video.ts"
  3930. }, {
  3931. "byterange": {
  3932. "length": 587500,
  3933. "offset": 522828
  3934. },
  3935. "duration": 10,
  3936. "timeline": 0,
  3937. "uri": "hls_450k_video.ts"
  3938. }, {
  3939. "byterange": {
  3940. "length": 713084,
  3941. "offset": 1110328
  3942. },
  3943. "duration": 10,
  3944. "timeline": 0,
  3945. "uri": "hls_450k_video.ts"
  3946. }, {
  3947. "byterange": {
  3948. "length": 476580,
  3949. "offset": 1823412
  3950. },
  3951. "duration": 10,
  3952. "timeline": 0,
  3953. "uri": "hls_450k_video.ts"
  3954. }, {
  3955. "byterange": {
  3956. "length": 535612,
  3957. "offset": 2299992
  3958. },
  3959. "duration": 10,
  3960. "timeline": 0,
  3961. "uri": "hls_450k_video.ts"
  3962. }, {
  3963. "byterange": {
  3964. "length": 207176,
  3965. "offset": 2835604
  3966. },
  3967. "duration": 10,
  3968. "timeline": 0,
  3969. "uri": "hls_450k_video.ts"
  3970. }, {
  3971. "byterange": {
  3972. "length": 455900,
  3973. "offset": 3042780
  3974. },
  3975. "duration": 10,
  3976. "timeline": 0,
  3977. "uri": "hls_450k_video.ts"
  3978. }, {
  3979. "byterange": {
  3980. "length": 657248,
  3981. "offset": 3498680
  3982. },
  3983. "duration": 10,
  3984. "timeline": 0,
  3985. "uri": "hls_450k_video.ts"
  3986. }, {
  3987. "byterange": {
  3988. "length": 571708,
  3989. "offset": 4155928
  3990. },
  3991. "duration": 10,
  3992. "timeline": 0,
  3993. "uri": "hls_450k_video.ts"
  3994. }, {
  3995. "byterange": {
  3996. "length": 485040,
  3997. "offset": 4727636
  3998. },
  3999. "duration": 10,
  4000. "timeline": 0,
  4001. "uri": "hls_450k_video.ts"
  4002. }, {
  4003. "byterange": {
  4004. "length": 709136,
  4005. "offset": 5212676
  4006. },
  4007. "duration": 10,
  4008. "timeline": 0,
  4009. "uri": "hls_450k_video.ts"
  4010. }, {
  4011. "byterange": {
  4012. "length": 730004,
  4013. "offset": 5921812
  4014. },
  4015. "duration": 10,
  4016. "timeline": 0,
  4017. "uri": "hls_450k_video.ts"
  4018. }, {
  4019. "byterange": {
  4020. "length": 456276,
  4021. "offset": 6651816
  4022. },
  4023. "duration": 10,
  4024. "timeline": 0,
  4025. "uri": "hls_450k_video.ts"
  4026. }, {
  4027. "byterange": {
  4028. "length": 468684,
  4029. "offset": 7108092
  4030. },
  4031. "duration": 10,
  4032. "timeline": 0,
  4033. "uri": "hls_450k_video.ts"
  4034. }, {
  4035. "byterange": {
  4036. "length": 444996,
  4037. "offset": 7576776
  4038. },
  4039. "duration": 10,
  4040. "timeline": 0,
  4041. "uri": "hls_450k_video.ts"
  4042. }, {
  4043. "byterange": {
  4044. "length": 331444,
  4045. "offset": 8021772
  4046. },
  4047. "duration": 10,
  4048. "timeline": 0,
  4049. "uri": "hls_450k_video.ts"
  4050. }, {
  4051. "byterange": {
  4052. "length": 44556,
  4053. "offset": 8353216
  4054. },
  4055. "duration": 1.4167,
  4056. "timeline": 0,
  4057. "uri": "hls_450k_video.ts"
  4058. }],
  4059. "targetDuration": 10,
  4060. "endList": true,
  4061. "discontinuitySequence": 0,
  4062. "discontinuityStarts": []
  4063. },
  4064. "playlistMediaSequenceHigher": {
  4065. "allowCache": true,
  4066. "mediaSequence": 17,
  4067. "playlistType": "VOD",
  4068. "segments": [{
  4069. "duration": 6.64,
  4070. "timeline": 0,
  4071. "uri": "/test/ts-files/tvy7/8a5e2822668b5370f4eb1438b2564fb7ab12ffe1-hi720.ts"
  4072. }],
  4073. "targetDuration": 8,
  4074. "endList": true,
  4075. "discontinuitySequence": 0,
  4076. "discontinuityStarts": []
  4077. },
  4078. "streamInfInvalid": {
  4079. "allowCache": true,
  4080. "playlists": [{
  4081. "attributes": {
  4082. "PROGRAM-ID": 1
  4083. },
  4084. "timeline": 0,
  4085. "uri": "media.m3u8"
  4086. }, {
  4087. "timeline": 0,
  4088. "uri": "media1.m3u8"
  4089. }],
  4090. "discontinuityStarts": [],
  4091. "mediaGroups": {
  4092. "VIDEO": {},
  4093. "AUDIO": {},
  4094. "CLOSED-CAPTIONS": {},
  4095. "SUBTITLES": {}
  4096. },
  4097. "segments": []
  4098. },
  4099. "twoMediaSequences": {
  4100. "allowCache": true,
  4101. "mediaSequence": 11,
  4102. "playlistType": "VOD",
  4103. "segments": [{
  4104. "duration": 6.64,
  4105. "timeline": 0,
  4106. "uri": "/test/ts-files/tvy7/8a5e2822668b5370f4eb1438b2564fb7ab12ffe1-hi720.ts"
  4107. }, {
  4108. "duration": 6.08,
  4109. "timeline": 0,
  4110. "uri": "/test/ts-files/tvy7/56be1cef869a1c0cc8e38864ad1add17d187f051-hi720.ts"
  4111. }, {
  4112. "duration": 6.6,
  4113. "timeline": 0,
  4114. "uri": "/test/ts-files/tvy7/549c8c77f55f049741a06596e5c1e01dacaa46d0-hi720.ts"
  4115. }, {
  4116. "duration": 5,
  4117. "timeline": 0,
  4118. "uri": "/test/ts-files/tvy7/6cfa378684ffeb1c455a64dae6c103290a1f53d4-hi720.ts"
  4119. }],
  4120. "targetDuration": 8,
  4121. "endList": true,
  4122. "discontinuitySequence": 0,
  4123. "discontinuityStarts": []
  4124. },
  4125. "versionInvalid": {
  4126. "allowCache": true,
  4127. "mediaSequence": 0,
  4128. "playlistType": "VOD",
  4129. "segments": [{
  4130. "duration": 10,
  4131. "timeline": 0,
  4132. "uri": "hls_450k_video.ts"
  4133. }],
  4134. "targetDuration": 10,
  4135. "endList": true,
  4136. "discontinuitySequence": 0,
  4137. "discontinuityStarts": []
  4138. },
  4139. "whiteSpace": {
  4140. "allowCache": true,
  4141. "mediaSequence": 0,
  4142. "playlistType": "VOD",
  4143. "segments": [{
  4144. "duration": 10,
  4145. "timeline": 0,
  4146. "uri": "http://example.com/00001.ts"
  4147. }, {
  4148. "duration": 10,
  4149. "timeline": 0,
  4150. "uri": "https://example.com/00002.ts"
  4151. }, {
  4152. "duration": 10,
  4153. "timeline": 0,
  4154. "uri": "//example.com/00003.ts"
  4155. }, {
  4156. "duration": 10,
  4157. "timeline": 0,
  4158. "uri": "http://example.com/00004.ts"
  4159. }],
  4160. "targetDuration": 10,
  4161. "endList": true,
  4162. "discontinuitySequence": 0,
  4163. "discontinuityStarts": []
  4164. },
  4165. "zeroDuration": {
  4166. "allowCache": true,
  4167. "mediaSequence": 0,
  4168. "playlistType": "VOD",
  4169. "segments": [{
  4170. "duration": 0.01,
  4171. "timeline": 0,
  4172. "uri": "http://example.com/00001.ts"
  4173. }],
  4174. "targetDuration": 10,
  4175. "endList": true,
  4176. "discontinuitySequence": 0,
  4177. "discontinuityStarts": []
  4178. }
  4179. };
  4180. },{}],8:[function(require,module,exports){
  4181. 'use strict';
  4182. Object.defineProperty(exports, "__esModule", {
  4183. value: true
  4184. });
  4185. exports['default'] = {
  4186. 'absoluteUris': '#EXTM3U\n' + '#EXT-X-PLAYLIST-TYPE:VOD\n' + '#EXT-X-TARGETDURATION:10\n' + '#EXTINF:10,\n' + 'http://example.com/00001.ts\n' + '#EXTINF:10,\n' + 'https://example.com/00002.ts\n' + '#EXTINF:10,\n' + '//example.com/00003.ts\n' + '#EXTINF:10,\n' + 'http://example.com/00004.ts\n' + '#ZEN-TOTAL-DURATION:57.9911\n' + '#EXT-X-ENDLIST\n' + '\n',
  4187. 'allowCache': '#EXTM3U\n' + '#EXT-X-TARGETDURATION:10\n' + '#EXT-X-VERSION:4\n' + '#EXT-X-ALLOW-CACHE:YES\n' + '#EXT-X-MEDIA-SEQUENCE:0\n' + '#EXT-X-PLAYLIST-TYPE:VOD\n' + '#EXTINF:10,\n' + '#EXT-X-BYTERANGE:522828@0\n' + 'hls_450k_video.ts\n' + '#EXTINF:10,\n' + '#EXT-X-BYTERANGE:587500@522828\n' + 'hls_450k_video.ts\n' + '#EXTINF:10,\n' + '#EXT-X-BYTERANGE:713084@1110328\n' + 'hls_450k_video.ts\n' + '#EXTINF:10,\n' + '#EXT-X-BYTERANGE:476580@1823412\n' + 'hls_450k_video.ts\n' + '#EXTINF:10,\n' + '#EXT-X-BYTERANGE:535612@2299992\n' + 'hls_450k_video.ts\n' + '#EXTINF:10,\n' + '#EXT-X-BYTERANGE:207176@2835604\n' + 'hls_450k_video.ts\n' + '#EXTINF:10,\n' + '#EXT-X-BYTERANGE:455900@3042780\n' + 'hls_450k_video.ts\n' + '#EXTINF:10,\n' + '#EXT-X-BYTERANGE:657248@3498680\n' + 'hls_450k_video.ts\n' + '#EXTINF:10,\n' + '#EXT-X-BYTERANGE:571708@4155928\n' + 'hls_450k_video.ts\n' + '#EXTINF:10,\n' + '#EXT-X-BYTERANGE:485040@4727636\n' + 'hls_450k_video.ts\n' + '#EXTINF:10,\n' + '#EXT-X-BYTERANGE:709136@5212676\n' + 'hls_450k_video.ts\n' + '#EXTINF:10,\n' + '#EXT-X-BYTERANGE:730004@5921812\n' + 'hls_450k_video.ts\n' + '#EXTINF:10,\n' + '#EXT-X-BYTERANGE:456276@6651816\n' + 'hls_450k_video.ts\n' + '#EXTINF:10,\n' + '#EXT-X-BYTERANGE:468684@7108092\n' + 'hls_450k_video.ts\n' + '#EXTINF:10,\n' + '#EXT-X-BYTERANGE:444996@7576776\n' + 'hls_450k_video.ts\n' + '#EXTINF:10,\n' + '#EXT-X-BYTERANGE:331444@8021772\n' + 'hls_450k_video.ts\n' + '#EXTINF:1.4167,\n' + '#EXT-X-BYTERANGE:44556@8353216\n' + 'hls_450k_video.ts\n' + '#EXT-X-ENDLIST\n',
  4188. 'allowCacheInvalid': '#EXTM3U\n' + '#EXT-X-TARGETDURATION:10\n' + '#EXT-X-VERSION:4\n' + '#EXT-X-ALLOW-CACHE:0\n' + '#EXT-X-MEDIA-SEQUENCE:0\n' + '#EXT-X-PLAYLIST-TYPE:VOD\n' + '#EXTINF:10,\n' + '#EXT-X-BYTERANGE:522828@0\n' + 'hls_450k_video.ts\n' + '#EXT-X-ENDLIST\n' + '\n',
  4189. 'alternateAudio': '#EXTM3U\n' + '#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="audio",LANGUAGE="eng",NAME="English",AUTOSELECT=YES, DEFAULT=YES,URI="eng/prog_index.m3u8"\n' + '#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="audio",LANGUAGE="fre",NAME="Français",AUTOSELECT=YES, DEFAULT=NO,URI="fre/prog_index.m3u8"\n' + '#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="audio",LANGUAGE="sp",NAME="Espanol",AUTOSELECT=YES, DEFAULT=NO,URI="sp/prog_index.m3u8"\n' + '\n' + '#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=195023,CODECS="avc1.42e00a,mp4a.40.2",AUDIO="audio"\n' + 'lo/prog_index.m3u8\n' + '#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=591680,CODECS="avc1.42e01e,mp4a.40.2",AUDIO="audio"\n' + 'hi/prog_index.m3u8\n',
  4190. 'alternateVideo': '#EXTM3U\n' + '#EXT-X-MEDIA:TYPE=VIDEO,GROUP-ID="500kbs",NAME="Angle1",AUTOSELECT=YES,DEFAULT=YES\n' + '#EXT-X-MEDIA:TYPE=VIDEO,GROUP-ID="500kbs",NAME="Angle2",AUTOSELECT=YES,DEFAULT=NO,URI="Angle2/500kbs/prog_index.m3u8"\n' + '#EXT-X-MEDIA:TYPE=VIDEO,GROUP-ID="500kbs",NAME="Angle3",AUTOSELECT=YES,DEFAULT=NO,URI="Angle3/500kbs/prog_index.m3u8"\n' + '\n' + '#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="aac",LANGUAGE="eng",NAME="English",AUTOSELECT=YES,DEFAULT=YES,URI="eng/prog_index.m3u8"\n' + '#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=754857,CODECS="mp4a.40.2,avc1.4d401e",VIDEO="500kbs",AUDIO="aac"\n' + 'Angle1/500kbs/prog_index.m3u8\n',
  4191. 'brightcove': '#EXTM3U\n' + '#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=240000,RESOLUTION=396x224\n' + 'http://c.brightcove.com/services/mobile/streaming/index/rendition.m3u8?assetId=1824686811001&videoId=1824650741001\n' + '#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=40000\n' + 'http://c.brightcove.com/services/mobile/streaming/index/rendition.m3u8?assetId=1824683759001&videoId=1824650741001\n' + '#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=440000,RESOLUTION=396x224\n' + 'http://c.brightcove.com/services/mobile/streaming/index/rendition.m3u8?assetId=1824686593001&videoId=1824650741001\n' + '#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1928000,RESOLUTION=960x540\n' + 'http://c.brightcove.com/services/mobile/streaming/index/rendition.m3u8?assetId=1824687660001&videoId=1824650741001\n' + '\n',
  4192. 'byteRange': '#EXTM3U\n' + '#EXT-X-TARGETDURATION:10\n' + '#EXT-X-VERSION:3\n' + '#EXT-X-MEDIA-SEQUENCE:0\n' + '#EXT-X-PLAYLIST-TYPE:VOD\n' + '#EXTINF:10,\n' + 'hls_450k_video.ts\n' + '#EXTINF:10,\n' + '#EXT-X-BYTERANGE:587500@522828\n' + 'hls_450k_video.ts\n' + '#EXTINF:10,\n' + '#EXT-X-BYTERANGE:713084\n' + 'hls_450k_video2.ts\n' + '#EXTINF:10,\n' + '#EXT-X-BYTERANGE:476580@1823412\n' + 'hls_450k_video.ts\n' + '#EXTINF:10,\n' + '#EXT-X-BYTERANGE:535612@2299992\n' + 'hls_450k_video.ts\n' + '#EXTINF:10,\n' + '#EXT-X-BYTERANGE:207176@2835604\n' + 'hls_450k_video.ts\n' + '#EXTINF:10,\n' + '#EXT-X-BYTERANGE:455900@3042780\n' + 'hls_450k_video.ts\n' + '#EXTINF:10,\n' + '#EXT-X-BYTERANGE:657248@3498680\n' + 'hls_450k_video.ts\n' + '#EXTINF:10,\n' + '#EXT-X-BYTERANGE:571708@4155928\n' + 'hls_450k_video.ts\n' + '#EXTINF:10,\n' + '#EXT-X-BYTERANGE:485040@4727636\n' + 'hls_450k_video.ts\n' + '#EXTINF:10,\n' + '#EXT-X-BYTERANGE:709136@5212676\n' + 'hls_450k_video.ts\n' + '#EXTINF:10,\n' + '#EXT-X-BYTERANGE:730004@5921812\n' + 'hls_450k_video.ts\n' + '#EXTINF:10,\n' + '#EXT-X-BYTERANGE:456276@6651816\n' + 'hls_450k_video.ts\n' + '#EXTINF:10,\n' + '#EXT-X-BYTERANGE:468684@7108092\n' + 'hls_450k_video.ts\n' + '#EXTINF:10,\n' + '#EXT-X-BYTERANGE:444996@7576776\n' + 'hls_450k_video.ts\n' + '#EXTINF:10,\n' + '#EXT-X-BYTERANGE:331444@8021772\n' + 'hls_450k_video.ts\n' + '#EXTINF:1.4167,\n' + '#EXT-X-BYTERANGE:44556@8353216\n' + 'hls_450k_video.ts\n' + '#EXT-X-ENDLIST\n',
  4193. 'dateTime': '#EXTM3U\n' + '#EXT-X-PLAYLIST-TYPE:VOD\n' + '#EXT-X-MEDIA-SEQUENCE:0\n' + '#EXT-X-PROGRAM-DATE-TIME:2016-06-22T09:20:16.166-04:00\n' + '#EXT-X-ALLOW-CACHE:NO\n' + '#EXT-X-TARGETDURATION:10\n' + '#EXTINF:10\n' + 'hls_450k_video.ts\n' + '#EXT-X-ENDLIST\n' + '\n',
  4194. 'disallowCache': '#EXTM3U\n' + '#EXT-X-TARGETDURATION:10\n' + '#EXT-X-VERSION:4\n' + '#EXT-X-ALLOW-CACHE:NO\n' + '#EXT-X-MEDIA-SEQUENCE:0\n' + '#EXT-X-PLAYLIST-TYPE:VOD\n' + '#EXTINF:10,\n' + '#EXT-X-BYTERANGE:522828@0\n' + 'hls_450k_video.ts\n' + '#EXT-X-ENDLIST\n',
  4195. 'disc-sequence': '#EXTM3U\n' + '#EXT-X-VERSION:3\n' + '#EXT-X-TARGETDURATION:19\n' + '#EXT-X-MEDIA-SEQUENCE:0\n' + '#EXT-X-DISCONTINUITY-SEQUENCE:3\n' + '#EXTINF:10,0\n' + '001.ts\n' + '#EXTINF:19,0\n' + '002.ts\n' + '#EXT-X-DISCONTINUITY\n' + '#EXTINF:10,0\n' + '003.ts\n' + '#EXTINF:11,0\n' + '004.ts\n' + '#EXT-X-ENDLIST\n' + '\n',
  4196. 'discontinuity': '#EXTM3U\n' + '#EXT-X-VERSION:3\n' + '#EXT-X-TARGETDURATION:19\n' + '#EXT-X-MEDIA-SEQUENCE:0\n' + '#EXTINF:10,0\n' + '001.ts\n' + '#EXTINF:19,0\n' + '002.ts\n' + '#EXT-X-DISCONTINUITY\n' + '#EXTINF:10,0\n' + '003.ts\n' + '#EXTINF:11,0\n' + '004.ts\n' + '#EXT-X-DISCONTINUITY\n' + '#EXTINF:10,0\n' + '005.ts\n' + '#EXTINF:10,0\n' + '006.ts\n' + '#EXTINF:10,0\n' + '007.ts\n' + '#EXT-X-DISCONTINUITY\n' + '#EXTINF:10,0\n' + '008.ts\n' + '#EXTINF:16,0\n' + '009.ts\n' + '#EXT-X-ENDLIST\n' + '\n',
  4197. 'domainUris': '#EXTM3U\n' + '#EXT-X-PLAYLIST-TYPE:VOD\n' + '#EXT-X-TARGETDURATION:10\n' + '#EXTINF:10,\n' + '/00001.ts\n' + '#EXTINF:10,\n' + '/subdir/00002.ts\n' + '#EXTINF:10,\n' + '/00003.ts\n' + '#EXTINF:10,\n' + '/00004.ts\n' + '#ZEN-TOTAL-DURATION:57.9911\n' + '#EXT-X-ENDLIST\n' + '\n',
  4198. 'empty': '\n',
  4199. 'emptyAllowCache': '#EXTM3U\n' + '#EXT-X-TARGETDURATION:10\n' + '#EXT-X-VERSION:4\n' + '#EXT-X-ALLOW-CACHE:\n' + '#EXT-X-MEDIA-SEQUENCE:0\n' + '#EXT-X-PLAYLIST-TYPE:VOD\n' + '#EXTINF:10,\n' + '#EXT-X-BYTERANGE:522828@0\n' + 'hls_450k_video.ts\n' + '#EXT-X-ENDLIST\n',
  4200. 'emptyMediaSequence': '#EXTM3U\n' + '#EXT-X-PLAYLIST-TYPE:VOD\n' + '#EXT-X-MEDIA-SEQUENCE:\n' + '#EXT-X-ALLOW-CACHE:YES\n' + '#EXT-X-TARGETDURATION:8\n' + '#EXTINF:6.640,{}\n' + '/test/ts-files/tvy7/8a5e2822668b5370f4eb1438b2564fb7ab12ffe1-hi720.ts\n' + '#EXTINF:6.080,{}\n' + '/test/ts-files/tvy7/56be1cef869a1c0cc8e38864ad1add17d187f051-hi720.ts\n' + '#EXTINF:6.600,{}\n' + '/test/ts-files/tvy7/549c8c77f55f049741a06596e5c1e01dacaa46d0-hi720.ts\n' + '#EXTINF:5.000,{}\n' + '/test/ts-files/tvy7/6cfa378684ffeb1c455a64dae6c103290a1f53d4-hi720.ts\n' + '#EXT-X-ENDLIST\n' + '\n',
  4201. 'emptyPlaylistType': '#EXTM3U\n' + '#EXT-X-PLAYLIST-TYPE:\n' + '#EXT-X-TARGETDURATION:10\n' + '#EXTINF:10,\n' + '/test/ts-files/zencoder/haze/Haze_Mantel_President_encoded_1200-00001.ts\n' + '#EXTINF:10,\n' + '/test/ts-files/zencoder/haze/Haze_Mantel_President_encoded_1200-00002.ts\n' + '#EXTINF:10,\n' + '/test/ts-files/zencoder/haze/Haze_Mantel_President_encoded_1200-00003.ts\n' + '#EXTINF:10,\n' + '/test/ts-files/zencoder/haze/Haze_Mantel_President_encoded_1200-00004.ts\n' + '#EXTINF:10,\n' + '/test/ts-files/zencoder/haze/Haze_Mantel_President_encoded_1200-00005.ts\n' + '#EXTINF:8,\n' + '/test/ts-files/zencoder/haze/Haze_Mantel_President_encoded_1200-00006.ts\n' + '#ZEN-TOTAL-DURATION:57.9911\n' + '#EXT-X-ENDLIST\n' + '\n',
  4202. 'emptyTargetDuration': '#EXTM3U\n' + '#EXT-X-TARGETDURATION:\n' + '#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=240000,RESOLUTION=396x224\n' + 'http://c.brightcove.com/services/mobile/streaming/index/rendition.m3u8?assetId=1824686811001&videoId=1824650741001\n' + '#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=40000\n' + 'http://c.brightcove.com/services/mobile/streaming/index/rendition.m3u8?assetId=1824683759001&videoId=1824650741001\n' + '#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=440000,RESOLUTION=396x224\n' + 'http://c.brightcove.com/services/mobile/streaming/index/rendition.m3u8?assetId=1824686593001&videoId=1824650741001\n' + '#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1928000,RESOLUTION=960x540\n' + 'http://c.brightcove.com/services/mobile/streaming/index/rendition.m3u8?assetId=1824687660001&videoId=1824650741001\n' + '\n',
  4203. 'encrypted': '#EXTM3U\n' + '#EXT-X-VERSION:3\n' + '#EXT-X-MEDIA-SEQUENCE:7794\n' + '#EXT-X-TARGETDURATION:15\n' + '\n' + '#EXT-X-KEY:METHOD=AES-128,URI="https://priv.example.com/key.php?r=52"\n' + '\n' + '#EXTINF:2.833,\n' + 'http://media.example.com/fileSequence52-A.ts\n' + '#EXTINF:15.0,\n' + 'http://media.example.com/fileSequence52-B.ts\n' + '#EXTINF:13.333,\n' + 'http://media.example.com/fileSequence52-C.ts\n' + '\n' + '#EXT-X-KEY:METHOD=AES-128,URI="https://priv.example.com/key.php?r=53"\n' + '\n' + '#EXTINF:15.0,\n' + 'http://media.example.com/fileSequence53-A.ts\n' + '\n' + '#EXT-X-KEY:METHOD=AES-128,URI="https://priv.example.com/key.php?r=54",IV=0x00000000000000000000014BB69D61E4\n' + '\n' + '#EXTINF:14.0,\n' + 'http://media.example.com/fileSequence53-B.ts\n' + '\n' + '#EXT-X-KEY:METHOD=NONE\n' + '\n' + '#EXTINF:15.0,\n' + 'http://media.example.com/fileSequence53-B.ts\n',
  4204. 'event': '#EXTM3U\n' + '#EXT-X-PLAYLIST-TYPE:EVENT\n' + '#EXT-X-TARGETDURATION:10\n' + '#EXTINF:10,\n' + '/test/ts-files/zencoder/haze/Haze_Mantel_President_encoded_1200-00001.ts\n' + '#EXTINF:10,\n' + '/test/ts-files/zencoder/haze/Haze_Mantel_President_encoded_1200-00002.ts\n' + '#EXTINF:10,\n' + '/test/ts-files/zencoder/haze/Haze_Mantel_President_encoded_1200-00003.ts\n' + '#EXTINF:10,\n' + '/test/ts-files/zencoder/haze/Haze_Mantel_President_encoded_1200-00004.ts\n' + '#EXTINF:10,\n' + '/test/ts-files/zencoder/haze/Haze_Mantel_President_encoded_1200-00005.ts\n' + '#EXTINF:8,\n' + '/test/ts-files/zencoder/haze/Haze_Mantel_President_encoded_1200-00006.ts\n' + '#ZEN-TOTAL-DURATION:57.9911\n' + '#EXT-X-ENDLIST\n' + '\n',
  4205. 'extXPlaylistTypeInvalidPlaylist': '#EXTM3U\n' + '#EXT-X-PLAYLIST-TYPE:STRING\n' + '#EXT-X-MEDIA-SEQUENCE:1\n' + '#EXT-X-ALLOW-CACHE:YES\n' + '#EXT-X-TARGETDURATION:8\n' + '#EXTINF:6.640,{}\n' + '/test/ts-files/tvy7/8a5e2822668b5370f4eb1438b2564fb7ab12ffe1-hi720.ts\n' + '#EXT-X-ENDLIST\n' + '\n',
  4206. 'extinf': '#EXTM3U\n' + '#EXT-X-TARGETDURATION:10\n' + '#EXT-X-VERSION:3\n' + '#EXT-X-MEDIA-SEQUENCE:0\n' + '#EXT-X-PLAYLIST-TYPE:VOD\n' + '#EXTINF:10\n' + '#EXT-X-BYTERANGE:522828@0\n' + 'hls_450k_video.ts\n' + '#EXTINF:;asljasdfii11)))00,\n' + '#EXT-X-BYTERANGE:587500@522828\n' + 'hls_450k_video.ts\n' + '#EXTINF:5,\n' + '#EXT-X-BYTERANGE:713084@1110328\n' + 'hls_450k_video.ts\n' + '#EXTINF:9.7,\n' + '#EXT-X-BYTERANGE:476580@1823412\n' + 'hls_450k_video.ts\n' + '#EXTINF:10,\n' + '#EXT-X-BYTERANGE:535612@2299992\n' + 'hls_450k_video.ts\n' + '#EXTINF:10,\n' + '#EXT-X-BYTERANGE:207176@2835604\n' + 'hls_450k_video.ts\n' + '#EXTINF:10,\n' + '#EXT-X-BYTERANGE:455900@3042780\n' + 'hls_450k_video.ts\n' + '#EXTINF:10,\n' + '#EXT-X-BYTERANGE:657248@3498680\n' + 'hls_450k_video.ts\n' + '#EXTINF:10,\n' + '#EXT-X-BYTERANGE:571708@4155928\n' + 'hls_450k_video.ts\n' + '#EXTINF:10,\n' + '#EXT-X-BYTERANGE:485040@4727636\n' + 'hls_450k_video.ts\n' + '#EXTINF:10,\n' + '#EXT-X-BYTERANGE:709136@5212676\n' + 'hls_450k_video.ts\n' + '#EXTINF:10,\n' + '#EXT-X-BYTERANGE:730004@5921812\n' + 'hls_450k_video.ts\n' + '#EXTINF:10,\n' + '#EXT-X-BYTERANGE:456276@6651816\n' + 'hls_450k_video.ts\n' + '#EXTINF:10,\n' + '#EXT-X-BYTERANGE:468684@7108092\n' + 'hls_450k_video.ts\n' + '#EXTINF:10,\n' + '#EXT-X-BYTERANGE:444996@7576776\n' + 'hls_450k_video.ts\n' + '#EXTINF:22,\n' + '#EXTINF:10,\n' + '#EXT-X-BYTERANGE:331444@8021772\n' + 'hls_450k_video.ts\n' + '#EXT-X-BYTERANGE:44556@8353216\n' + 'hls_450k_video.ts\n' + '#EXT-X-ENDLIST\n' + '\n',
  4207. 'fmp4': '#EXTM3U\n' + '#EXT-X-TARGETDURATION:6\n' + '#EXT-X-VERSION:7\n' + '#EXT-X-MEDIA-SEQUENCE:1\n' + '#EXT-X-PLAYLIST-TYPE:VOD\n' + '#EXT-X-INDEPENDENT-SEGMENTS\n' + '#EXT-X-MAP:URI="main.mp4",BYTERANGE="720@0"\n' + '#EXTINF:6.00600, \n' + '#EXT-X-BYTERANGE:5666510@720\n' + 'main.mp4\n' + '#EXTINF:6.00600, \n' + '#EXT-X-BYTERANGE:5861577@5667230\n' + 'main.mp4\n' + '#EXT-X-ENDLIST\n' + '\n',
  4208. 'headerOnly': '#EXTM3U\n' + '\n',
  4209. 'invalidAllowCache': '#EXTM3U\n' + '#EXT-X-TARGETDURATION:10\n' + '#EXT-X-VERSION:4\n' + '#EXT-X-ALLOW-CACHE:MAYBE\n' + '#EXT-X-MEDIA-SEQUENCE:0\n' + '#EXT-X-PLAYLIST-TYPE:VOD\n' + '#EXTINF:10,\n' + '#EXT-X-BYTERANGE:522828@0\n' + 'hls_450k_video.ts\n' + '#EXT-X-ENDLIST\n',
  4210. 'invalidMediaSequence': '#EXTM3U\n' + '#EXT-X-PLAYLIST-TYPE:VOD\n' + '#EXT-X-MEDIA-SEQUENCE:gobblegobble\n' + '#EXT-X-ALLOW-CACHE:YES\n' + '#EXT-X-TARGETDURATION:8\n' + '#EXTINF:6.640,{}\n' + '/test/ts-files/tvy7/8a5e2822668b5370f4eb1438b2564fb7ab12ffe1-hi720.ts\n' + '#EXTINF:6.080,{}\n' + '/test/ts-files/tvy7/56be1cef869a1c0cc8e38864ad1add17d187f051-hi720.ts\n' + '#EXTINF:6.600,{}\n' + '/test/ts-files/tvy7/549c8c77f55f049741a06596e5c1e01dacaa46d0-hi720.ts\n' + '#EXTINF:5.000,{}\n' + '/test/ts-files/tvy7/6cfa378684ffeb1c455a64dae6c103290a1f53d4-hi720.ts\n' + '#EXT-X-ENDLIST\n' + '\n',
  4211. 'invalidPlaylistType': '#EXTM3U\n' + '#EXT-X-PLAYLIST-TYPE:asdRASDfasdR\n' + '#EXT-X-TARGETDURATION:10\n' + '#EXTINF:10,\n' + '/test/ts-files/zencoder/haze/Haze_Mantel_President_encoded_1200-00001.ts\n' + '#EXTINF:10,\n' + '/test/ts-files/zencoder/haze/Haze_Mantel_President_encoded_1200-00002.ts\n' + '#EXTINF:10,\n' + '/test/ts-files/zencoder/haze/Haze_Mantel_President_encoded_1200-00003.ts\n' + '#EXTINF:10,\n' + '/test/ts-files/zencoder/haze/Haze_Mantel_President_encoded_1200-00004.ts\n' + '#EXTINF:10,\n' + '/test/ts-files/zencoder/haze/Haze_Mantel_President_encoded_1200-00005.ts\n' + '#EXTINF:8,\n' + '/test/ts-files/zencoder/haze/Haze_Mantel_President_encoded_1200-00006.ts\n' + '#ZEN-TOTAL-DURATION:57.9911\n' + '#EXT-X-ENDLIST\n' + '\n',
  4212. 'invalidTargetDuration': '#EXTM3U\n' + '#EXT-X-TARGETDURATION:NaN\n' + '#EXT-X-VERSION:4\n' + '#EXT-X-MEDIA-SEQUENCE:0\n' + '#EXT-X-PLAYLIST-TYPE:VOD\n' + '#EXTINF:10, \n' + '#EXT-X-BYTERANGE:522828@0\n' + 'hls_450k_video.ts\n' + '#EXTINF:10, \n' + '#EXT-X-BYTERANGE:587500@522828\n' + 'hls_450k_video.ts\n' + '#EXTINF:10, \n' + '#EXT-X-BYTERANGE:713084@1110328\n' + 'hls_450k_video.ts\n' + '#EXTINF:10, \n' + '#EXT-X-BYTERANGE:476580@1823412\n' + 'hls_450k_video.ts\n' + '#EXTINF:10, \n' + '#EXT-X-BYTERANGE:535612@2299992\n' + 'hls_450k_video.ts\n' + '#EXTINF:10, \n' + '#EXT-X-BYTERANGE:207176@2835604\n' + 'hls_450k_video.ts\n' + '#EXTINF:10, \n' + '#EXT-X-BYTERANGE:455900@3042780\n' + 'hls_450k_video.ts\n' + '#EXTINF:10, \n' + '#EXT-X-BYTERANGE:657248@3498680\n' + 'hls_450k_video.ts\n' + '#EXTINF:10, \n' + '#EXT-X-BYTERANGE:571708@4155928\n' + 'hls_450k_video.ts\n' + '#EXTINF:10, \n' + '#EXT-X-BYTERANGE:485040@4727636\n' + 'hls_450k_video.ts\n' + '#EXTINF:10, \n' + '#EXT-X-BYTERANGE:709136@5212676\n' + 'hls_450k_video.ts\n' + '#EXTINF:10, \n' + '#EXT-X-BYTERANGE:730004@5921812\n' + 'hls_450k_video.ts\n' + '#EXTINF:10, \n' + '#EXT-X-BYTERANGE:456276@6651816\n' + 'hls_450k_video.ts\n' + '#EXTINF:10, \n' + '#EXT-X-BYTERANGE:468684@7108092\n' + 'hls_450k_video.ts\n' + '#EXTINF:10, \n' + '#EXT-X-BYTERANGE:444996@7576776\n' + 'hls_450k_video.ts\n' + '#EXTINF:10, \n' + '#EXT-X-BYTERANGE:331444@8021772\n' + 'hls_450k_video.ts\n' + '#EXTINF:1.4167, \n' + '#EXT-X-BYTERANGE:44556@8353216\n' + 'hls_450k_video.ts\n' + '#EXT-X-ENDLIST\n' + '\n',
  4213. 'liveMissingSegmentDuration': '#EXTM3U\n' + '#EXT-X-PLAYLIST-TYPE:VOD\n' + '#EXT-X-MEDIA-SEQUENCE:0\n' + '#EXT-X-ALLOW-CACHE:YES\n' + '#EXT-X-TARGETDURATION:8\n' + '#EXTINF:6.640,{}\n' + '/test/ts-files/tvy7/8a5e2822668b5370f4eb1438b2564fb7ab12ffe1-hi720.ts\n' + '/test/ts-files/tvy7/56be1cef869a1c0cc8e38864ad1add17d187f051-hi720.ts\n' + '/test/ts-files/tvy7/549c8c77f55f049741a06596e5c1e01dacaa46d0-hi720.ts\n' + '\n',
  4214. 'liveStart30sBefore': '#EXTM3U\n' + '#EXT-X-MEDIA-SEQUENCE:0\n' + '#EXT-X-ALLOW-CACHE:YES\n' + '#EXT-X-TARGETDURATION:10\n' + '#EXTINF:10,0\n' + '001.ts\n' + '#EXTINF:19,0\n' + '002.ts\n' + '#EXTINF:10,0\n' + '003.ts\n' + '#EXTINF:11,0\n' + '004.ts\n' + '#EXTINF:10,0\n' + '005.ts\n' + '#EXTINF:10,0\n' + '006.ts\n' + '#EXTINF:10,0\n' + '007.ts\n' + '#EXTINF:10,0\n' + '008.ts\n' + '#EXTINF:16,0\n' + '009.ts\n',
  4215. 'manifestExtTTargetdurationNegative': '#EXTM3U\n' + '#ZEN-TOTAL-DURATION:50\n' + '#EXT-X-TARGETDURATION:-10\n' + '#EXTINF:10,\n' + '/test/ts-files/zencoder/gogo/00001.ts\n' + '#EXT-X-ENDLIST\n' + '\n',
  4216. 'manifestExtXEndlistEarly': '#EXTM3U\n' + '#ZEN-TOTAL-DURATION:50\n' + '#EXT-X-TARGETDURATION:10\n' + '#EXTINF:10,\n' + '/test/ts-files/zencoder/gogo/00001.ts\n' + '#EXTINF:10,\n' + '/test/ts-files/zencoder/gogo/00002.ts\n' + '#EXTINF:10,\n' + '/test/ts-files/zencoder/gogo/00003.ts\n' + '#EXT-X-ENDLIST\n' + '#EXTINF:10,\n' + '/test/ts-files/zencoder/gogo/00004.ts\n' + '#EXTINF:10,\n' + '/test/ts-files/zencoder/gogo/00005.ts\n' + '\n' + '\n',
  4217. 'manifestNoExtM3u': '#ZEN-TOTAL-DURATION:10\n' + '#EXT-X-TARGETDURATION:10\n' + '#EXTINF:10,\n' + '/test/ts-files/zencoder/gogo/00001.ts\n' + '#EXT-X-ENDLIST\n' + '\n',
  4218. 'master-fmp4': '#EXTM3U\n' + '#EXT-X-VERSION:6\n' + '#EXT-X-INDEPENDENT-SEGMENTS\n' + '\n' + '\n' + '#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="aud1",LANGUAGE="eng",NAME="English",AUTOSELECT=YES,DEFAULT=YES,URI="a1/prog_index.m3u8"\n' + '#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="aud2",LANGUAGE="eng",NAME="English",AUTOSELECT=YES,DEFAULT=YES,URI="a2/prog_index.m3u8"\n' + '#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="aud3",LANGUAGE="eng",NAME="English",AUTOSELECT=YES,DEFAULT=YES,URI="a3/prog_index.m3u8"\n' + '\n' + '\n' + '#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID="sub1",NAME="English",LANGUAGE="eng",DEFAULT=YES,AUTOSELECT=YES,FORCED=NO,URI="s1/eng/prog_index.m3u8"\n' + '\n' + '\n' + '#EXT-X-MEDIA:TYPE=CLOSED-CAPTIONS,GROUP-ID="cc1",NAME="English",LANGUAGE="eng",DEFAULT=YES,AUTOSELECT=YES,INSTREAM-ID="CC1"\n' + '\n' + '\n' + '#EXT-X-I-FRAME-STREAM-INF:AVERAGE-BANDWIDTH=163198,BANDWIDTH=166942,CODECS="avc1.64002a",RESOLUTION=1920x1080,URI="v6/iframe_index.m3u8"\n' + '#EXT-X-I-FRAME-STREAM-INF:AVERAGE-BANDWIDTH=131314,BANDWIDTH=139041,CODECS="avc1.640020",RESOLUTION=1280x720,URI="v5/iframe_index.m3u8"\n' + '#EXT-X-I-FRAME-STREAM-INF:AVERAGE-BANDWIDTH=100233,BANDWIDTH=101724,CODECS="avc1.640020",RESOLUTION=960x540,URI="v4/iframe_index.m3u8"\n' + '#EXT-X-I-FRAME-STREAM-INF:AVERAGE-BANDWIDTH=81002,BANDWIDTH=84112,CODECS="avc1.64001e",RESOLUTION=768x432,URI="v3/iframe_index.m3u8"\n' + '#EXT-X-I-FRAME-STREAM-INF:AVERAGE-BANDWIDTH=64987,BANDWIDTH=65835,CODECS="avc1.64001e",RESOLUTION=640x360,URI="v2/iframe_index.m3u8"\n' + '#EXT-X-I-FRAME-STREAM-INF:AVERAGE-BANDWIDTH=41547,BANDWIDTH=42106,CODECS="avc1.640015",RESOLUTION=480x270,URI="v1/iframe_index.m3u8"\n' + '\n' + '\n' + '#EXT-X-STREAM-INF:AVERAGE-BANDWIDTH=2165224,BANDWIDTH=2215219,CODECS="avc1.640020,mp4a.40.2",RESOLUTION=960x540,FRAME-RATE=59.940,CLOSED-CAPTIONS="cc1",AUDIO="aud1",SUBTITLES="sub1"\n' + 'v4/prog_index.m3u8\n' + '#EXT-X-STREAM-INF:AVERAGE-BANDWIDTH=7962844,BANDWIDTH=7976430,CODECS="avc1.64002a,mp4a.40.2",RESOLUTION=1920x1080,FRAME-RATE=59.940,CLOSED-CAPTIONS="cc1",AUDIO="aud1",SUBTITLES="sub1"\n' + 'v8/prog_index.m3u8\n' + '#EXT-X-STREAM-INF:AVERAGE-BANDWIDTH=6165024,BANDWIDTH=6181885,CODECS="avc1.64002a,mp4a.40.2",RESOLUTION=1920x1080,FRAME-RATE=59.940,CLOSED-CAPTIONS="cc1",AUDIO="aud1",SUBTITLES="sub1"\n' + 'v7/prog_index.m3u8\n' + '#EXT-X-STREAM-INF:AVERAGE-BANDWIDTH=4664459,BANDWIDTH=4682666,CODECS="avc1.64002a,mp4a.40.2",RESOLUTION=1920x1080,FRAME-RATE=59.940,CLOSED-CAPTIONS="cc1",AUDIO="aud1",SUBTITLES="sub1"\n' + 'v6/prog_index.m3u8\n' + '#EXT-X-STREAM-INF:AVERAGE-BANDWIDTH=3164759,BANDWIDTH=3170746,CODECS="avc1.640020,mp4a.40.2",RESOLUTION=1280x720,FRAME-RATE=59.940,CLOSED-CAPTIONS="cc1",AUDIO="aud1",SUBTITLES="sub1"\n' + 'v5/prog_index.m3u8\n' + '#EXT-X-STREAM-INF:AVERAGE-BANDWIDTH=1262552,BANDWIDTH=1276223,CODECS="avc1.64001e,mp4a.40.2",RESOLUTION=768x432,FRAME-RATE=29.970,CLOSED-CAPTIONS="cc1",AUDIO="aud1",SUBTITLES="sub1"\n' + 'v3/prog_index.m3u8\n' + '#EXT-X-STREAM-INF:AVERAGE-BANDWIDTH=893243,BANDWIDTH=904744,CODECS="avc1.64001e,mp4a.40.2",RESOLUTION=640x360,FRAME-RATE=29.970,CLOSED-CAPTIONS="cc1",AUDIO="aud1",SUBTITLES="sub1"\n' + 'v2/prog_index.m3u8\n' + '#EXT-X-STREAM-INF:AVERAGE-BANDWIDTH=527673,BANDWIDTH=538201,CODECS="avc1.640015,mp4a.40.2",RESOLUTION=480x270,FRAME-RATE=29.970,CLOSED-CAPTIONS="cc1",AUDIO="aud1",SUBTITLES="sub1"\n' + 'v1/prog_index.m3u8\n' + '\n' + '\n' + '#EXT-X-STREAM-INF:AVERAGE-BANDWIDTH=2390334,BANDWIDTH=2440329,CODECS="avc1.640020,ac-3",RESOLUTION=960x540,FRAME-RATE=59.940,CLOSED-CAPTIONS="cc1",AUDIO="aud2",SUBTITLES="sub1"\n' + 'v4/prog_index.m3u8\n' + '#EXT-X-STREAM-INF:AVERAGE-BANDWIDTH=8187954,BANDWIDTH=8201540,CODECS="avc1.64002a,ac-3",RESOLUTION=1920x1080,FRAME-RATE=59.940,CLOSED-CAPTIONS="cc1",AUDIO="aud2",SUBTITLES="sub1"\n' + 'v8/prog_index.m3u8\n' + '#EXT-X-STREAM-INF:AVERAGE-BANDWIDTH=6390134,BANDWIDTH=6406995,CODECS="avc1.64002a,ac-3",RESOLUTION=1920x1080,FRAME-RATE=59.940,CLOSED-CAPTIONS="cc1",AUDIO="aud2",SUBTITLES="sub1"\n' + 'v7/prog_index.m3u8\n' + '#EXT-X-STREAM-INF:AVERAGE-BANDWIDTH=4889569,BANDWIDTH=4907776,CODECS="avc1.64002a,ac-3",RESOLUTION=1920x1080,FRAME-RATE=59.940,CLOSED-CAPTIONS="cc1",AUDIO="aud2",SUBTITLES="sub1"\n' + 'v6/prog_index.m3u8\n' + '#EXT-X-STREAM-INF:AVERAGE-BANDWIDTH=3389869,BANDWIDTH=3395856,CODECS="avc1.640020,ac-3",RESOLUTION=1280x720,FRAME-RATE=59.940,CLOSED-CAPTIONS="cc1",AUDIO="aud2",SUBTITLES="sub1"\n' + 'v5/prog_index.m3u8\n' + '#EXT-X-STREAM-INF:AVERAGE-BANDWIDTH=1487662,BANDWIDTH=1501333,CODECS="avc1.64001e,ac-3",RESOLUTION=768x432,FRAME-RATE=29.970,CLOSED-CAPTIONS="cc1",AUDIO="aud2",SUBTITLES="sub1"\n' + 'v3/prog_index.m3u8\n' + '#EXT-X-STREAM-INF:AVERAGE-BANDWIDTH=1118353,BANDWIDTH=1129854,CODECS="avc1.64001e,ac-3",RESOLUTION=640x360,FRAME-RATE=29.970,CLOSED-CAPTIONS="cc1",AUDIO="aud2",SUBTITLES="sub1"\n' + 'v2/prog_index.m3u8\n' + '#EXT-X-STREAM-INF:AVERAGE-BANDWIDTH=752783,BANDWIDTH=763311,CODECS="avc1.640015,ac-3",RESOLUTION=480x270,FRAME-RATE=29.970,CLOSED-CAPTIONS="cc1",AUDIO="aud2",SUBTITLES="sub1"\n' + 'v1/prog_index.m3u8\n' + '\n' + '\n' + '#EXT-X-STREAM-INF:AVERAGE-BANDWIDTH=2198334,BANDWIDTH=2248329,CODECS="avc1.640020,ec-3",RESOLUTION=960x540,FRAME-RATE=59.940,CLOSED-CAPTIONS="cc1",AUDIO="aud3",SUBTITLES="sub1"\n' + 'v4/prog_index.m3u8\n' + '#EXT-X-STREAM-INF:AVERAGE-BANDWIDTH=7995954,BANDWIDTH=8009540,CODECS="avc1.64002a,ec-3",RESOLUTION=1920x1080,FRAME-RATE=59.940,CLOSED-CAPTIONS="cc1",AUDIO="aud3",SUBTITLES="sub1"\n' + 'v8/prog_index.m3u8\n' + '#EXT-X-STREAM-INF:AVERAGE-BANDWIDTH=6198134,BANDWIDTH=6214995,CODECS="avc1.64002a,ec-3",RESOLUTION=1920x1080,FRAME-RATE=59.940,CLOSED-CAPTIONS="cc1",AUDIO="aud3",SUBTITLES="sub1"\n' + 'v7/prog_index.m3u8\n' + '#EXT-X-STREAM-INF:AVERAGE-BANDWIDTH=4697569,BANDWIDTH=4715776,CODECS="avc1.64002a,ec-3",RESOLUTION=1920x1080,FRAME-RATE=59.940,CLOSED-CAPTIONS="cc1",AUDIO="aud3",SUBTITLES="sub1"\n' + 'v6/prog_index.m3u8\n' + '#EXT-X-STREAM-INF:AVERAGE-BANDWIDTH=3197869,BANDWIDTH=3203856,CODECS="avc1.640020,ec-3",RESOLUTION=1280x720,FRAME-RATE=59.940,CLOSED-CAPTIONS="cc1",AUDIO="aud3",SUBTITLES="sub1"\n' + 'v5/prog_index.m3u8\n' + '#EXT-X-STREAM-INF:AVERAGE-BANDWIDTH=1295662,BANDWIDTH=1309333,CODECS="avc1.64001e,ec-3",RESOLUTION=768x432,FRAME-RATE=29.970,CLOSED-CAPTIONS="cc1",AUDIO="aud3",SUBTITLES="sub1"\n' + 'v3/prog_index.m3u8\n' + '#EXT-X-STREAM-INF:AVERAGE-BANDWIDTH=926353,BANDWIDTH=937854,CODECS="avc1.64001e,ec-3",RESOLUTION=640x360,FRAME-RATE=29.970,CLOSED-CAPTIONS="cc1",AUDIO="aud3",SUBTITLES="sub1"\n' + 'v2/prog_index.m3u8\n' + '#EXT-X-STREAM-INF:AVERAGE-BANDWIDTH=560783,BANDWIDTH=571311,CODECS="avc1.640015,ec-3",RESOLUTION=480x270,FRAME-RATE=29.970,CLOSED-CAPTIONS="cc1",AUDIO="aud3",SUBTITLES="sub1"\n' + 'v1/prog_index.m3u8\n' + '\n',
  4219. 'master': '# A simple master playlist with multiple variant streams\n' + '#EXTM3U\n' + '#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=240000,RESOLUTION=396x224\n' + 'media.m3u8\n' + '#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=40000\n' + 'media1.m3u8\n' + '#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=440000,RESOLUTION=396x224\n' + 'media2.m3u8\n' + '#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1928000,RESOLUTION=960x540\n' + 'media3.m3u8\n' + '\n',
  4220. 'media': '#EXTM3U\n' + '#EXT-X-PLAYLIST-TYPE:VOD\n' + '#EXT-X-TARGETDURATION:10\n' + '#EXTINF:10,\n' + 'media-00001.ts\n' + '#EXTINF:10,\n' + 'media-00002.ts\n' + '#EXTINF:10,\n' + 'media-00003.ts\n' + '#EXTINF:10,\n' + 'media-00004.ts\n' + '#ZEN-TOTAL-DURATION:57.9911\n' + '#EXT-X-ENDLIST\n' + '\n',
  4221. 'media1': '#EXTM3U\n' + '#EXT-X-PLAYLIST-TYPE:VOD\n' + '#EXT-X-TARGETDURATION:10\n' + '#EXTINF:10,\n' + 'media1-00001.ts\n' + '#EXTINF:10,\n' + 'media1-00002.ts\n' + '#EXTINF:10,\n' + 'media1-00003.ts\n' + '#EXTINF:10,\n' + 'media1-00004.ts\n' + '#ZEN-TOTAL-DURATION:57.9911\n' + '#EXT-X-ENDLIST\n' + '\n',
  4222. 'media2': '#EXTM3U\n' + '#EXT-X-PLAYLIST-TYPE:VOD\n' + '#EXT-X-TARGETDURATION:10\n' + '#EXTINF:10,\n' + 'media2-00001.ts\n' + '#EXTINF:10,\n' + 'media2-00002.ts\n' + '#EXTINF:10,\n' + 'media2-00003.ts\n' + '#EXTINF:10,\n' + 'media2-00004.ts\n' + '#ZEN-TOTAL-DURATION:57.9911\n' + '#EXT-X-ENDLIST\n' + '\n',
  4223. 'media3': '#EXTM3U\n' + '#EXT-X-PLAYLIST-TYPE:VOD\n' + '#EXT-X-TARGETDURATION:10\n' + '#EXTINF:10,\n' + 'media3-00001.ts\n' + '#EXTINF:10,\n' + 'media3-00002.ts\n' + '#EXTINF:10,\n' + 'media3-00003.ts\n' + '#EXTINF:10,\n' + 'media3-00004.ts\n' + '#ZEN-TOTAL-DURATION:57.9911\n' + '#EXT-X-ENDLIST\n' + '\n',
  4224. 'mediaSequence': '#EXTM3U\n' + '#EXT-X-PLAYLIST-TYPE:VOD\n' + '#EXT-X-MEDIA-SEQUENCE:0\n' + '#EXT-X-ALLOW-CACHE:YES\n' + '#EXT-X-TARGETDURATION:8\n' + '#EXTINF:6.640,{}\n' + '/test/ts-files/tvy7/8a5e2822668b5370f4eb1438b2564fb7ab12ffe1-hi720.ts\n' + '#EXTINF:6.080,{}\n' + '/test/ts-files/tvy7/56be1cef869a1c0cc8e38864ad1add17d187f051-hi720.ts\n' + '#EXTINF:6.600,{}\n' + '/test/ts-files/tvy7/549c8c77f55f049741a06596e5c1e01dacaa46d0-hi720.ts\n' + '#EXTINF:5.000,{}\n' + '/test/ts-files/tvy7/6cfa378684ffeb1c455a64dae6c103290a1f53d4-hi720.ts\n' + '#EXT-X-ENDLIST\n' + '\n',
  4225. 'missingEndlist': '#EXTM3U\n' + '#EXT-X-TARGETDURATION:10\n' + '#EXTINF:10,\n' + '00001.ts\n' + '#EXTINF:10,\n' + '00002.ts\n' + '\n',
  4226. 'missingExtinf': '#EXTM3U\n' + '#EXT-X-TARGETDURATION:10\n' + '#EXT-X-VERSION:3\n' + '#EXT-X-MEDIA-SEQUENCE:0\n' + '#EXT-X-PLAYLIST-TYPE:VOD\n' + '#EXTINF:10\n' + 'hls_450k_video.ts\n' + 'hls_450k_video.ts\n' + '#EXTINF:10,\n' + 'hls_450k_video.ts\n' + '#EXT-X-ENDLIST\n' + '\n',
  4227. 'missingMediaSequence': '#EXTM3U\n' + '#EXT-X-PLAYLIST-TYPE:VOD\n' + '#EXT-X-ALLOW-CACHE:YES\n' + '#EXT-X-TARGETDURATION:8\n' + '#EXTINF:6.640,{}\n' + '/test/ts-files/tvy7/8a5e2822668b5370f4eb1438b2564fb7ab12ffe1-hi720.ts\n' + '#EXTINF:6.080,{}\n' + '/test/ts-files/tvy7/56be1cef869a1c0cc8e38864ad1add17d187f051-hi720.ts\n' + '#EXTINF:6.600,{}\n' + '/test/ts-files/tvy7/549c8c77f55f049741a06596e5c1e01dacaa46d0-hi720.ts\n' + '#EXTINF:5.000,{}\n' + '/test/ts-files/tvy7/6cfa378684ffeb1c455a64dae6c103290a1f53d4-hi720.ts\n' + '#EXT-X-ENDLIST\n' + '\n',
  4228. 'missingSegmentDuration': '#EXTM3U\n' + '#EXT-X-PLAYLIST-TYPE:VOD\n' + '#EXT-X-MEDIA-SEQUENCE:0\n' + '#EXT-X-ALLOW-CACHE:YES\n' + '#EXT-X-TARGETDURATION:8\n' + '#EXTINF:6.640,{}\n' + '/test/ts-files/tvy7/8a5e2822668b5370f4eb1438b2564fb7ab12ffe1-hi720.ts\n' + '/test/ts-files/tvy7/56be1cef869a1c0cc8e38864ad1add17d187f051-hi720.ts\n' + '/test/ts-files/tvy7/549c8c77f55f049741a06596e5c1e01dacaa46d0-hi720.ts\n' + '/test/ts-files/tvy7/6cfa378684ffeb1c455a64dae6c103290a1f53d4-hi720.ts\n' + '#EXT-X-ENDLIST\n' + '\n',
  4229. 'multipleAudioGroups': '#EXTM3U\n' + '#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="audio-lo",LANGUAGE="eng",NAME="English",AUTOSELECT=YES, DEFAULT=YES,URI="englo/prog_index.m3u8"\n' + '#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="audio-lo",LANGUAGE="fre",NAME="Français",AUTOSELECT=YES, DEFAULT=NO,URI="frelo/prog_index.m3u8"\n' + '#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="audio-lo",LANGUAGE="sp",NAME="Espanol",AUTOSELECT=YES, DEFAULT=NO,URI="splo/prog_index.m3u8"\n' + '\n' + '#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="audio-hi",LANGUAGE="eng",NAME="English",AUTOSELECT=YES, DEFAULT=YES,URI="eng/prog_index.m3u8"\n' + '#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="audio-hi",LANGUAGE="fre",NAME="Français",AUTOSELECT=YES, DEFAULT=NO,URI="fre/prog_index.m3u8"\n' + '#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="audio-hi",LANGUAGE="sp",NAME="Espanol",AUTOSELECT=YES, DEFAULT=NO,URI="sp/prog_index.m3u8"\n' + '\n' + '#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=195023,CODECS="mp4a.40.5", AUDIO="audio-lo"\n' + 'lo/prog_index.m3u8\n' + '#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=260000,CODECS="avc1.42e01e,mp4a.40.2", AUDIO="audio-lo"\n' + 'lo2/prog_index.m3u8\n' + '#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=591680,CODECS="mp4a.40.2, avc1.64001e", AUDIO="audio-hi"\n' + 'hi/prog_index.m3u8\n' + '#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=650000,CODECS="avc1.42e01e,mp4a.40.2", AUDIO="audio-hi"\n' + 'hi2/prog_index.m3u8\n' + '\n',
  4230. 'multipleAudioGroupsCombinedMain': '#EXTM3U\n' + '#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="audio-lo",LANGUAGE="eng",NAME="English",AUTOSELECT=YES, DEFAULT=YES\n' + '#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="audio-lo",LANGUAGE="fre",NAME="Français",AUTOSELECT=YES, DEFAULT=NO,URI="frelo/prog_index.m3u8"\n' + '#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="audio-lo",LANGUAGE="sp",NAME="Espanol",AUTOSELECT=YES, DEFAULT=NO,URI="splo/prog_index.m3u8"\n' + '\n' + '#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="audio-hi",LANGUAGE="eng",NAME="English",AUTOSELECT=YES, DEFAULT=YES,URI="eng/prog_index.m3u8"\n' + '#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="audio-hi",LANGUAGE="fre",NAME="Français",AUTOSELECT=YES, DEFAULT=NO,URI="fre/prog_index.m3u8"\n' + '#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="audio-hi",LANGUAGE="sp",NAME="Espanol",AUTOSELECT=YES, DEFAULT=NO,URI="sp/prog_index.m3u8"\n' + '\n' + '#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=195023,CODECS="mp4a.40.5", AUDIO="audio-lo"\n' + 'lo/prog_index.m3u8\n' + '#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=260000,CODECS="avc1.42e01e,mp4a.40.2", AUDIO="audio-lo"\n' + 'lo2/prog_index.m3u8\n' + '#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=591680,CODECS="mp4a.40.2, avc1.64001e", AUDIO="audio-hi"\n' + 'hi/prog_index.m3u8\n' + '#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=650000,CODECS="avc1.42e01e,mp4a.40.2", AUDIO="audio-hi"\n' + 'hi2/prog_index.m3u8\n' + '\n',
  4231. 'multipleTargetDurations': '#EXTM3U\n' + '001.ts\n' + '#EXT-X-TARGETDURATION:9\n' + '002.ts\n' + '#EXTINF:7\n' + '003.ts\n' + '#EXT-X-TARGETDURATION:10\n' + '004.ts\n',
  4232. 'multipleVideo': '#EXTM3U\n' + '#EXT-X-MEDIA:TYPE=VIDEO,GROUP-ID="200kbs",NAME="Angle1",AUTOSELECT=YES,DEFAULT=YES\n' + '#EXT-X-MEDIA:TYPE=VIDEO,GROUP-ID="200kbs",NAME="Angle2",AUTOSELECT=YES,DEFAULT=NO,URI="Angle2/200kbs/prog_index.m3u8"\n' + '#EXT-X-MEDIA:TYPE=VIDEO,GROUP-ID="200kbs",NAME="Angle3",AUTOSELECT=YES,DEFAULT=NO,URI="Angle3/200kbs/prog_index.m3u8"\n' + ' \n' + '#EXT-X-MEDIA:TYPE=VIDEO,GROUP-ID="500kbs",NAME="Angle1",AUTOSELECT=YES,DEFAULT=YES\n' + '#EXT-X-MEDIA:TYPE=VIDEO,GROUP-ID="500kbs",NAME="Angle2",AUTOSELECT=YES,DEFAULT=NO,URI="Angle2/500kbs/prog_index.m3u8"\n' + '#EXT-X-MEDIA:TYPE=VIDEO,GROUP-ID="500kbs",NAME="Angle3",AUTOSELECT=YES,DEFAULT=NO,URI="Angle3/500kbs/prog_index.m3u8"\n' + ' \n' + '#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="aac",LANGUAGE="eng",NAME="English",AUTOSELECT=YES,DEFAULT=YES,URI="eng/prog_index.m3u8"\n' + ' \n' + '#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=300000,CODECS="mp4a.40.2,avc1.4d401e",VIDEO="200kbs",AUDIO="aac"\n' + 'Angle1/200kbs/prog_index.m3u\n' + ' \n' + '#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=754857,CODECS="mp4a.40.2,avc1.4d401e",VIDEO="500kbs",AUDIO="aac"\n' + 'Angle1/500kbs/prog_index.m3u8\n',
  4233. 'negativeMediaSequence': '#EXTM3U\n' + '#EXT-X-PLAYLIST-TYPE:VOD\n' + '#EXT-X-MEDIA-SEQUENCE:-11\n' + '#EXT-X-ALLOW-CACHE:YES\n' + '#EXT-X-TARGETDURATION:8\n' + '#EXTINF:6.640,{}\n' + '/test/ts-files/tvy7/8a5e2822668b5370f4eb1438b2564fb7ab12ffe1-hi720.ts\n' + '#EXTINF:6.080,{}\n' + '/test/ts-files/tvy7/56be1cef869a1c0cc8e38864ad1add17d187f051-hi720.ts\n' + '#EXTINF:6.600,{}\n' + '/test/ts-files/tvy7/549c8c77f55f049741a06596e5c1e01dacaa46d0-hi720.ts\n' + '#EXTINF:5.000,{}\n' + '/test/ts-files/tvy7/6cfa378684ffeb1c455a64dae6c103290a1f53d4-hi720.ts\n' + '#EXT-X-ENDLIST\n' + '\n',
  4234. 'playlist': '#EXTM3U\n' + '#EXT-X-TARGETDURATION:10\n' + '#EXT-X-VERSION:4\n' + '#EXT-X-MEDIA-SEQUENCE:0\n' + '#EXT-X-PLAYLIST-TYPE:VOD\n' + '#EXTINF:10, \n' + '#EXT-X-BYTERANGE:522828@0\n' + 'hls_450k_video.ts\n' + '#EXTINF:10, \n' + '#EXT-X-BYTERANGE:587500@522828\n' + 'hls_450k_video.ts\n' + '#EXTINF:10, \n' + '#EXT-X-BYTERANGE:713084@1110328\n' + 'hls_450k_video.ts\n' + '#EXTINF:10, \n' + '#EXT-X-BYTERANGE:476580@1823412\n' + 'hls_450k_video.ts\n' + '#EXTINF:10, \n' + '#EXT-X-BYTERANGE:535612@2299992\n' + 'hls_450k_video.ts\n' + '#EXTINF:10, \n' + '#EXT-X-BYTERANGE:207176@2835604\n' + 'hls_450k_video.ts\n' + '#EXTINF:10, \n' + '#EXT-X-BYTERANGE:455900@3042780\n' + 'hls_450k_video.ts\n' + '#EXTINF:10, \n' + '#EXT-X-BYTERANGE:657248@3498680\n' + 'hls_450k_video.ts\n' + '#EXTINF:10, \n' + '#EXT-X-BYTERANGE:571708@4155928\n' + 'hls_450k_video.ts\n' + '#EXTINF:10, \n' + '#EXT-X-BYTERANGE:485040@4727636\n' + 'hls_450k_video.ts\n' + '#EXTINF:10, \n' + '#EXT-X-BYTERANGE:709136@5212676\n' + 'hls_450k_video.ts\n' + '#EXTINF:10, \n' + '#EXT-X-BYTERANGE:730004@5921812\n' + 'hls_450k_video.ts\n' + '#EXTINF:10, \n' + '#EXT-X-BYTERANGE:456276@6651816\n' + 'hls_450k_video.ts\n' + '#EXTINF:10, \n' + '#EXT-X-BYTERANGE:468684@7108092\n' + 'hls_450k_video.ts\n' + '#EXTINF:10, \n' + '#EXT-X-BYTERANGE:444996@7576776\n' + 'hls_450k_video.ts\n' + '#EXTINF:10, \n' + '#EXT-X-BYTERANGE:331444@8021772\n' + 'hls_450k_video.ts\n' + '#EXTINF:1.4167, \n' + '#EXT-X-BYTERANGE:44556@8353216\n' + 'hls_450k_video.ts\n' + '#EXT-X-ENDLIST\n' + '\n',
  4235. 'playlistMediaSequenceHigher': '#EXTM3U\n' + '#EXT-X-PLAYLIST-TYPE:VOD\n' + '#EXT-X-MEDIA-SEQUENCE:17\n' + '#EXT-X-ALLOW-CACHE:YES\n' + '#EXT-X-TARGETDURATION:8\n' + '#EXTINF:6.640,{}\n' + '/test/ts-files/tvy7/8a5e2822668b5370f4eb1438b2564fb7ab12ffe1-hi720.ts\n' + '#EXT-X-ENDLIST\n' + '\n',
  4236. 'playlist_allow_cache_template': '#EXTM3U\n' + '#EXT-X-TARGETDURATION:10\n' + '#EXT-X-VERSION:{{{version}}}\n' + '{{#if allowCache}}#EXT-X-ALLOW-CACHE:{{{allowCache}}}{{/if}}\n' + '#EXT-X-MEDIA-SEQUENCE:0\n' + '#EXT-X-PLAYLIST-TYPE:VOD\n' + '#EXTINF:10,\n' + '#EXT-X-BYTERANGE:522828@0\n' + 'hls_450k_video.ts\n' + '#EXTINF:10,\n' + '#EXT-X-BYTERANGE:587500@522828\n' + 'hls_450k_video.ts\n' + '#EXTINF:10,\n' + '#EXT-X-BYTERANGE:713084@1110328\n' + 'hls_450k_video.ts\n' + '#EXTINF:10,\n' + '#EXT-X-BYTERANGE:476580@1823412\n' + 'hls_450k_video.ts\n' + '#EXTINF:10,\n' + '#EXT-X-BYTERANGE:535612@2299992\n' + 'hls_450k_video.ts\n' + '#EXTINF:10,\n' + '#EXT-X-BYTERANGE:207176@2835604\n' + 'hls_450k_video.ts\n' + '#EXTINF:10,\n' + '#EXT-X-BYTERANGE:455900@3042780\n' + 'hls_450k_video.ts\n' + '#EXTINF:10,\n' + '#EXT-X-BYTERANGE:657248@3498680\n' + 'hls_450k_video.ts\n' + '#EXTINF:10,\n' + '#EXT-X-BYTERANGE:571708@4155928\n' + 'hls_450k_video.ts\n' + '#EXTINF:10,\n' + '#EXT-X-BYTERANGE:485040@4727636\n' + 'hls_450k_video.ts\n' + '#EXTINF:10,\n' + '#EXT-X-BYTERANGE:709136@5212676\n' + 'hls_450k_video.ts\n' + '#EXTINF:10,\n' + '#EXT-X-BYTERANGE:730004@5921812\n' + 'hls_450k_video.ts\n' + '#EXTINF:10,\n' + '#EXT-X-BYTERANGE:456276@6651816\n' + 'hls_450k_video.ts\n' + '#EXTINF:10,\n' + '#EXT-X-BYTERANGE:468684@7108092\n' + 'hls_450k_video.ts\n' + '#EXTINF:10,\n' + '#EXT-X-BYTERANGE:444996@7576776\n' + 'hls_450k_video.ts\n' + '#EXTINF:10,\n' + '#EXT-X-BYTERANGE:331444@8021772\n' + 'hls_450k_video.ts\n' + '#EXTINF:1.4167,\n' + '#EXT-X-BYTERANGE:44556@8353216\n' + 'hls_450k_video.ts\n' + '#EXT-X-ENDLIST\n',
  4237. 'playlist_byte_range_template': '#EXTM3U\n' + '#EXT-X-TARGETDURATION:10\n' + '#EXT-X-VERSION:{{{version}}}\n' + '#EXT-X-MEDIA-SEQUENCE:0\n' + '#EXT-X-PLAYLIST-TYPE:VOD\n' + '#EXTINF:10,\n' + '{{#if byteRange}}#EXT-X-BYTERANGE:{{{byteRange}}}{{/if}}\n' + '//#EXT-X-BYTERANGE:522828@0\n' + 'hls_450k_video.ts\n' + '#EXTINF:10,\n' + '{{#if byteRange1}}#EXT-X-BYTERANGE:{{{byteRange1}}}{{/if}}\n' + '//#EXT-X-BYTERANGE:587500@522828\n' + 'hls_450k_video.ts\n' + '#EXTINF:10,\n' + '#EXT-X-BYTERANGE:713084@1110328\n' + 'hls_450k_video.ts\n' + '#EXTINF:10,\n' + '#EXT-X-BYTERANGE:476580@1823412\n' + 'hls_450k_video.ts\n' + '#EXTINF:10,\n' + '#EXT-X-BYTERANGE:535612@2299992\n' + 'hls_450k_video.ts\n' + '#EXTINF:10,\n' + '#EXT-X-BYTERANGE:207176@2835604\n' + 'hls_450k_video.ts\n' + '#EXTINF:10,\n' + '#EXT-X-BYTERANGE:455900@3042780\n' + 'hls_450k_video.ts\n' + '#EXTINF:10,\n' + '#EXT-X-BYTERANGE:657248@3498680\n' + 'hls_450k_video.ts\n' + '#EXTINF:10,\n' + '#EXT-X-BYTERANGE:571708@4155928\n' + 'hls_450k_video.ts\n' + '#EXTINF:10,\n' + '#EXT-X-BYTERANGE:485040@4727636\n' + 'hls_450k_video.ts\n' + '#EXTINF:10,\n' + '#EXT-X-BYTERANGE:709136@5212676\n' + 'hls_450k_video.ts\n' + '#EXTINF:10,\n' + '#EXT-X-BYTERANGE:730004@5921812\n' + 'hls_450k_video.ts\n' + '#EXTINF:10,\n' + '#EXT-X-BYTERANGE:456276@6651816\n' + 'hls_450k_video.ts\n' + '#EXTINF:10,\n' + '#EXT-X-BYTERANGE:468684@7108092\n' + 'hls_450k_video.ts\n' + '#EXTINF:10,\n' + '#EXT-X-BYTERANGE:444996@7576776\n' + 'hls_450k_video.ts\n' + '#EXTINF:10,\n' + '#EXT-X-BYTERANGE:331444@8021772\n' + 'hls_450k_video.ts\n' + '#EXTINF:1.4167,\n' + '{{#if byteRange2}}#EXT-X-BYTERANGE:{{{byteRange2}}}{{/if}}\n' + '//#EXT-X-BYTERANGE:44556@8353216\n' + 'hls_450k_video.ts\n' + '#EXT-X-ENDLIST\n',
  4238. 'playlist_extinf_template': '#EXTM3U\n' + ' #EXT-X-TARGETDURATION:10\n' + ' #EXT-X-VERSION:{{{version}}}\n' + ' #EXT-X-MEDIA-SEQUENCE:0\n' + ' #EXT-X-PLAYLIST-TYPE:VOD\n' + ' {{#if extInf}}#EXTINF:{{{extInf}}}{{/if}}\n' + ' #EXT-X-BYTERANGE:522828@0\n' + ' {{#if segment}}{{{segment}}}\n{{/if}}\n' + ' {{#if extInf1}}#EXTINF:{{{extInf1}}}{{/if}}\n' + ' #EXT-X-BYTERANGE:587500@522828\n' + ' hls_450k_video.ts\n' + ' #EXTINF:10,\n' + ' #EXT-X-BYTERANGE:713084@1110328\n' + ' hls_450k_video.ts\n' + ' #EXTINF:10,\n' + ' #EXT-X-BYTERANGE:476580@1823412\n' + ' hls_450k_video.ts\n' + ' #EXTINF:10,\n' + ' #EXT-X-BYTERANGE:535612@2299992\n' + ' hls_450k_video.ts\n' + ' #EXTINF:10,\n' + ' #EXT-X-BYTERANGE:207176@2835604\n' + ' hls_450k_video.ts\n' + ' #EXTINF:10,\n' + ' #EXT-X-BYTERANGE:455900@3042780\n' + ' hls_450k_video.ts\n' + ' #EXTINF:10,\n' + ' #EXT-X-BYTERANGE:657248@3498680\n' + ' hls_450k_video.ts\n' + ' #EXTINF:10,\n' + ' #EXT-X-BYTERANGE:571708@4155928\n' + ' hls_450k_video.ts\n' + ' #EXTINF:10,\n' + ' #EXT-X-BYTERANGE:485040@4727636\n' + ' hls_450k_video.ts\n' + ' #EXTINF:10,\n' + ' #EXT-X-BYTERANGE:709136@5212676\n' + ' hls_450k_video.ts\n' + ' #EXTINF:10,\n' + ' #EXT-X-BYTERANGE:730004@5921812\n' + ' hls_450k_video.ts\n' + ' #EXTINF:10,\n' + ' #EXT-X-BYTERANGE:456276@6651816\n' + ' hls_450k_video.ts\n' + ' #EXTINF:10,\n' + ' #EXT-X-BYTERANGE:468684@7108092\n' + ' hls_450k_video.ts\n' + ' #EXTINF:10,\n' + ' #EXT-X-BYTERANGE:444996@7576776\n' + ' hls_450k_video.ts\n' + ' #EXTINF:10,\n' + ' #EXT-X-BYTERANGE:331444@8021772\n' + ' hls_450k_video.ts\n' + ' {{#if extInf2}}#EXTINF:{{{extInf2}}}{{/if}}\n' + ' #EXT-X-BYTERANGE:44556@8353216\n' + ' hls_450k_video.ts\n' + ' #EXT-X-ENDLIST\n' + '\n',
  4239. 'playlist_media_sequence_template': '#EXTM3U\n' + '#EXT-X-PLAYLIST-TYPE:VOD\n' + '{{#if mediaSequence}}#EXT-X-MEDIA-SEQUENCE:{{{mediaSequence}}}{{/if}}\n' + '{{#if mediaSequence1}}#EXT-X-MEDIA-SEQUENCE:{{{mediaSequence2}}}{{/if}}\n' + '#EXT-X-ALLOW-CACHE:YES\n' + '#EXT-X-TARGETDURATION:8\n' + '#EXTINF:6.640,{}\n' + '/test/ts-files/tvy7/8a5e2822668b5370f4eb1438b2564fb7ab12ffe1-hi720.ts\n' + '#EXTINF:6.080,{}\n' + '/test/ts-files/tvy7/56be1cef869a1c0cc8e38864ad1add17d187f051-hi720.ts\n' + '#EXTINF:6.600,{}\n' + '/test/ts-files/tvy7/549c8c77f55f049741a06596e5c1e01dacaa46d0-hi720.ts\n' + '#EXTINF:5.000,{}\n' + '/test/ts-files/tvy7/6cfa378684ffeb1c455a64dae6c103290a1f53d4-hi720.ts\n' + '#EXT-X-ENDLIST\n' + '\n',
  4240. 'playlist_target_duration_template': '#EXTM3U\n' + '#EXT-X-PLAYLIST-TYPE:VOD\n' + '#EXT-X-MEDIA-SEQUENCE:0\n' + '#EXT-X-ALLOW-CACHE:YES\n' + '{{#if targetDuration}}#EXT-X-TARGETDURATION:{{{targetDuration}}}{{/if}}\n' + '#EXTINF:6.640,{}\n' + '/test/ts-files/tvy7/8a5e2822668b5370f4eb1438b2564fb7ab12ffe1-hi720.ts\n' + '#EXTINF:6.080,{}\n' + '/test/ts-files/tvy7/56be1cef869a1c0cc8e38864ad1add17d187f051-hi720.ts\n' + '#EXTINF:6.600,{}\n' + '/test/ts-files/tvy7/549c8c77f55f049741a06596e5c1e01dacaa46d0-hi720.ts\n' + '#EXTINF:5.000,{}\n' + '/test/ts-files/tvy7/6cfa378684ffeb1c455a64dae6c103290a1f53d4-hi720.ts\n' + '#EXT-X-ENDLIST\n' + '\n',
  4241. 'playlist_type_template': '#EXTM3U\n' + '{{#if playlistType}}#EXT-X-PLAYLIST-TYPE:{{{playlistType}}}{{/if}}\n' + '#EXT-X-TARGETDURATION:10\n' + '#EXTINF:10,\n' + '/test/ts-files/zencoder/haze/Haze_Mantel_President_encoded_1200-00001.ts\n' + '#EXTINF:10,\n' + '/test/ts-files/zencoder/haze/Haze_Mantel_President_encoded_1200-00002.ts\n' + '#EXTINF:10,\n' + '/test/ts-files/zencoder/haze/Haze_Mantel_President_encoded_1200-00003.ts\n' + '#EXTINF:10,\n' + '/test/ts-files/zencoder/haze/Haze_Mantel_President_encoded_1200-00004.ts\n' + '#EXTINF:10,\n' + '/test/ts-files/zencoder/haze/Haze_Mantel_President_encoded_1200-00005.ts\n' + '#EXTINF:8,\n' + '/test/ts-files/zencoder/haze/Haze_Mantel_President_encoded_1200-00006.ts\n' + '#ZEN-TOTAL-DURATION:57.9911\n' + '#EXT-X-ENDLIST\n' + '\n',
  4242. 'streamInfInvalid': '# A simple master playlist with multiple variant streams\n' + '#EXTM3U\n' + '#EXT-X-STREAM-INF:PROGRAM-ID=1\n' + 'media.m3u8\n' + '#EXT-X-STREAM-INF:\n' + 'media1.m3u8\n' + '\n',
  4243. 'twoMediaSequences': '#EXTM3U\n' + '#EXT-X-PLAYLIST-TYPE:VOD\n' + '#EXT-X-MEDIA-SEQUENCE:0\n' + '#EXT-X-MEDIA-SEQUENCE:11\n' + '#EXT-X-ALLOW-CACHE:YES\n' + '#EXT-X-TARGETDURATION:8\n' + '#EXTINF:6.640,{}\n' + '/test/ts-files/tvy7/8a5e2822668b5370f4eb1438b2564fb7ab12ffe1-hi720.ts\n' + '#EXTINF:6.080,{}\n' + '/test/ts-files/tvy7/56be1cef869a1c0cc8e38864ad1add17d187f051-hi720.ts\n' + '#EXTINF:6.600,{}\n' + '/test/ts-files/tvy7/549c8c77f55f049741a06596e5c1e01dacaa46d0-hi720.ts\n' + '#EXTINF:5.000,{}\n' + '/test/ts-files/tvy7/6cfa378684ffeb1c455a64dae6c103290a1f53d4-hi720.ts\n' + '#EXT-X-ENDLIST\n' + '\n',
  4244. 'versionInvalid': '#EXTM3U\n' + '#EXT-X-TARGETDURATION:10\n' + '#EXT-X-VERSION:NaN\n' + '#EXT-X-MEDIA-SEQUENCE:0\n' + '#EXT-X-PLAYLIST-TYPE:VOD\n' + '#EXTINF:10,\n' + 'hls_450k_video.ts\n' + '#EXT-X-ENDLIST\n' + '\n',
  4245. 'whiteSpace': '#EXTM3U\n' + '#EXT-X-PLAYLIST-TYPE:VOD\n' + '#EXT-X-TARGETDURATION:10\n' + ' \n' + '#EXTINF:10,\n' + 'http://example.com/00001.ts \n' + '#EXTINF:10,\n' + ' https://example.com/00002.ts\n' + '#EXTINF:10,\n' + ' //example.com/00003.ts \n' + '#EXTINF:10,\n' + ' http://example.com/00004.ts\n' + '#ZEN-TOTAL-DURATION:57.9911\n' + '#EXT-X-ENDLIST\n' + '\n',
  4246. 'zeroDuration': '#EXTM3U\n' + '#EXT-X-PLAYLIST-TYPE:VOD\n' + '#EXT-X-TARGETDURATION:10\n' + '\n' + '#EXTINF:0,\n' + 'http://example.com/00001.ts\n' + '#ZEN-TOTAL-DURATION:57.9911\n' + '#EXT-X-ENDLIST\n' + '\n'
  4247. };
  4248. },{}]},{},[6]);