diff --git a/new-player/src/main/java/net/newpipe/newplayer/ActivityBrainSlug.kt b/new-player/src/main/java/net/newpipe/newplayer/ActivityBrainSlug.kt
index 9b773a1e..7bdfdad0 100644
--- a/new-player/src/main/java/net/newpipe/newplayer/ActivityBrainSlug.kt
+++ b/new-player/src/main/java/net/newpipe/newplayer/ActivityBrainSlug.kt
@@ -29,8 +29,8 @@ import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlinx.coroutines.launch
-import net.newpipe.newplayer.model.InternalNewPlayerViewModel
-import net.newpipe.newplayer.model.NewPlayerViewModel
+import net.newpipe.newplayer.uiModel.InternalNewPlayerViewModel
+import net.newpipe.newplayer.uiModel.NewPlayerViewModel
private const val TAG = "ActivityBrainSlug"
diff --git a/new-player/src/main/java/net/newpipe/newplayer/MediaRepository.kt b/new-player/src/main/java/net/newpipe/newplayer/MediaRepository.kt
index 115976bc..4a3ac94c 100644
--- a/new-player/src/main/java/net/newpipe/newplayer/MediaRepository.kt
+++ b/new-player/src/main/java/net/newpipe/newplayer/MediaRepository.kt
@@ -24,9 +24,9 @@ import android.graphics.Bitmap
import androidx.media3.common.MediaMetadata
import androidx.media3.datasource.DefaultHttpDataSource
import androidx.media3.datasource.HttpDataSource
-import net.newpipe.newplayer.utils.Chapter
-import net.newpipe.newplayer.utils.Stream
-import net.newpipe.newplayer.utils.Subtitle
+import net.newpipe.newplayer.data.Chapter
+import net.newpipe.newplayer.data.Stream
+import net.newpipe.newplayer.data.Subtitle
data class RepoMetaInfo(
val canHandleTimestampedLinks: Boolean,
diff --git a/new-player/src/main/java/net/newpipe/newplayer/NewPlayer.kt b/new-player/src/main/java/net/newpipe/newplayer/NewPlayer.kt
index e3e178ff..812867b1 100644
--- a/new-player/src/main/java/net/newpipe/newplayer/NewPlayer.kt
+++ b/new-player/src/main/java/net/newpipe/newplayer/NewPlayer.kt
@@ -27,10 +27,10 @@ import androidx.media3.common.Player
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.SharedFlow
import kotlinx.coroutines.flow.StateFlow
-import net.newpipe.newplayer.utils.Chapter
-import net.newpipe.newplayer.utils.LanguageIdentifier
-import net.newpipe.newplayer.utils.Stream
-import net.newpipe.newplayer.utils.StreamTrack
+import net.newpipe.newplayer.data.Chapter
+import net.newpipe.newplayer.data.LanguageIdentifier
+import net.newpipe.newplayer.data.Stream
+import net.newpipe.newplayer.data.StreamTrack
import kotlin.Exception
enum class PlayMode {
diff --git a/new-player/src/main/java/net/newpipe/newplayer/NewPlayerImpl.kt b/new-player/src/main/java/net/newpipe/newplayer/NewPlayerImpl.kt
index ae5ddc14..139fc853 100644
--- a/new-player/src/main/java/net/newpipe/newplayer/NewPlayerImpl.kt
+++ b/new-player/src/main/java/net/newpipe/newplayer/NewPlayerImpl.kt
@@ -51,18 +51,18 @@ import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch
import net.newpipe.newplayer.service.NewPlayerService
-import net.newpipe.newplayer.utils.ActionResponse
-import net.newpipe.newplayer.utils.Chapter
-import net.newpipe.newplayer.utils.LanguageIdentifier
-import net.newpipe.newplayer.utils.MediaSourceBuilder
-import net.newpipe.newplayer.utils.NewPlayerException
-import net.newpipe.newplayer.utils.NoResponse
-import net.newpipe.newplayer.utils.Stream
-import net.newpipe.newplayer.utils.StreamExceptionResponse
-import net.newpipe.newplayer.utils.StreamSelection
-import net.newpipe.newplayer.utils.StreamSelectionResponse
-import net.newpipe.newplayer.utils.StreamTrack
-import net.newpipe.newplayer.utils.StreamSelector
+import net.newpipe.newplayer.logic.ActionResponse
+import net.newpipe.newplayer.data.Chapter
+import net.newpipe.newplayer.data.LanguageIdentifier
+import net.newpipe.newplayer.logic.MediaSourceBuilder
+import net.newpipe.newplayer.data.NewPlayerException
+import net.newpipe.newplayer.logic.NoResponse
+import net.newpipe.newplayer.data.Stream
+import net.newpipe.newplayer.logic.StreamExceptionResponse
+import net.newpipe.newplayer.data.StreamSelection
+import net.newpipe.newplayer.logic.StreamSelectionResponse
+import net.newpipe.newplayer.data.StreamTrack
+import net.newpipe.newplayer.logic.StreamSelector
import kotlin.random.Random
private const val TAG = "NewPlayerImpl"
diff --git a/new-player/src/main/java/net/newpipe/newplayer/NewPlayerView.kt b/new-player/src/main/java/net/newpipe/newplayer/NewPlayerView.kt
index 404430ee..1bf00380 100644
--- a/new-player/src/main/java/net/newpipe/newplayer/NewPlayerView.kt
+++ b/new-player/src/main/java/net/newpipe/newplayer/NewPlayerView.kt
@@ -27,11 +27,11 @@ import android.widget.FrameLayout
import androidx.compose.ui.platform.ComposeView
import androidx.compose.ui.platform.ViewCompositionStrategy
import dagger.hilt.android.AndroidEntryPoint
-import net.newpipe.newplayer.model.InternalNewPlayerViewModel
-import net.newpipe.newplayer.model.NewPlayerViewModel
+import net.newpipe.newplayer.uiModel.InternalNewPlayerViewModel
+import net.newpipe.newplayer.uiModel.NewPlayerViewModel
import net.newpipe.newplayer.ui.NewPlayerUI
import net.newpipe.newplayer.ui.theme.VideoPlayerTheme
-import net.newpipe.newplayer.utils.NewPlayerException
+import net.newpipe.newplayer.data.NewPlayerException
@AndroidEntryPoint
class NewPlayerView : FrameLayout {
diff --git a/new-player/src/main/java/net/newpipe/newplayer/utils/Chapter.kt b/new-player/src/main/java/net/newpipe/newplayer/data/Chapter.kt
similarity index 96%
rename from new-player/src/main/java/net/newpipe/newplayer/utils/Chapter.kt
rename to new-player/src/main/java/net/newpipe/newplayer/data/Chapter.kt
index 036e0ddc..fd64a828 100644
--- a/new-player/src/main/java/net/newpipe/newplayer/utils/Chapter.kt
+++ b/new-player/src/main/java/net/newpipe/newplayer/data/Chapter.kt
@@ -18,7 +18,7 @@
* along with NewPlayer. If not, see .
*/
-package net.newpipe.newplayer.utils
+package net.newpipe.newplayer.data
import android.net.Uri
diff --git a/new-player/src/main/java/net/newpipe/newplayer/utils/LanguageIdentifier.kt b/new-player/src/main/java/net/newpipe/newplayer/data/LanguageIdentifier.kt
similarity index 99%
rename from new-player/src/main/java/net/newpipe/newplayer/utils/LanguageIdentifier.kt
rename to new-player/src/main/java/net/newpipe/newplayer/data/LanguageIdentifier.kt
index 1b373f25..ccec8e87 100644
--- a/new-player/src/main/java/net/newpipe/newplayer/utils/LanguageIdentifier.kt
+++ b/new-player/src/main/java/net/newpipe/newplayer/data/LanguageIdentifier.kt
@@ -18,7 +18,7 @@
* along with NewPlayer. If not, see .
*/
-package net.newpipe.newplayer.utils
+package net.newpipe.newplayer.data
import android.content.res.Resources
import net.newpipe.newplayer.R
diff --git a/new-player/src/main/java/net/newpipe/newplayer/utils/NewPlayerException.kt b/new-player/src/main/java/net/newpipe/newplayer/data/NewPlayerException.kt
similarity index 96%
rename from new-player/src/main/java/net/newpipe/newplayer/utils/NewPlayerException.kt
rename to new-player/src/main/java/net/newpipe/newplayer/data/NewPlayerException.kt
index 22021e66..dcf55905 100644
--- a/new-player/src/main/java/net/newpipe/newplayer/utils/NewPlayerException.kt
+++ b/new-player/src/main/java/net/newpipe/newplayer/data/NewPlayerException.kt
@@ -18,7 +18,7 @@
* along with NewPlayer. If not, see .
*/
-package net.newpipe.newplayer.utils
+package net.newpipe.newplayer.data
class NewPlayerException : Exception {
constructor(message: String) : super(message)
diff --git a/new-player/src/main/java/net/newpipe/newplayer/utils/Stream.kt b/new-player/src/main/java/net/newpipe/newplayer/data/Stream.kt
similarity index 98%
rename from new-player/src/main/java/net/newpipe/newplayer/utils/Stream.kt
rename to new-player/src/main/java/net/newpipe/newplayer/data/Stream.kt
index deefffb9..3594beef 100644
--- a/new-player/src/main/java/net/newpipe/newplayer/utils/Stream.kt
+++ b/new-player/src/main/java/net/newpipe/newplayer/data/Stream.kt
@@ -18,7 +18,7 @@
* along with NewPlayer. If not, see .
*/
-package net.newpipe.newplayer.utils
+package net.newpipe.newplayer.data
import android.net.Uri
diff --git a/new-player/src/main/java/net/newpipe/newplayer/utils/StreamSelection.kt b/new-player/src/main/java/net/newpipe/newplayer/data/StreamSelection.kt
similarity index 93%
rename from new-player/src/main/java/net/newpipe/newplayer/utils/StreamSelection.kt
rename to new-player/src/main/java/net/newpipe/newplayer/data/StreamSelection.kt
index 07c601b9..41845e4b 100644
--- a/new-player/src/main/java/net/newpipe/newplayer/utils/StreamSelection.kt
+++ b/new-player/src/main/java/net/newpipe/newplayer/data/StreamSelection.kt
@@ -18,9 +18,7 @@
* along with NewPlayer. If not, see .
*/
-package net.newpipe.newplayer.utils
-
-import net.newpipe.newplayer.utils.Stream
+package net.newpipe.newplayer.data
interface StreamSelection {
val item: String
diff --git a/new-player/src/main/java/net/newpipe/newplayer/utils/StreamTrack.kt b/new-player/src/main/java/net/newpipe/newplayer/data/StreamTrack.kt
similarity index 98%
rename from new-player/src/main/java/net/newpipe/newplayer/utils/StreamTrack.kt
rename to new-player/src/main/java/net/newpipe/newplayer/data/StreamTrack.kt
index f24902f9..2a2ff8c2 100644
--- a/new-player/src/main/java/net/newpipe/newplayer/utils/StreamTrack.kt
+++ b/new-player/src/main/java/net/newpipe/newplayer/data/StreamTrack.kt
@@ -18,7 +18,7 @@
* along with NewPlayer. If not, see .
*/
-package net.newpipe.newplayer.utils
+package net.newpipe.newplayer.data
interface StreamTrack : Comparable {
val fileFormat: String
diff --git a/new-player/src/main/java/net/newpipe/newplayer/utils/Subtitle.kt b/new-player/src/main/java/net/newpipe/newplayer/data/Subtitle.kt
similarity index 95%
rename from new-player/src/main/java/net/newpipe/newplayer/utils/Subtitle.kt
rename to new-player/src/main/java/net/newpipe/newplayer/data/Subtitle.kt
index 7ae5e4f9..b040dd54 100644
--- a/new-player/src/main/java/net/newpipe/newplayer/utils/Subtitle.kt
+++ b/new-player/src/main/java/net/newpipe/newplayer/data/Subtitle.kt
@@ -18,7 +18,7 @@
* along with NewPlayer. If not, see .
*/
-package net.newpipe.newplayer.utils
+package net.newpipe.newplayer.data
import android.net.Uri
diff --git a/new-player/src/main/java/net/newpipe/newplayer/utils/VideoSize.kt b/new-player/src/main/java/net/newpipe/newplayer/data/VideoSize.kt
similarity index 98%
rename from new-player/src/main/java/net/newpipe/newplayer/utils/VideoSize.kt
rename to new-player/src/main/java/net/newpipe/newplayer/data/VideoSize.kt
index d4a648d9..42961126 100644
--- a/new-player/src/main/java/net/newpipe/newplayer/utils/VideoSize.kt
+++ b/new-player/src/main/java/net/newpipe/newplayer/data/VideoSize.kt
@@ -19,7 +19,7 @@
*/
-package net.newpipe.newplayer.utils
+package net.newpipe.newplayer.data
internal data class VideoSize(
val width: Int,
diff --git a/new-player/src/main/java/net/newpipe/newplayer/utils/MediaSourceBuilder.kt b/new-player/src/main/java/net/newpipe/newplayer/logic/MediaSourceBuilder.kt
similarity index 93%
rename from new-player/src/main/java/net/newpipe/newplayer/utils/MediaSourceBuilder.kt
rename to new-player/src/main/java/net/newpipe/newplayer/logic/MediaSourceBuilder.kt
index fef596b5..d9db2ba5 100644
--- a/new-player/src/main/java/net/newpipe/newplayer/utils/MediaSourceBuilder.kt
+++ b/new-player/src/main/java/net/newpipe/newplayer/logic/MediaSourceBuilder.kt
@@ -18,7 +18,7 @@
* along with NewPlayer. If not, see .
*/
-package net.newpipe.newplayer.utils
+package net.newpipe.newplayer.logic
import androidx.annotation.OptIn
import androidx.media3.common.MediaItem
@@ -30,6 +30,11 @@ import androidx.media3.exoplayer.source.MergingMediaSource
import androidx.media3.exoplayer.source.ProgressiveMediaSource
import kotlinx.coroutines.flow.MutableSharedFlow
import net.newpipe.newplayer.MediaRepository
+import net.newpipe.newplayer.data.MultiSelection
+import net.newpipe.newplayer.data.NewPlayerException
+import net.newpipe.newplayer.data.SingleSelection
+import net.newpipe.newplayer.data.Stream
+import net.newpipe.newplayer.data.StreamSelection
@OptIn(UnstableApi::class)
internal class MediaSourceBuilder
diff --git a/new-player/src/main/java/net/newpipe/newplayer/utils/StreamExceptionResponse.kt b/new-player/src/main/java/net/newpipe/newplayer/logic/StreamExceptionResponse.kt
similarity index 92%
rename from new-player/src/main/java/net/newpipe/newplayer/utils/StreamExceptionResponse.kt
rename to new-player/src/main/java/net/newpipe/newplayer/logic/StreamExceptionResponse.kt
index 1502bc0d..280d922e 100644
--- a/new-player/src/main/java/net/newpipe/newplayer/utils/StreamExceptionResponse.kt
+++ b/new-player/src/main/java/net/newpipe/newplayer/logic/StreamExceptionResponse.kt
@@ -18,9 +18,9 @@
* along with NewPlayer. If not, see .
*/
-package net.newpipe.newplayer.utils;
+package net.newpipe.newplayer.logic;
-import net.newpipe.newplayer.NewPlayer
+import net.newpipe.newplayer.data.StreamSelection
interface StreamExceptionResponse
diff --git a/new-player/src/main/java/net/newpipe/newplayer/utils/StreamSelector.kt b/new-player/src/main/java/net/newpipe/newplayer/logic/StreamSelector.kt
similarity index 81%
rename from new-player/src/main/java/net/newpipe/newplayer/utils/StreamSelector.kt
rename to new-player/src/main/java/net/newpipe/newplayer/logic/StreamSelector.kt
index 8e456819..82033be2 100644
--- a/new-player/src/main/java/net/newpipe/newplayer/utils/StreamSelector.kt
+++ b/new-player/src/main/java/net/newpipe/newplayer/logic/StreamSelector.kt
@@ -18,13 +18,19 @@
* along with NewPlayer. If not, see .
*/
-package net.newpipe.newplayer.utils
-
-import net.newpipe.newplayer.utils.TrackUtils.getDynamicStreams
-import net.newpipe.newplayer.utils.TrackUtils.hasVideoStreams
-import net.newpipe.newplayer.utils.TrackUtils.tryAndGetMedianAudioOnlyStream
-import net.newpipe.newplayer.utils.TrackUtils.tryAndGetMedianCombinedVideoAndAudioStream
-import net.newpipe.newplayer.utils.TrackUtils.tryAndGetMedianVideoOnlyStream
+package net.newpipe.newplayer.logic
+
+import net.newpipe.newplayer.data.LanguageIdentifier
+import net.newpipe.newplayer.data.MultiSelection
+import net.newpipe.newplayer.data.NewPlayerException
+import net.newpipe.newplayer.data.SingleSelection
+import net.newpipe.newplayer.data.Stream
+import net.newpipe.newplayer.data.StreamSelection
+import net.newpipe.newplayer.logic.TrackUtils.getDynamicStreams
+import net.newpipe.newplayer.logic.TrackUtils.hasVideoStreams
+import net.newpipe.newplayer.logic.TrackUtils.tryAndGetMedianAudioOnlyStream
+import net.newpipe.newplayer.logic.TrackUtils.tryAndGetMedianCombinedVideoAndAudioStream
+import net.newpipe.newplayer.logic.TrackUtils.tryAndGetMedianVideoOnlyStream
internal class StreamSelector(
val preferredLanguages: List,
diff --git a/new-player/src/main/java/net/newpipe/newplayer/utils/TrackUtils.kt b/new-player/src/main/java/net/newpipe/newplayer/logic/TrackUtils.kt
similarity index 94%
rename from new-player/src/main/java/net/newpipe/newplayer/utils/TrackUtils.kt
rename to new-player/src/main/java/net/newpipe/newplayer/logic/TrackUtils.kt
index 6ab0d807..f2eb3d52 100644
--- a/new-player/src/main/java/net/newpipe/newplayer/utils/TrackUtils.kt
+++ b/new-player/src/main/java/net/newpipe/newplayer/logic/TrackUtils.kt
@@ -18,7 +18,12 @@
* along with NewPlayer. If not, see .
*/
-package net.newpipe.newplayer.utils
+package net.newpipe.newplayer.logic
+
+import net.newpipe.newplayer.data.AudioStreamTrack
+import net.newpipe.newplayer.data.LanguageIdentifier
+import net.newpipe.newplayer.data.Stream
+import net.newpipe.newplayer.data.StreamTrack
object TrackUtils {
diff --git a/new-player/src/main/java/net/newpipe/newplayer/ui/NewPlayerUI.kt b/new-player/src/main/java/net/newpipe/newplayer/ui/NewPlayerUI.kt
index 01db2216..617d4114 100644
--- a/new-player/src/main/java/net/newpipe/newplayer/ui/NewPlayerUI.kt
+++ b/new-player/src/main/java/net/newpipe/newplayer/ui/NewPlayerUI.kt
@@ -39,11 +39,11 @@ import androidx.core.view.WindowInsetsCompat
import androidx.core.view.WindowInsetsControllerCompat
import androidx.media3.common.util.UnstableApi
-import net.newpipe.newplayer.utils.NewPlayerException
-import net.newpipe.newplayer.model.UIModeState
-import net.newpipe.newplayer.model.InternalNewPlayerViewModel
-import net.newpipe.newplayer.model.NewPlayerViewModel
-import net.newpipe.newplayer.model.NewPlayerViewModelDummy
+import net.newpipe.newplayer.data.NewPlayerException
+import net.newpipe.newplayer.uiModel.UIModeState
+import net.newpipe.newplayer.uiModel.InternalNewPlayerViewModel
+import net.newpipe.newplayer.uiModel.NewPlayerViewModel
+import net.newpipe.newplayer.uiModel.NewPlayerViewModelDummy
import net.newpipe.newplayer.ui.audioplayer.AudioPlayerUI
import net.newpipe.newplayer.ui.theme.VideoPlayerTheme
import net.newpipe.newplayer.ui.videoplayer.VideoPlayerUi
diff --git a/new-player/src/main/java/net/newpipe/newplayer/ui/audioplayer/AudioPlaybackController.kt b/new-player/src/main/java/net/newpipe/newplayer/ui/audioplayer/AudioPlaybackController.kt
index 23b5c892..93087a36 100644
--- a/new-player/src/main/java/net/newpipe/newplayer/ui/audioplayer/AudioPlaybackController.kt
+++ b/new-player/src/main/java/net/newpipe/newplayer/ui/audioplayer/AudioPlaybackController.kt
@@ -49,9 +49,9 @@ import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.media3.common.util.UnstableApi
import net.newpipe.newplayer.R
-import net.newpipe.newplayer.model.NewPlayerUIState
-import net.newpipe.newplayer.model.InternalNewPlayerViewModel
-import net.newpipe.newplayer.model.NewPlayerViewModelDummy
+import net.newpipe.newplayer.uiModel.NewPlayerUIState
+import net.newpipe.newplayer.uiModel.InternalNewPlayerViewModel
+import net.newpipe.newplayer.uiModel.NewPlayerViewModelDummy
import net.newpipe.newplayer.ui.theme.VideoPlayerTheme
@androidx.annotation.OptIn(UnstableApi::class)
diff --git a/new-player/src/main/java/net/newpipe/newplayer/ui/audioplayer/AudioPlayerEmbeddedUI.kt b/new-player/src/main/java/net/newpipe/newplayer/ui/audioplayer/AudioPlayerEmbeddedUI.kt
index d072364e..768ebf2a 100644
--- a/new-player/src/main/java/net/newpipe/newplayer/ui/audioplayer/AudioPlayerEmbeddedUI.kt
+++ b/new-player/src/main/java/net/newpipe/newplayer/ui/audioplayer/AudioPlayerEmbeddedUI.kt
@@ -44,11 +44,11 @@ import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.media3.common.util.UnstableApi
import net.newpipe.newplayer.R
-import net.newpipe.newplayer.model.EmbeddedUiConfig
-import net.newpipe.newplayer.model.NewPlayerUIState
-import net.newpipe.newplayer.model.InternalNewPlayerViewModel
-import net.newpipe.newplayer.model.NewPlayerViewModelDummy
-import net.newpipe.newplayer.model.UIModeState
+import net.newpipe.newplayer.uiModel.EmbeddedUiConfig
+import net.newpipe.newplayer.uiModel.NewPlayerUIState
+import net.newpipe.newplayer.uiModel.InternalNewPlayerViewModel
+import net.newpipe.newplayer.uiModel.NewPlayerViewModelDummy
+import net.newpipe.newplayer.uiModel.UIModeState
import net.newpipe.newplayer.ui.theme.VideoPlayerTheme
import net.newpipe.newplayer.ui.videoplayer.CONTROLLER_UI_BACKGROUND_COLOR
import net.newpipe.newplayer.ui.videoplayer.PreviewBackgroundSurface
diff --git a/new-player/src/main/java/net/newpipe/newplayer/ui/audioplayer/AudioPlayerUI.kt b/new-player/src/main/java/net/newpipe/newplayer/ui/audioplayer/AudioPlayerUI.kt
index 3867469e..c0cb719b 100644
--- a/new-player/src/main/java/net/newpipe/newplayer/ui/audioplayer/AudioPlayerUI.kt
+++ b/new-player/src/main/java/net/newpipe/newplayer/ui/audioplayer/AudioPlayerUI.kt
@@ -56,10 +56,10 @@ import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.em
import androidx.media3.common.util.UnstableApi
import net.newpipe.newplayer.R
-import net.newpipe.newplayer.model.NewPlayerUIState
-import net.newpipe.newplayer.model.InternalNewPlayerViewModel
-import net.newpipe.newplayer.model.NewPlayerViewModelDummy
-import net.newpipe.newplayer.model.UIModeState
+import net.newpipe.newplayer.uiModel.NewPlayerUIState
+import net.newpipe.newplayer.uiModel.InternalNewPlayerViewModel
+import net.newpipe.newplayer.uiModel.NewPlayerViewModelDummy
+import net.newpipe.newplayer.uiModel.UIModeState
import net.newpipe.newplayer.ui.common.NewPlayerSeeker
import net.newpipe.newplayer.ui.common.ThumbPreview
import net.newpipe.newplayer.ui.selection_ui.ChapterSelectUI
diff --git a/new-player/src/main/java/net/newpipe/newplayer/ui/audioplayer/BottomUI.kt b/new-player/src/main/java/net/newpipe/newplayer/ui/audioplayer/BottomUI.kt
index 1668c87b..745169f5 100644
--- a/new-player/src/main/java/net/newpipe/newplayer/ui/audioplayer/BottomUI.kt
+++ b/new-player/src/main/java/net/newpipe/newplayer/ui/audioplayer/BottomUI.kt
@@ -54,11 +54,11 @@ import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.media3.common.util.UnstableApi
import net.newpipe.newplayer.R
-import net.newpipe.newplayer.model.EmbeddedUiConfig
-import net.newpipe.newplayer.model.NewPlayerUIState
-import net.newpipe.newplayer.model.InternalNewPlayerViewModel
-import net.newpipe.newplayer.model.NewPlayerViewModelDummy
-import net.newpipe.newplayer.model.UIModeState
+import net.newpipe.newplayer.uiModel.EmbeddedUiConfig
+import net.newpipe.newplayer.uiModel.NewPlayerUIState
+import net.newpipe.newplayer.uiModel.InternalNewPlayerViewModel
+import net.newpipe.newplayer.uiModel.NewPlayerViewModelDummy
+import net.newpipe.newplayer.uiModel.UIModeState
import net.newpipe.newplayer.ui.theme.VideoPlayerTheme
import net.newpipe.newplayer.ui.videoplayer.pip.supportsPip
import net.newpipe.newplayer.ui.common.getEmbeddedUiConfig
diff --git a/new-player/src/main/java/net/newpipe/newplayer/ui/common/NewPlayerSeeker.kt b/new-player/src/main/java/net/newpipe/newplayer/ui/common/NewPlayerSeeker.kt
index 13f5af5d..d15e067c 100644
--- a/new-player/src/main/java/net/newpipe/newplayer/ui/common/NewPlayerSeeker.kt
+++ b/new-player/src/main/java/net/newpipe/newplayer/ui/common/NewPlayerSeeker.kt
@@ -28,9 +28,9 @@ import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.media3.common.util.UnstableApi
-import net.newpipe.newplayer.utils.Chapter
-import net.newpipe.newplayer.model.NewPlayerUIState
-import net.newpipe.newplayer.model.InternalNewPlayerViewModel
+import net.newpipe.newplayer.data.Chapter
+import net.newpipe.newplayer.uiModel.NewPlayerUIState
+import net.newpipe.newplayer.uiModel.InternalNewPlayerViewModel
import net.newpipe.newplayer.ui.seeker.ChapterSegment
import net.newpipe.newplayer.ui.seeker.DefaultSeekerColor
import net.newpipe.newplayer.ui.seeker.Seeker
diff --git a/new-player/src/main/java/net/newpipe/newplayer/ui/common/PlaylistControllButtons.kt b/new-player/src/main/java/net/newpipe/newplayer/ui/common/PlaylistControllButtons.kt
index 09290afd..06a79817 100644
--- a/new-player/src/main/java/net/newpipe/newplayer/ui/common/PlaylistControllButtons.kt
+++ b/new-player/src/main/java/net/newpipe/newplayer/ui/common/PlaylistControllButtons.kt
@@ -35,8 +35,8 @@ import androidx.compose.ui.res.stringResource
import androidx.media3.common.util.UnstableApi
import net.newpipe.newplayer.R
import net.newpipe.newplayer.RepeatMode
-import net.newpipe.newplayer.model.NewPlayerUIState
-import net.newpipe.newplayer.model.InternalNewPlayerViewModel
+import net.newpipe.newplayer.uiModel.NewPlayerUIState
+import net.newpipe.newplayer.uiModel.InternalNewPlayerViewModel
@OptIn(UnstableApi::class)
@Composable
diff --git a/new-player/src/main/java/net/newpipe/newplayer/ui/common/ThumbPreview.kt b/new-player/src/main/java/net/newpipe/newplayer/ui/common/ThumbPreview.kt
index 977fde4e..e3d805a3 100644
--- a/new-player/src/main/java/net/newpipe/newplayer/ui/common/ThumbPreview.kt
+++ b/new-player/src/main/java/net/newpipe/newplayer/ui/common/ThumbPreview.kt
@@ -38,12 +38,10 @@ import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.offset
import androidx.compose.foundation.layout.padding
-import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.wrapContentSize
import androidx.compose.material3.Card
import androidx.compose.material3.CardDefaults
import androidx.compose.material3.Slider
-import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
@@ -59,16 +57,14 @@ import androidx.compose.ui.graphics.asImageBitmap
import androidx.compose.ui.layout.onGloballyPositioned
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalDensity
-import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.IntOffset
import androidx.compose.ui.unit.dp
-import androidx.core.content.res.ResourcesCompat
import androidx.media3.common.util.UnstableApi
import net.newpipe.newplayer.R
-import net.newpipe.newplayer.model.NewPlayerUIState
+import net.newpipe.newplayer.uiModel.NewPlayerUIState
import net.newpipe.newplayer.ui.seeker.SeekerDefaults
import net.newpipe.newplayer.ui.theme.VideoPlayerTheme
diff --git a/new-player/src/main/java/net/newpipe/newplayer/ui/common/utils.kt b/new-player/src/main/java/net/newpipe/newplayer/ui/common/utils.kt
index 6facb6ee..3851551e 100644
--- a/new-player/src/main/java/net/newpipe/newplayer/ui/common/utils.kt
+++ b/new-player/src/main/java/net/newpipe/newplayer/ui/common/utils.kt
@@ -50,9 +50,9 @@ import androidx.core.view.WindowCompat
import androidx.media3.common.MediaItem
import androidx.media3.common.util.UnstableApi
import coil.compose.AsyncImage
-import net.newpipe.newplayer.utils.NewPlayerException
+import net.newpipe.newplayer.data.NewPlayerException
import net.newpipe.newplayer.R
-import net.newpipe.newplayer.model.EmbeddedUiConfig
+import net.newpipe.newplayer.uiModel.EmbeddedUiConfig
import java.util.Locale
@Composable
diff --git a/new-player/src/main/java/net/newpipe/newplayer/ui/selection_ui/ChapterItem.kt b/new-player/src/main/java/net/newpipe/newplayer/ui/selection_ui/ChapterItem.kt
index 655e6911..a3a11df4 100644
--- a/new-player/src/main/java/net/newpipe/newplayer/ui/selection_ui/ChapterItem.kt
+++ b/new-player/src/main/java/net/newpipe/newplayer/ui/selection_ui/ChapterItem.kt
@@ -47,8 +47,8 @@ import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
-import net.newpipe.newplayer.utils.Chapter
-import net.newpipe.newplayer.utils.NewPlayerException
+import net.newpipe.newplayer.data.Chapter
+import net.newpipe.newplayer.data.NewPlayerException
import net.newpipe.newplayer.R
import net.newpipe.newplayer.ui.theme.VideoPlayerTheme
import net.newpipe.newplayer.ui.common.Thumbnail
diff --git a/new-player/src/main/java/net/newpipe/newplayer/ui/selection_ui/ChapterSelectUI.kt b/new-player/src/main/java/net/newpipe/newplayer/ui/selection_ui/ChapterSelectUI.kt
index b7aa8d7d..c8d98f6b 100644
--- a/new-player/src/main/java/net/newpipe/newplayer/ui/selection_ui/ChapterSelectUI.kt
+++ b/new-player/src/main/java/net/newpipe/newplayer/ui/selection_ui/ChapterSelectUI.kt
@@ -38,10 +38,10 @@ import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.media3.common.util.UnstableApi
-import net.newpipe.newplayer.model.EmbeddedUiConfig
-import net.newpipe.newplayer.model.NewPlayerUIState
-import net.newpipe.newplayer.model.InternalNewPlayerViewModel
-import net.newpipe.newplayer.model.NewPlayerViewModelDummy
+import net.newpipe.newplayer.uiModel.EmbeddedUiConfig
+import net.newpipe.newplayer.uiModel.NewPlayerUIState
+import net.newpipe.newplayer.uiModel.InternalNewPlayerViewModel
+import net.newpipe.newplayer.uiModel.NewPlayerViewModelDummy
import net.newpipe.newplayer.ui.theme.VideoPlayerTheme
import net.newpipe.newplayer.ui.common.getEmbeddedUiConfig
import net.newpipe.newplayer.ui.common.getInsets
diff --git a/new-player/src/main/java/net/newpipe/newplayer/ui/selection_ui/StreamItem.kt b/new-player/src/main/java/net/newpipe/newplayer/ui/selection_ui/StreamItem.kt
index 17bfffcb..f71aee21 100644
--- a/new-player/src/main/java/net/newpipe/newplayer/ui/selection_ui/StreamItem.kt
+++ b/new-player/src/main/java/net/newpipe/newplayer/ui/selection_ui/StreamItem.kt
@@ -62,7 +62,7 @@ import androidx.compose.ui.unit.sp
import androidx.media3.common.MediaItem
import androidx.media3.common.util.UnstableApi
import net.newpipe.newplayer.R
-import net.newpipe.newplayer.model.NewPlayerUIState
+import net.newpipe.newplayer.uiModel.NewPlayerUIState
import net.newpipe.newplayer.ui.videoplayer.CONTROLLER_UI_BACKGROUND_COLOR
import net.newpipe.newplayer.ui.theme.VideoPlayerTheme
import net.newpipe.newplayer.ui.common.ReorderHapticFeedback
diff --git a/new-player/src/main/java/net/newpipe/newplayer/ui/selection_ui/StreamSelectTopBar.kt b/new-player/src/main/java/net/newpipe/newplayer/ui/selection_ui/StreamSelectTopBar.kt
index 249314ee..ca43f518 100644
--- a/new-player/src/main/java/net/newpipe/newplayer/ui/selection_ui/StreamSelectTopBar.kt
+++ b/new-player/src/main/java/net/newpipe/newplayer/ui/selection_ui/StreamSelectTopBar.kt
@@ -41,10 +41,10 @@ import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.tooling.preview.Preview
import androidx.media3.common.util.UnstableApi
import net.newpipe.newplayer.R
-import net.newpipe.newplayer.model.EmbeddedUiConfig
-import net.newpipe.newplayer.model.NewPlayerUIState
-import net.newpipe.newplayer.model.InternalNewPlayerViewModel
-import net.newpipe.newplayer.model.NewPlayerViewModelDummy
+import net.newpipe.newplayer.uiModel.EmbeddedUiConfig
+import net.newpipe.newplayer.uiModel.NewPlayerUIState
+import net.newpipe.newplayer.uiModel.InternalNewPlayerViewModel
+import net.newpipe.newplayer.uiModel.NewPlayerViewModelDummy
import net.newpipe.newplayer.ui.common.RepeatModeButton
import net.newpipe.newplayer.ui.common.ShuffleModeButton
import net.newpipe.newplayer.ui.theme.VideoPlayerTheme
diff --git a/new-player/src/main/java/net/newpipe/newplayer/ui/selection_ui/StreamSelectUI.kt b/new-player/src/main/java/net/newpipe/newplayer/ui/selection_ui/StreamSelectUI.kt
index b6fd3d6c..4d7863c1 100644
--- a/new-player/src/main/java/net/newpipe/newplayer/ui/selection_ui/StreamSelectUI.kt
+++ b/new-player/src/main/java/net/newpipe/newplayer/ui/selection_ui/StreamSelectUI.kt
@@ -40,9 +40,9 @@ import androidx.compose.ui.graphics.Color
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.media3.common.util.UnstableApi
-import net.newpipe.newplayer.model.NewPlayerUIState
-import net.newpipe.newplayer.model.InternalNewPlayerViewModel
-import net.newpipe.newplayer.model.NewPlayerViewModelDummy
+import net.newpipe.newplayer.uiModel.NewPlayerUIState
+import net.newpipe.newplayer.uiModel.InternalNewPlayerViewModel
+import net.newpipe.newplayer.uiModel.NewPlayerViewModelDummy
import net.newpipe.newplayer.ui.theme.VideoPlayerTheme
import net.newpipe.newplayer.ui.common.ReorderHapticFeedbackType
import net.newpipe.newplayer.ui.common.getInsets
diff --git a/new-player/src/main/java/net/newpipe/newplayer/ui/theme/Color.kt b/new-player/src/main/java/net/newpipe/newplayer/ui/theme/Color.kt
index 402ad0c6..b8047c7f 100644
--- a/new-player/src/main/java/net/newpipe/newplayer/ui/theme/Color.kt
+++ b/new-player/src/main/java/net/newpipe/newplayer/ui/theme/Color.kt
@@ -25,9 +25,9 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.tooling.preview.Preview
import androidx.media3.common.util.UnstableApi
-import net.newpipe.newplayer.model.UIModeState
-import net.newpipe.newplayer.model.NewPlayerUIState
-import net.newpipe.newplayer.model.NewPlayerViewModelDummy
+import net.newpipe.newplayer.uiModel.UIModeState
+import net.newpipe.newplayer.uiModel.NewPlayerUIState
+import net.newpipe.newplayer.uiModel.NewPlayerViewModelDummy
import net.newpipe.newplayer.ui.audioplayer.AudioPlayerUI
import net.newpipe.newplayer.ui.videoplayer.PreviewBackgroundSurface
import net.newpipe.newplayer.ui.videoplayer.VideoPlayerControllerUI
diff --git a/new-player/src/main/java/net/newpipe/newplayer/ui/videoplayer/GestureUI.kt b/new-player/src/main/java/net/newpipe/newplayer/ui/videoplayer/GestureUI.kt
index cc6b7f5e..038c6a5f 100644
--- a/new-player/src/main/java/net/newpipe/newplayer/ui/videoplayer/GestureUI.kt
+++ b/new-player/src/main/java/net/newpipe/newplayer/ui/videoplayer/GestureUI.kt
@@ -25,8 +25,8 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.media3.common.util.UnstableApi
-import net.newpipe.newplayer.model.NewPlayerUIState
-import net.newpipe.newplayer.model.InternalNewPlayerViewModel
+import net.newpipe.newplayer.uiModel.NewPlayerUIState
+import net.newpipe.newplayer.uiModel.InternalNewPlayerViewModel
import net.newpipe.newplayer.ui.videoplayer.gesture_ui.EmbeddedGestureUI
import net.newpipe.newplayer.ui.videoplayer.gesture_ui.FullscreenGestureUI
diff --git a/new-player/src/main/java/net/newpipe/newplayer/ui/videoplayer/VideoPlayerControllerUI.kt b/new-player/src/main/java/net/newpipe/newplayer/ui/videoplayer/VideoPlayerControllerUI.kt
index dc2235bd..ba398ff7 100644
--- a/new-player/src/main/java/net/newpipe/newplayer/ui/videoplayer/VideoPlayerControllerUI.kt
+++ b/new-player/src/main/java/net/newpipe/newplayer/ui/videoplayer/VideoPlayerControllerUI.kt
@@ -44,10 +44,10 @@ import androidx.compose.ui.graphics.Color
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.media3.common.util.UnstableApi
-import net.newpipe.newplayer.model.NewPlayerUIState
-import net.newpipe.newplayer.model.InternalNewPlayerViewModel
-import net.newpipe.newplayer.model.NewPlayerViewModelDummy
-import net.newpipe.newplayer.model.UIModeState
+import net.newpipe.newplayer.uiModel.NewPlayerUIState
+import net.newpipe.newplayer.uiModel.InternalNewPlayerViewModel
+import net.newpipe.newplayer.uiModel.NewPlayerViewModelDummy
+import net.newpipe.newplayer.uiModel.UIModeState
import net.newpipe.newplayer.ui.theme.VideoPlayerTheme
import net.newpipe.newplayer.ui.videoplayer.controller.BottomUI
import net.newpipe.newplayer.ui.videoplayer.controller.CenterUI
diff --git a/new-player/src/main/java/net/newpipe/newplayer/ui/videoplayer/VideoPlayerUI.kt b/new-player/src/main/java/net/newpipe/newplayer/ui/videoplayer/VideoPlayerUI.kt
index e6806d46..e1920262 100644
--- a/new-player/src/main/java/net/newpipe/newplayer/ui/videoplayer/VideoPlayerUI.kt
+++ b/new-player/src/main/java/net/newpipe/newplayer/ui/videoplayer/VideoPlayerUI.kt
@@ -47,12 +47,12 @@ import androidx.compose.ui.platform.LocalContext
import androidx.core.graphics.toRect
import androidx.lifecycle.Lifecycle
import androidx.media3.common.util.UnstableApi
-import net.newpipe.newplayer.model.NewPlayerUIState
-import net.newpipe.newplayer.model.InternalNewPlayerViewModel
+import net.newpipe.newplayer.uiModel.NewPlayerUIState
+import net.newpipe.newplayer.uiModel.InternalNewPlayerViewModel
import net.newpipe.newplayer.ui.selection_ui.StreamSelectUI
import androidx.lifecycle.LifecycleEventObserver
-import net.newpipe.newplayer.utils.NewPlayerException
-import net.newpipe.newplayer.model.EmbeddedUiConfig
+import net.newpipe.newplayer.data.NewPlayerException
+import net.newpipe.newplayer.uiModel.EmbeddedUiConfig
import net.newpipe.newplayer.ui.selection_ui.ChapterSelectUI
import net.newpipe.newplayer.ui.videoplayer.pip.getPipParams
import net.newpipe.newplayer.ui.videoplayer.pip.supportsPip
diff --git a/new-player/src/main/java/net/newpipe/newplayer/ui/videoplayer/controller/BottomUI.kt b/new-player/src/main/java/net/newpipe/newplayer/ui/videoplayer/controller/BottomUI.kt
index 99d1a1fc..4e234041 100644
--- a/new-player/src/main/java/net/newpipe/newplayer/ui/videoplayer/controller/BottomUI.kt
+++ b/new-player/src/main/java/net/newpipe/newplayer/ui/videoplayer/controller/BottomUI.kt
@@ -50,11 +50,11 @@ import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.media3.common.util.UnstableApi
import net.newpipe.newplayer.R
-import net.newpipe.newplayer.model.EmbeddedUiConfig
-import net.newpipe.newplayer.model.UIModeState
-import net.newpipe.newplayer.model.NewPlayerUIState
-import net.newpipe.newplayer.model.InternalNewPlayerViewModel
-import net.newpipe.newplayer.model.NewPlayerViewModelDummy
+import net.newpipe.newplayer.uiModel.EmbeddedUiConfig
+import net.newpipe.newplayer.uiModel.UIModeState
+import net.newpipe.newplayer.uiModel.NewPlayerUIState
+import net.newpipe.newplayer.uiModel.InternalNewPlayerViewModel
+import net.newpipe.newplayer.uiModel.NewPlayerViewModelDummy
import net.newpipe.newplayer.ui.common.NewPlayerSeeker
import net.newpipe.newplayer.ui.common.ThumbPreview
import net.newpipe.newplayer.ui.theme.VideoPlayerTheme
diff --git a/new-player/src/main/java/net/newpipe/newplayer/ui/videoplayer/controller/CenterUI.kt b/new-player/src/main/java/net/newpipe/newplayer/ui/videoplayer/controller/CenterUI.kt
index adbeae93..e77c6215 100644
--- a/new-player/src/main/java/net/newpipe/newplayer/ui/videoplayer/controller/CenterUI.kt
+++ b/new-player/src/main/java/net/newpipe/newplayer/ui/videoplayer/controller/CenterUI.kt
@@ -49,9 +49,9 @@ import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.media3.common.util.UnstableApi
import net.newpipe.newplayer.R
-import net.newpipe.newplayer.model.NewPlayerUIState
-import net.newpipe.newplayer.model.InternalNewPlayerViewModel
-import net.newpipe.newplayer.model.NewPlayerViewModelDummy
+import net.newpipe.newplayer.uiModel.NewPlayerUIState
+import net.newpipe.newplayer.uiModel.InternalNewPlayerViewModel
+import net.newpipe.newplayer.uiModel.NewPlayerViewModelDummy
import net.newpipe.newplayer.ui.theme.VideoPlayerTheme
@OptIn(UnstableApi::class)
diff --git a/new-player/src/main/java/net/newpipe/newplayer/ui/videoplayer/controller/Menu.kt b/new-player/src/main/java/net/newpipe/newplayer/ui/videoplayer/controller/Menu.kt
index b6c14c21..a1d8e424 100644
--- a/new-player/src/main/java/net/newpipe/newplayer/ui/videoplayer/controller/Menu.kt
+++ b/new-player/src/main/java/net/newpipe/newplayer/ui/videoplayer/controller/Menu.kt
@@ -54,11 +54,11 @@ import androidx.compose.ui.unit.DpOffset
import androidx.compose.ui.unit.dp
import androidx.media3.common.util.UnstableApi
import net.newpipe.newplayer.R
-import net.newpipe.newplayer.model.EmbeddedUiConfig
-import net.newpipe.newplayer.model.NewPlayerUIState
-import net.newpipe.newplayer.model.InternalNewPlayerViewModel
-import net.newpipe.newplayer.model.NewPlayerViewModelDummy
-import net.newpipe.newplayer.model.UIModeState
+import net.newpipe.newplayer.uiModel.EmbeddedUiConfig
+import net.newpipe.newplayer.uiModel.NewPlayerUIState
+import net.newpipe.newplayer.uiModel.InternalNewPlayerViewModel
+import net.newpipe.newplayer.uiModel.NewPlayerViewModelDummy
+import net.newpipe.newplayer.uiModel.UIModeState
import net.newpipe.newplayer.ui.theme.VideoPlayerTheme
import net.newpipe.newplayer.ui.videoplayer.pip.supportsPip
import net.newpipe.newplayer.ui.common.getEmbeddedUiConfig
diff --git a/new-player/src/main/java/net/newpipe/newplayer/ui/videoplayer/controller/TopUI.kt b/new-player/src/main/java/net/newpipe/newplayer/ui/videoplayer/controller/TopUI.kt
index 3a5a75d7..12d5c772 100644
--- a/new-player/src/main/java/net/newpipe/newplayer/ui/videoplayer/controller/TopUI.kt
+++ b/new-player/src/main/java/net/newpipe/newplayer/ui/videoplayer/controller/TopUI.kt
@@ -52,11 +52,11 @@ import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.media3.common.util.UnstableApi
import net.newpipe.newplayer.R
-import net.newpipe.newplayer.model.EmbeddedUiConfig
-import net.newpipe.newplayer.model.NewPlayerUIState
-import net.newpipe.newplayer.model.InternalNewPlayerViewModel
-import net.newpipe.newplayer.model.NewPlayerViewModelDummy
-import net.newpipe.newplayer.model.UIModeState
+import net.newpipe.newplayer.uiModel.EmbeddedUiConfig
+import net.newpipe.newplayer.uiModel.NewPlayerUIState
+import net.newpipe.newplayer.uiModel.InternalNewPlayerViewModel
+import net.newpipe.newplayer.uiModel.NewPlayerViewModelDummy
+import net.newpipe.newplayer.uiModel.UIModeState
import net.newpipe.newplayer.ui.theme.VideoPlayerTheme
import net.newpipe.newplayer.ui.theme.video_player_onSurface
import net.newpipe.newplayer.ui.common.getEmbeddedUiConfig
diff --git a/new-player/src/main/java/net/newpipe/newplayer/ui/videoplayer/gesture_ui/EmbeddedGestureUI.kt b/new-player/src/main/java/net/newpipe/newplayer/ui/videoplayer/gesture_ui/EmbeddedGestureUI.kt
index 4aedcab4..82742ae6 100644
--- a/new-player/src/main/java/net/newpipe/newplayer/ui/videoplayer/gesture_ui/EmbeddedGestureUI.kt
+++ b/new-player/src/main/java/net/newpipe/newplayer/ui/videoplayer/gesture_ui/EmbeddedGestureUI.kt
@@ -40,11 +40,11 @@ import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.tooling.preview.Preview
import androidx.media3.common.util.UnstableApi
-import net.newpipe.newplayer.model.EmbeddedUiConfig
-import net.newpipe.newplayer.model.NewPlayerUIState
-import net.newpipe.newplayer.model.InternalNewPlayerViewModel
-import net.newpipe.newplayer.model.NewPlayerViewModelDummy
-import net.newpipe.newplayer.model.UIModeState
+import net.newpipe.newplayer.uiModel.EmbeddedUiConfig
+import net.newpipe.newplayer.uiModel.NewPlayerUIState
+import net.newpipe.newplayer.uiModel.InternalNewPlayerViewModel
+import net.newpipe.newplayer.uiModel.NewPlayerViewModelDummy
+import net.newpipe.newplayer.uiModel.UIModeState
import net.newpipe.newplayer.ui.theme.VideoPlayerTheme
import net.newpipe.newplayer.ui.common.getEmbeddedUiConfig
diff --git a/new-player/src/main/java/net/newpipe/newplayer/ui/videoplayer/gesture_ui/FullscreenGestureUI.kt b/new-player/src/main/java/net/newpipe/newplayer/ui/videoplayer/gesture_ui/FullscreenGestureUI.kt
index 0da4494c..c9d441ce 100644
--- a/new-player/src/main/java/net/newpipe/newplayer/ui/videoplayer/gesture_ui/FullscreenGestureUI.kt
+++ b/new-player/src/main/java/net/newpipe/newplayer/ui/videoplayer/gesture_ui/FullscreenGestureUI.kt
@@ -48,11 +48,11 @@ import androidx.compose.ui.layout.onGloballyPositioned
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.tooling.preview.Preview
import androidx.media3.common.util.UnstableApi
-import net.newpipe.newplayer.model.EmbeddedUiConfig
-import net.newpipe.newplayer.model.UIModeState
-import net.newpipe.newplayer.model.NewPlayerUIState
-import net.newpipe.newplayer.model.InternalNewPlayerViewModel
-import net.newpipe.newplayer.model.NewPlayerViewModelDummy
+import net.newpipe.newplayer.uiModel.EmbeddedUiConfig
+import net.newpipe.newplayer.uiModel.UIModeState
+import net.newpipe.newplayer.uiModel.NewPlayerUIState
+import net.newpipe.newplayer.uiModel.InternalNewPlayerViewModel
+import net.newpipe.newplayer.uiModel.NewPlayerViewModelDummy
import net.newpipe.newplayer.ui.theme.VideoPlayerTheme
import net.newpipe.newplayer.ui.common.getDefaultBrightness
import net.newpipe.newplayer.ui.common.getEmbeddedUiConfig
diff --git a/new-player/src/main/java/net/newpipe/newplayer/model/EmbeddedUiConfig.kt b/new-player/src/main/java/net/newpipe/newplayer/uiModel/EmbeddedUiConfig.kt
similarity index 97%
rename from new-player/src/main/java/net/newpipe/newplayer/model/EmbeddedUiConfig.kt
rename to new-player/src/main/java/net/newpipe/newplayer/uiModel/EmbeddedUiConfig.kt
index 0d53b6be..18003112 100644
--- a/new-player/src/main/java/net/newpipe/newplayer/model/EmbeddedUiConfig.kt
+++ b/new-player/src/main/java/net/newpipe/newplayer/uiModel/EmbeddedUiConfig.kt
@@ -18,7 +18,7 @@
* along with NewPlayer. If not, see .
*/
-package net.newpipe.newplayer.model
+package net.newpipe.newplayer.uiModel
import android.content.pm.ActivityInfo
import android.os.Parcelable
diff --git a/new-player/src/main/java/net/newpipe/newplayer/model/InternalNewPlayerViewModel.kt b/new-player/src/main/java/net/newpipe/newplayer/uiModel/InternalNewPlayerViewModel.kt
similarity index 90%
rename from new-player/src/main/java/net/newpipe/newplayer/model/InternalNewPlayerViewModel.kt
rename to new-player/src/main/java/net/newpipe/newplayer/uiModel/InternalNewPlayerViewModel.kt
index 2fd2c54c..8c2a78bb 100644
--- a/new-player/src/main/java/net/newpipe/newplayer/model/InternalNewPlayerViewModel.kt
+++ b/new-player/src/main/java/net/newpipe/newplayer/uiModel/InternalNewPlayerViewModel.kt
@@ -18,15 +18,11 @@
* along with NewPlayer. If not, see .
*/
-package net.newpipe.newplayer.model
+package net.newpipe.newplayer.uiModel
import android.os.Bundle
import androidx.annotation.OptIn
import androidx.media3.common.util.UnstableApi
-import kotlinx.coroutines.flow.SharedFlow
-import kotlinx.coroutines.flow.StateFlow
-import net.newpipe.newplayer.NewPlayer
-import net.newpipe.newplayer.ui.ContentScale
@OptIn(UnstableApi::class)
internal interface InternalNewPlayerViewModel : NewPlayerViewModel {
diff --git a/new-player/src/main/java/net/newpipe/newplayer/model/NewPlayerUIState.kt b/new-player/src/main/java/net/newpipe/newplayer/uiModel/NewPlayerUIState.kt
similarity index 96%
rename from new-player/src/main/java/net/newpipe/newplayer/model/NewPlayerUIState.kt
rename to new-player/src/main/java/net/newpipe/newplayer/uiModel/NewPlayerUIState.kt
index 8b302b83..8d21cf50 100644
--- a/new-player/src/main/java/net/newpipe/newplayer/model/NewPlayerUIState.kt
+++ b/new-player/src/main/java/net/newpipe/newplayer/uiModel/NewPlayerUIState.kt
@@ -18,19 +18,19 @@
* along with NewPlayer. If not, see .
*/
-package net.newpipe.newplayer.model
+package net.newpipe.newplayer.uiModel
import androidx.compose.ui.graphics.ImageBitmap
import androidx.media3.common.MediaItem
import androidx.media3.common.MediaMetadata
import androidx.media3.common.util.UnstableApi
-import net.newpipe.newplayer.utils.Chapter
+import net.newpipe.newplayer.data.Chapter
import net.newpipe.newplayer.RepeatMode
import net.newpipe.newplayer.ui.ContentScale
-import net.newpipe.newplayer.utils.AudioStreamTrack
-import net.newpipe.newplayer.utils.LanguageIdentifier
-import net.newpipe.newplayer.utils.StreamTrack
-import net.newpipe.newplayer.utils.VideoStreamTrack
+import net.newpipe.newplayer.data.AudioStreamTrack
+import net.newpipe.newplayer.data.LanguageIdentifier
+import net.newpipe.newplayer.data.StreamTrack
+import net.newpipe.newplayer.data.VideoStreamTrack
@UnstableApi
diff --git a/new-player/src/main/java/net/newpipe/newplayer/model/NewPlayerViewModel.kt b/new-player/src/main/java/net/newpipe/newplayer/uiModel/NewPlayerViewModel.kt
similarity index 93%
rename from new-player/src/main/java/net/newpipe/newplayer/model/NewPlayerViewModel.kt
rename to new-player/src/main/java/net/newpipe/newplayer/uiModel/NewPlayerViewModel.kt
index 8ea825d2..afde5618 100644
--- a/new-player/src/main/java/net/newpipe/newplayer/model/NewPlayerViewModel.kt
+++ b/new-player/src/main/java/net/newpipe/newplayer/uiModel/NewPlayerViewModel.kt
@@ -1,4 +1,4 @@
-package net.newpipe.newplayer.model
+package net.newpipe.newplayer.uiModel
import androidx.annotation.OptIn
import androidx.media3.common.util.UnstableApi
diff --git a/new-player/src/main/java/net/newpipe/newplayer/model/NewPlayerViewModelDummy.kt b/new-player/src/main/java/net/newpipe/newplayer/uiModel/NewPlayerViewModelDummy.kt
similarity index 98%
rename from new-player/src/main/java/net/newpipe/newplayer/model/NewPlayerViewModelDummy.kt
rename to new-player/src/main/java/net/newpipe/newplayer/uiModel/NewPlayerViewModelDummy.kt
index 6490b0ed..b90c796a 100644
--- a/new-player/src/main/java/net/newpipe/newplayer/model/NewPlayerViewModelDummy.kt
+++ b/new-player/src/main/java/net/newpipe/newplayer/uiModel/NewPlayerViewModelDummy.kt
@@ -1,4 +1,4 @@
-package net.newpipe.newplayer.model
+package net.newpipe.newplayer.uiModel
import android.os.Bundle
import androidx.media3.common.util.UnstableApi
diff --git a/new-player/src/main/java/net/newpipe/newplayer/model/NewPlayerViewModelImpl.kt b/new-player/src/main/java/net/newpipe/newplayer/uiModel/NewPlayerViewModelImpl.kt
similarity index 99%
rename from new-player/src/main/java/net/newpipe/newplayer/model/NewPlayerViewModelImpl.kt
rename to new-player/src/main/java/net/newpipe/newplayer/uiModel/NewPlayerViewModelImpl.kt
index 3a5d20fc..fd03ef53 100644
--- a/new-player/src/main/java/net/newpipe/newplayer/model/NewPlayerViewModelImpl.kt
+++ b/new-player/src/main/java/net/newpipe/newplayer/uiModel/NewPlayerViewModelImpl.kt
@@ -18,7 +18,7 @@
* along with NewPlayer. If not, see .
*/
-package net.newpipe.newplayer.model
+package net.newpipe.newplayer.uiModel
import android.app.Application
import android.media.AudioManager
@@ -45,9 +45,9 @@ import javax.inject.Inject
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch
-import net.newpipe.newplayer.utils.VideoSize
+import net.newpipe.newplayer.data.VideoSize
import net.newpipe.newplayer.NewPlayer
-import net.newpipe.newplayer.utils.NewPlayerException
+import net.newpipe.newplayer.data.NewPlayerException
import net.newpipe.newplayer.PlayMode
import net.newpipe.newplayer.RepeatMode
import net.newpipe.newplayer.ui.ContentScale
diff --git a/new-player/src/main/java/net/newpipe/newplayer/model/UIModeState.kt b/new-player/src/main/java/net/newpipe/newplayer/uiModel/UIModeState.kt
similarity index 99%
rename from new-player/src/main/java/net/newpipe/newplayer/model/UIModeState.kt
rename to new-player/src/main/java/net/newpipe/newplayer/uiModel/UIModeState.kt
index 961924c8..80f89785 100644
--- a/new-player/src/main/java/net/newpipe/newplayer/model/UIModeState.kt
+++ b/new-player/src/main/java/net/newpipe/newplayer/uiModel/UIModeState.kt
@@ -18,7 +18,7 @@
* along with NewPlayer. If not, see .
*/
-package net.newpipe.newplayer.model
+package net.newpipe.newplayer.uiModel
import net.newpipe.newplayer.PlayMode
diff --git a/test-app/src/main/java/net/newpipe/newplayer/testapp/MainActivity.kt b/test-app/src/main/java/net/newpipe/newplayer/testapp/MainActivity.kt
index ee13c669..f707b0f5 100644
--- a/test-app/src/main/java/net/newpipe/newplayer/testapp/MainActivity.kt
+++ b/test-app/src/main/java/net/newpipe/newplayer/testapp/MainActivity.kt
@@ -36,9 +36,9 @@ import kotlinx.coroutines.launch
import net.newpipe.newplayer.ActivityBrainSlug
import net.newpipe.newplayer.NewPlayer
import net.newpipe.newplayer.PlayMode
-import net.newpipe.newplayer.model.NewPlayerViewModel
-import net.newpipe.newplayer.model.NewPlayerViewModelImpl
-import net.newpipe.newplayer.model.UIModeState
+import net.newpipe.newplayer.uiModel.NewPlayerViewModel
+import net.newpipe.newplayer.uiModel.NewPlayerViewModelImpl
+import net.newpipe.newplayer.uiModel.UIModeState
import net.newpipe.newplayer.testapp.databinding.ActivityMainBinding
import net.newpipe.newplayer.ui.ContentScale
import javax.inject.Inject
diff --git a/test-app/src/main/java/net/newpipe/newplayer/testapp/TestMediaRepository.kt b/test-app/src/main/java/net/newpipe/newplayer/testapp/TestMediaRepository.kt
index 85c2ff96..d3b3a694 100644
--- a/test-app/src/main/java/net/newpipe/newplayer/testapp/TestMediaRepository.kt
+++ b/test-app/src/main/java/net/newpipe/newplayer/testapp/TestMediaRepository.kt
@@ -12,14 +12,14 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
-import net.newpipe.newplayer.utils.Chapter
+import net.newpipe.newplayer.data.Chapter
import net.newpipe.newplayer.MediaRepository
import net.newpipe.newplayer.RepoMetaInfo
-import net.newpipe.newplayer.utils.AudioStreamTrack
-import net.newpipe.newplayer.utils.LanguageIdentifier
-import net.newpipe.newplayer.utils.Stream
-import net.newpipe.newplayer.utils.Subtitle
-import net.newpipe.newplayer.utils.VideoStreamTrack
+import net.newpipe.newplayer.data.AudioStreamTrack
+import net.newpipe.newplayer.data.LanguageIdentifier
+import net.newpipe.newplayer.data.Stream
+import net.newpipe.newplayer.data.Subtitle
+import net.newpipe.newplayer.data.VideoStreamTrack
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.Response
diff --git a/test-app/src/main/java/net/newpipe/newplayer/testapp/streamErrorHandler.kt b/test-app/src/main/java/net/newpipe/newplayer/testapp/streamErrorHandler.kt
index 681eb061..6807beba 100644
--- a/test-app/src/main/java/net/newpipe/newplayer/testapp/streamErrorHandler.kt
+++ b/test-app/src/main/java/net/newpipe/newplayer/testapp/streamErrorHandler.kt
@@ -2,10 +2,10 @@ package net.newpipe.newplayer.testapp
import androidx.media3.common.MediaItem
import net.newpipe.newplayer.MediaRepository
-import net.newpipe.newplayer.utils.NoResponse
-import net.newpipe.newplayer.utils.SingleSelection
-import net.newpipe.newplayer.utils.StreamExceptionResponse
-import net.newpipe.newplayer.utils.StreamSelectionResponse
+import net.newpipe.newplayer.logic.NoResponse
+import net.newpipe.newplayer.data.SingleSelection
+import net.newpipe.newplayer.logic.StreamExceptionResponse
+import net.newpipe.newplayer.logic.StreamSelectionResponse
import java.lang.Exception
suspend fun streamErrorHandler(