11package com.codandotv.streamplayerapp.feature_list_streams.list.data
22
3+ import androidx.paging.Pager
4+ import androidx.paging.PagingConfig
5+ import androidx.paging.PagingData
36import com.codandotv.streamplayerapp.core_networking.handleError.toFlow
4- import com.codandotv.streamplayerapp.feature_list_streams.list.domain.model.ListStream
5- import com.codandotv.streamplayerapp.feature_list_streams.list.domain.toListStream
7+ import com.codandotv.streamplayerapp.feature_list_streams.list.domain.model.Genre
8+ import com.codandotv.streamplayerapp.feature_list_streams.list.domain.model.Stream
9+ import com.codandotv.streamplayerapp.feature_list_streams.list.domain.toGenres
10+ import com.codandotv.streamplayerapp.feature_list_streams.list.domain.toStream
611import kotlinx.coroutines.CoroutineDispatcher
7- import kotlinx.coroutines.Dispatchers
812import kotlinx.coroutines.flow.*
913
1014interface ListStreamRepository {
11- suspend fun getMovies (): Flow <List <ListStream >>
15+ suspend fun getGenres (): Flow <List <Genre >>
16+
17+ suspend fun topRatedStream (): Flow <Stream >
18+
19+ fun loadMovies (genre : Genre ): Flow <PagingData <Stream >>
1220}
1321
1422class ListStreamRepositoryImpl (
1523 private val service : ListStreamService ,
1624 private val dispatcher : CoroutineDispatcher ,
1725) : ListStreamRepository {
1826
19- override suspend fun getMovies (): Flow <List <ListStream >> =
20- service.getGenres()
21- .toFlow()
22- .map {
23- it.genres
24- }
25- .map { genres ->
26- genres.map { genre ->
27- service.getMovies(genre.id.toString())
28- .toFlow()
29- .map {
30- it.toListStream(
31- genre.name
32- )
33- }.first()
34- }
35- }.flowOn(dispatcher)
27+ override suspend fun getGenres (): Flow <List <Genre >> {
28+ return service.getGenres().toFlow().map { it.toGenres() }
29+ }
30+
31+ override suspend fun topRatedStream () = service.getTopRatedMovies().toFlow().map {
32+ it.results.first { it.poster_path != null }.toStream()
33+ }
34+
35+ override fun loadMovies (genre : Genre ): Flow <PagingData <Stream >> {
36+ return Pager (
37+ config = PagingConfig (
38+ pageSize = PAGE_SIZE ,
39+ maxSize = MAX_SIZE ,
40+ ),
41+ pagingSourceFactory = {
42+ StreamDataSource (service, genreName = genre.name, genreId = genre.id)
43+ },
44+ initialKey = 1
45+ ).flow
46+ }
47+
48+ companion object {
49+ private const val PAGE_SIZE = 20
50+ private const val MAX_SIZE = 500
51+ }
3652}
0 commit comments