mirror of
https://github.com/sbondCo/Watcharr.git
synced 2026-08-07 07:14:44 +00:00
Add Status & ReleaseDateLast to Media, show end year for tv shows
This commit is contained in:
@@ -8,6 +8,7 @@ These changes are awaiting release:
|
|||||||
- Show `Aired Date` for episodes.
|
- Show `Aired Date` for episodes.
|
||||||
- Import: Add `rating` column.
|
- Import: Add `rating` column.
|
||||||
- Import(text list): Support parsing a rating (out of 10, supporting decimals) in square brackets.
|
- 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
|
## Changed
|
||||||
|
|
||||||
|
|||||||
@@ -63,6 +63,9 @@ type Media struct {
|
|||||||
// A link to the database we are using that lists all providers with max details.
|
// 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).
|
// (especially for TMDB since it's data from JustWatch isn't available to us).
|
||||||
ProvidersFullListLink string `json:"providersFullListLink,omitempty"`
|
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.
|
// 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
|
// details for the server to fetch fully/verify, i.e fetched full details from
|
||||||
// tmdb again to verify if show is anime itself, etc).
|
// tmdb again to verify if show is anime itself, etc).
|
||||||
IsShowAnime bool `json:"isShowAnime,omitempty"`
|
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
|
// Properties only for Games
|
||||||
|
|||||||
@@ -335,6 +335,7 @@ func (t *TMDBContentDetails) AsMedia() domain.Media {
|
|||||||
Rating: uint(t.VoteAverage * 10),
|
Rating: uint(t.VoteAverage * 10),
|
||||||
RatingCount: uint(t.VoteCount),
|
RatingCount: uint(t.VoteCount),
|
||||||
Homepage: t.Homepage,
|
Homepage: t.Homepage,
|
||||||
|
Status: t.Status,
|
||||||
}
|
}
|
||||||
// Genres
|
// Genres
|
||||||
for _, g := range t.Genres {
|
for _, g := range t.Genres {
|
||||||
@@ -534,6 +535,13 @@ func (t *TMDBShowDetails) AsMedia() domain.Media {
|
|||||||
} else {
|
} else {
|
||||||
slog.Error("AsMedia: Failed to parse release date", "name", m.Name, "error", err)
|
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
|
// IDS
|
||||||
m.IDs.IMDB = t.ExternalIds.ImdbID
|
m.IDs.IMDB = t.ExternalIds.ImdbID
|
||||||
m.IDs.Wikidata = t.ExternalIds.WikidataID
|
m.IDs.Wikidata = t.ExternalIds.WikidataID
|
||||||
|
|||||||
@@ -1,22 +1,30 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
|
import { dateValid } from "../util/date";
|
||||||
|
|
||||||
interface Props {
|
interface Props {
|
||||||
homepage?: string;
|
homepage?: string;
|
||||||
title?: string;
|
title?: string;
|
||||||
releaseDate?: Date;
|
releaseDate?: Date;
|
||||||
|
endDate?: Date;
|
||||||
voteAverage?: number;
|
voteAverage?: number;
|
||||||
voteCount?: number;
|
voteCount?: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
let { homepage, title, releaseDate, voteAverage, voteCount }: Props =
|
let { homepage, title, releaseDate, endDate, voteAverage, voteCount }: Props =
|
||||||
$props();
|
$props();
|
||||||
|
|
||||||
// if voteAvg bigger than 10, it is out of 100, so no need to * by 10
|
// if voteAvg bigger than 10, it is out of 100, so no need to * by 10
|
||||||
const vote = voteAverage
|
const vote = $derived(
|
||||||
? Math.round(voteAverage > 10 ? voteAverage : voteAverage * 10) / 10
|
voteAverage
|
||||||
: 0;
|
? Math.round(voteAverage > 10 ? voteAverage : voteAverage * 10) / 10
|
||||||
|
: 0,
|
||||||
|
);
|
||||||
const titleSafe = $derived(title ? title : "Unknown Title");
|
const titleSafe = $derived(title ? title : "Unknown Title");
|
||||||
const releaseYear = $derived(
|
const releaseYear = $derived(
|
||||||
releaseDate ? releaseDate.getFullYear() : undefined,
|
dateValid(releaseDate) ? releaseDate.getFullYear() : undefined,
|
||||||
|
);
|
||||||
|
const endYear = $derived(
|
||||||
|
dateValid(endDate) ? endDate.getFullYear() : undefined,
|
||||||
);
|
);
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
@@ -28,7 +36,13 @@
|
|||||||
<span class="t">{titleSafe}</span>
|
<span class="t">{titleSafe}</span>
|
||||||
{/if}
|
{/if}
|
||||||
{#if releaseYear}
|
{#if releaseYear}
|
||||||
<span class="year">{releaseYear}</span>
|
<span class="year">
|
||||||
|
<!--First span ends on the line with the #if so there's no whitespace-->
|
||||||
|
<span title={releaseDate?.toLocaleDateString()}>{releaseYear}</span
|
||||||
|
>{#if endYear && endYear != releaseYear}
|
||||||
|
<span title={endDate?.toLocaleDateString()}>-{endYear}</span>
|
||||||
|
{/if}
|
||||||
|
</span>
|
||||||
{/if}
|
{/if}
|
||||||
</span>
|
</span>
|
||||||
<span
|
<span
|
||||||
|
|||||||
@@ -0,0 +1,35 @@
|
|||||||
|
/**
|
||||||
|
* Media statuses.
|
||||||
|
*/
|
||||||
|
|
||||||
|
export enum MediaStatusShow {
|
||||||
|
ReturningSeries = "Returning Series",
|
||||||
|
Planned = "Planned",
|
||||||
|
InProduction = "In Production",
|
||||||
|
Ended = "Ended",
|
||||||
|
Canceled = "Canceled",
|
||||||
|
Pilot = "Pilot",
|
||||||
|
}
|
||||||
|
|
||||||
|
export enum MediaStatusMovie {
|
||||||
|
Rumored = "Rumored",
|
||||||
|
Planned = "Planned",
|
||||||
|
InProduction = "In Production",
|
||||||
|
PostProduction = "Post Production",
|
||||||
|
Released = "Released",
|
||||||
|
Canceled = "Canceled",
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Taken from what `https://api.igdb.com/v4/game_statuses` returned at the time.
|
||||||
|
*/
|
||||||
|
export enum MediaStatusGame {
|
||||||
|
Released = "Released",
|
||||||
|
Alpha = "Alpha",
|
||||||
|
Beta = "Beta",
|
||||||
|
EarlyAccess = "Early Access",
|
||||||
|
Offline = "Offline",
|
||||||
|
Cancelled = "Cancelled",
|
||||||
|
Rumored = "Rumored",
|
||||||
|
Delisted = "Delisted",
|
||||||
|
}
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
/**
|
||||||
|
* Date helpers.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if `d` is a **valid** `Date`.
|
||||||
|
*
|
||||||
|
* **NOTE:** Returns `false` even if `d` is an instance of `Date`,
|
||||||
|
* if it doesn't contain a valid date.
|
||||||
|
*/
|
||||||
|
export function dateValid(d: unknown): d is Date {
|
||||||
|
return d instanceof Date && !isNaN(d.getTime());
|
||||||
|
}
|
||||||
@@ -39,6 +39,7 @@
|
|||||||
import CountAsPlayModal from "@/lib/watched/CountAsPlayModal.svelte";
|
import CountAsPlayModal from "@/lib/watched/CountAsPlayModal.svelte";
|
||||||
import { createSignal, type Signal } from "@/lib/util/signal.js";
|
import { createSignal, type Signal } from "@/lib/util/signal.js";
|
||||||
import Genres from "@/lib/content/Genres.svelte";
|
import Genres from "@/lib/content/Genres.svelte";
|
||||||
|
import { MediaStatusShow } from "@/lib/types/mediaStatus.js";
|
||||||
|
|
||||||
let { data } = $props();
|
let { data } = $props();
|
||||||
|
|
||||||
@@ -168,6 +169,11 @@
|
|||||||
releaseDate={show.releaseDate
|
releaseDate={show.releaseDate
|
||||||
? new Date(show.releaseDate)
|
? new Date(show.releaseDate)
|
||||||
: undefined}
|
: undefined}
|
||||||
|
endDate={(show.status === MediaStatusShow.Ended ||
|
||||||
|
show.status === MediaStatusShow.Canceled) &&
|
||||||
|
show.releaseDateLast
|
||||||
|
? new Date(show.releaseDateLast)
|
||||||
|
: undefined}
|
||||||
voteAverage={show.rating}
|
voteAverage={show.rating}
|
||||||
voteCount={show.ratingCount}
|
voteCount={show.ratingCount}
|
||||||
/>
|
/>
|
||||||
|
|||||||
@@ -335,6 +335,8 @@ export interface Media {
|
|||||||
watched?: Watched;
|
watched?: Watched;
|
||||||
similar?: Media[];
|
similar?: Media[];
|
||||||
releaseDate?: string;
|
releaseDate?: string;
|
||||||
|
releaseDateLast?: string;
|
||||||
|
status?: string;
|
||||||
extBackdropPath?: string;
|
extBackdropPath?: string;
|
||||||
genres?: MediaGenre[];
|
genres?: MediaGenre[];
|
||||||
homepage?: string;
|
homepage?: string;
|
||||||
|
|||||||
Reference in New Issue
Block a user