2021-12-04 19:55:26 +01:00
package org.mosad.teapod.parser.crunchyroll
2021-12-05 00:42:56 +01:00
import android.util.Log
2021-12-04 19:55:26 +01:00
import com.github.kittinunf.fuel.Fuel
import com.github.kittinunf.fuel.core.FuelError
2021-12-05 00:42:56 +01:00
import com.github.kittinunf.fuel.core.Parameters
2021-12-04 19:55:26 +01:00
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 }
2021-12-05 00:42:56 +01:00
object Crunchyroll {
2021-12-04 19:55:26 +01:00
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")
2021-12-05 00:42:56 +01:00
Log . i ( javaClass . name , " login complete with code ${response.statusCode} " )
2021-12-04 19:55:26 +01:00
return @withContext response . statusCode == 200
}
return @runBlocking false
}
// TODO get/post difference
2021-12-05 00:42:56 +01:00
private suspend fun request ( endpoint : String , params : Parameters = listOf ( ) ) : Result < FuelJson , FuelError > = coroutineScope {
2021-12-04 19:55:26 +01:00
return @coroutineScope ( Dispatchers . IO ) {
2021-12-05 00:42:56 +01:00
val ( request , response , result ) = Fuel . get ( " $baseUrl $endpoint " , params )
2021-12-04 19:55:26 +01:00
. header ( " Authorization " , " $tokenType $accessToken " )
. responseJson ( )
// println("request request: $request")
// println("request response: $response")
// println("request result: $result")
result
}
}
// TESTING
2021-12-05 00:42:56 +01:00
// TODO sort_by, default alphabetical, n, locale de-DE, categories
suspend fun browse ( sortBy : SortBy = SortBy . ALPHABETICAL , n : Int = 10 ) : BrowseResult {
2021-12-04 19:55:26 +01:00
val browseEndpoint = " /content/v1/browse "
2021-12-05 00:42:56 +01:00
val parameters = listOf ( " sort_by " to sortBy . str , " n " to n )
2021-12-04 19:55:26 +01:00
2021-12-05 00:42:56 +01:00
val result = request ( browseEndpoint , parameters )
2021-12-04 19:55:26 +01:00
2021-12-05 00:42:56 +01:00
// val browseResult = json.decodeFromString<BrowseResult>(result.component1()?.obj()?.toString()!!)
// println(browseResult.items.size)
2021-12-04 19:55:26 +01:00
2021-12-05 00:42:56 +01:00
return json . decodeFromString < BrowseResult > ( result . component1 ( ) ?. obj ( ) ?. toString ( ) !! )
2021-12-04 19:55:26 +01:00
}
2021-12-05 00:42:56 +01:00
// TODO
2021-12-04 19:55:26 +01:00
suspend fun search ( ) {
val searchEndpoint = " /content/v1/search "
2021-12-05 00:42:56 +01:00
val result = request ( searchEndpoint )
2021-12-04 19:55:26 +01:00
println ( " ${result.component1()?.obj()?.get("total")} " )
2021-12-05 00:42:56 +01:00
val test = json . decodeFromString < BrowseResult > ( result . component1 ( ) ?. obj ( ) ?. toString ( ) !! )
println ( test . items . size )
2021-12-04 19:55:26 +01:00
}
}