Bunkr Name Saver

Сохраняет названия всех медиа в файл media.txt (фикс для новой структуры имен)

// ==UserScript==
// @name         Bunkr Name Saver
// @namespace    https://github.com/darhanger
// @version      1.2
// @description  Сохраняет названия всех медиа в файл media.txt (фикс для новой структуры имен)
// @author       YourName
// @include      *://bunkr*/a/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=bunkr.is
// @license      MIT
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    const NAME_SELECTOR = '.theName'; // Селектор для элемента с именем файла

    function getBrowserLanguage() {
        return (navigator.language || navigator.userLanguage).split('-')[0];
    }

    function logMessage(messageRu, messageEn) {
        console.log(getBrowserLanguage() === 'ru' ? messageRu : messageEn);
    }

    function collectMediaNames() {
        return Array.from(document.querySelectorAll(NAME_SELECTOR)).map(nameElement => {
            let fileName = nameElement.textContent
                .trim()
                .replace(/[\\/:*?"<>|]/g, '') // Удаляем запрещенные символы
                .replace(/\s+/g, ' '); // Исправляем множественные пробелы

            // Добавляем расширение файла, если отсутствует
            if (!fileName.includes('.')) {
                const parentLink = nameElement.closest('[href]');
                if (parentLink) {
                    const url = new URL(parentLink.href);
                    const extension = url.pathname.split('.').pop();
                    fileName += `.${extension}`;
                }
            }

            return fileName;
        });
    }

    function downloadMediaTxt() {
        const mediaNames = collectMediaNames();

        if (!mediaNames.length) {
            logMessage("❌ Медиа-файлы не найдены!", "❌ No media files found!");
            return;
        }

        const text = mediaNames.join('\n');
        const blob = new Blob([text], { type: 'text/plain' });
        const url = URL.createObjectURL(blob);

        const a = document.createElement('a');
        a.href = url;
        a.download = 'media.txt';
        document.body.appendChild(a);
        a.click();

        setTimeout(() => {
            document.body.removeChild(a);
            URL.revokeObjectURL(url);
        }, 100);
    }

    function createDownloadButton() {
        const btn = document.createElement('button');
        btn.innerHTML = '💾 Save Media List';
        btn.style = `
            padding: 8px 15px;
            background: #1B2533;
            color: white;
            border: none;
            border-radius: 8px;
            cursor: pointer;
            margin-right: 10px;
            font-size: 14px;
        `;

        btn.onclick = () => {
            logMessage("⏳ Собираем названия...", "⏳ Collecting names...");
            setTimeout(downloadMediaTxt, 500);
        };

        const container = document.querySelector('.flex.items-center.w-full.md\\:w-auto.gap-4');
        container?.insertBefore(btn, container.firstChild);
    }

    logMessage("Bunkr Media Saver 1.2 запущен!", "Bunkr Media Saver 1.2 started!");
    createDownloadButton();
})();