From e327f3c7344ce5a8553eb14b5d578d3221b2c81b Mon Sep 17 00:00:00 2001 From: WebStreamr <210764791+webstreamr@users.noreply.github.com> Date: Mon, 29 Sep 2025 20:01:52 +0000 Subject: [PATCH] chore(source): support similar match search in HomeCine --- src/source/HomeCine.ts | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/src/source/HomeCine.ts b/src/source/HomeCine.ts index 03b63a4..d7091ef 100644 --- a/src/source/HomeCine.ts +++ b/src/source/HomeCine.ts @@ -1,4 +1,5 @@ import * as cheerio from 'cheerio'; +import levenshtein from 'fast-levenshtein'; import { ContentType } from 'stremio-addon-sdk'; import { Context, CountryCode } from '../types'; import { Fetcher, getTmdbId, getTmdbNameAndYear, Id, TmdbId } from '../utils'; @@ -28,9 +29,9 @@ export class HomeCine extends Source { const [name, year, originalName] = await getTmdbNameAndYear(ctx, this.fetcher, tmdbId, 'es'); - let pageUrl = await this.fetchPageUrl(ctx, name, year, tmdbId); + let pageUrl = await this.fetchPageUrl(ctx, name, tmdbId); if (!pageUrl) { - pageUrl = await this.fetchPageUrl(ctx, originalName, year, tmdbId); + pageUrl = await this.fetchPageUrl(ctx, originalName, tmdbId); if (!pageUrl) { return []; } @@ -66,22 +67,35 @@ export class HomeCine extends Source { }).toArray(); }; - private readonly fetchPageUrl = async (ctx: Context, name: string, year: number, tmdbId: TmdbId): Promise => { + private readonly fetchPageUrl = async (ctx: Context, name: string, tmdbId: TmdbId): Promise => { const searchUrl = new URL(`/?s=${encodeURIComponent(name)}`, this.baseUrl); const html = await this.fetcher.text(ctx, searchUrl); const $ = cheerio.load(html); - const keywords = [ + const keywords = [...new Set([ name, name.replace('-', '–'), - ]; + ])]; const urls: URL[] = []; + + // exact match keywords.map((keyword) => { urls.push( - ...$(`a[oldtitle="${keyword} (${year})"], a[oldtitle="${keyword}"]`) + ...$(`a[oldtitle="${keyword}"]`) + .map((_i, el) => new URL($(el).attr('href') as string)) + .toArray() + .filter(url => tmdbId.season ? url.href.includes('/series/') : !url.href.includes('/series/')), + ); + }); + + // similar match + keywords.map((keyword) => { + urls.push( + ...$(`a[oldtitle]`) + .filter((_i, el) => levenshtein.get(($(el).attr('oldtitle') as string).trim(), keyword, { useCollator: true }) < 5) .map((_i, el) => new URL($(el).attr('href') as string)) .toArray() .filter(url => tmdbId.season ? url.href.includes('/series/') : !url.href.includes('/series/')),