forked from recloudstream/cloudstream
Merge branch 'master' into master
This commit is contained in:
commit
8e9c11db4b
92 changed files with 1720 additions and 455 deletions
|
@ -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)
|
||||
|
|
|
@ -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 ?: ""}"
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
||||
}
|
|
@ -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(
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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> {
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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
|
||||
)
|
||||
|
|
5
app/src/main/res/color/item_select_color.xml
Normal file
5
app/src/main/res/color/item_select_color.xml
Normal 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>
|
54
app/src/main/res/drawable/ic_banner_foreground.xml
Normal file
54
app/src/main/res/drawable/ic_banner_foreground.xml
Normal 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>
|
|
@ -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"/>
|
||||
|
|
5
app/src/main/res/drawable/ic_baseline_color_lens_24.xml
Normal file
5
app/src/main/res/drawable/ic_baseline_color_lens_24.xml
Normal 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>
|
|
@ -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"/>
|
||||
|
|
|
@ -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"/>
|
||||
|
|
|
@ -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"/>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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"/>
|
||||
|
|
|
@ -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"/>
|
||||
|
|
|
@ -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"/>
|
||||
|
|
|
@ -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"/>
|
||||
|
|
|
@ -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"/>
|
||||
|
|
|
@ -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"/>
|
||||
|
|
|
@ -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"/>
|
||||
|
|
5
app/src/main/res/drawable/ic_baseline_tv_24.xml
Normal file
5
app/src/main/res/drawable/ic_baseline_tv_24.xml
Normal 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>
|
|
@ -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"/>
|
||||
|
|
|
@ -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"/>
|
||||
|
|
|
@ -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"/>
|
||||
|
|
|
@ -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>
|
||||
|
||||
|
|
|
@ -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>
|
7
app/src/main/res/drawable/video_bottom_button.xml
Normal file
7
app/src/main/res/drawable/video_bottom_button.xml
Normal 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>
|
|
@ -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"
|
||||
|
|
62
app/src/main/res/layout/activity_main_tv.xml
Normal file
62
app/src/main/res/layout/activity_main_tv.xml
Normal 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>
|
|
@ -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"
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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>
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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"
|
||||
>
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
android:layout_height="match_parent"
|
||||
android:padding="5dp"
|
||||
app:cardCornerRadius="10dp"
|
||||
app:cardBackgroundColor="?attr/primaryBlackBackground"
|
||||
android:background="?attr/primaryBlackBackground">
|
||||
|
||||
<TextView
|
||||
|
|
5
app/src/main/res/mipmap-anydpi-v26/ic_banner.xml
Normal file
5
app/src/main/res/mipmap-anydpi-v26/ic_banner.xml
Normal 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>
|
BIN
app/src/main/res/mipmap-xhdpi/ic_banner.png
Normal file
BIN
app/src/main/res/mipmap-xhdpi/ic_banner.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 3.9 KiB |
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
</resources>
|
||||
<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>
|
||||
|
|
280
app/src/main/res/values-tr/strings.xml
Normal file
280
app/src/main/res/values-tr/strings.xml
Normal 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">Açıklama</string>
|
||||
<string name="normal_no_plot">Olay örgüsü bulunamadı</string>
|
||||
<string name="torrent_no_plot">Açı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>
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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"/>
|
||||
|
|
|
@ -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>
|
4
app/src/main/res/values/ic_banner_background.xml
Normal file
4
app/src/main/res/values/ic_banner_background.xml
Normal file
|
@ -0,0 +1,4 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<color name="ic_banner_background">#3242D3</color>
|
||||
</resources>
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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"
|
||||
|
|
Loading…
Reference in a new issue