diff --git a/app/build.gradle b/app/build.gradle index 26b29f6..d800025 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -56,6 +56,7 @@ dependencies { implementation 'org.jsoup:jsoup:1.13.1' implementation 'com.github.bumptech.glide:glide:4.11.0' + implementation 'jp.wasabeef:glide-transformations:4.3.0' implementation 'com.afollestad.material-dialogs:core:3.3.0' implementation 'com.afollestad.material-dialogs:bottomsheets:3.3.0' implementation 'androidx.legacy:legacy-support-v4:1.0.0' diff --git a/app/src/main/java/org/mosad/teapod/ui/MediaFragment.kt b/app/src/main/java/org/mosad/teapod/ui/MediaFragment.kt index 148bdb5..58a8289 100644 --- a/app/src/main/java/org/mosad/teapod/ui/MediaFragment.kt +++ b/app/src/main/java/org/mosad/teapod/ui/MediaFragment.kt @@ -1,5 +1,8 @@ package org.mosad.teapod.ui +import android.graphics.Color +import android.graphics.drawable.ColorDrawable +import android.graphics.drawable.Drawable import android.os.Bundle import android.util.Log import androidx.fragment.app.Fragment @@ -9,6 +12,8 @@ import android.view.ViewGroup import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import jp.wasabeef.glide.transformations.BlurTransformation import kotlinx.android.synthetic.main.fragment_media.* import org.mosad.teapod.MainActivity import org.mosad.teapod.R @@ -30,17 +35,38 @@ class MediaFragment(private val media: Media, private val tmdb: TMDBResponse) : override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + initGUI() + initActions() + } + + /** + * if tmdb data is present, use it, else use the aod data + */ + private fun initGUI() { // generic gui text_title.text = media.title if (tmdb.posterUrl.isNotEmpty()) { - Glide.with(requireContext()).load(tmdb.posterUrl).into(image_poster) - text_desc.text = tmdb.overview - Log.d(javaClass.name, "TMDB data present") + Glide.with(requireContext()).load(tmdb.backdropUrl) + .apply(RequestOptions.placeholderOf(ColorDrawable(Color.DKGRAY))) + .apply(RequestOptions.bitmapTransform(BlurTransformation(25, 3))) + .into(image_backdrop) } else { - Glide.with(requireContext()).load(media.posterLink).into(image_poster) - text_desc.text = media.shortDesc - Log.d(javaClass.name, "No TMDB data present, using Aod") + Glide.with(requireContext()).load(ColorDrawable(Color.DKGRAY)).into(image_poster) + } + + if (tmdb.posterUrl.isNotEmpty()) { + Glide.with(requireContext()).load(tmdb.posterUrl) + .into(image_poster) + } else { + Glide.with(requireContext()).load(media.posterLink) + .into(image_poster) + } + + text_overview.text = if (tmdb.overview.isNotEmpty()) { + tmdb.overview + } else { + media.shortDesc } // specific gui @@ -55,11 +81,6 @@ class MediaFragment(private val media: Media, private val tmdb: TMDBResponse) : } else if (media.type == MediaType.MOVIE) { recycler_episodes.visibility = View.GONE } - - - println("media streams: ${media.episodes}") - - initActions() } private fun initActions() { @@ -67,7 +88,7 @@ class MediaFragment(private val media: Media, private val tmdb: TMDBResponse) : when (media.type) { MediaType.MOVIE -> playStream(media.episodes.first().streamUrl) MediaType.TVSHOW -> playStream(media.episodes.first().streamUrl) - MediaType.OTHER -> Log.e(javaClass.name, "Wrong Type, please report this issue.") + else -> Log.e(javaClass.name, "Wrong Type: $media.type") } } diff --git a/app/src/main/java/org/mosad/teapod/util/TMDBApiController.kt b/app/src/main/java/org/mosad/teapod/util/TMDBApiController.kt index 0b5ee90..5b44fae 100644 --- a/app/src/main/java/org/mosad/teapod/util/TMDBApiController.kt +++ b/app/src/main/java/org/mosad/teapod/util/TMDBApiController.kt @@ -1,6 +1,7 @@ package org.mosad.teapod.util import android.util.Log +import com.google.gson.JsonObject import com.google.gson.JsonParser import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.async @@ -16,24 +17,18 @@ class TMDBApiController { private val searchTVUrl = "$apiUrl/search/tv" private val apiKey = "de959cf9c07a08b5ca7cb51cda9a40c2" private val language = "de" - private val preparedParamters = "?api_key=$apiKey&language=$language" + private val preparedParameters = "?api_key=$apiKey&language=$language" private val imageUrl = "https://image.tmdb.org/t/p/w500" fun search(title: String, type: MediaType): TMDBResponse { + val searchTerm = title.replace("(Sub)", "").trim() + return when (type) { - MediaType.MOVIE -> { - val test = searchMovie(title) - println("test: $test") - test - } - MediaType.TVSHOW -> { - val test = searchTVShow(title) - println("test: $test") - test - } - MediaType.OTHER -> { - Log.e(javaClass.name, "Error") + MediaType.MOVIE -> searchMovie(searchTerm) + MediaType.TVSHOW -> searchTVShow(searchTerm) + else -> { + Log.e(javaClass.name, "Wrong Type: $type") TMDBResponse() } } @@ -41,17 +36,17 @@ class TMDBApiController { } fun searchTVShow(title: String) = runBlocking { - val url = URL("$searchTVUrl$preparedParamters&query=${URLEncoder.encode(title, "UTF-8")}") + val url = URL("$searchTVUrl$preparedParameters&query=${URLEncoder.encode(title, "UTF-8")}") GlobalScope.async { val response = JsonParser.parseString(url.readText()).asJsonObject - println(response) + //println(response) return@async if (response.get("total_results").asInt > 0) { - response.get("results").asJsonArray.first().let { - val overview = it.asJsonObject.get("overview").asString - val posterPath = imageUrl + it.asJsonObject.get("poster_path").asString - val backdropPath = imageUrl + it.asJsonObject.get("backdrop_path").asString + 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) TMDBResponse("", overview, posterPath, backdropPath) } @@ -63,17 +58,17 @@ class TMDBApiController { } fun searchMovie(title: String) = runBlocking { - val url = URL("$searchMovieUrl$preparedParamters&query=${URLEncoder.encode(title, "UTF-8")}") + val url = URL("$searchMovieUrl$preparedParameters&query=${URLEncoder.encode(title, "UTF-8")}") GlobalScope.async { val response = JsonParser.parseString(url.readText()).asJsonObject - println(response) + //println(response) return@async if (response.get("total_results").asInt > 0) { - response.get("results").asJsonArray.first().let { - val overview = it.asJsonObject.get("overview").asString - val posterPath = imageUrl + it.asJsonObject.get("poster_path").asString - val backdropPath = imageUrl + it.asJsonObject.get("backdrop_path").asString + 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) TMDBResponse("", overview, posterPath, backdropPath) } @@ -85,4 +80,24 @@ class TMDBApiController { }.await() } + /** + * 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 { + "" + } + } + } \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_media.xml b/app/src/main/res/layout/fragment_media.xml index c21f2e4..8f25715 100644 --- a/app/src/main/res/layout/fragment_media.xml +++ b/app/src/main/res/layout/fragment_media.xml @@ -17,14 +17,27 @@ android:layout_height="wrap_content" android:orientation="vertical" > - + + + + + + +