diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 460a47ea..f9e0e7de 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -21,6 +21,10 @@
android:name="android.software.leanback"
android:required="false" />
+
+
+
+
Unit,
private val downloadClickCallback: (DownloadClickEvent) -> Unit,
) : RecyclerView.Adapter() {
+ companion object {
+ /**
+ * @return ACTION_PLAY_EPISODE_IN_PLAYER, ACTION_PLAY_EPISODE_IN_BROWSER or ACTION_PLAY_EPISODE_IN_VLC_PLAYER depending on player settings.
+ * See array.xml/player_pref_values
+ **/
+ fun getPlayerAction(context: Context): Int {
+ val settingsManager = PreferenceManager.getDefaultSharedPreferences(context)
+ return when (settingsManager.getInt(context.getString(R.string.player_pref_key), 1)) {
+ 1 -> ACTION_PLAY_EPISODE_IN_PLAYER
+ 2 -> ACTION_PLAY_EPISODE_IN_VLC_PLAYER
+ 3 -> ACTION_PLAY_EPISODE_IN_BROWSER
+ else -> ACTION_PLAY_EPISODE_IN_PLAYER
+ }
+ }
+ }
+
var cardList: MutableList = mutableListOf()
private val mBoundViewHolders: HashSet = HashSet()
diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultFragment.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultFragment.kt
index 1ec2dd39..a173f1c1 100644
--- a/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultFragment.kt
+++ b/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultFragment.kt
@@ -38,6 +38,7 @@ import com.lagradost.cloudstream3.ui.download.DOWNLOAD_ACTION_DOWNLOAD
import com.lagradost.cloudstream3.ui.download.DownloadButtonSetup.handleDownloadClick
import com.lagradost.cloudstream3.ui.download.EasyDownloadButton
import com.lagradost.cloudstream3.ui.quicksearch.QuickSearchFragment
+import com.lagradost.cloudstream3.ui.result.EpisodeAdapter.Companion.getPlayerAction
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.isTrueTvSettings
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.isTvSettings
import com.lagradost.cloudstream3.utils.*
@@ -455,7 +456,8 @@ open class ResultFragment : ResultTrailerPlayer() {
val apiName: String,
val showFillers: Boolean,
val dubStatus: DubStatus,
- val start: AutoResume?
+ val start: AutoResume?,
+ val playerAction: Int
)
private fun getStoredData(context: Context): StoredData? {
@@ -469,6 +471,8 @@ open class ResultFragment : ResultTrailerPlayer() {
) DubStatus.Dubbed else DubStatus.Subbed
val startAction = arguments?.getInt(START_ACTION_BUNDLE)
+ val playerAction = getPlayerAction(context)
+
val start = startAction?.let { action ->
val startValue = arguments?.getInt(START_VALUE_BUNDLE)
val resumeEpisode = arguments?.getInt(EPISODE_BUNDLE)
@@ -483,7 +487,7 @@ open class ResultFragment : ResultTrailerPlayer() {
season = resumeSeason
)
}
- return StoredData(url, apiName, showFillers, dubStatus, start)
+ return StoredData(url, apiName, showFillers, dubStatus, start, playerAction)
}
private fun reloadViewModel(success: Boolean = false) {
@@ -774,7 +778,8 @@ open class ResultFragment : ResultTrailerPlayer() {
viewModel.handleAction(
activity,
EpisodeClickEvent(
- ACTION_PLAY_EPISODE_IN_PLAYER, value.result
+ storedData?.playerAction ?: ACTION_PLAY_EPISODE_IN_PLAYER,
+ value.result
)
)
}
diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultViewModel2.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultViewModel2.kt
index 48919308..37c76ee3 100644
--- a/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultViewModel2.kt
+++ b/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultViewModel2.kt
@@ -1,10 +1,7 @@
package com.lagradost.cloudstream3.ui.result
import android.app.Activity
-import android.content.ClipData
-import android.content.ClipboardManager
-import android.content.Context
-import android.content.Intent
+import android.content.*
import android.net.Uri
import android.util.Log
import android.widget.Toast
@@ -33,6 +30,7 @@ import com.lagradost.cloudstream3.ui.player.GeneratorPlayer
import com.lagradost.cloudstream3.ui.player.IGenerator
import com.lagradost.cloudstream3.ui.player.RepoLinkGenerator
import com.lagradost.cloudstream3.ui.player.SubtitleData
+import com.lagradost.cloudstream3.ui.result.EpisodeAdapter.Companion.getPlayerAction
import com.lagradost.cloudstream3.ui.subtitles.SubtitlesFragment
import com.lagradost.cloudstream3.utils.*
import com.lagradost.cloudstream3.utils.AppUtils.getNameFull
@@ -973,9 +971,11 @@ class ResultViewModel2 : ViewModel() {
File.createTempFile("mirrorlist", ".m3u8", outputDir)
}
var text = "#EXTM3U"
- for (sub in data.subs) {
- text += "\n#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID=\"subs\",NAME=\"${sub.name}\",DEFAULT=NO,AUTOSELECT=NO,FORCED=NO,LANGUAGE=\"${sub.name}\",URI=\"${sub.url}\""
- }
+
+ // With subtitles it doesn't work for no reason :(
+// for (sub in data.subs) {
+// text += "\n#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID=\"subs\",NAME=\"${sub.name}\",DEFAULT=NO,AUTOSELECT=NO,FORCED=NO,LANGUAGE=\"${sub.name}\",URI=\"${sub.url}\""
+// }
for (link in data.links) {
text += "\n#EXTINF:, ${link.name}\n${link.url}"
}
@@ -999,11 +999,10 @@ class ResultViewModel2 : ViewModel() {
val startId = VLC_FROM_PROGRESS
- var position = startId
- if (startId == VLC_FROM_START) {
- position = 1
- } else if (startId == VLC_FROM_PROGRESS) {
- position = 0
+ val position = when (startId) {
+ VLC_FROM_START -> 1
+ VLC_FROM_PROGRESS -> 0
+ else -> 0
}
vlcIntent.putExtra("position", position)
@@ -1013,7 +1012,13 @@ class ResultViewModel2 : ViewModel() {
act.startActivityForResult(vlcIntent, VLC_REQUEST_CODE)
} catch (e: Exception) {
logError(e)
- showToast(act, e.toString(), Toast.LENGTH_LONG)
+ main {
+ if (e is ActivityNotFoundException) {
+ showToast(act, txt(R.string.vlc_not_found_error), Toast.LENGTH_LONG)
+ } else {
+ showToast(act, e.toString(), Toast.LENGTH_LONG)
+ }
+ }
}
}
@@ -1073,9 +1078,10 @@ class ResultViewModel2 : ViewModel() {
click.copy(action = ACTION_CHROME_CAST_EPISODE)
)
} else {
+ val action = getPlayerAction(ctx)
handleEpisodeClickEvent(
activity,
- click.copy(action = ACTION_PLAY_EPISODE_IN_PLAYER)
+ click.copy(action = action)
)
}
}
@@ -1592,7 +1598,8 @@ class ResultViewModel2 : ViewModel() {
val idIndex = ep.key.id
for ((index, i) in ep.value.withIndex()) {
val episode = i.episode ?: (index + 1)
- val id = mainId + episode + idIndex * 1_000_000 + (i.season?.times(10_000) ?: 0)
+ val id =
+ mainId + episode + idIndex * 1_000_000 + (i.season?.times(10_000) ?: 0)
if (!existingEpisodes.contains(id)) {
existingEpisodes.add(id)
val seasonData = loadResponse.seasonNames.getSeason(i.season)
@@ -1888,7 +1895,10 @@ class ResultViewModel2 : ViewModel() {
if (ep.getWatchProgress() > 0.9) continue
handleAction(
activity,
- EpisodeClickEvent(ACTION_PLAY_EPISODE_IN_PLAYER, ep)
+ EpisodeClickEvent(
+ getPlayerAction(activity),
+ ep
+ )
)
break
}
@@ -1905,7 +1915,10 @@ class ResultViewModel2 : ViewModel() {
?: return@launchSafe
handleAction(
activity,
- EpisodeClickEvent(ACTION_PLAY_EPISODE_IN_PLAYER, episode)
+ EpisodeClickEvent(
+ getPlayerAction(activity),
+ episode
+ )
)
}
}
diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsPlayer.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsPlayer.kt
index 125fadec..33d41934 100644
--- a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsPlayer.kt
+++ b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsPlayer.kt
@@ -113,6 +113,22 @@ class SettingsPlayer : PreferenceFragmentCompat() {
return@setOnPreferenceClickListener true
}
+ getPref(R.string.player_pref_key)?.setOnPreferenceClickListener {
+ val prefNames = resources.getStringArray(R.array.player_pref_names)
+ val prefValues = resources.getIntArray(R.array.player_pref_values)
+ val current = settingsManager.getInt(getString(R.string.player_pref_key), 1)
+
+ activity?.showBottomDialog(
+ prefNames.toList(),
+ prefValues.indexOf(current),
+ getString(R.string.player_pref),
+ true,
+ {}) {
+ settingsManager.edit().putInt(getString(R.string.player_pref_key), prefValues[it]).apply()
+ }
+ return@setOnPreferenceClickListener true
+ }
+
getPref(R.string.subtitle_settings_key)?.setOnPreferenceClickListener {
SubtitlesFragment.push(activity, false)
return@setOnPreferenceClickListener true
diff --git a/app/src/main/res/values/array.xml b/app/src/main/res/values/array.xml
index fedc4219..230f00d7 100644
--- a/app/src/main/res/values/array.xml
+++ b/app/src/main/res/values/array.xml
@@ -33,6 +33,18 @@
- 6
+
+ - @string/player_settings_play_in_app
+ - @string/player_settings_play_in_vlc
+ - @string/player_settings_play_in_browser
+
+
+
+ - 1
+ - 2
+ - 3
+
+
- @string/resolution_and_title
- @string/title
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index d086ad27..7556aed2 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -14,6 +14,7 @@
subtitle_settings_key
subtitle_settings_chromecast_key
quality_pref_key
+ player_pref_key
prefer_limit_title_key
prefer_limit_title_rez_key
video_buffer_size_key
@@ -255,7 +256,7 @@
Search
Accounts
Updates and backup
-
+
Info
Advanced Search
Gives you the search results separated by provider
@@ -626,6 +627,12 @@
Supported
Language
Install the extension first
-
+
HLS Playlist
+
+ Preferred video player
+ Internal player
+ VLC
+ Browser
+ VLC not found
diff --git a/app/src/main/res/xml/settings_player.xml b/app/src/main/res/xml/settings_player.xml
index a7e36488..6946a5c9 100644
--- a/app/src/main/res/xml/settings_player.xml
+++ b/app/src/main/res/xml/settings_player.xml
@@ -18,6 +18,11 @@
android:title="@string/watch_quality_pref"
android:icon="@drawable/ic_baseline_hd_24" />
+
+