(i)Diddit Downloader

Download boeken van het Belgische leerlingenplatform (i)Diddit

// ==UserScript==
// @name         (i)Diddit Downloader
// @namespace    http://tampermonkey.net/
// @version      1.1
// @license MIT
// @author       PcLover2
// @description  Download boeken van het Belgische leerlingenplatform (i)Diddit
// @match        https://download.cnet.com/*
// @grant        GM_xmlhttpRequest
// @require      https://cdnjs.cloudflare.com/ajax/libs/jszip/3.7.1/jszip.min.js
// ==/UserScript==

(function() {
    'use strict';

    // Clear the entire content of the site
    document.head.innerHTML = '';
    document.body.innerHTML = '';

    // Set initial tab title
    document.title = '(i)Diddit Downloader';

    // Create and append the title and subtitle
    const title = document.createElement('h1');
    title.textContent = '(i)Diddit downloader';
    title.style.textAlign = 'center';
    document.body.appendChild(title);

    const subtitle = document.createElement('h2');
    subtitle.textContent = 'Made by PcLover2';
    subtitle.style.textAlign = 'center';
    document.body.appendChild(subtitle);

    // Create and append the input elements and button
    const container = document.createElement('div');
    container.style.textAlign = 'center';
    container.style.marginTop = '50px';

    const baseUrlLabel = document.createElement('label');
    baseUrlLabel.textContent = 'Base URL: ';
    container.appendChild(baseUrlLabel);

    const baseUrlInput = document.createElement('input');
    baseUrlInput.type = 'text';
    baseUrlInput.style.width = '80%';
    baseUrlInput.value = 'https://*/*.pdf_/';
    container.appendChild(baseUrlInput);

    container.appendChild(document.createElement('br'));
    container.appendChild(document.createElement('br'));

    const pageNumberLabel = document.createElement('label');
    pageNumberLabel.textContent = 'Total Pages: ';
    container.appendChild(pageNumberLabel);

    const pageNumberInput = document.createElement('input');
    pageNumberInput.type = 'number';
    pageNumberInput.style.width = '80%';
    pageNumberInput.value = 999;
    container.appendChild(pageNumberInput);

    container.appendChild(document.createElement('br'));
    container.appendChild(document.createElement('br'));

    const replacePage2Label = document.createElement('label');
    replacePage2Label.textContent = 'Replace Page 2: ';
    container.appendChild(replacePage2Label);

    const replacePage2Checkbox = document.createElement('input');
    replacePage2Checkbox.type = 'checkbox';
    replacePage2Checkbox.checked = false;
    container.appendChild(replacePage2Checkbox);

    container.appendChild(document.createElement('br'));
    container.appendChild(document.createElement('br'));

    const downloadButton = document.createElement('button');
    downloadButton.textContent = 'Download Images';
    downloadButton.style.padding = '10px 20px';
    downloadButton.style.fontSize = '16px';
    container.appendChild(downloadButton);

    container.appendChild(document.createElement('br'));
    container.appendChild(document.createElement('br'));

    const progressBar = document.createElement('progress');
    progressBar.value = 0;
    progressBar.max = 270;
    progressBar.style.width = '80%';
    container.appendChild(progressBar);

    const progressLabel = document.createElement('div');
    progressLabel.textContent = '0/270';
    container.appendChild(progressLabel);

    document.body.appendChild(container);

    async function fetchAndDownloadImage(pageNumber, baseUrl, replacePage2) {
        const url = (pageNumber === 2 && replacePage2) ? 'https://i.ibb.co/tmxr5bZ/blank.png' : `${baseUrl}${pageNumber}.png`;
        console.log(`Fetching page ${pageNumber} from ${url}`);
        return new Promise((resolve) => {
            GM_xmlhttpRequest({
                method: 'GET',
                url: url,
                responseType: 'blob',
                onload: function(response) {
                    if (response.status === 200) {
                        console.log(`Page ${pageNumber} fetched successfully`);
                        downloadBlob(response.response, `Page${pageNumber}.png`);
                        resolve(true);
                    } else {
                        console.log(`Failed to fetch page ${pageNumber}, fetching fallback`);
                        fetchFallbackAndDownloadImage(pageNumber).then(resolve);
                    }
                },
                onerror: function() {
                    console.log(`Error fetching page ${pageNumber}, fetching fallback`);
                    fetchFallbackAndDownloadImage(pageNumber).then(resolve);
                }
            });
        });
    }

    function fetchFallbackAndDownloadImage(pageNumber) {
        const fallbackUrl = 'https://i.ibb.co/tmxr5bZ/blank.png';
        console.log(`Fetching fallback for page ${pageNumber} from ${fallbackUrl}`);
        return new Promise((resolve) => {
            GM_xmlhttpRequest({
                method: 'GET',
                url: fallbackUrl,
                responseType: 'blob',
                onload: function(response) {
                    console.log(`Fallback for page ${pageNumber} fetched successfully`);
                    downloadBlob(response.response, `Page${pageNumber}.png`);
                    resolve(true);
                }
            });
        });
    }

    function downloadBlob(blob, filename) {
        const link = document.createElement('a');
        link.href = URL.createObjectURL(blob);
        link.download = filename;
        document.body.appendChild(link);
        link.click();
        document.body.removeChild(link);
        URL.revokeObjectURL(link.href); // Clean up URL object
    }

    async function downloadImages(baseUrl, totalPages, replacePage2) {
        for (let i = 1; i <= totalPages; i++) {
            await fetchAndDownloadImage(i, baseUrl, replacePage2);
            progressBar.value = i;
            progressLabel.textContent = `${i}/${totalPages}`;
            document.title = `Scoodle ${i}/${totalPages}`;
            console.log(`Page ${i}/${totalPages} processed`);
        }
        document.title = 'Scoodle & (i)Diddit Downloader'; // Reset the title after download completes
        console.log('Download complete');
    }

    downloadButton.addEventListener('click', function() {
        const baseUrl = baseUrlInput.value;
        const totalPages = parseInt(pageNumberInput.value);
        const replacePage2 = replacePage2Checkbox.checked;
        progressBar.max = totalPages;
        console.log(`Starting download with base URL: ${baseUrl}, total pages: ${totalPages}, replace page 2: ${replacePage2}`);
        downloadImages(baseUrl, totalPages, replacePage2);
    });
})();