Direct-source streaming engine

Real files.
No ad walls.

Drop one <iframe> into your site and get a real player. Sharky resolves each title to an actual video file and streams it into a native <video> element — not a stack of ad-riddled embeds. No popups, no redirect chains, no player to build. You pass a TMDB id; we handle the rest.

sharky@engine — resolve --title "Fight Club"
Engine
—
uptime
Library
—
indexed files
Cache hit
—
resolve rate
Transcode
—
slots in use
// how it works
Four steps, no iframes

You send a TMDB id. Everything below happens server-side before the player paints a frame.

1Warm library

A background worker keeps thousands of popular titles already resolved. Most requests are a cache hit and start in under a second.

2Live index

Anything new gets indexed on demand — 100+ releases ranked by codec and quality, then probed in parallel to find one that actually plays.

3Playability gate

H.264 + AAC wins every time. HEVC, TrueHD and 4K remuxes are demoted — a browser can't decode them, so they're never served.

4Direct or remux

MP4 streams straight to <video>. MKV is remuxed live with a seekable relay, so scrubbing still works.

// player
Built like a real one

Custom controls, not the browser's default bar.

⏯Resume

Viewers pick up where they left off, per episode. Kept in their browser — no sign-in, nothing for you to store.

💬Subtitles

Pulled from inside the file itself, so timings always match the release. Your language is remembered.

🔊Audio tracks

Auto-picks English and skips commentary. Switch tracks mid-playback without losing your place.

⏩Next up

The following episode resolves in the background while you watch, so it starts instantly.

📱Touch-first

Proper hit targets, drag-to-scrub, safe-area insets. Works the same on a phone as on a desktop.

⚡Warm cache

A background worker resolves popular titles continuously, so most plays are already cached.

// endpoints
API

Click any row to copy it. <id> is a TMDB id.

GET/embed/movie/<id>Full player for a film
GET/embed/tv/<id>/<s>/<e>Full player for an episode
GET/embed/movie/<id>?tv=1Television mode: the D-pad drives the player
GET/direct/movie/<id>Resolve to a playable URL (JSON)
GET/direct-debug/movie/<id>Same, with the full resolve trace
GET/stream-info?u=<url>Real duration, video + audio codec
GET/subtitles?u=<url>Embedded subtitle tracks
GET/subtitle.vtt?u=<url>&idx=<n>One track, converted to WebVTT
GET/audio-tracks/movie/<id>Audio tracks with language labels
GET/episodes/<id>/<season>Episode list, for an in-player picker
GET/download/movie/<id>Download the file, streamed via us
GET/download/tv/<id>/<s>/<e>Same for an episode · supports Range
POST/library/filterWhich of these titles are ready to play
GET/search?q=<query>Search films and shows
GET/status.jsonLive engine health
// integration
Drop in one iframe

Grab a TMDB id from themoviedb.org and you're done.

<!-- film --> <iframe src="https://api.sharkmovie.co.uk/embed/movie/550" allowfullscreen allow="autoplay *; fullscreen *" style="width:100%;aspect-ratio:16/9;border:0"></iframe> <!-- episode: /embed/tv/<id>/<season>/<episode> --> <iframe src="https://api.sharkmovie.co.uk/embed/tv/1396/1/1"></iframe> <!-- on a television, add ?tv=1: the remote then drives the player, and the page should forward the keys it receives --> <iframe src="https://api.sharkmovie.co.uk/embed/tv/1396/1/1?tv=1"></iframe>

A plain 16:9 box is fine. Everything — sources, episodes, audio, subtitles, download — now lives inside the player, so there is nothing below the picture to crop.

Only list what will actually play. Ask which titles are ready before you render a row, and nobody clicks something that has to be scraped from scratch:

POST /library/filter {"items": [{"id": 550, "title": "Fight Club", "year": "1999", "kind": "movie"}]} // -> {"available": [550], "checked": 1} // Up to 80 at a time. TV takes optional season / episode. // Errors answer "yes", so a hiccup here never hides what you own.
// legal
Disclaimer
Sharky does not host, store or transmit any video. It indexes publicly listed links and relays files from independent third-party services, in the same way a search engine indexes URLs. It has no affiliation with those services and no control over what they carry. Anyone embedding this player is responsible for complying with the law in their own jurisdiction. Takedown requests belong with whoever is actually hosting the file.