From 90fe0845572ea8b227ada8c62b2ba044f8faff1c Mon Sep 17 00:00:00 2001 From: Jannik Date: Mon, 12 Oct 2020 20:30:45 +0200 Subject: [PATCH] disable action bar, use tmdb for poster and description --- .../java/org/mosad/teapod/MainActivity.kt | 5 +- .../java/org/mosad/teapod/parser/AoDParser.kt | 12 +-- .../java/org/mosad/teapod/ui/MediaFragment.kt | 16 +++- .../teapod/ui/library/LibraryFragment.kt | 6 +- .../mosad/teapod/ui/search/SearchFragment.kt | 12 +-- .../java/org/mosad/teapod/util/DataTypes.kt | 4 +- .../mosad/teapod/util/TMDBApiController.kt | 88 +++++++++++++++++++ app/src/main/res/layout/fragment_media.xml | 8 +- app/src/main/res/layout/linear_media.xml | 4 +- app/src/main/res/values/styles.xml | 2 +- 10 files changed, 131 insertions(+), 26 deletions(-) create mode 100644 app/src/main/java/org/mosad/teapod/util/TMDBApiController.kt diff --git a/app/src/main/java/org/mosad/teapod/MainActivity.kt b/app/src/main/java/org/mosad/teapod/MainActivity.kt index 9302079..65ab332 100644 --- a/app/src/main/java/org/mosad/teapod/MainActivity.kt +++ b/app/src/main/java/org/mosad/teapod/MainActivity.kt @@ -18,6 +18,7 @@ import org.mosad.teapod.ui.home.HomeFragment import org.mosad.teapod.ui.library.LibraryFragment import org.mosad.teapod.ui.search.SearchFragment import org.mosad.teapod.util.Media +import org.mosad.teapod.util.TMDBApiController class MainActivity : AppCompatActivity(), BottomNavigationView.OnNavigationItemSelectedListener { @@ -90,7 +91,9 @@ class MainActivity : AppCompatActivity(), BottomNavigationView.OnNavigationItemS fun showDetailFragment(media: Media) { media.episodes = AoDParser().loadStreams(media) // load the streams for the selected media - val mediaFragment = MediaFragment(media) + val tmdb = TMDBApiController().search(media.title, media.type) + + val mediaFragment = MediaFragment(media, tmdb) supportFragmentManager.commit { add(R.id.nav_host_fragment, mediaFragment, "MediaFragment") addToBackStack(null) diff --git a/app/src/main/java/org/mosad/teapod/parser/AoDParser.kt b/app/src/main/java/org/mosad/teapod/parser/AoDParser.kt index 92250a4..69868f8 100644 --- a/app/src/main/java/org/mosad/teapod/parser/AoDParser.kt +++ b/app/src/main/java/org/mosad/teapod/parser/AoDParser.kt @@ -14,7 +14,7 @@ import kotlin.collections.ArrayList class AoDParser { - private val baseURL = "https://www.anime-on-demand.de" + private val baseUrl = "https://www.anime-on-demand.de" private val loginPath = "/users/sign_in" private val libraryPath = "/animes" @@ -31,7 +31,7 @@ class AoDParser { withContext(Dispatchers.Default) { // get the authenticity token - val resAuth = Jsoup.connect(baseURL + loginPath) + val resAuth = Jsoup.connect(baseUrl + loginPath) .header("User-Agent", userAgent) .execute() @@ -49,7 +49,7 @@ class AoDParser { Pair("authenticity_token", authenticityToken) ) - val resLogin = Jsoup.connect(baseURL + loginPath) + val resLogin = Jsoup.connect(baseUrl + loginPath) .method(Connection.Method.POST) .data(data) .postDataCharset("UTF-8") @@ -72,7 +72,7 @@ class AoDParser { if (sessionCookies.isEmpty()) login() withContext(Dispatchers.Default) { - val resAnimes = Jsoup.connect(baseURL + libraryPath) + val resAnimes = Jsoup.connect(baseUrl + libraryPath) .cookies(sessionCookies) .get() @@ -115,7 +115,7 @@ class AoDParser { withContext(Dispatchers.Default) { - val res = Jsoup.connect(baseURL + media.link) + val res = Jsoup.connect(baseUrl + media.link) .cookies(sessionCookies) .get() @@ -144,7 +144,7 @@ class AoDParser { Pair("X-Requested-With", "XMLHttpRequest"), ) - val res = Jsoup.connect(baseURL + playlistPath) + val res = Jsoup.connect(baseUrl + playlistPath) .ignoreContentType(true) .cookies(sessionCookies) .headers(headers) 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 8a4bc5a..148bdb5 100644 --- a/app/src/main/java/org/mosad/teapod/ui/MediaFragment.kt +++ b/app/src/main/java/org/mosad/teapod/ui/MediaFragment.kt @@ -15,8 +15,9 @@ import org.mosad.teapod.R import org.mosad.teapod.util.DataTypes.MediaType import org.mosad.teapod.util.EpisodesAdapter import org.mosad.teapod.util.Media +import org.mosad.teapod.util.TMDBResponse -class MediaFragment(private val media: Media) : Fragment() { +class MediaFragment(private val media: Media, private val tmdb: TMDBResponse) : Fragment() { private lateinit var adapterRecEpisodes: EpisodesAdapter private lateinit var viewManager: RecyclerView.LayoutManager @@ -30,13 +31,20 @@ class MediaFragment(private val media: Media) : Fragment() { super.onViewCreated(view, savedInstanceState) // generic gui - Glide.with(requireContext()).load(media.posterLink).into(image_poster) text_title.text = media.title - text_desc.text = media.shortDesc + + 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") + } 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") + } // specific gui if (media.type == MediaType.TVSHOW) { - // TODO val episodeTitles = media.episodes.map { it.title } adapterRecEpisodes = EpisodesAdapter(episodeTitles) diff --git a/app/src/main/java/org/mosad/teapod/ui/library/LibraryFragment.kt b/app/src/main/java/org/mosad/teapod/ui/library/LibraryFragment.kt index fca99f4..8e9c5c9 100644 --- a/app/src/main/java/org/mosad/teapod/ui/library/LibraryFragment.kt +++ b/app/src/main/java/org/mosad/teapod/ui/library/LibraryFragment.kt @@ -31,8 +31,10 @@ class LibraryFragment : Fragment() { // create and set the adapter, needs context withContext(Dispatchers.Main) { - adapter = CustomAdapter(requireContext(), AoDParser.mediaList) - list_library.adapter = adapter + context?.let { + adapter = CustomAdapter(it, AoDParser.mediaList) + list_library.adapter = adapter + } } } diff --git a/app/src/main/java/org/mosad/teapod/ui/search/SearchFragment.kt b/app/src/main/java/org/mosad/teapod/ui/search/SearchFragment.kt index 9f16f39..c0db7d0 100644 --- a/app/src/main/java/org/mosad/teapod/ui/search/SearchFragment.kt +++ b/app/src/main/java/org/mosad/teapod/ui/search/SearchFragment.kt @@ -16,6 +16,7 @@ import org.mosad.teapod.util.Media class SearchFragment : Fragment() { + private val instance = this private lateinit var adapter : CustomAdapter override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { @@ -32,13 +33,14 @@ class SearchFragment : Fragment() { // create and set the adapter, needs context withContext(Dispatchers.Main) { - adapter = CustomAdapter(requireContext(), AoDParser.mediaList) - list_search.adapter = adapter - //adapter.notifyDataSetChanged() + context?.let { + adapter = CustomAdapter(it, AoDParser.mediaList) + list_search.adapter = adapter + } } - - initActions() } + + initActions() } private fun initActions() { diff --git a/app/src/main/java/org/mosad/teapod/util/DataTypes.kt b/app/src/main/java/org/mosad/teapod/util/DataTypes.kt index ee9ea95..e3610b2 100644 --- a/app/src/main/java/org/mosad/teapod/util/DataTypes.kt +++ b/app/src/main/java/org/mosad/teapod/util/DataTypes.kt @@ -14,4 +14,6 @@ data class Media(val title: String, val link: String, val type: DataTypes.MediaT } } -data class Episode(val title: String = "", val streamUrl: String = "", var watched: Boolean = false) +data class Episode(val title: String = "", val streamUrl: String = "", val posterLink: String = "", var watched: Boolean = false) + +data class TMDBResponse(val title: String = "", val overview: String = "", val posterUrl: String = "", val backdropUrl: String = "") diff --git a/app/src/main/java/org/mosad/teapod/util/TMDBApiController.kt b/app/src/main/java/org/mosad/teapod/util/TMDBApiController.kt new file mode 100644 index 0000000..0b5ee90 --- /dev/null +++ b/app/src/main/java/org/mosad/teapod/util/TMDBApiController.kt @@ -0,0 +1,88 @@ +package org.mosad.teapod.util + +import android.util.Log +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" + private val preparedParamters = "?api_key=$apiKey&language=$language" + + private val imageUrl = "https://image.tmdb.org/t/p/w500" + + fun search(title: String, type: MediaType): TMDBResponse { + 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") + TMDBResponse() + } + } + + } + + fun searchTVShow(title: String) = runBlocking { + val url = URL("$searchTVUrl$preparedParamters&query=${URLEncoder.encode(title, "UTF-8")}") + + GlobalScope.async { + val response = JsonParser.parseString(url.readText()).asJsonObject + 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 + + TMDBResponse("", overview, posterPath, backdropPath) + } + } else { + TMDBResponse() + } + }.await() + + } + + fun searchMovie(title: String) = runBlocking { + val url = URL("$searchMovieUrl$preparedParamters&query=${URLEncoder.encode(title, "UTF-8")}") + + GlobalScope.async { + val response = JsonParser.parseString(url.readText()).asJsonObject + 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 + + TMDBResponse("", overview, posterPath, backdropPath) + } + } else { + TMDBResponse() + } + + + }.await() + } + +} \ 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 2356aa3..c21f2e4 100644 --- a/app/src/main/res/layout/fragment_media.xml +++ b/app/src/main/res/layout/fragment_media.xml @@ -20,11 +20,11 @@ + android:layout_marginTop="20dp" + android:minHeight="200dp" + android:src="@drawable/ic_launcher_background" />