Change the difficult-to-use Twitter player to a native player.
// ==UserScript==
// @name improve Twitter Video Player
// @name:ja improve Twitter Video Player
// @namespace https://yakisova.com
// @version 0.2.1
// @description Change the difficult-to-use Twitter player to a native player.
// @description:ja 使いにくいTwitterの動画プレイヤーをネイティブプレイヤーに置き換えます。
// @author yakisova41
// @match https://twitter.com/*
// @icon https://www.google.com/s2/favicons?sz=64&domain=twitter.com
// @grant none
// @license MIT
// ==/UserScript==
(function() {
'use strict';
const bodyElem = document.querySelector("body");
if(bodyElem !== null) {
const observer = new MutationObserver(() => {
const videoComponent = bodyElem.querySelector('div[data-testid="videoComponent"]:not(.improved-video)');
if(videoComponent !== null) {
videoComponent.classList.add("improved-video");
setTimeout(() => {
replacePlayer(videoComponent);
}, 100);
}
});
observer.observe(bodyElem, {
subtree: true,
childList: true
});
}
function replacePlayer(componentElement) {
const originalVid = componentElement.querySelector("div:nth-child(1) > div > video");
if(originalVid !== null) {
originalVid.controls = true;
originalVid.removeAttribute("disablepictureinpicture");
const handleClick = (e) => {
e.preventDefault();
originalVid.play();
setTimeout(() => {
originalVid.muted = false;
});
const handleMute = (e) => {
if(e.target.muted) {
e.target.muted = false;
}
e.srcElement.removeEventListener("volumechange", handleMute);
};
e.srcElement.addEventListener("volumechange", handleMute);
originalVid.removeEventListener("click", handleClick)
}
originalVid.addEventListener("click", handleClick);
componentElement.parentElement.appendChild(originalVid);
componentElement.remove();
}
}
})();