Open Media Essentials

Playback

Segments & subtitles

Chapter marks become skip buttons. Subtitle streams become hosted sidecars. Players fetch both from a single manifest — no separate subtitle hunt.

White Collar·S01E01·AMZN
main
  • recap
  • intro
  • credits
  • episode

One manifest

Segments and subtitles together

ffprobe reads chapter marks for skip buttons and subtitle streams for every language in the file. Clients get both from a single GET.

  • Segment timestamps

    Recap, intro, credits, and preview blocks with start and end seconds — ready for skip buttons in Jellyfin and other clients.

  • CC

    Subtitle URLs

    VTT and SRT sidecars per language, hosted and returned in the same manifest response as the segment list.

White Collar · S01E01manifest

Previously on White Collar…

EN · WebVTT

Tidligere på White Collar…

DA · WebVTT

Tidigare på White Collar…

SV · WebVTT

Segment timelineduration_ms match

Subtitle tracks

  • ENWhite.Collar.S01E01.en.vtt
  • DAWhite.Collar.S01E01.da.vtt
  • SVWhite.Collar.S01E01.sv.vtt
GET /manifest → segments[] + subtitles[]

The bar above is the stored data. The player below is what a client does with it — seek the timeline, skip colored blocks, and load subtitle tracks from the manifest.

White Collar

S01E01

White Collar · S01E01
  • Recap
  • Intro
  • Credits
  • Preview
  • Episode

Segment types

Four kinds of skippable block

Only these parts are stored and returned. The main episode body is implied by the gaps between them.

  • Intro

    Opening titles and theme song

  • Recap

    "Previously on…" segments

  • Credits

    End credits and cast rolls

  • »

    Preview

    "Next time on…" teasers

Playback API

One manifest endpoint

Reading is open. Pass TMDB id, season, episode, and duration_ms. For proper sync, POST an English reference_subtitle (SRT or VTT) from the player — highly recommended.

Example requests

GET http://metadata.kilr.dk/manifest?tmdb=21510&season=1&episode=1&duration_ms=1384000

POST /manifest (multipart: tmdb, season, episode, duration_ms, reference_subtitle)

Bulk export: GET /dump (ODbL 1.0)

manifest responsejson
{
  "segments": [
    { "type": "recap",   "start_seconds": 0,      "end_seconds": 52.1,   "source": "ingest" },
    { "type": "intro",   "start_seconds": 52.1,   "end_seconds": 98.4,   "source": "ingest" },
    { "type": "credits", "start_seconds": 1320.5, "end_seconds": 1384.0, "source": "ingest" }
  ],
  "subtitles": [
    { "language": "en", "url": "https://…/White.Collar.S01E01.en.vtt" },
    { "language": "da", "url": "https://…/White.Collar.S01E01.da.vtt" }
  ]
}

Integrations

Using it in players

Plain JSON over HTTP — anything that plays video can read the manifest.

  • Jellyfin

    Built

    Server plugin using Jellyfin's IMediaSegmentProvider. Skip buttons appear in the web client after a media segment scan.

  • Stremio

    Planned

    Addon for manifest subtitle URLs. Skip buttons aren't part of the Stremio addon protocol today.

Pipeline

How playback data flows

  1. 1

    Run the CLI on your library

    Point ome at a file or folder. Only chapter and subtitle metadata reaches POST /ingest — video never leaves your machine.

  2. 2

    We probe and match

    ffprobe reads chapters and subtitle streams. Duplicates are skipped; shows are matched to TMDB on the server.

  3. 3

    Your player asks

    POST /manifest with TMDB id, season, episode, duration_ms, and an English reference subtitle (recommended) returns synced segments and subtitle URLs.

Contribute

Grow segment data from your library

Run the CLI against files with chapter marks. You need an API key from your account page.

ome --file ./White.Collar.S01E01.AMZN.mkv

# watch a folder
ome --watch ./library/

Filename must include show, season, episode, and provider — e.g. White.Collar.S01E01.AMZN.mkv.

  • Reading is open. Uploading needs a bearer token from /account.
  • There is a 60-second grace window on duration_ms. Outside it, /manifest returns 404 rather than guess.