Merge branch 'recloudstream:master' into master
This commit is contained in:
commit
2b84e52f88
|
@ -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.
|
||||
|
|
|
@ -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-->
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
Loading…
Reference in New Issue