Scribd Material Downloader (Safe PDF)

Injects Scribd Material Downloader buttons into Scribd pages to view, download TXT, or download PDF safely.

// ==UserScript==
// @name         Scribd Material Downloader (Safe PDF)
// @namespace    Violentmonkey Scripts
// @version      1.2
// @description  Injects Scribd Material Downloader buttons into Scribd pages to view, download TXT, or download PDF safely.
// @author       Angesom12
// @license      MIT
// @match        *://www.scribd.com/*
// @grant        none
// @run-at       document-idle
// ==/UserScript==

(function() {
    'use strict';

    // Load jsPDF dynamically from GitHub
    const jsPDFScript = document.createElement('script');
    jsPDFScript.src = 'https://raw.githubusercontent.com/Angesom12/scribd-downloader-assets/main/js/jspdf.umd.min.js';
    jsPDFScript.onload = () => initDownloader();
    document.head.appendChild(jsPDFScript);

    function initDownloader() {
        const { jsPDF } = window.jspdf;

        // --- Create Button Container ---
        const container = document.createElement('div');
        container.className = 'button-container';
        container.style.position = 'fixed';
        container.style.top = '50%';
        container.style.right = '40px';
        container.style.transform = 'translateY(-50%)';
        container.style.display = 'flex';
        container.style.flexDirection = 'column';
        container.style.gap = '18px';
        container.style.zIndex = '100000';

        // --- Button Styles ---
        const style = document.createElement('style');
        style.textContent = `
            .dl-btn {
                padding: 14px 24px;
                font-size: 16px;
                font-weight: bold;
                border: none;
                border-radius: 10px;
                cursor: pointer;
                color: #fff;
                box-shadow: 0 3px 6px rgba(0,0,0,0.25);
                transition: transform 0.2s, opacity 0.2s;
            }
            .dl-btn:hover {
                transform: scale(1.1);
                opacity: 0.9;
            }
            .btn-view   { background-color: #27ae60; }
            .btn-txt    { background-color: #f39c12; }
            .btn-pdf    { background-color: #8e44ad; }
        `;
        document.head.appendChild(style);

        // --- Create Buttons ---
        const btnView = document.createElement('button');
        btnView.className = 'dl-btn btn-view';
        btnView.textContent = 'View Full';

        const btnTXT = document.createElement('button');
        btnTXT.className = 'dl-btn btn-txt';
        btnTXT.textContent = 'Download (TXT)';

        const btnPDF = document.createElement('button');
        btnPDF.className = 'dl-btn btn-pdf';
        btnPDF.textContent = 'Download (PDF)';

        container.appendChild(btnView);
        container.appendChild(btnTXT);
        container.appendChild(btnPDF);
        document.body.appendChild(container);

        // --- Button Functions ---
        function redirectToEmbed() {
            const currentUrl = window.location.href;
            const regex = /https:\/\/www\.scribd\.com\/[^/]+\/([^/]+)\/[^/]+/;
            const match = currentUrl.match(regex);

            if (match) {
                const newUrl = `https://www.scribd.com/embeds/${match[1]}/content`;
                window.location.href = newUrl;
            } else {
                alert("Unable to open embed view. Please refresh the page.");
            }
        }

        function downloadTXT() {
            const contentElements = document.querySelectorAll('.text_layer .a');
            let content = '';
            contentElements.forEach(el => content += el.textContent + '\n');

            if (!content.trim()) {
                alert("No content found. Try opening the Scribd embed view first.");
                return;
            }

            const blob = new Blob([content], { type: 'text/plain' });
            const url = URL.createObjectURL(blob);
            const a = document.createElement('a');
            a.href = url;
            a.download = 'scribd_material.txt';
            document.body.appendChild(a);
            a.click();
            document.body.removeChild(a);
            URL.revokeObjectURL(url);
        }

        function downloadPDF() {
            const contentElements = document.querySelectorAll('.text_layer .a');
            let content = '';
            contentElements.forEach(el => content += el.textContent + '\n');

            if (!content.trim()) {
                alert("No content found. Try opening the Scribd embed view first.");
                return;
            }

            const doc = new jsPDF();
            const lines = content.split('\n');
            let y = 10;

            lines.forEach(line => {
                if (y > 280) { // page limit
                    doc.addPage();
                    y = 10;
                }
                doc.text(line, 10, y);
                y += 7; // line height
            });

            doc.save('scribd_material.pdf');
        }

        // --- Bind Buttons ---
        btnView.addEventListener('click', redirectToEmbed);
        btnTXT.addEventListener('click', downloadTXT);
        btnPDF.addEventListener('click', downloadPDF);
    }

})();