Initial adding of Kitsu scrobbler
parent
78f417ebe1
commit
d5c24cd5c8
@ -0,0 +1,22 @@
|
|||||||
|
package org.koitharu.kotatsu.scrobbling.kitsu.data
|
||||||
|
|
||||||
|
import okhttp3.Authenticator
|
||||||
|
import okhttp3.Request
|
||||||
|
import okhttp3.Response
|
||||||
|
import okhttp3.Route
|
||||||
|
import org.koitharu.kotatsu.scrobbling.common.data.ScrobblerStorage
|
||||||
|
import org.koitharu.kotatsu.scrobbling.common.domain.model.ScrobblerService
|
||||||
|
import org.koitharu.kotatsu.scrobbling.common.domain.model.ScrobblerType
|
||||||
|
import javax.inject.Inject
|
||||||
|
import javax.inject.Provider
|
||||||
|
|
||||||
|
class KitsuAuthenticator @Inject constructor(
|
||||||
|
@ScrobblerType(ScrobblerService.KITSU) private val storage: ScrobblerStorage,
|
||||||
|
private val repositoryProvider: Provider<KitsuRepository>,
|
||||||
|
) : Authenticator {
|
||||||
|
|
||||||
|
override fun authenticate(route: Route?, response: Response): Request? {
|
||||||
|
TODO("Not yet implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,25 @@
|
|||||||
|
package org.koitharu.kotatsu.scrobbling.kitsu.data
|
||||||
|
|
||||||
|
import okhttp3.Interceptor
|
||||||
|
import okhttp3.Response
|
||||||
|
import org.koitharu.kotatsu.core.network.CommonHeaders
|
||||||
|
import org.koitharu.kotatsu.scrobbling.common.data.ScrobblerStorage
|
||||||
|
|
||||||
|
private const val JSON = "application/json"
|
||||||
|
|
||||||
|
class KitsuInterceptor(private val storage: ScrobblerStorage) : Interceptor {
|
||||||
|
|
||||||
|
override fun intercept(chain: Interceptor.Chain): Response {
|
||||||
|
val sourceRequest = chain.request()
|
||||||
|
val request = sourceRequest.newBuilder()
|
||||||
|
request.header(CommonHeaders.CONTENT_TYPE, JSON)
|
||||||
|
request.header(CommonHeaders.ACCEPT, JSON)
|
||||||
|
if (!sourceRequest.url.pathSegments.contains("oauth")) {
|
||||||
|
storage.accessToken?.let {
|
||||||
|
request.header(CommonHeaders.AUTHORIZATION, "Bearer $it")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return chain.proceed(request.build())
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,77 @@
|
|||||||
|
package org.koitharu.kotatsu.scrobbling.kitsu.data
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import dagger.hilt.android.qualifiers.ApplicationContext
|
||||||
|
import okhttp3.OkHttpClient
|
||||||
|
import org.koitharu.kotatsu.R
|
||||||
|
import org.koitharu.kotatsu.core.db.MangaDatabase
|
||||||
|
import org.koitharu.kotatsu.parsers.model.MangaChapter
|
||||||
|
import org.koitharu.kotatsu.scrobbling.common.data.ScrobblerRepository
|
||||||
|
import org.koitharu.kotatsu.scrobbling.common.data.ScrobblerStorage
|
||||||
|
import org.koitharu.kotatsu.scrobbling.common.domain.model.ScrobblerManga
|
||||||
|
import org.koitharu.kotatsu.scrobbling.common.domain.model.ScrobblerMangaInfo
|
||||||
|
import org.koitharu.kotatsu.scrobbling.common.domain.model.ScrobblerUser
|
||||||
|
|
||||||
|
private const val BASE_WEB_URL = "https://kitsu.io"
|
||||||
|
|
||||||
|
class KitsuRepository(
|
||||||
|
@ApplicationContext context: Context,
|
||||||
|
private val okHttp: OkHttpClient,
|
||||||
|
private val storage: ScrobblerStorage,
|
||||||
|
private val db: MangaDatabase,
|
||||||
|
) : ScrobblerRepository {
|
||||||
|
|
||||||
|
private val clientId = context.getString(R.string.kitsu_clientId)
|
||||||
|
private val clientSecret = context.getString(R.string.kitsu_clientSecret)
|
||||||
|
|
||||||
|
override val oauthUrl: String
|
||||||
|
get() = "${BASE_WEB_URL}/api/oauth2/token" +
|
||||||
|
"?username=..." + // Get from AlertDialog...
|
||||||
|
"&password=..." + // Get from AlertDialog...
|
||||||
|
"&grant_type=password" +
|
||||||
|
"&client_id=$clientId" +
|
||||||
|
"&client_secret=$clientSecret"
|
||||||
|
|
||||||
|
override val isAuthorized: Boolean
|
||||||
|
get() = TODO("Not yet implemented")
|
||||||
|
|
||||||
|
override val cachedUser: ScrobblerUser?
|
||||||
|
get() = TODO("Not yet implemented")
|
||||||
|
|
||||||
|
override suspend fun authorize(code: String?) {
|
||||||
|
TODO("Not yet implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
override suspend fun loadUser(): ScrobblerUser {
|
||||||
|
TODO("Not yet implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun logout() {
|
||||||
|
TODO("Not yet implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
override suspend fun unregister(mangaId: Long) {
|
||||||
|
TODO("Not yet implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
override suspend fun findManga(query: String, offset: Int): List<ScrobblerManga> {
|
||||||
|
TODO("Not yet implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
override suspend fun getMangaInfo(id: Long): ScrobblerMangaInfo {
|
||||||
|
TODO("Not yet implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
override suspend fun createRate(mangaId: Long, scrobblerMangaId: Long) {
|
||||||
|
TODO("Not yet implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
override suspend fun updateRate(rateId: Int, mangaId: Long, chapter: MangaChapter) {
|
||||||
|
TODO("Not yet implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
override suspend fun updateRate(rateId: Int, mangaId: Long, rating: Float, status: String?, comment: String?) {
|
||||||
|
TODO("Not yet implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,40 @@
|
|||||||
|
package org.koitharu.kotatsu.scrobbling.kitsu.domain
|
||||||
|
|
||||||
|
import org.koitharu.kotatsu.core.db.MangaDatabase
|
||||||
|
import org.koitharu.kotatsu.scrobbling.common.domain.Scrobbler
|
||||||
|
import org.koitharu.kotatsu.scrobbling.common.domain.model.ScrobblerService
|
||||||
|
import org.koitharu.kotatsu.scrobbling.common.domain.model.ScrobblingStatus
|
||||||
|
import org.koitharu.kotatsu.scrobbling.kitsu.data.KitsuRepository
|
||||||
|
import javax.inject.Inject
|
||||||
|
|
||||||
|
class KitsuScrobbler @Inject constructor(
|
||||||
|
private val repository: KitsuRepository,
|
||||||
|
db: MangaDatabase,
|
||||||
|
) : Scrobbler(db, ScrobblerService.KITSU, repository) {
|
||||||
|
|
||||||
|
init {
|
||||||
|
statuses[ScrobblingStatus.PLANNED] = "planned"
|
||||||
|
statuses[ScrobblingStatus.READING] = "current"
|
||||||
|
statuses[ScrobblingStatus.COMPLETED] = "completed"
|
||||||
|
statuses[ScrobblingStatus.ON_HOLD] = "on_hold"
|
||||||
|
statuses[ScrobblingStatus.DROPPED] = "dropped"
|
||||||
|
}
|
||||||
|
|
||||||
|
override suspend fun updateScrobblingInfo(
|
||||||
|
mangaId: Long,
|
||||||
|
rating: Float,
|
||||||
|
status: ScrobblingStatus?,
|
||||||
|
comment: String?
|
||||||
|
) {
|
||||||
|
val entity = db.scrobblingDao.find(scrobblerService.id, mangaId)
|
||||||
|
requireNotNull(entity) { "Scrobbling info for manga $mangaId not found" }
|
||||||
|
repository.updateRate(
|
||||||
|
rateId = entity.id,
|
||||||
|
mangaId = entity.mangaId,
|
||||||
|
rating = rating,
|
||||||
|
status = statuses[status],
|
||||||
|
comment = comment,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue