open-ani / ani

一站式在线弹幕追番平台:全自动 BT + 在线多数据源聚合,离线缓存,Bangumi 收藏同步,弹幕云过滤 ...
https://myani.org
GNU Affero General Public License v3.0
1.32k stars 41 forks source link

根据关联条目信息, 过滤掉非目标季度资源 #1009

Open Him188 opened 3 days ago

Him188 commented 3 days ago

可以高效处理看第一季时搜到第二季的问题

技术上可以实现到 MediaSelector 里

Him188 commented 3 days ago

看了下, 数据层没有, 还需要 graphql 批量复查别名, 比较麻烦

Him188 commented 3 days ago
Subject: [PATCH] p
---
Index: app/shared/app-data/src/commonMain/kotlin/data/source/media/selector/MediaSelectorFactory.kt
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/app/shared/app-data/src/commonMain/kotlin/data/source/media/selector/MediaSelectorFactory.kt b/app/shared/app-data/src/commonMain/kotlin/data/source/media/selector/MediaSelectorFactory.kt
--- a/app/shared/app-data/src/commonMain/kotlin/data/source/media/selector/MediaSelectorFactory.kt  (revision 33eec9b0a9a86c3673bfab56a686152d9fb35b8d)
+++ b/app/shared/app-data/src/commonMain/kotlin/data/source/media/selector/MediaSelectorFactory.kt  (date 1727205589136)
@@ -51,6 +51,7 @@
                         subjectManager.subjectCompletedFlow(subjectId),
                         mediaSourceManager.allInstances,
                         flowOf(subtitlePreferences),
+                        subjectManager.relatedSubjectNamesFlow(subjectId)
                     ),
                     mediaList,
                     savedUserPreference = episodePreferencesRepository.mediaPreferenceFlow(subjectId),
Index: app/shared/app-data/src/commonMain/kotlin/data/models/subject/SubjectManager.kt
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/app/shared/app-data/src/commonMain/kotlin/data/models/subject/SubjectManager.kt b/app/shared/app-data/src/commonMain/kotlin/data/models/subject/SubjectManager.kt
--- a/app/shared/app-data/src/commonMain/kotlin/data/models/subject/SubjectManager.kt   (revision 33eec9b0a9a86c3673bfab56a686152d9fb35b8d)
+++ b/app/shared/app-data/src/commonMain/kotlin/data/models/subject/SubjectManager.kt   (date 1727205605809)
@@ -136,6 +136,8 @@
         return subjectId.mapLatest { getSubjectInfo(it) }
     }

+    abstract fun relatedSubjectNamesFlow(subjectId: Int): Flow<Set<String>>
+
     ///////////////////////////////////////////////////////////////////////////
     // Subject progress
     ///////////////////////////////////////////////////////////////////////////
@@ -388,6 +390,10 @@
             .toSubjectInfo()
     }

+    override fun relatedSubjectNamesFlow(subjectId: Int): Flow<Set<String>> {
+        
+    }
+
     override suspend fun getEpisodeInfo(episodeId: Int): EpisodeInfo {
         collectionsByType.values.map { it.getCachedData() }.asSequence().flatten()
             .flatMap { it.episodes }
Index: app/shared/app-data/src/commonMain/kotlin/data/source/media/selector/MediaSelectorContext.kt
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/app/shared/app-data/src/commonMain/kotlin/data/source/media/selector/MediaSelectorContext.kt b/app/shared/app-data/src/commonMain/kotlin/data/source/media/selector/MediaSelectorContext.kt
--- a/app/shared/app-data/src/commonMain/kotlin/data/source/media/selector/MediaSelectorContext.kt  (revision 33eec9b0a9a86c3673bfab56a686152d9fb35b8d)
+++ b/app/shared/app-data/src/commonMain/kotlin/data/source/media/selector/MediaSelectorContext.kt  (date 1727205581802)
@@ -32,6 +32,11 @@
      * 用于针对各个平台的播放器缺陷,调整选择资源的优先级
      */
     val subtitlePreferences: MediaSelectorSubtitlePreferences?,
+    /**
+     * 续集条目的名称列表, 用于过滤掉包含这些名称的资源. 不能是前传的, 否则会造成 false positive
+     * @since 3.11
+     */ // #1009
+    val relatedSubjectNames: Set<String>?,
 ) {
     fun allFieldsLoaded() = subjectFinished != null
             && mediaSourcePrecedence != null
@@ -41,9 +46,15 @@
         /**
          * 刚开始查询时的默认值
          */
-        val Initial = MediaSelectorContext(null, null, null)
+        val Initial = MediaSelectorContext(null, null, null, null)

-        val EmptyForPreview get() = MediaSelectorContext(false, emptyList(), MediaSelectorSubtitlePreferences.AllNormal)
+        val EmptyForPreview
+            get() = MediaSelectorContext(
+                false,
+                emptyList(),
+                MediaSelectorSubtitlePreferences.AllNormal,
+                emptySet(),
+            )
     }
 }

@@ -54,13 +65,15 @@
     subjectCompleted: Flow<Boolean>,
     mediaSourcePrecedence: Flow<List<String>>,
     subtitleKindFilters: Flow<MediaSelectorSubtitlePreferences>,
+    relatedSubjectNames: Flow<Set<String>>,
 ): Flow<MediaSelectorContext> = combine(
-    subjectCompleted, mediaSourcePrecedence, subtitleKindFilters,
-) { completed, instances, filters ->
+    subjectCompleted, mediaSourcePrecedence, subtitleKindFilters, relatedSubjectNames,
+) { completed, instances, filters, names ->
     MediaSelectorContext(
         subjectFinished = completed,
         mediaSourcePrecedence = instances,
         subtitlePreferences = filters,
+        relatedSubjectNames = names,
     )
 }.onStart {
     emit(Initial) // 否则如果一直没获取到剧集信息, 就无法选集, #385
@@ -74,10 +87,12 @@
     subjectCompleted: Flow<Boolean>,
     mediaSourcePrecedence: Flow<List<MediaSourceInstance>>,
     subtitleKindFilters: Flow<MediaSelectorSubtitlePreferences>,
+    relatedSubjectNames: Flow<Set<String>>,
 ): Flow<MediaSelectorContext> = createFlow(
     subjectCompleted,
     mediaSourcePrecedence.map { list ->
         list.map { it.mediaSourceId }
     },
     subtitleKindFilters,
+    relatedSubjectNames,
 )

partial implementation