YouTube Premium+?

YouTube tema, ozellik ve reklam yoneticisi

You will need to install an extension such as Tampermonkey, Greasemonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Userscripts to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install a user script manager extension to install this script.

(Tôi đã có Trình quản lý tập lệnh người dùng, hãy cài đặt nó!)

Advertisement:

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(I already have a user style manager, let me install it!)

Advertisement:

// ==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 });
})();