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" >
-
+
+
+
+
+
+
+
+ android:text="@string/text_overview_ex" />
Play
+ A Silent Voice
+ Shouya Ishida ist ein sehr aktives Kind. Mit seinen Freunden …
Account