@@ -9,11 +9,15 @@ import { MovieRepository } from '@/resources/movie/repository';
9
9
import { CacheProvider } from '@/services/cache/cache-provider' ;
10
10
import {
11
11
MovieArtworkProvider ,
12
+ MovieDiscoverProvider ,
12
13
MovieProvider ,
13
14
MovieRatingProvider ,
14
15
MovieTrendingProvider ,
15
16
} from '@/services/movie/provider/provider' ;
16
- import { MovieLookupOptions } from '@/services/movie/types' ;
17
+ import {
18
+ MovieDiscoverOptions ,
19
+ MovieLookupOptions ,
20
+ } from '@/services/movie/types' ;
17
21
18
22
@Service ( )
19
23
export class MovieService {
@@ -36,6 +40,7 @@ export class MovieService {
36
40
private artworkProvider : MovieArtworkProvider ,
37
41
private ratingProvider : MovieRatingProvider ,
38
42
private trendingProvider : MovieTrendingProvider ,
43
+ private discoverProvider : MovieDiscoverProvider ,
39
44
) {
40
45
this . logger = logger . child ( { module : 'services.movie' } ) ;
41
46
}
@@ -128,7 +133,7 @@ export class MovieService {
128
133
* Retrieves the trending movies.
129
134
* @returns A Promise that resolves to an array of MovieEntity objects representing the trending movies.
130
135
*/
131
- async getTrending ( ) {
136
+ async getTrending ( limit : number = 30 ) : Promise < MovieEntity [ ] > {
132
137
const results = await this . cacheProvider . wrap (
133
138
`movie.trending` ,
134
139
async ( ) => {
@@ -138,7 +143,7 @@ export class MovieService {
138
143
}
139
144
const trending = trendingResults . unwrap ( ) ;
140
145
const data = await Promise . all (
141
- trending . map ( ( movie ) =>
146
+ trending . slice ( 0 , limit ) . map ( ( movie ) =>
142
147
this . getMovie ( movie , {
143
148
withArtwork : true ,
144
149
withRating : true ,
@@ -174,4 +179,48 @@ export class MovieService {
174
179
) ;
175
180
return movieResult . filter ( ( m ) => m . isSome ( ) ) . map ( ( m ) => m . unwrap ( ) ) ;
176
181
}
182
+
183
+ /**
184
+ * Retrieves a list of discovered movies with additional details.
185
+ *
186
+ * @param limit - The maximum number of movies to retrieve. Defaults to 30.
187
+ * @returns A promise that resolves to an array of MovieEntity objects representing the discovered movies.
188
+ */
189
+ async getDiscover ( options ?: MovieDiscoverOptions ) : Promise < MovieEntity [ ] > {
190
+ try {
191
+ const results = await this . cacheProvider . wrap (
192
+ `movie.discover` ,
193
+ async ( ) => {
194
+ const discovery = await this . discoverProvider . getDiscover ( {
195
+ page : options ?. page || 1 ,
196
+ withCompanyId : options ?. withCompanies ,
197
+ } ) ;
198
+ if ( discovery . isErr ( ) ) {
199
+ return [ ] ;
200
+ }
201
+ const data = await Promise . all (
202
+ discovery
203
+ . unwrap ( )
204
+ . slice ( 0 , options ?. limit || 30 )
205
+ . map ( ( movie ) =>
206
+ this . getMovie ( movie , {
207
+ withArtwork : true ,
208
+ withRating : true ,
209
+ withServer : true ,
210
+ } ) ,
211
+ ) ,
212
+ ) ;
213
+ return data
214
+ . filter ( ( m ) => m . isSome ( ) )
215
+ . map ( ( m ) => m . unwrap ( ) )
216
+ . map ( ( m ) => m . getProps ( ) ) ;
217
+ } ,
218
+ this . defaultCacheTTL ,
219
+ ) ;
220
+ return results . map ( ( m ) => MovieEntity . create ( m ) ) ;
221
+ } catch ( error ) {
222
+ this . logger . error ( { error } , 'Error storing discovered data' ) ;
223
+ return [ ] ;
224
+ }
225
+ }
177
226
}
0 commit comments