NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript== // @name Iflix Subtitles Fix for Firefox // @icon https://piay.iflix.com/app/favicon.ico // @namespace https://github.com/tkhquang // @version 2.33 // @description Subtitles fix for Firefox // @author Quang Trinh // @license MIT; https://raw.githubusercontent.com/tkhquang/userscripts/master/LICENSE // @homepage https://greasyfork.org/en/scripts/367324-iflix-subtitles-fix-for-firefox // @match http*://piay.iflix.com/* // @run-at document-start // @require https://greasyfork.org/scripts/21927-arrive-js/code/arrivejs.js // @grant GM_addStyle // @noframes // ==/UserScript== /* global GM_addStyle */ /* * arrive.js * v2.4.1 * https://github.com/uzairfarooq/arrive * MIT licensed * * Copyright (c) 2014-2017 Uzair Farooq */ /*==================* * Reference: http://ronallo.com/demos/webvtt-cue-settings/ * You can change the below variables to suite your needs. *==================*/ // ==Configuration== const lineVTT = 14; //See reference const minfontSize = "12px"; //Subtitles font-size won't scale smaller than this value const fontSize = "3vmin"; //font-size = minfontSize + this value const lineHeight = "150%"; //Better leave this as is - "normal" with lineVTT = 16 // ==Configuration== // ==Codes function styleSub() { "use strict"; const css = `video::cue { font-size: calc(${minfontSize} + ${fontSize}) !important; line-height: ${lineHeight} !important; }`; if (typeof GM_addStyle !== "undefined") { GM_addStyle(css); } else { const node = document.createElement("style"); node.type = "text/css"; node.appendChild(document.createTextNode(css)); const heads = document.getElementsByTagName("head"); if (heads.length > 0) { heads[0].appendChild(node); } else { document.documentElement.appendChild(node); } } console.log("iSFix - Styling Done!"); } function alterSub(activeSub) { "use strict"; let activeCues = activeSub.cues; function lineCheck() { return Boolean(activeCues !== null && activeCues[0] !== undefined && activeCues[0].line === lineVTT); } if (activeCues !== null && activeCues[0].line !== lineVTT) { Object.keys(activeCues).forEach(function (i) { activeCues[i].line = lineVTT; }); console.log("iSFix - Done setting lines!"); } if (!lineCheck()) { console.log("iSFix - Current line value: " + activeCues[0].line); console.warn("iSFix - Unmodified lines => Try changing line value..."); setTimeout(function () { alterSub(activeSub); }, 5000); return; } console.log("iSFix - Current line value: " + activeCues[0].line); console.log("iSFix - Passed!!!"); } function getSubList(vidPlayer) { "use strict"; const subList = vidPlayer[0].textTracks; function getSub() { return (function () { for (let sub of subList) { if (sub.mode === "showing") { return sub; } } return false; }()); } subList.onchange = function () { console.log("iSFix - Subtitles onchange action"); if (getSub()) { alterSub(getSub()); } }; setTimeout(function () { if (getSub()) { alterSub(getSub()); } }, 10000); } function getVidState(vidPlayer) { "use strict"; if (!(/^\/play/).test(window.location.pathname)) { return; } if (vidPlayer.length === 0 || vidPlayer[0] === undefined) { console.warn("iSFix - No video? Try getting it after 5s..."); setTimeout(function () { getVidState(vidPlayer); }, 5000); return; } styleSub(); getSubList(vidPlayer); } (function () { "use strict"; document.arrive(".vimond-player-video", function () { console.log("iSFix - Video element available"); setTimeout(function () { getVidState(document.getElementsByClassName("vimond-player-video")); }, 1000); }); }());