Skip to content

Commit

Permalink
feat: add helper filters for hls manifest
Browse files Browse the repository at this point in the history
  • Loading branch information
vitalygashkov committed Mar 26, 2024
1 parent 8fdef55 commit 5b69558
Show file tree
Hide file tree
Showing 4 changed files with 71 additions and 33 deletions.
43 changes: 11 additions & 32 deletions lib/dash.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,13 @@
'use strict';

const mpdParser = require('mpd-parser');
const { parseBitrate, parseSize, getWidth, getBestTrack, getQualityLabel } = require('./util');
const { parseBitrate, parseSize, getQualityLabel } = require('./util');
const {
createResolutionFilter,
createVideoQualityFilter,
createAudioLanguageFilter,
createSubtitleLanguageFilter,
} = require('./track');

const segmentsDto = (data = []) => {
const mapSegment = (item) => ({
Expand Down Expand Up @@ -115,37 +121,10 @@ const parseManifest = (manifestString, manifestUri) => {
videos,
audios,
subtitles,
withResolution({ width, height }) {
return videos.filter(
(track) =>
(!width || track.resolution.width === width) &&
(!height || track.resolution.height === height)
);
},
withVideoQuality(quality) {
const height = parseInt(quality);
const matchHeight = (track) => {
if (!height) return false;
const trackWidth = track.resolution.width;
const targetWidth = getWidth(height);
if (!trackWidth || !targetWidth) return false;
return trackWidth === targetWidth;
};
const matches = videos.filter(matchHeight);
return matches.length ? matches : [getBestTrack(videos)];
},
withAudioLanguages(languages) {
if (!languages.length) return audios;
return audios.filter((track) =>
languages.some((language) => track.language.startsWith(language))
);
},
withSubtitleLanguages(languages) {
if (!languages.length) return subtitles;
return subtitles.filter((track) =>
languages.some((language) => track.language.startsWith(language))
);
},
withResolution: createResolutionFilter(videos),
withVideoQuality: createVideoQualityFilter(videos),
withAudioLanguages: createAudioLanguageFilter(audios),
withSubtitleLanguages: createSubtitleLanguageFilter(subtitles),
},
};

Expand Down
10 changes: 10 additions & 0 deletions lib/hls.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,12 @@

const m3u8Parser = require('m3u8-parser');
const { parseBitrate, getQualityLabel } = require('./util');
const {
createResolutionFilter,
createVideoQualityFilter,
createAudioLanguageFilter,
createSubtitleLanguageFilter,
} = require('./track');

const parseM3u8 = (manifestString) => {
const parser = new m3u8Parser.Parser();
Expand Down Expand Up @@ -123,6 +129,10 @@ const parseManifest = async (manifestString, manifestUri) => {
videos,
audios,
subtitles,
withResolution: createResolutionFilter(videos),
withVideoQuality: createVideoQualityFilter(videos),
withAudioLanguages: createAudioLanguageFilter(audios),
withSubtitleLanguages: createSubtitleLanguageFilter(subtitles),
},
};

Expand Down
49 changes: 49 additions & 0 deletions lib/track.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
const createResolutionFilter = (videos) => {
return ({ width, height }) => {
return videos.filter(
(track) =>
(!width || track.resolution.width === width) &&
(!height || track.resolution.height === height)
);
};
};

const createVideoQualityFilter = (videos) => {
return (quality) => {
const height = parseInt(quality);
const matchHeight = (track) => {
if (!height) return false;
const trackWidth = track.resolution.width;
const targetWidth = getWidth(height);
if (!trackWidth || !targetWidth) return false;
return trackWidth === targetWidth;
};
const matches = videos.filter(matchHeight);
return matches.length ? matches : [getBestTrack(videos)];
};
};

const createAudioLanguageFilter = (audios) => {
return (languages) => {
if (!languages.length) return audios;
return audios.filter((track) =>
languages.some((language) => track.language.startsWith(language))
);
};
};

const createSubtitleLanguageFilter = (subtitles) => {
return (languages) => {
if (!languages.length) return subtitles;
return subtitles.filter((track) =>
languages.some((language) => track.language.startsWith(language))
);
};
};

module.exports = {
createResolutionFilter,
createVideoQualityFilter,
createAudioLanguageFilter,
createSubtitleLanguageFilter,
};
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "dasha",
"version": "3.0.0.alpha.4",
"version": "3.0.0.alpha.5",
"author": "Vitaly Gashkov <[email protected]>",
"description": "Parser for MPEG-DASH & HLS manifests",
"license": "AGPL-3.0",
Expand Down

0 comments on commit 5b69558

Please sign in to comment.