mirror of
https://github.com/aniyomiorg/aniyomi.git
synced 2024-11-28 17:19:00 +03:00
Shikomori -> Shikimori. Fix update chapters (#1996)
* Shikomori -> Shikimori. Fix update chapters * Removed logs and format code
This commit is contained in:
parent
7c6478fe6b
commit
5840a3e1e2
11 changed files with 87 additions and 70 deletions
|
@ -62,8 +62,8 @@
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
</activity>
|
</activity>
|
||||||
<activity
|
<activity
|
||||||
android:name=".ui.setting.ShikomoriLoginActivity"
|
android:name=".ui.setting.ShikimoriLoginActivity"
|
||||||
android:label="Shikomori">
|
android:label="Shikimori">
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.intent.action.VIEW" />
|
<action android:name="android.intent.action.VIEW" />
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,7 @@ import android.content.Context
|
||||||
import eu.kanade.tachiyomi.data.track.anilist.Anilist
|
import eu.kanade.tachiyomi.data.track.anilist.Anilist
|
||||||
import eu.kanade.tachiyomi.data.track.kitsu.Kitsu
|
import eu.kanade.tachiyomi.data.track.kitsu.Kitsu
|
||||||
import eu.kanade.tachiyomi.data.track.myanimelist.Myanimelist
|
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) {
|
class TrackManager(private val context: Context) {
|
||||||
|
|
||||||
|
@ -12,7 +12,7 @@ class TrackManager(private val context: Context) {
|
||||||
const val MYANIMELIST = 1
|
const val MYANIMELIST = 1
|
||||||
const val ANILIST = 2
|
const val ANILIST = 2
|
||||||
const val KITSU = 3
|
const val KITSU = 3
|
||||||
const val SHIKOMORI = 4
|
const val SHIKIMORI = 4
|
||||||
}
|
}
|
||||||
|
|
||||||
val myAnimeList = Myanimelist(context, MYANIMELIST)
|
val myAnimeList = Myanimelist(context, MYANIMELIST)
|
||||||
|
@ -21,9 +21,9 @@ class TrackManager(private val context: Context) {
|
||||||
|
|
||||||
val kitsu = Kitsu(context, KITSU)
|
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 }
|
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(
|
data class OAuth(
|
||||||
val access_token: String,
|
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.content.Context
|
||||||
import android.graphics.Color
|
import android.graphics.Color
|
||||||
|
import android.util.Log
|
||||||
import com.google.gson.Gson
|
import com.google.gson.Gson
|
||||||
import eu.kanade.tachiyomi.R
|
import eu.kanade.tachiyomi.R
|
||||||
import eu.kanade.tachiyomi.data.database.models.Track
|
import eu.kanade.tachiyomi.data.database.models.Track
|
||||||
|
@ -11,7 +12,7 @@ import rx.Completable
|
||||||
import rx.Observable
|
import rx.Observable
|
||||||
import uy.kohesive.injekt.injectLazy
|
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> {
|
override fun getScoreList(): List<String> {
|
||||||
return IntRange(0, 10).map(Int::toString)
|
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
|
const val DEFAULT_SCORE = 0
|
||||||
}
|
}
|
||||||
|
|
||||||
override val name = "Shikomori"
|
override val name = "Shikimori"
|
||||||
|
|
||||||
private val gson: Gson by injectLazy()
|
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)
|
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 android.net.Uri
|
||||||
import com.github.salomonbrys.kotson.array
|
import com.github.salomonbrys.kotson.array
|
||||||
|
@ -18,7 +18,7 @@ import okhttp3.*
|
||||||
import rx.Observable
|
import rx.Observable
|
||||||
import uy.kohesive.injekt.injectLazy
|
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 gson: Gson by injectLazy()
|
||||||
private val parser = JsonParser()
|
private val parser = JsonParser()
|
||||||
|
@ -33,7 +33,7 @@ class ShikomoriApi(private val client: OkHttpClient, interceptor: ShikomoriInter
|
||||||
"target_type" to "Manga",
|
"target_type" to "Manga",
|
||||||
"chapters" to track.last_chapter_read,
|
"chapters" to track.last_chapter_read,
|
||||||
"score" to track.score.toInt(),
|
"score" to track.score.toInt(),
|
||||||
"status" to track.toShikomoriStatus()
|
"status" to track.toShikimoriStatus()
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
val body = RequestBody.create(jsonime, payload.toString())
|
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 {
|
private fun jsonToSearch(obj: JsonObject): TrackSearch {
|
||||||
return TrackSearch.create(TrackManager.SHIKOMORI).apply {
|
return TrackSearch.create(TrackManager.SHIKIMORI).apply {
|
||||||
media_id = obj["id"].asInt
|
media_id = obj["id"].asInt
|
||||||
title = obj["name"].asString
|
title = obj["name"].asString
|
||||||
total_chapters = obj["chapters"].asInt
|
total_chapters = obj["chapters"].asInt
|
||||||
|
@ -87,14 +87,15 @@ class ShikomoriApi(private val client: OkHttpClient, interceptor: ShikomoriInter
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun jsonToTrack(obj: JsonObject): Track {
|
private fun jsonToTrack(obj: JsonObject, mangas: JsonObject): Track {
|
||||||
return Track.create(TrackManager.SHIKOMORI).apply {
|
return Track.create(TrackManager.SHIKIMORI).apply {
|
||||||
|
title = mangas["name"].asString
|
||||||
media_id = obj["id"].asInt
|
media_id = obj["id"].asInt
|
||||||
title = ""
|
total_chapters = mangas["chapters"].asInt
|
||||||
last_chapter_read = obj["chapters"].asInt
|
last_chapter_read = obj["chapters"].asInt
|
||||||
total_chapters = obj["chapters"].asInt
|
|
||||||
score = (obj["score"].asInt).toFloat()
|
score = (obj["score"].asInt).toFloat()
|
||||||
status = toTrackStatus(obj["status"].asString)
|
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())
|
.url(url.toString())
|
||||||
.get()
|
.get()
|
||||||
.build()
|
.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()
|
.asObservableSuccess()
|
||||||
.map { netResponse ->
|
.map { netResponse ->
|
||||||
val responseBody = netResponse.body()?.string().orEmpty()
|
val responseBody = netResponse.body()?.string().orEmpty()
|
||||||
if (responseBody.isEmpty()) {
|
parser.parse(responseBody).obj
|
||||||
throw Exception("Null Response")
|
}.flatMap { mangas ->
|
||||||
}
|
authClient.newCall(request)
|
||||||
val response = parser.parse(responseBody).array
|
.asObservableSuccess()
|
||||||
if (response.size() > 1) {
|
.map { netResponse ->
|
||||||
throw Exception("Too much mangas in response")
|
val responseBody = netResponse.body()?.string().orEmpty()
|
||||||
}
|
if (responseBody.isEmpty()) {
|
||||||
val entry = response.map {
|
throw Exception("Null Response")
|
||||||
jsonToTrack(it.obj)
|
}
|
||||||
}
|
val response = parser.parse(responseBody).array
|
||||||
entry.firstOrNull()
|
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 com.google.gson.Gson
|
||||||
import okhttp3.Interceptor
|
import okhttp3.Interceptor
|
||||||
import okhttp3.Response
|
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.
|
* 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 {
|
override fun intercept(chain: Interceptor.Chain): Response {
|
||||||
val originalRequest = chain.request()
|
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!!
|
val refreshToken = currAuth.refresh_token!!
|
||||||
|
|
||||||
// Refresh access token if expired.
|
// Refresh access token if expired.
|
||||||
if (currAuth.isExpired()) {
|
if (currAuth.isExpired()) {
|
||||||
val response = chain.proceed(ShikomoriApi.refreshTokenRequest(refreshToken))
|
val response = chain.proceed(ShikimoriApi.refreshTokenRequest(refreshToken))
|
||||||
if (response.isSuccessful) {
|
if (response.isSuccessful) {
|
||||||
newAuth(gson.fromJson(response.body()!!.string(), OAuth::class.java))
|
newAuth(gson.fromJson(response.body()!!.string(), OAuth::class.java))
|
||||||
} else {
|
} else {
|
||||||
|
@ -38,6 +38,6 @@ class ShikomoriInterceptor(val shikomori: Shikomori, val gson: Gson) : Intercept
|
||||||
|
|
||||||
fun newAuth(oauth: OAuth?) {
|
fun newAuth(oauth: OAuth?) {
|
||||||
this.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.TrackManager
|
||||||
import eu.kanade.tachiyomi.data.track.TrackService
|
import eu.kanade.tachiyomi.data.track.TrackService
|
||||||
import eu.kanade.tachiyomi.data.track.anilist.AnilistApi
|
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.util.getResourceColor
|
||||||
import eu.kanade.tachiyomi.widget.preference.LoginPreference
|
import eu.kanade.tachiyomi.widget.preference.LoginPreference
|
||||||
import eu.kanade.tachiyomi.widget.preference.TrackLoginDialog
|
import eu.kanade.tachiyomi.widget.preference.TrackLoginDialog
|
||||||
|
@ -54,13 +54,13 @@ class SettingsTrackingController : SettingsController(),
|
||||||
dialog.showDialog(router)
|
dialog.showDialog(router)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
trackPreference(trackManager.shikomori) {
|
trackPreference(trackManager.shikimori) {
|
||||||
onClick {
|
onClick {
|
||||||
val tabsIntent = CustomTabsIntent.Builder()
|
val tabsIntent = CustomTabsIntent.Builder()
|
||||||
.setToolbarColor(context.getResourceColor(R.attr.colorPrimary))
|
.setToolbarColor(context.getResourceColor(R.attr.colorPrimary))
|
||||||
.build()
|
.build()
|
||||||
tabsIntent.intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY)
|
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)
|
super.onActivityResumed(activity)
|
||||||
// Manually refresh anilist holder
|
// Manually refresh anilist holder
|
||||||
updatePreference(trackManager.aniList.id)
|
updatePreference(trackManager.aniList.id)
|
||||||
updatePreference(trackManager.shikomori.id)
|
updatePreference(trackManager.shikimori.id)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun updatePreference(id: Int) {
|
private fun updatePreference(id: Int) {
|
||||||
|
|
|
@ -13,7 +13,7 @@ import rx.android.schedulers.AndroidSchedulers
|
||||||
import rx.schedulers.Schedulers
|
import rx.schedulers.Schedulers
|
||||||
import uy.kohesive.injekt.injectLazy
|
import uy.kohesive.injekt.injectLazy
|
||||||
|
|
||||||
class ShikomoriLoginActivity : AppCompatActivity() {
|
class ShikimoriLoginActivity : AppCompatActivity() {
|
||||||
|
|
||||||
private val trackManager: TrackManager by injectLazy()
|
private val trackManager: TrackManager by injectLazy()
|
||||||
|
|
||||||
|
@ -25,7 +25,7 @@ class ShikomoriLoginActivity : AppCompatActivity() {
|
||||||
|
|
||||||
val code = intent.data?.getQueryParameter("code")
|
val code = intent.data?.getQueryParameter("code")
|
||||||
if (code != null) {
|
if (code != null) {
|
||||||
trackManager.shikomori.login(code)
|
trackManager.shikimori.login(code)
|
||||||
.subscribeOn(Schedulers.io())
|
.subscribeOn(Schedulers.io())
|
||||||
.observeOn(AndroidSchedulers.mainThread())
|
.observeOn(AndroidSchedulers.mainThread())
|
||||||
.subscribe({
|
.subscribe({
|
||||||
|
@ -34,7 +34,7 @@ class ShikomoriLoginActivity : AppCompatActivity() {
|
||||||
returnToSettings()
|
returnToSettings()
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
trackManager.shikomori.logout()
|
trackManager.shikimori.logout()
|
||||||
returnToSettings()
|
returnToSettings()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Before Width: | Height: | Size: 8.6 KiB After Width: | Height: | Size: 8.6 KiB |
Loading…
Reference in a new issue