mirror of
				https://github.com/recloudstream/cloudstream.git
				synced 2024-08-15 01:53:11 +00:00 
			
		
		
		
	[Feature] Automatically download plugin, based on language setting (#172)
This commit is contained in:
		
							parent
							
								
									58593ac8da
								
							
						
					
					
						commit
						723c554bc8
					
				
					 4 changed files with 115 additions and 11 deletions
				
			
		|  | @ -45,6 +45,7 @@ import com.lagradost.cloudstream3.mvvm.logError | |||
| import com.lagradost.cloudstream3.mvvm.normalSafeApiCall | ||||
| import com.lagradost.cloudstream3.network.initClient | ||||
| import com.lagradost.cloudstream3.plugins.PluginManager | ||||
| import com.lagradost.cloudstream3.plugins.PluginManager.loadAllOnlinePlugins | ||||
| import com.lagradost.cloudstream3.plugins.PluginManager.loadSinglePlugin | ||||
| import com.lagradost.cloudstream3.receivers.VideoDownloadRestartReceiver | ||||
| import com.lagradost.cloudstream3.syncproviders.AccountManager.Companion.OAuth2Apis | ||||
|  | @ -568,7 +569,16 @@ class MainActivity : AppCompatActivity(), ColorPickerDialogListener { | |||
|                     ) { | ||||
|                         PluginManager.updateAllOnlinePluginsAndLoadThem(this@MainActivity) | ||||
|                     } else { | ||||
|                         PluginManager.loadAllOnlinePlugins(this@MainActivity) | ||||
|                         loadAllOnlinePlugins(this@MainActivity) | ||||
|                     } | ||||
| 
 | ||||
|                     //Automatically download not existing plugins | ||||
|                     if (settingsManager.getBoolean( | ||||
|                             getString(R.string.auto_download_plugins_key), | ||||
|                             false | ||||
|                         ) | ||||
|                     ) { | ||||
|                         PluginManager.downloadNotExistingPluginsAndLoad(this@MainActivity) | ||||
|                     } | ||||
|                 } | ||||
| 
 | ||||
|  |  | |||
|  | @ -13,11 +13,13 @@ import androidx.core.app.NotificationManagerCompat | |||
| import com.fasterxml.jackson.annotation.JsonProperty | ||||
| import com.google.gson.Gson | ||||
| import com.lagradost.cloudstream3.* | ||||
| import com.lagradost.cloudstream3.APIHolder.getApiProviderLangSettings | ||||
| import com.lagradost.cloudstream3.APIHolder.removePluginMapping | ||||
| import com.lagradost.cloudstream3.AcraApplication.Companion.getKey | ||||
| import com.lagradost.cloudstream3.AcraApplication.Companion.removeKey | ||||
| import com.lagradost.cloudstream3.AcraApplication.Companion.setKey | ||||
| import com.lagradost.cloudstream3.CommonActivity.showToast | ||||
| import com.lagradost.cloudstream3.MainAPI.Companion.settingsForProvider | ||||
| import com.lagradost.cloudstream3.MainActivity.Companion.afterPluginsLoadedEvent | ||||
| import com.lagradost.cloudstream3.mvvm.debugPrint | ||||
| import com.lagradost.cloudstream3.mvvm.logError | ||||
|  | @ -26,6 +28,8 @@ import com.lagradost.cloudstream3.plugins.RepositoryManager.ONLINE_PLUGINS_FOLDE | |||
| import com.lagradost.cloudstream3.plugins.RepositoryManager.PREBUILT_REPOSITORIES | ||||
| import com.lagradost.cloudstream3.plugins.RepositoryManager.downloadPluginToFile | ||||
| import com.lagradost.cloudstream3.plugins.RepositoryManager.getRepoPlugins | ||||
| import com.lagradost.cloudstream3.ui.result.UiText | ||||
| import com.lagradost.cloudstream3.ui.result.txt | ||||
| import com.lagradost.cloudstream3.ui.settings.extensions.REPOSITORIES_KEY | ||||
| import com.lagradost.cloudstream3.ui.settings.extensions.RepositoryData | ||||
| import com.lagradost.cloudstream3.utils.Coroutines.main | ||||
|  | @ -219,9 +223,7 @@ object PluginManager { | |||
|     fun updateAllOnlinePluginsAndLoadThem(activity: Activity) { | ||||
|         // Load all plugins as fast as possible! | ||||
|         loadAllOnlinePlugins(activity) | ||||
| 
 | ||||
|             afterPluginsLoadedEvent.invoke(true) | ||||
| 
 | ||||
|         afterPluginsLoadedEvent.invoke(true) | ||||
| 
 | ||||
|         val urls = (getKey<Array<RepositoryData>>(REPOSITORIES_KEY) | ||||
|             ?: emptyArray()) + PREBUILT_REPOSITORIES | ||||
|  | @ -265,16 +267,98 @@ object PluginManager { | |||
|         } | ||||
| 
 | ||||
|         main { | ||||
|             createNotification(activity, updatedPlugins) | ||||
|             val uitext = txt(R.string.plugins_updated, updatedPlugins.size) | ||||
|             createNotification(activity, uitext, updatedPlugins) | ||||
|         } | ||||
| 
 | ||||
|        // ioSafe { | ||||
|         // 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 not downloaded plugins | ||||
|      * 3. Download them and reload plugins | ||||
|      **/ | ||||
|     fun downloadNotExistingPluginsAndLoad(activity: Activity) { | ||||
|         val newDownloadPlugins = mutableListOf<String>() | ||||
|         val urls = (getKey<Array<RepositoryData>>(REPOSITORIES_KEY) | ||||
|             ?: emptyArray()) + PREBUILT_REPOSITORIES | ||||
|         val onlinePlugins = urls.toList().apmap { | ||||
|             getRepoPlugins(it.url)?.toList() ?: emptyList() | ||||
|         }.flatten().distinctBy { it.second.url } | ||||
| 
 | ||||
|         val providerLang = activity.getApiProviderLangSettings() | ||||
|         //Log.i(TAG, "providerLang => ${providerLang.toJson()}") | ||||
| 
 | ||||
|         // Iterate online repos and returns not downloaded plugins | ||||
|         val notDownloadedPlugins = onlinePlugins.mapNotNull { onlineData -> | ||||
|             val sitePlugin = onlineData.second | ||||
|             //Don't include empty urls | ||||
|             if (sitePlugin.url.isBlank()) { return@mapNotNull null } | ||||
|             if (sitePlugin.repositoryUrl.isNullOrBlank()) { return@mapNotNull null } | ||||
| 
 | ||||
|             //Omit already existing plugins | ||||
|             if (getPluginPath(activity, sitePlugin.internalName, onlineData.first).exists()) { | ||||
|                 Log.i(TAG, "Skip > ${sitePlugin.internalName}") | ||||
|                 return@mapNotNull null | ||||
|             } | ||||
| 
 | ||||
|             //Omit lang not selected on language setting | ||||
|             val lang = sitePlugin.language ?: return@mapNotNull null | ||||
|             //If set to 'universal', don't skip any language | ||||
|             if (!providerLang.contains(AllLanguagesName) && !providerLang.contains(lang)) { | ||||
|                 return@mapNotNull null | ||||
|             } | ||||
|             //Log.i(TAG, "sitePlugin lang => $lang") | ||||
| 
 | ||||
|             //Omit NSFW, if disabled | ||||
|             sitePlugin.tvTypes?.let { tvtypes -> | ||||
|                 if (!settingsForProvider.enableAdult) { | ||||
|                     if (tvtypes.contains(TvType.NSFW.name)) { | ||||
|                         return@mapNotNull null | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|             val savedData = PluginData( | ||||
|                 url = sitePlugin.url, | ||||
|                 internalName = sitePlugin.internalName, | ||||
|                 isOnline = true, | ||||
|                 filePath = "", | ||||
|                 version = sitePlugin.version | ||||
|             ) | ||||
|             OnlinePluginData(savedData, onlineData) | ||||
|         } | ||||
|         //Log.i(TAG, "notDownloadedPlugins => ${notDownloadedPlugins.toJson()}") | ||||
| 
 | ||||
|         notDownloadedPlugins.apmap { pluginData -> | ||||
|             downloadAndLoadPlugin( | ||||
|                 activity, | ||||
|                 pluginData.onlineData.second.url, | ||||
|                 pluginData.savedData.internalName, | ||||
|                 pluginData.onlineData.first | ||||
|             ).let { success -> | ||||
|                 if (success) | ||||
|                     newDownloadPlugins.add(pluginData.onlineData.second.name) | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         main { | ||||
|             val uitext = txt(R.string.plugins_downloaded, newDownloadPlugins.size) | ||||
|             createNotification(activity, uitext, newDownloadPlugins) | ||||
|         } | ||||
| 
 | ||||
|         // ioSafe { | ||||
|             afterPluginsLoadedEvent.invoke(true) | ||||
|         // } | ||||
| 
 | ||||
|         Log.i(TAG, "Plugin download done!") | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Use updateAllOnlinePluginsAndLoadThem | ||||
|      * */ | ||||
|  | @ -527,12 +611,14 @@ object PluginManager { | |||
| 
 | ||||
|     private fun createNotification( | ||||
|         context: Context, | ||||
|         extensionNames: List<String> | ||||
|         uitext: UiText, | ||||
|         extensions: List<String> | ||||
|     ): Notification? { | ||||
|         try { | ||||
|             if (extensionNames.isEmpty()) return null | ||||
| 
 | ||||
|             val content = extensionNames.joinToString(", ") | ||||
|             if (extensions.isEmpty()) return null | ||||
| 
 | ||||
|             val content = extensions.joinToString(", ") | ||||
| //        main { // DON'T WANT TO SLOW IT DOWN | ||||
|             val builder = NotificationCompat.Builder(context, EXTENSIONS_CHANNEL_ID) | ||||
|                 .setAutoCancel(false) | ||||
|  | @ -541,7 +627,8 @@ object PluginManager { | |||
|                 .setSilent(true) | ||||
|                 .setPriority(NotificationCompat.PRIORITY_LOW) | ||||
|                 .setColor(context.colorFromAttribute(R.attr.colorPrimary)) | ||||
|                 .setContentTitle(context.getString(R.string.plugins_updated, extensionNames.size)) | ||||
|                 .setContentTitle(uitext.asString(context)) | ||||
|                 //.setContentTitle(context.getString(title, extensionNames.size)) | ||||
|                 .setSmallIcon(R.drawable.ic_baseline_extension_24) | ||||
|                 .setStyle( | ||||
|                     NotificationCompat.BigTextStyle() | ||||
|  |  | |||
|  | @ -6,6 +6,7 @@ | |||
|     <string name="search_types_list_key" translatable="false">search_type_list</string> | ||||
|     <string name="auto_update_key" translatable="false">auto_update</string> | ||||
|     <string name="auto_update_plugins_key" translatable="false">auto_update_plugins</string> | ||||
|     <string name="auto_download_plugins_key" translatable="false">auto_download_plugins_key</string> | ||||
|     <string name="skip_update_key" translatable="false">skip_update_key</string> | ||||
|     <string name="prerelease_update_key" translatable="false">prerelease_update</string> | ||||
|     <string name="manual_check_update_key" translatable="false">manual_check_update</string> | ||||
|  | @ -269,6 +270,7 @@ | |||
|     <string name="pref_filter_search_quality">Hide selected video quality on Search results</string> | ||||
| 
 | ||||
|     <string name="automatic_plugin_updates">Automatic plugin updates</string> | ||||
|     <string name="automatic_plugin_download">Automatically download plugins</string> | ||||
|     <string name="updates_settings">Show app updates</string> | ||||
|     <string name="updates_settings_des">Automatically search for new updates on start</string> | ||||
|     <string name="uprereleases_settings">Update to prereleases</string> | ||||
|  |  | |||
|  | @ -33,6 +33,11 @@ | |||
|         android:icon="@drawable/ic_baseline_extension_24" | ||||
|         android:key="@string/auto_update_plugins_key" | ||||
|         android:title="@string/automatic_plugin_updates" /> | ||||
|     <SwitchPreference | ||||
|         android:defaultValue="false" | ||||
|         android:icon="@drawable/ic_baseline_extension_24" | ||||
|         android:key="@string/auto_download_plugins_key" | ||||
|         android:title="@string/automatic_plugin_download" /> | ||||
|     <SwitchPreference | ||||
|         android:icon="@drawable/ic_baseline_notifications_active_24" | ||||
|         android:summary="@string/updates_settings_des" | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue