mirror of
https://github.com/libre-tube/LibreTube.git
synced 2024-12-14 14:20:30 +05:30
fix: crash when blocked due to too many requests in playing queue
This commit is contained in:
parent
47bd510aef
commit
d03a58a296
@ -0,0 +1,13 @@
|
|||||||
|
package com.github.libretube.extensions
|
||||||
|
|
||||||
|
import kotlinx.coroutines.CoroutineScope
|
||||||
|
import kotlinx.coroutines.Dispatchers
|
||||||
|
import kotlinx.coroutines.launch
|
||||||
|
|
||||||
|
fun runCatchingIO(block: suspend () -> Unit) {
|
||||||
|
CoroutineScope(Dispatchers.IO).launch {
|
||||||
|
runCatching {
|
||||||
|
block.invoke()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -6,6 +6,7 @@ import com.github.libretube.api.PlaylistsHelper
|
|||||||
import com.github.libretube.api.RetrofitInstance
|
import com.github.libretube.api.RetrofitInstance
|
||||||
import com.github.libretube.api.obj.StreamItem
|
import com.github.libretube.api.obj.StreamItem
|
||||||
import com.github.libretube.extensions.move
|
import com.github.libretube.extensions.move
|
||||||
|
import com.github.libretube.extensions.runCatchingIO
|
||||||
import com.github.libretube.extensions.toID
|
import com.github.libretube.extensions.toID
|
||||||
import com.github.libretube.helpers.PlayerHelper
|
import com.github.libretube.helpers.PlayerHelper
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
@ -15,7 +16,6 @@ import kotlinx.coroutines.launch
|
|||||||
object PlayingQueue {
|
object PlayingQueue {
|
||||||
private val queue = mutableListOf<StreamItem>()
|
private val queue = mutableListOf<StreamItem>()
|
||||||
private var currentStream: StreamItem? = null
|
private var currentStream: StreamItem? = null
|
||||||
private val scope = CoroutineScope(Dispatchers.IO)
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Listener that gets called when the user selects an item from the queue
|
* Listener that gets called when the user selects an item from the queue
|
||||||
@ -145,34 +145,26 @@ object PlayingQueue {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun fetchMoreFromPlaylist(playlistId: String, nextPage: String?, isMainList: Boolean) {
|
private fun fetchMoreFromPlaylist(playlistId: String, nextPage: String?, isMainList: Boolean) = runCatchingIO {
|
||||||
var playlistNextPage = nextPage
|
var playlistNextPage = nextPage
|
||||||
scope.launch(Dispatchers.IO) {
|
|
||||||
while (playlistNextPage != null) {
|
while (playlistNextPage != null) {
|
||||||
RetrofitInstance.authApi.getPlaylistNextPage(playlistId, playlistNextPage!!).run {
|
RetrofitInstance.authApi.getPlaylistNextPage(playlistId, playlistNextPage).run {
|
||||||
addToQueueAsync(relatedStreams, isMainList = isMainList)
|
addToQueueAsync(relatedStreams, isMainList = isMainList)
|
||||||
playlistNextPage = this.nextpage
|
playlistNextPage = this.nextpage
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
fun insertPlaylist(playlistId: String, newCurrentStream: StreamItem?) {
|
fun insertPlaylist(playlistId: String, newCurrentStream: StreamItem?) = runCatchingIO {
|
||||||
scope.launch(Dispatchers.IO) {
|
|
||||||
runCatching {
|
|
||||||
val playlist = PlaylistsHelper.getPlaylist(playlistId)
|
val playlist = PlaylistsHelper.getPlaylist(playlistId)
|
||||||
val isMainList = newCurrentStream != null
|
val isMainList = newCurrentStream != null
|
||||||
addToQueueAsync(playlist.relatedStreams, newCurrentStream, isMainList)
|
addToQueueAsync(playlist.relatedStreams, newCurrentStream, isMainList)
|
||||||
if (playlist.nextpage == null) return@launch
|
if (playlist.nextpage == null) return@runCatchingIO
|
||||||
fetchMoreFromPlaylist(playlistId, playlist.nextpage, isMainList)
|
fetchMoreFromPlaylist(playlistId, playlist.nextpage, isMainList)
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun fetchMoreFromChannel(channelId: String, nextPage: String?) {
|
private fun fetchMoreFromChannel(channelId: String, nextPage: String?) = runCatchingIO {
|
||||||
var channelNextPage = nextPage
|
var channelNextPage = nextPage
|
||||||
scope.launch(Dispatchers.IO) {
|
|
||||||
runCatching {
|
|
||||||
while (channelNextPage != null) {
|
while (channelNextPage != null) {
|
||||||
RetrofitInstance.api.getChannelNextPage(channelId, nextPage!!).run {
|
RetrofitInstance.api.getChannelNextPage(channelId, nextPage!!).run {
|
||||||
addToQueueAsync(relatedStreams)
|
addToQueueAsync(relatedStreams)
|
||||||
@ -180,22 +172,16 @@ object PlayingQueue {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun insertChannel(channelId: String, newCurrentStream: StreamItem) {
|
private fun insertChannel(channelId: String, newCurrentStream: StreamItem) = runCatchingIO {
|
||||||
scope.launch(Dispatchers.IO) {
|
|
||||||
runCatching {
|
|
||||||
val channel = RetrofitInstance.api.getChannel(channelId)
|
val channel = RetrofitInstance.api.getChannel(channelId)
|
||||||
addToQueueAsync(channel.relatedStreams, newCurrentStream)
|
addToQueueAsync(channel.relatedStreams, newCurrentStream)
|
||||||
if (channel.nextpage == null) return@launch
|
if (channel.nextpage == null) return@runCatchingIO
|
||||||
fetchMoreFromChannel(channelId, channel.nextpage)
|
fetchMoreFromChannel(channelId, channel.nextpage)
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun insertByVideoId(videoId: String) {
|
fun insertByVideoId(videoId: String) {
|
||||||
scope.launch {
|
CoroutineScope(Dispatchers.IO).launch {
|
||||||
runCatching {
|
runCatching {
|
||||||
val streams = RetrofitInstance.api.getStreams(videoId.toID())
|
val streams = RetrofitInstance.api.getStreams(videoId.toID())
|
||||||
add(streams.toStreamItem(videoId))
|
add(streams.toStreamItem(videoId))
|
||||||
@ -203,7 +189,12 @@ object PlayingQueue {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun updateQueue(streamItem: StreamItem, playlistId: String?, channelId: String?, relatedStreams: List<StreamItem> = emptyList()) {
|
fun updateQueue(
|
||||||
|
streamItem: StreamItem,
|
||||||
|
playlistId: String?,
|
||||||
|
channelId: String?,
|
||||||
|
relatedStreams: List<StreamItem> = emptyList()
|
||||||
|
) {
|
||||||
if (playlistId != null) {
|
if (playlistId != null) {
|
||||||
insertPlaylist(playlistId, streamItem)
|
insertPlaylist(playlistId, streamItem)
|
||||||
} else if (channelId != null) {
|
} else if (channelId != null) {
|
||||||
|
Loading…
Reference in New Issue
Block a user