mirror of
https://github.com/libre-tube/LibreTube.git
synced 2025-04-28 07:50:31 +05:30
fix: only add downloads of same type (audio/video) to queue
This commit is contained in:
parent
9b68e4faea
commit
56330118a6
@ -49,4 +49,5 @@ object IntentData {
|
||||
const val nextPage = "nextPage"
|
||||
const val videoInfo = "videoInfo"
|
||||
const val offlinePlayer = "offlinePlayer"
|
||||
const val downloadTab = "downloadTab"
|
||||
}
|
||||
|
@ -2,6 +2,8 @@ package com.github.libretube.db.obj
|
||||
|
||||
import androidx.room.Embedded
|
||||
import androidx.room.Relation
|
||||
import com.github.libretube.enums.FileType
|
||||
import com.github.libretube.ui.fragments.DownloadTab
|
||||
|
||||
data class DownloadWithItems(
|
||||
@Embedded val download: Download,
|
||||
@ -16,3 +18,15 @@ data class DownloadWithItems(
|
||||
)
|
||||
val downloadChapters: List<DownloadChapter> = emptyList()
|
||||
)
|
||||
|
||||
fun List<DownloadWithItems>.filterByTab(tab: DownloadTab) = filter { dl ->
|
||||
when (tab) {
|
||||
DownloadTab.AUDIO -> {
|
||||
dl.downloadItems.any { it.type == FileType.AUDIO } && dl.downloadItems.none { it.type == FileType.VIDEO }
|
||||
}
|
||||
|
||||
DownloadTab.VIDEO -> {
|
||||
dl.downloadItems.any { it.type == FileType.VIDEO }
|
||||
}
|
||||
}
|
||||
}
|
@ -10,6 +10,7 @@ import com.github.libretube.constants.IntentData
|
||||
import com.github.libretube.parcelable.PlayerData
|
||||
import com.github.libretube.services.OfflinePlayerService
|
||||
import com.github.libretube.services.OnlinePlayerService
|
||||
import com.github.libretube.ui.fragments.DownloadTab
|
||||
import com.github.libretube.ui.fragments.PlayerFragment
|
||||
|
||||
/**
|
||||
@ -75,11 +76,12 @@ object BackgroundHelper {
|
||||
* @param context the current context
|
||||
* @param videoId the videoId of the video or null if all available downloads should be shuffled
|
||||
*/
|
||||
fun playOnBackgroundOffline(context: Context, videoId: String?) {
|
||||
fun playOnBackgroundOffline(context: Context, videoId: String?, downloadTab: DownloadTab) {
|
||||
stopBackgroundPlay(context)
|
||||
|
||||
val playerIntent = Intent(context, OfflinePlayerService::class.java)
|
||||
.putExtra(IntentData.videoId, videoId)
|
||||
.putExtra(IntentData.downloadTab, downloadTab)
|
||||
|
||||
ContextCompat.startForegroundService(context, playerIntent)
|
||||
}
|
||||
|
@ -1,7 +1,6 @@
|
||||
package com.github.libretube.services
|
||||
|
||||
import android.content.Intent
|
||||
import android.util.Log
|
||||
import androidx.lifecycle.lifecycleScope
|
||||
import androidx.media3.common.MediaItem
|
||||
import androidx.media3.common.Player
|
||||
@ -11,11 +10,14 @@ import com.github.libretube.constants.IntentData
|
||||
import com.github.libretube.db.DatabaseHolder.Database
|
||||
import com.github.libretube.db.obj.DownloadChapter
|
||||
import com.github.libretube.db.obj.DownloadWithItems
|
||||
import com.github.libretube.db.obj.filterByTab
|
||||
import com.github.libretube.enums.FileType
|
||||
import com.github.libretube.extensions.serializableExtra
|
||||
import com.github.libretube.extensions.toAndroidUri
|
||||
import com.github.libretube.extensions.toID
|
||||
import com.github.libretube.helpers.PlayerHelper
|
||||
import com.github.libretube.obj.PlayerNotificationData
|
||||
import com.github.libretube.ui.fragments.DownloadTab
|
||||
import com.github.libretube.util.PlayingQueue
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.launch
|
||||
@ -28,9 +30,11 @@ import kotlin.io.path.exists
|
||||
@UnstableApi
|
||||
class OfflinePlayerService : AbstractPlayerService() {
|
||||
private var downloadWithItems: DownloadWithItems? = null
|
||||
private lateinit var downloadTab: DownloadTab
|
||||
|
||||
override suspend fun onServiceCreated(intent: Intent) {
|
||||
videoId = intent.getStringExtra(IntentData.videoId) ?: return
|
||||
downloadTab = intent.serializableExtra(IntentData.downloadTab)!!
|
||||
|
||||
PlayingQueue.clear()
|
||||
|
||||
@ -88,7 +92,7 @@ class OfflinePlayerService : AbstractPlayerService() {
|
||||
private suspend fun fillQueue() {
|
||||
val downloads = withContext(Dispatchers.IO) {
|
||||
Database.downloadDao().getAll()
|
||||
}
|
||||
}.filterByTab(downloadTab)
|
||||
|
||||
PlayingQueue.insertRelatedStreams(downloads.map { it.download.toStreamItem() })
|
||||
}
|
||||
|
@ -32,6 +32,7 @@ import com.github.libretube.databinding.ActivityOfflinePlayerBinding
|
||||
import com.github.libretube.databinding.ExoStyledPlayerControlViewBinding
|
||||
import com.github.libretube.db.DatabaseHolder.Database
|
||||
import com.github.libretube.db.obj.DownloadChapter
|
||||
import com.github.libretube.db.obj.filterByTab
|
||||
import com.github.libretube.enums.FileType
|
||||
import com.github.libretube.enums.PlayerEvent
|
||||
import com.github.libretube.extensions.serializableExtra
|
||||
@ -41,6 +42,7 @@ import com.github.libretube.helpers.PlayerHelper
|
||||
import com.github.libretube.helpers.WindowHelper
|
||||
import com.github.libretube.obj.PlayerNotificationData
|
||||
import com.github.libretube.ui.base.BaseActivity
|
||||
import com.github.libretube.ui.fragments.DownloadTab
|
||||
import com.github.libretube.ui.interfaces.TimeFrameReceiver
|
||||
import com.github.libretube.ui.listeners.SeekbarPreviewListener
|
||||
import com.github.libretube.ui.models.ChaptersViewModel
|
||||
@ -324,7 +326,7 @@ class OfflinePlayerActivity : BaseActivity() {
|
||||
private suspend fun fillQueue() {
|
||||
val downloads = withContext(Dispatchers.IO) {
|
||||
Database.downloadDao().getAll()
|
||||
}
|
||||
}.filterByTab(DownloadTab.VIDEO)
|
||||
|
||||
PlayingQueue.insertRelatedStreams(downloads.map { it.download.toStreamItem() })
|
||||
}
|
||||
|
@ -3,13 +3,10 @@ package com.github.libretube.ui.adapters
|
||||
import android.annotation.SuppressLint
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.os.Handler
|
||||
import android.os.Looper
|
||||
import android.text.format.DateUtils
|
||||
import android.view.LayoutInflater
|
||||
import android.view.ViewGroup
|
||||
import androidx.core.os.bundleOf
|
||||
import androidx.core.os.postDelayed
|
||||
import androidx.core.view.isGone
|
||||
import androidx.core.view.isVisible
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
@ -42,8 +39,6 @@ class DownloadsAdapter(
|
||||
private val downloads: MutableList<DownloadWithItems>,
|
||||
private val toggleDownload: (DownloadWithItems) -> Boolean
|
||||
) : RecyclerView.Adapter<DownloadsViewHolder>() {
|
||||
private val handler = Handler(Looper.getMainLooper())
|
||||
|
||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): DownloadsViewHolder {
|
||||
val binding = DownloadedMediaRowBinding.inflate(
|
||||
LayoutInflater.from(parent.context),
|
||||
@ -112,7 +107,7 @@ class DownloadsAdapter(
|
||||
intent.putExtra(IntentData.videoId, download.videoId)
|
||||
root.context.startActivity(intent)
|
||||
} else {
|
||||
BackgroundHelper.playOnBackgroundOffline(root.context, download.videoId)
|
||||
BackgroundHelper.playOnBackgroundOffline(root.context, download.videoId, downloadTab)
|
||||
NavigationHelper.startAudioPlayer(root.context, offlinePlayer = true)
|
||||
}
|
||||
}
|
||||
@ -130,7 +125,8 @@ class DownloadsAdapter(
|
||||
.apply {
|
||||
arguments = bundleOf(
|
||||
IntentData.videoId to download.videoId,
|
||||
IntentData.channelName to download.uploader
|
||||
IntentData.channelName to download.uploader,
|
||||
IntentData.downloadTab to downloadTab
|
||||
)
|
||||
}
|
||||
.show(fragmentManager)
|
||||
|
@ -10,7 +10,6 @@ import android.os.Handler
|
||||
import android.os.IBinder
|
||||
import android.os.Looper
|
||||
import android.text.format.DateUtils
|
||||
import android.util.Log
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
@ -99,7 +98,6 @@ class AudioPlayerFragment : Fragment(), AudioPlayerOptions {
|
||||
|
||||
val serviceClass =
|
||||
if (isOffline) OfflinePlayerService::class.java else OnlinePlayerService::class.java
|
||||
Log.e("class", serviceClass.name.toString())
|
||||
Intent(activity, serviceClass).also { intent ->
|
||||
activity?.bindService(intent, connection, 0)
|
||||
}
|
||||
|
@ -27,7 +27,7 @@ import com.github.libretube.databinding.FragmentDownloadContentBinding
|
||||
import com.github.libretube.databinding.FragmentDownloadsBinding
|
||||
import com.github.libretube.db.DatabaseHolder.Database
|
||||
import com.github.libretube.db.obj.DownloadWithItems
|
||||
import com.github.libretube.enums.FileType
|
||||
import com.github.libretube.db.obj.filterByTab
|
||||
import com.github.libretube.extensions.ceilHalf
|
||||
import com.github.libretube.extensions.formatAsFileSize
|
||||
import com.github.libretube.extensions.serializable
|
||||
@ -111,7 +111,7 @@ class DownloadsFragmentPage : DynamicLayoutManagerFragment() {
|
||||
private var binder: DownloadService.LocalBinder? = null
|
||||
private val downloads = mutableListOf<DownloadWithItems>()
|
||||
private val downloadReceiver = DownloadReceiver()
|
||||
private lateinit var downloadTabSelf: DownloadTab
|
||||
private lateinit var downloadTab: DownloadTab
|
||||
|
||||
private val serviceConnection = object : ServiceConnection {
|
||||
var isBound = false
|
||||
@ -137,7 +137,7 @@ class DownloadsFragmentPage : DynamicLayoutManagerFragment() {
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
|
||||
this.downloadTabSelf = requireArguments().serializable(IntentData.currentPosition)!!
|
||||
this.downloadTab = requireArguments().serializable(IntentData.currentPosition)!!
|
||||
}
|
||||
|
||||
override fun onCreateView(
|
||||
@ -181,23 +181,13 @@ class DownloadsFragmentPage : DynamicLayoutManagerFragment() {
|
||||
}
|
||||
|
||||
downloads.clear()
|
||||
downloads.addAll(dbDownloads.filter { dl ->
|
||||
when (downloadTabSelf) {
|
||||
DownloadTab.AUDIO -> {
|
||||
dl.downloadItems.any { it.type == FileType.AUDIO } && dl.downloadItems.none { it.type == FileType.VIDEO }
|
||||
}
|
||||
|
||||
DownloadTab.VIDEO -> {
|
||||
dl.downloadItems.any { it.type == FileType.VIDEO }
|
||||
}
|
||||
}
|
||||
})
|
||||
downloads.addAll(dbDownloads.filterByTab(downloadTab))
|
||||
|
||||
if (downloads.isEmpty()) return@launch
|
||||
|
||||
sortDownloadList(selectedSortType)
|
||||
|
||||
adapter = DownloadsAdapter(requireContext(), downloadTabSelf, downloads) {
|
||||
adapter = DownloadsAdapter(requireContext(), downloadTab, downloads) {
|
||||
var isDownloading = false
|
||||
val ids = it.downloadItems
|
||||
.filter { item -> item.path.fileSize() < item.downloadSize }
|
||||
|
@ -6,14 +6,17 @@ import androidx.fragment.app.setFragmentResult
|
||||
import com.github.libretube.R
|
||||
import com.github.libretube.constants.IntentData
|
||||
import com.github.libretube.enums.ShareObjectType
|
||||
import com.github.libretube.extensions.serializable
|
||||
import com.github.libretube.helpers.BackgroundHelper
|
||||
import com.github.libretube.helpers.NavigationHelper
|
||||
import com.github.libretube.obj.ShareData
|
||||
import com.github.libretube.ui.dialogs.ShareDialog
|
||||
import com.github.libretube.ui.fragments.DownloadTab
|
||||
|
||||
class DownloadOptionsBottomSheet : BaseBottomSheet() {
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
val videoId = arguments?.getString(IntentData.videoId)!!
|
||||
val downloadTab = arguments?.serializable<DownloadTab>(IntentData.downloadTab)!!
|
||||
|
||||
val options = listOf(
|
||||
R.string.playOnBackground,
|
||||
@ -25,7 +28,7 @@ class DownloadOptionsBottomSheet : BaseBottomSheet() {
|
||||
setSimpleItems(options.map { getString(it) }) { which ->
|
||||
when (options[which]) {
|
||||
R.string.playOnBackground -> {
|
||||
BackgroundHelper.playOnBackgroundOffline(requireContext(), videoId)
|
||||
BackgroundHelper.playOnBackgroundOffline(requireContext(), videoId, downloadTab)
|
||||
}
|
||||
|
||||
R.string.go_to_video -> {
|
||||
|
Loading…
x
Reference in New Issue
Block a user