mirror of
				https://github.com/mihonapp/mihon.git
				synced 2025-11-04 08:08:55 +01:00 
			
		
		
		
	Shikomori -> Shikimori. Fix update chapters (#1996)
* Shikomori -> Shikimori. Fix update chapters * Removed logs and format code
This commit is contained in:
		@@ -4,7 +4,7 @@ import android.content.Context
 | 
			
		||||
import eu.kanade.tachiyomi.data.track.anilist.Anilist
 | 
			
		||||
import eu.kanade.tachiyomi.data.track.kitsu.Kitsu
 | 
			
		||||
import eu.kanade.tachiyomi.data.track.myanimelist.Myanimelist
 | 
			
		||||
import eu.kanade.tachiyomi.data.track.shikomori.Shikomori
 | 
			
		||||
import eu.kanade.tachiyomi.data.track.shikimori.Shikimori
 | 
			
		||||
 | 
			
		||||
class TrackManager(private val context: Context) {
 | 
			
		||||
 | 
			
		||||
@@ -12,7 +12,7 @@ class TrackManager(private val context: Context) {
 | 
			
		||||
        const val MYANIMELIST = 1
 | 
			
		||||
        const val ANILIST = 2
 | 
			
		||||
        const val KITSU = 3
 | 
			
		||||
        const val SHIKOMORI = 4
 | 
			
		||||
        const val SHIKIMORI = 4
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    val myAnimeList = Myanimelist(context, MYANIMELIST)
 | 
			
		||||
@@ -21,9 +21,9 @@ class TrackManager(private val context: Context) {
 | 
			
		||||
 | 
			
		||||
    val kitsu = Kitsu(context, KITSU)
 | 
			
		||||
 | 
			
		||||
    val shikomori = Shikomori(context, SHIKOMORI)
 | 
			
		||||
    val shikimori = Shikimori(context, SHIKIMORI)
 | 
			
		||||
 | 
			
		||||
    val services = listOf(myAnimeList, aniList, kitsu, shikomori)
 | 
			
		||||
    val services = listOf(myAnimeList, aniList, kitsu, shikimori)
 | 
			
		||||
 | 
			
		||||
    fun getService(id: Int) = services.find { it.id == id }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
package eu.kanade.tachiyomi.data.track.shikomori
 | 
			
		||||
package eu.kanade.tachiyomi.data.track.shikimori
 | 
			
		||||
 | 
			
		||||
data class OAuth(
 | 
			
		||||
        val access_token: String,
 | 
			
		||||
@@ -1,7 +1,8 @@
 | 
			
		||||
package eu.kanade.tachiyomi.data.track.shikomori
 | 
			
		||||
package eu.kanade.tachiyomi.data.track.shikimori
 | 
			
		||||
 | 
			
		||||
import android.content.Context
 | 
			
		||||
import android.graphics.Color
 | 
			
		||||
import android.util.Log
 | 
			
		||||
import com.google.gson.Gson
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
import eu.kanade.tachiyomi.data.database.models.Track
 | 
			
		||||
@@ -11,7 +12,7 @@ import rx.Completable
 | 
			
		||||
import rx.Observable
 | 
			
		||||
import uy.kohesive.injekt.injectLazy
 | 
			
		||||
 | 
			
		||||
class Shikomori(private val context: Context, id: Int) : TrackService(id) {
 | 
			
		||||
class Shikimori(private val context: Context, id: Int) : TrackService(id) {
 | 
			
		||||
 | 
			
		||||
    override fun getScoreList(): List<String> {
 | 
			
		||||
        return IntRange(0, 10).map(Int::toString)
 | 
			
		||||
@@ -75,15 +76,15 @@ class Shikomori(private val context: Context, id: Int) : TrackService(id) {
 | 
			
		||||
        const val DEFAULT_SCORE = 0
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override val name = "Shikomori"
 | 
			
		||||
    override val name = "Shikimori"
 | 
			
		||||
 | 
			
		||||
    private val gson: Gson by injectLazy()
 | 
			
		||||
 | 
			
		||||
    private val interceptor by lazy { ShikomoriInterceptor(this, gson) }
 | 
			
		||||
    private val interceptor by lazy { ShikimoriInterceptor(this, gson) }
 | 
			
		||||
 | 
			
		||||
    private val api by lazy { ShikomoriApi(client, interceptor) }
 | 
			
		||||
    private val api by lazy { ShikimoriApi(client, interceptor) }
 | 
			
		||||
 | 
			
		||||
    override fun getLogo() = R.drawable.shikomori
 | 
			
		||||
    override fun getLogo() = R.drawable.shikimori
 | 
			
		||||
 | 
			
		||||
    override fun getLogoColor() = Color.rgb(40, 40, 40)
 | 
			
		||||
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
package eu.kanade.tachiyomi.data.track.shikomori
 | 
			
		||||
package eu.kanade.tachiyomi.data.track.shikimori
 | 
			
		||||
 | 
			
		||||
import android.net.Uri
 | 
			
		||||
import com.github.salomonbrys.kotson.array
 | 
			
		||||
@@ -18,7 +18,7 @@ import okhttp3.*
 | 
			
		||||
import rx.Observable
 | 
			
		||||
import uy.kohesive.injekt.injectLazy
 | 
			
		||||
 | 
			
		||||
class ShikomoriApi(private val client: OkHttpClient, interceptor: ShikomoriInterceptor) {
 | 
			
		||||
class ShikimoriApi(private val client: OkHttpClient, interceptor: ShikimoriInterceptor) {
 | 
			
		||||
 | 
			
		||||
    private val gson: Gson by injectLazy()
 | 
			
		||||
    private val parser = JsonParser()
 | 
			
		||||
@@ -33,7 +33,7 @@ class ShikomoriApi(private val client: OkHttpClient, interceptor: ShikomoriInter
 | 
			
		||||
                        "target_type" to "Manga",
 | 
			
		||||
                        "chapters" to track.last_chapter_read,
 | 
			
		||||
                        "score" to track.score.toInt(),
 | 
			
		||||
                        "status" to track.toShikomoriStatus()
 | 
			
		||||
                        "status" to track.toShikimoriStatus()
 | 
			
		||||
                )
 | 
			
		||||
        )
 | 
			
		||||
        val body = RequestBody.create(jsonime, payload.toString())
 | 
			
		||||
@@ -74,7 +74,7 @@ class ShikomoriApi(private val client: OkHttpClient, interceptor: ShikomoriInter
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private fun jsonToSearch(obj: JsonObject): TrackSearch {
 | 
			
		||||
        return TrackSearch.create(TrackManager.SHIKOMORI).apply {
 | 
			
		||||
        return TrackSearch.create(TrackManager.SHIKIMORI).apply {
 | 
			
		||||
            media_id = obj["id"].asInt
 | 
			
		||||
            title = obj["name"].asString
 | 
			
		||||
            total_chapters = obj["chapters"].asInt
 | 
			
		||||
@@ -87,14 +87,15 @@ class ShikomoriApi(private val client: OkHttpClient, interceptor: ShikomoriInter
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private fun jsonToTrack(obj: JsonObject): Track {
 | 
			
		||||
        return Track.create(TrackManager.SHIKOMORI).apply {
 | 
			
		||||
    private fun jsonToTrack(obj: JsonObject, mangas: JsonObject): Track {
 | 
			
		||||
        return Track.create(TrackManager.SHIKIMORI).apply {
 | 
			
		||||
            title = mangas["name"].asString
 | 
			
		||||
            media_id = obj["id"].asInt
 | 
			
		||||
            title = ""
 | 
			
		||||
            total_chapters = mangas["chapters"].asInt
 | 
			
		||||
            last_chapter_read = obj["chapters"].asInt
 | 
			
		||||
            total_chapters = obj["chapters"].asInt
 | 
			
		||||
            score = (obj["score"].asInt).toFloat()
 | 
			
		||||
            status = toTrackStatus(obj["status"].asString)
 | 
			
		||||
            tracking_url = baseUrl + mangas["url"].asString
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -108,21 +109,36 @@ class ShikomoriApi(private val client: OkHttpClient, interceptor: ShikomoriInter
 | 
			
		||||
                .url(url.toString())
 | 
			
		||||
                .get()
 | 
			
		||||
                .build()
 | 
			
		||||
        return authClient.newCall(request)
 | 
			
		||||
 | 
			
		||||
        val urlMangas = Uri.parse("$apiUrl/mangas").buildUpon()
 | 
			
		||||
                .appendPath(track.media_id.toString())
 | 
			
		||||
                .build()
 | 
			
		||||
        val requestMangas = Request.Builder()
 | 
			
		||||
                .url(urlMangas.toString())
 | 
			
		||||
                .get()
 | 
			
		||||
                .build()
 | 
			
		||||
        return authClient.newCall(requestMangas)
 | 
			
		||||
                .asObservableSuccess()
 | 
			
		||||
                .map { netResponse ->
 | 
			
		||||
                    val responseBody = netResponse.body()?.string().orEmpty()
 | 
			
		||||
                    if (responseBody.isEmpty()) {
 | 
			
		||||
                        throw Exception("Null Response")
 | 
			
		||||
                    }
 | 
			
		||||
                    val response = parser.parse(responseBody).array
 | 
			
		||||
                    if (response.size() > 1) {
 | 
			
		||||
                        throw Exception("Too much mangas in response")
 | 
			
		||||
                    }
 | 
			
		||||
                    val entry = response.map {
 | 
			
		||||
                        jsonToTrack(it.obj)
 | 
			
		||||
                    }
 | 
			
		||||
                    entry.firstOrNull()
 | 
			
		||||
                    parser.parse(responseBody).obj
 | 
			
		||||
                }.flatMap { mangas ->
 | 
			
		||||
                    authClient.newCall(request)
 | 
			
		||||
                            .asObservableSuccess()
 | 
			
		||||
                            .map { netResponse ->
 | 
			
		||||
                                val responseBody = netResponse.body()?.string().orEmpty()
 | 
			
		||||
                                if (responseBody.isEmpty()) {
 | 
			
		||||
                                    throw Exception("Null Response")
 | 
			
		||||
                                }
 | 
			
		||||
                                val response = parser.parse(responseBody).array
 | 
			
		||||
                                if (response.size() > 1) {
 | 
			
		||||
                                    throw Exception("Too much mangas in response")
 | 
			
		||||
                                }
 | 
			
		||||
                                val entry = response.map {
 | 
			
		||||
                                    jsonToTrack(it.obj, mangas)
 | 
			
		||||
                                }
 | 
			
		||||
                                entry.firstOrNull()
 | 
			
		||||
                            }
 | 
			
		||||
                }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -1,26 +1,26 @@
 | 
			
		||||
package eu.kanade.tachiyomi.data.track.shikomori
 | 
			
		||||
package eu.kanade.tachiyomi.data.track.shikimori
 | 
			
		||||
 | 
			
		||||
import com.google.gson.Gson
 | 
			
		||||
import okhttp3.Interceptor
 | 
			
		||||
import okhttp3.Response
 | 
			
		||||
 | 
			
		||||
class ShikomoriInterceptor(val shikomori: Shikomori, val gson: Gson) : Interceptor {
 | 
			
		||||
class ShikimoriInterceptor(val shikimori: Shikimori, val gson: Gson) : Interceptor {
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * OAuth object used for authenticated requests.
 | 
			
		||||
     */
 | 
			
		||||
    private var oauth: OAuth? = shikomori.restoreToken()
 | 
			
		||||
    private var oauth: OAuth? = shikimori.restoreToken()
 | 
			
		||||
 | 
			
		||||
    override fun intercept(chain: Interceptor.Chain): Response {
 | 
			
		||||
        val originalRequest = chain.request()
 | 
			
		||||
 | 
			
		||||
        val currAuth = oauth ?: throw Exception("Not authenticated with Shikomori")
 | 
			
		||||
        val currAuth = oauth ?: throw Exception("Not authenticated with Shikimori")
 | 
			
		||||
 | 
			
		||||
        val refreshToken = currAuth.refresh_token!!
 | 
			
		||||
 | 
			
		||||
        // Refresh access token if expired.
 | 
			
		||||
        if (currAuth.isExpired()) {
 | 
			
		||||
            val response = chain.proceed(ShikomoriApi.refreshTokenRequest(refreshToken))
 | 
			
		||||
            val response = chain.proceed(ShikimoriApi.refreshTokenRequest(refreshToken))
 | 
			
		||||
            if (response.isSuccessful) {
 | 
			
		||||
                newAuth(gson.fromJson(response.body()!!.string(), OAuth::class.java))
 | 
			
		||||
            } else {
 | 
			
		||||
@@ -38,6 +38,6 @@ class ShikomoriInterceptor(val shikomori: Shikomori, val gson: Gson) : Intercept
 | 
			
		||||
 | 
			
		||||
    fun newAuth(oauth: OAuth?) {
 | 
			
		||||
        this.oauth = oauth
 | 
			
		||||
        shikomori.saveToken(oauth)
 | 
			
		||||
        shikimori.saveToken(oauth)
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,24 @@
 | 
			
		||||
package eu.kanade.tachiyomi.data.track.shikimori
 | 
			
		||||
 | 
			
		||||
import eu.kanade.tachiyomi.data.database.models.Track
 | 
			
		||||
 | 
			
		||||
fun Track.toShikimoriStatus() = when (status) {
 | 
			
		||||
    Shikimori.READING -> "watching"
 | 
			
		||||
    Shikimori.COMPLETED -> "completed"
 | 
			
		||||
    Shikimori.ON_HOLD -> "on_hold"
 | 
			
		||||
    Shikimori.DROPPED -> "dropped"
 | 
			
		||||
    Shikimori.PLANNING -> "planned"
 | 
			
		||||
    Shikimori.REPEATING -> "rewatching"
 | 
			
		||||
    else -> throw NotImplementedError("Unknown status")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fun toTrackStatus(status: String) = when (status) {
 | 
			
		||||
    "watching" -> Shikimori.READING
 | 
			
		||||
    "completed" -> Shikimori.COMPLETED
 | 
			
		||||
    "on_hold" -> Shikimori.ON_HOLD
 | 
			
		||||
    "dropped" -> Shikimori.DROPPED
 | 
			
		||||
    "planned" -> Shikimori.PLANNING
 | 
			
		||||
    "rewatching" -> Shikimori.REPEATING
 | 
			
		||||
 | 
			
		||||
    else -> throw Exception("Unknown status")
 | 
			
		||||
}
 | 
			
		||||
@@ -1,24 +0,0 @@
 | 
			
		||||
package eu.kanade.tachiyomi.data.track.shikomori
 | 
			
		||||
 | 
			
		||||
import eu.kanade.tachiyomi.data.database.models.Track
 | 
			
		||||
 | 
			
		||||
fun Track.toShikomoriStatus() = when (status) {
 | 
			
		||||
    Shikomori.READING -> "watching"
 | 
			
		||||
    Shikomori.COMPLETED -> "completed"
 | 
			
		||||
    Shikomori.ON_HOLD -> "on_hold"
 | 
			
		||||
    Shikomori.DROPPED -> "dropped"
 | 
			
		||||
    Shikomori.PLANNING -> "planned"
 | 
			
		||||
    Shikomori.REPEATING -> "rewatching"
 | 
			
		||||
    else -> throw NotImplementedError("Unknown status")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fun toTrackStatus(status: String) = when (status) {
 | 
			
		||||
    "watching" -> Shikomori.READING
 | 
			
		||||
    "completed" -> Shikomori.COMPLETED
 | 
			
		||||
    "on_hold" -> Shikomori.ON_HOLD
 | 
			
		||||
    "dropped" -> Shikomori.DROPPED
 | 
			
		||||
    "planned" -> Shikomori.PLANNING
 | 
			
		||||
    "rewatching" -> Shikomori.REPEATING
 | 
			
		||||
 | 
			
		||||
    else -> throw Exception("Unknown status")
 | 
			
		||||
}
 | 
			
		||||
@@ -8,7 +8,7 @@ import eu.kanade.tachiyomi.R
 | 
			
		||||
import eu.kanade.tachiyomi.data.track.TrackManager
 | 
			
		||||
import eu.kanade.tachiyomi.data.track.TrackService
 | 
			
		||||
import eu.kanade.tachiyomi.data.track.anilist.AnilistApi
 | 
			
		||||
import eu.kanade.tachiyomi.data.track.shikomori.ShikomoriApi
 | 
			
		||||
import eu.kanade.tachiyomi.data.track.shikimori.ShikimoriApi
 | 
			
		||||
import eu.kanade.tachiyomi.util.getResourceColor
 | 
			
		||||
import eu.kanade.tachiyomi.widget.preference.LoginPreference
 | 
			
		||||
import eu.kanade.tachiyomi.widget.preference.TrackLoginDialog
 | 
			
		||||
@@ -54,13 +54,13 @@ class SettingsTrackingController : SettingsController(),
 | 
			
		||||
                    dialog.showDialog(router)
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            trackPreference(trackManager.shikomori) {
 | 
			
		||||
            trackPreference(trackManager.shikimori) {
 | 
			
		||||
                onClick {
 | 
			
		||||
                    val tabsIntent = CustomTabsIntent.Builder()
 | 
			
		||||
                            .setToolbarColor(context.getResourceColor(R.attr.colorPrimary))
 | 
			
		||||
                            .build()
 | 
			
		||||
                    tabsIntent.intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY)
 | 
			
		||||
                    tabsIntent.launchUrl(activity, ShikomoriApi.authUrl())
 | 
			
		||||
                    tabsIntent.launchUrl(activity, ShikimoriApi.authUrl())
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
@@ -80,7 +80,7 @@ class SettingsTrackingController : SettingsController(),
 | 
			
		||||
        super.onActivityResumed(activity)
 | 
			
		||||
        // Manually refresh anilist holder
 | 
			
		||||
        updatePreference(trackManager.aniList.id)
 | 
			
		||||
        updatePreference(trackManager.shikomori.id)
 | 
			
		||||
        updatePreference(trackManager.shikimori.id)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private fun updatePreference(id: Int) {
 | 
			
		||||
 
 | 
			
		||||
@@ -13,7 +13,7 @@ import rx.android.schedulers.AndroidSchedulers
 | 
			
		||||
import rx.schedulers.Schedulers
 | 
			
		||||
import uy.kohesive.injekt.injectLazy
 | 
			
		||||
 | 
			
		||||
class ShikomoriLoginActivity : AppCompatActivity() {
 | 
			
		||||
class ShikimoriLoginActivity : AppCompatActivity() {
 | 
			
		||||
 | 
			
		||||
    private val trackManager: TrackManager by injectLazy()
 | 
			
		||||
 | 
			
		||||
@@ -25,7 +25,7 @@ class ShikomoriLoginActivity : AppCompatActivity() {
 | 
			
		||||
 | 
			
		||||
        val code = intent.data?.getQueryParameter("code")
 | 
			
		||||
        if (code != null) {
 | 
			
		||||
            trackManager.shikomori.login(code)
 | 
			
		||||
            trackManager.shikimori.login(code)
 | 
			
		||||
                    .subscribeOn(Schedulers.io())
 | 
			
		||||
                    .observeOn(AndroidSchedulers.mainThread())
 | 
			
		||||
                    .subscribe({
 | 
			
		||||
@@ -34,7 +34,7 @@ class ShikomoriLoginActivity : AppCompatActivity() {
 | 
			
		||||
                        returnToSettings()
 | 
			
		||||
                    })
 | 
			
		||||
        } else {
 | 
			
		||||
            trackManager.shikomori.logout()
 | 
			
		||||
            trackManager.shikimori.logout()
 | 
			
		||||
            returnToSettings()
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user