Merge branch 'master' into master

This commit is contained in:
LagradOst 2021-11-03 20:38:50 +01:00 committed by GitHub
commit 8e9c11db4b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
92 changed files with 1720 additions and 455 deletions

View file

@ -1,10 +1,12 @@
# CloudStream-3
![GitHub release](https://img.shields.io/github/v/release/LagradOst/cloudstream-3?sort=semver&style=for-the-badge)
[![Discord](https://img.shields.io/discord/737724143126052974?style=for-the-badge)](https://discord.gg/5Hus6fM)
**DOWNLOAD:**
https://github.com/LagradOst/CloudStream-3/releases
**Discord:**
https://discord.gg/5Hus6fM
***Features:***
+ **AdFree**, No ads whatsoever
@ -27,6 +29,7 @@ https://discord.gg/5Hus6fM
* 🇪🇸 Spanish
* 🇳🇴 Norsk
* 🇩🇪 German
* 🇹🇷 Turkish
***SCREENSHOTS:***
@ -49,6 +52,7 @@ It merely scrapes 3rd-party websites that are publicly accessable via any regula
<!-- Do not remove those two comments -->
<!--SITE LIST START-->
- [gogoanime.vc](https://gogoanime.vc)
- [allanime.site](https://allanime.site)
- [animeflick.net](https://animeflick.net)
- [kawaiifu.com](https://kawaiifu.com)
- [tenshi.moe](https://tenshi.moe)

View file

@ -34,8 +34,9 @@ android {
applicationId "com.lagradost.cloudstream3"
minSdkVersion 21
targetSdkVersion 31
versionCode 31
versionName "2.1.2"
versionCode 33
versionName "2.2.2"
resValue "string", "app_version",
"${defaultConfig.versionName}${versionNameSuffix ?: ""}"

View file

@ -10,10 +10,16 @@
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>
<uses-feature android:name="android.hardware.touchscreen"
android:required="false"/>
<uses-feature android:name="android.software.leanback"
android:required="false"/>
<application
android:name=".AcraApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:banner="@mipmap/ic_banner"
android:label="@string/app_name"
android:usesCleartextTraffic="true"
android:roundIcon="@mipmap/ic_launcher_round"
@ -33,6 +39,7 @@
android:exported="true">
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
<category android:name="android.intent.category.LEANBACK_LAUNCHER"/>
</intent-filter>
<intent-filter
android:exported="true">
@ -63,7 +70,7 @@
android:enabled="false"
android:exported="true">
<intent-filter android:exported="true">
<action android:name="restart_service" />
<action android:name="restart_service"/>
</intent-filter>
</receiver>
<service

View file

@ -28,6 +28,7 @@ object APIHolder {
val apis = arrayListOf(
GogoanimeProvider(),
AllAnimeProvider(),
//ShiroProvider(), // v2 fucked me
//AnimePaheProvider(), //ddos guard
AnimeFlickProvider(),
@ -253,11 +254,9 @@ fun sortSubs(urls: List<SubtitleFile>): List<SubtitleFile> {
}
/** https://www.imdb.com/title/tt2861424/ -> tt2861424 */
fun imdbUrlToId(url: String): String {
return url
.removePrefix("https://www.imdb.com/title/")
.removePrefix("https://imdb.com/title/tt2861424/")
.replace("/", "")
fun imdbUrlToId(url: String): String? {
return Regex("/title/(tt[0-9]*)").find(url)?.groupValues?.get(1)
?: Regex("tt[0-9]{5,}").find(url)?.groupValues?.get(0)
}
fun imdbUrlToIdNullable(url: String?): String? {
@ -392,12 +391,12 @@ fun LoadResponse?.isAnimeBased(): Boolean {
data class AnimeEpisode(
val url: String,
val name: String? = null,
val posterUrl: String? = null,
val date: String? = null,
val rating: Int? = null,
val descript: String? = null,
val episode: Int? = null,
var name: String? = null,
var posterUrl: String? = null,
var date: String? = null,
var rating: Int? = null,
var description: String? = null,
var episode: Int? = null,
)
data class TorrentLoadResponse(
@ -418,32 +417,47 @@ data class TorrentLoadResponse(
) : LoadResponse
data class AnimeLoadResponse(
val engName: String?,
val japName: String?,
var engName: String? = null,
var japName: String? = null,
override val name: String,
override val url: String,
override val apiName: String,
override val type: TvType,
override val posterUrl: String?,
override val year: Int?,
override var posterUrl: String? = null,
override var year: Int? = null,
val dubEpisodes: List<AnimeEpisode>?,
val subEpisodes: List<AnimeEpisode>?,
val showStatus: ShowStatus?,
var episodes: HashMap<DubStatus, List<AnimeEpisode>> = hashMapOf(),
var showStatus: ShowStatus? = null,
override val plot: String?,
override val tags: List<String>? = null,
val synonyms: List<String>? = null,
override var plot: String? = null,
override var tags: List<String>? = null,
var synonyms: List<String>? = null,
val malId: Int? = null,
val anilistId: Int? = null,
override val rating: Int? = null,
override val duration: String? = null,
override val trailerUrl: String? = null,
override val recommendations: List<SearchResponse>? = null,
var malId: Int? = null,
var anilistId: Int? = null,
override var rating: Int? = null,
override var duration: String? = null,
override var trailerUrl: String? = null,
override var recommendations: List<SearchResponse>? = null,
) : LoadResponse
fun AnimeLoadResponse.addEpisodes(status : DubStatus, episodes : List<AnimeEpisode>?) {
if(episodes == null) return
this.episodes[status] = episodes
}
fun MainAPI.newAnimeLoadResponse(
name: String,
url: String,
type: TvType,
initializer: AnimeLoadResponse.() -> Unit = { }
): AnimeLoadResponse {
val builder = AnimeLoadResponse(name = name, url = url, apiName = this.name, type = type)
builder.initializer()
return builder
}
data class MovieLoadResponse(
override val name: String,
override val url: String,
@ -451,11 +465,11 @@ data class MovieLoadResponse(
override val type: TvType,
val dataUrl: String,
override val posterUrl: String?,
override val year: Int?,
override val plot: String?,
override val posterUrl: String? = null,
override val year: Int? = null,
override val plot: String? = null,
val imdbId: String?,
val imdbId: String? = null,
override val rating: Int? = null,
override val tags: List<String>? = null,
override val duration: String? = null,
@ -464,9 +478,9 @@ data class MovieLoadResponse(
) : LoadResponse
data class TvSeriesEpisode(
val name: String?,
val season: Int?,
val episode: Int?,
val name: String? = null,
val season: Int? = null,
val episode: Int? = null,
val data: String,
val posterUrl: String? = null,
val date: String? = null,
@ -481,12 +495,12 @@ data class TvSeriesLoadResponse(
override val type: TvType,
val episodes: List<TvSeriesEpisode>,
override val posterUrl: String?,
override val year: Int?,
override val plot: String?,
override val posterUrl: String? = null,
override val year: Int? = null,
override val plot: String? = null,
val showStatus: ShowStatus?,
val imdbId: String?,
val showStatus: ShowStatus? = null,
val imdbId: String? = null,
override val rating: Int? = null,
override val tags: List<String>? = null,
override val duration: String? = null,

View file

@ -31,6 +31,7 @@ import com.lagradost.cloudstream3.receivers.VideoDownloadRestartReceiver
import com.lagradost.cloudstream3.ui.APIRepository
import com.lagradost.cloudstream3.ui.download.DOWNLOAD_NAVIGATE_TO
import com.lagradost.cloudstream3.ui.player.PlayerEventType
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.isTvSettings
import com.lagradost.cloudstream3.utils.AppUtils.isCastApiAvailable
import com.lagradost.cloudstream3.utils.AppUtils.loadResult
import com.lagradost.cloudstream3.utils.DataStore.getKey
@ -160,16 +161,16 @@ class MainActivity : AppCompatActivity(), ColorPickerDialogListener {
KeyEvent.KEYCODE_BACK, KeyEvent.KEYCODE_A, KeyEvent.KEYCODE_MEDIA_SKIP_BACKWARD, KeyEvent.KEYCODE_MEDIA_REWIND -> {
PlayerEventType.SeekBack
}
KeyEvent.KEYCODE_MEDIA_NEXT -> {
KeyEvent.KEYCODE_MEDIA_NEXT, KeyEvent.KEYCODE_BUTTON_R1 -> {
PlayerEventType.NextEpisode
}
KeyEvent.KEYCODE_MEDIA_PREVIOUS -> {
KeyEvent.KEYCODE_MEDIA_PREVIOUS, KeyEvent.KEYCODE_BUTTON_L1 -> {
PlayerEventType.PrevEpisode
}
KeyEvent.KEYCODE_MEDIA_PAUSE -> {
PlayerEventType.Pause
}
KeyEvent.KEYCODE_MEDIA_PLAY -> {
KeyEvent.KEYCODE_MEDIA_PLAY, KeyEvent.KEYCODE_BUTTON_START -> {
PlayerEventType.Play
}
KeyEvent.KEYCODE_L, KeyEvent.KEYCODE_NUMPAD_7 -> {
@ -184,13 +185,13 @@ class MainActivity : AppCompatActivity(), ColorPickerDialogListener {
KeyEvent.KEYCODE_S, KeyEvent.KEYCODE_NUMPAD_9 -> {
PlayerEventType.ShowMirrors
}
KeyEvent.KEYCODE_E, KeyEvent.KEYCODE_NUMPAD_3 -> {
KeyEvent.KEYCODE_E, KeyEvent.KEYCODE_NUMPAD_3 -> {
PlayerEventType.ShowSpeed
}
KeyEvent.KEYCODE_R, KeyEvent.KEYCODE_NUMPAD_0 -> {
PlayerEventType.Resize
}
KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE, KeyEvent.KEYCODE_P, KeyEvent.KEYCODE_SPACE -> { // space is not captured due to navigation
KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE, KeyEvent.KEYCODE_P, KeyEvent.KEYCODE_SPACE, KeyEvent.KEYCODE_NUMPAD_ENTER, KeyEvent.KEYCODE_ENTER -> { // space is not captured due to navigation
PlayerEventType.PlayPauseToggle
}
else -> null
@ -198,6 +199,12 @@ class MainActivity : AppCompatActivity(), ColorPickerDialogListener {
playerEventListener?.invoke(playerEvent)
}
//when (keyCode) {
// KeyEvent.KEYCODE_DPAD_CENTER -> {
// println("DPAD PRESSED ${this.isKeyboardOpen()}")
// }
//}
return super.onKeyDown(keyCode, event)
}
@ -354,10 +361,35 @@ class MainActivity : AppCompatActivity(), ColorPickerDialogListener {
}
override fun onCreate(savedInstanceState: Bundle?) {
val settingsManager = PreferenceManager.getDefaultSharedPreferences(this)
val currentTheme = when (settingsManager.getString(getString(R.string.app_theme_key), "Black")) {
"Black" -> R.style.AppTheme
"Light" -> R.style.LightMode
"Amoled" -> R.style.AmoledMode
else -> R.style.AppTheme
}
val currentOverlayTheme = when (settingsManager.getString(getString(R.string.primary_color_key), "Normal")) {
"Normal" -> R.style.OverlayPrimaryColorNormal
"Blue" -> R.style.OverlayPrimaryColorBlue
"Purple" -> R.style.OverlayPrimaryColorPurple
"Green" -> R.style.OverlayPrimaryColorGreen
"GreenApple" -> R.style.OverlayPrimaryColorGreenApple
"Red" -> R.style.OverlayPrimaryColorRed
"Banana" -> R.style.OverlayPrimaryColorBanana
"Party" -> R.style.OverlayPrimaryColorParty
else -> R.style.OverlayPrimaryColorNormal
}
theme.applyStyle(currentTheme, true)
theme.applyStyle(currentOverlayTheme, true)
theme.applyStyle(
R.style.LoadedStyle,
true
) // THEME IS SET BEFORE VIEW IS CREATED TO APPLY THE THEME TO THE MAIN VIEW
updateLocale()
initRequestClient()
super.onCreate(savedInstanceState)
@ -371,7 +403,12 @@ class MainActivity : AppCompatActivity(), ColorPickerDialogListener {
window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN)
setContentView(R.layout.activity_main)
if (isTvSettings()) {
setContentView(R.layout.activity_main_tv)
} else {
setContentView(R.layout.activity_main)
}
// val navView: BottomNavigationView = findViewById(R.id.nav_view)
//https://stackoverflow.com/questions/52594181/how-to-know-if-user-has-disabled-picture-in-picture-feature-permission

View file

@ -0,0 +1,320 @@
package com.lagradost.cloudstream3.animeproviders
import com.fasterxml.jackson.annotation.JsonProperty
import com.fasterxml.jackson.module.kotlin.readValue
import com.lagradost.cloudstream3.*
import com.lagradost.cloudstream3.network.get
import com.lagradost.cloudstream3.network.text
import com.lagradost.cloudstream3.utils.ExtractorLink
import com.lagradost.cloudstream3.utils.M3u8Helper
import com.lagradost.cloudstream3.utils.getQualityFromName
import org.jsoup.Jsoup
import org.mozilla.javascript.Context
import org.mozilla.javascript.Scriptable
import java.net.URI
import java.net.URLDecoder
import java.util.*
class AllAnimeProvider : MainAPI() {
override val mainUrl: String
get() = "https://allanime.site"
override val name: String
get() = "AllAnime"
override val hasQuickSearch: Boolean
get() = false
override val hasMainPage: Boolean
get() = false
private val hlsHelper = M3u8Helper()
private fun getStatus(t: String): ShowStatus {
return when (t) {
"Finished" -> ShowStatus.Completed
"Releasing" -> ShowStatus.Ongoing
else -> ShowStatus.Completed
}
}
override val supportedTypes: Set<TvType>
get() = setOf(TvType.Anime, TvType.AnimeMovie)
private data class Data(
@JsonProperty("shows") val shows: Shows
)
private data class Shows(
@JsonProperty("pageInfo") val pageInfo: PageInfo,
@JsonProperty("edges") val edges: List<Edges>,
@JsonProperty("__typename") val _typename: String
)
private data class Edges(
@JsonProperty("_id") val Id: String?,
@JsonProperty("name") val name: String,
@JsonProperty("englishName") val englishName: String?,
@JsonProperty("nativeName") val nativeName: String?,
@JsonProperty("thumbnail") val thumbnail: String?,
@JsonProperty("type") val type: String?,
@JsonProperty("season") val season: Season?,
@JsonProperty("score") val score: Double?,
@JsonProperty("airedStart") val airedStart: AiredStart?,
@JsonProperty("availableEpisodes") val availableEpisodes: AvailableEpisodes?,
@JsonProperty("availableEpisodesDetail") val availableEpisodesDetail: AvailableEpisodesDetail?,
@JsonProperty("studios") val studios: List<String>?,
@JsonProperty("description") val description: String?,
@JsonProperty("status") val status: String?,
)
private data class AvailableEpisodes(
@JsonProperty("sub") val sub: Int,
@JsonProperty("dub") val dub: Int,
@JsonProperty("raw") val raw: Int
)
private data class AiredStart(
@JsonProperty("year") val year: Int,
@JsonProperty("month") val month: Int,
@JsonProperty("date") val date: Int
)
private data class Season(
@JsonProperty("quarter") val quarter: String,
@JsonProperty("year") val year: Int
)
private data class PageInfo(
@JsonProperty("total") val total: Int,
@JsonProperty("__typename") val _typename: String
)
private data class AllAnimeQuery(
@JsonProperty("data") val data: Data
)
override fun search(query: String): ArrayList<SearchResponse> {
val link =
"""$mainUrl/graphql?variables=%7B%22search%22%3A%7B%22allowAdult%22%3Afalse%2C%22query%22%3A%22$query%22%7D%2C%22limit%22%3A26%2C%22page%22%3A1%2C%22translationType%22%3A%22sub%22%7D&extensions=%7B%22persistedQuery%22%3A%7B%22version%22%3A1%2C%22sha256Hash%22%3A%229343797cc3d9e3f444e2d3b7db9a84d759b816a4d84512ea72d079f85bb96e98%22%7D%7D"""
var res = get(link).text
if (res.contains("PERSISTED_QUERY_NOT_FOUND")) {
res = get(link).text
if (res.contains("PERSISTED_QUERY_NOT_FOUND")) return ArrayList()
}
val response = mapper.readValue<AllAnimeQuery>(res)
val results = response.data.shows.edges.filter {
// filtering in case there is an anime with 0 episodes available on the site.
!(it.availableEpisodes?.raw == 0 && it.availableEpisodes.sub == 0 && it.availableEpisodes.dub == 0)
}
return ArrayList(results.map {
AnimeSearchResponse(
it.name,
"$mainUrl/anime/${it.Id}",
this.name,
TvType.Anime,
it.thumbnail,
it.airedStart?.year,
EnumSet.of(DubStatus.Subbed, DubStatus.Dubbed),
it.englishName,
it.availableEpisodes?.dub,
it.availableEpisodes?.sub
)
})
}
private data class AvailableEpisodesDetail(
@JsonProperty("sub") val sub: List<String>,
@JsonProperty("dub") val dub: List<String>,
@JsonProperty("raw") val raw: List<String>
)
override fun load(url: String): LoadResponse? {
val rhino = Context.enter()
rhino.initStandardObjects()
rhino.optimizationLevel = -1
val scope: Scriptable = rhino.initStandardObjects()
val html = get(url).text
val soup = Jsoup.parse(html)
val script = soup.select("script").firstOrNull {
it.html().contains("window.__NUXT__")
} ?: return null
val js = """
const window = {}
${script.html()}
const returnValue = JSON.stringify(window.__NUXT__.fetch[0].show)
""".trimIndent()
rhino.evaluateString(scope, js, "JavaScript", 1, null)
val jsEval = scope.get("returnValue", scope) ?: return null
val showData = mapper.readValue<Edges>(jsEval as String)
val title = showData.name
val description = showData.description
val poster = showData.thumbnail
val episodes = showData.availableEpisodes.let {
if (it == null) return@let Pair(null, null)
Pair(if (it.sub != 0) ArrayList((1..it.sub).map { epNum ->
AnimeEpisode(
"$mainUrl/anime/${showData.Id}/episodes/sub/$epNum", episode = epNum
)
}) else null, if (it.dub != 0) ArrayList((1..it.dub).map { epNum ->
AnimeEpisode(
"$mainUrl/anime/${showData.Id}/episodes/dub/$epNum", episode = epNum
)
}) else null)
}
return newAnimeLoadResponse(title, url, TvType.Anime) {
posterUrl = poster
year = showData.airedStart?.year
addEpisodes(DubStatus.Subbed, episodes.first)
addEpisodes(DubStatus.Dubbed, episodes.second)
showStatus = getStatus(showData.status.toString())
plot = description?.replace(Regex("""<(.*?)>"""), "")
}
}
private val embedBlackList = listOf(
"https://mp4upload.com/",
"https://streamsb.net/",
"https://dood.to/",
"https://videobin.co/",
"https://ok.ru",
"https://streamlare.com",
)
private fun embedIsBlacklisted(url: String): Boolean {
embedBlackList.forEach {
if (it.javaClass.name == "kotlin.text.Regex") {
if ((it as Regex).matches(url)) {
return true
}
} else {
if (url.contains(it)) {
return true
}
}
}
return false
}
private fun String.sanitize(): String {
var out = this
listOf(Pair("\\u002F", "/")).forEach {
out = out.replace(it.first, it.second)
}
return out
}
private data class Links(
@JsonProperty("link") val link: String,
@JsonProperty("hls") val hls: Boolean?,
@JsonProperty("resolutionStr") val resolutionStr: String,
@JsonProperty("src") val src: String?
)
private data class AllAnimeVideoApiResponse(
@JsonProperty("links") val links: List<Links>
)
private data class ApiEndPoint(
@JsonProperty("episodeIframeHead") val episodeIframeHead: String
)
private fun getM3u8Qualities(m3u8Link: String, referer: String, qualityName: String): ArrayList<ExtractorLink> {
return ArrayList(hlsHelper.m3u8Generation(M3u8Helper.M3u8Stream(m3u8Link, null), true).map { stream ->
val qualityString = if ((stream.quality ?: 0) == 0) "" else "${stream.quality}p"
ExtractorLink(
this.name,
"${this.name} - $qualityName $qualityString",
stream.streamUrl,
referer,
getQualityFromName(stream.quality.toString()),
true,
stream.headers
)
})
}
override fun loadLinks(
data: String,
isCasting: Boolean,
subtitleCallback: (SubtitleFile) -> Unit,
callback: (ExtractorLink) -> Unit
): Boolean {
var apiEndPoint = mapper.readValue<ApiEndPoint>(get("$mainUrl/getVersion").text).episodeIframeHead
if (apiEndPoint.endsWith("/")) apiEndPoint = apiEndPoint.slice(0 until apiEndPoint.length - 1)
val html = get(data).text
val sources = Regex("""sourceUrl[:=]"(.+?)"""").findAll(html).toList()
.map { URLDecoder.decode(it.destructured.component1().sanitize(), "UTF-8") }
sources.forEach {
var link = it
if (URI(link).isAbsolute || link.startsWith("//")) {
if (link.startsWith("//")) link = "https:$it"
if (Regex("""streaming\.php\?""").matches(link)) {
// for now ignore
} else if (!embedIsBlacklisted(link)) {
if (URI(link).path.contains(".m3u")) {
getM3u8Qualities(link, data, URI(link).host).forEach(callback)
} else {
callback(
ExtractorLink(
"AllAnime - " + URI(link).host,
"",
link,
data,
getQualityFromName("1080"),
false
)
)
}
}
} else {
link = apiEndPoint + URI(link).path + ".json?" + URI(link).query
val response = get(link)
if (response.code < 400) {
val links = mapper.readValue<AllAnimeVideoApiResponse>(response.text).links
links.forEach { server ->
if (server.hls != null && server.hls) {
getM3u8Qualities(
server.link,
"$apiEndPoint/player?uri=" + (if (URI(server.link).host.isNotEmpty()) server.link else apiEndPoint + URI(
server.link
).path),
server.resolutionStr
).forEach(callback)
} else {
callback(
ExtractorLink(
"AllAnime - " + URI(server.link).host,
server.resolutionStr,
server.link,
"$apiEndPoint/player?uri=" + (if (URI(server.link).host.isNotEmpty()) server.link else apiEndPoint + URI(
server.link
).path),
getQualityFromName("1080"),
false
)
)
}
}
}
}
}
return true
}
}

View file

@ -76,21 +76,15 @@ class AnimeFlickProvider : MainAPI() {
AnimeEpisode(link, name)
}.reversed()
return AnimeLoadResponse(
title,
null,
title,
url,
this.name,
getType(title),
poster,
year,
null,
episodes,
null,
description,
genres
)
return newAnimeLoadResponse(title, url, getType(title)) {
posterUrl = poster
this.year = year
addEpisodes(DubStatus.Subbed, episodes)
plot = description
tags = genres
}
}
override fun loadLinks(

View file

@ -293,30 +293,26 @@ class AnimePaheProvider : MainAPI() {
}
}
AnimeLoadResponse(
animeTitle,
japTitle,
animeTitle,
url,
this.name,
getType(tvType.toString()),
poster,
year,
null,
episodes,
status,
synopsis,
if (!doc.select(".anime-genre > ul a").isEmpty()) {
newAnimeLoadResponse(animeTitle, url, getType(tvType.toString())) {
engName = animeTitle
japName = japTitle
this.posterUrl = poster
this.year = year
addEpisodes(DubStatus.Subbed, episodes)
this.showStatus = status
plot = synopsis
tags = if (!doc.select(".anime-genre > ul a").isEmpty()) {
ArrayList(doc.select(".anime-genre > ul a").map { it.text().toString() })
} else {
null
},
ArrayList(),
malId,
anilistId,
null,
trailer
)
}
this.malId = malId
this.anilistId = anilistId
this.trailerUrl = trailer
}
}
}
@ -325,7 +321,6 @@ class AnimePaheProvider : MainAPI() {
return s?.toIntOrNull() != null
}
private fun cookieStrToMap(cookie: String): Map<String, String> {
val cookies = mutableMapOf<String, String>()
for (string in cookie.split("; ")) {
@ -347,7 +342,6 @@ class AnimePaheProvider : MainAPI() {
val slice2 = characterMap.slice(0 until s2)
var acc: Long = 0
for ((n, i) in content.reversed().withIndex()) {
acc += (when (isNumber("$i")) {
true -> "$i".toLong()

View file

@ -109,7 +109,7 @@ class DubbedAnimeProvider : MainAPI() {
HomePageList("Trending", parseDocumentTrending(trendingUrl)),
HomePageList("Recently Added", parseDocument(recentlyAddedUrl)),
HomePageList("Recent Releases", parseDocument(lastEpisodeUrl, true)),
// HomePageList("All", parseDocument(allUrl))
// HomePageList("All", parseDocument(allUrl))
)
return HomePageResponse(listItems)
@ -268,20 +268,12 @@ class DubbedAnimeProvider : MainAPI() {
}
val img = fixUrl(document.select("div.fkimgs > img").attr("src"))
return AnimeLoadResponse(
null,
null,
title,
url,
this.name,
TvType.Anime,
img,
year,
ArrayList(episodes),
null,
null,
descript,
)
return newAnimeLoadResponse(title, url, TvType.Anime) {
posterUrl = img
this.year = year
addEpisodes(DubStatus.Dubbed, episodes)
plot = descript
}
}
}
}

View file

@ -185,24 +185,18 @@ class GogoanimeProvider : MainAPI() {
"Episode " + it.selectFirst(".name").text().replace("EP", "").trim()
)
}.reversed()
return AnimeLoadResponse(
title,
nativeName,
title,
link,
this.name,
getType(type.toString()),
poster,
year,
null,
episodes,
getStatus(status.toString()),
description,
ArrayList(genre),
null,
null,
null,
)
return newAnimeLoadResponse(title, link, getType(type.toString())) {
japName = nativeName
engName = title
posterUrl = poster
this.year = year
addEpisodes(DubStatus.Subbed, episodes) // TODO CHECK
plot = description
tags = genre
showStatus = getStatus(status.toString())
}
}
private fun extractVideos(uri: String): List<ExtractorLink> {

View file

@ -109,23 +109,13 @@ class KawaiifuProvider : MainAPI() {
}
val poster = soup.selectFirst("a.thumb > img").attr("src")
return AnimeLoadResponse(
title,
null,
title,
url,
this.name,
TvType.Anime,
poster,
year,
null,
episodes,
ShowStatus.Ongoing,
description,
ArrayList(tags),
ArrayList()
)
return newAnimeLoadResponse(title, url, TvType.Anime) {
this.year = year
posterUrl = poster
addEpisodes(DubStatus.Subbed, episodes)
plot = description
this.tags = tags
}
}
override fun loadLinks(

View file

@ -268,24 +268,19 @@ class TenshiProvider : MainAPI() {
val synonyms =
document.select("li.synonym.meta-data > div.info-box > span.value").map { it?.text()?.trim().toString() }
return AnimeLoadResponse(
englishTitle,
japaneseTitle,
canonicalTitle,
url,
this.name,
getType(type ?: ""),
poster,
year.toIntOrNull(),
null,
episodes,
status,
synopsis,
ArrayList(genre),
ArrayList(synonyms),
null,
null,
)
return newAnimeLoadResponse(canonicalTitle,url,getType(type ?: "")) {
engName = englishTitle
japName = japaneseTitle
posterUrl = poster
this.year = year.toIntOrNull()
addEpisodes(DubStatus.Subbed,episodes)
showStatus = status
tags = genre
this.synonyms = synonyms
plot = synopsis
}
}

View file

@ -208,22 +208,16 @@ class WcoProvider : MainAPI() {
val genre = document.select("div.elements div.row > div:nth-child(1) > div.row-line:nth-child(5) > a")
.map { it?.text()?.trim().toString() }
return AnimeLoadResponse(
canonicalTitle,
japaneseTitle,
canonicalTitle,
url,
this.name,
getType(type ?: ""),
poster,
year,
if (isDubbed) episodes else null,
if (!isDubbed) episodes else null,
status,
synopsis,
ArrayList(genre),
ArrayList(),
)
return newAnimeLoadResponse(canonicalTitle,url,getType(type ?: "")) {
japName = japaneseTitle
engName = canonicalTitle
posterUrl = poster
this.year = year
addEpisodes(if(isDubbed) DubStatus.Dubbed else DubStatus.Subbed,episodes)
showStatus = status
plot = synopsis
tags = genre
}
}
override fun loadLinks(

View file

@ -230,21 +230,17 @@ class ZoroProvider : MainAPI() {
it.selectFirst(".ssli-order")?.text()?.toIntOrNull()
)
}
return AnimeLoadResponse(
title,
japaneseTitle,
title,
url,
this.name,
TvType.Anime,
poster,
year,
null,
episodes,
status,
description,
tags,
)
return newAnimeLoadResponse(title, url, TvType.Anime) {
japName = japaneseTitle
engName = title
posterUrl = poster
this.year = year
addEpisodes(DubStatus.Subbed, episodes)
showStatus = status
plot = description
this.tags = tags
}
}
private fun getM3u8FromRapidCloud(url: String): String {

View file

@ -36,11 +36,13 @@ object DownloadButtonSetup {
builder.setTitle(R.string.delete_file)
.setMessage(
ctx.getString(R.string.delete_message).format(ctx.getNameFull(
click.data.name,
click.data.episode,
click.data.season
))
ctx.getString(R.string.delete_message).format(
ctx.getNameFull(
click.data.name,
click.data.episode,
click.data.season
)
)
)
.setPositiveButton(R.string.delete, dialogClickListener)
.setNegativeButton(R.string.cancel, dialogClickListener)
@ -54,13 +56,19 @@ object DownloadButtonSetup {
}
DOWNLOAD_ACTION_RESUME_DOWNLOAD -> {
activity?.let { ctx ->
val pkg = VideoDownloadManager.getDownloadResumePackage(ctx, id)
if (pkg != null) {
VideoDownloadManager.downloadFromResumeUsingWorker(ctx, pkg)
} else {
if (VideoDownloadManager.downloadStatus.containsKey(id) && VideoDownloadManager.downloadStatus[id] == VideoDownloadManager.DownloadType.IsPaused) {
VideoDownloadManager.downloadEvent.invoke(
Pair(click.data.id, VideoDownloadManager.DownloadActionType.Resume)
)
} else {
val pkg = VideoDownloadManager.getDownloadResumePackage(ctx, id)
if (pkg != null) {
VideoDownloadManager.downloadFromResumeUsingWorker(ctx, pkg)
} else {
VideoDownloadManager.downloadEvent.invoke(
Pair(click.data.id, VideoDownloadManager.DownloadActionType.Resume)
)
}
}
}
}
@ -69,7 +77,7 @@ object DownloadButtonSetup {
val length =
VideoDownloadManager.getDownloadFileInfoAndUpdateSettings(act, click.data.id)?.fileLength
?: 0
if(length > 0) {
if (length > 0) {
MainActivity.showToast(act, R.string.delete, Toast.LENGTH_LONG)
} else {
MainActivity.showToast(act, R.string.download, Toast.LENGTH_LONG)
@ -86,19 +94,21 @@ object DownloadButtonSetup {
click.data.id.toString()
) ?: return
act.navigate(R.id.global_to_navigation_player, PlayerFragment.newInstance(
UriData(
info.path.toString(),
keyInfo.relativePath,
keyInfo.displayName,
click.data.parentId,
click.data.id,
headerName ?: "null",
if (click.data.episode <= 0) null else click.data.episode,
click.data.season
),
act.getViewPos(click.data.id)?.position ?: 0
))
act.navigate(
R.id.global_to_navigation_player, PlayerFragment.newInstance(
UriData(
info.path.toString(),
keyInfo.relativePath,
keyInfo.displayName,
click.data.parentId,
click.data.id,
headerName ?: "null",
if (click.data.episode <= 0) null else click.data.episode,
click.data.season
),
act.getViewPos(click.data.id)?.position ?: 0
)
)
}
}
}

View file

@ -5,6 +5,7 @@ import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.LinearLayout
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.isVisible
import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModelProvider
@ -15,8 +16,9 @@ import com.lagradost.cloudstream3.R
import com.lagradost.cloudstream3.isMovieType
import com.lagradost.cloudstream3.mvvm.observe
import com.lagradost.cloudstream3.ui.download.DownloadButtonSetup.handleDownloadClick
import com.lagradost.cloudstream3.utils.AppUtils.loadResult
import com.lagradost.cloudstream3.utils.DOWNLOAD_EPISODE_CACHE
import com.lagradost.cloudstream3.utils.DataStore.getFolderName
import com.lagradost.cloudstream3.utils.DataStore
import com.lagradost.cloudstream3.utils.UIHelper.fixPaddingStatusbar
import com.lagradost.cloudstream3.utils.UIHelper.hideKeyboard
import com.lagradost.cloudstream3.utils.VideoDownloadHelper
@ -99,13 +101,24 @@ class DownloadFragment : Fragment() {
DownloadHeaderAdapter(
ArrayList(),
{ click ->
if (click.data.type.isMovieType()) {
//wont be called
} else {
val folder = getFolderName(DOWNLOAD_EPISODE_CACHE, click.data.id.toString())
val navController = activity?.findNavController(R.id.nav_host_fragment)
navController?.navigate(R.id.navigation_download_child, DownloadChildFragment.newInstance(click.data.name,folder))
when (click.action) {
0 -> {
if (click.data.type.isMovieType()) {
//wont be called
} else {
val folder = DataStore.getFolderName(DOWNLOAD_EPISODE_CACHE, click.data.id.toString())
val navController = activity?.findNavController(R.id.nav_host_fragment)
navController?.navigate(
R.id.navigation_download_child,
DownloadChildFragment.newInstance(click.data.name, folder)
)
}
}
1 -> {
(activity as AppCompatActivity?)?.loadResult(click.data.url, click.data.apiName)
}
}
},
{ downloadClickEvent ->
if (downloadClickEvent.data !is VideoDownloadHelper.DownloadEpisodeCached) return@DownloadHeaderAdapter

View file

@ -105,6 +105,9 @@ class DownloadHeaderAdapter(
val d = card.data
poster?.setImage(d.poster)
poster?.setOnClickListener {
clickCallback.invoke(DownloadHeaderClickEvent(1, d))
}
title.text = d.name
val mbString = "%.1f".format(card.totalBytes / 1000000f)

View file

@ -14,6 +14,7 @@ import android.widget.TextView
import androidx.core.view.isVisible
import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModelProvider
import androidx.preference.PreferenceManager
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.LinearSnapHelper
@ -166,11 +167,24 @@ class HomeFragment : Fragment() {
}
private val apiChangeClickListener = View.OnClickListener { view ->
val validAPIs = apis.filter { api -> api.hasMainPage }.toMutableList()
val allApis = apis.filter { api -> api.hasMainPage }.toMutableList()
var validAPIs = allApis
val settingsManager = PreferenceManager.getDefaultSharedPreferences(context)
val currentPrefMedia = settingsManager.getInt(getString(R.string.preferred_media_settings), 0)
// Filter API depending on preferred media type
if (currentPrefMedia > 0) {
val listEnumAnime = listOf(TvType.Anime, TvType.AnimeMovie, TvType.ONA)
val listEnumMovieTv = listOf(TvType.Movie, TvType.TvSeries, TvType.Cartoon)
val mediaTypeList = if (currentPrefMedia==1) listEnumMovieTv else listEnumAnime
validAPIs = allApis.filter { api -> api.supportedTypes.any { it in mediaTypeList } }.toMutableList()
}
validAPIs.add(0, randomApi)
validAPIs.add(0, noneApi)
view.popupMenuNoIconsAndNoStringRes(validAPIs.mapIndexed { index, api -> Pair(index, api.name) }) {
homeViewModel.loadAndCancel(validAPIs[itemId].name)
homeViewModel.loadAndCancel(validAPIs[itemId].name, currentPrefMedia)
}
}
@ -411,7 +425,7 @@ class HomeFragment : Fragment() {
val apiName = context?.getKey<String>(HOMEPAGE_API)
if (homeViewModel.apiName.value != apiName || apiName == null) {
//println("Caught home: " + homeViewModel.apiName.value + " at " + apiName)
homeViewModel.loadAndCancel(apiName)
homeViewModel.loadAndCancel(apiName, 0)
}
}
}

View file

@ -10,6 +10,7 @@ import com.lagradost.cloudstream3.APIHolder.getApiFromNameNull
import com.lagradost.cloudstream3.HomePageResponse
import com.lagradost.cloudstream3.MainAPI
import com.lagradost.cloudstream3.SearchResponse
import com.lagradost.cloudstream3.TvType
import com.lagradost.cloudstream3.mvvm.Resource
import com.lagradost.cloudstream3.ui.APIRepository
import com.lagradost.cloudstream3.ui.APIRepository.Companion.noneApi
@ -148,12 +149,21 @@ class HomeViewModel : ViewModel() {
}
}
fun loadAndCancel(preferredApiName: String?) = viewModelScope.launch {
fun loadAndCancel(preferredApiName: String?, currentPrefMedia: Int) = viewModelScope.launch {
val api = getApiFromNameNull(preferredApiName)
if (preferredApiName == noneApi.name)
loadAndCancel(noneApi)
else if(preferredApiName == randomApi.name || api == null) {
loadAndCancel(apis.filter { it.hasMainPage }.random())
val allApis = apis.filter { api -> api.hasMainPage }.toMutableList()
var validAPIs = allApis
if (currentPrefMedia > 0) {
val listEnumAnime = listOf(TvType.Anime, TvType.AnimeMovie, TvType.ONA)
val listEnumMovieTv = listOf(TvType.Movie, TvType.TvSeries, TvType.Cartoon)
val mediaTypeList = if (currentPrefMedia==1) listEnumMovieTv else listEnumAnime
validAPIs = allApis.filter { api -> api.supportedTypes.any { it in mediaTypeList } }.toMutableList()
}
loadAndCancel(validAPIs.random())
} else {
loadAndCancel(api)
}

View file

@ -32,7 +32,6 @@ import android.view.animation.AnimationUtils
import android.widget.*
import android.widget.Toast.LENGTH_SHORT
import androidx.appcompat.app.AlertDialog
import androidx.core.content.ContextCompat
import androidx.core.view.isVisible
import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModelProvider
@ -89,6 +88,7 @@ import com.lagradost.cloudstream3.utils.DataStore.setKey
import com.lagradost.cloudstream3.utils.DataStoreHelper.setLastWatched
import com.lagradost.cloudstream3.utils.DataStoreHelper.setViewPos
import com.lagradost.cloudstream3.utils.SingleSelectionHelper.showDialog
import com.lagradost.cloudstream3.utils.UIHelper.colorFromAttribute
import com.lagradost.cloudstream3.utils.UIHelper.getNavigationBarHeight
import com.lagradost.cloudstream3.utils.UIHelper.getStatusBarHeight
import com.lagradost.cloudstream3.utils.UIHelper.hideKeyboard
@ -829,7 +829,7 @@ class PlayerFragment : Fragment() {
}
isLocked = !isLocked
if(isLocked && isShowing) {
if (isLocked && isShowing) {
player_pause_holder?.postDelayed({
if (isLocked && isShowing) {
onClickChange()
@ -869,11 +869,13 @@ class PlayerFragment : Fragment() {
private fun updateLock() {
video_locked_img?.setImageResource(if (isLocked) R.drawable.video_locked else R.drawable.video_unlocked)
val color = if (isLocked) ContextCompat.getColor(requireContext(), R.color.videoColorPrimary)
val color = if (isLocked) context?.colorFromAttribute(R.attr.colorPrimary)
else Color.WHITE
video_locked_text?.setTextColor(color)
video_locked_img?.setColorFilter(color)
if (color != null) {
video_locked_text?.setTextColor(color)
video_locked_img?.setColorFilter(color)
}
val isClick = !isLocked
@ -996,7 +998,7 @@ class PlayerFragment : Fragment() {
activity?.unregisterReceiver(it)
}
activity?.hideSystemUI()
this.view?.let { activity?.hideKeyboard(it) }
this.view?.let { hideKeyboard(it) }
}
}
@ -1938,6 +1940,9 @@ class PlayerFragment : Fragment() {
) + currentUrl.headers // Adds the headers from the provider, e.g Authorization
setDefaultRequestProperties(headers)
}
//https://stackoverflow.com/questions/69040127/error-code-io-bad-http-status-exoplayer-android
setAllowCrossProtocolRedirects(true)
}
} else {
DefaultDataSourceFactory(requireContext(), USER_AGENT)

View file

@ -18,7 +18,6 @@ import android.view.ViewGroup
import android.widget.Toast
import androidx.appcompat.app.AlertDialog
import androidx.coordinatorlayout.widget.CoordinatorLayout
import androidx.core.content.ContextCompat
import androidx.core.content.FileProvider
import androidx.core.text.color
import androidx.core.view.isVisible
@ -196,7 +195,7 @@ class ResultFragment : Fragment() {
super.onDestroy()
activity?.let {
it.window?.navigationBarColor =
it.colorFromAttribute(R.attr.darkBackground)
it.colorFromAttribute(R.attr.primaryGrayBackground)
}
}
@ -236,7 +235,7 @@ class ResultFragment : Fragment() {
private var currentId: Int? = null
private var currentIsMovie: Boolean? = null
private var episodeRanges: List<String>? = null
private var dubRange: Set<DubStatus>? = null
var url: String? = null
private fun fromIndexToSeasonText(selection: Int?): String {
@ -682,7 +681,6 @@ class ResultFragment : Fragment() {
}
outputFile.writeText(text)
val vlcIntent = Intent(VLC_INTENT_ACTION_RESULT)
vlcIntent.setPackage(VLC_PACKAGE)
@ -859,6 +857,25 @@ class ResultFragment : Fragment() {
}
}
observe(viewModel.dubStatus) { status ->
result_dub_select?.text = status.toString()
}
observe(viewModel.dubSubSelections) { range ->
dubRange = range
result_dub_select?.visibility = if (range.size <= 1) GONE else VISIBLE
}
result_dub_select.setOnClickListener {
val ranges = dubRange
if (ranges != null) {
it.popupMenuNoIconsAndNoStringRes(ranges.map { status -> Pair(status.ordinal, status.toString()) }
.toList()) {
viewModel.changeDubStatus(requireContext(), DubStatus.values()[itemId])
}
}
}
observe(viewModel.selectedRange) { range ->
result_episode_select?.text = range
}
@ -959,20 +976,25 @@ class ResultFragment : Fragment() {
metadataInfoArray.add(Pair(R.string.site, d.apiName))
if (metadataInfoArray.size > 0) {
result_metadata.visibility = VISIBLE
val text = SpannableStringBuilder()
val grayColor = ContextCompat.getColor(requireContext(), R.color.grayTextColor)
val textColor = ContextCompat.getColor(requireContext(), R.color.textColor)
for (meta in metadataInfoArray) {
text.color(grayColor) { append(getString(meta.first) + ": ") }
.color(textColor) { append("${meta.second}\n") }
context?.let { ctx ->
if (metadataInfoArray.size > 0) {
result_metadata.visibility = VISIBLE
val text = SpannableStringBuilder()
val grayColor =
ctx.colorFromAttribute(R.attr.grayTextColor) //ContextCompat.getColor(requireContext(), R.color.grayTextColor)
val textColor =
ctx.colorFromAttribute(R.attr.textColor) //ContextCompat.getColor(requireContext(), R.color.textColor)
for (meta in metadataInfoArray) {
text.color(grayColor) { append(getString(meta.first) + ": ") }
.color(textColor) { append("${meta.second}\n") }
}
result_metadata.text = text
} else {
result_metadata.visibility = GONE
}
result_metadata.text = text
} else {
result_metadata.visibility = GONE
}
result_poster?.setImage(d.posterUrl)
result_poster_holder?.visibility = if (d.posterUrl.isNullOrBlank()) GONE else VISIBLE

View file

@ -55,13 +55,20 @@ class ResultViewModel : ViewModel() {
val publicEpisodes: LiveData<Resource<List<ResultEpisode>>> get() = _publicEpisodes
val publicEpisodesCount: LiveData<Int> get() = _publicEpisodesCount
private val dubStatus: MutableLiveData<DubStatus> = MutableLiveData()
val dubStatus: MutableLiveData<DubStatus> get() = _dubStatus
private val _dubStatus: MutableLiveData<DubStatus> = MutableLiveData()
private val page: MutableLiveData<LoadResponse> = MutableLiveData()
val id: MutableLiveData<Int> = MutableLiveData()
val selectedSeason: MutableLiveData<Int> = MutableLiveData(-2)
val seasonSelections: MutableLiveData<List<Int?>> = MutableLiveData()
val dubSubSelections: MutableLiveData<Set<DubStatus>> get() = _dubSubSelections
private val _dubSubSelections: MutableLiveData<Set<DubStatus>> = MutableLiveData()
val dubSubEpisodes: MutableLiveData<Map<DubStatus, List<ResultEpisode>>?> get() = _dubSubEpisodes
private val _dubSubEpisodes: MutableLiveData<Map<DubStatus, List<ResultEpisode>>?> = MutableLiveData()
private val _watchStatus: MutableLiveData<WatchType> = MutableLiveData()
val watchStatus: LiveData<WatchType> get() = _watchStatus
@ -110,7 +117,7 @@ class ResultViewModel : ViewModel() {
val seasons = seasonTypes.toList().map { it.first }.sortedBy { it }
seasonSelections.postValue(seasons)
if (seasons.isEmpty()) { // WHAT THE FUCK DID YOU DO????? HOW DID YOU DO THIS
_publicEpisodes.postValue(Resource.Success( ArrayList()))
_publicEpisodes.postValue(Resource.Success(ArrayList()))
return
}
@ -160,7 +167,7 @@ class ResultViewModel : ViewModel() {
selectedRange.postValue(allRange)
}
_publicEpisodes.postValue(Resource.Success( currentList))
_publicEpisodes.postValue(Resource.Success(currentList))
}
fun changeSeason(context: Context, selection: Int?) {
@ -171,6 +178,13 @@ class ResultViewModel : ViewModel() {
filterEpisodes(context, _episodes.value, null, range)
}
fun changeDubStatus(context: Context, status: DubStatus?) {
dubSubEpisodes.value?.get(status)?.let { episodes ->
dubStatus.postValue(status)
updateEpisodes(context, null, episodes, null)
}
}
private fun updateEpisodes(context: Context, localId: Int?, list: List<ResultEpisode>, selection: Int?) {
_episodes.postValue(list)
val set = HashMap<Int, Int>()
@ -237,7 +251,7 @@ class ResultViewModel : ViewModel() {
return name
}
fun load(context: Context, url: String, apiName: String, showFillers : Boolean) = viewModelScope.launch {
fun load(context: Context, url: String, apiName: String, showFillers: Boolean) = viewModelScope.launch {
_resultResponse.postValue(Resource.Loading(url))
_publicEpisodes.postValue(Resource.Loading())
@ -273,16 +287,21 @@ class ResultViewModel : ViewModel() {
when (d) {
is AnimeLoadResponse -> {
val isDub = d.dubEpisodes != null && d.dubEpisodes.isNotEmpty()
dubStatus.postValue(if (isDub) DubStatus.Dubbed else DubStatus.Subbed)
//TODO context.getKey<>() isdub
val dataList = (if (isDub) d.dubEpisodes else d.subEpisodes)
val isDub =
d.episodes.containsKey(DubStatus.Dubbed) && !d.episodes[DubStatus.Dubbed].isNullOrEmpty()
val dubStatus = if (isDub) DubStatus.Dubbed else DubStatus.Subbed
_dubStatus.postValue(dubStatus)
val fillerEpisodes = if(showFillers) safeApiCall { getFillerEpisodes(d.name) } else null
_dubSubSelections.postValue(d.episodes.keys)
val fillerEpisodes = if (showFillers) safeApiCall { getFillerEpisodes(d.name) } else null
if (dataList != null) { // TODO dub and sub at the same time
var idIndex = 0
val res = d.episodes.map { ep ->
val episodes = ArrayList<ResultEpisode>()
for ((index, i) in dataList.withIndex()) {
for ((index, i) in ep.value.withIndex()) {
val episode = i.episode ?: (index + 1)
episodes.add(
context.buildResultEpisode(
@ -292,17 +311,23 @@ class ResultViewModel : ViewModel() {
null, // TODO FIX SEASON
i.url,
apiName,
(mainId + index + 1),
mainId + index + 1 + idIndex * 100000,
index,
i.rating,
i.descript,
i.description,
if (fillerEpisodes is Resource.Success) fillerEpisodes.value?.let {
it.contains(episode) && it[episode] == true
}
?: false else false,
} ?: false else false,
)
)
}
idIndex++
Pair(ep.key, episodes)
}.toMap()
_dubSubEpisodes.postValue(res)
res[dubStatus]?.let { episodes ->
updateEpisodes(context, mainId, episodes, -1)
}
}
@ -366,11 +391,10 @@ class ResultViewModel : ViewModel() {
), -1
)
}
}
}
else -> {
// nothing
}
}
}

View file

@ -35,9 +35,11 @@ import com.lagradost.cloudstream3.utils.SEARCH_PROVIDER_TOGGLE
import com.lagradost.cloudstream3.utils.UIHelper.fixPaddingStatusbar
import com.lagradost.cloudstream3.utils.UIHelper.getGridIsCompact
import com.lagradost.cloudstream3.utils.UIHelper.hideKeyboard
import com.lagradost.cloudstream3.utils.UIHelper.showInputMethod
import kotlinx.android.synthetic.main.fragment_search.*
import java.util.concurrent.locks.ReentrantLock
class SearchFragment : Fragment() {
companion object {
fun List<SearchResponse>.filterSearchResponse(): List<SearchResponse> {
@ -298,6 +300,10 @@ class SearchFragment : Fragment() {
main_search.setOnQueryTextListener(object : SearchView.OnQueryTextListener {
override fun onQueryTextSubmit(query: String): Boolean {
searchViewModel.searchAndCancel(query)
main_search?.let {
hideKeyboard(it)
}
return true
}
@ -360,18 +366,13 @@ class SearchFragment : Fragment() {
typesActive = it.getApiTypeSettings()
}
/*main_search.setOnQueryTextFocusChangeListener { searchView, b ->
main_search.setOnQueryTextFocusChangeListener { searchView, b ->
if (b) {
// https://stackoverflow.com/questions/12022715/unable-to-show-keyboard-automatically-in-the-searchview
searchView?.postDelayed({
(activity?.getSystemService(Context.INPUT_METHOD_SERVICE) as? InputMethodManager?)?.showSoftInput(
view.findFocus(),
0
)
}, 200)
showInputMethod(view.findFocus())
}
}
main_search.onActionViewExpanded()*/
//main_search.onActionViewExpanded()*/
val masterAdapter: RecyclerView.Adapter<RecyclerView.ViewHolder> = ParentItemAdapter(listOf(), { callback ->
SearchHelper.handleSearchClickCallback(activity, callback)

View file

@ -1,7 +1,11 @@
package com.lagradost.cloudstream3.ui.settings
import android.content.Intent
import android.net.Uri
import android.app.UiModeManager
import android.content.Context
import android.content.res.Configuration
import android.os.Bundle
import android.os.Environment
import android.widget.Toast
@ -40,6 +44,22 @@ import kotlin.concurrent.thread
class SettingsFragment : PreferenceFragmentCompat() {
companion object {
fun Context.isTvSettings(): Boolean {
val settingsManager = PreferenceManager.getDefaultSharedPreferences(this)
var value = settingsManager.getInt(this.getString(R.string.app_layout_key), -1)
if (value == -1) {
value = if (isAutoTv()) 1 else 0
}
return value == 1
}
private fun Context.isAutoTv(): Boolean {
val uiModeManager = getSystemService(Context.UI_MODE_SERVICE) as UiModeManager?
return uiModeManager?.currentModeType == Configuration.UI_MODE_TYPE_TELEVISION
}
}
private var beneneCount = 0
// Open file picker
@ -83,6 +103,7 @@ class SettingsFragment : PreferenceFragmentCompat() {
Triple("\uD83C\uDDF3\uD83C\uDDF4", "Norsk", "no"),
Triple("\ud83c\udde9\ud83c\uddea", "German", "de"),
Triple("🇱🇧", "Arabic", "ar"),
Triple("🇹🇷", "Turkish", "tr")
).sortedBy { it.second } //ye, we go alphabetical, so ppl don't put their lang on top
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
@ -97,6 +118,10 @@ class SettingsFragment : PreferenceFragmentCompat() {
val subdubPreference = findPreference<Preference>(getString(R.string.display_sub_key))!!
val providerLangPreference = findPreference<Preference>(getString(R.string.provider_lang_key))!!
val downloadPathPreference = findPreference<Preference>(getString(R.string.download_path_key))!!
val allLayoutPreference = findPreference<Preference>(getString(R.string.app_layout_key))!!
val colorPrimaryPreference = findPreference<Preference>(getString(R.string.primary_color_key))!!
val preferedMediaTypePreference = findPreference<Preference>(getString(R.string.prefer_media_type_key))!!
val appThemePreference = findPreference<Preference>(getString(R.string.app_theme_key))!!
legalPreference.setOnPreferenceClickListener {
val builder: AlertDialog.Builder = AlertDialog.Builder(it.context)
@ -177,6 +202,7 @@ class SettingsFragment : PreferenceFragmentCompat() {
return@setOnPreferenceClickListener true
}
fun getDownloadDirs(): List<String> {
val defaultDir = getDownloadDir()?.filePath
@ -214,6 +240,93 @@ class SettingsFragment : PreferenceFragmentCompat() {
// pref = visual path
settingsManager.edit().putString(getString(R.string.download_path_key), dirs[it]).apply()
settingsManager.edit().putString(getString(R.string.download_path_pref), dirs[it]).apply()
if (preferedMediaTypePreference != null) {
preferedMediaTypePreference.setOnPreferenceClickListener {
val prefNames = resources.getStringArray(R.array.media_type_pref)
val prefValues = resources.getIntArray(R.array.media_type_pref_values)
val settingsManager = PreferenceManager.getDefaultSharedPreferences(context)
val currentPrefMedia =
settingsManager.getInt(getString(R.string.preferred_media_settings), 0)
context?.showBottomDialog(
prefNames.toList(),
prefValues.indexOf(currentPrefMedia),
getString(R.string.preferred_media_settings),
true,
{}) {
settingsManager.edit()
.putInt(getString(R.string.preferred_media_settings), prefValues[it])
.apply()
context?.initRequestClient()
}
return@setOnPreferenceClickListener true
}
}
allLayoutPreference.setOnPreferenceClickListener {
val prefNames = resources.getStringArray(R.array.app_layout)
val prefValues = resources.getIntArray(R.array.app_layout_values)
val settingsManager = PreferenceManager.getDefaultSharedPreferences(context)
val currentLayout =
settingsManager.getInt(getString(R.string.app_layout_key), -1)
context?.showBottomDialog(
prefNames.toList(),
prefValues.indexOf(currentLayout),
getString(R.string.app_layout),
true,
{}) {
try {
settingsManager.edit().putInt(getString(R.string.app_layout_key), prefValues[it]).apply()
activity?.recreate()
} catch (e : Exception) {
logError(e)
}
}
return@setOnPreferenceClickListener true
}
colorPrimaryPreference.setOnPreferenceClickListener {
val prefNames = resources.getStringArray(R.array.themes_overlay_names)
val prefValues = resources.getStringArray(R.array.themes_overlay_names_values)
val settingsManager = PreferenceManager.getDefaultSharedPreferences(context)
val currentLayout = settingsManager.getString( getString(R.string.primary_color_key),prefValues.first())
context?.showBottomDialog(
prefNames.toList(),
prefValues.indexOf(currentLayout),
getString(R.string.primary_color_settings),
true,
{}) {
try {
settingsManager.edit().putString(getString(R.string.primary_color_key), prefValues[it]).apply()
activity?.recreate()
} catch (e : Exception) {
logError(e)
}
}
return@setOnPreferenceClickListener true
}
appThemePreference.setOnPreferenceClickListener {
val prefNames = resources.getStringArray(R.array.themes_names)
val prefValues = resources.getStringArray(R.array.themes_names_values)
val settingsManager = PreferenceManager.getDefaultSharedPreferences(context)
val currentLayout = settingsManager.getString( getString(R.string.app_theme_key),prefValues.first())
context?.showBottomDialog(
prefNames.toList(),
prefValues.indexOf(currentLayout),
getString(R.string.app_theme_settings),
true,
{}) {
try {
settingsManager.edit().putString(getString(R.string.app_theme_key), prefValues[it]).apply()
activity?.recreate()
} catch (e : Exception) {
logError(e)
}
}
return@setOnPreferenceClickListener true
@ -271,7 +384,7 @@ class SettingsFragment : PreferenceFragmentCompat() {
settingsManager.edit().putInt(getString(R.string.benene_count), beneneCount).apply()
it.summary = getString(R.string.benene_count_text).format(beneneCount)
} catch (e: Exception) {
e.printStackTrace()
logError(e)
}
return@setOnPreferenceClickListener true

View file

@ -36,6 +36,7 @@ import androidx.preference.PreferenceManager
import com.bumptech.glide.load.model.GlideUrl
import com.lagradost.cloudstream3.R
import com.lagradost.cloudstream3.mvvm.logError
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.isTvSettings
import kotlin.math.roundToInt
@ -68,7 +69,7 @@ object UIHelper {
activity?.window?.decorView?.clearFocus()
view.let {
if (it != null) {
activity?.hideKeyboard(it)
hideKeyboard(it)
}
}
}
@ -202,6 +203,10 @@ object UIHelper {
}*/
fun Context.getStatusBarHeight(): Int {
if(isTvSettings()) {
return 0
}
var result = 0
val resourceId = resources.getIdentifier("status_bar_height", "dimen", "android")
if (resourceId > 0) {
@ -285,9 +290,14 @@ object UIHelper {
) == AppOpsManager.MODE_ALLOWED
}
fun Context.hideKeyboard(view: View) {
val inputMethodManager = getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager
inputMethodManager.hideSoftInputFromWindow(view.windowToken, 0)
fun hideKeyboard(view: View) {
val inputMethodManager = view.context.getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager?
inputMethodManager?.hideSoftInputFromWindow(view.windowToken, 0)
}
fun showInputMethod(view: View) {
val inputMethodManager = view.context.getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager?
inputMethodManager?.showSoftInput(view, 0)
}
/**id, stringRes */

View file

@ -353,7 +353,7 @@ object VideoDownloadManager {
val pending: PendingIntent = PendingIntent.getService(
// BECAUSE episodes lying near will have the same id +1, index will give the same requested as the previous episode, *100000 fixes this
context, (4337 + index * 100000 + ep.id),
context, (4337 + index * 1000000 + ep.id),
actionResultIntent,
PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
)

View file

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="?attr/colorPrimary" android:state_checked="true"/>
<item android:color="?attr/grayTextColor" android:state_checked="false"/>
</selector>

View file

@ -0,0 +1,54 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="320dp"
android:height="180dp"
android:viewportWidth="320"
android:viewportHeight="180"
android:name="vector">
<group android:scaleX="0.6666667"
android:scaleY="0.6666667"
android:translateX="53.333332"
android:translateY="30">
<group android:scaleX="0.13764706"
android:scaleY="0.13764706"
android:translateX="15.1"
android:translateY="31.5">
<group android:name="group_6">
<path
android:name="path_2"
android:pathData="M 698.92 450.33 C 697.92 440.99 690.27 432.74 679.92 430.25 L 653.67 430.75 C 655.17 407.75 636.67 386.63 618.79 384 C 611.804 381.871 604.367 381.698 597.29 383.5 C 597.91 379.77 602.74 347.16 578.79 322 C 558.72 300.92 532.54 299.13 517.67 299.31 L 500.37 298.92 C 494.76 293.4 460.65 262.47 412.62 266.67 C 382.23 269.32 354.96 277.67 334.79 302.67 C 333.11 304.74 327.6 311.81 321.17 320.81 C 318.82 323.81 316.91 327.43 314.79 330.5 C 314.63 330.74 288.79 326.44 272.79 331 C 247.52 338.2 224.79 358.54 217.29 385.5 C 215.44 392.18 209.08 415.09 219.79 435 C 222.101 439.202 223.081 444.009 222.6 448.78 C 219.48 450.41 205.02 450.94 182.29 450 C 164.43 449.27 149.83 463.6 149.79 480 C 149.74 497.17 165.23 510.58 184.29 510 C 205.93 510.23 605.96 510.67 637.04 510.56 C 650.12 510.56 656.79 499.17 656.79 499.17 C 661.24 493.35 661.09 486.09 661.04 481.5 L 661.04 477 L 664.79 477 L 675.96 476.33 C 690.35 474.78 700.21 462.36 698.92 450.33 Z M 407.54 456 L 407.54 349.25 L 483.75 402.63 Z"
android:fillColor="#ffffff"
android:strokeWidth="1"/>
</group>
</group>
<group android:scaleX="0.17275657"
android:scaleY="0.17275657"
android:translateX="128"
android:translateY="74.202896">
<group android:translateY="146.25">
<path android:pathData="M88,-5.25Q75.984375,2,57.984375,2Q35.0625,2,21.03125,-13.171875Q7,-28.34375,7,-52.421875Q7,-77.6875,22.390625,-94.34375Q37.796875,-111,62.40625,-111Q77.875,-111,88,-106.75L88,-93.75Q76.328125,-100,62.28125,-100Q43,-100,31.5,-86.890625Q20,-73.78125,20,-53.203125Q20,-33.671875,30.765625,-21.328125Q41.53125,-9,59.625,-9Q75.984375,-9,88,-16.25L88,-5.25Z"
android:fillColor="#FFFFFF"/>
<path android:pathData="M109,0L109,-115L121,-115L121,0L109,0Z"
android:fillColor="#FFFFFF"/>
<path android:pathData="M140,-38.015625Q140,-57.546875,150.71875,-68.765625Q161.4375,-80,179.89062,-80Q197.26562,-80,207.125,-69.15625Q217,-58.328125,217,-39.21875Q217,-20.65625,206.3125,-9.328125Q195.625,2,178.03125,2Q161.01562,2,150.5,-8.90625Q140,-19.8125,140,-38.015625ZM152,-38.5Q152,-24.59375,159.32812,-16.296875Q166.65625,-8,178.89062,-8Q191.34375,-8,198.17188,-16.078125Q205,-24.171875,205,-38.78125Q205,-53.75,198.23438,-61.875Q191.48438,-70,178.89062,-70Q166.59375,-70,159.29688,-61.59375Q152,-53.1875,152,-38.5Z"
android:fillColor="#FFFFFF"/>
<path android:pathData="M299,0L287,0L287,-12.15625L286.71875,-12.15625Q279.0625,2,262.79688,2Q235,2,235,-31.28125L235,-78L247,-78L247,-33.25Q247,-8,265.89062,-8Q275.1875,-8,281.09375,-15Q287,-22,287,-32.953125L287,-78L299,-78L299,0Z"
android:fillColor="#FFFFFF"/>
<path android:pathData="M390,0L378,0L378,-13.359375L377.71875,-13.359375Q369.125,2,351.01562,2Q336.34375,2,327.67188,-8.578125Q319,-19.171875,319,-37.15625Q319,-56.421875,328.71875,-68.203125Q338.4375,-80,354.375,-80Q370.3125,-80,377.71875,-66.875L378,-66.875L378,-115L390,-115L390,0ZM378,-47.015625Q378,-56.65625,371.54688,-63.328125Q365.09375,-70,355.75,-70Q344.17188,-70,337.57812,-61.3125Q331,-52.625,331,-37.796875Q331,-24.25,337.3125,-16.125Q343.625,-8,354.29688,-8Q364.54688,-8,371.26562,-15.625Q378,-23.25,378,-35.09375L378,-47.015625Z"
android:fillColor="#FFFFFF"/>
<path android:pathData="M413,-19.25Q417.5,-14.875,425.96875,-11.9375Q434.4375,-9,441.625,-9Q465,-9,465,-26.265625Q465,-31.09375,462.5625,-34.875Q460.14062,-38.671875,456.01562,-41.4375Q451.89062,-44.21875,439.76562,-50.53125Q422.29688,-59.671875,417.64062,-66.46875Q413,-73.28125,413,-81.859375Q413,-95.125,423.5625,-103.0625Q434.14062,-111,450.125,-111Q466.25,-111,473,-106.75L473,-92.75Q463.65625,-100,448.875,-100Q438.78125,-100,432.39062,-95.53125Q426,-91.0625,426,-82.96875Q426,-77.96875,428.25,-74.28125Q430.51562,-70.59375,434.39062,-67.875Q438.28125,-65.15625,449.53125,-59.46875Q465.35938,-51.53125,471.67188,-43.96875Q478,-36.421875,478,-27.078125Q478,-13.171875,467.9375,-5.578125Q457.875,2,439.76562,2Q434.25,2,425.40625,-0.109375Q416.5625,-2.234375,413,-5.25L413,-19.25Z"
android:fillColor="#FFFFFF"/>
<path android:pathData="M533,-1.25Q528.7656,2,521.8125,2Q502,2,502,-20.78125L502,-68L489,-68L489,-78L502,-78L502,-97.1875L514,-101L514,-78L533,-78L533,-68L514,-68L514,-22.859375Q514,-14.828125,516.5781,-11.40625Q519.15625,-8,525.2031,-8Q529.875,-8,533,-11.25L533,-1.25Z"
android:fillColor="#FFFFFF"/>
<path android:pathData="M590,-66.75Q586.78125,-70,580.71875,-70Q572.5469,-70,567.2656,-61.953125Q562,-53.90625,562,-40.84375L562,0L550,0L550,-78L562,-78L562,-63.46875L562.34375,-63.46875Q565,-71.328125,570.4375,-75.65625Q575.8906,-80,582.4531,-80Q587.4219,-80,590,-78.75L590,-66.75Z"
android:fillColor="#FFFFFF"/>
<path android:pathData="M665,-36L610,-36Q610.3594,-22.453125,617.125,-15.21875Q623.8906,-8,635.6719,-8Q648.8594,-8,660,-17L660,-6Q649.8125,2,633,2Q616.7656,2,607.375,-8.6875Q598,-19.390625,598,-38.78125Q598,-56.625,608.1094,-68.3125Q618.2344,-80,633.4219,-80Q648.34375,-80,656.6719,-70.0625Q665,-60.125,665,-42.390625L665,-36ZM653,-46Q652.9375,-57.375,647.7344,-63.6875Q642.53125,-70,633.1875,-70Q624.6875,-70,618.25,-63.65625Q611.8281,-57.3125,610.1406,-46L653,-46Z"
android:fillColor="#FFFFFF"/>
<path android:pathData="M687,-72Q698.3906,-80,713.0781,-80Q740,-80,740,-51.09375L740,0L728,0L728,-12L727.5781,-12Q719.5156,2,703.75,2Q692.25,2,685.625,-4.140625Q679,-10.296875,679,-20.40625Q679,-41.96875,704.5156,-45.625L727.9375,-49Q727.9375,-70,711.9844,-70Q698.03125,-70,687,-60L687,-72ZM708.8281,-36.46875Q698.8281,-35.140625,694.90625,-31.6875Q691,-28.234375,691,-21.046875Q691,-15.25,695.1875,-11.625Q699.3906,-8,706.15625,-8Q715.53125,-8,721.7344,-14.625Q727.9375,-21.265625,727.9375,-31.1875L727.9375,-39L708.8281,-36.46875Z"
android:fillColor="#FFFFFF"/>
<path android:pathData="M873,0L861,0L861,-44.90625Q861,-58.546875,857.0156,-64.265625Q853.03125,-70,843.84375,-70Q836.15625,-70,830.5781,-62.5Q825,-55.015625,825,-44.6875L825,0L813,0L813,-46.53125Q813,-70,795.0625,-70Q786.8281,-70,781.40625,-62.859375Q776,-55.71875,776,-44.6875L776,0L764,0L764,-78L776,-78L776,-65.859375L776.34375,-65.859375Q784.5,-80,800.3906,-80Q807.9844,-80,814.0625,-75.53125Q820.15625,-71.0625,822.3281,-63.75Q830.8281,-80,847.7656,-80Q873,-80,873,-48.125L873,0Z"
android:fillColor="#FFFFFF"/>
</group>
</group>
</group>
</vector>

View file

@ -1,4 +1,4 @@
<vector android:height="24dp" android:tint="#FFFFFF"
<vector android:height="24dp" android:tint="?attr/white"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M20,8h-2.81c-0.45,-0.78 -1.07,-1.45 -1.82,-1.96L17,4.41 15.59,3l-2.17,2.17C12.96,5.06 12.49,5 12,5c-0.49,0 -0.96,0.06 -1.41,0.17L8.41,3 7,4.41l1.62,1.63C7.88,6.55 7.26,7.22 6.81,8L4,8v2h2.09c-0.05,0.33 -0.09,0.66 -0.09,1v1L4,12v2h2v1c0,0.34 0.04,0.67 0.09,1L4,16v2h2.81c1.04,1.79 2.97,3 5.19,3s4.15,-1.21 5.19,-3L20,18v-2h-2.09c0.05,-0.33 0.09,-0.66 0.09,-1v-1h2v-2h-2v-1c0,-0.34 -0.04,-0.67 -0.09,-1L20,10L20,8zM14,16h-4v-2h4v2zM14,12h-4v-2h4v2z"/>

View file

@ -0,0 +1,5 @@
<vector android:height="24dp" android:tint="?attr/white"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M12,3c-4.97,0 -9,4.03 -9,9s4.03,9 9,9c0.83,0 1.5,-0.67 1.5,-1.5 0,-0.39 -0.15,-0.74 -0.39,-1.01 -0.23,-0.26 -0.38,-0.61 -0.38,-0.99 0,-0.83 0.67,-1.5 1.5,-1.5L16,16c2.76,0 5,-2.24 5,-5 0,-4.42 -4.03,-8 -9,-8zM6.5,12c-0.83,0 -1.5,-0.67 -1.5,-1.5S5.67,9 6.5,9 8,9.67 8,10.5 7.33,12 6.5,12zM9.5,8C8.67,8 8,7.33 8,6.5S8.67,5 9.5,5s1.5,0.67 1.5,1.5S10.33,8 9.5,8zM14.5,8c-0.83,0 -1.5,-0.67 -1.5,-1.5S13.67,5 14.5,5s1.5,0.67 1.5,1.5S15.33,8 14.5,8zM17.5,12c-0.83,0 -1.5,-0.67 -1.5,-1.5S16.67,9 17.5,9s1.5,0.67 1.5,1.5 -0.67,1.5 -1.5,1.5z"/>
</vector>

View file

@ -1,4 +1,4 @@
<vector android:height="24dp" android:tint="#FFFFFF"
<vector android:height="24dp" android:tint="?attr/white"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M7,5h10v2h2L19,3c0,-1.1 -0.9,-1.99 -2,-1.99L7,1c-1.1,0 -2,0.9 -2,2v4h2L7,5zM15.41,16.59L20,12l-4.59,-4.59L14,8.83 17.17,12 14,15.17l1.41,1.42zM10,15.17L6.83,12 10,8.83 8.59,7.41 4,12l4.59,4.59L10,15.17zM17,19L7,19v-2L5,17v4c0,1.1 0.9,2 2,2h10c1.1,0 2,-0.9 2,-2v-4h-2v2z"/>

View file

@ -3,7 +3,7 @@
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="@color/white">
android:tint="?attr/white">
<path
android:fillColor="@android:color/white"
android:pathData="M20,13H4c-0.55,0 -1,0.45 -1,1v6c0,0.55 0.45,1 1,1h16c0.55,0 1,-0.45 1,-1v-6c0,-0.55 -0.45,-1 -1,-1zM7,19c-1.1,0 -2,-0.9 -2,-2s0.9,-2 2,-2 2,0.9 2,2 -0.9,2 -2,2zM20,3H4c-0.55,0 -1,0.45 -1,1v6c0,0.55 0.45,1 1,1h16c0.55,0 1,-0.45 1,-1V4c0,-0.55 -0.45,-1 -1,-1zM7,9c-1.1,0 -2,-0.9 -2,-2s0.9,-2 2,-2 2,0.9 2,2 -0.9,2 -2,2z"/>

View file

@ -1,4 +1,4 @@
<vector android:height="24dp" android:tint="#FFFFFF"
<vector android:height="24dp" android:tint="?attr/white"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M19,3L5,3c-1.11,0 -2,0.9 -2,2v14c0,1.1 0.89,2 2,2h14c1.1,0 2,-0.9 2,-2L21,5c0,-1.1 -0.9,-2 -2,-2zM11,15L9.5,15v-2h-2v2L6,15L6,9h1.5v2.5h2L9.5,9L11,9v6zM13,9h4c0.55,0 1,0.45 1,1v4c0,0.55 -0.45,1 -1,1h-4L13,9zM14.5,13.5h2v-3h-2v3z"/>

View file

@ -1,5 +1,5 @@
<vector android:autoMirrored="true" android:height="24dp"
android:tint="#FFFFFF" android:viewportHeight="24"
android:tint="?attr/white" android:viewportHeight="24"
android:viewportWidth="24" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M8.59,16.59L13.17,12 8.59,7.41 10,6l6,6 -6,6 -1.41,-1.41z"/>
</vector>

View file

@ -1,4 +1,4 @@
<vector android:height="24dp" android:tint="#FFFFFF"
<vector android:height="24dp" android:tint="?attr/white"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M11.99,2C6.47,2 2,6.48 2,12s4.47,10 9.99,10C17.52,22 22,17.52 22,12S17.52,2 11.99,2zM18.92,8h-2.95c-0.32,-1.25 -0.78,-2.45 -1.38,-3.56 1.84,0.63 3.37,1.91 4.33,3.56zM12,4.04c0.83,1.2 1.48,2.53 1.91,3.96h-3.82c0.43,-1.43 1.08,-2.76 1.91,-3.96zM4.26,14C4.1,13.36 4,12.69 4,12s0.1,-1.36 0.26,-2h3.38c-0.08,0.66 -0.14,1.32 -0.14,2 0,0.68 0.06,1.34 0.14,2L4.26,14zM5.08,16h2.95c0.32,1.25 0.78,2.45 1.38,3.56 -1.84,-0.63 -3.37,-1.9 -4.33,-3.56zM8.03,8L5.08,8c0.96,-1.66 2.49,-2.93 4.33,-3.56C8.81,5.55 8.35,6.75 8.03,8zM12,19.96c-0.83,-1.2 -1.48,-2.53 -1.91,-3.96h3.82c-0.43,1.43 -1.08,2.76 -1.91,3.96zM14.34,14L9.66,14c-0.09,-0.66 -0.16,-1.32 -0.16,-2 0,-0.68 0.07,-1.35 0.16,-2h4.68c0.09,0.65 0.16,1.32 0.16,2 0,0.68 -0.07,1.34 -0.16,2zM14.59,19.56c0.6,-1.11 1.06,-2.31 1.38,-3.56h2.95c-0.96,1.65 -2.49,2.93 -4.33,3.56zM16.36,14c0.08,-0.66 0.14,-1.32 0.14,-2 0,-0.68 -0.06,-1.34 -0.14,-2h3.38c0.16,0.64 0.26,1.31 0.26,2s-0.1,1.36 -0.26,2h-3.38z"/>

View file

@ -1,4 +1,4 @@
<vector android:height="24dp" android:tint="#FFFFFF"
<vector android:height="24dp" android:tint="?attr/white"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M7.58,4.08L6.15,2.65C3.75,4.48 2.17,7.3 2.03,10.5h2c0.15,-2.65 1.51,-4.97 3.55,-6.42zM19.97,10.5h2c-0.15,-3.2 -1.73,-6.02 -4.12,-7.85l-1.42,1.43c2.02,1.45 3.39,3.77 3.54,6.42zM18,11c0,-3.07 -1.64,-5.64 -4.5,-6.32L13.5,4c0,-0.83 -0.67,-1.5 -1.5,-1.5s-1.5,0.67 -1.5,1.5v0.68C7.63,5.36 6,7.92 6,11v5l-2,2v1h16v-1l-2,-2v-5zM12,22c0.14,0 0.27,-0.01 0.4,-0.04 0.65,-0.14 1.18,-0.58 1.44,-1.18 0.1,-0.24 0.15,-0.5 0.15,-0.78h-4c0.01,1.1 0.9,2 2.01,2z"/>

View file

@ -1,4 +1,4 @@
<vector android:height="24dp" android:tint="#FFFFFF"
<vector android:height="24dp" android:tint="?attr/white"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M21,3L3,3c-1.11,0 -2,0.89 -2,2v12c0,1.1 0.89,2 2,2h5v2h8v-2h5c1.1,0 1.99,-0.9 1.99,-2L23,5c0,-1.11 -0.9,-2 -2,-2zM21,17L3,17L3,5h18v12zM16,11l-7,4L9,7z"/>

View file

@ -1,4 +1,4 @@
<vector android:height="24dp" android:tint="#FFFFFF"
<vector android:height="24dp" android:tint="?attr/white"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M19,11h-8v6h8v-6zM23,19L23,4.98C23,3.88 22.1,3 21,3L3,3c-1.1,0 -2,0.88 -2,1.98L1,19c0,1.1 0.9,2 2,2h18c1.1,0 2,-0.9 2,-2zM21,19.02L3,19.02L3,4.97h18v14.05z"/>

View file

@ -1,4 +1,4 @@
<vector android:height="24dp" android:tint="#FFFFFF"
<vector android:height="24dp" android:tint="?attr/white"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M6,18l8.5,-6L6,6v12zM16,6v12h2V6h-2z"/>

View file

@ -1,4 +1,4 @@
<vector android:height="24dp" android:tint="#FFFFFF"
<vector android:height="24dp" android:tint="?attr/white"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M17,1.01L7,1c-1.1,0 -2,0.9 -2,2v18c0,1.1 0.9,2 2,2h10c1.1,0 2,-0.9 2,-2L19,3c0,-1.1 -0.9,-1.99 -2,-1.99zM17,19L7,19L7,5h10v14zM16,13h-3L13,8h-2v5L8,13l4,4 4,-4z"/>

View file

@ -1,4 +1,4 @@
<vector android:height="24dp" android:tint="#FFFFFF"
<vector android:height="24dp" android:tint="?attr/white"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M9,11.24V7.5C9,6.12 10.12,5 11.5,5S14,6.12 14,7.5v3.74c1.21,-0.81 2,-2.18 2,-3.74C16,5.01 13.99,3 11.5,3S7,5.01 7,7.5C7,9.06 7.79,10.43 9,11.24zM18.84,15.87l-4.54,-2.26c-0.17,-0.07 -0.35,-0.11 -0.54,-0.11H13v-6C13,6.67 12.33,6 11.5,6S10,6.67 10,7.5v10.74c-3.6,-0.76 -3.54,-0.75 -3.67,-0.75c-0.31,0 -0.59,0.13 -0.79,0.33l-0.79,0.8l4.94,4.94C9.96,23.83 10.34,24 10.75,24h6.79c0.75,0 1.33,-0.55 1.44,-1.28l0.75,-5.27c0.01,-0.07 0.02,-0.14 0.02,-0.2C19.75,16.63 19.37,16.09 18.84,15.87z"/>

View file

@ -0,0 +1,5 @@
<vector android:height="24dp" android:tint="?attr/white"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M21,3L3,3c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h5v2h8v-2h5c1.1,0 1.99,-0.9 1.99,-2L23,5c0,-1.1 -0.9,-2 -2,-2zM21,17L3,17L3,5h18v12z"/>
</vector>

View file

@ -1,4 +1,4 @@
<vector android:height="24dp" android:tint="#FFFFFF"
<vector android:height="24dp" android:tint="?attr/white"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M1,21h22L12,2 1,21zM13,18h-2v-2h2v2zM13,14h-2v-4h2v4z"/>

View file

@ -1,4 +1,4 @@
<vector android:height="24dp" android:tint="#FFFFFF"
<vector android:height="24dp" android:tint="?attr/white"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M20,4L4,4c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2L22,6c0,-1.1 -0.9,-2 -2,-2zM20,18L4,18L4,6h16v12zM6,10h2v2L6,12zM6,14h8v2L6,16zM16,14h2v2h-2zM10,10h8v2h-8z"/>

View file

@ -1,4 +1,4 @@
<vector android:height="24dp" android:tint="#FFFFFF"
<vector android:height="24dp" android:tint="?attr/white"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M16.76,5.36l-1.68,1.69c0.8,1.13 0.83,2.58 0.09,3.74l1.7,1.7c1.9,-2.02 1.87,-4.98 -0.11,-7.13zM20.07,2l-1.63,1.63c2.72,2.97 2.76,7.39 0.14,10.56l1.64,1.64c3.74,-3.89 3.71,-9.84 -0.15,-13.83zM9.43,5.04l3.53,3.53c-0.2,-1.86 -1.67,-3.33 -3.53,-3.53zM4.41,2.86L3,4.27l2.62,2.62C5.23,7.5 5,8.22 5,9c0,2.21 1.79,4 4,4 0.78,0 1.5,-0.23 2.11,-0.62l4.4,4.4C13.74,15.6 10.78,15 9,15c-2.67,0 -8,1.34 -8,4v2h16v-2c0,-0.37 -0.11,-0.7 -0.29,-1.02L19.73,21l1.41,-1.41L4.41,2.86zM3,19c0.22,-0.72 3.31,-2 6,-2 2.7,0 5.8,1.29 6,2L3,19zM9,11c-1.1,0 -2,-0.9 -2,-2 0,-0.22 0.04,-0.42 0.11,-0.62l2.51,2.51c-0.2,0.07 -0.4,0.11 -0.62,0.11z"/>

View file

@ -14,7 +14,7 @@
<item android:id="@android:id/mask">
<shape android:shape="rectangle">
<corners android:radius="2dp" />
<solid android:color="@color/iconGrayBackground" />
<solid android:color="?attr/iconGrayBackground" />
</shape>
</item>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="@color/colorPrimary"/>
<solid android:color="?attr/colorPrimary"/>
<corners android:topLeftRadius="5dp" android:topRightRadius="5dp"/>
</shape>

View file

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
android:color="@color/video_ripple">
<item android:id="@android:id/mask">
<color android:color="@color/video_ripple"/>
</item>
</ripple>

View file

@ -6,7 +6,7 @@
android:id="@+id/homeRoot"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:configChanges="orientation|screenSize|screenLayout|keyboardHidden"
android:configChanges="orientation|screenSize|screenLayout|keyboardHidden|keyboard|navigation"
android:paddingTop="0dp">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_height="match_parent"
@ -15,9 +15,11 @@
android:id="@+id/nav_view"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:background="?attr/darkBackground"
android:background="?attr/primaryGrayBackground"
app:labelVisibilityMode="labeled"
app:itemTextColor="@color/item_select_color"
app:itemIconTint="@color/item_select_color"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
@ -41,7 +43,7 @@
>
<!--com.google.android.gms.cast.framework.media.widget.MiniControllerFragment-->
<fragment
app:customCastBackgroundColor="?attr/darkBackground"
app:customCastBackgroundColor="?attr/primaryGrayBackground"
app:castControlButtons="@array/cast_mini_controller_control_buttons"
android:id="@+id/cast_mini_controller"
android:layout_width="match_parent"

View file

@ -0,0 +1,62 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/homeRoot"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:configChanges="orientation|screenSize|screenLayout|keyboardHidden|keyboard|navigation"
android:paddingTop="0dp">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_height="match_parent"
android:layout_width="match_parent">
<com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@+id/nav_view"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:background="?attr/primaryGrayBackground"
app:itemTextColor="@color/item_select_color"
app:itemIconTint="@color/item_select_color"
android:outlineSpotShadowColor="@color/transparent"
android:outlineAmbientShadowColor="@color/transparent"
app:layout_constraintTop_toTopOf="parent"
app:labelVisibilityMode="labeled"
app:layout_constraintBottom_toTopOf="@+id/nav_host_fragment"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:menu="@menu/bottom_nav_menu"
/>
<fragment
android:id="@+id/nav_host_fragment"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
android:layout_height="0dp"
app:defaultNavHost="true"
app:layout_constraintTop_toBottomOf="@+id/nav_view"
app:layout_constraintBottom_toBottomOf="parent"
app:navGraph="@navigation/mobile_navigation"
app:layout_constraintEnd_toEndOf="parent"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintBottom_toTopOf="@+id/nav_view"
android:id="@+id/cast_mini_controller_holder"
>
<!--com.google.android.gms.cast.framework.media.widget.MiniControllerFragment-->
<fragment
app:customCastBackgroundColor="?attr/primaryGrayBackground"
app:castControlButtons="@array/cast_mini_controller_control_buttons"
android:id="@+id/cast_mini_controller"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="gone"
class="com.lagradost.cloudstream3.ui.MyMiniControllerFragment"
tools:ignore="FragmentTagUsage">
</fragment>
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
</FrameLayout>

View file

@ -1,18 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:orientation="vertical" xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<!--
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content"
android:text="Loading..." android:textColor="?attr/textColor" android:textSize="20sp"
android:textStyle="bold" android:layout_margin="10dp"/>-->
android:layout_height="match_parent">
<!--
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content"
android:text="Loading..." android:textColor="?attr/textColor" android:textSize="20sp"
android:textStyle="bold" android:layout_margin="10dp"/>-->
<!-- style="@android:style/Widget.Material.ProgressBar.Horizontal"
-->
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content"
android:text="@string/loading_chromecast" android:layout_gravity="center" android:textColor="?attr/textColor" android:textSize="20sp"
android:textStyle="bold" android:layout_margin="10dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/loading_chromecast"
android:layout_gravity="center"
android:textColor="@color/textColor"
android:textSize="20sp"
android:textStyle="bold"
android:layout_margin="10dp"/>
<ProgressBar
android:layout_margin="20dp"
android:layout_gravity="center"

View file

@ -60,7 +60,7 @@
android:marqueeRepeatLimit="marquee_forever"
android:singleLine="true"
android:textColor="@color/textColor"
android:textColor="?attr/textColor"
android:layout_width="match_parent"
android:layout_height="match_parent">
</TextView>
@ -71,7 +71,7 @@
android:layout_gravity="center_vertical"
android:gravity="center_vertical"
tools:text="128MB / 237MB"
android:textColor="@color/grayTextColor"
android:textColor="?attr/grayTextColor"
android:layout_width="wrap_content"
android:layout_height="match_parent">
</TextView>
@ -111,6 +111,7 @@
android:layout_width="30dp"
android:background="?selectableItemBackgroundBorderless"
android:src="@drawable/ic_baseline_play_arrow_24"
android:tint="?attr/textColor"
android:contentDescription="@string/download"/>
</FrameLayout>
</GridLayout>

View file

@ -6,7 +6,7 @@
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
app:cardCornerRadius="@dimen/roundedImageRadius"
app:cardBackgroundColor="@color/itemBackground"
app:cardBackgroundColor="?attr/boxItemBackground"
android:id="@+id/episode_holder"
android:foreground="@drawable/outline_drawable"
android:layout_marginBottom="10dp"
@ -41,14 +41,14 @@
android:id="@+id/download_header_title"
tools:text="Perfect Run"
android:textStyle="bold"
android:textColor="@color/textColor"
android:textColor="?attr/textColor"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</TextView>
<TextView
android:id="@+id/download_header_info"
tools:text="1 episode | 285MB"
android:textColor="@color/grayTextColor"
android:textColor="?attr/grayTextColor"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</TextView>
@ -85,6 +85,8 @@
android:visibility="visible"
/>
<ImageView
android:tint="?attr/white"
android:visibility="visible"
android:layout_marginEnd="10dp"
android:layout_marginStart="10dp"

View file

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout
android:background="?attr/darkBackground"
android:background="?attr/primaryGrayBackground"
android:id="@+id/download_child_root"
android:orientation="vertical"
xmlns:android="http://schemas.android.com/apk/res/android"
@ -17,7 +17,7 @@
android:id="@+id/download_child_toolbar"
android:paddingTop="@dimen/navbarHeight"
tools:title="Overlord"
android:background="?attr/darkBackground"
android:background="?attr/primaryGrayBackground"
app:navigationIconTint="?attr/iconColor"
app:titleTextColor="?attr/textColor"
app:layout_scrollFlags="scroll|enterAlways"

View file

@ -7,11 +7,11 @@
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?attr/darkBackground"
android:background="?attr/primaryGrayBackground"
tools:context=".ui.download.DownloadFragment">
<com.google.android.material.appbar.AppBarLayout
android:background="?attr/darkBackground"
android:background="?attr/primaryGrayBackground"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<!--
@ -26,6 +26,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:textColor="?attr/textColor"
android:layout_marginBottom="5dp"
android:text="@string/download_storage_text"
android:layout_width="wrap_content"
@ -39,7 +40,7 @@
<View
android:layout_weight="0.5"
android:id="@+id/download_used"
android:background="@color/usedStorageColor"
android:background="?attr/white"
android:layout_width="0dp"
android:layout_height="match_parent"/>
<View
@ -51,7 +52,7 @@
<View
android:id="@+id/download_free"
android:layout_weight="0.10"
android:background="@color/freeStorageColor"
android:background="?attr/grayTextColor"
android:layout_width="0dp"
android:layout_height="match_parent"/>
</LinearLayout>
@ -64,7 +65,7 @@
android:layout_marginTop="5dp"
android:layout_marginBottom="5dp"
android:layout_gravity="center_vertical"
android:background="@color/usedStorageColor"
android:background="?attr/white"
android:layout_width="10dp"
android:layout_height="10dp"/>
<TextView
@ -93,7 +94,7 @@
<View
android:layout_margin="5dp"
android:layout_gravity="center_vertical"
android:background="@color/freeStorageColor"
android:background="?attr/grayTextColor"
android:layout_width="10dp"
android:layout_height="10dp"/>
<TextView

View file

@ -95,15 +95,15 @@
android:layout_width="match_parent"
android:layout_height="match_parent">
<View
android:background="?attr/darkBackground"
android:background="?attr/primaryGrayBackground"
android:id="@+id/home_statusbar"
android:layout_height="wrap_content"
android:layout_width="match_parent"/>
<FrameLayout
android:id="@+id/home_settings_bar"
android:background="?attr/darkBackground"
android:background="?attr/primaryGrayBackground"
android:layout_width="match_parent"
android:layout_height="60dp">
android:layout_height="70dp">
<LinearLayout
android:gravity="center"
@ -194,12 +194,13 @@
android:textStyle="bold"
android:layout_margin="5dp"
android:textSize="15sp"
android:textColor="@color/textColor"
android:textColor="?attr/textColor"
android:layout_width="match_parent"
android:maxLines="2"
android:ellipsize="end"
android:layout_height="40sp"/>
<LinearLayout
android:padding="5dp"
android:layout_gravity="center"
android:gravity="center"
android:orientation="horizontal"
@ -268,6 +269,7 @@
android:text="@string/continue_watching"
/>
<ImageView
android:tint="?attr/textColor"
android:layout_marginEnd="5dp"
android:layout_gravity="end|center_vertical"
android:src="@drawable/ic_baseline_arrow_forward_24"
@ -309,6 +311,8 @@
<ImageView
android:background="?android:attr/selectableItemBackgroundBorderless"
android:tint="?attr/textColor"
android:id="@+id/home_bookmark_select"
android:src="@drawable/ic_baseline_filter_list_24"
android:layout_width="24dp"
@ -323,6 +327,7 @@
tools:text="Bookmarked"
/>
<ImageView
android:tint="?attr/textColor"
android:layout_marginEnd="5dp"
android:layout_gravity="end|center_vertical"
android:src="@drawable/ic_baseline_arrow_forward_24"

View file

@ -83,7 +83,7 @@
android:scaleType="centerCrop"
android:alpha="0.7"
tools:src="@drawable/example_poster"
android:background="@color/primaryGrayBackground"
android:background="?attr/primaryGrayBackground"
tools:ignore="ContentDescription"/>
<ImageView
android:src="@drawable/background_shadow"
@ -208,6 +208,7 @@
android:layout_height="50dp"
android:mediaRouteTypes="user"
android:visibility="gone"
app:mediaRouteButtonTint="?attr/textColor"
/>
<ImageView
android:nextFocusUp="@id/result_back"
@ -220,6 +221,9 @@
android:layout_height="25dp"
android:layout_marginRight="10dp"
android:elevation="10dp"
android:tint="?attr/textColor"
android:background="?android:attr/selectableItemBackgroundBorderless"
android:src="@drawable/ic_outline_share_24"
android:layout_gravity="center" android:contentDescription="@string/result_share">
@ -235,6 +239,9 @@
android:layout_height="25dp"
android:layout_margin="5dp"
android:elevation="10dp"
android:tint="?attr/textColor"
android:background="?android:attr/selectableItemBackgroundBorderless"
android:src="@drawable/ic_baseline_public_24"
android:layout_gravity="center"
@ -261,6 +268,7 @@
/>
<TextView
android:textColor="?attr/textColor"
android:padding="10dp"
android:foreground="@drawable/outline_drawable"
@ -383,7 +391,7 @@
android:layout_gravity="center_vertical"
android:gravity="center_vertical"
tools:text="128MB / 237MB"
android:textColor="@color/grayTextColor"
android:textColor="?attr/grayTextColor"
android:layout_width="wrap_content"
android:layout_height="match_parent">
</TextView>
@ -423,8 +431,23 @@
android:layout_gravity="center_vertical"
android:layout_marginStart="0dp"
style="@style/MultiSelectButton"
>
</com.google.android.material.button.MaterialButton>
/>
<com.google.android.material.button.MaterialButton
tools:visibility="visible"
tools:text="Dubbed"
android:nextFocusUp="@id/result_descript"
android:nextFocusRight="@id/result_season_button"
android:nextFocusLeft="@id/result_season_button"
android:nextFocusDown="@id/result_episodes"
android:id="@+id/result_dub_select"
android:visibility="gone"
android:layout_gravity="center_vertical"
android:layout_marginStart="0dp"
style="@style/MultiSelectButton"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"

View file

@ -8,7 +8,7 @@
android:id="@+id/searchRoot"
tools:context=".ui.search.SearchFragment"
android:orientation="vertical"
android:background="?attr/darkBackground"
android:background="?attr/primaryGrayBackground"
android:layout_marginTop="@dimen/navbarHeight">
<FrameLayout
android:visibility="visible"
@ -27,8 +27,12 @@
android:nextFocusLeft="@id/search_filter"
android:nextFocusDown="@id/cardSpace"
android:imeOptions="actionSearch"
android:inputType="text"
android:id="@+id/main_search"
app:queryBackground="@color/transparent"
app:searchIcon="@drawable/search_icon"
android:paddingStart="-10dp"
android:iconifiedByDefault="false"
@ -38,7 +42,6 @@
android:layout_gravity="center_vertical"
app:iconifiedByDefault="false"
tools:ignore="RtlSymmetry">
<requestFocus/>
<androidx.core.widget.ContentLoadingProgressBar
android:id="@+id/search_loading_bar"
@ -70,6 +73,7 @@
android:layout_gravity="end|center_vertical"
app:tint="?attr/textColor"
android:contentDescription="@string/change_providers_img_des">
<requestFocus/>
</ImageView>
</FrameLayout>

View file

@ -4,7 +4,7 @@
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:background="?attr/darkBackground"
android:background="?attr/primaryGrayBackground"
android:layout_height="wrap_content">
<FrameLayout

View file

@ -11,7 +11,7 @@
android:elevation="10dp"
app:cardCornerRadius="@dimen/roundedImageRadius"
android:id="@+id/backgroundCard"
app:cardBackgroundColor="@color/primaryGrayBackground"
app:cardBackgroundColor="?attr/primaryGrayBackground"
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<ImageView
@ -32,7 +32,7 @@
<TextView
android:text="@string/app_dubbed_text"
android:id="@+id/text_is_dub"
android:textColor="@color/textColor"
android:textColor="?attr/textColor"
android:paddingRight="10dp"
android:paddingLeft="10dp"
android:paddingTop="4dp"
@ -48,7 +48,7 @@
android:id="@+id/text_is_sub"
android:text="@string/app_subbed_text"
android:layout_gravity="end"
android:textColor="@color/textColor"
android:textColor="?attr/textColor"
android:paddingRight="10dp"
android:paddingLeft="10dp"
android:paddingTop="4dp"

View file

@ -11,7 +11,7 @@
android:elevation="10dp"
app:cardCornerRadius="@dimen/roundedImageRadius"
android:id="@+id/backgroundCard"
app:cardBackgroundColor="@color/primaryGrayBackground"
app:cardBackgroundColor="?attr/primaryGrayBackground"
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<ImageView

View file

@ -21,6 +21,7 @@
tools:text="Trending"
/>
<ImageView
android:tint="?attr/textColor"
android:layout_marginEnd="5dp"
android:layout_gravity="end|center_vertical"
android:src="@drawable/ic_baseline_arrow_forward_24"

View file

@ -269,6 +269,7 @@
android:nextFocusUp="@id/video_go_back"
android:nextFocusDown="@id/lock_player"
android:nextFocusLeft="@id/exo_rew"
android:tint="@color/white"
android:paddingLeft="100dp"
android:id="@id/exo_rew"
@ -302,6 +303,8 @@
android:nextFocusLeft="@id/exo_rew"
android:nextFocusRight="@id/exo_ffwd"
android:tint="@color/white"
android:id="@id/exo_play"
android:scaleType="fitCenter"
android:layout_height="70dp"
@ -319,6 +322,8 @@
android:nextFocusRight="@id/exo_ffwd"
android:id="@id/exo_pause"
android:tint="@color/white"
android:scaleType="fitCenter"
android:layout_height="70dp"
android:layout_width="70dp"
@ -354,6 +359,7 @@
android:nextFocusUp="@id/video_go_back"
android:nextFocusDown="@id/lock_player"
android:nextFocusRight="@id/exo_rew"
android:tint="@color/white"
android:layout_gravity="center"
android:id="@id/exo_ffwd"
@ -498,7 +504,8 @@
android:layout_marginEnd="20dp"
card_view:cardCornerRadius="@dimen/card_corner_radius"
card_view:cardBackgroundColor="@color/transparent"
android:foreground="?attr/selectableItemBackgroundBorderless"
android:foreground="@drawable/video_bottom_button"
card_view:cardElevation="0dp"
tools:visibility="visible"
>
@ -554,7 +561,7 @@
android:layout_marginEnd="20dp"
card_view:cardCornerRadius="@dimen/card_corner_radius"
card_view:cardBackgroundColor="@color/transparent"
android:foreground="?attr/selectableItemBackgroundBorderless"
android:foreground="@drawable/video_bottom_button"
card_view:cardElevation="0dp"
tools:visibility="visible"
>
@ -602,7 +609,7 @@
android:layout_marginEnd="20dp"
app:cardCornerRadius="@dimen/card_corner_radius"
app:cardBackgroundColor="@color/transparent"
android:foreground="?attr/selectableItemBackgroundBorderless"
android:foreground="@drawable/video_bottom_button"
app:cardElevation="0dp"
>
@ -654,7 +661,7 @@
android:layout_marginEnd="20dp"
card_view:cardCornerRadius="@dimen/card_corner_radius"
card_view:cardBackgroundColor="@color/transparent"
android:foreground="?attr/selectableItemBackgroundBorderless"
android:foreground="@drawable/video_bottom_button"
card_view:cardElevation="0dp"
>
@ -704,7 +711,7 @@
android:layout_marginEnd="20dp"
card_view:cardCornerRadius="@dimen/card_corner_radius"
card_view:cardBackgroundColor="@color/transparent"
android:foreground="?attr/selectableItemBackgroundBorderless"
android:foreground="@drawable/video_bottom_button"
card_view:cardElevation="0dp"
>
@ -753,7 +760,7 @@
android:layout_marginEnd="20dp"
card_view:cardCornerRadius="@dimen/card_corner_radius"
card_view:cardBackgroundColor="@color/transparent"
android:foreground="?attr/selectableItemBackgroundBorderless"
android:foreground="@drawable/video_bottom_button"
card_view:cardElevation="0dp"
>
<LinearLayout

View file

@ -13,6 +13,9 @@
<com.google.android.material.switchmaterial.SwitchMaterial
android:id="@+id/toggle1"
android:nextFocusLeft="@id/apply_btt"
android:nextFocusRight="@id/cancel_btt"
android:layout_marginTop="10dp"
android:paddingStart="20dp"
android:paddingEnd="20dp"
@ -24,12 +27,15 @@
tools:text="Search"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<requestFocus/>
</com.google.android.material.switchmaterial.SwitchMaterial>
<ListView
android:nextFocusRight="@id/cancel_btt"
android:nextFocusLeft="@id/apply_btt"
android:nextFocusUp="@id/toggle1"
android:nextFocusDown="@id/apply_btt"
android:id="@+id/listview1"
android:layout_marginTop="-10dp"
android:layout_marginBottom="60dp"
@ -43,6 +49,9 @@
android:nextFocusRight="@id/cancel_btt"
android:nextFocusLeft="@id/apply_btt"
android:nextFocusUp="@id/toggle1"
android:nextFocusDown="@id/apply_btt"
android:id="@+id/listview2"
android:layout_marginTop="-10dp"
android:layout_marginBottom="60dp"

View file

@ -55,6 +55,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:tint="?attr/textColor"
android:layout_marginStart="10dp"
android:layout_marginEnd="10dp"
android:layout_gravity="center_vertical"
@ -71,7 +72,7 @@
android:layout_marginEnd="50dp"
android:layout_gravity="center_vertical"
android:gravity="center_vertical" tools:text="Episode 1"
android:textColor="@color/textColor"
android:textColor="?attr/textColor"
android:scrollHorizontally="true"
android:ellipsize="marquee"
@ -108,6 +109,8 @@
android:nextFocusLeft="@id/episode_holder"
android:nextFocusRight="@id/episode_holder"
android:tint="?attr/white"
android:id="@+id/result_episode_download"
android:visibility="visible"
android:layout_marginEnd="10dp"

View file

@ -11,7 +11,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:cardCornerRadius="@dimen/roundedImageRadius"
app:cardBackgroundColor="@color/itemBackground"
app:cardBackgroundColor="?attr/boxItemBackground"
android:foreground="@drawable/outline_drawable"
android:layout_marginBottom="10dp"
@ -75,14 +75,14 @@
android:id="@+id/episode_text"
tools:text="1. Jobless"
android:textStyle="bold"
android:textColor="@color/textColor"
android:textColor="?attr/textColor"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</TextView>
<TextView
android:id="@+id/episode_rating"
tools:text="Rated: 8.8"
android:textColor="@color/grayTextColor"
android:textColor="?attr/grayTextColor"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</TextView>
@ -113,6 +113,8 @@
android:nextFocusRight="@id/episode_holder"
android:id="@+id/result_episode_download"
android:tint="?attr/white"
android:visibility="visible"
android:layout_marginEnd="10dp"
android:layout_marginStart="10dp"
@ -129,7 +131,7 @@
android:paddingTop="10dp"
android:paddingBottom="10dp"
android:id="@+id/episode_descript"
android:textColor="@color/grayTextColor"
android:textColor="?attr/grayTextColor"
tools:text="Jon and Daenerys arrive in Winterfell and are met with skepticism. Sam learns about the fate of his family. Cersei gives Euron the reward he aims for. Theon follows his heart. "
android:layout_width="match_parent" android:layout_height="wrap_content">
</TextView>

View file

@ -19,7 +19,7 @@
android:elevation="10dp"
app:cardCornerRadius="@dimen/roundedImageRadius"
android:id="@+id/backgroundCard"
app:cardBackgroundColor="@color/primaryGrayBackground"
app:cardBackgroundColor="?attr/primaryGrayBackground"
>
<ImageView
@ -80,7 +80,7 @@
<!-- <TextView
android:text="Movie"
android:textColor="@color/textColor"
android:textColor="?attr/textColor"
android:paddingRight="10dp"
android:paddingLeft="10dp"
android:paddingTop="4dp"

View file

@ -16,7 +16,7 @@
android:layout_marginBottom="10dp"
android:elevation="0dp"
app:cardCornerRadius="@dimen/roundedImageRadius"
app:cardBackgroundColor="@color/itemBackground"
app:cardBackgroundColor="?attr/boxItemBackground"
android:clickable="true"
android:focusable="true"
>

View file

@ -7,6 +7,7 @@
android:layout_height="match_parent"
android:padding="5dp"
app:cardCornerRadius="10dp"
app:cardBackgroundColor="?attr/primaryBlackBackground"
android:background="?attr/primaryBlackBackground">
<TextView

View file

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@color/ic_banner_background"/>
<foreground android:drawable="@drawable/ic_banner_foreground"/>
</adaptive-icon>

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

View file

@ -25,7 +25,7 @@
<string name="no_data">لايوجد بيانات</string>
<string name="episode_more_options_des">المزيد من الخيارات</string>
<string name="next_episode">الحلقة القادمة</string>
<string name="result_tags">الأنواع</string>
<string name="result_tags">النواع</string>
<string name="result_share">شارك</string>
<string name="result_open_in_browser">فتح في الويب </string>
<string name="skip_loading">تخطي التحميل</string>
@ -106,7 +106,7 @@
<string name="vpn_might_be_needed">قد تكون هناك حاجة إلى شبكة ظاهرية خاصة لكي يعمل هذا المزود بشكل صحيح</string>
<string name="vpn_torrent">هذا المزود هو تورنت ، يوصى باستخدام شبكة ظاهرية خاصة</string>
<string name="torrent_plot">الوصف</string>
<string name="normal_no_plot">لم يتم العثور على قطعة</string>
<string name="normal_no_plot">لم يتم العثور على وصف</string>
<string name="torrent_no_plot">لم يتم العثور على وصف</string>
<string name="picture_in_picture">صورة داخل صورة</string>
@ -116,7 +116,7 @@
<string name="player_subtitles_settings">الترجمة</string>
<string name="player_subtitles_settings_des">إعدادات ترجمة المشغل</string>
<string name="eigengraumode_settings">وضع إيغنغرافي</string>
<string name="eigengraumode_settings_des">يضيف خيار السرعة في اللاعب</string>
<string name="eigengraumode_settings_des">يضيف خيار السرعة في المشغل</string>
<string name="swipe_to_seek_settings">اسحب للسعي</string>
<string name="swipe_to_seek_settings_des">اسحب إلى اليسار أو اليمين للتحكم في الوقت في مشغل الفيديو</string>
<string name="swipe_to_change_settings">اسحب لتغيير الإعدادات</string>
@ -129,7 +129,7 @@
<string name="search">بحث</string>
<string name="settings_info">معلومات</string>
<string name="advanced_search">البحث المتقدم</string>
<string name="advanced_search_des">يعطيك نتائج البحث مفصولة عن طريق مزود</string>
<string name="advanced_search_des">يعطيك نتائج البحث مفصولة عن طريق المزود</string>
<string name="bug_report_settings_off">إرسال البيانات عن الأعطال فقط</string>
<string name="bug_report_settings_on">لا ترسل أي بيانات</string>
<string name="show_fillers_settings">عرض حلقة فلر لأنيمي</string>
@ -161,7 +161,6 @@
<string name="delete_file">حذف ملف</string>
<string name="delete">حذف</string>
<string name="cancel" translatable="false">@string/sort_cancel</string>
<string name="pause">إيقاف مؤقت</string>
<string name="resume">أكمل</string>
<string name="delete_message">This will permanently delete %s\nAre you sure?</string>
@ -184,7 +183,7 @@
<string name="app_storage">تطبيق</string>
<string name="movies">أفلام</string>
<string name="tv_series">مسلسلت</string>
<string name="tv_series">مسلسلات</string>
<string name="cartoons">رسوم متحركة</string>
<string name="anime">انمي</string>
<string name="torrent">تورنت</string>

View file

@ -3,13 +3,11 @@
<string name="result_poster_img_des">Poster</string>
<string name="search_poster_img_des">@string/result_poster_img_des</string>
<string name="episode_poster_img_des">Episode Poster</string>
<string name="home_main_poster_img_des">Main Poster</string>
<string name="home_next_random_img_des">Next Random</string>
<string name="episode_play_img_des" translatable="false">@string/play_episode</string>
<string name="go_back_img_des">Go back</string>
<string name="change_providers_img_des" translatable="false">@string/home_change_provider_img_des</string>
<string name="home_change_provider_img_des">Change Provider</string>
<string name="preview_background_img_des">Preview Background</string>
<string name="home_main_poster_img_des">Hauptposter</string>
<string name="home_next_random_img_des">Nächstes Poster</string>
<string name="go_back_img_des">Zurück</string>
<string name="home_change_provider_img_des">Anbieter ändern</string>
<string name="preview_background_img_des">Vorschau Hintergrund</string>
<string name="player_speed_text_format" formatted="true">Geschwindigkeit (%.2fx)</string>
<string name="rated_format" formatted="true">Bewertung: %.1f</string>
<string name="new_update_format" formatted="true">Neues Update gefunden!\n%s -> %s</string>
@ -23,7 +21,6 @@
<string name="no_data">Keine Daten vorhanden</string>
<string name="episode_more_options_des">Mehr Optionen</string>
<string name="next_episode">Nächste Episode</string>
<string name="result_plot" translatable="false">@string/synopsis</string>
<string name="result_tags">Genres</string>
<string name="result_share">Teilen</string>
<string name="result_open_in_browser">Im Browser öffnen</string>
@ -50,7 +47,6 @@
<string name="download_failed">Download fehlgeschlagen</string>
<string name="download_canceled">Download abgebrochen</string>
<string name="download_done">Download abgeschlossen</string>
<string name="download_format" translatable="false">%s - %s</string>
<string name="error_loading_links_toast">Fehler beim Laden von Links</string>
<string name="download_storage_text">Interner Speicher</string>
<string name="app_dubbed_text">Dub</string>
@ -132,7 +128,7 @@
<string name="no_links_found_toast">Keine Links gefunden</string>
<string name="copy_link_toast">Link in die Zwischenablage kopiert</string>
<string name="play_episode_toast">Episode abspielen</string>
<string name="subs_default_reset_toast">Auf Standardwerte zurücksetzen</string>
<string name="subs_default_reset_toast">Auf Standardwerte zurückgesetzt</string>
<string name="acra_report_toast">Sorry, die App ist abgestürzt. Ein anonymer Fehlerbericht wird an die Entwickler gesendet</string>
<string name="season">Season</string>
<string name="no_season">Keine Season</string>
@ -142,7 +138,6 @@
<string name="episode_short">E</string>
<string name="delete_file">Gelöschte Dateien</string>
<string name="delete">Löschen</string>
<string name="cancel" translatable="false">@string/sort_cancel</string>
<string name="pause">Pausieren</string>
<string name="resume">Fortsetzen</string>
<string name="delete_message">Dies löscht dauerhaft %s\nBist du dir sicher?</string>
@ -195,4 +190,12 @@
<string name="resize_fill">Strecken</string>
<string name="resize_zoom">Zoomen</string>
<string name="provider_lang_settings">Anbietersprache</string>
<string name="legal_notice">Haftungsausschluss</string>
<string name="app_layout">App-Layout</string>
<string name="preferred_media_settings">Bevorzugte Medien</string>
<string name="automatic">Automatisch</string>
<string name="tv_layout">TV-Layout</string>
<string name="phone_layout">Handy-Layout</string>
<string name="primary_color_settings">Primärfarbe</string>
<string name="app_theme_settings">App-Thema</string>
</resources>

View file

@ -6,15 +6,12 @@
<string name="title_downloads">Téléchargements</string>
<string name="title_settings">Paramètres</string>
<string name="search_hint">Rechercher…</string>
<string name="change_providers_img_des">Changer les fournisseurs</string>
<string name="search_poster_img_des">Miniature</string>
<string name="no_data">Aucune Donnée</string>
<string name="episode_more_options_des">Plus d\'options</string>
<string name="episode_play_img_des">Lire l\'épisode</string>
<string name="go_back_img_des">Retour</string>
<string name="next_episode">Episode suivant</string>
<string name="result_poster_img_des">Miniature</string>
<string name="result_plot" translatable="false">@string/synopsis</string>
<string name="result_tags">Genres</string>
<string name="result_share">Partager</string>
<string name="result_open_in_browser">Ouvrir dans le naviguateur</string>

View file

@ -6,11 +6,9 @@
<string name="title_downloads">Λήψεις</string>
<string name="title_settings">Ρυθμίσεις</string>
<string name="search_hint">Ψάξε…</string>
<string name="change_providers_img_des">Αλλαγή Παροχών</string>
<string name="search_poster_img_des">Πόστερ</string>
<string name="no_data">Χωρίς δεδομένα</string>
<string name="episode_more_options_des">Περισσότερες Επιλογές</string>
<string name="episode_play_img_des">Αναπαραγωγή Επισοδείου</string>
<string name="go_back_img_des">Πίσω</string>
<string name="next_episode">Επόμενο Επισόδειο</string>
<string name="result_poster_img_des">Πόστερ</string>

View file

@ -12,7 +12,6 @@
<string name="no_data">डेटा उपलब्ध नही है</string>
<string name="episode_more_options_des">अन्य ऑप्शन</string>
<string name="next_episode">अगला एपिसोड</string>
<string name="result_plot" translatable="false">@string/synopsis</string>
<string name="result_tags">शैलियां</string>
<string name="result_share">शेयर</string>
<string name="result_open_in_browser">ब्राउज़र में खोलें</string>

View file

@ -14,7 +14,6 @@
<string name="no_data">ടാറ്റ ലഭ്യമല്ല</string>
<string name="episode_more_options_des">കൂടുതൽ ഓപ്ഷൻസ്</string>
<string name="next_episode">അടുത്ത എപ്പിസോഡ്</string>
<string name="result_plot" translatable="false">@string/synopsis</string>
<string name="result_tags">തരം</string>
<string name="result_share">ഷെയർ</string>
<string name="result_open_in_browser">ബ്രൗസറിൽ തുറക്കുക</string>

View file

@ -7,15 +7,12 @@
<string name="title_downloads">ouuhhhooh ooh</string>
<string name="title_settings">aaaghhoh aauugghh</string>
<string name="search_hint">haaooh</string>
<string name="change_providers_img_des">ooooo aah ohaooooo</string>
<string name="search_poster_img_des">aaaaaah</string>
<string name="no_data">oooohhoouuh</string>
<string name="episode_more_options_des">aaaaaoouuhahhh ahh</string>
<string name="episode_play_img_des">ahooo aoohoouuhhaa</string>
<string name="go_back_img_des">oooohh aauuh</string>
<string name="next_episode">ahhhaaaghh aaaaa</string>
<string name="result_poster_img_des">ahaauugghh</string>
<string name="result_plot">oohouuhhhaaahhu</string>
<string name="result_tags">ahhh oouuh</string>
<string name="result_share">aauuh</string>
<string name="result_open_in_browser">oooohh oooohhhaaaoouuh</string>
@ -121,8 +118,8 @@
<string name="no_season">aauuh ohaahooo</string>
<string name="episode">ahhhaaahhu</string>
<string name="episodes">ahhh ooooo</string>
<string name="season_short">haa</string>
<string name="episode_short">a</string>
<string name="season_short">H</string>
<string name="episode_short">A</string>
<string name="delete_file">ooha ohahaaahoooa ahahooo</string>
<string name="delete">oooooah</string>
<string name="delete_message">aahhaaaaaahooo aauuh aaahhuaooo-ahahoooohh aoouuhoohoohooo-ahah</string>
@ -175,4 +172,28 @@
<string name="resume">oouuh haa</string>
<string name="double_tap_to_seek_settings_des">oohahaha hahha ooooohaha</string>
<string name="storage_error">oohahaha hahha ooooohaha haaoou</string>
<string name="use_system_brightness_settings">u ahhu uuuh hau uaohuau</string>
<string name="use_system_brightness_settings_des">aahuuouhh ouh hhhah hhaohuhha</string>
<string name="subs_font_size">a auoo ohauh</string>
<string name="source_error">uhaauauau ahuuouaha</string>
<string name="remote_error">auuuha h a ahuhaaaa</string>
<string name="render_error">uaoh uhu uahaaaaoo</string>
<string name="unexpected_error">uauhah u aao u oah</string>
<string name="watch_quality_pref">h u ahahh aoou ha</string>
<string name="dns_pref">haoooo aaoou uou ah</string>
<string name="dns_pref_summary">oahuouooaouoa ouuhh</string>
<string name="display_subbed_dubbed_settings">o ouou uhauuuoaah h</string>
<string name="resize_fit">ou aouhouo aaooao hh</string>
<string name="resize_fill">hhauhohhuu au aaohu</string>
<string name="resize_zoom">uhuoh o a ohahuhohoa hah</string>
<string name="provider_lang_settings">ua hu ouo o aoau hah ah</string>
<string name="legal_notice">ah huu oouhhau aoaoaaohoo ha</string>
<string name="general">a ahu uoo uoahuo uo</string>
<string name="app_layout">uo u ohouao</string>
<string name="automatic">uuoouhh hhuhuuh ouhoaao hau aouo</string>
<string name="tv_layout">uha uh huo uooaah u</string>
<string name="phone_layout">u ooah uo ahauao huhuu hauu h</string>
<string name="primary_color_settings">a ou oh ouhuouhoaaha</string>
<string name="show_fillers_settings">aaooohhouhhha hauauuu</string>
<string name="new_update_format">aaaaaaa uuuuuu\n%s -> %s</string>
</resources>

View file

@ -6,11 +6,9 @@
<string name="title_downloads">Downloads</string>
<string name="title_settings">Instellingen</string>
<string name="search_hint">Zoeken…</string>
<string name="change_providers_img_des">Aanbieders wijzigen</string>
<string name="search_poster_img_des">Poster</string>
<string name="no_data">Geen gegevens</string>
<string name="episode_more_options_des">Meer Opties</string>
<string name="episode_play_img_des">Aflevering afspelen</string>
<string name="go_back_img_des">Ga terug</string>
<string name="next_episode">Volgende aflevering</string>
<string name="result_poster_img_des">Poster</string>

View file

@ -224,6 +224,13 @@
<string name="resize_zoom">Zoome</string>
<string name="general">Grunnleggende</string>
<string name="provider_lang_settings">Leverandør Språk</string>
<string name="app_layout">App Oppsett</string>
<string name="automatic">Automatisk</string>
<string name="tv_layout">Tv Oppsett</string>
<string name="phone_layout">Mobile Oppsett</string>
<string name="primary_color_settings">Primær Farge</string>
<string name="app_theme_settings">App Tema</string>
<string name="preferred_media_settings">Foretrukket Videoinnhold</string>
<string name="legal_notice" translatable="false">Disclaimer</string>
<string name="legal_notice_key" translatable="false">legal_notice_key</string>

View file

@ -76,6 +76,7 @@
<string name="subs_edge_type">Kolor krawędzi</string>
<string name="subs_subtitle_elevation">Wzniesienie napisów</string>
<string name="subs_font">Czcionka</string>
<string name="subs_font_size">Rozmiar czcionki</string>
<string name="search_provider_text_providers">Szukaj według dostawców</string>
<string name="search_provider_text_types">Szukaj według typów</string>
@ -134,7 +135,7 @@
<string name="no_links_found_toast">Nie znaleziono linków</string>
<string name="copy_link_toast">Skopiowano do schowka</string>
<string name="play_episode_toast">Odtwórz odcinek</string>
<string name="subs_default_reset_toast">Resetuj</string>
<string name="subs_default_reset_toast">Zresetowano</string>
<string name="acra_report_toast">Awaria aplikacji. Anonimowe zgłoszenie błedu zostanie wysłane programistom</string>
<string name="season">Sezon</string>
@ -200,4 +201,29 @@
<string name="dont_show_again">Nie pokazuj ponownie</string>
<string name="update">Aktualizacja</string>
<string name="watch_quality_pref">Domyślna jakość</string>
<string name="use_system_brightness_settings">Używaj jasności systemowej</string>
<string name="use_system_brightness_settings_des">Używaj jasności systemowej zamiast ciemnej nakładki</string>
<string name="show_fillers_settings">Pokaż odcineki-wypełniacze dla anime</string>
<string name="dns_pref_summary">Przydatne w pomijaniu blokad dostawców internetu</string>
<string name="display_subbed_dubbed_settings">Wyświel Anime z dubbingiem/napisami</string>
<string name="resize_fit">Dopasuj do ekranu</string>
<string name="resize_fill">Rozciągnij</string>
<string name="resize_zoom">Powiększ</string>
<string name="provider_lang_settings">Języki dostawców</string>
<string name="general">Ogólne</string>
<string name="app_layout">Układ aplikacji</string>
<string name="automatic">Automatyczny</string>
<string name="tv_layout">Układ dla telewizorów</string>
<string name="phone_layout">Układ dla telefonów</string>
<string name="primary_color_settings">Kolor podstawowy</string>
<string name="dns_pref">DNS over HTTPS</string>
<string name="legal_notice">Zastrzeżenie</string>
<string name="result_poster_img_des">Plakat</string>
<string name="episode_poster_img_des">Plakat odcinka</string>
<string name="home_main_poster_img_des">Główny plakat</string>
<string name="home_next_random_img_des">Następny losowy</string>
<string name="go_back_img_des">Wstecz</string>
<string name="filler_format">(WYpełniacz) %s</string>
<string name="home_change_provider_img_des">Zmień dostawcę</string>
<string name="preview_background_img_des">Pogląd tła</string>
</resources>

View file

@ -10,14 +10,12 @@
<string name="title_downloads">Nerladdningar</string>
<string name="title_settings">Instälningar</string>
<string name="search_hint">Sök…</string>
<string name="change_providers_img_des">Ändra Providers</string>
<string name="search_poster_img_des">Poster</string>
<string name="no_data">Ingen Data</string>
<string name="episode_more_options_des">Mer Instälningar</string>
<string name="go_back_img_des">Gå tillbacka</string>
<string name="next_episode">Nästa avsnitt</string>
<string name="result_poster_img_des">Affisch</string>
<string name="result_plot">Sammanfattning</string>
<string name="result_tags">Genrer</string>
<string name="result_share">Dela</string>
<string name="result_open_in_browser">Öppna i webbläsaren</string>

View file

@ -1,40 +1,9 @@
<!--https://newbedev.com/concatenate-multiple-strings-in-xml-->
<resources>
<!-- KEYS DON'T TRANSLATE -->
<string name="search_providers_list_key" translatable="false">search_providers_list</string>
<string name="locale_key" translatable="false">app_locale</string>
<string name="search_types_list_key" translatable="false">search_type_list</string>
<string name="grid_format_key" translatable="false">grid_format</string>
<string name="auto_update_key" translatable="false">auto_update</string>
<string name="prerelease_update_key" translatable="false">prerelease_update</string>
<string name="manual_check_update_key" translatable="false">manual_check_update</string>
<string name="fast_forward_button_time_key" translatable="false">fast_forward_button_time</string>
<string name="benene_count" translatable="false">benene_count</string>
<string name="subtitle_settings_key" translatable="false">subtitle_settings_key</string>
<string name="quality_pref_key" translatable="false">quality_pref_key</string>
<string name="prerelease_commit_hash" translatable="false">unknown_prerelease</string>
<string name="use_system_brightness_key" translatable="false">use_system_brightness_key</string>
<string name="swipe_enabled_key" translatable="false">swipe_enabled_key</string>
<string name="playback_speed_enabled_key" translatable="false">playback_speed_enabled_key</string>
<string name="player_resize_enabled_key" translatable="false">player_resize_enabled_key</string>
<string name="pip_enabled_key" translatable="false">pip_enabled_key</string>
<string name="double_tap_enabled_key" translatable="false">double_tap_enabled_key</string>
<string name="swipe_vertical_enabled_key" translatable="false">swipe_vertical_enabled_key</string>
<string name="display_sub_key" translatable="false">display_sub_key</string>
<string name="show_fillers_key" translatable="false">show_fillers_key</string>
<string name="provider_lang_key" translatable="false">provider_lang_key</string>
<string name="dns_key" translatable="false">dns_key</string>
<!-- FORMAT MIGHT TRANSLATE, WILL CAUSE CRASH IF APPLIED WRONG -->
<string name="extra_info_format" translatable="false" formatted="true">%d %s | %sMB</string>
<string name="storage_size_format" translatable="false" formatted="true">%s • %sGB</string>
<string name="download_size_format" translatable="false" formatted="true">%sMB / %sMB</string>
<string name="episode_name_format" translatable="false" formatted="true">%s %s</string>
<string name="ffw_text_format" translatable="false" formatted="true">+%d</string>
<string name="rew_text_format" translatable="false" formatted="true">-%d</string>
<string name="ffw_text_regular_format" translatable="false" formatted="true">%d</string>
<string name="rew_text_regular_format" translatable="false" formatted="true">%d</string>
<string name="app_dub_sub_episode_text_format">%s Ep %d</string>
<!-- IS NOT NEEDED TO TRANSLATE AS THEY ARE ONLY USED FOR SCREEN READERS AND WONT SHOW UP TO NORMAL USERS -->
@ -43,9 +12,7 @@
<string name="episode_poster_img_des">Episodyo Paskil</string>
<string name="home_main_poster_img_des">Pangunahing Paskil</string>
<string name="home_next_random_img_des">Susunod Walang tiyak</string>
<string name="episode_play_img_des" translatable="false">@string/play_episode</string>
<string name="go_back_img_des">Pumunta Likod</string>
<string name="change_providers_img_des" translatable="false">@string/home_change_provider_img_des</string>
<string name="home_change_provider_img_des">Pagbabago Pinagmulan</string>
<string name="preview_background_img_des">Prebiyu Likuran</string>
@ -65,7 +32,6 @@
<string name="no_data">Wala Datos</string>
<string name="episode_more_options_des">Mas Opsyon</string>
<string name="next_episode">Susunod Episodyo</string>
<string name="result_plot" translatable="false">@string/synopsis</string>
<string name="result_tags">Dyanra</string>
<string name="result_share">Magbahagi</string>
<string name="result_open_in_browser">Buksan Ito Panlabas</string>
@ -96,7 +62,6 @@
<string name="download_failed">Pag-iimbak nabigo</string>
<string name="download_canceled">Pag-iimbak Kinansela</string>
<string name="download_done">Tapos</string>
<string name="download_format" translatable="false">%s - %s</string>
<string name="error_loading_links_toast">Kamalian</string>
<string name="download_storage_text">Espasyo sa Imbakan</string>
@ -204,7 +169,6 @@
<string name="delete_file">Tanggalin</string>
<string name="delete">Tanggalin</string>
<string name="cancel" translatable="false">@string/sort_cancel</string>
<string name="pause">Humawak</string>
<string name="resume">Magpatuloy</string>
<string name="delete_message">Permanenteng tatanggalin %s\nSigurado ka ba?</string>
@ -262,31 +226,19 @@
<string name="dns_pref">DNS over HTTPS</string>
<string name="dns_pref_summary">Mahusay gamitin sa pag-bypass ISP sagabal</string>
<string name="display_subbed_dubbed_settings">Magpakita Dubbed/Subbed Anime</string>
<string name="resize_fit">Pinakamainam</string>
<string name="resize_fill">Palakihin</string>
<string name="resize_zoom">Magpalaki</string>
<string name="legal_notice" translatable="false">Disclaimer</string>
<string name="legal_notice_key" translatable="false">legal_notice_key</string>
<string name="legal_notice_text" translatable="false">Any legal issues regarding the content on this application
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.
</string>
<string name="general">General</string>
<string name="general">Pangkalahatan</string>
<string name="provider_lang_settings">Pinagmulan wika</string>
<string name="app_layout">App Ayos</string>
<string name="automatic">Automatiko</string>
<string name="tv_layout">Telebisyon Ayos</string>
<string name="phone_layout">Phone Ayos</string>
<string name="primary_color_settings">Pangunahin Kulay</string>
<string name="app_theme_settings">App Tema</string>
<string name="preferred_media_settings">Ginustong Nilalaman</string>
</resources>

View file

@ -0,0 +1,280 @@
<!--https://newbedev.com/concatenate-multiple-strings-in-xml-->
<resources>
<!-- KEYS DON'T TRANSLATE -->
<string name="search_providers_list_key" translatable="false">search_providers_list</string>
<string name="locale_key" translatable="false">app_locale</string>
<string name="search_types_list_key" translatable="false">search_type_list</string>
<string name="grid_format_key" translatable="false">grid_format</string>
<string name="auto_update_key" translatable="false">auto_update</string>
<string name="prerelease_update_key" translatable="false">prerelease_update</string>
<string name="manual_check_update_key" translatable="false">manual_check_update</string>
<string name="fast_forward_button_time_key" translatable="false">fast_forward_button_time</string>
<string name="benene_count" translatable="false">benene_count</string>
<string name="subtitle_settings_key" translatable="false">subtitle_settings_key</string>
<string name="quality_pref_key" translatable="false">quality_pref_key</string>
<string name="prerelease_commit_hash" translatable="false">unknown_prerelease</string>
<string name="use_system_brightness_key" translatable="false">use_system_brightness_key</string>
<string name="swipe_enabled_key" translatable="false">swipe_enabled_key</string>
<string name="playback_speed_enabled_key" translatable="false">playback_speed_enabled_key</string>
<string name="player_resize_enabled_key" translatable="false">player_resize_enabled_key</string>
<string name="pip_enabled_key" translatable="false">pip_enabled_key</string>
<string name="double_tap_enabled_key" translatable="false">double_tap_enabled_key</string>
<string name="swipe_vertical_enabled_key" translatable="false">swipe_vertical_enabled_key</string>
<string name="display_sub_key" translatable="false">display_sub_key</string>
<string name="show_fillers_key" translatable="false">show_fillers_key</string>
<string name="provider_lang_key" translatable="false">provider_lang_key</string>
<string name="dns_key" translatable="false">dns_key</string>
<string name="app_layout_key" translatable="false">app_layout_key</string>
<string name="primary_color_key" translatable="false">primary_color_key</string>
<!-- FORMAT MIGHT TRANSLATE, WILL CAUSE CRASH IF APPLIED WRONG -->
<string name="extra_info_format" translatable="false" formatted="true">%d %s | %sMB</string>
<string name="storage_size_format" translatable="false" formatted="true">%s • %sGB</string>
<string name="download_size_format" translatable="false" formatted="true">%sMB / %sMB</string>
<string name="episode_name_format" translatable="false" formatted="true">%s %s</string>
<string name="ffw_text_format" translatable="false" formatted="true">+%d</string>
<string name="rew_text_format" translatable="false" formatted="true">-%d</string>
<string name="ffw_text_regular_format" translatable="false" formatted="true">%d</string>
<string name="rew_text_regular_format" translatable="false" formatted="true">%d</string>
<string name="app_dub_sub_episode_text_format">%s Ep %d</string>
<!-- IS NOT NEEDED TO TRANSLATE AS THEY ARE ONLY USED FOR SCREEN READERS AND WONT SHOW UP TO NORMAL USERS -->
<string name="result_poster_img_des">Poster</string>
<string name="search_poster_img_des">@string/result_poster_img_des</string>
<string name="episode_poster_img_des">Episode Poster</string>
<string name="home_main_poster_img_des">Main Poster</string>
<string name="home_next_random_img_des">Next Random</string>
<string name="episode_play_img_des" translatable="false">@string/play_episode</string>
<string name="go_back_img_des">Go back</string>
<string name="change_providers_img_des" translatable="false">@string/home_change_provider_img_des</string>
<string name="home_change_provider_img_des">Change Provider</string>
<string name="preview_background_img_des">Preview Background</string>
<!-- TRANSLATE, BUT DON'T FORGET FORMAT -->
<string name="player_speed_text_format" formatted="true">Hız (%.2fx)</string>
<string name="rated_format" formatted="true">Puan: %.1f</string>
<string name="new_update_format" formatted="true">Yeni güncelleme bulundu!\n%s -> %s</string>
<string name="filler_format" formatted="true">(Doldurucu) %s</string>
<string name="app_name">CloudStream</string>
<string name="title_home">Ana Sayfa</string>
<string name="title_search">Arama</string>
<string name="title_downloads">İndirmeler</string>
<string name="title_settings">Ayarlar</string>
<string name="search_hint">Ara…</string>
<string name="no_data">Veri Yok</string>
<string name="episode_more_options_des">Daha Fazla Seçenek</string>
<string name="next_episode">Sonraki bölüm</string>
<string name="result_tags">Türler</string>
<string name="result_share">Paylaş</string>
<string name="result_open_in_browser">Tarayıcıda Aç</string>
<string name="skip_loading">Yüklemeyi geç</string>
<string name="loading_chromecast">Yükleniyor…</string>
<string name="type_watching">İzleniyor</string>
<string name="type_on_hold">Beklemede</string>
<string name="type_completed">Tamamlandı</string>
<string name="type_dropped">Bırakıldı</string>
<string name="type_plan_to_watch">İzlemeyi Planla</string>
<string name="type_none">Hiçbiri</string>
<string name="play_movie_button">Film Oynat</string>
<string name="play_torrent_button">Torrent Akışı</string>
<string name="pick_source">Kaynaklar</string>
<string name="pick_subtitle">Altyazılar</string>
<string name="reload_error">Yeniden bağlanmayı dene…</string>
<string name="result_go_back">Geri Git</string>
<string name="play_episode">Bölümü Oynat</string>
<!--<string name="need_storage">Allow to download episodes</string>-->
<string name="download">İndirme</string>
<string name="downloaded">İndirildi</string>
<string name="downloading">İndiriliyor</string>
<string name="download_paused">İndirme Durduruldu</string>
<string name="download_started">İndirme Başladı</string>
<string name="download_failed">İndirme Başarısız Oldu</string>
<string name="download_canceled">İndirme İptal Edildi</string>
<string name="download_done">İndirme Bitti</string>
<string name="error_loading_links_toast">Bağlantıları yüklerken hata</string>
<string name="download_storage_text">Dahili Depolama</string>
<string name="app_dubbed_text">Seslendirme</string>
<string name="app_subbed_text">Altyazı</string>
<string name="popup_delete_file">Dosyayı Sil</string>
<string name="popup_play_file">Dosyayı Oynat</string>
<string name="popup_resume_download">İndirmeyi Sürdür</string>
<string name="popup_pause_download">İndirmeyi Durdur</string>
<string name="pref_disable_acra">Otomatik hata bildirmeyi devre dışı bırak</string>
<string name="home_more_info">Daha fazka bilgi</string>
<string name="home_expanded_hide">Gizle</string>
<string name="home_play">Oynat</string>
<string name="home_info">Bilgi</string>
<string name="filter_bookmarks">Yer işaretlerini filtrele</string>
<string name="error_bookmarks_text">Yer işaretleri</string>
<string name="action_remove_from_bookmarks">Kaldır</string>
<string name="sort_apply">Uygula</string>
<string name="sort_cancel">İptal Et</string>
<string name="player_speed">Oynatıcı Hızı</string>
<string name="subtitles_settings">Altyazı Ayarları</string>
<string name="subs_text_color">Metin Rengi</string>
<string name="subs_outline_color">Anahat Rengi</string>
<string name="subs_background_color">Arkaplan Rengi</string>
<string name="subs_window_color">Pencere Rengi</string>
<string name="subs_edge_type">Kenar Tipi</string>
<string name="subs_subtitle_elevation">Altyazı Yüksekliği</string>
<string name="subs_font">Yazı Tipi</string>
<string name="subs_font_size">Yazı Tipi Boyutu</string>
<string name="search_provider_text_providers">Sağlayıcıları kullanarak ara</string>
<string name="search_provider_text_types">Türleri kullanarak ara</string>
<string name="benene_count_text">Geliştiricilere %d Benene verildi</string>
<string name="benene_count_text_none">Hiçbir Benene verilmedi</string>
<string name="subs_auto_select_language">Dili Otomatik Seç</string>
<string name="subs_download_languages">Dilleri İndir</string>
<string name="subs_hold_to_reset_to_default">Varsayılana dönmek için basılı tutun</string>
<string name="continue_watching">İzlemeye Devam Edin</string>
<string name="action_remove_watching">Kaldır</string>
<string name="action_open_watching">Daha Fazla Bilgi</string>
<string name="vpn_might_be_needed">Bu sağlayıcının düzgün bir şekilde çalışması için VPN gerekebilir</string>
<string name="vpn_torrent">Bu sağlayıcınınki Torrent, VPN önerilir</string>
<string name="torrent_plot">ıklama</string>
<string name="normal_no_plot">Olay örgüsü bulunamadı</string>
<string name="torrent_no_plot">ıklama bulunamadı</string>
<string name="picture_in_picture">Resim içinde resim</string>
<string name="picture_in_picture_des">Diğer uygulamaların üzerinde minyatür bir oynatıcıda oynatmaya devam eder</string>
<string name="player_size_settings">Oyuncu yeniden boyutlandırma düğmesi</string>
<string name="player_size_settings_des">Siyah kenarlıkları kaldır</string>
<string name="player_subtitles_settings">Altyazılar</string>
<string name="player_subtitles_settings_des">Oynatıcı altyazı ayarları</string>
<string name="eigengraumode_settings">Eigengravy Modu</string>
<string name="eigengraumode_settings_des">Oynatıcıya hız seçeneğini ekler</string>
<string name="swipe_to_seek_settings">Aramak için kaydırın</string>
<string name="swipe_to_seek_settings_des">Video oynatıcıda zamanı kontrol etmek için sola veya sağa kaydırın</string>
<string name="swipe_to_change_settings">Ayarları değiştirmek için kaydırın</string>
<string name="swipe_to_change_settings_des">Parlaklığı veya ses seviyesini değiştirmek için sola veya sağa kaydırın</string>
<string name="double_tap_to_seek_settings">Aramak için iki kez dokunun</string>
<string name="double_tap_to_seek_settings_des">İleri veya geri aramak için sağ veya sol tarafa iki kez dokunun
</string>
<string name="use_system_brightness_settings">Sistem parlaklığını kullan</string>
<string name="use_system_brightness_settings_des">Uygulama oynatıcısında karanlık bir kaplama yerine sistem parlaklığını kullanın</string>
<string name="search">Arama</string>
<string name="settings_info">Bilgi</string>
<string name="advanced_search">Gelişmiş Arama</string>
<string name="advanced_search_des">Sağlayıcı tarafından ayrılmış arama sonuçlarını verir</string>
<string name="bug_report_settings_off">Yalnızca çökmelerle ilgili verileri gönderir</string>
<string name="bug_report_settings_on">Hiçbir veri göndermez</string>
<string name="show_fillers_settings">Anime için doldurucu bölümü göster</string>
<string name="updates_settings">Uygulama güncellemelerini göster</string>
<string name="updates_settings_des">Başlangıçta yeni güncellemeleri otomatik olarak ara</string>
<string name="uprereleases_settings">Ön sürümlere güncelleme</string>
<string name="uprereleases_settings_des">Yalnızca tam sürümler yerine önsürüm güncellemeleri arayın</string>
<string name="github">Github</string>
<string name="lightnovel">Aynı geliştiricilerden Light novel uygulaması</string>
<string name="anim">Aynı geliştiricilerden Anime uygulaması</string>
<string name="discord">Discord\'a gelin</string>
<string name="benene">Geliştiricilere muz ver</string>
<string name="benene_des">Verilen benene</string>
<string name="app_language">Uygulama Dili</string>
<string name="no_chomecast_support_toast">Bu sağlayıcının chromecast desteği yok</string>
<string name="no_links_found_toast">Hiçbir Bağlantı Bulumamadı</string>
<string name="copy_link_toast">Bağlantı panoya kopyalandı</string>
<string name="play_episode_toast">Bölümü Oynat</string>
<string name="subs_default_reset_toast">Varsayılan değere sıfırla</string>
<string name="acra_report_toast">Üzgünüm, uygulama çöktü. Anonim bir hata raporu geliştiricilere gönderilecek</string>
<string name="season">Sezon</string>
<string name="no_season">Sezon Yok</string>
<string name="episode">Bölüm</string>
<string name="episodes">Bölümler</string>
<string name="season_short">S</string>
<string name="episode_short">B</string>
<string name="delete_file">Dosyayı Sil</string>
<string name="delete">Sil</string>
<string name="pause">Durdur</string>
<string name="resume">Sürdür</string>
<string name="delete_message">%s kalıcı olarak silinecektir. Emin misiniz?</string>
<string name="status_ongoing">Devam eden</string>
<string name="status_completed">Tamamlandı</string>
<string name="status">Durum</string>
<string name="year">Yıl</string>
<string name="rating">Derecelendirme</string>
<string name="duration">Süre</string>
<string name="site">Site</string>
<string name="synopsis">Özet</string>
<string name="queued">sıraya eklendi</string>
<string name="no_subtitles">Altyazı yok</string>
<string name="default_subtitles">Varsayılan</string>
<string name="free_storage">Bağımsız</string>
<string name="used_storage">Kullanıldı</string>
<string name="app_storage">Uygulama</string>
<string name="movies">Filmler</string>
<string name="tv_series">Televizyon Dizisi</string>
<string name="cartoons">Karikatürler</string>
<string name="anime">Anime</string>
<string name="torrent">Torrent</string>
<string name="source_error">Kaynak hatası</string>
<string name="remote_error">Uzaktan hata</string>
<string name="render_error">İşleyici hatası</string>
<string name="unexpected_error">Beklenmeyen oynatıcı hatası</string>
<string name="storage_error">İndirme hatası, depolama izinlerini kontrol et</string>
<string name="episode_action_chomecast_episode">Chromecast Bölümü</string>
<string name="episode_action_chomecast_mirror">Chromecast Yansıtma</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_browser">Tarayıcıda Oynat</string>
<string name="episode_action_copy_link">Bağlantıyı Kopyala</string>
<string name="episode_action_auto_download">Otomatik İndirme</string>
<string name="episode_action_download_mirror">İndirme Yansıması</string>
<string name="episode_action_reload_links">Bağlantıları yeniden yükle</string>
<string name="no_update_found">Güncelleme bulunamadı</string>
<string name="check_for_update">Güncellemeleri kontrol et</string>
<string name="video_lock">Kilitle</string>
<string name="video_aspect_ratio_resize">Yeniden boyutlandır</string>
<string name="video_source">Kaynak</string>
<string name="video_skip_op">OP\'u geç</string>
<string name="dont_show_again">Bir daha gösterme</string>
<string name="update">Güncelleme</string>
<string name="watch_quality_pref">Tercih edilen izleme kalitesi</string>
<string name="dns_pref">HTTPS üzerinden DNS</string>
<string name="dns_pref_summary">ISS\'in engellemelerini geçmek için kullanışlı</string>
<string name="display_subbed_dubbed_settings">Seslendirilmiş/Altyazılı Anime\'yi göster</string>
<string name="resize_fit">Ekrana sığdır</string>
<string name="resize_fill">Yay</string>
<string name="resize_zoom">Yakınlaştır</string>
<string name="general">Genel</string>
<string name="provider_lang_settings">Sağlayıcı Dilleri</string>
<string name="app_layout">Uygulama Düzeni</string>
<string name="automatic">Otomatik</string>
<string name="tv_layout">Tv Düzeni</string>
<string name="phone_layout">Telefon Düzeni</string>
<string name="primary_color_settings">Ana Renk</string>
</resources>

View file

@ -9,7 +9,6 @@
<string name="no_data">Thật tiếc! Không có kết quả nào phù hợp. Hãy thử nhập một tên khác</string>
<string name="episode_more_options_des">More Options</string>
<string name="next_episode">Tập tiếp theo</string>
<string name="result_plot" translatable="false">@string/synopsis</string>
<string name="result_tags">Thể loại</string>
<string name="result_share">Chia sẻ</string>
<string name="result_open_in_browser">Mở bằng trình duyệt</string>

View file

@ -46,6 +46,17 @@
<item>4</item>
</array>
<array name="media_type_pref">
<item>All</item>
<item>Movies and TV</item>
<item>Anime</item>
</array>
<array name="media_type_pref_values">
<item>0</item>
<item>1</item>
<item>2</item>
</array>
<array name="episode_long_click_options">
<item>@string/episode_action_chomecast_episode</item>
<item>@string/episode_action_chomecast_mirror</item>
@ -68,4 +79,48 @@
<item>7</item>
<item>8</item>
</array>
<array name="app_layout">
<item>@string/automatic</item>
<item>@string/phone_layout</item>
<item>@string/tv_layout</item>
</array>
<array name="app_layout_values">
<item>-1</item>
<item>0</item>
<item>1</item>
</array>
<string-array name="themes_overlay_names">
<item>Normal</item>
<item>Cool</item>
<item>Fire</item>
<item>Burple</item>
<item>Green</item>
<item>Apple</item>
<item>Banana</item>
<item>Party</item>
</string-array>
<string-array name="themes_overlay_names_values">
<item>Normal</item>
<item>Blue</item>
<item>Red</item>
<item>Purple</item>
<item>Green</item>
<item>GreenApple</item>
<item>Banana</item>
<item>Party</item>
</string-array>
<string-array name="themes_names">
<item>Normal</item>
<item>Amoled</item>
<item>Flashbang</item>
</string-array>
<string-array name="themes_names_values">
<item>Black</item>
<item>Amoled</item>
<item>Light</item>
</string-array>
</resources>

View file

@ -16,9 +16,8 @@
<attr name="colorSearch" format="color"/>
<attr name="colorOngoing" format="color"/>
<attr name="colorPrimaryDark" format="color"/>
<attr name="colorItemSeen" format="color"/>
<attr name="darkBackground" format="color"/>
<attr name="primaryGrayBackground" format="color"/>
<attr name="primaryBlackBackground" format="color"/>
<attr name="iconGrayBackground" format="color"/>
<attr name="boxItemBackground" format="color"/>

View file

@ -3,7 +3,6 @@
<color name="colorPrimary">#3d50fa</color>
<color name="colorPrimarySecond">@color/colorPrimary</color>
<color name="colorSearch">#303135</color> <!--#3444D1 @color/itemBackground-->
<color name="colorItemSeen">#1E1E32</color>
<color name="colorOngoing">#F53B66</color> <!--FF8181-->
<color name="colorPrimaryDark">#3700B3</color>
<color name="colorAccent">#3b65f5</color> <!-- 818fff-->
@ -11,16 +10,17 @@
<color name="primaryGrayBackground">#2B2C30</color> <!--0f0f10 0E0E10 303135 2B2C30-->
<color name="primaryBlackBackground">#111111</color> <!--1C1C20 191a1f 19181E 202125 1C1C20-->
<color name="iconGrayBackground">#1C1C20</color> <!--141419 202125-->
<color name="itemBackground">#161616</color> <!-- 17171B 1B1B20-->
<color name="boxItemBackground">#161616</color> <!-- 17171B 1B1B20-->
<color name="textColor">#e9eaee</color> <!--FFF-->
<color name="grayTextColor">#9ba0a4</color> <!-- 5e5f62-->
<color name="searchColor">@color/textColor</color> <!--DADADA-->
<color name="searchColorTransparent">#1AFFFFFF</color> <!--DADADA-->
<color name="transparent">#00000000</color>
<color name="white">#FFF</color>
<color name="black">#000</color>
<color name="dubColor">#3d50fa</color> <!--3b65f5 f18c82 8294F1-->
<color name="dubColorBg">#803B65F5</color>
<color name="subColor">#F54A3B</color> <!--F53B66 FA3D79-->
@ -34,10 +34,27 @@
<color name="darkBar">#121212</color>
<color name="videoProgress">#66B5B5B5</color> <!--66B5B5B5-->
<!--<color name="videoCache">#663D50FA</color>--> <!--66B5B5B5-->
<color name="videoColorPrimary">@color/colorPrimary</color> <!--0e09df 617EFF 3d50fa-->
<color name="iconColor">#9ba0a6</color>
<color name="usedStorageColor">#FFF</color>
<color name="freeStorageColor">#676767</color>
<!-- <color name="usedStorageColor">?attr/white</color>#fff-->
<!-- <color name="freeStorageColor">?attr/grayTextColor</color> #676767-->
<!--Light Mode -->
<color name="lightPrimaryGrayBackground">#f1f1f1</color>
<color name="lightBitDarkerGrayBackground">#fff</color>
<color name="lightGrayBackground">#eeeeee</color>
<color name="lightItemBackground">#eeeeee</color>
<color name="lightTextColor">#202125</color>
<color name="lightGrayTextColor">#5f6267</color>
<color name="lightIconColor">#5f6267</color>
<!--Other Colors -->
<color name="colorPrimaryBlue">#5664B7</color>
<color name="colorPrimaryRed">#D50000</color>
<color name="colorPrimaryPurple">#6200EA</color> <!-- Burple-->
<color name="colorPrimaryGreen">#00BFA5</color>
<color name="colorPrimaryGreenApple">#48E484</color>
<color name="colorPrimaryBanana">#E4D448</color>
<color name="colorPrimaryParty">#ea596e</color>
</resources>

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="ic_banner_background">#3242D3</color>
</resources>

View file

@ -25,9 +25,11 @@
<string name="provider_lang_key" translatable="false">provider_lang_key</string>
<string name="dns_key" translatable="false">dns_key</string>
<string name="download_path_key" translatable="false">download_path_key</string>
<string name="app_name_download_path" translatable="false">Cloudstream</string>
<string name="app_layout_key" translatable="false">app_layout_key</string>
<string name="primary_color_key" translatable="false">primary_color_key</string>
<string name="prefer_media_type_key" translatable="false">prefer_media_type_key</string>
<string name="app_theme_key" translatable="false">app_theme_key</string>
<!-- FORMAT MIGHT TRANSLATE, WILL CAUSE CRASH IF APPLIED WRONG -->
@ -279,7 +281,7 @@
<string name="resize_fill">Stretch</string>
<string name="resize_zoom">Zoom</string>
<string name="legal_notice" translatable="false">Disclaimer</string>
<string name="legal_notice">Disclaimer</string>
<string name="legal_notice_key" translatable="false">legal_notice_key</string>
<string name="legal_notice_text" translatable="false">Any legal issues regarding the content on this application
should be taken up with the actual file hosts and providers themselves as we are not affiliated with them.
@ -299,4 +301,13 @@
</string>
<string name="general">General</string>
<string name="provider_lang_settings">Provider Languages</string>
<string name="app_layout">App Layout</string>
<string name="preferred_media_settings">Preferred Media</string>
<string name="automatic">Auto</string>
<string name="tv_layout">Tv Layout</string>
<string name="phone_layout">Phone Layout</string>
<string name="primary_color_settings">Primary Color</string>
<string name="app_theme_settings">App Theme</string>
</resources>

View file

@ -8,9 +8,6 @@
<!--<item name="android:navigationBarColor">@color/darkBackground</item>-->
<item name="android:statusBarColor">?attr/iconGrayBackground</item>
<item name="android:textColorHint">@color/searchColor</item>
<item name="android:editTextColor">@color/textColor</item>
<item name="android:scrollbarThumbVertical">@null</item>
<item name="android:scrollbarThumbHorizontal">@null</item>
@ -32,22 +29,139 @@
<item name="castMiniControllerStyle">@style/CustomCastMiniController</item>
<!--<item name="mediaRouteButtonTint">?attr/colorPrimary</item>-->
<!-- Preference -->
<item name="android:textColor">?attr/textColor</item>
<item name="android:textColorSecondary">?attr/grayTextColor</item>
<item name="android:icon">?attr/grayTextColor</item>
<item name="android:textColorHint">?attr/grayTextColor</item>
<item name="android:editTextColor">?attr/textColor</item>
<item name="android:colorForeground">?attr/textColor</item>
<item name="android:colorControlHighlight">?attr/textColor</item> <!--iconRipple-->
<item name="android:windowAllowReturnTransitionOverlap">true</item>
<item name="android:windowAllowEnterTransitionOverlap">true</item>
<!--<item name="preferenceTheme">@style/PreferencesTheme</item>-->
<!-- DEF STYLE -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<item name="textColor">@color/textColor</item>
<item name="colorItemSeen">@color/colorItemSeen</item>
<item name="grayTextColor">@color/grayTextColor</item>
<item name="darkBackground">@color/primaryGrayBackground</item>
<item name="primaryGrayBackground">@color/primaryGrayBackground</item>
<item name="primaryBlackBackground">@color/primaryBlackBackground</item>
<item name="iconGrayBackground">@color/iconGrayBackground</item>
<item name="boxItemBackground">@color/itemBackground</item>
<item name="boxItemBackground">@color/boxItemBackground</item>
<item name="iconColor">@color/iconColor</item>
<item name="white">#FFF</item>
</style>
<!-- <style name="PreferencesTheme" parent="@style/Base.Theme.AppCompat">
<item name="android:textColorPrimary">?attr/textColor</item>
<item name="android:textColorSecondary">?attr/grayTextColor</item>
<item name="android:colorAccent">?attr/colorAccent</item>
<item name="android:colorControlHighlight">@color/colorPrimary</item>
<item name="android:tint">?attr/textColor</item>
</style>-->
<style name="AmoledMode">
<item name="primaryGrayBackground">@color/black</item>
<item name="primaryBlackBackground">@color/black</item>
<item name="iconGrayBackground">@color/primaryBlackBackground</item>
<item name="boxItemBackground">@color/black</item>
<item name="textColor">@color/textColor</item>
<item name="grayTextColor">@color/grayTextColor</item>
<item name="white">@color/white</item>
</style>
<style name="LightMode">
<item name="primaryGrayBackground">@color/lightPrimaryGrayBackground</item>
<item name="primaryBlackBackground">@color/lightBitDarkerGrayBackground</item>
<item name="iconGrayBackground">@color/lightGrayBackground</item>
<item name="boxItemBackground">@color/lightItemBackground</item>
<item name="textColor">@color/lightTextColor</item>
<item name="grayTextColor">@color/lightGrayTextColor</item>
<item name="white">#000</item>
</style>
<style name="OverlayPrimaryColorNormal">
<item name="colorPrimary">@color/colorPrimary</item>
<item name="android:colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<item name="colorOnPrimary">@color/colorAccent</item>
<!-- Needed for leanback fuckery -->
<item name="android:colorAccent">@color/colorAccent</item>
</style>
<style name="OverlayPrimaryColorBlue">
<item name="colorPrimary">@color/colorPrimaryBlue</item>
<item name="android:colorPrimary">@color/colorPrimaryBlue</item>
<item name="colorPrimaryDark">#4855A2</item>
<item name="colorAccent">#5A6BCB</item>
<item name="colorOnPrimary">#5A6BCB</item>
<!-- Needed for leanback fuckery -->
<item name="android:colorAccent">@color/colorPrimaryBlue</item>
</style>
<style name="OverlayPrimaryColorPurple">
<item name="colorPrimary">@color/colorPrimaryPurple</item>
<item name="android:colorPrimary">@color/colorPrimaryPurple</item>
<item name="colorPrimaryDark">#4704A3</item>
<item name="colorAccent">#7125DB</item>
<item name="colorOnPrimary">#7125DB</item>
<item name="android:colorAccent">@color/colorPrimaryPurple</item>
</style>
<style name="OverlayPrimaryColorGreen">
<item name="colorPrimary">@color/colorPrimaryGreen</item>
<item name="android:colorPrimary">@color/colorPrimaryGreen</item>
<item name="colorPrimaryDark">#007363</item>
<item name="colorAccent">#39C1AE</item>
<item name="colorOnPrimary">#39C1AE</item>
<item name="android:colorAccent">@color/colorPrimaryGreen</item>
</style>
<style name="OverlayPrimaryColorGreenApple">
<item name="colorPrimary">@color/colorPrimaryGreenApple</item>
<item name="android:colorPrimary">@color/colorPrimaryGreenApple</item>
<item name="colorPrimaryDark">#319B5A</item>
<item name="colorAccent">#51C57E</item>
<item name="colorOnPrimary">#51C57E</item>
<item name="android:colorAccent">@color/colorPrimaryGreenApple</item>
</style>
<style name="OverlayPrimaryColorRed">
<item name="colorPrimary">@color/colorPrimaryRed</item>
<item name="android:colorPrimary">@color/colorPrimaryRed</item>
<item name="colorPrimaryDark">#D53333</item>
<item name="colorAccent">#F53B3B</item>
<item name="colorOnPrimary">#EC3838</item>
<!-- Needed for leanback fuckery -->
<item name="android:colorAccent">@color/colorPrimaryRed</item>
</style>
<style name="OverlayPrimaryColorBanana">
<item name="colorPrimary">@color/colorPrimaryBanana</item>
<item name="android:colorPrimary">@color/colorPrimaryBanana</item>
<item name="colorPrimaryDark">#9B7D31</item>
<item name="colorAccent">#C5B251</item>
<item name="colorOnPrimary">#C5A851</item>
<item name="android:colorAccent">@color/colorPrimaryBanana</item>
</style>
<style name="OverlayPrimaryColorParty">
<item name="colorPrimary">@color/colorPrimaryParty</item>
<item name="android:colorPrimary">@color/colorPrimaryParty</item>
<item name="colorPrimaryDark">#C1495B</item>
<item name="colorAccent">#FD798C</item>
<item name="colorOnPrimary">#BF5968</item>
<item name="android:colorAccent">@color/colorPrimaryParty</item>
</style>
<style name="LoadedStyle">
<item name="android:navigationBarColor">?attr/darkBackground</item>
<item name="android:navigationBarColor">?attr/primaryGrayBackground</item>
<item name="android:windowBackground">?attr/primaryBlackBackground</item>
</style>
<style name="AppSearchViewStyle"
@ -161,6 +275,9 @@
</style>
<style name="NiceButton">
<!--removes shadow-->
<item name="android:stateListAnimator">@null</item>
<item name="android:padding">5dp</item>
<item name="android:layout_marginStart">5dp</item>
<item name="android:layout_marginEnd">5dp</item>

View file

@ -83,6 +83,11 @@
android:title="@string/app_language"
android:icon="@drawable/ic_baseline_language_24">
</Preference>
<Preference
android:key="@string/prefer_media_type_key"
android:title="@string/preferred_media_settings"
android:icon="@drawable/ic_baseline_play_arrow_24">
</Preference>
<Preference
android:key="@string/display_sub_key"
android:title="@string/display_subbed_dubbed_settings"
@ -104,6 +109,21 @@
android:title="@string/download_path_pref"
android:icon="@drawable/netflix_download">
</Preference>
<Preference
android:icon="@drawable/ic_baseline_tv_24"
android:key="@string/app_layout_key"
android:title="@string/app_layout">
</Preference>
<Preference
android:icon="@drawable/ic_baseline_color_lens_24"
android:key="@string/primary_color_key"
android:title="@string/primary_color_settings">
</Preference>
<Preference
android:icon="@drawable/ic_baseline_color_lens_24"
android:key="@string/app_theme_key"
android:title="@string/app_theme_settings">
</Preference>
</PreferenceCategory>
<PreferenceCategory
android:key="search"