improved tmdb data handling, added backdrop
This commit is contained in:
		| @ -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") | ||||
|             } | ||||
|         } | ||||
|  | ||||
|  | ||||
| @ -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 { | ||||
|             "" | ||||
|         } | ||||
|     } | ||||
|  | ||||
| } | ||||
| @ -17,14 +17,27 @@ | ||||
|             android:layout_height="wrap_content" | ||||
|             android:orientation="vertical" > | ||||
|  | ||||
|             <ImageView | ||||
|                 android:id="@+id/image_poster" | ||||
|                 android:layout_width="wrap_content" | ||||
|                 android:layout_height="wrap_content" | ||||
|                 android:layout_gravity="center" | ||||
|                 android:layout_marginTop="20dp" | ||||
|                 android:minHeight="200dp" | ||||
|                 android:src="@drawable/ic_launcher_background" /> | ||||
|             <FrameLayout | ||||
|                 android:layout_width="match_parent" | ||||
|                 android:layout_height="wrap_content"> | ||||
|  | ||||
|                 <ImageView | ||||
|                     android:id="@+id/image_backdrop" | ||||
|                     android:layout_width="match_parent" | ||||
|                     android:layout_height="wrap_content" | ||||
|                     android:adjustViewBounds="true" | ||||
|                     android:maxHeight="231dp" | ||||
|                     android:minHeight="220dp" /> | ||||
|  | ||||
|                 <ImageView | ||||
|                     android:id="@+id/image_poster" | ||||
|                     android:layout_width="wrap_content" | ||||
|                     android:layout_height="wrap_content" | ||||
|                     android:layout_gravity="center" | ||||
|                     android:minHeight="200dp" | ||||
|                     android:src="@drawable/ic_launcher_background" /> | ||||
|  | ||||
|             </FrameLayout> | ||||
|  | ||||
|             <Button | ||||
|                 android:id="@+id/button_play" | ||||
| @ -54,18 +67,18 @@ | ||||
|                 android:layout_marginStart="7dp" | ||||
|                 android:layout_marginTop="12dp" | ||||
|                 android:layout_marginEnd="7dp" | ||||
|                 android:text="TextView" | ||||
|                 android:text="@string/text_title_ex" | ||||
|                 android:textStyle="bold" /> | ||||
|  | ||||
|             <TextView | ||||
|                 android:id="@+id/text_desc" | ||||
|                 android:id="@+id/text_overview" | ||||
|                 android:layout_width="match_parent" | ||||
|                 android:layout_height="wrap_content" | ||||
|                 android:layout_gravity="center" | ||||
|                 android:layout_marginStart="7dp" | ||||
|                 android:layout_marginTop="10dp" | ||||
|                 android:layout_marginEnd="7dp" | ||||
|                 android:text="TextView" /> | ||||
|                 android:text="@string/text_overview_ex" /> | ||||
|  | ||||
|             <androidx.recyclerview.widget.RecyclerView | ||||
|                 android:id="@+id/recycler_episodes" | ||||
|  | ||||
| @ -10,6 +10,8 @@ | ||||
|  | ||||
|     <!-- media fragment --> | ||||
|     <string name="button_play">Play</string> | ||||
|     <string name="text_title_ex">A Silent Voice</string> | ||||
|     <string name="text_overview_ex">Shouya Ishida ist ein sehr aktives Kind. Mit seinen Freunden …</string> | ||||
|  | ||||
|     <!-- settings fragment --> | ||||
|     <string name="account">Account</string> | ||||
|  | ||||
		Reference in New Issue
	
	Block a user