Greasy Fork镜像 还支持 简体中文。

Uzaktan Eğitim Kapısı Videolarını Otomatik İzle (Ayarlı v3.5 - Arka Plan Başlık Düzeltmesi)

Uzaktan Eğitim Kapısı Videolarını, Bilgisayara Dokunmadan, Arka Arkaya, Arkaplanda İzlemenizi Sağlar (Ayarlanabilir Özellikler, Sonraki Videoya Geçiş, Ses ve Başlık Kontrolü)

目前為 2025-05-29 提交的版本,檢視 最新版本

// ==UserScript==
// @name         Uzaktan Eğitim Kapısı Videolarını Otomatik İzle (Ayarlı v3.5 - Arka Plan Başlık Düzeltmesi)
// @namespace    https://uzaktanegitimkapisi.cbiko.gov.tr/
// @version      v3.5
// @description  Uzaktan Eğitim Kapısı Videolarını, Bilgisayara Dokunmadan, Arka Arkaya, Arkaplanda İzlemenizi Sağlar (Ayarlanabilir Özellikler, Sonraki Videoya Geçiş, Ses ve Başlık Kontrolü)
// @author       MstyCnklc
// @homepage     https://gf.qytechs.cn/tr/scripts/537685-uzaktan-e%C4%9Fitim-kap%C4%B1s%C4%B1-videolar%C4%B1n%C4%B1-otomatik-i-zle-geli%C5%9Fmi%C5%9F-oynay%C4%B1c%C4%B1
// @supportURL   https://gf.qytechs.cn/tr/scripts/537685-uzaktan-e%C4%9Fitim-kap%C4%B1s%C4%B1-videolar%C4%B1n%C4%B1-otomatik-i-zle-geli%C5%9Fmi%C5%9F-oynay%C4%B1c%C4%B1/feedback
// @match        https://uzaktanegitimkapisi.cbiko.gov.tr/Egitimler/video*
// @match        https://uzaktanegitimkapisi.cbiko.gov.tr/Egitimler/Video*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=gov.tr
// @grant        GM_setValue
// @grant        GM_getValue
// @grant        GM_addStyle
// @require      http://code.jquery.com/jquery-3.4.1.min.js
// @license      GPL-2.0-only
// ==/UserScript==

(function() {
    'use strict';

    const SETTINGS_DEFAULTS = {
        autoPlay: true,
        startMuted: false,
        playInBackground: true,
        autoConfirm: true,
        autoReload: true,
        reloadIntervalMinutes: 25,
        autoAdvanceNextVideo: true
    };

    function loadSettings() {
        let settings = {};
        for (const key in SETTINGS_DEFAULTS) {
            settings[key] = GM_getValue(key, SETTINGS_DEFAULTS[key]);
        }
        settings.reloadIntervalMinutes = parseInt(settings.reloadIntervalMinutes, 10) || SETTINGS_DEFAULTS.reloadIntervalMinutes;
        ['autoPlay', 'startMuted', 'playInBackground', 'autoConfirm', 'autoReload', 'autoAdvanceNextVideo'].forEach(key => {
            if (typeof settings[key] !== 'boolean') {
                settings[key] = SETTINGS_DEFAULTS[key];
            }
        });
        return settings;
    }

    function saveSettings(settings) {
        for (const key in settings) {
            GM_setValue(key, settings[key]);
        }
    }

    let currentSettings = loadSettings();
    var myPlayer;
    var pageRefreshInterval;
    let originalDocTitle = ""; // Orijinal sayfa başlığını saklamak için

    GM_addStyle(`
        #uek-settings-button {
            position: fixed; bottom: 20px; right: 20px;
            background-color: #007bff; color: white; padding: 10px 15px;
            border: none; border-radius: 5px; cursor: pointer; z-index: 9999;
            font-size: 14px; box-shadow: 0 2px 5px rgba(0,0,0,0.2);
        }
        #uek-settings-button:hover { background-color: #0056b3; }
        #uek-settings-panel {
            position: fixed; bottom: 70px; right: 20px;
            background-color: #f8f9fa; border: 1px solid #dee2e6;
            border-radius: 8px; padding: 20px; z-index: 10000;
            display: none; width: 360px;
            box-shadow: 0 4px 15px rgba(0,0,0,0.15); font-family: Arial, sans-serif;
        }
        #uek-settings-panel h3 {
            margin-top: 0; margin-bottom: 20px; font-size: 18px; color: #343a40;
            text-align: center; border-bottom: 1px solid #e9ecef; padding-bottom: 10px;
        }
        #uek-settings-panel .setting-item {
            display: flex; justify-content: space-between; align-items: center;
            margin-bottom: 15px;
        }
        #uek-settings-panel label { font-size: 14px; color: #495057; flex-grow: 1; }
        #uek-settings-panel input[type="checkbox"] {
            margin-left: 10px; transform: scale(1.1); cursor: pointer;
        }
        #uek-settings-panel input[type="number"] {
            width: 70px; padding: 6px 8px; border: 1px solid #ced4da;
            border-radius: 4px; margin-left: 10px; text-align: right;
        }
        #uek-save-settings-button {
            background-color: #28a745; color: white; padding: 10px 15px;
            border: none; border-radius: 5px; cursor: pointer; font-size: 15px;
            display: block; width: 100%; margin-top: 15px;
            transition: background-color 0.2s ease;
        }
        #uek-save-settings-button:hover { background-color: #218838; }
    `);

    const settingsButton = $('<button id="uek-settings-button">⚙️ Ayarlar</button>');
    const settingsPanel = $(`
        <div id="uek-settings-panel">
            <h3>Video İzleme Ayarları</h3>
            <div class="setting-item">
                <label for="uek-autoPlay">Otomatik Oynat (Sayfa Yüklenince)</label>
                <input type="checkbox" id="uek-autoPlay">
            </div>
            <div class="setting-item">
                <label for="uek-startMuted">Videoları Sessiz Başlat</label>
                <input type="checkbox" id="uek-startMuted">
            </div>
            <div class="setting-item">
                <label for="uek-autoAdvanceNextVideo">Video Bitince Sonrakine Geç</label>
                <input type="checkbox" id="uek-autoAdvanceNextVideo">
            </div>
            <div class="setting-item">
                <label for="uek-playInBackground">Arka Planda Oynat (Sekme Değişince)</label>
                <input type="checkbox" id="uek-playInBackground">
            </div>
            <div class="setting-item">
                <label for="uek-autoConfirm">Onayları Otomatik Tıkla</label>
                <input type="checkbox" id="uek-autoConfirm">
            </div>
            <div class="setting-item">
                <label for="uek-autoReload">Otomatik Sayfa Yenile</label>
                <input type="checkbox" id="uek-autoReload">
            </div>
            <div class="setting-item">
                <label for="uek-reloadIntervalMinutes">Yenileme Sıklığı (dk):</label>
                <input type="number" id="uek-reloadIntervalMinutes" min="1" max="120">
            </div>
            <button id="uek-save-settings-button">Ayarları Kaydet</button>
        </div>
    `);

    $('body').append(settingsButton);
    $('body').append(settingsPanel);

    function updatePanelValues() {
        $('#uek-autoPlay').prop('checked', currentSettings.autoPlay);
        $('#uek-startMuted').prop('checked', currentSettings.startMuted);
        $('#uek-autoAdvanceNextVideo').prop('checked', currentSettings.autoAdvanceNextVideo);
        $('#uek-playInBackground').prop('checked', currentSettings.playInBackground);
        $('#uek-autoConfirm').prop('checked', currentSettings.autoConfirm);
        $('#uek-autoReload').prop('checked', currentSettings.autoReload);
        $('#uek-reloadIntervalMinutes').val(currentSettings.reloadIntervalMinutes);
    }

    $('#uek-settings-button').on('click', function() {
        currentSettings = loadSettings();
        updatePanelValues();
        $('#uek-settings-panel').slideToggle(200);
    });

    $('#uek-save-settings-button').on('click', function() {
        currentSettings.autoPlay = $('#uek-autoPlay').is(':checked');
        currentSettings.startMuted = $('#uek-startMuted').is(':checked');
        currentSettings.autoAdvanceNextVideo = $('#uek-autoAdvanceNextVideo').is(':checked');
        currentSettings.playInBackground = $('#uek-playInBackground').is(':checked');
        currentSettings.autoConfirm = $('#uek-autoConfirm').is(':checked');
        currentSettings.autoReload = $('#uek-autoReload').is(':checked');

        let newInterval = parseInt($('#uek-reloadIntervalMinutes').val());
        if (isNaN(newInterval) || newInterval < 1) {
            newInterval = SETTINGS_DEFAULTS.reloadIntervalMinutes;
            $('#uek-reloadIntervalMinutes').val(newInterval);
        }
        currentSettings.reloadIntervalMinutes = newInterval;

        saveSettings(currentSettings);
        alert('Ayarlar kaydedildi!');
        $('#uek-settings-panel').slideUp(200);

        if (pageRefreshInterval) clearInterval(pageRefreshInterval);
        setupPageRefresh();

        if (myPlayer) {
            $(window).off('.uekscript');
            if (currentSettings.playInBackground) {
                 setupBackgroundPlayListeners();
            } else { // Eğer arka planda oynatma kapatıldıysa, başlığı orijinaline döndür
                document.title = originalDocTitle || "Uzaktan Eğitim Kapısı";
            }
            if (typeof myPlayer.muted === 'function') {
                if (myPlayer.muted() !== currentSettings.startMuted) {
                     myPlayer.muted(currentSettings.startMuted);
                     console.log(`Video sesi ayar değişikliğiyle güncellendi: ${currentSettings.startMuted ? 'Sessiz' : 'Sesli'}`);
                }
            }
        }
    });

    function applyMuteSetting(player) {
        if (player && typeof player.muted === 'function') {
            if (player.muted() !== currentSettings.startMuted) {
                player.muted(currentSettings.startMuted);
                console.log(`Video ses durumu ayarlandı: ${currentSettings.startMuted ? 'Sessiz' : 'Sesli'}`);
            }
        }
    }

    function attemptPlayWithRetries(player, retries = 5, delay = 1000) {
        if (!currentSettings.autoPlay || !player || typeof player.play !== 'function') {
            if (player) applyMuteSetting(player);
            return;
        }
        player.play()
            .then(() => { /* 'play' olayı zaten applyMuteSetting'i çağıracak */ })
            .catch(error => {
                if (retries > 0) {
                    setTimeout(() => attemptPlayWithRetries(player, retries - 1, delay), delay);
                } else {
                    console.error("Maksimum otomatik oynatma denemesine ulaşıldı.");
                }
            });
    }

    function setupBackgroundPlayListeners() {
        $(window).on('blur.uekscript', function () {
            if (!myPlayer || !currentSettings.playInBackground) return;

            if (currentSettings.autoPlay && typeof myPlayer.play === 'function' && !myPlayer.ended() && myPlayer.paused()) {
                myPlayer.play().catch(e => console.warn("Arka planda oynatma hatası (blur):", e.name, e.message));
            } else if (typeof myPlayer.muted === 'function' && !currentSettings.startMuted && myPlayer.muted()) {
                myPlayer.muted(false);
            }

            // Sekme başlığını güncelle
            if (myPlayer && !myPlayer.paused() && !myPlayer.ended()) {
                document.title = "▶️ UEK - Oynatılıyor...";
            } else if (myPlayer && (myPlayer.paused() || myPlayer.ended())) {
                document.title = "⏸️ UEK - Duraklatıldı/Bitti";
            } else {
                document.title = originalDocTitle || "Uzaktan Eğitim Kapısı"; // Oyuncu yoksa veya beklenmedik durum
            }
            // console.log("Sekme başlığı güncellendi (blur).");
        });

        $(window).on('focus.uekscript', function () {
            if (!myPlayer) { // Oyuncu yoksa hemen orijinal başlığa dön
                document.title = originalDocTitle || "Uzaktan Eğitim Kapısı";
                return;
            }
            // Eğer arka planda oynatma ayarı aktif değilse ve başlık script tarafından değiştirilmişse, düzelt.
            // Bu durum, ayar sekme odaktayken kapatılırsa oluşabilir.
            if (!currentSettings.playInBackground && (document.title.startsWith("▶️") || document.title.startsWith("⏸️"))) {
                document.title = originalDocTitle || "Uzaktan Eğitim Kapısı";
            } else if (currentSettings.playInBackground) { // Sadece ayar aktifse orijinal başlığa dön
                 document.title = originalDocTitle || "Uzaktan Eğitim Kapısı";
            }
            // console.log(`Sekme başlığı orijinaline geri yüklendi: "${document.title}" (focus).`);

            // Videonun oynaması ve ses durumuyla ilgili diğer kontroller (isteğe bağlı, zaten 'play' olayı hallediyor)
            if (currentSettings.autoPlay && typeof myPlayer.play === 'function' && !myPlayer.ended() && myPlayer.paused()) {
                myPlayer.play().catch(e => console.warn("Arka planda oynatma hatası (focus):", e.name, e.message));
            } else if (typeof myPlayer.muted === 'function' && !currentSettings.startMuted && myPlayer.muted()) {
                 myPlayer.muted(false);
            }
        });
    }

    function initializePlayerInteractions() {
        if (!myPlayer) {
            console.warn("Oyuncu başlatılamadı (initializePlayerInteractions).");
            return;
        }

        myPlayer.off('ended');
        myPlayer.off('error');
        myPlayer.off('play');

        myPlayer.on('error', function() {
            const error = myPlayer.error();
            console.error("Video Oynatıcı Hatası:", error ? `${error.code} - ${error.message}` : "Bilinmeyen hata");
        });

        myPlayer.on('play', function() {
            console.log("Video 'play' olayı tetiklendi.");
            applyMuteSetting(myPlayer);
            if (document.hidden && currentSettings.playInBackground) { // Eğer sekme odakta değilken oynamaya başladıysa başlığı güncelle
                 document.title = "▶️ UEK - Oynatılıyor...";
            } else if (!document.hidden) { // Eğer sekme odaktayken oynamaya başladıysa orijinal başlığa dön (ya da zaten öyleyse dokunma)
                 document.title = originalDocTitle || "Uzaktan Eğitim Kapısı";
            }
        });

        myPlayer.on('pause', function() {
            if (document.hidden && currentSettings.playInBackground) { // Eğer sekme odakta değilken duraklatıldıysa
                document.title = "⏸️ UEK - Duraklatıldı (Arka Plan)";
            }
        });

        myPlayer.on('ended', function() {
            if (document.hidden && currentSettings.playInBackground) { // Eğer sekme odakta değilken bittiyse
                document.title = "✅ UEK - Tamamlandı (Arka Plan)";
            }
            // Sonraki video mantığı burada devam eder...
        });


        if (currentSettings.autoPlay) {
            setTimeout(() => attemptPlayWithRetries(myPlayer), 500);
        } else {
             setTimeout(() => applyMuteSetting(myPlayer), 600);
        }

        $(window).off('.uekscript');
        if (currentSettings.playInBackground) {
            setupBackgroundPlayListeners();
        } else { // Arka planda oynatma kapalıysa, sayfa başlığını orijinaline döndür
            if (document.title.startsWith("▶️") || document.title.startsWith("⏸️") || document.title.startsWith("✅")) {
                document.title = originalDocTitle || "Uzaktan Eğitim Kapısı";
            }
        }

        if (currentSettings.autoAdvanceNextVideo) {
            myPlayer.on('ended', function() { // 'ended' için dinleyici zaten yukarıda vardı, bu tekrar olabilir, dikkat!
                // Bu dinleyiciyi initializePlayerInteractions içinde sadece bir kez eklemek daha iyi olur.
                // Önceki 'ended' temizlendiği için bu sorun olmamalı.
                console.log("Video tamamlandı. Sonraki videoya geçilmeye çalışılıyor...");
                const sonrakiVideoButonSeçicileri = [
                    'button:contains("Sonraki Derse Geç")', 'a:contains("Sonraki Video")',
                    '.uek-sonraki-buton-class', '#sonrakiVideoBtnID', '.btnSonraki',
                    '.fa-step-forward', '.vjs-control.vjs-next-item',
                    'button[title*="Sonraki"]', 'a[title*="Sonraki"]',
                    '.playerViewNextLessonButton', '.nextButton',
                    '[data-plyr="next"]', '.skipControl__next',
                ];
                let sonrakiButon = null;
                for (const selector of sonrakiVideoButonSeçicileri) {
                    try {
                        let adayButon = $(selector + ":visible");
                        if (adayButon.length > 0) {
                            sonrakiButon = adayButon.first();
                            break;
                        }
                    } catch (e) { /* Hata durumunda sessiz kal */ }
                }

                if (sonrakiButon && sonrakiButon.length > 0) {
                    sonrakiButon[0].click();
                } else {
                    console.warn("Sonraki video butonu bulunamadı.");
                }
            });
        }
    }

    let mainIntervalTimer = 2000;
    let mainInterval = setInterval(() => {
        if (!myPlayer || typeof myPlayer.paused !== 'function' || typeof myPlayer.ended !== 'function') return;
        if (currentSettings.autoPlay && myPlayer.paused() && !myPlayer.ended()) {
            var autoPlayButton = $('.vjs-big-play-button:visible');
            if (autoPlayButton.length) autoPlayButton.click();
        }
        if (currentSettings.autoConfirm) {
            var confirmButton = $(".swal-button--confirm:visible");
            if (confirmButton.length) confirmButton.click();
        }
    }, mainIntervalTimer);

    function setupPageRefresh() {
        if (pageRefreshInterval) clearInterval(pageRefreshInterval);
        if (currentSettings.autoReload && currentSettings.reloadIntervalMinutes > 0) {
            pageRefreshInterval = setInterval(() => window.location.reload(true), currentSettings.reloadIntervalMinutes * 60 * 1000);
        }
    }

    $(document).ready(function(){
        originalDocTitle = document.title; // Sayfa yüklendiğinde orijinal başlığı al
        console.log(`Orijinal sayfa başlığı: "${originalDocTitle}"`);
        currentSettings = loadSettings();

        let playerCheckRetries = 0;
        const maxPlayerCheckRetries = 20;
        let playerCheckInterval = setInterval(function() {
            playerCheckRetries++;
            if (typeof videojs !== 'undefined' && videojs.getPlayer('CbikoPl')) {
                myPlayer = videojs.getPlayer('CbikoPl');
                clearInterval(playerCheckInterval);
                console.log("Video.js oyuncusu bulundu: CbikoPl");
                initializePlayerInteractions();
            } else if (playerCheckRetries >= maxPlayerCheckRetries) {
                clearInterval(playerCheckInterval);
                console.warn("Video.js oyuncusu 'CbikoPl' belirtilen sürede bulunamadı.");
            }
        }, 500);
        setupPageRefresh();
    });

})();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址