2.14.3 • Published 1 month ago

openplayerjs v2.14.3

Weekly downloads
280
License
MIT
Repository
github
Last release
1 month ago

OpenPlayer.js

openplayer

NPM

Tweet JSDelivr Greenkeeper badge Build Status Conventional Commits

This awesome player mimics the HTML5 video/audio methods/events/properties, and integrates the most popular libraries to play different types of native media, such as MP4/MP3, HLS and M(PEG)-DASH.

It also has the ability to play VMAP, VAST and VPAID Ads in an effortless way!

Advantages of using OpenPlayerJS

  • Supports IE11+ (Win8) and all modern browsers: its CSS and code is compatible with all modern browsers. IE11+ on Win7 requires an MP4/MP3 fallback to work correctly.
  • Lightweight library: Less than 20kb when gzipped.
  • Monetize video and audio content with video advertising using VAST, VPAID or VMAP Ads, supported by the amazing Interactive Media Ads SDK (IMA SDK) library.
  • Multi Ads: OpenPlayerJS is the only player that provides the ability to use a single VAST/VPAID source or a VAST/VPAID playlist from several different sources (including URLs and valid XML strings). Usually, advertisers take only part of the total traffic of a website. As a result, users view only 10% of the total advertising per day (besides, once the user has seen the Ad, the advertiser's cookie is set, so it will not perform a new request through the server. Therefore, a website benefits when connecting multiple Ads streams.
  • Enhance player controls: You can add your own buttons (see example above).
  • Accessibility is a priority: You can even create specific styling for high contrast mode, and support visually impaired people and improve accessibility. See High Contrast Proof CSS Sprites for more details.
  • Always up-to-date: Relying on services like Greenkeeper, OpenPlayer uses the latest and greatest versions of the packages to ensure it is always updated; also, IMA SDK, hls.js and dash.js use even-green paths from their recommended CDN sources to they will be always providing the latest upgrades for OpenPlayerJS.
  • Smart autoplay: Special algorithm to detect browser's autoplay capabilities.
  • Responsive: Always adapts to the screen size (and resize) by default, for both video/audio tags; a new fill mode is also included to scale and crop media relative to its parent container.
  • Support for local and remote captions for both video and audio, even without including the crossorigin attribute.
  • No dependencies, since this player is written in Typescript.

Getting Started

These instructions will get you a copy of the project up and running on your local machine for development and testing purposes.

Prerequisites

The dist folder contains the files you will need yo use this awesome library. To obtain it, you can download the repository from https://github.com/openplayerjs/openplayerjs.git or use NPM to get it:

npm install openplayerjs

CDN is also available for better performance. See next section for more details.

Installation

Include OpenPlayer's stylesheet inside the <head> tag, and the script at the bottom of the <body> tag (both of them located in the dist folder). The bundles will contain both minified and uncompressed files, so use the one that fits the best your needs.

Since this player uses HTML5 markup, all the attributes for video/audio tags are available. The only 3 requirements to invoke the player are:

  • A valid media source, such as MP4, MP3, HLS, M(PEG)-DASH.
  • The controls and playsinline attributes to provide cross-browser support.
  • The op-player op-player__media class names to invoke the player.

That's it!

<html>
    <head>
        <link rel="stylesheet" href="/path/to/openplayer.css">
    </head>
    <body>
        <video class="op-player op-player__media" controls playsinline>
            <source src="/path/to/video.mp4" type="video/mp4">
        </video>
        <script src="/path/to/openplayer.js"></script>
    </body>
</html>

We encourage to use CDN for major performance. To do it, in the snippet above, replace /path/to/openplayer.css and /path/to/openplayer.js with https://cdn.jsdelivr.net/npm/openplayerjs@[version]/dist/openplayer.min.css and https://cdn.jsdelivr.net/npm/openplayerjs@[version]/dist/openplayer.min.js.

NOTE: As stated at jsDeliver website, it is recommended to use a [version] number in the URL rather than @latest for production.

If you are planning to use OpenPlayer in a Node project, you can:

// Using as module
var openplayer = require('/path/to/openplayerjs');

// or importing the library (ES6)
import OpenPlayer from 'openplayerjs';

Usage with Javascript

Sometimes you need more flexibility instantiating the player (for example, adding cache busting to the VAST/VPAID URL, or even having a list of Ads URLs). So for that case, remove the op-player class from the video/audio tag (just leave op-player__media to preserve styles), and in Javascript use the following snippet:

var player = new OpenPlayer('[player ID]', [valid VAST/VPAID URL|List of VAST/VPAID URLs], [`true|false` for fullscreen effect by default], {
    // Controls configuration by default; `levels` can be added as well since it's an optional feature
    controls: {
        left: ['play', 'time', 'volume'],
        middle: ['progress'],
        right: ['captions', 'settings', 'fullscreen'],
    },
    // Allow items to be contained in a different space outside of `Settings`
    detachMenus,
    // Number of ms that takes the player to hide the Play button once it starts playing (video only)
    // (bt default, `350`)
    hidePlayBtnTimer,
    // Number of seconds to rewind/forward media
    // (by default, player will rewind/forward 5% of the total duration of media)
    step,
    // Initial volume of media in decimal numbers (by default, `1`)
    startVolume,
    // Initial play time of media in seconds (by default, `0`)
    startTime,
    // Allow loader to be displayed when loading video (by default, `false`)
    showLoaderOnInit,
    // Callback to be executed once an error is found (default, `console.error`)
    // Params passed: Custom event with `detail: { type: 'HTML5|Ads|M(PEG)-DASH|HLS', message, data },`
    onError,
    ads: {
        // Custom path/URL to IMA SDK
        url,
        // If set to `true`, load `ima3_debug.js` file for debugging purposes
        debug
    },
    hls: {
        // all HLS options available at https://github.com/video-dev/hls.js/blob/master/docs/API.md#fine-tuning.
    },
    dash: {
        // Possible values are SW_SECURE_CRYPTO, SW_SECURE_DECODE, HW_SECURE_CRYPTO, HW_SECURE_CRYPTO,
        // HW_SECURE_DECODE, HW_SECURE_ALL
        robustnessLevel,
        // object containing property names corresponding to key system name strings (e.g. "org.w3.clearkey") and
        // associated values being instances of ProtectionData
        // (http://vm2.dashif.org/dash.js/docs/jsdocs/MediaPlayer.vo.protection.ProtectionData.html)
        drm
    },
});
// Don't forget to start the player
player.init();

NOTE: Only caveat here is that the video/audio tags need an ID ahead of time.

API

If you need more control over the player, OpenPlayer stores instances of each player in the document. To have access to a specific instance, use video/audio's id and use OpenPlayer.instances element.

NOTE: if an id attribute is not detected, OpenPlayer will autogenerate one.

// Selects the first video/audio that uses OpenPlayer
var id = document.querySelector('.op-player').id;
var player = OpenPlayer.instances[id];

The methods supported by the OpenPlayer instance are:

MethodDescription
playPlay media. If Ads are detected, different methods than the native ones are triggered with this operation.
pausePause media. If Ads are detected, different methods than the native ones are triggered with this operation.
loadLoad media. HLS and M(PEG)-DASH perform more operations during loading if browser does not support them natively.
addCaptionsAppend a new <track> tag to the video/audio tag and dispatch event so it gets registered/loaded in the player, via controlschanged event.
addControlAppend a new button to the video/audio tag with the possibility dispatch a custom callback so it gets registered/loaded in the player, via controlschanged event. It requires an object with icon URL/path, title for the button, the position (right or left) of the button and a click callback to dispatch an action.
destroyDestroy OpenMedia Player instance (including all events associated) and return the video/audio tag to its original state.
getAdRetrieve an instance of the Ads object.
getMediaRetrieve an instance of the Media object.
activeElementRetrieve the current media object (could be Ads or any other media type).
getContainerRetrieve the parent element (with op-player class) of the native video/audio tag.
getControlsRetrieve an instance of the controls object used in the player instance.
getElementRetrieve the original video/audio tag.
getEventsRetrieve the events attached to the player.
initCreate all the markup and events needed for the player.
isAdCheck if current media is an instance of an Ad.
isMediaCheck if current media is an instance of a native media type.
idRetrieve current player's unique identifier.
srcRetrieve/set the current Source list associated with the player.

Events

Since OpenPlayer is based on HTML5 media, the way to trigger events is using the video/audio tag.

Using the code above, you can attach/dispatch any valid event, using CustomEvent, like this:

player.getElement().addEventListener('ended', function() {
    console.log('Your code when media ends playing');
});

var event = new CustomEvent('ended');
player.getElement().dispatchEvent(event);

All HTML5 media events are supported by OpenPlayer, and it incorporates some custom ones, mostly related to Ads:

EventDescription
controlshiddenEvent executed when controls timer stops and hides control bar (video only).
controlschangedEvent triggered when an element modified the state of the controls and they regenerate (i.e., adding new caption).
captionschangedEvent triggered when user changes the current caption by selecting a new one from the Settings menu.
playererrorEvent executed when any error has occurred within the OpenPlayer instance; a response will be sent via onError config callback. See Usage with Javascript for more details.
playerdestroyedEvent executed when an instance of OpenPlayer is destroyed (useful to remove extra elements created with the player's help).
adsloadedEvent when Ads have been loaded successfully and can be played.
adsstartEvent when Ads start being played.
adsfirstquartileEvent triggered when Ad reached the first quarter of its length.
adsmidpointEvent triggered when Ad reached half of its length.
adsthirdquartileEvent triggered when Ad reached the third quarter of its length.
adscompleteEvent triggered when Ad reached the end of its length.
adsskippedEvent triggered when user skips the Ad.
adsvolumeChangeEvent triggered when user increases/decreases the volume of Ad.
adsallAdsCompletedEvent triggered when all Ads have been played.
adsmediaendedEvent executed when an Ad is going to be played after media has ended playing (currently used to change the Replay icon to Pause when playing a postroll Ad).

In addition to the list above, HLS events and HLS error events are being supported by OpenPlayer, including all their details. For the error ones, they are classified as networkError, mediaError, muxError and otherError.

Examples

Witness the power of this player by browser the best examples!

If you want to suggest one, please submit an issue indicating what scenarios could OpenPlayerJS help you with.

  1. No configuration (only DOM classes)
  2. Minimal configuration
  3. Using Ads
  4. Using Levels
  5. Playing HLS streaming with DRM (Encryption)
  6. M(PEG)-DASH with Ads
  7. Basic playlist (video and audio)
  8. Ads playlist (multiple URLs)
  9. Retrieve data from audio streaming (HLS)

Built With

Contributing

Make sure you check Conventional Commits Standards for commit guidelines.

Authors

See also the list of contributors who participated in this project.

License

This project is licensed under the MIT License - see the LICENSE.md file for details.

2.14.3

1 month ago

2.14.1

4 months ago

2.14.2

4 months ago

2.14.0

4 months ago

2.13.3

8 months ago

2.13.2

8 months ago

2.13.1

8 months ago

2.13.0

2 years ago

2.12.0

2 years ago

2.11.0

2 years ago

2.10.1

2 years ago

2.9.4

2 years ago

2.10.0

2 years ago

2.9.3

3 years ago

2.9.2

3 years ago

2.9.1

3 years ago

2.9.0

3 years ago

2.8.3

3 years ago

2.8.2

3 years ago

2.8.1

3 years ago

2.8.0

3 years ago

2.7.4

3 years ago

2.7.3

3 years ago

2.7.2

3 years ago

2.7.1

3 years ago

2.7.0

3 years ago

2.6.1

3 years ago

2.6.0

3 years ago

2.5.0

3 years ago

2.4.1

3 years ago

2.4.0

3 years ago

2.3.0

3 years ago

2.2.4

3 years ago

2.2.3

3 years ago

2.2.2

3 years ago

2.2.1

3 years ago

2.2.0

3 years ago

2.1.3

3 years ago

2.1.2

3 years ago

2.1.1

3 years ago

2.1.0

3 years ago

2.0.0

4 years ago

1.16.11

4 years ago

1.16.10

4 years ago

1.16.9

4 years ago

1.16.8

4 years ago

1.16.7

4 years ago

1.16.6

4 years ago

1.16.5

4 years ago

1.16.4

4 years ago

1.16.3

4 years ago

1.16.2

4 years ago

1.16.1

4 years ago

1.16.0

4 years ago

1.15.0

4 years ago

1.14.5

4 years ago

1.14.4

4 years ago

1.14.3

4 years ago

1.14.2

4 years ago

1.14.1

4 years ago

1.13.2

4 years ago

1.14.0

4 years ago

1.13.1

5 years ago

1.13.0

5 years ago

1.12.1

5 years ago

1.12.0

5 years ago

1.11.1

5 years ago

1.11.0

5 years ago

1.10.0

5 years ago

1.9.0

5 years ago

1.8.1

5 years ago

1.8.0

5 years ago

1.7.0

5 years ago

1.6.0

5 years ago

1.5.0

5 years ago

1.4.1

5 years ago

1.4.0

6 years ago

1.3.4

6 years ago

1.3.3

6 years ago

1.3.2

6 years ago

1.3.1

6 years ago

1.3.0

6 years ago

1.2.3

6 years ago

1.2.2

6 years ago