CinePro Core is in active development. Providers may be added, updated, or removed at any time. Check the changelog for updates.
Overview
CinePro Core aggregates streaming sources from multiple independent providers. Each provider is a TypeScript class that extendsBaseProvider from @omss/framework and declares what content types it supports — movies, TV shows, or both.
The framework handles all the heavy lifting: routing, response formatting, TMDB validation, caching, and proxying. You only write the source-fetching logic.
Built-in Providers
CinePro Core ships with the following providers out of the box. All providers live undersrc/providers/ and are auto-discovered at startup.
Directory Structure
Each provider lives in its own folder insidesrc/providers/. A typical provider contains a single TypeScript file named after the provider:
src
providers
vidsrc
vidsrc.ts
vidzee
vidzee.ts
your-provider
your-provider.ts
Auto-Discovery
CinePro Core uses@omss/framework’s built-in auto-discovery feature to register providers automatically at startup. You do not need to manually import or register each provider.
In src/server.ts, providers are loaded with a single call:
discoverProviders method scans the given directory recursively, finds every class that extends BaseProvider, instantiates it, and registers it with the server — all without any manual wiring.
The path passed to
discoverProviders is resolved relative to the compiled output directory (i.e. dist/providers/ in production). If you add a new provider folder, no changes to server.ts are needed.Adding a New Provider
Create the provider folder and file
Create a new directory and TypeScript file under
src/providers/:Implement BaseProvider
Extend
BaseProvider from @omss/framework and implement the required properties and methods:Key Interface Properties
| Property | Type | Required | Description |
|---|---|---|---|
id | string | ✅ | Unique machine-readable identifier (lowercase, no spaces) |
name | string | ✅ | Human-readable display name |
enabled | boolean | ✅ | Toggle the provider without removing it |
BASE_URL | string | ✅ | Provider’s base URL, used as the default Referer |
HEADERS | object | ✅ | Default HTTP headers for all requests |
capabilities | ProviderCapabilities | ✅ | Declares supported content types (movies, tv) |
getMovieSources | async method | ✅ | Returns sources for a given movie |
getTVSources | async method | ✅ | Returns sources for a given TV episode |
healthCheck | async method | Optional | Returns true if the provider is reachable |
ProviderMediaObject Fields
Themedia argument passed to getMovieSources and getTVSources contains:
| Field | Type | Description |
|---|---|---|
tmdbId | number | TMDB ID for the title |
type | "movie" | "tv" | Content type |
s | number | undefined | Season number (TV only) |
e | number | undefined | Episode number (TV only) |
Best Practices
Always use createProxyUrl for stream URLs
Always use createProxyUrl for stream URLs
Never return a raw stream URL directly. Use
this.createProxyUrl(url, headers) so the framework can forward required headers (e.g. Referer, Origin) through its built-in proxy. This keeps stream URLs playable from the browser without CORS issues.Return diagnostics instead of throwing
Return diagnostics instead of throwing
Providers must never throw uncaught exceptions — the framework expects a
ProviderResult regardless of success or failure. Wrap all logic in try/catch and return a diagnostics entry on error. This lets the API aggregate results across all providers even if one fails.Use enabled = false instead of deleting
Use enabled = false instead of deleting
If you want to temporarily disable a provider, set
readonly enabled = false rather than deleting the file. This keeps the code in place and makes it trivial to re-enable later.Keep providers stateless
Keep providers stateless
Provider instances are reused across requests. Do not store per-request state in instance variables. Use local variables inside
getMovieSources / getTVSources for anything request-specific.