Loading player core…
thumbnail
--:--
Loading stream info…
— · — · HLS
HLS adaptive
FILE DETAILS
Size (est.)—
Duration—
Resolution—
CodecH264
FormatHLS
Subtitles—
Segments—
Watch Online
Click Get Download Link to begin. HLS streams download segment-by-segment; mp4/webm/mkv download as a single file. Subtitles (if any) download alongside as separate .vtt files. Segments/files stream directly to disk — memory use stays flat regardless of file size.
⚠ Your browser doesn't support direct-to-disk streaming, so the whole video will be buffered in memory before saving. Large files may use a lot of RAM or fail to download on this browser.

Player & Downloader, driven entirely by the URL

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.

Routes

RouteWhat 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.

Config schema

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
  }
}
FieldRequiredUsed byNotes
vid.streamYesPlayer, DownloaderHLS (.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).
thumbNoDownloaderPoster image; omit or set exist: false to skip.
subsNoPlayer, DownloaderAny 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.
skipNoPlayerDraws intro/outro chapters on the seek bar and drives the skip buttons.
autoNoPlayerControls autoplay and auto-skip behavior.
metaNoDownloaderDisplay title and suggested filename.

Encoding a config

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.

Try it

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.

Decode tool

Paste an encoded payload (or a full /e/… / /d/… URL) to inspect what it decodes to: