Headless, event-driven HTML5 video player with HLS streaming, ASS/SSA + VTT subtitles, PiP, and a plugin system. No UI included. TypeScript-first. https://examples.nomercy.tv/videoplayer
  • JavaScript 78.1%
  • TypeScript 21.5%
  • CSS 0.3%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Stoney_Eagle ad74b96fd4 style(desktop-ui): comment continuations are indented the way the file does it
`\t *` rather than `\t*` is what the linter calls mixed spaces and tabs, and it
failed the whole test job on 21 lines of comment I had just written. The house
style is in the file from line 36 onwards.

The dependency bump alongside it clears four advisories -- postcss path
traversal (high, plus the incomplete-fix follow-up), nanoid, js-yaml and
brace-expansion. All four are dev-only, all four are in the lockfile and none of
them changes a published byte: `npm audit` goes from 4 to 0, 1232 tests pass and
the bundle builds.
2026-08-09 21:01:12 +02:00
.github/workflows chore(release): promote nomercy-video-player to stable 2.0.1 2026-07-18 03:05:15 +02:00
e2e fix(e2e): newline after the missing-element guard 2026-07-29 00:42:15 +02:00
public fix: standalone build resolution + apache-2.0 headers 2026-06-14 09:51:58 +02:00
scripts feat(video): API unification consolidation — v2 RC (2.0.0-rc.20) 2026-06-30 03:34:06 +02:00
src style(desktop-ui): comment continuations are indented the way the file does it 2026-08-09 21:01:12 +02:00
.gitattributes chore: add .gitattributes for consistent line endings 2026-03-16 05:52:50 +01:00
.gitignore feat(video): API unification consolidation — v2 RC (2.0.0-rc.20) 2026-06-30 03:34:06 +02:00
.prettierrc Initial Commit 2024-09-11 05:42:55 +02:00
CHANGELOG.md chore(release): 2.0.3 on player-core 2.0.3 2026-07-31 01:51:44 +02:00
CLAUDE.md feat(desktop-ui): add opt-in top-bar cast button next to back/close 2026-07-14 07:14:46 +02:00
CODE_OF_CONDUCT.md chore(video-player): publish-prep — files trim + CoC/CONTRIBUTING/SECURITY 2026-05-16 18:39:58 +02:00
CONTRIBUTING.md feat(video): API unification consolidation — v2 RC (2.0.0-rc.20) 2026-06-30 03:34:06 +02:00
eslint.config.js chore(lint): enforce eslint-plugin-player boundary rules 2026-07-05 05:45:07 +02:00
LICENSE refactor: remove unused plugins, update NMPlayer imports and inlined all styles 2025-01-06 15:09:50 +01:00
MIGRATION.md docs(migration): fix wire-format field name and dead doc links 2026-07-10 06:04:35 +02:00
package-lock.json style(desktop-ui): comment continuations are indented the way the file does it 2026-08-09 21:01:12 +02:00
package.json chore(deps): core 2.0.4, for the per-url media provider 2026-08-04 19:24:38 +02:00
playwright.config.ts feat(video): API unification consolidation — v2 RC (2.0.0-rc.20) 2026-06-30 03:34:06 +02:00
README.md docs(video): fix stale README doc links, drop the phantom Angular guide, and order introduction-to-full-knowledge 2026-07-04 22:30:00 +02:00
RELEASING.md chore(video): refresh migration and release docs for 2.0.0 2026-07-04 03:49:30 +02:00
SECURITY.md chore(video-player): publish-prep — files trim + CoC/CONTRIBUTING/SECURITY 2026-05-16 18:39:58 +02:00
tsconfig.build.json build(video): emit .js extensions via tsc-alias, release rc.8 2026-06-28 18:45:09 +02:00
tsconfig.json build: fix standalone CI build and publish path 2026-06-14 09:03:37 +02:00
vite.config.ts feat(video): API unification consolidation — v2 RC (2.0.0-rc.20) 2026-06-30 03:34:06 +02:00
vite.iife.config.ts fix(video): stop forging peer-plugin namespaces; fix the IIFE build and publish pipeline 2026-07-04 03:49:30 +02:00
vitest.config.ts style(config): process comes from node:process like the other node imports 2026-08-03 00:50:09 +02:00

npm license bundlephobia

Full documentation: https://docs.nomercy.tv/nomercy-video-player/

nomercy-video-player

The headless HLS video engine behind NoMercy TV.

It handles the hard parts of video and hands you plain events and methods.

You stay in control of the interface.

  • Adaptive bitrate streaming over HLS, with HDR-aware quality
  • Multi-format subtitles (VTT, ASS, SSA), chapters, and skip markers
  • Chromecast, a full keyboard and touch input layer, a typed event bus
  • A built-in DesktopUiPlugin for full controls, or bring your own UI

Built on nomercy-player-core, the shared engine for the queue, auth, plugins, i18n, and storage.

Install

npm install @nomercy-entertainment/nomercy-video-player

HLS support is built in. hls.js ships with the player core, so .m3u8 streams work out of the box with nothing extra to install.

Quick start

import { nmplayer } from '@nomercy-entertainment/nomercy-video-player';
import { DesktopUiPlugin } from '@nomercy-entertainment/nomercy-video-player/plugins';

const player = nmplayer('player')
  .addPlugin(DesktopUiPlugin)
  .setup({
    baseUrl: 'https://raw.githubusercontent.com/NoMercy-Entertainment/nomercy-media/master/Films',
    playlist: [
      {
        id: 'sintel',
        title: 'Sintel',
        url: '/Sintel.(2010)/Sintel.(2010).NoMercy.m3u8',
        duration: 888,
      },
    ],
  });

player.on('ready', () => {
  player.item(0, { autoplay: true });
});

That mounts a working player with the full built-in UI.

Bring your own UI

No UI is bundled. Nothing is forced on you.

The controls, the input handling, every feature beyond playback is a plugin you opt into with addPlugin. Drop DesktopUiPlugin from the quick start above and you build your own interface from the player's events, the path the Build a Player tutorial walks one control at a time.

You can also swap any built-in behavior. Pass your own storage, URL resolver, logger, or retry policy to setup(). No subclassing.

Upgrading from v1

See MIGRATION.md for the full breaking-change list, including renamed methods, changed event payloads, and the item.file to item.url rename that breaks silently if missed.

Documentation

The docs site is the full reference, ordered from first player to plugin author:

License

Apache-2.0

Repository: github.com/NoMercy-Entertainment/nomercy-video-player