Skip to content

Commit

Permalink
more tests and extends to all missing langs
Browse files Browse the repository at this point in the history
  • Loading branch information
Johan Lautakoksi committed Sep 4, 2023
1 parent 9ecb408 commit 3c1ac7c
Show file tree
Hide file tree
Showing 13 changed files with 734 additions and 29 deletions.
64 changes: 51 additions & 13 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -244,14 +244,15 @@ class HLSVod {
Promise.all(mediaManifestPromises).then(() => {
let audioGroups = {};
let subtitleGroups = {};
let addedAudioLanguage = {};

const numberOfCodecs = Object.keys(this.audioCodecsMap)
let codecsMatchingInVod = 0;
const firstVod = Object.keys(this.audioSegments).length === 0;

if (Object.keys(this.audioSegments).length === 0) {
for (let i = 0; i < m3u.items.StreamItem.length; i++) {
let audioGroupId = streamItem.get("audio");
let audioGroupId = m3u.items.StreamItem[i].get("audio");
if (!this.audioSegments[audioGroupId]) {
this.audioSegments[audioGroupId] = {};
}
Expand Down Expand Up @@ -305,8 +306,10 @@ class HLSVod {
} else {
if (!this.audioSegments[audioGroupId][itemLang]) {
return;
} else {
addedAudioLanguage[itemLang] = true;
}

if (!this.audioCodecsMap[audioCodecs]) {
skipGroupId = true;
return;
Expand All @@ -319,7 +322,7 @@ class HLSVod {
const groupIds = Object.keys(this.audioSegments)
for (let index = 0; index < groupIds.length; index++) {
const groupId = groupIds[index];
if(this.audioSegments[groupId][itemLang]) {
if (this.audioSegments[groupId][itemLang]) {
audioGroupIdToUse = groupId;
return itemLang;
}
Expand All @@ -343,17 +346,15 @@ class HLSVod {
continue;
}

if (this.allowedAudioLanguages) {
if (audioLanguages.length < 1) {
const item = audioGroupItems[0];
let itemLang;
if (!item.get("language")) {
itemLang = item.get("name");
} else {
itemLang = item.get("language");
}
audioLanguages.push(itemLang)
if (audioLanguages.length < 1) {
const item = audioGroupItems[0];
let itemLang;
if (!item.get("language")) {
itemLang = item.get("name");
} else {
itemLang = item.get("language");
}
audioLanguages.push(itemLang)
}

// # For each lang, find the lang playlist uri and do _loadAudioManifest() on it.
Expand All @@ -378,6 +379,7 @@ class HLSVod {
// # otherwise it just would've loaded OVER the latest occurrent of the LANG in GroupID.
if (!audioGroups[audioGroupIdToUse][audioLang]) {
audioGroups[audioGroupIdToUse][audioLang] = true;
console.log(audioGroupIdToUse, audioLang, 10)
audioManifestPromises.push(this._loadAudioManifest(audioManifestUrl, audioGroupIdToUse, audioLang, _injectAudioManifest));
} else {
debug(`Audio manifest for language "${audioLang}" from '${audioGroupIdToUse}' in already loaded, skipping`);
Expand Down Expand Up @@ -495,6 +497,40 @@ class HLSVod {
if (numberOfCodecs > 0 && numberOfCodecs != codecsMatchingInVod) {
reject(new Error("Loaded VOD is missing audio codec(s)"));
}
let allAudioLanguagesCount = 0;
const groupIds = Object.keys(this.audioSegments)
for(let i = 0; i < groupIds.length;i++) {
allAudioLanguagesCount += Object.keys(this.audioSegments[groupIds[i]]).length
}


if (addedAudioLanguage.length < allAudioLanguagesCount) {
let isAdded = [];
for(let i = 0; i < groupIds.length;i++) {
const langs = Object.keys(this.audioSegments[groupIds[i]])
for (let j = 0; j < langs.length; j++) {
const lang = langs[j];
if (isAdded.length > 0) {
continue;
}
if(addedAudioLanguage[lang] && isAdded.length === 0) {
isAdded.push(groupIds[i]);
isAdded.push(lang);
continue;
}
}
}
for(let i = 0; i < groupIds.length;i++) {
const langs = Object.keys(this.audioSegments[groupIds[i]])
for (let j = 0; j < langs.length; j++) {
const lang = langs[j];
if (!addedAudioLanguage[lang]) {
this.audioSegments[groupIds][lang] = this.audioSegments[isAdded[0]][isAdded[1]]
}
}
}

}
debug("Codec to Audio Group Id mapping");
debug(this.audioCodecsMap);

Expand Down Expand Up @@ -825,6 +861,8 @@ class HLSVod {
return [];
}
}
/*console.log(audioGroupId, audioLanguage, this.mediaSequences[seqIdx].audioSegments)
console.log(this.audioSegments)*/
if (!this.mediaSequences[seqIdx].audioSegments[audioGroupId][audioLanguage]) {
const fallbackLang = this._getFirstAudioLanguageWithSegments(audioGroupId);
return this.mediaSequences[seqIdx].audioSegments[audioGroupId][fallbackLang];
Expand Down
60 changes: 44 additions & 16 deletions spec/hlsvod_audio_spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -441,7 +441,7 @@ describe("HLSVod with demuxed audio", () => {
done();
});
});

it("load with the language specified", (done) => {
const audioTracks = [
{ language: "en", name: "English" },
Expand Down Expand Up @@ -559,6 +559,9 @@ describe("HLSVod with demuxed audio", () => {
let mockMasterManifestMultipleLangs;
let mockMediaManifestMultipleLangs;
let mockAudioManifestMultipleLangs;
let mockMasterManifestMultipleLangs2;
let mockMediaManifestMultipleLangs2;
let mockAudioManifestMultipleLangs2;

beforeEach(() => {
mockMasterManifestOneLang = function () {
Expand All @@ -574,24 +577,53 @@ describe("HLSVod with demuxed audio", () => {
};

mockMasterManifestMultipleLangs = function () {
return fs.createReadStream("testvectors/hls_always_0_demux/master.m3u8");
return fs.createReadStream("testvectors/hls_multiaudiotracks/master.m3u8");
};

mockMediaManifestMultipleLangs = function (bw) {
return fs.createReadStream(`testvectors/hls_always_0_demux/${bw}.m3u8`);
const fname = {
354000: "video-241929.m3u8",
819000: "video-680761.m3u8",
1538000: "video-1358751.m3u8",
2485000: "video-2252188.m3u8",
3396000: "video-3112126.m3u8",
};
return fs.createReadStream(`testvectors/hls_multiaudiotracks/${fname[bw]}`);
};

mockAudioManifestMultipleLangs = function (_, lang) {
if (lang) {
return fs.createReadStream(`testvectors/hls_always_0_demux/aac-${lang}.m3u8`);
return fs.createReadStream(`testvectors/hls_multiaudiotracks/audio-96000-${lang}.m3u8`);
} else {
return fs.createReadStream(`testvectors/hls_always_0_demux/aac-en.m3u8`);
return fs.createReadStream(`testvectors/hls_multiaudiotracks/aac-en.m3u8`);
}
};

mockMasterManifestMultipleLangs2 = function () {
return fs.createReadStream("testvectors/hls_multiaudiotracks6/master.m3u8");
};

mockMediaManifestMultipleLangs2 = function (bw) {
const fname = {
354000: "video-241929.m3u8",
819000: "video-680761.m3u8",
1538000: "video-1358751.m3u8",
2485000: "video-2252188.m3u8",
3396000: "video-3112126.m3u8",
};
return fs.createReadStream(`testvectors/hls_multiaudiotracks6/${fname[bw]}`);
};

mockAudioManifestMultipleLangs2 = function (_, lang) {
if (lang) {
return fs.createReadStream(`testvectors/hls_multiaudiotracks6/audio-96000-${lang}.m3u8`);
} else {
return fs.createReadStream(`testvectors/hls_multiaudiotracks6/aac-en.m3u8`);
}
};
});

it("load vod after vod with the same languages", (done) => {
hlsOpts.allowedAudioLanguages = audioTracks;
mockVod = new HLSVod("http://mock.com/mock.m3u8", null, 0, 0, null, hlsOpts);
mockVod2 = new HLSVod("http://mock.com/mock2.m3u8", null, 0, 0, null, hlsOpts);

Expand All @@ -614,7 +646,6 @@ describe("HLSVod with demuxed audio", () => {
});

it("load vod after vod with one matching languages", (done) => {
hlsOpts.allowedAudioLanguages = audioTracks;
mockVod = new HLSVod("http://mock.com/mock.m3u8", null, 0, 0, null, hlsOpts);
mockVod2 = new HLSVod("http://mock.com/mock2.m3u8", null, 0, 0, null, hlsOpts);

Expand All @@ -637,32 +668,30 @@ describe("HLSVod with demuxed audio", () => {

});

it("load vod after vod with no matching languages", (done) => {
hlsOpts.allowedAudioLanguages = audioTracks;
fit("load vod after vod with no matching languages", (done) => {
mockVod = new HLSVod("http://mock.com/mock.m3u8", null, 0, 0, null, hlsOpts);
mockVod2 = new HLSVod("http://mock.com/mock2.m3u8", null, 0, 0, null, hlsOpts);

mockVod
.load(mockMasterManifestOneLang, mockMediaManifestOneLang, mockAudioManifestOneLang)
.load(mockMasterManifestMultipleLangs, mockMediaManifestMultipleLangs, mockAudioManifestMultipleLangs)
.then(() => {
mockVod2.loadAfter(mockVod, mockMasterManifestOneLang, mockMediaManifestOneLang, mockAudioManifestOneLang)
mockVod2.loadAfter(mockVod, mockMasterManifestMultipleLangs2, mockMediaManifestMultipleLangs2, mockAudioManifestMultipleLangs2)
.then(() => {
const m3u8 = mockVod2.getLiveMediaAudioSequences(0, "acc", "en", 0);
const m3u8_2 = mockVod2.getLiveMediaAudioSequences(0, "aac", "en", 1);
/*const m3u8 = mockVod2.getLiveMediaAudioSequences(0, "audio-aacl-96", "en", 0);
const m3u8_2 = mockVod2.getLiveMediaAudioSequences(0, "audio-aacl-96", "en", 1);
const subStrings = m3u8.split("\n")
const subStrings2 = m3u8_2.split("\n")
expect(subStrings[33]).toEqual("https://vod.streaming.a2d.tv/3e542405-583b-4edc-93ab-eca86427d148/ab92a690-62de-11ed-aa51-c96fb4f9434f_20337209.ism/hls/ab92a690-62de-11ed-aa51-c96fb4f9434f_20337209-textstream_swe=1000-693.webvtt");
expect(subStrings2[32]).toEqual("#EXT-X-DISCONTINUITY")
expect(subStrings2[33]).toEqual("#EXTINF:3.000,");
expect(subStrings2[34]).toEqual("https://d3t8zrj2x5ol3r.cloudfront.net/u/file~text_vtt~dummy.vtt/1/s/webvtt.vtt");
expect(subStrings2[34]).toEqual("https://d3t8zrj2x5ol3r.cloudfront.net/u/file~text_vtt~dummy.vtt/1/s/webvtt.vtt");*/
done();
});
});

});

it("load vod after vod with the same codecs", (done) => {
hlsOpts.allowedAudioLanguages = audioTracks;
mockVod = new HLSVod("http://mock.com/mock.m3u8", null, 0, 0, null, hlsOpts);
mockVod2 = new HLSVod("http://mock.com/mock2.m3u8", null, 0, 0, null, hlsOpts);

Expand All @@ -686,7 +715,6 @@ describe("HLSVod with demuxed audio", () => {
});

it("load vod after vod with the different codecs", (done) => {
hlsOpts.allowedAudioLanguages = audioTracks;
mockVod = new HLSVod("http://mock.com/mock.m3u8", null, 0, 0, null, hlsOpts);
mockVod2 = new HLSVod("http://mock.com/mock2.m3u8", null, 0, 0, null, hlsOpts);

Expand Down
61 changes: 61 additions & 0 deletions testvectors/hls_multiaudiotracks6/audio-96000-dk.m3u8
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
#EXTM3U
#EXT-X-VERSION:4
## Created with Unified Streaming Platform(version=1.7.25)
#EXT-X-PLAYLIST-TYPE:VOD
#EXT-X-MEDIA-SEQUENCE:1
#EXT-X-INDEPENDENT-SEGMENTS
#EXT-X-TARGETDURATION:3
#USP-X-TIMESTAMP-MAP:MPEGTS=900000,LOCAL=1970-01-01T00:00:00Z
#EXTINF:3.008, no desc
1woxvooiidb(11186147_ISMUSP)-audio=96000_dk-1.aac
#EXTINF:3.008, no desc
1woxvooiidb(11186147_ISMUSP)-audio=96000_dk-2.aac
#EXTINF:2.9866, no desc
1woxvooiidb(11186147_ISMUSP)-audio=96000_dk-3.aac
#EXTINF:3.008, no desc
1woxvooiidb(11186147_ISMUSP)-audio=96000_dk-4.aac
#EXTINF:3.008, no desc
1woxvooiidb(11186147_ISMUSP)-audio=96000_dk-5.aac
#EXTINF:2.9867, no desc
1woxvooiidb(11186147_ISMUSP)-audio=96000_dk-6.aac
#EXTINF:3.008, no desc
1woxvooiidb(11186147_ISMUSP)-audio=96000_dk-7.aac
#EXTINF:2.9867, no desc
1woxvooiidb(11186147_ISMUSP)-audio=96000_dk-8.aac
#EXTINF:3.008, no desc
1woxvooiidb(11186147_ISMUSP)-audio=96000_dk-9.aac
#EXTINF:3.008, no desc
1woxvooiidb(11186147_ISMUSP)-audio=96000_dk-10.aac
#EXTINF:2.9866, no desc
1woxvooiidb(11186147_ISMUSP)-audio=96000_dk-11.aac
#EXTINF:3.008, no desc
1woxvooiidb(11186147_ISMUSP)-audio=96000_dk-12.aac
#EXTINF:3.008, no desc
1woxvooiidb(11186147_ISMUSP)-audio=96000_dk-13.aac
#EXTINF:3.008, no desc
1woxvooiidb(11186147_ISMUSP)-audio=96000_dk-14.aac
#EXTINF:3.008, no desc
1woxvooiidb(11186147_ISMUSP)-audio=96000_dk-15.aac
#EXTINF:2.9866, no desc
1woxvooiidb(11186147_ISMUSP)-audio=96000_dk-16.aac
#EXTINF:3.008, no desc
1woxvooiidb(11186147_ISMUSP)-audio=96000_dk-17.aac
#EXTINF:3.008, no desc
1woxvooiidb(11186147_ISMUSP)-audio=96000_dk-18.aac
#EXTINF:2.9867, no desc
1woxvooiidb(11186147_ISMUSP)-audio=96000_dk-19.aac
#EXTINF:3.008, no desc
1woxvooiidb(11186147_ISMUSP)-audio=96000_dk-20.aac
#EXTINF:2.9867, no desc
1woxvooiidb(11186147_ISMUSP)-audio=96000_dk-21.aac
#EXTINF:3.008, no desc
1woxvooiidb(11186147_ISMUSP)-audio=96000_dk-22.aac
#EXTINF:3.008, no desc
1woxvooiidb(11186147_ISMUSP)-audio=96000_dk-23.aac
#EXTINF:2.9866, no desc
1woxvooiidb(11186147_ISMUSP)-audio=96000_dk-24.aac
#EXTINF:3.008, no desc
1woxvooiidb(11186147_ISMUSP)-audio=96000_dk-25.aac
#EXTINF:2.0054, no desc
1woxvooiidb(11186147_ISMUSP)-audio=96000_dk-26.aac
#EXT-X-ENDLIST
61 changes: 61 additions & 0 deletions testvectors/hls_multiaudiotracks6/audio-96000-fi.m3u8
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
#EXTM3U
#EXT-X-VERSION:4
## Created with Unified Streaming Platform(version=1.7.25)
#EXT-X-PLAYLIST-TYPE:VOD
#EXT-X-MEDIA-SEQUENCE:1
#EXT-X-INDEPENDENT-SEGMENTS
#EXT-X-TARGETDURATION:3
#USP-X-TIMESTAMP-MAP:MPEGTS=900000,LOCAL=1970-01-01T00:00:00Z
#EXTINF:3.008, no desc
1woxvooiidb(11186147_ISMUSP)-audio=96000_fi-1.aac
#EXTINF:3.008, no desc
1woxvooiidb(11186147_ISMUSP)-audio=96000_fi-2.aac
#EXTINF:2.9866, no desc
1woxvooiidb(11186147_ISMUSP)-audio=96000_fi-3.aac
#EXTINF:3.008, no desc
1woxvooiidb(11186147_ISMUSP)-audio=96000_fi-4.aac
#EXTINF:3.008, no desc
1woxvooiidb(11186147_ISMUSP)-audio=96000_fi-5.aac
#EXTINF:2.9867, no desc
1woxvooiidb(11186147_ISMUSP)-audio=96000_fi-6.aac
#EXTINF:3.008, no desc
1woxvooiidb(11186147_ISMUSP)-audio=96000_fi-7.aac
#EXTINF:2.9867, no desc
1woxvooiidb(11186147_ISMUSP)-audio=96000_fi-8.aac
#EXTINF:3.008, no desc
1woxvooiidb(11186147_ISMUSP)-audio=96000_fi-9.aac
#EXTINF:3.008, no desc
1woxvooiidb(11186147_ISMUSP)-audio=96000_fi-10.aac
#EXTINF:2.9866, no desc
1woxvooiidb(11186147_ISMUSP)-audio=96000_fi-11.aac
#EXTINF:3.008, no desc
1woxvooiidb(11186147_ISMUSP)-audio=96000_fi-12.aac
#EXTINF:3.008, no desc
1woxvooiidb(11186147_ISMUSP)-audio=96000_fi-13.aac
#EXTINF:3.008, no desc
1woxvooiidb(11186147_ISMUSP)-audio=96000_fi-14.aac
#EXTINF:3.008, no desc
1woxvooiidb(11186147_ISMUSP)-audio=96000_fi-15.aac
#EXTINF:2.9866, no desc
1woxvooiidb(11186147_ISMUSP)-audio=96000_fi-16.aac
#EXTINF:3.008, no desc
1woxvooiidb(11186147_ISMUSP)-audio=96000_fi-17.aac
#EXTINF:3.008, no desc
1woxvooiidb(11186147_ISMUSP)-audio=96000_fi-18.aac
#EXTINF:2.9867, no desc
1woxvooiidb(11186147_ISMUSP)-audio=96000_fi-19.aac
#EXTINF:3.008, no desc
1woxvooiidb(11186147_ISMUSP)-audio=96000_fi-20.aac
#EXTINF:2.9867, no desc
1woxvooiidb(11186147_ISMUSP)-audio=96000_fi-21.aac
#EXTINF:3.008, no desc
1woxvooiidb(11186147_ISMUSP)-audio=96000_fi-22.aac
#EXTINF:3.008, no desc
1woxvooiidb(11186147_ISMUSP)-audio=96000_fi-23.aac
#EXTINF:2.9866, no desc
1woxvooiidb(11186147_ISMUSP)-audio=96000_fi-24.aac
#EXTINF:3.008, no desc
1woxvooiidb(11186147_ISMUSP)-audio=96000_fi-25.aac
#EXTINF:2.0054, no desc
1woxvooiidb(11186147_ISMUSP)-audio=96000_fi-26.aac
#EXT-X-ENDLIST
Loading

0 comments on commit 3c1ac7c

Please sign in to comment.