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">
+
+