diff --git a/.idea/kotlinc.xml b/.idea/kotlinc.xml index f8467b45..8d81632f 100644 --- a/.idea/kotlinc.xml +++ b/.idea/kotlinc.xml @@ -1,6 +1,6 @@ - \ No newline at end of file diff --git a/app/src/main/java/com/maxrave/simpmusic/adapter/home/HomeItemContentAdapter.kt b/app/src/main/java/com/maxrave/simpmusic/adapter/home/HomeItemContentAdapter.kt index 749ff699..22804d69 100644 --- a/app/src/main/java/com/maxrave/simpmusic/adapter/home/HomeItemContentAdapter.kt +++ b/app/src/main/java/com/maxrave/simpmusic/adapter/home/HomeItemContentAdapter.kt @@ -49,11 +49,11 @@ class HomeItemContentAdapter(private var listContent: ArrayList, privat } fun bind(content: Content){ with(binding){ - if (content.thumbnails.size > 1) { - ivArt.load(content.thumbnails[1].url) - } - else{ - ivArt.load(content.thumbnails[0].url) + if (content.thumbnails.isNotEmpty()) { + ivArt.load(content.thumbnails.lastOrNull()?.url) { + crossfade(true) + placeholder(R.drawable.holder) + } } tvSongName.text = content.title tvSongName.isSelected = true @@ -76,7 +76,10 @@ class HomeItemContentAdapter(private var listContent: ArrayList, privat fun bind(content: Content) { with(binding) { if (content.thumbnails.isNotEmpty()) { - ivArt.load(content.thumbnails.lastOrNull()?.url) + ivArt.load(content.thumbnails.lastOrNull()?.url) { + crossfade(true) + placeholder(R.drawable.holder) + } } tvSongName.text = content.title tvSongName.isSelected = true @@ -98,14 +101,15 @@ class HomeItemContentAdapter(private var listContent: ArrayList, privat fun bind(content: Content) { with(binding) { - if (content.thumbnails.size > 1) { - ivArt.load(content.thumbnails[1].url) - } else { - ivArt.load(content.thumbnails[0].url) + ivArt.load(content.thumbnails.lastOrNull()?.url) { + crossfade(true) + placeholder(R.drawable.holder) } tvTitle.text = content.title tvTitle.isSelected = true - tvDescription.text = content.description ?: (if (!content.artists.isNullOrEmpty()) content.artists.toListName().connectArtists() else context.getString(R.string.playlist)) + tvDescription.text = content.description + ?: (if (!content.artists.isNullOrEmpty()) content.artists.toListName() + .connectArtists() else context.getString(R.string.playlist)) tvDescription.isSelected = true } } @@ -115,20 +119,19 @@ class HomeItemContentAdapter(private var listContent: ArrayList, privat binding.root.setOnClickListener {listener.onAlbumItemClick(bindingAdapterPosition)} } fun bind(content: Content){ - with(binding){ - if (content.thumbnails.size > 1) { - ivArt.load(content.thumbnails[1].url) - } - else{ - ivArt.load(content.thumbnails[0].url) + with(binding) { + ivArt.load(content.thumbnails.lastOrNull()?.url) { + crossfade(true) + placeholder(R.drawable.holder) } tvTitle.text = content.title tvTitle.isSelected = true if (content.description != "" && content.description != null) { tvDescription.text = content.description - } - else { - tvDescription.text = if (!content.artists.isNullOrEmpty()) content.artists.toListName().connectArtists() else context.getString(R.string.album) + } else { + tvDescription.text = + if (!content.artists.isNullOrEmpty()) content.artists.toListName() + .connectArtists() else context.getString(R.string.album) } tvDescription.isSelected = true } @@ -139,12 +142,10 @@ class HomeItemContentAdapter(private var listContent: ArrayList, privat binding.root.setOnClickListener {listener.onArtistItemClick(bindingAdapterPosition)} } fun bind(content: Content){ - with(binding){ - if (content.thumbnails.size > 1) { - ivArt.load(content.thumbnails[1].url) - } - else{ - ivArt.load(content.thumbnails[0].url) + with(binding) { + ivArt.load(content.thumbnails.lastOrNull()?.url) { + crossfade(true) + placeholder(R.drawable.holder) } tvArtistName.text = content.title } diff --git a/app/src/main/java/com/maxrave/simpmusic/data/repository/MainRepository.kt b/app/src/main/java/com/maxrave/simpmusic/data/repository/MainRepository.kt index a681dfb6..49adf27c 100644 --- a/app/src/main/java/com/maxrave/simpmusic/data/repository/MainRepository.kt +++ b/app/src/main/java/com/maxrave/simpmusic/data/repository/MainRepository.kt @@ -1413,6 +1413,8 @@ class MainRepository @Inject constructor(private val localDataSource: LocalDataS }.flowOn(Dispatchers.IO) suspend fun getStream(videoId: String, itag: Int): Flow = flow{ YouTube.player(videoId).onSuccess { data -> + val acceptToPlayVideo = + runBlocking { dataStoreManager.watchVideoInsteadOfPlayingAudio.first() == DataStoreManager.TRUE } val videoItag = VIDEO_QUALITY.itags.getOrNull(VIDEO_QUALITY.items.indexOf(dataStoreManager.videoQuality.first())) ?: 22 @@ -1423,7 +1425,11 @@ class MainRepository @Inject constructor(private val localDataSource: LocalDataS ) else Log.w("Stream", "response: is VIDEO") Log.w("Stream: ", data.toString()) var format = - if (data.third == MediaType.Song) response.streamingData?.adaptiveFormats?.find { it.itag == itag } else response.streamingData?.formats?.find { it.itag == videoItag } + if (acceptToPlayVideo) { + if (data.third == MediaType.Song) response.streamingData?.adaptiveFormats?.find { it.itag == itag } else response.streamingData?.formats?.find { it.itag == videoItag } + } else { + response.streamingData?.adaptiveFormats?.find { it.itag == itag } + } if (format == null) { format = response.streamingData?.adaptiveFormats?.lastOrNull() } diff --git a/app/src/main/java/com/maxrave/simpmusic/ui/fragment/other/AlbumFragment.kt b/app/src/main/java/com/maxrave/simpmusic/ui/fragment/other/AlbumFragment.kt index c8982c55..ed842e23 100644 --- a/app/src/main/java/com/maxrave/simpmusic/ui/fragment/other/AlbumFragment.kt +++ b/app/src/main/java/com/maxrave/simpmusic/ui/fragment/other/AlbumFragment.kt @@ -188,18 +188,23 @@ class AlbumFragment: Fragment() { } } binding.btPlayPause.setOnClickListener { - if (viewModel.albumBrowse.value is Resource.Success && viewModel.albumBrowse.value?.data != null){ + if (viewModel.albumBrowse.value is Resource.Success && viewModel.albumBrowse.value?.data != null && songsAdapter.getList() + .isNotEmpty() + ) { val args = Bundle() args.putString("type", Config.ALBUM_CLICK) - args.putString("videoId", viewModel.albumBrowse.value?.data!!.tracks[0].videoId) + args.putString("videoId", songsAdapter.getList()[0].videoId) args.putString("from", "Album \"${viewModel.albumBrowse.value?.data!!.title}\"") if (viewModel.albumEntity.value?.downloadState == DownloadState.STATE_DOWNLOADED) { args.putInt("downloaded", 1) } - args.putString("playlistId", viewModel.albumBrowse.value?.data?.audioPlaylistId?.replaceFirst("VL", "")) + args.putString( + "playlistId", + viewModel.albumBrowse.value?.data?.audioPlaylistId?.replaceFirst("VL", "") + ) Queue.clear() - Queue.setNowPlaying(viewModel.albumBrowse.value?.data!!.tracks[0]) - Queue.addAll(viewModel.albumBrowse.value?.data!!.tracks as ArrayList) + Queue.setNowPlaying(songsAdapter.getList()[0]) + Queue.addAll(songsAdapter.getList()) if (Queue.getQueue().size >= 1) { Queue.removeFirstTrackForPlaylistAndAlbum() } @@ -231,16 +236,19 @@ class AlbumFragment: Fragment() { if (viewModel.albumBrowse.value is Resource.Success && viewModel.albumBrowse.value?.data != null){ val args = Bundle() args.putString("type", Config.ALBUM_CLICK) - args.putString("videoId", viewModel.albumBrowse.value?.data!!.tracks[position].videoId) + args.putString("videoId", songsAdapter.getList()[position].videoId) args.putString("from", "Album \"${viewModel.albumBrowse.value?.data!!.title}\"") args.putInt("index", position) if (viewModel.albumEntity.value?.downloadState == DownloadState.STATE_DOWNLOADED) { args.putInt("downloaded", 1) } - args.putString("playlistId", viewModel.albumBrowse.value?.data?.audioPlaylistId?.replaceFirst("VL", "")) + args.putString( + "playlistId", + viewModel.albumBrowse.value?.data?.audioPlaylistId?.replaceFirst("VL", "") + ) Queue.clear() - Queue.setNowPlaying(viewModel.albumBrowse.value?.data!!.tracks[position]) - Queue.addAll(viewModel.albumBrowse.value?.data!!.tracks as ArrayList) + Queue.setNowPlaying(songsAdapter.getList()[position]) + Queue.addAll(songsAdapter.getList()) if (Queue.getQueue().size >= 1) { Queue.removeTrackWithIndex(position) } @@ -249,7 +257,7 @@ class AlbumFragment: Fragment() { else if (viewModel.albumEntity.value != null && viewModel.albumEntity.value?.downloadState == DownloadState.STATE_DOWNLOADED){ val args = Bundle() args.putString("type", Config.ALBUM_CLICK) - args.putString("videoId", viewModel.albumEntity.value?.tracks?.get(position)) + args.putString("videoId", songsAdapter.getList()[position].videoId) args.putString("from", "Album \"${viewModel.albumEntity.value?.title}\"") args.putInt("index", position) if (viewModel.albumEntity.value?.downloadState == DownloadState.STATE_DOWNLOADED) { @@ -257,7 +265,7 @@ class AlbumFragment: Fragment() { } args.putString("playlistId", viewModel.albumEntity.value?.browseId?.replaceFirst("VL", "")) Queue.clear() - Queue.setNowPlaying(viewModel.listTrack.value?.get(position)!!.toTrack()) + Queue.setNowPlaying(songsAdapter.getList()[position]) Queue.addAll(viewModel.listTrack.value.toArrayListTrack()) if (Queue.getQueue().size >= 1) { Queue.removeTrackWithIndex(position) diff --git a/app/src/main/java/com/maxrave/simpmusic/viewModel/SharedViewModel.kt b/app/src/main/java/com/maxrave/simpmusic/viewModel/SharedViewModel.kt index 718c00e0..070a3543 100644 --- a/app/src/main/java/com/maxrave/simpmusic/viewModel/SharedViewModel.kt +++ b/app/src/main/java/com/maxrave/simpmusic/viewModel/SharedViewModel.kt @@ -857,7 +857,9 @@ class SharedViewModel @Inject constructor(private var dataStoreManager: DataStor return i } } - if (current in (0..(lyricsFormat?.get(0)?.startTimeMs ?: "0").toLong())) { + if (!lyricsFormat.isNullOrEmpty() && current in (0..(lyricsFormat[0].startTimeMs + ?: "0").toLong()) + ) { return -1 } return null diff --git a/build.gradle.kts b/build.gradle.kts index 0045cba9..7622c1a4 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,12 +1,12 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. plugins { - id("com.android.application") version "8.2.0" apply false - id("com.android.library") version "8.2.0" apply false - id("org.jetbrains.kotlin.android") version "1.9.10" apply false + id("com.android.application") version "8.2.1" apply false + id("com.android.library") version "8.2.1" apply false + id("org.jetbrains.kotlin.android") version "1.9.22" apply false id("androidx.navigation.safeargs.kotlin") version "2.5.3" apply false id("com.google.dagger.hilt.android") version "2.48.1" apply false - id("org.jetbrains.kotlin.plugin.serialization") version "1.9.10" apply false - id("com.google.devtools.ksp") version "1.9.10-1.0.13" apply false + id("org.jetbrains.kotlin.plugin.serialization") version "1.9.22" apply false + id("com.google.devtools.ksp") version "1.9.22-1.0.16" apply false val latestAboutLibsRelease = "10.9.1" id("com.mikepenz.aboutlibraries.plugin") version latestAboutLibsRelease apply false }