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/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/ui/setup/SetupFragmentExtensions.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/setup/SetupFragmentExtensions.kt index 7b7e5458..c4bf7580 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 @@ -96,7 +96,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/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 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" /> + + سرعة (%.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 + مُشغل الفيديو المفضل 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 + Περιηγητής + Η εφαρμογή δεν βρέθηκε + + diff --git a/app/src/main/res/xml/settings_providers.xml b/app/src/main/res/xml/settings_providers.xml index a177865b..86857653 100644 --- a/app/src/main/res/xml/settings_providers.xml +++ b/app/src/main/res/xml/settings_providers.xml @@ -2,6 +2,7 @@