From 9da0913d4876aa127d05478c7734eb35e4dc34fc Mon Sep 17 00:00:00 2001 From: IRHM Date: Sat, 1 Aug 2026 04:38:54 +0100 Subject: [PATCH] Add Status & ReleaseDateLast to Media, show end year for tv shows --- CHANGELOG.md | 1 + server/domain/media.go | 6 +++++ server/media/tmdb/structs.go | 8 ++++++ src/lib/content/Title.svelte | 26 +++++++++++++++----- src/lib/types/mediaStatus.ts | 35 +++++++++++++++++++++++++++ src/lib/util/date.ts | 13 ++++++++++ src/routes/(app)/tv/[id]/+page.svelte | 6 +++++ src/types.ts | 2 ++ 8 files changed, 91 insertions(+), 6 deletions(-) create mode 100644 src/lib/types/mediaStatus.ts create mode 100644 src/lib/util/date.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 3fba76bb..ed0d3ea3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ These changes are awaiting release: - Show `Aired Date` for episodes. - Import: Add `rating` column. - Import(text list): Support parsing a rating (out of 10, supporting decimals) in square brackets. +- Show `End Year` for TV Shows that have ended or been canceled. ## Changed diff --git a/server/domain/media.go b/server/domain/media.go index 6cded4ef..9b351d50 100644 --- a/server/domain/media.go +++ b/server/domain/media.go @@ -63,6 +63,9 @@ type Media struct { // A link to the database we are using that lists all providers with max details. // (especially for TMDB since it's data from JustWatch isn't available to us). ProvidersFullListLink string `json:"providersFullListLink,omitempty"` + // Status of the media (released, ended, etc). + // Depending on media type, this will contain different values. + Status string `json:"status,omitempty"` // // Properties only for movies/tv. @@ -78,6 +81,9 @@ type Media struct { // details for the server to fetch fully/verify, i.e fetched full details from // tmdb again to verify if show is anime itself, etc). IsShowAnime bool `json:"isShowAnime,omitempty"` + // Last release date. + // Currently used for tv shows so frontend can display its end date. + ReleaseDateLast time.Time `json:"releaseDateLast,omitzero"` // // Properties only for Games diff --git a/server/media/tmdb/structs.go b/server/media/tmdb/structs.go index 285dd5ca..4f77e2b0 100644 --- a/server/media/tmdb/structs.go +++ b/server/media/tmdb/structs.go @@ -335,6 +335,7 @@ func (t *TMDBContentDetails) AsMedia() domain.Media { Rating: uint(t.VoteAverage * 10), RatingCount: uint(t.VoteCount), Homepage: t.Homepage, + Status: t.Status, } // Genres for _, g := range t.Genres { @@ -534,6 +535,13 @@ func (t *TMDBShowDetails) AsMedia() domain.Media { } else { slog.Error("AsMedia: Failed to parse release date", "name", m.Name, "error", err) } + if releaseDateLast, err := time.Parse("2006-01-02", t.LastAirDate); err == nil { + m.ReleaseDateLast = releaseDateLast + } else { + slog.Error("AsMedia: Failed to parse release date last", + "name", m.Name, + "error", err) + } // IDS m.IDs.IMDB = t.ExternalIds.ImdbID m.IDs.Wikidata = t.ExternalIds.WikidataID diff --git a/src/lib/content/Title.svelte b/src/lib/content/Title.svelte index fb136062..773121e9 100644 --- a/src/lib/content/Title.svelte +++ b/src/lib/content/Title.svelte @@ -1,22 +1,30 @@ @@ -28,7 +36,13 @@ {titleSafe} {/if} {#if releaseYear} - {releaseYear} + + + {releaseYear}{#if endYear && endYear != releaseYear} + -{endYear} + {/if} + {/if} diff --git a/src/types.ts b/src/types.ts index 8e10fab6..082585be 100644 --- a/src/types.ts +++ b/src/types.ts @@ -335,6 +335,8 @@ export interface Media { watched?: Watched; similar?: Media[]; releaseDate?: string; + releaseDateLast?: string; + status?: string; extBackdropPath?: string; genres?: MediaGenre[]; homepage?: string;