forked from recloudstream/cloudstream
added stuff to MainAPI
This commit is contained in:
parent
79328502b4
commit
8c0a6dffe9
9 changed files with 152 additions and 102 deletions
|
@ -1,5 +1,6 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<project version="4">
|
<project version="4">
|
||||||
|
<component name="GradleMigrationSettings" migrationVersion="1" />
|
||||||
<component name="GradleSettings">
|
<component name="GradleSettings">
|
||||||
<option name="linkedExternalProjectsSettings">
|
<option name="linkedExternalProjectsSettings">
|
||||||
<GradleProjectSettings>
|
<GradleProjectSettings>
|
||||||
|
|
|
@ -10,13 +10,10 @@ import com.lagradost.cloudstream3.animeproviders.ShiroProvider
|
||||||
import com.lagradost.cloudstream3.animeproviders.TenshiProvider
|
import com.lagradost.cloudstream3.animeproviders.TenshiProvider
|
||||||
import com.lagradost.cloudstream3.animeproviders.WcoProvider
|
import com.lagradost.cloudstream3.animeproviders.WcoProvider
|
||||||
import com.lagradost.cloudstream3.movieproviders.HDMProvider
|
import com.lagradost.cloudstream3.movieproviders.HDMProvider
|
||||||
import com.lagradost.cloudstream3.movieproviders.LookMovieProvider
|
|
||||||
import com.lagradost.cloudstream3.movieproviders.MeloMovieProvider
|
import com.lagradost.cloudstream3.movieproviders.MeloMovieProvider
|
||||||
import com.lagradost.cloudstream3.movieproviders.TrailersToProvider
|
import com.lagradost.cloudstream3.movieproviders.TrailersToProvider
|
||||||
import com.lagradost.cloudstream3.utils.ExtractorLink
|
import com.lagradost.cloudstream3.utils.ExtractorLink
|
||||||
import java.util.*
|
import java.util.*
|
||||||
import kotlin.collections.ArrayList
|
|
||||||
import kotlin.collections.HashMap
|
|
||||||
|
|
||||||
const val USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; rv:68.0) Gecko/20100101 Firefox/68.0"
|
const val USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; rv:68.0) Gecko/20100101 Firefox/68.0"
|
||||||
val baseHeader = mapOf("User-Agent" to USER_AGENT)
|
val baseHeader = mapOf("User-Agent" to USER_AGENT)
|
||||||
|
@ -38,7 +35,7 @@ object APIHolder {
|
||||||
MeloMovieProvider(),
|
MeloMovieProvider(),
|
||||||
DubbedAnimeProvider(),
|
DubbedAnimeProvider(),
|
||||||
HDMProvider(),
|
HDMProvider(),
|
||||||
LookMovieProvider(),
|
//LookMovieProvider(), // RECAPTCHA (Please allow up to 5 seconds...)
|
||||||
TrailersToProvider(),
|
TrailersToProvider(),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -60,13 +57,23 @@ object APIHolder {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**Every provider will **not** have try catch built in, so handle exceptions when calling these functions*/
|
||||||
abstract class MainAPI {
|
abstract class MainAPI {
|
||||||
open val name = "NONE"
|
open val name = "NONE"
|
||||||
open val mainUrl = "NONE"
|
open val mainUrl = "NONE"
|
||||||
open val instantLinkLoading = false // THIS IS IF THE LINK IS STORED IN THE "DATA"
|
|
||||||
|
/**If link is stored in the "data" string, so links can be instantly loaded*/
|
||||||
|
open val instantLinkLoading = false
|
||||||
|
|
||||||
open val hasQuickSearch = false
|
open val hasQuickSearch = false
|
||||||
open fun search(query: String): ArrayList<SearchResponse>? { // SearchResponse
|
|
||||||
|
/**Set false if links require referer or for some reason cant be played on a chromecast*/
|
||||||
|
open val hasChromecastSupport = true
|
||||||
|
|
||||||
|
/**If all links are m3u8 then set this to false*/
|
||||||
|
open val hasDownloadSupport = true
|
||||||
|
|
||||||
|
open fun search(query: String): ArrayList<SearchResponse>? {
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -78,7 +85,7 @@ abstract class MainAPI {
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
// callback is fired once a link is found, will return true if method is executed successfully
|
/**Callback is fired once a link is found, will return true if method is executed successfully*/
|
||||||
open fun loadLinks(
|
open fun loadLinks(
|
||||||
data: String,
|
data: String,
|
||||||
isCasting: Boolean,
|
isCasting: Boolean,
|
||||||
|
|
|
@ -10,6 +10,8 @@ class HDMProvider : MainAPI() {
|
||||||
get() = "HD Movies"
|
get() = "HD Movies"
|
||||||
override val mainUrl: String
|
override val mainUrl: String
|
||||||
get() = "https://hdm.to"
|
get() = "https://hdm.to"
|
||||||
|
override val hasDownloadSupport: Boolean
|
||||||
|
get() = false
|
||||||
|
|
||||||
override fun search(query: String): ArrayList<SearchResponse> {
|
override fun search(query: String): ArrayList<SearchResponse> {
|
||||||
val url = "$mainUrl/search/$query"
|
val url = "$mainUrl/search/$query"
|
||||||
|
|
|
@ -17,6 +17,8 @@ class MeloMovieProvider : MainAPI() {
|
||||||
get() = true
|
get() = true
|
||||||
override val hasQuickSearch: Boolean
|
override val hasQuickSearch: Boolean
|
||||||
get() = true
|
get() = true
|
||||||
|
override val hasChromecastSupport: Boolean
|
||||||
|
get() = false // MKV FILES CANT BE PLAYED ON A CHROMECAST
|
||||||
|
|
||||||
data class MeloMovieSearchResult(
|
data class MeloMovieSearchResult(
|
||||||
@JsonProperty("id") val id: Int,
|
@JsonProperty("id") val id: Int,
|
||||||
|
|
|
@ -1,28 +1,17 @@
|
||||||
package com.lagradost.cloudstream3.ui.result
|
package com.lagradost.cloudstream3.ui.result
|
||||||
|
|
||||||
import android.annotation.SuppressLint
|
import android.annotation.SuppressLint
|
||||||
import android.app.Activity
|
|
||||||
import android.content.Context
|
|
||||||
import android.content.DialogInterface
|
|
||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import android.widget.ImageView
|
import android.widget.ImageView
|
||||||
import android.widget.LinearLayout
|
|
||||||
import android.widget.TextView
|
import android.widget.TextView
|
||||||
import androidx.annotation.LayoutRes
|
import androidx.annotation.LayoutRes
|
||||||
import androidx.appcompat.app.AlertDialog
|
|
||||||
import androidx.core.widget.ContentLoadingProgressBar
|
import androidx.core.widget.ContentLoadingProgressBar
|
||||||
import androidx.recyclerview.widget.RecyclerView
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
import com.bumptech.glide.Glide
|
import com.bumptech.glide.Glide
|
||||||
import com.bumptech.glide.load.model.GlideUrl
|
import com.bumptech.glide.load.model.GlideUrl
|
||||||
import com.google.android.gms.cast.framework.CastContext
|
import com.lagradost.cloudstream3.R
|
||||||
import com.google.android.gms.cast.framework.CastState
|
|
||||||
import com.lagradost.cloudstream3.*
|
|
||||||
import com.lagradost.cloudstream3.UIHelper.hideSystemUI
|
|
||||||
import com.lagradost.cloudstream3.UIHelper.isCastApiAvailable
|
|
||||||
import com.lagradost.cloudstream3.UIHelper.isConnectedToChromecast
|
|
||||||
import com.lagradost.cloudstream3.utils.getId
|
|
||||||
import kotlinx.android.synthetic.main.result_episode.view.episode_holder
|
import kotlinx.android.synthetic.main.result_episode.view.episode_holder
|
||||||
import kotlinx.android.synthetic.main.result_episode.view.episode_text
|
import kotlinx.android.synthetic.main.result_episode.view.episode_text
|
||||||
import kotlinx.android.synthetic.main.result_episode_large.view.*
|
import kotlinx.android.synthetic.main.result_episode_large.view.*
|
||||||
|
@ -42,10 +31,13 @@ const val ACTION_COPY_LINK = 9
|
||||||
|
|
||||||
const val ACTION_SHOW_OPTIONS = 10
|
const val ACTION_SHOW_OPTIONS = 10
|
||||||
|
|
||||||
|
const val ACTION_CLICK_DEFAULT = 11
|
||||||
|
|
||||||
data class EpisodeClickEvent(val action: Int, val data: ResultEpisode)
|
data class EpisodeClickEvent(val action: Int, val data: ResultEpisode)
|
||||||
|
|
||||||
class EpisodeAdapter(
|
class EpisodeAdapter(
|
||||||
var cardList: List<ResultEpisode>,
|
var cardList: List<ResultEpisode>,
|
||||||
|
val hasDownloadSupport : Boolean,
|
||||||
private val clickCallback: (EpisodeClickEvent) -> Unit,
|
private val clickCallback: (EpisodeClickEvent) -> Unit,
|
||||||
) :
|
) :
|
||||||
RecyclerView.Adapter<RecyclerView.ViewHolder>() {
|
RecyclerView.Adapter<RecyclerView.ViewHolder>() {
|
||||||
|
@ -64,6 +56,7 @@ class EpisodeAdapter(
|
||||||
|
|
||||||
return CardViewHolder(
|
return CardViewHolder(
|
||||||
LayoutInflater.from(parent.context).inflate(layout, parent, false),
|
LayoutInflater.from(parent.context).inflate(layout, parent, false),
|
||||||
|
hasDownloadSupport,
|
||||||
clickCallback
|
clickCallback
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
@ -83,6 +76,7 @@ class EpisodeAdapter(
|
||||||
class CardViewHolder
|
class CardViewHolder
|
||||||
constructor(
|
constructor(
|
||||||
itemView: View,
|
itemView: View,
|
||||||
|
private val hasDownloadSupport : Boolean,
|
||||||
private val clickCallback: (EpisodeClickEvent) -> Unit,
|
private val clickCallback: (EpisodeClickEvent) -> Unit,
|
||||||
) : RecyclerView.ViewHolder(itemView) {
|
) : RecyclerView.ViewHolder(itemView) {
|
||||||
private val episodeText: TextView = itemView.episode_text
|
private val episodeText: TextView = itemView.episode_text
|
||||||
|
@ -131,13 +125,7 @@ class EpisodeAdapter(
|
||||||
}
|
}
|
||||||
|
|
||||||
episodeHolder.setOnClickListener {
|
episodeHolder.setOnClickListener {
|
||||||
episodeHolder.context?.let { ctx ->
|
clickCallback.invoke(EpisodeClickEvent(ACTION_CLICK_DEFAULT, card))
|
||||||
if (ctx.isConnectedToChromecast()) {
|
|
||||||
clickCallback.invoke(EpisodeClickEvent(ACTION_CHROME_CAST_EPISODE, card))
|
|
||||||
} else {
|
|
||||||
clickCallback.invoke(EpisodeClickEvent(ACTION_PLAY_EPISODE_IN_PLAYER, card))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
episodeHolder.setOnLongClickListener {
|
episodeHolder.setOnLongClickListener {
|
||||||
|
@ -146,6 +134,8 @@ class EpisodeAdapter(
|
||||||
return@setOnLongClickListener true
|
return@setOnLongClickListener true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
episodeDownload?.visibility = if(hasDownloadSupport) View.VISIBLE else View.GONE
|
||||||
|
|
||||||
episodeDownload?.setOnClickListener {
|
episodeDownload?.setOnClickListener {
|
||||||
clickCallback.invoke(EpisodeClickEvent(ACTION_DOWNLOAD_EPISODE, card))
|
clickCallback.invoke(EpisodeClickEvent(ACTION_DOWNLOAD_EPISODE, card))
|
||||||
}
|
}
|
||||||
|
|
|
@ -227,25 +227,37 @@ class ResultFragment : Fragment() {
|
||||||
)
|
)
|
||||||
result_back.layoutParams = backParameter
|
result_back.layoutParams = backParameter
|
||||||
|
|
||||||
if (activity?.isCastApiAvailable() == true) {
|
|
||||||
CastButtonFactory.setUpMediaRouteButton(activity, media_route_button)
|
|
||||||
val castContext = CastContext.getSharedInstance(requireActivity().applicationContext)
|
|
||||||
|
|
||||||
if (castContext.castState != CastState.NO_DEVICES_AVAILABLE) media_route_button.visibility = VISIBLE
|
|
||||||
castContext.addCastStateListener { state ->
|
|
||||||
if (media_route_button != null) {
|
|
||||||
if (state == CastState.NO_DEVICES_AVAILABLE) media_route_button.visibility = GONE else {
|
|
||||||
if (media_route_button.visibility == GONE) media_route_button.visibility = VISIBLE
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// activity?.fixPaddingStatusbar(result_toolbar)
|
// activity?.fixPaddingStatusbar(result_toolbar)
|
||||||
|
|
||||||
url = arguments?.getString("url")
|
url = arguments?.getString("url")
|
||||||
val slug = arguments?.getString("slug")
|
val slug = arguments?.getString("slug")
|
||||||
val apiName = arguments?.getString("apiName")
|
val apiName = arguments?.getString("apiName") ?: return
|
||||||
|
|
||||||
|
val api = getApiFromName(apiName)
|
||||||
|
if (media_route_button != null) {
|
||||||
|
val chromecastSupport = api.hasChromecastSupport
|
||||||
|
|
||||||
|
media_route_button?.alpha = if (chromecastSupport) 1f else 0.3f
|
||||||
|
if (!chromecastSupport) {
|
||||||
|
media_route_button.setOnClickListener {
|
||||||
|
Toast.makeText(it.context, "This provider has no chromecast support", Toast.LENGTH_LONG).show()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (activity?.isCastApiAvailable() == true) {
|
||||||
|
CastButtonFactory.setUpMediaRouteButton(activity, media_route_button)
|
||||||
|
val castContext = CastContext.getSharedInstance(requireActivity().applicationContext)
|
||||||
|
|
||||||
|
if (castContext.castState != CastState.NO_DEVICES_AVAILABLE) media_route_button.visibility = VISIBLE
|
||||||
|
castContext.addCastStateListener { state ->
|
||||||
|
if (media_route_button != null) {
|
||||||
|
if (state == CastState.NO_DEVICES_AVAILABLE) media_route_button.visibility = GONE else {
|
||||||
|
if (media_route_button.visibility == GONE) media_route_button.visibility = VISIBLE
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
result_scroll.setOnScrollChangeListener(NestedScrollView.OnScrollChangeListener { _, _, scrollY, _, _ ->
|
result_scroll.setOnScrollChangeListener(NestedScrollView.OnScrollChangeListener { _, _, scrollY, _, _ ->
|
||||||
if (result_poster_blur == null) return@OnScrollChangeListener
|
if (result_poster_blur == null) return@OnScrollChangeListener
|
||||||
result_poster_blur.alpha = maxOf(0f, (0.7f - scrollY / 1000f))
|
result_poster_blur.alpha = maxOf(0f, (0.7f - scrollY / 1000f))
|
||||||
|
@ -397,7 +409,10 @@ class ResultFragment : Fragment() {
|
||||||
|
|
||||||
val epData = episodeClick.data
|
val epData = episodeClick.data
|
||||||
ctx.setKey(
|
ctx.setKey(
|
||||||
getFolderName(DOWNLOAD_EPISODE_CACHE, (currentId ?: return@let).toString()), // 3 deep folder for faster acess
|
getFolderName(
|
||||||
|
DOWNLOAD_EPISODE_CACHE,
|
||||||
|
(currentId ?: return@let).toString()
|
||||||
|
), // 3 deep folder for faster acess
|
||||||
epData.id.toString(),
|
epData.id.toString(),
|
||||||
VideoDownloadHelper.DownloadEpisodeCached(
|
VideoDownloadHelper.DownloadEpisodeCached(
|
||||||
epData.name,
|
epData.name,
|
||||||
|
@ -431,6 +446,16 @@ class ResultFragment : Fragment() {
|
||||||
if (!isLoaded) return@main // CANT LOAD
|
if (!isLoaded) return@main // CANT LOAD
|
||||||
|
|
||||||
when (episodeClick.action) {
|
when (episodeClick.action) {
|
||||||
|
ACTION_CLICK_DEFAULT -> {
|
||||||
|
context?.let { ctx ->
|
||||||
|
if (ctx.isConnectedToChromecast()) {
|
||||||
|
handleAction(EpisodeClickEvent(ACTION_CHROME_CAST_EPISODE, episodeClick.data))
|
||||||
|
} else {
|
||||||
|
handleAction(EpisodeClickEvent(ACTION_PLAY_EPISODE_IN_PLAYER, episodeClick.data))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ACTION_SHOW_OPTIONS -> {
|
ACTION_SHOW_OPTIONS -> {
|
||||||
val builder = AlertDialog.Builder(requireContext(), R.style.AlertDialogCustom)
|
val builder = AlertDialog.Builder(requireContext(), R.style.AlertDialogCustom)
|
||||||
var dialog: AlertDialog? = null
|
var dialog: AlertDialog? = null
|
||||||
|
@ -442,6 +467,8 @@ class ResultFragment : Fragment() {
|
||||||
val verifiedOptions = ArrayList<String>()
|
val verifiedOptions = ArrayList<String>()
|
||||||
val verifiedOptionsValues = ArrayList<Int>()
|
val verifiedOptionsValues = ArrayList<Int>()
|
||||||
|
|
||||||
|
val hasDownloadSupport = api.hasDownloadSupport
|
||||||
|
|
||||||
for (i in options.indices) {
|
for (i in options.indices) {
|
||||||
val opv = optionsValues[i]
|
val opv = optionsValues[i]
|
||||||
val op = options[i]
|
val op = options[i]
|
||||||
|
@ -450,6 +477,8 @@ class ResultFragment : Fragment() {
|
||||||
val add = when (opv) {
|
val add = when (opv) {
|
||||||
ACTION_CHROME_CAST_EPISODE -> isConnected
|
ACTION_CHROME_CAST_EPISODE -> isConnected
|
||||||
ACTION_CHROME_CAST_MIRROR -> isConnected
|
ACTION_CHROME_CAST_MIRROR -> isConnected
|
||||||
|
ACTION_DOWNLOAD_EPISODE -> hasDownloadSupport
|
||||||
|
ACTION_DOWNLOAD_MIRROR -> hasDownloadSupport
|
||||||
ACTION_PLAY_EPISODE_IN_VLC_PLAYER -> context?.isAppInstalled(VLC_PACKAGE) ?: false
|
ACTION_PLAY_EPISODE_IN_VLC_PLAYER -> context?.isAppInstalled(VLC_PACKAGE) ?: false
|
||||||
else -> true
|
else -> true
|
||||||
}
|
}
|
||||||
|
@ -482,7 +511,7 @@ class ResultFragment : Fragment() {
|
||||||
|
|
||||||
ACTION_PLAY_EPISODE_IN_BROWSER -> {
|
ACTION_PLAY_EPISODE_IN_BROWSER -> {
|
||||||
aquireSingeExtractorLink("Play in Browser") { link ->
|
aquireSingeExtractorLink("Play in Browser") { link ->
|
||||||
val i = Intent(Intent.ACTION_VIEW)
|
val i = Intent(ACTION_VIEW)
|
||||||
i.data = Uri.parse(link.url)
|
i.data = Uri.parse(link.url)
|
||||||
startActivity(i)
|
startActivity(i)
|
||||||
}
|
}
|
||||||
|
@ -595,11 +624,11 @@ class ResultFragment : Fragment() {
|
||||||
val adapter: RecyclerView.Adapter<RecyclerView.ViewHolder> =
|
val adapter: RecyclerView.Adapter<RecyclerView.ViewHolder> =
|
||||||
EpisodeAdapter(
|
EpisodeAdapter(
|
||||||
ArrayList(),
|
ArrayList(),
|
||||||
|
api.hasDownloadSupport,
|
||||||
) { episodeClick ->
|
) { episodeClick ->
|
||||||
handleAction(episodeClick)
|
handleAction(episodeClick)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
result_episodes.adapter = adapter
|
result_episodes.adapter = adapter
|
||||||
result_episodes.layoutManager = GridLayoutManager(context, 1)
|
result_episodes.layoutManager = GridLayoutManager(context, 1)
|
||||||
|
|
||||||
|
@ -678,17 +707,17 @@ class ResultFragment : Fragment() {
|
||||||
currentIsMovie = !d.isEpisodeBased()
|
currentIsMovie = !d.isEpisodeBased()
|
||||||
|
|
||||||
result_openinbrower.setOnClickListener {
|
result_openinbrower.setOnClickListener {
|
||||||
val i = Intent(Intent.ACTION_VIEW)
|
val i = Intent(ACTION_VIEW)
|
||||||
i.data = Uri.parse(d.url)
|
i.data = Uri.parse(d.url)
|
||||||
startActivity(i)
|
startActivity(i)
|
||||||
}
|
}
|
||||||
|
|
||||||
result_share.setOnClickListener {
|
result_share.setOnClickListener {
|
||||||
val i = Intent(Intent.ACTION_SEND)
|
val i = Intent(ACTION_SEND)
|
||||||
i.type = "text/plain"
|
i.type = "text/plain"
|
||||||
i.putExtra(Intent.EXTRA_SUBJECT, d.name)
|
i.putExtra(EXTRA_SUBJECT, d.name)
|
||||||
i.putExtra(Intent.EXTRA_TEXT, d.url)
|
i.putExtra(EXTRA_TEXT, d.url)
|
||||||
startActivity(Intent.createChooser(i, d.name))
|
startActivity(createChooser(i, d.name))
|
||||||
}
|
}
|
||||||
|
|
||||||
val metadataInfoArray = ArrayList<Pair<String, String>>()
|
val metadataInfoArray = ArrayList<Pair<String, String>>()
|
||||||
|
@ -713,6 +742,8 @@ class ResultFragment : Fragment() {
|
||||||
val duration = d.duration
|
val duration = d.duration
|
||||||
if (duration != null) metadataInfoArray.add(Pair("Duration", duration))
|
if (duration != null) metadataInfoArray.add(Pair("Duration", duration))
|
||||||
|
|
||||||
|
metadataInfoArray.add(Pair("Site", d.apiName))
|
||||||
|
|
||||||
if (metadataInfoArray.size > 0) {
|
if (metadataInfoArray.size > 0) {
|
||||||
result_metadata.visibility = VISIBLE
|
result_metadata.visibility = VISIBLE
|
||||||
val text = SpannableStringBuilder()
|
val text = SpannableStringBuilder()
|
||||||
|
@ -777,37 +808,23 @@ class ResultFragment : Fragment() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
when (d.type) {
|
if (d.type == TvType.Movie && d is MovieLoadResponse) {
|
||||||
TvType.Movie -> {
|
result_movie_parent.visibility = VISIBLE
|
||||||
result_play_movie.visibility = VISIBLE
|
result_episodes_text.visibility = GONE
|
||||||
result_episodes_text.visibility = GONE
|
result_episodes.visibility = GONE
|
||||||
result_episodes.visibility = GONE
|
|
||||||
|
|
||||||
result_play_movie.setOnClickListener {
|
result_play_movie.setOnClickListener {
|
||||||
val card = currentEpisodes?.first() ?: return@setOnClickListener
|
val card = currentEpisodes?.first() ?: return@setOnClickListener
|
||||||
if (requireContext().isCastApiAvailable()) {
|
handleAction(EpisodeClickEvent(ACTION_CLICK_DEFAULT, card))
|
||||||
val castContext = CastContext.getSharedInstance(requireContext())
|
|
||||||
|
|
||||||
if (castContext.castState == CastState.CONNECTED) {
|
|
||||||
handleAction(EpisodeClickEvent(ACTION_CHROME_CAST_EPISODE, card))
|
|
||||||
} else {
|
|
||||||
handleAction(EpisodeClickEvent(ACTION_PLAY_EPISODE_IN_PLAYER, card))
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
handleAction(
|
|
||||||
EpisodeClickEvent(
|
|
||||||
ACTION_PLAY_EPISODE_IN_PLAYER,
|
|
||||||
card
|
|
||||||
)
|
|
||||||
) //TODO REDO TO MAIN
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else -> {
|
result_options.setOnClickListener {
|
||||||
result_play_movie.visibility = GONE
|
val card = currentEpisodes?.first() ?: return@setOnClickListener
|
||||||
result_episodes_text.visibility = VISIBLE
|
handleAction(EpisodeClickEvent(ACTION_SHOW_OPTIONS, card))
|
||||||
result_episodes.visibility = VISIBLE
|
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
result_movie_parent.visibility = GONE
|
||||||
|
result_episodes_text.visibility = VISIBLE
|
||||||
|
result_episodes.visibility = VISIBLE
|
||||||
}
|
}
|
||||||
|
|
||||||
when (d) {
|
when (d) {
|
||||||
|
@ -842,7 +859,7 @@ class ResultFragment : Fragment() {
|
||||||
|
|
||||||
if (url != null) {
|
if (url != null) {
|
||||||
result_reload_connection_open_in_browser.setOnClickListener {
|
result_reload_connection_open_in_browser.setOnClickListener {
|
||||||
val i = Intent(Intent.ACTION_VIEW)
|
val i = Intent(ACTION_VIEW)
|
||||||
i.data = Uri.parse(url)
|
i.data = Uri.parse(url)
|
||||||
startActivity(i)
|
startActivity(i)
|
||||||
}
|
}
|
||||||
|
|
|
@ -165,9 +165,10 @@ class ResultViewModel : ViewModel() {
|
||||||
updateEpisodes(
|
updateEpisodes(
|
||||||
context, mainId, arrayListOf(
|
context, mainId, arrayListOf(
|
||||||
context.buildResultEpisode(
|
context.buildResultEpisode(
|
||||||
|
d.name,
|
||||||
null,
|
null,
|
||||||
|
0,
|
||||||
null,
|
null,
|
||||||
0, null,
|
|
||||||
d.dataUrl,
|
d.dataUrl,
|
||||||
d.apiName,
|
d.apiName,
|
||||||
(mainId + 1),
|
(mainId + 1),
|
||||||
|
@ -211,7 +212,7 @@ class ResultViewModel : ViewModel() {
|
||||||
suspend fun loadEpisode(
|
suspend fun loadEpisode(
|
||||||
episode: ResultEpisode,
|
episode: ResultEpisode,
|
||||||
isCasting: Boolean,
|
isCasting: Boolean,
|
||||||
) : Resource<ResultViewModel.EpisodeData> {
|
): Resource<EpisodeData> {
|
||||||
return loadEpisode(episode.id, episode.data, isCasting)
|
return loadEpisode(episode.id, episode.data, isCasting)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -219,7 +220,7 @@ class ResultViewModel : ViewModel() {
|
||||||
id: Int,
|
id: Int,
|
||||||
data: String,
|
data: String,
|
||||||
isCasting: Boolean,
|
isCasting: Boolean,
|
||||||
): Resource<ResultViewModel.EpisodeData> {
|
): Resource<EpisodeData> {
|
||||||
if (_allEpisodes.value?.contains(id) == true) {
|
if (_allEpisodes.value?.contains(id) == true) {
|
||||||
_allEpisodes.value?.remove(id)
|
_allEpisodes.value?.remove(id)
|
||||||
}
|
}
|
||||||
|
|
|
@ -286,27 +286,56 @@
|
||||||
android:layout_height="wrap_content">
|
android:layout_height="wrap_content">
|
||||||
|
|
||||||
</com.lagradost.cloudstream3.widget.FlowLayout>
|
</com.lagradost.cloudstream3.widget.FlowLayout>
|
||||||
<com.google.android.material.button.MaterialButton
|
<LinearLayout
|
||||||
android:visibility="visible"
|
android:orientation="vertical"
|
||||||
android:layout_gravity="center_vertical"
|
android:id="@+id/result_movie_parent"
|
||||||
app:cornerRadius="4dp"
|
|
||||||
android:id="@+id/result_play_movie"
|
|
||||||
android:text="@string/play_movie_button"
|
|
||||||
|
|
||||||
app:rippleColor="?attr/colorPrimary"
|
|
||||||
android:textColor="?attr/textColor"
|
|
||||||
app:iconTint="?attr/textColor"
|
|
||||||
android:textAllCaps="false"
|
|
||||||
android:clickable="true"
|
|
||||||
android:focusable="true"
|
|
||||||
app:iconGravity="textStart"
|
|
||||||
app:strokeColor="?attr/textColor"
|
|
||||||
app:icon="@drawable/ic_baseline_play_arrow_24"
|
|
||||||
android:backgroundTint="@color/transparent"
|
|
||||||
style="@style/Widget.MaterialComponents.Button.OutlinedButton"
|
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="45dp">
|
android:layout_height="wrap_content">
|
||||||
</com.google.android.material.button.MaterialButton>
|
<com.google.android.material.button.MaterialButton
|
||||||
|
android:visibility="visible"
|
||||||
|
android:layout_gravity="center_vertical"
|
||||||
|
app:cornerRadius="4dp"
|
||||||
|
android:id="@+id/result_play_movie"
|
||||||
|
android:text="@string/play_movie_button"
|
||||||
|
|
||||||
|
app:rippleColor="?attr/textColor"
|
||||||
|
android:textColor="?attr/textColor"
|
||||||
|
app:iconTint="?attr/textColor"
|
||||||
|
android:textAllCaps="false"
|
||||||
|
android:clickable="true"
|
||||||
|
android:focusable="true"
|
||||||
|
|
||||||
|
app:iconGravity="textStart"
|
||||||
|
app:strokeColor="?attr/textColor"
|
||||||
|
app:icon="@drawable/ic_baseline_play_arrow_24"
|
||||||
|
android:backgroundTint="@color/transparent"
|
||||||
|
style="@style/Widget.MaterialComponents.Button.OutlinedButton"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="45dp">
|
||||||
|
</com.google.android.material.button.MaterialButton>
|
||||||
|
<com.google.android.material.button.MaterialButton
|
||||||
|
android:visibility="visible"
|
||||||
|
android:layout_gravity="center_vertical"
|
||||||
|
app:cornerRadius="4dp"
|
||||||
|
android:id="@+id/result_options"
|
||||||
|
android:text="@string/options"
|
||||||
|
|
||||||
|
app:rippleColor="?attr/textColor"
|
||||||
|
android:textColor="?attr/textColor"
|
||||||
|
app:iconTint="?attr/textColor"
|
||||||
|
android:textAllCaps="false"
|
||||||
|
android:clickable="true"
|
||||||
|
android:focusable="true"
|
||||||
|
app:iconGravity="textStart"
|
||||||
|
app:strokeColor="?attr/textColor"
|
||||||
|
app:icon="@drawable/ic_baseline_play_arrow_24"
|
||||||
|
android:backgroundTint="@color/transparent"
|
||||||
|
style="@style/Widget.MaterialComponents.Button.OutlinedButton"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="45dp">
|
||||||
|
</com.google.android.material.button.MaterialButton>
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
<LinearLayout android:orientation="horizontal" android:gravity="center_vertical" android:layout_width="match_parent" android:layout_height="wrap_content">
|
<LinearLayout android:orientation="horizontal" android:gravity="center_vertical" android:layout_width="match_parent" android:layout_height="wrap_content">
|
||||||
<com.google.android.material.button.MaterialButton
|
<com.google.android.material.button.MaterialButton
|
||||||
|
@ -314,7 +343,7 @@
|
||||||
android:layout_gravity="center_vertical"
|
android:layout_gravity="center_vertical"
|
||||||
app:cornerRadius="4dp"
|
app:cornerRadius="4dp"
|
||||||
android:id="@+id/result_season_button"
|
android:id="@+id/result_season_button"
|
||||||
tools:text="Bookmark"
|
tools:text="Subbed"
|
||||||
|
|
||||||
app:rippleColor="?attr/bitDarkerGrayBackground"
|
app:rippleColor="?attr/bitDarkerGrayBackground"
|
||||||
android:textColor="?attr/textColor"
|
android:textColor="?attr/textColor"
|
||||||
|
|
|
@ -41,4 +41,5 @@
|
||||||
<string name="download_descript">Download</string>
|
<string name="download_descript">Download</string>
|
||||||
<string name="error_loading_links">Error Loading Links</string>
|
<string name="error_loading_links">Error Loading Links</string>
|
||||||
<string name="download_storage_text">Internal Storage</string>
|
<string name="download_storage_text">Internal Storage</string>
|
||||||
|
<string name="options">Options</string>
|
||||||
</resources>
|
</resources>
|
Loading…
Reference in a new issue