refactor: moved packages from data/core into /data in the data module

This commit is contained in:
2026-04-24 08:37:45 +02:00
parent 3f7c1966af
commit 8423e63937
113 changed files with 285 additions and 290 deletions

View File

@@ -13,8 +13,8 @@ import androidx.compose.ui.test.onNodeWithText
import androidx.compose.ui.test.performKeyInput import androidx.compose.ui.test.performKeyInput
import androidx.compose.ui.test.pressKey import androidx.compose.ui.test.pressKey
import androidx.compose.ui.input.key.Key import androidx.compose.ui.input.key.Key
import hu.bbara.purefin.core.model.CastMember import hu.bbara.purefin.model.CastMember
import hu.bbara.purefin.core.model.Episode import hu.bbara.purefin.model.Episode
import hu.bbara.purefin.ui.theme.AppTheme import hu.bbara.purefin.ui.theme.AppTheme
import hu.bbara.purefin.ui.screen.episode.components.EpisodePlayButtonTag import hu.bbara.purefin.ui.screen.episode.components.EpisodePlayButtonTag
import org.junit.Assert.assertEquals import org.junit.Assert.assertEquals

View File

@@ -16,9 +16,9 @@ import androidx.compose.ui.test.performKeyInput
import androidx.compose.ui.test.pressKey import androidx.compose.ui.test.pressKey
import androidx.compose.ui.input.key.Key import androidx.compose.ui.input.key.Key
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import hu.bbara.purefin.core.model.Episode import hu.bbara.purefin.model.Episode
import hu.bbara.purefin.core.model.LibraryKind import hu.bbara.purefin.model.LibraryKind
import hu.bbara.purefin.core.model.Movie import hu.bbara.purefin.model.Movie
import hu.bbara.purefin.core.ui.model.EpisodeUiModel import hu.bbara.purefin.core.ui.model.EpisodeUiModel
import hu.bbara.purefin.core.ui.model.MediaUiModel import hu.bbara.purefin.core.ui.model.MediaUiModel
import hu.bbara.purefin.core.ui.model.MovieUiModel import hu.bbara.purefin.core.ui.model.MovieUiModel

View File

@@ -4,7 +4,7 @@ import androidx.activity.ComponentActivity
import androidx.compose.ui.test.junit4.createAndroidComposeRule import androidx.compose.ui.test.junit4.createAndroidComposeRule
import androidx.compose.ui.test.onNodeWithTag import androidx.compose.ui.test.onNodeWithTag
import androidx.compose.ui.test.performClick import androidx.compose.ui.test.performClick
import hu.bbara.purefin.core.model.LibraryKind import hu.bbara.purefin.model.LibraryKind
import hu.bbara.purefin.feature.browse.home.LibraryItem import hu.bbara.purefin.feature.browse.home.LibraryItem
import hu.bbara.purefin.ui.theme.AppTheme import hu.bbara.purefin.ui.theme.AppTheme
import org.junit.Assert.assertEquals import org.junit.Assert.assertEquals

View File

@@ -13,8 +13,8 @@ import androidx.compose.ui.test.onNodeWithText
import androidx.compose.ui.test.performKeyInput import androidx.compose.ui.test.performKeyInput
import androidx.compose.ui.test.pressKey import androidx.compose.ui.test.pressKey
import androidx.compose.ui.input.key.Key import androidx.compose.ui.input.key.Key
import hu.bbara.purefin.core.model.CastMember import hu.bbara.purefin.model.CastMember
import hu.bbara.purefin.core.model.Movie import hu.bbara.purefin.model.Movie
import hu.bbara.purefin.ui.theme.AppTheme import hu.bbara.purefin.ui.theme.AppTheme
import hu.bbara.purefin.ui.screen.movie.components.MoviePlayButtonTag import hu.bbara.purefin.ui.screen.movie.components.MoviePlayButtonTag
import org.junit.Assert.assertEquals import org.junit.Assert.assertEquals

View File

@@ -11,10 +11,10 @@ import androidx.compose.ui.test.onNodeWithText
import androidx.compose.ui.test.performKeyInput import androidx.compose.ui.test.performKeyInput
import androidx.compose.ui.test.pressKey import androidx.compose.ui.test.pressKey
import androidx.compose.ui.input.key.Key import androidx.compose.ui.input.key.Key
import hu.bbara.purefin.core.model.CastMember import hu.bbara.purefin.model.CastMember
import hu.bbara.purefin.core.model.Episode import hu.bbara.purefin.model.Episode
import hu.bbara.purefin.core.model.Season import hu.bbara.purefin.model.Season
import hu.bbara.purefin.core.model.Series import hu.bbara.purefin.model.Series
import hu.bbara.purefin.ui.theme.AppTheme import hu.bbara.purefin.ui.theme.AppTheme
import hu.bbara.purefin.ui.screen.series.components.SeriesFirstSeasonTabTag import hu.bbara.purefin.ui.screen.series.components.SeriesFirstSeasonTabTag
import hu.bbara.purefin.ui.screen.series.components.SeriesPlayButtonTag import hu.bbara.purefin.ui.screen.series.components.SeriesPlayButtonTag

View File

@@ -4,7 +4,7 @@ import dagger.Module
import dagger.Provides import dagger.Provides
import dagger.hilt.InstallIn import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent import dagger.hilt.components.SingletonComponent
import hu.bbara.purefin.core.data.PlaybackProfileFamily import hu.bbara.purefin.data.PlaybackProfileFamily
@Module @Module
@InstallIn(SingletonComponent::class) @InstallIn(SingletonComponent::class)

View File

@@ -36,8 +36,8 @@ import coil3.network.okhttp.OkHttpNetworkFetcherFactory
import coil3.request.crossfade import coil3.request.crossfade
import coil3.util.DebugLogger import coil3.util.DebugLogger
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import hu.bbara.purefin.core.data.SessionBootstrapper import hu.bbara.purefin.data.SessionBootstrapper
import hu.bbara.purefin.core.data.session.UserSessionRepository import hu.bbara.purefin.data.session.UserSessionRepository
import hu.bbara.purefin.core.navigation.NavigationCommand import hu.bbara.purefin.core.navigation.NavigationCommand
import hu.bbara.purefin.core.navigation.NavigationManager import hu.bbara.purefin.core.navigation.NavigationManager
import hu.bbara.purefin.core.navigation.Route import hu.bbara.purefin.core.navigation.Route

View File

@@ -32,8 +32,8 @@ import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp import androidx.compose.ui.unit.sp
import hu.bbara.purefin.ui.common.image.PurefinAsyncImage import hu.bbara.purefin.ui.common.image.PurefinAsyncImage
import hu.bbara.purefin.core.image.ImageUrlBuilder import hu.bbara.purefin.image.ImageUrlBuilder
import hu.bbara.purefin.core.image.ArtworkKind import hu.bbara.purefin.image.ArtworkKind
internal val MediaDetailHorizontalPadding = 48.dp internal val MediaDetailHorizontalPadding = 48.dp
private val MediaDetailHeaderTopPadding = 104.dp private val MediaDetailHeaderTopPadding = 104.dp

View File

@@ -15,7 +15,7 @@ import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.hilt.navigation.compose.hiltViewModel import androidx.hilt.navigation.compose.hiltViewModel
import androidx.lifecycle.compose.LifecycleResumeEffect import androidx.lifecycle.compose.LifecycleResumeEffect
import hu.bbara.purefin.core.model.LibraryKind import hu.bbara.purefin.model.LibraryKind
import hu.bbara.purefin.feature.browse.home.AppViewModel import hu.bbara.purefin.feature.browse.home.AppViewModel
import hu.bbara.purefin.ui.screen.home.TvHomeScreen import hu.bbara.purefin.ui.screen.home.TvHomeScreen
import hu.bbara.purefin.ui.screen.home.components.TvDrawerDestination import hu.bbara.purefin.ui.screen.home.components.TvDrawerDestination

View File

@@ -21,13 +21,13 @@ import hu.bbara.purefin.ui.common.media.MediaDetailSectionTitle
import hu.bbara.purefin.ui.common.media.TvMediaDetailBodyBox import hu.bbara.purefin.ui.common.media.TvMediaDetailBodyBox
import hu.bbara.purefin.ui.common.media.TvMediaDetailScaffold import hu.bbara.purefin.ui.common.media.TvMediaDetailScaffold
import hu.bbara.purefin.ui.screen.episode.components.TvEpisodeHeroSection import hu.bbara.purefin.ui.screen.episode.components.TvEpisodeHeroSection
import hu.bbara.purefin.core.image.ImageUrlBuilder import hu.bbara.purefin.image.ImageUrlBuilder
import hu.bbara.purefin.core.navigation.EpisodeDto import hu.bbara.purefin.core.navigation.EpisodeDto
import hu.bbara.purefin.navigation.LocalNavigationManager import hu.bbara.purefin.navigation.LocalNavigationManager
import hu.bbara.purefin.core.navigation.Route import hu.bbara.purefin.core.navigation.Route
import hu.bbara.purefin.core.model.Episode import hu.bbara.purefin.model.Episode
import hu.bbara.purefin.feature.content.episode.EpisodeScreenViewModel import hu.bbara.purefin.feature.content.episode.EpisodeScreenViewModel
import hu.bbara.purefin.core.image.ArtworkKind import hu.bbara.purefin.image.ArtworkKind
@Composable @Composable
fun TvEpisodeScreen( fun TvEpisodeScreen(

View File

@@ -1,6 +1,5 @@
package hu.bbara.purefin.ui.screen.episode.components package hu.bbara.purefin.ui.screen.episode.components
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.fillMaxWidth
@@ -22,7 +21,7 @@ import hu.bbara.purefin.ui.common.button.MediaResumeButton
import hu.bbara.purefin.ui.common.media.MediaMetadataFlowRow import hu.bbara.purefin.ui.common.media.MediaMetadataFlowRow
import hu.bbara.purefin.ui.common.media.mediaPlaybackProgress import hu.bbara.purefin.ui.common.media.mediaPlaybackProgress
import hu.bbara.purefin.ui.common.media.mediaPlayButtonText import hu.bbara.purefin.ui.common.media.mediaPlayButtonText
import hu.bbara.purefin.core.model.Episode import hu.bbara.purefin.model.Episode
internal const val EpisodePlayButtonTag = "episode-play-button" internal const val EpisodePlayButtonTag = "episode-play-button"

View File

@@ -18,7 +18,6 @@ import androidx.compose.foundation.lazy.grid.LazyVerticalGrid
import androidx.compose.foundation.lazy.grid.itemsIndexed import androidx.compose.foundation.lazy.grid.itemsIndexed
import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.icons.Icons import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.outlined.Collections
import androidx.compose.material.icons.outlined.Movie import androidx.compose.material.icons.outlined.Movie
import androidx.compose.material.icons.outlined.Tv import androidx.compose.material.icons.outlined.Tv
import androidx.compose.material3.Icon import androidx.compose.material3.Icon
@@ -45,7 +44,7 @@ import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import hu.bbara.purefin.ui.common.image.PurefinAsyncImage import hu.bbara.purefin.ui.common.image.PurefinAsyncImage
import hu.bbara.purefin.feature.browse.home.LibraryItem import hu.bbara.purefin.feature.browse.home.LibraryItem
import hu.bbara.purefin.core.model.LibraryKind import hu.bbara.purefin.model.LibraryKind
internal const val TvLibrariesOverviewItemTagPrefix = "tv-libraries-overview-item-" internal const val TvLibrariesOverviewItemTagPrefix = "tv-libraries-overview-item-"

View File

@@ -23,7 +23,7 @@ import hu.bbara.purefin.ui.common.media.TvMediaDetailScaffold
import hu.bbara.purefin.ui.common.media.tvMediaDetailBackgroundImageUrl import hu.bbara.purefin.ui.common.media.tvMediaDetailBackgroundImageUrl
import hu.bbara.purefin.ui.screen.movie.components.TvMovieHeroSection import hu.bbara.purefin.ui.screen.movie.components.TvMovieHeroSection
import hu.bbara.purefin.core.navigation.MovieDto import hu.bbara.purefin.core.navigation.MovieDto
import hu.bbara.purefin.core.model.Movie import hu.bbara.purefin.model.Movie
import hu.bbara.purefin.feature.content.movie.MovieScreenViewModel import hu.bbara.purefin.feature.content.movie.MovieScreenViewModel
@Composable @Composable

View File

@@ -1,6 +1,5 @@
package hu.bbara.purefin.ui.screen.movie.components package hu.bbara.purefin.ui.screen.movie.components
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.fillMaxWidth
@@ -22,7 +21,7 @@ import hu.bbara.purefin.ui.common.button.MediaResumeButton
import hu.bbara.purefin.ui.common.media.MediaMetadataFlowRow import hu.bbara.purefin.ui.common.media.MediaMetadataFlowRow
import hu.bbara.purefin.ui.common.media.mediaPlaybackProgress import hu.bbara.purefin.ui.common.media.mediaPlaybackProgress
import hu.bbara.purefin.ui.common.media.mediaPlayButtonText import hu.bbara.purefin.ui.common.media.mediaPlayButtonText
import hu.bbara.purefin.core.model.Movie import hu.bbara.purefin.model.Movie
internal const val MoviePlayButtonTag = "movie-play-button" internal const val MoviePlayButtonTag = "movie-play-button"

View File

@@ -28,8 +28,8 @@ import hu.bbara.purefin.ui.screen.series.components.TvEpisodeCarousel
import hu.bbara.purefin.ui.screen.series.components.TvSeasonTabs import hu.bbara.purefin.ui.screen.series.components.TvSeasonTabs
import hu.bbara.purefin.ui.screen.series.components.TvSeriesHeroSection import hu.bbara.purefin.ui.screen.series.components.TvSeriesHeroSection
import hu.bbara.purefin.core.navigation.SeriesDto import hu.bbara.purefin.core.navigation.SeriesDto
import hu.bbara.purefin.core.model.Season import hu.bbara.purefin.model.Season
import hu.bbara.purefin.core.model.Series import hu.bbara.purefin.model.Series
import hu.bbara.purefin.feature.content.series.SeriesViewModel import hu.bbara.purefin.feature.content.series.SeriesViewModel
import java.util.UUID import java.util.UUID

View File

@@ -59,13 +59,13 @@ import hu.bbara.purefin.ui.common.badge.WatchStateBadge
import hu.bbara.purefin.ui.common.media.MediaMetadataFlowRow import hu.bbara.purefin.ui.common.media.MediaMetadataFlowRow
import hu.bbara.purefin.ui.common.media.mediaPlaybackProgress import hu.bbara.purefin.ui.common.media.mediaPlaybackProgress
import hu.bbara.purefin.ui.common.media.mediaPlayButtonText import hu.bbara.purefin.ui.common.media.mediaPlayButtonText
import hu.bbara.purefin.core.image.ImageUrlBuilder import hu.bbara.purefin.image.ImageUrlBuilder
import hu.bbara.purefin.core.model.CastMember import hu.bbara.purefin.model.CastMember
import hu.bbara.purefin.core.model.Episode import hu.bbara.purefin.model.Episode
import hu.bbara.purefin.core.model.Season import hu.bbara.purefin.model.Season
import hu.bbara.purefin.core.model.Series import hu.bbara.purefin.model.Series
import hu.bbara.purefin.feature.content.series.SeriesViewModel import hu.bbara.purefin.feature.content.series.SeriesViewModel
import hu.bbara.purefin.core.image.ArtworkKind import hu.bbara.purefin.image.ArtworkKind
internal const val SeriesPlayButtonTag = "series-play-button" internal const val SeriesPlayButtonTag = "series-play-button"
internal const val SeriesFirstSeasonTabTag = "series-first-season-tab" internal const val SeriesFirstSeasonTabTag = "series-first-season-tab"

View File

@@ -1,14 +1,14 @@
package hu.bbara.purefin.ui.screen.home.components package hu.bbara.purefin.ui.screen.home.components
import hu.bbara.purefin.core.image.ImageUrlBuilder import hu.bbara.purefin.image.ImageUrlBuilder
import hu.bbara.purefin.core.model.Episode import hu.bbara.purefin.model.Episode
import hu.bbara.purefin.core.model.MediaKind import hu.bbara.purefin.model.MediaKind
import hu.bbara.purefin.core.model.Movie import hu.bbara.purefin.model.Movie
import hu.bbara.purefin.core.model.Series import hu.bbara.purefin.model.Series
import hu.bbara.purefin.feature.browse.home.ContinueWatchingItem import hu.bbara.purefin.feature.browse.home.ContinueWatchingItem
import hu.bbara.purefin.feature.browse.home.NextUpItem import hu.bbara.purefin.feature.browse.home.NextUpItem
import hu.bbara.purefin.feature.browse.home.PosterItem import hu.bbara.purefin.feature.browse.home.PosterItem
import hu.bbara.purefin.core.image.ArtworkKind import hu.bbara.purefin.image.ArtworkKind
import org.junit.Assert.assertEquals import org.junit.Assert.assertEquals
import org.junit.Test import org.junit.Test
import java.util.UUID import java.util.UUID

View File

@@ -1,9 +1,9 @@
package hu.bbara.purefin.ui.screen.home.components package hu.bbara.purefin.ui.screen.home.components
import hu.bbara.purefin.core.model.Episode import hu.bbara.purefin.model.Episode
import hu.bbara.purefin.core.model.LibraryKind import hu.bbara.purefin.model.LibraryKind
import hu.bbara.purefin.core.model.MediaKind import hu.bbara.purefin.model.MediaKind
import hu.bbara.purefin.core.model.Movie import hu.bbara.purefin.model.Movie
import hu.bbara.purefin.feature.browse.home.ContinueWatchingItem import hu.bbara.purefin.feature.browse.home.ContinueWatchingItem
import hu.bbara.purefin.feature.browse.home.LibraryItem import hu.bbara.purefin.feature.browse.home.LibraryItem
import hu.bbara.purefin.feature.browse.home.NextUpItem import hu.bbara.purefin.feature.browse.home.NextUpItem

View File

@@ -36,9 +36,9 @@ import coil3.network.okhttp.OkHttpNetworkFetcherFactory
import coil3.request.crossfade import coil3.request.crossfade
import coil3.util.DebugLogger import coil3.util.DebugLogger
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import hu.bbara.purefin.core.data.SessionBootstrapper import hu.bbara.purefin.data.SessionBootstrapper
import hu.bbara.purefin.data.jellyfin.client.JellyfinAuthInterceptor import hu.bbara.purefin.data.jellyfin.client.JellyfinAuthInterceptor
import hu.bbara.purefin.core.data.session.UserSessionRepository import hu.bbara.purefin.data.session.UserSessionRepository
import hu.bbara.purefin.navigation.LocalNavigationBackStack import hu.bbara.purefin.navigation.LocalNavigationBackStack
import hu.bbara.purefin.navigation.LocalNavigationManager import hu.bbara.purefin.navigation.LocalNavigationManager
import hu.bbara.purefin.core.navigation.NavigationCommand import hu.bbara.purefin.core.navigation.NavigationCommand

View File

@@ -4,7 +4,7 @@ import dagger.Module
import dagger.Provides import dagger.Provides
import dagger.hilt.InstallIn import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent import dagger.hilt.components.SingletonComponent
import hu.bbara.purefin.core.data.PlaybackProfileFamily import hu.bbara.purefin.data.PlaybackProfileFamily
@Module @Module
@InstallIn(SingletonComponent::class) @InstallIn(SingletonComponent::class)

View File

@@ -35,18 +35,18 @@ import hu.bbara.purefin.ui.screen.waiting.PurefinWaitingScreen
import hu.bbara.purefin.ui.common.media.MediaHero import hu.bbara.purefin.ui.common.media.MediaHero
import hu.bbara.purefin.ui.common.media.MediaMetadataFlowRow import hu.bbara.purefin.ui.common.media.MediaMetadataFlowRow
import hu.bbara.purefin.core.download.DownloadState import hu.bbara.purefin.core.download.DownloadState
import hu.bbara.purefin.core.image.ImageUrlBuilder import hu.bbara.purefin.image.ImageUrlBuilder
import hu.bbara.purefin.core.navigation.EpisodeDto import hu.bbara.purefin.core.navigation.EpisodeDto
import hu.bbara.purefin.navigation.LocalNavigationBackStack import hu.bbara.purefin.navigation.LocalNavigationBackStack
import hu.bbara.purefin.core.navigation.Route import hu.bbara.purefin.core.navigation.Route
import hu.bbara.purefin.core.model.CastMember import hu.bbara.purefin.model.CastMember
import hu.bbara.purefin.core.model.Episode import hu.bbara.purefin.model.Episode
import hu.bbara.purefin.feature.content.episode.EpisodeScreenViewModel import hu.bbara.purefin.feature.content.episode.EpisodeScreenViewModel
import hu.bbara.purefin.ui.screen.episode.components.EpisodeDetails import hu.bbara.purefin.ui.screen.episode.components.EpisodeDetails
import hu.bbara.purefin.ui.screen.episode.components.EpisodeTopBar import hu.bbara.purefin.ui.screen.episode.components.EpisodeTopBar
import hu.bbara.purefin.ui.screen.episode.components.EpisodeTopBarShortcut import hu.bbara.purefin.ui.screen.episode.components.EpisodeTopBarShortcut
import hu.bbara.purefin.ui.theme.AppTheme import hu.bbara.purefin.ui.theme.AppTheme
import hu.bbara.purefin.core.image.ArtworkKind import hu.bbara.purefin.image.ArtworkKind
import java.util.UUID import java.util.UUID
@Composable @Composable

View File

@@ -43,7 +43,7 @@ import hu.bbara.purefin.ui.common.button.MediaActionButton
import hu.bbara.purefin.ui.common.media.MediaPlaybackSettings import hu.bbara.purefin.ui.common.media.MediaPlaybackSettings
import hu.bbara.purefin.ui.common.button.MediaResumeButton import hu.bbara.purefin.ui.common.button.MediaResumeButton
import hu.bbara.purefin.core.download.DownloadState import hu.bbara.purefin.core.download.DownloadState
import hu.bbara.purefin.core.model.Episode import hu.bbara.purefin.model.Episode
import hu.bbara.purefin.player.PlayerActivity import hu.bbara.purefin.player.PlayerActivity
internal sealed interface EpisodeTopBarShortcut { internal sealed interface EpisodeTopBarShortcut {

View File

@@ -37,7 +37,7 @@ import androidx.compose.ui.unit.dp
import androidx.hilt.navigation.compose.hiltViewModel import androidx.hilt.navigation.compose.hiltViewModel
import hu.bbara.purefin.feature.search.SearchViewModel import hu.bbara.purefin.feature.search.SearchViewModel
import java.util.UUID import java.util.UUID
import hu.bbara.purefin.core.model.MediaKind import hu.bbara.purefin.model.MediaKind
@OptIn(ExperimentalMaterial3Api::class) @OptIn(ExperimentalMaterial3Api::class)
@Composable @Composable

View File

@@ -17,7 +17,7 @@ import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import hu.bbara.purefin.core.model.MediaKind import hu.bbara.purefin.model.MediaKind
import hu.bbara.purefin.feature.search.SearchResult import hu.bbara.purefin.feature.search.SearchResult
import hu.bbara.purefin.ui.common.image.PurefinAsyncImage import hu.bbara.purefin.ui.common.image.PurefinAsyncImage

View File

@@ -34,15 +34,15 @@ import hu.bbara.purefin.ui.screen.waiting.PurefinWaitingScreen
import hu.bbara.purefin.ui.common.media.MediaHero import hu.bbara.purefin.ui.common.media.MediaHero
import hu.bbara.purefin.ui.common.media.MediaMetadataFlowRow import hu.bbara.purefin.ui.common.media.MediaMetadataFlowRow
import hu.bbara.purefin.core.download.DownloadState import hu.bbara.purefin.core.download.DownloadState
import hu.bbara.purefin.core.image.ImageUrlBuilder import hu.bbara.purefin.image.ImageUrlBuilder
import hu.bbara.purefin.core.navigation.MovieDto import hu.bbara.purefin.core.navigation.MovieDto
import hu.bbara.purefin.core.model.CastMember import hu.bbara.purefin.model.CastMember
import hu.bbara.purefin.core.model.Movie import hu.bbara.purefin.model.Movie
import hu.bbara.purefin.feature.content.movie.MovieScreenViewModel import hu.bbara.purefin.feature.content.movie.MovieScreenViewModel
import hu.bbara.purefin.ui.screen.movie.components.MovieDetails import hu.bbara.purefin.ui.screen.movie.components.MovieDetails
import hu.bbara.purefin.ui.screen.movie.components.MovieTopBar import hu.bbara.purefin.ui.screen.movie.components.MovieTopBar
import hu.bbara.purefin.ui.theme.AppTheme import hu.bbara.purefin.ui.theme.AppTheme
import hu.bbara.purefin.core.image.ArtworkKind import hu.bbara.purefin.image.ArtworkKind
import java.util.UUID import java.util.UUID
@Composable @Composable

View File

@@ -38,7 +38,7 @@ import hu.bbara.purefin.ui.common.button.MediaActionButton
import hu.bbara.purefin.ui.common.media.MediaPlaybackSettings import hu.bbara.purefin.ui.common.media.MediaPlaybackSettings
import hu.bbara.purefin.ui.common.button.MediaResumeButton import hu.bbara.purefin.ui.common.button.MediaResumeButton
import hu.bbara.purefin.core.download.DownloadState import hu.bbara.purefin.core.download.DownloadState
import hu.bbara.purefin.core.model.Movie import hu.bbara.purefin.model.Movie
import hu.bbara.purefin.player.PlayerActivity import hu.bbara.purefin.player.PlayerActivity
@Composable @Composable

View File

@@ -34,12 +34,12 @@ import hu.bbara.purefin.ui.common.media.MediaSynopsis
import hu.bbara.purefin.ui.screen.waiting.PurefinWaitingScreen import hu.bbara.purefin.ui.screen.waiting.PurefinWaitingScreen
import hu.bbara.purefin.ui.common.media.MediaHero import hu.bbara.purefin.ui.common.media.MediaHero
import hu.bbara.purefin.core.download.DownloadState import hu.bbara.purefin.core.download.DownloadState
import hu.bbara.purefin.core.image.ImageUrlBuilder import hu.bbara.purefin.image.ImageUrlBuilder
import hu.bbara.purefin.core.navigation.SeriesDto import hu.bbara.purefin.core.navigation.SeriesDto
import hu.bbara.purefin.core.model.CastMember import hu.bbara.purefin.model.CastMember
import hu.bbara.purefin.core.model.Episode import hu.bbara.purefin.model.Episode
import hu.bbara.purefin.core.model.Season import hu.bbara.purefin.model.Season
import hu.bbara.purefin.core.model.Series import hu.bbara.purefin.model.Series
import hu.bbara.purefin.feature.content.series.SeriesViewModel import hu.bbara.purefin.feature.content.series.SeriesViewModel
import hu.bbara.purefin.ui.screen.series.components.CastRow import hu.bbara.purefin.ui.screen.series.components.CastRow
import hu.bbara.purefin.ui.screen.series.components.EpisodeCarousel import hu.bbara.purefin.ui.screen.series.components.EpisodeCarousel
@@ -49,7 +49,7 @@ import hu.bbara.purefin.ui.screen.series.components.SeriesDownloadOption
import hu.bbara.purefin.ui.screen.series.components.SeriesMetaChips import hu.bbara.purefin.ui.screen.series.components.SeriesMetaChips
import hu.bbara.purefin.ui.screen.series.components.SeriesTopBar import hu.bbara.purefin.ui.screen.series.components.SeriesTopBar
import hu.bbara.purefin.ui.theme.AppTheme import hu.bbara.purefin.ui.theme.AppTheme
import hu.bbara.purefin.core.image.ArtworkKind import hu.bbara.purefin.image.ArtworkKind
import java.util.UUID import java.util.UUID
@Composable @Composable

View File

@@ -66,17 +66,17 @@ import hu.bbara.purefin.ui.common.button.MediaResumeButton
import hu.bbara.purefin.ui.common.image.PurefinAsyncImage import hu.bbara.purefin.ui.common.image.PurefinAsyncImage
import hu.bbara.purefin.ui.common.badge.WatchStateBadge import hu.bbara.purefin.ui.common.badge.WatchStateBadge
import hu.bbara.purefin.core.download.DownloadState import hu.bbara.purefin.core.download.DownloadState
import hu.bbara.purefin.core.image.ImageUrlBuilder import hu.bbara.purefin.image.ImageUrlBuilder
import hu.bbara.purefin.core.navigation.EpisodeDto import hu.bbara.purefin.core.navigation.EpisodeDto
import hu.bbara.purefin.navigation.LocalNavigationManager import hu.bbara.purefin.navigation.LocalNavigationManager
import hu.bbara.purefin.core.navigation.Route import hu.bbara.purefin.core.navigation.Route
import hu.bbara.purefin.core.model.CastMember import hu.bbara.purefin.model.CastMember
import hu.bbara.purefin.core.model.Episode import hu.bbara.purefin.model.Episode
import hu.bbara.purefin.core.model.Season import hu.bbara.purefin.model.Season
import hu.bbara.purefin.core.model.Series import hu.bbara.purefin.model.Series
import hu.bbara.purefin.feature.content.series.SeriesViewModel import hu.bbara.purefin.feature.content.series.SeriesViewModel
import hu.bbara.purefin.player.PlayerActivity import hu.bbara.purefin.player.PlayerActivity
import hu.bbara.purefin.core.image.ArtworkKind import hu.bbara.purefin.image.ArtworkKind
@Composable @Composable
internal fun SeriesTopBar( internal fun SeriesTopBar(

View File

@@ -1,4 +1,4 @@
package hu.bbara.purefin.core.data package hu.bbara.purefin.data
interface AuthenticationRepository { interface AuthenticationRepository {
suspend fun login(url: String, username: String, password: String): Boolean suspend fun login(url: String, username: String, password: String): Boolean

View File

@@ -1,9 +1,9 @@
package hu.bbara.purefin.core.data package hu.bbara.purefin.data
import hu.bbara.purefin.core.model.Episode import hu.bbara.purefin.model.Episode
import hu.bbara.purefin.core.model.Movie import hu.bbara.purefin.model.Movie
import hu.bbara.purefin.core.model.Season import hu.bbara.purefin.model.Season
import hu.bbara.purefin.core.model.Series import hu.bbara.purefin.model.Series
import java.util.UUID import java.util.UUID
interface DownloadMediaSourceResolver { interface DownloadMediaSourceResolver {

View File

@@ -1,4 +1,4 @@
package hu.bbara.purefin.core.data package hu.bbara.purefin.data
import java.util.UUID import java.util.UUID

View File

@@ -1,7 +1,7 @@
package hu.bbara.purefin.core.data package hu.bbara.purefin.data
import hu.bbara.purefin.core.model.Library import hu.bbara.purefin.model.Library
import hu.bbara.purefin.core.model.Media import hu.bbara.purefin.model.Media
import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.StateFlow
import java.util.UUID import java.util.UUID

View File

@@ -1,8 +1,8 @@
package hu.bbara.purefin.core.data package hu.bbara.purefin.data
import hu.bbara.purefin.core.model.Episode import hu.bbara.purefin.model.Episode
import hu.bbara.purefin.core.model.Movie import hu.bbara.purefin.model.Movie
import hu.bbara.purefin.core.model.Series import hu.bbara.purefin.model.Series
import java.util.UUID import java.util.UUID
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.StateFlow

View File

@@ -1,4 +1,4 @@
package hu.bbara.purefin.core.data package hu.bbara.purefin.data
import java.util.UUID import java.util.UUID

View File

@@ -1,4 +1,4 @@
package hu.bbara.purefin.core.data package hu.bbara.purefin.data
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow

View File

@@ -1,8 +1,8 @@
package hu.bbara.purefin.core.data package hu.bbara.purefin.data
import hu.bbara.purefin.core.model.Episode import hu.bbara.purefin.model.Episode
import hu.bbara.purefin.core.model.Movie import hu.bbara.purefin.model.Movie
import hu.bbara.purefin.core.model.Series import hu.bbara.purefin.model.Series
import java.util.UUID import java.util.UUID
import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.StateFlow

View File

@@ -1,9 +1,9 @@
package hu.bbara.purefin.core.data package hu.bbara.purefin.data
import hu.bbara.purefin.core.model.Episode import hu.bbara.purefin.model.Episode
import hu.bbara.purefin.core.model.Movie import hu.bbara.purefin.model.Movie
import hu.bbara.purefin.core.model.Season import hu.bbara.purefin.model.Season
import hu.bbara.purefin.core.model.Series import hu.bbara.purefin.model.Series
import java.util.UUID import java.util.UUID
interface OfflineCatalogStore { interface OfflineCatalogStore {

View File

@@ -1,7 +1,7 @@
package hu.bbara.purefin.core.data package hu.bbara.purefin.data
import androidx.media3.common.MediaItem import androidx.media3.common.MediaItem
import hu.bbara.purefin.core.model.MediaSegment import hu.bbara.purefin.model.MediaSegment
import java.util.UUID import java.util.UUID
interface PlayableMediaRepository { interface PlayableMediaRepository {

View File

@@ -1,4 +1,4 @@
package hu.bbara.purefin.core.data package hu.bbara.purefin.data
enum class PlaybackMethod { enum class PlaybackMethod {
DIRECT_PLAY, DIRECT_PLAY,

View File

@@ -1,4 +1,4 @@
package hu.bbara.purefin.core.data package hu.bbara.purefin.data
enum class PlaybackProfileFamily { enum class PlaybackProfileFamily {
MOBILE, MOBILE,

View File

@@ -1,4 +1,4 @@
package hu.bbara.purefin.core.data package hu.bbara.purefin.data
import java.util.UUID import java.util.UUID

View File

@@ -1,4 +1,4 @@
package hu.bbara.purefin.core.data package hu.bbara.purefin.data
data class PlaybackReportContext( data class PlaybackReportContext(
val playMethod: PlaybackMethod, val playMethod: PlaybackMethod,

View File

@@ -1,4 +1,4 @@
package hu.bbara.purefin.core.data package hu.bbara.purefin.data
interface SessionBootstrapper { interface SessionBootstrapper {
suspend fun initialize() suspend fun initialize()

View File

@@ -1,4 +1,4 @@
package hu.bbara.purefin.core.data package hu.bbara.purefin.data
import java.util.UUID import java.util.UUID
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow

View File

@@ -1,14 +1,11 @@
package hu.bbara.purefin.data.catalog package hu.bbara.purefin.data.catalog
import hu.bbara.purefin.core.data.MediaCatalogReader import hu.bbara.purefin.data.MediaCatalogReader
import hu.bbara.purefin.core.data.MediaProgressWriter import hu.bbara.purefin.data.MediaProgressWriter
import hu.bbara.purefin.core.data.NetworkMonitor import hu.bbara.purefin.data.NetworkMonitor
import hu.bbara.purefin.core.model.Episode import hu.bbara.purefin.model.Episode
import hu.bbara.purefin.core.model.Movie import hu.bbara.purefin.model.Movie
import hu.bbara.purefin.core.model.Series import hu.bbara.purefin.model.Series
import java.util.UUID
import javax.inject.Inject
import javax.inject.Singleton
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.ExperimentalCoroutinesApi
@@ -20,6 +17,9 @@ import kotlinx.coroutines.flow.first
import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.flow.flatMapLatest
import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.flow.stateIn
import java.util.UUID
import javax.inject.Inject
import javax.inject.Singleton
@OptIn(ExperimentalCoroutinesApi::class) @OptIn(ExperimentalCoroutinesApi::class)
@Singleton @Singleton

View File

@@ -1,7 +1,7 @@
package hu.bbara.purefin.data.catalog package hu.bbara.purefin.data.catalog
import hu.bbara.purefin.core.data.EpisodeSeriesLookup import hu.bbara.purefin.data.EpisodeSeriesLookup
import hu.bbara.purefin.core.data.MediaCatalogReader import hu.bbara.purefin.data.MediaCatalogReader
import java.util.UUID import java.util.UUID
import javax.inject.Inject import javax.inject.Inject
import javax.inject.Singleton import javax.inject.Singleton

View File

@@ -2,18 +2,18 @@ package hu.bbara.purefin.data.catalog
import android.util.Log import android.util.Log
import androidx.datastore.core.DataStore import androidx.datastore.core.DataStore
import hu.bbara.purefin.core.data.HomeRepository import hu.bbara.purefin.data.HomeRepository
import hu.bbara.purefin.core.data.NetworkMonitor import hu.bbara.purefin.data.NetworkMonitor
import hu.bbara.purefin.core.data.session.UserSessionRepository import hu.bbara.purefin.data.session.UserSessionRepository
import hu.bbara.purefin.core.image.ArtworkKind import hu.bbara.purefin.image.ArtworkKind
import hu.bbara.purefin.core.image.ImageUrlBuilder import hu.bbara.purefin.image.ImageUrlBuilder
import hu.bbara.purefin.core.model.Episode import hu.bbara.purefin.model.Episode
import hu.bbara.purefin.core.model.Library import hu.bbara.purefin.model.Library
import hu.bbara.purefin.core.model.LibraryKind import hu.bbara.purefin.model.LibraryKind
import hu.bbara.purefin.core.model.Media import hu.bbara.purefin.model.Media
import hu.bbara.purefin.core.model.Movie import hu.bbara.purefin.model.Movie
import hu.bbara.purefin.core.model.Season import hu.bbara.purefin.model.Season
import hu.bbara.purefin.core.model.Series import hu.bbara.purefin.model.Series
import hu.bbara.purefin.data.jellyfin.client.JellyfinApiClient import hu.bbara.purefin.data.jellyfin.client.JellyfinApiClient
import hu.bbara.purefin.data.offline.cache.HomeCache import hu.bbara.purefin.data.offline.cache.HomeCache
import hu.bbara.purefin.data.offline.cache.toCachedEpisode import hu.bbara.purefin.data.offline.cache.toCachedEpisode

View File

@@ -1,14 +1,14 @@
package hu.bbara.purefin.data.catalog package hu.bbara.purefin.data.catalog
import hu.bbara.purefin.core.data.MediaCatalogReader import hu.bbara.purefin.data.MediaCatalogReader
import hu.bbara.purefin.core.data.MediaProgressWriter import hu.bbara.purefin.data.MediaProgressWriter
import hu.bbara.purefin.data.jellyfin.client.JellyfinApiClient import hu.bbara.purefin.data.jellyfin.client.JellyfinApiClient
import hu.bbara.purefin.core.image.ImageUrlBuilder import hu.bbara.purefin.image.ImageUrlBuilder
import hu.bbara.purefin.core.data.session.UserSessionRepository import hu.bbara.purefin.data.session.UserSessionRepository
import hu.bbara.purefin.core.model.Episode import hu.bbara.purefin.model.Episode
import hu.bbara.purefin.core.model.Movie import hu.bbara.purefin.model.Movie
import hu.bbara.purefin.core.model.Season import hu.bbara.purefin.model.Season
import hu.bbara.purefin.core.model.Series import hu.bbara.purefin.model.Series
import java.time.LocalDateTime import java.time.LocalDateTime
import java.time.format.DateTimeFormatter import java.time.format.DateTimeFormatter
import java.util.Locale import java.util.Locale

View File

@@ -4,11 +4,11 @@ import dagger.Binds
import dagger.Module import dagger.Module
import dagger.hilt.InstallIn import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent import dagger.hilt.components.SingletonComponent
import hu.bbara.purefin.core.data.EpisodeSeriesLookup import hu.bbara.purefin.data.EpisodeSeriesLookup
import hu.bbara.purefin.core.data.HomeRepository import hu.bbara.purefin.data.HomeRepository
import hu.bbara.purefin.core.data.MediaCatalogReader import hu.bbara.purefin.data.MediaCatalogReader
import hu.bbara.purefin.core.data.MediaProgressWriter import hu.bbara.purefin.data.MediaProgressWriter
import hu.bbara.purefin.core.data.OfflineCatalogReader import hu.bbara.purefin.data.OfflineCatalogReader
@Module @Module
@InstallIn(SingletonComponent::class) @InstallIn(SingletonComponent::class)

View File

@@ -1,12 +1,12 @@
package hu.bbara.purefin.data.catalog package hu.bbara.purefin.data.catalog
import hu.bbara.purefin.core.data.MediaCatalogReader import hu.bbara.purefin.data.MediaCatalogReader
import hu.bbara.purefin.core.data.MediaProgressWriter import hu.bbara.purefin.data.MediaProgressWriter
import hu.bbara.purefin.core.data.OfflineCatalogReader import hu.bbara.purefin.data.OfflineCatalogReader
import hu.bbara.purefin.data.offline.room.offline.OfflineRoomMediaLocalDataSource import hu.bbara.purefin.data.offline.room.offline.OfflineRoomMediaLocalDataSource
import hu.bbara.purefin.core.model.Episode import hu.bbara.purefin.model.Episode
import hu.bbara.purefin.core.model.Movie import hu.bbara.purefin.model.Movie
import hu.bbara.purefin.core.model.Series import hu.bbara.purefin.model.Series
import java.util.UUID import java.util.UUID
import javax.inject.Inject import javax.inject.Inject
import javax.inject.Singleton import javax.inject.Singleton

View File

@@ -6,7 +6,7 @@ import android.net.Network
import android.net.NetworkCapabilities import android.net.NetworkCapabilities
import android.net.NetworkRequest import android.net.NetworkRequest
import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.android.qualifiers.ApplicationContext
import hu.bbara.purefin.core.data.NetworkMonitor import hu.bbara.purefin.data.NetworkMonitor
import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.channels.awaitClose
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.callbackFlow import kotlinx.coroutines.flow.callbackFlow

View File

@@ -6,13 +6,13 @@ import androidx.core.net.toUri
import androidx.media3.common.MediaItem import androidx.media3.common.MediaItem
import androidx.media3.common.MediaMetadata import androidx.media3.common.MediaMetadata
import androidx.media3.common.util.UnstableApi import androidx.media3.common.util.UnstableApi
import hu.bbara.purefin.core.data.PlayableMediaRepository import hu.bbara.purefin.data.PlayableMediaRepository
import hu.bbara.purefin.core.data.PlaybackReportContext import hu.bbara.purefin.data.PlaybackReportContext
import hu.bbara.purefin.core.data.session.UserSessionRepository import hu.bbara.purefin.data.session.UserSessionRepository
import hu.bbara.purefin.core.image.ArtworkKind import hu.bbara.purefin.image.ArtworkKind
import hu.bbara.purefin.core.image.ImageUrlBuilder import hu.bbara.purefin.image.ImageUrlBuilder
import hu.bbara.purefin.core.model.MediaSegment import hu.bbara.purefin.model.MediaSegment
import hu.bbara.purefin.core.model.SegmentType import hu.bbara.purefin.model.SegmentType
import hu.bbara.purefin.data.jellyfin.client.JellyfinApiClient import hu.bbara.purefin.data.jellyfin.client.JellyfinApiClient
import hu.bbara.purefin.data.jellyfin.playback.JellyfinPlaybackResolver import hu.bbara.purefin.data.jellyfin.playback.JellyfinPlaybackResolver
import hu.bbara.purefin.data.jellyfin.playback.PlaybackDecision import hu.bbara.purefin.data.jellyfin.playback.PlaybackDecision

View File

@@ -4,12 +4,12 @@ import dagger.Binds
import dagger.Module import dagger.Module
import dagger.hilt.InstallIn import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent import dagger.hilt.components.SingletonComponent
import hu.bbara.purefin.core.data.AuthenticationRepository import hu.bbara.purefin.data.AuthenticationRepository
import hu.bbara.purefin.core.data.DownloadMediaSourceResolver import hu.bbara.purefin.data.DownloadMediaSourceResolver
import hu.bbara.purefin.core.data.NetworkMonitor import hu.bbara.purefin.data.NetworkMonitor
import hu.bbara.purefin.core.data.PlayableMediaRepository import hu.bbara.purefin.data.PlayableMediaRepository
import hu.bbara.purefin.core.data.PlaybackProgressReporter import hu.bbara.purefin.data.PlaybackProgressReporter
import hu.bbara.purefin.core.data.SessionBootstrapper import hu.bbara.purefin.data.SessionBootstrapper
import hu.bbara.purefin.data.jellyfin.download.JellyfinDownloadMediaSourceResolver import hu.bbara.purefin.data.jellyfin.download.JellyfinDownloadMediaSourceResolver
import hu.bbara.purefin.data.jellyfin.session.JellyfinAuthenticationRepository import hu.bbara.purefin.data.jellyfin.session.JellyfinAuthenticationRepository
import hu.bbara.purefin.data.jellyfin.session.JellyfinSessionBootstrapper import hu.bbara.purefin.data.jellyfin.session.JellyfinSessionBootstrapper

View File

@@ -1,8 +1,8 @@
package hu.bbara.purefin.data.jellyfin package hu.bbara.purefin.data.jellyfin
import hu.bbara.purefin.core.data.PlaybackProgressReporter import hu.bbara.purefin.data.PlaybackProgressReporter
import hu.bbara.purefin.data.jellyfin.client.JellyfinApiClient import hu.bbara.purefin.data.jellyfin.client.JellyfinApiClient
import hu.bbara.purefin.core.data.PlaybackReportContext import hu.bbara.purefin.data.PlaybackReportContext
import java.util.UUID import java.util.UUID
import javax.inject.Inject import javax.inject.Inject
import javax.inject.Singleton import javax.inject.Singleton

View File

@@ -3,9 +3,9 @@ package hu.bbara.purefin.data.jellyfin.client
import android.content.Context import android.content.Context
import android.util.Log import android.util.Log
import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.android.qualifiers.ApplicationContext
import hu.bbara.purefin.core.data.PlaybackMethod import hu.bbara.purefin.data.PlaybackMethod
import hu.bbara.purefin.core.data.PlaybackReportContext import hu.bbara.purefin.data.PlaybackReportContext
import hu.bbara.purefin.core.data.session.UserSessionRepository import hu.bbara.purefin.data.session.UserSessionRepository
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.first
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext

View File

@@ -1,6 +1,6 @@
package hu.bbara.purefin.data.jellyfin.client package hu.bbara.purefin.data.jellyfin.client
import hu.bbara.purefin.core.data.session.UserSessionRepository import hu.bbara.purefin.data.session.UserSessionRepository
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.SupervisorJob import kotlinx.coroutines.SupervisorJob

View File

@@ -1,10 +1,10 @@
package hu.bbara.purefin.data.jellyfin.download package hu.bbara.purefin.data.jellyfin.download
import hu.bbara.purefin.core.image.ImageUrlBuilder import hu.bbara.purefin.image.ImageUrlBuilder
import hu.bbara.purefin.core.model.Episode import hu.bbara.purefin.model.Episode
import hu.bbara.purefin.core.model.Movie import hu.bbara.purefin.model.Movie
import hu.bbara.purefin.core.model.Season import hu.bbara.purefin.model.Season
import hu.bbara.purefin.core.model.Series import hu.bbara.purefin.model.Series
import java.util.UUID import java.util.UUID
import java.util.concurrent.TimeUnit import java.util.concurrent.TimeUnit
import org.jellyfin.sdk.model.api.BaseItemDto import org.jellyfin.sdk.model.api.BaseItemDto

View File

@@ -1,10 +1,10 @@
package hu.bbara.purefin.data.jellyfin.download package hu.bbara.purefin.data.jellyfin.download
import hu.bbara.purefin.core.data.DownloadMediaSourceResolver import hu.bbara.purefin.data.DownloadMediaSourceResolver
import hu.bbara.purefin.core.data.EpisodeDownloadSource import hu.bbara.purefin.data.EpisodeDownloadSource
import hu.bbara.purefin.core.data.MovieDownloadSource import hu.bbara.purefin.data.MovieDownloadSource
import hu.bbara.purefin.core.data.PlaybackMethod import hu.bbara.purefin.data.PlaybackMethod
import hu.bbara.purefin.core.data.session.UserSessionRepository import hu.bbara.purefin.data.session.UserSessionRepository
import hu.bbara.purefin.data.jellyfin.client.JellyfinApiClient import hu.bbara.purefin.data.jellyfin.client.JellyfinApiClient
import hu.bbara.purefin.data.jellyfin.playback.PlaybackDecisionResolver import hu.bbara.purefin.data.jellyfin.playback.PlaybackDecisionResolver
import hu.bbara.purefin.data.jellyfin.playback.playbackCustomCacheKey import hu.bbara.purefin.data.jellyfin.playback.playbackCustomCacheKey

View File

@@ -1,7 +1,7 @@
package hu.bbara.purefin.data.jellyfin.playback package hu.bbara.purefin.data.jellyfin.playback
import android.util.Log import android.util.Log
import hu.bbara.purefin.core.data.session.UserSessionRepository import hu.bbara.purefin.data.session.UserSessionRepository
import hu.bbara.purefin.data.jellyfin.client.JellyfinApiClient import hu.bbara.purefin.data.jellyfin.client.JellyfinApiClient
import java.util.UUID import java.util.UUID
import java.util.concurrent.ConcurrentHashMap import java.util.concurrent.ConcurrentHashMap

View File

@@ -1,6 +1,6 @@
package hu.bbara.purefin.data.jellyfin.playback package hu.bbara.purefin.data.jellyfin.playback
import hu.bbara.purefin.core.data.PlaybackMethod import hu.bbara.purefin.data.PlaybackMethod
fun playbackCustomCacheKey( fun playbackCustomCacheKey(
mediaId: String, mediaId: String,

View File

@@ -1,6 +1,6 @@
package hu.bbara.purefin.data.jellyfin.playback package hu.bbara.purefin.data.jellyfin.playback
import hu.bbara.purefin.core.data.PlaybackReportContext import hu.bbara.purefin.data.PlaybackReportContext
import org.jellyfin.sdk.model.api.MediaSourceInfo import org.jellyfin.sdk.model.api.MediaSourceInfo
data class PlaybackDecision( data class PlaybackDecision(

View File

@@ -1,10 +1,9 @@
package hu.bbara.purefin.data.jellyfin.playback package hu.bbara.purefin.data.jellyfin.playback
import hu.bbara.purefin.core.data.PlaybackMethod import hu.bbara.purefin.data.PlaybackMethod
import hu.bbara.purefin.core.data.PlaybackReportContext import hu.bbara.purefin.data.PlaybackReportContext
import org.jellyfin.sdk.model.api.MediaProtocol import org.jellyfin.sdk.model.api.MediaProtocol
import org.jellyfin.sdk.model.api.MediaSourceInfo import org.jellyfin.sdk.model.api.MediaSourceInfo
import org.jellyfin.sdk.model.api.PlayMethod
internal object PlaybackDecisionResolver { internal object PlaybackDecisionResolver {
fun resolve( fun resolve(

View File

@@ -4,7 +4,7 @@ import dagger.Module
import dagger.Provides import dagger.Provides
import dagger.hilt.InstallIn import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent import dagger.hilt.components.SingletonComponent
import hu.bbara.purefin.core.data.PlaybackProfileFamily import hu.bbara.purefin.data.PlaybackProfileFamily
import javax.inject.Singleton import javax.inject.Singleton
@Module @Module

View File

@@ -1,8 +1,8 @@
package hu.bbara.purefin.data.jellyfin.session package hu.bbara.purefin.data.jellyfin.session
import android.util.Log import android.util.Log
import hu.bbara.purefin.core.data.AuthenticationRepository import hu.bbara.purefin.data.AuthenticationRepository
import hu.bbara.purefin.core.data.session.UserSessionRepository import hu.bbara.purefin.data.session.UserSessionRepository
import hu.bbara.purefin.data.jellyfin.client.JellyfinApiClient import hu.bbara.purefin.data.jellyfin.client.JellyfinApiClient
import javax.inject.Inject import javax.inject.Inject
import javax.inject.Singleton import javax.inject.Singleton

View File

@@ -1,6 +1,6 @@
package hu.bbara.purefin.data.jellyfin.session package hu.bbara.purefin.data.jellyfin.session
import hu.bbara.purefin.core.data.SessionBootstrapper import hu.bbara.purefin.data.SessionBootstrapper
import hu.bbara.purefin.data.jellyfin.client.JellyfinApiClient import hu.bbara.purefin.data.jellyfin.client.JellyfinApiClient
import javax.inject.Inject import javax.inject.Inject
import javax.inject.Singleton import javax.inject.Singleton

View File

@@ -1,7 +1,7 @@
package hu.bbara.purefin.data.jellyfin.session package hu.bbara.purefin.data.jellyfin.session
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
import hu.bbara.purefin.core.navigation.UuidSerializer import hu.bbara.purefin.navigation.UuidSerializer
import java.util.UUID import java.util.UUID
@Serializable @Serializable

View File

@@ -10,7 +10,7 @@ import dagger.Provides
import dagger.hilt.InstallIn import dagger.hilt.InstallIn
import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.android.qualifiers.ApplicationContext
import dagger.hilt.components.SingletonComponent import dagger.hilt.components.SingletonComponent
import hu.bbara.purefin.core.data.session.UserSessionRepository import hu.bbara.purefin.data.session.UserSessionRepository
import javax.inject.Singleton import javax.inject.Singleton
@Module @Module

View File

@@ -1,7 +1,7 @@
package hu.bbara.purefin.data.jellyfin.session package hu.bbara.purefin.data.jellyfin.session
import androidx.datastore.core.DataStore import androidx.datastore.core.DataStore
import hu.bbara.purefin.core.data.session.UserSessionRepository import hu.bbara.purefin.data.session.UserSessionRepository
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.first

View File

@@ -4,8 +4,8 @@ import dagger.Binds
import dagger.Module import dagger.Module
import dagger.hilt.InstallIn import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent import dagger.hilt.components.SingletonComponent
import hu.bbara.purefin.core.data.OfflineCatalogStore import hu.bbara.purefin.data.OfflineCatalogStore
import hu.bbara.purefin.core.data.SmartDownloadStore import hu.bbara.purefin.data.SmartDownloadStore
@Module @Module
@InstallIn(SingletonComponent::class) @InstallIn(SingletonComponent::class)

View File

@@ -1,11 +1,11 @@
package hu.bbara.purefin.data.offline package hu.bbara.purefin.data.offline
import hu.bbara.purefin.core.data.OfflineCatalogStore import hu.bbara.purefin.data.OfflineCatalogStore
import hu.bbara.purefin.data.offline.room.offline.OfflineRoomMediaLocalDataSource import hu.bbara.purefin.data.offline.room.offline.OfflineRoomMediaLocalDataSource
import hu.bbara.purefin.core.model.Episode import hu.bbara.purefin.model.Episode
import hu.bbara.purefin.core.model.Movie import hu.bbara.purefin.model.Movie
import hu.bbara.purefin.core.model.Season import hu.bbara.purefin.model.Season
import hu.bbara.purefin.core.model.Series import hu.bbara.purefin.model.Series
import java.util.UUID import java.util.UUID
import javax.inject.Inject import javax.inject.Inject
import javax.inject.Singleton import javax.inject.Singleton

View File

@@ -1,6 +1,6 @@
package hu.bbara.purefin.data.offline package hu.bbara.purefin.data.offline
import hu.bbara.purefin.core.data.SmartDownloadStore import hu.bbara.purefin.data.SmartDownloadStore
import hu.bbara.purefin.data.offline.room.dao.SmartDownloadDao import hu.bbara.purefin.data.offline.room.dao.SmartDownloadDao
import hu.bbara.purefin.data.offline.room.entity.SmartDownloadEntity import hu.bbara.purefin.data.offline.room.entity.SmartDownloadEntity
import java.util.UUID import java.util.UUID

View File

@@ -1,12 +1,12 @@
package hu.bbara.purefin.data.offline.cache package hu.bbara.purefin.data.offline.cache
import hu.bbara.purefin.core.model.CastMember import hu.bbara.purefin.model.CastMember
import hu.bbara.purefin.core.model.Episode import hu.bbara.purefin.model.Episode
import hu.bbara.purefin.core.model.Library import hu.bbara.purefin.model.Library
import hu.bbara.purefin.core.model.LibraryKind import hu.bbara.purefin.model.LibraryKind
import hu.bbara.purefin.core.model.Media import hu.bbara.purefin.model.Media
import hu.bbara.purefin.core.model.Movie import hu.bbara.purefin.model.Movie
import hu.bbara.purefin.core.model.Series import hu.bbara.purefin.model.Series
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
import java.util.UUID import java.util.UUID

View File

@@ -9,10 +9,10 @@ import hu.bbara.purefin.data.offline.room.entity.EpisodeEntity
import hu.bbara.purefin.data.offline.room.entity.MovieEntity import hu.bbara.purefin.data.offline.room.entity.MovieEntity
import hu.bbara.purefin.data.offline.room.entity.SeasonEntity import hu.bbara.purefin.data.offline.room.entity.SeasonEntity
import hu.bbara.purefin.data.offline.room.entity.SeriesEntity import hu.bbara.purefin.data.offline.room.entity.SeriesEntity
import hu.bbara.purefin.core.model.Episode import hu.bbara.purefin.model.Episode
import hu.bbara.purefin.core.model.Movie import hu.bbara.purefin.model.Movie
import hu.bbara.purefin.core.model.Season import hu.bbara.purefin.model.Season
import hu.bbara.purefin.core.model.Series import hu.bbara.purefin.model.Series
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.map
import java.util.UUID import java.util.UUID

View File

@@ -1,4 +1,4 @@
package hu.bbara.purefin.core.data.session package hu.bbara.purefin.data.session
import java.util.UUID import java.util.UUID
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow

View File

@@ -1,4 +1,4 @@
package hu.bbara.purefin.core.image package hu.bbara.purefin.image
enum class ArtworkKind( enum class ArtworkKind(
internal val pathSegment: String, internal val pathSegment: String,

View File

@@ -1,4 +1,4 @@
package hu.bbara.purefin.core.image package hu.bbara.purefin.image
import java.util.UUID import java.util.UUID

View File

@@ -1,4 +1,4 @@
package hu.bbara.purefin.core.model package hu.bbara.purefin.model
data class CastMember( data class CastMember(
val name: String, val name: String,

View File

@@ -1,4 +1,4 @@
package hu.bbara.purefin.core.model package hu.bbara.purefin.model
import java.util.UUID import java.util.UUID

View File

@@ -1,4 +1,4 @@
package hu.bbara.purefin.core.model package hu.bbara.purefin.model
import java.util.UUID import java.util.UUID

View File

@@ -1,4 +1,4 @@
package hu.bbara.purefin.core.model package hu.bbara.purefin.model
enum class LibraryKind { enum class LibraryKind {
MOVIES, MOVIES,

View File

@@ -1,4 +1,4 @@
package hu.bbara.purefin.core.model package hu.bbara.purefin.model
import java.util.UUID import java.util.UUID

View File

@@ -1,4 +1,4 @@
package hu.bbara.purefin.core.model package hu.bbara.purefin.model
enum class MediaKind { enum class MediaKind {
MOVIE, MOVIE,

View File

@@ -1,4 +1,4 @@
package hu.bbara.purefin.core.model package hu.bbara.purefin.model
import java.util.UUID import java.util.UUID

View File

@@ -1,4 +1,4 @@
package hu.bbara.purefin.core.model package hu.bbara.purefin.model
import java.util.UUID import java.util.UUID

View File

@@ -1,4 +1,4 @@
package hu.bbara.purefin.core.model package hu.bbara.purefin.model
import java.util.UUID import java.util.UUID

View File

@@ -1,4 +1,4 @@
package hu.bbara.purefin.core.model package hu.bbara.purefin.model
import java.util.UUID import java.util.UUID

View File

@@ -1,12 +1,12 @@
package hu.bbara.purefin.core.navigation package hu.bbara.purefin.navigation
import java.util.UUID
import kotlinx.serialization.KSerializer import kotlinx.serialization.KSerializer
import kotlinx.serialization.descriptors.PrimitiveKind import kotlinx.serialization.descriptors.PrimitiveKind
import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor
import kotlinx.serialization.descriptors.SerialDescriptor import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.encoding.Decoder import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder import kotlinx.serialization.encoding.Encoder
import java.util.UUID
object UuidSerializer : KSerializer<UUID> { object UuidSerializer : KSerializer<UUID> {
override val descriptor: SerialDescriptor = override val descriptor: SerialDescriptor =
@@ -17,4 +17,4 @@ object UuidSerializer : KSerializer<UUID> {
override fun serialize(encoder: Encoder, value: UUID) { override fun serialize(encoder: Encoder, value: UUID) {
encoder.encodeString(value.toString()) encoder.encodeString(value.toString())
} }
} }

View File

@@ -1,9 +1,9 @@
package hu.bbara.purefin.data.catalog package hu.bbara.purefin.data.catalog
import hu.bbara.purefin.core.data.MediaCatalogReader import hu.bbara.purefin.data.MediaCatalogReader
import hu.bbara.purefin.core.model.Episode import hu.bbara.purefin.model.Episode
import hu.bbara.purefin.core.model.Movie import hu.bbara.purefin.model.Movie
import hu.bbara.purefin.core.model.Series import hu.bbara.purefin.model.Series
import java.util.UUID import java.util.UUID
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow

View File

@@ -1,6 +1,6 @@
package hu.bbara.purefin.data.jellyfin.playback package hu.bbara.purefin.data.jellyfin.playback
import hu.bbara.purefin.core.data.PlaybackMethod import hu.bbara.purefin.data.PlaybackMethod
import org.junit.Assert.assertEquals import org.junit.Assert.assertEquals
import org.junit.Assert.assertNull import org.junit.Assert.assertNull
import org.junit.Test import org.junit.Test

View File

@@ -1,6 +1,6 @@
package hu.bbara.purefin.data.jellyfin.playback package hu.bbara.purefin.data.jellyfin.playback
import hu.bbara.purefin.core.data.PlaybackMethod import hu.bbara.purefin.data.PlaybackMethod
import org.jellyfin.sdk.model.api.MediaProtocol import org.jellyfin.sdk.model.api.MediaProtocol
import org.jellyfin.sdk.model.api.MediaSourceInfo import org.jellyfin.sdk.model.api.MediaSourceInfo
import org.jellyfin.sdk.model.api.MediaSourceType import org.jellyfin.sdk.model.api.MediaSourceType

View File

@@ -9,9 +9,9 @@ import androidx.media3.exoplayer.offline.Download
import androidx.media3.exoplayer.offline.DownloadManager import androidx.media3.exoplayer.offline.DownloadManager
import androidx.media3.exoplayer.offline.DownloadRequest import androidx.media3.exoplayer.offline.DownloadRequest
import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.android.qualifiers.ApplicationContext
import hu.bbara.purefin.core.data.DownloadMediaSourceResolver import hu.bbara.purefin.data.DownloadMediaSourceResolver
import hu.bbara.purefin.core.data.OfflineCatalogStore import hu.bbara.purefin.data.OfflineCatalogStore
import hu.bbara.purefin.core.data.SmartDownloadStore import hu.bbara.purefin.data.SmartDownloadStore
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
@@ -19,7 +19,6 @@ import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.flowOn
import kotlinx.coroutines.launch import kotlinx.coroutines.launch

View File

@@ -2,7 +2,7 @@ package hu.bbara.purefin.core.navigation
import java.util.UUID import java.util.UUID
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
import hu.bbara.purefin.core.navigation.UuidSerializer import hu.bbara.purefin.navigation.UuidSerializer
@Serializable @Serializable
data class EpisodeDto( data class EpisodeDto(

View File

@@ -2,7 +2,7 @@ package hu.bbara.purefin.core.navigation
import java.util.UUID import java.util.UUID
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
import hu.bbara.purefin.core.navigation.UuidSerializer import hu.bbara.purefin.navigation.UuidSerializer
@Serializable @Serializable
data class LibraryDto( data class LibraryDto(

View File

@@ -2,7 +2,7 @@ package hu.bbara.purefin.core.navigation
import java.util.UUID import java.util.UUID
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
import hu.bbara.purefin.core.navigation.UuidSerializer import hu.bbara.purefin.navigation.UuidSerializer
@Serializable @Serializable
data class MovieDto( data class MovieDto(

View File

@@ -2,7 +2,7 @@ package hu.bbara.purefin.core.navigation
import java.util.UUID import java.util.UUID
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
import hu.bbara.purefin.core.navigation.UuidSerializer import hu.bbara.purefin.navigation.UuidSerializer
@Serializable @Serializable
data class SeriesDto( data class SeriesDto(

View File

@@ -6,8 +6,8 @@ import androidx.annotation.OptIn
import androidx.media3.common.util.UnstableApi import androidx.media3.common.util.UnstableApi
import androidx.media3.exoplayer.ExoPlayer import androidx.media3.exoplayer.ExoPlayer
import androidx.media3.exoplayer.PlayerMessage import androidx.media3.exoplayer.PlayerMessage
import hu.bbara.purefin.core.model.MediaSegment import hu.bbara.purefin.model.MediaSegment
import hu.bbara.purefin.core.model.SegmentType import hu.bbara.purefin.model.SegmentType
import hu.bbara.purefin.core.player.model.SegmentStatus import hu.bbara.purefin.core.player.model.SegmentStatus
@OptIn(UnstableApi::class) @OptIn(UnstableApi::class)

View File

@@ -9,8 +9,8 @@ import androidx.media3.common.TrackSelectionOverride
import androidx.media3.common.util.UnstableApi import androidx.media3.common.util.UnstableApi
import androidx.media3.exoplayer.ExoPlayer import androidx.media3.exoplayer.ExoPlayer
import dagger.hilt.android.scopes.ViewModelScoped import dagger.hilt.android.scopes.ViewModelScoped
import hu.bbara.purefin.core.data.PlaybackReportContext import hu.bbara.purefin.data.PlaybackReportContext
import hu.bbara.purefin.core.model.MediaSegment import hu.bbara.purefin.model.MediaSegment
import hu.bbara.purefin.core.player.model.MediaContext import hu.bbara.purefin.core.player.model.MediaContext
import hu.bbara.purefin.core.player.model.MetadataState import hu.bbara.purefin.core.player.model.MetadataState
import hu.bbara.purefin.core.player.model.PlaybackProgressSnapshot import hu.bbara.purefin.core.player.model.PlaybackProgressSnapshot

View File

@@ -2,9 +2,9 @@ package hu.bbara.purefin.core.player.manager
import android.util.Log import android.util.Log
import dagger.hilt.android.scopes.ViewModelScoped import dagger.hilt.android.scopes.ViewModelScoped
import hu.bbara.purefin.core.data.MediaProgressWriter import hu.bbara.purefin.data.MediaProgressWriter
import hu.bbara.purefin.core.data.PlaybackProgressReporter import hu.bbara.purefin.data.PlaybackProgressReporter
import hu.bbara.purefin.core.data.PlaybackReportContext import hu.bbara.purefin.data.PlaybackReportContext
import hu.bbara.purefin.core.player.model.MetadataState import hu.bbara.purefin.core.player.model.MetadataState
import hu.bbara.purefin.core.player.model.PlaybackProgressSnapshot import hu.bbara.purefin.core.player.model.PlaybackProgressSnapshot
import hu.bbara.purefin.core.player.model.PlaybackStateSnapshot import hu.bbara.purefin.core.player.model.PlaybackStateSnapshot

View File

@@ -1,6 +1,6 @@
package hu.bbara.purefin.core.player.model package hu.bbara.purefin.core.player.model
import hu.bbara.purefin.core.model.MediaSegment import hu.bbara.purefin.model.MediaSegment
import hu.bbara.purefin.core.player.preference.MediaTrackPreferences import hu.bbara.purefin.core.player.preference.MediaTrackPreferences
data class MediaContext( data class MediaContext(

View File

@@ -1,6 +1,6 @@
package hu.bbara.purefin.core.player.model package hu.bbara.purefin.core.player.model
import hu.bbara.purefin.core.data.PlaybackReportContext import hu.bbara.purefin.data.PlaybackReportContext
data class MetadataState( data class MetadataState(
val mediaId: String? = null, val mediaId: String? = null,

Some files were not shown because too many files have changed in this diff Show More