Greasy Fork is available in English.

Desu X - Enhancement Script for Desuarchive.org

Combines infinite scrolling, media preview on hover, download functionality, Fappe Tyme™ and gallery mode for desuarchive.org. Alt+G to activate gallery mode. 'F' to toggle fappe tyme. Press 'S' while hovering over a thumbnail or in gallery mode to download media with the original filename.

// ==UserScript==
// @name         Desu X - Enhancement Script for Desuarchive.org
// @version      2.5
// @description  Combines infinite scrolling, media preview on hover, download functionality, Fappe Tyme™ and gallery mode for desuarchive.org. Alt+G to activate gallery mode. 'F' to toggle fappe tyme. Press 'S' while hovering over a thumbnail or in gallery mode to download media with the original filename.
// @author       kpganon
// @license      MIT
// @namespace    https://github.com/kpg-anon/scripts
// @match        https://desuarchive.org/*
// @grant        GM_addStyle
// @grant        GM_xmlhttpRequest
// @grant        GM_addElement
// ==/UserScript==

(function() {
    'use strict';

    GM_addStyle(`
            @import url('https://fonts.googleapis.com/css?family=Roboto');
    * {
        font-family: 'Roboto', sans-serif !important;
    }
    .desux-search-page .paginate {
        display: none !important;
    }
    .desux-search-page article.thread {
        padding: 0 !important;
        border-top: none !important;
    }
    .hidden-by-desux {
        visibility: hidden;
        position: absolute;
        width: 1px;
        height: 1px;
        margin: -1px;
        overflow: hidden;
        clip: rect(0, 0, 0, 0);
        clip-path: inset(50%);
        white-space: nowrap;
    }
    [data-hidden="true"] {
      opacity: 0;
      pointer-events: none;
      user-select: none;
      position: absolute;
      width: 1px;
      height: 1px;
      overflow: hidden;
      clip: rect(0,0,0,0);
      clip-path: inset(100%);
    }
    #hover-preview {
        display: none;
        position: fixed;
        top: 50%;
        left: 50%;
        transform: translate(-50%, -50%);
        z-index: 100;
        pointer-events: none;
        max-width: 100vw;
        max-height: 100vh;
    }
    #hover-preview img,
    #hover-preview video {
        width: auto;
        height: auto;
        max-width: 100vw;
        max-height: 100vh;
        object-fit: contain;
    }
    #ig-galleryContainer {
        position: fixed;
        top: 0;
        left: 0;
        right: 0;
        bottom: 0;
        background-color: rgba(0, 0, 0, 0.8);
        z-index: 99999;
        display: flex;
        align-items: center;
        justify-content: center;
        padding-bottom: 80px;
    }
    #ig-galleryImage {
        max-width: 90%;
        max-height: calc(100% - 80px - 20px);
        transition: all 0.3s ease;
    }
    #ig-imageCounter {
        position: absolute;
        top: 10px;
        left: 10px;
        color: white;
        font-size: 20px;
        background-color: rgba(0, 0, 0, 0.6);
        padding: 5px 10px;
        border-radius: 5px;
        z-index: 100000;
    }
    .ig-close-button {
        position: fixed;
        top: 0;
        right: 0;
        padding: 0;
        background-color: transparent;
        border: none;
    }
    .ig-close-button:hover {
        background-color: rgba(0, 0, 0, 0.7);
        filter: brightness(85%);
    }
    .ig-nav-button {
        position: fixed;
        background-color: transparent;
        border: none;
        padding: 0;
        width: auto;
        height: auto;
        cursor: pointer;
        display: flex;
        align-items: center;
        justify-content: center;
        z-index: 10001;
        top: 50%;
        transform: translateY(-50%);
    }
    .ig-nav-button:hover {
        background-color: rgba(0, 0, 0, 0.7);
        filter: brightness(85%);
    }
    .ig-nav-button:active {
        background-color: transparent;
    }
    .ig-nav-button.ig-prev-button {
        left: -5px;
        top: 50%;
        transform: translateY(-50%);
    }
    .ig-nav-button.ig-prev-button:active .button-icon {
        transform: scale(0.95);
    }
    .ig-nav-button.ig-next-button {
        right: -5px;
        top: 50%;
        transform: translateY(-50%);
    }
    .ig-nav-button.ig-next-button:active .button-icon {
        transform: scale(0.95);
    }
    #ig-thumbnailBar {
        position: fixed;
        bottom: 0;
        left: 50%;
        right: 0;
        height: 75px;
        transform: translateX(-50%);
        display: flex;
        overflow-x: scroll;
        overflow-y: hidden;
        background-color: rgba(0, 0, 0, 0.6);
        padding: 10px 0;
        white-space: nowrap;
        scrollbar-width: thin;
        scrollbar-color: #444 #282A36;
    }
    #ig-thumbnailBar::-webkit-scrollbar {
        height: 12px;
        background: #282A36;
    }
    #ig-thumbnailBar::-webkit-scrollbar-track {
        background: #282A36;
    }
    #ig-thumbnailBar::-webkit-scrollbar-thumb {
        background-color: #444;
        border-radius: 10px;
        border: 3px solid #282A36;
    }
    #ig-thumbnailBar::-webkit-scrollbar-thumb:hover {
        background: #555;
    }
    .ig-thumbnail {
        height: 60px;
        object-fit: cover;
        margin: 0 5px;
        cursor: pointer;
        transition: transform 0.3s ease, outline 0.3s ease;
    }
    .ig-thumbnail:hover {
        opacity: 0.7;
    }
    .ig-thumbnail.ig-active {
        transform: scale(1.05);
        outline: 3px solid green;
    }
    .ig-download-button {
        position: fixed;
        top: 5px;
        width: 40px;
        height: 40px;
        cursor: pointer;
        display: flex;
        align-items: center;
        justify-content: center;
        border: none;
        padding: 0;
        background-color: transparent;
        transition: background-color 0.3s ease, transform 0.3s ease;
        z-index: 10002;
    }
    .ig-download-button .button-icon {
        width: 100%;
        height: 100%;
        transition: transform 0.3s ease, opacity 0.3s ease;
    }
    .ig-download-button:hover {
        background-color: transparent;
        box-shadow: none;
    }
    .ig-download-button:hover .button-icon {
        transform: scale(1.05);
        opacity: 0.7;
    }
    .ig-download-button:active .button-icon {
        transform: scale(0.95);
    `);

    const prefix = 'ig-';
    let hoveredMediaLink = null;
    let hoveredMediaFilename = null;
    let images = [];
    let currentIndex = 0;
    let galleryContainer, galleryImage, counter, thumbnailBar;
    let loading = false;

    const preview = document.createElement('div');
    preview.id = 'hover-preview';
    document.body.appendChild(preview);

    function togglePostVisibility() {
        const posts = document.querySelectorAll('.post_wrapper');
        posts.forEach(post => {
            const hasImage = post.querySelector('.post_file') !== null;
            if (!hasImage) {
                if(post.getAttribute('data-hidden') === 'true') {
                    post.removeAttribute('data-hidden');
                } else {
                    post.setAttribute('data-hidden', 'true');
                }
            }
        });
    }

    function addPageSpecificClass() {
        const urlPath = window.location.pathname;
        const bodyClass = document.body.classList;

        if(urlPath.includes('/search/')) {
            bodyClass.add('desux-search-page');
        } else if(urlPath.match(/\/\w+\/thread\/\d+/)) {
            bodyClass.add('desux-thread-page');
        }
    }

    function attachHoverPreviewAndDownload() {
        document.querySelectorAll('.thread .thread_image_link, .post_wrapper .thread_image_link').forEach(anchor => {
            anchor.addEventListener('mouseover', function() {
                const href = this.href;
                const isVideo = href.endsWith('.webm') || href.endsWith('.mp4');

                preview.innerHTML = '';
                const media = isVideo ? document.createElement('video') : document.createElement('img');
                media.src = href;
                if (isVideo) {
                    media.autoplay = true;
                    media.loop = true;
                    media.muted = true;
                }
                preview.appendChild(media);
                preview.style.display = 'block';

                const postContainer = this.closest('.post_wrapper') || this.closest('.thread');
                const filenameElement = postContainer.querySelector('.post_file_filename');
                hoveredMediaLink = href;
                hoveredMediaFilename = filenameElement ? (filenameElement.getAttribute('title') || filenameElement.textContent).trim() : getFilenameFromUrl(href);
            });

            anchor.addEventListener('mouseout', function() {
                preview.innerHTML = '';
                preview.style.display = 'none';
                hoveredMediaLink = null;
                hoveredMediaFilename = null;
            });
        });
    }

    function getFilenameFromUrl(url) {
        return url.split('/').pop();
    }

    const closeImage = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAF4AAABICAYAAAB/XULoAAAACXBIWXMAAAUTAAAFEwFaO8pPAAAFyWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgOS4xLWMwMDEgNzkuMTQ2Mjg5OSwgMjAyMy8wNi8yNS0yMDowMTo1NSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDI1LjAgKFdpbmRvd3MpIiB4bXA6Q3JlYXRlRGF0ZT0iMjAyMy0xMi0xOVQxOToyOTo0NC0wNTowMCIgeG1wOk1vZGlmeURhdGU9IjIwMjMtMTItMTlUMTk6NDU6MjgtMDU6MDAiIHhtcDpNZXRhZGF0YURhdGU9IjIwMjMtMTItMTlUMTk6NDU6MjgtMDU6MDAiIGRjOmZvcm1hdD0iaW1hZ2UvcG5nIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjZjZDRlNWExLWM2NjEtOTY0NS1iZmRlLWViNWJmY2ZhNDJhYyIgeG1wTU06RG9jdW1lbnRJRD0iYWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOjY5NzFiYTdjLWMyOTYtYTY0OC1hMTdmLTk2OWU4MDNjMGFkMCIgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOjkyODNiOGUwLTA1YjgtNzA0NS04N2RmLTQyODM5OTdlZDVjMSI+IDx4bXBNTTpIaXN0b3J5PiA8cmRmOlNlcT4gPHJkZjpsaSBzdEV2dDphY3Rpb249ImNyZWF0ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6OTI4M2I4ZTAtMDViOC03MDQ1LTg3ZGYtNDI4Mzk5N2VkNWMxIiBzdEV2dDp3aGVuPSIyMDIzLTEyLTE5VDE5OjI5OjQ0LTA1OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgMjUuMCAoV2luZG93cykiLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjZjZDRlNWExLWM2NjEtOTY0NS1iZmRlLWViNWJmY2ZhNDJhYyIgc3RFdnQ6d2hlbj0iMjAyMy0xMi0xOVQxOTo0NToyOC0wNTowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDI1LjAgKFdpbmRvd3MpIiBzdEV2dDpjaGFuZ2VkPSIvIi8+IDwvcmRmOlNlcT4gPC94bXBNTTpIaXN0b3J5PiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PictGGQAAAKGSURBVHja7dq7bhpBGIZhykhRuqQKx3g5RGJdYEEkEHdBgUCicwsdQtBAQcX5KKCAzpeARAMIEA2UblLkBiIlkm/Af2YtrxUCtgdEdhbzFa9kI3uLh9Hs7OwYjKYLQtpnAALgAY8AD3gEeMAjwAMeAR7wCPCABzwQAA94BHjAI8ADHgEe8EdKsrsplUpRuVymaDRKJrN00HUczkvKZDJUKpUoFAqxzyTAP5cse2g0GtF6vX6qUqmQ2WLf6zpXV14aj8cb18nn8wd/iW8a3u3eRldrNptksTq4ruPxbKOrFQoFhm8HvJrty1caDoc7sdSq1eqrI9/r9dFkMnnxOolEAvBqkUjkRSy1Vqv17MjfNb3saj6fC51ydAUfi8W44JXq9Tob+Zv4Pt+3V0e62nK5FDrd6Are7pC54ZQajcYTvoI+nU65/zebzWKq+btAIPAwDfACtttt8vv9e31h/X6frDYX4P8tGAzSYrHghlytVtx/2+v12P3BieXksUY+/0h34gFKS/xut8v9DIC9miPhdzodXaGfzCaZcvM8FF+P6Ce1O6ngz2azN4F+cvD7jnrAC5znMdUIvLnqbUVzVstJPa3hz/QBygV4bBmc2SbZYDDAJpmobeFcLgd4vAgRXDgc5kKr1Wpb6Pvi49Xfxstul2Yvu+PxOKYaMcc7JMDjQJPOjvAlk8mHo3fKsY/Dj/DJlE6nqVgs4ggfAjzgAY8AD3gEeMAjwAMeAf4U4O8BIQb+NyDEwH8HhBj4G0CIgb8GhAB4s8Xxgf1wBwyN4YnI8Nl4UQKGAHirzfme/fIDIBrDK5nMksw++AUUjeEf8S/ZtHMLGI3hlT5+Mr57XOlMWT+B9H/6A1c1rQ/ztPCSAAAAAElFTkSuQmCC';
    const downloadImage = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAcwAAAHMCAYAAABY25iGAAAACXBIWXMAAAsTAAALEwEAmpwYAAAHpGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgOS4xLWMwMDEgNzkuMTQ2Mjg5OSwgMjAyMy8wNi8yNS0yMDowMTo1NSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyNS4wIChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjMtMTItMTlUMjA6Mzc6MzUtMDU6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIzLTEyLTIwVDAwOjQzOjQ1LTA1OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIzLTEyLTIwVDAwOjQzOjQ1LTA1OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDozNTA1ZGNlYS03NjNiLTc1NDItOTE0Ni0xMDU5NjZiY2M4MWIiIHhtcE1NOkRvY3VtZW50SUQ9ImFkb2JlOmRvY2lkOnBob3Rvc2hvcDplZjg1NDliMy0zMmE3LTQyNDItOGExOS02Y2NjODQ3NTJjZjYiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo1YmQ3NDVmMy1jMDA4LWNlNGEtYWQ2OS00NjE1YzU0N2VkMDEiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjViZDc0NWYzLWMwMDgtY2U0YS1hZDY5LTQ2MTVjNTQ3ZWQwMSIgc3RFdnQ6d2hlbj0iMjAyMy0xMi0xOVQyMDozNzozNS0wNTowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDI1LjAgKFdpbmRvd3MpIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDozN2VhNjE1OS1lOGQzLWNmNDktYTk2My1lNTdhNDI2NTg2NDEiIHN0RXZ0OndoZW49IjIwMjMtMTItMTlUMjA6NDI6MzMtMDU6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCAyNS4wIChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6MzUwNWRjZWEtNzYzYi03NTQyLTkxNDYtMTA1OTY2YmNjODFiIiBzdEV2dDp3aGVuPSIyMDIzLTEyLTIwVDAwOjQzOjQ1LTA1OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgMjUuMCAoV2luZG93cykiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPC9yZGY6U2VxPiA8L3htcE1NOkhpc3Rvcnk+IDx4bXBNTTpJbmdyZWRpZW50cz4gPHJkZjpCYWc+IDxyZGY6bGkgc3RSZWY6bGlua0Zvcm09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';
    const navigateLeftImage = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAF4AAABsCAYAAADjYAXIAAAACXBIWXMAAAUTAAAFEwFaO8pPAAAFyWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgOS4xLWMwMDEgNzkuMTQ2Mjg5OSwgMjAyMy8wNi8yNS0yMDowMTo1NSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDI1LjAgKFdpbmRvd3MpIiB4bXA6Q3JlYXRlRGF0ZT0iMjAyMy0xMi0xOVQxOToyOTo1MS0wNTowMCIgeG1wOk1vZGlmeURhdGU9IjIwMjMtMTItMTlUMTk6NDQ6MTAtMDU6MDAiIHhtcDpNZXRhZGF0YURhdGU9IjIwMjMtMTItMTlUMTk6NDQ6MTAtMDU6MDAiIGRjOmZvcm1hdD0iaW1hZ2UvcG5nIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmE5N2IxMWQ1LWE0NTctZjg0Yy1iOWNiLTJkYWNjNzQ4NzY5ZCIgeG1wTU06RG9jdW1lbnRJRD0i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';
    const navigateRightImage = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAF4AAABsCAYAAADjYAXIAAAACXBIWXMAAAUTAAAFEwFaO8pPAAAFyWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgOS4xLWMwMDEgNzkuMTQ2Mjg5OSwgMjAyMy8wNi8yNS0yMDowMTo1NSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDI1LjAgKFdpbmRvd3MpIiB4bXA6Q3JlYXRlRGF0ZT0iMjAyMy0xMi0xOVQxOToyOTo1MS0wNTowMCIgeG1wOk1vZGlmeURhdGU9IjIwMjMtMTItMTlUMTk6NDI6NDQtMDU6MDAiIHhtcDpNZXRhZGF0YURhdGU9IjIwMjMtMTItMTlUMTk6NDI6NDQtMDU6MDAiIGRjOmZvcm1hdD0iaW1hZ2UvcG5nIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmFkY2I5Y2I0LWZmZmYtNzk0Mi1hM2U4LWYxOTcwYTZmM2M0NSIgeG1wTU06RG9jdW1lbnRJRD0i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';

    function collectMediaItems() {
        const mediaLinks = document.querySelectorAll('.thread .thread_image_link, .post_wrapper .thread_image_link');
        mediaLinks.forEach((mediaLink) => {
            const postWrapper = mediaLink.closest('.post_wrapper, .thread');
            if (postWrapper) {
                const isVideo = mediaLink.href.endsWith('.webm');
                const thumbnail = mediaLink.querySelector('img').src;

                const postLink = postWrapper.querySelector('a[data-function="quote"]');
                const postId = postLink ? postLink.getAttribute('data-post') : postWrapper.id;

                images.push({
                    src: mediaLink.href,
                    isVideo,
                    thumbnail,
                    postId
                });
            }
        });
    }

    function getCurrentPageNumber() {
        const matches = window.location.pathname.match(/page\/(\d+)/);
        const pageNumber = matches ? parseInt(matches[1], 10) : 1;
        // console.log('Current page number:', pageNumber);
        return pageNumber;
    }

    let currentPageNumber = getCurrentPageNumber();

    if (window.location.pathname.includes('/search/')) {
        $('#footer').hide();
    }

    function loadMoreContent() {
        if (loading || !window.location.pathname.includes('/search/')) return;
        loading = true;
        // console.log('Loading more content...');

        const nextPageUrl = constructNextPageUrl(currentPageNumber);
        // console.log('Next page URL:', nextPageUrl);

        $.ajax({
            url: nextPageUrl,
            type: 'GET',
            success: function(response) {
                // console.log('Content loaded successfully');
                const $response = $(response);
                $response.find('article.backlink_container, section.section_title, h3.section_title, div.paginate').remove();
                const newContent = $response.find('.thread').parent();

                if (newContent.length === 0) {
                    // console.log('No more content to load');
                    $('#footer').show();
                    loading = false;
                    return;
                }

                $('.thread').last().parent().append(newContent.html());

                attachHoverPreviewAndDownload();
                collectMediaItems();

                currentPageNumber++;
                loading = false;
            },
            error: function(xhr, status, error) {
                // console.error('Error loading content:', status, error);
                loading = false;
            }
        });
    }

    function constructNextPageUrl(currentPageNumber) {
        let basePath = window.location.href;
        let nextPageNumber = currentPageNumber + 1;

        // console.log('Constructing URL for page:', nextPageNumber);

        if (basePath.includes('/page/')) {
            basePath = basePath.replace(/\/page\/\d+/, `/page/${nextPageNumber}`);
        } else {
            if (!basePath.endsWith('/')) {
                basePath += '/';
            }
            basePath += `page/${nextPageNumber}/`;
        }
        // console.log('Next page URL:', basePath);
        return basePath;
    }

    function createGallery() {
        if (galleryContainer) {
            galleryContainer.remove();
            galleryContainer = null;
            return;
        }

        galleryContainer = GM_addElement(document.body, 'div', { id: prefix + 'galleryContainer' });
        galleryImage = GM_addElement(galleryContainer, 'img', { id: prefix + 'galleryImage' });
        counter = GM_addElement(galleryContainer, 'div', { id: prefix + 'imageCounter' });

        const closeButton = createButton(closeImage, closeGallery, prefix + 'close-button');
        const downloadButton = createButton(downloadImage, downloadCurrentMedia, prefix + 'download-button');
        const nextButton = createButton(navigateRightImage, () => navigateGallery(1), prefix + 'nav-button', prefix + 'next-button');
        const prevButton = createButton(navigateLeftImage, () => navigateGallery(-1), prefix + 'nav-button', prefix + 'prev-button');

        thumbnailBar = GM_addElement(galleryContainer, 'div', { id: prefix + 'thumbnailBar' });
        images.forEach((media, index) => {
            const thumb = GM_addElement(thumbnailBar, 'img', {
                src: media.thumbnail,
                class: prefix + 'thumbnail'
            });
            thumb.addEventListener('click', () => {
                currentIndex = index;
                updateGallery();
            });
        });

        galleryContainer.append(counter, closeButton, downloadButton, nextButton, prevButton, thumbnailBar);
        updateGallery();
    }

    function createButton(base64Image, onClick, ...classes) {
        const button = GM_addElement(document.body, 'button', { class: classes.join(' ') });
        button.addEventListener('click', onClick);

        GM_addElement(button, 'img', {
            src: base64Image,
            class: 'button-icon'
        });

        return button;
    }

    function navigateGallery(direction) {
        const totalImages = images.length;
        currentIndex = (currentIndex + direction + totalImages) % totalImages;
        updateGallery();
    }

    function closeGallery() {
        if (galleryContainer) {
            galleryContainer.remove();
            galleryContainer = null;
        }
    }

    function updateGallery() {
        if (images.length > 0 && galleryContainer) {
            const currentMedia = images[currentIndex];

            if (galleryContainer.contains(galleryImage)) {
                galleryContainer.removeChild(galleryImage);
            }

            galleryImage = currentMedia.isVideo ? GM_addElement(galleryContainer, 'video', { id: prefix + 'galleryImage', controls: true, autoplay: true, loop: true, muted: true }) : GM_addElement(galleryContainer, 'img', { id: prefix + 'galleryImage' });
            galleryImage.src = currentMedia.src;

            counter.textContent = `${currentIndex + 1}/${images.length}`;
            updateThumbnails();
        }
    }

    function updateThumbnails() {
        const thumbnails = Array.from(thumbnailBar.children);
        thumbnails.forEach((thumb, index) => {
            thumb.classList.toggle(prefix + 'active', index === currentIndex);
        });

        const selectedThumbnail = thumbnails[currentIndex];
        thumbnailBar.scrollLeft = selectedThumbnail.offsetLeft - thumbnailBar.offsetWidth / 2 + selectedThumbnail.offsetWidth / 2;
    }

    function getOriginalFilename(postId) {
        let postElement = document.querySelector(`.thread[id="${postId}"]`);
        let filenameLink;

        if (postElement) {
            filenameLink = postElement.querySelector('.post_file_filename');
        } else {
            postElement = document.querySelector(`.post_wrapper a[data-function="quote"][data-post="${postId}"]`);
            const postWrapperParent = postElement ? postElement.closest('.post_wrapper') : null;
            filenameLink = postWrapperParent ? postWrapperParent.querySelector('.post_file_filename') : null;
        }

        if (filenameLink) {
            if (filenameLink.getAttribute('title')) {
                return filenameLink.getAttribute('title').trim();
            } else if (filenameLink.textContent) {
                return filenameLink.textContent.trim();
            }
        }

        const currentMedia = images.find(img => img.postId === postId);
        if (currentMedia && currentMedia.src) {
            const urlParts = currentMedia.src.split('.');
            const ext = urlParts[urlParts.length - 1];
            return `default-filename.${ext}`;
        }

        return "default-filename";
    }

    function downloadCurrentMedia() {
        const currentMedia = images[currentIndex];
        let postId = currentMedia.postId;
        if (!postId || postId === document.querySelector('.thread').id) {
            postId = document.querySelector('.thread').id;
        }

        const originalFilename = getOriginalFilename(postId);
        GM_xmlhttpRequest({
            method: 'GET',
            url: currentMedia.src,
            responseType: 'blob',
            onload: function(response) {
                saveBlob(response.response, originalFilename);
            },
            onerror: function(error) {
                console.error('Error downloading file:', error);
            }
        });
    }

    function saveBlob(blob, filename) {
        const a = GM_addElement(document.body, "a", { href: window.URL.createObjectURL(blob), download: filename });
        a.click();
        document.body.removeChild(a);
    }

    document.addEventListener('keydown', function(e) {
    if (e.key.toLowerCase() === 's' && !/input|textarea/i.test(document.activeElement.tagName)) {
        e.preventDefault();
        if (galleryContainer && galleryContainer.style.display !== 'none') {
            downloadCurrentMedia();
        } else if (hoveredMediaLink) {
            GM_xmlhttpRequest({
                method: 'GET',
                url: hoveredMediaLink,
                responseType: 'blob',
                onload: function(response) {
                    const blobUrl = URL.createObjectURL(response.response);
                    const downloadLink = document.createElement('a');
                    downloadLink.href = blobUrl;
                    downloadLink.download = hoveredMediaFilename || 'download';
                    document.body.appendChild(downloadLink);
                    downloadLink.click();
                    document.body.removeChild(downloadLink);
                    URL.revokeObjectURL(blobUrl);
                },
                onerror: function() {
                    alert('Download failed.');
                }
            });
        }
    }

    if (e.altKey && e.key.toLowerCase() === 'g') {
        if (!images.length) collectMediaItems();
        createGallery();
    }

    if (e.key === 'Escape' && galleryContainer && galleryContainer.style.display !== 'none') {
        closeGallery();
    }

    if (galleryContainer && galleryContainer.style.display !== 'none') {
        if (e.key === 'ArrowRight') {
            navigateGallery(1);
        } else if (e.key === 'ArrowLeft') {
            navigateGallery(-1);
        }
    }
      
    if ((e.key === 'F' || e.key === 'f') && !e.ctrlKey && !e.altKey && !e.metaKey && !e.shiftKey &&
        e.target.tagName !== 'INPUT' && e.target.tagName !== 'TEXTAREA' &&
        /https:\/\/desuarchive\.org\/.*\/thread\/.*/.test(window.location.href)) {

        togglePostVisibility();
        e.preventDefault();
    }
    });

    window.addEventListener('scroll', function() {
        if (window.location.pathname.includes('/search/') && window.scrollY + window.innerHeight >= document.body.scrollHeight - 90) {
            loadMoreContent();
        }
    });

    addPageSpecificClass();
    attachHoverPreviewAndDownload();
    collectMediaItems();
})();