From 3c70c5a3665f2bb4a426c23e529d7a0daf46d37d Mon Sep 17 00:00:00 2001 From: Kelvin <kelvin@futo.org> Date: Wed, 4 Sep 2024 20:02:44 +0200 Subject: [PATCH] Better handling of null author, search url fixes, Handling of more than 1000 subscriptions --- .../api/media/models/PlatformAuthorLink.kt | 2 ++ .../api/media/platforms/js/models/JSContent.kt | 7 ++++++- .../mainactivity/main/SuggestionsFragment.kt | 10 ++++++++-- .../com/futo/platformplayer/states/StateCache.kt | 14 +++++++++++++- .../platformplayer/stores/db/ManagedDBStore.kt | 6 +++++- app/src/stable/assets/sources/youtube | 2 +- app/src/unstable/assets/sources/youtube | 2 +- 7 files changed, 36 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/com/futo/platformplayer/api/media/models/PlatformAuthorLink.kt b/app/src/main/java/com/futo/platformplayer/api/media/models/PlatformAuthorLink.kt index 0fe2d55b..e0acb91e 100644 --- a/app/src/main/java/com/futo/platformplayer/api/media/models/PlatformAuthorLink.kt +++ b/app/src/main/java/com/futo/platformplayer/api/media/models/PlatformAuthorLink.kt @@ -27,6 +27,8 @@ open class PlatformAuthorLink { } companion object { + val UNKNOWN = PlatformAuthorLink(PlatformID.NONE, "Unknown", "", null, null); + fun fromV8(config: SourcePluginConfig, value: V8ValueObject): PlatformAuthorLink { if(value.has("membershipUrl")) return PlatformAuthorMembershipLink.fromV8(config, value); diff --git a/app/src/main/java/com/futo/platformplayer/api/media/platforms/js/models/JSContent.kt b/app/src/main/java/com/futo/platformplayer/api/media/platforms/js/models/JSContent.kt index b3dd9dd5..ab3b6f10 100644 --- a/app/src/main/java/com/futo/platformplayer/api/media/platforms/js/models/JSContent.kt +++ b/app/src/main/java/com/futo/platformplayer/api/media/platforms/js/models/JSContent.kt @@ -42,7 +42,12 @@ open class JSContent : IPlatformContent, IPluginSourced { id = PlatformID.fromV8(_pluginConfig, _content.getOrThrow(config, "id", contextName)); name = HtmlCompat.fromHtml(_content.getOrThrow<String>(config, "name", contextName).decodeUnicode(), HtmlCompat.FROM_HTML_MODE_LEGACY).toString(); - author = PlatformAuthorLink.fromV8(_pluginConfig, _content.getOrThrow(config, "author", contextName)); + + val authorObj = _content.getOrDefault<V8ValueObject>(config, "author", contextName, null); + if(authorObj != null) + author = PlatformAuthorLink.fromV8(_pluginConfig, authorObj); + else + author = PlatformAuthorLink.UNKNOWN; val datetimeInt = _content.getOrThrow<Int>(config, "datetime", contextName).toLong(); if(datetimeInt == 0.toLong()) diff --git a/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/SuggestionsFragment.kt b/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/SuggestionsFragment.kt index 2f7254dc..95055d0a 100644 --- a/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/SuggestionsFragment.kt +++ b/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/SuggestionsFragment.kt @@ -117,8 +117,14 @@ class SuggestionsFragment : MainFragment { } else if (_searchType == SearchType.PLAYLIST) { navigate<PlaylistSearchResultsFragment>(it); } else { - if(it.isHttpUrl()) - navigate<VideoDetailFragment>(it); + if(it.isHttpUrl()) { + if(StatePlatform.instance.hasEnabledPlaylistClient(it)) + navigate<RemotePlaylistFragment>(it); + else if(StatePlatform.instance.hasEnabledChannelClient(it)) + navigate<ChannelFragment>(it); + else + navigate<VideoDetailFragment>(it); + } else navigate<ContentSearchResultsFragment>(SuggestionsFragmentData(it, SearchType.VIDEO, _channelUrl)); } diff --git a/app/src/main/java/com/futo/platformplayer/states/StateCache.kt b/app/src/main/java/com/futo/platformplayer/states/StateCache.kt index b922d756..7d91c9ce 100644 --- a/app/src/main/java/com/futo/platformplayer/states/StateCache.kt +++ b/app/src/main/java/com/futo/platformplayer/states/StateCache.kt @@ -64,8 +64,20 @@ class StateCache { Logger.i(TAG, "Subscriptions CachePager get pagers"); val pagers: List<IPager<IPlatformContent>>; + val splitAmount = 900; val timeCacheRetrieving = measureTimeMillis { - pagers = listOf(getAllChannelCachePager(allUrls)); + if(allUrls.size > splitAmount) { + var done = 0; + var subsetPagers = mutableListOf<IPager<IPlatformContent>>(); + while(done < allUrls.size) { + val subsetUrls = allUrls.subList(done, Math.min(allUrls.size - 1, done + splitAmount)); + subsetPagers.add(getAllChannelCachePager(subsetUrls)); + done += splitAmount; + } + pagers = subsetPagers; + } + else + pagers = listOf(getAllChannelCachePager(allUrls)); } Logger.i(TAG, "Subscriptions CachePager compiling (retrieved in ${timeCacheRetrieving}ms)"); diff --git a/app/src/main/java/com/futo/platformplayer/stores/db/ManagedDBStore.kt b/app/src/main/java/com/futo/platformplayer/stores/db/ManagedDBStore.kt index a07b4f5b..2e493eef 100644 --- a/app/src/main/java/com/futo/platformplayer/stores/db/ManagedDBStore.kt +++ b/app/src/main/java/com/futo/platformplayer/stores/db/ManagedDBStore.kt @@ -12,10 +12,10 @@ import com.futo.platformplayer.states.StateApp import com.futo.platformplayer.stores.v2.JsonStoreSerializer import com.futo.platformplayer.stores.v2.StoreSerializer import kotlinx.serialization.KSerializer -import java.lang.IllegalArgumentException import java.lang.reflect.Field import java.util.concurrent.ConcurrentHashMap import java.util.concurrent.ConcurrentMap +import kotlin.IllegalArgumentException import kotlin.reflect.KClass import kotlin.reflect.KProperty import kotlin.reflect.KType @@ -318,8 +318,12 @@ class ManagedDBStore<I: ManagedDBIndex<T>, T, D: ManagedDBDatabase<T, I, DA>, DA }); } + private val inLimit = 990; fun <X> queryInPager(field: KProperty<*>, obj: List<String>, pageSize: Int, convert: (I)->X): IPager<X> = queryInPager(validateFieldName(field), obj, pageSize, convert); fun <X> queryInPager(field: String, obj: List<String>, pageSize: Int, convert: (I)->X): IPager<X> { + if(obj.size > inLimit) { + throw IllegalArgumentException("Too many objects requested (IN query), create subqueries of ${inLimit}"); + } return AdhocPager({ queryInPage(field, obj, it - 1, pageSize).map(convert); }); diff --git a/app/src/stable/assets/sources/youtube b/app/src/stable/assets/sources/youtube index a4766ec2..0c11c566 160000 --- a/app/src/stable/assets/sources/youtube +++ b/app/src/stable/assets/sources/youtube @@ -1 +1 @@ -Subproject commit a4766ec223e4711dc2870060c1dce24d64470938 +Subproject commit 0c11c566918647fb6d3d010deeeb8312c94d3437 diff --git a/app/src/unstable/assets/sources/youtube b/app/src/unstable/assets/sources/youtube index a4766ec2..0c11c566 160000 --- a/app/src/unstable/assets/sources/youtube +++ b/app/src/unstable/assets/sources/youtube @@ -1 +1 @@ -Subproject commit a4766ec223e4711dc2870060c1dce24d64470938 +Subproject commit 0c11c566918647fb6d3d010deeeb8312c94d3437 -- GitLab