diff --git a/src/helpers/search.helper.ts b/src/helpers/search.helper.ts index 7ec62343..74a51215 100644 --- a/src/helpers/search.helper.ts +++ b/src/helpers/search.helper.ts @@ -43,28 +43,42 @@ export const getSearchOrigins = (el: HTMLElement): string[] => { }; export const parseSearchPeople = ( - el: HTMLElement, - type: 'directors' | 'actors' -): CSFDMovieCreator[] => { - let who: Creator; - if (type === 'directors') who = 'Režie:'; - if (type === 'actors') who = 'Hrají:'; - - const peopleNode = Array.from(el && el.querySelectorAll('.article-content p')).find((el) => - el.textContent.includes(who) - ); + el: HTMLElement +): { directors: CSFDMovieCreator[]; actors: CSFDMovieCreator[] } => { + const result = { + directors: [] as CSFDMovieCreator[], + actors: [] as CSFDMovieCreator[] + }; + + if (!el) return result; + + // Optimization: Traverse `.article-content p` once to find both directors and actors + const articleContent = el.querySelector('.article-content'); + if (!articleContent) return result; + + const pNodes = articleContent.querySelectorAll('p'); - if (peopleNode) { - const people = Array.from(peopleNode.querySelectorAll('a')) as unknown as HTMLElement[]; - - return people.map((person) => { - return { - id: parseIdFromUrl(person.attributes.href), - name: person.innerText.trim(), - url: `https://www.csfd.cz${person.attributes.href}` - }; - }); - } else { - return []; + for (const node of pNodes) { + const text = node.textContent; + let targetGroup: CSFDMovieCreator[] | null = null; + + if (text.includes('Režie:')) { + targetGroup = result.directors; + } else if (text.includes('Hrají:')) { + targetGroup = result.actors; + } + + if (targetGroup) { + const people = node.querySelectorAll('a'); + for (const person of people) { + targetGroup.push({ + id: parseIdFromUrl(person.attributes.href), + name: person.innerText.trim(), + url: `https://www.csfd.cz${person.attributes.href}` + }); + } + } } + + return result; }; diff --git a/src/services/search.service.ts b/src/services/search.service.ts index 9e61d523..cafa08ca 100644 --- a/src/services/search.service.ts +++ b/src/services/search.service.ts @@ -56,10 +56,7 @@ export class SearchScraper { colorRating: getSearchColorRating(m), poster: getSearchPoster(m), origins: getSearchOrigins(m), - creators: { - directors: parseSearchPeople(m, 'directors'), - actors: parseSearchPeople(m, 'actors') - } + creators: parseSearchPeople(m) }; }; diff --git a/tests/search.test.ts b/tests/search.test.ts index 8935b29b..caea0c92 100644 --- a/tests/search.test.ts +++ b/tests/search.test.ts @@ -147,8 +147,8 @@ describe('Get Movie origins', () => { describe('Get Movie creators', () => { test('First movie directors', () => { - const movie = parseSearchPeople(moviesNode[0], 'directors'); - expect(movie).toEqual([ + const movie = parseSearchPeople(moviesNode[0]); + expect(movie.directors).toEqual([ { id: 3112, name: 'Lilly Wachowski', @@ -162,8 +162,8 @@ describe('Get Movie creators', () => { ]); }); test('Last movie actors', () => { - const movie = parseSearchPeople(moviesNode[moviesNode.length - 1], 'actors'); - expect(movie).toEqual([ + const movie = parseSearchPeople(moviesNode[moviesNode.length - 1]); + expect(movie.actors).toEqual([ { id: 101, name: 'Carrie-Anne Moss', @@ -295,8 +295,8 @@ describe('Get TV series origins', () => { describe('Get TV series creators', () => { test('First TV series directors', () => { - const movie = parseSearchPeople(tvSeriesNode[0], 'directors'); - expect(movie).toEqual([ + const movie = parseSearchPeople(tvSeriesNode[0]); + expect(movie.directors).toEqual([ { id: 8877, name: 'Allan Eastman', @@ -310,8 +310,8 @@ describe('Get TV series creators', () => { ]); }); test('Last TV series actors', () => { - const movie = parseSearchPeople(tvSeriesNode[tvSeriesNode.length - 1], 'actors'); - expect(movie).toEqual([ + const movie = parseSearchPeople(tvSeriesNode[tvSeriesNode.length - 1]); + expect(movie.actors).toEqual([ { id: 74751, name: 'Takeru Sató', @@ -325,20 +325,19 @@ describe('Get TV series creators', () => { ]); }); test('Empty directors', () => { - const movie = parseSearchPeople(tvSeriesNode[3], 'directors'); - expect(movie).toEqual([]); + const movie = parseSearchPeople(tvSeriesNode[3]); + expect(movie.directors).toEqual([]); }); test('Empty directors + some actors', () => { - const movie = parseSearchPeople(tvSeriesNode[3], 'actors'); - const movieDirectors = parseSearchPeople(tvSeriesNode[3], 'directors'); - expect(movie).toEqual([ + const movie = parseSearchPeople(tvSeriesNode[3]); + expect(movie.actors).toEqual([ { id: 61834, name: 'David Icke', url: 'https://www.csfd.cz/tvurce/61834-david-icke/prehled/' } ]); - expect(movieDirectors).toEqual([]); + expect(movie.directors).toEqual([]); }); });