dasha 3.1.4 → 3.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -3
- package/lib/dash.js +27 -5
- package/lib/track.js +2 -2
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -9,7 +9,7 @@ Library for parsing MPEG-DASH (.mpd) and HLS (.m3u8) manifests. Made with the pu
|
|
|
9
9
|
## Install
|
|
10
10
|
|
|
11
11
|
```shell
|
|
12
|
-
npm i dasha
|
|
12
|
+
npm i dasha@3.1.5
|
|
13
13
|
```
|
|
14
14
|
|
|
15
15
|
## Quick start
|
|
@@ -18,8 +18,7 @@ npm i dasha
|
|
|
18
18
|
import fs from 'node:fs/promises';
|
|
19
19
|
import { parse } from 'dasha';
|
|
20
20
|
|
|
21
|
-
const url =
|
|
22
|
-
'https://dash.akamaized.net/dash264/TestCases/1a/sony/SNE_DASH_SD_CASE1A_REVISED.mpd';
|
|
21
|
+
const url = 'https://dash.akamaized.net/dash264/TestCases/1a/sony/SNE_DASH_SD_CASE1A_REVISED.mpd';
|
|
23
22
|
const body = await fetch(url).then((res) => res.text());
|
|
24
23
|
const manifest = await parse(body, url);
|
|
25
24
|
|
package/lib/dash.js
CHANGED
|
@@ -259,15 +259,33 @@ const parseSegmentsFromTemplate = (
|
|
|
259
259
|
};
|
|
260
260
|
|
|
261
261
|
const parseSegmentsFromList = (segmentList, baseUrl) => {
|
|
262
|
-
const segmentUrls = segmentList.
|
|
262
|
+
const segmentUrls = segmentList.getAll('SegmentURL');
|
|
263
263
|
const segments = [];
|
|
264
264
|
for (const segmentUrl of segmentUrls) {
|
|
265
265
|
let mediaUrl = segmentUrl.get('media');
|
|
266
|
-
if (!mediaUrl)
|
|
267
|
-
|
|
266
|
+
if (!mediaUrl) {
|
|
267
|
+
mediaUrl = baseUrl;
|
|
268
|
+
} else if (!mediaUrl.startsWith('https://')) {
|
|
268
269
|
mediaUrl = new URL(mediaUrl, baseUrl).toString();
|
|
270
|
+
}
|
|
269
271
|
segments.push({ url: mediaUrl, range: segmentUrl.get('mediaRange') });
|
|
270
272
|
}
|
|
273
|
+
const initialization = segmentList.get('Initialization');
|
|
274
|
+
if (initialization) {
|
|
275
|
+
let mediaUrl = initialization.get('sourceURL');
|
|
276
|
+
if (!mediaUrl) {
|
|
277
|
+
mediaUrl = baseUrl;
|
|
278
|
+
} else if (!mediaUrl.startsWith('https://')) {
|
|
279
|
+
mediaUrl = new URL(mediaUrl, baseUrl).toString();
|
|
280
|
+
}
|
|
281
|
+
if (mediaUrl) {
|
|
282
|
+
segments.unshift({
|
|
283
|
+
url: mediaUrl,
|
|
284
|
+
range: initialization.get('range'),
|
|
285
|
+
init: true,
|
|
286
|
+
});
|
|
287
|
+
}
|
|
288
|
+
}
|
|
271
289
|
return segments;
|
|
272
290
|
};
|
|
273
291
|
|
|
@@ -314,8 +332,12 @@ const parseContentProtection = (contentProtections) => {
|
|
|
314
332
|
for (const contentProtection of contentProtections) {
|
|
315
333
|
const id = contentProtection.get('schemeIdUri')?.toLowerCase();
|
|
316
334
|
const value = contentProtection.get('value');
|
|
317
|
-
const pssh =
|
|
318
|
-
|
|
335
|
+
const pssh =
|
|
336
|
+
contentProtection.get('cenc:pssh')?.get() ||
|
|
337
|
+
contentProtection.get('pssh')?.get();
|
|
338
|
+
const defaultKeyId =
|
|
339
|
+
contentProtection.get('cenc:default_KID') ||
|
|
340
|
+
contentProtection.get('kid')?.get();
|
|
319
341
|
const data = { id, value, pssh, defaultKeyId };
|
|
320
342
|
protection[protectionSchemas[id]] = data;
|
|
321
343
|
}
|
package/lib/track.js
CHANGED
|
@@ -66,11 +66,11 @@ const createAudioLanguageFilter = (audios) => {
|
|
|
66
66
|
}
|
|
67
67
|
const results = [];
|
|
68
68
|
const filteredLanguages = [
|
|
69
|
-
...new Set(filtered.map((track) => track.language)),
|
|
69
|
+
...new Set(filtered.map((track) => `${track.language}:${track.label}`)),
|
|
70
70
|
];
|
|
71
71
|
for (const language of filteredLanguages) {
|
|
72
72
|
const tracks = filtered
|
|
73
|
-
.filter((track) => track.language === language)
|
|
73
|
+
.filter((track) => `${track.language}:${track.label}` === language)
|
|
74
74
|
.slice(0, maxTracksPerLanguage);
|
|
75
75
|
results.push(...tracks);
|
|
76
76
|
}
|