Criticker Watchlist Exporter

Exports the entries of a Criticker watchlist as a CSV file.

目前为 2024-12-21 提交的版本。查看 最新版本

  1. // ==UserScript==
  2. // @name Criticker Watchlist Exporter
  3. // @namespace http://tampermonkey.net/
  4. // @version 0.0.1
  5. // @description Exports the entries of a Criticker watchlist as a CSV file.
  6. // @author Alsweider
  7. // @match https://www.criticker.com/films/?collection=*
  8. // @icon https://www.google.com/s2/favicons?sz=64&domain=criticker.com
  9. // @grant GM_download
  10. // @license MIT
  11. // ==/UserScript==
  12.  
  13. (function () {
  14. 'use strict';
  15.  
  16. // Variablen
  17. let collectionId = new URLSearchParams(window.location.search).get("collection");
  18. let allEntries = [];
  19. let totalPages = 1; // Wird später dynamisch gesetzt
  20.  
  21. // Funktion zum Extrahieren der Einträge aus der HTML-Seite
  22. function extractEntriesFromDocument(doc) {
  23. let entries = [];
  24. doc.querySelectorAll(".fl_name").forEach(div => {
  25. let titleElement = div.querySelector(".fl_titlelist_link");
  26. if (titleElement) {
  27. let fullText = titleElement.innerText.trim();
  28. let match = fullText.match(/^(.*) \((\d{4})\)$/); // Extrahiert Titel und Jahr
  29. if (match) {
  30. let title = match[1];
  31. let year = match[2];
  32. entries.push({ title, year });
  33. }
  34. }
  35. });
  36. return entries;
  37. }
  38.  
  39. // Funktion zum Abrufen der Inhalte einer Seite
  40. function fetchPage(pageNumber) {
  41. return new Promise((resolve, reject) => {
  42. let pageUrl = `https://www.criticker.com/films/?collection=${collectionId}&p=${pageNumber}`;
  43. console.log(`Lade Seite ${pageNumber}: ${pageUrl}`);
  44.  
  45. fetch(pageUrl)
  46. .then(response => response.text())
  47. .then(html => {
  48. let parser = new DOMParser();
  49. let doc = parser.parseFromString(html, "text/html");
  50.  
  51. // Einträge extrahieren
  52. let entries = extractEntriesFromDocument(doc);
  53. resolve(entries);
  54.  
  55. // Gesamtseitenzahl prüfen (falls noch nicht gesetzt)
  56. if (pageNumber === 1) {
  57. let paginationLinks = doc.querySelectorAll(".pagination a");
  58. if (paginationLinks.length > 0) {
  59. totalPages = Math.max(...Array.from(paginationLinks).map(link => {
  60. let match = link.href.match(/&p=(\d+)/);
  61. return match ? parseInt(match[1]) : 1;
  62. }));
  63. console.log(`Gesamtseiten: ${totalPages}`);
  64. }
  65. }
  66. })
  67. .catch(error => {
  68. console.error(`Fehler beim Abrufen von Seite ${pageNumber}:`, error);
  69. reject(error);
  70. });
  71. });
  72. }
  73.  
  74. // Funktion zum Verarbeiten aller Seiten
  75. async function fetchAllPages() {
  76. for (let i = 1; i <= totalPages; i++) {
  77. let entries = await fetchPage(i);
  78. allEntries = allEntries.concat(entries);
  79. }
  80. createCSV(allEntries);
  81. }
  82.  
  83. // Funktion zum Erstellen der CSV-Datei
  84. function createCSV(entries) {
  85. let csvContent = "Title,Year\n";
  86. entries.forEach(entry => {
  87. csvContent += `"${entry.title}","${entry.year}"\n`;
  88. });
  89.  
  90. // CSV-Datei zum Download bereitstellen
  91. let blob = new Blob([csvContent], { type: "text/csv;charset=utf-8;" });
  92. let url = URL.createObjectURL(blob);
  93. let a = document.createElement("a");
  94. a.href = url;
  95. a.download = "criticker_watchlist.csv";
  96. a.click();
  97. URL.revokeObjectURL(url);
  98. console.log("CSV erfolgreich erstellt!");
  99. }
  100.  
  101. // Starten der Extraktion
  102. window.addEventListener("load", () => {
  103. console.log("Starte die Extraktion aller Seiten...");
  104. fetchAllPages().then(() => {
  105. console.log("Extraktion abgeschlossen!");
  106. });
  107. });
  108. })();