From 544f277d0cb87cb2601086286e34aa75c9bfce67 Mon Sep 17 00:00:00 2001 From: Blatzar <46196380+Blatzar@users.noreply.github.com> Date: Mon, 24 Oct 2022 15:31:35 +0200 Subject: [PATCH 01/13] Fixed player caching being invalidated by OOM --- app/src/main/AndroidManifest.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 216a5f21..d22e95c0 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -27,6 +27,7 @@ + Date: Tue, 25 Oct 2022 10:41:12 +0200 Subject: [PATCH 02/13] [skip ci] increase issue analysis threshold --- .github/workflows/issue_action.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/issue_action.yml b/.github/workflows/issue_action.yml index 79e7766c..a81c4b42 100644 --- a/.github/workflows/issue_action.yml +++ b/.github/workflows/issue_action.yml @@ -18,7 +18,7 @@ jobs: uses: actions-cool/issues-similarity-analysis@v1 with: token: ${{ steps.generate_token.outputs.token }} - filter-threshold: 0.5 + filter-threshold: 0.60 title-excludes: '' comment-title: | ### Your issue looks similar to these issues: From 7f71eef75550661eb9b418ebea31560d457442e3 Mon Sep 17 00:00:00 2001 From: Blatzar <46196380+Blatzar@users.noreply.github.com> Date: Wed, 26 Oct 2022 14:59:29 +0200 Subject: [PATCH 03/13] Allow playback from buffer with no internet --- .../cloudstream3/ui/player/CS3IPlayer.kt | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/player/CS3IPlayer.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/player/CS3IPlayer.kt index ea466120..a838c85c 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/player/CS3IPlayer.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/player/CS3IPlayer.kt @@ -17,10 +17,7 @@ import com.google.android.exoplayer2.text.TextRenderer import com.google.android.exoplayer2.trackselection.DefaultTrackSelector import com.google.android.exoplayer2.trackselection.TrackSelector import com.google.android.exoplayer2.ui.SubtitleView -import com.google.android.exoplayer2.upstream.DataSource -import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory -import com.google.android.exoplayer2.upstream.DefaultHttpDataSource -import com.google.android.exoplayer2.upstream.HttpDataSource +import com.google.android.exoplayer2.upstream.* import com.google.android.exoplayer2.upstream.cache.CacheDataSource import com.google.android.exoplayer2.upstream.cache.LeastRecentlyUsedCacheEvictor import com.google.android.exoplayer2.upstream.cache.SimpleCache @@ -880,7 +877,16 @@ class CS3IPlayer : IPlayer { } override fun onPlayerError(error: PlaybackException) { - playerError?.invoke(error) + // If the Network fails then ignore the exception if the duration is set. + // This is to switch mirrors automatically if the stream has not been fetched, but + // allow playing the buffer without internet as then the duration is fetched. + if (error.errorCode == PlaybackException.ERROR_CODE_IO_NETWORK_CONNECTION_FAILED + && exoPlayer?.duration != C.TIME_UNSET + ) { + exoPlayer?.prepare() + } else { + playerError?.invoke(error) + } super.onPlayerError(error) } From ecd363992c42d4c489f52191f657842a0a23eaf4 Mon Sep 17 00:00:00 2001 From: Hexated <37908684+hexated@users.noreply.github.com> Date: Wed, 26 Oct 2022 22:38:46 +0700 Subject: [PATCH 04/13] added sub to streamsb & xtreamCdn (#163) --- .../cloudstream3/extractors/Gdriveplayer.kt | 55 ++++++++++++---- .../cloudstream3/extractors/Moviehab.kt | 40 ++++++++++++ .../cloudstream3/extractors/SpeedoStream.kt | 6 +- .../cloudstream3/extractors/StreamSB.kt | 20 +++++- .../extractors/VidSrcExtractor.kt | 8 +-- .../cloudstream3/extractors/XStreamCdn.kt | 64 ++++++++++++++----- .../cloudstream3/utils/ExtractorApi.kt | 6 ++ 7 files changed, 159 insertions(+), 40 deletions(-) create mode 100644 app/src/main/java/com/lagradost/cloudstream3/extractors/Moviehab.kt diff --git a/app/src/main/java/com/lagradost/cloudstream3/extractors/Gdriveplayer.kt b/app/src/main/java/com/lagradost/cloudstream3/extractors/Gdriveplayer.kt index dfccc118..df9c74a4 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/extractors/Gdriveplayer.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/extractors/Gdriveplayer.kt @@ -3,6 +3,7 @@ package com.lagradost.cloudstream3.extractors import com.fasterxml.jackson.annotation.JsonProperty import com.lagradost.cloudstream3.* import com.lagradost.cloudstream3.utils.* +import com.lagradost.cloudstream3.utils.AppUtils.tryParseJson import org.jsoup.nodes.Element import java.security.DigestException import java.security.MessageDigest @@ -10,43 +11,47 @@ import javax.crypto.Cipher import javax.crypto.spec.IvParameterSpec import javax.crypto.spec.SecretKeySpec +class DatabaseGdrive2 : Gdriveplayer() { + override var mainUrl = "https://databasegdriveplayer.co" +} + class DatabaseGdrive : Gdriveplayer() { override var mainUrl = "https://series.databasegdriveplayer.co" } -class Gdriveplayerapi: Gdriveplayer() { +class Gdriveplayerapi : Gdriveplayer() { override val mainUrl: String = "https://gdriveplayerapi.com" } -class Gdriveplayerapp: Gdriveplayer() { +class Gdriveplayerapp : Gdriveplayer() { override val mainUrl: String = "https://gdriveplayer.app" } -class Gdriveplayerfun: Gdriveplayer() { +class Gdriveplayerfun : Gdriveplayer() { override val mainUrl: String = "https://gdriveplayer.fun" } -class Gdriveplayerio: Gdriveplayer() { +class Gdriveplayerio : Gdriveplayer() { override val mainUrl: String = "https://gdriveplayer.io" } -class Gdriveplayerme: Gdriveplayer() { +class Gdriveplayerme : Gdriveplayer() { override val mainUrl: String = "https://gdriveplayer.me" } -class Gdriveplayerbiz: Gdriveplayer() { +class Gdriveplayerbiz : Gdriveplayer() { override val mainUrl: String = "https://gdriveplayer.biz" } -class Gdriveplayerorg: Gdriveplayer() { +class Gdriveplayerorg : Gdriveplayer() { override val mainUrl: String = "https://gdriveplayer.org" } -class Gdriveplayerus: Gdriveplayer() { +class Gdriveplayerus : Gdriveplayer() { override val mainUrl: String = "https://gdriveplayer.us" } -class Gdriveplayerco: Gdriveplayer() { +class Gdriveplayerco : Gdriveplayer() { override val mainUrl: String = "https://gdriveplayer.co" } @@ -136,6 +141,10 @@ open class Gdriveplayer : ExtractorApi() { return find(str)?.groupValues?.getOrNull(1) } + private fun String.addMarks(str: String): String { + return this.replace(Regex("\"?$str\"?"), "\"$str\"") + } + override suspend fun getUrl( url: String, referer: String?, @@ -145,18 +154,19 @@ open class Gdriveplayer : ExtractorApi() { val document = app.get(url).document val eval = unpackJs(document)?.replace("\\", "") ?: return - val data = AppUtils.tryParseJson(Regex("data='(\\S+?)'").first(eval)) ?: return + val data = tryParseJson(Regex("data='(\\S+?)'").first(eval)) ?: return val password = Regex("null,['|\"](\\w+)['|\"]").first(eval) ?.split(Regex("\\D+")) ?.joinToString("") { Char(it.toInt()).toString() }.let { Regex("var pass = \"(\\S+?)\"").first(it ?: return)?.toByteArray() } ?: throw ErrorLoadingException("can't find password") - val decryptedData = - cryptoAESHandler(data, password, false)?.let { getAndUnpack(it) }?.replace("\\", "") - ?.substringAfter("sources:[")?.substringBefore("],") + val decryptedData = cryptoAESHandler(data, password, false)?.let { getAndUnpack(it) }?.replace("\\", "") - Regex("\"file\":\"(\\S+?)\".*?res=(\\d+)").findAll(decryptedData ?: return).map { + val sourceData = decryptedData?.substringAfter("sources:[")?.substringBefore("],") + val subData = decryptedData?.substringAfter("tracks:[")?.substringBefore("],") + + Regex("\"file\":\"(\\S+?)\".*?res=(\\d+)").findAll(sourceData ?: return).map { it.groupValues[1] to it.groupValues[2] }.toList().distinctBy { it.second }.map { (link, quality) -> callback.invoke( @@ -171,6 +181,17 @@ open class Gdriveplayer : ExtractorApi() { ) } + subData?.addMarks("file")?.addMarks("kind")?.addMarks("label").let { dataSub -> + tryParseJson>("[$dataSub]")?.map { sub -> + subtitleCallback.invoke( + SubtitleFile( + sub.label, + httpsify(sub.file) + ) + ) + } + } + } data class AesData( @@ -179,4 +200,10 @@ open class Gdriveplayer : ExtractorApi() { @JsonProperty("s") val s: String ) + data class Tracks( + @JsonProperty("file") val file: String, + @JsonProperty("kind") val kind: String, + @JsonProperty("label") val label: String + ) + } \ No newline at end of file diff --git a/app/src/main/java/com/lagradost/cloudstream3/extractors/Moviehab.kt b/app/src/main/java/com/lagradost/cloudstream3/extractors/Moviehab.kt new file mode 100644 index 00000000..e2eb7bf0 --- /dev/null +++ b/app/src/main/java/com/lagradost/cloudstream3/extractors/Moviehab.kt @@ -0,0 +1,40 @@ +package com.lagradost.cloudstream3.extractors + +import com.lagradost.cloudstream3.SubtitleFile +import com.lagradost.cloudstream3.app +import com.lagradost.cloudstream3.utils.ExtractorApi +import com.lagradost.cloudstream3.utils.ExtractorLink +import com.lagradost.cloudstream3.utils.M3u8Helper + +class Moviehab : ExtractorApi() { + override var name = "Moviehab" + override var mainUrl = "https://play.moviehab.com" + override val requiresReferer = false + + override suspend fun getUrl( + url: String, + referer: String?, + subtitleCallback: (SubtitleFile) -> Unit, + callback: (ExtractorLink) -> Unit + ) { + val res = app.get(url) + res.document.select("video#player").let { + //should redirect first for making it works + val link = app.get("$mainUrl/${it.select("source").attr("src")}", referer = url).url + M3u8Helper.generateM3u8( + this.name, + link, + url + ).forEach(callback) + + Regex("src[\"|'],\\s[\"|'](\\S+)[\"|']\\)").find(res.text)?.groupValues?.get(1).let {sub -> + subtitleCallback.invoke( + SubtitleFile( + it.select("track").attr("label"), + "$mainUrl/$sub" + ) + ) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/lagradost/cloudstream3/extractors/SpeedoStream.kt b/app/src/main/java/com/lagradost/cloudstream3/extractors/SpeedoStream.kt index 6153a7c1..8ef6c463 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/extractors/SpeedoStream.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/extractors/SpeedoStream.kt @@ -7,7 +7,11 @@ import com.lagradost.cloudstream3.utils.ExtractorApi import com.lagradost.cloudstream3.utils.ExtractorLink import com.lagradost.cloudstream3.utils.M3u8Helper -class SpeedoStream : ExtractorApi() { +class SpeedoStream1 : SpeedoStream() { + override val mainUrl = "https://speedostream.nl" +} + +open class SpeedoStream : ExtractorApi() { override val name = "SpeedoStream" override val mainUrl = "https://speedostream.com" override val requiresReferer = true diff --git a/app/src/main/java/com/lagradost/cloudstream3/extractors/StreamSB.kt b/app/src/main/java/com/lagradost/cloudstream3/extractors/StreamSB.kt index 30a0496d..913b410b 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/extractors/StreamSB.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/extractors/StreamSB.kt @@ -7,6 +7,11 @@ import com.lagradost.cloudstream3.utils.ExtractorApi import com.lagradost.cloudstream3.utils.ExtractorLink import com.lagradost.cloudstream3.utils.M3u8Helper +class Sbspeed : StreamSB() { + override var name = "Sbspeed" + override var mainUrl = "https://sbspeed.com" +} + class Streamsss : StreamSB() { override var mainUrl = "https://streamsss.net" } @@ -93,15 +98,15 @@ open class StreamSB : ExtractorApi() { } data class Subs ( - @JsonProperty("file") val file: String, - @JsonProperty("label") val label: String, + @JsonProperty("file") val file: String? = null, + @JsonProperty("label") val label: String? = null, ) data class StreamData ( @JsonProperty("file") val file: String, @JsonProperty("cdn_img") val cdnImg: String, @JsonProperty("hash") val hash: String, - @JsonProperty("subs") val subs: List?, + @JsonProperty("subs") val subs: ArrayList? = arrayListOf(), @JsonProperty("length") val length: String, @JsonProperty("id") val id: String, @JsonProperty("title") val title: String, @@ -141,5 +146,14 @@ open class StreamSB : ExtractorApi() { url, headers = headers ).forEach(callback) + + mapped.streamData.subs?.map {sub -> + subtitleCallback.invoke( + SubtitleFile( + sub.label.toString(), + sub.file ?: return@map null, + ) + ) + } } } \ No newline at end of file diff --git a/app/src/main/java/com/lagradost/cloudstream3/extractors/VidSrcExtractor.kt b/app/src/main/java/com/lagradost/cloudstream3/extractors/VidSrcExtractor.kt index 63634704..287fe4d4 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/extractors/VidSrcExtractor.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/extractors/VidSrcExtractor.kt @@ -85,18 +85,12 @@ open class VidSrcExtractor : ExtractorApi() { this.name, this.name, srcm3u8, - this.mainUrl, + "https://vidsrc.stream/", Qualities.Unknown.value, extractorData = pass, isM3u8 = true ) ) - -// M3u8Helper.generateM3u8( -// name, -// srcm3u8, -// absoluteUrl -// ).forEach(callback) } else { loadExtractor(linkfixed, url, subtitleCallback, callback) } diff --git a/app/src/main/java/com/lagradost/cloudstream3/extractors/XStreamCdn.kt b/app/src/main/java/com/lagradost/cloudstream3/extractors/XStreamCdn.kt index 9e3585ae..15ff0436 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/extractors/XStreamCdn.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/extractors/XStreamCdn.kt @@ -1,12 +1,23 @@ package com.lagradost.cloudstream3.extractors import com.fasterxml.jackson.annotation.JsonProperty +import com.lagradost.cloudstream3.SubtitleFile import com.lagradost.cloudstream3.app -import com.lagradost.cloudstream3.utils.AppUtils +import com.lagradost.cloudstream3.utils.AppUtils.tryParseJson import com.lagradost.cloudstream3.utils.ExtractorApi import com.lagradost.cloudstream3.utils.ExtractorLink import com.lagradost.cloudstream3.utils.getQualityFromName +class Cdnplayer: XStreamCdn() { + override val name: String = "Cdnplayer" + override val mainUrl: String = "https://cdnplayer.online" +} + +class Kotakajair: XStreamCdn() { + override val name: String = "Kotakajair" + override val mainUrl: String = "https://kotakajair.xyz" +} + class FEnet: XStreamCdn() { override val name: String = "FEnet" override val mainUrl: String = "https://fembed.net" @@ -59,44 +70,67 @@ open class XStreamCdn : ExtractorApi() { //val type: String // Mp4 ) + private data class Player( + @JsonProperty("poster_file") val poster_file: String? = null, + ) + private data class ResponseJson( @JsonProperty("success") val success: Boolean, - @JsonProperty("data") val data: List? + @JsonProperty("player") val player: Player? = null, + @JsonProperty("data") val data: List?, + @JsonProperty("captions") val captions: List?, + ) + + private data class Captions( + @JsonProperty("id") val id: String, + @JsonProperty("hash") val hash: String, + @JsonProperty("language") val language: String, + @JsonProperty("extension") val extension: String ) override fun getExtractorUrl(id: String): String { return "$domainUrl/api/source/$id" } - override suspend fun getUrl(url: String, referer: String?): List { + override suspend fun getUrl( + url: String, + referer: String?, + subtitleCallback: (SubtitleFile) -> Unit, + callback: (ExtractorLink) -> Unit + ) { val headers = mapOf( "Referer" to url, "User-Agent" to "Mozilla/5.0 (Windows NT 10.0; rv:78.0) Gecko/20100101 Firefox/78.0", ) val id = url.trimEnd('/').split("/").last() val newUrl = "https://${domainUrl}/api/source/${id}" - val extractedLinksList: MutableList = mutableListOf() - with(app.post(newUrl, headers = headers)) { - if (this.code != 200) return listOf() - val text = this.text - if (text.isEmpty()) return listOf() - if (text == """{"success":false,"data":"Video not found or has been removed"}""") return listOf() - AppUtils.parseJson(text)?.let { + app.post(newUrl, headers = headers).let { res -> + val sources = tryParseJson(res.text) + sources?.let { if (it.success && it.data != null) { - it.data.forEach { data -> - extractedLinksList.add( + it.data.map { source -> + callback.invoke( ExtractorLink( name, name = name, - data.file, + source.file, url, - getQualityFromName(data.label), + getQualityFromName(source.label), ) ) } } } + + val userData = sources?.player?.poster_file?.split("/")?.get(2) + sources?.captions?.map { + subtitleCallback.invoke( + SubtitleFile( + it?.language.toString(), + "$mainUrl/asset/userdata/$userData/caption/${it?.hash}/${it?.id}.${it?.extension}" + ) + ) + } } - return extractedLinksList } } \ No newline at end of file diff --git a/app/src/main/java/com/lagradost/cloudstream3/utils/ExtractorApi.kt b/app/src/main/java/com/lagradost/cloudstream3/utils/ExtractorApi.kt index 8d6b1b82..ca612385 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/utils/ExtractorApi.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/utils/ExtractorApi.kt @@ -235,6 +235,7 @@ val extractorApis: MutableList = arrayListOf( Vidgomunime(), Sbflix(), Streamsss(), + Sbspeed(), Fastream(), @@ -246,6 +247,8 @@ val extractorApis: MutableList = arrayListOf( LayarKaca(), Rasacintaku(), FEnet(), + Kotakajair(), + Cdnplayer(), // WatchSB(), 'cause StreamSB.kt works Uqload(), Uqload1(), @@ -317,6 +320,7 @@ val extractorApis: MutableList = arrayListOf( Linkbox(), Acefile(), SpeedoStream(), + SpeedoStream1(), Zorofile(), Embedgram(), Mvidoo(), @@ -324,6 +328,7 @@ val extractorApis: MutableList = arrayListOf( Vidmoly(), Vidmolyme(), Voe(), + Moviehab(), Gdriveplayerapi(), Gdriveplayerapp(), @@ -336,6 +341,7 @@ val extractorApis: MutableList = arrayListOf( Gdriveplayerco(), Gdriveplayer(), DatabaseGdrive(), + DatabaseGdrive2(), YoutubeExtractor(), YoutubeShortLinkExtractor(), From 044822040f7da8c777958057a12d1f7ee3a4222c Mon Sep 17 00:00:00 2001 From: Cloudburst <18114966+C10udburst@users.noreply.github.com> Date: Wed, 26 Oct 2022 21:55:59 +0200 Subject: [PATCH 05/13] Translation in Bulgarian language. Co-authored-by: ardoslav --- README.md | 1 + .../ui/settings/SettingsGeneral.kt | 1 + app/src/main/res/values-bg/strings.xml | 547 ++++++++++++++++++ 3 files changed, 549 insertions(+) create mode 100644 app/src/main/res/values-bg/strings.xml diff --git a/README.md b/README.md index e7221440..5e961c61 100644 --- a/README.md +++ b/README.md @@ -19,6 +19,7 @@ ***The list of supported languages:*** * 🇱🇧 Arabic +* 🇧🇬 Bulgarian * 🇭🇷 Croatian * 🇨🇿 Czech * 🇳🇱 Dutch diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsGeneral.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsGeneral.kt index 57074e74..8ea76cda 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsGeneral.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsGeneral.kt @@ -79,6 +79,7 @@ val appLanguages = arrayListOf( Triple("\uD83C\uDDEE\uD83C\uDDE9", "Indonesian", "in"), Triple("", "Czech", "cs"), Triple("", "Croatian", "hr"), + Triple("", "Bulgarian", "bg"), ).sortedBy { it.second } //ye, we go alphabetical, so ppl don't put their lang on top class SettingsGeneral : PreferenceFragmentCompat() { diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml new file mode 100644 index 00000000..b8f43dd0 --- /dev/null +++ b/app/src/main/res/values-bg/strings.xml @@ -0,0 +1,547 @@ + + + + + %s еп. %d + Актьори: %s + Епизод %d ще бъде пуснат след + %DD %dh %dm + %dh %dm + %dm + + + Плакат + @string/result_poster_img_des + Плакат на епизод + Основен плакат + Следващ произволен + Върни се + Смяна на доставчика + Визуализация на фона + + + Скорост (%.2fx) + Оценка: %.1f + Намерена е нова актуализация!\n%s -> %s + Шаблон + %d мин + + CloudStream + Пусни с CloudStream + Начало + Търсене + Изтегляния + Настройки + + Търсене… + Търсете %s... + + Няма данни + Още опций + Следващ епизод + Жанрове + Сподели + Отвори в браузъра + Пропусни зареждането + Зареждане… + + Гледане + На изчакване + Завършено + Изпуснат + План за гледане + Нито един + Повторно гледане + + Пускане на филм + Възпроизвеждане на живо + Поточно предаване на торент + Източници + субтитри + Повторен опит за свързване... + Върни се + Пусни епизод + + + Изтегли + Изтеглено + Изтегля се + Изтеглянето е на пауза + Изтеглянето започна + Изтеглянето се провали + Изтеглянето е отменено + Изтеглянето е завършено + Поток + + Грешка при зареждане на връзки + Вътрешна памет + + Дублаж + Субтитри + + Изтрий файла + Възпроизвеждане на файл + Възобновете изтеглянето + Пауза на изтеглянето + + Деактивирайте автоматичното докладване на грешки + Повече информация + Скрий + Пусни + Информация + Филтриране на отметки + Отметки + Премахване + Задайте статус на гледане + Приложи + Отказ + Копирай + Затвори + Изчисти + Запазване + + Скорост на възпроизвеждане + + Настройки на субтитрите + Цвят на текста + Цвят на контура + Цвят на фона + Цвят на прозореца + Тип ръб + Височина на субтитрите + Шрифт + Размер на шрифта + + Търсене чрез доставчици + Търсене с помощта на типове + + %d Банан/а даден/и на разработчиците + Не е/са даден/и Банан/и + + Автоматичен избор на език + Изтегляне на езици + Език на субтитрите + Задръжте, за да нулирате по подразбиране + Импортирайте шрифтове, като ги поставите в %s + Продължете да гледате + + Премахване + Повече информация + @string/home_play + + Може да е необходим VPN, за да работи правилно този доставчик + Този доставчик е торент, препоръчва се VPN + + Метаданните не се предоставят от сайта, зареждането на видео ще бъде неуспешно, ако не съществува на сайта. + + Описание + Няма намерен съдържание + Няма намерено описание + + Покажи logcat 🐈 + + Картина в картина + Продължава възпроизвеждането в миниатюрен плейър върху други приложения + Бутон за преоразмеряване на плейъра + Премахнете черните граници + Субтитри + Настройки на субтитрите на плейъра + Chromecast субтитри + Настройки за субтитри на Chromecast + + Режим Eigengravy (промяна скорост на възпроизвеждане) + Добавя опция за скорост в плейъра + Плъзнете за преместване + Плъзнете наляво или надясно, за да контролирате времето във видеоплейъра + Плъзнете, за да промените настройките + Плъзнете наляво или надясно, за да промените яркостта или силата на звука + + Автоматично пускане на следващ епизод + Започнете следващия епизод, когато текущият приключи + + Докоснете двукратно за превъртане + Докоснете два пъти за пауза + Размер на превъртане + Докоснете два пъти от дясната или лявата страна, за да превъртите напред или назад + Докоснете в средата, за да направите пауза + Използвайте яркостта на системата + Използвайте системна яркост в плейъра на приложението вместо тъмно + наслагване + + Актуализирайте прогреса на гледане + Автоматично синхронизирайте прогреса на текущия си епизод + + Възстановете данните от архив + + Архивиране на данни + Зареден архивен файл + Неуспешно възстановяване на данни от файл %s + Успешно съхранени данни + Липсват разрешения за съхранение, моля, опитайте отново + Грешка при архивирането на %s + + Търсене + Акаунти + Актуализации и архивиране + + Информация + Подробно търсене + Дава ви резултатите от търсенето, разделени по доставчик + Изпраща данни само за сривове + Не изпраща данни + Показване заместващ епизод за аниме + Показване на трейлъри + Покажете плакати от kitsu + Скриване на избраното видео качество в резултатите от търсенето + + Автоматични актуализации на плъгини + Показвай актуализации на приложението + Автоматично търси нови актуализации при стартиране + Актуализация до експериментални версии + Търсете експериментални актуализации вместо само пълни версии + Github + Light novel - приложение от същите разработчици + Приложение за аниме от същите разработчици + Присъединете се към Discord + Дайте банан/и разработчиците + Даден/и банан/и + + Език на приложението + + Този доставчик няма поддръжка за Chromecast + Няма намерени връзки + Връзката е копирана в клипборда + Пусни епизода + Възстановяване на стойността по подразбиране + За съжаление приложението се срина. Анонимен доклад за грешка ще бъде изпратен до + разработчиците + + Сезон + %s %d%s + Без сезон + Епизод + Епизоди + %d-%d + %d %s + С + Е + Няма намерени епизоди + + Изтрий файла + Изтрий + Пауза + Продължи + -30 + 30 + Това ще изтрие за постоянно %s\nСигурни ли сте? + %dm\nостава + + + Продължава + Завършен + Статус + Година + Рейтинг + Продължителност + Уебсайт + Синопсис + + На опашката + Без субтитри + По подразбиране + + Безплатно + Използвано + Приложения + + + Филми + Телевизионен сериал + Анимационни филми + Аниме + Торенти + Документални + OVA + Азиатски драми + На живо + Разпоретини + други + + + Филм + Серия + Анимационен филм + @string/аниме + @string/ova + Торент + Документален филм + Азиатска драма + Поток на живо + Разпоретинa + Видео + + Грешка в източника + Дистанционна грешка + Грешка в рендъра + Неочаквана грешка на плеъра + Грешка при изтегляне, проверете разрешенията за съхранение + + Епизод за Chromecast + Chromecast огледало + Пусни в приложението + Пусни в %s + Пусни в браузър + Копирай връзка + Автоматично изтегляне + Изтегляне на огледало + Презареждане на връзки + Изтегляне на субтитри + + покажи качество + Покажи дублаж + Покажи субтитри + Заглавие + Превключване на елементите на потребителския интерфейс на плаката + + Няма намерена актуализация + Проверка за актуализация + + Заключен + Преоразмеряване + Източник + Пропусни + + Не показвай отново + Пропуснете тази актуализация + Актуализация + Предпочитано качество за гледане + Максимален брой знаци за заглавие във видеоплейъра + Разделителна способност на видео плейъра + + Размер на видео буфера + Дължина на видео буфера + Видео кеш на диск + Изчистете кеша за видео и изображения + + Ще предизвика случайни сривове, ако е зададено твърде високо. Не променяйте, ако имате малко количество RAM, като Android TV или стар телефон + Може да причини проблеми на системи с малко място за съхранение, като устройства с Android TV, ако го зададете твърде високо + + DNS през HTTPS + Полезно за заобикаляне на блокирания от ISP доставчик + + Сайт за клониране + Премахване на сайта + Добавяне на клонинг на съществуващ сайт с различен URL адрес + + Път за изтегляне + + URL адрес на сървъра на Nginx + + Показване на дублирани/субирани аниме + + Побиране в екрана + Разтягане + Мащабиране + + Опровержение + should be taken up with the actual file hosts and providers themselves as we are not affiliated with them. + + In case of copyright infringement, please directly contact the responsible parties or the streaming websites. + + The app is purely for educational and personal use. + + CloudStream 3 does not host any content on the app, and has no control over what media is put up or taken down. + CloudStream 3 functions like any other search engine, such as Google. CloudStream 3 does not host, upload or + manage any videos, films or content. It simply crawls, aggregates and displayes links in a convenient, + user-friendly interface. + + It merely scrapes 3rd-party websites that are publicly accessable via any regular web browser. It is the + responsibility of user to avoid any actions that might violate the laws governing his/her locality. Use + CloudStream 3 at your own risk. + + Общ + Случаен бутон + Показване на произволен бутон на началната страница + Езици на доставчика + Оформление на приложението + Предпочитана медия + Активирайте разпоретините на поддържани доставчици + Кодиране на субтитрите + Доставчици + Оформление + + Автоматично + ТВ оформление + Оформление като телефон + Оформление като емулатор + + Основен цвят + Тема на приложението + Местоположение на заглавието на плаката + Поставете заглавието под плаката + + парола123 + MyCoolUsername + hello@world.com + 127.0.0.1 + MyCoolSite + example.com + Езиков код (en) + + + %s %s + Акаунт + Излизане + Влизане + Превключване на акаунт + Добавяне на акаунт + Създай акаунт + Добавете проследяване + Добавен %s + Синхронизиране + Оценен + %d / 10 + /?? + /%d + Удостоверен %s + Неуспешно удостоверяване на %s + + + Нито един + Нормално + Всичко + Макс + Мин + Контур + Удвоени + Сянка + Повдигнати + Синхронизиране на суб + 1000ms + Забавяне на субтитрите + Използвайте това, ако субтитрите се показват %dms твърде рано + Използвайте това, ако субтитрите се показват %dms твърде късно + Без забавяне на субтитрите + + + + Бързата кафява лисица прескача мързеливото куче + + Препоръчва се + Заредено %s + Зареди от файл + Зареди от Интернет + Изтеглен файл + Главен + Поддържащ + Заден план + + Източник + Случаен + + Очаквайте скоро… + + Cam + Cam + Cam + HQ + HD + TS + TC + BlueRay + WP + DVD + 4K + SD + UHD + HDR + SDR + Web + + Снимка на плакат + Плеър + Резолюция и заглавие + Заглавие + Резолюция + Невалиден идентификатор + Невалидни данни + Невалиден адрес + Грешка + Премахнете затворените надписи от субтитрите + Премахнете рекламирането в субтитрите + Филтриране по предпочитан медиен език + Екстри + Трейлър + Връзка към потока + Обратно към + Следващ + Гледайте видеоклипове на тези езици + Предишен + Пропуснете настройката + Променете външния вид на приложението, за да отговаря на вашето устройство + Докладване за сривове + Какво искате да видите + Край + Разширения + Добавяне на хранилище + Име на хранилище + URL адрес на хранилището + Приставката е заредена + Приставката е изтрита + Неуспешно зареждане %s + 18+ + Започна да изтегля %d %s + Изтеглено %d %s успешно + Всички %s вече са изтеглени + Пакетно изтегляне + Плъгин + Плъгини + Това също ще изтрие всички хранилища за плъгини + Изтриване на хранилище + Изтеглете списъка със сайтове, които искате да използвате + Изтеглено: %d + Деактивирано: %d + Не е изтеглено: %d + Актуализирани %d плъгини + CloudStream няма инсталирани сайтове по подразбиране. Трябва да инсталирате сайтовете от хранилища.\n\nПоради безмозъчно премахване на DMCA от Sky Uk Limited 🤮 не можем да свържем сайтовете на хранилищата в приложението.\n\nПрисъединете се към нашия дискорд за връзки или търсете онлайн. + Вижте хранилищата на общността + Публичен списък + Всички субтитри с главни букви + + Изтегляне на всички добавки от това хранилище? + %s (Disabled) + Потоци + Аудио потоци + Видео потоци + Приложете при рестартиране + + Безопасният режим е активиран + Възникна непоправим срив и ние автоматично деактивирахме всички разширения, така че можете да намерите и премахнете разширението, което причинява проблеми. + Вижте информация за срива + + Оценка: %s + Описание + Версия + Статус + Размер + Автори + Поддържани + език + Първо инсталирайте разширението + + HLS плейлист + + Предпочитан видео плеър + Вътрешен плеър + VLC + MPV + Уеб видео предаване + Браузър + Приложението не е намерено + \ No newline at end of file From 0f625142dacb4553b9af57f7f949eff9eab7b218 Mon Sep 17 00:00:00 2001 From: "J. Fronny" Date: Wed, 26 Oct 2022 19:56:31 +0000 Subject: [PATCH 06/13] Switch to kotlin build scripts (#158) --- .github/workflows/prerelease.yml | 4 +- .github/workflows/pull_request.yml | 4 +- .idea/jarRepositories.xml | 5 + app/build.gradle | 233 --------------------- app/build.gradle.kts | 250 +++++++++++++++++++++++ app/proguard-rules.pro | 2 +- app/src/main/AndroidManifest.xml | 3 +- build.gradle | 27 --- build.gradle.kts | 26 +++ gradle/wrapper/gradle-wrapper.properties | 2 +- settings.gradle | 2 - settings.gradle.kts | 3 + 12 files changed, 291 insertions(+), 270 deletions(-) delete mode 100644 app/build.gradle create mode 100644 app/build.gradle.kts delete mode 100644 build.gradle create mode 100644 build.gradle.kts delete mode 100644 settings.gradle create mode 100644 settings.gradle.kts diff --git a/.github/workflows/prerelease.yml b/.github/workflows/prerelease.yml index 37161d6b..a7615ad5 100644 --- a/.github/workflows/prerelease.yml +++ b/.github/workflows/prerelease.yml @@ -43,7 +43,7 @@ jobs: echo "::set-output name=key_pwd::$KEY_PWD" - name: Run Gradle run: | - ./gradlew assemblePrerelease makeJar androidSourcesJar + ./gradlew assemblePrereleaseRelease makeJar androidSourcesJar env: SIGNING_KEY_ALIAS: "key0" SIGNING_KEY_PASSWORD: ${{ steps.fetch_keystore.outputs.key_pwd }} @@ -56,6 +56,6 @@ jobs: prerelease: true title: "Pre-release Build" files: | - app/build/outputs/apk/prerelease/*.apk + app/build/outputs/apk/prerelease/stable/*.apk app/build/libs/app-sources.jar app/build/classes.jar diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml index 1a4db134..36199cd6 100644 --- a/.github/workflows/pull_request.yml +++ b/.github/workflows/pull_request.yml @@ -15,9 +15,9 @@ jobs: - name: Grant execute permission for gradlew run: chmod +x gradlew - name: Run Gradle - run: ./gradlew assembleDebug + run: ./gradlew assemblePrereleaseDebug - name: Upload Artifact uses: actions/upload-artifact@v2 with: name: pull-request-build - path: "app/build/outputs/apk/debug/*.apk" + path: "app/build/outputs/apk/prerelease/debug/*.apk" diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml index 652d9f3f..333d4937 100644 --- a/.idea/jarRepositories.xml +++ b/.idea/jarRepositories.xml @@ -31,5 +31,10 @@