hlx-url-rewriter
A transform stream to rewrite URLs in HLS playlists
Features
- Being used with other
hlx
objects, it provides a functionality to filter every playlists and rewrite the urls in them. - You can specify a custom function to parse/modify playlists or the default function will be used.
- The default function rewrites urls in accordance with the rules described below (See "default function")
Install
Usage
const {createReadStream} = require('hlx-file-reader');
const {createUrlRewriter} = require('hlx-url-rewriter');
const {createTerminator} = require('hlx-terminator')
const src = createReadStream('https://foo.bar/sample.m3u8');
const rewrite = createUrlRewriter(data => {
if (data.type === 'playlist') {
const url = new URL(data.uri);
data.uri = url.pathname;
}
});
const dest = createTerminator();
src.pipe(rewrite).pipe(dest)
.on('data', data => {
console.log(data.uri);
});
API
The features are built on top of the Node's transform streams.
createUrlRewriter([rules, options])
Creates a new TransformStream
object.
params
Name | Type | Required | Default | Description |
---|
rewriteFunc | function | No | An internally defined default function | A function that takes an hls-parser object and modifies url strings included in the object. |
options | function | No | see below | An object preserving options |
default function
Pseudo code:
function defaultFunc(playlist, playlistUrl) {
for each url contained in the playlist {
if (url is not an absolute url) {
resolve url with playlistUrl to make it absolute
ex1: "http://example.com/path/to/file" + "../../path2/to/file" = "http://example.com/path2/to/file"
ex2: "file:///path/to/file" + "../../path2/to/file" = "file:///path2/to/file"
ex3: "http://example.com/path/to/file" + "/path2/to/file" = "http://example.com/path2/to/file"
ex4: "file:///path/to/file" + "/path2/to/file" = "file://{options.rootPath}/path/to/file"
}
}
if (url is not an absolute url) {
return url
}
if (url is a file url || url and playlistUrl share the same hostname) {
return a relative path from playlistUrl.pathname to url.pathname
}
if (playlistUrl is a file url) {
return a relative path from playlistUrl.pathname to "{options.rootPath}/{url.hostname}/{url.pathname}"
}
return "/{url.hostname}/{url.pathname}"
}
}
options
Name | Type | Default | Description |
---|
rootPath | string | "/" | This value will be used by the default function to convert a file url into a relative path. |
return value
An instance of TransformStream
.