REST APIJSONOAuth 2.0

BOSS Platform API

Build on the BOSS platform with RESTful APIs. Integrate streaming, AI workflows, monetization, analytics, apps, podcasting, and video playback into your own products.

Base URLhttps://api.go-boss.io/v1

Getting Started

Authentication

All API requests require an API key passed in the Authorization header as a Bearer token. Keys are scoped to your workspace and can be rotated from the BOSS Media Studio.

bash
curl https://api.go-boss.io/v1/streams \
  -H "Authorization: Bearer sk_live_Xt9mK2pQrNvLwA4jBcFhZeDo" \
  -H "Content-Type: application/json"

Keep API keys secret. Do not expose them in client-side code or public repositories.


Base URL

All endpoints are relative to the base URL below. The API is versioned via the URL path — the current stable version is v1.

EnvironmentBase URL
Production
https://api.go-boss.io/v1
Sandbox
https://sandbox.api.go-boss.io/v1

Rate Limits

Rate limits are enforced per API key. When exceeded, the API returns a 429 response with a Retry-After header.

PlanRequests / minConcurrent StreamsStorage
Starter1005100 GB
Professional1,000251 TB
EnterpriseUnlimitedUnlimitedCustom

Error Codes

All errors return a JSON body with a consistent shape. Inspect the code field to identify the failure type programmatically.

json
{
  "error": {
    "code": "rate_limit_exceeded",
    "message": "Too many requests. Retry after 60 seconds.",
    "status": 429
  }
}
StatusCodeDescription
400bad_requestMalformed request syntax
401unauthorizedInvalid or missing API key
403forbiddenInsufficient permissions
404not_foundResource does not exist
409conflictResource already exists
422validation_errorInvalid request parameters
429rate_limit_exceededRate limit reached
500server_errorInternal server error
503service_unavailableService temporarily down

BOSS IQ

v1

AI-powered content intelligence — dubbing, metadata generation, semantic search, and short-clip extraction. Submit jobs and poll for results asynchronously.

Endpoints

POST/v1/ai/dub
POST/v1/ai/metadata
GET/v1/ai/search
POST/v1/ai/clips
GET/v1/ai/jobs/{jobId}

Example — POST /v1/ai/dub

Request

bash
curl https://api.go-boss.io/v1/ai/dub \
  -X POST \
  -H "Authorization: Bearer sk_live_••••••••••••••••" \
  -H "Content-Type: application/json" \
  -d '{
    "content_id": "cnt_01hwABC456",
    "source_language": "en",
    "target_languages": ["es", "fr", "de"],
    "preserve_speaker_tone": true
  }'

Response

json
{
  "job_id": "job_01hwDEF789",
  "status": "processing",
  "content_id": "cnt_01hwABC456",
  "target_languages": ["es", "fr", "de"],
  "estimated_completion": "2025-06-01T10:12:00Z"
}

Analytics & Reporting

v1

Real-time analytics, churn insights, and revenue tracking. Query viewer engagement, subscription trends, and conversion metrics across your entire platform.

Endpoints

GET/v1/analytics/overview
GET/v1/analytics/users
GET/v1/analytics/churn
GET/v1/analytics/revenue
GET/v1/analytics/content/{id}

Example — GET /v1/analytics/overview

Request

bash
curl "https://api.go-boss.io/v1/analytics/overview?period=30d" \
  -H "Authorization: Bearer sk_live_••••••••••••••••"

Response

json
{
  "period": "30d",
  "total_views": 2847391,
  "unique_viewers": 184023,
  "watch_time_hours": 956234,
  "churn_rate": 0.042,
  "revenue": {
    "total": 284729.50,
    "currency": "USD",
    "growth_pct": 12.4
  }
}

Monetize your content

v2

Create and manage subscription plans, pay-per-view events, and ad configurations. Access transaction history and subscriber data in real time.

Endpoints

GET/v1/monetization/plans
POST/v1/monetization/plans
PUT/v1/monetization/plans/{id}
GET/v1/monetization/subscriptions
GET/v1/monetization/transactions

Example — POST /v1/monetization/plans

Request

bash
curl https://api.go-boss.io/v1/monetization/plans \
  -X POST \
  -H "Authorization: Bearer sk_live_••••••••••••••••" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Premium Monthly",
    "price": 14.99,
    "currency": "USD",
    "interval": "month",
    "features": ["4K streaming", "Offline downloads", "Ad-free"]
  }'

Response

json
{
  "id": "plan_01hwJKL345",
  "name": "Premium Monthly",
  "price": 14.99,
  "currency": "USD",
  "interval": "month",
  "active": true,
  "subscriber_count": 0,
  "created_at": "2025-06-01T10:00:00Z"
}

Podcasts

v1

Host and distribute branded podcasts with full RSS, analytics, and monetization support. Manage shows, episodes, and scheduled releases programmatically.

Endpoints

GET/v1/podcasts
POST/v1/podcasts
GET/v1/podcasts/{id}
GET/v1/podcasts/{id}/episodes
POST/v1/podcasts/{id}/episodes

Example — POST /v1/podcasts/{id}/episodes

Request

bash
curl https://api.go-boss.io/v1/podcasts/pod_01hwMNO678/episodes \
  -X POST \
  -H "Authorization: Bearer sk_live_••••••••••••••••" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "The Future of Streaming Technology",
    "description": "We explore how AI is reshaping OTT platforms.",
    "audio_url": "https://cdn.go-boss.io/audio/ep_draft_01.mp3",
    "publish_at": "2025-06-05T09:00:00Z"
  }'

Response

json
{
  "id": "ep_01hwPQR901",
  "podcast_id": "pod_01hwMNO678",
  "title": "The Future of Streaming Technology",
  "status": "scheduled",
  "publish_at": "2025-06-05T09:00:00Z",
  "duration_seconds": 2847
}

Overview

Introduction

Overview of BOSS Player SDKs across web, mobile, and TV platforms.

BOSS Player is GO BOSS's multi-platform video player SDK. Integrate once with a player key from the BOSS CMS, and get playback, DRM, ads, analytics, casting, and feature gating on every screen your app supports.

This documentation is modeled after professional SDK guides (Sendbird, Firebase): install instructions, initialize samples, full configuration tables, and event references for each platform.

Supported platforms

PlatformPackage / productStatus
Webboss-web-player-sdk (npm)Available
iOSVuedataPlayerSDK (SPM binary)Available (1.0.4)
Androidcom.goboss:videoplayer-sdk (GitHub Packages)Available
Apple TVVuedataAppleTVPlayerSDKAvailable (source); public SPM package coming soon
Android TV / Fire TVSame Kotlin TV SDK (boss-player-android-tv)Available
Fluttervd_flutter_player_sdk (pub.dev)Available (mobile)
React Native@goboss/react-native-video-player-sdk (npm)Available
Flutter TV—Coming soon
Fire TV

Fire TV uses the Android TV SDK. There is no separate Fire TV package. Devices are detected via Android Leanback.

How it works

mermaid
flowchart LR
  CMS[BOSS CMS] -->|player key| App[Your app]
  App -->|SDK init| API[BOSS Player API]
  API -->|features and entitlement| SDK[BOSS Player SDK]
  SDK --> Playback[Playback UI]
  1. Create or copy a player key in BOSS CMS (BOSS Player section).
  2. Install the SDK for your platform.
  3. Call the platform initialize API with the player key (where required).
  4. Pass a stream URL and optional custom parameters (theme, DRM, ads, watermark, headers).
  5. The SDK contacts POST /api/player/sdk/init and applies feature gates (ads, DRM, cast, PiP, subtitles, and more).

What you get

  • HLS / DASH / progressive playback
  • Tenant player key entitlement and feature flags
  • Theme color, watermark, and UI controls
  • DRM (Widevine / FairPlay / PlayReady where supported)
  • SSAI / MediaTailor overlay ads
  • Analytics sessions, heartbeats, and event callbacks
  • Platform extras: Chromecast, AirPlay, PiP, key moments, chapters, subtitles

Next steps

Getting started

Obtain a player key and play your first video with BOSS Player.

Follow these steps to play your first video with BOSS Player.

1. Get a player key

  1. Sign in to BOSS CMS.
  2. Open BOSS Player (or Monetization → player settings, depending on your tenant layout).
  3. Copy your player key (often prefixed like bsp_… or vd_…).

You will pass this key as playerKey / apiKey when initializing the SDK.

2. Pick a platform

If you are building…Start here
Browser / React / Vue / AngularWeb SDK
iPhone / iPadiOS SDK
Android phone / tabletAndroid SDK
Apple TVApple TV SDK
Android TV or Fire TVAndroid TV / Fire TV
Flutter mobileFlutter SDK
React NativeReact Native SDK

3. Minimal examples

Web (React)

tsx
import { BossVideoPlayer } from 'boss-web-player-sdk';
import 'boss-web-player-sdk/css';

export function App() {
  return (
    <BossVideoPlayer
      playerKey="YOUR_PLAYER_KEY"
      src="https://cdn.example.com/video.m3u8"
      title="My Video"
      themeColor="#865fe3"
    />
  );
}

iOS (Swift)

swift
import VuedataPlayerSDK

VuedataPlayer.initialize(apiKey: "YOUR_PLAYER_KEY") { result in
    guard case .success = result else { return }
    // present player after success
}

let config = VuedataPlayerConfiguration(
    videoURL: URL(string: "https://cdn.example.com/video.m3u8")!,
    title: "My Video",
    defaultOrientation: .landscape
)

let player = VuedataPlayerViewController(configuration: config)
present(player, animated: true)

Android (Kotlin)

kotlin
VideoPlayerActivity.launch(
    context,
    PlayerConfiguration(
        title = "My Video",
        videoUrl = "https://cdn.example.com/video.m3u8",
        apiKey = "YOUR_PLAYER_KEY",
    )
)

Flutter

dart
await VideoPlayerSDK.initialize(apiKey: 'YOUR_PLAYER_KEY');

VdPlayerView(
  configuration: VdPlayerConfiguration(
    title: 'My Video',
    videoUrl: Uri.parse('https://cdn.example.com/video.m3u8'),
  ),
)

React Native

tsx
import { RNVideoPlayer } from '@goboss/react-native-video-player-sdk';

<RNVideoPlayer
  src="https://cdn.example.com/video.m3u8"
  playerKey="YOUR_PLAYER_KEY"
  title="My Video"
  themeColor="#865fe3"
/>

4. Add custom parameters

Once playback works, explore shared options such as DRM, ads tracking URL, watermark, headers, start position, and analytics callbacks:

Checklist

  • To do: Player key from CMS
  • To do: SDK installed for your platform
  • To do: Valid HTTPS stream URL (HLS/DASH/MP4)
  • To do: Theme color / branding (optional)
  • To do: Event listeners for errors and analytics (recommended for production)

Guides

Player key & init

How BOSS Player authenticates tenants and applies feature gates.

Every BOSS Player SDK can authenticate against the BOSS backend using a player key issued in the CMS. Successful init returns an entitlement package that gates features (ads, DRM, cast, PiP, subtitles, key moments, and more).

API

http
POST /api/player/sdk/init
Header: x-player-key: YOUR_PLAYER_KEY

Per-platform init

PlatformHow you pass the keyInit call
WebplayerKey prop (required on BossVideoPlayer / createPlayer)SDK calls init internally
React NativeplayerKey propinitPlayer → same endpoint
iOSVuedataPlayer.initialize(apiKey:) and/or config heartbeatExplicit + optional
AndroidVideoSDK.initializeSdk(apiKey) / apiKey on configExplicit
Apple TVVuedataPlayerSDK.initialize(apiKey:)Explicit
FlutterVideoPlayerSDK.initialize(apiKey:)Explicit

Feature gates

After init, the backend returns licensed features. Typical flags include:

  • Stream formats (e.g. HLS / m3u8)
  • Subtitles, playback speed, quality, multi-audio
  • Key moments / chapters
  • DRM
  • Screen recording / content protection
  • Ads / SSAI
  • Chromecast, AirPlay, PiP

Unavailable features are hidden or disabled in the player UI.

Sessions & heartbeats

Most SDKs also start a playback session and send heartbeats / analytics events:

  • session/start
  • session/heartbeat
  • session/end
  • event logging (play, pause, seek, quartiles, errors, …)

See Analytics for details.

Security tips

  • Treat the player key like a client credential: restrict by domain / app where CMS allows it.
  • Prefer short-lived DRM auth tokens over embedding long-lived secrets in the client.
  • Use HTTPS for all stream and license URLs.

Custom parameters

Shared configuration options across BOSS Player SDKs.

BOSS Player SDKs share a common configuration model even though property names differ slightly by language. Use this guide as a cross-platform map, then open the platform Configuration page for exact types.

Identity & auth

ConceptWeb / RNiOS / Apple TV / FlutterAndroid / Android TV
Player keyplayerKeyapiKey / initialize(apiKey:)apiKey / VideoSDK.initializeSdk
Content id— (use analytics props)videoID / videoId— (title + URL)
Custom headersheaders (RN), proxiesheadersProvider, playbackHeadersProvidervia config / DRM

Media

ConceptTypical namesNotes
Stream URLsrc, videoURL, videoUrlHLS (.m3u8), DASH, MP4
TitletitleShown in chrome / analytics
Start positioninitialTime, startTimeSeconds, startPosition, startPositionMsResume / deep link
LiveisLive / isLivevideo / isLiveStreamAffects live edge UI
Multi-sourcesrc: SourceItem[], playbackUrlsWeb / Flutter

Branding & UI

ConceptTypical namesNotes
Theme / accentthemeColor, style accentMatch CMS purple #865fe3 or your brand
Watermarkwatermark, watermarkTextOverlay text
ControlsenableControls, feature flagsHide chrome when embedding
Subtitle stylesubtitleStyleFont / color / background
Autoplay / muteautoplay, muted, autoPlayBrowser policies may block unmuted autoplay
Orientation (iOS)defaultOrientation (required), orientationPolicye.g. .landscape / .portrait; see iOS configuration

DRM

FieldPurpose
widevineLicenseUrlAndroid / Chrome Widevine (web, RN, etc.)
fairplayLicenseUrlSafari / RN iOS / Flutter iOS where host config exists
playreadyLicenseUrlPlayReady where supported
authToken / authHeaderLicense request auth
allowedDomainsDomain allow-list
watermarkTextForensic / overlay watermark
Native iOS

The native iOS SDK does not expose host-facing FairPlay/DRM configuration — DRM is a license flag only. See DRM guide.

Full details: DRM.

Ads

FieldPurpose
adTrackingUrl / overlayAdTrackingUrl / mediaTailorTrackingURLSSAI / MediaTailor tracking
overlayAdUrlOverlay creative endpoint (web)
adsEnabled / isOverlayAdsEnabledToggle ads
enableSkipAd / skipAdAfterSecondsSkip behavior (web)

Full details: Ads & SSAI.

Timeline metadata

ConceptNames
Chapterschapters, chaptersDisplayMode
Key momentskeyMoments, onKeyMomentsLoaded
Subtitlessubtitles, subtitleURL / externalSubtitleUrl / subTitleMap
Thumbnailsthumbnails, sprite configs

Feature flags

Many SDKs expose toggles such as:

  • Chromecast / AirPlay / PiP
  • Quality / speed / audio tracks
  • Fullscreen / gestures
  • Content protection / secure mode
  • Key moments / thumbnails

When a player key is present, server entitlements usually override local flags.

Analytics callbacks

PlatformHook
WebonAnalyticsEvent, delegate
React NativeDelegate props (playerDidStartPlaying, …)
iOS / tvOSVuedataPlayerDelegate, analyticsHandler
AndroidVideoPlayerEventListener
FlutteranalyticsHandler, VdPlayerCallbacks

See Events & delegates and Analytics.

Example: rich web config

tsx
<BossVideoPlayer
  playerKey="bsp_your_key"
  src="https://cdn.example.com/master.m3u8"
  title="Episode 1"
  themeColor="#865fe3"
  watermark="SECURE VIEW"
  autoplay
  muted
  initialTime={30}
  adTrackingUrl="https://ads.example.com/v1/tracking/…"
  drmConfig={{
    authToken: "…",
    widevineLicenseUrl: "https://license.example.com/widevine",
    fairplayLicenseUrl: "https://license.example.com/fairplay",
  }}
  onAnalyticsEvent={(e) => console.log(e.eventType, e)}
/>

Example: rich iOS config

swift
let config = VuedataPlayerConfiguration(
    videoURL: streamURL,
    title: "Episode 1",
    defaultOrientation: .landscape,
    videoID: "ep-1",
    mediaTailorTrackingURL: trackingURL,
    contentDuration: 2400,
    chromeCastEnabled: true,
    pictureInPictureEnabled: true
)

DRM

Configure Widevine, FairPlay, and PlayReady for BOSS Player.

BOSS Player supports common DRM schemes on platforms that expose host-facing license configuration. Exact field names vary by platform; entitlement must include DRM in the player key package where licensing applies.

Supported schemes (where configured by the host)

SchemeTypical platforms
WidevineAndroid, Chrome, Android TV, Fire TV, Flutter Android, RN Android
FairPlaySafari / RN iOS / Flutter iOS when the platform exposes license URLs
PlayReadyWhere the web / device stack supports it

Common web / RN fields

ts
type DRMConfig = {
  widevineLicenseUrl?: string;
  fairplayLicenseUrl?: string;
  playreadyLicenseUrl?: string;
  authToken?: string;
  authHeader?: string;
  allowedDomains?: string[];
  watermarkText?: string;
};
Field naming

Prefer widevineLicenseUrl — that matches the typed SDK surfaces.

Web

tsx
<BossVideoPlayer
  playerKey="bsp_…"
  src="https://cdn.example.com/encrypted.m3u8"
  drmConfig={{
    authToken: "LICENSE_TOKEN",
    widevineLicenseUrl: "https://license.example.com/widevine",
    fairplayLicenseUrl: "https://license.example.com/fairplay",
    playreadyLicenseUrl: "https://license.example.com/playready",
  }}
/>

React Native

tsx
<RNVideoPlayer
  src="https://cdn.example.com/encrypted.m3u8"
  playerKey="…"
  drmConfig={{
    authToken: "LICENSE_TOKEN",
    widevineLicenseUrl: "https://license.example.com/widevine",
    fairplayLicenseUrl: "https://license.example.com/fairplay",
  }}
  enableSecureMode
/>

iOS (native SDK)

No host-facing FairPlay config

On the native iOS SDK (VuedataPlayerSDK), DRM appears as a licensing flag only. There is no host-facing FairPlay/DRM configuration API. Do not advertise FairPlay support for iOS integrations that only use the native package. Screen-capture protection is unrelated to FairPlay — see iOS features.

Use content-protection / screenshot-preventing view factories when your license and product requirements call for them.

Android / Android TV

Enable content protection on PlayerConfiguration (isContentProtectionEnabled) and integrate license acquisition through your approved DRM path for that build.

Flutter

DRM may appear in licensed features after VideoPlayerSDK.initialize. Combine with header providers for auth as needed; verify depth against the package version you pin.

Checklist

  • To do: Player key includes DRM entitlement (where required)
  • To do: Correct license URL per scheme / platform that supports host config
  • To do: Auth token refreshed before expiry
  • To do: Test on real devices for each scheme you claim
  • To do: Do not document FairPlay host APIs for native iOS

Ads & SSAI

MediaTailor, overlay ads, and ad break callbacks in BOSS Player.

BOSS Player integrates server-side ad insertion (SSAI) and overlay ad tracking. Ads are typically gated by the player key entitlement.

Concepts

ConceptDescription
MediaTailor / tracking URLTracking endpoint passed into the player for SSAI beacons
Overlay adsCompanion / overlay creatives during playback
Ad breaksTimed ranges; SDKs expose start/end callbacks
SkipWeb supports skip-after-N-seconds style controls

Web

tsx
<BossVideoPlayer
  playerKey="bsp_…"
  src="https://cdn.example.com/ssai.m3u8"
  adTrackingUrl="https://ads.example.com/v1/tracking/…"
  overlayAdUrl="https://ads.example.com/overlay"
  enableSkipAd
  skipAdAfterSeconds={5}
/>

Lower-level WebVideoPlayer also exposes onAdBreakChange and pauseAdOnTabSwitch.

Core APIs:

  • getAdBreaks() / setAdBreaks() / isInAdBreak()
  • Events: adbreaksloaded, adbreakchange

React Native

tsx
<RNVideoPlayer
  src="…"
  playerKey="…"
  adTrackingUrl="https://ads.example.com/v1/tracking/…"
/>

Analytics may emit ad_break_start, ad_break_end, ad_marker_error.

iOS

swift
let config = VuedataPlayerConfiguration(
    videoURL: url,
    title: "Episode",
    defaultOrientation: .landscape,
    videoID: "ep-1",
    adsEnabled: true,
    contentDuration: 2400,
    mediaTailorTrackingURL: trackingURL
)

Delegate callbacks cover SSAI ad-break start, finish, and watched-ad skip (see iOS events).

SSAI is VOD-only on iOS

Ad support is disabled whenever isLivevideo == true. Provide contentDuration when available so the SDK can map stitched stream time back to content time.

Android / Android TV

kotlin
PlayerConfiguration(
    title = "Episode",
    videoUrl = url,
    isOverlayAdsEnabled = true,
    overlayAdTrackingUrl = "https://ads.example.com/v1/tracking/…",
)

Listener: onAdBreakStarted, onAdBreakCompleted.

Flutter

Ads are feature-gated after init. Pass tracking through your configuration / entitlement package as documented for your SDK version.

CMS

Configure ad ingestion and tracking in BOSS CMS → Monetization → Ad Ingestion. The player key must include ads in its licensed features for client SDKs to show ad UI.

Analytics

Sessions, heartbeats, and playback analytics events.

BOSS Player SDKs report playback telemetry to the BOSS backend and optionally to Firebase / custom handlers.

Session lifecycle

text
init → session/start → heartbeats + events → session/end
CallPurpose
session/startBegin a viewing session
session/heartbeatKeep-alive / watch progress
session/endClose the session
event logNamed playback events

Heartbeat interval is often configurable (default commonly 30 seconds).

Common event names

EventWhen
play / pausePlayback state
seekUser seek
ended / completeFinished
buffering_start / buffering_endRebuffer
stallPlayback stall
quality_changeAbr / manual quality
audio_track_changeAudio selection
subtitle_changeCaption selection
speed_changeRate change
volume_change / muteVolume
key_momentsKey moment interaction
pip_togglePicture-in-picture
fullscreen_enter / fullscreen_exitFullscreen
cast_start / cast_stopCasting
error / network_errorFailures
Quartiles / watch_progress / heartbeatProgress

Platform-specific extras (live edge, ad breaks) appear on React Native and Android.

Wiring handlers

Web

tsx
<BossVideoPlayer
  playerKey="…"
  src="…"
  firebaseConfig={/* optional */}
  onAnalyticsEvent={(e) => {
    console.log(e.eventType, e);
  }}
/>

iOS

swift
analyticsHandler: { event in
    print(event.name, event.parameters)
}

Android

Implement VideoPlayerEventListener and/or use the bundled analytics module (com.vd.analytics).

Flutter

dart
analyticsHandler: (event) {
  // event name + parameters
},
callbacks: VdPlayerCallbacks(
  watchHistoryCallback: (pos, duration) {},
),

React Native

Use delegate props and optional @react-native-firebase/analytics.

Privacy

  • Do not put PII in custom analytics properties unless your policy allows it.
  • Align retention with your tenant's CMS / data settings.

Events & delegates

Cross-platform map of BOSS Player playback callbacks.

Each SDK exposes playback lifecycle callbacks. Names differ, but the concepts align.

Lifecycle

ConceptWeb PlayerDelegateReact Native propsiOS / tvOSAndroid listenerFlutter callbacks
StartedplayerDidStartPlayingplayerDidStartPlayingplayerDidStartPlayingonVideoPlayed / onPlayerReadystarted
ResumeplayerDidResumeplayerDidResumeresumeonVideoPlayedresume
PauseplayerDidPauseplayerDidPausepauseonVideoPausedpause
FinishedplayerDidFinishPlayingplayerDidFinishPlayingfinishonVideoCompletedcomplete
DismissplayerDidDismissplayerDidDismissdismiss / willDismissonPlayerExitdismiss
Seekseek start/finishseek propsseekonForward / onRewind / progressseek start/end
Bufferingbuffering callbacksbuffering propsbuffering(via progress/state)buffering
Errorplayback / networkerror propserroronPlayerErrorplayback / network errors
Time updateplayerDidUpdateCurrentTimetime update propcurrent timeonProgressUpdateposition (where wired)

Track & UI changes

Quality, subtitle, audio, speed, fullscreen, PiP, key moments, and ad breaks are exposed on platforms that support those features. See each platform's Events page for the exact method signatures.

Web core emitter

If you use boss-web-player-sdk/core, subscribe with player.on(event, handler):

play, pause, ended, timeupdate, seeking, buffering, volumechange, ratechange, pipchange, error, qualitylevels, qualitychange, subtitlesloaded, audiotracksloaded, audiotrackchange, keymomentsloaded, chaptersloaded, adbreaksloaded, adbreakchange, unsupportedcodec

Best practices

  1. Always handle error callbacks in production.
  2. Use watch progress / time updates to persist resume position.
  3. Prefer analytics handlers for telemetry; keep UI delegates for UX only.
  4. On TV, prefer D-pad-friendly flows and test dismiss / back carefully.

Web SDK

Web — Overview

BOSS Player Web SDK overview and license gating.

Package: boss-web-player-sdk (npm) Surfaces: BossVideoPlayer (React), createPlayer (vanilla), boss-web-player-sdk/core (headless)

The Web SDK delivers a production player for browsers with:

  • HLS / DASH / progressive playback (hls.js + dashjs bundled)
  • Tenant playerKey entitlement and feature gating
  • Theme color, watermark, chapters, key moments, subtitles
  • DRM config (Widevine / FairPlay / PlayReady where the browser supports it)
  • SSAI / overlay ads tracking
  • Chromecast, PiP, fullscreen
  • Analytics sessions and onAnalyticsEvent / PlayerDelegate
License gating

With playerKey, entitlements come from POST /api/player/sdk/init. Local feature toggles cannot unlock unlicensed capabilities.

Web — Installation

Install the BOSS Player Web SDK from npm.

Requirements

RequirementValue
RuntimeModern evergreen browsers
BrowsersChrome/Edge 90+, Firefox 88+, Safari 14+, Android Chrome 90+
Node18+ (for bundling)
React (component path)18+ or 19+
Package managernpm / yarn / pnpm
CSSMust import boss-web-player-sdk/css once

Install

bash
npm install boss-web-player-sdk
ts
import 'boss-web-player-sdk/css';

Optional: npm install firebase for analytics.

Package exports

ImportPurpose
boss-web-player-sdkBossVideoPlayer, createPlayer, WebVideoPlayer, ErrorScreen, FirebaseAnalyticsProvider, and the initSdk / startSession / sendHeartbeat / endSession / sendEvent API helpers
boss-web-player-sdk/coreHeadless VideoPlayerSDK
boss-web-player-sdk/cssPlayer styles

Source repo: GO-BOSS-PRODUCTS/boss-player-web-sdk (use branch development if cloning)

Web — Quick start

Create a BOSS Player instance on the web.

playerKey and src are required for gated UI. Prefer mounting only after you have a valid key from CMS.

tsx
import { BossVideoPlayer } from 'boss-web-player-sdk';
import 'boss-web-player-sdk/css';

export function Player() {
  return (
    <BossVideoPlayer
      playerKey="bsp_your_player_key"
      src="https://cdn.example.com/video.m3u8"
      title="My Video"
      themeColor="#865fe3"
      autoplay
      muted
      onAnalyticsEvent={(e) => console.log(e.eventType)}
    />
  );
}

What happens on init

  1. SDK sends POST /api/player/sdk/init with x-player-key.
  2. Entitlements unlock licensed features.
  3. Player mounts UI, loads the stream, and starts analytics when playback begins.

Override API host with apiBaseUrl when needed.

Web — Configuration

Props and options for the BOSS Player Web SDK with types.

Required (BossVideoPlayer / createPlayer)

PropTypeDescription
playerKeystringCMS player key
srcstring | SourceItem[]Stream URL(s)

Optional

PropTypeDefault / notesDescription
titlestring—Display / analytics title
themeColorstringBrand defaultAccent color (e.g. #865fe3)
watermarkstring—Overlay watermark text
autoplaybooleanfalse-ish / browser dependentAuto-start
mutedbooleanOften needed for autoplayStart muted
autoFullscreenboolean—Enter fullscreen on play
enableControlsboolean—Show player chrome
enableSkipAdboolean—Allow skipping ads
skipAdAfterSecondsnumber—Skip delay
initialTimenumber0Start position (seconds)
subtitlesSubtitleTrack[]—External WebVTT/SRT tracks, merged with any found in the manifest
drmConfigDRMConfig—License URLs + auth
firebaseConfigFirebaseConfig—Firebase analytics
proxyDomainsstring—
apiBaseUrlstringMay default to dev APIOverride API host
adTrackingUrlstring—SSAI tracking
overlayAdUrlstring—Overlay ads endpoint
chaptersDisplayMode'strip' | 'panel'—Chapters UI
volumeControlType'slider' | 'button'—Volume control
subtitleStyleobject—Caption styling
onTimeUpdate(currentTime: number) => void—Fires on every time update; use to persist watch progress
onAnalyticsEvent(event: AnalyticsEvent) => void—Analytics payload
onKeyMomentsLoaded(keyMoments: Chapter[]) => void—Key moments ready
delegatePlayerDelegate—Typed lifecycle callbacks
videoIdstring—Content id reported with analytics
artworkUrlstring—Poster used by OS media surfaces (lock screen, PiP). Omit rather than passing a placeholder
licenseKeystring—License key for playback authorization
enableQualitybooleanInit API multipleResolutionForce-show the Quality (ABR) menu
enableSourcesbooleanfalseShow the multi-source format-tier picker; prefer the Quality menu
featureOverridesPartial<Record<string, boolean>>—Hide entitled features locally. Cannot unlock unentitled ones — true on a missing feature is a no-op

Intro / outro and next episode

PropTypeDefault / notesDescription
introStartTimenumber—Start of a skippable intro, in seconds
introEndTimenumber—End of the intro; Skip Intro seeks here
outroStartTimenumber—Start of the outro, where the Next Episode chip appears
hasNextEpisodeboolean—Whether another episode is available to advance into
nextEpisodeLabelstring"Next Episode"Label on the Next Episode chip
nextEpisodeThumbnailUrlstring—Thumbnail shown above the chip
nextEpisodeAutoAdvanceSecondsnumber5Countdown before auto-advancing
onNextEpisode() => void—Fires on chip click or countdown completion

DRMConfig

FieldDescription
widevineLicenseUrlWidevine license server
fairplayLicenseUrlFairPlay license server
playreadyLicenseUrlPlayReady license server
authTokenToken for license requests
authHeaderHeader name for auth
allowedDomainsDomain allow-list
watermarkTextDRM watermark text

Web — Features

Web SDK feature support matrix.

CapabilitySupport & conditions
HLS / DASH / MP4Bundled engines; gated UI requires valid playerKey
Theme / watermarkthemeColor, watermark
Subtitles / chapters / key momentsProps + entitlement
Quality / speed / audioWhen licensed / enabled
DRMdrmConfig license URLs + auth; browser-scheme dependent
SSAI / overlay adsadTrackingUrl, overlayAdUrl, skip controls
ChromecastWhen enabled + licensed
PiP / fullscreenBrowser + feature flags
AnalyticsonAnalyticsEvent, optional Firebase
Headless coreboss-web-player-sdk/core — ungated programmatic API

Web — Events

Analytics events and PlayerDelegate callbacks for the Web SDK.

onAnalyticsEvent

eventType values include:

play, pause, seek, ended, complete, buffering_start, buffering_end, stall, quality_change, audio_track_change, volume_change, speed_change, subtitle_change, mute, fast_forward, fast_backward, key_moments, pip_toggle, fullscreen_enter, fullscreen_exit, cast_start, cast_stop, error, network_error, session_start, video_loaded, first_quartile, midpoint, third_quartile, heartbeat, watch_progress, streaming_time

Tip

Persist resume position from watch_progress / time updates, and end sessions cleanly with destroy() on unmount.

PlayerDelegate

Typed callbacks:

  • Start / resume / pause / finish / dismiss
  • Seek start / finish
  • Current time updates
  • Buffering
  • Quality / subtitle / audio / speed changes
  • Fullscreen, key moment, PiP
  • Playback and network errors
tsx
<BossVideoPlayer
  playerKey="…"
  src="…"
  delegate={{
    playerDidStartPlaying: () => {},
    playerDidPause: () => {},
    playerDidFinishPlaying: () => {},
    playerDidEncounterPlaybackError: (code, message) => {
      console.error(code, message);
    },
  }}
/>

Core emitter events

play, pause, ended, timeupdate, seeking, buffering, volumechange, ratechange, pipchange, error, qualitylevels, qualitychange, subtitlesloaded, audiotracksloaded, audiotrackchange, keymomentsloaded, chaptersloaded, adbreaksloaded, adbreakchange, adbreakdiscoverysettled, unsupportedcodec

Web — Best practices

Web SDK integration gotchas.

  1. Import CSS once — import 'boss-web-player-sdk/css'.
  2. Require playerKey + src on gated UI (BossVideoPlayer / createPlayer).
  3. Prefer muted autoplay — browsers often block unmuted autoplay.
  4. Set apiBaseUrl for production — packages may default to the dev API host.
  5. Use drmConfig field names from types — prefer widevineLicenseUrl over outdated README aliases.
  6. Destroy players — call destroy() / unmount to end sessions cleanly.
  7. Handle error / network_error in analytics or delegate callbacks.
  8. Checkout development if cloning the private monorepo (main may be empty).

Web — Playback control

Programmatic play, pause, seek, and related APIs.

Gated mount (createPlayer)

ts
const player = createPlayer(el, { playerKey, src });
player.update({ src: nextUrl, title: 'Next' });
player.destroy();

Headless core (VideoPlayerSDK)

ts
player.play();
player.pause();
player.seek(30);
player.setVolume(0.8);
player.setMute(true);
player.setPlaybackRate(1.25);
player.setQuality(level);
player.setAudioTrack(track);
player.toggleFullscreen();

player.getCurrentTime();
player.getDuration();
player.getVolume();
player.isMuted();
player.getPlaybackRate();
player.getQualityLevels();
player.getActiveQuality();
player.getAudioTracks();
player.getBufferLength();
player.getBufferedRanges();
player.getVideoElement();

player.getAdBreaks();
player.setAdBreaks(breaks);
player.isInAdBreak();
player.destroy();

Modules on the instance

analytics, keyMoments, chapters, subtitles, drm, casting, thumbnails

Events

ts
player.on('timeupdate', handler);
player.off('timeupdate', handler);

See Events for the full list.

Web — Troubleshooting

Common Web SDK issues and fixes.

SymptomFix
Player UI missing stylesImport boss-web-player-sdk/css once
Init fails / features missingVerify playerKey; check network tab for /api/player/sdk/init
Autoplay blockedStart muted or require a user gesture
DRM fails on SafariProvide fairplayLicenseUrl + valid token; test on Safari/macOS
CORS / stream errorsEnsure CDN CORS and proxyDomains / headers are correct
Wrong API environmentSet apiBaseUrl to production
Empty git cloneCheckout development branch

Still stuck? Capture the analytics error / network_error payload and the init response body for support.

Report with: SDK version, browser/OS, reproduction steps, network traces for /api/player/sdk/init.

iOS SDK

iOS — Overview

BOSS Player iOS SDK overview, capabilities, and license gating.

Audience: iOS application developers integrating the SDK, and SDK maintainers Latest distributable version: 1.0.4

VuedataPlayerSDK is a UIKit-based iOS video player built for HLS playback. It bundles the pieces most streaming apps need out of the box:

  • Configurable playback controls and quality / audio track selection
  • Captions and subtitles (manifest-based and external WebVTT)
  • Playback speed control
  • Key moments (chapters)
  • Server-side ad insertion (SSAI)
  • AirPlay and Google Cast
  • Picture in Picture
  • Analytics and watch-history callbacks
  • Orientation handling
  • Network recovery
  • Optional screen-capture protection
License gating

Feature availability at runtime is controlled by the license package returned during SDK initialization. Enabling a feature flag in code does not guarantee access unless the package permits it.

iOS — Installation

Requirements and SPM install for BOSS Player iOS SDK 1.0.4.

Requirements

RequirementValue
Minimum iOS versioniOS 15
Swift tools versionSwift 6.2
UI frameworkUIKit
Playback frameworkAVFoundation / AVKit
Package managerSwift Package Manager
External dependencyGoogle Cast SDK 4.8.4+
Supported architecturesPhysical devices (arm64); Simulator (arm64, x86_64)
Primary media formatsHLS (.m3u8), DASH, .mp4
Note

CocoaPods distribution is not published. Swift Package Manager is the only supported integration path.

Prerequisites

  • iOS 15 or later
  • Xcode with Swift 5.9 or later (tools compatible with the selected release)
  • Swift Package Manager

Add the package

In Xcode:

  1. File → Add Package Dependencies…
  2. Enter the repository URL:
text
https://github.com/GO-BOSS-PRODUCTS/boss-player-swift-sdk-pkg
  1. Choose the approved release version (1.0.4 or later as published).
  2. Add the VuedataPlayerSDK product to your application target.

Or in Package.swift:

swift
.package(
  url: "https://github.com/GO-BOSS-PRODUCTS/boss-player-swift-sdk-pkg",
  from: "1.0.4"
)

The public package resolves a binary XCFramework (plus the Google Cast dependency).

Import

swift
import VuedataPlayerSDK

Repos

RepoRole
boss-player-swift-sdk-pkgPublic SPM binary for tenants
boss-player-swift-sdkPrivate source (internal)

iOS — Quick start

Initialize VuedataPlayer and present the player fullscreen.

Initialize once at app startup, before presenting any player instance. Initialization is asynchronous — wait for a successful result before creating or presenting a player.

1. Initialize the SDK

swift
import VuedataPlayerSDK

VuedataPlayer.initialize(apiKey: "YOUR_PLAYER_KEY") { result in
    switch result {
    case .success:
        // Package / feature gates resolved — safe to present players
        break
    case .failure(let error):
        // Handle: empty key, invalid URL/response, inactive package,
        // unexpected HTTP status, or networking error
        print("SDK init failed:", error)
    }
}

Inspect state

swift
VuedataPlayer.activePackage
VuedataPlayer.activeFeatures
VuedataPlayer.initializationState

Init calls POST /api/player/sdk/init with x-player-key

2. Configure and present the player

The player is always presented full screen.

swift
let config = VuedataPlayerConfiguration(
    videoURL: URL(string: "https://cdn.example.com/video.m3u8")!,
    title: "Episode 1",
    defaultOrientation: .landscape,
    videoID: "ep-123"
)

let player = VuedataPlayerViewController(configuration: config)
player.delegate = self
present(player, animated: true)
Tip

Assign delegate before presenting if you need playback or watch-history callbacks. See Configuration for the full parameter list.

Minimal end-to-end example

swift
import UIKit
import VuedataPlayerSDK

final class PlayerHostViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        VuedataPlayer.initialize(apiKey: "YOUR_PLAYER_KEY") { [weak self] result in
            guard case .success = result else { return }
            DispatchQueue.main.async { self?.presentPlayer() }
        }
    }

    private func presentPlayer() {
        guard let url = URL(string: "https://cdn.example.com/video.m3u8") else { return }
        let config = VuedataPlayerConfiguration(
            videoURL: url,
            title: "Episode 1",
            defaultOrientation: .landscape,
            videoID: "ep-123"
        )
        let player = VuedataPlayerViewController(configuration: config)
        player.delegate = self
        present(player, animated: true)
    }
}

extension PlayerHostViewController: VuedataPlayerDelegate {
    // Implement callbacks as needed — see Events
}

iOS — Configuration

Full VuedataPlayerConfiguration reference with types and defaults.

Required values

ParameterTypeDescription
videoURLURLThe playable media URL. Validate before constructing the configuration.
titleStringTitle displayed in the player chrome.
defaultOrientationPlayerDefaultOrientationInitial orientation, e.g. .landscape or .portrait.

Optional values

ParameterTypeDefault when omittedDescription
mediaTailorTrackingURLURL?nil — may be derived from a compatible MediaTailor manifestMediaTailor tracking URL for ad overlay/skip metadata.
subtitleURLURL?No external subtitle addedExternal WebVTT subtitle, added alongside manifest-discovered tracks.
subtitleNameString?Derived from subtitleLanguageCode or the URLMenu title for the external subtitle.
subtitleLanguageCodeString?nilBCP‑47 code (e.g. en, ta) for the external subtitle.
subtitleAutoSelectPolicySubtitleAutoSelectPolicy.firstAvailableControls automatic subtitle selection on load.
subtitlePreferenceDefaultsKeyString?nil — preference not persistedUserDefaults key for remembering the user's last subtitle language.
isLivevideoBoolfalseMarks the stream as live; hides duration/seek controls.
startTimeSecondsInt0Resume position, in seconds.
videoDurationInt?nil — derived from assetKnown duration in seconds.
contentDurationInt?nilContent-only duration excluding stitched ads (used for SSAI).
videoIDString?nilStable identifier for analytics and host hooks.
playbackSpeeds[Float][0.5, 0.75, 1.0, 1.5, 2.0]Speeds shown in the speed menu.
defaultPlaybackSpeedIndexInt2 (1.0×)Initially selected index in playbackSpeeds.
orientationPolicyPlayerOrientationPolicy.forceLandscapeRotation behavior (see below).
orientationRequestHandlerClosurenilBridge to a host-managed AppDelegate orientation lock.
chromeCastEnabledBooltrueShows/enables Google Cast, subject to license.
airPlayEnabledBooltrueShows/enables AirPlay, subject to license.
pictureInPictureEnabledBooltrueShows/enables PiP, subject to license and device support.
delegateProtocolNo callbacks deliveredReceives playback, progress, track, ad, PiP, error, and dismissal events.

Additional integration fields (builders / advanced)

AreaOptions
Auth / headersheadersProvider, playbackHeadersProvider, playbackUserAgent, thumbnailHeadersProvider
AdsadsEnabled
LicensesdkPackage → licensed features
ProtectionscreenCaptureProtectionEnabled, screenshotPreventingViewFactory
AnalyticsanalyticsHandler, analyticsProperties, watchHistoryInterval, heartbeatConfiguration

Fluent helpers include: withAPIKey, withPlayback*, withLiveVideo, withThumbnail*, withScreenCaptureProtection, withAirPlay / Cast / PiP helpers, withSDKPackage, withMediaTailorTrackingURL, withAnalyticsProperties, withHeartbeat, withSubtitleURL.

Integration notes

  • subtitleURL supplies one external track in addition to any subtitles already present in the media manifest — it does not replace them.
  • Set subtitlePreferenceDefaultsKey only if the app should remember the user's subtitle language across sessions.
  • startTimeSeconds is an Int, expressed in seconds.
  • Set isLivevideo = true for live streams; this hides duration and seek controls.
  • Assign delegate before presenting the player if you need playback or watch-history callbacks.
  • orientationRequestHandler is only needed if your app maintains a dynamic orientation lock in AppDelegate.

Subtitle auto-select policies

PolicyBehavior
.offNo subtitle is automatically selected.
.firstAvailableAutomatically selects the first available subtitle track.
.preferred(languageCode:)Prefers the matching BCP‑47 language; falls back to the first available track.

Orientation policies

PolicyBehavior
.forceLandscapeSDK controls rotation and restores portrait on dismissal.
.followDeviceAllows all orientations except upside down.
.hostManagedHost application owns orientation behavior entirely.

Example

swift
let config = VuedataPlayerConfiguration(
    videoURL: streamURL,
    title: "Episode 1",
    defaultOrientation: .landscape,
    videoID: "ep-1",
    mediaTailorTrackingURL: trackingURL,
    subtitleURL: vttURL,
    subtitleLanguageCode: "en",
    subtitleAutoSelectPolicy: .preferred(languageCode: "en"),
    startTimeSeconds: 30,
    contentDuration: 2400,
    chromeCastEnabled: true,
    airPlayEnabled: true,
    pictureInPictureEnabled: true
)

iOS — Features

iOS feature support matrix and license conditions.

CapabilitySupport & conditions
HLS playback.m3u8 streams; requires the m3u8Playback licensed feature.
Video on demandSeeking, duration, resume position, quartiles, watch history.
Live playbackEnabled via isLivevideo; duration/seek controls hidden.
Adaptive / multiple resolutionParses HLS variants; quality selection when licensed.
Multiple audio tracksParses HLS audio tracks; selection when licensed.
SubtitlesHLS subtitle discovery plus one optional external WebVTT track; selectable, optionally persisted.
Playback speedConfigurable speed menu and default, when licensed.
Key momentsHLS-derived chapter tray and selection callback, when licensed.
SSAIStitched HLS ad-break detection, stream-to-content time mapping, watched-ad skip, overlay metadata, MediaTailor tracking. VOD only.
AirPlayRoute picker and playback routing when host configuration and license allow.
Google CastDiscovery, connect/disconnect, remote playback, seek, volume, subtitle selection. Requires Cast integration + license.
Picture in PictureAVKit PiP with delegate callbacks, when device and license support it.
AnalyticsProvider hub, per-player handler, custom properties, session metadata, buffering/quartile events.
Watch historyPeriodic progress callback plus a final dismissal callback.
Backend session eventsInitialization, session start/end, player events, optional heartbeat.
OrientationForce landscape/portrait, follow device, or host-managed.
Network recoveryMonitoring, no-internet overlay, retry, recoverable error reporting.
Screen-capture protectionHost-supplied screenshot-preventing view factory; gated by configuration and license.
DRMPresent as a licensing flag only — no host-facing FairPlay/DRM configuration is exposed. Do not advertise FairPlay support.
Signal strengthPresent as a licensing flag only — no user-facing implementation exists in the current player code.
Warning

Host-side flags such as pictureInPictureEnabled are gates, not switches. They cannot unlock a feature the license package does not grant.

iOS — Events

VuedataPlayerDelegate callbacks and watch-history guidance.

Implement VuedataPlayerDelegate for visibility into:

  • Playback start, resume, pause, finish, and dismissal
  • Seek start and completion
  • Buffering start and completion
  • Quality, audio, subtitle, and speed changes
  • Fullscreen enter/exit
  • SSAI ad-break start, finish, and watched-ad skip
  • Key-moment selection
  • Picture in Picture enter/exit
  • Playback and network errors
  • Periodic watch-history progress
Info

All callback time values are expressed in seconds.

Watch history

Use the final dismissal callback to flush watch-history progress — the periodic timer may not have fired recently before the player closes.

swift
extension MyViewController: VuedataPlayerDelegate {
    func playerDidStartPlaying(/* … */) {}
    func playerDidPause(/* … */) {}
    func playerDidFinishPlaying(/* … */) {}
    func playerDidDismiss(/* … */) {
        // Persist final watch position here
    }
    func playerDidEncounterPlaybackError(/* … */) {}
}

Analytics event names

player_session_start, play, pause, seek, ended, buffering_start/end, stall, quality_change, volume_change, speed_change, subtitle_change, audio_track_change, key_moments, pip_toggle, fullscreen_enter/exit, cast_start/stop, player_error, network_error, quartiles

Tip

Prefer the interface shipped in the package version you pin (e.g. 1.0.4). Binary and private source can drift briefly between releases.

iOS — Best practices & gotchas

Integration gotchas for the BOSS Player iOS SDK.

  1. Initialize before presenting. Always wait for a successful VuedataPlayer.initialize result before creating a player instance.
  1. Feature flags are gates, not switches. pictureInPictureEnabled and similar host-side flags cannot unlock a feature the license package doesn't grant.
  1. Keep secrets dynamic. Use header-provider closures so expiring tokens are resolved immediately before each request. Never hard-code credentials.
  1. Separate header domains. Playback, manifest/subtitle, and thumbnail requests may each require distinct auth, Referer, Origin, cookies, or User-Agent values.
  1. Supply content duration for SSAI. When ads are enabled, provide contentDuration where available so the SDK can map stitched stream time back to content time.
  1. SSAI is VOD-only. Ad support is disabled whenever isLivevideo == true.
  1. Validate your speed index. defaultPlaybackSpeedIndex must be a valid index into playbackSpeeds.
  1. Plan orientation carefully. The default orientation policy is forced landscape. If your app has its own AppDelegate orientation lock, implement orientationRequestHandler or switch to .hostManaged.
  1. PiP is device-dependent. Enabling the flag doesn't guarantee PiP is available for the current device/state.
  1. Google Cast needs app-level setup. Beyond linking the dependency, confirm Cast configuration, network permissions, and receiver setup.
  1. Screen-capture protection ≠ DRM. It relies on a host-provided view factory and should be tested on every supported iOS version; it is unrelated to FairPlay.
  1. Rely on the dismissal callback for final persistence. Don't assume the last periodic watch-history tick captured the final seconds of a session.
  1. Track release metadata on every update. Confirm both the Swift Package release tag and the framework bundle version each time you upgrade.

iOS — Presentation

How the iOS player is presented (UI-driven fullscreen VC).

Present the player as a fullscreen view controller after a successful SDK init:

swift
let player = VuedataPlayerViewController(configuration: config)
player.delegate = self
present(player, animated: true)
Note

The iOS view controller is primarily UI-driven. Public play() / pause() / seek() methods are not exposed on the phone VC the way they are on Apple TV. Drive UX through the player chrome and observe progress via the delegate.

See Quick start and Best practices for the full integration flow.

iOS — Troubleshooting & support

Support, versioning, and common iOS SDK issues.

Versioning

Always confirm the Swift Package release tag matches the intended framework bundle version before shipping (latest documented distributable: 1.0.4).

Common issues

SymptomFix
Package resolve failsUse boss-player-swift-sdk-pkg URL; ensure network access to GitHub Releases for the XCFramework zip
Features missingCall VuedataPlayer.initialize and wait for success; inspect activeFeatures
Presenting before init completesGate present on a successful init result
Cast issuesConfirm Google Cast SPM dependency 4.8.4+ and app-level Cast setup
Orientation fights AppDelegateUse .hostManaged or orientationRequestHandler
Ads not showing on liveSSAI is VOD-only (isLivevideo must be false)
Expecting FairPlay config APIsDRM is a license flag only — no host-facing FairPlay configuration
Init hits wrong hostOverride config URL for production API

What to report

When opening an integration issue, include:

  • SDK / SPM version (tag + bundle version)
  • iOS version
  • Device model
  • Reproduction steps
  • Init / playback error payloads if available
Warning

Do not distribute the private boss-player-swift-sdk source URL to tenants if your policy requires binary-only distribution — use the pkg repo.

Android SDK

Android — Overview

BOSS Player Android SDK overview.

Artifact: com.goboss:videoplayer-sdk (GitHub Packages) Surfaces: VideoPlayerActivity.launch, Compose VideoPlayerSDK.VideoPlayer, VideoPlayerController

Kotlin / Media3 player for phones and tablets with:

  • HLS playback and adaptive quality
  • Chromecast and PiP
  • Overlay ads / MediaTailor tracking
  • Content protection hooks
  • Analytics + session APIs
  • Feature flags on PlayerConfiguration (subject to SDK init / license)
Important

Call VideoSDK.initializeSdk(apiKey) (or pass apiKey on configuration) and treat host flags as gates under server entitlement where applicable.

Android — Installation

Install BOSS Player for Android from GitHub Packages.

Requirements

RequirementValue
minSdk24
LanguageKotlin
UIJetpack Compose (composable path) / Activity
Player engineMedia3 / ExoPlayer
RegistryGitHub Packages
Coordinatescom.goboss:videoplayer-sdk:1.0.0

Maven repository

text
https://maven.pkg.github.com/GO-BOSS-PRODUCTS/boss-player-android-sdk-pkg
kotlin
maven {
    url = uri("https://maven.pkg.github.com/GO-BOSS-PRODUCTS/boss-player-android-sdk-pkg")
    credentials {
        username = providers.gradleProperty("gpr.user").orNull
            ?: System.getenv("GITHUB_ACTOR")
        password = providers.gradleProperty("gpr.key").orNull
            ?: System.getenv("GITHUB_TOKEN")
    }
}

implementation("com.goboss:videoplayer-sdk:1.0.0")
Auth

Requires a token with read:packages (and SSO authorization if your org enforces it).

Android — Quick start

Authorize the SDK and launch playback on Android.

Initialize / authorize before launching playback when using tenant gating.

kotlin
VideoSDK.initializeSdk("YOUR_PLAYER_KEY")
kotlin
VideoPlayerActivity.launch(
    context,
    PlayerConfiguration(
        title = "My Video",
        videoUrl = "https://cdn.example.com/video.m3u8",
        apiKey = "YOUR_PLAYER_KEY",
        playerPlatform = PlayerPlatform.MOBILE,
    )
)

Android — Configuration

PlayerConfiguration fields for Android with types.

Core fields

FieldType / notesDescription
titleStringTitle
videoUrlStringPlayback URL
castVideoUrlString?Cast media URL
thumbnailUrlString?Poster / scrub preview
externalSubtitleUrlString?Sidecar captions
apiKeyString?Player key
startPositionMsLongResume position
defaultOrientationorientation enumOrientation policy
autoPlayBooleanAuto-start
keepScreenOnBooleanKeep awake
controlsAutoHideDurationMsLongChrome auto-hide
progressUpdateIntervalMsLongProgress tick
LiveisLiveStream, offsets, speed boundsLive UI
isFullscreenEnabledBooleanFullscreen affordance
Subtitlesprefs + subtitleStyleCaptions

Feature flags

FlagDefault intentNotes
isChromecastEnabledon/offLicense / device dependent
isAudioTracksEnabledon/off
isVideoQualityEnabledon/off
isSubtitlesEnabledon/off
isPlaybackSpeedEnabledon/off
isThumbnailPreviewsEnabledon/off
isKeyMomentsEnabledon/off
isPipEnabledon/off
isContentProtectionEnabledon/off
isOverlayAdsEnabledon/offPair with overlayAdTrackingUrl
areGesturesEnabledon/off
playerPlatformMOBILE / TABLET / TV / UNKNOWNPrefer explicit on TV

Android — Features

Android phone SDK feature matrix.

CapabilitySupport & conditions
HLS / VOD / livePlayerConfiguration + live flags
Compose + ActivityBoth entry points supported
Quality / audio / subtitles / speedFeature flags + licensed package
ChromecastisChromecastEnabled
PiPisPipEnabled
Overlay adsisOverlayAdsEnabled + tracking URL
Content protectionisContentProtectionEnabled
Gestures / fullscreenMobile UI
Analytics / sessionsAnalytics module + event listener
TV routingPrefer dedicated Android TV SDK for Leanback

Android — Events

VideoPlayerEventListener on Android.

Implement VideoPlayerEventListener:

CallbackPurpose
onPlayerReadyPlayer ready
onVideoPlayed / onVideoPaused / onVideoCompletedPlayback
onPlayerErrorErrors
onForward / onRewindSeek gestures
onProgressUpdateProgress
onFullscreenChangedFullscreen
onVideoQualityChangedQuality
onSubtitleChangedCaptions
onPlaybackSpeedChangedSpeed
Thumbnail / key-moment callbacksTimeline UI
onAudioTrackChangedAudio
onChromecastConnected / DisconnectedCast
onPipModeChangedPiP
onScreenCaptureDetectedProtection
onControlsVisibilityChangedChrome
onAdBreakStarted / CompletedAds
onPlayerExitDismiss
kotlin
val listener = object : VideoPlayerEventListener {
    override fun onPlayerError(error: /* … */) { /* … */ }
    override fun onProgressUpdate(position: Long, duration: Long) { /* … */ }
    // …
}

Android — Best practices

Android SDK integration gotchas.

  1. Authorize before playback — VideoSDK.initializeSdk with a valid key.
  2. Use GitHub Packages credentials with read:packages (and SSO if required).
  3. Pin artifact versions in production (1.0.0 or your approved channel).
  4. Set playerPlatform explicitly (MOBILE / TABLET) when not auto-detecting.
  5. Wire VideoPlayerEventListener for errors and exit / ad breaks.
  6. Release the controller — call releasePlayer() when leaving the screen.
  7. Don’t assume TV Cast/PiP APIs on the phone sample when targeting Leanback — use the TV SDK.

Android — Playback control

VideoPlayerController APIs on Android.

kotlin
val controller = VideoPlayerController()

controller.play()
controller.pause()
controller.seekTo(positionMs)
controller.forward()
controller.rewind()
controller.goLive()

// Tracks / quality / speed / volume
controller.setQuality(/* … */)
controller.setSubtitle(/* … */)
controller.setAudioTrack(/* … */)
controller.setPlaybackSpeed(/* … */)
controller.setVolume(/* … */)

controller.changePIPMode(/* … */)
controller.toggleFullscreen()

controller.releasePlayer()

Use getters on the controller for current position, duration, and track lists as exposed by your SDK version.

Android — Troubleshooting

Common Android SDK issues and fixes.

SymptomFix
Cannot resolve Maven artifactAdd GitHub Packages repo + read:packages token
401/403 from PackagesAuthorize SSO; check GITHUB_ACTOR / token
Features missingCall VideoSDK.initializeSdk with a valid key
Compose blankEnsure Compose compiler + theme wrappers match sample app
Cast / PiP missing on TV buildUse phone SDK for mobile Cast/PiP; TV SDK strips them

For living-room devices, see Android TV / Fire TV.

Apple TV SDK

Apple TV — Overview

BOSS Player Apple TV SDK overview.

Module: VuedataAppleTVPlayerSDK Platform: tvOS 15+

tvOS player built on AVPlayerViewController with:

  • HLS playback and track selection
  • Programmatic play / pause / seek / select APIs
  • Key moments, SSAI (where configured)
  • Analytics / heartbeat hooks
  • Focus-friendly TV UI (no Chromecast / PiP / mobile orientation)
Important

Initialize with VuedataPlayerSDK.initialize(apiKey:) and wait for success before presenting. Public SPM binary packaging is coming soon.

Apple TV — Installation

Install BOSS Player for Apple TV (tvOS).

Requirements

RequirementValue
Minimum tvOStvOS 15
UI / playbackAVPlayerViewController / AVFoundation
Package managerSwift Package Manager
ProductVuedataAppleTVPlayerSDK
Public binary pkgComing soon

Add the package (current path)

Private source package:

text
https://github.com/GO-BOSS-PRODUCTS/boss-apple-tv-player

Branch: confirm with your release process (often feature/initial_sdk until mainlined).

swift
import VuedataAppleTVPlayerSDK

Apple TV — Quick start

Present the Apple TV player view controller.

Initialize once, wait for success, then present fullscreen:

swift
import VuedataAppleTVPlayerSDK

VuedataPlayerSDK.initialize(apiKey: "YOUR_PLAYER_KEY") { result in
    guard case .success = result else { return }
    // present on main after success
}

let configuration = VuedataPlayerConfiguration(
    videoURL: URL(string: "https://cdn.example.com/video.m3u8")!,
    title: "Episode Title",
    videoID: "episode-123",
    analyticsHandler: { event in
        print(event.name, event.parameters)
    }
)

let playerViewController = VuedataPlayerViewController(configuration: configuration)
playerViewController.playerDelegate = self
present(playerViewController, animated: true)
Naming

On tvOS the init type is VuedataPlayerSDK (not VuedataPlayer). The delegate property is playerDelegate.

Apple TV — Configuration

Configuration options for Apple TV.

Shared core with iOS, without mobile-only options (orientation lock, Chromecast, PiP, screen-capture factory, external subtitle URL helpers may differ).

Includes:

  • Headers providers / user agent
  • Start time, durations
  • Ads + MediaTailor tracking URL
  • Playback speeds + live flag
  • Subtitle auto-select
  • sdkPackage / licensed features
  • Analytics handler / properties
  • Watch-history interval + heartbeat
swift
VuedataPlayerConfiguration(
    videoURL: streamURL,
    title: "Episode",
    videoID: "ep-1",
    adsEnabled: true,
    mediaTailorTrackingURL: trackingURL,
    isLivevideo: false,
    analyticsHandler: { event in /* … */ }
)

Apple TV — Features

Apple TV feature support matrix.

CapabilitySupport & conditions
HLS / VOD / liveConfig flags; live hides seek/duration as applicable
Programmatic controlplay, pause, seek, select quality/subtitle/audio/speed
Key momentsWhen licensed / present in stream
SSAIMediaTailor tracking; prefer VOD
Analytics / heartbeatHandler + session APIs
Subtitles / multi-audio / qualityWhen present + licensed
Chromecast / PiP / orientationNot applicable on tvOS
Public SPM binaryComing soon

Apple TV — Events

Delegate callbacks on Apple TV.

VuedataPlayerDelegate covers:

  • Playback / seek / buffering
  • Quality / audio / subtitle / speed
  • SSAI ads
  • Key moments
  • Errors
  • Watch position
  • Will dismiss

Intentionally excluded vs iOS: Cast, PiP, orientation, screen-capture hooks.

swift
extension MyVC: VuedataPlayerDelegate {
    func playerDidStartPlaying(/* … */) {}
    func playerDidEncounterPlaybackError(/* … */) {}
}

Apple TV — Best practices

Apple TV SDK integration gotchas.

  1. Initialize before present — wait for VuedataPlayerSDK.initialize success.
  2. Use playerDelegate (naming differs from iOS delegate).
  3. Design for the Siri Remote — test focus and dismiss flows on device.
  4. Prefer VOD for SSAI — align with iOS guidance when ads are enabled.
  5. Pin the source branch / XCFramework your release process approves until the public pkg ships.
  6. Don’t expect iOS-only APIs (Cast, PiP, orientation lock).

Apple TV — Playback control

Programmatic control APIs on Apple TV.

VuedataPlayerViewController subclasses AVPlayerViewController and exposes:

swift
player.play()
player.pause()
player.seek(to: time) { _ in }
player.selectPlaybackSpeed(at: index)
player.selectQuality(at: index)
player.selectSubtitle(at: index)
player.selectAudioTrack(at: index)
player.openKeyMoment(at: index)

Also available: videoVariants, subtitleTracks, audioTracks, keyMoments.

Apple TV — Troubleshooting & support

Apple TV support and common issues.

SymptomFix
Cannot resolve public pkgUse private boss-apple-tv-player until public package ships
Init points at mock configConfirm release build uses BOSS init API / production host
Missing Cast/PiPExpected — not on tvOS
Focus issuesTest on Apple TV hardware; verify AVPlayerViewController presentation

Report with: SDK version, tvOS version, device model, reproduction steps.

Apple TV — Public package (coming soon)

Public SPM package for Apple TV.

The public binary package repository is reserved at:

text
https://github.com/GO-BOSS-PRODUCTS/boss-player-apple-tv-sdk-pkg

Today it is empty (no Package.swift / releases yet). Until it ships:

  1. Integrate via the private source repo boss-apple-tv-player, or
  2. Consume a prebuilt XCFramework from your internal distribution process

When published, install will mirror iOS:

text
https://github.com/GO-BOSS-PRODUCTS/boss-player-apple-tv-sdk-pkg

Product name expected: VuedataAppleTVPlayerSDK.

Android TV / Fire TV

Android TV / Fire TV — Overview

BOSS Player Android TV and Fire TV overview.

One SDK for both: Fire TV uses the same Leanback-oriented Android TV player. There is no separate Fire TV package.

  • D-pad / focus-friendly controls
  • PlayerPlatform.TV (or Leanback auto-detect)
  • Overlay ads and content protection
  • No Chromecast / PiP (living-room UI)
Important

Set playerPlatform = PlayerPlatform.TV in TV apps so mobile defaults are not applied.

Android TV / Fire TV — Installation

Install BOSS Player for Android TV and Fire TV.

Requirements

RequirementValue
minSdk24
PlatformsAndroid TV and Fire TV (same SDK)
UILeanback / TV Material
DetectionPackageManager.FEATURE_LEANBACK
DistributionTypically project module (boss-player-android-tv)
kotlin
implementation(project(":videoplayer-sdk"))

Manifest tips

  • LEANBACK_LAUNCHER intent filter
  • android.software.leanback (optional feature)
  • TV banner / logo assets

Android TV / Fire TV — Quick start

Launch BOSS Player on Android TV / Fire TV.

kotlin
VideoSDK.initializeSdk("YOUR_PLAYER_KEY")

VideoPlayerActivity.launch(
    context,
    PlayerConfiguration(
        title = "Episode 1",
        videoUrl = "https://cdn.example.com/video.m3u8",
        apiKey = "YOUR_PLAYER_KEY",
        playerPlatform = PlayerPlatform.TV, // important
    )
)
Tip

PlayerPlatform.UNKNOWN can auto-detect Leanback. Prefer explicit TV in TV apps.

Android TV / Fire TV — Configuration

TV-oriented PlayerConfiguration.

Same shape as the Android phone configuration, with TV-oriented differences:

Removed / not used on TVNotes
isChromecastEnabledStripped / not applicable
isPipEnabledNot used on Leanback UI
isFullscreenEnabledTV is already fullscreen-oriented

Still supported: overlay ads, content protection, live, tracks, quality, subtitles, key moments, gestures (as applicable), overlayAdTrackingUrl.

kotlin
PlayerConfiguration(
    title = "Episode 1",
    videoUrl = url,
    apiKey = key,
    playerPlatform = PlayerPlatform.TV,
    isOverlayAdsEnabled = true,
    overlayAdTrackingUrl = trackingUrl,
    isContentProtectionEnabled = true,
)

Android TV / Fire TV — Features

Android TV / Fire TV feature matrix.

CapabilitySupport & conditions
Leanback / Fire TVSame SDK; FEATURE_LEANBACK detection
HLS / live / VODSame config model as phone
Overlay adsTracking URL; test on device
Quality / audio / subtitles / speedWhen enabled
Content protectionSupported
Chromecast / PiP / fullscreen helpersRemoved on TV build
Focus UITvPlayerControls / TV screens

Android TV / Fire TV — Events

Event listener differences on TV.

Same VideoPlayerEventListener as phone, minus:

  • onChromecastConnected / onChromecastDisconnected
  • onPipModeChanged

Retain handlers for ready, play/pause/complete, errors, progress, quality/subtitle/audio/speed, ads, screen capture, controls visibility, and exit.

Android TV / Fire TV — Best practices

Android TV / Fire TV gotchas.

  1. Explicit PlayerPlatform.TV in configuration.
  2. Add Leanback launcher metadata for store / sideload discovery.
  3. Test on real Fire TV / Android TV hardware for focus and back behavior.
  4. Do not look for a separate Fire TV artifact — this is the SDK.
  5. Consume as module when Maven TV publish is unavailable.
  6. Handle onPlayerExit / errors for session cleanup.

Android TV / Fire TV — Playback control

Controller APIs on Android TV.

VideoPlayerController matches the phone SDK except fullscreen / PiP helpers are removed:

kotlin
controller.play()
controller.pause()
controller.seekTo(ms)
controller.forward()
controller.rewind()
controller.goLive()
controller.setQuality(/* … */)
controller.setSubtitle(/* … */)
controller.setAudioTrack(/* … */)
controller.setPlaybackSpeed(/* … */)
controller.releasePlayer()

TV UI uses Leanback-friendly controls (TvPlayerControls, focus managers). Design for D-pad navigation.

Android TV / Fire TV — Troubleshooting

Android TV / Fire TV troubleshooting.

SymptomFix
Phone UI on TVSet playerPlatform = PlayerPlatform.TV or UNKNOWN
No Leanback launcherAdd LEANBACK_LAUNCHER + leanback feature
Focus / D-pad issuesUse TV control components; test on real Fire TV / Android TV
Looking for Fire TV SDKUse this Android TV SDK — there is no separate package
Maven missingConsume as project module from boss-player-android-tv

Flutter SDK

Flutter — Overview

BOSS Player Flutter mobile SDK overview.

Package: vd_flutter_player_sdk (pub.dev) Platforms: Android + iOS mobile (Flutter TV is coming soon)

Cross-platform widget player with:

  • VideoPlayerSDK.initialize(apiKey:) license gate
  • VdPlayerView + VdPlayerConfiguration
  • Feature flags, styling, cast/AirPlay/PiP hooks (subject to license)
  • Analytics handler and VdPlayerCallbacks
Naming

Published package still uses vd_ / Vuedata identifiers. Product name is BOSS Player.

Flutter — Installation

Install the Flutter BOSS Player package.

Requirements

RequirementValue
Flutter≥ 3.22 (stable 3.41.5+ recommended)
TargetsAndroid + iOS mobile
Packagevd_flutter_player_sdk ^0.0.8
Flutter TVNot published — coming soon

pub.dev

yaml
dependencies:
  vd_flutter_player_sdk: ^0.0.8
bash
flutter pub get

From Git

yaml
dependencies:
  vd_flutter_player_sdk:
    git:
      url: https://github.com/GO-BOSS-PRODUCTS/boss-player-flutter-sdk.git
      ref: develop
      path: vd-flutter-player-sdk
dart
import 'package:vd_flutter_player_sdk/vd_flutter_player_sdk.dart';

Flutter — Quick start

Initialize VideoPlayerSDK and show VdPlayerView.

Initialize once at startup and wait before showing the player:

dart
import 'package:vd_flutter_player_sdk/vd_flutter_player_sdk.dart';

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await VideoPlayerSDK.initialize(apiKey: 'YOUR_PLAYER_KEY');
  runApp(const MyApp());
}

// In your widget tree:
VdPlayerView(
  configuration: VdPlayerConfiguration(
    title: 'Course Video',
    videoUrl: Uri.parse('https://cdn.example.com/master.m3u8'),
    videoId: 'course-001',
  ),
)

Invalid keys show a license overlay unless isDownloaded: true (offline path).

Flutter — Configuration

VdPlayerConfiguration options.

Required

FieldDescription
videoUrlUri stream
titleTitle

Options

AreaFields
MediavideoId, startPosition, videoDuration, targetURL, playbackUrls, subTitleMap
OfflineisDownloaded, downloadedVideo, downloadedSubtitle
HeadersheadersProvider, playbackHeadersProvider, playbackUserAgent, thumbnailHeadersProvider
PlaybackplaybackSpeeds, defaultPlaybackSpeedIndex, autoPlay, closeOnBack
SubtitlessubtitleAutoSelectPolicy, subtitlePreferenceKey
OrientationorientationPolicy, defaultOrientation
FeaturesVdPlayerFeatureFlags (cast, AirPlay, PiP, screen capture, quality/subtitle/audio, key moments, thumbnails, fullscreen, wakelock)
StyleVdPlayerStyle (canvas/overlay/menu/text/accent/subtitle colors, icon sizes)
IntegrationscastReceiverApplicationId, screenCaptureBuilder, analyticsHandler, callbacks, watchHistoryIntervalSeconds (default 30)

Example

dart
VdPlayerView(
  configuration: VdPlayerConfiguration(
    title: 'Episode 1',
    videoUrl: Uri.parse(hls),
    videoId: 'ep-1',
    startPosition: Duration(seconds: 15),
    autoPlay: true,
    headersProvider: () => {'Authorization': 'Bearer …'},
    analyticsHandler: (event) {},
    callbacks: VdPlayerCallbacks(
      watchHistoryCallback: (pos, duration) {},
      onQualityChanged: (from, to, isAuto) {},
    ),
    featureFlags: VdPlayerFeatureFlags(
      // enable / disable local flags; server entitlement may override
    ),
    style: VdPlayerStyle(
      // accent aligned to brand purple
    ),
  ),
)

Flutter — Features

Flutter mobile feature matrix.

CapabilitySupport & conditions
HLS / multi-URLvideoUrl / playbackUrls
License gateOverlay on invalid key (unless offline download path)
Subtitles / quality / audio / speedFeature flags + entitlement
Cast / AirPlay / PiPFlags; Cast UI may be incomplete — verify on device
Orientation policiesHost-configurable
OfflineisDownloaded + local assets
Analytics / watch historyHandler + callbacks
Flutter TVComing soon

Flutter — Events

Flutter analytics and VdPlayerCallbacks.

analyticsHandler

Host-emitted examples: player_opened, orientation_changed, orientation_change_ignored, key_moment_opened

Backend logEvent names include: play, pause, seek, buffering_start/end, fast_forward, fast_backward, quality_change, subtitle_change, subtitle_disable, speed_change, key_moments, fullscreen_toggle, pip_toggle, player_error, network_error

VdPlayerCallbacks

Wired for: started, pause/resume, complete, dismiss, seek start/end, buffering, quality, subtitle change/disable, speed, orientation, key moments, PiP enter/exit, watch history, playback/network errors.

Some declared callbacks (e.g. position / audio track) may not be fully wired in every package version — verify against the version you pin.

Flutter — Best practices

Flutter SDK integration gotchas.

  1. await VideoPlayerSDK.initialize before showing VdPlayerView.
  2. Use develop + package path if installing from git (main may be empty).
  3. Prefer dynamic header providers for expiring tokens.
  4. Persist resume via watchHistoryCallback / dismissal-equivalent callbacks.
  5. Confirm API host for production (defaults may point at dev).
  6. For TV apps today, use native Android TV / Apple TV SDKs until Flutter TV ships.

Flutter — Playback control

Flutter player surface and platform channels.

Primary integration is the VdPlayerView widget driven by VdPlayerConfiguration.

Platform channel helpers (VdPlayerPlatform) support:

  • Screen capture controls
  • Orientation
  • PiP
  • Cast configure / discover / cast media

Use callbacks and analytics handlers for progress and control side-effects. Prefer persisting resume position via watchHistoryCallback.

Flutter — Troubleshooting

Flutter SDK troubleshooting.

SymptomFix
Package not found from git mainUse ref: develop + path: vd-flutter-player-sdk
License overlayPass a valid apiKey to VideoPlayerSDK.initialize
Cast incompleteREADME notes Chromecast UI may be incomplete — verify on device
Looking for Flutter TVSee Coming soon

Flutter TV — Coming soon

Dedicated Flutter TV SDK status.

The repository boss-player-flutter-tv-sdk exists in the GO-BOSS-PRODUCTS org but is currently empty (no package code).

What to use today

TargetRecommendation
Flutter mobile`vd_flutter_player_sdk`
Android TV / Fire TVAndroid TV SDK (native)
Apple TVApple TV SDK (native)
React Native TV`TVVideoPlayer`

This page will be replaced with install / init / configuration docs when the Flutter TV SDK ships.

React Native SDK

React Native — Overview

BOSS Player React Native SDK overview.

Package: @goboss/react-native-video-player-sdk Components: RNVideoPlayer (mobile), TVVideoPlayer (TV)

React Native player built on react-native-video with:

  • Optional playerKey gating / session init
  • DRM config, watermark, theme color
  • Delegate-style props for lifecycle events
  • Ads tracking URL
  • Secure mode on Android
Important

Pass playerKey for full GoBOSS session and feature gating. Checkout branch development when cloning the private repo.

React Native — Installation

Install the React Native BOSS Player SDK.

Requirements

RequirementValue
React≥ 18
React Native≥ 0.74
react-native-video≥ 6
Package@goboss/react-native-video-player-sdk
Source branchdevelopment (if cloning)
bash
npm install @goboss/react-native-video-player-sdk
npm install react-native-video react-native-safe-area-context react-native-svg lucide-react-native @react-native-community/slider
npx pod-install

Optional: react-native-google-cast, Firebase analytics packages.

React Native — Quick start

RNVideoPlayer and TVVideoPlayer usage.

tsx
import { RNVideoPlayer } from '@goboss/react-native-video-player-sdk';

export function PlayerScreen() {
  return (
    <RNVideoPlayer
      src="https://cdn.example.com/stream.m3u8"
      playerKey="YOUR_PLAYER_KEY"
      title="My Video"
      themeColor="#865fe3"
      watermark="SECURE VIEW"
      playerDidStartPlaying={({ startTime, autoplay }) => {}}
      playerDidEncounterPlaybackError={({ errorCode, message }) => {}}
    />
  );
}

With playerKey set, the SDK calls init against the BOSS Player API (x-player-key).

React Native — Configuration

Props for RNVideoPlayer and TVVideoPlayer.

Shared props

PropNotes
srcRequired — HLS/DASH/MP4
titleTitle
themeColorAccent
watermarkOverlay text
chapters / keyMoments / subtitles / subtitleStyle / thumbnailsTimeline / captions
drmConfigLicense URLs + authToken (typed loosely on UI)
playerKeyFeature gating / session (recommended)
enableSecureModeAndroid FLAG_SECURE
adTrackingUrlMediaTailor / overlay ads
headersCustom HTTP headers
watchProgressIntervalSeconds (default 30)
onKeyMomentsLoadedCallback
Delegate propsFlattened object-arg callbacks

TVVideoPlayer differences

  • No fullscreen / PiP delegates
  • No thumbnails prop in the TV interface

Core options (PlayerSDKOptions)

videoRef, src, sessionId, autoplay, muted, chapters, keyMoments, subtitles, thumbnails, drm, analyticsCallback, watchProgressInterval, themeColor, watermark, urlTransformer, isLive, headers

Warning

Some mobile UI defaults (autoplay, muted, autoFullscreen) may be hardcoded inside RNVideoPlayer depending on package version. Confirm against the version you install.

DRM example

tsx
<RNVideoPlayer
  src={url}
  playerKey={key}
  drmConfig={{
    authToken: '…',
    widevineLicenseUrl: 'https://license.example.com/widevine',
    fairplayLicenseUrl: 'https://license.example.com/fairplay',
  }}
  enableSecureMode
/>

React Native — Features

React Native feature matrix.

CapabilitySupport & conditions
Mobile playerRNVideoPlayer
TV playerTVVideoPlayer when Platform.isTV
DRMdrmConfig (Widevine / FairPlay URLs + token)
AdsadTrackingUrl
Secure modeAndroid FLAG_SECURE
Chapters / key moments / subtitles / thumbnailsMobile props; TV omits some (e.g. thumbnails, PiP)
AnalyticsDelegate props + optional Firebase
Imperative ref APILimited on UI components — prefer delegates / core

React Native — Events

Delegate props and analytics events for React Native.

Delegate props

Object-arg style callbacks:

  • Start / resume / pause / finish / dismiss
  • Seek start / finish
  • Time update
  • Buffering
  • Quality / subtitle / audio / speed
  • Key moment
  • Playback / network errors
  • Mobile also: fullscreen + PiP
tsx
<RNVideoPlayer
  src="…"
  playerKey="…"
  playerDidStartPlaying={({ startTime, autoplay }) => {}}
  playerDidPause={() => {}}
  playerDidEncounterPlaybackError={({ errorCode, message }) => {
    console.error(errorCode, message);
  }}
/>

Analytics eventTypes

Similar to web, plus live/ad extras: live_edge_seek, live_stream_start, ad_break_start / end, ad_marker_error

React Native — Best practices

React Native SDK integration gotchas.

  1. Install peer dependencies (react-native-video, safe-area, svg, slider) and run pod-install.
  2. Pass playerKey for entitlement and sessions.
  3. Use TVVideoPlayer on TV — don’t reuse mobile chrome on Leanback/tvOS RN builds.
  4. Handle error delegate props in production.
  5. Confirm autoplay/mute defaults against your package version (some UI defaults are internal).
  6. Point API host to production when leaving the default dev environment.

React Native — Playback control

Controlling playback in React Native.

The public React components are primarily declarative. The underlying VideoPlayerSDK coordinator (over react-native-video) supports:

play, pause, seek, skipAd, setVolume, setMute, setPlaybackRate, setQuality, setAudioTrack, togglePictureInPicture, toggleFullscreen, plus getters and module accessors (analytics, keyMoments, chapters, subtitles, drm, casting, thumbnails).

Note

Unlike the web createPlayer handle, RN UI components may not expose an imperative ref API in all versions. Prefer props + delegates, or use the core coordinator if your app architecture requires programmatic control.

React Native — Troubleshooting

React Native SDK troubleshooting.

SymptomFix
Native build failsInstall peers; run pod-install; RN ≥ 0.74
Empty git cloneCheckout development
Features missingPass playerKey; check init network call
DRM typed as anyFollow DRMConfig shape from shared types
No imperative APIUse delegates / core VideoPlayerSDK
TV layout wrongUse TVVideoPlayer when Platform.isTV

Reference

Packages & versions

Published package identifiers for BOSS Player SDKs.

PlatformPackageRegistryVersion notes
Webboss-web-player-sdknpmCSS export boss-web-player-sdk/css
React Native@goboss/react-native-video-player-sdknpmPeers required; use development when cloning
iOSVuedataPlayerSDKSPM (boss-player-swift-sdk-pkg)Latest documented distributable 1.0.4
Apple TVVuedataAppleTVPlayerSDKSPM (source today)Public pkg coming soon
Androidcom.goboss:videoplayer-sdkGitHub Packagese.g. 1.0.0; needs read:packages
Android TV / Fire TVcom.vd.videoplayer moduleSource / internalSame Leanback SDK
Fluttervd_flutter_player_sdkpub.devMobile only (^0.0.8)

Always pin versions in production and confirm SPM release tag vs framework bundle version on iOS upgrades.

Platform matrix

Feature comparison across BOSS Player platforms.

CapabilityWebiOSAndroidApple TVAndroid TV / Fire TVFlutterReact Native
Player key init✅✅✅✅✅✅✅
HLS✅✅✅✅✅✅✅
Theme color✅via stylevia UIlimitedlimited✅ style✅
Watermark / protection✅screen-capture factory✅ protection—✅ protectionflags✅
Host DRM config✅ drmConfig❌ license flag only✅ pathlimited✅ pathgated✅ drmConfig
SSAI / overlay ads✅✅ VOD-only✅✅✅gated✅
Chromecast✅✅✅❌❌partialoptional
AirPlay—✅———flags—
PiP✅✅✅❌❌✅✅ mobile
Programmatic seek API✅ coreUI-driven✅✅✅callbackscore / limited
TV focus UI——via platform✅✅soonTVVideoPlayer

Legend: ✅ supported · ❌ not applicable / not exposed · — limited / N/A · gated = requires entitlement

iOS DRM

Native iOS does not expose FairPlay host configuration APIs. See DRM and iOS features.