mirror of
https://github.com/spikecodes/libreddit
synced 2024-12-26 02:25:41 +01:00
928907086c
* HLS video playback Signed-off-by: Adrian Lebioda <adrianlebioda@gmail.com> * Add LibreJS compliance * Locally host hls.js * Notification about HLS under videos that support it Signed-off-by: Adrian Lebioda <adrianlebioda@gmail.com> * Use .contains() instead of .find() == None * Make list of preferences constant * Change headers_keys from Vector into Array * Fix incorrect detecting of # in paths * Remove trailing-slash-appending if statement * Change HLS notification styling Co-authored-by: spikecodes <19519553+spikecodes@users.noreply.github.com>
77 lines
2.7 KiB
JavaScript
77 lines
2.7 KiB
JavaScript
// @license http://www.gnu.org/licenses/agpl-3.0.html AGPL-3.0
|
|
(function () {
|
|
if (Hls.isSupported()) {
|
|
var videoSources = document.querySelectorAll("video source[type='application/vnd.apple.mpegurl']");
|
|
videoSources.forEach(function (source) {
|
|
var playlist = source.src;
|
|
|
|
var oldVideo = source.parentNode;
|
|
var autoplay = oldVideo.classList.contains("hls_autoplay");
|
|
|
|
// If HLS is supported natively then don't use hls.js
|
|
if (oldVideo.canPlayType(source.type)) {
|
|
if (autoplay) {
|
|
oldVideo.play();
|
|
}
|
|
return;
|
|
}
|
|
|
|
// Replace video with copy that will have all "source" elements removed
|
|
var newVideo = oldVideo.cloneNode(true);
|
|
var allSources = newVideo.querySelectorAll("source");
|
|
allSources.forEach(function (source) {
|
|
source.remove();
|
|
});
|
|
|
|
// Empty source to enable play event
|
|
newVideo.src = "about:blank";
|
|
|
|
oldVideo.parentNode.replaceChild(newVideo, oldVideo);
|
|
|
|
function initializeHls() {
|
|
newVideo.removeEventListener('play', initializeHls);
|
|
|
|
var hls = new Hls({ autoStartLoad: false });
|
|
hls.loadSource(playlist);
|
|
hls.attachMedia(newVideo);
|
|
hls.on(Hls.Events.MANIFEST_PARSED, function () {
|
|
hls.loadLevel = hls.levels.length - 1;
|
|
hls.startLoad();
|
|
newVideo.play();
|
|
});
|
|
|
|
hls.on(Hls.Events.ERROR, function (event, data) {
|
|
var errorType = data.type;
|
|
var errorFatal = data.fatal;
|
|
if (errorFatal) {
|
|
switch (errorType) {
|
|
case Hls.ErrorType.NETWORK_ERROR:
|
|
hls.startLoad();
|
|
break;
|
|
case Hls.ErrorType.MEDIA_ERROR:
|
|
hls.recoverMediaError();
|
|
break;
|
|
default:
|
|
hls.destroy();
|
|
break;
|
|
}
|
|
}
|
|
|
|
console.error("HLS error", data);
|
|
});
|
|
}
|
|
|
|
newVideo.addEventListener('play', initializeHls);
|
|
|
|
if (autoplay) {
|
|
newVideo.play();
|
|
}
|
|
});
|
|
} else {
|
|
var videos = document.querySelectorAll("video.hls_autoplay");
|
|
videos.forEach(function (video) {
|
|
video.setAttribute("autoplay", "");
|
|
});
|
|
}
|
|
})();
|
|
// @license-end
|