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