96 lines
2.3 KiB
JavaScript
96 lines
2.3 KiB
JavaScript
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
"use strict";
|
|
|
|
class PictureInPictureVideoWrapper {
|
|
constructor() {
|
|
this.player = window.wrappedJSObject.playerObject;
|
|
}
|
|
|
|
play(video) {
|
|
let playPauseButton = document.querySelector(
|
|
`[data-player-hook="btnplaypause"]`
|
|
);
|
|
if (video.paused) {
|
|
playPauseButton?.click();
|
|
}
|
|
}
|
|
|
|
pause(video) {
|
|
let playPauseButton = document.querySelector(
|
|
`[data-player-hook="btnplaypause"]`
|
|
);
|
|
if (!video.paused) {
|
|
playPauseButton?.click();
|
|
}
|
|
}
|
|
|
|
setCurrentTime(video, position) {
|
|
this.player.seek(position);
|
|
}
|
|
|
|
setCaptionContainerObserver(video, updateCaptionsFunction) {
|
|
let container = document.querySelector(`[data-player-hook="plgcontainer"]`);
|
|
|
|
const selector = [
|
|
`[data-player-hook="subtitleelem"]`,
|
|
".subtitle_text",
|
|
].join(",");
|
|
|
|
if (container) {
|
|
updateCaptionsFunction("");
|
|
const callback = mutationList => {
|
|
if (mutationList) {
|
|
let changed = false;
|
|
for (const mutation of mutationList) {
|
|
if (mutation.target.matches?.(selector)) {
|
|
changed = true;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (!changed) {
|
|
return;
|
|
}
|
|
}
|
|
|
|
let subtitles = container.querySelectorAll(
|
|
`.iqp-subtitle:has(> [data-player-hook="subtitleelem"] > .subtitle_text)`
|
|
);
|
|
if (!subtitles.length) {
|
|
updateCaptionsFunction("");
|
|
return;
|
|
}
|
|
|
|
if (subtitles.length > 1) {
|
|
subtitles = Array.from(subtitles).sort(
|
|
(a, b) => a.offsetTop - b.offsetTop
|
|
);
|
|
}
|
|
|
|
updateCaptionsFunction(
|
|
Array.from(subtitles, x => x.innerText.trim())
|
|
.filter(String)
|
|
.join("\n")
|
|
);
|
|
};
|
|
|
|
callback();
|
|
|
|
this.captionsObserver = new MutationObserver(callback);
|
|
|
|
this.captionsObserver.observe(container, {
|
|
childList: true,
|
|
subtree: true,
|
|
});
|
|
}
|
|
}
|
|
|
|
removeCaptionContainerObserver() {
|
|
this.captionsObserver?.disconnect();
|
|
}
|
|
}
|
|
|
|
this.PictureInPictureVideoWrapper = PictureInPictureVideoWrapper;
|