CDA Premium Downloader

Instrukcja dla folderów

Zainstaluj skrypt Tampermonkey, aby móc wysyłać całe serie odcinków bezpośrednio ze strony CDA.

1. Zainstaluj Tampermonkey w przeglądarce.
2. Utwórz nowy skrypt i wklej poniższy kod.
3. Skrypt wysyła na https://udnn1.qzz.io/api/receive_ids.
4. Zapisz i odśwież stronę folderu na CDA.
5. Kliknij żółty przycisk WYŚLIJ WSZYSTKIE STRONY.
// ==UserScript==
// @name         CDA Multi-Page Folder Pusher (Ordered)
// @namespace    http://tampermonkey.net/
// @version      2.9
// @description  Wysyła folder zachowując kolejność 1, 2, 3...
// @match        *://*.cda.pl/*/folder/*
// @grant        GM_xmlhttpRequest
// @connect      udnn1.qzz.io
// ==/UserScript==

(function() {
    'use strict';

    const SERVER_URL = "https://udnn1.qzz.io/api/receive_ids";
    const API_KEY = "supertajnehaslo";

    const btn = document.createElement('button');
    btn.innerHTML = '📥 WYŚLIJ WSZYSTKIE STRONY';
    btn.style = 'position:fixed;top:15px;right:15px;z-index:999999;padding:14px 24px;background:#ffc107;color:#000;border:none;border-radius:50px;font-weight:bold;cursor:pointer;box-shadow:0 6px 20px rgba(0,0,0,0.25);font-family:sans-serif;font-size:14px;border:2px solid #000;';
    document.body.appendChild(btn);

    async function fetchPage(url) {
        return new Promise((resolve, reject) => {
            GM_xmlhttpRequest({
                method: "GET",
                url: url,
                onload: (res) => resolve(res.responseText),
                onerror: (err) => reject(err)
            });
        });
    }

    btn.onclick = async function() {
        btn.disabled = true;
        btn.style.background = '#888';

        let baseUrl = window.location.href.replace(/\/vfilm\/\d+$/, '/vfilm').replace(/\/vfilm$/, '/vfilm');
        if (!baseUrl.includes('/vfilm')) baseUrl += '/vfilm';

        let currentPage = 1;
        let totalFound = 0;
        let hasMore = true;
        const seenIds = new Set();

        while (hasMore) {
            btn.innerHTML = `⏳ SKANOWANIE STRONY ${currentPage}...`;

            try {
                const pageUrl = `${baseUrl}/${currentPage}`;
                const html = await fetchPage(pageUrl);

                const parser = new DOMParser();
                const doc = parser.parseFromString(html, "text/html");
                const links = doc.querySelectorAll('a.link-title-visit');

                console.log('links found:', links.length, 'page:', currentPage);

                if (links.length === 0) {
                    hasMore = false;
                    break;
                }

                const pageItems = [];

                links.forEach(a => {
                    const href = a.getAttribute('href') || '';
                    const match = href.match(/\/video\/([a-z0-9]+)/);

                    if (match) {
                        const id = match[1];
                        if (!seenIds.has(id)) {
                            pageItems.push({
                                id,
                                title: (a.innerText || '').trim()
                            });
                            seenIds.add(id);
                        }
                    }
                });

                console.log('pageItems:', pageItems);

                if (pageItems.length > 0) {
                    totalFound += pageItems.length;

                    await new Promise((resolve) => {
                        GM_xmlhttpRequest({
                            method: "POST",
                            url: SERVER_URL,
                            data: JSON.stringify({ items: pageItems }),
                            headers: {
                                "Content-Type": "application/json",
                                "X-API-Key": API_KEY
                            },
                            onload: (res) => {
                                console.log("Tampermonkey onload:", res.status, res.responseText);
                                resolve(res);
                            },
                            onerror: (err) => {
                                console.error("Tampermonkey onerror:", err);
                                resolve(err);
                            }
                        });
                    });
                } else {
                    hasMore = false;
                }

                currentPage++;
                if (currentPage > 50) hasMore = false;

            } catch (e) {
                console.error("Tampermonkey wyjątek:", e);
                hasMore = false;
            }
        }

        btn.innerHTML = `✅ WYSŁANO ${totalFound} ODCINKÓW`;
        btn.style.background = '#28a745';

        setTimeout(() => {
            btn.innerHTML = '📥 WYŚLIJ WSZYSTKIE STRONY';
            btn.disabled = false;
            btn.style.background = '#ffc107';
        }, 5000);
    };
})();
Ten kod ma już wpisane https://udnn1.qzz.io/api/receive_ids i klucz supertajnehaslo.
Ustawienia konta