node-csfd-api 4.3.0 → 4.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dto/movie.d.mts +6 -1
- package/dto/movie.d.ts +6 -1
- package/helpers/creator.helper.js +1 -1
- package/helpers/creator.helper.js.map +1 -1
- package/helpers/creator.helper.mjs +1 -1
- package/helpers/creator.helper.mjs.map +1 -1
- package/helpers/global.helper.js +5 -3
- package/helpers/global.helper.js.map +1 -1
- package/helpers/global.helper.mjs +5 -3
- package/helpers/global.helper.mjs.map +1 -1
- package/helpers/movie.helper.js +50 -22
- package/helpers/movie.helper.js.map +1 -1
- package/helpers/movie.helper.mjs +50 -21
- package/helpers/movie.helper.mjs.map +1 -1
- package/index.d.mts +2 -2
- package/index.d.ts +2 -2
- package/package.json +1 -1
- package/services/creator.service.js +4 -3
- package/services/creator.service.js.map +1 -1
- package/services/creator.service.mjs +4 -3
- package/services/creator.service.mjs.map +1 -1
- package/services/movie.service.js +8 -13
- package/services/movie.service.js.map +1 -1
- package/services/movie.service.mjs +9 -14
- package/services/movie.service.mjs.map +1 -1
- package/services/search.service.js +10 -27
- package/services/search.service.js.map +1 -1
- package/services/search.service.mjs +10 -27
- package/services/search.service.mjs.map +1 -1
- package/services/user-ratings.service.js +5 -5
- package/services/user-ratings.service.js.map +1 -1
- package/services/user-ratings.service.mjs +5 -5
- package/services/user-ratings.service.mjs.map +1 -1
- package/services/user-reviews.service.js +5 -5
- package/services/user-reviews.service.js.map +1 -1
- package/services/user-reviews.service.mjs +5 -5
- package/services/user-reviews.service.mjs.map +1 -1
package/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { CSFDColorRating, CSFDFilmTypes, CSFDScreening, CSFDStars } from "./dto/global.js";
|
|
2
|
-
import { CSFDBoxContent, CSFDCreatorGroups, CSFDCreatorGroupsEnglish, CSFDCreatorGroupsSlovak, CSFDCreators, CSFDGenres, CSFDMovie, CSFDMovieCreator, CSFDMovieListItem, CSFDPremiere, CSFDTitlesOther, CSFDVod, CSFDVodService } from "./dto/movie.js";
|
|
2
|
+
import { CSFDBoxContent, CSFDCreatorGroups, CSFDCreatorGroupsEnglish, CSFDCreatorGroupsSlovak, CSFDCreators, CSFDGenres, CSFDMovie, CSFDMovieCreator, CSFDMovieListItem, CSFDPremiere, CSFDTitlesOther, CSFDVod, CSFDVodService, MovieJsonLd } from "./dto/movie.js";
|
|
3
3
|
import { CSFDCinema, CSFDCinemaGroupedFilmsByDate, CSFDCinemaMeta, CSFDCinemaMovie, CSFDCinemaPeriod } from "./dto/cinema.js";
|
|
4
4
|
import { CSFDCreator, CSFDCreatorScreening } from "./dto/creator.js";
|
|
5
5
|
import { CSFDSearch, CSFDSearchCreator, CSFDSearchCreators, CSFDSearchMovie, CSFDSearchUser } from "./dto/search.js";
|
|
@@ -36,5 +36,5 @@ declare class Csfd {
|
|
|
36
36
|
}
|
|
37
37
|
declare const csfd: Csfd;
|
|
38
38
|
//#endregion
|
|
39
|
-
export { CSFDBoxContent, CSFDCinema, CSFDCinemaGroupedFilmsByDate, CSFDCinemaMeta, CSFDCinemaMovie, CSFDCinemaPeriod, CSFDColorRating, CSFDColors, CSFDCreator, CSFDCreatorGroups, CSFDCreatorGroupsEnglish, CSFDCreatorGroupsSlovak, CSFDCreatorScreening, CSFDCreators, CSFDFilmTypes, CSFDGenres, CSFDMovie, CSFDMovieCreator, CSFDMovieListItem, CSFDPremiere, CSFDScreening, CSFDSearch, CSFDSearchCreator, CSFDSearchCreators, CSFDSearchMovie, CSFDSearchUser, CSFDStars, CSFDTitlesOther, CSFDUserRatingConfig, CSFDUserRatings, CSFDVod, CSFDVodService, Csfd, csfd };
|
|
39
|
+
export { CSFDBoxContent, CSFDCinema, CSFDCinemaGroupedFilmsByDate, CSFDCinemaMeta, CSFDCinemaMovie, CSFDCinemaPeriod, CSFDColorRating, CSFDColors, CSFDCreator, CSFDCreatorGroups, CSFDCreatorGroupsEnglish, CSFDCreatorGroupsSlovak, CSFDCreatorScreening, CSFDCreators, CSFDFilmTypes, CSFDGenres, CSFDMovie, CSFDMovieCreator, CSFDMovieListItem, CSFDPremiere, CSFDScreening, CSFDSearch, CSFDSearchCreator, CSFDSearchCreators, CSFDSearchMovie, CSFDSearchUser, CSFDStars, CSFDTitlesOther, CSFDUserRatingConfig, CSFDUserRatings, CSFDVod, CSFDVodService, Csfd, MovieJsonLd, csfd };
|
|
40
40
|
//# sourceMappingURL=index.d.ts.map
|
package/package.json
CHANGED
|
@@ -14,13 +14,14 @@ var CreatorScraper = class {
|
|
|
14
14
|
return this.buildCreator(+creatorId, asideNode, filmsNode);
|
|
15
15
|
}
|
|
16
16
|
buildCreator(id, asideEl, filmsNode) {
|
|
17
|
+
const birthdayInfo = require_creator_helper.getCreatorBirthdayInfo(asideEl);
|
|
17
18
|
return {
|
|
18
19
|
id,
|
|
19
20
|
name: require_creator_helper.getCreatorName(asideEl),
|
|
20
|
-
birthday:
|
|
21
|
-
birthplace:
|
|
21
|
+
birthday: birthdayInfo?.birthday,
|
|
22
|
+
birthplace: birthdayInfo?.birthPlace,
|
|
22
23
|
photo: require_creator_helper.getCreatorPhoto(asideEl),
|
|
23
|
-
age:
|
|
24
|
+
age: birthdayInfo?.age || null,
|
|
24
25
|
bio: require_creator_helper.getCreatorBio(asideEl),
|
|
25
26
|
films: require_creator_helper.getCreatorFilms(filmsNode)
|
|
26
27
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"creator.service.js","names":["fetchPage","creatorUrl","
|
|
1
|
+
{"version":3,"file":"creator.service.js","names":["fetchPage","creatorUrl","getCreatorBirthdayInfo","getCreatorName","getCreatorPhoto","getCreatorBio","getCreatorFilms"],"sources":["../../src/services/creator.service.ts"],"sourcesContent":["import { HTMLElement, parse } from 'node-html-parser';\nimport { CSFDCreator } from '../dto/creator';\nimport { fetchPage } from '../fetchers';\nimport {\n getCreatorBio,\n getCreatorBirthdayInfo,\n getCreatorFilms,\n getCreatorName,\n getCreatorPhoto\n} from '../helpers/creator.helper';\nimport { CSFDOptions } from '../types';\nimport { creatorUrl } from '../vars';\n\nexport class CreatorScraper {\n public async creator(creatorId: number, options?: CSFDOptions): Promise<CSFDCreator> {\n const id = Number(creatorId);\n if (isNaN(id)) {\n throw new Error('node-csfd-api: creatorId must be a valid number');\n }\n const url = creatorUrl(id, { language: options?.language });\n const response = await fetchPage(url, { ...options?.request });\n\n const creatorHtml = parse(response);\n\n const asideNode = creatorHtml.querySelector('.creator-about');\n const filmsNode = creatorHtml.querySelector('.creator-filmography');\n return this.buildCreator(+creatorId, asideNode, filmsNode);\n }\n\n private buildCreator(id: number, asideEl: HTMLElement, filmsNode: HTMLElement): CSFDCreator {\n const birthdayInfo = getCreatorBirthdayInfo(asideEl);\n return {\n id,\n name: getCreatorName(asideEl),\n birthday: birthdayInfo?.birthday,\n birthplace: birthdayInfo?.birthPlace,\n photo: getCreatorPhoto(asideEl),\n age: birthdayInfo?.age || null,\n bio: getCreatorBio(asideEl),\n films: getCreatorFilms(filmsNode)\n };\n }\n}\n"],"mappings":";;;;;;AAaA,IAAa,iBAAb,MAA4B;CAC1B,MAAa,QAAQ,WAAmB,SAA6C;EACnF,MAAM,KAAK,OAAO,UAAU;AAC5B,MAAI,MAAM,GAAG,CACX,OAAM,IAAI,MAAM,kDAAkD;EAKpE,MAAM,0CAFW,MAAMA,wBADXC,wBAAW,IAAI,EAAE,UAAU,SAAS,UAAU,CAAC,EACrB,EAAE,GAAG,SAAS,SAAS,CAAC,CAE3B;EAEnC,MAAM,YAAY,YAAY,cAAc,iBAAiB;EAC7D,MAAM,YAAY,YAAY,cAAc,uBAAuB;AACnE,SAAO,KAAK,aAAa,CAAC,WAAW,WAAW,UAAU;;CAG5D,AAAQ,aAAa,IAAY,SAAsB,WAAqC;EAC1F,MAAM,eAAeC,8CAAuB,QAAQ;AACpD,SAAO;GACL;GACA,MAAMC,sCAAe,QAAQ;GAC7B,UAAU,cAAc;GACxB,YAAY,cAAc;GAC1B,OAAOC,uCAAgB,QAAQ;GAC/B,KAAK,cAAc,OAAO;GAC1B,KAAKC,qCAAc,QAAQ;GAC3B,OAAOC,uCAAgB,UAAU;GAClC"}
|
|
@@ -14,13 +14,14 @@ var CreatorScraper = class {
|
|
|
14
14
|
return this.buildCreator(+creatorId, asideNode, filmsNode);
|
|
15
15
|
}
|
|
16
16
|
buildCreator(id, asideEl, filmsNode) {
|
|
17
|
+
const birthdayInfo = getCreatorBirthdayInfo(asideEl);
|
|
17
18
|
return {
|
|
18
19
|
id,
|
|
19
20
|
name: getCreatorName(asideEl),
|
|
20
|
-
birthday:
|
|
21
|
-
birthplace:
|
|
21
|
+
birthday: birthdayInfo?.birthday,
|
|
22
|
+
birthplace: birthdayInfo?.birthPlace,
|
|
22
23
|
photo: getCreatorPhoto(asideEl),
|
|
23
|
-
age:
|
|
24
|
+
age: birthdayInfo?.age || null,
|
|
24
25
|
bio: getCreatorBio(asideEl),
|
|
25
26
|
films: getCreatorFilms(filmsNode)
|
|
26
27
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"creator.service.mjs","names":[],"sources":["../../src/services/creator.service.ts"],"sourcesContent":["import { HTMLElement, parse } from 'node-html-parser';\nimport { CSFDCreator } from '../dto/creator';\nimport { fetchPage } from '../fetchers';\nimport {\n getCreatorBio,\n getCreatorBirthdayInfo,\n getCreatorFilms,\n getCreatorName,\n getCreatorPhoto\n} from '../helpers/creator.helper';\nimport { CSFDOptions } from '../types';\nimport { creatorUrl } from '../vars';\n\nexport class CreatorScraper {\n public async creator(creatorId: number, options?: CSFDOptions): Promise<CSFDCreator> {\n const id = Number(creatorId);\n if (isNaN(id)) {\n throw new Error('node-csfd-api: creatorId must be a valid number');\n }\n const url = creatorUrl(id, { language: options?.language });\n const response = await fetchPage(url, { ...options?.request });\n\n const creatorHtml = parse(response);\n\n const asideNode = creatorHtml.querySelector('.creator-about');\n const filmsNode = creatorHtml.querySelector('.creator-filmography');\n return this.buildCreator(+creatorId, asideNode, filmsNode);\n }\n\n private buildCreator(id: number, asideEl: HTMLElement, filmsNode: HTMLElement): CSFDCreator {\n return {\n id,\n name: getCreatorName(asideEl),\n birthday:
|
|
1
|
+
{"version":3,"file":"creator.service.mjs","names":[],"sources":["../../src/services/creator.service.ts"],"sourcesContent":["import { HTMLElement, parse } from 'node-html-parser';\nimport { CSFDCreator } from '../dto/creator';\nimport { fetchPage } from '../fetchers';\nimport {\n getCreatorBio,\n getCreatorBirthdayInfo,\n getCreatorFilms,\n getCreatorName,\n getCreatorPhoto\n} from '../helpers/creator.helper';\nimport { CSFDOptions } from '../types';\nimport { creatorUrl } from '../vars';\n\nexport class CreatorScraper {\n public async creator(creatorId: number, options?: CSFDOptions): Promise<CSFDCreator> {\n const id = Number(creatorId);\n if (isNaN(id)) {\n throw new Error('node-csfd-api: creatorId must be a valid number');\n }\n const url = creatorUrl(id, { language: options?.language });\n const response = await fetchPage(url, { ...options?.request });\n\n const creatorHtml = parse(response);\n\n const asideNode = creatorHtml.querySelector('.creator-about');\n const filmsNode = creatorHtml.querySelector('.creator-filmography');\n return this.buildCreator(+creatorId, asideNode, filmsNode);\n }\n\n private buildCreator(id: number, asideEl: HTMLElement, filmsNode: HTMLElement): CSFDCreator {\n const birthdayInfo = getCreatorBirthdayInfo(asideEl);\n return {\n id,\n name: getCreatorName(asideEl),\n birthday: birthdayInfo?.birthday,\n birthplace: birthdayInfo?.birthPlace,\n photo: getCreatorPhoto(asideEl),\n age: birthdayInfo?.age || null,\n bio: getCreatorBio(asideEl),\n films: getCreatorFilms(filmsNode)\n };\n }\n}\n"],"mappings":";;;;;;AAaA,IAAa,iBAAb,MAA4B;CAC1B,MAAa,QAAQ,WAAmB,SAA6C;EACnF,MAAM,KAAK,OAAO,UAAU;AAC5B,MAAI,MAAM,GAAG,CACX,OAAM,IAAI,MAAM,kDAAkD;EAKpE,MAAM,cAAc,MAFH,MAAM,UADX,WAAW,IAAI,EAAE,UAAU,SAAS,UAAU,CAAC,EACrB,EAAE,GAAG,SAAS,SAAS,CAAC,CAE3B;EAEnC,MAAM,YAAY,YAAY,cAAc,iBAAiB;EAC7D,MAAM,YAAY,YAAY,cAAc,uBAAuB;AACnE,SAAO,KAAK,aAAa,CAAC,WAAW,WAAW,UAAU;;CAG5D,AAAQ,aAAa,IAAY,SAAsB,WAAqC;EAC1F,MAAM,eAAe,uBAAuB,QAAQ;AACpD,SAAO;GACL;GACA,MAAM,eAAe,QAAQ;GAC7B,UAAU,cAAc;GACxB,YAAY,cAAc;GAC1B,OAAO,gBAAgB,QAAQ;GAC/B,KAAK,cAAc,OAAO;GAC1B,KAAK,cAAc,QAAQ;GAC3B,OAAO,gBAAgB,UAAU;GAClC"}
|
|
@@ -12,7 +12,13 @@ var MovieScraper = class {
|
|
|
12
12
|
const pageClasses = movieHtml.querySelector(".page-content").classNames.split(" ");
|
|
13
13
|
const asideNode = movieHtml.querySelector(".aside-movie-profile");
|
|
14
14
|
const movieNode = movieHtml.querySelector(".main-movie-profile");
|
|
15
|
-
const
|
|
15
|
+
const jsonLdString = movieHtml.querySelector("script[type=\"application/ld+json\"]").innerText;
|
|
16
|
+
let jsonLd = null;
|
|
17
|
+
try {
|
|
18
|
+
jsonLd = JSON.parse(jsonLdString);
|
|
19
|
+
} catch (e) {
|
|
20
|
+
console.error("node-csfd-api: Error parsing JSON-LD", e);
|
|
21
|
+
}
|
|
16
22
|
return this.buildMovie(+movieId, movieNode, asideNode, pageClasses, jsonLd, options);
|
|
17
23
|
}
|
|
18
24
|
buildMovie(movieId, el, asideEl, pageClasses, jsonLd, options) {
|
|
@@ -33,18 +39,7 @@ var MovieScraper = class {
|
|
|
33
39
|
poster: require_movie_helper.getMoviePoster(el),
|
|
34
40
|
photo: require_movie_helper.getMovieRandomPhoto(el),
|
|
35
41
|
trivia: require_movie_helper.getMovieTrivia(el),
|
|
36
|
-
creators:
|
|
37
|
-
directors: require_movie_helper.getMovieGroup(el, require_movie_helper.getLocalizedCreatorLabel(options?.language, "directors")),
|
|
38
|
-
writers: require_movie_helper.getMovieGroup(el, require_movie_helper.getLocalizedCreatorLabel(options?.language, "writers")),
|
|
39
|
-
cinematography: require_movie_helper.getMovieGroup(el, require_movie_helper.getLocalizedCreatorLabel(options?.language, "cinematography")),
|
|
40
|
-
music: require_movie_helper.getMovieGroup(el, require_movie_helper.getLocalizedCreatorLabel(options?.language, "music")),
|
|
41
|
-
actors: require_movie_helper.getMovieGroup(el, require_movie_helper.getLocalizedCreatorLabel(options?.language, "actors")),
|
|
42
|
-
basedOn: require_movie_helper.getMovieGroup(el, require_movie_helper.getLocalizedCreatorLabel(options?.language, "basedOn")),
|
|
43
|
-
producers: require_movie_helper.getMovieGroup(el, require_movie_helper.getLocalizedCreatorLabel(options?.language, "producers")),
|
|
44
|
-
filmEditing: require_movie_helper.getMovieGroup(el, require_movie_helper.getLocalizedCreatorLabel(options?.language, "filmEditing")),
|
|
45
|
-
costumeDesign: require_movie_helper.getMovieGroup(el, require_movie_helper.getLocalizedCreatorLabel(options?.language, "costumeDesign")),
|
|
46
|
-
productionDesign: require_movie_helper.getMovieGroup(el, require_movie_helper.getLocalizedCreatorLabel(options?.language, "productionDesign"))
|
|
47
|
-
},
|
|
42
|
+
creators: require_movie_helper.getMovieCreators(el, options),
|
|
48
43
|
vod: require_movie_helper.getMovieVods(asideEl),
|
|
49
44
|
tags: require_movie_helper.getMovieTags(asideEl),
|
|
50
45
|
premieres: require_movie_helper.getMoviePremieres(asideEl),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"movie.service.js","names":["fetchPage","movieUrl","getMovieTitle","getMovieYear","getMovieDuration","getMovieDescriptions","getMovieGenres","getMovieType","getMovieOrigins","getMovieColorRating","getMovieRating","getMovieRatingCount","getMovieTitlesOther","getMoviePoster","getMovieRandomPhoto","getMovieTrivia","
|
|
1
|
+
{"version":3,"file":"movie.service.js","names":["fetchPage","movieUrl","getMovieTitle","getMovieYear","getMovieDuration","getMovieDescriptions","getMovieGenres","getMovieType","getMovieOrigins","getMovieColorRating","getMovieRating","getMovieRatingCount","getMovieTitlesOther","getMoviePoster","getMovieRandomPhoto","getMovieTrivia","getMovieCreators","getMovieVods","getMovieTags","getMoviePremieres","getMovieBoxMovies"],"sources":["../../src/services/movie.service.ts"],"sourcesContent":["import { HTMLElement, parse } from 'node-html-parser';\nimport { CSFDFilmTypes } from '../dto/global';\nimport { CSFDMovie, MovieJsonLd } from '../dto/movie';\nimport { fetchPage } from '../fetchers';\nimport {\n getMovieBoxMovies,\n getMovieColorRating,\n getMovieCreators,\n getMovieDescriptions,\n getMovieDuration,\n getMovieGenres,\n getMovieOrigins,\n getMoviePoster,\n getMoviePremieres,\n getMovieRandomPhoto,\n getMovieRating,\n getMovieRatingCount,\n getMovieTags,\n getMovieTitle,\n getMovieTitlesOther,\n getMovieTrivia,\n getMovieType,\n getMovieVods,\n getMovieYear\n} from '../helpers/movie.helper';\nimport { CSFDOptions } from '../types';\nimport { movieUrl } from '../vars';\n\nexport class MovieScraper {\n public async movie(movieId: number, options?: CSFDOptions): Promise<CSFDMovie> {\n const id = Number(movieId);\n if (isNaN(id)) {\n throw new Error('node-csfd-api: movieId must be a valid number');\n }\n const url = movieUrl(id, { language: options?.language });\n const response = await fetchPage(url, { ...options?.request });\n\n const movieHtml = parse(response);\n\n const pageClasses = movieHtml.querySelector('.page-content').classNames.split(' ');\n const asideNode = movieHtml.querySelector('.aside-movie-profile');\n const movieNode = movieHtml.querySelector('.main-movie-profile');\n const jsonLdString = movieHtml.querySelector('script[type=\"application/ld+json\"]').innerText;\n let jsonLd: MovieJsonLd | null = null;\n try {\n jsonLd = JSON.parse(jsonLdString);\n } catch (e) {\n console.error('node-csfd-api: Error parsing JSON-LD', e);\n }\n return this.buildMovie(+movieId, movieNode, asideNode, pageClasses, jsonLd, options);\n }\n\n private buildMovie(\n movieId: number,\n el: HTMLElement,\n asideEl: HTMLElement,\n pageClasses: string[],\n jsonLd: MovieJsonLd | null,\n options: CSFDOptions\n ): CSFDMovie {\n return {\n id: movieId,\n title: getMovieTitle(el),\n year: getMovieYear(jsonLd),\n duration: getMovieDuration(jsonLd, el),\n descriptions: getMovieDescriptions(el),\n genres: getMovieGenres(el),\n type: getMovieType(el) as CSFDFilmTypes,\n url: movieUrl(movieId, { language: options?.language }),\n origins: getMovieOrigins(el),\n colorRating: getMovieColorRating(pageClasses),\n rating: getMovieRating(asideEl),\n ratingCount: getMovieRatingCount(asideEl),\n titlesOther: getMovieTitlesOther(el),\n poster: getMoviePoster(el),\n photo: getMovieRandomPhoto(el),\n trivia: getMovieTrivia(el),\n creators: getMovieCreators(el, options),\n vod: getMovieVods(asideEl),\n tags: getMovieTags(asideEl),\n premieres: getMoviePremieres(asideEl),\n related: getMovieBoxMovies(asideEl, 'Související'),\n similar: getMovieBoxMovies(asideEl, 'Podobné')\n };\n }\n}\n"],"mappings":";;;;;;AA4BA,IAAa,eAAb,MAA0B;CACxB,MAAa,MAAM,SAAiB,SAA2C;EAC7E,MAAM,KAAK,OAAO,QAAQ;AAC1B,MAAI,MAAM,GAAG,CACX,OAAM,IAAI,MAAM,gDAAgD;EAKlE,MAAM,wCAFW,MAAMA,wBADXC,sBAAS,IAAI,EAAE,UAAU,SAAS,UAAU,CAAC,EACnB,EAAE,GAAG,SAAS,SAAS,CAAC,CAE7B;EAEjC,MAAM,cAAc,UAAU,cAAc,gBAAgB,CAAC,WAAW,MAAM,IAAI;EAClF,MAAM,YAAY,UAAU,cAAc,uBAAuB;EACjE,MAAM,YAAY,UAAU,cAAc,sBAAsB;EAChE,MAAM,eAAe,UAAU,cAAc,uCAAqC,CAAC;EACnF,IAAI,SAA6B;AACjC,MAAI;AACF,YAAS,KAAK,MAAM,aAAa;WAC1B,GAAG;AACV,WAAQ,MAAM,wCAAwC,EAAE;;AAE1D,SAAO,KAAK,WAAW,CAAC,SAAS,WAAW,WAAW,aAAa,QAAQ,QAAQ;;CAGtF,AAAQ,WACN,SACA,IACA,SACA,aACA,QACA,SACW;AACX,SAAO;GACL,IAAI;GACJ,OAAOC,mCAAc,GAAG;GACxB,MAAMC,kCAAa,OAAO;GAC1B,UAAUC,sCAAiB,QAAQ,GAAG;GACtC,cAAcC,0CAAqB,GAAG;GACtC,QAAQC,oCAAe,GAAG;GAC1B,MAAMC,kCAAa,GAAG;GACtB,KAAKN,sBAAS,SAAS,EAAE,UAAU,SAAS,UAAU,CAAC;GACvD,SAASO,qCAAgB,GAAG;GAC5B,aAAaC,yCAAoB,YAAY;GAC7C,QAAQC,oCAAe,QAAQ;GAC/B,aAAaC,yCAAoB,QAAQ;GACzC,aAAaC,yCAAoB,GAAG;GACpC,QAAQC,oCAAe,GAAG;GAC1B,OAAOC,yCAAoB,GAAG;GAC9B,QAAQC,oCAAe,GAAG;GAC1B,UAAUC,sCAAiB,IAAI,QAAQ;GACvC,KAAKC,kCAAa,QAAQ;GAC1B,MAAMC,kCAAa,QAAQ;GAC3B,WAAWC,uCAAkB,QAAQ;GACrC,SAASC,uCAAkB,SAAS,cAAc;GAClD,SAASA,uCAAkB,SAAS,UAAU;GAC/C"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { fetchPage } from "../fetchers/index.mjs";
|
|
2
2
|
import { movieUrl } from "../vars.mjs";
|
|
3
|
-
import {
|
|
3
|
+
import { getMovieBoxMovies, getMovieColorRating, getMovieCreators, getMovieDescriptions, getMovieDuration, getMovieGenres, getMovieOrigins, getMoviePoster, getMoviePremieres, getMovieRandomPhoto, getMovieRating, getMovieRatingCount, getMovieTags, getMovieTitle, getMovieTitlesOther, getMovieTrivia, getMovieType, getMovieVods, getMovieYear } from "../helpers/movie.helper.mjs";
|
|
4
4
|
import { parse } from "node-html-parser";
|
|
5
5
|
|
|
6
6
|
//#region src/services/movie.service.ts
|
|
@@ -12,7 +12,13 @@ var MovieScraper = class {
|
|
|
12
12
|
const pageClasses = movieHtml.querySelector(".page-content").classNames.split(" ");
|
|
13
13
|
const asideNode = movieHtml.querySelector(".aside-movie-profile");
|
|
14
14
|
const movieNode = movieHtml.querySelector(".main-movie-profile");
|
|
15
|
-
const
|
|
15
|
+
const jsonLdString = movieHtml.querySelector("script[type=\"application/ld+json\"]").innerText;
|
|
16
|
+
let jsonLd = null;
|
|
17
|
+
try {
|
|
18
|
+
jsonLd = JSON.parse(jsonLdString);
|
|
19
|
+
} catch (e) {
|
|
20
|
+
console.error("node-csfd-api: Error parsing JSON-LD", e);
|
|
21
|
+
}
|
|
16
22
|
return this.buildMovie(+movieId, movieNode, asideNode, pageClasses, jsonLd, options);
|
|
17
23
|
}
|
|
18
24
|
buildMovie(movieId, el, asideEl, pageClasses, jsonLd, options) {
|
|
@@ -33,18 +39,7 @@ var MovieScraper = class {
|
|
|
33
39
|
poster: getMoviePoster(el),
|
|
34
40
|
photo: getMovieRandomPhoto(el),
|
|
35
41
|
trivia: getMovieTrivia(el),
|
|
36
|
-
creators:
|
|
37
|
-
directors: getMovieGroup(el, getLocalizedCreatorLabel(options?.language, "directors")),
|
|
38
|
-
writers: getMovieGroup(el, getLocalizedCreatorLabel(options?.language, "writers")),
|
|
39
|
-
cinematography: getMovieGroup(el, getLocalizedCreatorLabel(options?.language, "cinematography")),
|
|
40
|
-
music: getMovieGroup(el, getLocalizedCreatorLabel(options?.language, "music")),
|
|
41
|
-
actors: getMovieGroup(el, getLocalizedCreatorLabel(options?.language, "actors")),
|
|
42
|
-
basedOn: getMovieGroup(el, getLocalizedCreatorLabel(options?.language, "basedOn")),
|
|
43
|
-
producers: getMovieGroup(el, getLocalizedCreatorLabel(options?.language, "producers")),
|
|
44
|
-
filmEditing: getMovieGroup(el, getLocalizedCreatorLabel(options?.language, "filmEditing")),
|
|
45
|
-
costumeDesign: getMovieGroup(el, getLocalizedCreatorLabel(options?.language, "costumeDesign")),
|
|
46
|
-
productionDesign: getMovieGroup(el, getLocalizedCreatorLabel(options?.language, "productionDesign"))
|
|
47
|
-
},
|
|
42
|
+
creators: getMovieCreators(el, options),
|
|
48
43
|
vod: getMovieVods(asideEl),
|
|
49
44
|
tags: getMovieTags(asideEl),
|
|
50
45
|
premieres: getMoviePremieres(asideEl),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"movie.service.mjs","names":[],"sources":["../../src/services/movie.service.ts"],"sourcesContent":["import { HTMLElement, parse } from 'node-html-parser';\nimport { CSFDFilmTypes } from '../dto/global';\nimport { CSFDMovie } from '../dto/movie';\nimport { fetchPage } from '../fetchers';\nimport {\n
|
|
1
|
+
{"version":3,"file":"movie.service.mjs","names":[],"sources":["../../src/services/movie.service.ts"],"sourcesContent":["import { HTMLElement, parse } from 'node-html-parser';\nimport { CSFDFilmTypes } from '../dto/global';\nimport { CSFDMovie, MovieJsonLd } from '../dto/movie';\nimport { fetchPage } from '../fetchers';\nimport {\n getMovieBoxMovies,\n getMovieColorRating,\n getMovieCreators,\n getMovieDescriptions,\n getMovieDuration,\n getMovieGenres,\n getMovieOrigins,\n getMoviePoster,\n getMoviePremieres,\n getMovieRandomPhoto,\n getMovieRating,\n getMovieRatingCount,\n getMovieTags,\n getMovieTitle,\n getMovieTitlesOther,\n getMovieTrivia,\n getMovieType,\n getMovieVods,\n getMovieYear\n} from '../helpers/movie.helper';\nimport { CSFDOptions } from '../types';\nimport { movieUrl } from '../vars';\n\nexport class MovieScraper {\n public async movie(movieId: number, options?: CSFDOptions): Promise<CSFDMovie> {\n const id = Number(movieId);\n if (isNaN(id)) {\n throw new Error('node-csfd-api: movieId must be a valid number');\n }\n const url = movieUrl(id, { language: options?.language });\n const response = await fetchPage(url, { ...options?.request });\n\n const movieHtml = parse(response);\n\n const pageClasses = movieHtml.querySelector('.page-content').classNames.split(' ');\n const asideNode = movieHtml.querySelector('.aside-movie-profile');\n const movieNode = movieHtml.querySelector('.main-movie-profile');\n const jsonLdString = movieHtml.querySelector('script[type=\"application/ld+json\"]').innerText;\n let jsonLd: MovieJsonLd | null = null;\n try {\n jsonLd = JSON.parse(jsonLdString);\n } catch (e) {\n console.error('node-csfd-api: Error parsing JSON-LD', e);\n }\n return this.buildMovie(+movieId, movieNode, asideNode, pageClasses, jsonLd, options);\n }\n\n private buildMovie(\n movieId: number,\n el: HTMLElement,\n asideEl: HTMLElement,\n pageClasses: string[],\n jsonLd: MovieJsonLd | null,\n options: CSFDOptions\n ): CSFDMovie {\n return {\n id: movieId,\n title: getMovieTitle(el),\n year: getMovieYear(jsonLd),\n duration: getMovieDuration(jsonLd, el),\n descriptions: getMovieDescriptions(el),\n genres: getMovieGenres(el),\n type: getMovieType(el) as CSFDFilmTypes,\n url: movieUrl(movieId, { language: options?.language }),\n origins: getMovieOrigins(el),\n colorRating: getMovieColorRating(pageClasses),\n rating: getMovieRating(asideEl),\n ratingCount: getMovieRatingCount(asideEl),\n titlesOther: getMovieTitlesOther(el),\n poster: getMoviePoster(el),\n photo: getMovieRandomPhoto(el),\n trivia: getMovieTrivia(el),\n creators: getMovieCreators(el, options),\n vod: getMovieVods(asideEl),\n tags: getMovieTags(asideEl),\n premieres: getMoviePremieres(asideEl),\n related: getMovieBoxMovies(asideEl, 'Související'),\n similar: getMovieBoxMovies(asideEl, 'Podobné')\n };\n }\n}\n"],"mappings":";;;;;;AA4BA,IAAa,eAAb,MAA0B;CACxB,MAAa,MAAM,SAAiB,SAA2C;EAC7E,MAAM,KAAK,OAAO,QAAQ;AAC1B,MAAI,MAAM,GAAG,CACX,OAAM,IAAI,MAAM,gDAAgD;EAKlE,MAAM,YAAY,MAFD,MAAM,UADX,SAAS,IAAI,EAAE,UAAU,SAAS,UAAU,CAAC,EACnB,EAAE,GAAG,SAAS,SAAS,CAAC,CAE7B;EAEjC,MAAM,cAAc,UAAU,cAAc,gBAAgB,CAAC,WAAW,MAAM,IAAI;EAClF,MAAM,YAAY,UAAU,cAAc,uBAAuB;EACjE,MAAM,YAAY,UAAU,cAAc,sBAAsB;EAChE,MAAM,eAAe,UAAU,cAAc,uCAAqC,CAAC;EACnF,IAAI,SAA6B;AACjC,MAAI;AACF,YAAS,KAAK,MAAM,aAAa;WAC1B,GAAG;AACV,WAAQ,MAAM,wCAAwC,EAAE;;AAE1D,SAAO,KAAK,WAAW,CAAC,SAAS,WAAW,WAAW,aAAa,QAAQ,QAAQ;;CAGtF,AAAQ,WACN,SACA,IACA,SACA,aACA,QACA,SACW;AACX,SAAO;GACL,IAAI;GACJ,OAAO,cAAc,GAAG;GACxB,MAAM,aAAa,OAAO;GAC1B,UAAU,iBAAiB,QAAQ,GAAG;GACtC,cAAc,qBAAqB,GAAG;GACtC,QAAQ,eAAe,GAAG;GAC1B,MAAM,aAAa,GAAG;GACtB,KAAK,SAAS,SAAS,EAAE,UAAU,SAAS,UAAU,CAAC;GACvD,SAAS,gBAAgB,GAAG;GAC5B,aAAa,oBAAoB,YAAY;GAC7C,QAAQ,eAAe,QAAQ;GAC/B,aAAa,oBAAoB,QAAQ;GACzC,aAAa,oBAAoB,GAAG;GACpC,QAAQ,eAAe,GAAG;GAC1B,OAAO,oBAAoB,GAAG;GAC9B,QAAQ,eAAe,GAAG;GAC1B,UAAU,iBAAiB,IAAI,QAAQ;GACvC,KAAK,aAAa,QAAQ;GAC1B,MAAM,aAAa,QAAQ;GAC3B,WAAW,kBAAkB,QAAQ;GACrC,SAAS,kBAAkB,SAAS,cAAc;GAClD,SAAS,kBAAkB,SAAS,UAAU;GAC/C"}
|
|
@@ -15,13 +15,13 @@ var SearchScraper = class {
|
|
|
15
15
|
return this.parseSearch(moviesNode, usersNode, tvSeriesNode, options?.language);
|
|
16
16
|
}
|
|
17
17
|
parseSearch(moviesNode, usersNode, tvSeriesNode, language) {
|
|
18
|
+
const baseUrl = require_vars.getUrlByLanguage(language);
|
|
18
19
|
const movies = [];
|
|
19
20
|
const users = [];
|
|
20
21
|
const tvSeries = [];
|
|
21
|
-
const
|
|
22
|
-
moviesNode.forEach((m) => {
|
|
22
|
+
const movieMapper = (m) => {
|
|
23
23
|
const url = require_search_helper.getSearchUrl(m);
|
|
24
|
-
|
|
24
|
+
return {
|
|
25
25
|
id: require_global_helper.parseIdFromUrl(url),
|
|
26
26
|
title: require_search_helper.getSearchTitle(m),
|
|
27
27
|
year: require_search_helper.getSearchYear(m),
|
|
@@ -35,37 +35,20 @@ var SearchScraper = class {
|
|
|
35
35
|
actors: require_search_helper.parseSearchPeople(m, "actors")
|
|
36
36
|
}
|
|
37
37
|
};
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
usersNode.forEach((m) => {
|
|
38
|
+
};
|
|
39
|
+
const userMapper = (m) => {
|
|
41
40
|
const url = require_search_user_helper.getUserUrl(m);
|
|
42
|
-
|
|
41
|
+
return {
|
|
43
42
|
id: require_global_helper.parseIdFromUrl(url),
|
|
44
43
|
user: require_search_user_helper.getUser(m),
|
|
45
44
|
userRealName: require_search_user_helper.getUserRealName(m),
|
|
46
45
|
avatar: require_search_user_helper.getAvatar(m),
|
|
47
46
|
url: `${baseUrl}${url}`
|
|
48
47
|
};
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
const user = {
|
|
54
|
-
id: require_global_helper.parseIdFromUrl(url),
|
|
55
|
-
title: require_search_helper.getSearchTitle(m),
|
|
56
|
-
year: require_search_helper.getSearchYear(m),
|
|
57
|
-
url: `${baseUrl}${url}`,
|
|
58
|
-
type: require_search_helper.getSearchType(m),
|
|
59
|
-
colorRating: require_search_helper.getSearchColorRating(m),
|
|
60
|
-
poster: require_search_helper.getSearchPoster(m),
|
|
61
|
-
origins: require_search_helper.getSearchOrigins(m),
|
|
62
|
-
creators: {
|
|
63
|
-
directors: require_search_helper.parseSearchPeople(m, "directors"),
|
|
64
|
-
actors: require_search_helper.parseSearchPeople(m, "actors")
|
|
65
|
-
}
|
|
66
|
-
};
|
|
67
|
-
tvSeries.push(user);
|
|
68
|
-
});
|
|
48
|
+
};
|
|
49
|
+
movies.push(...moviesNode.map(movieMapper));
|
|
50
|
+
users.push(...usersNode.map(userMapper));
|
|
51
|
+
tvSeries.push(...tvSeriesNode.map(movieMapper));
|
|
69
52
|
return {
|
|
70
53
|
movies,
|
|
71
54
|
users,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search.service.js","names":["fetchPage","searchUrl","getUrlByLanguage","getSearchUrl","parseIdFromUrl","getSearchTitle","getSearchYear","getSearchType","getSearchColorRating","getSearchPoster","getSearchOrigins","parseSearchPeople","getUserUrl","getUser","getUserRealName","getAvatar"],"sources":["../../src/services/search.service.ts"],"sourcesContent":["import { HTMLElement, parse } from 'node-html-parser';\nimport { CSFDSearch, CSFDSearchMovie, CSFDSearchUser } from '../dto/search';\nimport { fetchPage } from '../fetchers';\nimport { parseIdFromUrl } from '../helpers/global.helper';\nimport { getAvatar, getUser, getUserRealName, getUserUrl } from '../helpers/search-user.helper';\nimport {\n getSearchColorRating,\n getSearchOrigins,\n getSearchPoster,\n getSearchTitle,\n getSearchType,\n getSearchUrl,\n getSearchYear,\n parseSearchPeople\n} from '../helpers/search.helper';\nimport { CSFDLanguage, CSFDOptions } from '../types';\nimport { getUrlByLanguage, searchUrl } from '../vars';\n\nexport class SearchScraper {\n public async search(text: string, options?: CSFDOptions): Promise<CSFDSearch> {\n const url = searchUrl(text, { language: options?.language });\n const response = await fetchPage(url, { ...options?.request });\n\n const html = parse(response);\n const moviesNode = html.querySelectorAll('.main-movies article');\n const usersNode = html.querySelectorAll('.main-users article');\n const tvSeriesNode = html.querySelectorAll('.main-series article');\n\n return this.parseSearch(moviesNode, usersNode, tvSeriesNode, options?.language);\n }\n\n private parseSearch(\n moviesNode: HTMLElement[],\n usersNode: HTMLElement[],\n tvSeriesNode: HTMLElement[],\n language?: CSFDLanguage\n ) {\n const movies: CSFDSearchMovie[] = [];\n const users: CSFDSearchUser[] = [];\n const tvSeries: CSFDSearchMovie[] = [];\n const
|
|
1
|
+
{"version":3,"file":"search.service.js","names":["fetchPage","searchUrl","getUrlByLanguage","getSearchUrl","parseIdFromUrl","getSearchTitle","getSearchYear","getSearchType","getSearchColorRating","getSearchPoster","getSearchOrigins","parseSearchPeople","getUserUrl","getUser","getUserRealName","getAvatar"],"sources":["../../src/services/search.service.ts"],"sourcesContent":["import { HTMLElement, parse } from 'node-html-parser';\nimport { CSFDSearch, CSFDSearchMovie, CSFDSearchUser } from '../dto/search';\nimport { fetchPage } from '../fetchers';\nimport { parseIdFromUrl } from '../helpers/global.helper';\nimport { getAvatar, getUser, getUserRealName, getUserUrl } from '../helpers/search-user.helper';\nimport {\n getSearchColorRating,\n getSearchOrigins,\n getSearchPoster,\n getSearchTitle,\n getSearchType,\n getSearchUrl,\n getSearchYear,\n parseSearchPeople\n} from '../helpers/search.helper';\nimport { CSFDLanguage, CSFDOptions } from '../types';\nimport { getUrlByLanguage, searchUrl } from '../vars';\n\nexport class SearchScraper {\n public async search(text: string, options?: CSFDOptions): Promise<CSFDSearch> {\n const url = searchUrl(text, { language: options?.language });\n const response = await fetchPage(url, { ...options?.request });\n\n const html = parse(response);\n const moviesNode = html.querySelectorAll('.main-movies article');\n const usersNode = html.querySelectorAll('.main-users article');\n const tvSeriesNode = html.querySelectorAll('.main-series article');\n\n return this.parseSearch(moviesNode, usersNode, tvSeriesNode, options?.language);\n }\n\n private parseSearch(\n moviesNode: HTMLElement[],\n usersNode: HTMLElement[],\n tvSeriesNode: HTMLElement[],\n language?: CSFDLanguage\n ) {\n const baseUrl = getUrlByLanguage(language);\n\n const movies: CSFDSearchMovie[] = [];\n const users: CSFDSearchUser[] = [];\n const tvSeries: CSFDSearchMovie[] = [];\n\n const movieMapper = (m: HTMLElement): CSFDSearchMovie => {\n const url = getSearchUrl(m);\n return {\n id: parseIdFromUrl(url),\n title: getSearchTitle(m),\n year: getSearchYear(m),\n url: `${baseUrl}${url}`,\n type: getSearchType(m),\n colorRating: getSearchColorRating(m),\n poster: getSearchPoster(m),\n origins: getSearchOrigins(m),\n creators: {\n directors: parseSearchPeople(m, 'directors'),\n actors: parseSearchPeople(m, 'actors')\n }\n };\n };\n\n const userMapper = (m: HTMLElement): CSFDSearchUser => {\n const url = getUserUrl(m);\n return {\n id: parseIdFromUrl(url),\n user: getUser(m),\n userRealName: getUserRealName(m),\n avatar: getAvatar(m),\n url: `${baseUrl}${url}`\n };\n };\n\n movies.push(...moviesNode.map(movieMapper));\n users.push(...usersNode.map(userMapper));\n tvSeries.push(...tvSeriesNode.map(movieMapper));\n\n const search: CSFDSearch = {\n movies: movies,\n users: users,\n tvSeries: tvSeries,\n creators: []\n };\n return search;\n }\n}\n"],"mappings":";;;;;;;;AAkBA,IAAa,gBAAb,MAA2B;CACzB,MAAa,OAAO,MAAc,SAA4C;EAI5E,MAAM,mCAFW,MAAMA,wBADXC,uBAAU,MAAM,EAAE,UAAU,SAAS,UAAU,CAAC,EACtB,EAAE,GAAG,SAAS,SAAS,CAAC,CAElC;EAC5B,MAAM,aAAa,KAAK,iBAAiB,uBAAuB;EAChE,MAAM,YAAY,KAAK,iBAAiB,sBAAsB;EAC9D,MAAM,eAAe,KAAK,iBAAiB,uBAAuB;AAElE,SAAO,KAAK,YAAY,YAAY,WAAW,cAAc,SAAS,SAAS;;CAGjF,AAAQ,YACN,YACA,WACA,cACA,UACA;EACA,MAAM,UAAUC,8BAAiB,SAAS;EAE1C,MAAM,SAA4B,EAAE;EACpC,MAAM,QAA0B,EAAE;EAClC,MAAM,WAA8B,EAAE;EAEtC,MAAM,eAAe,MAAoC;GACvD,MAAM,MAAMC,mCAAa,EAAE;AAC3B,UAAO;IACL,IAAIC,qCAAe,IAAI;IACvB,OAAOC,qCAAe,EAAE;IACxB,MAAMC,oCAAc,EAAE;IACtB,KAAK,GAAG,UAAU;IAClB,MAAMC,oCAAc,EAAE;IACtB,aAAaC,2CAAqB,EAAE;IACpC,QAAQC,sCAAgB,EAAE;IAC1B,SAASC,uCAAiB,EAAE;IAC5B,UAAU;KACR,WAAWC,wCAAkB,GAAG,YAAY;KAC5C,QAAQA,wCAAkB,GAAG,SAAS;KACvC;IACF;;EAGH,MAAM,cAAc,MAAmC;GACrD,MAAM,MAAMC,sCAAW,EAAE;AACzB,UAAO;IACL,IAAIR,qCAAe,IAAI;IACvB,MAAMS,mCAAQ,EAAE;IAChB,cAAcC,2CAAgB,EAAE;IAChC,QAAQC,qCAAU,EAAE;IACpB,KAAK,GAAG,UAAU;IACnB;;AAGH,SAAO,KAAK,GAAG,WAAW,IAAI,YAAY,CAAC;AAC3C,QAAM,KAAK,GAAG,UAAU,IAAI,WAAW,CAAC;AACxC,WAAS,KAAK,GAAG,aAAa,IAAI,YAAY,CAAC;AAQ/C,SAN2B;GACjB;GACD;GACG;GACV,UAAU,EAAE;GACb"}
|
|
@@ -15,13 +15,13 @@ var SearchScraper = class {
|
|
|
15
15
|
return this.parseSearch(moviesNode, usersNode, tvSeriesNode, options?.language);
|
|
16
16
|
}
|
|
17
17
|
parseSearch(moviesNode, usersNode, tvSeriesNode, language) {
|
|
18
|
+
const baseUrl = getUrlByLanguage(language);
|
|
18
19
|
const movies = [];
|
|
19
20
|
const users = [];
|
|
20
21
|
const tvSeries = [];
|
|
21
|
-
const
|
|
22
|
-
moviesNode.forEach((m) => {
|
|
22
|
+
const movieMapper = (m) => {
|
|
23
23
|
const url = getSearchUrl(m);
|
|
24
|
-
|
|
24
|
+
return {
|
|
25
25
|
id: parseIdFromUrl(url),
|
|
26
26
|
title: getSearchTitle(m),
|
|
27
27
|
year: getSearchYear(m),
|
|
@@ -35,37 +35,20 @@ var SearchScraper = class {
|
|
|
35
35
|
actors: parseSearchPeople(m, "actors")
|
|
36
36
|
}
|
|
37
37
|
};
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
usersNode.forEach((m) => {
|
|
38
|
+
};
|
|
39
|
+
const userMapper = (m) => {
|
|
41
40
|
const url = getUserUrl(m);
|
|
42
|
-
|
|
41
|
+
return {
|
|
43
42
|
id: parseIdFromUrl(url),
|
|
44
43
|
user: getUser(m),
|
|
45
44
|
userRealName: getUserRealName(m),
|
|
46
45
|
avatar: getAvatar(m),
|
|
47
46
|
url: `${baseUrl}${url}`
|
|
48
47
|
};
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
const user = {
|
|
54
|
-
id: parseIdFromUrl(url),
|
|
55
|
-
title: getSearchTitle(m),
|
|
56
|
-
year: getSearchYear(m),
|
|
57
|
-
url: `${baseUrl}${url}`,
|
|
58
|
-
type: getSearchType(m),
|
|
59
|
-
colorRating: getSearchColorRating(m),
|
|
60
|
-
poster: getSearchPoster(m),
|
|
61
|
-
origins: getSearchOrigins(m),
|
|
62
|
-
creators: {
|
|
63
|
-
directors: parseSearchPeople(m, "directors"),
|
|
64
|
-
actors: parseSearchPeople(m, "actors")
|
|
65
|
-
}
|
|
66
|
-
};
|
|
67
|
-
tvSeries.push(user);
|
|
68
|
-
});
|
|
48
|
+
};
|
|
49
|
+
movies.push(...moviesNode.map(movieMapper));
|
|
50
|
+
users.push(...usersNode.map(userMapper));
|
|
51
|
+
tvSeries.push(...tvSeriesNode.map(movieMapper));
|
|
69
52
|
return {
|
|
70
53
|
movies,
|
|
71
54
|
users,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search.service.mjs","names":[],"sources":["../../src/services/search.service.ts"],"sourcesContent":["import { HTMLElement, parse } from 'node-html-parser';\nimport { CSFDSearch, CSFDSearchMovie, CSFDSearchUser } from '../dto/search';\nimport { fetchPage } from '../fetchers';\nimport { parseIdFromUrl } from '../helpers/global.helper';\nimport { getAvatar, getUser, getUserRealName, getUserUrl } from '../helpers/search-user.helper';\nimport {\n getSearchColorRating,\n getSearchOrigins,\n getSearchPoster,\n getSearchTitle,\n getSearchType,\n getSearchUrl,\n getSearchYear,\n parseSearchPeople\n} from '../helpers/search.helper';\nimport { CSFDLanguage, CSFDOptions } from '../types';\nimport { getUrlByLanguage, searchUrl } from '../vars';\n\nexport class SearchScraper {\n public async search(text: string, options?: CSFDOptions): Promise<CSFDSearch> {\n const url = searchUrl(text, { language: options?.language });\n const response = await fetchPage(url, { ...options?.request });\n\n const html = parse(response);\n const moviesNode = html.querySelectorAll('.main-movies article');\n const usersNode = html.querySelectorAll('.main-users article');\n const tvSeriesNode = html.querySelectorAll('.main-series article');\n\n return this.parseSearch(moviesNode, usersNode, tvSeriesNode, options?.language);\n }\n\n private parseSearch(\n moviesNode: HTMLElement[],\n usersNode: HTMLElement[],\n tvSeriesNode: HTMLElement[],\n language?: CSFDLanguage\n ) {\n const movies: CSFDSearchMovie[] = [];\n const users: CSFDSearchUser[] = [];\n const tvSeries: CSFDSearchMovie[] = [];\n const
|
|
1
|
+
{"version":3,"file":"search.service.mjs","names":[],"sources":["../../src/services/search.service.ts"],"sourcesContent":["import { HTMLElement, parse } from 'node-html-parser';\nimport { CSFDSearch, CSFDSearchMovie, CSFDSearchUser } from '../dto/search';\nimport { fetchPage } from '../fetchers';\nimport { parseIdFromUrl } from '../helpers/global.helper';\nimport { getAvatar, getUser, getUserRealName, getUserUrl } from '../helpers/search-user.helper';\nimport {\n getSearchColorRating,\n getSearchOrigins,\n getSearchPoster,\n getSearchTitle,\n getSearchType,\n getSearchUrl,\n getSearchYear,\n parseSearchPeople\n} from '../helpers/search.helper';\nimport { CSFDLanguage, CSFDOptions } from '../types';\nimport { getUrlByLanguage, searchUrl } from '../vars';\n\nexport class SearchScraper {\n public async search(text: string, options?: CSFDOptions): Promise<CSFDSearch> {\n const url = searchUrl(text, { language: options?.language });\n const response = await fetchPage(url, { ...options?.request });\n\n const html = parse(response);\n const moviesNode = html.querySelectorAll('.main-movies article');\n const usersNode = html.querySelectorAll('.main-users article');\n const tvSeriesNode = html.querySelectorAll('.main-series article');\n\n return this.parseSearch(moviesNode, usersNode, tvSeriesNode, options?.language);\n }\n\n private parseSearch(\n moviesNode: HTMLElement[],\n usersNode: HTMLElement[],\n tvSeriesNode: HTMLElement[],\n language?: CSFDLanguage\n ) {\n const baseUrl = getUrlByLanguage(language);\n\n const movies: CSFDSearchMovie[] = [];\n const users: CSFDSearchUser[] = [];\n const tvSeries: CSFDSearchMovie[] = [];\n\n const movieMapper = (m: HTMLElement): CSFDSearchMovie => {\n const url = getSearchUrl(m);\n return {\n id: parseIdFromUrl(url),\n title: getSearchTitle(m),\n year: getSearchYear(m),\n url: `${baseUrl}${url}`,\n type: getSearchType(m),\n colorRating: getSearchColorRating(m),\n poster: getSearchPoster(m),\n origins: getSearchOrigins(m),\n creators: {\n directors: parseSearchPeople(m, 'directors'),\n actors: parseSearchPeople(m, 'actors')\n }\n };\n };\n\n const userMapper = (m: HTMLElement): CSFDSearchUser => {\n const url = getUserUrl(m);\n return {\n id: parseIdFromUrl(url),\n user: getUser(m),\n userRealName: getUserRealName(m),\n avatar: getAvatar(m),\n url: `${baseUrl}${url}`\n };\n };\n\n movies.push(...moviesNode.map(movieMapper));\n users.push(...usersNode.map(userMapper));\n tvSeries.push(...tvSeriesNode.map(movieMapper));\n\n const search: CSFDSearch = {\n movies: movies,\n users: users,\n tvSeries: tvSeries,\n creators: []\n };\n return search;\n }\n}\n"],"mappings":";;;;;;;;AAkBA,IAAa,gBAAb,MAA2B;CACzB,MAAa,OAAO,MAAc,SAA4C;EAI5E,MAAM,OAAO,MAFI,MAAM,UADX,UAAU,MAAM,EAAE,UAAU,SAAS,UAAU,CAAC,EACtB,EAAE,GAAG,SAAS,SAAS,CAAC,CAElC;EAC5B,MAAM,aAAa,KAAK,iBAAiB,uBAAuB;EAChE,MAAM,YAAY,KAAK,iBAAiB,sBAAsB;EAC9D,MAAM,eAAe,KAAK,iBAAiB,uBAAuB;AAElE,SAAO,KAAK,YAAY,YAAY,WAAW,cAAc,SAAS,SAAS;;CAGjF,AAAQ,YACN,YACA,WACA,cACA,UACA;EACA,MAAM,UAAU,iBAAiB,SAAS;EAE1C,MAAM,SAA4B,EAAE;EACpC,MAAM,QAA0B,EAAE;EAClC,MAAM,WAA8B,EAAE;EAEtC,MAAM,eAAe,MAAoC;GACvD,MAAM,MAAM,aAAa,EAAE;AAC3B,UAAO;IACL,IAAI,eAAe,IAAI;IACvB,OAAO,eAAe,EAAE;IACxB,MAAM,cAAc,EAAE;IACtB,KAAK,GAAG,UAAU;IAClB,MAAM,cAAc,EAAE;IACtB,aAAa,qBAAqB,EAAE;IACpC,QAAQ,gBAAgB,EAAE;IAC1B,SAAS,iBAAiB,EAAE;IAC5B,UAAU;KACR,WAAW,kBAAkB,GAAG,YAAY;KAC5C,QAAQ,kBAAkB,GAAG,SAAS;KACvC;IACF;;EAGH,MAAM,cAAc,MAAmC;GACrD,MAAM,MAAM,WAAW,EAAE;AACzB,UAAO;IACL,IAAI,eAAe,IAAI;IACvB,MAAM,QAAQ,EAAE;IAChB,cAAc,gBAAgB,EAAE;IAChC,QAAQ,UAAU,EAAE;IACpB,KAAK,GAAG,UAAU;IACnB;;AAGH,SAAO,KAAK,GAAG,WAAW,IAAI,YAAY,CAAC;AAC3C,QAAM,KAAK,GAAG,UAAU,IAAI,WAAW,CAAC;AACxC,WAAS,KAAK,GAAG,aAAa,IAAI,YAAY,CAAC;AAQ/C,SAN2B;GACjB;GACD;GACG;GACV,UAAU,EAAE;GACb"}
|
|
@@ -38,19 +38,19 @@ var UserRatingsScraper = class {
|
|
|
38
38
|
for (const el of movies) {
|
|
39
39
|
const type = require_user_ratings_helper.getUserRatingType(el);
|
|
40
40
|
if (config?.includesOnly?.length) {
|
|
41
|
-
if (config.includesOnly.some((include) => type === include)) films.push(this.buildUserRatings(el));
|
|
41
|
+
if (config.includesOnly.some((include) => type === include)) films.push(this.buildUserRatings(el, type));
|
|
42
42
|
} else if (config?.excludes?.length) {
|
|
43
|
-
if (!config.excludes.some((exclude) => type === exclude)) films.push(this.buildUserRatings(el));
|
|
44
|
-
} else films.push(this.buildUserRatings(el));
|
|
43
|
+
if (!config.excludes.some((exclude) => type === exclude)) films.push(this.buildUserRatings(el, type));
|
|
44
|
+
} else films.push(this.buildUserRatings(el, type));
|
|
45
45
|
}
|
|
46
46
|
return films;
|
|
47
47
|
}
|
|
48
|
-
buildUserRatings(el) {
|
|
48
|
+
buildUserRatings(el, type) {
|
|
49
49
|
return {
|
|
50
50
|
id: require_user_ratings_helper.getUserRatingId(el),
|
|
51
51
|
title: require_user_ratings_helper.getUserRatingTitle(el),
|
|
52
52
|
year: require_user_ratings_helper.getUserRatingYear(el),
|
|
53
|
-
type
|
|
53
|
+
type,
|
|
54
54
|
url: require_user_ratings_helper.getUserRatingUrl(el),
|
|
55
55
|
colorRating: require_user_ratings_helper.getUserRatingColorRating(el),
|
|
56
56
|
userDate: require_user_ratings_helper.getUserRatingDate(el),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user-ratings.service.js","names":["userRatingsUrl","fetchPage","sleep","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, 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 { 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 console.log('User', user, url);\n console.log('Fetching all pages', pages);\n for (let i = 2; i <= pages; i++) {\n console.log('Fetching page', i, 'out of', 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(\n `node-csfd-api:\n You can not use both parameters 'includesOnly' and 'excludes'.\n Parameter 'includesOnly' will be used now:`,\n config.includesOnly\n );\n }\n }\n\n for (const el of movies) {\n const type = getUserRatingType(el);\n\n // Filtering includesOnly\n if (config?.includesOnly?.length) {\n if (config.includesOnly.some((include) => type === include)) {\n films.push(this.buildUserRatings(el));\n }\n // Filter excludes\n } else if (config?.excludes?.length) {\n if (!config.excludes.some((exclude) => type === exclude)) {\n films.push(this.buildUserRatings(el));\n }\n } else {\n // Without filtering\n films.push(this.buildUserRatings(el));\n }\n }\n return films;\n }\n\n private buildUserRatings(el: HTMLElement): CSFDUserRatings {\n return {\n id: getUserRatingId(el),\n title: getUserRatingTitle(el),\n year: getUserRatingYear(el),\n type
|
|
1
|
+
{"version":3,"file":"user-ratings.service.js","names":["userRatingsUrl","fetchPage","sleep","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 { 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 console.log('User', user, url);\n console.log('Fetching all pages', pages);\n for (let i = 2; i <= pages; i++) {\n console.log('Fetching page', i, 'out of', 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(\n `node-csfd-api:\n You can not use both parameters 'includesOnly' and 'excludes'.\n Parameter 'includesOnly' will be used now:`,\n config.includesOnly\n );\n }\n }\n\n for (const el of movies) {\n const type = getUserRatingType(el);\n\n // Filtering includesOnly\n if (config?.includesOnly?.length) {\n if (config.includesOnly.some((include) => type === include)) {\n films.push(this.buildUserRatings(el, type));\n }\n // Filter excludes\n } else if (config?.excludes?.length) {\n if (!config.excludes.some((exclude) => type === exclude)) {\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,EAAE;EACrC,MAAM,cAAc,QAAQ,QAAQ;EACpC,MAAM,MAAMA,4BAAe,MAAM,cAAc,IAAI,cAAc,QAAW,EAC1E,UAAU,SAAS,UACpB,CAAC;EAEF,MAAM,oCADW,MAAMC,wBAAU,KAAK,EAAE,GAAG,SAAS,SAAS,CAAC,CACjC;EAC7B,MAAM,SAAS,MAAM,iBAAiB,6BAA6B;EAGnE,MAAM,YAAY,MAAM,cAAc,cAAc;EACpD,MAAM,QAAQ,CAAC,WAAW,WAAW,UAAU,WAAW,SAAS,GAAG,WAAW;AAEjF,cAAY,KAAK,QAAQ,QAAQ,OAAO;AAExC,MAAI,QAAQ,UAAU;AACpB,WAAQ,IAAI,QAAQ,MAAM,IAAI;AAC9B,WAAQ,IAAI,sBAAsB,MAAM;AACxC,QAAK,IAAI,IAAI,GAAG,KAAK,OAAO,KAAK;AAC/B,YAAQ,IAAI,iBAAiB,GAAG,UAAU,OAAO,MAAM;IAKvD,MAAM,qCAHW,MAAMA,wBADXD,4BAAe,MAAM,GAAG,EAAE,UAAU,SAAS,UAAU,CAAC,EAC9B,EAAE,GAAG,SAAS,SAAS,CAAC,CAEjC,CACR,iBAAiB,6BAA6B;AACnE,gBAAY,CAAC,GAAG,WAAW,GAAG,KAAK,QAAQ,QAAQ,OAAO,CAAC;AAG3D,QAAI,OAAO,cACT,OAAME,4BAAM,OAAO,cAAc;;AAGrC,UAAO;;AAGT,SAAO;;CAGT,AAAQ,QAAQ,QAA8B,QAAuB;EACnE,MAAM,QAA2B,EAAE;AACnC,MAAI,QACF;OAAI,OAAO,cAAc,UAAU,OAAO,UAAU,OAClD,SAAQ,KACN;;qDAGA,OAAO,aACR;;AAIL,OAAK,MAAM,MAAM,QAAQ;GACvB,MAAM,OAAOC,8CAAkB,GAAG;AAGlC,OAAI,QAAQ,cAAc,QACxB;QAAI,OAAO,aAAa,MAAM,YAAY,SAAS,QAAQ,CACzD,OAAM,KAAK,KAAK,iBAAiB,IAAI,KAAK,CAAC;cAGpC,QAAQ,UAAU,QAC3B;QAAI,CAAC,OAAO,SAAS,MAAM,YAAY,SAAS,QAAQ,CACtD,OAAM,KAAK,KAAK,iBAAiB,IAAI,KAAK,CAAC;SAI7C,OAAM,KAAK,KAAK,iBAAiB,IAAI,KAAK,CAAC;;AAG/C,SAAO;;CAGT,AAAQ,iBAAiB,IAAiB,MAAsC;AAC9E,SAAO;GACL,IAAIC,4CAAgB,GAAG;GACvB,OAAOC,+CAAmB,GAAG;GAC7B,MAAMC,8CAAkB,GAAG;GAC3B;GACA,KAAKC,6CAAiB,GAAG;GACzB,aAAaC,qDAAyB,GAAG;GACzC,UAAUC,8CAAkB,GAAG;GAC/B,YAAYC,0CAAc,GAAG;GAC9B"}
|
|
@@ -38,19 +38,19 @@ var UserRatingsScraper = class {
|
|
|
38
38
|
for (const el of movies) {
|
|
39
39
|
const type = getUserRatingType(el);
|
|
40
40
|
if (config?.includesOnly?.length) {
|
|
41
|
-
if (config.includesOnly.some((include) => type === include)) films.push(this.buildUserRatings(el));
|
|
41
|
+
if (config.includesOnly.some((include) => type === include)) films.push(this.buildUserRatings(el, type));
|
|
42
42
|
} else if (config?.excludes?.length) {
|
|
43
|
-
if (!config.excludes.some((exclude) => type === exclude)) films.push(this.buildUserRatings(el));
|
|
44
|
-
} else films.push(this.buildUserRatings(el));
|
|
43
|
+
if (!config.excludes.some((exclude) => type === exclude)) films.push(this.buildUserRatings(el, type));
|
|
44
|
+
} else films.push(this.buildUserRatings(el, type));
|
|
45
45
|
}
|
|
46
46
|
return films;
|
|
47
47
|
}
|
|
48
|
-
buildUserRatings(el) {
|
|
48
|
+
buildUserRatings(el, type) {
|
|
49
49
|
return {
|
|
50
50
|
id: getUserRatingId(el),
|
|
51
51
|
title: getUserRatingTitle(el),
|
|
52
52
|
year: getUserRatingYear(el),
|
|
53
|
-
type
|
|
53
|
+
type,
|
|
54
54
|
url: getUserRatingUrl(el),
|
|
55
55
|
colorRating: getUserRatingColorRating(el),
|
|
56
56
|
userDate: getUserRatingDate(el),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user-ratings.service.mjs","names":[],"sources":["../../src/services/user-ratings.service.ts"],"sourcesContent":["import { HTMLElement, parse } from 'node-html-parser';\nimport { CSFDColorRating, 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 { 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 console.log('User', user, url);\n console.log('Fetching all pages', pages);\n for (let i = 2; i <= pages; i++) {\n console.log('Fetching page', i, 'out of', 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(\n `node-csfd-api:\n You can not use both parameters 'includesOnly' and 'excludes'.\n Parameter 'includesOnly' will be used now:`,\n config.includesOnly\n );\n }\n }\n\n for (const el of movies) {\n const type = getUserRatingType(el);\n\n // Filtering includesOnly\n if (config?.includesOnly?.length) {\n if (config.includesOnly.some((include) => type === include)) {\n films.push(this.buildUserRatings(el));\n }\n // Filter excludes\n } else if (config?.excludes?.length) {\n if (!config.excludes.some((exclude) => type === exclude)) {\n films.push(this.buildUserRatings(el));\n }\n } else {\n // Without filtering\n films.push(this.buildUserRatings(el));\n }\n }\n return films;\n }\n\n private buildUserRatings(el: HTMLElement): CSFDUserRatings {\n return {\n id: getUserRatingId(el),\n title: getUserRatingTitle(el),\n year: getUserRatingYear(el),\n type
|
|
1
|
+
{"version":3,"file":"user-ratings.service.mjs","names":[],"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 { 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 console.log('User', user, url);\n console.log('Fetching all pages', pages);\n for (let i = 2; i <= pages; i++) {\n console.log('Fetching page', i, 'out of', 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(\n `node-csfd-api:\n You can not use both parameters 'includesOnly' and 'excludes'.\n Parameter 'includesOnly' will be used now:`,\n config.includesOnly\n );\n }\n }\n\n for (const el of movies) {\n const type = getUserRatingType(el);\n\n // Filtering includesOnly\n if (config?.includesOnly?.length) {\n if (config.includesOnly.some((include) => type === include)) {\n films.push(this.buildUserRatings(el, type));\n }\n // Filter excludes\n } else if (config?.excludes?.length) {\n if (!config.excludes.some((exclude) => type === exclude)) {\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,EAAE;EACrC,MAAM,cAAc,QAAQ,QAAQ;EACpC,MAAM,MAAM,eAAe,MAAM,cAAc,IAAI,cAAc,QAAW,EAC1E,UAAU,SAAS,UACpB,CAAC;EAEF,MAAM,QAAQ,MADG,MAAM,UAAU,KAAK,EAAE,GAAG,SAAS,SAAS,CAAC,CACjC;EAC7B,MAAM,SAAS,MAAM,iBAAiB,6BAA6B;EAGnE,MAAM,YAAY,MAAM,cAAc,cAAc;EACpD,MAAM,QAAQ,CAAC,WAAW,WAAW,UAAU,WAAW,SAAS,GAAG,WAAW;AAEjF,cAAY,KAAK,QAAQ,QAAQ,OAAO;AAExC,MAAI,QAAQ,UAAU;AACpB,WAAQ,IAAI,QAAQ,MAAM,IAAI;AAC9B,WAAQ,IAAI,sBAAsB,MAAM;AACxC,QAAK,IAAI,IAAI,GAAG,KAAK,OAAO,KAAK;AAC/B,YAAQ,IAAI,iBAAiB,GAAG,UAAU,OAAO,MAAM;IAKvD,MAAM,SADQ,MAFG,MAAM,UADX,eAAe,MAAM,GAAG,EAAE,UAAU,SAAS,UAAU,CAAC,EAC9B,EAAE,GAAG,SAAS,SAAS,CAAC,CAEjC,CACR,iBAAiB,6BAA6B;AACnE,gBAAY,CAAC,GAAG,WAAW,GAAG,KAAK,QAAQ,QAAQ,OAAO,CAAC;AAG3D,QAAI,OAAO,cACT,OAAM,MAAM,OAAO,cAAc;;AAGrC,UAAO;;AAGT,SAAO;;CAGT,AAAQ,QAAQ,QAA8B,QAAuB;EACnE,MAAM,QAA2B,EAAE;AACnC,MAAI,QACF;OAAI,OAAO,cAAc,UAAU,OAAO,UAAU,OAClD,SAAQ,KACN;;qDAGA,OAAO,aACR;;AAIL,OAAK,MAAM,MAAM,QAAQ;GACvB,MAAM,OAAO,kBAAkB,GAAG;AAGlC,OAAI,QAAQ,cAAc,QACxB;QAAI,OAAO,aAAa,MAAM,YAAY,SAAS,QAAQ,CACzD,OAAM,KAAK,KAAK,iBAAiB,IAAI,KAAK,CAAC;cAGpC,QAAQ,UAAU,QAC3B;QAAI,CAAC,OAAO,SAAS,MAAM,YAAY,SAAS,QAAQ,CACtD,OAAM,KAAK,KAAK,iBAAiB,IAAI,KAAK,CAAC;SAI7C,OAAM,KAAK,KAAK,iBAAiB,IAAI,KAAK,CAAC;;AAG/C,SAAO;;CAGT,AAAQ,iBAAiB,IAAiB,MAAsC;AAC9E,SAAO;GACL,IAAI,gBAAgB,GAAG;GACvB,OAAO,mBAAmB,GAAG;GAC7B,MAAM,kBAAkB,GAAG;GAC3B;GACA,KAAK,iBAAiB,GAAG;GACzB,aAAa,yBAAyB,GAAG;GACzC,UAAU,kBAAkB,GAAG;GAC/B,YAAY,cAAc,GAAG;GAC9B"}
|
|
@@ -38,19 +38,19 @@ var UserReviewsScraper = class {
|
|
|
38
38
|
for (const el of reviews) {
|
|
39
39
|
const type = require_user_reviews_helper.getUserReviewType(el);
|
|
40
40
|
if (config?.includesOnly?.length) {
|
|
41
|
-
if (config.includesOnly.some((include) => type === include)) films.push(this.buildUserReviews(el));
|
|
41
|
+
if (config.includesOnly.some((include) => type === include)) films.push(this.buildUserReviews(el, type));
|
|
42
42
|
} else if (config?.excludes?.length) {
|
|
43
|
-
if (!config.excludes.some((exclude) => type === exclude)) films.push(this.buildUserReviews(el));
|
|
44
|
-
} else films.push(this.buildUserReviews(el));
|
|
43
|
+
if (!config.excludes.some((exclude) => type === exclude)) films.push(this.buildUserReviews(el, type));
|
|
44
|
+
} else films.push(this.buildUserReviews(el, type));
|
|
45
45
|
}
|
|
46
46
|
return films;
|
|
47
47
|
}
|
|
48
|
-
buildUserReviews(el) {
|
|
48
|
+
buildUserReviews(el, type) {
|
|
49
49
|
return {
|
|
50
50
|
id: require_user_reviews_helper.getUserReviewId(el),
|
|
51
51
|
title: require_user_reviews_helper.getUserReviewTitle(el),
|
|
52
52
|
year: require_user_reviews_helper.getUserReviewYear(el),
|
|
53
|
-
type
|
|
53
|
+
type,
|
|
54
54
|
url: require_user_reviews_helper.getUserReviewUrl(el),
|
|
55
55
|
colorRating: require_user_reviews_helper.getUserReviewColorRating(el),
|
|
56
56
|
userDate: require_user_reviews_helper.getUserReviewDate(el),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user-reviews.service.js","names":["userReviewsUrl","fetchPage","sleep","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, 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 { 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 console.log('User', user, url);\n console.log('Fetching all pages', pages);\n for (let i = 2; i <= pages; i++) {\n console.log('Fetching page', i, 'out of', 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(\n `node-csfd-api:\n You can not use both parameters 'includesOnly' and 'excludes'.\n Parameter 'includesOnly' will be used now:`,\n config.includesOnly\n );\n }\n }\n\n for (const el of reviews) {\n const type = getUserReviewType(el);\n\n // Filtering includesOnly\n if (config?.includesOnly?.length) {\n if (config.includesOnly.some((include) => type === include)) {\n films.push(this.buildUserReviews(el));\n }\n // Filter excludes\n } else if (config?.excludes?.length) {\n if (!config.excludes.some((exclude) => type === exclude)) {\n films.push(this.buildUserReviews(el));\n }\n } else {\n // Without filtering\n films.push(this.buildUserReviews(el));\n }\n }\n return films;\n }\n\n private buildUserReviews(el: HTMLElement): CSFDUserReviews {\n return {\n id: getUserReviewId(el),\n title: getUserReviewTitle(el),\n year: getUserReviewYear(el),\n type
|
|
1
|
+
{"version":3,"file":"user-reviews.service.js","names":["userReviewsUrl","fetchPage","sleep","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 { 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 console.log('User', user, url);\n console.log('Fetching all pages', pages);\n for (let i = 2; i <= pages; i++) {\n console.log('Fetching page', i, 'out of', 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(\n `node-csfd-api:\n You can not use both parameters 'includesOnly' and 'excludes'.\n Parameter 'includesOnly' will be used now:`,\n config.includesOnly\n );\n }\n }\n\n for (const el of reviews) {\n const type = getUserReviewType(el);\n\n // Filtering includesOnly\n if (config?.includesOnly?.length) {\n if (config.includesOnly.some((include) => type === include)) {\n films.push(this.buildUserReviews(el, type));\n }\n // Filter excludes\n } else if (config?.excludes?.length) {\n if (!config.excludes.some((exclude) => type === exclude)) {\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,EAAE;EACtC,MAAM,cAAc,QAAQ,QAAQ;EACpC,MAAM,MAAMA,4BAAe,MAAM,cAAc,IAAI,cAAc,QAAW,EAC1E,UAAU,SAAS,UACpB,CAAC;EAEF,MAAM,oCADW,MAAMC,wBAAU,KAAK,EAAE,GAAG,SAAS,SAAS,CAAC,CACjC;EAC7B,MAAM,UAAU,MAAM,iBAAiB,6BAA6B;EAGpE,MAAM,YAAY,MAAM,cAAc,cAAc;EACpD,MAAM,QAAQ,CAAC,WAAW,WAAW,UAAU,WAAW,SAAS,GAAG,WAAW;AAEjF,eAAa,KAAK,QAAQ,QAAQ,QAAQ;AAE1C,MAAI,QAAQ,UAAU;AACpB,WAAQ,IAAI,QAAQ,MAAM,IAAI;AAC9B,WAAQ,IAAI,sBAAsB,MAAM;AACxC,QAAK,IAAI,IAAI,GAAG,KAAK,OAAO,KAAK;AAC/B,YAAQ,IAAI,iBAAiB,GAAG,UAAU,OAAO,MAAM;IAKvD,MAAM,sCAHW,MAAMA,wBADXD,4BAAe,MAAM,GAAG,EAAE,UAAU,SAAS,UAAU,CAAC,EAC9B,EAAE,GAAG,SAAS,SAAS,CAAC,CAEjC,CACP,iBAAiB,6BAA6B;AACpE,iBAAa,CAAC,GAAG,YAAY,GAAG,KAAK,QAAQ,QAAQ,QAAQ,CAAC;AAG9D,QAAI,OAAO,cACT,OAAME,4BAAM,OAAO,cAAc;;AAGrC,UAAO;;AAGT,SAAO;;CAGT,AAAQ,QAAQ,QAA+B,SAAwB;EACrE,MAAM,QAA2B,EAAE;AACnC,MAAI,QACF;OAAI,OAAO,cAAc,UAAU,OAAO,UAAU,OAClD,SAAQ,KACN;;qDAGA,OAAO,aACR;;AAIL,OAAK,MAAM,MAAM,SAAS;GACxB,MAAM,OAAOC,8CAAkB,GAAG;AAGlC,OAAI,QAAQ,cAAc,QACxB;QAAI,OAAO,aAAa,MAAM,YAAY,SAAS,QAAQ,CACzD,OAAM,KAAK,KAAK,iBAAiB,IAAI,KAAK,CAAC;cAGpC,QAAQ,UAAU,QAC3B;QAAI,CAAC,OAAO,SAAS,MAAM,YAAY,SAAS,QAAQ,CACtD,OAAM,KAAK,KAAK,iBAAiB,IAAI,KAAK,CAAC;SAI7C,OAAM,KAAK,KAAK,iBAAiB,IAAI,KAAK,CAAC;;AAG/C,SAAO;;CAGT,AAAQ,iBAAiB,IAAiB,MAAsC;AAC9E,SAAO;GACL,IAAIC,4CAAgB,GAAG;GACvB,OAAOC,+CAAmB,GAAG;GAC7B,MAAMC,8CAAkB,GAAG;GAC3B;GACA,KAAKC,6CAAiB,GAAG;GACzB,aAAaC,qDAAyB,GAAG;GACzC,UAAUC,8CAAkB,GAAG;GAC/B,YAAYC,gDAAoB,GAAG;GACnC,MAAMC,8CAAkB,GAAG;GAC3B,QAAQC,gDAAoB,GAAG;GAChC"}
|
|
@@ -38,19 +38,19 @@ var UserReviewsScraper = class {
|
|
|
38
38
|
for (const el of reviews) {
|
|
39
39
|
const type = getUserReviewType(el);
|
|
40
40
|
if (config?.includesOnly?.length) {
|
|
41
|
-
if (config.includesOnly.some((include) => type === include)) films.push(this.buildUserReviews(el));
|
|
41
|
+
if (config.includesOnly.some((include) => type === include)) films.push(this.buildUserReviews(el, type));
|
|
42
42
|
} else if (config?.excludes?.length) {
|
|
43
|
-
if (!config.excludes.some((exclude) => type === exclude)) films.push(this.buildUserReviews(el));
|
|
44
|
-
} else films.push(this.buildUserReviews(el));
|
|
43
|
+
if (!config.excludes.some((exclude) => type === exclude)) films.push(this.buildUserReviews(el, type));
|
|
44
|
+
} else films.push(this.buildUserReviews(el, type));
|
|
45
45
|
}
|
|
46
46
|
return films;
|
|
47
47
|
}
|
|
48
|
-
buildUserReviews(el) {
|
|
48
|
+
buildUserReviews(el, type) {
|
|
49
49
|
return {
|
|
50
50
|
id: getUserReviewId(el),
|
|
51
51
|
title: getUserReviewTitle(el),
|
|
52
52
|
year: getUserReviewYear(el),
|
|
53
|
-
type
|
|
53
|
+
type,
|
|
54
54
|
url: getUserReviewUrl(el),
|
|
55
55
|
colorRating: getUserReviewColorRating(el),
|
|
56
56
|
userDate: getUserReviewDate(el),
|