From b3ff3ec086f2fd7aa62d545da06218f64c65a732 Mon Sep 17 00:00:00 2001
From: Thanasis Trispiotis <79643637+thanasistrisp@users.noreply.github.com>
Date: Mon, 10 Oct 2022 22:42:59 +0300
Subject: [PATCH 1/6] update strings.xml Greek (#145)
* update strings.xml
Add new translations to greek language (el) and fix typos.
* remove duplicate
---
app/src/main/res/values-el/strings.xml | 401 +++++++++++++++++++++----
1 file changed, 348 insertions(+), 53 deletions(-)
diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml
index de9ac4f4..11b74938 100644
--- a/app/src/main/res/values-el/strings.xml
+++ b/app/src/main/res/values-el/strings.xml
@@ -5,39 +5,39 @@
Αναζήτηση
Λήψεις
Ρυθμίσεις
- Ψάξε…
+ Άνοιγμα με CloudStream
+ Αναζήτηση…
Πόστερ
Χωρίς δεδομένα
Περισσότερες Επιλογές
Πίσω
- Επόμενο Επισόδειο
+ Επόμενο Επεισόδιο
Πόστερ
- Πλοκή
- Genres
- Μοίρασε
+ Κατηγορίες
+ Κοινοποίηση
Άνοιγμα στον περιηγητή
- Προσπέραση φορτώματος
+ Παράλειψη φόρτωσης
Φόρτωση…
- Watching
- On-Hold
- Completed
- Dropped
- Plan to Watch
- None
+ Παρακολούθηση
+ Σε αναμονή
+ Ολοκληρώθηκε
+ Διακόπηκε
+ Για παρακολούθηση
+ Τίποτα
- Αναπαραγωγή Ταινείας
+ Αναπαραγωγή Ταινίας
Μετάδοση Torrent
Πηγές
Υπότιτλοι
- Ξανά φόρτωσε…
+ Προσπάθεια επανασύνδεσης…
Πίσω
Πόστερ
- Αναπαραγωγή Επισοδείου
-
- Λήξη
- Σφάλμα φόρτωσεις συνδέσμων
- Εσωτερικός χώρος
+ Αναπαραγωγή Επεισοδίου
+
+ Λήψη
+ Σφάλμα φόρτωσης συνδέσμων
+ Εσωτερικός χώρος αποθήκευσης
Dub
@@ -50,77 +50,372 @@
Λυπούμαστε, η εφαρμογή κατέρρευσε. Μια ανώνυμη αναφορά σφαλμάτων θα σταλεί στους προγραμματιστές
Απενεργοποιήστε την αυτόματη αναφορά σφαλμάτων
+ Εμφάνιση logcat 🐈
Παραπάνω πληροφορίες
- Κρύψιμο
+ Απόκρυψη
Κύριο Πόστερ
Αναπαραγωγή
Πληροφορίες
Next Random
- Change Provider
- Filter Bookmarks
- Bookmarks
- Remove
- Αναπαραγωγή Episode
+ Αλλαγή Παρόχου
+ Φιλτράρισμα Σελιδοδεικτών
+ Σελιδοδείκτες
+ Αφαίρεση
+ Αναπαραγωγή Επεισοδίου
Υποβολή
Ακύρωση
Ταχύτητα αναπαραγωγής
Ρυθμίσεις υπότιτλων
- Χρώμα κείμενου
+ Χρώμα κειμένου
Χρώμα περιγράμματος
Χρώμα φόντου
Χρώμα παραθύρου
Τύπος άκρων
Ύψωση υπότιτλων
- Επαναφορά στην προεπιλεγμένη τιμή
+ Επαναφορά στις προεπιλεγμένες τιμές
Προεπισκόπηση φόντου
Γραμματοσειρά
- Αναζήτηση με τους παρόχους
- Αναζήτηση με τύπους
- %d Benenes given to devs
- No Benenes given
+ Αναζήτηση βάσει παρόχων
+ Αναζήτηση βάσει τύπων
+ %d μπανάνες δόθηκαν στους προγραμματιστές
+ Καμία μπανάνα δεν δόθηκε
Αυτόματη επιλογή γλώσσας
Λήψη γλωσσών
- Κρατήστε πατημένο για επαναφορά στα προεπιλεγμένα
+ Κρατήστε πατημένο για επαναφορά στις προεπιλεγμένες τιμές
Συνέχεια Παρακολούθησης
Αφαίρεση
- Παραπάνω Πληροφορίες
+ Επιπλέον Πληροφορίες
- A VPN might be needed for this provider to work correctly
- This providers is a torrent, a VPN is recommended
+ Η χρήση ενός VPN ίσως χρειαστεί για την ομαλή λειτουργία του τρέχοντος παρόχου
+ Πρόκειται για torrent, η χρήση ενός VPN συνιστάται
Περιγραφή
Δεν βρέθηκε περιγραφή
Δεν βρέθηκε περιγραφή
- Picture-in-picture
- Συνεχίζει την αναπαραγωγή σε ένα μίνι παίκτη πάνω από άλλες εφαρμογές
- Αλλαγή μεγέθους παίκτη
+ Εικόνα-σε-Εικόνα
+ Συνεχίζει την αναπαραγωγή σε ένα μίνι παράθυρο πάνω από άλλες εφαρμογές
+ Αλλαγή μεγέθους παραθύρου
Αφαίρεση μαύρων περιγραμμάτων
Υπότιτλοι
- Ρυθμίσεις υποτίτλων του παίκτη
+ Ρυθμίσεις υποτίτλων του προγράμματος αναπαραγωγής
+ Chromecast Υπότιτλοι
+ Ρυθμίσεις Chromecast υποτίτλων
Eigengrau Mode
- Προσθέτει την επιλογή ταχύτητας στον παίκτη
- Σύρετε για seek
- Σύρετε αριστερά ή δεξιά για να ελέγξετε τον χρόνο στον παίκτη
+ Προσθέτει την επιλογή ταχύτητας στο πρόγραμμα αναπαραγωγής
+ Σύρετε για αναζήτηση
+ Σύρετε αριστερά ή δεξιά για να ελέγξετε τον χρόνο στην κάτω μπάρα
Σύρετε για να αλλάξετε ρυθμίσεις
Σύρετε αριστερά ή δεξιά για να αλλάξετε τη φωτεινότητα ή την ένταση
- Διπλό πάτημα για seek
- Διπλό πάτημα στα αριστερά ή δεξιά για seek μπροστά ή πίσω
+ Διπλό πάτημα για αναζήτηση
+ Διπλό πάτημα στα αριστερά ή δεξιά για αναζήτηση μπροστά ή πίσω
Αναζήτηση
- Πληροφορείες
+ Πληροφορίες
Προχωρημένη Αναζήτηση
- Δίνει τα αποτελέσματα αναζήτησης χωρισμένα ανά πάροχο
+ Δίνει τα αποτελέσματα αναζήτησης ταξινομημένα ανά πάροχο
Αποστέλλει δεδομένα μόνο για σφάλματα
Δεν στέλνει δεδομένα
Εμφάνιση ενημερώσεων
Αυτόματη αναζήτηση νέων ενημερώσεων
- Ενημέρωση σε προ-εκδόσεις
- Αναζητήστε ενημερώσεις προ-εκδόσεων αντί για κανονικές εκδόσεις
+ Ενημέρωση σε προ-εκδόσεις (beta)
+ Αναζητήστε ενημερώσεις προ-εκδόσεων (beta) αντί για σταθερές εκδόσεις
Github
- Light novel app by the same devs
- Anime app by the same devs
- Join Discord
- Δώσε benene στους devs
- Βenene δώθηκε
+ Ελαφριά novel εφαρμογή από τους ίδιους προγραμματιστές
+ Anime εφαρμογή από τους ίδιους προγραμματιστές
+ Εγγραφείτε στο Discord
+ Δώστε μπανάνα στους προγραμματιστές
+ Μπανάνα δόθηκε δώθηκε
+
+ Ταχύτητα (%.2fx)
+ Βαθμολογία: %.1f
+ Νέα ενημέρωση διαθέσιμη!\n%s -> %s
+
+ Πάτημα στη μέση για παύση
+ Χρήση φωτεινότητας συστήματος
+ Χρήση φωτεινότητας συστήματος στο ενσωματωμένο πρόγραμμα αναπαραγωγής αντί να εφαρμοστεί το προεπιλεγμένο σκούρο επικάλυμμα
+
+
+ Ενημέρωση προόδου παρακολούθησης
+ Αυτόματος συγχρονισμός της προόδου του τρέχοντος επεισοδίου
+
+ Επαναφορά δεδομένων από αντίγραφο ασφαλείας
+
+ Αντίγραφα ασφαλείας
+ Τα αντίγραφα ασφαλείας φορτώθηκαν
+ Η επαναφορά αντιγράφων ασφαλαείας απέτυχε από το αρχείο %s
+ Επιτυχής αποθήκευση δεδομένων
+ Δεν έχει δοθεί άδεια για πρόσβαση στον αποθηκευτικό χώρο, προσπαθήστε ξανά
+ Σφάλμα δημιουργίας αντιγράφων ασφαλείας %s
+
+ Λογαριασμοί
+ Ενημερώσεις και αντίγραφα ασφαλείας
+
+ Εμφάνιση filler επεισοδίου για anime
+ Εμφάνιση trailers
+ Εμφάνιση posters από kitsu
+ Απόκρυψη επιλεγμένης ποιότητας βίντεο στα αποτελέσματα αναζήτησης
+
+ App Language
+
+ Αυτός ο πάροχος δεν έχει υποστήριξη Chromecast
+ Δεν βρέθηκαν διαθέσιμοι σύνδεσμοι
+ Ο σύνδεσμος αντιγράφηκε στο πρόχειρο
+
+ Season
+ %s %d%s
+ No Season
+ Episode
+ Episodes
+ %d-%d
+ %d %s
+ S
+ E
+ No Episodes found
+
+ Διαγραφή αρχείου
+ Διαγραφή
+ Πάυση
+ Συνέχιση
+ Αυτό θα διαγράψει μόνιμα το %s\nΕπιβεβαίωση;
+ %dm\nαπομένουν
+
+ Σε εξέλιξη
+ Κατάσταση
+ Έτος
+ Διάρκεια
+ Ιστότοπος
+ Περίληψη
+
+ προστέθηκε στην ουρά
+ Δεν υπάρχουν διαθέσιμοι υπότιτλοι
+ Προεπιλεγμένοι υπότιτλοι
+
+ Ελέυθερος
+ Σε χρήση
+ Εφαρμογή
+
+ Ταινίες
+ Τηλεοπτικές Σειρές
+ Κινούμενα σχέδια
+ Torrents
+ Ντοκιμαντέρ
+ Ασιατικά Δράμα
+ Ζωντανές ροές
+ Άλλα
+
+ Ταινία
+ Σειρά
+ Cartoon
+ Ντοκιμαντέρ
+ Ασιατικό Δράμα
+ Ζωντανή ροή
+ Άλλο
+
+ Σφάλμα πηγής
+ Απομακρυσμένο σφάλμα
+ Σφάλμα απόδοσης
+ Μη αναμενόμενο σφάλμα αναπαραγωγής
+ Σφάλμα λήψης, επιβεβαιώστε ότι η άδεια αποθήκευσης είναι ενεργοποιημένη
+
+ Chromecast επεισόδο
+ Αναπαραγωγή εντός της εφαρμογής
+ Αναπαραγωγή σε %s
+ Αναπαραγωγή στον περιηγητή
+ Αντιγραφή συνδέσμου
+ Αυτόματη λήψη
+ Λήψη mirror
+ Επαναφόρτωση συνδέσμων
+ Λήψη υποτίτλων
+
+ Ποιότητα
+ Dub
+ Sub
+ Τίτλος
+ Εναλλαγή των στοιχείων UI στο poster
+
+ Κλείδωμα
+ Αλλαγή μεγέθους
+ Πηγή
+ Παράλειψη OP
+
+ Να μην εμφανιστεί ξανά
+ Παράλειψη της τρέχουσας ενημέρωσης
+ Ενημέρωση
+ Προτίμηση ποιότητας παρακολούθησης
+ Μέγιστοι χαρακτήρες για τίτλο
+ Ανάλυση αναπαραγωγής βίντεο
+
+ Μέγεθος buffer βίντεο
+ Μήκος buffer βίντεο
+ Προσωρινή μνήμη βίντεο στο δίσκο
+ Εκκαθάριση προσωρινής μνήμης βίντεο και εικόνων
+
+ Θα προκαλέσει τυχαία σφάλματα εάν οριστεί πολύ ψηλά. Μην το αλλάξετε εάν έχετε χαμηλή ποσότητα μνήμης ram, όπως σε Android TV ή παλιό τηλέφωνο
+ Μπορεί να προκαλέσει προβλήματα σε συστήματα με χαμηλό αποθηκευτικό χώρο, όπως σε συσκευές Android TV, εάν τον ρυθμίσετε πολύ ψηλά
+
+ Χρήσιμο για παράκαμψη μπλοκ ISP
+
+ Αντίγραφο ιστοτόπου
+ Αφαίρεση ιστοτόπου
+ Προσθήκη αντιγράφου ενός υπάρχοντος ιστοτόπου, με έναν διαφορετικό σύνδεσμο
+
+ Διαδρομή λήψης
+
+ Εμφάνιση Dubbed/Subbed Anime
+
+ Προσαρμογή στην οθόνη
+ Τέντωμα
+ Μεγέθυνση
+
+ Αποποίηση ευθυνών
+
+ Γενικά
+ Τυχαίο κουμπί
+ Εμφάνιση τυχαίου κουμπιού στην Αρχική οθόνη
+ Γλώσσες παρόχων
+ Διάταξη εφαρμογής
+ Προτιμώμενα μέσα
+ Ενεργοποίηση NSFW σε υποστηριζόμενους παρόχους
+ Κωδικοποίηση υποτίτλων
+ Πάροχοι
+ Διάταξη
+
+ Αυτόματο
+ Διάταξη TV
+ Διάταξη τηλεφώνου
+ Διάταξη emulator
+
+ Πρωτεύον χρώμα
+ Θέμα εφαρμογής
+ Τοποθεσία τίτλου Poster
+ Τοποθετήστε τον τίτλο κάτω από το poster
+
+ Κωδικός γλώσσας (el)
+
+ Λογαριασμός
+ Αποσύνδεση
+ Σύνδεση
+ Εναλλαγή λογαριασμού
+ Προσθήκη λογαριασμού
+ Δημιουργία λογαριασμού
+ Προσθήκη παρακολούθησης
+ Προστέθηκε %s
+ Συγχρονισμός
+ Βαθμολογήθηκε
+ Πιστοποιήθηκε %s
+ Αποτυχία πιστοποίησης σε %s
+
+ Τίποτα
+ Κανονικά
+ Όλα
+ Μέγιστο
+ Ελάχιστο
+ Περίγραμμα
+ Σε κατάθλιψη
+ Σκιά
+ Ανεβασμένοι
+ Συγχρονισμός υποτίτλων
+ 1000ms
+ Καθυστέρηση υποτίτλων
+ Χρησιμοποιήστε αυτό αν οι υπότιτλοι εμφανίζονται %dms πολύ νωρίς
+ Χρησιμοποιήστε αυτό αν οι υπότιτλοι εμφανίζονται %dms πολύ αργά
+ Καμία καθυστέρηση υποτίτλων
+
+ Συνιστώμενο
+ Φόρτωση %s
+ Φόρτωση από αρχείο
+ Φόρτωση από το Ίντερνετ
+ Λήψη αρχείου
+ Κύριο
+ Υποστηρίζεται
+ Φόντο
+
+ Πηγή
+ Τυχαίο
+
+ Έρχεται σύντομα…
+
+
+ Εικόνα Poster
+ Πρόγραμμα αναπαραγωγής
+ Ανάλυση και τίτλος
+ Τίτλος
+ Ανάλυση
+ Μη έγκυρο id
+ Μη έγκυρα δεδομένα
+ Μη έγκυρος σύνδεσμος
+ Σφάλμα
+ Αφαίρεση closed captions (για άτομα με προβλήματα ακοής) από τους υπότιτλους
+ Αφαίρεση bloat από τους υπότιτλους
+ Φιλτράρισμα ανά την προτεινόμενη γλώσσα του μέσου
+ Έξτρα
+ Τρέιλερ
+ Σύνδεσμος για stream
+ Παραπομπή
+ Επόμενο
+ Παρακολούθηση βίντεο σε αυτή την γλώσσα
+ Προηγούμενο
+ Παράλειψη διαμόρφωσης
+ Αλλαγή της εμφάνισης της συσκευής για να ταιριάζει με την συσκευή σας
+ Αναφορά κατάρρευσης
+ Τι θα θέλατε να δείτε
+ Έγινε
+ Πρόσθετα
+ Προσθήκη αποθετηρίου
+ Όνομα αποθετηρίου
+ Σύνδεσμος αποθετηρίου
+ Το πρόσθετο φορτώθηκε
+ Το πρόσθετο διαγράφηκε
+ Απέτυχε να φορτωθεί το %s
+ Ξεκίνησε η λήψη %d %s
+ Κατέβηκε το %d %s επιτυχώς
+ Όλα τα %s έχουν ήδη κατέβει
+ Μαζική λήψη
+ Πρόσθετο
+ Πρόσθετα
+ Αυτό θα διαγράψει όλα τα πρόσθετα του αποθετηρίου
+ Διαγραφή αποθετηρίου
+ Λήψη της λίστας των ιστοσελίδων που θέλετε να δείτε
+ Κατέβηκε: %d
+ Απενεργοποιήθηκε: %d
+ Δεν κατέβηκε: %d
+ Ενημερώθηκαν %d πρόσθετα
+ Προσθήκη ενός αποθετηρίου για να εγκαταστήσετε πρόσθετα ιστοσελίδας
+ Προβολή αποθετηρίων κοινότητας
+ Δημόσια λίστα
+ Κεφαλοποίηση υποτίτλων
+
+ Λήψη όλων των προσθέτων από αυτό το αποθετήριο;
+ %s (Απενεργοποιήθηκε)
+ Κομμάτια
+ Ηχητικά κομμάτια
+ Κομμάτια βίντεο
+ Εφαρμογή στην επανεκκίνηση
+
+ Η ασφαλής λειτουργία ενεργοποιήθηκε
+ Ένα μη αντιστρέψιμο σφάλμα συνέβη και απενεργοποιήσαμε όλα τα πρόσθετα, ώστε να μπορέσετε να διαπιστώσετε ποιο πρόσθετο προκάλεσε αυτή τη κατάρρευση.
+ Προβολή πληροφορίας κατάρρευσης
+
+ Βαθμολογία: %s
+ Περιγραφή
+ Έκδοση
+ Κατάσταση
+ Μέγεθος
+ Συγγραφείς
+ Υποστηρίζονται
+ Γλώσσα
+ Εγκατάσταση προσθέτου πρώτα
+
+ HLS Playlist
+
+ Προτεινόμενο πρόγραμμα αναπαραγωγής
+ Ενσωματωμένο πρόγραμμα αναπαραγωγής
+ VLC
+ MPV
+ Web Video Cast
+ Περιηγητής
+ Η εφαρμογή δεν βρέθηκε
+
+
From 98ef6a3f160d73f66095643892858a24f4ed43ce Mon Sep 17 00:00:00 2001
From: Hexated <37908684+hexated@users.noreply.github.com>
Date: Tue, 11 Oct 2022 02:43:56 +0700
Subject: [PATCH 2/6] added Vidmoly & Voe (extractor) (#147)
---
.../cloudstream3/extractors/Vidmoly.kt | 69 +++++++++++++++++++
.../lagradost/cloudstream3/extractors/Voe.kt | 32 +++++++++
.../cloudstream3/utils/ExtractorApi.kt | 30 ++++++--
3 files changed, 127 insertions(+), 4 deletions(-)
create mode 100644 app/src/main/java/com/lagradost/cloudstream3/extractors/Vidmoly.kt
create mode 100644 app/src/main/java/com/lagradost/cloudstream3/extractors/Voe.kt
diff --git a/app/src/main/java/com/lagradost/cloudstream3/extractors/Vidmoly.kt b/app/src/main/java/com/lagradost/cloudstream3/extractors/Vidmoly.kt
new file mode 100644
index 00000000..615cfd74
--- /dev/null
+++ b/app/src/main/java/com/lagradost/cloudstream3/extractors/Vidmoly.kt
@@ -0,0 +1,69 @@
+package com.lagradost.cloudstream3.extractors
+
+import com.fasterxml.jackson.annotation.JsonProperty
+import com.lagradost.cloudstream3.SubtitleFile
+import com.lagradost.cloudstream3.app
+import com.lagradost.cloudstream3.utils.*
+import com.lagradost.cloudstream3.utils.AppUtils.tryParseJson
+
+class Vidmolyme : Vidmoly() {
+ override val mainUrl = "https://vidmoly.me"
+}
+
+open class Vidmoly : ExtractorApi() {
+ override val name = "Vidmoly"
+ override val mainUrl = "https://vidmoly.to"
+ override val requiresReferer = true
+
+ private fun String.addMarks(str: String): String {
+ return this.replace(Regex("\"?$str\"?"), "\"$str\"")
+ }
+
+ override suspend fun getUrl(
+ url: String,
+ referer: String?,
+ subtitleCallback: (SubtitleFile) -> Unit,
+ callback: (ExtractorLink) -> Unit
+ ) {
+
+ val script = app.get(
+ url,
+ referer = referer,
+ ).document.select("script")
+ .find { it.data().contains("sources:") }?.data()
+ val videoData = script?.substringAfter("sources: [")
+ ?.substringBefore("],")?.addMarks("file")
+ val subData = script?.substringAfter("tracks: [")?.substringBefore("]")?.addMarks("file")
+ ?.addMarks("label")?.addMarks("kind")
+
+ tryParseJson(videoData)?.file?.let { m3uLink ->
+ M3u8Helper.generateM3u8(
+ name,
+ m3uLink,
+ "$mainUrl/"
+ ).forEach(callback)
+ }
+
+ tryParseJson>("[${subData}]")
+ ?.filter { it.kind == "captions" }?.map {
+ subtitleCallback.invoke(
+ SubtitleFile(
+ it.label.toString(),
+ fixUrl(it.file.toString())
+ )
+ )
+ }
+
+ }
+
+ private data class Source(
+ @JsonProperty("file") val file: String? = null,
+ )
+
+ private data class SubSource(
+ @JsonProperty("file") val file: String? = null,
+ @JsonProperty("label") val label: String? = null,
+ @JsonProperty("kind") val kind: String? = null,
+ )
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/lagradost/cloudstream3/extractors/Voe.kt b/app/src/main/java/com/lagradost/cloudstream3/extractors/Voe.kt
new file mode 100644
index 00000000..12a76a9b
--- /dev/null
+++ b/app/src/main/java/com/lagradost/cloudstream3/extractors/Voe.kt
@@ -0,0 +1,32 @@
+package com.lagradost.cloudstream3.extractors
+
+import com.lagradost.cloudstream3.SubtitleFile
+import com.lagradost.cloudstream3.app
+import com.lagradost.cloudstream3.utils.ExtractorApi
+import com.lagradost.cloudstream3.utils.ExtractorLink
+import com.lagradost.cloudstream3.utils.M3u8Helper
+
+open class Voe : ExtractorApi() {
+ override val name = "Voe"
+ override val mainUrl = "https://voe.sx"
+ override val requiresReferer = true
+
+ override suspend fun getUrl(
+ url: String,
+ referer: String?,
+ subtitleCallback: (SubtitleFile) -> Unit,
+ callback: (ExtractorLink) -> Unit
+ ) {
+ val res = app.get(url, referer = referer).document
+ val link = res.select("script").find { it.data().contains("const sources") }?.data()
+ ?.substringAfter("\"hls\": \"")?.substringBefore("\",")
+
+ M3u8Helper.generateM3u8(
+ name,
+ link ?: return,
+ "$mainUrl/",
+ headers = mapOf("Origin" to "$mainUrl/")
+ ).forEach(callback)
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/lagradost/cloudstream3/utils/ExtractorApi.kt b/app/src/main/java/com/lagradost/cloudstream3/utils/ExtractorApi.kt
index 199f0398..ebaaa12b 100644
--- a/app/src/main/java/com/lagradost/cloudstream3/utils/ExtractorApi.kt
+++ b/app/src/main/java/com/lagradost/cloudstream3/utils/ExtractorApi.kt
@@ -1,10 +1,7 @@
package com.lagradost.cloudstream3.utils
import android.net.Uri
-import com.lagradost.cloudstream3.SubtitleFile
-import com.lagradost.cloudstream3.TvType
-import com.lagradost.cloudstream3.USER_AGENT
-import com.lagradost.cloudstream3.app
+import com.lagradost.cloudstream3.*
import com.lagradost.cloudstream3.mvvm.logError
import com.lagradost.cloudstream3.extractors.*
import kotlinx.coroutines.delay
@@ -323,6 +320,9 @@ val extractorApis: MutableList = arrayListOf(
Embedgram(),
Mvidoo(),
Streamplay(),
+ Vidmoly(),
+ Vidmolyme(),
+ Voe(),
Gdriveplayerapi(),
Gdriveplayerapp(),
@@ -399,6 +399,28 @@ suspend fun getPostForm(requestUrl: String, html: String): String? {
).text
}
+fun ExtractorApi.fixUrl(url: String): String {
+ if (url.startsWith("http") ||
+ // Do not fix JSON objects when passed as urls.
+ url.startsWith("{\"")
+ ) {
+ return url
+ }
+ if (url.isEmpty()) {
+ return ""
+ }
+
+ val startsWithNoHttp = url.startsWith("//")
+ if (startsWithNoHttp) {
+ return "https:$url"
+ } else {
+ if (url.startsWith('/')) {
+ return mainUrl + url
+ }
+ return "$mainUrl/$url"
+ }
+}
+
abstract class ExtractorApi {
abstract val name: String
abstract val mainUrl: String
From a43e950a488637873553d4a46f49a8bb80a86542 Mon Sep 17 00:00:00 2001
From: LagradOst <46196380+Blatzar@users.noreply.github.com>
Date: Mon, 10 Oct 2022 21:51:03 +0200
Subject: [PATCH 3/6] Remove provider language (#141)
---
.../com/lagradost/cloudstream3/MainAPI.kt | 30 ++++++++++++-------
.../ui/setup/SetupFragmentExtensions.kt | 2 +-
.../ui/setup/SetupFragmentLanguage.kt | 2 +-
.../main/res/navigation/mobile_navigation.xml | 14 +++++++++
app/src/main/res/xml/settings_providers.xml | 1 +
5 files changed, 36 insertions(+), 13 deletions(-)
diff --git a/app/src/main/java/com/lagradost/cloudstream3/MainAPI.kt b/app/src/main/java/com/lagradost/cloudstream3/MainAPI.kt
index 416a7238..a06dd95e 100644
--- a/app/src/main/java/com/lagradost/cloudstream3/MainAPI.kt
+++ b/app/src/main/java/com/lagradost/cloudstream3/MainAPI.kt
@@ -17,8 +17,7 @@ import com.lagradost.cloudstream3.ui.player.SubtitleData
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.isTvSettings
import com.lagradost.cloudstream3.utils.AppUtils.toJson
import com.lagradost.cloudstream3.utils.ExtractorLink
-import com.lagradost.cloudstream3.utils.Qualities
-import com.lagradost.cloudstream3.utils.loadExtractor
+import com.lagradost.cloudstream3.utils.SubtitleHelper
import okhttp3.Interceptor
import java.text.SimpleDateFormat
import java.util.*
@@ -191,17 +190,26 @@ object APIHolder {
return list.filter { names.contains(it) }.map { DubStatus.valueOf(it) }.toHashSet()
}
+ /**
+ * Gets all the activated provider languages
+ * Used to obey the preference provider_lang_key
+ * but it turned out too complicated and unnecessary with extensions.
+ **/
fun Context.getApiProviderLangSettings(): HashSet {
- val settingsManager = PreferenceManager.getDefaultSharedPreferences(this)
- val hashSet = HashSet()
- hashSet.add("en") // def is only en
- val list = settingsManager.getStringSet(
- this.getString(R.string.provider_lang_key),
- hashSet.toMutableSet()
- )
+ val langs = apis.map { it.lang }.toSet()
+ .sortedBy { SubtitleHelper.fromTwoLettersToLanguage(it) }
+ return langs.toHashSet()
- if (list.isNullOrEmpty()) return hashSet
- return list.toHashSet()
+// val settingsManager = PreferenceManager.getDefaultSharedPreferences(this)
+// val hashSet = HashSet()
+// hashSet.add("en") // def is only en
+// val list = settingsManager.getStringSet(
+// this.getString(R.string.provider_lang_key),
+// hashSet.toMutableSet()
+// )
+//
+// if (list.isNullOrEmpty()) return hashSet
+// return list.toHashSet()
}
fun Context.getApiTypeSettings(): HashSet {
diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/setup/SetupFragmentExtensions.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/setup/SetupFragmentExtensions.kt
index 43037038..0f11f214 100644
--- a/app/src/main/java/com/lagradost/cloudstream3/ui/setup/SetupFragmentExtensions.kt
+++ b/app/src/main/java/com/lagradost/cloudstream3/ui/setup/SetupFragmentExtensions.kt
@@ -100,7 +100,7 @@ class SetupFragmentExtensions : Fragment() {
next_btt?.setOnClickListener {
// Continue setup
if (isSetup)
- findNavController().navigate(R.id.action_navigation_setup_extensions_to_navigation_setup_provider_languages)
+ findNavController().navigate(R.id.action_navigation_setup_extensions_to_navigation_setup_media)
else
findNavController().navigate(R.id.navigation_home)
}
diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/setup/SetupFragmentLanguage.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/setup/SetupFragmentLanguage.kt
index 71472328..f9268d77 100644
--- a/app/src/main/java/com/lagradost/cloudstream3/ui/setup/SetupFragmentLanguage.kt
+++ b/app/src/main/java/com/lagradost/cloudstream3/ui/setup/SetupFragmentLanguage.kt
@@ -85,7 +85,7 @@ class SetupFragmentLanguage : Fragment() {
&& PluginManager.getPluginsLocal().isEmpty()
//&& PREBUILT_REPOSITORIES.isNotEmpty()
) R.id.action_navigation_global_to_navigation_setup_extensions
- else R.id.action_navigation_setup_language_to_navigation_setup_provider_languages
+ else R.id.action_navigation_setup_language_to_navigation_setup_media
findNavController().navigate(
nextDestination,
diff --git a/app/src/main/res/navigation/mobile_navigation.xml b/app/src/main/res/navigation/mobile_navigation.xml
index 3c45ee70..94d489fd 100644
--- a/app/src/main/res/navigation/mobile_navigation.xml
+++ b/app/src/main/res/navigation/mobile_navigation.xml
@@ -522,6 +522,13 @@
app:exitAnim="@anim/exit_anim"
app:popEnterAnim="@anim/enter_anim"
app:popExitAnim="@anim/exit_anim" />
+
+
From fc7e39e3ccd0a18ec2cf95a445d3f481a58b3473 Mon Sep 17 00:00:00 2001
From: SANCTI-afk <63229113+SANCTI-afk@users.noreply.github.com>
Date: Mon, 10 Oct 2022 21:58:28 +0200
Subject: [PATCH 4/6] arabicLanguage (#118)
* arabicLanguage100%
* Update strings.xml
* Arabic Full
* translated(preffVplayerBtn)
---
app/src/main/res/values-ar/strings.xml | 17 +++++++++--------
1 file changed, 9 insertions(+), 8 deletions(-)
diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml
index 3fb2e26c..edac2760 100644
--- a/app/src/main/res/values-ar/strings.xml
+++ b/app/src/main/res/values-ar/strings.xml
@@ -13,16 +13,16 @@
سرعة (%.2fx)
- Rated: %.1f
+ تقييم: %.1f
- !تم إيجاد تحديث جديد\n%s -> %s
+ !تم العثور علي تحديث جديد\n%s -> %s
%d دقيقة
CloudStream
تشغيل بواسطة CloudStream
الصفحة الرئيسية
البحث
- التحميلات
+ التنزيلات
الإعدادات
…بحث
@@ -210,14 +210,14 @@
لا موسم
حلقة
حلقات
- ح
- م
+ م
+ ح
لم يتم العثور على أي حلقات
حذف الملف
حذف
إيقاف مؤقت
- أكمل
+ إستئناف
-٣٠
+٣٠
سوف يتم الحذف نهائيا %s\nهل أنت متأكد?
@@ -292,7 +292,7 @@
show_title_key
التحكم في عناصر الواجهة علي الملصق
- لم يتم العثور على تحديث
+ لم يتم العثور على تحديثات
تحقق من التحديثات
قفل
@@ -404,7 +404,7 @@
إضافة تتبع
تم إضافة %s
مزامنة
- مقيّم
+ تقييم
%d / 10
/??
/%d
@@ -538,4 +538,5 @@
اللغة
قائمة HLS
+ مُشغل الفيديو المفضل
From a565319ecb60d3e1f8519619776337126ad92161 Mon Sep 17 00:00:00 2001
From: Blatzar <46196380+Blatzar@users.noreply.github.com>
Date: Mon, 10 Oct 2022 23:57:50 +0200
Subject: [PATCH 5/6] Remove links to website in app & fix plugin deletion bug
---
.../settings/extensions/ExtensionsFragment.kt | 41 ++++++++---------
.../settings/extensions/PluginsViewModel.kt | 44 ++++++++++++++-----
.../ui/setup/SetupFragmentExtensions.kt | 24 +++++-----
app/src/main/res/layout/add_repo_input.xml | 19 ++++----
.../main/res/layout/fragment_extensions.xml | 12 ++---
.../res/layout/fragment_setup_extensions.xml | 22 +++++-----
app/src/main/res/values/strings.xml | 2 +-
7 files changed, 89 insertions(+), 75 deletions(-)
diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/ExtensionsFragment.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/ExtensionsFragment.kt
index 8480c94d..f674cafe 100644
--- a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/ExtensionsFragment.kt
+++ b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/ExtensionsFragment.kt
@@ -16,7 +16,6 @@ import androidx.core.view.isVisible
import androidx.fragment.app.Fragment
import androidx.fragment.app.activityViewModels
import androidx.navigation.fragment.findNavController
-import com.lagradost.cloudstream3.AcraApplication.Companion.openBrowser
import com.lagradost.cloudstream3.CommonActivity.showToast
import com.lagradost.cloudstream3.MainActivity.Companion.afterRepositoryLoadedEvent
import com.lagradost.cloudstream3.R
@@ -25,7 +24,6 @@ import com.lagradost.cloudstream3.mvvm.observe
import com.lagradost.cloudstream3.plugins.RepositoryManager
import com.lagradost.cloudstream3.ui.result.setText
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.isTrueTvSettings
-import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.isTvSettings
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.setUpToolbar
import com.lagradost.cloudstream3.utils.AppUtils.downloadAllPluginsDialog
import com.lagradost.cloudstream3.utils.Coroutines.ioSafe
@@ -34,7 +32,6 @@ import com.lagradost.cloudstream3.utils.UIHelper.dismissSafe
import com.lagradost.cloudstream3.widget.LinearRecycleViewLayoutManager
import kotlinx.android.synthetic.main.add_repo_input.*
import kotlinx.android.synthetic.main.fragment_extensions.*
-import kotlinx.android.synthetic.main.fragment_extensions.list_repositories
const val PUBLIC_REPOSITORIES_LIST = "https://recloudstream.github.io/repos/"
@@ -128,20 +125,20 @@ class ExtensionsFragment : Fragment() {
}
}
- list_repositories?.setOnClickListener {
- // Open webview on tv if browser fails
- val isTv = isTvSettings()
- openBrowser(PUBLIC_REPOSITORIES_LIST, isTv, this)
-
- // Set clipboard on TV because the browser might not exist or work properly
- if (isTv) {
- val serviceClipboard =
- (activity?.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager?)
- ?: return@setOnClickListener
- val clip = ClipData.newPlainText("Repository url", PUBLIC_REPOSITORIES_LIST)
- serviceClipboard.setPrimaryClip(clip)
- }
- }
+// list_repositories?.setOnClickListener {
+// // Open webview on tv if browser fails
+// val isTv = isTvSettings()
+// openBrowser(PUBLIC_REPOSITORIES_LIST, isTv, this)
+//
+// // Set clipboard on TV because the browser might not exist or work properly
+// if (isTv) {
+// val serviceClipboard =
+// (activity?.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager?)
+// ?: return@setOnClickListener
+// val clip = ClipData.newPlainText("Repository url", PUBLIC_REPOSITORIES_LIST)
+// serviceClipboard.setPrimaryClip(clip)
+// }
+// }
observe(extensionViewModel.pluginStats) {
when (it) {
@@ -200,11 +197,11 @@ class ExtensionsFragment : Fragment() {
}
}
- dialog.list_repositories?.setOnClickListener {
- // Open webview on tv if browser fails
- openBrowser(PUBLIC_REPOSITORIES_LIST, isTvSettings(), this)
- dialog.dismissSafe()
- }
+// dialog.list_repositories?.setOnClickListener {
+// // Open webview on tv if browser fails
+// openBrowser(PUBLIC_REPOSITORIES_LIST, isTvSettings(), this)
+// dialog.dismissSafe()
+// }
// dialog.text2?.text = provider.name
dialog.apply_btt?.setOnClickListener secondListener@{
diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/PluginsViewModel.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/PluginsViewModel.kt
index 6d94f91e..b0e253be 100644
--- a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/PluginsViewModel.kt
+++ b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/PluginsViewModel.kt
@@ -12,7 +12,6 @@ import com.lagradost.cloudstream3.CommonActivity.showToast
import com.lagradost.cloudstream3.R
import com.lagradost.cloudstream3.apmap
import com.lagradost.cloudstream3.mvvm.launchSafe
-import com.lagradost.cloudstream3.plugins.PluginData
import com.lagradost.cloudstream3.plugins.PluginManager
import com.lagradost.cloudstream3.plugins.PluginManager.getPluginPath
import com.lagradost.cloudstream3.plugins.RepositoryManager
@@ -21,8 +20,8 @@ import com.lagradost.cloudstream3.ui.result.txt
import com.lagradost.cloudstream3.utils.Coroutines.ioSafe
import com.lagradost.cloudstream3.utils.Coroutines.main
import com.lagradost.cloudstream3.utils.Coroutines.runOnMainThread
-import kotlinx.coroutines.launch
import me.xdrop.fuzzywuzzy.FuzzySearch
+import java.io.File
typealias Plugin = Pair
/**
@@ -47,7 +46,11 @@ class PluginsViewModel : ViewModel() {
private val repositoryCache: MutableMap> = mutableMapOf()
const val TAG = "PLG"
- private fun isDownloaded(context: Context, pluginName: String, repositoryUrl: String): Boolean {
+ private fun isDownloaded(
+ context: Context,
+ pluginName: String,
+ repositoryUrl: String
+ ): Boolean {
return getPluginPath(context, pluginName, repositoryUrl).exists()
}
@@ -73,7 +76,13 @@ class PluginsViewModel : ViewModel() {
if (activity == null) return@ioSafe
val plugins = getPlugins(repositoryUrl)
- plugins.filter { plugin -> !isDownloaded(activity, plugin.second.internalName, repositoryUrl) }.also { list ->
+ plugins.filter { plugin ->
+ !isDownloaded(
+ activity,
+ plugin.second.internalName,
+ repositoryUrl
+ )
+ }.also { list ->
main {
showToast(
activity,
@@ -133,9 +142,13 @@ class PluginsViewModel : ViewModel() {
if (activity == null) return@ioSafe
val (repo, metadata) = plugin
- val file = getPluginPath(activity, plugin.second.internalName, plugin.first)
+ val file = if (isLocal) File(plugin.second.url) else getPluginPath(
+ activity,
+ plugin.second.internalName,
+ plugin.first
+ )
- val (success, message) = if (file.exists() || isLocal) {
+ val (success, message) = if (file.exists()) {
PluginManager.deletePlugin(file) to R.string.plugin_deleted
} else {
PluginManager.downloadAndLoadPlugin(
@@ -167,7 +180,9 @@ class PluginsViewModel : ViewModel() {
}
this.plugins = list
- _filteredPlugins.postValue(false to list.filterTvTypes().filterLang().sortByQuery(currentQuery))
+ _filteredPlugins.postValue(
+ false to list.filterTvTypes().filterLang().sortByQuery(currentQuery)
+ )
}
// Perhaps can be optimized?
@@ -175,7 +190,8 @@ class PluginsViewModel : ViewModel() {
if (tvTypes.isEmpty()) return this
return this.filter {
(it.plugin.second.tvTypes?.any { type -> tvTypes.contains(type) } == true) ||
- (tvTypes.contains("Others") && (it.plugin.second.tvTypes ?: emptyList()).isEmpty())
+ (tvTypes.contains("Others") && (it.plugin.second.tvTypes
+ ?: emptyList()).isEmpty())
}
}
@@ -199,7 +215,9 @@ class PluginsViewModel : ViewModel() {
}
fun updateFilteredPlugins() {
- _filteredPlugins.postValue(false to plugins.filterTvTypes().filterLang().sortByQuery(currentQuery))
+ _filteredPlugins.postValue(
+ false to plugins.filterTvTypes().filterLang().sortByQuery(currentQuery)
+ )
}
fun updatePluginList(context: Context?, repositoryUrl: String) = viewModelScope.launchSafe {
@@ -210,7 +228,9 @@ class PluginsViewModel : ViewModel() {
fun search(query: String?) {
currentQuery = query
- _filteredPlugins.postValue(true to (filteredPlugins.value?.second?.sortByQuery(query) ?: emptyList()))
+ _filteredPlugins.postValue(
+ true to (filteredPlugins.value?.second?.sortByQuery(query) ?: emptyList())
+ )
}
/**
@@ -226,6 +246,8 @@ class PluginsViewModel : ViewModel() {
}
plugins = downloadedPlugins
- _filteredPlugins.postValue(false to downloadedPlugins.filterTvTypes().filterLang().sortByQuery(currentQuery))
+ _filteredPlugins.postValue(
+ false to downloadedPlugins.filterTvTypes().filterLang().sortByQuery(currentQuery)
+ )
}
}
\ No newline at end of file
diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/setup/SetupFragmentExtensions.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/setup/SetupFragmentExtensions.kt
index 43037038..7b7e5458 100644
--- a/app/src/main/java/com/lagradost/cloudstream3/ui/setup/SetupFragmentExtensions.kt
+++ b/app/src/main/java/com/lagradost/cloudstream3/ui/setup/SetupFragmentExtensions.kt
@@ -7,21 +7,16 @@ import android.view.ViewGroup
import androidx.core.view.isVisible
import androidx.fragment.app.Fragment
import androidx.navigation.fragment.findNavController
-import com.lagradost.cloudstream3.AcraApplication.Companion.openBrowser
import com.lagradost.cloudstream3.MainActivity.Companion.afterRepositoryLoadedEvent
import com.lagradost.cloudstream3.R
import com.lagradost.cloudstream3.plugins.RepositoryManager
import com.lagradost.cloudstream3.plugins.RepositoryManager.PREBUILT_REPOSITORIES
-import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.isTvSettings
-import com.lagradost.cloudstream3.ui.settings.extensions.PUBLIC_REPOSITORIES_LIST
import com.lagradost.cloudstream3.ui.settings.extensions.PluginsViewModel
import com.lagradost.cloudstream3.ui.settings.extensions.RepoAdapter
import com.lagradost.cloudstream3.utils.Coroutines.main
import com.lagradost.cloudstream3.utils.UIHelper.fixPaddingStatusbar
import kotlinx.android.synthetic.main.fragment_extensions.blank_repo_screen
-import kotlinx.android.synthetic.main.fragment_extensions.list_repositories
import kotlinx.android.synthetic.main.fragment_extensions.repo_recycler_view
-import kotlinx.android.synthetic.main.fragment_setup_extensions.*
import kotlinx.android.synthetic.main.fragment_setup_media.next_btt
import kotlinx.android.synthetic.main.fragment_setup_media.prev_btt
import kotlinx.android.synthetic.main.fragment_setup_media.setup_root
@@ -64,18 +59,19 @@ class SetupFragmentExtensions : Fragment() {
val hasRepos = repositories.isNotEmpty()
repo_recycler_view?.isVisible = hasRepos
blank_repo_screen?.isVisible = !hasRepos
- view_public_repositories_button?.isVisible = hasRepos
+// view_public_repositories_button?.isVisible = hasRepos
if (hasRepos) {
repo_recycler_view?.adapter = RepoAdapter(true, {}, {
PluginsViewModel.downloadAll(activity, it.url, null)
}).apply { updateList(repositories) }
- } else {
- list_repositories?.setOnClickListener {
- // Open webview on tv if browser fails
- openBrowser(PUBLIC_REPOSITORIES_LIST, isTvSettings(), this)
- }
}
+// else {
+// list_repositories?.setOnClickListener {
+// // Open webview on tv if browser fails
+// openBrowser(PUBLIC_REPOSITORIES_LIST, isTvSettings(), this)
+// }
+// }
}
}
@@ -84,9 +80,9 @@ class SetupFragmentExtensions : Fragment() {
context?.fixPaddingStatusbar(setup_root)
val isSetup = arguments?.getBoolean(SETUP_EXTENSION_BUNDLE_IS_SETUP) ?: false
- view_public_repositories_button?.setOnClickListener {
- openBrowser(PUBLIC_REPOSITORIES_LIST, isTvSettings(), this)
- }
+// view_public_repositories_button?.setOnClickListener {
+// openBrowser(PUBLIC_REPOSITORIES_LIST, isTvSettings(), this)
+// }
with(context) {
if (this == null) return
diff --git a/app/src/main/res/layout/add_repo_input.xml b/app/src/main/res/layout/add_repo_input.xml
index 445e71ec..6f6b4d5b 100644
--- a/app/src/main/res/layout/add_repo_input.xml
+++ b/app/src/main/res/layout/add_repo_input.xml
@@ -28,15 +28,15 @@
android:textSize="20sp"
android:textStyle="bold" />
-
+
+
+
+
+
+
+
+
+
-
+
+
+
+
+
+
-
+
+
+
+
+
-
+
+
+
+
+
+
Disabled: %d
Not downloaded: %d
Updated %d plugins
- Add a repository to install site extensions
+ CloudStream has no sites installed by default. You need to install the sites from repositories.\n\nBecause of a brainless DMCA takedown by Sky Uk Limited 🤮 we cannot link the repository sites in app.\n\nJoin our discord for links or search online.
View community repositories
Public list
Uppercase all subtitles
From 661f8c3c4e8b6ee72f40477d73bd8677db15174e Mon Sep 17 00:00:00 2001
From: reduplicated <110570621+reduplicated@users.noreply.github.com>
Date: Tue, 11 Oct 2022 15:24:16 +0200
Subject: [PATCH 6/6] mini api fix
---
.../com/lagradost/cloudstream3/MainAPI.kt | 39 +++++++++++++++----
.../cloudstream3/ui/APIRepository.kt | 14 +++++--
2 files changed, 42 insertions(+), 11 deletions(-)
diff --git a/app/src/main/java/com/lagradost/cloudstream3/MainAPI.kt b/app/src/main/java/com/lagradost/cloudstream3/MainAPI.kt
index a06dd95e..e5896434 100644
--- a/app/src/main/java/com/lagradost/cloudstream3/MainAPI.kt
+++ b/app/src/main/java/com/lagradost/cloudstream3/MainAPI.kt
@@ -22,7 +22,6 @@ import okhttp3.Interceptor
import java.text.SimpleDateFormat
import java.util.*
import kotlin.math.absoluteValue
-import kotlin.collections.MutableList
const val USER_AGENT =
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
@@ -332,13 +331,24 @@ data class SettingsJson(
data class MainPageData(
val name: String,
val data: String,
+ val horizontalImages: Boolean = false
)
data class MainPageRequest(
val name: String,
val data: String,
+ val horizontalImages: Boolean,
+ //TODO genre selection or smth
)
+fun mainPage(url: String, name: String, horizontalImages: Boolean = false): MainPageData {
+ return MainPageData(name = name, data = url, horizontalImages = horizontalImages)
+}
+
+fun mainPageOf(vararg elements: MainPageData): List {
+ return elements.toList()
+}
+
/** return list of MainPageData with url to name, make for more readable code */
fun mainPageOf(vararg elements: Pair): List {
return elements.map { (url, name) -> MainPageData(name = name, data = url) }
@@ -347,7 +357,7 @@ fun mainPageOf(vararg elements: Pair): List {
fun newHomePageResponse(
name: String,
list: List,
- hasNext: Boolean? = null
+ hasNext: Boolean? = null,
): HomePageResponse {
return HomePageResponse(
listOf(HomePageList(name, list)),
@@ -355,6 +365,17 @@ fun newHomePageResponse(
)
}
+fun newHomePageResponse(
+ data: MainPageRequest,
+ list: List,
+ hasNext: Boolean? = null,
+): HomePageResponse {
+ return HomePageResponse(
+ listOf(HomePageList(data.name, list, data.horizontalImages)),
+ hasNext = hasNext ?: list.isNotEmpty()
+ )
+}
+
fun newHomePageResponse(list: HomePageList, hasNext: Boolean? = null): HomePageResponse {
return HomePageResponse(listOf(list), hasNext = hasNext ?: list.list.isNotEmpty())
}
@@ -391,14 +412,17 @@ abstract class MainAPI {
/** if this is turned on then it will request the homepage one after the other,
used to delay if they block many request at the same time*/
- open var sequentialMainPage : Boolean = false
+ open var sequentialMainPage: Boolean = false
+
/** in milliseconds, this can be used to add more delay between homepage requests
* on first load if sequentialMainPage is turned on */
- open var sequentialMainPageDelay : Long = 0L
+ open var sequentialMainPageDelay: Long = 0L
+
/** in milliseconds, this can be used to add more delay between homepage requests when scrolling */
- open var sequentialMainPageScrollDelay : Long = 0L
+ open var sequentialMainPageScrollDelay: Long = 0L
+
/** used to keep track when last homepage request was in unixtime ms */
- var lastHomepageRequest : Long = 0L
+ var lastHomepageRequest: Long = 0L
open var lang = "en" // ISO_639_1 check SubtitleHelper
@@ -431,7 +455,8 @@ abstract class MainAPI {
open val vpnStatus = VPNStatus.None
open val providerType = ProviderType.DirectProvider
- open val mainPage = listOf(MainPageData("", ""))
+ //emptyList() //
+ open val mainPage = listOf(MainPageData("", "", false))
@WorkerThread
open suspend fun getMainPage(
diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/APIRepository.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/APIRepository.kt
index b43b1434..0e5e544b 100644
--- a/app/src/main/java/com/lagradost/cloudstream3/ui/APIRepository.kt
+++ b/app/src/main/java/com/lagradost/cloudstream3/ui/APIRepository.kt
@@ -66,7 +66,7 @@ class APIRepository(val api: MainAPI) {
suspend fun waitForHomeDelay() {
val delta = api.sequentialMainPageScrollDelay + api.lastHomepageRequest - unixTimeMS
- if(delta < 0) return
+ if (delta < 0) return
delay(delta)
}
@@ -75,7 +75,7 @@ class APIRepository(val api: MainAPI) {
api.lastHomepageRequest = unixTimeMS
nameIndex?.let { api.mainPage.getOrNull(it) }?.let { data ->
- listOf(api.getMainPage(page, MainPageRequest(data.name, data.data)))
+ listOf(api.getMainPage(page, MainPageRequest(data.name, data.data, data.horizontalImages)))
} ?: run {
if (api.sequentialMainPage) {
var first = true
@@ -84,11 +84,17 @@ class APIRepository(val api: MainAPI) {
delay(api.sequentialMainPageDelay)
first = false
- api.getMainPage(page, MainPageRequest(data.name, data.data))
+ api.getMainPage(
+ page,
+ MainPageRequest(data.name, data.data, data.horizontalImages)
+ )
}
} else {
api.mainPage.apmap { data ->
- api.getMainPage(page, MainPageRequest(data.name, data.data))
+ api.getMainPage(
+ page,
+ MainPageRequest(data.name, data.data, data.horizontalImages)
+ )
}
}
}