// ==UserScript==
// @name YouTube Bolder Subtitles
// @name:ja YouTube Bolder Subtitles
// @name:zh-CN YouTube Bolder Subtitles
// @namespace knoa.jp
// @description Make the subtitles bolder for better visibility on YouTube.
// @description:ja YouTubeの字幕を太字にして見やすくします。
// @description:zh-CN 将YouTube上的字幕放成粗体字,让人更容易看清。
// @include https://www.youtube.com/*
// @version 1
// @grant none
// ==/UserScript==
(function(){
const SCRIPTID = 'YouTubeBolderSubtitles';
const SCRIPTNAME = 'YouTube Bolder Subtitles';
const DEBUG = false;/*
[update]
[bug]
[todo]
[possible]
設定パネルでカスタマイズ?
[research]
[memo]
*/
if(window === top && console.time) console.time(SCRIPTID);
const MS = 1, SECOND = 1000*MS, MINUTE = 60*SECOND, HOUR = 60*MINUTE, DAY = 24*HOUR, WEEK = 7*DAY, MONTH = 30*DAY, YEAR = 365*DAY;
let elements = {}, flags = {}, timers = {}, sizes = {}, panels, configs;
const core = {
initialize: function(){
elements.html = document.documentElement;
elements.html.classList.add(SCRIPTID);
core.addStyle('style');
},
addStyle: function(name = 'style', d = document){
if(html[name] === undefined) return;
if(!d.head) return d.addEventListener('load', (e) => core.addStyle(name, d), {once: true});
let style = createElement(html[name]()), id = SCRIPTID + '-' + name;
style.id = id;
Array.from(d.styleSheets).forEach(s => s.ownerNode.id === id && d.head.removeChild(s.ownerNode));
d.head.appendChild(style);
},
};
const html = {
style: () => `
<style type="text/css">
.ytp-caption-segment{
text-shadow:
rgb(0,0,0) 0 0 .1em,
rgb(0,0,0) 0 0 .2em,
rgb(0,0,0) 0 0 .4em,
rgb(0,0,0) 0 0 .8em
!important;
background: transparent !important;
font-weight: bold !important;
}
</style>
`,
};
const setTimeout = window.setTimeout.bind(window), clearTimeout = window.clearTimeout.bind(window), setInterval = window.setInterval.bind(window), clearInterval = window.clearInterval.bind(window), requestAnimationFrame = window.requestAnimationFrame.bind(window), requestIdleCallback = window.requestIdleCallback.bind(window);
const alert = window.alert.bind(window), confirm = window.confirm.bind(window), prompt = window.prompt.bind(window), getComputedStyle = window.getComputedStyle.bind(window), fetch = window.fetch.bind(window);
if(!('isConnected' in Node.prototype)) Object.defineProperty(Node.prototype, 'isConnected', {get: function(){return document.contains(this)}});
const createElement = function(html = '<div></div>'){
let outer = document.createElement('div');
outer.insertAdjacentHTML('afterbegin', html);
return outer.firstElementChild;
};
core.initialize();
if(window === top && console.timeEnd) console.timeEnd(SCRIPTID);
})();