Skip to content

Commit f6f7fbe

Browse files
committed
fix: tmdb series and movies not caching
1 parent bb08f5f commit f6f7fbe

File tree

4 files changed

+90
-28
lines changed

4 files changed

+90
-28
lines changed

backend/src/metadata/metadata.entity.ts

+52-8
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,36 @@ export class MovieMetadata {
2525
@ApiProperty({ type: 'string' })
2626
@UpdateDateColumn()
2727
updatedAt: Date;
28+
29+
/**
30+
* Requires update before serving
31+
*/
32+
isOutdated() {
33+
const releaseDate = this.tmdbMovie?.release_date;
34+
35+
if (!this.tmdbMovie) return true;
36+
if (!this.updatedAt) return true;
37+
if (
38+
releaseDate &&
39+
new Date() > new Date(releaseDate) &&
40+
new Date(this.updatedAt) < new Date(releaseDate)
41+
)
42+
return true;
43+
44+
return false;
45+
}
46+
47+
/**
48+
* Can be lazily updated after serving
49+
*/
50+
isStale() {
51+
if (this.isOutdated()) return true;
52+
53+
if (new Date().getTime() - this.updatedAt.getTime() > TMDB_CACHE_TTL)
54+
return true;
55+
56+
return false;
57+
}
2858
}
2959

3060
@Entity()
@@ -45,18 +75,32 @@ export class SeriesMetadata {
4575
@UpdateDateColumn()
4676
updatedAt: Date;
4777

48-
isStale() {
49-
if (!this.updatedAt) return true;
78+
/**
79+
* Requires update before serving
80+
*/
81+
isOutdated() {
82+
const nextAirDate = this.tmdbSeries?.next_episode_to_air?.air_date;
5083

51-
if (new Date().getTime() - this.updatedAt.getTime() > TMDB_CACHE_TTL)
84+
if (!this.tmdbSeries) return true;
85+
if (!this.updatedAt) return true;
86+
if (
87+
nextAirDate &&
88+
new Date() > new Date(nextAirDate) &&
89+
new Date(this.updatedAt) < new Date(nextAirDate)
90+
)
5291
return true;
5392

54-
if (
55-
this.tmdbSeries?.next_episode_to_air?.air_date &&
56-
new Date() > new Date(this.tmdbSeries.next_episode_to_air.air_date)
57-
) {
93+
return false;
94+
}
95+
96+
/**
97+
* Can be lazily updated after serving
98+
*/
99+
isStale() {
100+
if (this.isOutdated()) return true;
101+
102+
if (new Date().getTime() - this.updatedAt.getTime() > TMDB_CACHE_TTL)
58103
return true;
59-
}
60104

61105
return false;
62106
}

backend/src/metadata/metadata.service.ts

+33-16
Original file line numberDiff line numberDiff line change
@@ -37,18 +37,25 @@ export class MetadataService {
3737
movie.tmdbId = tmdbId;
3838
}
3939

40-
if (
41-
!movie.updatedAt ||
42-
new Date().getTime() - movie.updatedAt.getTime() > TMDB_CACHE_TTL
43-
) {
44-
const tmdbMovie = await this.tmdbService.getFullMovie(Number(tmdbId));
45-
movie.tmdbMovie = tmdbMovie;
40+
if (movie.isStale()) {
41+
const updatedMovie = this.tmdbService
42+
.getFullMovie(Number(tmdbId))
43+
.then(async (tmdbMovie) => {
44+
if (tmdbMovie) {
45+
movie.tmdbMovie = tmdbMovie;
46+
movie.updatedAt = new Date();
47+
}
48+
49+
await this.movieRepository.upsert(movie, {
50+
conflictPaths: ['tmdbId'],
51+
});
52+
53+
return movie;
54+
});
55+
56+
if (movie.isOutdated()) return updatedMovie;
4657
}
4758

48-
await this.movieRepository.upsert(movie, {
49-
conflictPaths: ['tmdbId'],
50-
});
51-
5259
return movie;
5360
}
5461

@@ -66,14 +73,24 @@ export class MetadataService {
6673

6774
if (series.isStale()) {
6875
this.logger.debug(`Caching series ${tmdbId}`);
69-
const tmdbSeries = await this.tmdbService.getFullSeries(Number(tmdbId));
70-
if (tmdbSeries) series.tmdbSeries = tmdbSeries;
76+
const updatedSeries = this.tmdbService
77+
.getFullSeries(Number(tmdbId))
78+
.then(async (tmdbSeries) => {
79+
if (tmdbSeries) {
80+
series.tmdbSeries = tmdbSeries;
81+
series.updatedAt = new Date();
82+
}
83+
84+
await this.seriesRepository.upsert(series, {
85+
conflictPaths: ['tmdbId'],
86+
});
87+
88+
return series;
89+
});
90+
91+
if (series.isOutdated()) return updatedSeries;
7192
}
7293

73-
await this.seriesRepository.upsert(series, {
74-
conflictPaths: ['tmdbId'],
75-
});
76-
7794
return series;
7895
}
7996
}

backend/src/user-data/library/library.controller.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import {
2020
PaginationParamsDto,
2121
SuccessResponseDto,
2222
} from 'src/common/common.dto';
23-
import { LibraryItemDto, LibraryItemDto2 } from './library.dto';
23+
import { LibraryItemDto2 } from './library.dto';
2424
import { LibraryService } from './library.service';
2525

2626
@ApiTags('users')

backend/src/user-data/library/library.service.ts

+4-3
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import { Inject, Injectable } from '@nestjs/common';
2-
import { Repository } from 'typeorm';
3-
import { LibraryItem } from './library.entity';
42
import { MediaType, PaginationParamsDto } from 'src/common/common.dto';
5-
import { LibraryItemDto, LibraryItemDto2 } from './library.dto';
63
import { MetadataService } from 'src/metadata/metadata.service';
4+
import { Repository } from 'typeorm';
5+
import { LibraryItemDto2 } from './library.dto';
6+
import { LibraryItem } from './library.entity';
77
import { USER_LIBRARY_REPOSITORY } from './library.providers';
88

99
@Injectable()
@@ -31,6 +31,7 @@ export class LibraryService {
3131
? await this.metadataService.getMovieByTmdbId(item.tmdbId)
3232
: undefined;
3333

34+
3435
return LibraryItemDto2.create({
3536
libraryItem: item,
3637
seriesMetadata,

0 commit comments

Comments
 (0)