mirror of
https://github.com/aleksilassila/reiverr.git
synced 2026-04-26 18:55:12 +02:00
fix: tmdb series and movies not caching
This commit is contained in:
@@ -25,6 +25,36 @@ export class MovieMetadata {
|
||||
@ApiProperty({ type: 'string' })
|
||||
@UpdateDateColumn()
|
||||
updatedAt: Date;
|
||||
|
||||
/**
|
||||
* Requires update before serving
|
||||
*/
|
||||
isOutdated() {
|
||||
const releaseDate = this.tmdbMovie?.release_date;
|
||||
|
||||
if (!this.tmdbMovie) return true;
|
||||
if (!this.updatedAt) return true;
|
||||
if (
|
||||
releaseDate &&
|
||||
new Date() > new Date(releaseDate) &&
|
||||
new Date(this.updatedAt) < new Date(releaseDate)
|
||||
)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Can be lazily updated after serving
|
||||
*/
|
||||
isStale() {
|
||||
if (this.isOutdated()) return true;
|
||||
|
||||
if (new Date().getTime() - this.updatedAt.getTime() > TMDB_CACHE_TTL)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@Entity()
|
||||
@@ -45,19 +75,33 @@ export class SeriesMetadata {
|
||||
@UpdateDateColumn()
|
||||
updatedAt: Date;
|
||||
|
||||
isStale() {
|
||||
/**
|
||||
* Requires update before serving
|
||||
*/
|
||||
isOutdated() {
|
||||
const nextAirDate = this.tmdbSeries?.next_episode_to_air?.air_date;
|
||||
|
||||
if (!this.tmdbSeries) return true;
|
||||
if (!this.updatedAt) return true;
|
||||
if (
|
||||
nextAirDate &&
|
||||
new Date() > new Date(nextAirDate) &&
|
||||
new Date(this.updatedAt) < new Date(nextAirDate)
|
||||
)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Can be lazily updated after serving
|
||||
*/
|
||||
isStale() {
|
||||
if (this.isOutdated()) return true;
|
||||
|
||||
if (new Date().getTime() - this.updatedAt.getTime() > TMDB_CACHE_TTL)
|
||||
return true;
|
||||
|
||||
if (
|
||||
this.tmdbSeries?.next_episode_to_air?.air_date &&
|
||||
new Date() > new Date(this.tmdbSeries.next_episode_to_air.air_date)
|
||||
) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -37,17 +37,24 @@ export class MetadataService {
|
||||
movie.tmdbId = tmdbId;
|
||||
}
|
||||
|
||||
if (
|
||||
!movie.updatedAt ||
|
||||
new Date().getTime() - movie.updatedAt.getTime() > TMDB_CACHE_TTL
|
||||
) {
|
||||
const tmdbMovie = await this.tmdbService.getFullMovie(Number(tmdbId));
|
||||
movie.tmdbMovie = tmdbMovie;
|
||||
}
|
||||
if (movie.isStale()) {
|
||||
const updatedMovie = this.tmdbService
|
||||
.getFullMovie(Number(tmdbId))
|
||||
.then(async (tmdbMovie) => {
|
||||
if (tmdbMovie) {
|
||||
movie.tmdbMovie = tmdbMovie;
|
||||
movie.updatedAt = new Date();
|
||||
}
|
||||
|
||||
await this.movieRepository.upsert(movie, {
|
||||
conflictPaths: ['tmdbId'],
|
||||
});
|
||||
await this.movieRepository.upsert(movie, {
|
||||
conflictPaths: ['tmdbId'],
|
||||
});
|
||||
|
||||
return movie;
|
||||
});
|
||||
|
||||
if (movie.isOutdated()) return updatedMovie;
|
||||
}
|
||||
|
||||
return movie;
|
||||
}
|
||||
@@ -66,13 +73,23 @@ export class MetadataService {
|
||||
|
||||
if (series.isStale()) {
|
||||
this.logger.debug(`Caching series ${tmdbId}`);
|
||||
const tmdbSeries = await this.tmdbService.getFullSeries(Number(tmdbId));
|
||||
if (tmdbSeries) series.tmdbSeries = tmdbSeries;
|
||||
}
|
||||
const updatedSeries = this.tmdbService
|
||||
.getFullSeries(Number(tmdbId))
|
||||
.then(async (tmdbSeries) => {
|
||||
if (tmdbSeries) {
|
||||
series.tmdbSeries = tmdbSeries;
|
||||
series.updatedAt = new Date();
|
||||
}
|
||||
|
||||
await this.seriesRepository.upsert(series, {
|
||||
conflictPaths: ['tmdbId'],
|
||||
});
|
||||
await this.seriesRepository.upsert(series, {
|
||||
conflictPaths: ['tmdbId'],
|
||||
});
|
||||
|
||||
return series;
|
||||
});
|
||||
|
||||
if (series.isOutdated()) return updatedSeries;
|
||||
}
|
||||
|
||||
return series;
|
||||
}
|
||||
|
||||
@@ -20,7 +20,7 @@ import {
|
||||
PaginationParamsDto,
|
||||
SuccessResponseDto,
|
||||
} from 'src/common/common.dto';
|
||||
import { LibraryItemDto, LibraryItemDto2 } from './library.dto';
|
||||
import { LibraryItemDto2 } from './library.dto';
|
||||
import { LibraryService } from './library.service';
|
||||
|
||||
@ApiTags('users')
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
import { Inject, Injectable } from '@nestjs/common';
|
||||
import { Repository } from 'typeorm';
|
||||
import { LibraryItem } from './library.entity';
|
||||
import { MediaType, PaginationParamsDto } from 'src/common/common.dto';
|
||||
import { LibraryItemDto, LibraryItemDto2 } from './library.dto';
|
||||
import { MetadataService } from 'src/metadata/metadata.service';
|
||||
import { Repository } from 'typeorm';
|
||||
import { LibraryItemDto2 } from './library.dto';
|
||||
import { LibraryItem } from './library.entity';
|
||||
import { USER_LIBRARY_REPOSITORY } from './library.providers';
|
||||
|
||||
@Injectable()
|
||||
@@ -31,6 +31,7 @@ export class LibraryService {
|
||||
? await this.metadataService.getMovieByTmdbId(item.tmdbId)
|
||||
: undefined;
|
||||
|
||||
|
||||
return LibraryItemDto2.create({
|
||||
libraryItem: item,
|
||||
seriesMetadata,
|
||||
|
||||
Reference in New Issue
Block a user