From 8a3ebad4ec4b15fa361ce6cadd58178b324734bb Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Thu, 21 May 2026 10:39:39 +0000 Subject: [PATCH] =?UTF-8?q?=F0=9F=9B=A0=EF=B8=8F=20DX:=20allow=20userRatin?= =?UTF-8?q?gs=20and=20userReviews=20to=20accept=20URLs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Developers no longer need to manually parse IDs when using these services. It uses `extractId` like the movie and creator services do. Co-authored-by: bartholomej <5861310+bartholomej@users.noreply.github.com> --- src/helpers/global.helper.ts | 4 ++++ src/services/user-ratings.service.ts | 11 ++++++++--- src/services/user-reviews.service.ts | 11 ++++++++--- 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/src/helpers/global.helper.ts b/src/helpers/global.helper.ts index 6f2acb78..dd107a35 100644 --- a/src/helpers/global.helper.ts +++ b/src/helpers/global.helper.ts @@ -16,6 +16,10 @@ export const parseIdFromUrl = (url: string): number => { if (/^\d+-/.test(p)) { return +p.split('-')[0] || null; } + // Also support pure numbers in URL parts (e.g., /uzivatel/1000/) + if (/^\d+$/.test(p)) { + return +p || null; + } } // Fallback diff --git a/src/services/user-ratings.service.ts b/src/services/user-ratings.service.ts index 09244fe8..fc80b08f 100644 --- a/src/services/user-ratings.service.ts +++ b/src/services/user-ratings.service.ts @@ -2,7 +2,7 @@ import { HTMLElement, parse } from 'node-html-parser'; import { CSFDColorRating, CSFDFilmTypes, CSFDStars } from '../dto/global'; import { CSFDUserRatingConfig, CSFDUserRatings } from '../dto/user-ratings'; import { fetchPage } from '../fetchers'; -import { sleep } from '../helpers/global.helper'; +import { extractId, sleep } from '../helpers/global.helper'; import { getUserRating, getUserRatingColorRating, @@ -22,9 +22,14 @@ export class UserRatingsScraper { config?: CSFDUserRatingConfig, options?: CSFDOptions ): Promise { + const id = extractId(user); + if (id === null || isNaN(id)) { + throw new Error('node-csfd-api: user must be a valid number or URL'); + } + let allMovies: CSFDUserRatings[] = []; const pageToFetch = config?.page || 1; - const url = userRatingsUrl(user, pageToFetch > 1 ? pageToFetch : undefined, { + const url = userRatingsUrl(id, pageToFetch > 1 ? pageToFetch : undefined, { language: options?.language }); const response = await fetchPage(url, { ...options?.request }); @@ -40,7 +45,7 @@ export class UserRatingsScraper { if (config?.allPages) { for (let i = 2; i <= pages; i++) { config.onProgress?.(i, pages); - const url = userRatingsUrl(user, i, { language: options?.language }); + const url = userRatingsUrl(id, i, { language: options?.language }); const response = await fetchPage(url, { ...options?.request }); const items = parse(response); diff --git a/src/services/user-reviews.service.ts b/src/services/user-reviews.service.ts index 88f5f498..b6520311 100644 --- a/src/services/user-reviews.service.ts +++ b/src/services/user-reviews.service.ts @@ -2,7 +2,7 @@ import { HTMLElement, parse } from 'node-html-parser'; import { CSFDColorRating, CSFDFilmTypes, CSFDStars } from '../dto/global'; import { CSFDUserReviews, CSFDUserReviewsConfig } from '../dto/user-reviews'; import { fetchPage } from '../fetchers'; -import { sleep } from '../helpers/global.helper'; +import { extractId, sleep } from '../helpers/global.helper'; import { getUserReviewColorRating, getUserReviewDate, @@ -24,9 +24,14 @@ export class UserReviewsScraper { config?: CSFDUserReviewsConfig, options?: CSFDOptions ): Promise { + const id = extractId(user); + if (id === null || isNaN(id)) { + throw new Error('node-csfd-api: user must be a valid number or URL'); + } + let allReviews: CSFDUserReviews[] = []; const pageToFetch = config?.page || 1; - const url = userReviewsUrl(user, pageToFetch > 1 ? pageToFetch : undefined, { + const url = userReviewsUrl(id, pageToFetch > 1 ? pageToFetch : undefined, { language: options?.language }); const response = await fetchPage(url, { ...options?.request }); @@ -42,7 +47,7 @@ export class UserReviewsScraper { if (config?.allPages) { for (let i = 2; i <= pages; i++) { config.onProgress?.(i, pages); - const url = userReviewsUrl(user, i, { language: options?.language }); + const url = userReviewsUrl(id, i, { language: options?.language }); const response = await fetchPage(url, { ...options?.request }); const items = parse(response);