GGn Get Languages From Steam

Easily get languages from Steam. Edited from "GGn Steam Language BBCode quick copy".

目前為 2023-11-13 提交的版本,檢視 最新版本

// ==UserScript==
// @name         GGn Get Languages From Steam
// @namespace    https://gf.qytechs.cn/
// @version      1
// @description  Easily get languages from Steam. Edited from "GGn Steam Language BBCode quick copy".
// @author       lucianjp, ingts
// @match        https://gazellegames.net/torrents.php?action=editgroup*
// @match        https://gazellegames.net/torrents.php?id=*
// @match        https://gazellegames.net/upload.php*
// @match        https://store.steampowered.com/app/*
// @grant        GM_xmlhttpRequest
// @grant        GM_setClipboard
// @grant        GM_setValue
// @grant        GM_getValue
// @grant        GM_deleteValue
// @connect      store.steampowered.com
// ==/UserScript==
const text_only = true
const auto_get = true

if (window.location.hostname === 'store.steampowered.com')
    steamButton();
if (location.href.includes('action=editgroup'))
    ggnButton_edit();
if (location.href.endsWith('upload.php') && GM_getValue('steam', null))
    GM_deleteValue('steam')

if (auto_get && location.href.includes('torrents.php?id=')) {
    GM_deleteValue('steam')
    const steamLink = document.querySelector('a[title=Steam]')
    if (steamLink)
        GM_setValue('steam', /\d+/.exec(steamLink.href)[0])
}

const langSelect = document.getElementById('language')
if (location.href.includes('upload')) {
    ggn_upload()
}

function steamButton() {
    const $btn = document.createElement('a');
    const text = 'Copy BBCode';
    $btn.classList.add('btnv6_blue_hoverfade', 'btn_small');
    const $text = $btn.appendChild(document.createElement('span'));
    $text.innerHTML = `${text}<img src="https://ptpimg.me/sx226x.png">`;
    $btn.addEventListener('click', function () {
        GM_setClipboard(parseSteamLanguage(document), 'text');
        $text.childNodes[0].nodeValue = 'copied';
        setTimeout(function () {
            $text.childNodes[0].nodeValue = text;
        }, 3000);
    });

    const $container = document.querySelector('table.game_language_options').closest('.block').querySelector('.block_title') || document.querySelector('#LanguagesHeader');
    $container.style = 'display: flex;justify-content: space-between;align-items: center;';
    $container.appendChild($btn);
}

function ggnButton_edit() {
    const $steamuri = document.querySelector('#steamuri');
    const $quickcopy = document.createElement('button');
    $quickcopy.innerHTML = 'BBCode Languages';
    $quickcopy.addEventListener('click', async function (event) {
        event.preventDefault();
        event.stopImmediatePropagation();

        if (!$steamuri.value) return;

        const bbcode = await getSteamLanguages($steamuri.value);
        if (bbcode) {
            GM_setClipboard(await getSteamLanguages($steamuri.value), 'text');
            noty({
                text: 'Steam languages copied to clipboard',
                timeout: 3500
            });
        }
    });
    $steamuri.parentNode.insertBefore($quickcopy, $steamuri.nextSibling);
}

function ggn_upload() {
    let input = document.createElement('input')
    input.type = 'text'
    input.placeholder = "Steam Link or ID"
    langSelect.after(input)
    input.onblur = () => {
        getSteamLanguages(input.value.includes('store.steampowered') ? input.value : `https://store.steampowered.com/app/${input.value}`, true)
    }
    if (auto_get) {
        const savedID = GM_getValue('steam', null)
        if (savedID) {
            input.value = savedID
            input.dispatchEvent(new Event('blur'))
            GM_deleteValue('steam')
        }
    }
}

function getSteamLanguages(url, upload) {
    return new Promise((resolve, reject) => {
        if (url) {
            GM_xmlhttpRequest({
                url: url,
                method: 'GET',
                onload: function (response) {
                    if (response.readyState === 4 && response.status === 200) {
                        const $document = new DOMParser().parseFromString(response.responseText, "text/html");
                        resolve(parseSteamLanguage($document, upload));
                    }
                }
            });
        } else {
            reject();
        }
    });
}

function parseSteamLanguage($document, upload) {
    let table = $document.querySelector('table.game_language_options');
    if (!table) return;
    let languages = {};
    for (let r = 0; r < table.rows.length; r++) {
        for (let c = 0; c < table.rows[r].cells.length; c++) {
            if (table.rows[r].cells[c].textContent.trim() === '✔') {
                let header = table.rows[0].cells[c].textContent.trim();
                if (!languages[header]) {
                    languages[header] = [];
                }
                languages[header].push(table.rows[r].cells[0].textContent.trim());
            }
        }
    }
    if (text_only) delete languages['Full Audio']
    const textLanguages = languages['Subtitles'] ? languages['Subtitles'] : languages['Interface']
    const audioLanguages = languages['Full Audio'];
    const textMulti = textLanguages.length > 1 ? 's' : '';
    const audioMulti = audioLanguages && audioLanguages.length > 1 ? 's' : '';
    const joinedText = textLanguages.join(', ');
    const joinedAudio = audioLanguages && audioLanguages.join(', ');

    if (upload) {
        const languageList = [
            'English',
            'German',
            'French',
            'Czech',
            'Italian',
            'Japanese',
            'Korean',
            'Polish',
            'Portuguese',
            'Russian',
            'Spanish',
        ]
        const desc = document.getElementById('release_desc')
        const inLangList = !textMulti && languageList.some(lang => textLanguages[0].includes(lang))

        let langSelectValue = textMulti ? 'Multi-Language' : inLangList ? textLanguages[0] : 'Other'
        let descValue;

        if (!textMulti && textLanguages[0].includes('Chinese')) {
            langSelectValue = 'Chinese';
            descValue = audioLanguages && areSame(textLanguages, audioLanguages)
                ? `[b]Text and Audio Language${textMulti}[/b]: ${joinedText}`
                : audioLanguages
                    ? `[b]Text Language[/b]: ${joinedAudio}\n[b]Audio Language${audioMulti}[/b]: ${joinedAudio}`
                    : `[b]Language[/b]: ${joinedText}`;
        } else if (audioLanguages && areSame(textLanguages, audioLanguages)) {
            descValue = `[b]Text and Audio Language${textMulti}[/b]: ${joinedText}`;
        } else {
            const addText = textMulti ? `[b]Languages[/b]: ${joinedText}` : '';
            descValue = audioLanguages
                ? `${addText ? 'Text ' + addText + '\n' : ''}[b]Audio Language${audioMulti}[/b]: ${joinedAudio}`
                : addText;
        }

        langSelect.value = langSelectValue;
        desc.value += descValue;
        return
    }

    if (audioLanguages) {
        if (areSame(textLanguages, audioLanguages))
            return `Text and Audio Language${textMulti}: ${joinedText}`
        return `[b]Text Language${textMulti}[/b]: ${joinedText}\n[b]Audio Language${audioMulti}[/b]: ${joinedAudio}`
    }
    return `[b]Language${textMulti}[/b]: ${joinedText}`
}

function areSame(array1, array2) {
    return array1.length === array2.length && array1.sort().every((value, index) => value === array2.sort()[index])
}

QingJ © 2025

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