Swag.live Downloader

This is a video downloader for theswag.live website.

Vous devrez installer une extension telle que Tampermonkey, Greasemonkey ou Violentmonkey pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey ou Violentmonkey pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey ou Violentmonkey pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey ou Userscripts pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey pour installer ce script.

Vous devrez installer une extension de gestionnaire de script utilisateur pour installer ce script.

(J'ai déjà un gestionnaire de scripts utilisateur, laissez-moi l'installer !)

Vous devrez installer une extension telle que Stylus pour installer ce style.

Vous devrez installer une extension telle que Stylus pour installer ce style.

Vous devrez installer une extension telle que Stylus pour installer ce style.

Vous devrez installer une extension du gestionnaire de style pour utilisateur pour installer ce style.

Vous devrez installer une extension du gestionnaire de style pour utilisateur pour installer ce style.

Vous devrez installer une extension du gestionnaire de style pour utilisateur pour installer ce style.

(J'ai déjà un gestionnaire de style utilisateur, laissez-moi l'installer!)

// ==UserScript==
// @name         Swag.live Downloader
// @name:ZH-CN   Swag 下载器
// @name:zh-TW   Swag 下載器
// @description  This is a video downloader for theswag.live website.
// @description:zh-TW  下载已经在 swag 上购买的视频(Token 登錄專用)
// @description:zh-CN 下载已经在 swag 上购买的视频(Token 专用)
// @namespace    https://swag.heyra.uk/
// @version      1.1
// @author       Swager
// @match        *://*swag.live/archive?*
// @grant        GM_addStyle
// @license      MIT
// @icon         https://swag.heyra.uk/favicon.ico
// ==/UserScript==

(function () {
    'use strict';

    // Create floating button
    const floatingBtn = document.createElement('div');
    floatingBtn.id = 'floating-icon';
    floatingBtn.innerHTML = `<img src="https://swag.heyra.uk/favicon.ico" alt="icon" style="width:100%;height:100%;">`;
    document.body.appendChild(floatingBtn);

    // Create dialog
    const dialog = document.createElement('div');
    dialog.id = 'custom-dialog';
    dialog.innerHTML = `
        <div id="dialog-content">
            <p id="dialog-message">Dialog content here. Replace with your logic.</p>
            <div id="dialog-actions">
                <button id="cancel-btn">取消</button>
                <button id="confirm-btn">复制并下载</button>
            </div>
        </div>
    `;
    document.body.appendChild(dialog);

    // Add styles
    GM_addStyle(`
        #floating-icon {
            position: fixed;
            top: 50%;
            right: 20px;
            transform: translateY(-50%);
            width: 50px;
            height: 50px;
            background: #007BFF;
            border-radius: 50%;
            display: flex;
            align-items: center;
            justify-content: center;
            box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
            cursor: pointer;
            transition: transform 0.3s ease;
            z-index: 1000;
            border: 4px solid rgb(0, 226, 203);
        }
        #floating-icon:hover {
            transform: translateY(-50%) scale(1.1);
        }
        #custom-dialog {
            position: fixed;
            top: 50%;
            left: 50%;
            transform: translate(-50%, -50%) scale(0);
            width: 300px;
            padding: 20px;
            background: white;
            box-shadow: 0 4px 10px rgba(0, 0, 0, 0.2);
            border-radius: 10px;
            z-index: 1001;
            opacity: 0;
            transition: transform 0.3s ease, opacity 0.3s ease;
        }
        #custom-dialog.active {
            transform: translate(-50%, -50%) scale(1);
            opacity: 1;
        }
        #dialog-content {
            color: rgba(0, 0, 0, 0.6);
            text-align: center;
        }
        #dialog-actions {
            display: flex;
            justify-content: space-between;
            margin-top: 20px;
        }
        #dialog-actions button {
            padding: 10px 20px;
            border: none;
            border-radius: 5px;
            cursor: pointer;
            transition: background 0.2s ease;
        }
        #cancel-btn {
        color: white;
            background:  rgb(220, 38, 38);
        }
        #cancel-btn:hover {
        color: white;
            background: rgb(220, 38, 38);
        }
        #confirm-btn {
            background: rgb(0, 226, 203);
            color: white;
        }
        #confirm-btn:hover {
            background: rgb(0, 226, 203);
        }
    `);

    // Toggle dialog visibility
    function toggleDialog(show) {
        if (show) {
            dialog.classList.add('active');
        } else {
            dialog.classList.remove('active');
        }
    }

    // Event listeners
    floatingBtn.addEventListener('click', () => { toggleDialog(true); dialogLogic() });
    document.getElementById('cancel-btn').addEventListener('click', () => toggleDialog(false));
    document.getElementById('confirm-btn').addEventListener('click', () => confirmAction());

    function copyToClipboard(text) {
        if (navigator.clipboard && window.isSecureContext) {
            // 使用现代异步 Clipboard API
            navigator.clipboard.writeText(text).then(() => {
                console.log('Text copied to clipboard:', text);
            }).catch(err => {
                console.error('Failed to copy text to clipboard:', err);
            });
        } else {
            // 退回到旧方法,使用 document.execCommand
            const textArea = document.createElement('textarea');
            textArea.value = text;
            textArea.style.position = 'fixed'; // 避免滚动条影响
            textArea.style.opacity = '0'; // 隐藏元素
            document.body.appendChild(textArea);
            textArea.select();
            try {
                const successful = document.execCommand('copy');
                if (successful) {
                    console.log('Text copied to clipboard:', text);
                } else {
                    console.error('Failed to copy text to clipboard using execCommand.');
                }
            } catch (err) {
                console.error('Failed to copy text to clipboard:', err);
            } finally {
                document.body.removeChild(textArea);
            }
        }
    }

    // Placeholder for confirm logic
    function confirmAction() {
        toggleDialog(false);
        window.open("https://swag.heyra.uk/", "_blank")
    }

    // Placeholder for dialog logic
    function dialogLogic() {
        var db
        var request = indexedDB.open('localforage', 3)
        request.onsuccess = function () {
            db = request.result
            var tx = db.transaction('keyvaluepairs', 'readonly')
            var store = tx.objectStore('keyvaluepairs')
            var _request = store.getAll('_refreshToken')
            _request.onsuccess = function () {
                var token = _request.result.toString()
                copyToClipboard(token)
                document.getElementById('dialog-message').innerText = "Token 获取成功";
            }
        }
    }
})();