|
|
|
@ -5,7 +5,7 @@ import androidx.core.net.toUri
|
|
|
|
|
import eu.kanade.tachiyomi.data.database.models.Track
|
|
|
|
|
import eu.kanade.tachiyomi.data.track.model.TrackSearch
|
|
|
|
|
import eu.kanade.tachiyomi.network.POST
|
|
|
|
|
import eu.kanade.tachiyomi.network.asObservableSuccess
|
|
|
|
|
import eu.kanade.tachiyomi.network.await
|
|
|
|
|
import kotlinx.serialization.decodeFromString
|
|
|
|
|
import kotlinx.serialization.json.Json
|
|
|
|
|
import kotlinx.serialization.json.JsonObject
|
|
|
|
@ -22,7 +22,6 @@ import kotlinx.serialization.json.putJsonObject
|
|
|
|
|
import okhttp3.MediaType.Companion.toMediaType
|
|
|
|
|
import okhttp3.OkHttpClient
|
|
|
|
|
import okhttp3.RequestBody.Companion.toRequestBody
|
|
|
|
|
import rx.Observable
|
|
|
|
|
import uy.kohesive.injekt.injectLazy
|
|
|
|
|
import java.util.Calendar
|
|
|
|
|
|
|
|
|
@ -33,7 +32,7 @@ class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) {
|
|
|
|
|
private val jsonMime = "application/json; charset=utf-8".toMediaType()
|
|
|
|
|
private val authClient = client.newBuilder().addInterceptor(interceptor).build()
|
|
|
|
|
|
|
|
|
|
fun addLibManga(track: Track): Observable<Track> {
|
|
|
|
|
suspend fun addLibManga(track: Track): Track {
|
|
|
|
|
val query =
|
|
|
|
|
"""
|
|
|
|
|
|mutation AddManga(${'$'}mangaId: Int, ${'$'}progress: Int, ${'$'}status: MediaListStatus) {
|
|
|
|
@ -51,22 +50,18 @@ class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) {
|
|
|
|
|
put("status", track.toAnilistStatus())
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return authClient.newCall(POST(apiUrl, body = payload.toString().toRequestBody(jsonMime)))
|
|
|
|
|
.asObservableSuccess()
|
|
|
|
|
.map { netResponse ->
|
|
|
|
|
netResponse.use {
|
|
|
|
|
val responseBody = it.body?.string().orEmpty()
|
|
|
|
|
if (responseBody.isEmpty()) {
|
|
|
|
|
throw Exception("Null Response")
|
|
|
|
|
}
|
|
|
|
|
val response = json.decodeFromString<JsonObject>(responseBody)
|
|
|
|
|
track.library_id = response["data"]!!.jsonObject["SaveMediaListEntry"]!!.jsonObject["id"]!!.jsonPrimitive.long
|
|
|
|
|
track
|
|
|
|
|
}
|
|
|
|
|
return authClient.newCall(POST(apiUrl, body = payload.toString().toRequestBody(jsonMime))).await().use {
|
|
|
|
|
val responseBody = it.body?.string().orEmpty()
|
|
|
|
|
if (responseBody.isEmpty()) {
|
|
|
|
|
throw Exception("Null Response")
|
|
|
|
|
}
|
|
|
|
|
val response = json.decodeFromString<JsonObject>(responseBody)
|
|
|
|
|
track.library_id = response["data"]!!.jsonObject["SaveMediaListEntry"]!!.jsonObject["id"]!!.jsonPrimitive.long
|
|
|
|
|
track
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fun updateLibManga(track: Track): Observable<Track> {
|
|
|
|
|
suspend fun updateLibManga(track: Track): Track {
|
|
|
|
|
val query =
|
|
|
|
|
"""
|
|
|
|
|
|mutation UpdateManga(${'$'}listId: Int, ${'$'}progress: Int, ${'$'}status: MediaListStatus, ${'$'}score: Int) {
|
|
|
|
@ -86,14 +81,11 @@ class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) {
|
|
|
|
|
put("score", track.score.toInt())
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return authClient.newCall(POST(apiUrl, body = payload.toString().toRequestBody(jsonMime)))
|
|
|
|
|
.asObservableSuccess()
|
|
|
|
|
.map {
|
|
|
|
|
track
|
|
|
|
|
}
|
|
|
|
|
authClient.newCall(POST(apiUrl, body = payload.toString().toRequestBody(jsonMime))).await()
|
|
|
|
|
return track
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fun search(search: String): Observable<List<TrackSearch>> {
|
|
|
|
|
suspend fun search(search: String): List<TrackSearch> {
|
|
|
|
|
val query =
|
|
|
|
|
"""
|
|
|
|
|
|query Search(${'$'}query: String) {
|
|
|
|
@ -125,25 +117,21 @@ class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) {
|
|
|
|
|
put("query", search)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return authClient.newCall(POST(apiUrl, body = payload.toString().toRequestBody(jsonMime)))
|
|
|
|
|
.asObservableSuccess()
|
|
|
|
|
.map { netResponse ->
|
|
|
|
|
netResponse.use {
|
|
|
|
|
val responseBody = it.body?.string().orEmpty()
|
|
|
|
|
if (responseBody.isEmpty()) {
|
|
|
|
|
throw Exception("Null Response")
|
|
|
|
|
}
|
|
|
|
|
val response = json.decodeFromString<JsonObject>(responseBody)
|
|
|
|
|
val data = response["data"]!!.jsonObject
|
|
|
|
|
val page = data["Page"]!!.jsonObject
|
|
|
|
|
val media = page["media"]!!.jsonArray
|
|
|
|
|
val entries = media.map { jsonToALManga(it.jsonObject) }
|
|
|
|
|
entries.map { it.toTrack() }
|
|
|
|
|
}
|
|
|
|
|
return authClient.newCall(POST(apiUrl, body = payload.toString().toRequestBody(jsonMime))).await().use {
|
|
|
|
|
val responseBody = it.body?.string().orEmpty()
|
|
|
|
|
if (responseBody.isEmpty()) {
|
|
|
|
|
throw Exception("Null Response")
|
|
|
|
|
}
|
|
|
|
|
val response = json.decodeFromString<JsonObject>(responseBody)
|
|
|
|
|
val data = response["data"]!!.jsonObject
|
|
|
|
|
val page = data["Page"]!!.jsonObject
|
|
|
|
|
val media = page["media"]!!.jsonArray
|
|
|
|
|
val entries = media.map { jsonToALManga(it.jsonObject) }
|
|
|
|
|
entries.map { it.toTrack() }
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fun findLibManga(track: Track, userid: Int): Observable<Track?> {
|
|
|
|
|
suspend fun findLibManga(track: Track, userid: Int): Track? {
|
|
|
|
|
val query =
|
|
|
|
|
"""
|
|
|
|
|
|query (${'$'}id: Int!, ${'$'}manga_id: Int!) {
|
|
|
|
@ -182,34 +170,29 @@ class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) {
|
|
|
|
|
put("manga_id", track.media_id)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return authClient.newCall(POST(apiUrl, body = payload.toString().toRequestBody(jsonMime)))
|
|
|
|
|
.asObservableSuccess()
|
|
|
|
|
.map { netResponse ->
|
|
|
|
|
netResponse.use {
|
|
|
|
|
val responseBody = it.body?.string().orEmpty()
|
|
|
|
|
if (responseBody.isEmpty()) {
|
|
|
|
|
throw Exception("Null Response")
|
|
|
|
|
}
|
|
|
|
|
val response = json.decodeFromString<JsonObject>(responseBody)
|
|
|
|
|
val data = response["data"]!!.jsonObject
|
|
|
|
|
val page = data["Page"]!!.jsonObject
|
|
|
|
|
val media = page["mediaList"]!!.jsonArray
|
|
|
|
|
val entries = media.map { jsonToALUserManga(it.jsonObject) }
|
|
|
|
|
entries.firstOrNull()?.toTrack()
|
|
|
|
|
}
|
|
|
|
|
return authClient.newCall(POST(apiUrl, body = payload.toString().toRequestBody(jsonMime))).await().use {
|
|
|
|
|
val responseBody = it.body?.string().orEmpty()
|
|
|
|
|
if (responseBody.isEmpty()) {
|
|
|
|
|
throw Exception("Null Response")
|
|
|
|
|
}
|
|
|
|
|
val response = json.decodeFromString<JsonObject>(responseBody)
|
|
|
|
|
val data = response["data"]!!.jsonObject
|
|
|
|
|
val page = data["Page"]!!.jsonObject
|
|
|
|
|
val media = page["mediaList"]!!.jsonArray
|
|
|
|
|
val entries = media.map { jsonToALUserManga(it.jsonObject) }
|
|
|
|
|
entries.firstOrNull()?.toTrack()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fun getLibManga(track: Track, userid: Int): Observable<Track> {
|
|
|
|
|
return findLibManga(track, userid)
|
|
|
|
|
.map { it ?: throw Exception("Could not find manga") }
|
|
|
|
|
suspend fun getLibManga(track: Track, userid: Int): Track {
|
|
|
|
|
return findLibManga(track, userid) ?: throw Exception("Could not find manga")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fun createOAuth(token: String): OAuth {
|
|
|
|
|
return OAuth(token, "Bearer", System.currentTimeMillis() + 31536000000, 31536000000)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fun getCurrentUser(): Observable<Pair<Int, String>> {
|
|
|
|
|
suspend fun getCurrentUser(): Pair<Int, String> {
|
|
|
|
|
val query =
|
|
|
|
|
"""
|
|
|
|
|
|query User {
|
|
|
|
@ -224,23 +207,19 @@ class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) {
|
|
|
|
|
val payload = buildJsonObject {
|
|
|
|
|
put("query", query)
|
|
|
|
|
}
|
|
|
|
|
return authClient.newCall(POST(apiUrl, body = payload.toString().toRequestBody(jsonMime)))
|
|
|
|
|
.asObservableSuccess()
|
|
|
|
|
.map { netResponse ->
|
|
|
|
|
netResponse.use {
|
|
|
|
|
val responseBody = it.body?.string().orEmpty()
|
|
|
|
|
if (responseBody.isEmpty()) {
|
|
|
|
|
throw Exception("Null Response")
|
|
|
|
|
}
|
|
|
|
|
val response = json.decodeFromString<JsonObject>(responseBody)
|
|
|
|
|
val data = response["data"]!!.jsonObject
|
|
|
|
|
val viewer = data["Viewer"]!!.jsonObject
|
|
|
|
|
Pair(
|
|
|
|
|
viewer["id"]!!.jsonPrimitive.int,
|
|
|
|
|
viewer["mediaListOptions"]!!.jsonObject["scoreFormat"]!!.jsonPrimitive.content
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
return authClient.newCall(POST(apiUrl, body = payload.toString().toRequestBody(jsonMime))).await().use {
|
|
|
|
|
val responseBody = it.body?.string().orEmpty()
|
|
|
|
|
if (responseBody.isEmpty()) {
|
|
|
|
|
throw Exception("Null Response")
|
|
|
|
|
}
|
|
|
|
|
val response = json.decodeFromString<JsonObject>(responseBody)
|
|
|
|
|
val data = response["data"]!!.jsonObject
|
|
|
|
|
val viewer = data["Viewer"]!!.jsonObject
|
|
|
|
|
Pair(
|
|
|
|
|
viewer["id"]!!.jsonPrimitive.int,
|
|
|
|
|
viewer["mediaListOptions"]!!.jsonObject["scoreFormat"]!!.jsonPrimitive.content
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private fun jsonToALManga(struct: JsonObject): ALManga {
|
|
|
|
|