From e95d117ebcb5f6821d53be9f4cad6bd997be23f1 Mon Sep 17 00:00:00 2001 From: Sdarfeesh <50188628+Sdarfeesh@users.noreply.github.com> Date: Mon, 7 Nov 2022 18:49:53 +0800 Subject: [PATCH 1/8] Update Simplified Chinese Translation (#199) --- app/src/main/res/values-zh/strings.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index a9cc91b7..19d9bd43 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -590,4 +590,6 @@ 清除历史记录 历史记录 + 显示跳过片头/片尾弹窗 + 文本过多,无法保存到剪贴板。 From 2e7823034bc99768e119abd44131e55ba1240cc5 Mon Sep 17 00:00:00 2001 From: Davide <49226282+pizidavi@users.noreply.github.com> Date: Fri, 11 Nov 2022 16:21:56 +0100 Subject: [PATCH 2/8] Updated Italian translation (#206) --- app/src/main/res/values-it/strings.xml | 61 +++++++++++++++++++++++--- 1 file changed, 54 insertions(+), 7 deletions(-) diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 86206213..fa1653c6 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -153,6 +153,10 @@ Scorri a sinistra o a destra per controllare il tempo del video Scorri per cambiare le impostazioni Passa il dito sul lato sinistro o destro per cambiare la luminosità o il volume + + Riproduci automaticamente l\'episodio successivo + Avvia l\'episodio successivo al termine di quello in corso + Doppio tocco per andare avanti/indietro Doppio tocco per mettere in pausa Tocca due volte il lato destro o sinistro dello schermo per mandare avanti o indietro il video @@ -176,7 +180,7 @@ Cerca Accounts Aggiornamenti e Backup - + Info Ricerca avanzata Dividi i risultati della ricerca per provider @@ -185,7 +189,9 @@ Mostra tag [filler] per anime Mostra trailer Mostra poster da Kitsu + Nascondi la qualità video selezionata dai risultati di ricerca + Aggiorna automaticamente i plugin Mostra gli aggiornamenti dell\'app Cerca automaticamente nuovi aggiornamenti all\'avvio Aggiorna alle prerelease @@ -207,9 +213,12 @@ Spiacente, l\'applicazione è andata in crash. Una segnalazione anonima di bug sarà inviata agli sviluppatori Stagione + %s %d%s Nessuna stagione Episodio Episodi + %d-%d + %d %s S E Nessun episodio trovato @@ -250,6 +259,8 @@ Documentari Drama Asiatici Livestreams + NSFW + Altri Film @@ -261,6 +272,8 @@ Documentario Drama Asiatico Livestream + NSFW + Altro Source error Remote error @@ -332,7 +345,9 @@ Lingua provider Layout app Media preferito + Abilita NSFW sui provider supportati Encoding Sottotitoli + Provider Interfaccia utente Auto @@ -437,11 +452,11 @@ Errore - + Filtra in base alla lingua preferita + Extra Trailer Link allo stream - - + Referer Prossimo Guarda video in queste lingue @@ -471,6 +486,7 @@ Scaricato: %d Disabilitato: %d Non scaricato: %d + Aggiornati %d plugin Aggiungi una repository per installare l\'estensione dei siti Vedi le repository della community Lista pubblica @@ -484,10 +500,41 @@ Applica al riavvio Safe Mode abilitata - Si è verificato un crash irrecuperabile e abbiamo disabilitato automaticamente tutte le estensioni, in modo che possiate trovare e rimuovere l\'estensione che causa il problema. + Si è verificato un crash irrecuperabile. Tutte le estensioni sono state disabilitate, in modo da trovare e rimuovere l\'estensione che causa il problema. Vedi informazioni del crash + + Voto: %s + Descrizione + Versione + Stato + Dimensione + Autori + Supportati + Lingua + Prima installa l\'estensione + HLS Playlist - + Video player preferito + Player interno + VLC + MPV + Web Video Cast + Browser + App non trovata + Tutte le lingue + + Salta %s + + + Riassunto + + + Crediti + + + Cancella cronologia + Cronologia + Mostra popup per salta sigla iniziale/finale + Testo troppo lungo. Impossibile salvare negli appunti. From 639de891c6009e5b04650907cd0fccc268fbda8f Mon Sep 17 00:00:00 2001 From: SANCTI-afk <63229113+SANCTI-afk@users.noreply.github.com> Date: Fri, 11 Nov 2022 17:22:13 +0200 Subject: [PATCH 3/8] Arabic language minor update (#204) --- app/src/main/res/values-ar/strings.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index edac2760..bda3cf2a 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -20,7 +20,7 @@ CloudStream تشغيل بواسطة CloudStream - الصفحة الرئيسية + الرئيسية البحث التنزيلات الإعدادات @@ -31,8 +31,8 @@ لايوجد بيانات المزيد من الخيارات الحلقة التالية - أنواع - شارك + النوع + مشاركة فتح في الويب تخطي التحميل …تحميل @@ -230,7 +230,7 @@ تقييم المدة الزمنية موقع - ملخص + القصة في قائمة الانتظار الترجمة ليست موجودة From 81adb10c1f4111c51819b1f3d0f716d1f84d72b1 Mon Sep 17 00:00:00 2001 From: TubaApollo <86665265+TubaApollo@users.noreply.github.com> Date: Fri, 11 Nov 2022 16:22:26 +0100 Subject: [PATCH 4/8] german translation update (#210) --- app/src/main/res/values-de/strings-de.xml | 53 +++++++++++++++++++---- 1 file changed, 44 insertions(+), 9 deletions(-) diff --git a/app/src/main/res/values-de/strings-de.xml b/app/src/main/res/values-de/strings-de.xml index e1d657c7..065990c5 100644 --- a/app/src/main/res/values-de/strings-de.xml +++ b/app/src/main/res/values-de/strings-de.xml @@ -19,11 +19,11 @@ CloudStream Mit CloudStream abspielen Startseite - Suche + Suchen Downloads Einstellungen - Suche… + Suchen… Suche %s… Keine Daten vorhanden @@ -32,15 +32,15 @@ Genres Teilen In Browser öffnen - Buffern überspringen + Puffern überspringen Lädt… Am schauen Pausiert Abgeschlossen Abgebrochen - Möchte schauen - None + Geplant + Nichts Erneut anschauen Film abspielen @@ -90,7 +90,7 @@ Löschen Speichern - Players Geschwindigkeit + Player Geschwindigkeit Untertiteleinstellungen Textfarbe @@ -275,8 +275,8 @@ Quellenfehler Remotefehler Renderfehler - Unerwarteter Player-Fehler - Download-Fehler, Speicherberechtigungen prüfen + Unerwarteter Playerfehler + Downloadfehler, Speicherberechtigungen prüfen Chromecast-Episode Chromecastmirror @@ -453,7 +453,7 @@ Trailer Link zum Stream Referent - Nächste + Weiter Videos in diesen Sprachen ansehen Vorherige Einrichtung überspringen @@ -497,4 +497,39 @@ Spuren Aktivieren der NSFW auf unterstützten Anbietern Anbieter + + Bewertung: %s + Beschreibung + Version + Status + Größe + Autoren + Unterstützt + Sprache + Zuerst muss die Erweiterung installiert werden + + HLS Playlist + + Bevorzugter Videoplayer + Interner Player + VLC + MPV + Web Video Cast + Browser + App nicht gefunden + Alle Sprachen + + Überspringen %s + Opening + Ending + Zusammenfassung + Vermischte Endings + Vermischte Openings + Abspann + Intro + + Verlauf löschen + Verlauf + Überspringen Button für Openings/Endings anzeigen + Zu viel Text. Kann nicht in der Zwischenablage gespeichert werden. From 456cd2e6e2e3cd15a74b5fcb37188365df3125bf Mon Sep 17 00:00:00 2001 From: Kylianalex <66625058+Kylianalex@users.noreply.github.com> Date: Fri, 11 Nov 2022 16:22:35 +0100 Subject: [PATCH 5/8] Updated French translation (#207) Co-authored-by: Cloudburst <18114966+C10udburst@users.noreply.github.com> --- app/src/main/res/values-fr/strings.xml | 68 +++++++++++++------------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index c98173ce..e3673393 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -10,18 +10,18 @@ Aucune Donnée Plus d\'options Retour - Episode suivant + Épisode suivant Miniature Genres Partager - Ouvrir dans le naviguateur + Ouvrir dans le navigateur Passer le chargement Chargement… En visionnage - En pose + En pause Terminé Abandonné - A regarder + À regarder Aucun Lire Streamer le Torrent @@ -29,15 +29,15 @@ Sous-titres Réessayer la connection… Retour - Miniature de l\'Episode - Lire l\'Episode + Miniature de l\'Épisode + Lire l\'Épisode Télécharger Téléchargé Téléchargement Téléchargement en pause Téléchargement commencé - Echec du Téléchargement + Échec du Téléchargement Téléchargement Annulé Téléchargement Terminé Erreur lors du téléchargement des liens @@ -68,34 +68,34 @@ Couleur de fond Couleur de la fenètre Type de bordure - Elevation des sous-titres + Élévation des sous-titres Aperçu de l\'arrière-plan Police Rechercher en utilisant les fournisseurs Rechercher en utilisant les types %d Benenes données au dev Aucune Benenes donnée - Séléction automatique de la langue + Sélection automatique de la langue Télécharger les langues - Maintenir pour réinitialliser les valeurs par défault - Continer à regarder + Maintenir pour réinitialiser les valeurs par défaut + Continuer à regarder Supprimer Plus d\'info Un VPN peut être requit pour que ce fournisseur fonctionne - Ce fournisseur est un torrent, un VPN est recommendé + Ce fournisseur est un torrent, un VPN est recommandé Description Aucune description trouvée Aucune description trouvée Lecteur en mode Picture-in-Picture Continuer la lecture dans une fenêtre miniature en superposition sur d\'autres applis - Boutton de redimentionnement du lecteur + Bouton de redimensionnement du lecteur Supprimer les bordures noires Sous-titres Paramètres des sous-titres du lecteur Vitesse de lecture Ajouter l\'option de vitesse sur le lecteur Balayer pour avancer rapidement - Balayer vers la gauche ou la droite pour controler le temps du lecteur vidéo + Balayer vers la gauche ou la droite pour contrôler le temps du lecteur vidéo Balayer pour changer les paramètres Balayer sur le coté droit ou gauche pour changer le niveau de luminosité ou de volume Taper deux fois pour rechercher @@ -106,13 +106,13 @@ Rechercher Informations Recherche Avancée - Donne les résultats séparé par les fournisseur + Donne les résultats séparés par les fournisseurs N\'envoyer les données que lors d\'un crash N\'envoyer aucune données Afficher les mises-à-jour de l\'application Chercher des mises-à-jour automatiquement au démarage - Mettre à jour vers une version béta - Rechercher pour une mise à jour vers une version béta au lieu des version complètes seulement + Mettre à jour vers une version bêta + Rechercher pour une mise à jour vers une version bêta au lieu des version complètes seulement Github L\'application Light Novel par les mêmes devs Application d\'animés par les mêmes devs @@ -122,24 +122,24 @@ Language de l\'application Ce fournisseur ne supporte pas le Chromecast Aucun lien trouvé - Lien copié dans le presse-papiers + Lien copié dans le presse-papier Lecture de l\'episode Réinitialiser aux valeurs par défault - Désolé, l\'application à crashé. Un rapport de bug anonyme va être envoyé aux devloppeurs + Désolé, l\'application à crashé. Un rapport de bug anonyme va être envoyé aux développeurs Saison Pas de Saison - Episode - Episodes + Épisode + Épisodes S E Supprimer le Fichier Supprimer Pause Reprendre - Cela va supprimer définitivement %s\nÊtes vous sûr ? + Cela va supprimer définitivement %s\nÊtes-vous sûr ? En cours Terminé - Status + Statut Année Note Durée @@ -159,9 +159,9 @@ Erreur de la source Erreur distante Erreur d\'affichage - Erreur innatendue du lecteur + Erreur inattendue du lecteur Erreur du téléchargement, vérifier l\'autorisation du stockage - Episode Chromecast + Épisode Chromecast Miroir Chromecast Lecture dans l\'application Lecture dans %s @@ -207,18 +207,18 @@ Disposition de l\'application Disposition TV Language des fournisseurs - Médias préfères + Médias préférées Auto Acteurs: %s %d min Rechercher sur %s... - A re-regarder + À re-regarder Copier Coller Effacer Enregister Importer des polices en les plaçants dans %s - Les metadonnées ne sont pas fournies par le site, le chargement de la vidéo va échoué si elle n\'existe pas sur le site. + Les metadonnées ne sont pas fournies par le site, le chargement de la vidéo va échouer si elle n\'existe pas sur le site. Afficher les logs 🐈 Sous-titres Chromecast Paramètres des sous-titres Chromecast @@ -228,7 +228,7 @@ Restaurer les données sauvegardées Sauvegarder les données Fichier de sauvegarde chargé - Echec de la restauration des données depuis le fichier + Échec de la restauration des données depuis le fichier Restauration des données réussie Permission d\'accès au stockage manquante Erreur pendant la sauvegarde %s @@ -250,7 +250,7 @@ Causera des crashs aléatoire si mit trop haut. Ne le changez pas si vous avez un appareil avec peu de ram comme une télévision android ou un vieux téléphone. Causera des problèmes si mit trop haut et si vous avez un appareil avec peu de stockage comme une télévision android ou un vieux téléphone. Bouton aléatoire - Afficher le boutton aléatoire + Afficher le bouton aléatoire Disposition émulateur Position du titre du poster Mettre le titre sous le poster @@ -272,15 +272,15 @@ Contour Déprimé Ombre - Elevation + Élévation Synchroniser les sous-titres 1000ms Délai des sous-titres Utilisez si les sous-titres sont affichés %dms trop tôt Utilisez si les sous-titres sont affichés %dms trop tard Aucun délai de sous-titre - Le rapide rendard brun saute au-dessus du chien paresseux - Recommendé + Portez ce vieux whisky au juge blond qui fume + Recommandé %s chargé Charger depuis le fichier Fichier téléchargé @@ -289,7 +289,7 @@ Arrière plan Source Aléatoire - A venir ... + À venir ... Image de l\'affiche Connecté %s Définir le statut de visionage From cf22ada266191a3421dc8a213cdcd6f9fd3833b8 Mon Sep 17 00:00:00 2001 From: Blatzar <46196380+Blatzar@users.noreply.github.com> Date: Sat, 12 Nov 2022 20:07:08 +0100 Subject: [PATCH 6/8] Fix VoeExtractor --- .../cloudstream3/extractors/VoeExtractor.kt | 33 ++++++++++--------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/com/lagradost/cloudstream3/extractors/VoeExtractor.kt b/app/src/main/java/com/lagradost/cloudstream3/extractors/VoeExtractor.kt index d2f3f832..ad3f0150 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/extractors/VoeExtractor.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/extractors/VoeExtractor.kt @@ -13,39 +13,42 @@ open class VoeExtractor : ExtractorApi() { override val requiresReferer = false private data class ResponseLinks( - @JsonProperty("hls") val url: String?, + @JsonProperty("hls") val hls: String?, + @JsonProperty("mp4") val mp4: String?, @JsonProperty("video_height") val label: Int? //val type: String // Mp4 ) override suspend fun getUrl(url: String, referer: String?): List { - val extractedLinksList: MutableList = mutableListOf() - val doc = app.get(url).text - if (doc.isNotBlank()) { - val start = "const sources =" - var src = doc.substring(doc.indexOf(start)) - src = src.substring(start.length, src.indexOf(";")) + val html = app.get(url).text + if (html.isNotBlank()) { + val src = html.substringAfter("const sources =").substringBefore(";") + // Remove last comma, it is not proper json otherwise .replace("0,", "0") - .trim() + // Make json use the proper quotes + .replace("'", "\"") + //Log.i(this.name, "Result => (src) ${src}") - parseJson(src)?.let { voelink -> - //Log.i(this.name, "Result => (voelink) ${voelink}") - val linkUrl = voelink.url - val linkLabel = voelink.label?.toString() ?: "" + parseJson(src)?.let { voeLink -> + //Log.i(this.name, "Result => (voeLink) ${voeLink}") + + // Always defaults to the hls link, but returns the mp4 if null + val linkUrl = voeLink.hls ?: voeLink.mp4 + val linkLabel = voeLink.label?.toString() ?: "" if (!linkUrl.isNullOrEmpty()) { - extractedLinksList.add( + return listOf( ExtractorLink( name = this.name, source = this.name, url = linkUrl, quality = getQualityFromName(linkLabel), referer = url, - isM3u8 = true + isM3u8 = voeLink.hls != null ) ) } } } - return extractedLinksList + return emptyList() } } \ No newline at end of file From 9a93b375f37bdec866b21965438712e312ef30f8 Mon Sep 17 00:00:00 2001 From: Blatzar <46196380+Blatzar@users.noreply.github.com> Date: Sat, 12 Nov 2022 22:29:22 +0100 Subject: [PATCH 7/8] Fixed: Lock when switching episodes Lock on RTL layouts Skipping to the next season --- .../cloudstream3/ui/player/FullScreenPlayer.kt | 2 +- .../cloudstream3/ui/result/ResultViewModel2.kt | 12 +++++++----- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/player/FullScreenPlayer.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/player/FullScreenPlayer.kt index 0f9a6548..509c2187 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/player/FullScreenPlayer.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/player/FullScreenPlayer.kt @@ -612,6 +612,7 @@ open class FullScreenPlayer : AbstractPlayerFragment() { //player_media_route_button?.isClickable = !isGone player_go_back_holder?.isGone = isGone player_sources_btt?.isGone = isGone + player_skip_episode?.isGone = isGone } private fun updateLockUI() { @@ -1101,7 +1102,6 @@ open class FullScreenPlayer : AbstractPlayerFragment() { } protected fun uiReset() { - isLocked = false isShowing = false // if nothing has loaded these buttons should not be visible diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultViewModel2.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultViewModel2.kt index 0c26f69c..da900b0a 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultViewModel2.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultViewModel2.kt @@ -1582,7 +1582,6 @@ class ResultViewModel2 : ViewModel() { return } - val episodes = currentEpisodes[indexer] val ranges = currentRanges[indexer] if (ranges?.contains(range) != true) { @@ -1594,7 +1593,6 @@ class ResultViewModel2 : ViewModel() { } } - val size = episodes?.size val isMovie = currentResponse?.isMovie() == true currentIndex = indexer currentRange = range @@ -1604,6 +1602,7 @@ class ResultViewModel2 : ViewModel() { text to r } ?: emptyList()) + val size = currentEpisodes[indexer]?.size _episodesCountText.postValue( some( if (isMovie) null else @@ -1683,9 +1682,12 @@ class ResultViewModel2 : ViewModel() { generator = if (isMovie) { getMovie()?.let { RepoLinkGenerator(listOf(it), page = currentResponse) } } else { - episodes?.let { list -> - RepoLinkGenerator(list, page = currentResponse) - } + val episodes = currentEpisodes.filter { it.key.dubStatus == indexer.dubStatus } + .toList() + .sortedBy { it.first.season } + .flatMap { it.second } + + RepoLinkGenerator(episodes, page = currentResponse) } if (isMovie) { From 2b29e8078fe540a91ccaf6b9f91b9263a80acb6f Mon Sep 17 00:00:00 2001 From: Blatzar <46196380+Blatzar@users.noreply.github.com> Date: Sun, 13 Nov 2022 01:40:49 +0100 Subject: [PATCH 8/8] Added intent to start searching --- app/src/main/AndroidManifest.xml | 11 +++++ .../lagradost/cloudstream3/MainActivity.kt | 42 +++++++++++++++---- .../syncproviders/AccountManager.kt | 3 ++ .../cloudstream3/ui/search/SearchFragment.kt | 19 ++++++++- .../main/res/navigation/mobile_navigation.xml | 7 +++- 5 files changed, 72 insertions(+), 10 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 47676059..ae8479fe 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -110,6 +110,17 @@ + + + + + + + + + + + diff --git a/app/src/main/java/com/lagradost/cloudstream3/MainActivity.kt b/app/src/main/java/com/lagradost/cloudstream3/MainActivity.kt index ff74d6cc..b999199f 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/MainActivity.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/MainActivity.kt @@ -16,11 +16,9 @@ import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AppCompatActivity import androidx.core.view.isVisible import androidx.fragment.app.FragmentActivity -import androidx.navigation.NavController -import androidx.navigation.NavDestination +import androidx.navigation.* import androidx.navigation.NavDestination.Companion.hierarchy import androidx.navigation.NavGraph.Companion.findStartDestination -import androidx.navigation.NavOptions import androidx.navigation.fragment.NavHostFragment import androidx.navigation.ui.setupWithNavController import androidx.preference.PreferenceManager @@ -44,6 +42,7 @@ import com.lagradost.cloudstream3.CommonActivity.onUserLeaveHint import com.lagradost.cloudstream3.CommonActivity.showToast import com.lagradost.cloudstream3.CommonActivity.updateLocale 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.loadSinglePlugin @@ -52,9 +51,11 @@ import com.lagradost.cloudstream3.syncproviders.AccountManager.Companion.OAuth2A import com.lagradost.cloudstream3.syncproviders.AccountManager.Companion.accountManagers import com.lagradost.cloudstream3.syncproviders.AccountManager.Companion.appString import com.lagradost.cloudstream3.syncproviders.AccountManager.Companion.appStringRepo +import com.lagradost.cloudstream3.syncproviders.AccountManager.Companion.appStringSearch import com.lagradost.cloudstream3.syncproviders.AccountManager.Companion.inAppAuths import com.lagradost.cloudstream3.ui.APIRepository import com.lagradost.cloudstream3.ui.download.DOWNLOAD_NAVIGATE_TO +import com.lagradost.cloudstream3.ui.search.SearchFragment import com.lagradost.cloudstream3.ui.search.SearchResultBuilder import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.isEmulatorSettings import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.isTvSettings @@ -88,11 +89,9 @@ import kotlinx.android.synthetic.main.activity_main.* import kotlinx.android.synthetic.main.fragment_result_swipe.* import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock -import okhttp3.ConnectionSpec -import okhttp3.OkHttpClient -import okhttp3.internal.applyConnectionSpec import java.io.File import java.net.URI +import java.net.URLDecoder import java.nio.charset.Charset import kotlin.reflect.KClass @@ -147,7 +146,7 @@ val VLC = ResultResume( val MPV = ResultResume( MPV_PACKAGE, //"is.xyz.mpv.MPVActivity.result", // resume not working :pensive: - position = "position", + position = "position", duration = "duration", ) @@ -188,6 +187,15 @@ class MainActivity : AppCompatActivity(), ColorPickerDialogListener { companion object { const val TAG = "MAINACT" + /** + * Setting this will automatically enter the query in the search + * next time the search fragment is opened. + * This variable will clear itself after one use. Null does nothing. + * + * This is a very bad solution but I was unable to find a better one. + **/ + private var nextSearchQuery: String? = null + /** * Fires every time a new batch of plugins have been loaded, no guarantee about how often this is run and on which thread * */ @@ -206,6 +214,9 @@ class MainActivity : AppCompatActivity(), ColorPickerDialogListener { isWebview: Boolean ): Boolean = with(activity) { + // Invalid URIs can crash + fun safeURI(uri: String) = normalSafeApiCall { URI(uri) } + if (str != null && this != null) { if (str.startsWith("https://cs.repo")) { val realUrl = "https://" + str.substringAfter("?") @@ -241,10 +252,14 @@ class MainActivity : AppCompatActivity(), ColorPickerDialogListener { return true } } - } else if (URI(str).scheme == appStringRepo) { + } else if (safeURI(str)?.scheme == appStringRepo) { val url = str.replaceFirst(appStringRepo, "https") loadRepository(url) return true + } else if (safeURI(str)?.scheme == appStringSearch) { + nextSearchQuery = + URLDecoder.decode(str.substringAfter("$appStringSearch://"), "UTF-8") + nav_view.selectedItemId = R.id.navigation_search } else if (!isWebview) { if (str.startsWith(DOWNLOAD_NAVIGATE_TO)) { this.navigate(R.id.navigation_downloads) @@ -619,6 +634,17 @@ class MainActivity : AppCompatActivity(), ColorPickerDialogListener { val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment val navController = navHostFragment.navController + + navController.addOnDestinationChangedListener { _: NavController, navDestination: NavDestination, bundle: Bundle? -> + // Intercept search and add a query + if (navDestination.matchDestination(R.id.navigation_search) && !nextSearchQuery.isNullOrBlank()) { + bundle?.apply { + this.putString(SearchFragment.SEARCH_QUERY, nextSearchQuery) + nextSearchQuery = null + } + } + } + //val navController = findNavController(R.id.nav_host_fragment) /*navOptions = NavOptions.Builder() diff --git a/app/src/main/java/com/lagradost/cloudstream3/syncproviders/AccountManager.kt b/app/src/main/java/com/lagradost/cloudstream3/syncproviders/AccountManager.kt index 825ff673..388e1774 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/syncproviders/AccountManager.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/syncproviders/AccountManager.kt @@ -43,6 +43,9 @@ abstract class AccountManager(private val defIndex: Int) : AuthAPI { const val appString = "cloudstreamapp" const val appStringRepo = "cloudstreamrepo" + // Instantly start the search given a query + const val appStringSearch = "cloudstreamsearch" + val unixTime: Long get() = System.currentTimeMillis() / 1000L val unixTimeMs: Long diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/search/SearchFragment.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/search/SearchFragment.kt index 4da88af7..4e59e6a0 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/search/SearchFragment.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/search/SearchFragment.kt @@ -73,6 +73,14 @@ class SearchFragment : Fragment() { } } } + + const val SEARCH_QUERY = "search_query" + + fun newInstance(query: String): Bundle { + return Bundle().apply { + putString(SEARCH_QUERY, query) + } + } } private val searchViewModel: SearchViewModel by activityViewModels() @@ -132,7 +140,8 @@ class SearchFragment : Fragment() { val default = enumValues().sorted().filter { it != TvType.NSFW } .map { it.ordinal.toString() }.toSet() val preferredTypes = (PreferenceManager.getDefaultSharedPreferences(ctx) - .getStringSet(this.getString(R.string.prefer_media_type_key), default)?.ifEmpty { default } ?: default) + .getStringSet(this.getString(R.string.prefer_media_type_key), default) + ?.ifEmpty { default } ?: default) .mapNotNull { it.toIntOrNull() ?: return@mapNotNull null } val settings = ctx.getApiSettings() @@ -487,6 +496,14 @@ class SearchFragment : Fragment() { search_master_recycler?.adapter = masterAdapter search_master_recycler?.layoutManager = GridLayoutManager(context, 1) + // Automatically search the specified query, this allows the app search to launch from intent + arguments?.getString(SEARCH_QUERY)?.let { query -> + if (query.isBlank()) return@let + main_search?.setQuery(query, true) + // Clear the query as to not make it request the same query every time the page is opened + arguments?.putString(SEARCH_QUERY, null) + } + // SubtitlesFragment.push(activity) //searchViewModel.search("iron man") //(activity as AppCompatActivity).loadResult("https://shiro.is/overlord-dubbed", "overlord-dubbed", "Shiro") diff --git a/app/src/main/res/navigation/mobile_navigation.xml b/app/src/main/res/navigation/mobile_navigation.xml index 6ae2fa04..14d750a0 100644 --- a/app/src/main/res/navigation/mobile_navigation.xml +++ b/app/src/main/res/navigation/mobile_navigation.xml @@ -274,7 +274,12 @@ app:exitAnim="@anim/exit_anim" app:popEnterAnim="@anim/enter_anim" app:popExitAnim="@anim/exit_anim" - tools:layout="@layout/fragment_search" /> + tools:layout="@layout/fragment_search"> + +