diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index f9e0e7de..043195f5 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -23,6 +23,7 @@
+
diff --git a/app/src/main/java/com/lagradost/cloudstream3/MainActivity.kt b/app/src/main/java/com/lagradost/cloudstream3/MainActivity.kt
index cd320060..de01ef9f 100644
--- a/app/src/main/java/com/lagradost/cloudstream3/MainActivity.kt
+++ b/app/src/main/java/com/lagradost/cloudstream3/MainActivity.kt
@@ -101,12 +101,13 @@ val VLC_COMPONENT: ComponentName =
ComponentName(VLC_PACKAGE, "org.videolan.vlc.gui.video.VideoPlayerActivity")
const val VLC_REQUEST_CODE = 42
-const val VLC_FROM_START = -1
-const val VLC_FROM_PROGRESS = -2
const val VLC_EXTRA_POSITION_OUT = "extra_position"
const val VLC_EXTRA_DURATION_OUT = "extra_duration"
const val VLC_LAST_ID_KEY = "vlc_last_open_id"
+const val WEB_VIDEO_CAST_PACKAGE = "com.instantbits.cast.webvideo"
+
+
// Short name for requests client to make it nicer to use
var app = Requests(responseParser = object : ResponseParser {
diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/result/EpisodeAdapter.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/result/EpisodeAdapter.kt
index 09eae138..1997edbf 100644
--- a/app/src/main/java/com/lagradost/cloudstream3/ui/result/EpisodeAdapter.kt
+++ b/app/src/main/java/com/lagradost/cloudstream3/ui/result/EpisodeAdapter.kt
@@ -55,6 +55,9 @@ const val ACTION_SHOW_DESCRIPTION = 15
const val ACTION_DOWNLOAD_EPISODE_SUBTITLE = 13
const val ACTION_DOWNLOAD_EPISODE_SUBTITLE_MIRROR = 14
+const val ACTION_PLAY_EPISODE_IN_WEB_VIDEO = 16
+
+
data class EpisodeClickEvent(val action: Int, val data: ResultEpisode)
class EpisodeAdapter(
@@ -73,6 +76,7 @@ class EpisodeAdapter(
1 -> ACTION_PLAY_EPISODE_IN_PLAYER
2 -> ACTION_PLAY_EPISODE_IN_VLC_PLAYER
3 -> ACTION_PLAY_EPISODE_IN_BROWSER
+ 4 -> ACTION_PLAY_EPISODE_IN_WEB_VIDEO
else -> ACTION_PLAY_EPISODE_IN_PLAYER
}
}
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 6f3cb686..9bf378eb 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
@@ -3,6 +3,7 @@ package com.lagradost.cloudstream3.ui.result
import android.app.Activity
import android.content.*
import android.net.Uri
+import android.os.Bundle
import android.util.Log
import android.widget.Toast
import androidx.core.content.FileProvider
@@ -51,9 +52,7 @@ import com.lagradost.cloudstream3.utils.DataStoreHelper.getViewPos
import com.lagradost.cloudstream3.utils.DataStoreHelper.setDub
import com.lagradost.cloudstream3.utils.DataStoreHelper.setResultEpisode
import com.lagradost.cloudstream3.utils.DataStoreHelper.setResultSeason
-import com.lagradost.cloudstream3.utils.UIHelper.checkWrite
import com.lagradost.cloudstream3.utils.UIHelper.navigate
-import com.lagradost.cloudstream3.utils.UIHelper.requestRW
import kotlinx.coroutines.*
import java.io.File
import java.lang.Math.abs
@@ -955,105 +954,152 @@ class ResultViewModel2 : ViewModel() {
return LinkLoadingResult(sortUrls(links), sortSubs(subs))
}
+ private fun launchActivity(
+ activity: Activity?,
+ work: suspend (CoroutineScope.(Activity) -> Unit)
+ ): Job? {
+ val act = activity ?: return null
+ return CoroutineScope(Dispatchers.IO).launch {
+ try {
+ work(act)
+ } catch (t: Throwable) {
+ logError(t)
+ main {
+ if (t is ActivityNotFoundException) {
+ showToast(activity, txt(R.string.app_not_found_error), Toast.LENGTH_LONG)
+ } else {
+ showToast(activity, t.toString(), Toast.LENGTH_LONG)
+ }
+ }
+ }
+ }
+ }
+
+ private fun playInWebVideo(
+ activity: Activity?,
+ link: ExtractorLink,
+ title: String?,
+ posterUrl: String?,
+ subtitles: List
+ ) = launchActivity(activity) { act ->
+ val shareVideo = Intent(Intent.ACTION_VIEW)
+
+ shareVideo.setDataAndType(Uri.parse(link.url), "video/*")
+ shareVideo.setPackage(WEB_VIDEO_CAST_PACKAGE)
+ shareVideo.putExtra("subs", subtitles.map { it.url.toUri() }.toTypedArray())
+ title?.let { shareVideo.putExtra("title", title) }
+ posterUrl?.let { shareVideo.putExtra("poster", posterUrl) }
+ val headers = Bundle().apply {
+ if (link.referer.isNotBlank())
+ putString("Referer", link.referer)
+ putString("User-Agent", USER_AGENT)
+ for ((key, value) in link.headers) {
+ putString(key, value)
+ }
+ }
+ shareVideo.putExtra("android.media.intent.extra.HTTP_HEADERS", headers)
+ shareVideo.putExtra("secure_uri", true)
+
+ act.startActivity(shareVideo)
+ }
+
// https://wiki.videolan.org/Android_Player_Intents/
private fun playWithVlc(
- act: Activity?,
+ activity: Activity?,
data: LinkLoadingResult,
id: Int,
resume: Boolean = true,
// if it is only a single link then resume works correctly
singleFile: Boolean? = null
- ) = ioSafe {
- if (act == null) return@ioSafe
- if (data.links.isEmpty()) {
- showToast(act, R.string.no_links_found_toast, Toast.LENGTH_SHORT)
- return@ioSafe
- }
- try {
- if (!act.checkWrite()) {
- act.requestRW()
- if (act.checkWrite()) return@ioSafe
- }
+ ) = launchActivity(activity) { act ->
+ val vlcIntent = Intent(VLC_INTENT_ACTION_RESULT)
- val vlcIntent = Intent(VLC_INTENT_ACTION_RESULT)
+ vlcIntent.setPackage(VLC_PACKAGE)
+ vlcIntent.addFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION)
+ vlcIntent.addFlags(Intent.FLAG_GRANT_PREFIX_URI_PERMISSION)
+ vlcIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
+ vlcIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION)
+ val outputDir = act.cacheDir
- vlcIntent.setPackage(VLC_PACKAGE)
- vlcIntent.addFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION)
- vlcIntent.addFlags(Intent.FLAG_GRANT_PREFIX_URI_PERMISSION)
- vlcIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
- vlcIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION)
- val outputDir = act.cacheDir
+ if (singleFile ?: (data.links.size == 1)) {
+ vlcIntent.setDataAndType(data.links.first().url.toUri(), "video/*")
+ } else {
+ val outputFile = File.createTempFile("mirrorlist", ".m3u8", outputDir)
- if (singleFile ?: (data.links.size == 1)) {
- vlcIntent.setDataAndType(data.links.first().url.toUri(), "video/*")
- } else {
- val outputFile = File.createTempFile("mirrorlist", ".m3u8", outputDir)
+ var text = "#EXTM3U"
- var text = "#EXTM3U"
-
- // With subtitles it doesn't work for no reason :(
+ // 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}"
- }
- outputFile.writeText(text)
+ for (link in data.links) {
+ text += "\n#EXTINF:, ${link.name}\n${link.url}"
+ }
+ outputFile.writeText(text)
- vlcIntent.setDataAndType(
- FileProvider.getUriForFile(
+ vlcIntent.setDataAndType(
+ FileProvider.getUriForFile(
+ act,
+ act.applicationContext.packageName + ".provider",
+ outputFile
+ ), "video/*"
+ )
+ }
+
+ val position = if (resume) {
+ getViewPos(id)?.position ?: 0L
+ } else {
+ 1L
+ }
+ vlcIntent.putExtra("from_start", !resume)
+ vlcIntent.putExtra("position", position)
+ //vlcIntent.putExtra("subtitles_location", data.subs.first().url)
+ /*for (s in data.subs) {
+ if (s.origin == SubtitleOrigin.URL) {
+ try {
+ val txt = app.get(s.url, s.headers).text
+ val subtitleFile = File.createTempFile("subtitle1", ".srt", outputDir)
+ subtitleFile.writeText(txt)
+ println("Subtitles::::::${subtitleFile.path}")
+ vlcIntent.putExtra("subtitles_location", FileProvider.getUriForFile(
act,
act.applicationContext.packageName + ".provider",
- outputFile
- ), "video/*"
- )
- }
-
- val position = if (resume) {
- getViewPos(id)?.position ?: 0L
- } else {
- 1L
- }
- vlcIntent.putExtra("from_start", !resume)
- vlcIntent.putExtra("position", position)
- //vlcIntent.putExtra("subtitles_location", data.subs.first().url)
- /*for (s in data.subs) {
- if (s.origin == SubtitleOrigin.URL) {
- try {
- val txt = app.get(s.url, s.headers).text
- val subtitleFile = File.createTempFile("subtitle1", ".srt", outputDir)
- subtitleFile.writeText(txt)
- println("Subtitles::::::${subtitleFile.path}")
- vlcIntent.putExtra("subtitles_location", FileProvider.getUriForFile(
- act,
- act.applicationContext.packageName + ".provider",
- subtitleFile
- ))
- break
- } catch (t : Throwable) {
- logError(t)
- }
- }
- }*/
-
- vlcIntent.component = VLC_COMPONENT
- act.setKey(VLC_LAST_ID_KEY, id)
- act.startActivityForResult(vlcIntent, VLC_REQUEST_CODE)
- } catch (e: Exception) {
- logError(e)
- 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)
+ subtitleFile
+ ))
+ break
+ } catch (t : Throwable) {
+ logError(t)
}
}
+ }*/
+
+ vlcIntent.component = VLC_COMPONENT
+ act.setKey(VLC_LAST_ID_KEY, id)
+ act.startActivityForResult(vlcIntent, VLC_REQUEST_CODE)
+ }
+
+ fun handleAction(activity: Activity?, click: EpisodeClickEvent) =
+ viewModelScope.launchSafe {
+ handleEpisodeClickEvent(activity, click)
}
- }
- fun handleAction(activity: Activity?, click: EpisodeClickEvent) = viewModelScope.launchSafe {
- handleEpisodeClickEvent(activity, click)
- }
+ data class ExternalApp(
+ val packageString: String,
+ val name: Int,
+ val action: Int,
+ )
+
+ private val apps = listOf(
+ ExternalApp(
+ VLC_PACKAGE,
+ R.string.player_settings_play_in_vlc,
+ ACTION_PLAY_EPISODE_IN_VLC_PLAYER
+ ), ExternalApp(
+ WEB_VIDEO_CAST_PACKAGE,
+ R.string.player_settings_play_in_web,
+ ACTION_PLAY_EPISODE_IN_WEB_VIDEO
+ )
+ )
private suspend fun handleEpisodeClickEvent(activity: Activity?, click: EpisodeClickEvent) {
when (click.action) {
@@ -1069,9 +1115,17 @@ class ResultViewModel2 : ViewModel() {
}
options.add(txt(R.string.episode_action_play_in_app) to ACTION_PLAY_EPISODE_IN_PLAYER)
- if (activity?.isAppInstalled(VLC_PACKAGE) == true) {
- options.add(txt(R.string.episode_action_play_in_vlc) to ACTION_PLAY_EPISODE_IN_VLC_PLAYER)
+ for (app in apps) {
+ if (activity?.isAppInstalled(app.packageString) == true) {
+ options.add(
+ txt(
+ R.string.episode_action_play_in_format,
+ txt(app.name)
+ ) to app.action
+ )
+ }
}
+
options.addAll(
listOf(
txt(R.string.episode_action_play_in_browser) to ACTION_PLAY_EPISODE_IN_BROWSER,
@@ -1247,6 +1301,11 @@ class ResultViewModel2 : ViewModel() {
}
ACTION_PLAY_EPISODE_IN_VLC_PLAYER -> {
loadLinks(click.data, isVisible = true, isCasting = true) { links ->
+ if (links.links.isEmpty()) {
+ showToast(activity, R.string.no_links_found_toast, Toast.LENGTH_SHORT)
+ return@loadLinks
+ }
+
playWithVlc(
activity,
links,
@@ -1254,6 +1313,22 @@ class ResultViewModel2 : ViewModel() {
)
}
}
+ ACTION_PLAY_EPISODE_IN_WEB_VIDEO -> acquireSingleLink(
+ click.data,
+ isCasting = true,
+ txt(
+ R.string.episode_action_play_in_format,
+ txt(R.string.player_settings_play_in_web)
+ )
+ ) { (result, index) ->
+ playInWebVideo(
+ activity,
+ result.links[index],
+ click.data.name ?: click.data.headerName,
+ click.data.poster,
+ result.subs
+ )
+ }
ACTION_PLAY_EPISODE_IN_PLAYER -> {
val data = currentResponse?.syncData?.toList() ?: emptyList()
val list =
@@ -1319,7 +1394,11 @@ class ResultViewModel2 : ViewModel() {
}, {
if (this !is AnimeLoadResponse) return@argamap
val map =
- Kitsu.getEpisodesDetails(getMalId(), getAniListId(), isResponseRequired = false)
+ Kitsu.getEpisodesDetails(
+ getMalId(),
+ getAniListId(),
+ isResponseRequired = false
+ )
if (map.isNullOrEmpty()) return@argamap
updateEpisodes = DubStatus.values().map { dubStatus ->
val current =
@@ -1339,8 +1418,10 @@ class ResultViewModel2 : ViewModel() {
val currentBack = this
this.description = this.description ?: node.description?.en
this.name = this.name ?: node.titles?.canonical
- this.episode = this.episode ?: node.num ?: episodeNumbers[index]
- this.posterUrl = this.posterUrl ?: node.thumbnail?.original?.url
+ this.episode =
+ this.episode ?: node.num ?: episodeNumbers[index]
+ this.posterUrl =
+ this.posterUrl ?: node.thumbnail?.original?.url
}
}
}
@@ -1628,7 +1709,8 @@ class ResultViewModel2 : ViewModel() {
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)
+ 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)
diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml
index 23b9af9b..3fb2e26c 100644
--- a/app/src/main/res/values-ar/strings.xml
+++ b/app/src/main/res/values-ar/strings.xml
@@ -274,7 +274,7 @@
حلقة كروم كاست
مرآة كروم كاست
تشغيل في التطبيق
- VLC تشغيل في
+ %s تشغيل في
تشغيل في الويب
نسخ الرابط
التحميل التلقائي
diff --git a/app/src/main/res/values-bp/strings.xml b/app/src/main/res/values-bp/strings.xml
index d4cb4caa..bffaf804 100644
--- a/app/src/main/res/values-bp/strings.xml
+++ b/app/src/main/res/values-bp/strings.xml
@@ -279,7 +279,7 @@
Episódio pelo Chromecast
Alternativa pelo Chromecast
Assistir no App
- Assistir no VLC
+ Assistir no %s
Assistir no navegador
Copiar link
Auto download
diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml
index aa840760..9e00f17b 100644
--- a/app/src/main/res/values-cs/strings.xml
+++ b/app/src/main/res/values-cs/strings.xml
@@ -268,7 +268,7 @@
Chromecastovat epizodu
Chromecast jako zrcadlo
Přehrát v aplikace
- Přehrát ve VLC
+ Přehrát ve %s
Přehrát v prohlížeči
Zkopírovat odkaz
Automaticky stáhnout
diff --git a/app/src/main/res/values-de/strings-de.xml b/app/src/main/res/values-de/strings-de.xml
index 621080b5..e1d657c7 100644
--- a/app/src/main/res/values-de/strings-de.xml
+++ b/app/src/main/res/values-de/strings-de.xml
@@ -281,7 +281,7 @@
Chromecast-Episode
Chromecastmirror
In App wiedergeben
- In VLC wiedergeben
+ In %s wiedergeben
In Browser wiedergeben
Link kopieren
Auto Download
diff --git a/app/src/main/res/values-es/array.xml b/app/src/main/res/values-es/array.xml
index ae986642..d1e5be2f 100644
--- a/app/src/main/res/values-es/array.xml
+++ b/app/src/main/res/values-es/array.xml
@@ -156,7 +156,7 @@
- @string/episode_action_chromecast_episode
- @string/episode_action_chromecast_mirror
- @string/episode_action_play_in_app
- - @string/episode_action_play_in_vlc
+ - @string/episode_action_play_in_format
- @string/episode_action_play_in_browser
- @string/episode_action_copy_link
- @string/episode_action_auto_download
diff --git a/app/src/main/res/values-es/strings-es.xml b/app/src/main/res/values-es/strings-es.xml
index 9b739b39..172d079c 100644
--- a/app/src/main/res/values-es/strings-es.xml
+++ b/app/src/main/res/values-es/strings-es.xml
@@ -269,7 +269,7 @@
Episodio Chromecast
Espejo Chromecast
Reproducir en la app
- Reproducir en VLC
+ Reproducir en %s
Reproducir en el navegador
Copiar enlace
Descarga automática
diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml
index 7d259b31..c98173ce 100644
--- a/app/src/main/res/values-fr/strings.xml
+++ b/app/src/main/res/values-fr/strings.xml
@@ -164,7 +164,7 @@
Episode Chromecast
Miroir Chromecast
Lecture dans l\'application
- Lecture dans VLC
+ Lecture dans %s
Lecture dans le navigateur
Copier le lien
Téléchargement Automatique
diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml
index e3f0a233..a6ad0af7 100644
--- a/app/src/main/res/values-hi/strings.xml
+++ b/app/src/main/res/values-hi/strings.xml
@@ -136,7 +136,7 @@
क्रोमकास्ट एपिसोड
कक्रोमकास्ट मिरर
एप्प मैं चलाये
- VLC में चलाए
+ %s में चलाए
Browser में चलाए
लिंक कॉपी करें
डाउनलोड करे
diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml
index bc2a7098..2a7bff1c 100644
--- a/app/src/main/res/values-hr/strings.xml
+++ b/app/src/main/res/values-hr/strings.xml
@@ -299,7 +299,7 @@
Chromecast epizoda
Chromecast mirror
Pokreni u aplikaciji
- Pokreni u VLC-u
+ Pokreni u %s
Pokreni u pregledniku
Kopiraj poveznicu
Automatsko preuzimanje
diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml
index e8f7e9e9..31b84bfd 100644
--- a/app/src/main/res/values-in/strings.xml
+++ b/app/src/main/res/values-in/strings.xml
@@ -264,7 +264,7 @@
Episode Chromecast
Mirror Chromecast
Putar di aplikasi
- Putar di VLC
+ Putar di %s
Putar di browser
Salin tautan
Download otomatis
diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml
index db72b31d..86206213 100644
--- a/app/src/main/res/values-it/strings.xml
+++ b/app/src/main/res/values-it/strings.xml
@@ -271,7 +271,7 @@
Chromecast
Chromecast mirror
Riproduci in app
- Riproduci in VLC
+ Riproduci in %s
Riproduci nel browser
Copia link
Download
diff --git a/app/src/main/res/values-mk/strings.xml b/app/src/main/res/values-mk/strings.xml
index 96044dc7..85aee997 100644
--- a/app/src/main/res/values-mk/strings.xml
+++ b/app/src/main/res/values-mk/strings.xml
@@ -190,7 +190,7 @@
Епизода на Chromecast
Огледало на Chromecastr
Пушти во апликацијата
- Пушти на VLC
+ Пушти на %s
Пушти на прелистувач
Копирај линк
Авто превземање
diff --git a/app/src/main/res/values-ml/strings.xml b/app/src/main/res/values-ml/strings.xml
index d8fab674..78f45e26 100644
--- a/app/src/main/res/values-ml/strings.xml
+++ b/app/src/main/res/values-ml/strings.xml
@@ -175,7 +175,7 @@
ആപ്പിൽ പ്ലേയ് ചെയ്യുക
- VLCയിൽ പ്ലേയ് ചെയ്യുക
+ %sയിൽ പ്ലേയ് ചെയ്യുക
ബ്രൗസറിൽ പ്ലേയ് ചെയ്യുക
ലിങ്ക് പകർത്തുക
ഡൌൺലോഡ് ചെയ്യൂ
diff --git a/app/src/main/res/values-mo/string.xml b/app/src/main/res/values-mo/string.xml
index 340428b9..361aaf56 100644
--- a/app/src/main/res/values-mo/string.xml
+++ b/app/src/main/res/values-mo/string.xml
@@ -145,7 +145,7 @@
aauugghhooo-ahah ohaaauugghh
aoohaaahhu ahouuhhh
ooo-ahahaauuh aaahhu
- ooo-ahah ohaauuh
+ ooo-ahah ohaauuh
ahoha ooo-ahahohoohah oooohh
aauugghhahhaauugghh
aaaghhoooohh aaahhu ahooo
diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml
index a5afd785..7daca143 100644
--- a/app/src/main/res/values-nl/strings.xml
+++ b/app/src/main/res/values-nl/strings.xml
@@ -274,7 +274,7 @@
Chromecast aflevering
Chromecast mirror
Speel in app
- Speel in VLC
+ Speel in %s
Speel in browser
Kopieer link
Automatisch downloaden
diff --git a/app/src/main/res/values-no/strings.xml b/app/src/main/res/values-no/strings.xml
index fc7cbbe2..ebd6ee49 100644
--- a/app/src/main/res/values-no/strings.xml
+++ b/app/src/main/res/values-no/strings.xml
@@ -196,7 +196,7 @@
Støpt Episode
Støpt Speil
Spill i appen
- Spill i VLC
+ Spill i %s
Spill i nettleseren
Kopier link
Automatisk nedlasting
diff --git a/app/src/main/res/values-pl/array.xml b/app/src/main/res/values-pl/array.xml
index 3fe30d95..30b6f4a1 100644
--- a/app/src/main/res/values-pl/array.xml
+++ b/app/src/main/res/values-pl/array.xml
@@ -165,7 +165,7 @@
- @string/episode_action_chromecast_episode
- @string/episode_action_chromecast_mirror
- @string/episode_action_play_in_app
- - @string/episode_action_play_in_vlc
+ - @string/episode_action_play_in_format
- @string/episode_action_play_in_browser
- @string/episode_action_copy_link
- @string/episode_action_auto_download
diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml
index fdc89692..6da1cc8f 100644
--- a/app/src/main/res/values-pl/strings.xml
+++ b/app/src/main/res/values-pl/strings.xml
@@ -252,7 +252,7 @@
Chromecast odcinka
Chromecast mirroru
Odtwórz w aplikacji
- Odtwórz w VLC
+ Odtwórz w %s
Odtwórz w przeglądarce
Kopiuj link
Automatyczne pobieranie
diff --git a/app/src/main/res/values-pt/strings-pt.xml b/app/src/main/res/values-pt/strings-pt.xml
index de70f746..375c3193 100644
--- a/app/src/main/res/values-pt/strings-pt.xml
+++ b/app/src/main/res/values-pt/strings-pt.xml
@@ -268,7 +268,7 @@
Episódio pelo Chromecast
Alternativa pelo Chromecast
Reproduzir na app
- Reproduzir no VLC
+ Reproduzir no %s
Reproduzir no navegador
Copiar link
Transferência Automática
diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml
index 7d1f3458..ce8f328c 100644
--- a/app/src/main/res/values-ro/strings.xml
+++ b/app/src/main/res/values-ro/strings.xml
@@ -267,7 +267,7 @@
Chromecast
Chromecast alternativ
Redă în Aplicație
- Redă în VLC
+ Redă în %s
Redă în Browser
Copiază link-ul
Auto-descărcare
diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml
index 3f3cead1..58ff060e 100644
--- a/app/src/main/res/values-sv/strings.xml
+++ b/app/src/main/res/values-sv/strings.xml
@@ -167,7 +167,7 @@
Chromecasta ett Avsnitt
Chromecasta en Länk
Spela upp i appen
- Spela upp i VLC
+ Spela upp i %s
Spela upp i webbläsaren
Kopiera länk
Automatisk nerladdning
diff --git a/app/src/main/res/values-tl/strings.xml b/app/src/main/res/values-tl/strings.xml
index 9d0e0e02..dfe922ee 100644
--- a/app/src/main/res/values-tl/strings.xml
+++ b/app/src/main/res/values-tl/strings.xml
@@ -204,7 +204,7 @@
Chromecast Episode
Chromecast Mirror
I-play sa App
- I-play sa VLC
+ I-play sa %s
I-play sa browser
Kopyahin ang Link
Awtomatiking i-download
diff --git a/app/src/main/res/values-tr/array.xml b/app/src/main/res/values-tr/array.xml
index dbb17d36..177be03b 100644
--- a/app/src/main/res/values-tr/array.xml
+++ b/app/src/main/res/values-tr/array.xml
@@ -156,7 +156,7 @@
- @string/episode_action_chromecast_episode
- @string/episode_action_chromecast_mirror
- @string/episode_action_play_in_app
- - @string/episode_action_play_in_vlc
+ - @string/episode_action_play_in_format
- @string/episode_action_play_in_browser
- @string/episode_action_copy_link
- @string/episode_action_auto_download
diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml
index 14db2f6b..48e36013 100644
--- a/app/src/main/res/values-tr/strings.xml
+++ b/app/src/main/res/values-tr/strings.xml
@@ -272,7 +272,7 @@
Bölümü Chromecast ile yayınla
Bağlantıyı Chromecast ile yayınla
Uygulamada oynat
- VLC\'de oynat
+ %s\'de oynat
Tarayıcıda oynat
Linki kopyala
Otomatik indir
diff --git a/app/src/main/res/values-vi/array.xml b/app/src/main/res/values-vi/array.xml
index 5fee2d29..a5145c9e 100644
--- a/app/src/main/res/values-vi/array.xml
+++ b/app/src/main/res/values-vi/array.xml
@@ -157,7 +157,7 @@
- @string/episode_action_chromecast_episode
- @string/episode_action_chromecast_mirror
- @string/episode_action_play_in_app
- - @string/episode_action_play_in_vlc
+ - @string/episode_action_play_in_format
- @string/episode_action_play_in_browser
- @string/episode_action_copy_link
- @string/episode_action_auto_download
diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml
index 302c13b5..ce8358cf 100644
--- a/app/src/main/res/values-vi/strings.xml
+++ b/app/src/main/res/values-vi/strings.xml
@@ -292,7 +292,7 @@
Tập Chromecast
Chiếu Chromecast
Xem với trình phát mặc định
- Xem với trình phát VLC
+ Xem với trình phát %s
Xem tại trình duyệt
Sao chép liên kết
Tự động tải xuống
diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml
index d3ff6e1e..a6557990 100644
--- a/app/src/main/res/values-zh/strings.xml
+++ b/app/src/main/res/values-zh/strings.xml
@@ -303,7 +303,7 @@
投屏剧集
投屏镜像
在应用中播放
- 在 VLC 中播放
+ 在 %s 中播放
在浏览器中播放
复制链接
自动下载
diff --git a/app/src/main/res/values/array.xml b/app/src/main/res/values/array.xml
index 230f00d7..e4c8eb78 100644
--- a/app/src/main/res/values/array.xml
+++ b/app/src/main/res/values/array.xml
@@ -36,12 +36,14 @@
- @string/player_settings_play_in_app
- @string/player_settings_play_in_vlc
+ - @string/player_settings_play_in_web
- @string/player_settings_play_in_browser
- 1
- 2
+ - 4
- 3
@@ -187,7 +189,7 @@
- @string/episode_action_chromecast_episode
- @string/episode_action_chromecast_mirror
- @string/episode_action_play_in_app
- - @string/episode_action_play_in_vlc
+ - @string/episode_action_play_in_format
- @string/episode_action_play_in_browser
- @string/episode_action_copy_link
- @string/episode_action_auto_download
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 7556aed2..7940eca9 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -364,7 +364,7 @@
Chromecast episode
Chromecast mirror
Play in app
- Play in VLC
+ Play in %s
Play in browser
Copy link
Auto download
@@ -633,6 +633,7 @@
Preferred video player
Internal player
VLC
+ Web Video Cast
Browser
- VLC not found
+ App not found