diff --git a/app/app/build.gradle.kts b/app/app/build.gradle.kts index 897f646f3..f6c5029ff 100644 --- a/app/app/build.gradle.kts +++ b/app/app/build.gradle.kts @@ -60,8 +60,8 @@ android { applicationId = "com.github.livingwithhippos.unchained" minSdk = 22 targetSdk = 35 - versionCode = 48 - versionName = "1.3.4" + versionCode = 49 + versionName = "1.3.5" javaCompileOptions { annotationProcessorOptions { @@ -170,6 +170,12 @@ android { dataBinding = true buildConfig = true } + + testOptions { + unitTests { + isIncludeAndroidResources = true + } + } } dependencies { @@ -261,5 +267,7 @@ dependencies { androidTestImplementation(libs.test.rules) androidTestImplementation(libs.test.junit) androidTestImplementation(libs.test.truth) + testImplementation(libs.test.core) testImplementation(libs.junit) + testImplementation(libs.robolectric) } \ No newline at end of file diff --git a/app/app/src/main/java/com/github/livingwithhippos/unchained/downloaddetails/view/DownloadDetailsFragment.kt b/app/app/src/main/java/com/github/livingwithhippos/unchained/downloaddetails/view/DownloadDetailsFragment.kt index 11afc9c13..fa3b7b67f 100644 --- a/app/app/src/main/java/com/github/livingwithhippos/unchained/downloaddetails/view/DownloadDetailsFragment.kt +++ b/app/app/src/main/java/com/github/livingwithhippos/unchained/downloaddetails/view/DownloadDetailsFragment.kt @@ -522,12 +522,7 @@ class DownloadDetailsFragment : UnchainedFragment(), DownloadDetailsListener { } override fun onOpenClick(url: String) { - try { - context?.openExternalWebPage(url) - } catch (e: ActivityNotFoundException) { - Timber.e("Error opening externally a link ${e.message}") - context?.showToast(R.string.no_supported_player_found) - } + context?.openExternalWebPage(url) } override fun onOpenTranscodedStream(view: View, url: String) { diff --git a/app/app/src/main/java/com/github/livingwithhippos/unchained/lists/view/ListsTabFragment.kt b/app/app/src/main/java/com/github/livingwithhippos/unchained/lists/view/ListsTabFragment.kt index 611f6eb9f..1679f9cd6 100644 --- a/app/app/src/main/java/com/github/livingwithhippos/unchained/lists/view/ListsTabFragment.kt +++ b/app/app/src/main/java/com/github/livingwithhippos/unchained/lists/view/ListsTabFragment.kt @@ -147,9 +147,6 @@ class ListsTabFragment : UnchainedFragment() { Lifecycle.State.RESUMED, ) - val listsAdapter = ListsAdapter(this) - binding.listPager.adapter = listsAdapter - binding.tabs.addOnTabSelectedListener( object : TabLayout.OnTabSelectedListener { override fun onTabSelected(tab: TabLayout.Tab?) { @@ -344,6 +341,9 @@ class ListsTabFragment : UnchainedFragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { val tabLayout: TabLayout = view.findViewById(R.id.tabs) val viewPager: ViewPager2 = view.findViewById(R.id.listPager) + + viewPager.adapter = ListsAdapter(this) + TabLayoutMediator(tabLayout, viewPager) { tab, position -> if (position == DOWNLOADS_TAB) { tab.text = getString(R.string.downloads) diff --git a/app/app/src/main/java/com/github/livingwithhippos/unchained/settings/view/SettingsFragment.kt b/app/app/src/main/java/com/github/livingwithhippos/unchained/settings/view/SettingsFragment.kt index 4580f9d49..27564c912 100644 --- a/app/app/src/main/java/com/github/livingwithhippos/unchained/settings/view/SettingsFragment.kt +++ b/app/app/src/main/java/com/github/livingwithhippos/unchained/settings/view/SettingsFragment.kt @@ -170,8 +170,7 @@ class SettingsFragment : PreferenceFragmentCompat() { private fun setupKodi() { findPreference("kodi_remote_control_info")?.setOnPreferenceClickListener { - context?.openExternalWebPage("https://kodi.wiki/view/Settings/Services/Control") - ?: false + context?.openExternalWebPage("https://kodi.wiki/view/Settings/Services/Control") == true } // todo: sistema per kodi val ipPreference = findPreference("kodi_ip_address") diff --git a/app/app/src/main/java/com/github/livingwithhippos/unchained/utilities/extension/Extension.kt b/app/app/src/main/java/com/github/livingwithhippos/unchained/utilities/extension/Extension.kt index 1178b2e01..8de55ae3d 100644 --- a/app/app/src/main/java/com/github/livingwithhippos/unchained/utilities/extension/Extension.kt +++ b/app/app/src/main/java/com/github/livingwithhippos/unchained/utilities/extension/Extension.kt @@ -234,14 +234,16 @@ fun DownloadManager.downloadFileInStandardFolder( description: String, fileName: String = title, ): EitherResult { - val request: DownloadManager.Request = - DownloadManager.Request(source) - .setTitle(title) - .setDescription(description) - .setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED) - .setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, fileName) - return try { + val request: DownloadManager.Request = + DownloadManager.Request(source) + .setTitle(title) + .setDescription(description) + .setNotificationVisibility( + DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED + ) + .setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, fileName) + val downloadID = this.enqueue(request) EitherResult.Success(downloadID) } catch (e: Exception) { @@ -334,7 +336,13 @@ fun Context.openExternalWebPage(url: String, showErrorToast: Boolean = true): Bo Intent(Intent.ACTION_VIEW, Uri.parse(url)).addCategory(Intent.CATEGORY_BROWSABLE) startActivity(webIntent) } catch (ex: android.content.ActivityNotFoundException) { - showToast(R.string.browser_not_found) + Timber.e("Error opening externally a link ${ex.message}") + showToast(R.string.browser_not_found, length = Toast.LENGTH_LONG) + } catch (ex: SecurityException) { + // the default app has marked itself as available to open these links + // but does not have exported=true in its manifest activity + Timber.e("Bugged app cannot receive external links ${ex.message}") + showToast(R.string.invalid_player_found, length = Toast.LENGTH_LONG) } return true } else if (showErrorToast) showToast(R.string.invalid_url) diff --git a/app/app/src/main/res/values-es/strings.xml b/app/app/src/main/res/values-es/strings.xml index ce31a70d5..04be2e8b5 100644 --- a/app/app/src/main/res/values-es/strings.xml +++ b/app/app/src/main/res/values-es/strings.xml @@ -205,8 +205,10 @@ Canal de notificación del estado de las descargas de torrents Descarga de torrent en curso + %d seeders %d seeder %d seeders + %d seeders seeder/s: %s %1$.2f%% - %2$.2f MB/s @@ -264,18 +266,26 @@ %d magnet %d magnets + %d magnets + %d magnets %d torrent %d torrents + %d torrents + %d torrents 1 enlace %d enlaces + %d enlaces + %d enlaces + No plugin needing an update 1 plugin needs an update. Check for a new version %d plugins need an update. Check for a new version + %d plugins need an update. Check for a new version %d plugins instalados. Reinicie la aplicación para utilizarlos. tamaño: %s @@ -482,8 +492,10 @@ Servicio Servicios + %d servicios %d servicio %d servicios + %d servicios ¿Estás seguro de que quieres continuar? Navegador @@ -492,12 +504,16 @@ Transcodificación Reciente - 1 servicio - %1$d servicios + %d servicios + %d servicio + %d servicios + %d servicios + %d dispositivos 1 dispositivo - %1$d dispositivos + %d dispositivos + %d dispositivos Añadir Mostrar el botón de streaming @@ -521,4 +537,5 @@ Dispositivos Los dispositivos remotos son computadoras, televisores o teléfonos en los que se están ejecutando servicios como Kodi y VLC. Primero, crea un dispositivo para añadir uno o más servicios. No se han encontrado credenciales + La aplicación que intentaba abrir este enlace tiene errores, instala otro reproductor diff --git a/app/app/src/main/res/values-fr/strings.xml b/app/app/src/main/res/values-fr/strings.xml index 0a367dbf8..8acb9f58d 100644 --- a/app/app/src/main/res/values-fr/strings.xml +++ b/app/app/src/main/res/values-fr/strings.xml @@ -205,7 +205,9 @@ Canal de notification pour l’état du téléchargement des torrents Téléchargement du torrent en cours - %d seeder + %d seeders + %d seeder> + %d seeders %d seeders seeder/s: %s @@ -264,18 +266,26 @@ %d magnet %d magnets + %d magnets + %d magnets %d torrent %d torrents + %d torrents + %d torrents %d lien %d liens + %d liens + %d liens + %d plugins ont besoin d\'une mise à jour %d plugin a besoin d\'une mise à jour. Vérifier si une nouvelle version est disponible %d plugins ont besoin d\'une mise à jour. Vérifier une nouvelle version + %d plugins ont besoin d\'une mise à jour. Vérifier une nouvelle version %d plugins installés. Redémarrez l\'application pour les utiliser. taille: %s @@ -482,8 +492,10 @@ Service Services + %d services %d service %d services + %d services Êtes-vous sûr de vouloir continuer ? Navigateur @@ -492,12 +504,16 @@ Transcodage Récent - %1$d service - %1$d services + %d services + %d service + %d services + %d services - %1$d dispositif - %1$d dispositifs + %d dispositif + %d dispositifs + %d dispositifs + %d dispositifs Ajouter Afficher le bouton de streaming @@ -521,4 +537,5 @@ Dispositifs Les appareils distants sont des ordinateurs, téléviseurs ou téléphones sur lesquels des services comme Kodi et VLC sont en cours d\'exécution. D\'abord, créez un appareil pour ajouter un ou plusieurs services. Aucun justificatif n\\\'a été trouvé + L\'application qui a essayé d\'ouvrir ce lien est buggée, installez un autre lecteur diff --git a/app/app/src/main/res/values-it/strings.xml b/app/app/src/main/res/values-it/strings.xml index 7870ab3a9..e790257ea 100644 --- a/app/app/src/main/res/values-it/strings.xml +++ b/app/app/src/main/res/values-it/strings.xml @@ -205,8 +205,10 @@ Canale di notifiche per il download dei torrent Download torrent in corso + %d seeders %d seeder %d seeders + %d seeders seeder/s: %s %1$.2f%% - %2$.2f MB/s @@ -267,20 +269,28 @@ Plugin non installato Nessun link + %d magnets %d magnet %d magnets + %d magnets + %d torrents %d torrent + %d torrents %d torrents - 1 link + 0 links + %d link %d links + %d links + Nessun plugin ha bisogno di un aggiornamento. 1 plugin ha bisogno di un aggiornamento. Controlla se ha una nuova versione %d plugin hanno bisogno di un aggiornamento. Controlla se hanno una nuova versione + %d plugin hanno bisogno di un aggiornamento. Controlla se hanno una nuova versione %d plugins installati. Riavvia l\'app per poterli utilizzare dimensione: %s @@ -482,8 +492,10 @@ Servizio eliminato Servizio + %d servizi %d servizio %d servizi + %d servizi Confermi di voler procedere? Browser @@ -492,14 +504,16 @@ Transcoding Recente + %1$d servizi 1 servizio %1$d servizi %1$d servizi - 1 dispositivo - %1$d dispositivi - %1$d dispositivi + Nessun dispositivo + %d dispositivo + %d dispositivi + %d dispositivi Servizi Aggiungi @@ -524,4 +538,5 @@ Dispositivi I dispositivi remoti sono computer, TV o telefoni su cui sono in esecuzione servizi come Kodi e VLC. Per prima cosa, crea un dispositivo per aggiungere uno o più servizi. Nessuna credenziale trovata + L\'applicazione che ha provato ad aprire questo link ha un bug, installa un altro media player \ No newline at end of file diff --git a/app/app/src/main/res/values/strings.xml b/app/app/src/main/res/values/strings.xml index 855e8d1ed..f618739cf 100644 --- a/app/app/src/main/res/values/strings.xml +++ b/app/app/src/main/res/values/strings.xml @@ -415,8 +415,10 @@ Notification channel for torrents download status Torrent download in progress + % seeders %d seeder %d seeders + %d seeders seeder/s: %s %1$.2f%% - %2$.2f MB/s @@ -474,21 +476,28 @@ Plugin version not compatible No links + %d magnets %d magnet %d magnets + %d magnets + %d torrents %d torrent %d torrents + %d torrents No links 1 link %d links + %d links + No plugins needing an update 1 plugin needs an update. Check for a new version %d plugins need an update. Check for a new version + %d plugins need an update. Check for a new version %d plugins installed. Restart the app to use them. S: %s @@ -701,8 +710,10 @@ Service Services + %d services %d service %d services + %d services Are you sure you want to proceed? Pick Service @@ -714,14 +725,16 @@ Show streaming button Connection error - No services + %1$d services 1 service %1$d services + %1$d services No devices 1 device %1$d devices + %1$d devices Recent: %s Default: %s @@ -742,4 +755,5 @@ Devices Remote devices are computers, TVs, or phones on which services like Kodi and VLC are running. First, create a device to add one or more services. No credentials found + The app that tried opening this link is bugged, install another player \ No newline at end of file diff --git a/app/app/src/test/java/com/github/livingwithhippos/unchained/StringResourceTest.kt b/app/app/src/test/java/com/github/livingwithhippos/unchained/StringResourceTest.kt new file mode 100644 index 000000000..1cd31052c --- /dev/null +++ b/app/app/src/test/java/com/github/livingwithhippos/unchained/StringResourceTest.kt @@ -0,0 +1,78 @@ +package com.github.livingwithhippos.unchained + +import junit.framework.TestCase.assertEquals +import org.junit.Test +import org.junit.runner.RunWith +import org.robolectric.RobolectricTestRunner +import org.robolectric.RuntimeEnvironment +import org.robolectric.annotation.Config + +@RunWith(RobolectricTestRunner::class) +class StringResourceTest { + + @Test + @Config(qualifiers = "it") + fun testPluralResourcesIt() { + val context = RuntimeEnvironment.getApplication() + + val zeroServices = + context.resources.getQuantityString(R.plurals.service_number_format, 0, 0) + val singularServices = + context.resources.getQuantityString(R.plurals.service_number_format, 1, 1) + val pluralServices = + context.resources.getQuantityString(R.plurals.service_number_format, 5, 5) + assertEquals("0 servizi", zeroServices) + assertEquals("1 servizio", singularServices) + assertEquals("5 servizi", pluralServices) + + val zeroSeeders = context.resources.getQuantityString(R.plurals.seeders_format, 0, 0) + val singularSeeders = context.resources.getQuantityString(R.plurals.seeders_format, 1, 1) + val pluralSeeders = context.resources.getQuantityString(R.plurals.seeders_format, 5, 5) + assertEquals(zeroSeeders, "0 seeders") + assertEquals(singularSeeders, "1 seeder") + assertEquals(pluralSeeders, "5 seeders") + } + + @Test + @Config(qualifiers = "en") + fun testPluralResourcesEn() { + val context = RuntimeEnvironment.getApplication() + + val zero = context.resources.getQuantityString(R.plurals.service_number_format, 0, 0) + val singular = context.resources.getQuantityString(R.plurals.service_number_format, 1, 1) + val plural = context.resources.getQuantityString(R.plurals.service_number_format, 5, 5) + + assertEquals("0 services", zero) + assertEquals("1 service", singular) + assertEquals("5 services", plural) + } + + @Test + @Config(qualifiers = "es") + fun testPluralResourcesEs() { + val context = RuntimeEnvironment.getApplication() + + val zero = context.resources.getQuantityString(R.plurals.service_number_format, 0, 0) + val singular = context.resources.getQuantityString(R.plurals.service_number_format, 1, 1) + val plural = context.resources.getQuantityString(R.plurals.service_number_format, 5, 5) + + assertEquals("0 servicios", zero) + assertEquals("1 servicio", singular) + assertEquals("5 servicios", plural) + } + + @Test + @Config(qualifiers = "fr") + fun testPluralResourcesFr() { + val context = RuntimeEnvironment.getApplication() + + val zero = context.resources.getQuantityString(R.plurals.service_number_format, 0, 0) + val singular = context.resources.getQuantityString(R.plurals.service_number_format, 1, 1) + val plural = context.resources.getQuantityString(R.plurals.service_number_format, 5, 5) + + // French 0 == 1 D; + assertEquals("0 service", zero) + assertEquals("1 service", singular) + assertEquals("5 services", plural) + } +} diff --git a/app/gradle/libs.versions.toml b/app/gradle/libs.versions.toml index ad876dbd4..eb9ecaaf5 100644 --- a/app/gradle/libs.versions.toml +++ b/app/gradle/libs.versions.toml @@ -15,7 +15,7 @@ datastore = "1.1.1" flexbox = "3.0.0" fragment = "1.8.5" hilt_navigation = "1.2.0" -jackson = "2.18.1" +jackson = "2.18.2" jakarta_xml = "4.0.2" jsoup = "1.18.2" junit = "4.13.2" @@ -35,6 +35,7 @@ preference = "1.2.1" recyclerview = "1.3.2" recyclerview_selection = "1.1.0" retrofit = "2.11.0" +robolectric = "4.14.1" room = "2.6.1" statemachine = "0.2.0" stax = "1.0-2" @@ -100,6 +101,7 @@ recyclerview_selection = { group = "androidx.recyclerview", name = "recyclerview retrofit_runtime = { group = "com.squareup.retrofit2", name = "retrofit", version.ref = "retrofit" } retrofit_moshi = { group = "com.squareup.retrofit2", name = "converter-moshi", version.ref = "retrofit" } retrofit_scalars = { group = "com.squareup.retrofit2", name = "converter-scalars", version.ref = "retrofit" } +robolectric = { group = "org.robolectric", name = "robolectric", version.ref = "robolectric" } room_runtime = { group = "androidx.room", name = "room-runtime", version.ref = "room" } room-compiler = { group = "androidx.room", name = "room-compiler", version.ref = "room" } room-ktx = { group = "androidx.room", name = "room-ktx", version.ref = "room" } diff --git a/extra_assets/plugins/1337.unchained b/extra_assets/plugins/1337.unchained deleted file mode 100644 index 9c788f4eb..000000000 --- a/extra_assets/plugins/1337.unchained +++ /dev/null @@ -1,97 +0,0 @@ -{ - "engine_version": 2.0, - "version": 2.0, - "url": "https://1337x.to", - "name": "1337x", - "description": "Parser for 1337x.to", - "supported_categories": { - "all": "None", - "anime": "Anime", - "software": "Applications", - "games": "Games", - "movies": "Movies", - "music": "Music", - "tv": "TV" - }, - "search": { - "category": "${url}/category-search/${query}/${category}/${page}/", - "no_category": "${url}/search/${query}/${page}/", - "page_start": 1 - }, - "download": { - "internal": { - "link": { - "regex_use": "first", - "regexps": [ - { - "regex": "href=\"(/torrent/[^\"]+)", - "group": 1, - "slug_type": "append_url" - } - ] - } - }, - "regexes": { - "name": { - "regex_use": "first", - "regexps": [ - { - "regex": "box-info-heading clearfix\">

([^<]+)

", - "group": 1, - "slug_type": "complete" - } - ] - }, - "magnet": { - "regex_use": "all", - "regexps": [ - { - "regex": "href=\"(magnet:\\?xt=urn:btih:[^\"]+)", - "group": 1, - "slug_type": "complete" - } - ] - }, - "seeders": { - "regex_use": "first", - "regexps": [ - { - "regex": "class=\"seeds\">\\s*(\\d+)\\s*", - "group": 1, - "slug_type": "complete" - } - ] - }, - "leechers": { - "regex_use": "first", - "regexps": [ - { - "regex": "class=\"leeches\">\\s*(\\d+)\\s*", - "group": 1, - "slug_type": "complete" - } - ] - }, - "size": { - "regex_use": "first", - "regexps": [ - { - "regex": "Total\\s*size\\s*([^>]+)", - "group": 1, - "slug_type": "complete" - } - ] - }, - "torrents": { - "regex_use": "all", - "regexps": [ - { - "regex": "(https?://itorrents\\.org/torrent/[^\\.]+\\.torrent)", - "group": 1, - "slug_type": "complete" - } - ] - } - } - } -} diff --git a/extra_assets/plugins/README.md b/extra_assets/plugins/README.md deleted file mode 100644 index 782cc99f2..000000000 --- a/extra_assets/plugins/README.md +++ /dev/null @@ -1,12 +0,0 @@ -## Unchained Search Plugin - -The plugins are simply json files editable with a text editor. - -#### Installation - -Download the `.unchained` file to your phone, open it using your file manager (personal favourite: [X-plore](https://play.google.com/store/apps/details?id=com.lonelycatgames.Xplore)) and choose Unchained as destination. If the plugin does not show up try and restart the app. - - -#### Creation - -To create a new one take inspiration from the others and read the `template.json5` file. *Important:* give it a custom name like `your_username_plugin_name.unchained` or it could be overwritten. Also give it a name like `your_username website_name`. diff --git a/extra_assets/plugins/atorrents.unchained b/extra_assets/plugins/atorrents.unchained deleted file mode 100644 index cdd5441cb..000000000 --- a/extra_assets/plugins/atorrents.unchained +++ /dev/null @@ -1,85 +0,0 @@ -{ - "engine_version": 2.0, - "version": 2.0, - "url": "https://atorrents.com", - "name": "Atorrents", - "description": "Parser for atorrents.com", - "supported_categories": { - "all": "None" - }, - "search": { - "no_category": "${url}/search/${query}?page=${page}", - "page_start": 1 - }, - "download": { - "table_indirect": { - "class": "table-striped", - "columns": { - "details_column": 0 - } - }, - "regexes": { - "details": { - "regex_use": "first", - "regexps": [ - { - "regex": "href=\"(/[^\"]{14,})", - "group": 1, - "slug_type": "append_url" - } - ] - }, - "name": { - "regex_use": "first", - "regexps": [ - { - "regex": "class=\"h4 font-weight-bold\">([^<]+)", - "group": 1, - "slug_type": "complete" - } - ] - }, - "seeders": { - "regex_use": "first", - "regexps": [ - { - "regex": "class=\"se\">([^<]+)", - "group": 1, - "slug_type": "complete" - } - ] - }, - "leechers": { - "regex_use": "first", - "regexps": [ - { - "regex": "class=\"le\">([^<]+)", - "group": 1, - "slug_type": "complete" - } - ] - }, - "magnet": { - "regex_use": "all", - "regexps": [ - { - "regex": "href=\"https://www\\.google\\.com/search\\?q=([^\"]{30,})", - "group": 1, - "slug_type": "append_other", - "other": "magnet:?xt=urn:btih:" - } - ] - }, - "size": { - "regex_use": "first", - "regexps": [ - { - "regex": "Size:\\s*([^<]+)", - "group": 1, - "slug_type": "complete" - } - ] - } - } - } -} \ No newline at end of file diff --git a/extra_assets/plugins/bitsearch.unchained b/extra_assets/plugins/bitsearch.unchained deleted file mode 100644 index baa1c377d..000000000 --- a/extra_assets/plugins/bitsearch.unchained +++ /dev/null @@ -1,88 +0,0 @@ -{ - "engine_version": 2.0, - "version": 1.0, - "url": "https://bitsearch.to", - "name": "bitsearch", - "description": "Parser for bitsearch.to", - "supported_categories": { - "all": "", - "games": "6", - "tv": "3", - "movies": "2", - "music": "7", - "books": "9", - "anime": "4", - "software": "5" - }, - "search": { - "category": "${url}/search?q=${query}&category=${category}&page=${page}", - "no_category": "${url}/search?q=${query}&page=${page}", - "page_start": 1 - }, - "download": { - "internal": { - "link": { - "regex_use": "all", - "regexps": [ - { - "regex": "href=\"(/torrents/[^\"]+)", - "group": 1, - "slug_type": "append_url" - } - ] - } - }, - "regexes": { - "name": { - "regex_use": "first", - "regexps": [ - { - "regex": "class=\"mt-0 title\">([^<]+)", - "group": 1, - "slug_type": "complete" - } - ] - }, - "magnet": { - "regex_use": "first", - "regexps": [ - { - "regex": "href=\"(magnet:\\?xt=urn:btih:[^\"]+)", - "group": 1, - "slug_type": "complete" - } - ] - }, - "seeders": { - "regex_use": "first", - "regexps": [ - { - "regex": "\\s*(\\d+)", - "group": 1, - "slug_type": "complete" - } - ] - }, - "leechers": { - "regex_use": "first", - "regexps": [ - { - "regex": "\\s*(\\d+)", - "group": 1, - "slug_type": "complete" - } - ] - }, - "size": { - "regex_use": "first", - "regexps": [ - { - "regex": "\\s*([^<]+)", - "group": 1, - "slug_type": "complete" - } - ] - } - } - } -} \ No newline at end of file diff --git a/extra_assets/plugins/fitgirl.unchained b/extra_assets/plugins/fitgirl.unchained deleted file mode 100644 index b758eab12..000000000 --- a/extra_assets/plugins/fitgirl.unchained +++ /dev/null @@ -1,50 +0,0 @@ -{ - "engine_version": 2.2, - "version": 1.0, - "url": "https://fitgirl-repacks.site", - "name": "fitgirl", - "description": "Parser for fitgirl-repacks.site", - "supported_categories": { - "all": "None" - }, - "search": { - "no_category": "https://fitgirl-repacks.site/page/${page}/?s=${query}", - "page_start": 1 - }, - "download": { - "internal": { - "link": { - "regex_use": "first", - "regexps": [ - { - "regex": "entry-title[^<]+]+>([^<]+)", - "group": 1, - "slug_type": "complete" - } - ] - }, - "magnet": { - "regex_use": "all", - "regexps": [ - { - "regex": "href=\"(magnet:\\?xt=urn:btih:[^\"]+)", - "group": 1, - "slug_type": "complete" - } - ] - } - } - } -} \ No newline at end of file diff --git a/extra_assets/plugins/isohunt_nz.unchained b/extra_assets/plugins/isohunt_nz.unchained deleted file mode 100644 index 57ca598c7..000000000 --- a/extra_assets/plugins/isohunt_nz.unchained +++ /dev/null @@ -1,87 +0,0 @@ -{ - "engine_version": 2.0, - "version": 2.0, - "url": "https://isohunt.nz", - "name": "Isohunt", - "description": "Parser for my https://isohunt.nz", - "supported_categories": { - "all": "0", - "anime": "1", - "software": "2", - "games": "3", - "movies": "5", - "music": "6", - "tv": "8", - "books": "9" - }, - "search": { - "category": "${url}/torrents/?iht=${category}&ihq=${query}", - "no_category": "${url}/torrents/?iht=0&ihq=${query}" - }, - "download": { - "internal": { - "link": { - "regex_use": "all", - "regexps": [ - { - "regex": "href=\"(/torrent_details/[^\"]+)", - "group": 1, - "slug_type": "append_url" - } - ] - } - }, - "regexes": { - "name": { - "regex_use": "first", - "regexps": [ - { - "regex": "href=\"/torrent_details/[^>]+>([^<]+)", - "group": 1, - "slug_type": "complete" - } - ] - }, - "magnet": { - "regex_use": "first", - "regexps": [ - { - "regex": "https://mylink\\.cx/\\?url=(magnet[^\"]+)", - "group": 1, - "slug_type": "complete" - } - ] - }, - "seeders": { - "regex_use": "first", - "regexps": [ - { - "regex": "class=\"seeds\">\\s*(\\d+)\\s*", - "group": 1, - "slug_type": "complete" - } - ] - }, - "size": { - "regex_use": "first", - "regexps": [ - { - "regex": "

Size ([^&]+) ", - "group": 1, - "slug_type": "complete" - } - ] - }, - "leechers": { - "regex_use": "first", - "regexps": [ - { - "regex": "class=\"leechs\">\\s*(\\d+)\\s*", - "group": 1, - "slug_type": "complete" - } - ] - } - } - } -} \ No newline at end of file diff --git a/extra_assets/plugins/magnetdl.unchained b/extra_assets/plugins/magnetdl.unchained deleted file mode 100644 index b2b015caa..000000000 --- a/extra_assets/plugins/magnetdl.unchained +++ /dev/null @@ -1,90 +0,0 @@ -{ - "engine_version": 2.0, - "version": 2.0, - "url": "https://www.magnetdl.com", - "name": "MagnetDL", - "description": "Parser for MagnetDL", - "author": "Invictaz", - "supported_categories": { - "all": "None" - }, - "search": { - "no_category": "${url}/search/?m=1&q=${query}", - "page_start": 1 - }, - "download": { - "table_direct": { - "class": "download", - "columns": { - "name_column": 1, - "seeders_column": 6, - "leechers_column": 7, - "size_column": 5, - "magnet_column": 0, - "details_column": 1 - } - }, - "regexes": { - "name": { - "regex_use": "first", - "regexps": [ - { - "regex": "title=\"([^\"]+)", - "group": 1, - "slug_type": "complete" - } - ] - }, - "seeders": { - "regex_use": "first", - "regexps": [ - { - "regex": "(\\d*)", - "group": 1, - "slug_type": "complete" - } - ] - }, - "leechers": { - "regex_use": "first", - "regexps": [ - { - "regex": "(\\d*)", - "group": 1, - "slug_type": "complete" - } - ] - }, - "size": { - "regex_use": "first", - "regexps": [ - { - "regex": "([\\w\\s.]*)", - "group": 1, - "slug_type": "complete" - } - ] - }, - "magnet": { - "regex_use": "all", - "regexps": [ - { - "regex": "href=\"(magnet:\\?xt=urn:btih:[^\"]+)", - "group": 1, - "slug_type": "complete" - } - ] - }, - "details": { - "regex_use": "first", - "regexps": [ - { - "regex": "href=\"(/file/[^\"]+)", - "group": 1, - "slug_type": "append_url" - } - ] - } - } - } -} \ No newline at end of file diff --git a/extra_assets/plugins/nyaa.unchained b/extra_assets/plugins/nyaa.unchained deleted file mode 100644 index 6e159a453..000000000 --- a/extra_assets/plugins/nyaa.unchained +++ /dev/null @@ -1,131 +0,0 @@ -{ - "engine_version": 2.5, - "version": 1.2, - "url": "https://nyaa.si", - "name": "Nyaa", - "description": "Parser for Nyaa", - "author": "morpheasgr, LivingWithHippos", - "supported_categories": { - "all": "0_0", - "anime": "1_0", - "software": "6_0", - "games": "6_2", - "music": "2_0", - "tv": "4_0", - "books": "3_0" - }, - "search": { - "category": "${url}/?q=${query}&c=${category}&p=${page}&s=${sorting}&o=${order}", - "no_category": "${url}/?q=${query}&p=${page}&s=${sorting}&o=${order}", - "page_start": 1, - "sorting": { - "comments": "comments", - "downloads": "downloads", - "size": "size", - "date": "id", - "seeders": "seeders", - "leechers": "leechers" - }, - "order": { - "ascending": "asc", - "descending": "desc" - } - }, - "download": { - "table_direct": { - "class": "torrent-list", - "columns": { - "name_column": 1, - "seeders_column": 5, - "leechers_column": 6, - "size_column": 3, - "added_date_column": 4, - "magnet_column": 2, - "torrent_column": 2, - "details_column": 1 - } - }, - "regexes": { - "magnet": { - "regex_use": "all", - "regexps": [ - { - "regex": "href=\"(magnet:\\?xt=urn:btih:[^\"]+)", - "group": 1, - "slug_type": "complete" - } - ] - }, - "torrents": { - "regex_use": "first", - "regexps": [ - { - "regex": "(\/download\/\\d+\\.torrent)", - "group": 1, - "slug_type": "append_url" - } - ] - }, - "name": { - "regex_use": "first", - "regexps": [ - { - "regex": "]+>([^<]+)", - "group": 1, - "slug_type": "complete" - }, - { - "regex": "

([^<]+)", - "group": 1, - "slug_type": "complete" - } - ] - }, - "hosting": { - "regex_use": "all", - "regexps": [ - { - "regex": "href=\"(https?://(www\\.)?rapidgator\\.(net|asia)/file/[^\"]+)", - "group": 1 - }, - { - "regex": "href=\"(https?://(www\\.)?uploadgig\\.com/file/download/\\w{16}/[^\"]+)", - "group": 1 - }, - { - "regex": "href=\"(https?://(www\\.)?nitroflare\\.com/view/[\\w]+/[^\"]+)", - "group": 1 - }, - { - "regex": "href=\"(https?://(www\\.)?nitro\\.download/view/[\\w]+/[^\"]+)", - "group": 1 - }, - { - "regex": "href=\"(https?://(www\\.)?dropapk\\.to/[^\"]+)", - "group": 1 - }, - { - "regex": "href=\"(https?://(www\\.)?turbobit\\.net/[\\w]+/[^\"]+)", - "group": 1 - }, - { - "regex": "href=\"(https?://(www\\.)?uploaded\\.(to|net)/file/[\\w]+/[^\"]+)", - "group": 1 - }, - { - "regex": "href=\"(https?://(www\\.)?drop\\.download/[^\"]+)", - "group": 1 - }, - { - "regex": "href=\"(https?://(www\\.)?fastclick\\.to/[^\"]+)", - "group": 1 - }, - { - "regex": "href=\"(https?://(www\\.)?katfile\\.com/[^\"]+)", - "group": 1 - }, - { - "regex": "href=\"(https?://(www\\.)?usersdrive\\.com/[^\"]+)", - "group": 1 - }, - { - "regex": "href=\"(https?://(www\\.)?clicknupload\\.cc/[\\w]+/[^\"]+)", - "group": 1 - }, - { - "regex": "href=\"(https?://(www\\.)?mixloads\\.com/[^\"]+)", - "group": 1 - } - ] - } - } - } -} \ No newline at end of file diff --git a/extra_assets/plugins/scene-rls.unchained b/extra_assets/plugins/scene-rls.unchained deleted file mode 100644 index 26a6db580..000000000 --- a/extra_assets/plugins/scene-rls.unchained +++ /dev/null @@ -1,96 +0,0 @@ -{ - "engine_version": 2.0, - "version": 1.2, - "url": "https://scene-rls.net", - "name": "scene-rls", - "description": "Parser for scene-rls.net", - "supported_categories": { - "all": "None" - }, - "search": { - "no_category": "${url}/page/${page}/?s=${query}&submit=Find", - "page_start": 1 - }, - "download": { - "internal": { - "link": { - "regex_use": "all", - "regexps": [ - { - "regex": "href=\"(https?:\/\/scene-rls\\.net\/[^\"]+)\"\\s+title", - "group": 1 - } - ] - } - }, - "regexes": { - "name": { - "regex_use": "first", - "regexps": [ - { - "regex": "([^<]+)", - "group": 1, - "slug_type": "complete" - } - ] - }, - "hosting": { - "regex_use": "all", - "regexps": [ - { - "regex": "href=\"(https?://(www\\.)?rapidgator\\.(net|asia)/file/[^\"]+)", - "group": 1 - }, - { - "regex": "href=\"(https?://(www\\.)?uploadgig\\.com/file/download/\\w{16}/[^\"]+)", - "group": 1 - }, - { - "regex": "href=\"(https?://(www\\.)?nitroflare\\.com/view/[\\w]+/[^\"]+)", - "group": 1 - }, - { - "regex": "href=\"(https?://(www\\.)?nitro\\.download/view/[\\w]+/[^\"]+)", - "group": 1 - }, - { - "regex": "href=\"(https?://(www\\.)?dropapk\\.to/[^\"]+)", - "group": 1 - }, - { - "regex": "href=\"(https?://(www\\.)?turbobit\\.net/[\\w]+/[^\"]+)", - "group": 1 - }, - { - "regex": "href=\"(https?://(www\\.)?uploaded\\.(to|net)/file/[\\w]+/[^\"]+)", - "group": 1 - }, - { - "regex": "href=\"(https?://(www\\.)?drop\\.download/[^\"]+)", - "group": 1 - }, - { - "regex": "href=\"(https?://(www\\.)?fastclick\\.to/[^\"]+)", - "group": 1 - }, - { - "regex": "href=\"(https?://(www\\.)?katfile\\.com/[^\"]+)", - "group": 1 - }, - { - "regex": "href=\"(https?://(www\\.)?usersdrive\\.com/[^\"]+)", - "group": 1 - }, - { - "regex": "href=\"(https?://(www\\.)?clicknupload\\.cc/[\\w]+/[^\"]+)", - "group": 1 - }, - { - "regex": "href=\"(https?://(www\\.)?mixloads\\.com/[^\"]+)", - "group": 1 - } - ] - } - } - } -} diff --git a/extra_assets/plugins/template.json5 b/extra_assets/plugins/template.json5 deleted file mode 100644 index 707f7328c..000000000 --- a/extra_assets/plugins/template.json5 +++ /dev/null @@ -1,254 +0,0 @@ -/** -* UNCHAINED FOR ANDROID SEARCH PLUGIN -* This file is a JSON5 -* Comments need to be removed before renaming this file to your_plugin.unchained -* You can try a json validator like https://jsonlint.com/ to check the validity of the file. -*/ -{ - /** - * The engine for which this plugin was developed - * used to check compatibility with the current plugin system. - * Minor versions will be compatible (e.g 1.1, 1.2, 1.3), - * Major versions will not be compatible (e.g. 2, 3) - */ - "engine_version": 2.4, - // the current plugin version. Used to check for updates - "version": 1.0, - // basic url used to replace {url}, WITHOUT trailing / - "url": "https://myurl.com", - // plugin/website name which will be shown to the user - "name": "My Site", - // optional plugin description, may contain author, links etc. Optional - "description": "Parser for my site", - // optional author name - "author": "Author name", - /** - * basic categories system. Will be used to implement a generic - * categories search system. Only the values are supposed to be changed, not the keys. - * If the service does not support categories leave only the "all" value with whatever you want - * and remove "category" under " search" - */ - "supported_categories": { - "all": "None", - "art": "Art", - "anime": "Anime", - "doujinshi": "Doujinshi", - "manga": "Manga", - "software": "Applications", - "games": "Games", - "movies": "Movies", - "pictures": "Pictures", - "videos": "Videos", - "music": "Music", - "tv": "TV", - "books": "books" - }, - /** - * Urls used to query the service. - * The slugs ${url},${query}, ${category}, ${page} are currently supported - * to build the link dynamically. - * - * "category" [OPTIONAL]: url used to search with categories - * "no_category": url used to search without categories, - * "page_start" [OPTIONAL IF NO {page} slug, default to 1]: starting page number, usually 0 or 1. - */ - "search": { - "category": "${url}/category-search/${query}/${category}/${page}/", - "no_category": "${url}/search/${query}/${page}/", - "page_start": 0 - }, - /** - * "download" will be used to get links from the "search" urls - */ - "download": { - // "internal" is one of the parsing methods. - // the links are retrieved from the search page and one by one opened and parsed - "internal": { - // "link" is the regex to parse the page link to parse further - "link": { - // "regex_use" [OPTIONAL, default "first"] can have value "first" - // (stops on the first regex of the regexps group that matches) - // or "all" (get all the regexps matches) - // if you have a single regex in the regexps array omit this or use single. - "regex_use": "first", - // "regexps" is the structure used to get matches from multiple regexps - "regexps": [ - { - "regex": "href=\"(/torrent/[^\"]+)", - "group": 1, - "slug_type": "append_other", - "other": "https://other_url.com" - } - ] - } - }, - // "direct" is one of the parsing methods. - // parse directly from the search page when the structure containing them is not a table - // usable when torrent/magnet links are directly on the search page - // and each entry is inside a class specified by "entry-class" - // uses the regexes structure to retrieve the information - "direct": { - // both of these are optional, direct can be left empty - // restrict the search to a particular class (the first one will be used). Ignored if id is set. - "class": "container", - // restrict the search to a particular id. if id is set class will be ignored - "id": "table-id", - // restrict the search of a single entry data inside a single item class. - // This is NOT OPTIONAL, we need it to separate the data on a single page - "entry-class": "entry-class-name" - }, - // "table_direct" is one of the parsing methods. - // parse directly from an html table in the search page - // usable when torrent/magnet links are directly on the table's rows - "table_direct": { - // Used to recognize the table. All are optional but only one will be used. - // If all are missing the first table in the document will be parsed. - "id": "table-id", - "class": "table-class", - // if we have multiple tables with no particular class or id we can use this to select a specific table. - // INDEX STARTS FROM ZERO NOT ONE - "index": 3, - // these are the indexes of the columns with the data. Columns start at zero. - // Name is the only one not optional, but at least one between torrent and magnet is needed. - // all regexes are optional, if missing the whole text in the corresponding cell will be taken - "columns": { - "name_column": 0, - "seeders_column": 1, - "leechers_column": 2, - "size_column": 3, - "magnet_column": 4, - "torrent_column": 5, - // details is the link to the single item's page - "details_column": 6 - } - }, - // "table_indirect" is one of the parsing methods. - // parse the page links from an html table in the search page, then does a second pass - // on those pages to retrieve the links - // usable when page links are in a table rows but torrent/magnet links aren't - "table_indirect": { - // Used to recognize the table. All are optional but only one will be used. - // If all are missing the first table in the document will be parsed. - "id": "table-id", - "class": "table-class", - // if we have multiple tables with no particular class or id we can use this to select a specific table. - // INDEX STARTS FROM ZERO NOT ONE - "index": 3, - // these are the indexes of the columns with the data. Columns start at zero. - // with table_indirect only details_column is used (and required) - // all the regexes will be applied to the detail page retrieved with this - "columns": { - "details_column": 6 - } - }, - /** - regexes is the collection of regexes available for whatever parsing method you're using - you need at least name and one between magnet, torrent or hosting. - */ - "regexes": { - // "magnet" is the link to the magnet, it's a java regex. The magnet needs to be inside parenthesis (magnet:...) - // it is optional if you use the "torrents" regex. Both can be used, at least one is necessary. - "magnet": { - "regex_use": "all", - "regexps": [ - { - // this is the regex structure used for all the regexps in this template - // java regex for the torrent link (direct links only). - // At the moment it has the dot matches all option enabled by default for regexes that do not return a list (like magnets and torrents) - "regex": "href=\"(magnet:\\?xt=urn:btih:[^\"]+)", - // group in the regexs. Use at least 1. Starts from 1. - "group": 1, - // is the link complete (www.xyz.com) or does it need to be filled (/hello.com -> www.xyz.com/hello.com) - // valid values: append_url, append_other, complete. You'd generally use complete for magnets. - // default value is complete - "slug_type": "append_url", - // if slug_type is append_other this needs to be present - "other": "https://other_url.com" - } - ] - }, - "name": { - "regex_use": "first", - "regexps": [ - { - "regex": "href=\"(/torrent/[^\"]+)", - "group": 1, - "slug_type": "append_url", - "other": "https://other_url.com" - } - ] - }, - "seeders": { - "regex_use": "first", - "regexps": [ - { - "regex": "href=\"(/torrent/[^\"]+)", - "group": 1, - "slug_type": "append_url", - "other": "https://other_url.com" - } - ] - }, - "leechers": { - "regex_use": "first", - "regexps": [ - { - "regex": "href=\"(/torrent/[^\"]+)", - "group": 1, - "slug_type": "append_url", - "other": "https://other_url.com" - } - ] - }, - "size": { - "regex_use": "first", - "regexps": [ - { - "regex": "href=\"(/torrent/[^\"]+)", - "group": 1, - "slug_type": "append_url", - "other": "https://other_url.com" - } - ] - }, - // "torrent" is the array with the regex structure used to parse the torrent, it's a java regex. The link needs to be inside parenthesis (https://...torrent) - // only direct links to .torrent files are supported, copy and paste one manually in the new download screen and try to unrestrict it to check if it works - // if you don't use this you need the magnet object to get some results. - // at the moment http links get redirected to https. If the site does not support https avoid adding it, or open an issue on Github if you REALLY need it. - // this is an array so even for a single regex you'll need the square brackets -> torrent: [{...}] - "torrents": { - "regex_use": "all", - "regexps": [ - { - "regex": "(https?://torrentsite1\\.org/torrent/[^\\.]+.torrent)", - "group": 1, - "slug_type": "complete", - "other": "https://other_url.com" - } - ] - }, - // this is used to parse hosting sites such as mega, rapidgator etc. No point in adding - // sites unsupported by real debrid so only put here those (https://real-debrid.com/compare). - "hosting": { - "regex_use": "all", - "regexps": [ - { - "regex": "(https?://hostingsite1\\.org/host/[^\\.]+.com)", - "group": 1 - } - ] - }, - "details": { - "regex_use": "all", - "regexps": [ - { - "regex": "href=\"(/torrent/[^\"]+)", - "group": 1, - "slug_type": "append_url", - "other": "https://other_url.com" - } - ] - }, - } - } -} diff --git a/extra_assets/plugins/unchained_plugins_pack.zip b/extra_assets/plugins/unchained_plugins_pack.zip deleted file mode 100644 index 44b85ce0e..000000000 Binary files a/extra_assets/plugins/unchained_plugins_pack.zip and /dev/null differ diff --git a/fastlane/metadata/android/en-US/changelogs/1.3.4.txt b/fastlane/metadata/android/en-US/changelogs/1.3.4.txt new file mode 100644 index 000000000..e2bb32ac0 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/1.3.4.txt @@ -0,0 +1,3 @@ +What's new 1.3.4: +- removed cache check support +- updated libraries diff --git a/fastlane/metadata/android/en-US/changelogs/1.3.5.txt b/fastlane/metadata/android/en-US/changelogs/1.3.5.txt new file mode 100644 index 000000000..4325a61bb --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/1.3.5.txt @@ -0,0 +1,4 @@ +What's new 1.3.5: +- removed cache check support (removed by Real Debrid) +- fixed a lot of crashes +- updated libraries