teapod/app/src/main/java/org/mosad/teapod/parser/crunchyroll/Cruncyroll.kt

105 lines
3.1 KiB
Kotlin

package org.mosad.teapod.parser.crunchyroll
import com.github.kittinunf.fuel.Fuel
import com.github.kittinunf.fuel.core.FuelError
import com.github.kittinunf.fuel.json.FuelJson
import com.github.kittinunf.fuel.json.responseJson
import com.github.kittinunf.result.Result
import kotlinx.coroutines.*
import kotlinx.serialization.Serializable
import kotlinx.serialization.decodeFromString
import kotlinx.serialization.json.Json
private val json = Json { ignoreUnknownKeys = true }
class Cruncyroll {
private val baseUrl = "https://beta-api.crunchyroll.com"
private var accessToken = ""
private var tokenType = ""
fun login(username: String, password: String): Boolean = runBlocking {
val tokenEndpoint = "/auth/v1/token"
val formData = listOf(
"username" to username,
"password" to password,
"grant_type" to "password",
"scope" to "offline_access"
)
withContext(Dispatchers.IO) {
val (request, response, result) = Fuel.post("$baseUrl$tokenEndpoint", parameters = formData)
.header("Content-Type", "application/x-www-form-urlencoded")
.appendHeader(
"Authorization",
"Basic "
)
.responseJson()
result.component1()?.obj()?.let {
accessToken = it.get("access_token").toString()
tokenType = it.get("token_type").toString()
}
// println("request: $request")
// println("response: $response")
// println("response: $result")
println("login complete with code ${response.statusCode}")
return@withContext response.statusCode == 200
}
return@runBlocking false
}
// TODO get/post difference
private suspend fun requestA(endpoint: String): Result<FuelJson, FuelError> = coroutineScope {
return@coroutineScope (Dispatchers.IO) {
val (request, response, result) = Fuel.get("$baseUrl$endpoint")
.header("Authorization", "$tokenType $accessToken")
.responseJson()
// println("request request: $request")
// println("request response: $response")
// println("request result: $result")
result
}
}
// TESTING
@Serializable
data class Test(val total: Int, val items: List<Item>)
@Serializable
data class Item(val channel_id: String, val description: String)
// TODO sort_by, default alphabetical, n, locale de-DE
suspend fun browse() {
val browseEndpoint = "/content/v1/browse"
val result = requestA(browseEndpoint)
println("${result.component1()?.obj()?.get("total")}")
val test = json.decodeFromString<Test>(result.component1()?.obj()?.toString()!!)
println(test)
}
suspend fun search() {
val searchEndpoint = "/content/v1/search"
val result = requestA(searchEndpoint)
println("${result.component1()?.obj()?.get("total")}")
val test = json.decodeFromString<Test>(result.component1()?.obj()?.toString()!!)
println(test)
}
}