diff --git a/app/src/main/java/com/github/damontecres/wholphin/data/model/BaseItem.kt b/app/src/main/java/com/github/damontecres/wholphin/data/model/BaseItem.kt index 5ca32695..a5526f87 100644 --- a/app/src/main/java/com/github/damontecres/wholphin/data/model/BaseItem.kt +++ b/app/src/main/java/com/github/damontecres/wholphin/data/model/BaseItem.kt @@ -160,6 +160,7 @@ data class BaseItem( data.runTimeTicks ?.ticks ?.roundMinutes + ?.takeIf { it > Duration.ZERO } ?.let { add(it.toString()) } data.timeRemaining ?.roundMinutes diff --git a/app/src/main/java/com/github/damontecres/wholphin/services/MusicService.kt b/app/src/main/java/com/github/damontecres/wholphin/services/MusicService.kt index de99d579..c1aeb280 100644 --- a/app/src/main/java/com/github/damontecres/wholphin/services/MusicService.kt +++ b/app/src/main/java/com/github/damontecres/wholphin/services/MusicService.kt @@ -228,6 +228,8 @@ class MusicService start() } } + } else { + Timber.w("Tried to add non-audio type %s: %s", item.type, item.id) } } diff --git a/app/src/main/java/com/github/damontecres/wholphin/services/tvprovider/TvProviderWorker.kt b/app/src/main/java/com/github/damontecres/wholphin/services/tvprovider/TvProviderWorker.kt index 4a0e5dde..0df2193b 100644 --- a/app/src/main/java/com/github/damontecres/wholphin/services/tvprovider/TvProviderWorker.kt +++ b/app/src/main/java/com/github/damontecres/wholphin/services/tvprovider/TvProviderWorker.kt @@ -264,6 +264,7 @@ class TvProviderWorker .getLatestMedia( GetLatestMediaRequest( fields = SlimItemFields, + includeItemTypes = listOf(BaseItemKind.MOVIE, BaseItemKind.EPISODE), imageTypeLimit = 1, parentId = null, groupItems = true, diff --git a/app/src/main/java/com/github/damontecres/wholphin/ui/Extensions.kt b/app/src/main/java/com/github/damontecres/wholphin/ui/Extensions.kt index 37353a8f..c3037d75 100644 --- a/app/src/main/java/com/github/damontecres/wholphin/ui/Extensions.kt +++ b/app/src/main/java/com/github/damontecres/wholphin/ui/Extensions.kt @@ -244,7 +244,7 @@ val BaseItemDto.timeRemaining: Duration? get() = userData?.playbackPositionTicks?.let { if (it > 0) { - runTimeTicks?.minus(it)?.ticks + runTimeTicks?.minus(it)?.ticks?.takeIf { it > Duration.ZERO } } else { null } diff --git a/app/src/main/java/com/github/damontecres/wholphin/ui/components/ContextMenu.kt b/app/src/main/java/com/github/damontecres/wholphin/ui/components/ContextMenu.kt index 3a592bbc..cf7b32d6 100644 --- a/app/src/main/java/com/github/damontecres/wholphin/ui/components/ContextMenu.kt +++ b/app/src/main/java/com/github/damontecres/wholphin/ui/components/ContextMenu.kt @@ -339,7 +339,8 @@ private fun buildContextMenuItems( onClickPlayWith: () -> Unit, ): List = buildList { - if (showGoTo) { + // Songs should not show Go to + if (showGoTo && item.type != BaseItemKind.AUDIO) { add( DialogItem( resources.getString(R.string.go_to), @@ -466,7 +467,7 @@ private fun buildContextMenuItems( } } } - if (item.type == BaseItemKind.MUSIC_ALBUM) { + if (item.type == BaseItemKind.MUSIC_ALBUM || item.type == BaseItemKind.AUDIO) { add( DialogItem( resources.getString(R.string.add_to_queue), diff --git a/app/src/main/java/com/github/damontecres/wholphin/ui/components/ContextMenuUtils.kt b/app/src/main/java/com/github/damontecres/wholphin/ui/components/ContextMenuUtils.kt index 0e930b65..80e989ea 100644 --- a/app/src/main/java/com/github/damontecres/wholphin/ui/components/ContextMenuUtils.kt +++ b/app/src/main/java/com/github/damontecres/wholphin/ui/components/ContextMenuUtils.kt @@ -91,6 +91,7 @@ class ContextMenuUtils( onClearChosenStreams = { // Not supported on this page }, + onClickAddToQueue = playlistViewModel::addToQueue, ) } val contextMenu = diff --git a/app/src/main/java/com/github/damontecres/wholphin/ui/data/AddPlaylistViewModel.kt b/app/src/main/java/com/github/damontecres/wholphin/ui/data/AddPlaylistViewModel.kt index c2b8c94a..a41487c7 100644 --- a/app/src/main/java/com/github/damontecres/wholphin/ui/data/AddPlaylistViewModel.kt +++ b/app/src/main/java/com/github/damontecres/wholphin/ui/data/AddPlaylistViewModel.kt @@ -5,14 +5,19 @@ import android.widget.Toast import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.github.damontecres.wholphin.R +import com.github.damontecres.wholphin.data.model.BaseItem +import com.github.damontecres.wholphin.services.MusicService import com.github.damontecres.wholphin.services.PlaylistCreator import com.github.damontecres.wholphin.ui.detail.PlaylistLoadingState +import com.github.damontecres.wholphin.ui.detail.music.addToQueue +import com.github.damontecres.wholphin.ui.launchDefault import com.github.damontecres.wholphin.ui.launchIO import com.github.damontecres.wholphin.ui.showToast import com.github.damontecres.wholphin.util.ExceptionHandler import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.qualifiers.ApplicationContext import kotlinx.coroutines.flow.MutableStateFlow +import org.jellyfin.sdk.api.client.ApiClient import org.jellyfin.sdk.model.api.MediaType import timber.log.Timber import java.util.UUID @@ -27,7 +32,9 @@ class AddPlaylistViewModel @Inject constructor( @param:ApplicationContext private val context: Context, + private val api: ApiClient, private val playlistCreator: PlaylistCreator, + private val musicService: MusicService, ) : ViewModel() { val playlistState = MutableStateFlow(PlaylistLoadingState.Pending) @@ -72,4 +79,10 @@ class AddPlaylistViewModel } } } + + fun addToQueue(item: BaseItem) { + viewModelScope.launchDefault { + addToQueue(api, musicService, item, -1) + } + } } diff --git a/app/src/main/java/com/github/damontecres/wholphin/ui/detail/music/MusicViewModel.kt b/app/src/main/java/com/github/damontecres/wholphin/ui/detail/music/MusicViewModel.kt index 812927f1..87062cf2 100644 --- a/app/src/main/java/com/github/damontecres/wholphin/ui/detail/music/MusicViewModel.kt +++ b/app/src/main/java/com/github/damontecres/wholphin/ui/detail/music/MusicViewModel.kt @@ -147,3 +147,11 @@ fun ViewModel.addToQueue( } } } + +suspend fun addToQueue( + api: ApiClient, + musicService: MusicService, + item: BaseItem, + index: Int, +) { +} diff --git a/app/src/main/java/com/github/damontecres/wholphin/ui/playback/PlaybackViewModel.kt b/app/src/main/java/com/github/damontecres/wholphin/ui/playback/PlaybackViewModel.kt index a6ae07d5..e9592ebb 100644 --- a/app/src/main/java/com/github/damontecres/wholphin/ui/playback/PlaybackViewModel.kt +++ b/app/src/main/java/com/github/damontecres/wholphin/ui/playback/PlaybackViewModel.kt @@ -139,7 +139,7 @@ class PlaybackViewModel val navigationManager: NavigationManager, private val playlistCreator: PlaylistCreator, private val itemPlaybackDao: ItemPlaybackDao, - private val serverRepository: ServerRepository, + internal val serverRepository: ServerRepository, private val itemPlaybackRepository: ItemPlaybackRepository, private val playerFactory: PlayerFactory, private val datePlayedService: DatePlayedService, diff --git a/app/src/main/java/com/github/damontecres/wholphin/ui/playback/SubtitleSearchUtils.kt b/app/src/main/java/com/github/damontecres/wholphin/ui/playback/SubtitleSearchUtils.kt index 95d52a1a..d733e176 100644 --- a/app/src/main/java/com/github/damontecres/wholphin/ui/playback/SubtitleSearchUtils.kt +++ b/app/src/main/java/com/github/damontecres/wholphin/ui/playback/SubtitleSearchUtils.kt @@ -7,6 +7,7 @@ import com.github.damontecres.wholphin.R import com.github.damontecres.wholphin.data.model.BaseItem import com.github.damontecres.wholphin.data.model.PlaylistItem import com.github.damontecres.wholphin.data.model.TrackIndex +import com.github.damontecres.wholphin.ui.isNotNullOrBlank import com.github.damontecres.wholphin.ui.launchIO import com.github.damontecres.wholphin.ui.onMain import com.github.damontecres.wholphin.ui.showToast @@ -41,7 +42,15 @@ sealed interface SubtitleSearchStatus { /** * Trigger a search for subtitles in the given language for the currently playing media */ -fun PlaybackViewModel.searchForSubtitles(language: String = Locale.current.language) { +fun PlaybackViewModel.searchForSubtitles( + language: String = + serverRepository + .currentUserDto + ?.configuration + ?.subtitleLanguagePreference + ?.takeIf { it.isNotNullOrBlank() } + ?: Locale.current.language, +) { subtitleSearchState.update { it.copy( status = SubtitleSearchStatus.Searching,