Greasy Fork is available in English.

ექსპორტი Steam ოჯახის თამაშები

ამატებს ღილაკს Steam ოჯახის ბიბლიოთეკის TSV ფორმატში ექსპორტისთვის

სკრიპტის ინსტალაცია?
ავტორის შემოთავაზებული სკრიპტი

შეიძლება მოგეწონოს ექსპორტი Steam-ის სავაჭრო ისტორია.

სკრიპტის ინსტალაცია
// ==UserScript==
// @name                Export Steam Family Games
// @name:bg             Експортиране на Steam семейни игри
// @name:cs             Exportovat Steam rodinné hry
// @name:da             Eksporter Steam familie spil
// @name:de             Steam-Familienbibliothek exportieren
// @name:el             Εξαγωγή παιχνιδιών οικογένειας Steam
// @name:en             Export Steam Family Games
// @name:eo             Eksporti Steam Familio Ludojn
// @name:es             Exportar Biblioteca Familiar de Steam
// @name:es-la          Exportar Biblioteca Familiar de Steam
// @name:es-419         Exportar Biblioteca Familiar de Steam
// @name:fi             Vie Steam-perhepelit
// @name:fr             Exporter les Jeux de la Famille Steam
// @name:fr-CA          Exporter les Jeux de la Famille Steam
// @name:he             ייצוא משחקי משפחה של Steam
// @name:hr             Izvoz Steam obiteljskih igara
// @name:hu             Steam családi játékok exportálása
// @name:id             Ekspor Game Keluarga Steam
// @name:it             Esporta Giochi della Famiglia Steam
// @name:ja             Steamファミリーゲームをエクスポート
// @name:ka             ექსპორტი Steam ოჯახის თამაშები
// @name:ko             Steam 가족 게임 내보내기
// @name:nb             Eksporter Steam familie spill
// @name:nl             Exporteer Steam familie spellen
// @name:pl             Eksportuj gry rodzinne Steam
// @name:pt-BR          Exportar Jogos da Família Steam
// @name:ro             Exportă jocurile de familie Steam
// @name:sv             Exportera Steam familjespel
// @name:th             ส่งออกเกมครอบครัว Steam
// @name:tr             Steam Aile Oyunlarını Dışa Aktar
// @name:ug             Steam ئائىلە ئويۇنلىرىنى ئېكسپورت قىلىش
// @name:uk             Експортувати сімейні ігри Steam
// @name:vi             Xuất trò chơi gia đình Steam
// @name:zh-TW          匯出 Steam 家庭遊戲
// @namespace           https://jlcareglio.github.io/
// @version             1.0.11
// @description         Adds a button to export Steam Family Library as TSV
// @description:bg      Добавя бутон за експортиране на Steam семейната библиотека като TSV
// @description:cs      Přidá tlačítko pro exportování rodinné knihovny Steam jako TSV
// @description:da      Tilføjer en knap til at eksportere Steam-familiebiblioteket som TSV
// @description:de      Fügt eine Schaltfläche hinzu, um die Steam-Familienbibliothek als TSV zu exportieren
// @description:el      Προσθέτει ένα κουμπί για την εξαγωγή της οικογενειακής βιβλιοθήκης Steam ως TSV
// @description:en      Adds a button to export Steam Family Library as TSV
// @description:eo      Aldonas butonon por eksporti Steam Familio Bibliotekon kiel TSV
// @description:es      Agrega un botón para exportar como TSV la biblioteca familiar de Steam
// @description:es-la   Agrega un botón para exportar como TSV la biblioteca familiar de Steam
// @description:es-419  Agrega un botón para exportar como TSV la biblioteca familiar de Steam
// @description:fi      Lisää painikkeen Steam-perhekirjaston viemiseksi TSV-muodossa
// @description:fr      Ajoute un bouton pour exporter la Bibliothèque Familiale Steam en TSV
// @description:fr-CA   Ajoute un bouton pour exporter la Bibliothèque Familiale Steam en TSV
// @description:he      מוסיף כפתור לייצוא ספריית המשפחה של Steam כ-TSV
// @description:hr      Dodaje gumb za izvoz Steam obiteljske biblioteke kao TSV
// @description:hu      Hozzáad egy gombot a Steam családi könyvtár TSV formátumban történő exportálásához
// @description:id      Menambahkan tombol untuk mengekspor Perpustakaan Keluarga Steam sebagai TSV
// @description:it      Aggiunge un pulsante per esportare la Libreria Familiare di Steam come TSV
// @description:ja      SteamファミリーライブラリをTSVとしてエクスポートするボタンを追加
// @description:ka      ამატებს ღილაკს Steam ოჯახის ბიბლიოთეკის TSV ფორმატში ექსპორტისთვის
// @description:ko      Steam 가족 라이브러리를 TSV로 내보내는 버튼을 추가합니다
// @description:nb      Legger til en knapp for å eksportere Steam-familiebiblioteket som TSV
// @description:nl      Voegt een knop toe om de Steam-familiebibliotheek als TSV te exporteren
// @description:pl      Dodaje przycisk do eksportowania biblioteki rodzinnej Steam jako TSV
// @description:pt-BR   Adiciona um botão para exportar a Biblioteca da Família Steam como TSV
// @description:ro      Adaugă un buton pentru a exporta biblioteca de familie Steam ca TSV
// @description:sv      Lägger till en knapp för att exportera Steam-familjebiblioteket som TSV
// @description:th      เพิ่มปุ่มเพื่อส่งออกคลังครอบครัว Steam เป็น TSV
// @description:tr      Steam Aile Kitaplığını TSV olarak dışa aktarmak için bir düğme ekler
// @description:uk      Додає кнопку для експорту сімейної бібліотеки Steam у форматі TSV
// @description:ug      Steam ئائىلە ئويۇنلىرىنى TSV شەكلىدە ئېكسپورت قىلىش ئۈچۈن كۇنۇپكا قوشىدۇ
// @description:vi      Thêm nút để xuất Thư viện Gia đình Steam dưới dạng TSV
// @description:zh-TW   添加按鈕以 TSV 格式匯出 Steam 家庭遊戲庫
// @icon                https://www.google.com/s2/favicons?sz=64&domain=store.steampowered.com
// @grant               none
// @author              Jesús Lautaro Careglio Albornoz
// @source              https://gist.githubusercontent.com/JLCareglio/6366b1367428baae04151dfef6ceae47/raw/01_Export-Steam-Family-Games.user.js
// @match               *://store.steampowered.com/account/familymanagement*
// @license             MIT
// @compatible          firefox
// @compatible          chrome
// @compatible          opera
// @compatible          safari
// @compatible          edge
// @compatible          brave
// @supportURL          https://gist.github.com/JLCareglio/6366b1367428baae04151dfef6ceae47/
// ==/UserScript==

(async () => {
  const waitForElement = (
    querySelector,
    timeout = null,
    parentElement = document
  ) => {
    return new Promise((resolve, reject) => {
      const observer = new MutationObserver(() => {
        const element = parentElement.querySelector(querySelector);
        if (element) {
          observer.disconnect();
          resolve(element);
        }
      });
      observer.observe(document.body, { childList: true, subtree: true });
      const element = parentElement.querySelector(querySelector);
      if (element) {
        observer.disconnect();
        resolve(element);
      }

      if (timeout !== null) {
        setTimeout(() => {
          observer.disconnect();
          reject(
            `Elemento con selector "${querySelector}" no encontrado dentro del tiempo límite de ${timeout}ms.`
          );
        }, timeout);
      }
    });
  };
  const panelsContainer = await waitForElement("._3Pnf9j-DVi9cm7cJ383yI1");
  const panels = panelsContainer.querySelectorAll("._1o7lKXffOJjZ_CpH1bHfY-");
  const maxWaitingTime = 50000; // If this maxWaitingTime is reached, an error has occurred

  const exportAllGames = async (e) => {
    const allGames = [];
    const btnExport = e.target;
    const panel = btnExport.parentElement.parentElement.parentElement;
    const numGames = parseInt(
      panel.querySelector("._3x604kYqXRJbqWmeLWAHrj").innerText.match(/\d+/)[0]
    );

    for (const p of panels) if (p != panel) p.remove();

    const btnShowAll = panel.querySelector(
      "div:nth-child(2)._1ve5nrPCrUjlbKp1PXsiJD > button"
    );
    btnShowAll.click();

    let rowIndex = 0;
    let lastColIndex = 7;
    try {
      const firstRow = await waitForElement(
        ".-padb24TteB2RGJuMHdLn",
        maxWaitingTime,
        panel
      );
      lastColIndex = firstRow?.childElementCount || 7;
    } catch (e) {}

    while (allGames.length < numGames) {
      let lastRow;
      try {
        lastRow = await waitForElement(
          `[data-index="${rowIndex}"]`,
          maxWaitingTime,
          panel
        );
      } catch (error) {
        console.error(`Error procesando fila ${rowIndex}:`, error);
        break;
      }
      lastRow.scrollIntoView();
      for (
        let colIndex = 1;
        colIndex <= lastColIndex && allGames.length < numGames;
        colIndex++
      ) {
        try {
          const gameSelector = `[data-index="${rowIndex}"] > div > [data-key]:nth-child(${colIndex})`;
          const game = await waitForElement(
            gameSelector,
            maxWaitingTime,
            lastRow
          );

          const appId = game
            .querySelector("img")
            ?.src.match(/apps\/(\d+)\//)?.[1];

          const verticalImgBanner = `https://cdn.cloudflare.steamstatic.com/steam/apps/${appId}/library_600x900.jpg`;
          const horizontalImgBanner = `https://cdn.cloudflare.steamstatic.com/steam/apps/${appId}/header.jpg`;
          const capsuleImg = `https://cdn.cloudflare.steamstatic.com/steam/apps/${appId}/capsule_231x87.jpg`;
          const title = game.querySelector("img")?.alt;
          const owners =
            game.querySelector(".OchtG0jyJQXcr2o0t34q7")?.innerText || "1";

          allGames.push({
            appId,
            title,
            owners,
            capsuleImg,
            verticalImgBanner,
            horizontalImgBanner,
          });

          console.log(
            `Procesado juego ${allGames.length}/${numGames}: ${title}`
          );
        } catch (error) {
          lastColIndex = colIndex - 1;
          console.log(`Tamaño máximo de columnas cambiado a ${lastColIndex}`);
          break;
        }
      }
      rowIndex++;
    }

    const headers =
      "App ID\tTitle\tOwners\tCapsule Image\tVertical Image Banner\tHorizontal Image Banner";
    let tsvContent = allGames
      .map(
        (game) =>
          `${game.appId}\t${game.title}\t${game.owners}\t${game.capsuleImg}\t${game.verticalImgBanner}\t${game.horizontalImgBanner}`
      )
      .join("\n");

    tsvContent = `${headers}\n${tsvContent}`;

    let blob = new Blob([tsvContent], { type: "text/tab-separated-values" });
    let url = URL.createObjectURL(blob);
    let a = document.createElement("a");
    a.href = url;
    a.download = "steam_family_games.tsv";
    document.body.appendChild(a);
    a.click();
    document.body.removeChild(a);
    URL.revokeObjectURL(url);
  };

  for (const panel of panels) {
    const btnShowAll = panel.querySelector(
      "div:nth-child(2)._1ve5nrPCrUjlbKp1PXsiJD"
    );
    let btnExport = btnShowAll.cloneNode(true);
    btnExport.addEventListener("click", exportAllGames);
    btnExport.querySelector("button").innerText = "Export TSV";
    btnShowAll.parentElement.appendChild(btnExport);
  }
})();