Files
v10/packages/core/media/README.md
T
2025-10-21 14:02:10 -07:00

6.8 KiB

@vjs-10/media

HTMLMediaElement contracts, utilities, and playback engine integration

npm

Status: Early Development

⚠️ PROTOTYPE - SUBJECT TO CHANGE

This package is in early prototype phase. Expect significant changes including:

  • Package restructuring and naming
  • Breaking API changes
  • Major architectural updates
  • Incomplete or experimental features

Not recommended for production use.

Overview

@vjs-10/media provides contracts, utilities, and integration helpers for working with HTMLMediaElement and playback engines. It bridges the gap between native media elements and advanced streaming capabilities, offering a consistent interface for media playback across different scenarios.

Key Features

  • HTMLMediaElement Contracts - TypeScript interfaces and types for media elements
  • Playback Engine Integration - Seamless integration with @vjs-10/playback-engine
  • Media Utilities - Helper functions for common media operations
  • Source Management - Intelligent media source loading and switching
  • Runtime Agnostic - Works in any JavaScript environment
  • Type Safe - Full TypeScript support

Installation

npm install @vjs-10/media

Quick Start

Basic Media Setup

import { setupMedia } from '@vjs-10/media';

const videoElement = document.querySelector('video');

// Setup media element with automatic engine selection
const mediaController = setupMedia(videoElement, {
  src: 'https://example.com/video.mp4',
  autoplay: false,
  preload: 'metadata',
});

// Load source
mediaController.load();

// Clean up
mediaController.destroy();

With HLS Streaming

import { setupMedia } from '@vjs-10/media';

const videoElement = document.querySelector('video');

// HLS source automatically uses HlsJSPlaybackEngine
const mediaController = setupMedia(videoElement, {
  src: 'https://example.com/stream.m3u8',
});

mediaController.load();

Source Switching

import { setupMedia } from '@vjs-10/media';

const mediaController = setupMedia(videoElement, {
  src: 'https://example.com/video1.mp4',
});

// Switch to different source
mediaController.setSrc('https://example.com/video2.mp4');

// Switch to HLS stream
mediaController.setSrc('https://example.com/stream.m3u8');

Core Concepts

Media Contracts

TypeScript interfaces for media element properties and behavior:

import type { MediaElement, MediaSource, MediaState } from '@vjs-10/media';

// MediaElement - Extended HTMLMediaElement interface
const element: MediaElement = videoElement;

// MediaSource - Source configuration
const source: MediaSource = {
  src: 'https://example.com/video.mp4',
  type: 'video/mp4',
};

// MediaState - Represents media playback state
const state: MediaState = {
  currentTime: 0,
  duration: 0,
  paused: true,
  volume: 1,
  muted: false,
};

Engine Integration

Automatic playback engine selection based on source type:

import { setupMedia } from '@vjs-10/media';

// Native playback for standard formats
setupMedia(videoElement, { src: 'video.mp4' });

// Automatic HLS engine for .m3u8
setupMedia(videoElement, { src: 'stream.m3u8' });

// Explicit engine selection
setupMedia(videoElement, {
  src: 'stream.m3u8',
  engine: 'hls', // or 'native', 'dash', etc.
});

Media Controller

The media controller provides a unified API:

const controller = setupMedia(videoElement, options);

// Lifecycle
controller.load(); // Load the source
controller.destroy(); // Clean up resources

// Source management
controller.setSrc(newSrc); // Switch source
controller.getSrc(); // Get current source

// Events
controller.on('ready', () => {});
controller.on('error', (error) => {});
controller.on('sourcechange', (src) => {});

API Overview

Functions

// Setup media element with configuration
function setupMedia(
  element: HTMLMediaElement,
  options: MediaOptions
): MediaController

// Detect media type from URL
function detectMediaType(src: string): 'hls' | 'dash' | 'native'

// Check if source requires playback engine
function requiresEngine(src: string): boolean

Types

interface MediaOptions {
  src: string;
  type?: string;
  engine?: 'auto' | 'native' | 'hls' | 'dash';
  autoplay?: boolean;
  preload?: 'none' | 'metadata' | 'auto';
  crossOrigin?: 'anonymous' | 'use-credentials';
}

interface MediaController {
  load: () => void;
  destroy: () => void;
  setSrc: (src: string) => void;
  getSrc: () => string;
  on: (event: string, handler: Function) => void;
  off: (event: string, handler: Function) => void;
}

Use Cases

Progressive vs. Adaptive Streaming

import { detectMediaType, setupMedia } from '@vjs-10/media';

const src = getUserSelectedSource();
const type = detectMediaType(src);

if (type === 'hls') {
  console.log('Using adaptive streaming');
} else {
  console.log('Using progressive download');
}

const controller = setupMedia(videoElement, { src });

Multi-Quality Source Selection

import { setupMedia } from '@vjs-10/media';

const sources = [
  { src: 'video-4k.mp4', quality: '4K' },
  { src: 'video-1080p.mp4', quality: '1080p' },
  { src: 'video-720p.mp4', quality: '720p' },
];

const selectedSource = selectSourceByQuality(sources, userPreference);
const controller = setupMedia(videoElement, selectedSource);

Error Recovery

const controller = setupMedia(videoElement, { src: primarySource });

controller.on('error', (error) => {
  console.error('Playback error:', error);

  // Fallback to alternate source
  controller.setSrc(fallbackSource);
  controller.load();
});

Architecture

This package serves as the bridge between:

  • Native media elements (<video>, <audio>)
  • Playback engines (HLS.js, DASH.js, etc. via @vjs-10/playback-engine)
  • Platform integrations (React, Web Components, etc.)

It provides the core logic for:

  • Source type detection
  • Engine selection and lifecycle management
  • Unified API across playback methods

Package Dependencies

  • Dependencies: @vjs-10/playback-engine (for streaming support)
  • Used by: @vjs-10/html-media-elements, @vjs-10/react-media-elements, platform packages

Development

# Build the package
pnpm build

# Watch mode for development
pnpm dev

# Run tests
pnpm test

# Clean build artifacts
pnpm clean

License

Apache-2.0