„highschool musical 3" fand TMDB nicht, „high school musical 3" schon

Drei gemeldete Fälle, alle an TMDB nachgemessen statt vermutet:

  highschool musical 3              0 Treffer
  high school musical 3             2 Treffer, der richtige zuerst
  Harry Potter im Orden des Phoenix 0 Treffer
  Harry Potter                     20 Treffer, der richtige darunter
  dr dolittle                      13 Treffer, der richtige zuerst

Der fehlende Punkt bei Dr. Dolittle war nie das Problem — diese Vermutung
ist in Suchvarianten.cs festgehalten, damit sie nicht wiederkommt.

Die Suche versucht jetzt der Reihe nach: den Titel wie er dasteht, dann
das längste Wort an jeder Stelle getrennt (von der Mitte nach aussen,
ohne Wörterbuch — „highschool" trifft nach 2 Versuchen, „jurassicpark"
nach 5), dann von hinten gekürzt, bis zwei Worte übrig sind. Höchstens
zehn Anfragen, und nur dann, wenn die erste gar nichts brachte.

Und die Treffer werden nach Ähnlichkeit zum gesuchten Titel sortiert,
nicht nach Beliebtheit. Über gemeinsame Worte ohne Akzente: so trennt
„Harry Potter" den „Orden des Phönix" von „Harry Potter: Fireplace", und
„Phoenix" findet „Phönix".

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Scarriffle
2026-10-04 19:13:24 +02:00
co-authored by Claude Opus 5
parent 4b0323f955
commit aeaf6eb578
3 changed files with 234 additions and 6 deletions
+30 -6
View File
@@ -83,9 +83,23 @@ public sealed class TmdbClient(
public async Task<IReadOnlyList<MovieMetadata>> SearchMoviesAsync(
string title, int? year, CancellationToken ct = default)
{
var alle = await AlleAsync<TmdbMovie>("search/movie", title,
year is { } j ? ("year", j.ToString()) : null, ct);
return alle.Select(m => Als(m, title)).ToList();
foreach (var begriff in Suchvarianten.Fuer(title))
{
var alle = await AlleAsync<TmdbMovie>("search/movie", begriff,
year is { } j ? ("year", j.ToString()) : null, ct);
if (alle.Count == 0) continue;
// **Nach Ähnlichkeit zum gesuchten Titel, nicht nach Beliebtheit.**
// Gefunden wird unter Umständen über einen gekürzten Begriff;
// dann liefert TMDB zwanzig Treffer, und der richtige ist der mit
// den meisten gemeinsamen Worten.
return alle
.OrderByDescending(m => Suchvarianten.Aehnlichkeit(title, m.Title, m.OriginalTitle))
.Select(m => Als(m, title))
.ToList();
}
return [];
}
public Task<MovieMetadata?> GetMovieAsync(int providerId, CancellationToken ct = default) =>
@@ -152,9 +166,19 @@ public sealed class TmdbClient(
public async Task<IReadOnlyList<SeriesMetadata>> SearchSeriesAsync(
string title, int? year, CancellationToken ct = default)
{
var alle = await AlleAsync<TmdbSeries>("search/tv", title,
year is { } j ? ("first_air_date_year", j.ToString()) : null, ct);
return alle.Select(s => Als(s, title)).ToList();
foreach (var begriff in Suchvarianten.Fuer(title))
{
var alle = await AlleAsync<TmdbSeries>("search/tv", begriff,
year is { } j ? ("first_air_date_year", j.ToString()) : null, ct);
if (alle.Count == 0) continue;
return alle
.OrderByDescending(s => Suchvarianten.Aehnlichkeit(title, s.Name, s.OriginalName))
.Select(s => Als(s, title))
.ToList();
}
return [];
}
public Task<SeriesMetadata?> GetSeriesAsync(int providerId, CancellationToken ct = default) =>