Criticker Watchlist Exporter

Exports the entries of a Criticker watchlist to CSV.

  1. // ==UserScript==
  2. // @name Criticker Watchlist Exporter
  3. // @namespace http://tampermonkey.net/
  4. // @version 0.0.6
  5. // @description Exports the entries of a Criticker watchlist to CSV.
  6. // @author Alsweider
  7. // @match https://www.criticker.com/films/?collection=*
  8. // @match https://games.criticker.com/games/?collection=*
  9. // @icon https://www.criticker.com/favicon.ico
  10. // @grant GM_download
  11. // @license MIT
  12. // ==/UserScript==
  13.  
  14. (function () {
  15. 'use strict';
  16.  
  17. // Variablen
  18. let collectionId = new URLSearchParams(window.location.search).get("collection");
  19. let allEntries = [];
  20. let totalPages = 1; // Wird später dynamisch gesetzt
  21.  
  22. // Funktion zum Extrahieren der Einträge aus der HTML-Seite
  23. function extractEntriesFromDocument(doc) {
  24. let entries = [];
  25. doc.querySelectorAll(".fl_name").forEach(div => {
  26. let titleElement = div.querySelector("[id^='fl_titlelist_link_']");
  27. let scoreElement = div.parentElement.querySelector(".pti");
  28. if (titleElement) {
  29. let fullText = titleElement.innerText.trim();
  30. let match = fullText.match(/^(.*) \((\d{4})\)$/); // Extrahiert Titel und Jahr
  31. if (match) {
  32. let title = match[1];
  33. let year = match[2];
  34. let score = scoreElement ? scoreElement.innerText.trim() : ""; // Probable Score extrahieren
  35. entries.push({ title, year, score });
  36. }
  37. }
  38. });
  39. return entries;
  40. }
  41.  
  42. // Funktion zum Abrufen der Inhalte einer Seite
  43. function fetchPage(pageNumber) {
  44. return new Promise((resolve, reject) => {
  45. let baseUrl = window.location.href.includes("games") ? "https://games.criticker.com/games/" : "https://www.criticker.com/films/";
  46. let pageUrl = `${baseUrl}?collection=${collectionId}&p=${pageNumber}`;
  47. console.log(`Lade Seite ${pageNumber}: ${pageUrl}`);
  48.  
  49. fetch(pageUrl)
  50. .then(response => response.text())
  51. .then(html => {
  52. let parser = new DOMParser();
  53. let doc = parser.parseFromString(html, "text/html");
  54.  
  55. // Einträge extrahieren
  56. let entries = extractEntriesFromDocument(doc);
  57. resolve(entries);
  58.  
  59. // Gesamtseitenzahl prüfen (falls noch nicht gesetzt)
  60. if (pageNumber === 1) {
  61. let paginationLinks = doc.querySelectorAll(".pagination a");
  62. if (paginationLinks.length > 0) {
  63. totalPages = Math.max(...Array.from(paginationLinks).map(link => {
  64. let match = link.href.match(/&p=(\d+)/);
  65. return match ? parseInt(match[1]) : 1;
  66. }));
  67. console.log(`Gesamtseiten: ${totalPages}`);
  68. }
  69. }
  70. })
  71. .catch(error => {
  72. console.error(`Fehler beim Abrufen von Seite ${pageNumber}:`, error);
  73. reject(error);
  74. });
  75. });
  76. }
  77.  
  78. // Funktion zum Verarbeiten aller Seiten
  79. async function fetchAllPages() {
  80. for (let i = 1; i <= totalPages; i++) {
  81. let entries = await fetchPage(i);
  82. allEntries = allEntries.concat(entries);
  83. }
  84. createCSV(allEntries);
  85. }
  86.  
  87. // Funktion zum Erstellen der CSV-Datei
  88. function createCSV(entries) {
  89. let csvContent = "Title,Year,Probable Score\n";
  90. entries.forEach(entry => {
  91. csvContent += `"${entry.title}","${entry.year}","${entry.score}"\n`;
  92. });
  93.  
  94. // CSV-Datei zum Download bereitstellen
  95. let blob = new Blob([csvContent], { type: "text/csv;charset=utf-8;" });
  96. let url = URL.createObjectURL(blob);
  97. let a = document.createElement("a");
  98. a.href = url;
  99. a.download = "criticker_watchlist.csv";
  100. a.click();
  101. URL.revokeObjectURL(url);
  102. console.log("CSV erfolgreich erstellt!");
  103. }
  104.  
  105. // Funktion zum Hinzufügen des Buttons zur Sidebar
  106. function addButtonToSidebar() {
  107. const sidebar = document.querySelector(".fl_sidebar");
  108. if (sidebar) {
  109. const button = document.createElement("a");
  110. button.href = "#";
  111. button.id = "exportWatchlistButton";
  112. button.classList.add("button");
  113. button.textContent = "Export to CSV";
  114. button.style.display = "block";
  115. button.style.padding = "10px";
  116. button.style.marginTop = "20px";
  117. button.style.textAlign = "center";
  118. button.style.backgroundColor = "#4CAF50";
  119. button.style.color = "white";
  120. button.style.borderRadius = "5px";
  121. button.style.textDecoration = "none";
  122.  
  123. // Button in die Sidebar einfügen
  124. sidebar.appendChild(button);
  125.  
  126. // Event Listener hinzufügen
  127. button.addEventListener("click", function (e) {
  128. e.preventDefault();
  129. console.log("Starte die Extraktion aller Seiten...");
  130. fetchAllPages().then(() => {
  131. console.log("Extraktion abgeschlossen!");
  132. });
  133. });
  134. }
  135. }
  136.  
  137. // Funktion aufrufen, um den Button hinzuzufügen
  138. window.addEventListener("load", addButtonToSidebar);
  139.  
  140. })();