fix: queue when not starting with first playlist/channel video

This commit is contained in:
Bnyro 2023-08-07 18:59:37 +02:00
parent 77fd3e9288
commit 81c576506c
2 changed files with 43 additions and 25 deletions

View File

@ -16,7 +16,6 @@ import android.os.PowerManager
import android.text.format.DateUtils import android.text.format.DateUtils
import android.text.method.LinkMovementMethod import android.text.method.LinkMovementMethod
import android.text.util.Linkify import android.text.util.Linkify
import android.util.Log
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup

View File

@ -54,9 +54,12 @@ object PlayingQueue {
fun hasNext() = getNext() != null fun hasNext() = getNext() != null
fun updateCurrent(streamItem: StreamItem) { fun updateCurrent(streamItem: StreamItem, asFirst: Boolean = true) {
currentStream = streamItem currentStream = streamItem
if (!contains(streamItem)) queue.add(0, streamItem) if (!contains(streamItem)) {
val indexToAdd = if (asFirst) 0 else size()
queue.add(indexToAdd, streamItem)
}
} }
fun isNotEmpty() = queue.isNotEmpty() fun isNotEmpty() = queue.isNotEmpty()
@ -85,17 +88,33 @@ object PlayingQueue {
fun move(from: Int, to: Int) = queue.move(from, to) fun move(from: Int, to: Int) = queue.move(from, to)
private fun addToQueueAsync(streams: List<StreamItem>, currentStreamItem: StreamItem? = null) {
val currentStream = currentStreamItem ?: this.currentStream
// if the stream already got added to the queue earlier, although it's not yet
// been found in the playlist, remove it and re-add it later
currentStream?.let { stream ->
if (streams.includes(stream)) {
queue.removeAll {
it.url?.toID() == currentStream.url?.toID()
}
}
}
// whether the current stream is not yet part of the list and should be added later
val reAddStream = currentStream?.let { !queue.includes(it) } ?: false
// add all new stream items to the queue
add(*streams.toTypedArray())
currentStream?.let {
// re-add the stream to the end of the queue,
if (reAddStream) updateCurrent(it, false)
}
}
private fun fetchMoreFromPlaylist(playlistId: String, nextPage: String?) { private fun fetchMoreFromPlaylist(playlistId: String, nextPage: String?) {
var playlistNextPage: String? = nextPage var playlistNextPage = nextPage
scope.launch { scope.launch(Dispatchers.IO) {
while (playlistNextPage != null) { while (playlistNextPage != null) {
RetrofitInstance.authApi.getPlaylistNextPage( RetrofitInstance.authApi.getPlaylistNextPage(playlistId, playlistNextPage!!).run {
playlistId, addToQueueAsync(relatedStreams)
playlistNextPage!!
).apply {
add(
*this.relatedStreams.toTypedArray()
)
playlistNextPage = this.nextpage playlistNextPage = this.nextpage
} }
} }
@ -103,25 +122,22 @@ object PlayingQueue {
} }
fun insertPlaylist(playlistId: String, newCurrentStream: StreamItem) { fun insertPlaylist(playlistId: String, newCurrentStream: StreamItem) {
scope.launch { scope.launch(Dispatchers.IO) {
try { runCatching {
val playlist = PlaylistsHelper.getPlaylist(playlistId) val playlist = PlaylistsHelper.getPlaylist(playlistId)
add(*playlist.relatedStreams.toTypedArray()) addToQueueAsync(playlist.relatedStreams, newCurrentStream)
updateCurrent(newCurrentStream)
if (playlist.nextpage == null) return@launch if (playlist.nextpage == null) return@launch
fetchMoreFromPlaylist(playlistId, playlist.nextpage) fetchMoreFromPlaylist(playlistId, playlist.nextpage)
} catch (e: Exception) {
e.printStackTrace()
} }
} }
} }
private fun fetchMoreFromChannel(channelId: String, nextPage: String?) { private fun fetchMoreFromChannel(channelId: String, nextPage: String?) {
var channelNextPage: String? = nextPage var channelNextPage = nextPage
scope.launch { scope.launch(Dispatchers.IO) {
while (channelNextPage != null) { while (channelNextPage != null) {
RetrofitInstance.api.getChannelNextPage(channelId, nextPage!!).apply { RetrofitInstance.api.getChannelNextPage(channelId, nextPage!!).run {
add(*relatedStreams.toTypedArray()) addToQueueAsync(relatedStreams)
channelNextPage = this.nextpage channelNextPage = this.nextpage
} }
} }
@ -129,11 +145,10 @@ object PlayingQueue {
} }
fun insertChannel(channelId: String, newCurrentStream: StreamItem) { fun insertChannel(channelId: String, newCurrentStream: StreamItem) {
scope.launch { scope.launch(Dispatchers.IO) {
runCatching { runCatching {
val channel = RetrofitInstance.api.getChannel(channelId) val channel = RetrofitInstance.api.getChannel(channelId)
add(*channel.relatedStreams.toTypedArray()) addToQueueAsync(channel.relatedStreams, newCurrentStream)
updateCurrent(newCurrentStream)
if (channel.nextpage == null) return@launch if (channel.nextpage == null) return@launch
fetchMoreFromChannel(channelId, channel.nextpage) fetchMoreFromChannel(channelId, channel.nextpage)
} }
@ -167,4 +182,8 @@ object PlayingQueue {
repeatQueue = false repeatQueue = false
onQueueTapListener = {} onQueueTapListener = {}
} }
private fun List<StreamItem>.includes(item: StreamItem) = any {
it.url?.toID() == item.url?.toID()
}
} }