GGn SteamDB OST Uploady NEW

Uploady for SteamDB OSTs

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==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://greasyfork.org/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();
            }
        });
    }
})();