Merge branch 'recloudstream:master' into master

This commit is contained in:
KillerDogeEmpire 2022-10-08 10:39:15 -07:00 committed by GitHub
commit 2b84e52f88
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
34 changed files with 207 additions and 87 deletions

View File

@ -1,8 +1,8 @@
blank_issues_enabled: false
contact_links:
- name: Report provider bug
- name: Request a new provider or report bug with an existing provider
url: https://github.com/recloudstream
about: Please do not report any provider bugs here. This repository does not contain any providers. Please find the appropriate repository and report your issue there or join the discord.
about: Please do not report any provider bugs here or request new providers. This repository does not contain any providers. Please find the appropriate repository and report your issue there or join the discord.
- name: Discord
url: https://discord.gg/5Hus6fM
about: Join our discord for faster support on smaller issues.

View File

@ -23,6 +23,7 @@
<queries>
<package android:name="org.videolan.vlc" />
<package android:name="com.instantbits.cast.webvideo" />
</queries>
<!--TODO https://stackoverflow.com/questions/41799732/chromecast-button-not-visible-in-android-->

View File

@ -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 {

View File

@ -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
}
}

View File

@ -3,9 +3,11 @@ 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
import androidx.core.net.toUri
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
@ -50,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
@ -954,22 +954,78 @@ class ResultViewModel2 : ViewModel() {
return LinkLoadingResult(sortUrls(links), sortSubs(subs))
}
private fun playWithVlc(act: Activity?, data: LinkLoadingResult, id: Int) = ioSafe {
if (act == null) return@ioSafe
if (data.links.isEmpty()) {
showToast(act, R.string.no_links_found_toast, Toast.LENGTH_SHORT)
return@ioSafe
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)
}
}
}
}
try {
if (!act.checkWrite()) {
act.requestRW()
if (act.checkWrite()) return@ioSafe
}
}
val outputDir = act.cacheDir
val outputFile = withContext(Dispatchers.IO) {
File.createTempFile("mirrorlist", ".m3u8", outputDir)
private fun playInWebVideo(
activity: Activity?,
link: ExtractorLink,
title: String?,
posterUrl: String?,
subtitles: List<SubtitleData>
) = 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(
activity: Activity?,
data: LinkLoadingResult,
id: Int,
resume: Boolean = true,
// if it is only a single link then resume works correctly
singleFile: Boolean? = null
) = launchActivity(activity) { act ->
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
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"
// With subtitles it doesn't work for no reason :(
@ -981,14 +1037,6 @@ class ResultViewModel2 : ViewModel() {
}
outputFile.writeText(text)
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)
vlcIntent.setDataAndType(
FileProvider.getUriForFile(
act,
@ -996,35 +1044,62 @@ class ResultViewModel2 : ViewModel() {
outputFile
), "video/*"
)
}
val startId = VLC_FROM_PROGRESS
val position = when (startId) {
VLC_FROM_START -> 1
VLC_FROM_PROGRESS -> 0
else -> 0
}
vlcIntent.putExtra("position", position)
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)
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)
}
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) {
@ -1040,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,
@ -1218,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,
@ -1225,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 =
@ -1290,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 =
@ -1310,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
}
}
}
@ -1599,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)

View File

@ -274,7 +274,7 @@
<string name="episode_action_chromecast_episode">حلقة كروم كاست</string>
<string name="episode_action_chromecast_mirror">مرآة كروم كاست</string>
<string name="episode_action_play_in_app">تشغيل في التطبيق</string>
<string name="episode_action_play_in_vlc">VLC تشغيل في</string>
<string name="episode_action_play_in_format">%s تشغيل في</string>
<string name="episode_action_play_in_browser">تشغيل في الويب </string>
<string name="episode_action_copy_link">نسخ الرابط</string>
<string name="episode_action_auto_download">التحميل التلقائي</string>

View File

@ -279,7 +279,7 @@
<string name="episode_action_chromecast_episode">Episódio pelo Chromecast</string>
<string name="episode_action_chromecast_mirror">Alternativa pelo Chromecast</string>
<string name="episode_action_play_in_app">Assistir no App</string>
<string name="episode_action_play_in_vlc">Assistir no VLC</string>
<string name="episode_action_play_in_format">Assistir no %s</string>
<string name="episode_action_play_in_browser">Assistir no navegador</string>
<string name="episode_action_copy_link">Copiar link</string>
<string name="episode_action_auto_download">Auto download</string>

View File

@ -268,7 +268,7 @@
<string name="episode_action_chromecast_episode">Chromecastovat epizodu</string>
<string name="episode_action_chromecast_mirror">Chromecast jako zrcadlo</string>
<string name="episode_action_play_in_app">Přehrát v aplikace</string>
<string name="episode_action_play_in_vlc">Přehrát ve VLC</string>
<string name="episode_action_play_in_format">Přehrát ve %s</string>
<string name="episode_action_play_in_browser">Přehrát v prohlížeči</string>
<string name="episode_action_copy_link">Zkopírovat odkaz</string>
<string name="episode_action_auto_download">Automaticky stáhnout</string>

View File

@ -281,7 +281,7 @@
<string name="episode_action_chromecast_episode">Chromecast-Episode</string>
<string name="episode_action_chromecast_mirror">Chromecastmirror</string>
<string name="episode_action_play_in_app">In App wiedergeben</string>
<string name="episode_action_play_in_vlc">In VLC wiedergeben</string>
<string name="episode_action_play_in_format">In %s wiedergeben</string>
<string name="episode_action_play_in_browser">In Browser wiedergeben</string>
<string name="episode_action_copy_link">Link kopieren</string>
<string name="episode_action_auto_download">Auto Download</string>

View File

@ -156,7 +156,7 @@
<item>@string/episode_action_chromecast_episode</item>
<item>@string/episode_action_chromecast_mirror</item>
<item>@string/episode_action_play_in_app</item>
<item>@string/episode_action_play_in_vlc</item>
<item>@string/episode_action_play_in_format</item>
<item>@string/episode_action_play_in_browser</item>
<item>@string/episode_action_copy_link</item>
<item>@string/episode_action_auto_download</item>

View File

@ -269,7 +269,7 @@
<string name="episode_action_chromecast_episode">Episodio Chromecast</string>
<string name="episode_action_chromecast_mirror">Espejo Chromecast</string>
<string name="episode_action_play_in_app">Reproducir en la app</string>
<string name="episode_action_play_in_vlc">Reproducir en VLC</string>
<string name="episode_action_play_in_format">Reproducir en %s</string>
<string name="episode_action_play_in_browser">Reproducir en el navegador</string>
<string name="episode_action_copy_link">Copiar enlace</string>
<string name="episode_action_auto_download">Descarga automática</string>

View File

@ -164,7 +164,7 @@
<string name="episode_action_chromecast_episode">Episode Chromecast</string>
<string name="episode_action_chromecast_mirror">Miroir Chromecast</string>
<string name="episode_action_play_in_app">Lecture dans l\'application</string>
<string name="episode_action_play_in_vlc">Lecture dans VLC</string>
<string name="episode_action_play_in_format">Lecture dans %s</string>
<string name="episode_action_play_in_browser">Lecture dans le navigateur</string>
<string name="episode_action_copy_link">Copier le lien</string>
<string name="episode_action_auto_download">Téléchargement Automatique</string>

View File

@ -136,7 +136,7 @@
<string name="episode_action_chromecast_episode">क्रोमकास्ट एपिसोड</string>
<string name="episode_action_chromecast_mirror">कक्रोमकास्ट मिरर</string>
<string name="episode_action_play_in_app">एप्प मैं चलाये</string>
<string name="episode_action_play_in_vlc">VLC में चलाए</string>
<string name="episode_action_play_in_format">%s में चलाए</string>
<string name="episode_action_play_in_browser">Browser में चलाए</string>
<string name="episode_action_copy_link">लिंक कॉपी करें</string>
<string name="episode_action_auto_download">डाउनलोड करे</string>

View File

@ -299,7 +299,7 @@
<string name="episode_action_chromecast_episode">Chromecast epizoda</string>
<string name="episode_action_chromecast_mirror">Chromecast mirror</string>
<string name="episode_action_play_in_app">Pokreni u aplikaciji</string>
<string name="episode_action_play_in_vlc">Pokreni u VLC-u</string>
<string name="episode_action_play_in_format">Pokreni u %s</string>
<string name="episode_action_play_in_browser">Pokreni u pregledniku</string>
<string name="episode_action_copy_link">Kopiraj poveznicu</string>
<string name="episode_action_auto_download">Automatsko preuzimanje</string>

View File

@ -264,7 +264,7 @@
<string name="episode_action_chromecast_episode">Episode Chromecast</string>
<string name="episode_action_chromecast_mirror">Mirror Chromecast</string>
<string name="episode_action_play_in_app">Putar di aplikasi</string>
<string name="episode_action_play_in_vlc">Putar di VLC</string>
<string name="episode_action_play_in_format">Putar di %s</string>
<string name="episode_action_play_in_browser">Putar di browser</string>
<string name="episode_action_copy_link">Salin tautan</string>
<string name="episode_action_auto_download">Download otomatis</string>

View File

@ -271,7 +271,7 @@
<string name="episode_action_chromecast_episode">Chromecast</string>
<string name="episode_action_chromecast_mirror">Chromecast mirror</string>
<string name="episode_action_play_in_app">Riproduci in app</string>
<string name="episode_action_play_in_vlc">Riproduci in VLC</string>
<string name="episode_action_play_in_format">Riproduci in %s</string>
<string name="episode_action_play_in_browser">Riproduci nel browser</string>
<string name="episode_action_copy_link">Copia link</string>
<string name="episode_action_auto_download">Download</string>

View File

@ -190,7 +190,7 @@
<string name="episode_action_chromecast_episode">Епизода на Chromecast</string>
<string name="episode_action_chromecast_mirror">Огледало на Chromecastr</string>
<string name="episode_action_play_in_app">Пушти во апликацијата</string>
<string name="episode_action_play_in_vlc">Пушти на VLC</string>
<string name="episode_action_play_in_format">Пушти на %s</string>
<string name="episode_action_play_in_browser">Пушти на прелистувач</string>
<string name="episode_action_copy_link">Копирај линк</string>
<string name="episode_action_auto_download">Авто превземање</string>

View File

@ -175,7 +175,7 @@
<!-- <string name="episode_action_chomecast_episode">Chromecast Episode</string>
<string name="episode_action_chomecast_mirror">Chromecast Mirror</string> -->
<string name="episode_action_play_in_app">ആപ്പിൽ പ്ലേയ് ചെയ്യുക</string>
<string name="episode_action_play_in_vlc">VLCയിൽ പ്ലേയ് ചെയ്യുക</string>
<string name="episode_action_play_in_format">%sയിൽ പ്ലേയ് ചെയ്യുക</string>
<string name="episode_action_play_in_browser">ബ്രൗസറിൽ പ്ലേയ് ചെയ്യുക</string>
<string name="episode_action_copy_link">ലിങ്ക് പകർത്തുക</string>
<string name="episode_action_auto_download">ഡൌൺലോഡ് ചെയ്യൂ</string>

View File

@ -145,7 +145,7 @@
<string name="episode_action_chromecast_episode">aauugghhooo-ahah ohaaauugghh</string>
<string name="episode_action_chromecast_mirror">aoohaaahhu ahouuhhh</string>
<string name="episode_action_play_in_app">ooo-ahahaauuh aaahhu</string>
<string name="episode_action_play_in_vlc">ooo-ahah ohaauuh</string>
<string name="episode_action_play_in_format">ooo-ahah ohaauuh</string>
<string name="episode_action_play_in_browser">ahoha ooo-ahahohoohah oooohh</string>
<string name="episode_action_copy_link">aauugghhahhaauugghh</string>
<string name="episode_action_auto_download">aaaghhoooohh aaahhu ahooo</string>

View File

@ -274,7 +274,7 @@
<string name="episode_action_chromecast_episode">Chromecast aflevering</string>
<string name="episode_action_chromecast_mirror">Chromecast mirror</string>
<string name="episode_action_play_in_app">Speel in app</string>
<string name="episode_action_play_in_vlc">Speel in VLC</string>
<string name="episode_action_play_in_format">Speel in %s</string>
<string name="episode_action_play_in_browser">Speel in browser</string>
<string name="episode_action_copy_link">Kopieer link</string>
<string name="episode_action_auto_download">Automatisch downloaden</string>

View File

@ -196,7 +196,7 @@
<string name="episode_action_chromecast_episode">Støpt Episode</string>
<string name="episode_action_chromecast_mirror">Støpt Speil</string>
<string name="episode_action_play_in_app">Spill i appen</string>
<string name="episode_action_play_in_vlc">Spill i VLC</string>
<string name="episode_action_play_in_format">Spill i %s</string>
<string name="episode_action_play_in_browser">Spill i nettleseren</string>
<string name="episode_action_copy_link">Kopier link</string>
<string name="episode_action_auto_download">Automatisk nedlasting</string>

View File

@ -165,7 +165,7 @@
<item>@string/episode_action_chromecast_episode</item>
<item>@string/episode_action_chromecast_mirror</item>
<item>@string/episode_action_play_in_app</item>
<item>@string/episode_action_play_in_vlc</item>
<item>@string/episode_action_play_in_format</item>
<item>@string/episode_action_play_in_browser</item>
<item>@string/episode_action_copy_link</item>
<item>@string/episode_action_auto_download</item>

View File

@ -252,7 +252,7 @@
<string name="episode_action_chromecast_episode">Chromecast odcinka</string>
<string name="episode_action_chromecast_mirror">Chromecast mirroru</string>
<string name="episode_action_play_in_app">Odtwórz w aplikacji</string>
<string name="episode_action_play_in_vlc">Odtwórz w VLC</string>
<string name="episode_action_play_in_format">Odtwórz w %s</string>
<string name="episode_action_play_in_browser">Odtwórz w przeglądarce</string>
<string name="episode_action_copy_link">Kopiuj link</string>
<string name="episode_action_auto_download">Automatyczne pobieranie</string>

View File

@ -268,7 +268,7 @@
<string name="episode_action_chromecast_episode">Episódio pelo Chromecast</string>
<string name="episode_action_chromecast_mirror">Alternativa pelo Chromecast</string>
<string name="episode_action_play_in_app">Reproduzir na app</string>
<string name="episode_action_play_in_vlc">Reproduzir no VLC</string>
<string name="episode_action_play_in_format">Reproduzir no %s</string>
<string name="episode_action_play_in_browser">Reproduzir no navegador</string>
<string name="episode_action_copy_link">Copiar link</string>
<string name="episode_action_auto_download">Transferência Automática</string>

View File

@ -267,7 +267,7 @@
<string name="episode_action_chromecast_episode">Chromecast</string>
<string name="episode_action_chromecast_mirror">Chromecast alternativ</string>
<string name="episode_action_play_in_app">Redă în Aplicație</string>
<string name="episode_action_play_in_vlc">Redă în VLC</string>
<string name="episode_action_play_in_format">Redă în %s</string>
<string name="episode_action_play_in_browser">Redă în Browser</string>
<string name="episode_action_copy_link">Copiază link-ul</string>
<string name="episode_action_auto_download">Auto-descărcare</string>

View File

@ -167,7 +167,7 @@
<string name="episode_action_chromecast_episode">Chromecasta ett Avsnitt</string>
<string name="episode_action_chromecast_mirror">Chromecasta en Länk</string>
<string name="episode_action_play_in_app">Spela upp i appen</string>
<string name="episode_action_play_in_vlc">Spela upp i VLC</string>
<string name="episode_action_play_in_format">Spela upp i %s</string>
<string name="episode_action_play_in_browser">Spela upp i webbläsaren</string>
<string name="episode_action_copy_link">Kopiera länk</string>
<string name="episode_action_auto_download">Automatisk nerladdning</string>

View File

@ -204,7 +204,7 @@
<string name="episode_action_chromecast_episode">Chromecast Episode</string>
<string name="episode_action_chromecast_mirror">Chromecast Mirror</string>
<string name="episode_action_play_in_app">I-play sa App</string>
<string name="episode_action_play_in_vlc">I-play sa VLC</string>
<string name="episode_action_play_in_format">I-play sa %s</string>
<string name="episode_action_play_in_browser">I-play sa browser</string>
<string name="episode_action_copy_link">Kopyahin ang Link</string>
<string name="episode_action_auto_download">Awtomatiking i-download</string>

View File

@ -156,7 +156,7 @@
<item>@string/episode_action_chromecast_episode</item>
<item>@string/episode_action_chromecast_mirror</item>
<item>@string/episode_action_play_in_app</item>
<item>@string/episode_action_play_in_vlc</item>
<item>@string/episode_action_play_in_format</item>
<item>@string/episode_action_play_in_browser</item>
<item>@string/episode_action_copy_link</item>
<item>@string/episode_action_auto_download</item>

View File

@ -272,7 +272,7 @@
<string name="episode_action_chromecast_episode">Bölümü Chromecast ile yayınla</string>
<string name="episode_action_chromecast_mirror">Bağlantıyı Chromecast ile yayınla</string>
<string name="episode_action_play_in_app">Uygulamada oynat</string>
<string name="episode_action_play_in_vlc">VLC\'de oynat</string>
<string name="episode_action_play_in_format">%s\'de oynat</string>
<string name="episode_action_play_in_browser">Tarayıcıda oynat</string>
<string name="episode_action_copy_link">Linki kopyala</string>
<string name="episode_action_auto_download">Otomatik indir</string>

View File

@ -157,7 +157,7 @@
<item>@string/episode_action_chromecast_episode</item>
<item>@string/episode_action_chromecast_mirror</item>
<item>@string/episode_action_play_in_app</item>
<item>@string/episode_action_play_in_vlc</item>
<item>@string/episode_action_play_in_format</item>
<item>@string/episode_action_play_in_browser</item>
<item>@string/episode_action_copy_link</item>
<item>@string/episode_action_auto_download</item>

View File

@ -292,7 +292,7 @@
<string name="episode_action_chromecast_episode">Tập Chromecast</string>
<string name="episode_action_chromecast_mirror">Chiếu Chromecast</string>
<string name="episode_action_play_in_app">Xem với trình phát mặc định</string>
<string name="episode_action_play_in_vlc">Xem với trình phát VLC</string>
<string name="episode_action_play_in_format">Xem với trình phát %s</string>
<string name="episode_action_play_in_browser">Xem tại trình duyệt</string>
<string name="episode_action_copy_link">Sao chép liên kết</string>
<string name="episode_action_auto_download">Tự động tải xuống</string>

View File

@ -303,7 +303,7 @@
<string name="episode_action_chromecast_episode">投屏剧集</string>
<string name="episode_action_chromecast_mirror">投屏镜像</string>
<string name="episode_action_play_in_app">在应用中播放</string>
<string name="episode_action_play_in_vlc">在 VLC 中播放</string>
<string name="episode_action_play_in_format">在 %s 中播放</string>
<string name="episode_action_play_in_browser">在浏览器中播放</string>
<string name="episode_action_copy_link">复制链接</string>
<string name="episode_action_auto_download">自动下载</string>

View File

@ -36,12 +36,14 @@
<array name="player_pref_names">
<item>@string/player_settings_play_in_app</item>
<item>@string/player_settings_play_in_vlc</item>
<item>@string/player_settings_play_in_web</item>
<item>@string/player_settings_play_in_browser</item>
</array>
<array name="player_pref_values">
<item>1</item>
<item>2</item>
<item>4</item>
<item>3</item>
</array>
@ -187,7 +189,7 @@
<item>@string/episode_action_chromecast_episode</item>
<item>@string/episode_action_chromecast_mirror</item>
<item>@string/episode_action_play_in_app</item>
<item>@string/episode_action_play_in_vlc</item>
<item>@string/episode_action_play_in_format</item>
<item>@string/episode_action_play_in_browser</item>
<item>@string/episode_action_copy_link</item>
<item>@string/episode_action_auto_download</item>

View File

@ -365,7 +365,7 @@
<string name="episode_action_chromecast_episode">Chromecast episode</string>
<string name="episode_action_chromecast_mirror">Chromecast mirror</string>
<string name="episode_action_play_in_app">Play in app</string>
<string name="episode_action_play_in_vlc">Play in VLC</string>
<string name="episode_action_play_in_format">Play in %s</string>
<string name="episode_action_play_in_browser">Play in browser</string>
<string name="episode_action_copy_link">Copy link</string>
<string name="episode_action_auto_download">Auto download</string>
@ -634,6 +634,7 @@
<string name="player_pref">Preferred video player</string>
<string name="player_settings_play_in_app">Internal player</string>
<string name="player_settings_play_in_vlc">VLC</string>
<string name="player_settings_play_in_web">Web Video Cast</string>
<string name="player_settings_play_in_browser">Browser</string>
<string name="vlc_not_found_error">VLC not found</string>
<string name="app_not_found_error">App not found</string>
</resources>