{"id":521,"date":"2025-03-29T11:39:21","date_gmt":"2025-03-29T11:39:21","guid":{"rendered":"https:\/\/youtube-thumbnail-download.org\/?page_id=521"},"modified":"2025-07-24T19:00:16","modified_gmt":"2025-07-24T19:00:16","slug":"youtube-repeat","status":"publish","type":"page","link":"https:\/\/youtube-thumbnail-download.org\/de\/youtube-repeat\/","title":{"rendered":"Youtube Wiederholen"},"content":{"rendered":"\n    <!-- Combined YouTube Submit & Looper Widget V5.1.1 -->\n    <div class=\"ytl-combined-widget\" id=\"ytl_widget_69e4bfcfdaefd\">\n\n        <div class=\"ytl-input-section\">\n            <div class=\"ytl-input-group\">\n                <input type=\"text\"\n                       id=\"url-input-ytl_widget_69e4bfcfdaefd\"\n                       class=\"ytl-url-input\"\n                       placeholder=\"Paste YouTube URL or Video ID\"\n                       aria-label=\"YouTube URL or Video ID\"\n                       value=\"\">\n                <button type=\"button\" class=\"ytl-submit-btn\">Load Video<\/button>\n            <\/div>\n            <p class=\"ytl-error-message\" style=\"display: none;\"><\/p>\n        <\/div>\n\n        <div class=\"ytl-player-section\" style=\"display: none;\">\n            <div class=\"ytl-container\">\n                <div class=\"ytl-player-wrapper\">\n                    <div id=\"player-ytl_widget_69e4bfcfdaefd\"><\/div>\n                     <p class=\"ytl-loading-placeholder\" style=\"display: flex;\">Loading player...<\/p>\n                <\/div>\n\n                <!-- == START: Integrated Controls HTML (V5 Style) == -->\n                <div class=\"ytl-new-controls\">\n                    <!-- Progress Bar Row -->\n                    <div class=\"ytl-progress-row\">\n                        <span class=\"ytl-time-display-inline ytl-current-time-inline\">0:00<\/span>\n                        <div class=\"ytl-progress-bar\">\n                            <div class=\"ytl-progress-track\"><\/div>\n                            <div class=\"ytl-progress-played\"><\/div>\n                            <div class=\"ytl-progress-handle ytl-progress-handle-start\" title=\"Loop Start\"><\/div>\n                            <div class=\"ytl-progress-handle ytl-progress-handle-end\" title=\"Loop End\"><\/div>\n                            <div class=\"ytl-progress-handle ytl-progress-handle-current\" title=\"Current Time\"><\/div>\n                        <\/div>\n                        <span class=\"ytl-time-display-inline ytl-duration-inline\">0:00<\/span>\n                    <\/div>\n                    <!-- Action Buttons Row -->\n                    <div class=\"ytl-buttons-row\">\n                         <div class=\"ytl-playback-controls-group\">\n                             <button title=\"Undo Last Seek\" class=\"ytl-action-btn ytl-undo-btn\" disabled><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 512 512\" width=\"20\" height=\"20\" fill=\"currentColor\"><path d=\"M105.1 202.6c7.7-21.8 20.2-42.3 37.8-59.8c62.5-62.5 163.8-62.5 226.3 0L386.3 160H336c-17.7 0-32 14.3-32 32s14.3 32 32 32H463.5c0 0 0 0 0 0h.4c17.7 0 32-14.3 32-32V64c0-17.7-14.3-32-32-32s-32 14.3-32 32v51.2L414.4 97.6c-87.5-87.5-229.3-87.5-316.8 0C73.2 122 55.6 150.7 44.8 181.4c-5.9 16.7 2.9 34.9 19.5 40.8s34.9-2.9 40.8-19.5zM39 289.3c-5 1.5-9.8 4.2-13.7 8.2c-4 4-6.7 8.8-8.1 14c-.3 1.2-.6 2.5-.8 3.8c-.3 1.7-.4 3.4-.4 5.1V448c0 17.7 14.3 32 32 32s32-14.3 32-32V396.9l17.6 17.5 0 0c87.5 87.5 229.3 87.5 316.8 0c24.4-24.4 42.1-53.1 52.9-83.7c5.9-16.7-2.9-34.9-19.5-40.8s-34.9 2.9-40.8 19.5c-7.7 21.8-20.2 42.3-37.8 59.8c-62.5 62.5-163.8 62.5-226.3 0l-.1-.1L125.6 352H176c17.7 0 32-14.3 32-32s-14.3-32-32-32H48.4c-1.6 0-3.2 .1-4.8 .3s-3.1 .5-4.6 .9s-3 .8-4.4 1.3s-2.8 1-4.2 1.5z\"\/><\/svg><\/button>\n                             <!-- Loop button title changes dynamically, initial state set in JS -->\n                             <button type=\"button\" title=\"Disable Loop\" class=\"ytl-action-btn ytl-loop-toggle-btn ytl-active\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\" width=\"26\" height=\"26\" fill=\"currentColor\"><path d=\"M7 7h10v3l4-4-4-4v3H5v6h2V7zm10 10H7v-3l-4 4 4 4v-3h12v-6h-2v4z\"\/><\/svg><\/button>\n                             <!-- Play\/Pause button title changes dynamically, initial state set in JS -->\n                             <button type=\"button\" title=\"Pause\" class=\"ytl-action-btn ytl-play-pause-btn\"><svg class=\"ytl-play-icon\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\" width=\"28\" height=\"28\" fill=\"currentColor\" style=\"display: none;\"><path d=\"M8 5v14l11-7z\"\/><\/svg><svg class=\"ytl-pause-icon\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\" width=\"28\" height=\"28\" fill=\"currentColor\"><path d=\"M6 19h4V5H6v14zm8-14v14h4V5h-4z\"\/><\/svg><\/button>\n                         <\/div>\n                         <div class=\"ytl-speed-control-wrapper\">\n                             <div class=\"ytl-speed-display-inline\" title=\"Playback Speed\"><span class=\"ytl-speed-value\">1x<\/span><\/div>\n                             <div class=\"ytl-speed-options\"><button type=\"button\" class=\"ytl-speed-option\" data-speed=\"0.5\">0.5x<\/button><button type=\"button\" class=\"ytl-speed-option\" data-speed=\"0.75\">0.75x<\/button><button type=\"button\" class=\"ytl-speed-option ytl-speed-option-active\" data-speed=\"1\">Normal<\/button><button type=\"button\" class=\"ytl-speed-option\" data-speed=\"1.25\">1.25x<\/button><button type=\"button\" class=\"ytl-speed-option\" data-speed=\"1.5\">1.5x<\/button><button type=\"button\" class=\"ytl-speed-option\" data-speed=\"2\">2x<\/button><\/div>\n                        <\/div>\n                    <\/div>\n                    <!-- Hidden Inputs -->\n                    <input type=\"hidden\" class=\"ytl-loop-start\" value=\"0:00\">\n                    <input type=\"hidden\" class=\"ytl-loop-end\" value=\"\">\n                <\/div>\n                <!-- == END: Integrated Controls HTML == -->\n            <\/div>\n        <\/div>\n\n    <\/div>\n    <!-- End Combined Widget V5.1.1 -->\n\n            <style>\n        \/* --- Paste the CSS from Version 5 (YT Style) --- *\/\n        \/* --- NO CSS CHANGES needed for this diagnostic\/autoplay\/default loop update --- *\/\n         :root { --yt-red: #FF0000; --yt-bg-dark-primary: #181818; --yt-bg-dark-secondary: #212121; --yt-bg-medium-grey: #3d3d3d; --yt-border-color: #3d3d3d; --yt-progress-track: #5a5a5a; --yt-text-primary: #ffffff; --yt-text-secondary: #aaaaaa; --yt-button-hover-bg: rgba(255, 255, 255, 0.15); --yt-menu-bg: #282828; --yt-menu-hover-bg: #3e3e3e; --yt-accent-gradient: linear-gradient(to right, #FFD700, #FFA500); font-family: \"YouTube Noto\", Roboto, Arial, Helvetica, sans-serif; }\n        .ytl-combined-widget { background-color: var(--yt-bg-dark-primary); color: var(--yt-text-primary); padding: 15px; border-radius: 12px; margin: 20px auto; max-width: 750px; box-shadow: 0 8px 16px rgba(0, 0, 0, 0.4); box-sizing: border-box; }\n        .ytl-input-section { margin-bottom: 15px; }\n        .ytl-input-group { display: flex; gap: 0; }\n        .ytl-url-input { flex-grow: 1; padding: 10px 15px; background-color: var(--yt-bg-dark-secondary); border: 1px solid var(--yt-border-color); border-right: none; border-radius: 20px 0 0 20px; color: var(--yt-text-primary); font-size: 1em; box-sizing: border-box; outline: none; transition: border-color 0.2s ease; }\n        .ytl-url-input:focus { border-color: var(--yt-red); box-shadow: inset 0 0 0 1px var(--yt-red); }\n        .ytl-url-input::placeholder { color: var(--yt-text-secondary); opacity: 0.8; }\n        .ytl-submit-btn { padding: 10px 20px; background-color: var(--yt-bg-medium-grey); border: 1px solid var(--yt-border-color); color: var(--yt-text-primary); border-radius: 0 20px 20px 0; cursor: pointer; font-weight: 500; transition: background-color 0.2s ease; font-size: 1em; flex-shrink: 0; display: inline-flex; align-items: center; }\n        .ytl-submit-btn:hover { background-color: var(--yt-progress-track); }\n        .ytl-error-message { color: var(--yt-red); font-size: 0.9em; margin-top: 10px; text-align: center; }\n        .ytl-player-section { margin-top: 15px; border-top: 1px solid var(--yt-border-color); padding-top: 15px; }\n        .ytl-player-wrapper { position: relative; height: 0; overflow: hidden; margin-bottom: 0; background-color: #000000; padding-bottom: 56.25%; border-radius: 8px; }\n        .ytl-player-wrapper iframe { position: absolute; top: 0; left: 0; width: 100%; height: 100%; border: none; }\n        .ytl-loading-placeholder { position: absolute; top: 0; left: 0; width: 100%; height: 100%; display: flex; align-items: center; justify-content: center; color: var(--yt-text-secondary); font-size: 1.1em; background-color: #000000; z-index: 1; border-radius: 8px; }\n        .ytl-new-controls { background-color: transparent; padding: 5px 8px; margin-top: 8px; border: none; border-radius: 0; box-shadow: none; }\n        .ytl-progress-row { display: flex; align-items: center; gap: 12px; margin-bottom: 5px; }\n        .ytl-time-display-inline { font-size: 0.85em; color: var(--yt-text-secondary); white-space: nowrap; font-variant-numeric: tabular-nums; min-width: 40px; text-align: center; }\n        .ytl-progress-bar { flex-grow: 1; height: 5px; position: relative; cursor: pointer; display: flex; align-items: center; }\n        .ytl-progress-track { position: absolute; left: 0; right: 0; top: 50%; transform: translateY(-50%); height: 3px; background-color: var(--yt-progress-track); border-radius: 2px; }\n        .ytl-progress-played { position: absolute; left: 0; top: 50%; transform: translateY(-50%); height: 100%; background: var(--yt-red); border-radius: 2px; width: 0%; z-index: 1; }\n        .ytl-progress-handle { position: absolute; top: 50%; transform: translate(-50%, -50%); width: 12px; height: 12px; background-color: var(--yt-text-primary); border-radius: 2px; box-shadow: 0 1px 2px rgba(0,0,0,0.3); z-index: 2; cursor: grab; opacity: 0; transition: opacity 0.15s ease-in-out; }\n        .ytl-progress-bar:hover .ytl-progress-handle { opacity: 1; }\n        .ytl-progress-handle-current { border-radius: 50%; background-color: var(--yt-red); opacity: 1; }\n        .ytl-progress-handle-start, .ytl-progress-handle-end { background-color: rgba(255,255,255,0.8); width: 8px; height: 8px;}\n        .ytl-buttons-row { position: relative; display: flex; justify-content: center; align-items: center; gap: 15px; padding-top: 0; min-height: 44px; }\n        .ytl-playback-controls-group { display: flex; align-items: center; gap: 20px; }\n        .ytl-action-btn { background: none; border: none; padding: 6px; cursor: pointer; opacity: 0.9; transition: opacity 0.2s ease; display: inline-flex; align-items: center; justify-content: center; border-radius: 50%; color: var(--yt-text-primary); position: relative; }\n        .ytl-action-btn::before { content: ''; position: absolute; top: -6px; left: -6px; right: -6px; bottom: -6px; background-color: var(--yt-button-hover-bg); border-radius: 50%; opacity: 0; transition: opacity 0.2s ease; z-index: -1; }\n        .ytl-action-btn:hover:not(:disabled)::before { opacity: 1; }\n        .ytl-action-btn:disabled { opacity: 0.4; cursor: not-allowed; }\n        .ytl-action-btn svg { display: block; fill: currentColor; }\n        .ytl-undo-btn svg { width: 22px; height: 22px; }\n        .ytl-loop-toggle-btn { padding: 8px; }\n        .ytl-loop-toggle-btn svg { width: 28px; height: 28px; }\n        .ytl-play-pause-btn { padding: 8px; }\n        .ytl-play-pause-btn svg { width: 32px; height: 32px; }\n        \/* Active state style for loop button *\/\n        .ytl-loop-toggle-btn.ytl-active { background: var(--yt-accent-gradient); opacity: 1; color: white; box-shadow: 0 0 5px rgba(255, 165, 0, 0.5); }\n        .ytl-loop-toggle-btn.ytl-active::before { display: none; }\n        .ytl-speed-control-wrapper { position: absolute; right: 5px; top: 50%; transform: translateY(-50%); }\n        .ytl-speed-display-inline { font-size: 0.9em; color: var(--yt-text-primary); padding: 6px 10px; border-radius: 4px; background-color: transparent; white-space: nowrap; cursor: pointer; display: inline-flex; align-items: center; gap: 5px; transition: background-color 0.2s ease; font-weight: 500; position: relative; } \/* Added position relative *\/\n        .ytl-speed-display-inline::before { content: ''; position: absolute; top: -4px; left: -4px; right: -4px; bottom: -4px; background-color: var(--yt-button-hover-bg); border-radius: 4px; opacity: 0; transition: opacity 0.2s ease; z-index: -1; }\n        .ytl-speed-display-inline:hover::before { opacity: 1; }\n        .ytl-speed-display-inline .ytl-speed-value { font-weight: 500; }\n        .ytl-speed-options { display: none; position: absolute; bottom: calc(100% + 8px); right: 0; background-color: var(--yt-menu-bg); border: none; border-radius: 4px; box-shadow: 0 4px 12px rgba(0,0,0,0.4); z-index: 10; width: 100px; overflow: hidden; padding: 5px 0; }\n        .ytl-speed-control-wrapper.ytl-speed-menu-open .ytl-speed-options { display: block; }\n        .ytl-speed-option { display: block; width: 100%; background: none; border: none; color: var(--yt-text-primary); padding: 10px 15px; text-align: left; font-size: 0.9em; font-weight: 500; cursor: pointer; transition: background-color 0.2s ease; }\n        .ytl-speed-option:hover { background-color: var(--yt-menu-hover-bg); }\n        .ytl-speed-option.ytl-speed-option-active { background-color: var(--yt-red); color: var(--yt-text-primary); font-weight: bold; }\n        .ytl-loop-start, .ytl-loop-end { display: none; }\n\n        \/* Mobile Optimizations *\/\n        @media (max-width: 600px) {\n            .ytl-combined-widget {\n                padding: 12px;\n                border-radius: 10px;\n                margin: 15px auto;\n            }\n\n            .ytl-input-group {\n                flex-direction: column;\n                gap: 10px;\n            }\n\n            .ytl-url-input {\n                padding: 12px 15px;\n                font-size: 1em;\n                border-radius: 20px;\n                width: 100%;\n                box-sizing: border-box;\n                border: 1px solid var(--yt-border-color);\n            }\n\n            .ytl-submit-btn {\n                padding: 12px 15px;\n                font-size: 1em;\n                border-radius: 20px;\n                width: 100%;\n                border: 1px solid var(--yt-border-color);\n            }\n\n            .ytl-progress-row {\n                gap: 8px;\n            }\n\n            .ytl-time-display-inline {\n                font-size: 0.8em;\n                min-width: 35px;\n            }\n\n            .ytl-progress-handle {\n                width: 10px;\n                height: 10px;\n            }\n\n            .ytl-progress-handle-start,\n            .ytl-progress-handle-end {\n                width: 6px;\n                height: 6px;\n            }\n\n            .ytl-buttons-row {\n                min-height: auto;\n                flex-direction: column;\n                gap: 12px;\n                padding: 12px 0;\n                align-items: stretch;\n            }\n\n            .ytl-playback-controls-group {\n                width: 100%;\n                justify-content: space-between;\n                gap: 10px;\n                order: 1;\n            }\n\n            .ytl-action-btn {\n                padding: 8px;\n            }\n\n            .ytl-action-btn svg {\n                width: 24px;\n                height: 24px;\n            }\n\n            .ytl-undo-btn svg {\n                width: 20px;\n                height: 20px;\n            }\n\n            .ytl-loop-toggle-btn {\n                order: 1;\n            }\n\n            .ytl-play-pause-btn {\n                order: 2;\n            }\n\n            .ytl-speed-control-wrapper {\n                position: relative;\n                right: auto;\n                top: auto;\n                transform: none;\n                width: 100%;\n                margin-top: 0;\n                order: 2;\n            }\n\n            .ytl-speed-display-inline {\n                font-size: 0.9em;\n                padding: 10px;\n                width: 100%;\n                text-align: center;\n                justify-content: center;\n                border: 1px solid var(--yt-border-color);\n                border-radius: 20px;\n            }\n\n            .ytl-speed-options {\n                width: 100%;\n                bottom: auto;\n                top: 100%;\n                left: 0;\n                right: auto;\n                margin-top: 5px;\n                border-radius: 10px;\n            }\n\n            .ytl-speed-option {\n                font-size: 0.9em;\n                padding: 10px 15px;\n                text-align: center;\n            }\n\n            \/* Adjust player wrapper aspect ratio for mobile *\/\n            .ytl-player-wrapper {\n                padding-bottom: 60%; \/* Slightly taller for mobile *\/\n            }\n        }\n    <\/style>\n        \n            <script>\n        \/\/ --- V5.1.1 JavaScript with Diagnostics + Autoplay + Default Loop ---\n        window.ytlWidgetInitializers = window.ytlWidgetInitializers || [];\n        window.ytlApiLoaded = window.ytlApiLoaded || false;\n        window.ytlApiReady = window.ytlApiReady || false;\n\n        console.log(\"YTL Script: Initializing global flags\"); \/\/ LOG 1\n\n        \/\/ --- Utility Functions ---\n        function ytlExtractVideoId(url) { if (!url) return null; url = url.trim(); if (\/^[a-zA-Z0-9_-]{11}$\/.test(url)) { return url; } const pattern = \/(?:https?:\\\/\\\/)?(?:www\\.)?(?:youtube\\.com\\\/(?:[^\\\/\\n\\s]+\\\/\\S+\\\/|(?:v|e(?:mbed)?)\\\/|\\S*?[?&]v=)|youtu\\.be\\\/)([a-zA-Z0-9_-]{11})\/; const match = url.match(pattern); return (match && match[1]) ? match[1] : null; }\n        function ytlParseTimeToSeconds(timeStr) { timeStr = String(timeStr).trim(); if (\/^\\d+$\/.test(timeStr)) { return Math.max(0, parseInt(timeStr, 10)); } let parts; if (parts = timeStr.match(\/^(\\d+):(\\d+)$\/)) { return Math.max(0, parseInt(parts[1], 10) * 60 + parseInt(parts[2], 10)); } if (parts = timeStr.match(\/^(\\d+):(\\d+):(\\d+)$\/)) { return Math.max(0, parseInt(parts[1], 10) * 3600 + parseInt(parts[2], 10) * 60 + parseInt(parts[3], 10)); } return 0; }\n        function ytlFormatTime(totalSeconds) { totalSeconds = Math.max(0, Math.floor(totalSeconds)); const minutes = Math.floor(totalSeconds \/ 60); const seconds = totalSeconds % 60; return minutes + ':' + String(seconds).padStart(2, '0'); }\n\n        \/\/ --- Widget Initializer ---\n        function ytlInitializeWidget(widgetId) {\n            console.log(`YTL Script: Initializing widget '${widgetId}'`); \/\/ LOG 4\n            const widget = document.getElementById(widgetId);\n            if (!widget) {\n                console.error(`YTL Script: Widget element not found for ID '${widgetId}'`);\n                return;\n            }\n            if (widget.dataset.ytlInitialized === 'true') {\n                console.log(`YTL Script: Widget '${widgetId}' already initialized.`);\n                return;\n            }\n\n            \/\/ --- Get DOM Elements ---\n            const urlInput = widget.querySelector('.ytl-url-input');\n            const submitButton = widget.querySelector('.ytl-submit-btn');\n            const errorMessage = widget.querySelector('.ytl-error-message');\n            const playerSection = widget.querySelector('.ytl-player-section');\n            const playerContainerId = 'player-' + widgetId;\n            const loadingPlaceholder = widget.querySelector('.ytl-loading-placeholder');\n            const progressBar = widget.querySelector('.ytl-progress-bar');\n            const progressPlayed = widget.querySelector('.ytl-progress-played');\n            const currentTimeHandle = widget.querySelector('.ytl-progress-handle-current');\n            const startHandle = widget.querySelector('.ytl-progress-handle-start');\n            const endHandle = widget.querySelector('.ytl-progress-handle-end');\n            const currentTimeSpanInline = widget.querySelector('.ytl-current-time-inline');\n            const durationSpanInline = widget.querySelector('.ytl-duration-inline');\n            const startInput = widget.querySelector('.ytl-loop-start');\n            const endInput = widget.querySelector('.ytl-loop-end');\n            const undoButton = widget.querySelector('.ytl-undo-btn');\n            const loopToggleButton = widget.querySelector('.ytl-loop-toggle-btn');\n            const playPauseButton = widget.querySelector('.ytl-play-pause-btn');\n            const playIcon = playPauseButton.querySelector('.ytl-play-icon');\n            const pauseIcon = playPauseButton.querySelector('.ytl-pause-icon');\n            const speedControlWrapper = widget.querySelector('.ytl-speed-control-wrapper');\n            const speedDisplayButton = widget.querySelector('.ytl-speed-display-inline');\n            const speedDisplayValue = widget.querySelector('.ytl-speed-value');\n            const speedOptionsContainer = widget.querySelector('.ytl-speed-options');\n            const speedOptionButtons = speedOptionsContainer.querySelectorAll('.ytl-speed-option');\n\n            \/\/ --- Check if crucial elements were found ---\n             if (!urlInput || !submitButton || !playerSection || !errorMessage || !progressBar || !playPauseButton || !loopToggleButton || !speedDisplayButton || !speedOptionsContainer) {\n                console.error(`YTL Script: Failed to find one or more crucial control elements within widget '${widgetId}'. Aborting initialization.`);\n                return;\n             }\n             console.log(`YTL Script: All DOM elements found for widget '${widgetId}'`); \/\/ LOG 5\n\n            \/\/ --- Widget State ---\n            let player = null;\n            let loopInterval = null;\n            let isLooping = false; \/\/ Will be set to true in resetControls\n            let currentStart = 0;\n            let currentEnd = Infinity;\n            let videoDuration = 0;\n            let isPlayerReady = false;\n            let currentVideoId = null;\n            let undoStack = [];\n            let availablePlaybackRates = [0.5, 0.75, 1, 1.25, 1.5, 2];\n\n             \/\/ --- Show\/Clear Error ---\n             function showError(message) { console.error(`YTL Script Error (${widgetId}):`, message); errorMessage.textContent = message; errorMessage.style.display = 'block'; playerSection.style.display = 'none'; if (player && typeof player.stopVideo === 'function') { player.stopVideo(); } isPlayerReady = false; currentVideoId = null; loadingPlaceholder.style.display = 'none'; undoStack = []; undoButton.disabled = true; closeSpeedMenu(); }\n             function clearError() { errorMessage.textContent = ''; errorMessage.style.display = 'none'; }\n\n             \/\/ --- Reset Controls State ---\n             function resetControls(duration = 0) {\n                 isLooping = true; \/\/ *** CHANGE: Default loop ON ***\n                 loopToggleButton.classList.add('ytl-active'); \/\/ *** CHANGE: Set button active ***\n                 loopToggleButton.title = 'Disable Loop'; \/\/ *** CHANGE: Set correct title ***\n                 console.log(`YTL Script (${widgetId}): resetControls called, loop enabled by default.`); \/\/ Log change\n\n                 startInput.value = '0:00';\n                 endInput.value = '';\n                 currentStart = 0;\n                 currentEnd = duration > 0 ? duration : Infinity;\n                 videoDuration = duration;\n                 currentTimeSpanInline.textContent = '0:00';\n                 durationSpanInline.textContent = duration > 0 ? ytlFormatTime(duration) : '0:00';\n                 \/\/ Play\/Pause icon state will be set by onPlayerReady or onStateChange\n                 stopLoopCheck();\n                 updateVisualProgress(0);\n                 updateLoopHandles();\n                 setSpeedDisplay(1.0);\n                 closeSpeedMenu();\n                 undoStack = [];\n                 undoButton.disabled = true;\n            }\n\n             \/\/ --- YouTube Player Event Handlers ---\n             function onPlayerReady(event) {\n                 console.log(`YTL Script (${widgetId}): Player Ready`);\n                 isPlayerReady = true;\n                 loadingPlaceholder.style.display = 'none';\n                 videoDuration = player.getDuration();\n                 resetControls(videoDuration); \/\/ This now enables loop by default\n                 playerSection.style.display = 'block';\n                 updatePlayPauseIcon(YT.PlayerState.PLAYING); \/\/ Assume playing due to autoplay\n                 updateTimeDisplay();\n                 if (player && typeof player.setPlaybackRate === 'function') {\n                     player.setPlaybackRate(1);\n                 }\n                 \/\/ --- AUTOPLAY ---\n                 if (player && typeof player.playVideo === 'function') {\n                     console.log(`YTL Script (${widgetId}): Autoplaying video.`);\n                     player.playVideo(); \/\/ *** CHANGE: Start playing automatically ***\n                 }\n             }\n\n             function onPlayerStateChange(event) {\n                 if (!isPlayerReady) return;\n                 console.log(`YTL Script (${widgetId}): Player State Change: ${event.data}`);\n                 const state = event.data;\n                 updatePlayPauseIcon(state);\n                 if (state === YT.PlayerState.PLAYING) {\n                     startLoopCheck(); \/\/ Start checking time for loop\/progress update\n                 } else {\n                     stopLoopCheck(); \/\/ Stop interval when not playing\n                     updateTimeDisplay(); \/\/ Update time display when paused\/ended etc.\n                 }\n\n                 \/\/ Loop logic for ENDED state (handle both natural end and potential API quirks)\n                 if (state === YT.PlayerState.ENDED && isLooping) {\n                     \/\/ Use a small delay to ensure the state change has fully processed\n                     setTimeout(() => {\n                         \/\/ Double-check player state and loop status before seeking\n                         if (player && typeof player.seekTo === 'function' && isLooping && isPlayerReady && player.getPlayerState() === YT.PlayerState.ENDED) {\n                            console.log(`YTL Script (${widgetId}): Looping back to ${currentStart} on ENDED state`);\n                            player.seekTo(currentStart, true);\n                            \/\/ Optionally call playVideo() here if seekTo doesn't automatically restart in some browsers\n                             player.playVideo();\n                         } else {\n                             console.log(`YTL Script (${widgetId}): Loop condition no longer met after ENDED state delay.`);\n                         }\n                     }, 100); \/\/ 100ms delay\n                 } else if (state === YT.PlayerState.ENDED && !isLooping) {\n                     \/\/ Ensure progress shows 100% when ended and not looping\n                     updateVisualProgress(videoDuration);\n                 }\n             }\n\n            \/\/ --- Loop Logic ---\n            function startLoopCheck() {\n                 stopLoopCheck(); \/\/ Clear any existing interval\n                 loopInterval = setInterval(() => {\n                     if (!player || typeof player.getCurrentTime !== 'function' || !isPlayerReady || player.getPlayerState() !== YT.PlayerState.PLAYING) {\n                         \/\/ Stop if player not ready, playing, or gone\n                         stopLoopCheck();\n                         updateTimeDisplay(); \/\/ Update time display one last time if stopped\n                         return;\n                     }\n                     const currentTime = player.getCurrentTime();\n                     updateTimeDisplay(currentTime); \/\/ Update time\/progress bar\n\n                     \/\/ Loop Check (use a small buffer before the end time)\n                     if (isLooping && currentEnd > currentStart && currentTime >= currentEnd - 0.15) { \/\/ Check slightly before exact end time\n                         console.log(`YTL Script (${widgetId}): Looping back to ${currentStart} (interval check)`);\n                         player.seekTo(currentStart, true);\n                         \/\/ No need to call playVideo() here, interval only runs when playing\n                     }\n                 }, 150); \/\/ Check ~6-7 times per second\n             }\n\n            function stopLoopCheck() {\n                 clearInterval(loopInterval);\n                 loopInterval = null;\n             }\n\n             \/\/ --- Update Visuals ---\n             function updateVisualProgress(time) { if (videoDuration > 0) { const percentage = (time \/ videoDuration) * 100; progressPlayed.style.width = `${Math.min(100, Math.max(0, percentage))}%`; currentTimeHandle.style.left = `${Math.min(100, Math.max(0, percentage))}%`; } else { progressPlayed.style.width = '0%'; currentTimeHandle.style.left = '0%'; } }\n             function updateLoopHandles() { if (videoDuration > 0) { const startPerc = (currentStart \/ videoDuration) * 100; const endPerc = (currentEnd \/ videoDuration) * 100; startHandle.style.left = `${Math.min(100, Math.max(0, startPerc))}%`; endHandle.style.left = `${Math.min(100, Math.max(0, endPerc))}%`; } else { startHandle.style.left = '0%'; endHandle.style.left = '100%'; } }\n             function updateTimeDisplay(currentTime = null) { if (!isPlayerReady || !player || typeof player.getCurrentTime !== 'function') { currentTimeSpanInline.textContent = '0:00'; updateVisualProgress(0); return; } try { const time = (currentTime !== null) ? currentTime : player.getCurrentTime(); currentTimeSpanInline.textContent = ytlFormatTime(time); updateVisualProgress(time); } catch (e) { currentTimeSpanInline.textContent = '0:00'; updateVisualProgress(0); console.error(`YTL Script (${widgetId}) Error updating time:`, e); } }\n             function updatePlayPauseIcon(state) { if (state === YT.PlayerState.PLAYING || state === YT.PlayerState.BUFFERING) { playIcon.style.display = 'none'; pauseIcon.style.display = 'block'; playPauseButton.title = 'Pause'; } else { playIcon.style.display = 'block'; pauseIcon.style.display = 'none'; playPauseButton.title = 'Play'; } }\n\n             \/\/ --- Speed Control Functions ---\n             function openSpeedMenu() { speedControlWrapper.classList.add('ytl-speed-menu-open'); }\n             function closeSpeedMenu() { speedControlWrapper.classList.remove('ytl-speed-menu-open'); }\n             function toggleSpeedMenu() { speedControlWrapper.classList.toggle('ytl-speed-menu-open'); }\n             function setSpeedDisplay(speed) { speedDisplayValue.textContent = (speed === 1) ? 'Normal' : `${speed.toFixed(speed % 1 === 0 ? 1 : 2)}x`; speedOptionButtons.forEach(btn => { const btnSpeed = parseFloat(btn.dataset.speed); btn.classList.toggle('ytl-speed-option-active', Math.abs(btnSpeed - speed) < 0.01); }); }\n\n             \/\/ --- Control Bindings ---\n             loopToggleButton.addEventListener('click', () => {\n                 if (!isPlayerReady) return;\n                 isLooping = !isLooping; \/\/ Toggle the state\n                 loopToggleButton.classList.toggle('ytl-active', isLooping);\n                 loopToggleButton.title = isLooping ? 'Disable Loop' : 'Enable Loop';\n                 console.log(`YTL Script (${widgetId}): Loop toggled ${isLooping ? 'ON' : 'OFF'}`);\n                 \/\/ If turning loop ON and video is ended, seek to start\n                 if (isLooping && player && player.getPlayerState() === YT.PlayerState.ENDED) {\n                     console.log(`YTL Script (${widgetId}): Loop enabled while ended, seeking to ${currentStart}`);\n                     player.seekTo(currentStart, true);\n                     player.playVideo();\n                 }\n             });\n\n             function updateLoopTimes() { if (!isPlayerReady || videoDuration <= 0) return; currentStart = Math.max(0, Math.min(currentStart, videoDuration)); currentEnd = Math.max(currentStart, Math.min(currentEnd, videoDuration)); startInput.value = ytlFormatTime(currentStart); endInput.value = ytlFormatTime(currentEnd); updateLoopHandles(); }\n\n             playPauseButton.addEventListener('click', () => {\n                 if (!isPlayerReady || !player || typeof player.getPlayerState !== 'function') return;\n                 const currentState = player.getPlayerState();\n                 console.log(`YTL Script (${widgetId}): Play\/Pause clicked, current state: ${currentState}`);\n                 if (currentState === YT.PlayerState.PLAYING || currentState === YT.PlayerState.BUFFERING) {\n                     player.pauseVideo();\n                 } else {\n                     \/\/ If ended and not looping, seek to start before playing\n                     if (currentState === YT.PlayerState.ENDED && !isLooping) {\n                         player.seekTo(currentStart > 0 ? currentStart : 0, true);\n                     }\n                     player.playVideo();\n                 }\n             });\n\n             undoButton.addEventListener('click', () => { if (!isPlayerReady || typeof player.seekTo !== 'function' || undoStack.length === 0) { return; } const previousTime = undoStack.pop(); console.log(`YTL Script (${widgetId}): Undo seek to ${previousTime}`); player.seekTo(previousTime, true); updateTimeDisplay(previousTime); if (undoStack.length === 0) { undoButton.disabled = true; } });\n             speedDisplayButton.addEventListener('click', (e) => { e.stopPropagation(); toggleSpeedMenu(); });\n             speedOptionButtons.forEach(button => { button.addEventListener('click', (e) => { e.stopPropagation(); if (!isPlayerReady || typeof player.setPlaybackRate !== 'function') return; const newSpeed = parseFloat(button.dataset.speed); if (!isNaN(newSpeed)) { try { console.log(`YTL Script (${widgetId}): Setting speed to ${newSpeed}`); player.setPlaybackRate(newSpeed); setSpeedDisplay(newSpeed); } catch (error) { console.error(`YTL Script (${widgetId}) Failed to set playback rate:`, error); } } closeSpeedMenu(); }); });\n             document.addEventListener('click', (e) => { if (speedControlWrapper && !speedControlWrapper.contains(e.target)) { closeSpeedMenu(); } });\n             progressBar.addEventListener('click', (e) => { if (!isPlayerReady || !player || typeof player.seekTo !== 'function' || videoDuration <= 0) return; const rect = progressBar.getBoundingClientRect(); const clickX = e.clientX - rect.left; const width = rect.width; const clickPercent = Math.max(0, Math.min(1, clickX \/ width)); const seekTime = videoDuration * clickPercent; const currentTimeBeforeSeek = player.getCurrentTime(); undoStack.push(currentTimeBeforeSeek); undoButton.disabled = false; console.log(`YTL Script (${widgetId}): Seek to ${seekTime} (Undo pushed: ${currentTimeBeforeSeek})`); player.seekTo(seekTime, true); updateTimeDisplay(seekTime); });\n\n             \/\/ --- Form Submission \/ Video Loading ---\n             function loadVideo() {\n                 console.log(`YTL Script (${widgetId}): loadVideo called.`); \/\/ LOG 7\n                 clearError();\n                 const urlValue = urlInput.value;\n                 const videoId = ytlExtractVideoId(urlValue);\n                 console.log(`YTL Script (${widgetId}): Extracted Video ID: ${videoId}`); \/\/ LOG 8\n\n                 if (!videoId) {\n                    showError(\"Invalid YouTube URL or Video ID provided.\");\n                    return;\n                 }\n\n                 \/\/ If same video is loaded again, just seek to start and play\n                 if (videoId === currentVideoId && isPlayerReady) {\n                     console.log(`YTL Script (${widgetId}): Same video, seeking to start and playing.`);\n                     if (player && typeof player.seekTo === 'function') {\n                         player.seekTo(currentStart > 0 ? currentStart : 0, true);\n                         \/\/ Ensure it plays even if it was paused\/ended\n                         if (player.getPlayerState() !== YT.PlayerState.PLAYING) {\n                            player.playVideo();\n                         }\n                     }\n                    return;\n                 }\n\n                 currentVideoId = videoId;\n                 isPlayerReady = false; \/\/ Player is not ready until onPlayerReady fires\n                 console.log(`YTL Script (${widgetId}): Loading new video: ${videoId}. Displaying loading placeholder.`);\n                 loadingPlaceholder.style.display = 'flex'; \/\/ Show loading\n                 playerSection.style.display = 'block'; \/\/ Show player area (incl. placeholder)\n\n                 \/\/ Destroy previous player if exists\n                 if (player && typeof player.destroy === 'function') {\n                    console.log(`YTL Script (${widgetId}): Destroying previous player instance.`);\n                    try {\n                        stopLoopCheck(); \/\/ Stop interval before destroying\n                        player.destroy();\n                    } catch(e) {\n                        console.error(`YTL Script (${widgetId}) Error destroying player:`, e);\n                    }\n                    player = null;\n                 } else {\n                    console.log(`YTL Script (${widgetId}): No previous player instance to destroy.`);\n                 }\n\n                \/\/ Ensure the container is clean before creating a new player\n                const playerDiv = document.getElementById(playerContainerId);\n                if(playerDiv) {\n                    playerDiv.innerHTML = ''; \/\/ Clear previous iframe\/errors\n                    console.log(`YTL Script (${widgetId}): Cleared player container div.`);\n                 } else {\n                    console.error(`YTL Script (${widgetId}): Player container div not found (#${playerContainerId})!`);\n                    showError(\"Internal error: Player container not found.\");\n                    return;\n                 }\n\n                 console.log(`YTL Script (${widgetId}): Checking API status. window.ytlApiReady = ${window.ytlApiReady}`); \/\/ LOG 9\n                 if (window.ytlApiReady) {\n                     console.log(`YTL Script (${widgetId}): API is ready. Creating new YT.Player instance.`);\n                     \/\/ Use setTimeout to allow browser to render loading state before potential blocking API call\n                     setTimeout(() => {\n                         try {\n                            player = new YT.Player(playerContainerId, {\n                                videoId: videoId,\n                                playerVars: {\n                                    'playsinline': 1,      \/\/ Good for mobile\n                                    'modestbranding': 1,   \/\/ Less YouTube logo\n                                    'rel': 0,              \/\/ No related videos at end\n                                    'controls': 0,         \/\/ Hide default controls\n                                    'iv_load_policy': 3,   \/\/ Hide annotations\n                                    \/\/ 'autoplay': 1, \/\/ Avoid using this playerVar, use player.playVideo() in onReady for reliability\n                                },\n                                events: {\n                                    'onReady': onPlayerReady, \/\/ Autoplay happens here\n                                    'onStateChange': onPlayerStateChange,\n                                    'onError': (e) => {\n                                        console.error(`YTL Script (${widgetId}) YT Player Error:`, e.data);\n                                        showError(`Error loading video (Code: ${e.data}). Check URL\/ID or browser console.`);\n                                        loadingPlaceholder.style.display = 'none';\n                                        currentVideoId = null;\n                                        isPlayerReady = false;\n                                     }\n                                }\n                            });\n                            console.log(`YTL Script (${widgetId}): YT.Player instance creation initiated.`);\n                         } catch (e) {\n                            console.error(`YTL Script (${widgetId}) Failed to create YT Player instance:`, e);\n                            showError(\"Error initializing player.\");\n                            loadingPlaceholder.style.display = 'none';\n                            currentVideoId = null;\n                         }\n                    }, 50); \/\/ Small delay\n                 } else {\n                    console.error(`YTL Script (${widgetId}): YouTube API not ready when loadVideo was called.`);\n                    showError(\"YouTube API not ready yet. Please wait and try again.\");\n                    loadingPlaceholder.style.display = 'none';\n                    currentVideoId = null;\n                 }\n            } \/\/ end loadVideo\n\n            \/\/ --- Attach Event Listeners ---\n            console.log(`YTL Script (${widgetId}): Adding event listeners for loadVideo.`); \/\/ LOG 6\n            submitButton.addEventListener('click', loadVideo);\n            urlInput.addEventListener('keypress', function (e) {\n                if (e.key === 'Enter') {\n                    e.preventDefault();\n                    console.log(`YTL Script (${widgetId}): Enter key pressed in URL input.`);\n                    loadVideo();\n                }\n            });\n\n            \/\/ Check for initial video ID from URL parameter and load automatically\n            const initialVideoId = urlInput.value;\n            if (initialVideoId && initialVideoId.trim().length === 11) {\n                console.log(`YTL Script (${widgetId}): Found initial video ID '${initialVideoId}', loading automatically.`);\n                 \/\/ Delay slightly to ensure API might be ready if loaded concurrently\n                setTimeout(() => {\n                    \/\/ Check if API is ready BEFORE attempting to load\n                    if (window.ytlApiReady) {\n                         loadVideo();\n                    } else {\n                         \/\/ If API isn't ready yet, wait for the onYouTubeIframeAPIReady callback\n                         \/\/ The initializer queue will handle calling loadVideo via ytlInitializeWidget later\n                         console.log(`YTL Script (${widgetId}): Initial video ID found, but API not ready. Will load when API is ready.`);\n                    }\n                }, 100);\n            } else {\n                 console.log(`YTL Script (${widgetId}): No valid initial video ID found in input.`);\n            }\n\n            widget.dataset.ytlInitialized = 'true';\n            console.log(`YTL Script: Widget '${widgetId}' initialization complete.`); \/\/ LOG 10\n\n        } \/\/ End ytlInitializeWidget\n\n\n        \/\/ --- Add this widget's initializer to the queue ---\n        console.log(\"YTL Script: Pushing initializer for ytl_widget_69e4bfcfdaefd to queue.\"); \/\/ LOG 2\n        window.ytlWidgetInitializers.push(() => ytlInitializeWidget('ytl_widget_69e4bfcfdaefd'));\n\n        \/\/ --- Load YouTube API and Run Initializers ---\n        if (!window.ytlApiLoaded) {\n            console.log(\"YTL Script: First widget instance on page, loading YouTube API.\");\n            window.ytlApiLoaded = true; \/\/ Set flag immediately\n            window.onYouTubeIframeAPIReady = function() {\n                 console.log(\"YTL Script: YouTube API Ready (onYouTubeIframeAPIReady called).\"); \/\/ LOG 3a\n                 window.ytlApiReady = true;\n                 setTimeout(() => { \/\/ Use timeout to ensure execution context is clean\n                    console.log(`YTL Script: Running ${window.ytlWidgetInitializers.length} initializers from queue.`);\n                    window.ytlWidgetInitializers.forEach((initFunc, index) => {\n                        try {\n                            console.log(`YTL Script: Executing initializer #${index + 1}`);\n                            initFunc();\n                        } catch(e) {\n                            console.error(`YTL Script: Error running initializer #${index + 1}:`, e);\n                        }\n                    });\n                    window.ytlWidgetInitializers = []; \/\/ Clear queue after running\n                 }, 0);\n            };\n            var tag = document.createElement('script');\n            tag.src = \"https:\/\/www.youtube.com\/iframe_api\";\n            var firstScriptTag = document.getElementsByTagName('script')[0];\n            if (firstScriptTag && firstScriptTag.parentNode) {\n                firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);\n                console.log(\"YTL Script: YouTube API script tag inserted.\");\n            } else {\n                console.error(\"YTL Script: Could not find script tag to insert API before. Appending to head.\");\n                document.head.appendChild(tag); \/\/ Fallback\n            }\n        } else if (window.ytlApiReady) {\n            \/\/ API already loaded and ready by another instance\n            console.log(\"YTL Script: YouTube API already ready, running initializers immediately.\"); \/\/ LOG 3b\n             setTimeout(() => {\n                 console.log(`YTL Script: Running ${window.ytlWidgetInitializers.length} initializers from queue (API was already ready).`);\n                 window.ytlWidgetInitializers.forEach((initFunc, index) => {\n                    try {\n                         console.log(`YTL Script: Executing initializer #${index + 1}`);\n                         initFunc();\n                     } catch(e) {\n                         console.error(`YTL Script: Error running initializer #${index + 1}:`, e);\n                     }\n                 });\n                window.ytlWidgetInitializers = [];\n             }, 0);\n        } else {\n            \/\/ API script loaded but onYouTubeIframeAPIReady hasn't fired yet\n             console.log(\"YTL Script: YouTube API loading, initializers queued. Waiting for onYouTubeIframeAPIReady.\"); \/\/ LOG 3c\n        }\n\n    <\/script>\n         \n    \n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading has-text-align-center\">Repeat YouTube Video in AB Loop<\/h2>\n\n\n\n<h2 class=\"wp-block-heading\">What is Repeat YouTube?<\/h2>\n\n\n\n<p>Repeat YouTube is great because it is free and accessible, which makes rewatching anything on YouTube so simple. Go, paste the URL of the video that should loop in the search box, and stick an AB loop whenever you want to play it back. This tool is especially useful in enhancing the ability to do many types of things, like languages, sports, music, or whatever, simply because it allows you to cut and repeat watching clips. So start crafting your skills today with the right amount of precision!<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Features:<\/h3>\n\n\n\n<p>Just copy the YouTube video URL, and you can pick any video on YouTube<\/p>\n\n\n\n<p>Replay any part of the video forever.<\/p>\n\n\n\n<p>Use the simple buttons or the dedicated keyboard shortcuts to browse through the video.<\/p>\n\n\n\n<p>Use those keyboard shortcuts as you write notes along with the video pro tips.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>What is YouTube Loop?<\/strong><\/h2>\n\n\n\n<p>The YouTube loop Loop The Loop is an ability(?) on YouTube to play video over and over again. Looping a video restarts it at the end once it reaches an endpoint to keep on playing the video and let all viewers keep watching their favorite content without the manual restart. That can be really useful for music videos or any stuff that you are going to watch or listen to more.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>How to Loop a YouTube Video?<\/strong><\/h3>\n\n\n\n<p>There are different ways to loop YouTube videos depending on the device you use to play. Here are some ways:<\/p>\n\n\n\n<p>Using our Free Tool on our Website<\/p>\n\n\n\n<p>Looping a video in a web browser is like a walk-through for a loop. Usually:<\/p>\n\n\n\n<p>YouTube: Click on the video from the suggested YouTube video and loop&nbsp;&nbsp;<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Right-Click: Right-click on the video player<\/li>\n\n\n\n<li>Loop the Select Loop: You have to click <strong>Loop<\/strong> from the context menu. The video will play in a loop until you pause or stop it.<\/li>\n<\/ol>\n\n\n\n<p>A simple but effective feature, YouTube Loop serves thousands of viewers with ease. Loop videos are great for whatever you are doing, whether you are listening to music, learning something new, or just rewatching your favorite moments. Many easy ways to loop videos on all devices are available to utilize this feature and get lost in the content. And so whenever you see a video that you love, play it on repeat!<\/p>\n\n\n\n<div class=\"ytrepeat-faq-container\" itemscope itemtype=\"https:\/\/schema.org\/FAQPage\">\n  <div class=\"ytrepeat-faq-header\">\n    <div class=\"ytrepeat-faq-logo\">\n      <svg viewBox=\"0 0 24 24\" width=\"40\" height=\"40\">\n        <!-- YouTube Red Circle -->\n        <path fill=\"#FF0000\" d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2z\"\/>\n        <!-- Repeat\/Loop Icon in White -->\n        <path fill=\"#FFFFFF\" d=\"M7 7h10v3l4-4-4-4v3H5v6h2V7zm10 10H7v-3l-4 4 4 4v-3h12v-6h-2v4z\"\/>\n      <\/svg>\n      <h3>YouTube Repeat &#8211; FAQ<\/h3>\n    <\/div>\n    <p class=\"ytrepeat-faq-subtitle\">Your questions about looping YouTube videos, answered!<\/p>\n  <\/div>\n\n  <!-- FAQ Item 1 -->\n  <div class=\"ytrepeat-faq-item\" itemscope itemprop=\"mainEntity\" itemtype=\"https:\/\/schema.org\/Question\">\n    <h4 class=\"ytrepeat-faq-question\" itemprop=\"name\">1. What is YouTube Repeat?<\/h4>\n    <div class=\"ytrepeat-faq-answer\" itemscope itemprop=\"acceptedAnswer\" itemtype=\"https:\/\/schema.org\/Answer\">\n      <div itemprop=\"text\">\n        <p>YouTube Repeat is a tool or a web application to play YouTube videos on repeat, that is, you can play any YouTube video again and again automatically.<\/p>\n      <\/div>\n    <\/div>\n  <\/div>\n\n  <!-- FAQ Item 2 -->\n  <div class=\"ytrepeat-faq-item\" itemscope itemprop=\"mainEntity\" itemtype=\"https:\/\/schema.org\/Question\">\n    <h4 class=\"ytrepeat-faq-question\" itemprop=\"name\">2. How do I use YouTube Repeat?<\/h4>\n    <div class=\"ytrepeat-faq-answer\" itemscope itemprop=\"acceptedAnswer\" itemtype=\"https:\/\/schema.org\/Answer\">\n      <div itemprop=\"text\">\n        <p>To replay a YouTube video, just input the video link into a YouTube Repeat tool. Alternatively, you can add an extension that includes a &#8220;Loop&#8221; button right in the video player for more convenience. This solution is quick and simple!<\/p>\n      <\/div>\n    <\/div>\n  <\/div>\n\n  <!-- FAQ Item 3 -->\n  <div class=\"ytrepeat-faq-item\" itemscope itemprop=\"mainEntity\" itemtype=\"https:\/\/schema.org\/Question\">\n    <h4 class=\"ytrepeat-faq-question\" itemprop=\"name\">3. Can I loop a certain part of a YouTube video?<\/h4>\n    <div class=\"ytrepeat-faq-answer\" itemscope itemprop=\"acceptedAnswer\" itemtype=\"https:\/\/schema.org\/Answer\">\n      <div itemprop=\"text\">\n        <p>Yes! Some YouTube Repeat providers let you pick the custom start and end times and loop just one part of the video, a great option for music, tutorials, or study materials.<\/p>\n      <\/div>\n    <\/div>\n  <\/div>\n\n  <!-- FAQ Item 4 -->\n  <div class=\"ytrepeat-faq-item\" itemscope itemprop=\"mainEntity\" itemtype=\"https:\/\/schema.org\/Question\">\n    <h4 class=\"ytrepeat-faq-question\" itemprop=\"name\">4. Can YouTube Repeat on Mobile?<\/h4>\n    <div class=\"ytrepeat-faq-answer\" itemscope itemprop=\"acceptedAnswer\" itemtype=\"https:\/\/schema.org\/Answer\">\n      <div itemprop=\"text\">\n        <p>Most, yes: You can also loop videos on your phone or tablet with many YouTube Repeat websites and apps.<\/p>\n      <\/div>\n    <\/div>\n  <\/div>\n\n  <!-- FAQ Item 5 -->\n  <div class=\"ytrepeat-faq-item\" itemscope itemprop=\"mainEntity\" itemtype=\"https:\/\/schema.org\/Question\">\n    <h4 class=\"ytrepeat-faq-question\" itemprop=\"name\">5. Is YouTube Repeat free?<\/h4>\n    <div class=\"ytrepeat-faq-answer\" itemscope itemprop=\"acceptedAnswer\" itemtype=\"https:\/\/schema.org\/Answer\">\n      <div itemprop=\"text\">\n        <p>Absolutely! YouTube Repeat is absolutely free, and there is no sign-up form and simply no sign-in to do.<\/p>\n      <\/div>\n    <\/div>\n  <\/div>\n\n<\/div>\n\n<style>\n\/* Ensure these styles are placed in Appearance > Customize > Additional CSS or your child theme's style.css *\/\n.ytrepeat-faq-container { \/* Unique prefix *\/\n  max-width: 700px;\n  margin: 30px auto;\n  font-family: 'Segoe UI', Roboto, -apple-system, sans-serif;\n  background: white;\n  border-radius: 8px;\n  overflow: hidden;\n  box-shadow: 0 4px 20px rgba(0, 0, 0, 0.1);\n  border: 1px solid #e6e6e6;\n}\n.ytrepeat-faq-header { \/* Unique prefix *\/\n  \/* YouTube Red gradient *\/\n  background: linear-gradient(135deg, #CC0000, #A30000); \n  padding: 25px 20px;\n  text-align: center;\n  color: white;\n  border-bottom: 4px solid #EEEEEE;\n}\n.ytrepeat-faq-logo { \/* Unique prefix *\/\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  gap: 12px;\n  margin-bottom: 8px;\n}\n.ytrepeat-faq-logo h3 { \/* Unique prefix *\/\n  margin: 0;\n  font-weight: 600 !important; \n  font-size: 22px !important; \n  letter-spacing: -0.5px;\n  color: white !important;\n}\n.ytrepeat-faq-subtitle { \/* Unique prefix *\/\n  margin: 0;\n  opacity: 0.9;\n  font-size: 15px !important; \n  font-weight: 400 !important;\n  color: white !important; \n}\n.ytrepeat-faq-item { \/* Unique prefix *\/\n  border-bottom: 1px solid #e6e6e6; \n}\n.ytrepeat-faq-item:last-child { \/* Unique prefix *\/\n  border-bottom: none;\n}\n\n.ytrepeat-faq-container .ytrepeat-faq-item h4.ytrepeat-faq-question { \/* Unique prefix *\/\n  margin: 0;\n  padding: 18px 20px;\n  background-color: white;\n  color: #212121 !important;\n  cursor: pointer;\n  font-size: 16px !important;\n  line-height: 1.5 !important; \n  font-weight: 600 !important; \n  transition: all 0.2s;\n  display: flex;\n  align-items: center;\n}\n\n.ytrepeat-faq-question:hover { \/* Unique prefix *\/\n  background-color: #FAFAFA !important; \n}\n.ytrepeat-faq-question:before { \/* Unique prefix *\/\n  content: '';\n  display: inline-block;\n  width: 24px;\n  height: 24px;\n  margin-right: 12px;\n  \/* YouTube Red plus icon *\/\n  background-image: url('data:image\/svg+xml;utf8,<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\" fill=\"%23FF0000\"><path d=\"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z\"\/><\/svg>');\n  background-size: contain;\n  transition: transform 0.2s;\n}\n.ytrepeat-faq-item.active .ytrepeat-faq-question:before { \/* Unique prefix *\/\n  \/* YouTube Red minus icon *\/\n  background-image: url('data:image\/svg+xml;utf8,<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\" fill=\"%23FF0000\"><path d=\"M19 13H5v-2h14v2z\"\/><\/svg>');\n}\n.ytrepeat-faq-answer { \/* Unique prefix *\/\n  max-height: 0;\n  overflow: hidden;\n  transition: max-height 0.35s ease-out;\n  background: #F9F9F9 !important; \n}\n.ytrepeat-faq-answer > div { \/* Unique prefix *\/\n  padding: 20px;\n  color: #4A4A4A !important; \n  line-height: 1.6 !important;\n  font-size: 15px !important; \n}\n.ytrepeat-faq-answer > div p { \/* Unique prefix *\/\n    margin-top: 0; \n    margin-bottom: 10px;\n}\n.ytrepeat-faq-answer > div p:last-child { \/* Unique prefix *\/\n    margin-bottom: 0;\n}\n.ytrepeat-faq-item.active .ytrepeat-faq-answer { \/* Unique prefix *\/\n  max-height: 700px; \n}\n\n@keyframes ytrepeatFadeInUp { \/* Unique animation name *\/\n  from { opacity: 0; transform: translateY(10px); }\n  to { opacity: 1; transform: translateY(0); }\n}\n.ytrepeat-faq-item { \/* Unique prefix *\/\n  animation: ytrepeatFadeInUp 0.4s ease-out forwards;\n  opacity: 0;\n}\n.ytrepeat-faq-item:nth-child(1) { animation-delay: 0.1s; }\n.ytrepeat-faq-item:nth-child(2) { animation-delay: 0.15s; }\n.ytrepeat-faq-item:nth-child(3) { animation-delay: 0.2s; }\n.ytrepeat-faq-item:nth-child(4) { animation-delay: 0.25s; }\n.ytrepeat-faq-item:nth-child(5) { animation-delay: 0.3s; }\n\n\n@media (max-width: 600px) {\n  .ytrepeat-faq-logo h3 { \/* Unique prefix *\/\n    font-size: 20px !important; \n  }\n  .ytrepeat-faq-container .ytrepeat-faq-item h4.ytrepeat-faq-question { \/* Unique prefix *\/\n    padding: 16px 15px;\n    font-size: 15px !important; \n    line-height: 1.4 !important;\n  }\n  .ytrepeat-faq-answer > div { \/* Unique prefix *\/\n    font-size: 14px !important; \n  }\n}\n<\/style>\n\n<script>\n\/\/ Place this script in your theme's footer script area or using a plugin like \"Insert Headers and Footers\"\ndocument.addEventListener('DOMContentLoaded', function() {\n  const questions = document.querySelectorAll('.ytrepeat-faq-container .ytrepeat-faq-question'); \/\/ Updated selector\n  \n  if(questions.length > 0 && questions[0].parentElement.classList.contains('ytrepeat-faq-item')) { \n    \/\/ Auto-open first question\n    questions[0].parentElement.classList.add('active');\n  \n    questions.forEach(question => {\n      question.addEventListener('click', () => {\n        const item = question.parentElement;\n        if (item.classList.contains('ytrepeat-faq-item')) { \n          \/\/ Close all other items first\n          const allItems = item.closest('.ytrepeat-faq-container').querySelectorAll('.ytrepeat-faq-item'); \n          allItems.forEach(otherItem => {\n            if (otherItem !== item) { \n              otherItem.classList.remove('active');\n            }\n          });\n          \n          \/\/ Then toggle the clicked item\n          item.classList.toggle('active');\n        }\n      });\n    });\n  } else {\n    \/\/ console.log(\"YouTube Repeat FAQ script: No FAQ questions found or structure mismatch.\");\n  }\n});\n<\/script>\n","protected":false},"excerpt":{"rendered":"<p>YouTube-Video in AB-Schleife wiederholen Was ist Repeat YouTube? Repeat YouTube ist gro\u00dfartig, weil es kostenlos und zug\u00e4nglich ist, ... <\/p>\n<p class=\"read-more-container\"><a title=\"Youtube Wiederholen\" class=\"read-more button\" href=\"https:\/\/youtube-thumbnail-download.org\/de\/youtube-repeat\/#more-521\" aria-label=\"Mehr Informationen \u00fcber Youtube Repeat\">Mehr lesen<\/a><\/p>","protected":false},"author":1,"featured_media":536,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":{"0":"post-521","1":"page","2":"type-page","3":"status-publish","4":"has-post-thumbnail","6":"resize-featured-image"},"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.0 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>YouTube Repeat: Loop Videos Easily!<\/title>\n<meta name=\"description\" content=\"YouTube repeat made easy! Discover how to use the YouTube repeat feature to loop your favorite videos. Perfect for music, tutorials, and more.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/youtube-thumbnail-download.org\/de\/youtube-repeat\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"YouTube Repeat: Loop Videos Easily!\" \/>\n<meta property=\"og:description\" content=\"YouTube repeat made easy! Discover how to use the YouTube repeat feature to loop your favorite videos. Perfect for music, tutorials, and more.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/youtube-thumbnail-download.org\/de\/youtube-repeat\/\" \/>\n<meta property=\"og:site_name\" content=\"YouTube Thumbnail Downloader\" \/>\n<meta property=\"article:modified_time\" content=\"2025-07-24T19:00:16+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/youtube-thumbnail-download.org\/wp-content\/uploads\/2025\/03\/Youtube-Repeat.webp\" \/>\n\t<meta property=\"og:image:width\" content=\"1280\" \/>\n\t<meta property=\"og:image:height\" content=\"720\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/webp\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data1\" content=\"3\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/youtube-thumbnail-download.org\/youtube-repeat\/\",\"url\":\"https:\/\/youtube-thumbnail-download.org\/youtube-repeat\/\",\"name\":\"YouTube Repeat: Loop Videos Easily!\",\"isPartOf\":{\"@id\":\"https:\/\/youtube-thumbnail-download.org\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/youtube-thumbnail-download.org\/youtube-repeat\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/youtube-thumbnail-download.org\/youtube-repeat\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/youtube-thumbnail-download.org\/wp-content\/uploads\/2025\/03\/Youtube-Repeat.webp\",\"datePublished\":\"2025-03-29T11:39:21+00:00\",\"dateModified\":\"2025-07-24T19:00:16+00:00\",\"description\":\"YouTube repeat made easy! Discover how to use the YouTube repeat feature to loop your favorite videos. Perfect for music, tutorials, and more.\",\"breadcrumb\":{\"@id\":\"https:\/\/youtube-thumbnail-download.org\/youtube-repeat\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/youtube-thumbnail-download.org\/youtube-repeat\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\/\/youtube-thumbnail-download.org\/youtube-repeat\/#primaryimage\",\"url\":\"https:\/\/youtube-thumbnail-download.org\/wp-content\/uploads\/2025\/03\/Youtube-Repeat.webp\",\"contentUrl\":\"https:\/\/youtube-thumbnail-download.org\/wp-content\/uploads\/2025\/03\/Youtube-Repeat.webp\",\"width\":1280,\"height\":720},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/youtube-thumbnail-download.org\/youtube-repeat\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/youtube-thumbnail-download.org\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Youtube Repeat\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/youtube-thumbnail-download.org\/#website\",\"url\":\"https:\/\/youtube-thumbnail-download.org\/\",\"name\":\"YouTube Thumbnail Downloader\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/youtube-thumbnail-download.org\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/youtube-thumbnail-download.org\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/youtube-thumbnail-download.org\/#organization\",\"name\":\"YouTube Thumbnail Downloader\",\"url\":\"https:\/\/youtube-thumbnail-download.org\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\/\/youtube-thumbnail-download.org\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/youtube-thumbnail-download.org\/wp-content\/uploads\/2025\/05\/youtube.png\",\"contentUrl\":\"https:\/\/youtube-thumbnail-download.org\/wp-content\/uploads\/2025\/05\/youtube.png\",\"width\":350,\"height\":70,\"caption\":\"YouTube Thumbnail Downloader\"},\"image\":{\"@id\":\"https:\/\/youtube-thumbnail-download.org\/#\/schema\/logo\/image\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"YouTube Repeat: Loop Videos Easily!","description":"YouTube repeat made easy! Discover how to use the YouTube repeat feature to loop your favorite videos. Perfect for music, tutorials, and more.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/youtube-thumbnail-download.org\/de\/youtube-repeat\/","og_locale":"de_DE","og_type":"article","og_title":"YouTube Repeat: Loop Videos Easily!","og_description":"YouTube repeat made easy! Discover how to use the YouTube repeat feature to loop your favorite videos. Perfect for music, tutorials, and more.","og_url":"https:\/\/youtube-thumbnail-download.org\/de\/youtube-repeat\/","og_site_name":"YouTube Thumbnail Downloader","article_modified_time":"2025-07-24T19:00:16+00:00","og_image":[{"width":1280,"height":720,"url":"https:\/\/youtube-thumbnail-download.org\/wp-content\/uploads\/2025\/03\/Youtube-Repeat.webp","type":"image\/webp"}],"twitter_card":"summary_large_image","twitter_misc":{"Gesch\u00e4tzte Lesezeit":"3\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/youtube-thumbnail-download.org\/youtube-repeat\/","url":"https:\/\/youtube-thumbnail-download.org\/youtube-repeat\/","name":"YouTube Repeat: Loop Videos Easily!","isPartOf":{"@id":"https:\/\/youtube-thumbnail-download.org\/#website"},"primaryImageOfPage":{"@id":"https:\/\/youtube-thumbnail-download.org\/youtube-repeat\/#primaryimage"},"image":{"@id":"https:\/\/youtube-thumbnail-download.org\/youtube-repeat\/#primaryimage"},"thumbnailUrl":"https:\/\/youtube-thumbnail-download.org\/wp-content\/uploads\/2025\/03\/Youtube-Repeat.webp","datePublished":"2025-03-29T11:39:21+00:00","dateModified":"2025-07-24T19:00:16+00:00","description":"YouTube repeat made easy! Discover how to use the YouTube repeat feature to loop your favorite videos. Perfect for music, tutorials, and more.","breadcrumb":{"@id":"https:\/\/youtube-thumbnail-download.org\/youtube-repeat\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/youtube-thumbnail-download.org\/youtube-repeat\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/youtube-thumbnail-download.org\/youtube-repeat\/#primaryimage","url":"https:\/\/youtube-thumbnail-download.org\/wp-content\/uploads\/2025\/03\/Youtube-Repeat.webp","contentUrl":"https:\/\/youtube-thumbnail-download.org\/wp-content\/uploads\/2025\/03\/Youtube-Repeat.webp","width":1280,"height":720},{"@type":"BreadcrumbList","@id":"https:\/\/youtube-thumbnail-download.org\/youtube-repeat\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/youtube-thumbnail-download.org\/"},{"@type":"ListItem","position":2,"name":"Youtube Repeat"}]},{"@type":"WebSite","@id":"https:\/\/youtube-thumbnail-download.org\/#website","url":"https:\/\/youtube-thumbnail-download.org\/","name":"YouTube Thumbnail Downloader","description":"","publisher":{"@id":"https:\/\/youtube-thumbnail-download.org\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/youtube-thumbnail-download.org\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/youtube-thumbnail-download.org\/#organization","name":"YouTube Thumbnail Downloader","url":"https:\/\/youtube-thumbnail-download.org\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/youtube-thumbnail-download.org\/#\/schema\/logo\/image\/","url":"https:\/\/youtube-thumbnail-download.org\/wp-content\/uploads\/2025\/05\/youtube.png","contentUrl":"https:\/\/youtube-thumbnail-download.org\/wp-content\/uploads\/2025\/05\/youtube.png","width":350,"height":70,"caption":"YouTube Thumbnail Downloader"},"image":{"@id":"https:\/\/youtube-thumbnail-download.org\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/youtube-thumbnail-download.org\/de\/wp-json\/wp\/v2\/pages\/521","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/youtube-thumbnail-download.org\/de\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/youtube-thumbnail-download.org\/de\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/youtube-thumbnail-download.org\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/youtube-thumbnail-download.org\/de\/wp-json\/wp\/v2\/comments?post=521"}],"version-history":[{"count":8,"href":"https:\/\/youtube-thumbnail-download.org\/de\/wp-json\/wp\/v2\/pages\/521\/revisions"}],"predecessor-version":[{"id":727,"href":"https:\/\/youtube-thumbnail-download.org\/de\/wp-json\/wp\/v2\/pages\/521\/revisions\/727"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/youtube-thumbnail-download.org\/de\/wp-json\/wp\/v2\/media\/536"}],"wp:attachment":[{"href":"https:\/\/youtube-thumbnail-download.org\/de\/wp-json\/wp\/v2\/media?parent=521"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}