2020-10-12 20:30:45 +02:00
package org.mosad.teapod.util
import android.util.Log
2020-10-12 22:43:42 +02:00
import com.google.gson.JsonObject
2020-10-12 20:30:45 +02:00
import com.google.gson.JsonParser
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.async
import kotlinx.coroutines.runBlocking
import java.net.URL
import java.net.URLEncoder
import org.mosad.teapod.util.DataTypes.MediaType
class TMDBApiController {
private val apiUrl = " https://api.themoviedb.org/3 "
private val searchMovieUrl = " $apiUrl /search/movie "
private val searchTVUrl = " $apiUrl /search/tv "
private val apiKey = " de959cf9c07a08b5ca7cb51cda9a40c2 "
private val language = " de "
2020-10-12 22:43:42 +02:00
private val preparedParameters = " ?api_key= $apiKey &language= $language "
2020-10-12 20:30:45 +02:00
private val imageUrl = " https://image.tmdb.org/t/p/w500 "
fun search ( title : String , type : MediaType ) : TMDBResponse {
2020-10-12 22:43:42 +02:00
val searchTerm = title . replace ( " (Sub) " , " " ) . trim ( )
2020-10-12 20:30:45 +02:00
return when ( type ) {
2020-10-12 22:43:42 +02:00
MediaType . MOVIE -> searchMovie ( searchTerm )
MediaType . TVSHOW -> searchTVShow ( searchTerm )
else -> {
Log . e ( javaClass . name , " Wrong Type: $type " )
2020-10-12 20:30:45 +02:00
TMDBResponse ( )
}
}
}
fun searchTVShow ( title : String ) = runBlocking {
2020-10-12 22:43:42 +02:00
val url = URL ( " $searchTVUrl $preparedParameters &query= ${URLEncoder.encode(title, "UTF-8")} " )
2020-10-12 20:30:45 +02:00
GlobalScope . async {
val response = JsonParser . parseString ( url . readText ( ) ) . asJsonObject
2020-10-12 22:43:42 +02:00
//println(response)
2020-10-12 20:30:45 +02:00
return @async if ( response . get ( " total_results " ) . asInt > 0 ) {
2020-10-12 22:43:42 +02:00
response . get ( " results " ) . asJsonArray . first ( ) . asJsonObject . let {
val overview = getStringNotNull ( it , " overview " )
val posterPath = getStringNotNullPrefix ( it , " poster_path " , imageUrl )
val backdropPath = getStringNotNullPrefix ( it , " backdrop_path " , imageUrl )
2020-10-12 20:30:45 +02:00
TMDBResponse ( " " , overview , posterPath , backdropPath )
}
} else {
TMDBResponse ( )
}
} . await ( )
}
fun searchMovie ( title : String ) = runBlocking {
2020-10-12 22:43:42 +02:00
val url = URL ( " $searchMovieUrl $preparedParameters &query= ${URLEncoder.encode(title, "UTF-8")} " )
2020-10-12 20:30:45 +02:00
GlobalScope . async {
val response = JsonParser . parseString ( url . readText ( ) ) . asJsonObject
2020-10-12 22:43:42 +02:00
//println(response)
2020-10-12 20:30:45 +02:00
return @async if ( response . get ( " total_results " ) . asInt > 0 ) {
2020-10-12 22:43:42 +02:00
response . get ( " results " ) . asJsonArray . first ( ) . asJsonObject . let {
val overview = getStringNotNull ( it , " overview " )
val posterPath = getStringNotNullPrefix ( it , " poster_path " , imageUrl )
val backdropPath = getStringNotNullPrefix ( it , " backdrop_path " , imageUrl )
2020-10-12 20:30:45 +02:00
TMDBResponse ( " " , overview , posterPath , backdropPath )
}
} else {
TMDBResponse ( )
}
} . await ( )
}
2020-10-12 22:43:42 +02:00
/ * *
* return memberName as string if it ' s not JsonNull ,
* else return an empty string
* /
private fun getStringNotNull ( jsonObject : JsonObject , memberName : String ) : String {
return getStringNotNullPrefix ( jsonObject , memberName , " " )
}
/ * *
* return memberName as string with a prefix if it ' s not JsonNull ,
* else return an empty string
* /
private fun getStringNotNullPrefix ( jsonObject : JsonObject , memberName : String , prefix : String ) : String {
return if ( ! jsonObject . get ( memberName ) . isJsonNull ) {
prefix + jsonObject . get ( memberName ) . asString
} else {
" "
}
}
2020-10-12 20:30:45 +02:00
}