p2p-media-loader-shaka
Advanced tools
Comparing version 0.6.1 to 0.6.2
@@ -41,10 +41,2 @@ require=(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){ | ||
*/ | ||
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { | ||
return new (P || (P = Promise))(function (resolve, reject) { | ||
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } | ||
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } | ||
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } | ||
step((generator = generator.apply(thisArg, _arguments || [])).next()); | ||
}); | ||
}; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
@@ -56,5 +48,2 @@ const events_1 = require("events"); | ||
class Engine extends events_1.EventEmitter { | ||
static isSupported() { | ||
return p2p_media_loader_core_1.HybridLoader.isSupported(); | ||
} | ||
constructor(settings = {}) { | ||
@@ -68,7 +57,8 @@ super(); | ||
} | ||
destroy() { | ||
return __awaiter(this, void 0, void 0, function* () { | ||
yield this.segmentManager.destroy(); | ||
}); | ||
static isSupported() { | ||
return p2p_media_loader_core_1.HybridLoader.isSupported(); | ||
} | ||
async destroy() { | ||
await this.segmentManager.destroy(); | ||
} | ||
getSettings() { | ||
@@ -108,10 +98,2 @@ return { | ||
*/ | ||
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { | ||
return new (P || (P = Promise))(function (resolve, reject) { | ||
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } | ||
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } | ||
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } | ||
step((generator = generator.apply(thisArg, _arguments || [])).next()); | ||
}); | ||
}; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
@@ -127,3 +109,3 @@ const Debug = require("debug"); | ||
let lastPlayheadTimeReported = 0; | ||
player.addEventListener("loading", () => __awaiter(this, void 0, void 0, function* () { | ||
player.addEventListener("loading", async () => { | ||
if (intervalId > 0) { | ||
@@ -138,3 +120,3 @@ clearInterval(intervalId); | ||
} | ||
yield segmentManager.destroy(); | ||
await segmentManager.destroy(); | ||
intervalId = setInterval(() => { | ||
@@ -147,3 +129,3 @@ const time = getPlayheadTime(player); | ||
}, 500); | ||
})); | ||
}); | ||
debug("register request filter"); | ||
@@ -196,11 +178,11 @@ player.getNetworkingEngine().registerRequestFilter((requestType, request) => { | ||
const promise = segmentManager.load(segment, utils_1.getSchemedUri(player.getAssetUri ? player.getAssetUri() : player.getManifestUri()), getPlayheadTime(player)); | ||
const abort = () => __awaiter(this, void 0, void 0, function* () { | ||
const abort = async () => { | ||
debug("request", "abort", segment.identity); | ||
// TODO: implement abort in SegmentManager | ||
}); | ||
}; | ||
return new shaka.util.AbortableOperation(promise, abort); | ||
} | ||
else if (assetsStorage) { // load or store the asset using assets storage | ||
const responsePromise = (() => __awaiter(this, void 0, void 0, function* () { | ||
const asset = yield assetsStorage.getAsset(uri, request.headers.Range, masterSwarmId); | ||
const responsePromise = (async () => { | ||
const asset = await assetsStorage.getAsset(uri, request.headers.Range, masterSwarmId); | ||
if (asset !== undefined) { | ||
@@ -214,3 +196,3 @@ return { | ||
else { | ||
const response = yield shaka.net.HttpXHRPlugin(uri, request, requestType, progressUpdated).promise; | ||
const response = await shaka.net.HttpXHRPlugin(uri, request, requestType, progressUpdated).promise; | ||
assetsStorage.storeAsset({ | ||
@@ -226,4 +208,4 @@ masterManifestUri: masterManifestUri, | ||
} | ||
}))(); | ||
return new shaka.util.AbortableOperation(responsePromise, () => __awaiter(this, void 0, void 0, function* () { })); | ||
})(); | ||
return new shaka.util.AbortableOperation(responsePromise, async () => { }); | ||
} | ||
@@ -454,10 +436,2 @@ else { // load asset using default plugin | ||
*/ | ||
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { | ||
return new (P || (P = Promise))(function (resolve, reject) { | ||
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } | ||
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } | ||
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } | ||
step((generator = generator.apply(thisArg, _arguments || [])).next()); | ||
}); | ||
}; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
@@ -501,3 +475,3 @@ const Debug = require("debug"); | ||
}; | ||
this.settings = Object.assign({}, defaultSettings, settings); | ||
this.settings = Object.assign(Object.assign({}, defaultSettings), settings); | ||
this.loader = loader; | ||
@@ -508,18 +482,16 @@ this.loader.on(p2p_media_loader_core_1.Events.SegmentLoaded, this.onSegmentLoaded); | ||
} | ||
destroy() { | ||
return __awaiter(this, void 0, void 0, function* () { | ||
if (this.requests.size !== 0) { | ||
console.error("Destroying segment manager with active request(s)!"); | ||
for (const request of this.requests.values()) { | ||
this.reportError(request, "Request aborted due to destroy call"); | ||
} | ||
this.requests.clear(); | ||
async destroy() { | ||
if (this.requests.size !== 0) { | ||
console.error("Destroying segment manager with active request(s)!"); | ||
for (const request of this.requests.values()) { | ||
this.reportError(request, "Request aborted due to destroy call"); | ||
} | ||
this.playheadTime = 0; | ||
this.segmentHistory.splice(0); | ||
if (this.settings.assetsStorage !== undefined) { | ||
yield this.settings.assetsStorage.destroy(); | ||
} | ||
yield this.loader.destroy(); | ||
}); | ||
this.requests.clear(); | ||
} | ||
this.playheadTime = 0; | ||
this.segmentHistory.splice(0); | ||
if (this.settings.assetsStorage !== undefined) { | ||
await this.settings.assetsStorage.destroy(); | ||
} | ||
await this.loader.destroy(); | ||
} | ||
@@ -529,19 +501,17 @@ getSettings() { | ||
} | ||
load(parserSegment, manifestUri, playheadTime) { | ||
return __awaiter(this, void 0, void 0, function* () { | ||
this.manifestUri = manifestUri; | ||
this.playheadTime = playheadTime; | ||
this.pushSegmentHistory(parserSegment); | ||
const lastRequestedSegment = this.refreshLoad(); | ||
const alreadyLoadedSegment = yield this.loader.getSegment(lastRequestedSegment.id); | ||
return new Promise((resolve, reject) => { | ||
const request = new Request(lastRequestedSegment.id, resolve, reject); | ||
if (alreadyLoadedSegment) { | ||
this.reportSuccess(request, alreadyLoadedSegment); | ||
} | ||
else { | ||
this.debug("request add", request.id); | ||
this.requests.set(request.id, request); | ||
} | ||
}); | ||
async load(parserSegment, manifestUri, playheadTime) { | ||
this.manifestUri = manifestUri; | ||
this.playheadTime = playheadTime; | ||
this.pushSegmentHistory(parserSegment); | ||
const lastRequestedSegment = this.refreshLoad(); | ||
const alreadyLoadedSegment = await this.loader.getSegment(lastRequestedSegment.id); | ||
return new Promise((resolve, reject) => { | ||
const request = new Request(lastRequestedSegment.id, resolve, reject); | ||
if (alreadyLoadedSegment) { | ||
this.reportSuccess(request, alreadyLoadedSegment); | ||
} | ||
else { | ||
this.debug("request add", request.id); | ||
this.requests.set(request.id, request); | ||
} | ||
}); | ||
@@ -578,5 +548,12 @@ } | ||
const masterSwarmId = utils_1.getMasterSwarmId(this.manifestUri, this.settings); | ||
const loaderSegments = sequence.map((s, i) => { | ||
return new p2p_media_loader_core_1.Segment(`${masterSwarmId}+${s.streamIdentity}+${s.identity}`, s.uri, masterSwarmId, this.manifestUri, s.streamIdentity, s.identity, s.range, i); | ||
}); | ||
const loaderSegments = sequence.map((s, i) => ({ | ||
id: `${masterSwarmId}+${s.streamIdentity}+${s.identity}`, | ||
url: s.uri, | ||
masterSwarmId: masterSwarmId, | ||
masterManifestUri: this.manifestUri, | ||
streamId: s.streamIdentity, | ||
sequence: s.identity, | ||
range: s.range, | ||
priority: i, | ||
})); | ||
this.loader.load(loaderSegments, `${masterSwarmId}+${lastRequestedSegment.streamIdentity}`); | ||
@@ -598,3 +575,3 @@ return loaderSegments[lastRequestedSegmentIndex]; | ||
let timeMs; | ||
if (loaderSegment.downloadBandwidth > 0 && loaderSegment.data && loaderSegment.data.byteLength > 0) { | ||
if (loaderSegment.downloadBandwidth !== undefined && loaderSegment.downloadBandwidth > 0 && loaderSegment.data && loaderSegment.data.byteLength > 0) { | ||
timeMs = Math.trunc(loaderSegment.data.byteLength / loaderSegment.downloadBandwidth); | ||
@@ -667,7 +644,10 @@ } | ||
*/ | ||
function __export(m) { | ||
for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; | ||
} | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.version = "0.6.1"; | ||
var engine_1 = require("./engine"); | ||
exports.Engine = engine_1.Engine; | ||
exports.version = "0.6.2"; | ||
__export(require("./engine")); | ||
__export(require("./segment-manager")); | ||
},{"./engine":2}]},{},[1]); | ||
},{"./engine":2,"./segment-manager":6}]},{},[1]); |
@@ -1,1 +0,1 @@ | ||
require=function e(t,s,r){function i(a,o){if(!s[a]){if(!t[a]){var d="function"==typeof require&&require;if(!o&&d)return d(a,!0);if(n)return n(a,!0);var h=new Error("Cannot find module '"+a+"'");throw h.code="MODULE_NOT_FOUND",h}var g=s[a]={exports:{}};t[a][0].call(g.exports,function(e){return i(t[a][1][e]||e)},g,g.exports,e,t,s,r)}return s[a].exports}for(var n="function"==typeof require&&require,a=0;a<r.length;a++)i(r[a]);return i}({1:[function(e,t,s){window.p2pml||(window.p2pml={}),window.p2pml.shaka=e("p2p-media-loader-shaka")},{"p2p-media-loader-shaka":"p2p-media-loader-shaka"}],2:[function(e,t,s){"use strict";var r=this&&this.__awaiter||function(e,t,s,r){return new(s||(s=Promise))(function(i,n){function a(e){try{d(r.next(e))}catch(e){n(e)}}function o(e){try{d(r.throw(e))}catch(e){n(e)}}function d(e){e.done?i(e.value):new s(function(t){t(e.value)}).then(a,o)}d((r=r.apply(e,t||[])).next())})};Object.defineProperty(s,"__esModule",{value:!0});const i=e("events"),n=e("p2p-media-loader-core"),a=e("./segment-manager"),o=e("./integration");s.Engine=class extends i.EventEmitter{static isSupported(){return n.HybridLoader.isSupported()}constructor(e={}){super(),this.loader=new n.HybridLoader(e.loader),this.segmentManager=new a.SegmentManager(this.loader,e.segments),Object.keys(n.Events).map(e=>n.Events[e]).forEach(e=>this.loader.on(e,(...t)=>this.emit(e,...t)))}destroy(){return r(this,void 0,void 0,function*(){yield this.segmentManager.destroy()})}getSettings(){return{segments:this.segmentManager.getSettings(),loader:this.loader.getSettings()}}getDetails(){return{loader:this.loader.getDetails()}}initShakaPlayer(e){o.initShakaPlayer(e,this.segmentManager)}}},{"./integration":3,"./segment-manager":6,events:"events","p2p-media-loader-core":"p2p-media-loader-core"}],3:[function(e,t,s){"use strict";var r=this&&this.__awaiter||function(e,t,s,r){return new(s||(s=Promise))(function(i,n){function a(e){try{d(r.next(e))}catch(e){n(e)}}function o(e){try{d(r.throw(e))}catch(e){n(e)}}function d(e){e.done?i(e.value):new s(function(t){t(e.value)}).then(a,o)}d((r=r.apply(e,t||[])).next())})};Object.defineProperty(s,"__esModule",{value:!0});const i=e("debug"),n=e("./manifest-parser-proxy"),a=e("./utils"),o=i("p2pml:shaka:index");function d(e,t,s,i){if(!t.p2pml)return shaka.net.HttpXHRPlugin(e,t,s,i);const{player:n,segmentManager:d}=t.p2pml;let g,u,l,c=d.getSettings().assetsStorage;void 0!==c&&void 0!==n.getNetworkingEngine().p2pml&&void 0!==n.getNetworkingEngine().p2pml.masterManifestUri?(g=n.getNetworkingEngine().p2pml.masterManifestUri,u=a.getMasterSwarmId(g,d.getSettings())):c=void 0;const m=n.getManifest();if(s===shaka.net.NetworkingEngine.RequestType.SEGMENT&&null!==m&&void 0!==m.p2pml&&void 0!==m.p2pml.parser&&(l=m.p2pml.parser.find(e,t.headers.Range)),void 0!==l&&"video"===l.streamType){o("request","load",l.identity);const e=d.load(l,a.getSchemedUri(n.getAssetUri?n.getAssetUri():n.getManifestUri()),h(n)),t=()=>r(this,void 0,void 0,function*(){o("request","abort",l.identity)});return new shaka.util.AbortableOperation(e,t)}if(c){const n=(()=>r(this,void 0,void 0,function*(){const r=yield c.getAsset(e,t.headers.Range,u);if(void 0!==r)return{data:r.data,uri:r.responseUri,fromCache:!0};{const r=yield shaka.net.HttpXHRPlugin(e,t,s,i).promise;return c.storeAsset({masterManifestUri:g,masterSwarmId:u,requestUri:e,requestRange:t.headers.Range,responseUri:r.uri,data:r.data}),r}}))();return new shaka.util.AbortableOperation(n,()=>r(this,void 0,void 0,function*(){}))}return shaka.net.HttpXHRPlugin(e,t,s,i)}function h(e){let t=0;const s=e.getPlayheadTimeAsDate();return s&&(t=s.valueOf(),e.isLive()&&(t-=e.getPresentationStartTimeAsDate().valueOf()),t/=1e3),t}s.initShakaPlayer=function(e,t){o("register parser proxies"),shaka.media.ManifestParser.registerParserByExtension("mpd",n.ShakaDashManifestParserProxy),shaka.media.ManifestParser.registerParserByMime("application/dash+xml",n.ShakaDashManifestParserProxy),shaka.media.ManifestParser.registerParserByExtension("m3u8",n.ShakaHlsManifestParserProxy),shaka.media.ManifestParser.registerParserByMime("application/x-mpegurl",n.ShakaHlsManifestParserProxy),shaka.media.ManifestParser.registerParserByMime("application/vnd.apple.mpegurl",n.ShakaHlsManifestParserProxy),o("init networking engine"),shaka.net.NetworkingEngine.registerScheme("http",d),shaka.net.NetworkingEngine.registerScheme("https",d);let s=0,i=0;e.addEventListener("loading",()=>r(this,void 0,void 0,function*(){s>0&&(clearInterval(s),s=0),i=0;const r=e.getManifest();r&&r.p2pml&&r.p2pml.parser.reset(),yield t.destroy(),s=setInterval(()=>{const s=h(e);(s!==i||e.isBuffering())&&(t.setPlayheadTime(s),i=s)},500)})),o("register request filter"),e.getNetworkingEngine().registerRequestFilter((s,r)=>{r.p2pml={player:e,segmentManager:t}})}},{"./manifest-parser-proxy":4,"./utils":7,debug:"debug"}],4:[function(e,t,s){"use strict";Object.defineProperty(s,"__esModule",{value:!0});const r=e("./parser-segment");class i{constructor(e){this.cache=new r.ParserSegmentCache(200),this.originalManifestParser=e}isHls(){return this.originalManifestParser instanceof shaka.hls.HlsParser}isDash(){return this.originalManifestParser instanceof shaka.dash.DashParser}start(e,t){return void 0===t.networkingEngine.p2pml&&(t.networkingEngine.p2pml={}),t.networkingEngine.p2pml.masterManifestUri=e,this.originalManifestParser.start(e,t).then(e=>{this.manifest=e;for(const t of e.periods){const e=[];for(const s of t.variants)null!=s.video&&-1==e.indexOf(s.video)&&(this.hookGetSegmentReference(s.video),e.push(s.video)),null!=s.audio&&-1==e.indexOf(s.audio)&&(this.hookGetSegmentReference(s.audio),e.push(s.audio))}return e.p2pml={parser:this},e})}configure(e){return this.originalManifestParser.configure(e)}stop(){return this.originalManifestParser.stop()}update(){return this.originalManifestParser.update()}onExpirationUpdated(){return this.originalManifestParser.onExpirationUpdated()}find(e,t){return this.cache.find(e,t)}reset(){this.cache.clear()}hookGetSegmentReference(e){e.getSegmentReferenceOriginal=e.getSegmentReference,e.getSegmentReference=t=>(this.cache.add(e,t),e.getSegmentReferenceOriginal(t)),e.getPosition=()=>this.isHls()&&"video"===e.type?this.manifest.periods[0].variants.reduce((e,t)=>(t.video&&t.video.id&&!e.includes(t.video.id)&&e.push(t.video.id),e),[]).indexOf(e.id):-1}}s.ShakaManifestParserProxy=i;s.ShakaDashManifestParserProxy=class extends i{constructor(){super(new shaka.dash.DashParser)}};s.ShakaHlsManifestParserProxy=class extends i{constructor(){super(new shaka.hls.HlsParser)}}},{"./parser-segment":5}],5:[function(e,t,s){"use strict";Object.defineProperty(s,"__esModule",{value:!0});const r=e("./utils");class i{constructor(e,t,s,r,i,n,a,o,d,h,g,u){this.streamId=e,this.streamType=t,this.streamPosition=s,this.streamIdentity=r,this.identity=i,this.position=n,this.start=a,this.end=o,this.uri=d,this.range=h,this.prev=g,this.next=u}static create(e,t){const s=e.getSegmentReferenceOriginal(t);if(!s)return;const n=s.createUris();if(!n||0===n.length)return;const a=s.getStartTime(),o=s.getEndTime(),d=s.getStartByte(),h=s.getEndByte(),g=d||h?`bytes=${d||""}-${h||""}`:void 0,u=e.type.substring(0,1).toUpperCase(),l=e.getPosition(),c=l>=0,m=c?`${u}${l}`:`${u}${e.id}`,p=c?`${t}`:`${Number(a).toFixed(3)}`;return new i(e.id,e.type,l,m,p,t,a,o,r.getSchemedUri(n[0]),g,()=>i.create(e,t-1),()=>i.create(e,t+1))}}s.ParserSegment=i;s.ParserSegmentCache=class{constructor(e){this.segments=[],this.maxSegments=e}find(e,t){return this.segments.find(s=>s.uri===e&&s.range===t)}add(e,t){const s=i.create(e,t);s&&!this.find(s.uri,s.range)&&(this.segments.push(s),this.segments.length>this.maxSegments&&this.segments.splice(0,.2*this.maxSegments))}clear(){this.segments.splice(0)}}},{"./utils":7}],6:[function(e,t,s){"use strict";var r=this&&this.__awaiter||function(e,t,s,r){return new(s||(s=Promise))(function(i,n){function a(e){try{d(r.next(e))}catch(e){n(e)}}function o(e){try{d(r.throw(e))}catch(e){n(e)}}function d(e){e.done?i(e.value):new s(function(t){t(e.value)}).then(a,o)}d((r=r.apply(e,t||[])).next())})};Object.defineProperty(s,"__esModule",{value:!0});const i=e("debug"),n=e("p2p-media-loader-core"),a=e("./utils"),o={forwardSegmentCount:20,maxHistorySegments:50,swarmId:void 0,assetsStorage:void 0};s.SegmentManager=class{constructor(e,t={}){this.debug=i("p2pml:shaka:sm"),this.requests=new Map,this.manifestUri="",this.playheadTime=0,this.segmentHistory=[],this.onSegmentLoaded=e=>{this.requests.has(e.id)&&(this.reportSuccess(this.requests.get(e.id),e),this.debug("request delete",e.id),this.requests.delete(e.id))},this.onSegmentError=(e,t)=>{this.requests.has(e.id)&&(this.reportError(this.requests.get(e.id),t),this.debug("request delete from error",e.id),this.requests.delete(e.id))},this.onSegmentAbort=e=>{this.requests.has(e.id)&&(this.reportError(this.requests.get(e.id),"Internal abort"),this.debug("request delete from abort",e.id),this.requests.delete(e.id))},this.settings=Object.assign({},o,t),this.loader=e,this.loader.on(n.Events.SegmentLoaded,this.onSegmentLoaded),this.loader.on(n.Events.SegmentError,this.onSegmentError),this.loader.on(n.Events.SegmentAbort,this.onSegmentAbort)}destroy(){return r(this,void 0,void 0,function*(){if(0!==this.requests.size){console.error("Destroying segment manager with active request(s)!");for(const e of this.requests.values())this.reportError(e,"Request aborted due to destroy call");this.requests.clear()}this.playheadTime=0,this.segmentHistory.splice(0),void 0!==this.settings.assetsStorage&&(yield this.settings.assetsStorage.destroy()),yield this.loader.destroy()})}getSettings(){return this.settings}load(e,t,s){return r(this,void 0,void 0,function*(){this.manifestUri=t,this.playheadTime=s,this.pushSegmentHistory(e);const r=this.refreshLoad(),i=yield this.loader.getSegment(r.id);return new Promise((e,t)=>{const s=new d(r.id,e,t);i?this.reportSuccess(s,i):(this.debug("request add",s.id),this.requests.set(s.id,s))})})}setPlayheadTime(e){this.playheadTime=e,this.segmentHistory.length>0&&this.refreshLoad()}refreshLoad(){const e=this.segmentHistory[this.segmentHistory.length-1],t=this.playheadTime>.1?this.playheadTime:e.start,s=this.segmentHistory.reduce((e,s)=>(s.start>=t&&e.push(s),e),[]);0===s.length&&s.push(e);const r=s.length-1;do{const e=s[s.length-1].next();if(!e)break;s.push(e)}while(s.length<this.settings.forwardSegmentCount);const i=a.getMasterSwarmId(this.manifestUri,this.settings),o=s.map((e,t)=>new n.Segment(`${i}+${e.streamIdentity}+${e.identity}`,e.uri,i,this.manifestUri,e.streamIdentity,e.identity,e.range,t));return this.loader.load(o,`${i}+${e.streamIdentity}`),o[r]}pushSegmentHistory(e){this.segmentHistory.length>=this.settings.maxHistorySegments&&(this.debug("segment history auto shrink"),this.segmentHistory.splice(0,.2*this.settings.maxHistorySegments)),this.segmentHistory.length>0&&this.segmentHistory[this.segmentHistory.length-1].start>e.start&&(this.debug("segment history reset due to playhead seek back"),this.segmentHistory.splice(0)),this.segmentHistory.push(e)}reportSuccess(e,t){let s;t.downloadBandwidth>0&&t.data&&t.data.byteLength>0&&(s=Math.trunc(t.data.byteLength/t.downloadBandwidth)),this.debug("report success",e.id),e.resolve({data:t.data,timeMs:s})}reportError(e,t){e.reject&&(this.debug("report error",e.id),e.reject(t))}};class d{constructor(e,t,s){this.id=e,this.resolve=t,this.reject=s}}},{"./utils":7,debug:"debug","p2p-media-loader-core":"p2p-media-loader-core"}],7:[function(e,t,s){"use strict";Object.defineProperty(s,"__esModule",{value:!0}),s.getSchemedUri=function(e){return e.startsWith("//")?window.location.protocol+e:e},s.getMasterSwarmId=function(e,t){return t.swarmId&&0!==t.swarmId.length?t.swarmId:e.split("?")[0]}},{}],"p2p-media-loader-shaka":[function(e,t,s){"use strict";Object.defineProperty(s,"__esModule",{value:!0}),s.version="0.6.1";var r=e("./engine");s.Engine=r.Engine},{"./engine":2}]},{},[1]); | ||
require=function e(t,s,r){function i(n,o){if(!s[n]){if(!t[n]){var d="function"==typeof require&&require;if(!o&&d)return d(n,!0);if(a)return a(n,!0);var h=new Error("Cannot find module '"+n+"'");throw h.code="MODULE_NOT_FOUND",h}var g=s[n]={exports:{}};t[n][0].call(g.exports,function(e){return i(t[n][1][e]||e)},g,g.exports,e,t,s,r)}return s[n].exports}for(var a="function"==typeof require&&require,n=0;n<r.length;n++)i(r[n]);return i}({1:[function(e,t,s){window.p2pml||(window.p2pml={}),window.p2pml.shaka=e("p2p-media-loader-shaka")},{"p2p-media-loader-shaka":"p2p-media-loader-shaka"}],2:[function(e,t,s){"use strict";Object.defineProperty(s,"__esModule",{value:!0});const r=e("events"),i=e("p2p-media-loader-core"),a=e("./segment-manager"),n=e("./integration");s.Engine=class extends r.EventEmitter{constructor(e={}){super(),this.loader=new i.HybridLoader(e.loader),this.segmentManager=new a.SegmentManager(this.loader,e.segments),Object.keys(i.Events).map(e=>i.Events[e]).forEach(e=>this.loader.on(e,(...t)=>this.emit(e,...t)))}static isSupported(){return i.HybridLoader.isSupported()}async destroy(){await this.segmentManager.destroy()}getSettings(){return{segments:this.segmentManager.getSettings(),loader:this.loader.getSettings()}}getDetails(){return{loader:this.loader.getDetails()}}initShakaPlayer(e){n.initShakaPlayer(e,this.segmentManager)}}},{"./integration":3,"./segment-manager":6,events:"events","p2p-media-loader-core":"p2p-media-loader-core"}],3:[function(e,t,s){"use strict";Object.defineProperty(s,"__esModule",{value:!0});const r=e("debug"),i=e("./manifest-parser-proxy"),a=e("./utils"),n=r("p2pml:shaka:index");function o(e,t,s,r){if(!t.p2pml)return shaka.net.HttpXHRPlugin(e,t,s,r);const{player:i,segmentManager:o}=t.p2pml;let h,g,u,l=o.getSettings().assetsStorage;void 0!==l&&void 0!==i.getNetworkingEngine().p2pml&&void 0!==i.getNetworkingEngine().p2pml.masterManifestUri?(h=i.getNetworkingEngine().p2pml.masterManifestUri,g=a.getMasterSwarmId(h,o.getSettings())):l=void 0;const m=i.getManifest();if(s===shaka.net.NetworkingEngine.RequestType.SEGMENT&&null!==m&&void 0!==m.p2pml&&void 0!==m.p2pml.parser&&(u=m.p2pml.parser.find(e,t.headers.Range)),void 0!==u&&"video"===u.streamType){n("request","load",u.identity);const e=o.load(u,a.getSchemedUri(i.getAssetUri?i.getAssetUri():i.getManifestUri()),d(i)),t=async()=>{n("request","abort",u.identity)};return new shaka.util.AbortableOperation(e,t)}if(l){const i=(async()=>{const i=await l.getAsset(e,t.headers.Range,g);if(void 0!==i)return{data:i.data,uri:i.responseUri,fromCache:!0};{const i=await shaka.net.HttpXHRPlugin(e,t,s,r).promise;return l.storeAsset({masterManifestUri:h,masterSwarmId:g,requestUri:e,requestRange:t.headers.Range,responseUri:i.uri,data:i.data}),i}})();return new shaka.util.AbortableOperation(i,async()=>{})}return shaka.net.HttpXHRPlugin(e,t,s,r)}function d(e){let t=0;const s=e.getPlayheadTimeAsDate();return s&&(t=s.valueOf(),e.isLive()&&(t-=e.getPresentationStartTimeAsDate().valueOf()),t/=1e3),t}s.initShakaPlayer=function(e,t){n("register parser proxies"),shaka.media.ManifestParser.registerParserByExtension("mpd",i.ShakaDashManifestParserProxy),shaka.media.ManifestParser.registerParserByMime("application/dash+xml",i.ShakaDashManifestParserProxy),shaka.media.ManifestParser.registerParserByExtension("m3u8",i.ShakaHlsManifestParserProxy),shaka.media.ManifestParser.registerParserByMime("application/x-mpegurl",i.ShakaHlsManifestParserProxy),shaka.media.ManifestParser.registerParserByMime("application/vnd.apple.mpegurl",i.ShakaHlsManifestParserProxy),n("init networking engine"),shaka.net.NetworkingEngine.registerScheme("http",o),shaka.net.NetworkingEngine.registerScheme("https",o);let s=0,r=0;e.addEventListener("loading",async()=>{s>0&&(clearInterval(s),s=0),r=0;const i=e.getManifest();i&&i.p2pml&&i.p2pml.parser.reset(),await t.destroy(),s=setInterval(()=>{const s=d(e);(s!==r||e.isBuffering())&&(t.setPlayheadTime(s),r=s)},500)}),n("register request filter"),e.getNetworkingEngine().registerRequestFilter((s,r)=>{r.p2pml={player:e,segmentManager:t}})}},{"./manifest-parser-proxy":4,"./utils":7,debug:"debug"}],4:[function(e,t,s){"use strict";Object.defineProperty(s,"__esModule",{value:!0});const r=e("./parser-segment");class i{constructor(e){this.cache=new r.ParserSegmentCache(200),this.originalManifestParser=e}isHls(){return this.originalManifestParser instanceof shaka.hls.HlsParser}isDash(){return this.originalManifestParser instanceof shaka.dash.DashParser}start(e,t){return void 0===t.networkingEngine.p2pml&&(t.networkingEngine.p2pml={}),t.networkingEngine.p2pml.masterManifestUri=e,this.originalManifestParser.start(e,t).then(e=>{this.manifest=e;for(const t of e.periods){const e=[];for(const s of t.variants)null!=s.video&&-1==e.indexOf(s.video)&&(this.hookGetSegmentReference(s.video),e.push(s.video)),null!=s.audio&&-1==e.indexOf(s.audio)&&(this.hookGetSegmentReference(s.audio),e.push(s.audio))}return e.p2pml={parser:this},e})}configure(e){return this.originalManifestParser.configure(e)}stop(){return this.originalManifestParser.stop()}update(){return this.originalManifestParser.update()}onExpirationUpdated(){return this.originalManifestParser.onExpirationUpdated()}find(e,t){return this.cache.find(e,t)}reset(){this.cache.clear()}hookGetSegmentReference(e){e.getSegmentReferenceOriginal=e.getSegmentReference,e.getSegmentReference=t=>(this.cache.add(e,t),e.getSegmentReferenceOriginal(t)),e.getPosition=()=>this.isHls()&&"video"===e.type?this.manifest.periods[0].variants.reduce((e,t)=>(t.video&&t.video.id&&!e.includes(t.video.id)&&e.push(t.video.id),e),[]).indexOf(e.id):-1}}s.ShakaManifestParserProxy=i;s.ShakaDashManifestParserProxy=class extends i{constructor(){super(new shaka.dash.DashParser)}};s.ShakaHlsManifestParserProxy=class extends i{constructor(){super(new shaka.hls.HlsParser)}}},{"./parser-segment":5}],5:[function(e,t,s){"use strict";Object.defineProperty(s,"__esModule",{value:!0});const r=e("./utils");class i{constructor(e,t,s,r,i,a,n,o,d,h,g,u){this.streamId=e,this.streamType=t,this.streamPosition=s,this.streamIdentity=r,this.identity=i,this.position=a,this.start=n,this.end=o,this.uri=d,this.range=h,this.prev=g,this.next=u}static create(e,t){const s=e.getSegmentReferenceOriginal(t);if(!s)return;const a=s.createUris();if(!a||0===a.length)return;const n=s.getStartTime(),o=s.getEndTime(),d=s.getStartByte(),h=s.getEndByte(),g=d||h?`bytes=${d||""}-${h||""}`:void 0,u=e.type.substring(0,1).toUpperCase(),l=e.getPosition(),m=l>=0,c=m?`${u}${l}`:`${u}${e.id}`,p=m?`${t}`:`${Number(n).toFixed(3)}`;return new i(e.id,e.type,l,c,p,t,n,o,r.getSchemedUri(a[0]),g,()=>i.create(e,t-1),()=>i.create(e,t+1))}}s.ParserSegment=i;s.ParserSegmentCache=class{constructor(e){this.segments=[],this.maxSegments=e}find(e,t){return this.segments.find(s=>s.uri===e&&s.range===t)}add(e,t){const s=i.create(e,t);s&&!this.find(s.uri,s.range)&&(this.segments.push(s),this.segments.length>this.maxSegments&&this.segments.splice(0,.2*this.maxSegments))}clear(){this.segments.splice(0)}}},{"./utils":7}],6:[function(e,t,s){"use strict";Object.defineProperty(s,"__esModule",{value:!0});const r=e("debug"),i=e("p2p-media-loader-core"),a=e("./utils"),n={forwardSegmentCount:20,maxHistorySegments:50,swarmId:void 0,assetsStorage:void 0};s.SegmentManager=class{constructor(e,t={}){this.debug=r("p2pml:shaka:sm"),this.requests=new Map,this.manifestUri="",this.playheadTime=0,this.segmentHistory=[],this.onSegmentLoaded=e=>{this.requests.has(e.id)&&(this.reportSuccess(this.requests.get(e.id),e),this.debug("request delete",e.id),this.requests.delete(e.id))},this.onSegmentError=(e,t)=>{this.requests.has(e.id)&&(this.reportError(this.requests.get(e.id),t),this.debug("request delete from error",e.id),this.requests.delete(e.id))},this.onSegmentAbort=e=>{this.requests.has(e.id)&&(this.reportError(this.requests.get(e.id),"Internal abort"),this.debug("request delete from abort",e.id),this.requests.delete(e.id))},this.settings=Object.assign(Object.assign({},n),t),this.loader=e,this.loader.on(i.Events.SegmentLoaded,this.onSegmentLoaded),this.loader.on(i.Events.SegmentError,this.onSegmentError),this.loader.on(i.Events.SegmentAbort,this.onSegmentAbort)}async destroy(){if(0!==this.requests.size){console.error("Destroying segment manager with active request(s)!");for(const e of this.requests.values())this.reportError(e,"Request aborted due to destroy call");this.requests.clear()}this.playheadTime=0,this.segmentHistory.splice(0),void 0!==this.settings.assetsStorage&&await this.settings.assetsStorage.destroy(),await this.loader.destroy()}getSettings(){return this.settings}async load(e,t,s){this.manifestUri=t,this.playheadTime=s,this.pushSegmentHistory(e);const r=this.refreshLoad(),i=await this.loader.getSegment(r.id);return new Promise((e,t)=>{const s=new o(r.id,e,t);i?this.reportSuccess(s,i):(this.debug("request add",s.id),this.requests.set(s.id,s))})}setPlayheadTime(e){this.playheadTime=e,this.segmentHistory.length>0&&this.refreshLoad()}refreshLoad(){const e=this.segmentHistory[this.segmentHistory.length-1],t=this.playheadTime>.1?this.playheadTime:e.start,s=this.segmentHistory.reduce((e,s)=>(s.start>=t&&e.push(s),e),[]);0===s.length&&s.push(e);const r=s.length-1;do{const e=s[s.length-1].next();if(!e)break;s.push(e)}while(s.length<this.settings.forwardSegmentCount);const i=a.getMasterSwarmId(this.manifestUri,this.settings),n=s.map((e,t)=>({id:`${i}+${e.streamIdentity}+${e.identity}`,url:e.uri,masterSwarmId:i,masterManifestUri:this.manifestUri,streamId:e.streamIdentity,sequence:e.identity,range:e.range,priority:t}));return this.loader.load(n,`${i}+${e.streamIdentity}`),n[r]}pushSegmentHistory(e){this.segmentHistory.length>=this.settings.maxHistorySegments&&(this.debug("segment history auto shrink"),this.segmentHistory.splice(0,.2*this.settings.maxHistorySegments)),this.segmentHistory.length>0&&this.segmentHistory[this.segmentHistory.length-1].start>e.start&&(this.debug("segment history reset due to playhead seek back"),this.segmentHistory.splice(0)),this.segmentHistory.push(e)}reportSuccess(e,t){let s;void 0!==t.downloadBandwidth&&t.downloadBandwidth>0&&t.data&&t.data.byteLength>0&&(s=Math.trunc(t.data.byteLength/t.downloadBandwidth)),this.debug("report success",e.id),e.resolve({data:t.data,timeMs:s})}reportError(e,t){e.reject&&(this.debug("report error",e.id),e.reject(t))}};class o{constructor(e,t,s){this.id=e,this.resolve=t,this.reject=s}}},{"./utils":7,debug:"debug","p2p-media-loader-core":"p2p-media-loader-core"}],7:[function(e,t,s){"use strict";Object.defineProperty(s,"__esModule",{value:!0}),s.getSchemedUri=function(e){return e.startsWith("//")?window.location.protocol+e:e},s.getMasterSwarmId=function(e,t){return t.swarmId&&0!==t.swarmId.length?t.swarmId:e.split("?")[0]}},{}],"p2p-media-loader-shaka":[function(e,t,s){"use strict";function r(e){for(var t in e)s.hasOwnProperty(t)||(s[t]=e[t])}Object.defineProperty(s,"__esModule",{value:!0}),s.version="0.6.2",r(e("./engine")),r(e("./segment-manager"))},{"./engine":2,"./segment-manager":6}]},{},[1]); |
@@ -17,2 +17,8 @@ /** | ||
import { EventEmitter } from "events"; | ||
import { HybridLoaderSettings } from "p2p-media-loader-core"; | ||
import { SegmentManagerSettings } from "./segment-manager"; | ||
export interface ShakaEngineSettings { | ||
loader: Partial<HybridLoaderSettings>; | ||
segments: Partial<SegmentManagerSettings>; | ||
} | ||
export declare class Engine extends EventEmitter { | ||
@@ -22,3 +28,3 @@ static isSupported(): boolean; | ||
private readonly segmentManager; | ||
constructor(settings?: any); | ||
constructor(settings?: Partial<ShakaEngineSettings>); | ||
destroy(): Promise<void>; | ||
@@ -25,0 +31,0 @@ getSettings(): any; |
@@ -17,10 +17,2 @@ "use strict"; | ||
*/ | ||
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { | ||
return new (P || (P = Promise))(function (resolve, reject) { | ||
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } | ||
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } | ||
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } | ||
step((generator = generator.apply(thisArg, _arguments || [])).next()); | ||
}); | ||
}; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
@@ -32,5 +24,2 @@ const events_1 = require("events"); | ||
class Engine extends events_1.EventEmitter { | ||
static isSupported() { | ||
return p2p_media_loader_core_1.HybridLoader.isSupported(); | ||
} | ||
constructor(settings = {}) { | ||
@@ -44,7 +33,8 @@ super(); | ||
} | ||
destroy() { | ||
return __awaiter(this, void 0, void 0, function* () { | ||
yield this.segmentManager.destroy(); | ||
}); | ||
static isSupported() { | ||
return p2p_media_loader_core_1.HybridLoader.isSupported(); | ||
} | ||
async destroy() { | ||
await this.segmentManager.destroy(); | ||
} | ||
getSettings() { | ||
@@ -51,0 +41,0 @@ return { |
@@ -17,3 +17,4 @@ /** | ||
*/ | ||
export declare const version = "0.6.1"; | ||
export { Engine, Asset, AssetsStorage } from "./engine"; | ||
export declare const version = "0.6.2"; | ||
export * from "./engine"; | ||
export * from "./segment-manager"; |
@@ -18,5 +18,8 @@ "use strict"; | ||
*/ | ||
function __export(m) { | ||
for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; | ||
} | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.version = "0.6.1"; | ||
var engine_1 = require("./engine"); | ||
exports.Engine = engine_1.Engine; | ||
exports.version = "0.6.2"; | ||
__export(require("./engine")); | ||
__export(require("./segment-manager")); |
@@ -17,10 +17,2 @@ "use strict"; | ||
*/ | ||
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { | ||
return new (P || (P = Promise))(function (resolve, reject) { | ||
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } | ||
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } | ||
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } | ||
step((generator = generator.apply(thisArg, _arguments || [])).next()); | ||
}); | ||
}; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
@@ -36,3 +28,3 @@ const Debug = require("debug"); | ||
let lastPlayheadTimeReported = 0; | ||
player.addEventListener("loading", () => __awaiter(this, void 0, void 0, function* () { | ||
player.addEventListener("loading", async () => { | ||
if (intervalId > 0) { | ||
@@ -47,3 +39,3 @@ clearInterval(intervalId); | ||
} | ||
yield segmentManager.destroy(); | ||
await segmentManager.destroy(); | ||
intervalId = setInterval(() => { | ||
@@ -56,3 +48,3 @@ const time = getPlayheadTime(player); | ||
}, 500); | ||
})); | ||
}); | ||
debug("register request filter"); | ||
@@ -105,11 +97,11 @@ player.getNetworkingEngine().registerRequestFilter((requestType, request) => { | ||
const promise = segmentManager.load(segment, utils_1.getSchemedUri(player.getAssetUri ? player.getAssetUri() : player.getManifestUri()), getPlayheadTime(player)); | ||
const abort = () => __awaiter(this, void 0, void 0, function* () { | ||
const abort = async () => { | ||
debug("request", "abort", segment.identity); | ||
// TODO: implement abort in SegmentManager | ||
}); | ||
}; | ||
return new shaka.util.AbortableOperation(promise, abort); | ||
} | ||
else if (assetsStorage) { // load or store the asset using assets storage | ||
const responsePromise = (() => __awaiter(this, void 0, void 0, function* () { | ||
const asset = yield assetsStorage.getAsset(uri, request.headers.Range, masterSwarmId); | ||
const responsePromise = (async () => { | ||
const asset = await assetsStorage.getAsset(uri, request.headers.Range, masterSwarmId); | ||
if (asset !== undefined) { | ||
@@ -123,3 +115,3 @@ return { | ||
else { | ||
const response = yield shaka.net.HttpXHRPlugin(uri, request, requestType, progressUpdated).promise; | ||
const response = await shaka.net.HttpXHRPlugin(uri, request, requestType, progressUpdated).promise; | ||
assetsStorage.storeAsset({ | ||
@@ -135,4 +127,4 @@ masterManifestUri: masterManifestUri, | ||
} | ||
}))(); | ||
return new shaka.util.AbortableOperation(responsePromise, () => __awaiter(this, void 0, void 0, function* () { })); | ||
})(); | ||
return new shaka.util.AbortableOperation(responsePromise, async () => { }); | ||
} | ||
@@ -139,0 +131,0 @@ else { // load asset using default plugin |
@@ -27,5 +27,5 @@ /** | ||
private readonly settings; | ||
constructor(loader: LoaderInterface, settings?: any); | ||
constructor(loader: LoaderInterface, settings?: Partial<SegmentManagerSettings>); | ||
destroy(): Promise<void>; | ||
getSettings(): Settings; | ||
getSettings(): SegmentManagerSettings; | ||
load(parserSegment: ParserSegment, manifestUri: string, playheadTime: number): Promise<{ | ||
@@ -44,3 +44,3 @@ data: ArrayBuffer; | ||
} | ||
interface Settings { | ||
export interface SegmentManagerSettings { | ||
/** | ||
@@ -64,2 +64,1 @@ * Number of segments for building up predicted forward segments sequence; used to predownload and share via P2P | ||
} | ||
export {}; |
@@ -17,10 +17,2 @@ "use strict"; | ||
*/ | ||
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { | ||
return new (P || (P = Promise))(function (resolve, reject) { | ||
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } | ||
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } | ||
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } | ||
step((generator = generator.apply(thisArg, _arguments || [])).next()); | ||
}); | ||
}; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
@@ -64,3 +56,3 @@ const Debug = require("debug"); | ||
}; | ||
this.settings = Object.assign({}, defaultSettings, settings); | ||
this.settings = Object.assign(Object.assign({}, defaultSettings), settings); | ||
this.loader = loader; | ||
@@ -71,18 +63,16 @@ this.loader.on(p2p_media_loader_core_1.Events.SegmentLoaded, this.onSegmentLoaded); | ||
} | ||
destroy() { | ||
return __awaiter(this, void 0, void 0, function* () { | ||
if (this.requests.size !== 0) { | ||
console.error("Destroying segment manager with active request(s)!"); | ||
for (const request of this.requests.values()) { | ||
this.reportError(request, "Request aborted due to destroy call"); | ||
} | ||
this.requests.clear(); | ||
async destroy() { | ||
if (this.requests.size !== 0) { | ||
console.error("Destroying segment manager with active request(s)!"); | ||
for (const request of this.requests.values()) { | ||
this.reportError(request, "Request aborted due to destroy call"); | ||
} | ||
this.playheadTime = 0; | ||
this.segmentHistory.splice(0); | ||
if (this.settings.assetsStorage !== undefined) { | ||
yield this.settings.assetsStorage.destroy(); | ||
} | ||
yield this.loader.destroy(); | ||
}); | ||
this.requests.clear(); | ||
} | ||
this.playheadTime = 0; | ||
this.segmentHistory.splice(0); | ||
if (this.settings.assetsStorage !== undefined) { | ||
await this.settings.assetsStorage.destroy(); | ||
} | ||
await this.loader.destroy(); | ||
} | ||
@@ -92,19 +82,17 @@ getSettings() { | ||
} | ||
load(parserSegment, manifestUri, playheadTime) { | ||
return __awaiter(this, void 0, void 0, function* () { | ||
this.manifestUri = manifestUri; | ||
this.playheadTime = playheadTime; | ||
this.pushSegmentHistory(parserSegment); | ||
const lastRequestedSegment = this.refreshLoad(); | ||
const alreadyLoadedSegment = yield this.loader.getSegment(lastRequestedSegment.id); | ||
return new Promise((resolve, reject) => { | ||
const request = new Request(lastRequestedSegment.id, resolve, reject); | ||
if (alreadyLoadedSegment) { | ||
this.reportSuccess(request, alreadyLoadedSegment); | ||
} | ||
else { | ||
this.debug("request add", request.id); | ||
this.requests.set(request.id, request); | ||
} | ||
}); | ||
async load(parserSegment, manifestUri, playheadTime) { | ||
this.manifestUri = manifestUri; | ||
this.playheadTime = playheadTime; | ||
this.pushSegmentHistory(parserSegment); | ||
const lastRequestedSegment = this.refreshLoad(); | ||
const alreadyLoadedSegment = await this.loader.getSegment(lastRequestedSegment.id); | ||
return new Promise((resolve, reject) => { | ||
const request = new Request(lastRequestedSegment.id, resolve, reject); | ||
if (alreadyLoadedSegment) { | ||
this.reportSuccess(request, alreadyLoadedSegment); | ||
} | ||
else { | ||
this.debug("request add", request.id); | ||
this.requests.set(request.id, request); | ||
} | ||
}); | ||
@@ -141,5 +129,12 @@ } | ||
const masterSwarmId = utils_1.getMasterSwarmId(this.manifestUri, this.settings); | ||
const loaderSegments = sequence.map((s, i) => { | ||
return new p2p_media_loader_core_1.Segment(`${masterSwarmId}+${s.streamIdentity}+${s.identity}`, s.uri, masterSwarmId, this.manifestUri, s.streamIdentity, s.identity, s.range, i); | ||
}); | ||
const loaderSegments = sequence.map((s, i) => ({ | ||
id: `${masterSwarmId}+${s.streamIdentity}+${s.identity}`, | ||
url: s.uri, | ||
masterSwarmId: masterSwarmId, | ||
masterManifestUri: this.manifestUri, | ||
streamId: s.streamIdentity, | ||
sequence: s.identity, | ||
range: s.range, | ||
priority: i, | ||
})); | ||
this.loader.load(loaderSegments, `${masterSwarmId}+${lastRequestedSegment.streamIdentity}`); | ||
@@ -161,3 +156,3 @@ return loaderSegments[lastRequestedSegmentIndex]; | ||
let timeMs; | ||
if (loaderSegment.downloadBandwidth > 0 && loaderSegment.data && loaderSegment.data.byteLength > 0) { | ||
if (loaderSegment.downloadBandwidth !== undefined && loaderSegment.downloadBandwidth > 0 && loaderSegment.data && loaderSegment.data.byteLength > 0) { | ||
timeMs = Math.trunc(loaderSegment.data.byteLength / loaderSegment.downloadBandwidth); | ||
@@ -164,0 +159,0 @@ } |
{ | ||
"name": "p2p-media-loader-shaka", | ||
"description": "P2P Media Loader Shaka Player integration", | ||
"version": "0.6.1", | ||
"version": "0.6.2", | ||
"license": "Apache-2.0", | ||
@@ -40,17 +40,17 @@ "author": "Novage", | ||
"events": "^3.0.0", | ||
"p2p-media-loader-core": "^0.6.1" | ||
"p2p-media-loader-core": "^0.6.2" | ||
}, | ||
"devDependencies": { | ||
"@types/debug": "^4.1.4", | ||
"@types/debug": "^4.1.5", | ||
"@types/events": "^3.0.0", | ||
"browserify": "^16.3.0", | ||
"browserify": "^16.5.0", | ||
"copyfiles": "^2.1.1", | ||
"mkdirp": "^0.5.1", | ||
"terser": "^4.1.2", | ||
"terser": "^4.2.1", | ||
"ts-loader": "^6.0.4", | ||
"tslint": "^5.18.0", | ||
"typescript": "^3.5.3", | ||
"webpack": "^4.36.1", | ||
"webpack-cli": "^3.3.6" | ||
"tslint": "^5.19.0", | ||
"typescript": "^3.6.2", | ||
"webpack": "^4.39.3", | ||
"webpack-cli": "^3.3.7" | ||
} | ||
} |
90211
1545
Updatedp2p-media-loader-core@^0.6.2