From a3070d8d0886e1008a45e88a9692d1f72fb68a80 Mon Sep 17 00:00:00 2001 From: Kelvin Date: Mon, 27 May 2024 01:13:32 +0200 Subject: [PATCH] getChannelPlaylist support --- .../api/media/CachedPlatformClient.kt | 3 +++ .../platformplayer/api/media/IPlatformClient.kt | 6 ++++++ .../api/media/PlatformClientCapabilities.kt | 3 ++- .../api/media/platforms/js/JSClient.kt | 14 +++++++++++++- .../api/media/platforms/js/models/JSChannel.kt | 3 ++- .../futo/platformplayer/states/StatePlatform.kt | 6 ++++++ app/src/unstable/assets/sources/youtube | 2 +- 7 files changed, 33 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/futo/platformplayer/api/media/CachedPlatformClient.kt b/app/src/main/java/com/futo/platformplayer/api/media/CachedPlatformClient.kt index 6f96fc2d..c604a7e6 100644 --- a/app/src/main/java/com/futo/platformplayer/api/media/CachedPlatformClient.kt +++ b/app/src/main/java/com/futo/platformplayer/api/media/CachedPlatformClient.kt @@ -10,6 +10,7 @@ import com.futo.platformplayer.api.media.models.contents.IPlatformContentDetails import com.futo.platformplayer.api.media.models.live.ILiveChatWindowDescriptor import com.futo.platformplayer.api.media.models.live.IPlatformLiveEvent import com.futo.platformplayer.api.media.models.playback.IPlaybackTracker +import com.futo.platformplayer.api.media.models.playlists.IPlatformPlaylist import com.futo.platformplayer.api.media.models.playlists.IPlatformPlaylistDetails import com.futo.platformplayer.api.media.structures.IPager import com.futo.platformplayer.models.ImageVariable @@ -60,6 +61,8 @@ class CachedPlatformClient : IPlatformClient { filters: Map>? ): IPager = _client.getChannelContents(channelUrl); + override fun getChannelPlaylists(channelUrl: String): IPager = _client.getChannelPlaylists(channelUrl); + override fun getPeekChannelTypes(): List = _client.getPeekChannelTypes(); override fun peekChannelContents(channelUrl: String, type: String?): List = _client.peekChannelContents(channelUrl, type); diff --git a/app/src/main/java/com/futo/platformplayer/api/media/IPlatformClient.kt b/app/src/main/java/com/futo/platformplayer/api/media/IPlatformClient.kt index fd09adb3..9aaf08c4 100644 --- a/app/src/main/java/com/futo/platformplayer/api/media/IPlatformClient.kt +++ b/app/src/main/java/com/futo/platformplayer/api/media/IPlatformClient.kt @@ -10,6 +10,7 @@ import com.futo.platformplayer.api.media.models.contents.IPlatformContentDetails import com.futo.platformplayer.api.media.models.live.ILiveChatWindowDescriptor import com.futo.platformplayer.api.media.models.live.IPlatformLiveEvent import com.futo.platformplayer.api.media.models.playback.IPlaybackTracker +import com.futo.platformplayer.api.media.models.playlists.IPlatformPlaylist import com.futo.platformplayer.api.media.models.playlists.IPlatformPlaylistDetails import com.futo.platformplayer.api.media.structures.IPager import com.futo.platformplayer.models.ImageVariable @@ -93,6 +94,11 @@ interface IPlatformClient { */ fun peekChannelContents(channelUrl: String, type: String? = null): List + /** + * Gets all playlists of a channel + */ + fun getChannelPlaylists(channelUrl: String): IPager + /** * Gets the channel url associated with a claimType */ diff --git a/app/src/main/java/com/futo/platformplayer/api/media/PlatformClientCapabilities.kt b/app/src/main/java/com/futo/platformplayer/api/media/PlatformClientCapabilities.kt index 51958812..1b76ae28 100644 --- a/app/src/main/java/com/futo/platformplayer/api/media/PlatformClientCapabilities.kt +++ b/app/src/main/java/com/futo/platformplayer/api/media/PlatformClientCapabilities.kt @@ -18,7 +18,8 @@ data class PlatformClientCapabilities( val hasGetLiveEvents: Boolean = false, val hasGetLiveChatWindow: Boolean = false, val hasGetContentChapters: Boolean = false, - val hasPeekChannelContents: Boolean = false + val hasPeekChannelContents: Boolean = false, + val hasGetChannelPlaylists: Boolean = false ) { } \ No newline at end of file diff --git a/app/src/main/java/com/futo/platformplayer/api/media/platforms/js/JSClient.kt b/app/src/main/java/com/futo/platformplayer/api/media/platforms/js/JSClient.kt index 641767ea..464b9117 100644 --- a/app/src/main/java/com/futo/platformplayer/api/media/platforms/js/JSClient.kt +++ b/app/src/main/java/com/futo/platformplayer/api/media/platforms/js/JSClient.kt @@ -20,6 +20,7 @@ import com.futo.platformplayer.api.media.models.contents.IPlatformContentDetails import com.futo.platformplayer.api.media.models.live.ILiveChatWindowDescriptor import com.futo.platformplayer.api.media.models.live.IPlatformLiveEvent import com.futo.platformplayer.api.media.models.playback.IPlaybackTracker +import com.futo.platformplayer.api.media.models.playlists.IPlatformPlaylist import com.futo.platformplayer.api.media.models.playlists.IPlatformPlaylistDetails import com.futo.platformplayer.api.media.platforms.js.internal.JSCallDocs import com.futo.platformplayer.api.media.platforms.js.internal.JSDocs @@ -39,6 +40,7 @@ import com.futo.platformplayer.api.media.platforms.js.models.JSLiveChatWindowDes import com.futo.platformplayer.api.media.platforms.js.models.JSLiveEventPager import com.futo.platformplayer.api.media.platforms.js.models.JSPlaybackTracker import com.futo.platformplayer.api.media.platforms.js.models.JSPlaylistDetails +import com.futo.platformplayer.api.media.platforms.js.models.JSPlaylistPager import com.futo.platformplayer.api.media.structures.EmptyPager import com.futo.platformplayer.api.media.structures.IPager import com.futo.platformplayer.constructs.Event1 @@ -231,7 +233,8 @@ open class JSClient : IPlatformClient { hasGetLiveEvents = plugin.executeBoolean("!!source.getLiveEvents") ?: false, hasGetLiveChatWindow = plugin.executeBoolean("!!source.getLiveChatWindow") ?: false, hasGetContentChapters = plugin.executeBoolean("!!source.getContentChapters") ?: false, - hasPeekChannelContents = plugin.executeBoolean("!!source.peekChannelContents") ?: false + hasPeekChannelContents = plugin.executeBoolean("!!source.peekChannelContents") ?: false, + hasGetChannelPlaylists = plugin.executeBoolean("!!source.getChannelPlaylists") ?: false ); try { @@ -402,6 +405,14 @@ open class JSClient : IPlatformClient { plugin.executeTyped("source.getChannelContents(${Json.encodeToString(channelUrl)}, ${Json.encodeToString(type)}, ${Json.encodeToString(order)}, ${Json.encodeToString(filters)})")); } + @JSDocs(10, "source.getChannelPlaylists(url)", "Gets playlists of a channel") + @JSDocsParameter("channelUrl", "A channel url (this platform)") + override fun getChannelPlaylists(channelUrl: String): IPager = isBusyWith("getChannelPlaylists") { + ensureEnabled(); + return@isBusyWith JSPlaylistPager(config, this, + plugin.executeTyped("source.getChannelPlaylists(${Json.encodeToString(channelUrl)})")); + } + @JSDocs(10, "source.getPeekChannelTypes()", "Gets types this plugin has for peek channel contents") override fun getPeekChannelTypes(): List { if(!capabilities.hasPeekChannelContents) @@ -423,6 +434,7 @@ open class JSClient : IPlatformClient { return listOf(); } } + @JSDocs(10, "source.peekChannelContents(url, type)", "Peek contents of a channel (reverse chronological order)") @JSDocsParameter("channelUrl", "A channel url (this platform)") @JSDocsParameter("type", "(optional) Type of contents to get from channel") diff --git a/app/src/main/java/com/futo/platformplayer/api/media/platforms/js/models/JSChannel.kt b/app/src/main/java/com/futo/platformplayer/api/media/platforms/js/models/JSChannel.kt index 01436008..ee0b15cb 100644 --- a/app/src/main/java/com/futo/platformplayer/api/media/platforms/js/models/JSChannel.kt +++ b/app/src/main/java/com/futo/platformplayer/api/media/platforms/js/models/JSChannel.kt @@ -7,6 +7,7 @@ import com.futo.platformplayer.api.media.models.channels.IPlatformChannel import com.futo.platformplayer.api.media.models.contents.IPlatformContent import com.futo.platformplayer.api.media.platforms.js.SourcePluginConfig import com.futo.platformplayer.api.media.structures.IPager +import com.futo.platformplayer.getOrDefault import com.futo.platformplayer.getOrDefaultList import com.futo.platformplayer.getOrThrow import com.futo.platformplayer.getOrThrowNullable @@ -37,7 +38,7 @@ class JSChannel : IPlatformChannel { description = _channel.getOrThrowNullable(config, "description", contextName); url = _channel.getOrThrow(config, "url", contextName); urlAlternatives = _channel.getOrDefaultList(config, "urlAlternatives", contextName, listOf()) ?: listOf(); - links = HashMap(); + links = HashMap(_channel.getOrDefault>(config, "links", contextName, mapOf()) ?: mapOf()); } override fun getContents(client: IPlatformClient): IPager { diff --git a/app/src/main/java/com/futo/platformplayer/states/StatePlatform.kt b/app/src/main/java/com/futo/platformplayer/states/StatePlatform.kt index 0b03bab1..dbfa8886 100644 --- a/app/src/main/java/com/futo/platformplayer/states/StatePlatform.kt +++ b/app/src/main/java/com/futo/platformplayer/states/StatePlatform.kt @@ -22,6 +22,7 @@ import com.futo.platformplayer.api.media.models.contents.PlatformContentPlacehol import com.futo.platformplayer.api.media.models.live.ILiveChatWindowDescriptor import com.futo.platformplayer.api.media.models.live.IPlatformLiveEvent import com.futo.platformplayer.api.media.models.playback.IPlaybackTracker +import com.futo.platformplayer.api.media.models.playlists.IPlatformPlaylist import com.futo.platformplayer.api.media.models.playlists.IPlatformPlaylistDetails import com.futo.platformplayer.api.media.models.video.IPlatformVideo import com.futo.platformplayer.api.media.platforms.js.DevJSClient @@ -799,6 +800,11 @@ class StatePlatform { return client.getChannelContents(channelUrl, type, ordering) ; } + fun getChannelPlaylists(channelUrl: String): IPager { + val client = getChannelClient(channelUrl); + return client.getChannelPlaylists(channelUrl); + } + fun peekChannelContents(baseClient: IPlatformClient, channelUrl: String, type: String?): List { val client = _channelClientPool.getClientPooled(baseClient, Settings.instance.subscriptions.getSubscriptionsConcurrency()); return client.peekChannelContents(channelUrl, type) ; diff --git a/app/src/unstable/assets/sources/youtube b/app/src/unstable/assets/sources/youtube index 37e2ed94..d0cca1ac 160000 --- a/app/src/unstable/assets/sources/youtube +++ b/app/src/unstable/assets/sources/youtube @@ -1 +1 @@ -Subproject commit 37e2ed94384ff82f4cb67a2250877cb1e8e03c57 +Subproject commit d0cca1ac04a1812414ee633a08585dc896701a32