diff --git a/CHANGELOG.md b/CHANGELOG.md index 725e8b0fd..5ba3fc672 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,7 @@ The format is a modified version of [Keep a Changelog](https://keepachangelog.co - Show updates and upcoming filter icon as active for categories ([@Secozzi](https://github.com/Secozzi)) ([#3772](https://github.com/mihonapp/mihon/pull/3772)) - Show scores in MangaUpdates search results (and authors for `id:` prefix searches) ([@MajorTanya](https://github.com/MajorTanya)) ([#3795](https://github.com/mihonapp/mihon/pull/3795)) - Remove whitespace from MAL and MB `id:` prefix search inputs before searching ([@MajorTanya](https://github.com/MajorTanya)) ([#3793](https://github.com/mihonapp/mihon/pull/3793)) +- Show a helpful error message for expired AniList credentials ([@MajorTanya](https://github.com/MajorTanya)) ([#3888](https://github.com/mihonapp/mihon/pull/3888)) ### Fixed - Fixed app and extension update check running again on configuration change ([@AntsyLich](https://github.com/AntsyLich)) ([#3708](https://github.com/mihonapp/mihon/pull/3708)) diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/Anilist.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/Anilist.kt index 0d12ba086..5586bb782 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/Anilist.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/Anilist.kt @@ -218,7 +218,7 @@ class Anilist(id: Long) : BaseTracker(id, "AniList"), DeletableTracker { suspend fun login(token: String) { try { - val oauth = api.createOAuth(token) + val oauth = ALOAuth(token) interceptor.setAuth(oauth) val currentUser = api.getCurrentUser() scorePreference.set(currentUser.mediaListOptions.scoreFormat) diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/AnilistApi.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/AnilistApi.kt index be49fc432..d85cc4534 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/AnilistApi.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/AnilistApi.kt @@ -5,7 +5,6 @@ import androidx.core.net.toUri import eu.kanade.tachiyomi.data.database.models.Track import eu.kanade.tachiyomi.data.track.anilist.dto.ALAddMangaResult import eu.kanade.tachiyomi.data.track.anilist.dto.ALCurrentUserResult -import eu.kanade.tachiyomi.data.track.anilist.dto.ALOAuth import eu.kanade.tachiyomi.data.track.anilist.dto.ALSearchResult import eu.kanade.tachiyomi.data.track.anilist.dto.ALUserListMangaQueryResult import eu.kanade.tachiyomi.data.track.anilist.dto.ALUserViewerData @@ -283,10 +282,6 @@ class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) { return findLibManga(track, userId) ?: throw Exception("Could not find manga") } - fun createOAuth(token: String): ALOAuth { - return ALOAuth(token, "Bearer", System.currentTimeMillis() + 31536000000, 31536000000) - } - suspend fun getCurrentUser(): ALUserViewerData { return withIOContext { val query = """ diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/AnilistInterceptor.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/AnilistInterceptor.kt index b23179f6e..d89093650 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/AnilistInterceptor.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/AnilistInterceptor.kt @@ -2,7 +2,6 @@ package eu.kanade.tachiyomi.data.track.anilist import eu.kanade.tachiyomi.BuildConfig import eu.kanade.tachiyomi.data.track.anilist.dto.ALOAuth -import eu.kanade.tachiyomi.data.track.anilist.dto.isExpired import okhttp3.Interceptor import okhttp3.Response import java.io.IOException @@ -11,14 +10,8 @@ class AnilistInterceptor(val anilist: Anilist, private var token: String?) : Int /** * OAuth object used for authenticated requests. - * - * Anilist returns the date without milliseconds. We fix that and make the token expire 1 minute - * before its original expiration date. */ private var oauth: ALOAuth? = null - set(value) { - field = value?.copy(expires = value.expires * 1000 - 60 * 1000) - } override fun intercept(chain: Interceptor.Chain): Response { val originalRequest = chain.request() @@ -27,17 +20,11 @@ class AnilistInterceptor(val anilist: Anilist, private var token: String?) : Int throw Exception("Not authenticated with Anilist") } if (oauth == null) { - oauth = anilist.loadOAuth() + oauth = anilist.loadOAuth() ?: throw IOException("No authentication token") } - // Refresh access token if null or expired. if (oauth!!.isExpired()) { anilist.logout() - throw IOException("Token expired") - } - - // Throw on null auth. - if (oauth == null) { - throw IOException("No authentication token") + throw IOException("Token expired. Reconnect AniList in Settings.") } // Add the authorization header to the original request. diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/dto/ALOAuth.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/dto/ALOAuth.kt index 94fbd6400..ea4ecd843 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/dto/ALOAuth.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/dto/ALOAuth.kt @@ -1,17 +1,18 @@ package eu.kanade.tachiyomi.data.track.anilist.dto +import kotlinx.serialization.EncodeDefault import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable +import kotlin.time.Clock +import kotlin.time.Duration.Companion.days +import kotlin.time.Duration.Companion.minutes @Serializable data class ALOAuth( @SerialName("access_token") val accessToken: String, - @SerialName("token_type") - val tokenType: String, - val expires: Long, - @SerialName("expires_in") - val expiresIn: Long, -) - -fun ALOAuth.isExpired() = System.currentTimeMillis() > expires + @EncodeDefault + val expires: Long = Clock.System.now().plus(365.days).toEpochMilliseconds(), +) { + fun isExpired() = Clock.System.now().plus(1.minutes).toEpochMilliseconds() > expires +}