Google Drive Video Downloader - For Restricted Video Download (by AFU-IT)

This userscript can help you download the video and audio from Google Drive video that restricting you to download the video.

// ==UserScript==
// @name         Google Drive Video Downloader - For Restricted Video Download (by AFU-IT)
// @namespace    http://tampermonkey.net/
// @version      1.0
// @description  This userscript can help you download the video and audio from Google Drive video that restricting you to download the video.
// @author       AFU-IT
// @match        https://drive.google.com/*
// @license      MIT
// @grant        GM_setValue
// @grant        GM_getValue
// @grant        GM_registerMenuCommand
// @run-at       document-end
// ==/UserScript==

(function() {
    'use strict';

    let downloadPanel = null;
    let floatingIcon = null;
    let instructionPopup = null;
    let isPanelVisible = false;
    let isInstructionVisible = false;
    let isButtonEnabled = GM_getValue('buttonEnabled', true);

    // Register menu commands in Tampermonkey
    GM_registerMenuCommand('🔴 Disable Download Button', () => {
        GM_setValue('buttonEnabled', false);
        isButtonEnabled = false;
        hideFloatingIcon();
        alert('Download button disabled. Refresh the page to apply changes.');
    });

    GM_registerMenuCommand('🟢 Enable Download Button', () => {
        GM_setValue('buttonEnabled', true);
        isButtonEnabled = true;
        showFloatingIcon();
        alert('Download button enabled.');
    });

    // Create Apple-style CSS
    function createStyles() {
        const style = document.createElement('style');
        style.textContent = `
            /* Apple-style Floating Icon - 55px */
            .gdrive-floating-icon {
                position: fixed !important;
                bottom: 24px !important;
                right: 24px !important;
                z-index: 2147483647 !important;
                width: 55px !important;
                height: 55px !important;
                background: linear-gradient(135deg, #007AFF 0%, #5856D6 100%) !important;
                border: none !important;
                border-radius: 18px !important;
                cursor: pointer !important;
                box-shadow: 0 8px 25px rgba(0, 122, 255, 0.3), 0 3px 10px rgba(0, 0, 0, 0.1) !important;
                display: flex !important;
                align-items: center !important;
                justify-content: center !important;
                color: white !important;
                transition: all 0.4s cubic-bezier(0.25, 0.46, 0.45, 0.94) !important;
                font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif !important;
                backdrop-filter: blur(20px) !important;
                -webkit-backdrop-filter: blur(20px) !important;
                opacity: 0 !important;
                transform: translateY(20px) scale(0.8) !important;
                pointer-events: none !important;
            }

            .gdrive-floating-icon.visible {
                opacity: 1 !important;
                transform: translateY(0) scale(1) !important;
                pointer-events: all !important;
            }

            .gdrive-floating-icon:hover {
                background: linear-gradient(135deg, #0056CC 0%, #4A4AE8 100%) !important;
                box-shadow: 0 12px 35px rgba(0, 122, 255, 0.4), 0 6px 15px rgba(0, 0, 0, 0.15) !important;
                transform: translateY(-3px) scale(1.05) !important;
            }

            .gdrive-floating-icon:active {
                transform: translateY(-1px) scale(0.98) !important;
                transition: all 0.1s ease !important;
            }

            /* Apple-style Download Icon */
            .gdrive-download-icon {
                width: 22px !important;
                height: 22px !important;
                position: relative !important;
                display: flex !important;
                align-items: center !important;
                justify-content: center !important;
            }

            .gdrive-download-icon::before {
                content: '' !important;
                position: absolute !important;
                width: 2px !important;
                height: 12px !important;
                background: white !important;
                border-radius: 1px !important;
                top: 2px !important;
            }

            .gdrive-download-icon::after {
                content: '' !important;
                position: absolute !important;
                width: 7px !important;
                height: 7px !important;
                border-right: 2px solid white !important;
                border-bottom: 2px solid white !important;
                transform: rotate(45deg) !important;
                bottom: 5px !important;
                border-radius: 0 1px 0 0 !important;
            }

            /* Popup Panel */
            .gdrive-popup-panel {
                position: fixed !important;
                bottom: 90px !important;
                right: 24px !important;
                z-index: 2147483646 !important;
                width: 400px !important;
                background: rgba(255, 255, 255, 0.95) !important;
                backdrop-filter: blur(20px) !important;
                -webkit-backdrop-filter: blur(20px) !important;
                border: 1px solid rgba(255, 255, 255, 0.2) !important;
                border-radius: 20px !important;
                box-shadow: 0 20px 60px rgba(0, 0, 0, 0.15), 0 8px 25px rgba(0, 0, 0, 0.1) !important;
                font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif !important;
                overflow: hidden !important;
                opacity: 0 !important;
                transform: translateY(30px) scale(0.9) !important;
                transition: all 0.4s cubic-bezier(0.25, 0.46, 0.45, 0.94) !important;
                pointer-events: none !important;
            }

            .gdrive-popup-panel.visible {
                opacity: 1 !important;
                transform: translateY(0) scale(1) !important;
                pointer-events: all !important;
            }

            /* Header */
            .gdrive-panel-header {
                background: rgba(248, 249, 250, 0.8) !important;
                backdrop-filter: blur(20px) !important;
                -webkit-backdrop-filter: blur(20px) !important;
                border-bottom: 1px solid rgba(0, 0, 0, 0.05) !important;
                padding: 6x 24px !important;
                display: flex !important;
                align-items: center !important;
                justify-content: space-between !important;
            }

            .gdrive-panel-title {
                font-size: 17px !important;
                font-weight: 600 !important;
                color: #1d1d1f !important;
                margin: 0 !important;
                display: flex !important;
                align-items: center !important;
                gap: 10px !important;
                letter-spacing: -0.022em !important;
            }

            .gdrive-header-controls {
                display: flex !important;
                align-items: center !important;
                gap: 10px !important;
            }

            .gdrive-close-btn {
                background: rgba(120, 120, 128, 0.12) !important;
                border: none !important;
                cursor: pointer !important;
                padding: 0 !important;
                border-radius: 50% !important;
                color: #8e8e93 !important;
                font-size: 16px !important;
                transition: all 0.2s ease !important;
                width: 30px !important;
                height: 30px !important;
                display: flex !important;
                align-items: center !important;
                justify-content: center !important;
                font-weight: 500 !important;
            }

            .gdrive-close-btn:hover {
                background: rgba(120, 120, 128, 0.2) !important;
                color: #48484a !important;
            }

            /* Content */
            .gdrive-panel-content {
                padding: 24px !important;
            }

            .gdrive-input-label {
                font-size: 15px !important;
                font-weight: 500 !important;
                color: #1d1d1f !important;
                margin-bottom: 10px !important;
                display: block !important;
                letter-spacing: -0.024em !important;
            }

            /* Instruction Text */
            .gdrive-instruction-text {
                font-size: 13px !important;
                color: #5f6368 !important;
                margin-bottom: 8px !important;
                line-height: 1.4 !important;
            }

            .gdrive-help-btn {
                background: rgba(0, 122, 255, 0.1) !important;
                border: 1px solid rgba(0, 122, 255, 0.2) !important;
                color: #007AFF !important;
                padding: 6px 12px !important;
                border-radius: 8px !important;
                font-size: 12px !important;
                cursor: pointer !important;
                transition: all 0.2s ease !important;
                font-weight: 500 !important;
            }

            .gdrive-help-btn:hover {
                background: rgba(0, 122, 255, 0.15) !important;
            }

            .gdrive-help-btn.active {
                background: #007AFF !important;
                color: white !important;
            }

            .gdrive-url-input {
                width: 100% !important;
                min-height: 100px !important;
                max-height: 200px !important;
                border: 1px solid rgba(0, 0, 0, 0.1) !important;
                border-radius: 12px !important;
                padding: 16px !important;
                font-family: 'SF Mono', Monaco, 'Cascadia Code', 'Roboto Mono', monospace !important;
                font-size: 13px !important;
                color: #1d1d1f !important;
                resize: vertical !important;
                margin-bottom: 16px !important;
                transition: all 0.2s ease !important;
                box-sizing: border-box !important;
                overflow-y: auto !important;
                background: rgba(255, 255, 255, 0.8) !important;
                backdrop-filter: blur(10px) !important;
                -webkit-backdrop-filter: blur(10px) !important;
            }

            .gdrive-url-input:focus {
                outline: none !important;
                border-color: #007AFF !important;
                box-shadow: 0 0 0 3px rgba(0, 122, 255, 0.1) !important;
                background: rgba(255, 255, 255, 0.95) !important;
            }

            .gdrive-url-input::placeholder {
                color: #8e8e93 !important;
            }

            /* Detection Result */
            .gdrive-detection-result {
                margin: 16px 0 !important;
                padding: 10px !important;
                border-radius: 12px !important;
                font-size: 14px !important;
                font-weight: 500 !important;
                text-align: center !important;
                min-height: 20px !important;
                display: flex !important;
                align-items: center !important;
                justify-content: center !important;
                gap: 8px !important;
                letter-spacing: -0.022em !important;
            }

            .gdrive-detection-result.video {
                background: rgba(52, 199, 89, 0.1) !important;
                color: #30d158 !important;
                border: 1px solid rgba(52, 199, 89, 0.2) !important;
            }

            .gdrive-detection-result.audio {
                background: rgba(255, 69, 58, 0.1) !important;
                color: #ff453a !important;
                border: 1px solid rgba(255, 69, 58, 0.2) !important;
            }

            .gdrive-detection-result.error {
                background: rgba(255, 149, 0, 0.1) !important;
                color: #ff9500 !important;
                border: 1px solid rgba(255, 149, 0, 0.2) !important;
            }

            .gdrive-detection-result.empty {
                background: rgba(120, 120, 128, 0.08) !important;
                color: #8e8e93 !important;
                border: 1px solid rgba(120, 120, 128, 0.12) !important;
            }

            /* Apple-style Buttons */
            .gdrive-button-group {
                display: flex !important;
                gap: 8px !important;
                margin-top: 20px !important;
            }

            .gdrive-btn {
                flex: 1 !important;
                padding: 5px 12px !important;
                border: none !important;
                border-radius: 10px !important;
                cursor: pointer !important;
                font-size: 13px !important;
                font-weight: 600 !important;
                font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif !important;
                transition: all 0.2s ease !important;
                display: flex !important;
                align-items: center !important;
                justify-content: center !important;
                gap: 4px !important;
                min-height: 36px !important;
                letter-spacing: -0.022em !important;
            }

            .gdrive-btn-primary {
                background: linear-gradient(135deg, #007AFF 0%, #5856D6 100%) !important;
                color: #ffffff !important;
                box-shadow: 0 2px 8px rgba(0, 122, 255, 0.25) !important;
            }

            .gdrive-btn-primary:hover {
                background: linear-gradient(135deg, #0056CC 0%, #4A4AE8 100%) !important;
                box-shadow: 0 4px 12px rgba(0, 122, 255, 0.35) !important;
                transform: translateY(-1px) !important;
            }

            .gdrive-btn-primary:disabled {
                background: rgba(120, 120, 128, 0.12) !important;
                color: rgba(60, 60, 67, 0.3) !important;
                cursor: not-allowed !important;
                box-shadow: none !important;
                transform: none !important;
            }

            .gdrive-btn-secondary {
                background: rgba(0, 122, 255, 0.1) !important;
                color: #007AFF !important;
                border: 1px solid rgba(0, 122, 255, 0.2) !important;
            }

            .gdrive-btn-secondary:hover {
                background: rgba(0, 122, 255, 0.15) !important;
                transform: translateY(-1px) !important;
                box-shadow: 0 2px 8px rgba(0, 122, 255, 0.15) !important;
            }

            .gdrive-btn-outline {
                background: rgba(120, 120, 128, 0.08) !important;
                color: #8e8e93 !important;
                border: 1px solid rgba(120, 120, 128, 0.12) !important;
            }

            .gdrive-btn-outline:hover {
                background: rgba(120, 120, 128, 0.12) !important;
                color: #48484a !important;
                transform: translateY(-1px) !important;
            }

            /* Instruction Popup - UPDATED sizing and positioning */
            .gdrive-instruction-popup {
                position: fixed !important;
                bottom: 520px !important;
                right: 24px !important;
                z-index: 2147483650 !important;
                width: 380px !important;
                height: auto !important;
                max-height: 280px !important;
                background: rgba(255, 255, 255, 0.98) !important;
                backdrop-filter: blur(20px) !important;
                -webkit-backdrop-filter: blur(20px) !important;
                border: 1px solid rgba(0, 0, 0, 0.1) !important;
                border-radius: 20px !important;
                box-shadow: 0 20px 60px rgba(0, 0, 0, 0.15), 0 8px 25px rgba(0, 0, 0, 0.1) !important;
                font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif !important;
                overflow: hidden !important;
                opacity: 0 !important;
                pointer-events: none !important;
                transform: translateY(20px) scale(0.9) !important;
                transition: all 0.3s ease !important;
            }

            .gdrive-instruction-popup.visible {
                opacity: 1 !important;
                transform: translateY(0) scale(1) !important;
                pointer-events: all !important;
            }

            .gdrive-instruction-header {
                background: rgba(248, 249, 250, 0.9) !important;
                backdrop-filter: blur(20px) !important;
                border-bottom: 1px solid rgba(0, 0, 0, 0.05) !important;
                padding: 10px 20px !important;
                font-weight: 600 !important;
                font-size: 16px !important;
                color: #1d1d1f !important;
                display: flex !important;
                justify-content: space-between !important;
                align-items: center !important;
                letter-spacing: -0.022em !important;
            }

            .gdrive-instruction-content {
                padding: 18px 20px !important;
                font-size: 13px !important;
                color: #1d1d1f !important;
                line-height: 1.5 !important;
                background: rgba(255, 255, 255, 0.95) !important;
                max-height: 200px !important;
                overflow-y: auto !important;
            }

            .gdrive-instruction-content ol {
                margin: 0 !important;
                padding-left: 18px !important;
            }

            .gdrive-instruction-content li {
                margin-bottom: 10px !important;
                padding-left: 6px !important;
                color: #1d1d1f !important;
            }

            .gdrive-instruction-content strong {
                color: #1d1d1f !important;
                font-weight: 600 !important;
            }

            .gdrive-instruction-content code {
                background: rgba(0, 122, 255, 0.1) !important;
                color: #007AFF !important;
                padding: 2px 5px !important;
                border-radius: 4px !important;
                font-family: 'SF Mono', Monaco, monospace !important;
                font-size: 12px !important;
            }

            /* Animation */
            @keyframes apple-pulse {
                0% {
                    box-shadow: 0 8px 25px rgba(0, 122, 255, 0.3), 0 3px 10px rgba(0, 0, 0, 0.1), 0 0 0 0 rgba(0, 122, 255, 0.7);
                }
                70% {
                    box-shadow: 0 8px 25px rgba(0, 122, 255, 0.3), 0 3px 10px rgba(0, 0, 0, 0.1), 0 0 0 15px rgba(0, 122, 255, 0);
                }
                100% {
                    box-shadow: 0 8px 25px rgba(0, 122, 255, 0.3), 0 3px 10px rgba(0, 0, 0, 0.1), 0 0 0 0 rgba(0, 122, 255, 0);
                }
            }

            .gdrive-floating-icon.pulse {
                animation: apple-pulse 2.5s infinite !important;
            }

            /* Responsive */
            @media (max-width: 480px) {
                .gdrive-popup-panel, .gdrive-instruction-popup {
                    width: calc(100vw - 48px) !important;
                    right: 24px !important;
                }
            }

            /* Dark mode support */
            @media (prefers-color-scheme: dark) {
                .gdrive-popup-panel, .gdrive-instruction-popup {
                    background: rgba(28, 28, 30, 0.95) !important;
                    border: 1px solid rgba(255, 255, 255, 0.1) !important;
                }

                .gdrive-panel-header, .gdrive-instruction-header {
                    background: rgba(44, 44, 46, 0.8) !important;
                    border-bottom: 1px solid rgba(255, 255, 255, 0.05) !important;
                }

                .gdrive-panel-title, .gdrive-instruction-header {
                    color: #f2f2f7 !important;
                }

                .gdrive-input-label {
                    color: #f2f2f7 !important;
                }

                .gdrive-url-input {
                    background: rgba(44, 44, 46, 0.8) !important;
                    border: 1px solid rgba(255, 255, 255, 0.1) !important;
                    color: #f2f2f7 !important;
                }

                .gdrive-url-input:focus {
                    background: rgba(44, 44, 46, 0.95) !important;
                }

                .gdrive-instruction-content {
                    background: rgba(44, 44, 46, 0.95) !important;
                    color: #f2f2f7 !important;
                }

                .gdrive-instruction-content li,
                .gdrive-instruction-content strong {
                    color: #f2f2f7 !important;
                }
            }
        `;
        document.head.appendChild(style);
    }

    // Show floating icon
    function showFloatingIcon() {
        if (floatingIcon && isButtonEnabled) {
            floatingIcon.classList.add('visible');
            setTimeout(() => {
                if (isButtonEnabled) {
                    floatingIcon.classList.add('pulse');
                }
            }, 1000);
        }
    }

    // Hide floating icon
    function hideFloatingIcon() {
        if (floatingIcon) {
            floatingIcon.classList.remove('visible', 'pulse');
            if (isPanelVisible) {
                closePanel();
            }
        }
    }

    // Create Apple-style floating icon
    function createFloatingIcon() {
        floatingIcon = document.createElement('button');
        floatingIcon.className = 'gdrive-floating-icon';
        floatingIcon.innerHTML = '<div class="gdrive-download-icon"></div>';
        floatingIcon.title = 'Google Drive Downloader';
        floatingIcon.onclick = togglePanel;
        document.body.appendChild(floatingIcon);

        if (isButtonEnabled) {
            showFloatingIcon();
        }
    }

    // Create instruction popup
    function createInstructionPopup() {
        instructionPopup = document.createElement('div');
        instructionPopup.className = 'gdrive-instruction-popup';
        instructionPopup.innerHTML = `
            <div class="gdrive-instruction-header">
                How to get the request URL?
                <button class="gdrive-close-btn" id="gdrive-instruction-close">×</button>
            </div>
            <div class="gdrive-instruction-content">
                <ol>
                    <li>Open <strong>Developer Tools</strong> by pressing <code>F12</code></li>
                    <li>Click on the <strong>Network</strong> tab</li>
                    <li>Play video and <strong>change quality</strong> (720p → 480p)</li>
                    <li>Copy the newest <strong>videoplayback</strong> URL from the list</li>
                </ol>
            </div>
        `;
        document.body.appendChild(instructionPopup);
    }

    // Create popup panel
    function createPopupPanel() {
        downloadPanel = document.createElement('div');
        downloadPanel.className = 'gdrive-popup-panel';
        downloadPanel.innerHTML = `
            <div class="gdrive-panel-header">
                <h3 class="gdrive-panel-title">
                    <div class="gdrive-download-icon" style="transform: scale(0.8);"></div>
                    GDrive Video & Audio Downloader
                </h3>
                <div class="gdrive-header-controls">
                    <button class="gdrive-help-btn" id="gdrive-help-btn">Instructions</button>
                    <button class="gdrive-close-btn" id="gdrive-close-btn">×</button>
                </div>
            </div>
            <div class="gdrive-panel-content">
                <label class="gdrive-input-label">Paste videoplayback URL</label>
                <div class="gdrive-instruction-text">
                    Paste to below the Google Drive video Request URL from network console to detect if it's video or audio and download it!
                </div>
                <textarea
                    class="gdrive-url-input"
                    id="gdrive-url-input"
                    placeholder="Paste your Google Drive videoplayback Request URL here...

Example:
https://rr5---sn-30a7ynl7.c.drive.google.com/videoplayback?expire=...&itag=140&mime=audio/mp4..."
                ></textarea>

                <div class="gdrive-detection-result empty" id="gdrive-detection-result">
                    <span>🔍</span>
                    <span>Paste a URL above to detect type</span>
                </div>

                <div class="gdrive-button-group">
                    <button class="gdrive-btn gdrive-btn-secondary" id="gdrive-detect-btn">
                        <span>🔍</span>
                        <span>Detect</span>
                    </button>
                    <button class="gdrive-btn gdrive-btn-primary" id="gdrive-download-btn" disabled>
                        <div class="gdrive-download-icon" style="transform: scale(0.7);"></div>
                        <span>Download</span>
                    </button>
                    <button class="gdrive-btn gdrive-btn-outline" id="gdrive-clear-btn">
                        <span>×</span>
                        <span>Clear</span>
                    </button>
                </div>
            </div>
        `;
        document.body.appendChild(downloadPanel);
    }

    // UPDATED: Toggle instruction popup
    function toggleInstructionPopup() {
        const helpBtn = document.getElementById('gdrive-help-btn');

        if (isInstructionVisible) {
            // Hide instruction popup
            instructionPopup.classList.remove('visible');
            helpBtn.classList.remove('active');
            isInstructionVisible = false;
            console.log('Hiding instruction popup...');
        } else {
            // Show instruction popup
            instructionPopup.classList.add('visible');
            helpBtn.classList.add('active');
            isInstructionVisible = true;
            console.log('Showing instruction popup...');
        }
    }

    // Close instruction popup
    function closeInstructionPopup() {
        const helpBtn = document.getElementById('gdrive-help-btn');
        instructionPopup.classList.remove('visible');
        helpBtn.classList.remove('active');
        isInstructionVisible = false;
        console.log('Closing instruction popup...');
    }

    // Setup event listeners after DOM is ready
    function setupEventListeners() {
        // Main panel event listeners
        const detectBtn = document.getElementById('gdrive-detect-btn');
        const downloadBtn = document.getElementById('gdrive-download-btn');
        const clearBtn = document.getElementById('gdrive-clear-btn');
        const closeBtn = document.getElementById('gdrive-close-btn');
        const helpBtn = document.getElementById('gdrive-help-btn');
        const urlInput = document.getElementById('gdrive-url-input');

        if (detectBtn) detectBtn.onclick = detectUrlType;
        if (downloadBtn) downloadBtn.onclick = downloadUrl;
        if (clearBtn) clearBtn.onclick = clearInput;
        if (closeBtn) closeBtn.onclick = closePanel;
        if (helpBtn) {
            helpBtn.onclick = function(e) {
                e.preventDefault();
                e.stopPropagation();
                console.log('Help button clicked!');
                toggleInstructionPopup();
            };
        }
        if (urlInput) {
            urlInput.oninput = onInputChange;
            urlInput.addEventListener('input', autoResizeTextarea);
        }

        // Instruction popup close button
        const instructionCloseBtn = document.getElementById('gdrive-instruction-close');
        if (instructionCloseBtn) {
            instructionCloseBtn.onclick = function(e) {
                e.preventDefault();
                e.stopPropagation();
                console.log('Instruction close button clicked!');
                closeInstructionPopup();
            };
        }

        console.log('Event listeners setup complete');
    }

    // Auto-resize textarea based on content
    function autoResizeTextarea() {
        const textarea = document.getElementById('gdrive-url-input');
        if (!textarea) return;

        textarea.style.height = '100px';
        const scrollHeight = textarea.scrollHeight;
        const maxHeight = 200;
        const minHeight = 100;

        if (scrollHeight > minHeight) {
            textarea.style.height = Math.min(scrollHeight, maxHeight) + 'px';
        }
    }

    // Toggle panel visibility
    function togglePanel() {
        isPanelVisible = !isPanelVisible;
        if (isPanelVisible) {
            downloadPanel.classList.add('visible');
            floatingIcon.classList.remove('pulse');
        } else {
            downloadPanel.classList.remove('visible');
            // Also close instruction popup when main panel closes
            if (isInstructionVisible) {
                closeInstructionPopup();
            }
        }
    }

    // Close panel
    function closePanel() {
        isPanelVisible = false;
        downloadPanel.classList.remove('visible');
        // Also close instruction popup when main panel closes
        if (isInstructionVisible) {
            closeInstructionPopup();
        }
    }

    let detectedUrl = null;
    let detectedType = null;

    // Detect URL type
    function detectUrlType() {
        const input = document.getElementById('gdrive-url-input').value.trim();
        const resultDiv = document.getElementById('gdrive-detection-result');
        const downloadBtn = document.getElementById('gdrive-download-btn');

        if (!input) {
            resultDiv.innerHTML = '<span>⚠️</span><span>Please paste a URL first</span>';
            resultDiv.className = 'gdrive-detection-result error';
            downloadBtn.disabled = true;
            return;
        }

        try {
            const url = new URL(input);
            const itag = url.searchParams.get('itag');
            const mime = url.searchParams.get('mime');
            const clen = url.searchParams.get('clen');

            if (!itag || !mime) {
                resultDiv.innerHTML = '<span>❌</span><span>Invalid Google Drive URL - missing parameters</span>';
                resultDiv.className = 'gdrive-detection-result error';
                downloadBtn.disabled = true;
                return;
            }

            const cleanUrl = cleanUrlForDownload(input);

            let type = 'unknown';
            let quality = '';
            let icon = '';

            if (mime.includes('audio/mp4')) {
                type = 'audio';
                icon = '🔊';
                if (itag === '140') quality = '128k AAC';
                else if (itag === '141') quality = '256k AAC';
                else quality = `Audio (${itag})`;
            } else if (mime.includes('video/mp4')) {
                type = 'video';
                icon = '🎥';
                if (itag === '136') quality = '720p MP4';
                else if (itag === '137') quality = '1080p MP4';
                else if (itag === '298') quality = '720p60 MP4';
                else if (itag === '299') quality = '1080p60 MP4';
                else quality = `Video (${itag})`;
            }

            if (type === 'unknown') {
                resultDiv.innerHTML = '<span>❓</span><span>Unknown file type detected</span>';
                resultDiv.className = 'gdrive-detection-result error';
                downloadBtn.disabled = true;
                return;
            }

            const sizeText = clen ? ` • ${(parseInt(clen) / 1024 / 1024).toFixed(1)} MB` : '';

            resultDiv.innerHTML = `<span>${icon}</span><span>${type.toUpperCase()} detected: ${quality}${sizeText}</span>`;
            resultDiv.className = `gdrive-detection-result ${type}`;

            detectedUrl = cleanUrl;
            detectedType = type;
            downloadBtn.disabled = false;
            downloadBtn.innerHTML = `<div class="gdrive-download-icon" style="transform: scale(0.7);"></div><span>Download ${type.toUpperCase()}</span>`;

        } catch (error) {
            resultDiv.innerHTML = '<span>❌</span><span>Invalid URL format</span>';
            resultDiv.className = 'gdrive-detection-result error';
            downloadBtn.disabled = true;
        }
    }

    // Clean URL for download
    function cleanUrlForDownload(url) {
        try {
            const urlObj = new URL(url);
            const paramsToRemove = [
                'range', 'rn', 'rbuf', 'cpn', 'c', 'cver', 'srfvp', 'ump', 'alr'
            ];
            paramsToRemove.forEach(param => {
                urlObj.searchParams.delete(param);
            });
            return urlObj.toString();
        } catch (error) {
            return url;
        }
    }

    // Download the URL
    function downloadUrl() {
        if (!detectedUrl || !detectedType) {
            alert('Please detect the URL type first');
            return;
        }

        const a = document.createElement('a');
        a.href = detectedUrl;
        a.download = detectedType === 'video' ? 'gdrive_video.mp4' : 'gdrive_audio.m4a';
        a.target = '_blank';
        a.style.display = 'none';
        document.body.appendChild(a);
        a.click();
        document.body.removeChild(a);

        const resultDiv = document.getElementById('gdrive-detection-result');
        const originalHTML = resultDiv.innerHTML;
        const originalClass = resultDiv.className;

        resultDiv.innerHTML = '<span>✅</span><span>Download started! Check your downloads folder.</span>';
        resultDiv.className = 'gdrive-detection-result video';

        setTimeout(() => {
            resultDiv.innerHTML = originalHTML;
            resultDiv.className = originalClass;
        }, 3000);
    }

    // Clear input
    function clearInput() {
        const textarea = document.getElementById('gdrive-url-input');
        textarea.value = '';
        textarea.style.height = '100px';

        document.getElementById('gdrive-detection-result').innerHTML = '<span>🔍</span><span>Paste a URL above to detect type</span>';
        document.getElementById('gdrive-detection-result').className = 'gdrive-detection-result empty';
        document.getElementById('gdrive-download-btn').disabled = true;
        document.getElementById('gdrive-download-btn').innerHTML = '<div class="gdrive-download-icon" style="transform: scale(0.7);"></div><span>Download</span>';
        detectedUrl = null;
        detectedType = null;
    }

    // Auto-detect when input changes
    function onInputChange() {
        const input = document.getElementById('gdrive-url-input').value.trim();
        if (input && input.includes('videoplayback')) {
            setTimeout(detectUrlType, 500);
        }
    }

    // Close panels when clicking outside
    function handleOutsideClick(event) {
        if (isPanelVisible &&
            !downloadPanel.contains(event.target) &&
            !floatingIcon.contains(event.target)) {
            closePanel();
        }

        if (isInstructionVisible && instructionPopup &&
            !instructionPopup.contains(event.target) &&
            !document.getElementById('gdrive-help-btn').contains(event.target)) {
            closeInstructionPopup();
        }
    }

    // Initialize
    function initialize() {
        createStyles();
        createFloatingIcon();
        createInstructionPopup();
        createPopupPanel();

        setTimeout(setupEventListeners, 100);

        document.addEventListener('click', handleOutsideClick);

        console.log('🍎 Apple-style Drive Downloader v9 ready!');
        console.log(`Button status: ${isButtonEnabled ? 'Enabled' : 'Disabled'}`);
    }

    if (document.readyState === 'loading') {
        document.addEventListener('DOMContentLoaded', initialize);
    } else {
        initialize();
    }

})();