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" /> + +