diff --git a/app/src/main/java/com/lagradost/cloudstream3/MainActivity.kt b/app/src/main/java/com/lagradost/cloudstream3/MainActivity.kt index b999199f..5400444f 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/MainActivity.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/MainActivity.kt @@ -561,13 +561,26 @@ class MainActivity : AppCompatActivity(), ColorPickerDialogListener { } ioSafe { + var isLoaded = false if (settingsManager.getBoolean( getString(R.string.auto_update_plugins_key), true ) ) { PluginManager.updateAllOnlinePluginsAndLoadThem(this@MainActivity) - } else { + isLoaded = true + } + //Automatically download not existing plugins + if (settingsManager.getBoolean( + getString(R.string.auto_download_plugins_key), + false + ) + ) { + PluginManager.downloadNotExistingPluginsAndLoad(this@MainActivity) + isLoaded = true + } + + if (!isLoaded) { PluginManager.loadAllOnlinePlugins(this@MainActivity) } } diff --git a/app/src/main/java/com/lagradost/cloudstream3/plugins/PluginManager.kt b/app/src/main/java/com/lagradost/cloudstream3/plugins/PluginManager.kt index 8ae054f6..a062d520 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/plugins/PluginManager.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/plugins/PluginManager.kt @@ -249,13 +249,69 @@ object PluginManager { } }.flatten().distinctBy { it.onlineData.second.url } + debugPrint { + "Outdated plugins: ${outdatedPlugins.filter { it.isOutdated }}" + } + + val updatedPlugins = mutableListOf() + + outdatedPlugins.apmap { pluginData -> + if (pluginData.isDisabled) { + //updatedPlugins.add(activity.getString(R.string.single_plugin_disabled, pluginData.onlineData.second.name)) + unloadPlugin(pluginData.savedData.filePath) + } else if (pluginData.isOutdated) { + downloadAndLoadPlugin( + activity, + pluginData.onlineData.second.url, + pluginData.savedData.internalName, + File(pluginData.savedData.filePath) + ).let { success -> + if (success) + updatedPlugins.add(pluginData.onlineData.second.name) + } + } + } + + main { + createNotification(activity, updatedPlugins, R.string.plugins_updated) + } + + ioSafe { + afterPluginsLoadedEvent.invoke(true) + } + + Log.i(TAG, "Plugin update done!") + } + + /** + * Automatically download plugins not yet existing on local + * 1. Gets all online data from online plugins repo + * 2. Fetch all undownloaded plugins + * 3. Download them and reload plugins + **/ + fun downloadNotExistingPluginsAndLoad(activity: Activity) { + // Load all plugins as fast as possible! + loadAllOnlinePlugins(activity) + + ioSafe { + afterPluginsLoadedEvent.invoke(true) + } + + val newDownloadPlugins = mutableListOf() + val urls = (getKey>(REPOSITORIES_KEY) + ?: emptyArray()) + PREBUILT_REPOSITORIES + val onlinePlugins = urls.toList().apmap { + getRepoPlugins(it.url)?.toList() ?: emptyList() + }.flatten().distinctBy { it.second.url } + // Iterate online repos and returns not downloaded plugins val notDownloadedPlugins = onlinePlugins.mapNotNull outer@{ onlineData -> val sitePlugin = onlineData.second //Don't include empty urls if (sitePlugin.url.isBlank()) { return@outer null } + if (sitePlugin.repositoryUrl.isNullOrBlank()) { return@outer null } //Omit already existing plugins - if (getPluginPath(activity, sitePlugin.internalName, onlineData.first).exists()) { + if (getPluginPath(activity, sitePlugin.internalName, sitePlugin.repositoryUrl).exists()) { //Log.i("DevDebug", "Skip > ${sitePlugin.internalName}") return@outer null } @@ -282,30 +338,6 @@ object PluginManager { } //Log.i("DevDebug", "notDownloadedPlugins => ${notDownloadedPlugins.toJson()}") - debugPrint { - "Outdated plugins: ${outdatedPlugins.filter { it.isOutdated }}" - } - - val updatedPlugins = mutableListOf() - val newDownloadPlugins = mutableListOf() - - outdatedPlugins.apmap { pluginData -> - if (pluginData.isDisabled) { - //updatedPlugins.add(activity.getString(R.string.single_plugin_disabled, pluginData.onlineData.second.name)) - unloadPlugin(pluginData.savedData.filePath) - } else if (pluginData.isOutdated) { - downloadAndLoadPlugin( - activity, - pluginData.onlineData.second.url, - pluginData.savedData.internalName, - File(pluginData.savedData.filePath) - ).let { success -> - if (success) - updatedPlugins.add(pluginData.onlineData.second.name) - } - } - } - notDownloadedPlugins.apmap { pluginData -> downloadAndLoadPlugin( activity, @@ -319,14 +351,14 @@ object PluginManager { } main { - createNotification(activity, updatedPlugins + newDownloadPlugins) + createNotification(activity, newDownloadPlugins, R.string.plugins_downloaded) } // ioSafe { afterPluginsLoadedEvent.invoke(true) // } - Log.i(TAG, "Plugin update done!") + Log.i(TAG, "Plugin download done!") } /** @@ -581,7 +613,8 @@ object PluginManager { private fun createNotification( context: Context, - extensionNames: List + extensionNames: List, + title: Int ): Notification? { try { if (extensionNames.isEmpty()) return null @@ -595,7 +628,7 @@ object PluginManager { .setSilent(true) .setPriority(NotificationCompat.PRIORITY_LOW) .setColor(context.colorFromAttribute(R.attr.colorPrimary)) - .setContentTitle(context.getString(R.string.plugins_updated, extensionNames.size)) + .setContentTitle(context.getString(title, extensionNames.size)) .setSmallIcon(R.drawable.ic_baseline_extension_24) .setStyle( NotificationCompat.BigTextStyle() diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 9381372c..db042b95 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -6,6 +6,7 @@ search_type_list auto_update auto_update_plugins + auto_download_plugins_key skip_update_key prerelease_update manual_check_update @@ -269,6 +270,7 @@ Hide selected video quality on Search results Automatic plugin updates + Automatically download plugins Show app updates Automatically search for new updates on start Update to prereleases diff --git a/app/src/main/res/xml/settings_updates.xml b/app/src/main/res/xml/settings_updates.xml index eaceb785..3a17f393 100644 --- a/app/src/main/res/xml/settings_updates.xml +++ b/app/src/main/res/xml/settings_updates.xml @@ -33,6 +33,11 @@ android:icon="@drawable/ic_baseline_extension_24" android:key="@string/auto_update_plugins_key" android:title="@string/automatic_plugin_updates" /> +