From 61439eb17f2bc860a812f68b0234ef8a893c2e26 Mon Sep 17 00:00:00 2001 From: Luna712 <142361265+Luna712@users.noreply.github.com> Date: Tue, 17 Oct 2023 13:04:46 -0600 Subject: [PATCH] Implement IMDb duplicate title checking support --- .../com/lagradost/cloudstream3/MainAPI.kt | 12 +++++++++++ .../ui/result/ResultViewModel2.kt | 20 +++++++++++++------ .../cloudstream3/utils/DataStoreHelper.kt | 12 +++++++---- 3 files changed, 34 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/com/lagradost/cloudstream3/MainAPI.kt b/app/src/main/java/com/lagradost/cloudstream3/MainAPI.kt index 5b674c4c..7fa65540 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/MainAPI.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/MainAPI.kt @@ -26,6 +26,8 @@ import com.lagradost.nicehttp.RequestBodyTypes import okhttp3.Interceptor import okhttp3.MediaType.Companion.toMediaTypeOrNull import okhttp3.RequestBody.Companion.toRequestBody +import org.json.JSONException +import org.json.JSONObject import java.text.SimpleDateFormat import java.util.* import kotlin.math.absoluteValue @@ -1246,6 +1248,16 @@ interface LoadResponse { return this.syncData[aniListIdPrefix] } + fun LoadResponse.getImdbId(): String? { + val simklId = this.syncData[simklIdPrefix] ?: return null + return try { + val jsonObject = JSONObject(simklId) + jsonObject.optString("Imdb") + } catch (e: JSONException) { + null + } + } + fun LoadResponse.addMalId(id: Int?) { this.syncData[malIdPrefix] = (id ?: return).toString() this.addSimklId(SimklApi.Companion.SyncServices.Mal, id.toString()) diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultViewModel2.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultViewModel2.kt index 8fe895c8..def67787 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultViewModel2.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultViewModel2.kt @@ -25,6 +25,7 @@ import com.lagradost.cloudstream3.CommonActivity.getCastSession import com.lagradost.cloudstream3.CommonActivity.showToast import com.lagradost.cloudstream3.LoadResponse.Companion.addTrailer import com.lagradost.cloudstream3.LoadResponse.Companion.getAniListId +import com.lagradost.cloudstream3.LoadResponse.Companion.getImdbId import com.lagradost.cloudstream3.LoadResponse.Companion.getMalId import com.lagradost.cloudstream3.LoadResponse.Companion.isMovie import com.lagradost.cloudstream3.metaproviders.SyncRedirector @@ -830,6 +831,7 @@ class ResultViewModel2 : ViewModel() { R.string.duplicate_message_bookmarks, response.name, response.year, + response.getImdbId(), getAllBookmarkedDataByWatchType()[status] ?: emptyList() ) { shouldContinue: Boolean, duplicateId: Int? -> if (!shouldContinue) return@checkAndWarnDuplicates @@ -852,7 +854,8 @@ class ResultViewModel2 : ViewModel() { response.url, response.apiName, response.type, - response.posterUrl + response.posterUrl, + response.getImdbId() ) ) @@ -899,6 +902,7 @@ class ResultViewModel2 : ViewModel() { R.string.duplicate_message_subscriptions, response.name, response.year, + response.getImdbId(), getAllSubscriptions(), ) { shouldContinue: Boolean, duplicateId: Int? -> if (!shouldContinue) { @@ -924,7 +928,8 @@ class ResultViewModel2 : ViewModel() { response.url, response.apiName, response.type, - response.posterUrl + response.posterUrl, + response.getImdbId() ) ) @@ -960,6 +965,7 @@ class ResultViewModel2 : ViewModel() { R.string.duplicate_message_favorites, response.name, response.year, + response.getImdbId(), getAllFavorites(), ) { shouldContinue: Boolean, duplicateId: Int? -> if (!shouldContinue) { @@ -984,7 +990,8 @@ class ResultViewModel2 : ViewModel() { response.url, response.apiName, response.type, - response.posterUrl + response.posterUrl, + response.getImdbId() ) ) @@ -1002,6 +1009,7 @@ class ResultViewModel2 : ViewModel() { message: Int, name: String, year: Int?, + imdbId: String?, data: List, checkDuplicatesCallback: (shouldContinue: Boolean, duplicateId: Int?) -> Unit ) { @@ -1015,11 +1023,11 @@ class ResultViewModel2 : ViewModel() { return input.trim().replace("\\s+".toRegex(), " ") } - // TODO support checking IMDB ID rather than name + year when available val duplicateEntry = data.find { - // Normalize both strings for comparison - normalizeString(it.name) == normalizeString(name) && it.year == year + imdbId != null && it.imdbId == imdbId || + normalizeString(it.name) == normalizeString(name) && it.year == year } + if (duplicateEntry == null || context == null) { checkDuplicatesCallback.invoke(true, null) return diff --git a/app/src/main/java/com/lagradost/cloudstream3/utils/DataStoreHelper.kt b/app/src/main/java/com/lagradost/cloudstream3/utils/DataStoreHelper.kt index ae8aac7b..07762319 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/utils/DataStoreHelper.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/utils/DataStoreHelper.kt @@ -360,6 +360,7 @@ object DataStoreHelper { @JsonProperty("apiName") override val apiName: String, @JsonProperty("type") override var type: TvType? = null, @JsonProperty("posterUrl") override var posterUrl: String?, + @JsonProperty("imdbId") open val imdbId: String? = null, @JsonProperty("quality") override var quality: SearchQuality? = null, @JsonProperty("posterHeaders") override var posterHeaders: Map? = null ) : SearchResponse @@ -375,9 +376,10 @@ object DataStoreHelper { override val apiName: String, override var type: TvType?, override var posterUrl: String?, + override var imdbId: String? = null, override var quality: SearchQuality? = null, override var posterHeaders: Map? = null - ) : BaseSearchResponse(id, name, year, url, apiName, type, posterUrl, quality, posterHeaders) { + ) : BaseSearchResponse(id, name, year, url, apiName, type, posterUrl, imdbId, quality, posterHeaders) { fun toLibraryItem(): SyncAPI.LibraryItem? { return SyncAPI.LibraryItem( name, @@ -402,9 +404,10 @@ object DataStoreHelper { override val apiName: String, override var type: TvType?, override var posterUrl: String?, + override var imdbId: String? = null, override var quality: SearchQuality? = null, override var posterHeaders: Map? = null - ) : BaseSearchResponse(id, name, year, url, apiName, type, posterUrl, quality, posterHeaders) { + ) : BaseSearchResponse(id, name, year, url, apiName, type, posterUrl, imdbId, quality, posterHeaders) { fun toLibraryItem(id: String): SyncAPI.LibraryItem { return SyncAPI.LibraryItem( name, @@ -429,9 +432,10 @@ object DataStoreHelper { override val apiName: String, override var type: TvType?, override var posterUrl: String?, + override var imdbId: String? = null, override var quality: SearchQuality? = null, override var posterHeaders: Map? = null - ) : BaseSearchResponse(id, name, year, url, apiName, type, posterUrl, quality, posterHeaders) { + ) : BaseSearchResponse(id, name, year, url, apiName, type, posterUrl, imdbId, quality, posterHeaders) { fun toLibraryItem(): SyncAPI.LibraryItem? { return SyncAPI.LibraryItem( name, @@ -460,7 +464,7 @@ object DataStoreHelper { override var posterUrl: String?, override var quality: SearchQuality? = null, override var posterHeaders: Map? = null - ) : BaseSearchResponse(id, name, null, url, apiName, type, posterUrl, quality, posterHeaders) + ) : BaseSearchResponse(id, name, null, url, apiName, type, posterUrl, null, quality, posterHeaders) /** * A datastore wide account for future implementations of a multiple account system