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