# ArtPlayer.js: an HTML5 player whose controls you can take apart

> ArtPlayer.js is an MIT-licensed HTML5 video player built around a customizable control layer, with subtitle formats and streaming integrations handled by separate plugins. Here is what the repository documents, where it stops, and who should pick it over video.js.

**zhw2590582/ArtPlayer** — :art: ArtPlayer.js is a modern and full featured HTML5 video player

- Repository: https://github.com/zhw2590582/ArtPlayer
- Website: https://artplayer.org
- Stars: 4,086 · Forks: 388
- Language: JavaScript
- License: MIT
- Published: 2026-09-23 · Updated: 2026-09-23 · Language: en
- Canonical page: https://hysenlabs.com/projects/zhw2590582-artplayer

## What ArtPlayer.js solves, and for whom

The browser gives you a <video> element and a native control bar you can barely style. Anything beyond play, pause and a scrubber, such as a quality switcher, a screenshot button, a context menu, or subtitle tracks in formats the browser does not parse, has to be written by hand. ArtPlayer.js is the layer that sits between the raw element and your interface. The README describes it as "a modern and full featured HTML5 video player" whose functional controls "support customization", and that customization is the actual selling point rather than playback itself. The target reader is a front-end engineer or a small product team embedding video into a site: course platforms, media portals, internal review tools. The repository's own example directory contains example/react.js/ and example/vue.js/, which signals that framework users are expected. Subtitle support is built in rather than bolted on: the README states the player "directly supports .vtt, .ass and .srt subtitle formats", so ASS styling, which most players ignore, is parsed by the player itself.

## The control layer is the product, and plugins are the escape hatch

The core package is deliberately thin. Playback is delegated to the browser or to whichever streaming library you attach, and the README says integration with flv.js, hls.js and dash.js "is also very simple". Everything that is not baseline playback lives in a plugin table: artplayer-plugin-danmuku for bullet comments, artplayer-plugin-hls-control and artplayer-plugin-dash-control for quality selection, artplayer-plugin-vtt-thumbnail and artplayer-plugin-auto-thumbnail for preview strips, artplayer-plugin-multiple-subtitles, artplayer-plugin-chromecast, artplayer-plugin-vast for VAST/VPAID advertising, artplayer-plugin-chapter, artplayer-plugin-ambilight, artplayer-plugin-document-pip and artplayer-plugin-audio-track. That split is a real architectural decision with two consequences. On the plus side, a site that only needs an MP4 player never downloads HLS or advertising code. On the minus side, the feature you want may not be in the core, and the plugin table is the only index of what exists. The README does not document a plugin API contract in the excerpt available, so if you plan to write your own plugin, budget time for reading the source. The repository is a monorepo: package.json declares workspaces as packages/*, the root package is named artplayer-packages and marked private, and lerna.json is present, so plugins are versioned and released independently of the core player.

## Installing ArtPlayer.js and getting a video on screen

The README lists four package managers plus a UMD build and two CDNs. Pick one path. With npm, the install command is a single line, and the repository requires Node 20 or newer according to the engines field in package.json.

```bash
npm install artplayer
```

After installing, import the module. The README shows exactly this form.

```js
import Artplayer from 'artplayer'
```

If you would rather not run a bundler, the README offers a UMD script tag and notes that it exposes the global variable to window.Artplayer. The jsdelivr URL below is copied from the README.

```html
<script src="https://cdn.jsdelivr.net/npm/artplayer/dist/artplayer.js"></script>
```

The player needs a container element in the DOM. The README uses a div with the class artplayer-app.

```html
<div class="artplayer-app"></div>
```

Then construct an instance with two options, container and url. This is the smallest working example the README gives, and after running it you should see the player rendered inside the div with its default control bar.

```js
let art = new Artplayer({
  container: '.artplayer-app',
  url: 'path/to/video.mp4',
})
```

That is the whole first-run path: install, import or load the script, place a container, pass a URL. Note what the README does not show here. There is no example that configures subtitles, quality levels or a plugin in this section, so the next step for anything beyond plain playback is the API document at artplayer.org/document rather than the README itself. The README also links an online editor at artplayer.org where you can load plugin files and examples interactively, which is the fastest way to see a plugin's options before reading its source.

## Where ArtPlayer.js is the wrong choice

The plugin split is the main limitation, and it is worth being blunt about it. If your requirement list reads "HLS and DASH with a quality menu and server-side ad insertion", you are assembling four moving parts: the core player, hls.js or dash.js, artplayer-plugin-hls-control or artplayer-plugin-dash-control, and artplayer-plugin-vast. Each is published and versioned separately, so an upgrade to the core does not automatically move the plugins with it. The README's install section covers the core package only; it does not document how to install or register any plugin, and the plugin table links to live examples rather than to per-plugin installation instructions. That is a documentation gap you will feel on day one. The second limitation is versioning. The root package.json reports version 6.1.0 while the most recent release listed is 5.4.0 from 2026-03-13, and the repository carries a CHANGELOG.md but the README does not describe a migration path between major versions. If you pin a version and later need a fix, read CHANGELOG.md before assuming the upgrade is mechanical. Finally, the browserslist field in package.json is set to "last 1 Chrome version", which tells you the project's own build target is a narrow one. If your audience includes older Safari or embedded webviews, the README does not make a compatibility promise you can rely on.

## ArtPlayer.js versus video.js

video.js is the obvious comparison, and the difference is in where features live. video.js ships a plugin ecosystem too, but its core is larger and its bundled documentation covers a formal plugin registration API and a skinning system. ArtPlayer.js keeps the core smaller and pushes streaming, thumbnails, advertising and picture-in-picture into packages that share the artplayer-plugin- prefix. The practical effect: with ArtPlayer.js you write more glue code, but the control bar, context menu and layer system are exposed as first-class customization points, which is what the README means when it says controls "support customization" and the code is "highly decoupled". If you want the shortest path to a standard-looking player, video.js asks less of you. If you want a player whose chrome you intend to rebuild around your own product, ArtPlayer.js gives you fewer opinions to fight. There is no benchmark in the repository comparing the two, so the choice comes down to how much of the interface you plan to replace.

## Maintenance, licensing and what an upgrade costs

The repository is not archived, and the last push was on 2026-09-16, which is recent. Releases are less frequent than commits: 5.2.5 on 2025-08-10, 5.3.0 on 2025-09-06, and 5.4.0 on 2026-03-13, while the root package.json already reads 6.1.0. That gap between the published release list and the workspace version is worth understanding before you pin anything, because it suggests the monorepo version and the npm package version do not move in lockstep. The licence is MIT, declared both in the README badge and in package.json, which permits commercial use and modification provided the copyright notice and permission notice are kept. That is a summary of what the licence text says, not legal advice; if your organisation has a policy on third-party licences, run it past whoever owns that policy. Upgrade cost is the open question. The README links CHANGELOG.md but documents no deprecation policy, no support window and no migration guide, so treat a major version bump as work to schedule rather than a routine dependency update. The repository also contains AGENTS.md and CLAUDE.md at the top level, which indicates the maintainers have set up instructions for AI coding assistants working in the codebase.

## Conclusion

Adopt ArtPlayer.js if you are building a web front end where the control bar, context menu and overlay layers must match your own product, and you can accept that streaming protocols, thumbnails and ad playback arrive as separate plugins. Do not adopt it if you want one library that bundles HLS, DASH and advertising out of the box, or if you need a documented upgrade path across major versions, because the README links a changelog but does not describe migration steps. Before you commit, open the API document at artplayer.org/document, check that the plugin you depend on is listed in the repository's plugin table, and read CHANGELOG.md for the 5.x to 6.x changes.

## FAQ

### How do I install ArtPlayer.js?

The README gives four package-manager commands: npm install artplayer, yarn add artplayer, pnpm add artplayer, and bun add artplayer. You can also load the UMD build from jsdelivr or unpkg with a script tag, which exposes the global variable window.Artplayer.

### What is a good alternative to ArtPlayer.js?

video.js is the natural comparison, and the difference is where features live: video.js bundles a larger core with a documented plugin and skinning system, while ArtPlayer.js keeps the core small and moves streaming, thumbnails and advertising into separately versioned artplayer-plugin-* packages.

### Which subtitle formats does ArtPlayer.js support?

The README states that the player directly supports .vtt, .ass and .srt subtitle formats. There is also a separate artplayer-plugin-multiple-subtitles package for handling more than one subtitle track.

### Does ArtPlayer.js support HLS and DASH streams?

Not in the core package. The README says integration with flv.js, hls.js and dash.js is simple, and the plugin table lists artplayer-plugin-hls-control and artplayer-plugin-dash-control for quality control on those streams.

### What Node version does the ArtPlayer.js repository require to build?

The engines field in the repository's package.json specifies node >= 20.0.0, and the root package.json is a private workspace root rather than the published player package.

### Is ArtPlayer.js free to use in a commercial product?

The licence is MIT, declared in both the README badge and package.json, which permits commercial use and modification as long as the copyright notice and permission notice are retained. That is what the licence states, not legal advice.

## Sources

- [License: MIT](https://github.com/zhw2590582/ArtPlayer/blob/master/LICENSE)
- [Project website](https://artplayer.org)
- [README](https://github.com/zhw2590582/ArtPlayer/blob/master/README.md)
- [Releases](https://github.com/zhw2590582/ArtPlayer/releases)
- [zhw2590582/ArtPlayer on GitHub](https://github.com/zhw2590582/ArtPlayer)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/zhw2590582-artplayer
