@cdn365/p2p-media-loader-hlsjs 1.0.0

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.
@@ -0,0 +1,37 @@
1
+ import {
2
+ HlsConfig,
3
+ Loader,
4
+ LoaderCallbacks,
5
+ LoaderConfiguration,
6
+ LoaderContext,
7
+ LoaderStats,
8
+ PlaylistLoaderContext,
9
+ } from "hls.js";
10
+
11
+ export class PlaylistLoaderBase implements Loader<PlaylistLoaderContext> {
12
+ #defaultLoader: Loader<LoaderContext>;
13
+ context: PlaylistLoaderContext;
14
+ stats: LoaderStats;
15
+
16
+ constructor(config: HlsConfig) {
17
+ this.#defaultLoader = new config.loader(config);
18
+ this.stats = this.#defaultLoader.stats;
19
+ this.context = this.#defaultLoader.context as PlaylistLoaderContext;
20
+ }
21
+
22
+ load(
23
+ context: LoaderContext,
24
+ config: LoaderConfiguration,
25
+ callbacks: LoaderCallbacks<LoaderContext>,
26
+ ) {
27
+ this.#defaultLoader.load(context, config, callbacks);
28
+ }
29
+
30
+ abort() {
31
+ this.#defaultLoader.abort();
32
+ }
33
+
34
+ destroy() {
35
+ this.#defaultLoader.destroy();
36
+ }
37
+ }
@@ -0,0 +1,80 @@
1
+ import * as Utils from "./utils.js";
2
+ import type {
3
+ ManifestLoadedData,
4
+ LevelUpdatedData,
5
+ AudioTrackLoadedData,
6
+ } from "hls.js";
7
+ import { Core, Segment } from "p2p-media-loader-core";
8
+
9
+ export class SegmentManager {
10
+ core: Core;
11
+
12
+ constructor(core: Core) {
13
+ this.core = core;
14
+ }
15
+
16
+ processMainManifest(data: ManifestLoadedData) {
17
+ const { levels, audioTracks } = data;
18
+ // in the case of audio only stream it is stored in levels
19
+
20
+ for (const [index, level] of levels.entries()) {
21
+ const { url } = level;
22
+ this.core.addStreamIfNoneExists({
23
+ runtimeId: Array.isArray(url) ? (url as string[])[0] : url,
24
+ type: "main",
25
+ index,
26
+ });
27
+ }
28
+
29
+ for (const [index, track] of audioTracks.entries()) {
30
+ const { url } = track;
31
+ this.core.addStreamIfNoneExists({
32
+ runtimeId: Array.isArray(url) ? (url as string[])[0] : url,
33
+ type: "secondary",
34
+ index,
35
+ });
36
+ }
37
+ }
38
+
39
+ updatePlaylist(data: LevelUpdatedData | AudioTrackLoadedData) {
40
+ const {
41
+ details: { url, fragments, live },
42
+ } = data;
43
+
44
+ const playlist = this.core.getStream(url);
45
+ if (!playlist) return;
46
+
47
+ const segmentToRemoveIds = new Set(playlist.segments.keys());
48
+ const newSegments: Segment[] = [];
49
+ fragments.forEach((fragment, index) => {
50
+ const {
51
+ url: responseUrl,
52
+ byteRange: fragByteRange,
53
+ sn,
54
+ start: startTime,
55
+ end: endTime,
56
+ } = fragment;
57
+
58
+ const [start, end] = fragByteRange;
59
+ const byteRange = Utils.getByteRange(
60
+ start,
61
+ end !== undefined ? end - 1 : undefined,
62
+ );
63
+ const runtimeId = Utils.getSegmentRuntimeId(responseUrl, byteRange);
64
+ segmentToRemoveIds.delete(runtimeId);
65
+
66
+ if (playlist.segments.has(runtimeId)) return;
67
+ newSegments.push({
68
+ runtimeId,
69
+ url: responseUrl,
70
+ externalId: live ? sn : index,
71
+ byteRange,
72
+ startTime,
73
+ endTime,
74
+ });
75
+ });
76
+
77
+ if (!newSegments.length && !segmentToRemoveIds.size) return;
78
+ this.core.updateStream(url, newSegments, segmentToRemoveIds.values());
79
+ }
80
+ }
package/src/utils.ts ADDED
@@ -0,0 +1,22 @@
1
+ import { ByteRange } from "p2p-media-loader-core";
2
+
3
+ export function getSegmentRuntimeId(
4
+ segmentRequestUrl: string,
5
+ byteRange?: ByteRange,
6
+ ) {
7
+ if (!byteRange) return segmentRequestUrl;
8
+ return `${segmentRequestUrl}|${byteRange.start}-${byteRange.end}`;
9
+ }
10
+
11
+ export function getByteRange(
12
+ rangeStart: number | undefined,
13
+ rangeEnd: number | undefined,
14
+ ): ByteRange | undefined {
15
+ if (
16
+ rangeStart !== undefined &&
17
+ rangeEnd !== undefined &&
18
+ rangeStart <= rangeEnd
19
+ ) {
20
+ return { start: rangeStart, end: rangeEnd };
21
+ }
22
+ }