import { TautulliUser } from "@/lib/types"; import { getSettings } from "@/lib/settings"; interface TautulliRow { friendly_name: string; email: string; plays: number; duration: number; last_seen: number | null; } interface TautulliResponse { response: { result: string; data: { data: TautulliRow[]; }; }; } /** * Returns a Map. * Returns null if TAUTULLI_URL/TAUTULLI_API are not set. */ export async function buildTautulliMap(): Promise | null> { const { tautulli } = getSettings(); const url = tautulli.url; const key = tautulli.apiKey; if (!url || !key) return null; const res = await fetch( `${url}/api/v2?apikey=${key}&cmd=get_users_table&length=1000&order_column=friendly_name&order_dir=asc`, { cache: "no-store" } ); if (!res.ok) { throw new Error(`Tautulli API error: ${res.status} ${res.statusText}`); } const json: TautulliResponse = await res.json(); if (json.response.result !== "success") { throw new Error(`Tautulli API returned non-success result`); } const map = new Map(); for (const row of json.response.data.data) { const user: TautulliUser = { friendly_name: row.friendly_name, email: row.email ?? "", plays: row.plays ?? 0, duration: row.duration ?? 0, last_seen: row.last_seen ?? null, }; if (user.email) { map.set(user.email.toLowerCase(), user); } // Also index by friendly_name as fallback key if (user.friendly_name) { map.set(`name:${user.friendly_name.toLowerCase()}`, user); } } return map; } export function lookupTautulliUser( tautulliMap: Map, email: string, displayName: string ): TautulliUser | null { return ( tautulliMap.get(email.toLowerCase()) ?? tautulliMap.get(`name:${displayName.toLowerCase()}`) ?? null ); }