Greasy Fork is available in English.
YouTube tema, ozellik ve reklam yoneticisi
// ==UserScript==
// @name YouTube Premium+?
// @namespace http://tampermonkey.net/
// @version 1112
// @description YouTube tema, ozellik ve reklam yoneticisi
// @author Mustafa Hakan
// @match *://*.youtube.com/*
// @grant none
// @run-at document-end
// ==/UserScript==
(function () {
'use strict';
let LANG = localStorage.getItem('yt-lang') || 'tr';
let THEME = localStorage.getItem('yt-theme') || '__default__';
function getFeature(key, def) {
if (def === undefined) def = true;
var v = localStorage.getItem('yt-feat-' + key);
return v === null ? def : v === '1';
}
function setFeature(key, val) {
localStorage.setItem('yt-feat-' + key, val ? '1' : '0');
}
var T = {
tr: {
panelTitle: 'AYARLAR',
themeSection: 'TEMA',
featSection: 'OZELLIKLER',
charSection: 'KARAKTER',
labelText: 'Premium+',
defaultTheme: 'YouTube Varsayilan',
langBtn: 'Switch to English',
shortcut: 'Ctrl + Shift + D',
features: {
ads: 'Reklam Engelle',
loop: 'Dongu Butonu',
character: 'Karakter (Scrubber)',
label: 'Premium+ Etiketi',
scroll: 'Kaydirma ile Ses',
pip: 'Picture-in-Picture',
speed: 'Hiz Secici',
cinema: 'Sinema Modu',
timestamp: 'Timestamp Kopyala',
},
characters: {
snoopy: 'Snoopy',
pikachu: 'Pikachu',
kirby: 'Kirby',
cat: 'Kedi',
alien: 'Uzayli',
rocket: 'Roket',
},
colors: {
'Midnight': 'Gece Yarisi',
'Obsidian': 'Obsidyen',
'Slate': 'Arduvaz',
'Forest': 'Orman',
'Abyss': 'Derin Deniz',
'Velvet': 'Kadife',
'Espresso': 'Espresso',
'Graphite': 'Grafit',
'Steel': 'Celik',
'Moss': 'Yosun',
'Burgundy': 'Bordo',
'Petroleum': 'Petrol',
'Aurora': 'Kuzey Isigi',
'Sand': 'Kum',
'Rose': 'Gul Kurusu',
'Ice': 'Buz',
}
},
en: {
panelTitle: 'SETTINGS',
themeSection: 'THEME',
featSection: 'FEATURES',
charSection: 'CHARACTER',
labelText: 'Premium+',
defaultTheme: 'YouTube Default',
langBtn: 'Turkceye Gec',
shortcut: 'Ctrl + Shift + D',
features: {
ads: 'Block Ads',
loop: 'Loop Button',
character: 'Character (Scrubber)',
label: 'Premium+ Badge',
scroll: 'Scroll to Volume',
pip: 'Picture-in-Picture',
speed: 'Speed Selector',
cinema: 'Cinema Mode',
timestamp: 'Copy Timestamp',
},
characters: {
snoopy: 'Snoopy',
pikachu: 'Pikachu',
kirby: 'Kirby',
cat: 'Cat',
alien: 'Alien',
rocket: 'Rocket',
},
colors: {
'Midnight': 'Midnight',
'Obsidian': 'Obsidian',
'Slate': 'Slate',
'Forest': 'Forest',
'Abyss': 'Abyss',
'Velvet': 'Velvet',
'Espresso': 'Espresso',
'Graphite': 'Graphite',
'Steel': 'Steel',
'Moss': 'Moss',
'Burgundy': 'Burgundy',
'Petroleum': 'Petroleum',
'Aurora': 'Aurora',
'Sand': 'Sand',
'Rose': 'Rose',
'Ice': 'Ice',
}
}
};
var THEMES = {
'Midnight': ['#0d0d12', '#4a6fa5'],
'Obsidian': ['#0f0f0f', '#555555'],
'Slate': ['#1c2128', '#6e7c8c'],
'Forest': ['#0e1a12', '#3a6b45'],
'Abyss': ['#050d1a', '#1a4a7a'],
'Velvet': ['#160d1a', '#6b3a7a'],
'Espresso': ['#140e0b', '#7a4a30'],
'Graphite': ['#141414', '#4a4a4a'],
'Steel': ['#0f1418', '#3a5a6a'],
'Moss': ['#111a0f', '#4a6a30'],
'Burgundy': ['#14080a', '#6a2030'],
'Petroleum': ['#091518', '#1a5a5a'],
'Aurora': ['#0a0f1a', '#2d7a6a'],
'Sand': ['#1a1710', '#8a7a50'],
'Rose': ['#1a0f12', '#8a4a5a'],
'Ice': ['#0f1520', '#5a8aaa'],
};
function getSVG(name) {
var svgs = {
snoopy: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" width="34" height="34">' +
'<ellipse cx="10" cy="9" rx="4" ry="6" fill="#111" transform="rotate(-15,10,9)"/>' +
'<ellipse cx="22" cy="8" rx="3.5" ry="5.5" fill="#111" transform="rotate(10,22,8)"/>' +
'<ellipse cx="16" cy="16" rx="10" ry="9" fill="#f5f5f5"/>' +
'<ellipse cx="16" cy="20" rx="6" ry="4" fill="#111"/>' +
'<circle cx="12.5" cy="13.5" r="1.5" fill="#111"/>' +
'<circle cx="19.5" cy="13.5" r="1.5" fill="#111"/>' +
'<circle cx="13" cy="13" r="0.5" fill="#fff"/>' +
'<circle cx="20" cy="13" r="0.5" fill="#fff"/>' +
'<ellipse cx="16" cy="18.5" rx="2.5" ry="1.5" fill="#222"/>' +
'<path d="M13.5 21.5 Q16 23 18.5 21.5" stroke="#f5f5f5" stroke-width="1.2" fill="none" stroke-linecap="round"/>' +
'</svg>',
pikachu: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" width="34" height="34">' +
'<ellipse cx="16" cy="18" rx="12" ry="11" fill="#FFD700"/>' +
'<ellipse cx="8" cy="8" rx="4" ry="7" fill="#FFD700" transform="rotate(-20,8,8)"/>' +
'<ellipse cx="8" cy="5" rx="2" ry="3.5" fill="#111" transform="rotate(-20,8,5)"/>' +
'<ellipse cx="24" cy="8" rx="4" ry="7" fill="#FFD700" transform="rotate(20,24,8)"/>' +
'<ellipse cx="24" cy="5" rx="2" ry="3.5" fill="#111" transform="rotate(20,24,5)"/>' +
'<circle cx="11.5" cy="15" r="2" fill="#111"/>' +
'<circle cx="20.5" cy="15" r="2" fill="#111"/>' +
'<circle cx="12" cy="14.3" r="0.7" fill="#fff"/>' +
'<circle cx="21" cy="14.3" r="0.7" fill="#fff"/>' +
'<ellipse cx="9" cy="20" rx="3" ry="2" fill="#FF6060" opacity="0.8"/>' +
'<ellipse cx="23" cy="20" rx="3" ry="2" fill="#FF6060" opacity="0.8"/>' +
'<path d="M13 22 Q16 24.5 19 22" stroke="#111" stroke-width="1.2" fill="none" stroke-linecap="round"/>' +
'<ellipse cx="16" cy="21.5" rx="1.5" ry="1" fill="#FF8888"/>' +
'</svg>',
kirby: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" width="34" height="34">' +
'<ellipse cx="16" cy="17" rx="13" ry="13" fill="#FFB7D5"/>' +
'<ellipse cx="10" cy="23" rx="4" ry="3" fill="#FF85B3" transform="rotate(-20,10,23)"/>' +
'<ellipse cx="22" cy="23" rx="4" ry="3" fill="#FF85B3" transform="rotate(20,22,23)"/>' +
'<circle cx="12" cy="14" r="2.5" fill="#111"/>' +
'<circle cx="20" cy="14" r="2.5" fill="#111"/>' +
'<circle cx="12.7" cy="13" r="1" fill="#fff"/>' +
'<circle cx="20.7" cy="13" r="1" fill="#fff"/>' +
'<ellipse cx="12" cy="14" rx="1" ry="1.5" fill="#3a5af0" opacity="0.6"/>' +
'<ellipse cx="20" cy="14" rx="1" ry="1.5" fill="#3a5af0" opacity="0.6"/>' +
'<ellipse cx="16" cy="19.5" rx="2.5" ry="1.5" fill="#e0609a"/>' +
'<path d="M13.5 22 Q16 24 18.5 22" stroke="#e0609a" stroke-width="1.5" fill="none" stroke-linecap="round"/>' +
'</svg>',
cat: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" width="34" height="34">' +
'<polygon points="6,12 2,3 10,9" fill="#888"/>' +
'<polygon points="26,12 30,3 22,9" fill="#888"/>' +
'<ellipse cx="16" cy="18" rx="12" ry="11" fill="#aaa"/>' +
'<ellipse cx="16" cy="18" rx="8" ry="7" fill="#eee"/>' +
'<ellipse cx="12" cy="15" rx="2" ry="2.5" fill="#111"/>' +
'<ellipse cx="20" cy="15" rx="2" ry="2.5" fill="#111"/>' +
'<circle cx="12.7" cy="14" r="0.8" fill="#fff"/>' +
'<circle cx="20.7" cy="14" r="0.8" fill="#fff"/>' +
'<ellipse cx="16" cy="19" rx="1.5" ry="1" fill="#ffaaaa"/>' +
'<path d="M13.5 21 Q16 23 18.5 21" stroke="#999" stroke-width="1.2" fill="none" stroke-linecap="round"/>' +
'<line x1="6" y1="19" x2="1" y2="17" stroke="#888" stroke-width="0.8"/>' +
'<line x1="6" y1="20" x2="1" y2="20" stroke="#888" stroke-width="0.8"/>' +
'<line x1="6" y1="21" x2="1" y2="23" stroke="#888" stroke-width="0.8"/>' +
'<line x1="26" y1="19" x2="31" y2="17" stroke="#888" stroke-width="0.8"/>' +
'<line x1="26" y1="20" x2="31" y2="20" stroke="#888" stroke-width="0.8"/>' +
'<line x1="26" y1="21" x2="31" y2="23" stroke="#888" stroke-width="0.8"/>' +
'</svg>',
alien: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" width="34" height="34">' +
'<ellipse cx="16" cy="17" rx="11" ry="13" fill="#7aee88"/>' +
'<ellipse cx="11" cy="14" rx="4.5" ry="3.5" fill="#111" opacity="0.85"/>' +
'<ellipse cx="21" cy="14" rx="4.5" ry="3.5" fill="#111" opacity="0.85"/>' +
'<ellipse cx="11" cy="14" rx="2.5" ry="2" fill="#6688ff"/>' +
'<ellipse cx="21" cy="14" rx="2.5" ry="2" fill="#6688ff"/>' +
'<circle cx="11.8" cy="13.3" r="0.9" fill="#fff"/>' +
'<circle cx="21.8" cy="13.3" r="0.9" fill="#fff"/>' +
'<path d="M12 22 Q16 20 20 22" stroke="#5acc66" stroke-width="1.5" fill="none" stroke-linecap="round"/>' +
'<line x1="10" y1="4" x2="7" y2="1" stroke="#7aee88" stroke-width="1.5"/>' +
'<circle cx="7" cy="1" r="1.5" fill="#aaffaa"/>' +
'<line x1="22" y1="4" x2="25" y2="1" stroke="#7aee88" stroke-width="1.5"/>' +
'<circle cx="25" cy="1" r="1.5" fill="#aaffaa"/>' +
'</svg>',
rocket: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" width="34" height="34">' +
'<path d="M16 2 C10 8 8 16 8 22 L16 26 L24 22 C24 16 22 8 16 2Z" fill="#dde8ff"/>' +
'<ellipse cx="16" cy="13" rx="4" ry="4" fill="#4a8aff"/>' +
'<path d="M8 22 L4 28 L10 25Z" fill="#ff6030"/>' +
'<path d="M24 22 L28 28 L22 25Z" fill="#ff6030"/>' +
'<path d="M12 26 Q16 30 20 26" fill="#ff8050"/>' +
'<circle cx="16" cy="13" r="2" fill="#cce0ff" opacity="0.7"/>' +
'</svg>',
};
return svgs[name] || svgs['snoopy'];
}
function isDefaultTheme(t) {
return !t || t === '__default__' || !THEMES[t];
}
function applyTheme(themeName) {
THEME = isDefaultTheme(themeName) ? '__default__' : themeName;
localStorage.setItem('yt-theme', THEME);
var s = document.getElementById('yt-custom-style');
if (isDefaultTheme(THEME)) {
if (s) s.remove();
return;
}
var pair = THEMES[THEME];
var bg = pair[0];
var accent = pair[1];
if (!s) {
s = document.createElement('style');
s.id = 'yt-custom-style';
document.head.appendChild(s);
}
s.textContent = [
'html, body, ytd-app, #content, #page-manager, ytd-browse, ytd-watch-flexy,',
'ytd-search, ytd-two-column-browse-results-renderer, ytd-rich-grid-renderer,',
'#primary, #secondary, ytd-mini-guide-renderer, ytd-guide-renderer,',
'#guide-content, tp-yt-app-drawer, #contentContainer, ytd-masthead {',
' background-color: ' + bg + ' !important;',
' background-image: none !important;',
'}',
'ytd-rich-item-renderer, ytd-video-renderer, ytd-compact-video-renderer,',
'ytd-playlist-renderer, ytd-shelf-renderer, ytd-item-section-renderer,',
'#dismissible, ytd-comment-thread-renderer, ytd-comment-renderer {',
' background-color: transparent !important;',
'}',
'ytd-guide-entry-renderer:hover, ytd-mini-guide-entry-renderer:hover {',
' background-color: ' + accent + '22 !important;',
'}',
'.ytp-play-progress { background: ' + accent + ' !important; }',
'.ytp-scrubber-button { background-color: ' + accent + ' !important; }',
'#yt-loop-btn { opacity: 0.45; transition: opacity 0.2s; }',
'#yt-loop-btn.yt-active { opacity: 1 !important; }',
'#yt-loop-btn svg path, #yt-loop-btn svg polyline { stroke: ' + accent + ' !important; }',
'#yt-pip-btn { opacity: 0.7; transition: opacity 0.2s; }',
'#yt-pip-btn:hover { opacity: 1; }',
'#yt-speed-select {',
' background: ' + bg + '; color: #fff; border: 1px solid ' + accent + '66;',
' border-radius: 4px; font-size: 11px; font-weight: 700; cursor: pointer;',
' padding: 2px 4px; margin: 0 4px;',
'}',
].join('\n');
}
function addLabel() {
if (!getFeature('label')) {
var old = document.getElementById('yt-premium-label');
if (old) old.remove();
return;
}
if (document.getElementById('yt-premium-label')) return;
var logo = document.querySelector('#logo, ytd-logo');
if (!logo) return;
var label = document.createElement('span');
label.id = 'yt-premium-label';
label.textContent = T[LANG].labelText;
label.title = T[LANG].shortcut;
label.style.cssText = [
'color: #ffffff !important;',
'font-size: 13px;',
'font-weight: 800;',
'font-style: italic;',
'cursor: pointer;',
'margin-left: 8px;',
'letter-spacing: 0.3px;',
'opacity: 0.92;',
'transition: opacity 0.2s;',
'background: none;',
'border: none;',
'padding: 0;',
'text-shadow: 0 1px 6px rgba(0,0,0,0.7);',
].join('');
label.onmouseenter = function () { label.style.opacity = '0.55'; };
label.onmouseleave = function () { label.style.opacity = '0.92'; };
label.onclick = function (e) { e.stopPropagation(); openPanel(); };
logo.parentNode.insertBefore(label, logo.nextSibling);
}
function cleanAds() {
if (!getFeature('ads')) return;
var sel = [
'ytd-ad-slot-renderer', 'ytd-display-ad-renderer',
'ytd-promoted-sparkles-web-renderer', 'ytd-promoted-video-renderer',
'ytd-search-pyv-renderer', '#masthead-ad', '.ytd-ad-slot-renderer',
'ytd-statement-banner-renderer',
].join(',');
document.querySelectorAll(sel).forEach(function (el) { el.remove(); });
var skip = document.querySelector('.ytp-ad-skip-button, .ytp-skip-ad-button, .ytp-ad-skip-button-modern');
if (skip) skip.click();
var video = document.querySelector('video');
if (video && document.querySelector('.ytp-ad-player-overlay')) {
video.currentTime = video.duration;
}
}
function injectCharacter() {
var charKey = localStorage.getItem('yt-character') || 'snoopy';
if (!getFeature('character')) {
var old = document.getElementById('yt-char-el');
if (old) old.remove();
return;
}
var player = document.querySelector('.html5-video-player, #movie_player');
var scrubber = document.querySelector('.ytp-scrubber-button');
var progressBar = document.querySelector('.ytp-progress-bar');
if (!player || !scrubber || !progressBar) return;
var charEl = document.getElementById('yt-char-el');
if (!charEl) {
charEl = document.createElement('div');
charEl.id = 'yt-char-el';
charEl.innerHTML = getSVG(charKey);
charEl.style.cssText = [
'position: absolute;',
'pointer-events: none;',
'z-index: 2147483600;',
'width: 36px;',
'height: 36px;',
'filter: drop-shadow(0 2px 6px rgba(0,0,0,0.95));',
].join('');
player.style.overflow = 'visible';
player.appendChild(charEl);
} else {
var currentChar = charEl.getAttribute('data-char');
if (currentChar !== charKey) {
charEl.innerHTML = getSVG(charKey);
charEl.setAttribute('data-char', charKey);
}
}
charEl.setAttribute('data-char', charKey);
var playerRect = player.getBoundingClientRect();
var scRect = scrubber.getBoundingClientRect();
var leftPx = scRect.left - playerRect.left + scRect.width / 2 - 17;
var topPx = scRect.top - playerRect.top - 44;
charEl.style.left = leftPx + 'px';
charEl.style.top = topPx + 'px';
}
function addLoopButton() {
if (document.getElementById('yt-loop-btn')) return;
if (!getFeature('loop')) return;
var ctrl = document.querySelector('.ytp-right-controls');
if (!ctrl) return;
var btn = document.createElement('button');
btn.id = 'yt-loop-btn';
btn.className = 'ytp-button';
btn.title = T[LANG].features.loop;
btn.innerHTML = '<svg viewBox="0 0 24 24" width="22" height="22" fill="none" xmlns="http://www.w3.org/2000/svg">' +
'<polyline points="17,1 21,5 17,9" stroke="#fff" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>' +
'<path d="M3 11V9a4 4 0 0 1 4-4h14" stroke="#fff" stroke-width="2" stroke-linecap="round"/>' +
'<polyline points="7,23 3,19 7,15" stroke="#fff" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>' +
'<path d="M21 13v2a4 4 0 0 1-4 4H3" stroke="#fff" stroke-width="2" stroke-linecap="round"/>' +
'</svg>';
btn.style.cssText = 'display:flex;align-items:center;justify-content:center;width:36px;height:36px;';
btn.onclick = function () {
var v = document.querySelector('video');
if (!v) return;
v.loop = !v.loop;
btn.classList.toggle('yt-active', v.loop);
};
ctrl.prepend(btn);
}
function addPipButton() {
if (document.getElementById('yt-pip-btn')) return;
if (!getFeature('pip')) return;
var ctrl = document.querySelector('.ytp-right-controls');
if (!ctrl) return;
var btn = document.createElement('button');
btn.id = 'yt-pip-btn';
btn.className = 'ytp-button';
btn.title = 'Picture-in-Picture';
btn.innerHTML = '<svg viewBox="0 0 24 24" width="22" height="22" fill="none" xmlns="http://www.w3.org/2000/svg">' +
'<rect x="2" y="4" width="20" height="14" rx="2" stroke="#fff" stroke-width="2"/>' +
'<rect x="12" y="11" width="9" height="6" rx="1" fill="#fff"/>' +
'</svg>';
btn.style.cssText = 'display:flex;align-items:center;justify-content:center;width:36px;height:36px;';
btn.onclick = function () {
var v = document.querySelector('video');
if (!v) return;
if (document.pictureInPictureElement) {
document.exitPictureInPicture();
} else {
v.requestPictureInPicture().catch(function () {});
}
};
ctrl.prepend(btn);
}
function addSpeedSelector() {
if (document.getElementById('yt-speed-select')) return;
if (!getFeature('speed')) return;
var ctrl = document.querySelector('.ytp-right-controls');
if (!ctrl) return;
var sel = document.createElement('select');
sel.id = 'yt-speed-select';
sel.title = 'Oynatma Hizi';
var speeds = [0.25, 0.5, 0.75, 1, 1.25, 1.5, 1.75, 2, 2.5, 3];
speeds.forEach(function (s) {
var opt = document.createElement('option');
opt.value = s;
opt.textContent = s + 'x';
if (s === 1) opt.selected = true;
sel.appendChild(opt);
});
sel.onchange = function () {
var v = document.querySelector('video');
if (v) v.playbackRate = parseFloat(sel.value);
};
ctrl.prepend(sel);
}
function applyCinemaMode() {
var s = document.getElementById('yt-cinema-style');
if (!getFeature('cinema')) {
if (s) s.remove();
return;
}
if (s) return;
s = document.createElement('style');
s.id = 'yt-cinema-style';
s.textContent = [
'#secondary { display: none !important; }',
'#primary { max-width: 100% !important; }',
'ytd-watch-flexy[theater] #primary-inner { max-width: 100% !important; }',
'#below { max-width: 100% !important; }',
].join('\n');
document.head.appendChild(s);
}
function addTimestampButton() {
if (document.getElementById('yt-ts-btn')) return;
if (!getFeature('timestamp')) return;
var ctrl = document.querySelector('.ytp-right-controls');
if (!ctrl) return;
var btn = document.createElement('button');
btn.id = 'yt-ts-btn';
btn.className = 'ytp-button';
btn.title = T[LANG].features.timestamp;
btn.innerHTML = '<svg viewBox="0 0 24 24" width="22" height="22" fill="none" xmlns="http://www.w3.org/2000/svg">' +
'<circle cx="12" cy="12" r="9" stroke="#fff" stroke-width="2"/>' +
'<path d="M12 7v5l3 3" stroke="#fff" stroke-width="2" stroke-linecap="round"/>' +
'</svg>';
btn.style.cssText = 'display:flex;align-items:center;justify-content:center;width:36px;height:36px;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseenter = function () { btn.style.opacity = '1'; };
btn.onmouseleave = function () { btn.style.opacity = '0.7'; };
btn.onclick = function () {
var v = document.querySelector('video');
if (!v) return;
var t = Math.floor(v.currentTime);
var h = Math.floor(t / 3600);
var m = Math.floor((t % 3600) / 60);
var s = t % 60;
var ts = (h > 0 ? h + ':' : '') + (h > 0 ? String(m).padStart(2,'0') : m) + ':' + String(s).padStart(2,'0');
var url = window.location.href.split('&t=')[0] + '&t=' + t + 's';
navigator.clipboard.writeText(url).catch(function () {});
btn.title = 'Kopyalandi: ' + ts;
setTimeout(function () { btn.title = T[LANG].features.timestamp; }, 2000);
};
ctrl.prepend(btn);
}
var scrollEnabled = false;
function enableScrollVolume() {
if (scrollEnabled || !getFeature('scroll')) return;
scrollEnabled = true;
var player = document.querySelector('.html5-video-player');
if (!player) return;
player.addEventListener('wheel', function (e) {
var v = document.querySelector('video');
if (!v) return;
e.preventDefault();
var delta = e.deltaY < 0 ? 0.05 : -0.05;
v.volume = Math.min(1, Math.max(0, v.volume + delta));
}, { passive: false });
}
function mk(tag, style, text) {
var e = document.createElement(tag);
if (style) e.style.cssText = style;
if (text !== undefined) e.textContent = text;
return e;
}
function secLabel(text) {
return mk('div', 'color:#3a3a55;font-size:9px;font-weight:900;letter-spacing:2px;text-transform:uppercase;margin:12px 0 6px 2px;', text);
}
function buildToggle(active) {
var wrap = mk('div', 'display:flex;align-items:center;flex-shrink:0;');
var track = mk('div', 'width:32px;height:17px;border-radius:9px;background:' + (active ? '#4a90d9' : '#2a2a3a') + ';position:relative;transition:background 0.2s;');
track.className = 'yt-toggle-track';
var thumb = mk('div', 'position:absolute;top:2px;left:2px;width:13px;height:13px;border-radius:50%;background:#fff;transform:' + (active ? 'translateX(15px)' : 'translateX(0)') + ';transition:transform 0.2s;box-shadow:0 1px 3px rgba(0,0,0,0.5);');
thumb.className = 'yt-toggle-thumb';
track.appendChild(thumb);
wrap.appendChild(track);
return wrap;
}
function openPanel() {
var existing = document.getElementById('yt-settings-panel');
if (existing) { existing.remove(); return; }
var p = mk('div', [
'position:fixed;top:58px;right:14px;',
'background:#0d0d14;',
'border:1px solid #1e1e2e;',
'border-radius:14px;',
'padding:14px 14px 12px;',
'z-index:2147483647;',
'width:300px;',
'max-height:88vh;',
'overflow-y:auto;',
'font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif;',
'box-shadow:0 16px 48px rgba(0,0,0,0.85),0 0 0 1px rgba(255,255,255,0.04);',
'user-select:none;',
'scrollbar-width:thin;scrollbar-color:#222 transparent;',
].join(''));
p.id = 'yt-settings-panel';
var header = mk('div', 'display:flex;align-items:center;justify-content:space-between;margin-bottom:4px;');
header.appendChild(mk('span', 'color:#fff;font-size:11px;font-weight:900;letter-spacing:2px;', T[LANG].panelTitle));
var closeBtn = mk('span', 'color:#333;font-size:16px;cursor:pointer;line-height:1;padding:2px 4px;', 'x');
closeBtn.onmouseenter = function () { closeBtn.style.color = '#aaa'; };
closeBtn.onmouseleave = function () { closeBtn.style.color = '#333'; };
closeBtn.onclick = function () { p.remove(); };
header.appendChild(closeBtn);
p.appendChild(header);
p.appendChild(secLabel(T[LANG].themeSection));
var themeGrid = mk('div', 'display:grid;grid-template-columns:1fr 1fr;gap:5px;margin-bottom:4px;');
var isDefActive = isDefaultTheme(THEME);
var defCard = mk('div',
'grid-column:span 2;padding:8px 12px;border-radius:8px;cursor:pointer;text-align:center;font-size:10px;font-weight:700;letter-spacing:0.5px;' +
'border:1px solid ' + (isDefActive ? 'rgba(255,255,255,0.3)' : 'rgba(255,255,255,0.07)') + ';' +
'background:' + (isDefActive ? 'rgba(255,255,255,0.09)' : 'rgba(255,255,255,0.02)') + ';' +
'color:' + (isDefActive ? '#fff' : '#444') + ';',
T[LANG].defaultTheme
);
defCard.onclick = function () { applyTheme('__default__'); p.remove(); };
themeGrid.appendChild(defCard);
Object.keys(THEMES).forEach(function (key) {
var pair = THEMES[key];
var bg = pair[0];
var accent = pair[1];
var isAct = key === THEME;
var name = (T[LANG].colors && T[LANG].colors[key]) || key;
var card = mk('div',
'display:flex;align-items:center;gap:8px;padding:7px 10px;border-radius:8px;cursor:pointer;' +
'border:1px solid ' + (isAct ? accent + 'aa' : 'rgba(255,255,255,0.06)') + ';' +
'background:' + (isAct ? bg + 'dd' : 'rgba(255,255,255,0.025)') + ';' +
'transition:border-color 0.15s;'
);
var preview = mk('div',
'width:20px;height:20px;border-radius:50%;flex-shrink:0;' +
'background:conic-gradient(' + bg + ' 0deg 180deg,' + accent + ' 180deg 360deg);' +
'border:1px solid rgba(255,255,255,0.12);'
);
var lbl = mk('span', 'font-size:10px;font-weight:700;color:' + (isAct ? '#fff' : '#555') + ';', name);
card.appendChild(preview);
card.appendChild(lbl);
card.onclick = function () { applyTheme(key); p.remove(); };
themeGrid.appendChild(card);
});
p.appendChild(themeGrid);
p.appendChild(secLabel(T[LANG].charSection));
var currentChar = localStorage.getItem('yt-character') || 'snoopy';
var charGrid = mk('div', 'display:grid;grid-template-columns:repeat(3,1fr);gap:5px;margin-bottom:4px;');
var charKeys = ['snoopy', 'pikachu', 'kirby', 'cat', 'alien', 'rocket'];
charKeys.forEach(function (ck) {
var isAct = ck === currentChar;
var card = mk('div',
'display:flex;flex-direction:column;align-items:center;gap:4px;padding:8px 4px;border-radius:8px;cursor:pointer;' +
'border:1px solid ' + (isAct ? 'rgba(255,255,255,0.35)' : 'rgba(255,255,255,0.07)') + ';' +
'background:' + (isAct ? 'rgba(255,255,255,0.09)' : 'rgba(255,255,255,0.02)') + ';'
);
var svgWrap = mk('div', 'width:36px;height:36px;display:flex;align-items:center;justify-content:center;');
svgWrap.innerHTML = getSVG(ck);
var name = mk('span', 'font-size:9px;font-weight:700;color:' + (isAct ? '#fff' : '#444') + ';', T[LANG].characters[ck]);
card.appendChild(svgWrap);
card.appendChild(name);
card.onclick = function () {
localStorage.setItem('yt-character', ck);
var old = document.getElementById('yt-char-el');
if (old) old.remove();
p.remove();
};
charGrid.appendChild(card);
});
p.appendChild(charGrid);
p.appendChild(secLabel(T[LANG].featSection));
var featKeys = ['ads', 'loop', 'character', 'label', 'scroll', 'pip', 'speed', 'cinema', 'timestamp'];
var featContainer = mk('div', 'display:flex;flex-direction:column;gap:4px;margin-bottom:8px;');
featKeys.forEach(function (key) {
var row = mk('div',
'display:flex;align-items:center;justify-content:space-between;' +
'padding:8px 10px;border-radius:8px;cursor:pointer;' +
'background:rgba(255,255,255,0.03);border:1px solid rgba(255,255,255,0.055);' +
'transition:background 0.15s;'
);
row.onmouseenter = function () { row.style.background = 'rgba(255,255,255,0.06)'; };
row.onmouseleave = function () { row.style.background = 'rgba(255,255,255,0.03)'; };
var name = mk('span', 'font-size:11px;font-weight:600;color:#aaa;', T[LANG].features[key]);
var toggle = buildToggle(getFeature(key));
row.appendChild(name);
row.appendChild(toggle);
row.onclick = function () {
var newVal = !getFeature(key);
setFeature(key, newVal);
toggle.querySelector('.yt-toggle-thumb').style.transform = newVal ? 'translateX(15px)' : 'translateX(0)';
toggle.querySelector('.yt-toggle-track').style.background = newVal ? '#4a90d9' : '#2a2a3a';
applyFeatures();
};
featContainer.appendChild(row);
});
p.appendChild(featContainer);
var divider = mk('div', 'border-top:1px solid #191926;margin-bottom:8px;');
p.appendChild(divider);
var langRow = mk('div',
'display:flex;align-items:center;justify-content:center;' +
'padding:8px 10px;border-radius:8px;cursor:pointer;' +
'background:rgba(255,255,255,0.03);border:1px solid rgba(255,255,255,0.055);' +
'font-size:11px;font-weight:700;color:#555;letter-spacing:0.5px;',
T[LANG].langBtn
);
langRow.onmouseenter = function () { langRow.style.color = '#aaa'; };
langRow.onmouseleave = function () { langRow.style.color = '#555'; };
langRow.onclick = function () {
localStorage.setItem('yt-lang', LANG === 'tr' ? 'en' : 'tr');
location.reload();
};
p.appendChild(langRow);
var hint = mk('div', 'text-align:center;color:#252535;font-size:9px;font-weight:700;margin-top:8px;letter-spacing:1px;', T[LANG].shortcut);
p.appendChild(hint);
document.body.appendChild(p);
requestAnimationFrame(function () {
document.addEventListener('mousedown', function outsideClick(e) {
if (!p.contains(e.target) && e.target.id !== 'yt-premium-label') {
p.remove();
document.removeEventListener('mousedown', outsideClick);
}
});
});
}
function applyFeatures() {
addLabel();
if (!getFeature('loop')) {
var lb = document.getElementById('yt-loop-btn');
if (lb) lb.remove();
} else { addLoopButton(); }
if (!getFeature('pip')) {
var pb = document.getElementById('yt-pip-btn');
if (pb) pb.remove();
} else { addPipButton(); }
if (!getFeature('speed')) {
var sp = document.getElementById('yt-speed-select');
if (sp) sp.remove();
} else { addSpeedSelector(); }
if (!getFeature('timestamp')) {
var ts = document.getElementById('yt-ts-btn');
if (ts) ts.remove();
} else { addTimestampButton(); }
if (!getFeature('character')) {
var ch = document.getElementById('yt-char-el');
if (ch) ch.remove();
}
applyCinemaMode();
enableScrollVolume();
}
document.addEventListener('keydown', function (e) {
if (e.ctrlKey && e.shiftKey && e.key === 'D') {
e.preventDefault();
openPanel();
}
});
function init() {
applyTheme(THEME);
applyFeatures();
cleanAds();
injectCharacter();
}
setTimeout(init, 1200);
setInterval(function () {
cleanAds();
injectCharacter();
addLabel();
addLoopButton();
addPipButton();
addSpeedSelector();
addTimestampButton();
}, 800);
new MutationObserver(function () {
setTimeout(function () {
addLabel();
addLoopButton();
addPipButton();
addSpeedSelector();
addTimestampButton();
injectCharacter();
}, 400);
}).observe(document.body, { childList: true, subtree: false });
})();