{"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"}