This site has no backend. The video player and the HLS downloader are both static pages that read a single config object out of the URL itself — brotli-compressed, then base64url-encoded. Point either route at a valid payload and it renders. This page documents the config shape and lets you try (and inspect) it.
| Route | What it does |
|---|---|
/e/<data> or /e/?=<data> |
Opens the video player using the config encoded in <data>. |
/d/<data> or /d/?=<data> |
Opens the downloader using the same config schema. |
| anything else | This documentation / test page. |
Both the path form (/e/<data>) and the query form
(/e/?=<data>, or the bare /e?=<data>)
decode identically. The player and downloader read the exact same config
object, and the downloader's Watch Online button links straight
to the matching /e/ URL — one link generator feeds both.
The decoded payload is a single JSON object with these fields:
{
"vid": {
"stream": "https://example.com/path/playlist.m3u8" // required, HLS master or media playlist
},
"thumb": {
"exist": true,
"thumb": "https://example.com/path/poster.jpg" // shown as poster / downloader thumbnail
},
"subs": {
"exist": true,
"tracks": [
{
"id": "en_full",
"label": "English",
"url": "https://example.com/path/en.vtt",
"default": true // optional, marks the default track
}
]
},
"skip": {
"exist": true,
"intro": "0,43", // "start,end" in seconds
"outro": "1305,1320"
},
"auto": {
"ski": false, // auto-skip intro
"sko": false, // auto-skip outro
"autoplay": true
},
"meta": {
"title": "Episode title shown in the downloader",
"filename": "download.ts" // suggested save-as filename
}
}
| Field | Required | Used by | Notes |
|---|---|---|---|
vid.stream | Yes | Player, Downloader | HLS (.m3u8) is fully supported; the player also auto-detects progressive mp4/webm/mkv by sniffing content, and the downloader now supports downloading those direct files too (single-file download instead of segment-by-segment). |
thumb | No | Downloader | Poster image; omit or set exist: false to skip. |
subs | No | Player, Downloader | Any number of WebVTT tracks; each renders as a toggle in the Subtitles menu, and the downloader saves every track as its own .vtt file alongside the video. |
skip | No | Player | Draws intro/outro chapters on the seek bar and drives the skip buttons. |
auto | No | Player | Controls autoplay and auto-skip behavior. |
meta | No | Downloader | Display title and suggested filename. |
Browsers can decompress brotli but generally can't compress to brotli client-side, so links are generated server-side (or at build time). Any language with a brotli library works — here's the reference Node.js snippet this site's example link was generated with:
const zlib = require('zlib');
function encode(configObj) {
const json = JSON.stringify(configObj);
const compressed = zlib.brotliCompressSync(Buffer.from(json, 'utf8'), {
params: { [zlib.constants.BROTLI_PARAM_QUALITY]: 11 }
});
return compressed.toString('base64')
.replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, ''); // base64url, unpadded
}
console.log('/e/' + encode(myConfig));
console.log('/d/' + encode(myConfig));
Standard or URL-safe base64, padded or not, all decode fine — the reader normalizes before decompressing.
Paste your own HLS (.m3u8) stream URL, or leave it blank to use the public test stream:
The player link opens in this tab; the downloader link opens in a new tab (so starting a download never navigates you away from what you were doing). Both decode the exact same example config shown above.
Paste an encoded payload (or a full /e/… / /d/… URL) to inspect what it decodes to: