attempt to filter out tracks

This commit is contained in:
Daniel Bulant 2026-05-13 12:09:41 +02:00
parent c14b7a7308
commit 22111b2b30
No known key found for this signature in database
2 changed files with 20 additions and 6 deletions

View file

@ -8,6 +8,7 @@ import type { Question } from "../party-types";
import { import {
buildQuestionWindow, buildQuestionWindow,
getQuestionRange, getQuestionRange,
isUsableText,
type PartyAnalytics, type PartyAnalytics,
type PartyQuestionMember, type PartyQuestionMember,
resolveQuestionSong, resolveQuestionSong,
@ -29,7 +30,7 @@ async function getAlbumReleaseYear({
db, db,
analytics, analytics,
index, index,
}: BuildNumericQuestionInput): Promise<NumericQuestion> { }: BuildNumericQuestionInput): Promise<NumericQuestion | null> {
const trackName = analytics?.storyClusters?.[0]?.tracks?.[0]?.name; const trackName = analytics?.storyClusters?.[0]?.tracks?.[0]?.name;
const track = trackName const track = trackName
? await db.query.track.findFirst({ ? await db.query.track.findFirst({
@ -40,10 +41,13 @@ async function getAlbumReleaseYear({
const song = await resolveQuestionSong(db, analytics, { const song = await resolveQuestionSong(db, analytics, {
trackName: track?.name ?? trackName ?? undefined, trackName: track?.name ?? trackName ?? undefined,
}); });
const subject = [track?.album?.name, track?.name].find((value) =>
isUsableText(value),
);
if (!subject) return null;
const correct = const correct =
track?.album?.release_date?.getFullYear() ?? track?.album?.release_date?.getFullYear() ??
new Date().getFullYear() - 1 - index; new Date().getFullYear() - 1 - index;
const subject = track?.album?.name ?? track?.name ?? "unknown album";
return { return {
type: "numeric", type: "numeric",
text: `What's the release year of ${subject}?`, text: `What's the release year of ${subject}?`,
@ -127,7 +131,8 @@ export async function buildNumericQuestion(
): Promise<Question | null> { ): Promise<Question | null> {
const questions: NumericQuestion[] = []; const questions: NumericQuestion[] = [];
questions.push(await getAlbumReleaseYear(input)); const albumYearQ = await getAlbumReleaseYear(input);
if (albumYearQ) questions.push(albumYearQ);
const topTrackQ = await countTopTrackListeners(input); const topTrackQ = await countTopTrackListeners(input);
if (topTrackQ) questions.push(topTrackQ); if (topTrackQ) questions.push(topTrackQ);

View file

@ -113,7 +113,9 @@ export function getTopClusterArtists(analytics: PartyAnalytics): string[] {
export function getTopClusterTracks( export function getTopClusterTracks(
analytics: PartyAnalytics, analytics: PartyAnalytics,
): AnalyticsTrack[] { ): AnalyticsTrack[] {
return analytics?.storyClusters?.[0]?.tracks ?? []; return (analytics?.storyClusters?.[0]?.tracks ?? []).filter((track) =>
isUsableText(track.name),
);
} }
export function pickRelevantTrack( export function pickRelevantTrack(
@ -164,7 +166,8 @@ export async function resolveQuestionSong(
where: { name: trackHint.name }, where: { name: trackHint.name },
with: { album: true, artists: true }, with: { album: true, artists: true },
}); });
if (tracks.length === 0) return null; const usableTracks = tracks.filter((track) => isUsableText(track.name));
if (usableTracks.length === 0) return null;
const scoreTrack = (track: (typeof tracks)[number]) => { const scoreTrack = (track: (typeof tracks)[number]) => {
const artistNames = track.artists?.map((artist) => artist.name) ?? []; const artistNames = track.artists?.map((artist) => artist.name) ?? [];
@ -176,7 +179,7 @@ export async function resolveQuestionSong(
return (matchesAlbum ? 2 : 0) + (matchesArtist ? 2 : 0); return (matchesAlbum ? 2 : 0) + (matchesArtist ? 2 : 0);
}; };
const chosen = tracks const chosen = usableTracks
.slice() .slice()
.sort((a, b) => scoreTrack(b) - scoreTrack(a))[0]; .sort((a, b) => scoreTrack(b) - scoreTrack(a))[0];
if (!chosen) return null; if (!chosen) return null;
@ -184,6 +187,12 @@ export async function resolveQuestionSong(
return song; return song;
} }
export function isUsableText(
value: string | null | undefined,
): value is string {
return typeof value === "string" && value.trim().length > 0;
}
export function getTopTrackListener( export function getTopTrackListener(
track: { memberScores?: { userId: string; score: number }[] }, track: { memberScores?: { userId: string; score: number }[] },
members: PartyQuestionMember[], members: PartyQuestionMember[],