GGn SteamDB OST Uploady NEW

Uploady for SteamDB OSTs

// ==UserScript==
// @name         GGn SteamDB OST Uploady NEW
// @version      0.0.1
// @include      https://gazellegames.net/upload.php*
// @include      https://gazellegames.net/torrents.php?action=editgroup&groupid=*
// @require      https://code.jquery.com/jquery-3.4.1.min.js
// @description  Uploady for SteamDB OSTs
// @author       Wealth
// @require      https://greasemonkey.github.io/gm4-polyfill/gm4-polyfill.js
// @grant        GM_xmlhttpRequest
// @grant        GM.xmlHttpRequest
// @grant        GM_addStyle
// @grant        GM.addStyle
// @namespace https://gf.qytechs.cn/users/1395131
// ==/UserScript==
/* globals $ */


(function () {
    'use strict';

    function fetchSteampage(appid) {
        const url = `https://store.steampowered.com/app/${appid}/`;

        GM_xmlhttpRequest({
            method: 'GET',
            url: url,
            onload: function (response) {
                if (response.status === 200) {
                    console.log("Got steam page.");
                    const parser = new DOMParser();
                    const doc = parser.parseFromString(response.responseText, 'text/html');

                    const appName = doc.querySelector("#appHubAppName")?.textContent?.trim(); // OST Name

                    const album_metadata = parseHTMLTable(doc.querySelector(".album_metadata_table"));
                    const artist_row = album_metadata.find(row => row[0].toLowerCase().includes("artist"));
                    const artist = artist_row ? artist_row[1] : "N/A"; // Artist Name

                    const release_date = doc.querySelector(".release_date .date")?.textContent?.trim(); // Release date

                    const app_details = parseDetails(doc.querySelector('#genresAndManufacturer')); // App Details

                    const tracklist_content = doc.querySelector(".music_album_track_list_contents");
                    const discs = tracklist_content.querySelectorAll(".music_album_track_listing_ctn");
                    let tracklist = "[align=center][u][b]Tracklist[/align]\n"; // track list
                    let total_length = 0;
                    for (let i = 0; i < discs.length; i++) {
                        if (discs.length > 1) {
                            tracklist += "[b]Disc " + Number(i+1) + "[/b]\n";
                        }
                        const tracks = discs[i].querySelectorAll(".music_album_track_ctn");
                        tracks.forEach((track) => {
                            let length = track.querySelector('.music_album_track_duration')?.textContent?.trim();
                            tracklist += "[#] " + track.querySelector('.music_album_track_name')?.textContent?.trim() + " [i](" + length + ")[/i]\n";
                            const [minute, second] = length.split(":").map(Number);
                            total_length += minute * 60 + second
                        });
                    }
                    const minutes = Math.floor(total_length/60);
                    const seconds = String(total_length % 60).padStart(2, '0');
                    tracklist += "[b]Total length[/b]: " + minutes + ":" + seconds;

                    setTitle(appName + " by " + artist);
                    setReleaseYear(release_date.split(", ")[1]);
                    //setCover(tbd);
                    let description = "[align=center][u][b]" + appName + "[/b]\n";
                    description += "[i][size=1]by[/i] [b]" + artist + "[/b][/align]\n\n"
                    description += "[*][b]Catalog Number[/b]: N/A\n";
                    description += "[*][b]Release date[/b]: " + release_date + "\n";
                    album_metadata.forEach((row) => {
                        description += "[*][b]" + row[0] + "[/b]: " + row[1] + "\n";
                    });
                    Object.keys(app_details).forEach((key) => {
                        if (!key.includes("Developer")) {
                            description += "[*][b]" + key + "[/b]: " + app_details[key] + "\n";
                        }
                    });
                    description += "\n" + tracklist;
                    setDescription(description);
                }
            }
        });
    }

    function parseDetails(details) {
        let app_details = [];
        details.querySelectorAll('.dev_row').forEach((row) => {
            let [header, value] = row.innerText.split(":");
            header = header.toLowerCase().trim();
            app_details[header.charAt(0).toUpperCase() + header.substring(1)] = value.trim();
        });
        return app_details;
    }

    function parseHTMLTable(table) {
        const rows = Array.from(table.rows);
        if (rows.length === 0) {
            console.error('Table has no rows');
            return [];
        }
        const headers = Array.from(rows).map(cell => cell.childNodes[1].textContent.trim().replace(":", ""));
        const data = Array.from(rows).map(cell => cell.childNodes[3].textContent.trim());

        return headers.map(function(e, i) { return [e, data[i]]; });
    }

    function setTitle(title) {
        document.querySelector('#title').value = title;
    }

    function setReleaseYear(year) {
        document.querySelector("#year").value = year;
    }

    function setCover(cover) {
        document.querySelector("#image").value = cover;
    }

    function setDescription(description) {
        document.querySelector("#album_desc").value = description;
    }

    function setup() {
        const input = document.createElement('input');
        input.type = 'text';
        input.placeholder = 'Steam appid';
        input.id = 'steamid';
        document.querySelector("#torrent_type td:has(select)").appendChild(input);

        input.addEventListener('blur', () => {
            const value = input.value.trim();
            if (value) {
                fetchSteampage(value);
            }
        });
    }

    const selector = document.querySelector('#categories');
    if (selector.value === "OST") {
        setup();
    } else {
        selector.addEventListener("change", function() {
            if (this.value === "OST") {
                setup();
            }
        });
    }
})();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址