Merge branch 'recloudstream:master' into master

This commit is contained in:
KillerDogeEmpire 2022-09-23 08:38:16 -07:00 committed by GitHub
commit 692ae2318f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 140 additions and 62 deletions

View File

@ -166,6 +166,7 @@ object CommonActivity {
"Light" -> R.style.LightMode
"Amoled" -> R.style.AmoledMode
"AmoledLight" -> R.style.AmoledModeLight
"Monet" -> R.style.MonetMode
else -> R.style.AppTheme
}
@ -188,6 +189,8 @@ object CommonActivity {
"Banana" -> R.style.OverlayPrimaryColorBanana
"Party" -> R.style.OverlayPrimaryColorParty
"Pink" -> R.style.OverlayPrimaryColorPink
"Monet" -> R.style.OverlayPrimaryColorMonet
"Monet2" -> R.style.OverlayPrimaryColorMonetTwo
else -> R.style.OverlayPrimaryColorNormal
}
act.theme.applyStyle(currentTheme, true)

View File

@ -15,6 +15,7 @@ import kotlin.coroutines.CoroutineContext
import kotlin.coroutines.EmptyCoroutineContext
const val DEBUG_EXCEPTION = "THIS IS A DEBUG EXCEPTION!"
const val DEBUG_PRINT = "DEBUG PRINT"
class DebugException(message: String) : Exception("$DEBUG_EXCEPTION\n$message")
@ -24,6 +25,12 @@ inline fun debugException(message: () -> String) {
}
}
inline fun debugPrint(tag: String = DEBUG_PRINT, message: () -> String) {
if (BuildConfig.DEBUG) {
Log.d(tag, message.invoke())
}
}
inline fun debugWarning(message: () -> String) {
if (BuildConfig.DEBUG) {
logError(DebugException(message.invoke()))

View File

@ -8,12 +8,10 @@ import android.content.res.Resources
import android.os.Environment
import android.widget.Toast
import android.content.Context
import android.content.Intent
import android.os.Build
import android.util.Log
import androidx.core.app.NotificationCompat
import androidx.core.app.NotificationManagerCompat
import androidx.core.net.toUri
import com.fasterxml.jackson.annotation.JsonProperty
import com.lagradost.cloudstream3.*
import com.lagradost.cloudstream3.AcraApplication.Companion.getKey
@ -28,6 +26,7 @@ import com.lagradost.cloudstream3.ui.settings.extensions.RepositoryData
import com.lagradost.cloudstream3.utils.VideoDownloadManager.sanitizeFilename
import com.lagradost.cloudstream3.APIHolder.removePluginMapping
import com.lagradost.cloudstream3.MainActivity.Companion.afterPluginsLoadedEvent
import com.lagradost.cloudstream3.mvvm.debugPrint
import com.lagradost.cloudstream3.mvvm.logError
import com.lagradost.cloudstream3.plugins.RepositoryManager.PREBUILT_REPOSITORIES
import com.lagradost.cloudstream3.utils.Coroutines.ioSafe
@ -37,7 +36,6 @@ import com.lagradost.cloudstream3.utils.UIHelper.colorFromAttribute
import com.lagradost.cloudstream3.utils.extractorApis
import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock
import org.acra.log.debug
import java.io.File
import java.io.InputStreamReader
import java.util.*
@ -223,13 +221,14 @@ object PluginManager {
// Iterates over all offline plugins, compares to remote repo and returns the plugins which are outdated
val outdatedPlugins = getPluginsOnline().map { savedData ->
onlinePlugins.filter { onlineData -> savedData.internalName == onlineData.second.internalName }
onlinePlugins
.filter { onlineData -> savedData.internalName == onlineData.second.internalName }
.map { onlineData ->
OnlinePluginData(savedData, onlineData)
}
}.flatten().distinctBy { it.onlineData.second.url }
debug {
debugPrint {
"Outdated plugins: ${outdatedPlugins.filter { it.isOutdated }}"
}
@ -244,7 +243,7 @@ object PluginManager {
activity,
pluginData.onlineData.second.url,
pluginData.savedData.internalName,
pluginData.onlineData.first
File(pluginData.savedData.filePath)
).let { success ->
if (success)
updatedPlugins.add(pluginData.onlineData.second.name)
@ -417,24 +416,45 @@ object PluginManager {
) + "." + name.hashCode()
}
/**
* Used for fresh installs
* */
suspend fun downloadAndLoadPlugin(
activity: Activity,
pluginUrl: String,
internalName: String,
repositoryUrl: String
): Boolean {
try {
val folderName = getPluginSanitizedFileName(repositoryUrl) // Guaranteed unique
val fileName = getPluginSanitizedFileName(internalName)
unloadPlugin("${activity.filesDir}/${ONLINE_PLUGINS_FOLDER}/${folderName}/$fileName.cs3")
val folderName = getPluginSanitizedFileName(repositoryUrl) // Guaranteed unique
val fileName = getPluginSanitizedFileName(internalName)
val file = File("${activity.filesDir}/${ONLINE_PLUGINS_FOLDER}/${folderName}/$fileName.cs3")
downloadAndLoadPlugin(activity, pluginUrl, internalName, file)
return true
}
Log.d(TAG, "Downloading plugin: $pluginUrl to $folderName/$fileName")
/**
* Used for updates.
*
* Uses a file instead of repository url, as extensions can get moved it is better to directly
* update the files instead of getting the filepath from repo url.
* */
private suspend fun downloadAndLoadPlugin(
activity: Activity,
pluginUrl: String,
internalName: String,
file: File,
): Boolean {
try {
unloadPlugin(file.absolutePath)
Log.d(TAG, "Downloading plugin: $pluginUrl to ${file.absolutePath}")
// The plugin file needs to be salted with the repository url hash as to allow multiple repositories with the same internal plugin names
val file = downloadPluginToFile(activity, pluginUrl, fileName, folderName)
val newFile = downloadPluginToFile(pluginUrl, file)
return loadPlugin(
activity,
file ?: return false,
PluginData(internalName, pluginUrl, true, file.absolutePath, PLUGIN_VERSION_NOT_SET)
newFile ?: return false,
PluginData(internalName, pluginUrl, true, newFile.absolutePath, PLUGIN_VERSION_NOT_SET)
)
} catch (e: Exception) {
logError(e)
@ -468,7 +488,8 @@ object PluginManager {
// the NotificationChannel class is new and not in the support library
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val name = EXTENSIONS_CHANNEL_NAME //getString(R.string.channel_name)
val descriptionText = EXTENSIONS_CHANNEL_DESCRIPT//getString(R.string.channel_description)
val descriptionText =
EXTENSIONS_CHANNEL_DESCRIPT//getString(R.string.channel_description)
val importance = NotificationManager.IMPORTANCE_LOW
val channel = NotificationChannel(EXTENSIONS_CHANNEL_ID, name, importance).apply {
description = descriptionText
@ -479,10 +500,11 @@ object PluginManager {
notificationManager.createNotificationChannel(channel)
}
}
private fun createNotification(
context: Context,
extensionNames: List<String>
): Notification? {
): Notification? {
try {
if (extensionNames.isEmpty()) return null
@ -497,8 +519,10 @@ object PluginManager {
.setColor(context.colorFromAttribute(R.attr.colorPrimary))
.setContentTitle(context.getString(R.string.plugins_updated, extensionNames.size))
.setSmallIcon(R.drawable.ic_baseline_extension_24)
.setStyle(NotificationCompat.BigTextStyle()
.bigText(content))
.setStyle(
NotificationCompat.BigTextStyle()
.bigText(content)
)
.setContentText(content)
if (!hasCreatedNotChanel) {
@ -508,7 +532,7 @@ object PluginManager {
val notification = builder.build()
with(NotificationManagerCompat.from(context)) {
// notificationId is a unique int for each notification that you must define
notify((System.currentTimeMillis()/1000).toInt(), notification)
notify((System.currentTimeMillis() / 1000).toInt(), notification)
}
return notification
} catch (e: Exception) {

View File

@ -84,7 +84,7 @@ object RepositoryManager {
// Normal parsed function not working?
// return response.parsedSafe()
tryParseJson<Array<SitePlugin>>(response.text)?.toList() ?: emptyList()
} catch (t : Throwable) {
} catch (t: Throwable) {
logError(t)
emptyList()
}
@ -102,9 +102,27 @@ object RepositoryManager {
}.flatten()
}
suspend fun downloadPluginToFile(
pluginUrl: String,
file: File
): File? {
return suspendSafeApiCall {
file.mkdirs()
// Overwrite if exists
if (file.exists()) { file.delete() }
file.createNewFile()
val body = app.get(pluginUrl).okhttpResponse.body
write(body.byteStream(), file.outputStream())
file
}
}
suspend fun downloadPluginToFile(
context: Context,
pluginUrl: String,
/** Filename without .cs3 */
fileName: String,
folder: String
): File? {

View File

@ -3,21 +3,19 @@ package com.lagradost.cloudstream3.ui.settings.extensions
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.fasterxml.jackson.annotation.JsonProperty
import com.lagradost.cloudstream3.AcraApplication.Companion.getKey
import com.lagradost.cloudstream3.R
import com.lagradost.cloudstream3.apmap
import com.lagradost.cloudstream3.mvvm.Some
import com.lagradost.cloudstream3.mvvm.debugAssert
import com.lagradost.cloudstream3.mvvm.launchSafe
import com.lagradost.cloudstream3.plugins.PluginManager
import com.lagradost.cloudstream3.plugins.PluginManager.getPluginsOnline
import com.lagradost.cloudstream3.plugins.RepositoryManager
import com.lagradost.cloudstream3.plugins.RepositoryManager.PREBUILT_REPOSITORIES
import com.lagradost.cloudstream3.ui.result.UiText
import com.lagradost.cloudstream3.ui.result.txt
import kotlinx.coroutines.launch
import com.lagradost.cloudstream3.utils.Coroutines.ioSafe
data class RepositoryData(
@JsonProperty("name") val name: String,
@ -46,7 +44,8 @@ class ExtensionsViewModel : ViewModel() {
val pluginStats: LiveData<Some<PluginStats>> = _pluginStats
//TODO CACHE GET REQUESTS
fun loadStats() = viewModelScope.launchSafe {
// DO not use viewModelScope.launchSafe, it will ANR on slow internet
fun loadStats() = ioSafe {
val urls = (getKey<Array<RepositoryData>>(REPOSITORIES_KEY)
?: emptyArray()) + PREBUILT_REPOSITORIES
@ -61,6 +60,7 @@ class ExtensionsViewModel : ViewModel() {
PluginManager.OnlinePluginData(savedData, onlineData)
}
}.flatten().distinctBy { it.onlineData.second.url }
val total = onlinePlugins.count()
val disabled = outdatedPlugins.count { it.isDisabled }
val downloadedTotal = outdatedPlugins.count()

View File

@ -14,19 +14,6 @@
<item>@id/cast_button_type_forward_30_seconds</item>
</array>
<array name="media_type_pref">
<item>Todos</item>
<item>Películas y TV</item>
<item>Anime</item>
<item>Documental</item>
</array>
<array name="media_type_pref_values">
<item>0</item>
<item>1</item>
<item>2</item>
<item>3</item>
</array>
<array name="limit_title_rez_pref_names">
<item>@string/resolution_and_title</item>
<item>@string/title</item>
@ -223,6 +210,8 @@
<item>Banana</item>
<item>Fiesta</item>
<item>Dolor rosa</item>
<item>Material You</item>
<item>Material You (Secondary)</item>
</string-array>
<string-array name="themes_overlay_names_values">
<item>Normal</item>
@ -242,19 +231,24 @@
<item>Banana</item>
<item>Party</item>
<item>Pink</item>
<item>Monet</item>
<item>Monet2</item>
</string-array>
<string-array name="themes_names">
<item>Oscuro</item>
<item>Gris</item>
<item>Amoled</item>
<item>Destello</item>
<item>Material You</item>
</string-array>
<string-array name="themes_names_values">
<item>AmoledLight</item>
<item>Black</item>
<item>Amoled</item>
<item>Light</item>
<item>Monet</item>
</string-array>
<!--https://github.com/videolan/vlc-android/blob/72ccfb93db027b49855760001d1a930fa657c5a8/application/resources/src/main/res/values/arrays.xml#L266-->

View File

@ -219,6 +219,8 @@
<item>Bananowy</item>
<item>Łososiowy</item>
<item>Świnko peppowy</item>
<item>Material You</item>
<item>Material You (drugorzędny)</item>
</string-array>
<string-array name="themes_overlay_names_values">
<item>Normal</item>
@ -238,19 +240,24 @@
<item>Banana</item>
<item>Party</item>
<item>Pink</item>
<item>Monet</item>
<item>Monet2</item>
</string-array>
<string-array name="themes_names">
<item>Ciemny</item>
<item>Szary</item>
<item>Amoled</item>
<item>Flashbang</item>
<item>Material You</item>
</string-array>
<string-array name="themes_names_values">
<item>AmoledLight</item>
<item>Black</item>
<item>Amoled</item>
<item>Light</item>
<item>Monet</item>
</string-array>
<!--https://github.com/videolan/vlc-android/blob/72ccfb93db027b49855760001d1a930fa657c5a8/application/resources/src/main/res/values/arrays.xml#L266-->

View File

@ -14,19 +14,6 @@
<item>@id/cast_button_type_forward_30_seconds</item>
</array>
<array name="media_type_pref">
<item>Hepsi</item>
<item>Film ve Dizi</item>
<item>Anime</item>
<item>Belgesel</item>
</array>
<array name="media_type_pref_values">
<item>0</item>
<item>1</item>
<item>2</item>
<item>3</item>
</array>
<array name="limit_title_rez_pref_names">
<item>@string/resolution_and_title</item>
<item>@string/title</item>
@ -223,6 +210,8 @@
<item>Muz</item>
<item>Parti</item>
<item>Pembe</item>
<item>Material You</item>
<item>Material You (Secondary)</item>
</string-array>
<string-array name="themes_overlay_names_values">
<item>Normal</item>
@ -242,19 +231,24 @@
<item>Banana</item>
<item>Party</item>
<item>Pink</item>
<item>Monet</item>
<item>Monet2</item>
</string-array>
<string-array name="themes_names">
<item>Koyu</item>
<item>Gri</item>
<item>Amoled</item>
<item>Flaş Bombası</item>
<item>Material You</item>
</string-array>
<string-array name="themes_names_values">
<item>AmoledLight</item>
<item>Black</item>
<item>Amoled</item>
<item>Light</item>
<item>Monet</item>
</string-array>
<!--https://github.com/videolan/vlc-android/blob/72ccfb93db027b49855760001d1a930fa657c5a8/application/resources/src/main/res/values/arrays.xml#L266-->

View File

@ -14,18 +14,6 @@
<item>@id/cast_button_type_forward_30_seconds</item>
</array>
<array name="media_type_pref">
<item>Tất cả</item>
<item>Phim lẻ và Phim bộ</item>
<item>Anime</item>
<item>Phim tài liệu</item>
</array>
<array name="media_type_pref_values">
<item>0</item>
<item>1</item>
<item>2</item>
<item>3</item>
</array>
<array name="limit_title_rez_pref_names">
<item>@string/resolution_and_title</item>
@ -223,6 +211,8 @@
<item>Vàng</item>
<item>Hồng</item>
<item>Hồng đậm</item>
<item>Material You</item>
<item>Material You (Secondary)</item>
</string-array>
<string-array name="themes_overlay_names_values">
<item>Normal</item>
@ -242,19 +232,24 @@
<item>Banana</item>
<item>Party</item>
<item>Pink</item>
<item>Monet</item>
<item>Monet2</item>
</string-array>
<string-array name="themes_names">
<item>Tối</item>
<item>Xám</item>
<item>Amoled</item>
<item>Sáng</item>
<item>Material You</item>
</string-array>
<string-array name="themes_names_values">
<item>AmoledLight</item>
<item>Black</item>
<item>Amoled</item>
<item>Light</item>
<item>Monet</item>
</string-array>
<!--https://github.com/videolan/vlc-android/blob/72ccfb93db027b49855760001d1a930fa657c5a8/application/resources/src/main/res/values/arrays.xml#L266-->

View File

@ -229,6 +229,8 @@
<item>Banana</item>
<item>Party</item>
<item>Pink Pain</item>
<item>Material You</item>
<item>Material You (Secondary)</item>
</string-array>
<string-array name="themes_overlay_names_values">
<item>Normal</item>
@ -248,6 +250,8 @@
<item>Banana</item>
<item>Party</item>
<item>Pink</item>
<item>Monet</item>
<item>Monet2</item>
</string-array>
<string-array name="themes_names">
@ -255,12 +259,14 @@
<item>Gray</item>
<item>Amoled</item>
<item>Flashbang</item>
<item>Material You</item>
</string-array>
<string-array name="themes_names_values">
<item>AmoledLight</item>
<item>Black</item>
<item>Amoled</item>
<item>Light</item>
<item>Monet</item>
</string-array>
<string-array name="extension_statuses">

View File

@ -95,6 +95,16 @@
<item name="white">#000</item>
</style>
<style name="MonetMode">
<item name="primaryGrayBackground">@color/material_dynamic_neutral20</item>
<item name="primaryBlackBackground">@color/material_dynamic_neutral10</item>
<item name="iconGrayBackground">@color/material_dynamic_neutral20</item>
<item name="boxItemBackground">@color/material_dynamic_neutral20</item>
<item name="textColor">@color/material_dynamic_neutral90</item>
<item name="grayTextColor">@color/material_dynamic_neutral60</item>
<item name="white">@color/material_dynamic_neutral90</item>
</style>
<style name="OverlayPrimaryColorNormal">
<item name="colorPrimary">@color/colorPrimary</item>
<item name="android:colorPrimary">@color/colorPrimary</item>
@ -105,6 +115,26 @@
<item name="android:colorAccent">@color/colorAccent</item>
</style>
<style name="OverlayPrimaryColorMonet">
<item name="colorPrimary">@color/material_dynamic_primary80</item>
<item name="android:colorPrimary">@color/material_dynamic_primary80</item>
<item name="colorPrimaryDark">@color/material_dynamic_primary30</item>
<item name="colorAccent">@color/material_dynamic_primary80</item>
<item name="colorOnPrimary">@color/material_dynamic_primary20</item>
<!-- Needed for leanback fuckery -->
<item name="android:colorAccent">@color/material_dynamic_primary30</item>
</style>
<style name="OverlayPrimaryColorMonetTwo">
<item name="colorPrimary">@color/material_dynamic_tertiary80</item>
<item name="android:colorPrimary">@color/material_dynamic_tertiary80</item>
<item name="colorPrimaryDark">@color/material_dynamic_tertiary30</item>
<item name="colorAccent">@color/material_dynamic_tertiary80</item>
<item name="colorOnPrimary">@color/material_dynamic_tertiary20</item>
<!-- Needed for leanback fuckery -->
<item name="android:colorAccent">@color/material_dynamic_tertiary30</item>
</style>
<style name="OverlayPrimaryColorBlue">
<item name="colorPrimary">@color/colorPrimaryBlue</item>
<item name="android:colorPrimary">@color/colorPrimaryBlue</item>