node-csfd-api
Version:
ČSFD API in JavaScript. Amazing NPM library for scrapping csfd.cz :)
64 lines (62 loc) • 1.95 kB
JavaScript
import { csfd } from "../index.js";
import { escapeCsvField, renderProgress } from "./utils.js";
import { writeFile } from "node:fs/promises";
//#region src/bin/export-ratings.ts
/**
* Runs the ratings export process for a given user.
* @param userId - The CSFD user ID.
* @param options - Export options (format, filters, language).
*/
async function runRatingsExport(userId, options) {
try {
if (options.format === "letterboxd") csfd.setOptions({ language: "en" });
console.log(`Fetching ratings for user ${userId} (${options.format.toUpperCase()})...`);
const ratings = await csfd.userRatings(userId, {
...options.userRatingsOptions,
onProgress: renderProgress
});
console.log(`Fetched ${ratings.length} ratings.`);
let content = "";
let fileName = "";
if (options.format === "letterboxd") {
content = ["Title,Year,Rating,WatchedDate", ...ratings.map((r) => {
return `${escapeCsvField(r.title ?? "")},${r.year ?? ""},${r.userRating ?? ""},${escapeCsvField(r.userDate ?? "")}`;
})].join("\n");
fileName = `${userId}-for-letterboxd.csv`;
} else if (options.format === "json") {
content = JSON.stringify(ratings, null, 2);
fileName = `${userId}-ratings.json`;
} else {
content = [[
"id",
"title",
"year",
"rating",
"date",
"type",
"url",
"colorRating"
].join(","), ...ratings.map((r) => {
return [
r.id,
escapeCsvField(r.title ?? ""),
r.year ?? "",
r.userRating ?? "",
escapeCsvField(r.userDate ?? ""),
escapeCsvField(r.type ?? ""),
escapeCsvField(r.url ?? ""),
escapeCsvField(r.colorRating ?? "")
].join(",");
})].join("\n");
fileName = `${userId}-ratings.csv`;
}
await writeFile(fileName, content);
console.log("Saved in file:", `./${fileName}`);
} catch (error) {
console.error("Error exporting ratings:", error);
throw error;
}
}
//#endregion
export { runRatingsExport };