added webvideocaster

This commit is contained in:
reduplicated 2022-10-08 17:48:46 +02:00
parent 88a7248e47
commit 071004f6c2
33 changed files with 209 additions and 118 deletions

View file

@ -23,6 +23,7 @@
<queries> <queries>
<package android:name="org.videolan.vlc" /> <package android:name="org.videolan.vlc" />
<package android:name="com.instantbits.cast.webvideo" />
</queries> </queries>
<!--TODO https://stackoverflow.com/questions/41799732/chromecast-button-not-visible-in-android--> <!--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") ComponentName(VLC_PACKAGE, "org.videolan.vlc.gui.video.VideoPlayerActivity")
const val VLC_REQUEST_CODE = 42 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_POSITION_OUT = "extra_position"
const val VLC_EXTRA_DURATION_OUT = "extra_duration" const val VLC_EXTRA_DURATION_OUT = "extra_duration"
const val VLC_LAST_ID_KEY = "vlc_last_open_id" 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 // Short name for requests client to make it nicer to use
var app = Requests(responseParser = object : ResponseParser { 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 = 13
const val ACTION_DOWNLOAD_EPISODE_SUBTITLE_MIRROR = 14 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) data class EpisodeClickEvent(val action: Int, val data: ResultEpisode)
class EpisodeAdapter( class EpisodeAdapter(
@ -73,6 +76,7 @@ class EpisodeAdapter(
1 -> ACTION_PLAY_EPISODE_IN_PLAYER 1 -> ACTION_PLAY_EPISODE_IN_PLAYER
2 -> ACTION_PLAY_EPISODE_IN_VLC_PLAYER 2 -> ACTION_PLAY_EPISODE_IN_VLC_PLAYER
3 -> ACTION_PLAY_EPISODE_IN_BROWSER 3 -> ACTION_PLAY_EPISODE_IN_BROWSER
4 -> ACTION_PLAY_EPISODE_IN_WEB_VIDEO
else -> ACTION_PLAY_EPISODE_IN_PLAYER else -> ACTION_PLAY_EPISODE_IN_PLAYER
} }
} }

View file

@ -3,6 +3,7 @@ package com.lagradost.cloudstream3.ui.result
import android.app.Activity import android.app.Activity
import android.content.* import android.content.*
import android.net.Uri import android.net.Uri
import android.os.Bundle
import android.util.Log import android.util.Log
import android.widget.Toast import android.widget.Toast
import androidx.core.content.FileProvider 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.setDub
import com.lagradost.cloudstream3.utils.DataStoreHelper.setResultEpisode import com.lagradost.cloudstream3.utils.DataStoreHelper.setResultEpisode
import com.lagradost.cloudstream3.utils.DataStoreHelper.setResultSeason 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.navigate
import com.lagradost.cloudstream3.utils.UIHelper.requestRW
import kotlinx.coroutines.* import kotlinx.coroutines.*
import java.io.File import java.io.File
import java.lang.Math.abs import java.lang.Math.abs
@ -955,26 +954,64 @@ class ResultViewModel2 : ViewModel() {
return LinkLoadingResult(sortUrls(links), sortSubs(subs)) 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<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/ // https://wiki.videolan.org/Android_Player_Intents/
private fun playWithVlc( private fun playWithVlc(
act: Activity?, activity: Activity?,
data: LinkLoadingResult, data: LinkLoadingResult,
id: Int, id: Int,
resume: Boolean = true, resume: Boolean = true,
// if it is only a single link then resume works correctly // if it is only a single link then resume works correctly
singleFile: Boolean? = null singleFile: Boolean? = null
) = ioSafe { ) = launchActivity(activity) { act ->
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
}
val vlcIntent = Intent(VLC_INTENT_ACTION_RESULT) val vlcIntent = Intent(VLC_INTENT_ACTION_RESULT)
vlcIntent.setPackage(VLC_PACKAGE) vlcIntent.setPackage(VLC_PACKAGE)
@ -1039,22 +1076,31 @@ class ResultViewModel2 : ViewModel() {
vlcIntent.component = VLC_COMPONENT vlcIntent.component = VLC_COMPONENT
act.setKey(VLC_LAST_ID_KEY, id) act.setKey(VLC_LAST_ID_KEY, id)
act.startActivityForResult(vlcIntent, VLC_REQUEST_CODE) 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)
}
}
}
} }
fun handleAction(activity: Activity?, click: EpisodeClickEvent) = viewModelScope.launchSafe { fun handleAction(activity: Activity?, click: EpisodeClickEvent) =
viewModelScope.launchSafe {
handleEpisodeClickEvent(activity, click) 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) { private suspend fun handleEpisodeClickEvent(activity: Activity?, click: EpisodeClickEvent) {
when (click.action) { when (click.action) {
ACTION_SHOW_OPTIONS -> { ACTION_SHOW_OPTIONS -> {
@ -1069,9 +1115,17 @@ class ResultViewModel2 : ViewModel() {
} }
options.add(txt(R.string.episode_action_play_in_app) to ACTION_PLAY_EPISODE_IN_PLAYER) options.add(txt(R.string.episode_action_play_in_app) to ACTION_PLAY_EPISODE_IN_PLAYER)
if (activity?.isAppInstalled(VLC_PACKAGE) == true) { for (app in apps) {
options.add(txt(R.string.episode_action_play_in_vlc) to ACTION_PLAY_EPISODE_IN_VLC_PLAYER) if (activity?.isAppInstalled(app.packageString) == true) {
options.add(
txt(
R.string.episode_action_play_in_format,
txt(app.name)
) to app.action
)
} }
}
options.addAll( options.addAll(
listOf( listOf(
txt(R.string.episode_action_play_in_browser) to ACTION_PLAY_EPISODE_IN_BROWSER, 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 -> { ACTION_PLAY_EPISODE_IN_VLC_PLAYER -> {
loadLinks(click.data, isVisible = true, isCasting = true) { links -> 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( playWithVlc(
activity, activity,
links, 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 -> { ACTION_PLAY_EPISODE_IN_PLAYER -> {
val data = currentResponse?.syncData?.toList() ?: emptyList() val data = currentResponse?.syncData?.toList() ?: emptyList()
val list = val list =
@ -1319,7 +1394,11 @@ class ResultViewModel2 : ViewModel() {
}, { }, {
if (this !is AnimeLoadResponse) return@argamap if (this !is AnimeLoadResponse) return@argamap
val map = val map =
Kitsu.getEpisodesDetails(getMalId(), getAniListId(), isResponseRequired = false) Kitsu.getEpisodesDetails(
getMalId(),
getAniListId(),
isResponseRequired = false
)
if (map.isNullOrEmpty()) return@argamap if (map.isNullOrEmpty()) return@argamap
updateEpisodes = DubStatus.values().map { dubStatus -> updateEpisodes = DubStatus.values().map { dubStatus ->
val current = val current =
@ -1339,8 +1418,10 @@ class ResultViewModel2 : ViewModel() {
val currentBack = this val currentBack = this
this.description = this.description ?: node.description?.en this.description = this.description ?: node.description?.en
this.name = this.name ?: node.titles?.canonical this.name = this.name ?: node.titles?.canonical
this.episode = this.episode ?: node.num ?: episodeNumbers[index] this.episode =
this.posterUrl = this.posterUrl ?: node.thumbnail?.original?.url 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()) { for ((index, i) in ep.value.withIndex()) {
val episode = i.episode ?: (index + 1) val episode = i.episode ?: (index + 1)
val id = 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)) { if (!existingEpisodes.contains(id)) {
existingEpisodes.add(id) existingEpisodes.add(id)
val seasonData = loadResponse.seasonNames.getSeason(i.season) 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_episode">حلقة كروم كاست</string>
<string name="episode_action_chromecast_mirror">مرآة كروم كاست</string> <string name="episode_action_chromecast_mirror">مرآة كروم كاست</string>
<string name="episode_action_play_in_app">تشغيل في التطبيق</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_play_in_browser">تشغيل في الويب </string>
<string name="episode_action_copy_link">نسخ الرابط</string> <string name="episode_action_copy_link">نسخ الرابط</string>
<string name="episode_action_auto_download">التحميل التلقائي</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_episode">Episódio pelo Chromecast</string>
<string name="episode_action_chromecast_mirror">Alternativa 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_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_play_in_browser">Assistir no navegador</string>
<string name="episode_action_copy_link">Copiar link</string> <string name="episode_action_copy_link">Copiar link</string>
<string name="episode_action_auto_download">Auto download</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_episode">Chromecastovat epizodu</string>
<string name="episode_action_chromecast_mirror">Chromecast jako zrcadlo</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_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_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_copy_link">Zkopírovat odkaz</string>
<string name="episode_action_auto_download">Automaticky stáhnout</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_episode">Chromecast-Episode</string>
<string name="episode_action_chromecast_mirror">Chromecastmirror</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_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_play_in_browser">In Browser wiedergeben</string>
<string name="episode_action_copy_link">Link kopieren</string> <string name="episode_action_copy_link">Link kopieren</string>
<string name="episode_action_auto_download">Auto Download</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_episode</item>
<item>@string/episode_action_chromecast_mirror</item> <item>@string/episode_action_chromecast_mirror</item>
<item>@string/episode_action_play_in_app</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_play_in_browser</item>
<item>@string/episode_action_copy_link</item> <item>@string/episode_action_copy_link</item>
<item>@string/episode_action_auto_download</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_episode">Episodio Chromecast</string>
<string name="episode_action_chromecast_mirror">Espejo 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_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_play_in_browser">Reproducir en el navegador</string>
<string name="episode_action_copy_link">Copiar enlace</string> <string name="episode_action_copy_link">Copiar enlace</string>
<string name="episode_action_auto_download">Descarga automática</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_episode">Episode Chromecast</string>
<string name="episode_action_chromecast_mirror">Miroir 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_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_play_in_browser">Lecture dans le navigateur</string>
<string name="episode_action_copy_link">Copier le lien</string> <string name="episode_action_copy_link">Copier le lien</string>
<string name="episode_action_auto_download">Téléchargement Automatique</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_episode">क्रोमकास्ट एपिसोड</string>
<string name="episode_action_chromecast_mirror">कक्रोमकास्ट मिरर</string> <string name="episode_action_chromecast_mirror">कक्रोमकास्ट मिरर</string>
<string name="episode_action_play_in_app">एप्प मैं चलाये</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_play_in_browser">Browser में चलाए</string>
<string name="episode_action_copy_link">लिंक कॉपी करें</string> <string name="episode_action_copy_link">लिंक कॉपी करें</string>
<string name="episode_action_auto_download">डाउनलोड करे</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_episode">Chromecast epizoda</string>
<string name="episode_action_chromecast_mirror">Chromecast mirror</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_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_play_in_browser">Pokreni u pregledniku</string>
<string name="episode_action_copy_link">Kopiraj poveznicu</string> <string name="episode_action_copy_link">Kopiraj poveznicu</string>
<string name="episode_action_auto_download">Automatsko preuzimanje</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_episode">Episode Chromecast</string>
<string name="episode_action_chromecast_mirror">Mirror 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_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_play_in_browser">Putar di browser</string>
<string name="episode_action_copy_link">Salin tautan</string> <string name="episode_action_copy_link">Salin tautan</string>
<string name="episode_action_auto_download">Download otomatis</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_episode">Chromecast</string>
<string name="episode_action_chromecast_mirror">Chromecast mirror</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_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_play_in_browser">Riproduci nel browser</string>
<string name="episode_action_copy_link">Copia link</string> <string name="episode_action_copy_link">Copia link</string>
<string name="episode_action_auto_download">Download</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_episode">Епизода на Chromecast</string>
<string name="episode_action_chromecast_mirror">Огледало на Chromecastr</string> <string name="episode_action_chromecast_mirror">Огледало на Chromecastr</string>
<string name="episode_action_play_in_app">Пушти во апликацијата</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_play_in_browser">Пушти на прелистувач</string>
<string name="episode_action_copy_link">Копирај линк</string> <string name="episode_action_copy_link">Копирај линк</string>
<string name="episode_action_auto_download">Авто превземање</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_episode">Chromecast Episode</string>
<string name="episode_action_chomecast_mirror">Chromecast Mirror</string> --> <string name="episode_action_chomecast_mirror">Chromecast Mirror</string> -->
<string name="episode_action_play_in_app">ആപ്പിൽ പ്ലേയ് ചെയ്യുക</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_play_in_browser">ബ്രൗസറിൽ പ്ലേയ് ചെയ്യുക</string>
<string name="episode_action_copy_link">ലിങ്ക് പകർത്തുക</string> <string name="episode_action_copy_link">ലിങ്ക് പകർത്തുക</string>
<string name="episode_action_auto_download">ഡൌൺലോഡ് ചെയ്യൂ</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_episode">aauugghhooo-ahah ohaaauugghh</string>
<string name="episode_action_chromecast_mirror">aoohaaahhu ahouuhhh</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_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_play_in_browser">ahoha ooo-ahahohoohah oooohh</string>
<string name="episode_action_copy_link">aauugghhahhaauugghh</string> <string name="episode_action_copy_link">aauugghhahhaauugghh</string>
<string name="episode_action_auto_download">aaaghhoooohh aaahhu ahooo</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_episode">Chromecast aflevering</string>
<string name="episode_action_chromecast_mirror">Chromecast mirror</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_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_play_in_browser">Speel in browser</string>
<string name="episode_action_copy_link">Kopieer link</string> <string name="episode_action_copy_link">Kopieer link</string>
<string name="episode_action_auto_download">Automatisch downloaden</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_episode">Støpt Episode</string>
<string name="episode_action_chromecast_mirror">Støpt Speil</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_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_play_in_browser">Spill i nettleseren</string>
<string name="episode_action_copy_link">Kopier link</string> <string name="episode_action_copy_link">Kopier link</string>
<string name="episode_action_auto_download">Automatisk nedlasting</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_episode</item>
<item>@string/episode_action_chromecast_mirror</item> <item>@string/episode_action_chromecast_mirror</item>
<item>@string/episode_action_play_in_app</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_play_in_browser</item>
<item>@string/episode_action_copy_link</item> <item>@string/episode_action_copy_link</item>
<item>@string/episode_action_auto_download</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_episode">Chromecast odcinka</string>
<string name="episode_action_chromecast_mirror">Chromecast mirroru</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_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_play_in_browser">Odtwórz w przeglądarce</string>
<string name="episode_action_copy_link">Kopiuj link</string> <string name="episode_action_copy_link">Kopiuj link</string>
<string name="episode_action_auto_download">Automatyczne pobieranie</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_episode">Episódio pelo Chromecast</string>
<string name="episode_action_chromecast_mirror">Alternativa 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_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_play_in_browser">Reproduzir no navegador</string>
<string name="episode_action_copy_link">Copiar link</string> <string name="episode_action_copy_link">Copiar link</string>
<string name="episode_action_auto_download">Transferência Automática</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_episode">Chromecast</string>
<string name="episode_action_chromecast_mirror">Chromecast alternativ</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_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_play_in_browser">Redă în Browser</string>
<string name="episode_action_copy_link">Copiază link-ul</string> <string name="episode_action_copy_link">Copiază link-ul</string>
<string name="episode_action_auto_download">Auto-descărcare</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_episode">Chromecasta ett Avsnitt</string>
<string name="episode_action_chromecast_mirror">Chromecasta en Länk</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_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_play_in_browser">Spela upp i webbläsaren</string>
<string name="episode_action_copy_link">Kopiera länk</string> <string name="episode_action_copy_link">Kopiera länk</string>
<string name="episode_action_auto_download">Automatisk nerladdning</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_episode">Chromecast Episode</string>
<string name="episode_action_chromecast_mirror">Chromecast Mirror</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_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_play_in_browser">I-play sa browser</string>
<string name="episode_action_copy_link">Kopyahin ang Link</string> <string name="episode_action_copy_link">Kopyahin ang Link</string>
<string name="episode_action_auto_download">Awtomatiking i-download</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_episode</item>
<item>@string/episode_action_chromecast_mirror</item> <item>@string/episode_action_chromecast_mirror</item>
<item>@string/episode_action_play_in_app</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_play_in_browser</item>
<item>@string/episode_action_copy_link</item> <item>@string/episode_action_copy_link</item>
<item>@string/episode_action_auto_download</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_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_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_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_play_in_browser">Tarayıcıda oynat</string>
<string name="episode_action_copy_link">Linki kopyala</string> <string name="episode_action_copy_link">Linki kopyala</string>
<string name="episode_action_auto_download">Otomatik indir</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_episode</item>
<item>@string/episode_action_chromecast_mirror</item> <item>@string/episode_action_chromecast_mirror</item>
<item>@string/episode_action_play_in_app</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_play_in_browser</item>
<item>@string/episode_action_copy_link</item> <item>@string/episode_action_copy_link</item>
<item>@string/episode_action_auto_download</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_episode">Tập Chromecast</string>
<string name="episode_action_chromecast_mirror">Chiếu 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_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_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_copy_link">Sao chép liên kết</string>
<string name="episode_action_auto_download">Tự động tải xuống</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_episode">投屏剧集</string>
<string name="episode_action_chromecast_mirror">投屏镜像</string> <string name="episode_action_chromecast_mirror">投屏镜像</string>
<string name="episode_action_play_in_app">在应用中播放</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_play_in_browser">在浏览器中播放</string>
<string name="episode_action_copy_link">复制链接</string> <string name="episode_action_copy_link">复制链接</string>
<string name="episode_action_auto_download">自动下载</string> <string name="episode_action_auto_download">自动下载</string>

View file

@ -36,12 +36,14 @@
<array name="player_pref_names"> <array name="player_pref_names">
<item>@string/player_settings_play_in_app</item> <item>@string/player_settings_play_in_app</item>
<item>@string/player_settings_play_in_vlc</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> <item>@string/player_settings_play_in_browser</item>
</array> </array>
<array name="player_pref_values"> <array name="player_pref_values">
<item>1</item> <item>1</item>
<item>2</item> <item>2</item>
<item>4</item>
<item>3</item> <item>3</item>
</array> </array>
@ -187,7 +189,7 @@
<item>@string/episode_action_chromecast_episode</item> <item>@string/episode_action_chromecast_episode</item>
<item>@string/episode_action_chromecast_mirror</item> <item>@string/episode_action_chromecast_mirror</item>
<item>@string/episode_action_play_in_app</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_play_in_browser</item>
<item>@string/episode_action_copy_link</item> <item>@string/episode_action_copy_link</item>
<item>@string/episode_action_auto_download</item> <item>@string/episode_action_auto_download</item>

View file

@ -364,7 +364,7 @@
<string name="episode_action_chromecast_episode">Chromecast episode</string> <string name="episode_action_chromecast_episode">Chromecast episode</string>
<string name="episode_action_chromecast_mirror">Chromecast mirror</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_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_play_in_browser">Play in browser</string>
<string name="episode_action_copy_link">Copy link</string> <string name="episode_action_copy_link">Copy link</string>
<string name="episode_action_auto_download">Auto download</string> <string name="episode_action_auto_download">Auto download</string>
@ -633,6 +633,7 @@
<string name="player_pref">Preferred video player</string> <string name="player_pref">Preferred video player</string>
<string name="player_settings_play_in_app">Internal 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_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="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> </resources>