diff --git a/k-tv-backend/infra/src/library_repository.rs b/k-tv-backend/infra/src/library_repository.rs index 9da4925..0cc4fbf 100644 --- a/k-tv-backend/infra/src/library_repository.rs +++ b/k-tv-backend/infra/src/library_repository.rs @@ -6,6 +6,7 @@ use sqlx::SqlitePool; use domain::{ ContentType, DomainError, DomainResult, ILibraryRepository, LibraryCollection, LibraryItem, LibrarySearchFilter, LibrarySyncLogEntry, LibrarySyncResult, + SeasonSummary, ShowSummary, }; pub struct SqliteLibraryRepository { @@ -72,6 +73,9 @@ impl ILibraryRepository for SqliteLibraryRepository { .collect(); conditions.push(format!("({})", genre_conditions.join(" OR "))); } + if let Some(sn) = filter.season_number { + conditions.push(format!("season_number = {}", sn)); + } let where_clause = if conditions.is_empty() { String::new() diff --git a/k-tv-frontend/lib/api.ts b/k-tv-frontend/lib/api.ts index 1501bf9..7b50350 100644 --- a/k-tv-frontend/lib/api.ts +++ b/k-tv-frontend/lib/api.ts @@ -22,6 +22,8 @@ import type { LibrarySyncLogEntry, PagedLibraryResponse, AdminSettings, + ShowSummary, + SeasonSummary, } from "@/lib/types"; const API_BASE = @@ -267,6 +269,22 @@ export const api = { params.set('limit', String(filter.limit ?? 50)); return request(`/library/items?${params}`, { token }); }, + + shows: (token: string, filter?: { q?: string; provider?: string; genres?: string[] }): Promise => { + const params = new URLSearchParams(); + if (filter?.q) params.set('q', filter.q); + if (filter?.provider) params.set('provider', filter.provider); + filter?.genres?.forEach(g => params.append('genres[]', g)); + const qs = params.toString(); + return request(`/library/shows${qs ? `?${qs}` : ''}`, { token }); + }, + + seasons: (token: string, seriesName: string, provider?: string): Promise => { + const params = new URLSearchParams(); + if (provider) params.set('provider', provider); + const qs = params.toString(); + return request(`/library/shows/${encodeURIComponent(seriesName)}/seasons${qs ? `?${qs}` : ''}`, { token }); + }, }, files: { diff --git a/k-tv-frontend/lib/types.ts b/k-tv-frontend/lib/types.ts index abed0d0..0e5b69a 100644 --- a/k-tv-frontend/lib/types.ts +++ b/k-tv-frontend/lib/types.ts @@ -303,6 +303,20 @@ export interface LibraryItemFull extends LibraryItemResponse { collection_name?: string | null; } +export interface ShowSummary { + series_name: string; + episode_count: number; + season_count: number; + thumbnail_url?: string | null; + genres: string[]; +} + +export interface SeasonSummary { + season_number: number; + episode_count: number; + thumbnail_url?: string | null; +} + export interface PagedLibraryResponse { items: LibraryItemFull[]; total: number;