From 85b4054e81b29b52ed15c6122a89620e0f4e62c9 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Wed, 8 Apr 2026 19:59:50 +0000 Subject: [PATCH] =?UTF-8?q?=E2=9A=A1=20Bolt:=20[performance=20improvement]?= =?UTF-8?q?=20Optimize=20search=20creators=20parsing?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: bartholomej <5861310+bartholomej@users.noreply.github.com> --- src/helpers/search.helper.ts | 65 ++++++++++++++++++++++------------ src/services/search.service.ts | 7 ++-- tests/search.test.ts | 49 +++++++++++++------------ 3 files changed, 68 insertions(+), 53 deletions(-) diff --git a/src/helpers/search.helper.ts b/src/helpers/search.helper.ts index 7ec62343..7acd23a9 100644 --- a/src/helpers/search.helper.ts +++ b/src/helpers/search.helper.ts @@ -42,29 +42,48 @@ export const getSearchOrigins = (el: HTMLElement): string[] => { return originsAll?.split('/').map((country) => country.trim()); }; -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) - ); +export const parseSearchCreators = ( + el: HTMLElement +): { directors: CSFDMovieCreator[]; actors: CSFDMovieCreator[] } => { + const creators: { directors: CSFDMovieCreator[]; actors: CSFDMovieCreator[] } = { + directors: [], + actors: [] + }; + + if (!el) return creators; + + const pNodes = el.querySelectorAll('.article-content 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 []; + let directorsNode: HTMLElement | null = null; + let actorsNode: HTMLElement | null = null; + + // Single pass to find both directors and actors nodes + for (const node of pNodes) { + const text = node.textContent; + if (text.includes('Režie:')) { + directorsNode = node; + } else if (text.includes('Hrají:')) { + actorsNode = node; + } } + + if (directorsNode) { + const people = directorsNode.querySelectorAll('a'); + creators.directors = people.map((person) => ({ + id: parseIdFromUrl(person.attributes.href), + name: person.innerText.trim(), + url: `https://www.csfd.cz${person.attributes.href}` + })); + } + + if (actorsNode) { + const people = actorsNode.querySelectorAll('a'); + creators.actors = people.map((person) => ({ + id: parseIdFromUrl(person.attributes.href), + name: person.innerText.trim(), + url: `https://www.csfd.cz${person.attributes.href}` + })); + } + + return creators; }; diff --git a/src/services/search.service.ts b/src/services/search.service.ts index 9e61d523..6a841214 100644 --- a/src/services/search.service.ts +++ b/src/services/search.service.ts @@ -12,7 +12,7 @@ import { getSearchType, getSearchUrl, getSearchYear, - parseSearchPeople + parseSearchCreators } from '../helpers/search.helper'; import { CSFDLanguage, CSFDOptions } from '../types'; import { getUrlByLanguage, searchUrl } from '../vars'; @@ -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: parseSearchCreators(m) }; }; diff --git a/tests/search.test.ts b/tests/search.test.ts index d7a4029c..8af0daa7 100644 --- a/tests/search.test.ts +++ b/tests/search.test.ts @@ -16,7 +16,7 @@ import { getSearchType, getSearchUrl, getSearchYear, - parseSearchPeople + parseSearchCreators } from '../src/helpers/search.helper'; import { searchMock } from './mocks/search.html'; @@ -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 creators = parseSearchCreators(moviesNode[0]); + expect(creators.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 creators = parseSearchCreators(moviesNode[moviesNode.length - 1]); + expect(creators.actors).toEqual([ { id: 101, name: 'Carrie-Anne Moss', @@ -177,8 +177,8 @@ describe('Get Movie creators', () => { ]); }); // test('Empty actors', () => { - // const movie = parseSearchPeople(moviesNode[5], 'actors'); - // expect(movie).toEqual([]); + // const movie = parseSearchCreators(moviesNode[5]); + // expect(movie.actors).toEqual([]); // }); }); @@ -295,30 +295,29 @@ describe('Get TV series origins', () => { describe('Get TV series creators', () => { test('First TV series directors', () => { - const movie = parseSearchPeople(tvSeriesNode[0], 'directors'); - expect(movie.length).toBeGreaterThan(0); - expect(movie[0].id).toBeGreaterThan(0); - expect(movie[0].name.length).toBeGreaterThan(0); - expect(movie[0].url).toContain(String(movie[0].id)); - expect(movie[0].url).toContain('https://www.csfd.cz/tvurce/'); + const creators = parseSearchCreators(tvSeriesNode[0]); + expect(creators.directors.length).toBeGreaterThan(0); + expect(creators.directors[0].id).toBeGreaterThan(0); + expect(creators.directors[0].name.length).toBeGreaterThan(0); + expect(creators.directors[0].url).toContain(String(creators.directors[0].id)); + expect(creators.directors[0].url).toContain('https://www.csfd.cz/tvurce/'); }); test('Last TV series actors', () => { - const movie = parseSearchPeople(tvSeriesNode[tvSeriesNode.length - 1], 'actors'); - expect(movie.length).toBeGreaterThan(0); - expect(movie[0].id).toBeGreaterThan(0); - expect(movie[0].name.length).toBeGreaterThan(0); - expect(movie[0].url).toContain(String(movie[0].id)); - expect(movie[0].url).toContain('https://www.csfd.cz/tvurce/'); + const creators = parseSearchCreators(tvSeriesNode[tvSeriesNode.length - 1]); + expect(creators.actors.length).toBeGreaterThan(0); + expect(creators.actors[0].id).toBeGreaterThan(0); + expect(creators.actors[0].name.length).toBeGreaterThan(0); + expect(creators.actors[0].url).toContain(String(creators.actors[0].id)); + expect(creators.actors[0].url).toContain('https://www.csfd.cz/tvurce/'); }); test('Empty directors check', () => { - const movie = parseSearchPeople(parse('
') as any, 'directors'); - expect(movie).toEqual([]); + const creators = parseSearchCreators(parse('
') as any); + expect(creators.directors).toEqual([]); }); // test('Empty directors + some actors', () => { - // const movie = parseSearchPeople(tvSeriesNode[3], 'actors'); - // const movieDirectors = parseSearchPeople(tvSeriesNode[3], 'directors'); - // expect(movie.length).toBeGreaterThan(0); - // expect(movieDirectors.length).toBeGreaterThan(0); // The mock changed, it now has directors + // const movie = parseSearchCreators(tvSeriesNode[3]); + // expect(movie.actors.length).toBeGreaterThan(0); + // expect(movie.directors.length).toBeGreaterThan(0); // The mock changed, it now has directors // }); });