{"version":3,"file":"user-ratings.service.cjs","names":["fetchPage","userRatingsUrl","sleep","LIB_PREFIX","getUserRatingType","getUserRatingId","getUserRatingTitle","getUserRatingYear","getUserRatingUrl","getUserRatingColorRating","getUserRatingDate","getUserRating"],"sources":["../../src/services/user-ratings.service.ts"],"sourcesContent":["import { HTMLElement, parse } from 'node-html-parser';\nimport { CSFDColorRating, CSFDFilmTypes, CSFDStars } from '../dto/global';\nimport { CSFDUserRatingConfig, CSFDUserRatings } from '../dto/user-ratings';\nimport { fetchPage } from '../fetchers';\nimport { sleep } from '../helpers/global.helper';\nimport {\n  getUserRating,\n  getUserRatingColorRating,\n  getUserRatingDate,\n  getUserRatingId,\n  getUserRatingTitle,\n  getUserRatingType,\n  getUserRatingUrl,\n  getUserRatingYear\n} from '../helpers/user-ratings.helper';\nimport { CSFDOptions } from '../types';\nimport { LIB_PREFIX, userRatingsUrl } from '../vars';\n\nexport class UserRatingsScraper {\n  public async userRatings(\n    user: string | number,\n    config?: CSFDUserRatingConfig,\n    options?: CSFDOptions\n  ): Promise<CSFDUserRatings[]> {\n    let allMovies: CSFDUserRatings[] = [];\n    const pageToFetch = config?.page || 1;\n    const url = userRatingsUrl(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 movies = items.querySelectorAll('#snippet--ratings table tr');\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    allMovies = this.getPage(config, movies);\n\n    if (config?.allPages) {\n      for (let i = 2; i <= pages; i++) {\n        config.onProgress?.(i, pages);\n        const url = userRatingsUrl(user, i, { language: options?.language });\n        const response = await fetchPage(url, { ...options?.request });\n\n        const items = parse(response);\n        const movies = items.querySelectorAll('#snippet--ratings table tr');\n        allMovies = [...allMovies, ...this.getPage(config, movies)];\n\n        // Sleep\n        if (config.allPagesDelay) {\n          await sleep(config.allPagesDelay);\n        }\n      }\n      return allMovies;\n    }\n\n    return allMovies;\n  }\n\n  private getPage(config: CSFDUserRatingConfig, movies: HTMLElement[]) {\n    const films: CSFDUserRatings[] = [];\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 movies) {\n      const type = getUserRatingType(el);\n\n      // Filtering includesOnly\n      if (includesSet) {\n        if (includesSet.has(type)) {\n          films.push(this.buildUserRatings(el, type));\n        }\n        // Filter excludes\n      } else if (excludesSet) {\n        if (!excludesSet.has(type)) {\n          films.push(this.buildUserRatings(el, type));\n        }\n      } else {\n        // Without filtering\n        films.push(this.buildUserRatings(el, type));\n      }\n    }\n    return films;\n  }\n\n  private buildUserRatings(el: HTMLElement, type: CSFDFilmTypes): CSFDUserRatings {\n    return {\n      id: getUserRatingId(el),\n      title: getUserRatingTitle(el),\n      year: getUserRatingYear(el),\n      type,\n      url: getUserRatingUrl(el),\n      colorRating: getUserRatingColorRating(el) as CSFDColorRating,\n      userDate: getUserRatingDate(el),\n      userRating: getUserRating(el) as CSFDStars\n    };\n  }\n}\n"],"mappings":";;;;;;AAkBA,IAAa,qBAAb,MAAgC;CAC9B,MAAa,YACX,MACA,QACA,SAC4B;EAC5B,IAAI,YAA+B,CAAC;EACpC,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,SAAS,MAAM,iBAAiB,4BAA4B;EAGlE,MAAM,YAAY,MAAM,cAAc,aAAa;EACnD,MAAM,QAAQ,CAAC,WAAW,WAAW,UAAU,WAAW,SAAS,EAAE,CAAC,WAAW;EAEjF,YAAY,KAAK,QAAQ,QAAQ,MAAM;EAEvC,IAAI,QAAQ,UAAU;GACpB,KAAK,IAAI,IAAI,GAAG,KAAK,OAAO,KAAK;IAC/B,OAAO,aAAa,GAAG,KAAK;IAK5B,MAAM,UAAA,GAAA,iBAAA,MAAA,CADc,MAFGD,cAAAA,UADXC,aAAAA,eAAe,MAAM,GAAG,EAAE,UAAU,SAAS,SAAS,CAC/B,GAAG,EAAE,GAAG,SAAS,QAAQ,CAAC,CAG1C,CAAC,CAAC,iBAAiB,4BAA4B;IAClE,YAAY,CAAC,GAAG,WAAW,GAAG,KAAK,QAAQ,QAAQ,MAAM,CAAC;IAG1D,IAAI,OAAO,eACT,MAAMC,sBAAAA,MAAM,OAAO,aAAa;GAEpC;GACA,OAAO;EACT;EAEA,OAAO;CACT;CAEA,QAAgB,QAA8B,QAAuB;EACnE,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,QAAQ;GACvB,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,cAAc,EAAE;EAC9B;CACF;AACF"}