Skip to content

Commit

Permalink
To support loading media and audio manifests seperatlely we needed an…
Browse files Browse the repository at this point in the history
… only master manifest loader
  • Loading branch information
Nfrederiksen committed Mar 15, 2023
1 parent 61ed629 commit b900dec
Show file tree
Hide file tree
Showing 4 changed files with 81 additions and 17 deletions.
35 changes: 27 additions & 8 deletions index.js
Expand Up @@ -65,6 +65,27 @@ class HLSSpliceVod {
this.cmafMapUri = { video: {}, audio: {} };
}

loadMasterManifest(_injectMasterManifest, _injectMediaManifest, _injectAudioManifest) {
return new Promise((resolve, reject) => {
const parser = m3u8.createStream();

parser.on("m3u", (m3u) => {
this.m3u = m3u;
return resolve();
});

if (!_injectMasterManifest) {
try {
request({ uri: this.masterManifestUri, gzip: true }).pipe(parser);
} catch (exc) {
reject(exc);
}
} else {
_injectMasterManifest().pipe(parser);
}
});
}

/**
*
* @param {ReadStream} _injectMasterManifest
Expand All @@ -86,7 +107,7 @@ class HLSSpliceVod {
const streamItem = m3u.items.StreamItem[i];
const mediaManifestUrl = url.resolve(baseUrl, streamItem.get("uri"));
mediaManifestPromises.push(
this._loadMediaManifest(mediaManifestUrl, streamItem.get("bandwidth"), _injectMediaManifest)
this.loadMediaManifest(mediaManifestUrl, streamItem.get("bandwidth"), _injectMediaManifest)
);
}
let audioItems = m3u.items.MediaItem.filter((item) => {
Expand Down Expand Up @@ -125,7 +146,7 @@ class HLSSpliceVod {
}
const audioManifestUrl = url.resolve(baseUrl, audioItemUri);
mediaManifestPromises.push(
this._loadAudioManifest(audioManifestUrl, audioItemGroupId, audioItemLanguage, _injectAudioManifest)
this.loadAudioManifest(audioManifestUrl, audioItemGroupId, audioItemLanguage, _injectAudioManifest)
);
}
Promise.all(mediaManifestPromises).then(resolve).catch(reject);
Expand Down Expand Up @@ -492,7 +513,7 @@ class HLSSpliceVod {
}
}

_loadMediaManifest(mediaManifestUri, bandwidth, _injectMediaManifest) {
loadMediaManifest(mediaManifestUri, bandwidth, _injectMediaManifest) {
return new Promise((resolve, reject) => {
const parser = m3u8.createStream();

Expand All @@ -510,8 +531,7 @@ class HLSSpliceVod {
}
let map_uri = plItem.attributes.attributes["map-uri"];
if (map_uri && !map_uri.includes("http")) {
plItem.attributes.attributes["map-uri"] =
this.baseUrl + map_uri;
plItem.attributes.attributes["map-uri"] = this.baseUrl + map_uri;
}
}
}
Expand Down Expand Up @@ -542,7 +562,7 @@ class HLSSpliceVod {
});
}

_loadAudioManifest(audioManifestUri, group, lang, _injectAudioManifest) {
loadAudioManifest(audioManifestUri, group, lang, _injectAudioManifest) {
return new Promise((resolve, reject) => {
const parser = m3u8.createStream();

Expand All @@ -564,8 +584,7 @@ class HLSSpliceVod {
}
let map_uri = plItem.attributes.attributes["map-uri"];
if (map_uri && !map_uri.includes("http")) {
plItem.attributes.attributes["map-uri"] =
this.baseUrl + map_uri;
plItem.attributes.attributes["map-uri"] = this.baseUrl + map_uri;
}
}
}
Expand Down
14 changes: 7 additions & 7 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions package.json
Expand Up @@ -5,7 +5,7 @@
"repository": "https://github.com/Eyevinn/hls-splice",
"main": "index.js",
"scripts": {
"test": "$(npm bin)/jasmine",
"test": "jasmine",
"postversion": "git push && git push --tags",
"coverage": "nyc npm test && nyc report",
"coveralls": "nyc npm test && nyc report --reporter=text-lcov | coveralls"
Expand All @@ -26,7 +26,7 @@
"nyc": "^15.0.1"
},
"dependencies": {
"@eyevinn/m3u8": "^0.5.3",
"@eyevinn/m3u8": "^0.5.6",
"request": "^2.88.2"
}
}
45 changes: 45 additions & 0 deletions spec/integration_tests_spec.js
Expand Up @@ -39,4 +39,49 @@ describe("HLSSpliceVod", () => {
done();
})
});


it("can insert ads in an HLS VOD with seperate Manifest Loaders (Master + Media)", done => {
const hlsVod = new HLSSpliceVod('https://vod.streaming.a2d.tv/948a9dc4-ccb6-4de0-8295-40909bc90e43/c70657d0-5fe3-11ed-9d66-430eb269fe23_20331478.ism/.m3u8',
{
absoluteUrls: true
});
hlsVod.loadMasterManifest().then(() => {
hlsVod.loadMediaManifest("https://vod.streaming.a2d.tv/948a9dc4-ccb6-4de0-8295-40909bc90e43/c70657d0-5fe3-11ed-9d66-430eb269fe23_20331478.ism/c70657d0-5fe3-11ed-9d66-430eb269fe23_20331478-video=300000.m3u8", 455000)
})
.then(() => {
return hlsVod.insertAdAt(0, 'https://ovpuspvod.a2d-stage.tv/trailers/63ef9c36e3ffa90028603374/output.ism/.m3u8');
})
.then(() => {
const mediaManifest = hlsVod.getMediaManifest(455000);
const lines = mediaManifest.split("\n");
expect(lines[8]).toEqual(`#EXT-X-MAP:URI="https://ovpuspvod.a2d-stage.tv/trailers/63ef9c36e3ffa90028603374/output.ism/hls/output-video=300000.m4s"`);
expect(lines[12]).toEqual(`https://ovpuspvod.a2d-stage.tv/trailers/63ef9c36e3ffa90028603374/output.ism/hls/output-video=300000-1.m4s`);
expect(lines[23]).toEqual(`#EXT-X-MAP:URI="https://vod.streaming.a2d.tv/948a9dc4-ccb6-4de0-8295-40909bc90e43/c70657d0-5fe3-11ed-9d66-430eb269fe23_20331478.ism/hls/c70657d0-5fe3-11ed-9d66-430eb269fe23_20331478-video=300000.m4s"`);
expect(lines[28]).toEqual(`https://vod.streaming.a2d.tv/948a9dc4-ccb6-4de0-8295-40909bc90e43/c70657d0-5fe3-11ed-9d66-430eb269fe23_20331478.ism/hls/c70657d0-5fe3-11ed-9d66-430eb269fe23_20331478-video=300000-1.m4s`);
done();
})
});

it("can insert ads in an HLS VOD with seperate Manifest Loaders (Master + Audio)", done => {
const hlsVod = new HLSSpliceVod('https://vod.streaming.a2d.tv/948a9dc4-ccb6-4de0-8295-40909bc90e43/c70657d0-5fe3-11ed-9d66-430eb269fe23_20331478.ism/.m3u8',
{
absoluteUrls: true
});
hlsVod.loadMasterManifest().then(() => {
hlsVod.loadAudioManifest("https://vod.streaming.a2d.tv/948a9dc4-ccb6-4de0-8295-40909bc90e43/c70657d0-5fe3-11ed-9d66-430eb269fe23_20331478.ism/c70657d0-5fe3-11ed-9d66-430eb269fe23_20331478-audio=128000.m3u8", "audio-aacl-128", "audio")
})
.then(() => {
return hlsVod.insertAdAt(0, 'https://ovpuspvod.a2d-stage.tv/trailers/63ef9c36e3ffa90028603374/output.ism/.m3u8');
})
.then(() => {
const audioManifest = hlsVod.getAudioManifest("audio-aacl-128", "audio");
const lines = audioManifest.split("\n");
expect(lines[8]).toEqual(`#EXT-X-MAP:URI="https://ovpuspvod.a2d-stage.tv/trailers/63ef9c36e3ffa90028603374/output.ism/hls/output-audio=128000.m4s"`);
expect(lines[12]).toEqual(`https://ovpuspvod.a2d-stage.tv/trailers/63ef9c36e3ffa90028603374/output.ism/hls/output-audio=128000-1.m4s`);
expect(lines[23]).toEqual(`#EXT-X-MAP:URI="https://vod.streaming.a2d.tv/948a9dc4-ccb6-4de0-8295-40909bc90e43/c70657d0-5fe3-11ed-9d66-430eb269fe23_20331478.ism/hls/c70657d0-5fe3-11ed-9d66-430eb269fe23_20331478-audio=128000.m4s"`);
expect(lines[28]).toEqual(`https://vod.streaming.a2d.tv/948a9dc4-ccb6-4de0-8295-40909bc90e43/c70657d0-5fe3-11ed-9d66-430eb269fe23_20331478.ism/hls/c70657d0-5fe3-11ed-9d66-430eb269fe23_20331478-audio=128000-1.m4s`);
done();
})
});
});

0 comments on commit b900dec

Please sign in to comment.