From 29e60e3059ae63704d351e91264534b12efe5a2c Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Tue, 17 Mar 2026 20:54:17 +0000 Subject: [PATCH] =?UTF-8?q?=E2=9A=A1=20Bolt:=20[performance=20improvement]?= =?UTF-8?q?=20optimize=20parseSearchPeople?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Combine redundant node-html-parser traversals for "Režie:" and "Hrají:" into a single efficient pass over \`.article-content p\` elements. Co-authored-by: bartholomej <5861310+bartholomej@users.noreply.github.com> --- src/helpers/search.helper.ts | 57 +++++++++++++++++++++------------- src/services/search.service.ts | 7 ++--- tests/search.test.ts | 18 +++++------ 3 files changed, 47 insertions(+), 35 deletions(-) diff --git a/src/helpers/search.helper.ts b/src/helpers/search.helper.ts index 7ec62343..26bef43f 100644 --- a/src/helpers/search.helper.ts +++ b/src/helpers/search.helper.ts @@ -42,29 +42,44 @@ 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í:'; +export const getSearchCreators = ( + el: HTMLElement +): { directors: CSFDMovieCreator[]; actors: CSFDMovieCreator[] } => { + const result = { directors: [] as CSFDMovieCreator[], actors: [] as CSFDMovieCreator[] }; - const peopleNode = Array.from(el && el.querySelectorAll('.article-content p')).find((el) => - el.textContent.includes(who) - ); + const pNodes = el ? el.querySelectorAll('.article-content p') : []; + + let foundDirectors = false; + let foundActors = false; - if (peopleNode) { - const people = Array.from(peopleNode.querySelectorAll('a')) as unknown as HTMLElement[]; + for (const node of pNodes) { + if (foundDirectors && foundActors) break; - return people.map((person) => { - return { - id: parseIdFromUrl(person.attributes.href), - name: person.innerText.trim(), - url: `https://www.csfd.cz${person.attributes.href}` - }; - }); - } else { - return []; + const text = node.textContent; + if (!foundDirectors && text.includes('Režie:')) { + result.directors = (Array.from(node.querySelectorAll('a')) as unknown as HTMLElement[]).map( + (person) => { + return { + id: parseIdFromUrl(person.attributes.href), + name: person.innerText.trim(), + url: `https://www.csfd.cz${person.attributes.href}` + }; + } + ); + foundDirectors = true; + } else if (!foundActors && text.includes('Hrají:')) { + result.actors = (Array.from(node.querySelectorAll('a')) as unknown as HTMLElement[]).map( + (person) => { + return { + id: parseIdFromUrl(person.attributes.href), + name: person.innerText.trim(), + url: `https://www.csfd.cz${person.attributes.href}` + }; + } + ); + foundActors = true; + } } + + return result; }; diff --git a/src/services/search.service.ts b/src/services/search.service.ts index 9e61d523..f8c44234 100644 --- a/src/services/search.service.ts +++ b/src/services/search.service.ts @@ -12,7 +12,7 @@ import { getSearchType, getSearchUrl, getSearchYear, - parseSearchPeople + getSearchCreators } 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: getSearchCreators(m) }; }; diff --git a/tests/search.test.ts b/tests/search.test.ts index 8935b29b..5a5a6eae 100644 --- a/tests/search.test.ts +++ b/tests/search.test.ts @@ -16,7 +16,7 @@ import { getSearchType, getSearchUrl, getSearchYear, - parseSearchPeople + getSearchCreators } from '../src/helpers/search.helper'; import { searchMock } from './mocks/search.html'; @@ -147,7 +147,7 @@ describe('Get Movie origins', () => { describe('Get Movie creators', () => { test('First movie directors', () => { - const movie = parseSearchPeople(moviesNode[0], 'directors'); + const movie = getSearchCreators(moviesNode[0]).directors; expect(movie).toEqual([ { id: 3112, @@ -162,7 +162,7 @@ describe('Get Movie creators', () => { ]); }); test('Last movie actors', () => { - const movie = parseSearchPeople(moviesNode[moviesNode.length - 1], 'actors'); + const movie = getSearchCreators(moviesNode[moviesNode.length - 1]).actors; expect(movie).toEqual([ { id: 101, @@ -177,7 +177,7 @@ describe('Get Movie creators', () => { ]); }); // test('Empty actors', () => { - // const movie = parseSearchPeople(moviesNode[5], 'actors'); + // const movie = getSearchCreators(moviesNode[5]).actors; // expect(movie).toEqual([]); // }); }); @@ -295,7 +295,7 @@ describe('Get TV series origins', () => { describe('Get TV series creators', () => { test('First TV series directors', () => { - const movie = parseSearchPeople(tvSeriesNode[0], 'directors'); + const movie = getSearchCreators(tvSeriesNode[0]).directors; expect(movie).toEqual([ { id: 8877, @@ -310,7 +310,7 @@ describe('Get TV series creators', () => { ]); }); test('Last TV series actors', () => { - const movie = parseSearchPeople(tvSeriesNode[tvSeriesNode.length - 1], 'actors'); + const movie = getSearchCreators(tvSeriesNode[tvSeriesNode.length - 1]).actors; expect(movie).toEqual([ { id: 74751, @@ -325,12 +325,12 @@ describe('Get TV series creators', () => { ]); }); test('Empty directors', () => { - const movie = parseSearchPeople(tvSeriesNode[3], 'directors'); + const movie = getSearchCreators(tvSeriesNode[3]).directors; expect(movie).toEqual([]); }); test('Empty directors + some actors', () => { - const movie = parseSearchPeople(tvSeriesNode[3], 'actors'); - const movieDirectors = parseSearchPeople(tvSeriesNode[3], 'directors'); + const movie = getSearchCreators(tvSeriesNode[3]).actors; + const movieDirectors = getSearchCreators(tvSeriesNode[3]).directors; expect(movie).toEqual([ { id: 61834,