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);
});
})();