feat: add catalogue tabs to library page

This commit is contained in:
Aleksi Lassila
2025-03-27 21:28:28 +02:00
parent eab6c5dbdf
commit 84e77f3951
24 changed files with 426 additions and 242 deletions

View File

@@ -1,89 +1,17 @@
import { ApiProperty, PickType } from '@nestjs/swagger';
import { MediaType } from 'src/common/common.dto';
import { MovieMetadata, SeriesMetadata } from 'src/metadata/metadata.entity';
import { TmdbMovie, TmdbSeries } from 'src/metadata/tmdb/tmdb.dto';
import { TmdbItemDto } from 'src/metadata/tmdb/tmdb.dto';
import { LibraryItem } from './library.entity';
class NextEpisodeToAir {
@ApiProperty({ required: false })
air_date?: string;
}
class Season {
@ApiProperty({ required: false })
air_date?: string;
@ApiProperty({ required: false })
episode_count?: number;
@ApiProperty({ required: false })
id?: number;
@ApiProperty({ required: false })
name?: string;
@ApiProperty({ required: false })
overview?: string;
@ApiProperty({ required: false })
poster_path?: string;
@ApiProperty({ required: false })
season_number?: number;
@ApiProperty({ required: false })
vote_average?: number;
}
export class LibraryItemDto
extends PickType(LibraryItem, [
'tmdbId',
'mediaType',
'playStates',
'createdAt',
])
implements TmdbMovie, TmdbSeries
{
// TmdbMovie & TmdbSeries
@ApiProperty({ required: false })
id?: number;
@ApiProperty({ required: false })
poster_path?: string;
@ApiProperty({ required: false })
vote_average?: number;
// TmdbMovie only
@ApiProperty({ required: false })
title?: string;
@ApiProperty({ required: false })
release_date?: string;
@ApiProperty({ required: false })
runtime?: number;
// TmdbSeries only
@ApiProperty({ required: false })
name?: string;
@ApiProperty({ required: false })
first_air_date?: string;
@ApiProperty({ required: false })
last_air_date?: string;
@ApiProperty({ required: false, type: NextEpisodeToAir })
next_episode_to_air?: NextEpisodeToAir;
@ApiProperty({ required: false, isArray: true, type: Season })
seasons?: Season[];
// Library Item
export class LibraryItemDto extends PickType(LibraryItem, [
'tmdbId',
'mediaType',
'playStates',
'createdAt',
]) {
@ApiProperty()
tmdbItem: TmdbItemDto;
@ApiProperty({ required: false })
watched?: boolean;
@@ -123,21 +51,23 @@ export class LibraryItemDto
return {
...libraryItem,
watched,
id: movieMetadata?.tmdbMovie.id ?? seriesMetadata?.tmdbSeries.id,
poster_path:
movieMetadata?.tmdbMovie.poster_path ??
seriesMetadata?.tmdbSeries.poster_path,
vote_average:
movieMetadata?.tmdbMovie.vote_average ??
seriesMetadata?.tmdbSeries.vote_average,
title: movieMetadata?.tmdbMovie.title,
release_date: movieMetadata?.tmdbMovie.release_date,
runtime: movieMetadata?.tmdbMovie.runtime,
name: seriesMetadata?.tmdbSeries.name,
first_air_date: seriesMetadata?.tmdbSeries.first_air_date,
last_air_date: seriesMetadata?.tmdbSeries.last_air_date,
next_episode_to_air: seriesMetadata?.tmdbSeries.next_episode_to_air,
seasons: seriesMetadata?.tmdbSeries.seasons,
tmdbItem: {
id: movieMetadata?.tmdbMovie.id ?? seriesMetadata?.tmdbSeries.id,
poster_path:
movieMetadata?.tmdbMovie.poster_path ??
seriesMetadata?.tmdbSeries.poster_path,
vote_average:
movieMetadata?.tmdbMovie.vote_average ??
seriesMetadata?.tmdbSeries.vote_average,
title: movieMetadata?.tmdbMovie.title,
release_date: movieMetadata?.tmdbMovie.release_date,
runtime: movieMetadata?.tmdbMovie.runtime,
name: seriesMetadata?.tmdbSeries.name,
first_air_date: seriesMetadata?.tmdbSeries.first_air_date,
last_air_date: seriesMetadata?.tmdbSeries.last_air_date,
next_episode_to_air: seriesMetadata?.tmdbSeries.next_episode_to_air,
seasons: seriesMetadata?.tmdbSeries.seasons,
},
};
}
}