Features / SDKs · DELIVER

The player isn't a black box.It's code you control.

An iframe plays the video and stops there. The player SDK opens the box: your code tells it to play, pause, and seek, listens to every event the viewer triggers, and reads the state at any moment. Web in JavaScript, native in Expo / React Native, the same player becoming a piece of your product on both.

Control by code: play, pause, seek Player events in your UI, live Web in JS and native in Expo
web.tsts
// Web: the player becomes a real object in your code
const player = Moviie.getPlayer(iframe)
player.on('ended', () => showCta())
player.seek(90)
player.togglePlay()
Lesson.tsxts
// Native: Expo / React Native, same player
import { MoviieProvider, MoviieVideo } from '@moviie/player-expo'

export function Lesson() {
  return (
    <MoviieProvider>
      <MoviieVideo videoId="vid_8a2f" />
    </MoviieProvider>
  )
}

On the site, window.Moviie. In the app, @moviie/player-expo. The same three steps on both sides.

How the SDK solves it

The player becomes yours.On both sides.

The player SDK gives your code three things: command playback, listen to every event, and read the state when you need it. On web it's window.Moviie; on native it's @moviie/player-expo. The names change, the contract is the same, and the player starts obeying your product.

Control

Your code drives the player. Play, pause, seek.

Grab the player and tell it to play, pause, jump to a point, change the speed, go fullscreen. On the site, through window.Moviie; in the app, through the player from useMoviiePlayer. Your button is in command, not the one that came with the default controls.

  • play, pause, and seek from your code
  • Jump to any second
  • Speed, volume, and fullscreen
  • The same intent on web and native
Events

The player notifies your UI. In real time.

Subscribe to ready, play, pause, timeupdate, ended and keep your interface in sync with what the viewer does. Paint the bar on timeupdate, open the next step on ended, log whatever you want. getState() gives you a full snapshot of the player at any moment.

  • on / once / off to subscribe to events
  • ready, play, pause, timeupdate, ended
  • getState() for the full state
  • Sync your UI with the player
Truly native

In the app, it's a native component. Not a webview.

@moviie/player-expo runs on top of expo-video, with a truly native player on Expo and React Native, not a wrapped iframe. MoviieProvider at the top, useMoviiePlayer on the screen, MoviieVideo rendering. Native features like Picture-in-Picture and Cast come in through the same door.

  • Native player on top of expo-video
  • MoviieProvider + useMoviiePlayer + MoviieVideo
  • Picture-in-Picture and Cast
  • Publishable key mvi_pub_, the secret one stays on the server
Side by side

The iframe alone,or the iframe with the SDK.

The same player. The difference is who commands it and how much your code can see.

Iframe onlyWith the SDK
Control play, pause, and seekthrough the default controlsthrough your code
Events in your UIdon't arriveready, play, timeupdate, ended
Read the player's stateno waygetState() any time
In the native appwebviewcomponent on top of expo-video
Sync your interfaceguessingin real time
Picture-in-Picture and Castout of your reachthrough the same SDK

The video, both play it the same. The control, only one gives you.

Comes with it

One SDK.The whole platform behind it.

Real documentation

Every method, event, and property in the docs, with examples that run. It's not a 2019 PDF: it's docs.moviie.ai/player-api and player-expo.

The server-side counterpart

The SDK handles the client; the REST api.moviie.ai/v1 and the webhooks handle the data. Both sides talk, each in its own place.

Private video, in your control

Link signed by a short JWT, embed locked by domain. The SDK plays where you allowed it, and your backend is the one that signs.

Subtitles and dubbing

Subtitle and audio tracks arrive in the playback. Your app reads and offers them, with no need to build a subtitle player from scratch.

Stable contract

The player API is versioned: a breaking change only lands on a major version bump. Your code doesn't wake up broken.

Starts fast

The first frame shows almost on the click, delivered from the global network. Your code steps into a player that's already fast.

About the player SDK

What you can doand what you can't yet.

Native today is through @moviie/player-expo, for Expo and React Native, running on top of expo-video with a truly native player. A pure Swift SDK for iOS is in development, and Kotlin for Android comes next. The web SDK in JavaScript already runs on any page.

The embed exposes window.Moviie on the page. You grab the player with Moviie.getPlayer(iframe) and call play(), pause(), seek(), and the other methods. Wait for the ready event before commanding it, and from there the player obeys your code.

The entire playback cycle: ready, play, pause, timeupdate, ended, among others. You subscribe with on, once, and off, and use getState() to read a full snapshot of the player at any moment. That's what keeps your UI in sync with the viewer.

No, and on purpose. The player SDK runs on the client, controls playback, and listens to events. The REST api.moviie.ai/v1 and the webhooks run on the server, with your secret key, and handle the data and the backend events. Whoever builds a serious app uses both, each on its own side.

Next step

Grab a key.Build the player into your app today.

14-day trial to put the player inside your product: control by code, events in your UI, web and native. The docs are at docs.moviie.ai, with examples that run.

Control by code Events in real time Web in JS and native in Expo