Latest commit

History

29 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

VideoPlayer

An HTML5 video player that can take in multiple videos with time offsets, and play them in a sequence. Originally developed by Dan Sawada; expanded by Eric Dahlseng and Savannah Niles.

Motivation

If you want to play multiple video clips in a sequence, you can use a single <video> element and change its src when one clip ends and you want to start the next one. Unfortunately, though, there is a time lag between when the <video> element begins to load and when it actually becomes playable.

The purpose of this module is to provide a playback method that eliminates this time lag. This module will preload multiple <video> elements, and coordinate their playback. Many of the properties, callbacks, and methods that a typical <video> element has are also available with this module. This means that common controls (like seeking for example) can easily be performed, so that the end user doesn't have to know that more than one <video> element is being used.

Usage

Demo

To see a demo of how the VideoPlayer can be used, clone the repository or download this entire folder, and set up a quick HTTP server. Python comes with a simple built-in HTTP server:

$ python -m SimpleHTTPServer

Including in your own project

If you want to use this module in a project of your own, you simply need to include the VideoPlayer.js file. We recommend copying the file into your project folder and including it in the <head> section of your html file:

<scriptsrc="\VideoPlayer.js"></script>

If you want to always use the most updated version, feel free to use the GitHub CDN. Keep in mind, however, that the API is subject to change in the future. Just include this in you html <head> section:

<scriptsrc="https://raw.githubusercontent.com/edahlseng/videoplayer/master/VideoPlayer.js"></script>

VideoPlayer Setup

To use the video player, create a VideoPlayer object:

varplayer=newVideoPlayer(videoContainerID,renderObject,options);

Only the videoContainerID and the renderObject are required. The options parameter allows for customization of the player. The available options are described in detail in the API Reference section below.

The videoContainerID is the id of a <div> element in your html file. This <div> must be empty (any elements you put in it will be removed by the player) as its only purpose is to hold the multiple <video> elements in the same place. Be sure to define its height and width in css. The id can be arbitrary:

<divid="VideoPlayerContainer"></div>

The renderObject is an object that describes the sources and time ranges of your sequence of clips. The only required part of the render object is the EDL array. This array contains a list of objects that must contain a url to a video, and optionally a startTime and endTime in seconds.

varrenderObject={EDL: [{url: "http://um-static.media.mit.edu/UU-h0G46k4j2Q/UU-h0G46k4j2Q_low.mp4",startTime: 1.0,endTime: 4.0,},{url: "http://um-static.media.mit.edu/UU-KOsIAlLPHE/UU-KOsIAlLPHE_low.mp4",startTime: 26.5,endTime: 34.0,},{url: "http://um-static.media.mit.edu/UU-0MrczERAe4/UU-0MrczERAe4_low.mp4",startTime: 54.0,endTime: 58.5,}],};

API Reference

The VideoPlayer can be easily customized by specifying options when you create it, and by calling certain predefined methods.

Options

You may pass in an options object in order to customize the video player. The syntax of the options object looks like this:

varoptions={"classString" : "VideoPlayer","transitionTime" : .1,"loadingErrorHandler" : loadingErrorHandler,"loadingStartedHandler" : loadingStartedHandler,"loadingStoppedHandler" : loadingStoppedHandler,"playHandler" : playHandler,"pauseHandler" : pauseHandler,"timeUpdateHandler" : timeUpdateHandler,"clipTransitionHandler" : clipTransitionHandler};

The options object can contain parameters as well as functions to be used as event handler callbacks.

Parameters

  • autoLoadDuration is a boolean that specifies whether the video player should automatically load the duration when it is first created. See VideoPlayer.loadDuration() below in the Methods section for more information. The default is false.
  • autoReload is a boolean that specifies whether the video player should reload the render object when it has reached the end. The default is true.
  • classString is the string that will be added to the class attribute of the <video> elements that the player automatically creates. This parameter allows you to apply css rules to those <video> elements.
  • preloadAmount is the number of clips that should be loaded in advance. In order to elminiate the time lag between clips, the video player will preload clips. By default the player preloads 1 clip. If the clips that you use are very short, or your users have slower internet connections, you may specifiy a larger preloadAmount. Keep in mind that this may cause a larger loading delay at the beginning, however.
  • transitionTime is the length in seconds of the cross-fade between clips. The default is 0.

Event Handler Callbacks

  • clipStartHandler is called when a new clip begins playing.
  • durationLoadedHandler is called after the duration has first been loaded.
  • finishedHandler is called when the end of the render object has been reached.
  • loadingErrorHandler is called when there is a loading error.
  • loadingStartedHandler is called when the player begins to wait for a loading clip.
  • loadingStoppedHandler is called when the player is done waiting for a loading clip.
  • playHandler is called when the player plays.
  • pauseHandler is called when the player is paused.
  • timeUpdateHandler is called when the current time of the player updates.
  • videoReadyHandler is called when the video player is ready to play at the beginning.

Methods

VideoPlayer.currentTime()

  • Returns the current time of the video, independent of the current time of the individual clips.

VideoPlayer.clipIndex()

  • Returns the index of the current clip.

VideoPlayer.duration()

  • Returns the duration of all clips added together. This may need to be loaded first (see VideoPlayer.loadDuration() below).

VideoPlayer.loadDuration()

  • Calling this method will load the duration of the video.
  • If some of the clips in the render object did not have a specified endTime, then the only way to determine the length of those clips is to load the metadata for those clips and then get the clip duration. This only needs to be done once, but must be done before calling VideoPlayer.duration(), unless the render object contains an endTime for each clip.
  • You can specify "autoloadDuration" : true in the options object if you want the duration to be automatically loaded when the video player is first created.

VideoPlayer.play()

  • This will play the video player.

VideoPlayer.pause()

  • This will pause the video player.

VideoPlayer.seekToClipIndex(clipIndex)

  • This will seek the current time of the video player to the beginning of the specified clipIndex.

VideoPlayer.seekToSeconds(desiredSeconds)

  • This will seek the current time of the video player to the time specified in desiredSeconds.
  • The duration must be loaded before this method can be used.

VideoPlayer.togglePlayPause()

  • This will play the player if it is currently paused, and will pause the player if it is currently playing.
  • This is very useful if you have a single button that acts as both the play button and the pause button.

Known Issues

Chrome has trouble loading the same video sequentially from an EDL. This works better in Safari.

About

No description, website, or topics provided.

Resources

Stars

5 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Latest commit

History

29 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

VideoPlayer

An HTML5 video player that can take in multiple videos with time offsets, and play them in a sequence. Originally developed by Dan Sawada; expanded by Eric Dahlseng and Savannah Niles.

Motivation

If you want to play multiple video clips in a sequence, you can use a single <video> element and change its src when one clip ends and you want to start the next one. Unfortunately, though, there is a time lag between when the <video> element begins to load and when it actually becomes playable.

The purpose of this module is to provide a playback method that eliminates this time lag. This module will preload multiple <video> elements, and coordinate their playback. Many of the properties, callbacks, and methods that a typical <video> element has are also available with this module. This means that common controls (like seeking for example) can easily be performed, so that the end user doesn't have to know that more than one <video> element is being used.

Usage

Demo

To see a demo of how the VideoPlayer can be used, clone the repository or download this entire folder, and set up a quick HTTP server. Python comes with a simple built-in HTTP server:

$ python -m SimpleHTTPServer

Including in your own project

If you want to use this module in a project of your own, you simply need to include the VideoPlayer.js file. We recommend copying the file into your project folder and including it in the <head> section of your html file:

<scriptsrc="\VideoPlayer.js"></script>

If you want to always use the most updated version, feel free to use the GitHub CDN. Keep in mind, however, that the API is subject to change in the future. Just include this in you html <head> section:

<scriptsrc="https://raw.githubusercontent.com/edahlseng/videoplayer/master/VideoPlayer.js"></script>

VideoPlayer Setup

To use the video player, create a VideoPlayer object:

varplayer=newVideoPlayer(videoContainerID,renderObject,options);

Only the videoContainerID and the renderObject are required. The options parameter allows for customization of the player. The available options are described in detail in the API Reference section below.

The videoContainerID is the id of a <div> element in your html file. This <div> must be empty (any elements you put in it will be removed by the player) as its only purpose is to hold the multiple <video> elements in the same place. Be sure to define its height and width in css. The id can be arbitrary:

<divid="VideoPlayerContainer"></div>

The renderObject is an object that describes the sources and time ranges of your sequence of clips. The only required part of the render object is the EDL array. This array contains a list of objects that must contain a url to a video, and optionally a startTime and endTime in seconds.

varrenderObject={EDL: [{url: "http://um-static.media.mit.edu/UU-h0G46k4j2Q/UU-h0G46k4j2Q_low.mp4",startTime: 1.0,endTime: 4.0,},{url: "http://um-static.media.mit.edu/UU-KOsIAlLPHE/UU-KOsIAlLPHE_low.mp4",startTime: 26.5,endTime: 34.0,},{url: "http://um-static.media.mit.edu/UU-0MrczERAe4/UU-0MrczERAe4_low.mp4",startTime: 54.0,endTime: 58.5,}],};

API Reference

The VideoPlayer can be easily customized by specifying options when you create it, and by calling certain predefined methods.

Options

You may pass in an options object in order to customize the video player. The syntax of the options object looks like this:

varoptions={"classString" : "VideoPlayer","transitionTime" : .1,"loadingErrorHandler" : loadingErrorHandler,"loadingStartedHandler" : loadingStartedHandler,"loadingStoppedHandler" : loadingStoppedHandler,"playHandler" : playHandler,"pauseHandler" : pauseHandler,"timeUpdateHandler" : timeUpdateHandler,"clipTransitionHandler" : clipTransitionHandler};

The options object can contain parameters as well as functions to be used as event handler callbacks.

Parameters

  • autoLoadDuration is a boolean that specifies whether the video player should automatically load the duration when it is first created. See VideoPlayer.loadDuration() below in the Methods section for more information. The default is false.
  • autoReload is a boolean that specifies whether the video player should reload the render object when it has reached the end. The default is true.
  • classString is the string that will be added to the class attribute of the <video> elements that the player automatically creates. This parameter allows you to apply css rules to those <video> elements.
  • preloadAmount is the number of clips that should be loaded in advance. In order to elminiate the time lag between clips, the video player will preload clips. By default the player preloads 1 clip. If the clips that you use are very short, or your users have slower internet connections, you may specifiy a larger preloadAmount. Keep in mind that this may cause a larger loading delay at the beginning, however.
  • transitionTime is the length in seconds of the cross-fade between clips. The default is 0.

Event Handler Callbacks

  • clipStartHandler is called when a new clip begins playing.
  • durationLoadedHandler is called after the duration has first been loaded.
  • finishedHandler is called when the end of the render object has been reached.
  • loadingErrorHandler is called when there is a loading error.
  • loadingStartedHandler is called when the player begins to wait for a loading clip.
  • loadingStoppedHandler is called when the player is done waiting for a loading clip.
  • playHandler is called when the player plays.
  • pauseHandler is called when the player is paused.
  • timeUpdateHandler is called when the current time of the player updates.
  • videoReadyHandler is called when the video player is ready to play at the beginning.

Methods

VideoPlayer.currentTime()

  • Returns the current time of the video, independent of the current time of the individual clips.

VideoPlayer.clipIndex()

  • Returns the index of the current clip.

VideoPlayer.duration()

  • Returns the duration of all clips added together. This may need to be loaded first (see VideoPlayer.loadDuration() below).

VideoPlayer.loadDuration()

  • Calling this method will load the duration of the video.
  • If some of the clips in the render object did not have a specified endTime, then the only way to determine the length of those clips is to load the metadata for those clips and then get the clip duration. This only needs to be done once, but must be done before calling VideoPlayer.duration(), unless the render object contains an endTime for each clip.
  • You can specify "autoloadDuration" : true in the options object if you want the duration to be automatically loaded when the video player is first created.

VideoPlayer.play()

  • This will play the video player.

VideoPlayer.pause()

  • This will pause the video player.

VideoPlayer.seekToClipIndex(clipIndex)

  • This will seek the current time of the video player to the beginning of the specified clipIndex.

VideoPlayer.seekToSeconds(desiredSeconds)

  • This will seek the current time of the video player to the time specified in desiredSeconds.
  • The duration must be loaded before this method can be used.

VideoPlayer.togglePlayPause()

  • This will play the player if it is currently paused, and will pause the player if it is currently playing.
  • This is very useful if you have a single button that acts as both the play button and the pause button.

Known Issues

Chrome has trouble loading the same video sequentially from an EDL. This works better in Safari.

About

No description, website, or topics provided.

Resources

Stars

5 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

29 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

VideoPlayer

An HTML5 video player that can take in multiple videos with time offsets, and play them in a sequence. Originally developed by Dan Sawada; expanded by Eric Dahlseng and Savannah Niles.

Motivation

If you want to play multiple video clips in a sequence, you can use a single <video> element and change its src when one clip ends and you want to start the next one. Unfortunately, though, there is a time lag between when the <video> element begins to load and when it actually becomes playable.

The purpose of this module is to provide a playback method that eliminates this time lag. This module will preload multiple <video> elements, and coordinate their playback. Many of the properties, callbacks, and methods that a typical <video> element has are also available with this module. This means that common controls (like seeking for example) can easily be performed, so that the end user doesn't have to know that more than one <video> element is being used.

Usage

Demo

To see a demo of how the VideoPlayer can be used, clone the repository or download this entire folder, and set up a quick HTTP server. Python comes with a simple built-in HTTP server:

$ python -m SimpleHTTPServer

Including in your own project

If you want to use this module in a project of your own, you simply need to include the VideoPlayer.js file. We recommend copying the file into your project folder and including it in the <head> section of your html file:

<scriptsrc="\VideoPlayer.js"></script>

If you want to always use the most updated version, feel free to use the GitHub CDN. Keep in mind, however, that the API is subject to change in the future. Just include this in you html <head> section:

<scriptsrc="https://raw.githubusercontent.com/edahlseng/videoplayer/master/VideoPlayer.js"></script>

VideoPlayer Setup

To use the video player, create a VideoPlayer object:

varplayer=newVideoPlayer(videoContainerID,renderObject,options);

Only the videoContainerID and the renderObject are required. The options parameter allows for customization of the player. The available options are described in detail in the API Reference section below.

The videoContainerID is the id of a <div> element in your html file. This <div> must be empty (any elements you put in it will be removed by the player) as its only purpose is to hold the multiple <video> elements in the same place. Be sure to define its height and width in css. The id can be arbitrary:

<divid="VideoPlayerContainer"></div>

The renderObject is an object that describes the sources and time ranges of your sequence of clips. The only required part of the render object is the EDL array. This array contains a list of objects that must contain a url to a video, and optionally a startTime and endTime in seconds.

varrenderObject={EDL: [{url: "http://um-static.media.mit.edu/UU-h0G46k4j2Q/UU-h0G46k4j2Q_low.mp4",startTime: 1.0,endTime: 4.0,},{url: "http://um-static.media.mit.edu/UU-KOsIAlLPHE/UU-KOsIAlLPHE_low.mp4",startTime: 26.5,endTime: 34.0,},{url: "http://um-static.media.mit.edu/UU-0MrczERAe4/UU-0MrczERAe4_low.mp4",startTime: 54.0,endTime: 58.5,}],};

API Reference

The VideoPlayer can be easily customized by specifying options when you create it, and by calling certain predefined methods.

Options

You may pass in an options object in order to customize the video player. The syntax of the options object looks like this:

varoptions={"classString" : "VideoPlayer","transitionTime" : .1,"loadingErrorHandler" : loadingErrorHandler,"loadingStartedHandler" : loadingStartedHandler,"loadingStoppedHandler" : loadingStoppedHandler,"playHandler" : playHandler,"pauseHandler" : pauseHandler,"timeUpdateHandler" : timeUpdateHandler,"clipTransitionHandler" : clipTransitionHandler};

The options object can contain parameters as well as functions to be used as event handler callbacks.

Parameters

  • autoLoadDuration is a boolean that specifies whether the video player should automatically load the duration when it is first created. See VideoPlayer.loadDuration() below in the Methods section for more information. The default is false.
  • autoReload is a boolean that specifies whether the video player should reload the render object when it has reached the end. The default is true.
  • classString is the string that will be added to the class attribute of the <video> elements that the player automatically creates. This parameter allows you to apply css rules to those <video> elements.
  • preloadAmount is the number of clips that should be loaded in advance. In order to elminiate the time lag between clips, the video player will preload clips. By default the player preloads 1 clip. If the clips that you use are very short, or your users have slower internet connections, you may specifiy a larger preloadAmount. Keep in mind that this may cause a larger loading delay at the beginning, however.
  • transitionTime is the length in seconds of the cross-fade between clips. The default is 0.

Event Handler Callbacks

  • clipStartHandler is called when a new clip begins playing.
  • durationLoadedHandler is called after the duration has first been loaded.
  • finishedHandler is called when the end of the render object has been reached.
  • loadingErrorHandler is called when there is a loading error.
  • loadingStartedHandler is called when the player begins to wait for a loading clip.
  • loadingStoppedHandler is called when the player is done waiting for a loading clip.
  • playHandler is called when the player plays.
  • pauseHandler is called when the player is paused.
  • timeUpdateHandler is called when the current time of the player updates.
  • videoReadyHandler is called when the video player is ready to play at the beginning.

Methods

VideoPlayer.currentTime()

  • Returns the current time of the video, independent of the current time of the individual clips.

VideoPlayer.clipIndex()

  • Returns the index of the current clip.

VideoPlayer.duration()

  • Returns the duration of all clips added together. This may need to be loaded first (see VideoPlayer.loadDuration() below).

VideoPlayer.loadDuration()

  • Calling this method will load the duration of the video.
  • If some of the clips in the render object did not have a specified endTime, then the only way to determine the length of those clips is to load the metadata for those clips and then get the clip duration. This only needs to be done once, but must be done before calling VideoPlayer.duration(), unless the render object contains an endTime for each clip.
  • You can specify "autoloadDuration" : true in the options object if you want the duration to be automatically loaded when the video player is first created.

VideoPlayer.play()

  • This will play the video player.

VideoPlayer.pause()

  • This will pause the video player.

VideoPlayer.seekToClipIndex(clipIndex)

  • This will seek the current time of the video player to the beginning of the specified clipIndex.

VideoPlayer.seekToSeconds(desiredSeconds)

  • This will seek the current time of the video player to the time specified in desiredSeconds.
  • The duration must be loaded before this method can be used.

VideoPlayer.togglePlayPause()

  • This will play the player if it is currently paused, and will pause the player if it is currently playing.
  • This is very useful if you have a single button that acts as both the play button and the pause button.

Known Issues

Chrome has trouble loading the same video sequentially from an EDL. This works better in Safari.

About

No description, website, or topics provided.

Resources

Stars

5 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

29 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

VideoPlayer

An HTML5 video player that can take in multiple videos with time offsets, and play them in a sequence. Originally developed by Dan Sawada; expanded by Eric Dahlseng and Savannah Niles.

Motivation

If you want to play multiple video clips in a sequence, you can use a single <video> element and change its src when one clip ends and you want to start the next one. Unfortunately, though, there is a time lag between when the <video> element begins to load and when it actually becomes playable.

The purpose of this module is to provide a playback method that eliminates this time lag. This module will preload multiple <video> elements, and coordinate their playback. Many of the properties, callbacks, and methods that a typical <video> element has are also available with this module. This means that common controls (like seeking for example) can easily be performed, so that the end user doesn't have to know that more than one <video> element is being used.

Usage

Demo

To see a demo of how the VideoPlayer can be used, clone the repository or download this entire folder, and set up a quick HTTP server. Python comes with a simple built-in HTTP server:

$ python -m SimpleHTTPServer

Including in your own project

If you want to use this module in a project of your own, you simply need to include the VideoPlayer.js file. We recommend copying the file into your project folder and including it in the <head> section of your html file:

<scriptsrc="\VideoPlayer.js"></script>

If you want to always use the most updated version, feel free to use the GitHub CDN. Keep in mind, however, that the API is subject to change in the future. Just include this in you html <head> section:

<scriptsrc="https://raw.githubusercontent.com/edahlseng/videoplayer/master/VideoPlayer.js"></script>

VideoPlayer Setup

To use the video player, create a VideoPlayer object:

varplayer=newVideoPlayer(videoContainerID,renderObject,options);

Only the videoContainerID and the renderObject are required. The options parameter allows for customization of the player. The available options are described in detail in the API Reference section below.

The videoContainerID is the id of a <div> element in your html file. This <div> must be empty (any elements you put in it will be removed by the player) as its only purpose is to hold the multiple <video> elements in the same place. Be sure to define its height and width in css. The id can be arbitrary:

<divid="VideoPlayerContainer"></div>

The renderObject is an object that describes the sources and time ranges of your sequence of clips. The only required part of the render object is the EDL array. This array contains a list of objects that must contain a url to a video, and optionally a startTime and endTime in seconds.

varrenderObject={EDL: [{url: "http://um-static.media.mit.edu/UU-h0G46k4j2Q/UU-h0G46k4j2Q_low.mp4",startTime: 1.0,endTime: 4.0,},{url: "http://um-static.media.mit.edu/UU-KOsIAlLPHE/UU-KOsIAlLPHE_low.mp4",startTime: 26.5,endTime: 34.0,},{url: "http://um-static.media.mit.edu/UU-0MrczERAe4/UU-0MrczERAe4_low.mp4",startTime: 54.0,endTime: 58.5,}],};

API Reference

The VideoPlayer can be easily customized by specifying options when you create it, and by calling certain predefined methods.

Options

You may pass in an options object in order to customize the video player. The syntax of the options object looks like this:

varoptions={"classString" : "VideoPlayer","transitionTime" : .1,"loadingErrorHandler" : loadingErrorHandler,"loadingStartedHandler" : loadingStartedHandler,"loadingStoppedHandler" : loadingStoppedHandler,"playHandler" : playHandler,"pauseHandler" : pauseHandler,"timeUpdateHandler" : timeUpdateHandler,"clipTransitionHandler" : clipTransitionHandler};

The options object can contain parameters as well as functions to be used as event handler callbacks.

Parameters

  • autoLoadDuration is a boolean that specifies whether the video player should automatically load the duration when it is first created. See VideoPlayer.loadDuration() below in the Methods section for more information. The default is false.
  • autoReload is a boolean that specifies whether the video player should reload the render object when it has reached the end. The default is true.
  • classString is the string that will be added to the class attribute of the <video> elements that the player automatically creates. This parameter allows you to apply css rules to those <video> elements.
  • preloadAmount is the number of clips that should be loaded in advance. In order to elminiate the time lag between clips, the video player will preload clips. By default the player preloads 1 clip. If the clips that you use are very short, or your users have slower internet connections, you may specifiy a larger preloadAmount. Keep in mind that this may cause a larger loading delay at the beginning, however.
  • transitionTime is the length in seconds of the cross-fade between clips. The default is 0.

Event Handler Callbacks

  • clipStartHandler is called when a new clip begins playing.
  • durationLoadedHandler is called after the duration has first been loaded.
  • finishedHandler is called when the end of the render object has been reached.
  • loadingErrorHandler is called when there is a loading error.
  • loadingStartedHandler is called when the player begins to wait for a loading clip.
  • loadingStoppedHandler is called when the player is done waiting for a loading clip.
  • playHandler is called when the player plays.
  • pauseHandler is called when the player is paused.
  • timeUpdateHandler is called when the current time of the player updates.
  • videoReadyHandler is called when the video player is ready to play at the beginning.

Methods

VideoPlayer.currentTime()

  • Returns the current time of the video, independent of the current time of the individual clips.

VideoPlayer.clipIndex()

  • Returns the index of the current clip.

VideoPlayer.duration()

  • Returns the duration of all clips added together. This may need to be loaded first (see VideoPlayer.loadDuration() below).

VideoPlayer.loadDuration()

  • Calling this method will load the duration of the video.
  • If some of the clips in the render object did not have a specified endTime, then the only way to determine the length of those clips is to load the metadata for those clips and then get the clip duration. This only needs to be done once, but must be done before calling VideoPlayer.duration(), unless the render object contains an endTime for each clip.
  • You can specify "autoloadDuration" : true in the options object if you want the duration to be automatically loaded when the video player is first created.

VideoPlayer.play()

  • This will play the video player.

VideoPlayer.pause()

  • This will pause the video player.

VideoPlayer.seekToClipIndex(clipIndex)

  • This will seek the current time of the video player to the beginning of the specified clipIndex.

VideoPlayer.seekToSeconds(desiredSeconds)

  • This will seek the current time of the video player to the time specified in desiredSeconds.
  • The duration must be loaded before this method can be used.

VideoPlayer.togglePlayPause()

  • This will play the player if it is currently paused, and will pause the player if it is currently playing.
  • This is very useful if you have a single button that acts as both the play button and the pause button.

Known Issues

Chrome has trouble loading the same video sequentially from an EDL. This works better in Safari.

About

No description, website, or topics provided.

Resources

Stars

5 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Latest commit

History

29 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

VideoPlayer

An HTML5 video player that can take in multiple videos with time offsets, and play them in a sequence. Originally developed by Dan Sawada; expanded by Eric Dahlseng and Savannah Niles.

Motivation

If you want to play multiple video clips in a sequence, you can use a single <video> element and change its src when one clip ends and you want to start the next one. Unfortunately, though, there is a time lag between when the <video> element begins to load and when it actually becomes playable.

The purpose of this module is to provide a playback method that eliminates this time lag. This module will preload multiple <video> elements, and coordinate their playback. Many of the properties, callbacks, and methods that a typical <video> element has are also available with this module. This means that common controls (like seeking for example) can easily be performed, so that the end user doesn't have to know that more than one <video> element is being used.

Usage

Demo

To see a demo of how the VideoPlayer can be used, clone the repository or download this entire folder, and set up a quick HTTP server. Python comes with a simple built-in HTTP server:

$ python -m SimpleHTTPServer

Including in your own project

If you want to use this module in a project of your own, you simply need to include the VideoPlayer.js file. We recommend copying the file into your project folder and including it in the <head> section of your html file:

<scriptsrc="\VideoPlayer.js"></script>

If you want to always use the most updated version, feel free to use the GitHub CDN. Keep in mind, however, that the API is subject to change in the future. Just include this in you html <head> section:

<scriptsrc="https://raw.githubusercontent.com/edahlseng/videoplayer/master/VideoPlayer.js"></script>

VideoPlayer Setup

To use the video player, create a VideoPlayer object:

varplayer=newVideoPlayer(videoContainerID,renderObject,options);

Only the videoContainerID and the renderObject are required. The options parameter allows for customization of the player. The available options are described in detail in the API Reference section below.

The videoContainerID is the id of a <div> element in your html file. This <div> must be empty (any elements you put in it will be removed by the player) as its only purpose is to hold the multiple <video> elements in the same place. Be sure to define its height and width in css. The id can be arbitrary:

<divid="VideoPlayerContainer"></div>

The renderObject is an object that describes the sources and time ranges of your sequence of clips. The only required part of the render object is the EDL array. This array contains a list of objects that must contain a url to a video, and optionally a startTime and endTime in seconds.

varrenderObject={EDL: [{url: "http://um-static.media.mit.edu/UU-h0G46k4j2Q/UU-h0G46k4j2Q_low.mp4",startTime: 1.0,endTime: 4.0,},{url: "http://um-static.media.mit.edu/UU-KOsIAlLPHE/UU-KOsIAlLPHE_low.mp4",startTime: 26.5,endTime: 34.0,},{url: "http://um-static.media.mit.edu/UU-0MrczERAe4/UU-0MrczERAe4_low.mp4",startTime: 54.0,endTime: 58.5,}],};

API Reference

The VideoPlayer can be easily customized by specifying options when you create it, and by calling certain predefined methods.

Options

You may pass in an options object in order to customize the video player. The syntax of the options object looks like this:

varoptions={"classString" : "VideoPlayer","transitionTime" : .1,"loadingErrorHandler" : loadingErrorHandler,"loadingStartedHandler" : loadingStartedHandler,"loadingStoppedHandler" : loadingStoppedHandler,"playHandler" : playHandler,"pauseHandler" : pauseHandler,"timeUpdateHandler" : timeUpdateHandler,"clipTransitionHandler" : clipTransitionHandler};

The options object can contain parameters as well as functions to be used as event handler callbacks.

Parameters

  • autoLoadDuration is a boolean that specifies whether the video player should automatically load the duration when it is first created. See VideoPlayer.loadDuration() below in the Methods section for more information. The default is false.
  • autoReload is a boolean that specifies whether the video player should reload the render object when it has reached the end. The default is true.
  • classString is the string that will be added to the class attribute of the <video> elements that the player automatically creates. This parameter allows you to apply css rules to those <video> elements.
  • preloadAmount is the number of clips that should be loaded in advance. In order to elminiate the time lag between clips, the video player will preload clips. By default the player preloads 1 clip. If the clips that you use are very short, or your users have slower internet connections, you may specifiy a larger preloadAmount. Keep in mind that this may cause a larger loading delay at the beginning, however.
  • transitionTime is the length in seconds of the cross-fade between clips. The default is 0.

Event Handler Callbacks

  • clipStartHandler is called when a new clip begins playing.
  • durationLoadedHandler is called after the duration has first been loaded.
  • finishedHandler is called when the end of the render object has been reached.
  • loadingErrorHandler is called when there is a loading error.
  • loadingStartedHandler is called when the player begins to wait for a loading clip.
  • loadingStoppedHandler is called when the player is done waiting for a loading clip.
  • playHandler is called when the player plays.
  • pauseHandler is called when the player is paused.
  • timeUpdateHandler is called when the current time of the player updates.
  • videoReadyHandler is called when the video player is ready to play at the beginning.

Methods

VideoPlayer.currentTime()

  • Returns the current time of the video, independent of the current time of the individual clips.

VideoPlayer.clipIndex()

  • Returns the index of the current clip.

VideoPlayer.duration()

  • Returns the duration of all clips added together. This may need to be loaded first (see VideoPlayer.loadDuration() below).

VideoPlayer.loadDuration()

  • Calling this method will load the duration of the video.
  • If some of the clips in the render object did not have a specified endTime, then the only way to determine the length of those clips is to load the metadata for those clips and then get the clip duration. This only needs to be done once, but must be done before calling VideoPlayer.duration(), unless the render object contains an endTime for each clip.
  • You can specify "autoloadDuration" : true in the options object if you want the duration to be automatically loaded when the video player is first created.

VideoPlayer.play()

  • This will play the video player.

VideoPlayer.pause()

  • This will pause the video player.

VideoPlayer.seekToClipIndex(clipIndex)

  • This will seek the current time of the video player to the beginning of the specified clipIndex.

VideoPlayer.seekToSeconds(desiredSeconds)

  • This will seek the current time of the video player to the time specified in desiredSeconds.
  • The duration must be loaded before this method can be used.

VideoPlayer.togglePlayPause()

  • This will play the player if it is currently paused, and will pause the player if it is currently playing.
  • This is very useful if you have a single button that acts as both the play button and the pause button.

Known Issues

Chrome has trouble loading the same video sequentially from an EDL. This works better in Safari.

About

No description, website, or topics provided.

Resources

Stars

5 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

29 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

VideoPlayer

An HTML5 video player that can take in multiple videos with time offsets, and play them in a sequence. Originally developed by Dan Sawada; expanded by Eric Dahlseng and Savannah Niles.

Motivation

If you want to play multiple video clips in a sequence, you can use a single <video> element and change its src when one clip ends and you want to start the next one. Unfortunately, though, there is a time lag between when the <video> element begins to load and when it actually becomes playable.

The purpose of this module is to provide a playback method that eliminates this time lag. This module will preload multiple <video> elements, and coordinate their playback. Many of the properties, callbacks, and methods that a typical <video> element has are also available with this module. This means that common controls (like seeking for example) can easily be performed, so that the end user doesn't have to know that more than one <video> element is being used.

Usage

Demo

To see a demo of how the VideoPlayer can be used, clone the repository or download this entire folder, and set up a quick HTTP server. Python comes with a simple built-in HTTP server:

$ python -m SimpleHTTPServer

Including in your own project

If you want to use this module in a project of your own, you simply need to include the VideoPlayer.js file. We recommend copying the file into your project folder and including it in the <head> section of your html file:

<scriptsrc="\VideoPlayer.js"></script>

If you want to always use the most updated version, feel free to use the GitHub CDN. Keep in mind, however, that the API is subject to change in the future. Just include this in you html <head> section:

<scriptsrc="https://raw.githubusercontent.com/edahlseng/videoplayer/master/VideoPlayer.js"></script>

VideoPlayer Setup

To use the video player, create a VideoPlayer object:

varplayer=newVideoPlayer(videoContainerID,renderObject,options);

Only the videoContainerID and the renderObject are required. The options parameter allows for customization of the player. The available options are described in detail in the API Reference section below.

The videoContainerID is the id of a <div> element in your html file. This <div> must be empty (any elements you put in it will be removed by the player) as its only purpose is to hold the multiple <video> elements in the same place. Be sure to define its height and width in css. The id can be arbitrary:

<divid="VideoPlayerContainer"></div>

The renderObject is an object that describes the sources and time ranges of your sequence of clips. The only required part of the render object is the EDL array. This array contains a list of objects that must contain a url to a video, and optionally a startTime and endTime in seconds.

varrenderObject={EDL: [{url: "http://um-static.media.mit.edu/UU-h0G46k4j2Q/UU-h0G46k4j2Q_low.mp4",startTime: 1.0,endTime: 4.0,},{url: "http://um-static.media.mit.edu/UU-KOsIAlLPHE/UU-KOsIAlLPHE_low.mp4",startTime: 26.5,endTime: 34.0,},{url: "http://um-static.media.mit.edu/UU-0MrczERAe4/UU-0MrczERAe4_low.mp4",startTime: 54.0,endTime: 58.5,}],};

API Reference

The VideoPlayer can be easily customized by specifying options when you create it, and by calling certain predefined methods.

Options

You may pass in an options object in order to customize the video player. The syntax of the options object looks like this:

varoptions={"classString" : "VideoPlayer","transitionTime" : .1,"loadingErrorHandler" : loadingErrorHandler,"loadingStartedHandler" : loadingStartedHandler,"loadingStoppedHandler" : loadingStoppedHandler,"playHandler" : playHandler,"pauseHandler" : pauseHandler,"timeUpdateHandler" : timeUpdateHandler,"clipTransitionHandler" : clipTransitionHandler};

The options object can contain parameters as well as functions to be used as event handler callbacks.

Parameters

  • autoLoadDuration is a boolean that specifies whether the video player should automatically load the duration when it is first created. See VideoPlayer.loadDuration() below in the Methods section for more information. The default is false.
  • autoReload is a boolean that specifies whether the video player should reload the render object when it has reached the end. The default is true.
  • classString is the string that will be added to the class attribute of the <video> elements that the player automatically creates. This parameter allows you to apply css rules to those <video> elements.
  • preloadAmount is the number of clips that should be loaded in advance. In order to elminiate the time lag between clips, the video player will preload clips. By default the player preloads 1 clip. If the clips that you use are very short, or your users have slower internet connections, you may specifiy a larger preloadAmount. Keep in mind that this may cause a larger loading delay at the beginning, however.
  • transitionTime is the length in seconds of the cross-fade between clips. The default is 0.

Event Handler Callbacks

  • clipStartHandler is called when a new clip begins playing.
  • durationLoadedHandler is called after the duration has first been loaded.
  • finishedHandler is called when the end of the render object has been reached.
  • loadingErrorHandler is called when there is a loading error.
  • loadingStartedHandler is called when the player begins to wait for a loading clip.
  • loadingStoppedHandler is called when the player is done waiting for a loading clip.
  • playHandler is called when the player plays.
  • pauseHandler is called when the player is paused.
  • timeUpdateHandler is called when the current time of the player updates.
  • videoReadyHandler is called when the video player is ready to play at the beginning.

Methods

VideoPlayer.currentTime()

  • Returns the current time of the video, independent of the current time of the individual clips.

VideoPlayer.clipIndex()

  • Returns the index of the current clip.

VideoPlayer.duration()

  • Returns the duration of all clips added together. This may need to be loaded first (see VideoPlayer.loadDuration() below).

VideoPlayer.loadDuration()

  • Calling this method will load the duration of the video.
  • If some of the clips in the render object did not have a specified endTime, then the only way to determine the length of those clips is to load the metadata for those clips and then get the clip duration. This only needs to be done once, but must be done before calling VideoPlayer.duration(), unless the render object contains an endTime for each clip.
  • You can specify "autoloadDuration" : true in the options object if you want the duration to be automatically loaded when the video player is first created.

VideoPlayer.play()

  • This will play the video player.

VideoPlayer.pause()

  • This will pause the video player.

VideoPlayer.seekToClipIndex(clipIndex)

  • This will seek the current time of the video player to the beginning of the specified clipIndex.

VideoPlayer.seekToSeconds(desiredSeconds)

  • This will seek the current time of the video player to the time specified in desiredSeconds.
  • The duration must be loaded before this method can be used.

VideoPlayer.togglePlayPause()

  • This will play the player if it is currently paused, and will pause the player if it is currently playing.
  • This is very useful if you have a single button that acts as both the play button and the pause button.

Known Issues

Chrome has trouble loading the same video sequentially from an EDL. This works better in Safari.

About

No description, website, or topics provided.

Resources

Stars

5 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

29 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

VideoPlayer

An HTML5 video player that can take in multiple videos with time offsets, and play them in a sequence. Originally developed by Dan Sawada; expanded by Eric Dahlseng and Savannah Niles.

Motivation

If you want to play multiple video clips in a sequence, you can use a single <video> element and change its src when one clip ends and you want to start the next one. Unfortunately, though, there is a time lag between when the <video> element begins to load and when it actually becomes playable.

The purpose of this module is to provide a playback method that eliminates this time lag. This module will preload multiple <video> elements, and coordinate their playback. Many of the properties, callbacks, and methods that a typical <video> element has are also available with this module. This means that common controls (like seeking for example) can easily be performed, so that the end user doesn't have to know that more than one <video> element is being used.

Usage

Demo

To see a demo of how the VideoPlayer can be used, clone the repository or download this entire folder, and set up a quick HTTP server. Python comes with a simple built-in HTTP server:

$ python -m SimpleHTTPServer

Including in your own project

If you want to use this module in a project of your own, you simply need to include the VideoPlayer.js file. We recommend copying the file into your project folder and including it in the <head> section of your html file:

<scriptsrc="\VideoPlayer.js"></script>

If you want to always use the most updated version, feel free to use the GitHub CDN. Keep in mind, however, that the API is subject to change in the future. Just include this in you html <head> section:

<scriptsrc="https://raw.githubusercontent.com/edahlseng/videoplayer/master/VideoPlayer.js"></script>

VideoPlayer Setup

To use the video player, create a VideoPlayer object:

varplayer=newVideoPlayer(videoContainerID,renderObject,options);

Only the videoContainerID and the renderObject are required. The options parameter allows for customization of the player. The available options are described in detail in the API Reference section below.

The videoContainerID is the id of a <div> element in your html file. This <div> must be empty (any elements you put in it will be removed by the player) as its only purpose is to hold the multiple <video> elements in the same place. Be sure to define its height and width in css. The id can be arbitrary:

<divid="VideoPlayerContainer"></div>

The renderObject is an object that describes the sources and time ranges of your sequence of clips. The only required part of the render object is the EDL array. This array contains a list of objects that must contain a url to a video, and optionally a startTime and endTime in seconds.

varrenderObject={EDL: [{url: "http://um-static.media.mit.edu/UU-h0G46k4j2Q/UU-h0G46k4j2Q_low.mp4",startTime: 1.0,endTime: 4.0,},{url: "http://um-static.media.mit.edu/UU-KOsIAlLPHE/UU-KOsIAlLPHE_low.mp4",startTime: 26.5,endTime: 34.0,},{url: "http://um-static.media.mit.edu/UU-0MrczERAe4/UU-0MrczERAe4_low.mp4",startTime: 54.0,endTime: 58.5,}],};

API Reference

The VideoPlayer can be easily customized by specifying options when you create it, and by calling certain predefined methods.

Options

You may pass in an options object in order to customize the video player. The syntax of the options object looks like this:

varoptions={"classString" : "VideoPlayer","transitionTime" : .1,"loadingErrorHandler" : loadingErrorHandler,"loadingStartedHandler" : loadingStartedHandler,"loadingStoppedHandler" : loadingStoppedHandler,"playHandler" : playHandler,"pauseHandler" : pauseHandler,"timeUpdateHandler" : timeUpdateHandler,"clipTransitionHandler" : clipTransitionHandler};

The options object can contain parameters as well as functions to be used as event handler callbacks.

Parameters

  • autoLoadDuration is a boolean that specifies whether the video player should automatically load the duration when it is first created. See VideoPlayer.loadDuration() below in the Methods section for more information. The default is false.
  • autoReload is a boolean that specifies whether the video player should reload the render object when it has reached the end. The default is true.
  • classString is the string that will be added to the class attribute of the <video> elements that the player automatically creates. This parameter allows you to apply css rules to those <video> elements.
  • preloadAmount is the number of clips that should be loaded in advance. In order to elminiate the time lag between clips, the video player will preload clips. By default the player preloads 1 clip. If the clips that you use are very short, or your users have slower internet connections, you may specifiy a larger preloadAmount. Keep in mind that this may cause a larger loading delay at the beginning, however.
  • transitionTime is the length in seconds of the cross-fade between clips. The default is 0.

Event Handler Callbacks

  • clipStartHandler is called when a new clip begins playing.
  • durationLoadedHandler is called after the duration has first been loaded.
  • finishedHandler is called when the end of the render object has been reached.
  • loadingErrorHandler is called when there is a loading error.
  • loadingStartedHandler is called when the player begins to wait for a loading clip.
  • loadingStoppedHandler is called when the player is done waiting for a loading clip.
  • playHandler is called when the player plays.
  • pauseHandler is called when the player is paused.
  • timeUpdateHandler is called when the current time of the player updates.
  • videoReadyHandler is called when the video player is ready to play at the beginning.

Methods

VideoPlayer.currentTime()

  • Returns the current time of the video, independent of the current time of the individual clips.

VideoPlayer.clipIndex()

  • Returns the index of the current clip.

VideoPlayer.duration()

  • Returns the duration of all clips added together. This may need to be loaded first (see VideoPlayer.loadDuration() below).

VideoPlayer.loadDuration()

  • Calling this method will load the duration of the video.
  • If some of the clips in the render object did not have a specified endTime, then the only way to determine the length of those clips is to load the metadata for those clips and then get the clip duration. This only needs to be done once, but must be done before calling VideoPlayer.duration(), unless the render object contains an endTime for each clip.
  • You can specify "autoloadDuration" : true in the options object if you want the duration to be automatically loaded when the video player is first created.

VideoPlayer.play()

  • This will play the video player.

VideoPlayer.pause()

  • This will pause the video player.

VideoPlayer.seekToClipIndex(clipIndex)

  • This will seek the current time of the video player to the beginning of the specified clipIndex.

VideoPlayer.seekToSeconds(desiredSeconds)

  • This will seek the current time of the video player to the time specified in desiredSeconds.
  • The duration must be loaded before this method can be used.

VideoPlayer.togglePlayPause()

  • This will play the player if it is currently paused, and will pause the player if it is currently playing.
  • This is very useful if you have a single button that acts as both the play button and the pause button.

Known Issues

Chrome has trouble loading the same video sequentially from an EDL. This works better in Safari.

About

No description, website, or topics provided.

Resources

Stars

5 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Latest commit

History

29 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

VideoPlayer

An HTML5 video player that can take in multiple videos with time offsets, and play them in a sequence. Originally developed by Dan Sawada; expanded by Eric Dahlseng and Savannah Niles.

Motivation

If you want to play multiple video clips in a sequence, you can use a single <video> element and change its src when one clip ends and you want to start the next one. Unfortunately, though, there is a time lag between when the <video> element begins to load and when it actually becomes playable.

The purpose of this module is to provide a playback method that eliminates this time lag. This module will preload multiple <video> elements, and coordinate their playback. Many of the properties, callbacks, and methods that a typical <video> element has are also available with this module. This means that common controls (like seeking for example) can easily be performed, so that the end user doesn't have to know that more than one <video> element is being used.

Usage

Demo

To see a demo of how the VideoPlayer can be used, clone the repository or download this entire folder, and set up a quick HTTP server. Python comes with a simple built-in HTTP server:

$ python -m SimpleHTTPServer

Including in your own project

If you want to use this module in a project of your own, you simply need to include the VideoPlayer.js file. We recommend copying the file into your project folder and including it in the <head> section of your html file:

<scriptsrc="\VideoPlayer.js"></script>

If you want to always use the most updated version, feel free to use the GitHub CDN. Keep in mind, however, that the API is subject to change in the future. Just include this in you html <head> section:

<scriptsrc="https://raw.githubusercontent.com/edahlseng/videoplayer/master/VideoPlayer.js"></script>

VideoPlayer Setup

To use the video player, create a VideoPlayer object:

varplayer=newVideoPlayer(videoContainerID,renderObject,options);

Only the videoContainerID and the renderObject are required. The options parameter allows for customization of the player. The available options are described in detail in the API Reference section below.

The videoContainerID is the id of a <div> element in your html file. This <div> must be empty (any elements you put in it will be removed by the player) as its only purpose is to hold the multiple <video> elements in the same place. Be sure to define its height and width in css. The id can be arbitrary:

<divid="VideoPlayerContainer"></div>

The renderObject is an object that describes the sources and time ranges of your sequence of clips. The only required part of the render object is the EDL array. This array contains a list of objects that must contain a url to a video, and optionally a startTime and endTime in seconds.

varrenderObject={EDL: [{url: "http://um-static.media.mit.edu/UU-h0G46k4j2Q/UU-h0G46k4j2Q_low.mp4",startTime: 1.0,endTime: 4.0,},{url: "http://um-static.media.mit.edu/UU-KOsIAlLPHE/UU-KOsIAlLPHE_low.mp4",startTime: 26.5,endTime: 34.0,},{url: "http://um-static.media.mit.edu/UU-0MrczERAe4/UU-0MrczERAe4_low.mp4",startTime: 54.0,endTime: 58.5,}],};

API Reference

The VideoPlayer can be easily customized by specifying options when you create it, and by calling certain predefined methods.

Options

You may pass in an options object in order to customize the video player. The syntax of the options object looks like this:

varoptions={"classString" : "VideoPlayer","transitionTime" : .1,"loadingErrorHandler" : loadingErrorHandler,"loadingStartedHandler" : loadingStartedHandler,"loadingStoppedHandler" : loadingStoppedHandler,"playHandler" : playHandler,"pauseHandler" : pauseHandler,"timeUpdateHandler" : timeUpdateHandler,"clipTransitionHandler" : clipTransitionHandler};

The options object can contain parameters as well as functions to be used as event handler callbacks.

Parameters

  • autoLoadDuration is a boolean that specifies whether the video player should automatically load the duration when it is first created. See VideoPlayer.loadDuration() below in the Methods section for more information. The default is false.
  • autoReload is a boolean that specifies whether the video player should reload the render object when it has reached the end. The default is true.
  • classString is the string that will be added to the class attribute of the <video> elements that the player automatically creates. This parameter allows you to apply css rules to those <video> elements.
  • preloadAmount is the number of clips that should be loaded in advance. In order to elminiate the time lag between clips, the video player will preload clips. By default the player preloads 1 clip. If the clips that you use are very short, or your users have slower internet connections, you may specifiy a larger preloadAmount. Keep in mind that this may cause a larger loading delay at the beginning, however.
  • transitionTime is the length in seconds of the cross-fade between clips. The default is 0.

Event Handler Callbacks

  • clipStartHandler is called when a new clip begins playing.
  • durationLoadedHandler is called after the duration has first been loaded.
  • finishedHandler is called when the end of the render object has been reached.
  • loadingErrorHandler is called when there is a loading error.
  • loadingStartedHandler is called when the player begins to wait for a loading clip.
  • loadingStoppedHandler is called when the player is done waiting for a loading clip.
  • playHandler is called when the player plays.
  • pauseHandler is called when the player is paused.
  • timeUpdateHandler is called when the current time of the player updates.
  • videoReadyHandler is called when the video player is ready to play at the beginning.

Methods

VideoPlayer.currentTime()

  • Returns the current time of the video, independent of the current time of the individual clips.

VideoPlayer.clipIndex()

  • Returns the index of the current clip.

VideoPlayer.duration()

  • Returns the duration of all clips added together. This may need to be loaded first (see VideoPlayer.loadDuration() below).

VideoPlayer.loadDuration()

  • Calling this method will load the duration of the video.
  • If some of the clips in the render object did not have a specified endTime, then the only way to determine the length of those clips is to load the metadata for those clips and then get the clip duration. This only needs to be done once, but must be done before calling VideoPlayer.duration(), unless the render object contains an endTime for each clip.
  • You can specify "autoloadDuration" : true in the options object if you want the duration to be automatically loaded when the video player is first created.

VideoPlayer.play()

  • This will play the video player.

VideoPlayer.pause()

  • This will pause the video player.

VideoPlayer.seekToClipIndex(clipIndex)

  • This will seek the current time of the video player to the beginning of the specified clipIndex.

VideoPlayer.seekToSeconds(desiredSeconds)

  • This will seek the current time of the video player to the time specified in desiredSeconds.
  • The duration must be loaded before this method can be used.

VideoPlayer.togglePlayPause()

  • This will play the player if it is currently paused, and will pause the player if it is currently playing.
  • This is very useful if you have a single button that acts as both the play button and the pause button.

Known Issues

Chrome has trouble loading the same video sequentially from an EDL. This works better in Safari.

About

No description, website, or topics provided.

Resources

Stars

5 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages