node-csfd-api
Version:
ČSFD API in JavaScript. Amazing NPM library for scrapping csfd.cz :)
1 lines • 5.86 kB
Source Map (JSON)
{"version":3,"file":"user-reviews.service.cjs","names":["fetchPage","userReviewsUrl","sleep","LIB_PREFIX","getUserReviewType","getUserReviewId","getUserReviewTitle","getUserReviewYear","getUserReviewUrl","getUserReviewColorRating","getUserReviewDate","getUserReviewRating","getUserReviewText","getUserReviewPoster"],"sources":["../../src/services/user-reviews.service.ts"],"sourcesContent":["import { HTMLElement, parse } from 'node-html-parser';\nimport { CSFDColorRating, CSFDFilmTypes, CSFDStars } from '../dto/global';\nimport { CSFDUserReviews, CSFDUserReviewsConfig } from '../dto/user-reviews';\nimport { fetchPage } from '../fetchers';\nimport { sleep } from '../helpers/global.helper';\nimport {\n getUserReviewColorRating,\n getUserReviewDate,\n getUserReviewId,\n getUserReviewPoster,\n getUserReviewRating,\n getUserReviewText,\n getUserReviewTitle,\n getUserReviewType,\n getUserReviewUrl,\n getUserReviewYear\n} from '../helpers/user-reviews.helper';\nimport { CSFDOptions } from '../types';\nimport { LIB_PREFIX, userReviewsUrl } from '../vars';\n\nexport class UserReviewsScraper {\n public async userReviews(\n user: string | number,\n config?: CSFDUserReviewsConfig,\n options?: CSFDOptions\n ): Promise<CSFDUserReviews[]> {\n let allReviews: CSFDUserReviews[] = [];\n const pageToFetch = config?.page || 1;\n const url = userReviewsUrl(user, pageToFetch > 1 ? pageToFetch : undefined, {\n language: options?.language\n });\n const response = await fetchPage(url, { ...options?.request });\n const items = parse(response);\n const reviews = items.querySelectorAll('.user-tab-reviews .article');\n\n // Get number of pages\n const pagesNode = items.querySelector('.pagination');\n const pages = +pagesNode?.childNodes[pagesNode.childNodes.length - 4].rawText || 1;\n\n allReviews = this.getPage(config, reviews);\n\n if (config?.allPages) {\n for (let i = 2; i <= pages; i++) {\n config.onProgress?.(i, pages);\n const url = userReviewsUrl(user, i, { language: options?.language });\n const response = await fetchPage(url, { ...options?.request });\n\n const items = parse(response);\n const reviews = items.querySelectorAll('.user-tab-reviews .article');\n allReviews = [...allReviews, ...this.getPage(config, reviews)];\n\n // Sleep\n if (config.allPagesDelay) {\n await sleep(config.allPagesDelay);\n }\n }\n return allReviews;\n }\n\n return allReviews;\n }\n\n private getPage(config: CSFDUserReviewsConfig, reviews: HTMLElement[]) {\n const films: CSFDUserReviews[] = [];\n if (config) {\n if (config.includesOnly?.length && config.excludes?.length) {\n console.warn(`${LIB_PREFIX} Both 'includesOnly' and 'excludes' were provided. 'includesOnly' takes precedence:`, config.includesOnly);\n }\n }\n\n const includesSet = config?.includesOnly?.length ? new Set(config.includesOnly) : null;\n const excludesSet = config?.excludes?.length ? new Set(config.excludes) : null;\n\n for (const el of reviews) {\n const type = getUserReviewType(el);\n\n // Filtering includesOnly\n if (includesSet) {\n if (includesSet.has(type)) {\n films.push(this.buildUserReviews(el, type));\n }\n // Filter excludes\n } else if (excludesSet) {\n if (!excludesSet.has(type)) {\n films.push(this.buildUserReviews(el, type));\n }\n } else {\n // Without filtering\n films.push(this.buildUserReviews(el, type));\n }\n }\n return films;\n }\n\n private buildUserReviews(el: HTMLElement, type: CSFDFilmTypes): CSFDUserReviews {\n return {\n id: getUserReviewId(el),\n title: getUserReviewTitle(el),\n year: getUserReviewYear(el),\n type,\n url: getUserReviewUrl(el),\n colorRating: getUserReviewColorRating(el) as CSFDColorRating,\n userDate: getUserReviewDate(el),\n userRating: getUserReviewRating(el) as CSFDStars,\n text: getUserReviewText(el),\n poster: getUserReviewPoster(el)\n };\n }\n}\n"],"mappings":";;;;;;AAoBA,IAAa,qBAAb,MAAgC;CAC9B,MAAa,YACX,MACA,QACA,SAC4B;EAC5B,IAAI,aAAgC,CAAC;EACrC,MAAM,cAAc,QAAQ,QAAQ;EAKpC,MAAM,SAAA,GAAA,iBAAA,MAAA,CAAc,MADGA,cAAAA,UAHXC,aAAAA,eAAe,MAAM,cAAc,IAAI,cAAc,KAAA,GAAW,EAC1E,UAAU,SAAS,SACrB,CACmC,GAAG,EAAE,GAAG,SAAS,QAAQ,CAAC,CACjC;EAC5B,MAAM,UAAU,MAAM,iBAAiB,4BAA4B;EAGnE,MAAM,YAAY,MAAM,cAAc,aAAa;EACnD,MAAM,QAAQ,CAAC,WAAW,WAAW,UAAU,WAAW,SAAS,EAAE,CAAC,WAAW;EAEjF,aAAa,KAAK,QAAQ,QAAQ,OAAO;EAEzC,IAAI,QAAQ,UAAU;GACpB,KAAK,IAAI,IAAI,GAAG,KAAK,OAAO,KAAK;IAC/B,OAAO,aAAa,GAAG,KAAK;IAK5B,MAAM,WAAA,GAAA,iBAAA,MAAA,CADc,MAFGD,cAAAA,UADXC,aAAAA,eAAe,MAAM,GAAG,EAAE,UAAU,SAAS,SAAS,CAC/B,GAAG,EAAE,GAAG,SAAS,QAAQ,CAAC,CAGzC,CAAC,CAAC,iBAAiB,4BAA4B;IACnE,aAAa,CAAC,GAAG,YAAY,GAAG,KAAK,QAAQ,QAAQ,OAAO,CAAC;IAG7D,IAAI,OAAO,eACT,MAAMC,sBAAAA,MAAM,OAAO,aAAa;GAEpC;GACA,OAAO;EACT;EAEA,OAAO;CACT;CAEA,QAAgB,QAA+B,SAAwB;EACrE,MAAM,QAA2B,CAAC;EAClC,IAAI;OACE,OAAO,cAAc,UAAU,OAAO,UAAU,QAClD,QAAQ,KAAK,GAAGC,aAAAA,WAAW,sFAAsF,OAAO,YAAY;EAAA;EAIxI,MAAM,cAAc,QAAQ,cAAc,SAAS,IAAI,IAAI,OAAO,YAAY,IAAI;EAClF,MAAM,cAAc,QAAQ,UAAU,SAAS,IAAI,IAAI,OAAO,QAAQ,IAAI;EAE1E,KAAK,MAAM,MAAM,SAAS;GACxB,MAAM,OAAOC,4BAAAA,kBAAkB,EAAE;GAGjC,IAAI;QACE,YAAY,IAAI,IAAI,GACtB,MAAM,KAAK,KAAK,iBAAiB,IAAI,IAAI,CAAC;GAAA,OAGvC,IAAI;QACL,CAAC,YAAY,IAAI,IAAI,GACvB,MAAM,KAAK,KAAK,iBAAiB,IAAI,IAAI,CAAC;GAAA,OAI5C,MAAM,KAAK,KAAK,iBAAiB,IAAI,IAAI,CAAC;EAE9C;EACA,OAAO;CACT;CAEA,iBAAyB,IAAiB,MAAsC;EAC9E,OAAO;GACL,IAAIC,4BAAAA,gBAAgB,EAAE;GACtB,OAAOC,4BAAAA,mBAAmB,EAAE;GAC5B,MAAMC,4BAAAA,kBAAkB,EAAE;GAC1B;GACA,KAAKC,4BAAAA,iBAAiB,EAAE;GACxB,aAAaC,4BAAAA,yBAAyB,EAAE;GACxC,UAAUC,4BAAAA,kBAAkB,EAAE;GAC9B,YAAYC,4BAAAA,oBAAoB,EAAE;GAClC,MAAMC,4BAAAA,kBAAkB,EAAE;GAC1B,QAAQC,4BAAAA,oBAAoB,EAAE;EAChC;CACF;AACF"}