From e5aaf3b31f9a932de95fb54294dc73f244f8fc31 Mon Sep 17 00:00:00 2001 From: Constantin Piber <59023762+cpiber@users.noreply.github.com> Date: Fri, 31 Oct 2025 23:37:44 +0545 Subject: [PATCH] Migrate Kitsu to use library_id and remote_id properly (#2609) (cherry picked from commit cbf72f4c60cb85f29f8446ba1adb1cfd29d38a59) # Conflicts: # CHANGELOG.md # data/src/main/sqldelight/tachiyomi/migrations/8.sqm --- .../java/eu/kanade/tachiyomi/data/track/kitsu/Kitsu.kt | 1 + .../eu/kanade/tachiyomi/data/track/kitsu/KitsuApi.kt | 10 +++++----- .../tachiyomi/data/track/kitsu/dto/KitsuListSearch.kt | 3 ++- data/src/main/sqldelight/tachiyomi/migrations/37.sqm | 7 +++++++ 4 files changed, 15 insertions(+), 6 deletions(-) create mode 100644 data/src/main/sqldelight/tachiyomi/migrations/37.sqm diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/Kitsu.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/Kitsu.kt index d0dda8b91..58f8ae38f 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/Kitsu.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/Kitsu.kt @@ -105,6 +105,7 @@ class Kitsu(id: Long) : BaseTracker(id, "Kitsu"), DeletableTracker { return if (remoteTrack != null) { track.copyPersonalFrom(remoteTrack, copyRemotePrivate = false) track.remote_id = remoteTrack.remote_id + track.library_id = remoteTrack.library_id if (track.status != COMPLETED) { track.status = if (hasReadChapters) READING else track.status diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/KitsuApi.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/KitsuApi.kt index e3d7ec76b..9c2579b01 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/KitsuApi.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/KitsuApi.kt @@ -79,7 +79,7 @@ class KitsuApi(private val client: OkHttpClient, interceptor: KitsuInterceptor) .awaitSuccess() .parseAs() .let { - track.remote_id = it.data.id + track.library_id = it.data.id track } } @@ -91,7 +91,7 @@ class KitsuApi(private val client: OkHttpClient, interceptor: KitsuInterceptor) val data = buildJsonObject { putJsonObject("data") { put("type", "libraryEntries") - put("id", track.remote_id) + put("id", track.library_id) putJsonObject("attributes") { put("status", track.toApiStatus()) put("progress", track.last_chapter_read.toInt()) @@ -105,7 +105,7 @@ class KitsuApi(private val client: OkHttpClient, interceptor: KitsuInterceptor) authClient.newCall( Request.Builder() - .url("${BASE_URL}library-entries/${track.remote_id}") + .url("${BASE_URL}library-entries/${track.library_id}") .headers( headersOf("Content-Type", VND_API_JSON), ) @@ -122,7 +122,7 @@ class KitsuApi(private val client: OkHttpClient, interceptor: KitsuInterceptor) withIOContext { authClient.newCall( DELETE( - "${BASE_URL}library-entries/${track.remoteId}", + "${BASE_URL}library-entries/${track.libraryId}", headers = headersOf("Content-Type", VND_API_JSON), ), ) @@ -195,7 +195,7 @@ class KitsuApi(private val client: OkHttpClient, interceptor: KitsuInterceptor) suspend fun getLibManga(track: Track): Track { return withIOContext { val url = "${BASE_URL}library-entries".toUri().buildUpon() - .encodedQuery("filter[id]=${track.remote_id}") + .encodedQuery("filter[id]=${track.library_id}") .appendQueryParameter("include", "manga") .build() with(json) { diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/dto/KitsuListSearch.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/dto/KitsuListSearch.kt index 4fc8437da..ad715f12d 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/dto/KitsuListSearch.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/dto/KitsuListSearch.kt @@ -21,7 +21,8 @@ data class KitsuListSearchResult( val manga = included[0].attributes return TrackSearch.create(TrackerManager.KITSU).apply { - remote_id = userData.id + remote_id = included[0].id + library_id = userData.id title = manga.canonicalTitle total_chapters = manga.chapterCount ?: 0 cover_url = manga.posterImage?.original ?: "" diff --git a/data/src/main/sqldelight/tachiyomi/migrations/37.sqm b/data/src/main/sqldelight/tachiyomi/migrations/37.sqm new file mode 100644 index 000000000..e07e36184 --- /dev/null +++ b/data/src/main/sqldelight/tachiyomi/migrations/37.sqm @@ -0,0 +1,7 @@ +-- Save the current remote_id as library_id, since old Kitsu tracker did not use this correctly +UPDATE manga_sync SET library_id = remote_id WHERE sync_id = 3; + +-- Kitsu and Suwayomi aren't using the remote_id field properly, but for both the ID is present in the URL +-- This parses a url and gets the ID from the trailing path part, e.g. https://kitsu.app/manga/ +-- Based on https://stackoverflow.com/a/38330814 +UPDATE manga_sync SET remote_id = replace(remote_url, rtrim(remote_url, replace(remote_url, '/', '')), '') WHERE sync_id IN (3, 9);