Compare commits

...

1,487 commits

Author SHA1 Message Date
firelight
2c03a3d976
fix gradient (#2912) 2026-06-13 02:59:02 +02:00
firelight
3417fe0160
Feat: OnlyPlayer (#2905) 2026-06-13 02:58:43 +02:00
firelight
55450a02fa
Merge pull request #2904 from recloudstream/mpvrx
Feat: MpvRx
2026-06-13 02:56:45 +02:00
Osten
6f9646e52f
Fix one last issue in JSON parsing :I 2026-06-11 15:06:23 +02:00
Luna712
b222911e29
Fix parseJson inline on stable once again! (#2908) 2026-06-11 12:29:29 +02:00
firelight
5667f52648
Translated using Weblate (German) (#2876)
Currently translated at 100.0% (729 of 729 strings)

Translated using Weblate (German)

Currently translated at 100.0% (729 of 729 strings)

Translated using Weblate (Macedonian)

Currently translated at 100.0% (729 of 729 strings)





Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/de/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/mk/
Translation: Cloudstream/App

Co-authored-by: Deleted User <pandoroo@users.noreply.hosted.weblate.org>
Co-authored-by: WertZuz <97708601+wertzuz@users.noreply.github.com>
Co-authored-by: stojkovskistefan <stefanstojkovski@gmail.com>
2026-06-11 02:28:26 +02:00
Hosted Weblate
b2a02a174f
Merge remote-tracking branch 'origin/master' 2026-06-11 02:26:56 +02:00
Luna712
18a857723b
Replace java.net.uri in library (#2839) 2026-06-11 00:26:49 +00:00
Hosted Weblate
292d3f1442
Merge remote-tracking branch 'origin/master' 2026-06-11 02:24:56 +02:00
Luna712
8012c58069
Set explicitNulls = false for kotlinx serialization (#2897)
This is more inline with Jackson's behavior otherwise for nullable types with non default values, and they don't exist, gives a Missingfield exception whereas it worked on Jackson. We may need coerceInputValues = true also but I am unsure of that right now.
2026-06-11 00:24:50 +00:00
Hosted Weblate
4f8a79669c
Merge remote-tracking branch 'origin/master' 2026-06-11 02:09:06 +02:00
Luna712
2181243dd1
Bump NewPipeExtractor to fix trailers and other YouTube videos (#2906) 2026-06-11 00:08:58 +00:00
Hosted Weblate
eae18bb50d
Merge remote-tracking branch 'origin/master' 2026-06-09 21:03:54 +00:00
Luna712
f7cbf25b30
Replace EnumSet for dubStatus (#2845) 2026-06-09 23:03:48 +02:00
Hosted Weblate
fd579fcc18
Translated using Weblate (German)
Currently translated at 100.0% (729 of 729 strings)

Translated using Weblate (German)

Currently translated at 100.0% (729 of 729 strings)

Translated using Weblate (Macedonian)

Currently translated at 100.0% (729 of 729 strings)

Co-authored-by: Deleted User <pandoroo@users.noreply.hosted.weblate.org>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: WertZuz <97708601+wertzuz@users.noreply.github.com>
Co-authored-by: stojkovskistefan <stefanstojkovski@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/de/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/mk/
Translation: Cloudstream/App
2026-06-08 22:22:51 +02:00
Luna712
79cc3fb501
Fix kotlinx serialization in parseJson (#2902)
It doing runCatching on the Result itself, that results in the serializer always returning null. Just do what we do everywhere else here also, getContextual doesn't throw anything.
2026-06-08 20:22:34 +00:00
KingLucius
d78b991d66
Trakt meta provider logo support (#2894) 2026-06-07 23:59:42 +02:00
firelight
70053ebbae
[skip ci] Fix serialization testing (#2896) 2026-06-06 19:48:37 +00:00
Luna712
a4a4c31f8d
Replace toByteArray() in some places in library (#2866) 2026-06-03 16:09:30 +02:00
Osten
3844c896f1
Fixed Json again 2026-06-02 14:14:38 +02:00
Osten
11f77fbe11
Fixed parseJson inline problem 2026-06-01 18:11:54 +02:00
Luna712
62662cb064
Bump a few libs (#2840) 2026-06-01 01:24:31 +02:00
Luna712
8e0c664b1e
Add TRAKT_CLIENT_ID to Archive build as well (#2861) 2026-06-01 01:10:03 +02:00
fgmitesh
4836e2b371
fix: treat KEYCODE_ENTER as select for TV remotes (LG Magic Remote) (#2853)
* Improve key event handling in FullScreenPlayer

Refactor key event handling for play/pause and chapter skipping.

* Handle KEYCODE_ENTER for SearchView focus
2026-06-01 01:07:22 +02:00
firelight
0e16f429af
Update TRAKT_CLIENT_ID (#2860) 2026-06-01 01:04:36 +02:00
KingLucius
5de7f207f2
feat(MetaProviders): Fix Trakt (#2858) 2026-06-01 00:53:47 +02:00
Luna712
e1aacce93d
ExtractorAPI: support Kotlin Uuid (#2855) 2026-06-01 00:53:37 +02:00
Luna712
8e1b41ea61
Fix one instance of String(byteArray) I previously missed (#2859) 2026-06-01 00:49:23 +02:00
Luna712
b7f5826a19
Add expect/actual for YoutubeExtractor (#2844)
NewPipeExtractor won't work in non-JVM platforms.
2026-05-31 01:48:06 +00:00
Luna712
8e7569df53
Fix T::class in parseJson causing type erasure in some cases (#2852) 2026-05-31 01:47:46 +00:00
Luna712
0728dd06a1
[skip ci] Replace using Char constructor in a couple extractors (#2856) 2026-05-31 01:09:43 +00:00
Luna712
041d21a486
Emergency patch (#2851) 2026-05-29 19:30:55 +02:00
Luna712
a124450ddc
Migrate Java date utils in library to kotlinx-datetime (#2798) 2026-05-29 10:58:08 +00:00
Luna712
028a794ea5
Add support for using kotlinx-serialization rather than Jackson (#2791) 2026-05-28 21:16:31 +00:00
PiterDev
c1b6fc2eeb
Fix Updated/ReleaseDate/Rating sorting for Kitsu SyncProvider (#2780) 2026-05-28 10:46:49 +00:00
Luna712
647c274944
[skip ci] Move versionCode and versionName to version catalog 2026-05-27 21:05:18 +00:00
firelight
22be73619e
Translated using Weblate (Norwegian Nynorsk) (#2784)
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ar/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ms/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/nl/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/nn/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/pt/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/pt_BR/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ru/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/vi/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/fastlane/ar_SA/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/fastlane/pt/
Translation: Cloudstream/App
Translation: Cloudstream/Fastlane

Co-authored-by: Andrei Stepanov <adem4ik@gmail.com>
Co-authored-by: Dark <darkbeamer.official@gmail.com>
Co-authored-by: Douglas de Santana Ramos <ramos.ti@live.com>
Co-authored-by: Gabriel <bloxgabriel18@gmail.com>
Co-authored-by: Johannes Bø <johannes.bo@gmail.com>
Co-authored-by: Maarten De Jong <maarten.de.jong2003@gmail.com>
Co-authored-by: Man <thebroker2308@gmail.com>
Co-authored-by: Saleh ALHarbi <alfraidigamerofficial@gmail.com>
Co-authored-by: ssantos <ssantos@web.de>
2026-05-27 22:57:43 +02:00
Hosted Weblate
a3c100e75b
Merge remote-tracking branch 'origin/master' 2026-05-27 20:57:16 +00:00
Luna712
d24f8bca0f
Don't use any external library for Levenshtein ratio matching (#2802) 2026-05-27 20:57:09 +00:00
Hosted Weblate
4c3c463a19
Merge remote-tracking branch 'origin/master' 2026-05-26 19:22:13 +02:00
Luna712
007c0ff9bc
Fix some bugs in DownloadedPlayerActivity (#2758)
* Fix some bugs in DownloadedPlayerActivity

* Remove savedInstanceState check and use better long comment format
2026-05-26 19:22:06 +02:00
Hosted Weblate
c8bc999d22
Translated using Weblate (Norwegian Nynorsk)
Currently translated at 26.4% (193 of 729 strings)

Translated using Weblate (Malay)

Currently translated at 65.8% (480 of 729 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Russian)

Currently translated at 100.0% (729 of 729 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Dutch)

Currently translated at 90.8% (662 of 729 strings)

Translated using Weblate (Arabic (Saudi Arabia))

Currently translated at 100.0% (4 of 4 strings)

Translated using Weblate (Arabic)

Currently translated at 100.0% (729 of 729 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (729 of 729 strings)

Translated using Weblate (Vietnamese)

Currently translated at 100.0% (729 of 729 strings)

Translated using Weblate (Portuguese)

Currently translated at 100.0% (729 of 729 strings)

Translated using Weblate (Portuguese)

Currently translated at 100.0% (4 of 4 strings)

Translated using Weblate (Vietnamese)

Currently translated at 100.0% (729 of 729 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Vietnamese)

Currently translated at 100.0% (729 of 729 strings)

Co-authored-by: Andrei Stepanov <adem4ik@gmail.com>
Co-authored-by: Dark <darkbeamer.official@gmail.com>
Co-authored-by: Douglas de Santana Ramos <ramos.ti@live.com>
Co-authored-by: Gabriel <bloxgabriel18@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Johannes Bø <johannes.bo@gmail.com>
Co-authored-by: Maarten De Jong <maarten.de.jong2003@gmail.com>
Co-authored-by: Man <thebroker2308@gmail.com>
Co-authored-by: Saleh ALHarbi <alfraidigamerofficial@gmail.com>
Co-authored-by: ssantos <ssantos@web.de>
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ar/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ms/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/nl/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/nn/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/pt/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/pt_BR/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ru/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/vi/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/fastlane/ar_SA/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/fastlane/pt/
Translation: Cloudstream/App
Translation: Cloudstream/Fastlane
2026-05-26 17:00:51 +00:00
Luna712
b353cf2017
Remove back-compat constructor for AnimeSearchResponse (#2815)
This is in preparation to remove the use of EnumSet for `dubStatus`. Those that use the builder, use `addDubStatus` which means we can easily do this without breaking bytecode compatibility, but first we need to remove the back-compat constructor, as once we do that it wouldn't work anymore anyway.
2026-05-26 19:00:36 +02:00
IndusAryan
70ed1c753d
(fix): implement hardware check for image loading (#2765) 2026-05-24 22:59:43 +00:00
Luna712
00e943ebc4
Replace synchronized usage in library with kotlinx-atomicfu (#2808) 2026-05-24 22:31:27 +00:00
Luna712
0afb23eb2e
Bump material to 1.14.0 stable (#2752) 2026-05-24 22:16:53 +00:00
Luna712
0b642bb47f
[skip ci] Use StringUtils.decodeUri in a couple places (#2831)
Gives us just one place to update the API when we get there
2026-05-23 22:44:31 +00:00
Luna712
c6c70d5751
[skip ci] Remove an unused import (#2830) 2026-05-23 22:43:32 +00:00
Luna712
c1b49d0dcb
[skip ci] Replace charset string conversions with Kotlin native equivalents (#2807) 2026-05-23 20:34:13 +00:00
Luna712
85cc10c2e0
[skip ci] Replace usage of String.format in library (#2819) 2026-05-23 20:20:50 +00:00
Luna712
dd016341c0
[skip ci] Replace ArrayList in extractor (#2826) 2026-05-23 20:11:46 +00:00
Luna712
ac0a0d2941
[skip ci] Replace Integer.parseInt with Kotlin-native equivalent (#2827) 2026-05-23 20:10:21 +00:00
Osten
4ab97e4605
Delete issue workflow to prevent security issues 2026-05-23 18:02:53 +02:00
Luna712
f894b8f7ec
SubtitleHelper: replace usage of java.lang.Character (#2817) 2026-05-22 22:53:46 +00:00
Luna712
72386cb98c
[skip ci] HlsPlaylistParser: don't use java.lang.StringBuilder directly (#2811)
Just using StringBuilder will allow it to use kotlin.text.StringBuilder from Kotlin instead, which it already does in some places, making using java.lang.StringBuilder in here very inconsistent with other parts of the same class.
2026-05-21 22:01:46 +00:00
Luna712
419b902ead
[skip ci] Use this::class rather than javaClass in MainAPI (#2809) 2026-05-21 21:45:04 +00:00
Luna712
638d749945
[skip ci] Remove usage of junit within the app itself (#2820)
When I was testing compose, I realized that this causes issues where junit was wiring up instrumentation within the app, which overrode and conflicted with compose resource context. We don't need it as a dependency for just TestingUtils, so this refsctors it to just use AssertionError directly.
2026-05-21 21:29:33 +00:00
Luna712
0f41ca2641
[skip ci] Don't pass locale to titlecase in String.capitalize (#2810)
That is the default anyway.
2026-05-21 21:17:03 +00:00
Luna712
a6000fbe04
[skip ci] AppDebug: use kotlin.concurrent.Volatile (#2818)
By default this uses kotlin.jvm.Volatile, which we should be using kotlin.concurrent.Volatile instead.
2026-05-21 21:09:13 +00:00
Abodabodd
862e2590d2
Update StreamWishExtractor.kt (#2770) 2026-05-19 16:45:58 +00:00
fire-light43
9bc5027ea7
shared buffer to decrease alloc (#2787) 2026-05-19 01:19:16 +02:00
Luna712
7e406cb5eb
CryptoJS: replace array copies with Kotlin stdlib equivalents (#2799)
* Remove use of java.util.Arrays

* Remove unused import

* Replace more
2026-05-19 01:13:57 +02:00
Luna712
a24dc2600e
JsHunter/JsUnpacker: use Kotlin-native regex (#2803) 2026-05-19 01:06:07 +02:00
Luna712
89cc63673b
Remove okhttp3.HttpUrl version of loadImage (#2790)
It is currently unused and at some point we will want to move coil to use ktor and fully phase out the dependency on okhttp so we don't an unnecessary extra dependency on it.
2026-05-19 01:00:10 +02:00
Luna712
ab85737637
[skip ci] TraktProvider: use text rather than toString for app.get (#2804)
toString is just an alias to text at the moment, but isn't really clear, and isn't really what it is meant for.
2026-05-18 22:35:44 +00:00
Alvin
9a53e267ac
fix: only return subtitle if not null (#2794) 2026-05-18 01:29:59 +02:00
Asheesh Sahu
03eb6ccd45
fix: implement memory-based throttle to prevent OOM during downloads (#2786) 2026-05-12 15:58:48 +00:00
Asheesh Sahu
7425d283cd
fix: external player visibility on Android 11+ (#2785) 2026-05-12 15:30:17 +00:00
fire-light43
6eb833130d
Fix rare bug in the download queue 2026-05-11 15:59:00 +00:00
recloudstream[bot]
3d1852ba04 chore(locales): fix locale issues 2026-05-11 13:02:22 +00:00
fire-light43
59ae579b7c
Merge pull request #2754 from recloudstream/weblate
Translations update from Hosted Weblate
2026-05-11 13:02:02 +00:00
Hosted Weblate
aa6e702b59
Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (729 of 729 strings)

Translated using Weblate (Chinese (Traditional Han script))

Currently translated at 100.0% (729 of 729 strings)

Translated using Weblate (Vietnamese)

Currently translated at 100.0% (729 of 729 strings)

Translated using Weblate (Indonesian)

Currently translated at 100.0% (729 of 729 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Vietnamese)

Currently translated at 100.0% (729 of 729 strings)

Translated using Weblate (Belarusian)

Currently translated at 99.5% (726 of 729 strings)

Translated using Weblate (Croatian)

Currently translated at 100.0% (729 of 729 strings)

Translated using Weblate (French)

Currently translated at 100.0% (729 of 729 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (729 of 729 strings)

Translated using Weblate (Albanian)

Currently translated at 100.0% (729 of 729 strings)

Translated using Weblate (Arabic)

Currently translated at 99.5% (726 of 729 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (729 of 729 strings)

Translated using Weblate (Arabic (Levantine))

Currently translated at 100.0% (729 of 729 strings)

Translated using Weblate (Albanian)

Currently translated at 77.2% (563 of 729 strings)

Translated using Weblate (Italian)

Currently translated at 99.8% (728 of 729 strings)

Translated using Weblate (Swedish)

Currently translated at 100.0% (729 of 729 strings)

Translated using Weblate (Swedish)

Currently translated at 100.0% (729 of 729 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (729 of 729 strings)

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (729 of 729 strings)

Translated using Weblate (Korean)

Currently translated at 100.0% (729 of 729 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (729 of 729 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (729 of 729 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (729 of 729 strings)

Update translation files

Updated by "Remove blank strings" hook in Weblate.

Translated using Weblate (Czech)

Currently translated at 100.0% (726 of 726 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (726 of 726 strings)

Translated using Weblate (Norwegian Nynorsk)

Currently translated at 25.2% (183 of 726 strings)

Translated using Weblate (Norwegian Nynorsk)

Currently translated at 25.2% (183 of 726 strings)

Translated using Weblate (Norwegian Nynorsk)

Currently translated at 25.2% (183 of 726 strings)

Translated using Weblate (Norwegian Nynorsk)

Currently translated at 25.2% (183 of 726 strings)

Translated using Weblate (Norwegian Nynorsk)

Currently translated at 25.2% (183 of 726 strings)

Translated using Weblate (Norwegian Nynorsk)

Currently translated at 25.2% (183 of 726 strings)

Translated using Weblate (Norwegian Nynorsk)

Currently translated at 25.2% (183 of 726 strings)

Translated using Weblate (Norwegian Nynorsk)

Currently translated at 25.2% (183 of 726 strings)

Translated using Weblate (Esperanto)

Currently translated at 23.6% (172 of 726 strings)

Translated using Weblate (Esperanto)

Currently translated at 23.6% (172 of 726 strings)

Translated using Weblate (Esperanto)

Currently translated at 23.6% (172 of 726 strings)

Translated using Weblate (Esperanto)

Currently translated at 23.6% (172 of 726 strings)

Translated using Weblate (Esperanto)

Currently translated at 23.6% (172 of 726 strings)

Translated using Weblate (Esperanto)

Currently translated at 23.6% (172 of 726 strings)

Translated using Weblate (Esperanto)

Currently translated at 23.6% (172 of 726 strings)

Translated using Weblate (Esperanto)

Currently translated at 23.6% (172 of 726 strings)

Translated using Weblate (Assamese)

Currently translated at 86.9% (631 of 726 strings)

Translated using Weblate (Assamese)

Currently translated at 86.9% (631 of 726 strings)

Translated using Weblate (Assamese)

Currently translated at 86.9% (631 of 726 strings)

Translated using Weblate (Arabic (Najdi))

Currently translated at 45.0% (327 of 726 strings)

Translated using Weblate (Arabic (Najdi))

Currently translated at 45.0% (327 of 726 strings)

Translated using Weblate (Arabic (Najdi))

Currently translated at 45.0% (327 of 726 strings)

Translated using Weblate (Arabic (Najdi))

Currently translated at 45.0% (327 of 726 strings)

Translated using Weblate (Arabic (Najdi))

Currently translated at 45.0% (327 of 726 strings)

Translated using Weblate (Spanish)

Currently translated at 99.8% (725 of 726 strings)

Translated using Weblate (Spanish)

Currently translated at 99.8% (725 of 726 strings)

Translated using Weblate (Spanish)

Currently translated at 99.8% (725 of 726 strings)

Translated using Weblate (Spanish)

Currently translated at 99.8% (725 of 726 strings)

Translated using Weblate (Spanish)

Currently translated at 99.8% (725 of 726 strings)

Translated using Weblate (Chinese (Traditional Han script))

Currently translated at 100.0% (726 of 726 strings)

Translated using Weblate (Chinese (Traditional Han script))

Currently translated at 100.0% (726 of 726 strings)

Translated using Weblate (Chinese (Traditional Han script))

Currently translated at 100.0% (726 of 726 strings)

Translated using Weblate (Bulgarian)

Currently translated at 99.0% (719 of 726 strings)

Translated using Weblate (Bulgarian)

Currently translated at 99.0% (719 of 726 strings)

Translated using Weblate (Bulgarian)

Currently translated at 99.0% (719 of 726 strings)

Translated using Weblate (Bulgarian)

Currently translated at 99.0% (719 of 726 strings)

Translated using Weblate (Bulgarian)

Currently translated at 99.0% (719 of 726 strings)

Translated using Weblate (Bulgarian)

Currently translated at 99.0% (719 of 726 strings)

Translated using Weblate (Persian)

Currently translated at 46.5% (338 of 726 strings)

Translated using Weblate (Persian)

Currently translated at 46.5% (338 of 726 strings)

Translated using Weblate (Persian)

Currently translated at 46.5% (338 of 726 strings)

Translated using Weblate (Persian)

Currently translated at 46.5% (338 of 726 strings)

Translated using Weblate (Persian)

Currently translated at 46.5% (338 of 726 strings)

Translated using Weblate (Persian)

Currently translated at 46.5% (338 of 726 strings)

Translated using Weblate (Persian)

Currently translated at 46.5% (338 of 726 strings)

Translated using Weblate (Persian)

Currently translated at 46.5% (338 of 726 strings)

Translated using Weblate (Galician)

Currently translated at 38.9% (283 of 726 strings)

Translated using Weblate (Galician)

Currently translated at 38.9% (283 of 726 strings)

Translated using Weblate (Galician)

Currently translated at 38.9% (283 of 726 strings)

Translated using Weblate (Galician)

Currently translated at 38.9% (283 of 726 strings)

Translated using Weblate (Galician)

Currently translated at 38.9% (283 of 726 strings)

Translated using Weblate (Galician)

Currently translated at 38.9% (283 of 726 strings)

Translated using Weblate (Catalan)

Currently translated at 45.0% (327 of 726 strings)

Translated using Weblate (Dutch)

Currently translated at 88.9% (646 of 726 strings)

Translated using Weblate (Dutch)

Currently translated at 88.9% (646 of 726 strings)

Translated using Weblate (Dutch)

Currently translated at 88.9% (646 of 726 strings)

Translated using Weblate (Dutch)

Currently translated at 88.9% (646 of 726 strings)

Translated using Weblate (Dutch)

Currently translated at 88.9% (646 of 726 strings)

Translated using Weblate (Dutch)

Currently translated at 88.9% (646 of 726 strings)

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (726 of 726 strings)

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (726 of 726 strings)

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (726 of 726 strings)

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (726 of 726 strings)

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (726 of 726 strings)

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (726 of 726 strings)

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (726 of 726 strings)

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (726 of 726 strings)

Translated using Weblate (Portuguese)

Currently translated at 99.8% (725 of 726 strings)

Translated using Weblate (Portuguese)

Currently translated at 99.8% (725 of 726 strings)

Translated using Weblate (Portuguese)

Currently translated at 99.8% (725 of 726 strings)

Translated using Weblate (Portuguese)

Currently translated at 99.8% (725 of 726 strings)

Translated using Weblate (Portuguese)

Currently translated at 99.8% (725 of 726 strings)

Translated using Weblate (Portuguese)

Currently translated at 99.8% (725 of 726 strings)

Translated using Weblate (Portuguese)

Currently translated at 99.8% (725 of 726 strings)

Translated using Weblate (Amharic)

Currently translated at 14.4% (105 of 726 strings)

Translated using Weblate (Amharic)

Currently translated at 14.4% (105 of 726 strings)

Translated using Weblate (Amharic)

Currently translated at 14.4% (105 of 726 strings)

Translated using Weblate (Amharic)

Currently translated at 14.4% (105 of 726 strings)

Translated using Weblate (Amharic)

Currently translated at 14.4% (105 of 726 strings)

Translated using Weblate (Amharic)

Currently translated at 14.4% (105 of 726 strings)

Translated using Weblate (Amharic)

Currently translated at 14.4% (105 of 726 strings)

Translated using Weblate (Albanian)

Currently translated at 73.1% (531 of 726 strings)

Translated using Weblate (Albanian)

Currently translated at 73.1% (531 of 726 strings)

Translated using Weblate (Korean)

Currently translated at 100.0% (726 of 726 strings)

Translated using Weblate (Korean)

Currently translated at 100.0% (726 of 726 strings)

Translated using Weblate (Korean)

Currently translated at 100.0% (726 of 726 strings)

Translated using Weblate (Korean)

Currently translated at 100.0% (726 of 726 strings)

Translated using Weblate (Kannada)

Currently translated at 17.4% (127 of 726 strings)

Translated using Weblate (Kannada)

Currently translated at 17.4% (127 of 726 strings)

Translated using Weblate (Kannada)

Currently translated at 17.4% (127 of 726 strings)

Translated using Weblate (Kannada)

Currently translated at 17.4% (127 of 726 strings)

Translated using Weblate (Kannada)

Currently translated at 17.4% (127 of 726 strings)

Translated using Weblate (Kannada)

Currently translated at 17.4% (127 of 726 strings)

Translated using Weblate (Kannada)

Currently translated at 17.4% (127 of 726 strings)

Translated using Weblate (Nepali)

Currently translated at 17.0% (124 of 726 strings)

Translated using Weblate (Nepali)

Currently translated at 17.0% (124 of 726 strings)

Translated using Weblate (Nepali)

Currently translated at 17.0% (124 of 726 strings)

Translated using Weblate (Nepali)

Currently translated at 17.0% (124 of 726 strings)

Translated using Weblate (Swedish)

Currently translated at 100.0% (726 of 726 strings)

Translated using Weblate (Swedish)

Currently translated at 100.0% (726 of 726 strings)

Translated using Weblate (Swedish)

Currently translated at 100.0% (726 of 726 strings)

Translated using Weblate (Swedish)

Currently translated at 100.0% (726 of 726 strings)

Translated using Weblate (Swedish)

Currently translated at 100.0% (726 of 726 strings)

Translated using Weblate (Swedish)

Currently translated at 100.0% (726 of 726 strings)

Translated using Weblate (Japanese)

Currently translated at 99.8% (725 of 726 strings)

Translated using Weblate (Japanese)

Currently translated at 99.8% (725 of 726 strings)

Translated using Weblate (Japanese)

Currently translated at 99.8% (725 of 726 strings)

Translated using Weblate (Japanese)

Currently translated at 99.8% (725 of 726 strings)

Translated using Weblate (Azerbaijani)

Currently translated at 19.8% (144 of 726 strings)

Translated using Weblate (Azerbaijani)

Currently translated at 19.8% (144 of 726 strings)

Translated using Weblate (Norwegian Bokmål)

Currently translated at 65.7% (477 of 726 strings)

Translated using Weblate (Norwegian Bokmål)

Currently translated at 65.7% (477 of 726 strings)

Translated using Weblate (Norwegian Bokmål)

Currently translated at 65.7% (477 of 726 strings)

Translated using Weblate (Norwegian Bokmål)

Currently translated at 65.7% (477 of 726 strings)

Translated using Weblate (Norwegian Bokmål)

Currently translated at 65.7% (477 of 726 strings)

Translated using Weblate (Norwegian Bokmål)

Currently translated at 65.7% (477 of 726 strings)

Translated using Weblate (Romanian)

Currently translated at 84.8% (616 of 726 strings)

Translated using Weblate (Romanian)

Currently translated at 84.8% (616 of 726 strings)

Translated using Weblate (Romanian)

Currently translated at 84.8% (616 of 726 strings)

Translated using Weblate (Romanian)

Currently translated at 84.8% (616 of 726 strings)

Translated using Weblate (Romanian)

Currently translated at 84.8% (616 of 726 strings)

Translated using Weblate (Romanian)

Currently translated at 84.8% (616 of 726 strings)

Translated using Weblate (Odia)

Currently translated at 21.4% (156 of 726 strings)

Translated using Weblate (Odia)

Currently translated at 21.4% (156 of 726 strings)

Translated using Weblate (Odia)

Currently translated at 21.4% (156 of 726 strings)

Translated using Weblate (Odia)

Currently translated at 21.4% (156 of 726 strings)

Translated using Weblate (Vietnamese)

Currently translated at 100.0% (726 of 726 strings)

Translated using Weblate (Vietnamese)

Currently translated at 100.0% (726 of 726 strings)

Translated using Weblate (Vietnamese)

Currently translated at 100.0% (726 of 726 strings)

Translated using Weblate (Russian)

Currently translated at 99.8% (725 of 726 strings)

Translated using Weblate (Russian)

Currently translated at 99.8% (725 of 726 strings)

Translated using Weblate (Russian)

Currently translated at 99.8% (725 of 726 strings)

Translated using Weblate (Russian)

Currently translated at 99.8% (725 of 726 strings)

Translated using Weblate (Russian)

Currently translated at 99.8% (725 of 726 strings)

Translated using Weblate (Russian)

Currently translated at 99.8% (725 of 726 strings)

Translated using Weblate (Russian)

Currently translated at 99.8% (725 of 726 strings)

Translated using Weblate (Russian)

Currently translated at 99.8% (725 of 726 strings)

Translated using Weblate (Russian)

Currently translated at 99.8% (725 of 726 strings)

Translated using Weblate (Croatian)

Currently translated at 99.8% (725 of 726 strings)

Translated using Weblate (Croatian)

Currently translated at 99.8% (725 of 726 strings)

Translated using Weblate (Croatian)

Currently translated at 99.8% (725 of 726 strings)

Translated using Weblate (Arabic)

Currently translated at 100.0% (726 of 726 strings)

Translated using Weblate (Arabic)

Currently translated at 100.0% (726 of 726 strings)

Translated using Weblate (Arabic)

Currently translated at 100.0% (726 of 726 strings)

Translated using Weblate (Maltese)

Currently translated at 16.6% (121 of 726 strings)

Translated using Weblate (Maltese)

Currently translated at 16.6% (121 of 726 strings)

Translated using Weblate (Maltese)

Currently translated at 16.6% (121 of 726 strings)

Translated using Weblate (Greek)

Currently translated at 90.4% (657 of 726 strings)

Translated using Weblate (Greek)

Currently translated at 90.4% (657 of 726 strings)

Translated using Weblate (Greek)

Currently translated at 90.4% (657 of 726 strings)

Translated using Weblate (Greek)

Currently translated at 90.4% (657 of 726 strings)

Translated using Weblate (Greek)

Currently translated at 90.4% (657 of 726 strings)

Translated using Weblate (Greek)

Currently translated at 90.4% (657 of 726 strings)

Translated using Weblate (Hebrew)

Currently translated at 72.5% (527 of 726 strings)

Translated using Weblate (Hebrew)

Currently translated at 72.5% (527 of 726 strings)

Translated using Weblate (Hebrew)

Currently translated at 72.5% (527 of 726 strings)

Translated using Weblate (Hebrew)

Currently translated at 72.5% (527 of 726 strings)

Translated using Weblate (Hebrew)

Currently translated at 72.5% (527 of 726 strings)

Translated using Weblate (Hebrew)

Currently translated at 72.5% (527 of 726 strings)

Translated using Weblate (Hebrew)

Currently translated at 72.5% (527 of 726 strings)

Translated using Weblate (Hebrew)

Currently translated at 72.5% (527 of 726 strings)

Translated using Weblate (Hungarian)

Currently translated at 81.9% (595 of 726 strings)

Translated using Weblate (Hungarian)

Currently translated at 81.9% (595 of 726 strings)

Translated using Weblate (Hungarian)

Currently translated at 81.9% (595 of 726 strings)

Translated using Weblate (Hungarian)

Currently translated at 81.9% (595 of 726 strings)

Translated using Weblate (Hungarian)

Currently translated at 81.9% (595 of 726 strings)

Translated using Weblate (Hungarian)

Currently translated at 81.9% (595 of 726 strings)

Translated using Weblate (Hungarian)

Currently translated at 81.9% (595 of 726 strings)

Translated using Weblate (Slovak)

Currently translated at 62.5% (454 of 726 strings)

Translated using Weblate (Slovak)

Currently translated at 62.5% (454 of 726 strings)

Translated using Weblate (Slovak)

Currently translated at 62.5% (454 of 726 strings)

Translated using Weblate (Slovak)

Currently translated at 62.5% (454 of 726 strings)

Translated using Weblate (Slovak)

Currently translated at 62.5% (454 of 726 strings)

Translated using Weblate (Slovak)

Currently translated at 62.5% (454 of 726 strings)

Translated using Weblate (Slovak)

Currently translated at 62.5% (454 of 726 strings)

Translated using Weblate (Afrikaans)

Currently translated at 16.2% (118 of 726 strings)

Translated using Weblate (Afrikaans)

Currently translated at 16.2% (118 of 726 strings)

Translated using Weblate (Afrikaans)

Currently translated at 16.2% (118 of 726 strings)

Translated using Weblate (Afrikaans)

Currently translated at 16.2% (118 of 726 strings)

Translated using Weblate (Afrikaans)

Currently translated at 16.2% (118 of 726 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (726 of 726 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (726 of 726 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (726 of 726 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (726 of 726 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (726 of 726 strings)

Translated using Weblate (Bengali)

Currently translated at 48.2% (350 of 726 strings)

Translated using Weblate (Bengali)

Currently translated at 48.2% (350 of 726 strings)

Translated using Weblate (Bengali)

Currently translated at 48.2% (350 of 726 strings)

Translated using Weblate (Bengali)

Currently translated at 48.2% (350 of 726 strings)

Translated using Weblate (Bengali)

Currently translated at 48.2% (350 of 726 strings)

Translated using Weblate (Bengali)

Currently translated at 48.2% (350 of 726 strings)

Translated using Weblate (Bengali)

Currently translated at 48.2% (350 of 726 strings)

Translated using Weblate (Bengali)

Currently translated at 48.2% (350 of 726 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (726 of 726 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (726 of 726 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (726 of 726 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (726 of 726 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (726 of 726 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (726 of 726 strings)

Translated using Weblate (Indonesian)

Currently translated at 100.0% (726 of 726 strings)

Translated using Weblate (Indonesian)

Currently translated at 100.0% (726 of 726 strings)

Translated using Weblate (Indonesian)

Currently translated at 100.0% (726 of 726 strings)

Translated using Weblate (Indonesian)

Currently translated at 100.0% (726 of 726 strings)

Translated using Weblate (Macedonian)

Currently translated at 96.4% (700 of 726 strings)

Translated using Weblate (Macedonian)

Currently translated at 96.4% (700 of 726 strings)

Translated using Weblate (Malay)

Currently translated at 65.8% (478 of 726 strings)

Translated using Weblate (Malay)

Currently translated at 65.8% (478 of 726 strings)

Translated using Weblate (Malay)

Currently translated at 65.8% (478 of 726 strings)

Translated using Weblate (Malay)

Currently translated at 65.8% (478 of 726 strings)

Translated using Weblate (Malay)

Currently translated at 65.8% (478 of 726 strings)

Translated using Weblate (Malay)

Currently translated at 65.8% (478 of 726 strings)

Translated using Weblate (Malay)

Currently translated at 65.8% (478 of 726 strings)

Translated using Weblate (Lithuanian)

Currently translated at 29.7% (216 of 726 strings)

Translated using Weblate (Lithuanian)

Currently translated at 29.7% (216 of 726 strings)

Translated using Weblate (Lithuanian)

Currently translated at 29.7% (216 of 726 strings)

Translated using Weblate (Lithuanian)

Currently translated at 29.7% (216 of 726 strings)

Translated using Weblate (Lithuanian)

Currently translated at 29.7% (216 of 726 strings)

Translated using Weblate (Arabic (Egyptian))

Currently translated at 0.0% (0 of 726 strings)

Translated using Weblate (Filipino)

Currently translated at 21.2% (154 of 726 strings)

Translated using Weblate (Filipino)

Currently translated at 21.2% (154 of 726 strings)

Translated using Weblate (Filipino)

Currently translated at 21.2% (154 of 726 strings)

Translated using Weblate (Filipino)

Currently translated at 21.2% (154 of 726 strings)

Translated using Weblate (Hindi)

Currently translated at 56.6% (411 of 726 strings)

Translated using Weblate (Hindi)

Currently translated at 56.6% (411 of 726 strings)

Translated using Weblate (Hindi)

Currently translated at 56.6% (411 of 726 strings)

Translated using Weblate (Hindi)

Currently translated at 56.6% (411 of 726 strings)

Translated using Weblate (Hindi)

Currently translated at 56.6% (411 of 726 strings)

Translated using Weblate (Hindi)

Currently translated at 56.6% (411 of 726 strings)

Translated using Weblate (Hindi)

Currently translated at 56.6% (411 of 726 strings)

Translated using Weblate (Hindi)

Currently translated at 56.6% (411 of 726 strings)

Translated using Weblate (Hindi)

Currently translated at 56.6% (411 of 726 strings)

Translated using Weblate (Tigrinya)

Currently translated at 0.4% (3 of 726 strings)

Translated using Weblate (Tigrinya)

Currently translated at 0.4% (3 of 726 strings)

Translated using Weblate (Tigrinya)

Currently translated at 0.4% (3 of 726 strings)

Translated using Weblate (Tigrinya)

Currently translated at 0.4% (3 of 726 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (726 of 726 strings)

Translated using Weblate (Tamil)

Currently translated at 99.8% (725 of 726 strings)

Translated using Weblate (Tamil)

Currently translated at 99.8% (725 of 726 strings)

Translated using Weblate (Kurdish (Central))

Currently translated at 11.2% (82 of 726 strings)

Translated using Weblate (Tagalog)

Currently translated at 32.5% (236 of 726 strings)

Translated using Weblate (Tagalog)

Currently translated at 32.5% (236 of 726 strings)

Translated using Weblate (Tagalog)

Currently translated at 32.5% (236 of 726 strings)

Translated using Weblate (Tagalog)

Currently translated at 32.5% (236 of 726 strings)

Translated using Weblate (Tagalog)

Currently translated at 32.5% (236 of 726 strings)

Translated using Weblate (Tagalog)

Currently translated at 32.5% (236 of 726 strings)

Translated using Weblate (Tagalog)

Currently translated at 32.5% (236 of 726 strings)

Translated using Weblate (Burmese)

Currently translated at 69.1% (502 of 726 strings)

Translated using Weblate (Burmese)

Currently translated at 69.1% (502 of 726 strings)

Translated using Weblate (Burmese)

Currently translated at 69.1% (502 of 726 strings)

Translated using Weblate (Burmese)

Currently translated at 69.1% (502 of 726 strings)

Translated using Weblate (Burmese)

Currently translated at 69.1% (502 of 726 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 99.8% (725 of 726 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 99.8% (725 of 726 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 99.8% (725 of 726 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 99.8% (725 of 726 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 99.8% (725 of 726 strings)

Translated using Weblate (Urdu)

Currently translated at 81.8% (594 of 726 strings)

Translated using Weblate (Urdu)

Currently translated at 81.8% (594 of 726 strings)

Translated using Weblate (Urdu)

Currently translated at 81.8% (594 of 726 strings)

Translated using Weblate (Urdu)

Currently translated at 81.8% (594 of 726 strings)

Translated using Weblate (Urdu)

Currently translated at 81.8% (594 of 726 strings)

Translated using Weblate (Urdu)

Currently translated at 81.8% (594 of 726 strings)

Translated using Weblate (German)

Currently translated at 99.8% (725 of 726 strings)

Translated using Weblate (German)

Currently translated at 99.8% (725 of 726 strings)

Translated using Weblate (German)

Currently translated at 99.8% (725 of 726 strings)

Translated using Weblate (German)

Currently translated at 99.8% (725 of 726 strings)

Translated using Weblate (German)

Currently translated at 99.8% (725 of 726 strings)

Translated using Weblate (German)

Currently translated at 99.8% (725 of 726 strings)

Translated using Weblate (German)

Currently translated at 99.8% (725 of 726 strings)

Translated using Weblate (German)

Currently translated at 99.8% (725 of 726 strings)

Translated using Weblate (German)

Currently translated at 99.8% (725 of 726 strings)

Translated using Weblate (German)

Currently translated at 99.8% (725 of 726 strings)

Translated using Weblate (Arabic (Levantine))

Currently translated at 96.9% (704 of 726 strings)

Translated using Weblate (Arabic (Levantine))

Currently translated at 96.9% (704 of 726 strings)

Translated using Weblate (Latvian)

Currently translated at 80.8% (587 of 726 strings)

Translated using Weblate (Latvian)

Currently translated at 80.8% (587 of 726 strings)

Translated using Weblate (Latvian)

Currently translated at 80.8% (587 of 726 strings)

Translated using Weblate (Latvian)

Currently translated at 80.8% (587 of 726 strings)

Translated using Weblate (Latvian)

Currently translated at 80.8% (587 of 726 strings)

Translated using Weblate (Somali)

Currently translated at 60.4% (439 of 726 strings)

Translated using Weblate (Somali)

Currently translated at 60.4% (439 of 726 strings)

Translated using Weblate (Somali)

Currently translated at 60.4% (439 of 726 strings)

Translated using Weblate (Somali)

Currently translated at 60.4% (439 of 726 strings)

Translated using Weblate (Somali)

Currently translated at 60.4% (439 of 726 strings)

Translated using Weblate (Somali)

Currently translated at 60.4% (439 of 726 strings)

Translated using Weblate (Somali)

Currently translated at 60.4% (439 of 726 strings)

Translated using Weblate (Malayalam)

Currently translated at 31.2% (227 of 726 strings)

Translated using Weblate (Malayalam)

Currently translated at 31.2% (227 of 726 strings)

Translated using Weblate (Malayalam)

Currently translated at 31.2% (227 of 726 strings)

Translated using Weblate (Malayalam)

Currently translated at 31.2% (227 of 726 strings)

Translated using Weblate (Malayalam)

Currently translated at 31.2% (227 of 726 strings)

Translated using Weblate (Malayalam)

Currently translated at 31.2% (227 of 726 strings)

Translated using Weblate (Malayalam)

Currently translated at 31.2% (227 of 726 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (726 of 726 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (726 of 726 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (726 of 726 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (726 of 726 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (726 of 726 strings)

Translated using Weblate (qt (generated) (qt))

Currently translated at 85.3% (620 of 726 strings)

Translated using Weblate (qt (generated) (qt))

Currently translated at 85.3% (620 of 726 strings)

Translated using Weblate (qt (generated) (qt))

Currently translated at 85.3% (620 of 726 strings)

Translated using Weblate (qt (generated) (qt))

Currently translated at 85.3% (620 of 726 strings)

Translated using Weblate (qt (generated) (qt))

Currently translated at 85.3% (620 of 726 strings)

Translated using Weblate (qt (generated) (qt))

Currently translated at 85.3% (620 of 726 strings)

Translated using Weblate (French)

Currently translated at 100.0% (726 of 726 strings)

Translated using Weblate (French)

Currently translated at 100.0% (726 of 726 strings)

Translated using Weblate (French)

Currently translated at 100.0% (726 of 726 strings)

Translated using Weblate (French)

Currently translated at 100.0% (726 of 726 strings)

Translated using Weblate (French)

Currently translated at 100.0% (726 of 726 strings)

Translated using Weblate (French)

Currently translated at 100.0% (726 of 726 strings)

Translated using Weblate (French)

Currently translated at 100.0% (726 of 726 strings)

Translated using Weblate (French)

Currently translated at 100.0% (726 of 726 strings)

Translated using Weblate (French)

Currently translated at 100.0% (726 of 726 strings)

Translated using Weblate (French)

Currently translated at 100.0% (726 of 726 strings)

Translated using Weblate (French)

Currently translated at 100.0% (726 of 726 strings)

Translated using Weblate (French)

Currently translated at 100.0% (726 of 726 strings)

Translated using Weblate (French)

Currently translated at 100.0% (726 of 726 strings)

Translated using Weblate (French)

Currently translated at 100.0% (726 of 726 strings)

Translated using Weblate (French)

Currently translated at 100.0% (726 of 726 strings)

Translated using Weblate (French)

Currently translated at 100.0% (726 of 726 strings)

Translated using Weblate (French)

Currently translated at 100.0% (726 of 726 strings)

Co-authored-by: 007 <juri.malaj@gmail.com>
Co-authored-by: Aayush Shah <shahaayush999@gmail.com>
Co-authored-by: Adolfo Jayme Barrientos <fitojb@ubuntu.com>
Co-authored-by: Ahmed Abd El-Fattah <a.aelfattah5@gmail.com>
Co-authored-by: Aitor Salaberria <amento@ni.eus>
Co-authored-by: Akhlak Ur Rahman <akhlak.pro.red@gmail.com>
Co-authored-by: Alex Georgiou <alexandrosgeorgiou35@gmail.com>
Co-authored-by: Alexander Svärd <genc.demiri@hotmail.com>
Co-authored-by: Alexandru <negrualexandru52@gmail.com>
Co-authored-by: Allan Nordhøy <epost@anotheragency.no>
Co-authored-by: Anarchydr <patrikpik879@gmail.com>
Co-authored-by: Andre Costa <andrecaeu@gmail.com>
Co-authored-by: Anonymous <noreply@weblate.org>
Co-authored-by: Apostol Penkov <apostol.penkov@gmail.com>
Co-authored-by: Argo Carpathians <chrisarabagas@gmail.com>
Co-authored-by: Azgar <azgaresncf@gmail.com>
Co-authored-by: Balmunk <reilria77@gmail.com>
Co-authored-by: Bananenbrot <keram2810@outlook.de>
Co-authored-by: Beabfekad Zikie <beabfekadz@gmail.com>
Co-authored-by: Bhupesh Yadav <thebhupeshyadav@gmail.com>
Co-authored-by: Bitpaint <bitpaintclub@gmail.com>
Co-authored-by: BluTiger <beqirstafa@gmail.com>
Co-authored-by: ButterflyOfFire <boffire@users.noreply.hosted.weblate.org>
Co-authored-by: Bálint László <blaszlobors@gmail.com>
Co-authored-by: Carlos Luiz <ecarlos-luiz@hotmail.com>
Co-authored-by: Chaya Endot <cheyenne.xyn@gmail.com>
Co-authored-by: Cloudburst <18114966+C10udburst@users.noreply.github.com>
Co-authored-by: Clxff H3r4ld0 <123844876+clxf12@users.noreply.github.com>
Co-authored-by: Dan <jonweblin2205@protonmail.com>
Co-authored-by: DarkOrbFX <darkorbfx@gmail.com>
Co-authored-by: Davide Marcoli <davide.marcoli13@gmail.com>
Co-authored-by: Deleted User <Skrripy@users.noreply.hosted.weblate.org>
Co-authored-by: Deleted User <inavleb@users.noreply.hosted.weblate.org>
Co-authored-by: Deleted User <jsdelvani@users.noreply.hosted.weblate.org>
Co-authored-by: Deleted User <noreply+48943@weblate.org>
Co-authored-by: Deleted User <noreply+53776@weblate.org>
Co-authored-by: Deleted User <noreply+68493@weblate.org>
Co-authored-by: Doctorredits_here <182783629+doctorreditshere@users.noreply.github.com>
Co-authored-by: Emmanuel HEMERIT <emmanuel@hemer.it>
Co-authored-by: Eryk Michalak <gnu.ewm@protonmail.com>
Co-authored-by: FastAct <alex.rijckaert@gmail.com>
Co-authored-by: Felicity <kjev666+weblate@protonmail.com>
Co-authored-by: Fjuro <fjuro@users.noreply.hosted.weblate.org>
Co-authored-by: Francisco Serrador <fserrador@gmail.com>
Co-authored-by: Gabriel <bloxgabriel18@gmail.com>
Co-authored-by: Gabriel Cnudde <gabriel.cnudde59@gmail.com>
Co-authored-by: Giuseppe Terrana <terranagiuseppe03@gmail.com>
Co-authored-by: Gnkalk <github.fngyb@slmail.me>
Co-authored-by: H Tamás <hovanszki@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Imprevisible <imprevisible@duck.com>
Co-authored-by: Itsmechinmoy <167056923+itsmechinmoy@users.noreply.github.com>
Co-authored-by: J. Lavoie <j.lavoie@net-c.ca>
Co-authored-by: JL Pilgram <twich_89@hotmail.it>
Co-authored-by: Jean-Michel <arsene_lupin_57@hotmail.fr>
Co-authored-by: Jen Xie <aulaul825879@gmail.com>
Co-authored-by: Joana Trashlieva <j.trashlieva@gmail.com>
Co-authored-by: John Titor <utkin2007@gmail.com>
Co-authored-by: Joshua Joseph <joshuasaju2@gmail.com>
Co-authored-by: Julia Sugawara <jm.sugawara@gmail.com>
Co-authored-by: Kardi Demha <kardi.demha@gmail.com>
Co-authored-by: Konstantinos Tranoudis <kontranpro@gmail.com>
Co-authored-by: Kraptor123 <kraptor121@gmail.com>
Co-authored-by: LagradOst <46196380+Blatzar@users.noreply.github.com>
Co-authored-by: Leon de Klerk <deklerkleon5@gmail.com>
Co-authored-by: Levi Klippel <leviklippel@gmail.com>
Co-authored-by: LiJu09 <lisojuraj@gmail.com>
Co-authored-by: LucasMZ <git@lucasmz.dev>
Co-authored-by: Ludovic Pagès <nanucq@proton.me>
Co-authored-by: Luna712 <142361265+Luna712@users.noreply.github.com>
Co-authored-by: Man <thebroker2308@gmail.com>
Co-authored-by: Marian Turba <puki247@gmail.com>
Co-authored-by: Massimo Pissarello <mapi68@gmail.com>
Co-authored-by: Matthaiks <kitynska@gmail.com>
Co-authored-by: Michael John Scerri <michaeljscerri@gmail.com>
Co-authored-by: Mika <akimivanov43@gmail.com>
Co-authored-by: Milo Ivir <mail@milotype.de>
Co-authored-by: Muhammad Fahad Khan <itxmfahadkhan@gmail.com>
Co-authored-by: Muhammet <zumruduanka0013@gmail.com>
Co-authored-by: Murat Han <murathancw@gmail.com>
Co-authored-by: Márkó <gost1336@gmail.com>
Co-authored-by: Naga <yz2000.pro@gmail.com>
Co-authored-by: Nataniel Dika Kurniawan <hikawaart2@gmail.com>
Co-authored-by: Nguyễn Tiến Đạt <dn16092000@gmail.com>
Co-authored-by: Nicoara Alex <alex.nicoara@yahoo.com>
Co-authored-by: Nicola Bortoletto <nicola.bortoletto@live.com>
Co-authored-by: PaneradFisk <andre.bergvall@icloud.com>
Co-authored-by: PiterDev <piterzdev@gmail.com>
Co-authored-by: Pixelcode <pixelcode@dismail.de>
Co-authored-by: Pizza Party <paol.m@proton.me>
Co-authored-by: Posemartonis <weblate.drainage895@passmail.net>
Co-authored-by: Qareen Skoll <qareen101@protonmail.com>
Co-authored-by: Radoslav Lelchev <rlelchev@abv.bg>
Co-authored-by: Radoslav Vasilev Vasilev <fifata@gmail.com>
Co-authored-by: Ranforingus <ranforingus@hotmail.com>
Co-authored-by: Red Star Over Earth <rs0vere@outlook.com>
Co-authored-by: Rex_sa <rex.sa@pm.me>
Co-authored-by: Roi Gabay <roigby@gmail.com>
Co-authored-by: SBS1313 <simonsaade005@gmail.com>
Co-authored-by: Sam Cooper <samcooper838@gmail.com>
Co-authored-by: Samuel Gadiel <samuelgadiel@gmail.com>
Co-authored-by: Sandyran <sandyran@protonmail.com>
Co-authored-by: Sasha Glazko <lenify@users.noreply.hosted.weblate.org>
Co-authored-by: Sdarfeesh <Sdarfeesh@protonmail.com>
Co-authored-by: SehrGuterCode <philemonpfeiffer@gmail.com>
Co-authored-by: Shafici Isxariifshe <mega12xhaphiee@gmail.com>
Co-authored-by: ShareASmile <ShareASmile@users.noreply.hosted.weblate.org>
Co-authored-by: Sintayew Gashaw <sintayewgashaw4@gmail.com>
Co-authored-by: SleepyOwl <artem726artem@gmail.com>
Co-authored-by: Sufyan Zahoor Jutt <sufyanpahore@gmail.com>
Co-authored-by: Synertry <jonny.somrak@gmail.com>
Co-authored-by: T1z3n <info@njbraun.de>
Co-authored-by: TZVS <akyasan@tuta.io>
Co-authored-by: The Initiator <eithansten@gmail.com>
Co-authored-by: Tiago Lucas <tiago.slucas@gmail.com>
Co-authored-by: Tomas Andersson <jotakswe@users.noreply.hosted.weblate.org>
Co-authored-by: TubaApollo <86665265+TubaApollo@users.noreply.github.com>
Co-authored-by: Vrwi <jurgisbums@gmail.com>
Co-authored-by: Walter H. <walter75@gmail.com>
Co-authored-by: Wei-Cheng Yeh (IID) <iid@ccns.ncku.edu.tw>
Co-authored-by: almost gamer <almost.gamer01+language@gmail.com>
Co-authored-by: arcopnt <arcopnt@posteo.com>
Co-authored-by: bittin1ddc447d824349b2 <bittin@reimu.nl>
Co-authored-by: dabao1955 <dabao1955@163.com>
Co-authored-by: edgolron <edgolron@tutanota.com>
Co-authored-by: eightyy8 <oliver.kha@pm.me>
Co-authored-by: enly sure <enlysure@gmail.com>
Co-authored-by: esfzzddfse <esfzzddfse@proton.me>
Co-authored-by: george kitsoukakis <norhorn@gmail.com>
Co-authored-by: helpless_helper <dis.hd.eif.y.bk.ao.up@gmail.com>
Co-authored-by: hou1234 <gjqmgjsl3@gmail.com>
Co-authored-by: htet <htetoh2006@outlook.com>
Co-authored-by: hugoalh <hugoalh@users.noreply.hosted.weblate.org>
Co-authored-by: jinu147 <nesqea20@gmail.com>
Co-authored-by: kaajjo <claymanoff@gmail.com>
Co-authored-by: kerklangsi <arifilah.01@gmail.com>
Co-authored-by: khalidbelk <khalid.belkassmi-el-hafi@epitech.eu>
Co-authored-by: l <thisuserooo@gmail.com>
Co-authored-by: liva <livinja@proton.me>
Co-authored-by: mojtaba piri <Mpcuteangel@gmail.com>
Co-authored-by: ngocanhtve <ngocanh.tve@gmail.com>
Co-authored-by: opakholis <opakholis@users.noreply.hosted.weblate.org>
Co-authored-by: programutox <programutox@disroot.org>
Co-authored-by: stojkovskistefan <stefanstojkovski@gmail.com>
Co-authored-by: therry47 <soulietherry@gmail.com>
Co-authored-by: tuan041 <tuananh163025ttt@gmail.com>
Co-authored-by: william piti <loolyowo@gmail.com>
Co-authored-by: Ícaro Rodrigo Ferreira Da Fonseca Bezerra <icaro.bezerra@sptech.school>
Co-authored-by: Ömer Faruk Sancak <keyiflerolsun@gmail.com>
Co-authored-by: ΣΤΑΥΡΟΣ ΔΑΛΙΑΚΟΠΟΥΛΟΣ <stavros.daliakopoulos@gmail.com>
Co-authored-by: Влад Николаев <vladnic1990@gmail.com>
Co-authored-by: Сергей (MrSabin) <sabin.21011986@gmail.com>
Co-authored-by: தமிழ்நேரம் <tamilneram247@gmail.com>
Co-authored-by: 大王叫我来巡山 <hamburger2048@users.noreply.hosted.weblate.org>
Co-authored-by: 电棍老板 <qwertyuiop9296@outlook.com>
Co-authored-by: 구병우 <dodamby@ajou.ac.kr>
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/af/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/am/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/apc/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ar/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ars/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/arz/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/as/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/az/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/be/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/bg/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/bn/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ca/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ckb/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/cs/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/de/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/el/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/eo/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/es/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/fa/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/fil/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/fr/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/gl/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/he/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/hi/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/hr/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/hu/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/id/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/it/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ja/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/kn/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ko/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/lt/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/lv/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/mk/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ml/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ms/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/mt/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/my/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/nb_NO/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ne/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/nl/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/nn/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/or/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/pl/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/pt/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/pt_BR/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/qt/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ro/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ru/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/sk/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/so/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/sq/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/sv/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ta/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ti/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/tl/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/tr/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/uk/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ur/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/vi/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/zh_Hans/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/zh_Hant/
Translation: Cloudstream/App
2026-05-11 13:12:30 +02:00
firelight
0d16a636e2
Fix: playerVideoTitleRez visibility (#2767) 2026-05-06 20:13:29 +02:00
firelight
bfc926814c
Fixobserveorder (#2766) 2026-05-06 20:13:13 +02:00
firelight
a45f1d9ab1
Refactor: Player, Generator and ViewModel (#2764) 2026-05-06 02:29:47 +02:00
Luna712
948a2c1725
Always go to next source in player and add thread safety (#2733) 2026-05-04 21:57:27 +02:00
Luna712
4e24aa5db1
Minor fixes to player (#2756) 2026-05-04 18:43:01 +02:00
Osten
7476d24db3
Added exhaustive keyCode check, fixed #2757 2026-05-04 14:40:13 +02:00
firelight
c82fec0862
Refactor: Move all key logic into the player, and added toggleEpisodesOverlay keybind (#2745) 2026-05-03 22:46:09 +02:00
Luna712
e36e9e8d24
Use Looper.getMainLooper().isCurrentThread for simplicity (#2753) 2026-05-03 18:06:09 +02:00
Luna712
e64136db8a
Use runOnMainThread for simplicity (#2749) 2026-05-02 20:15:34 +02:00
Luna712
104ab26790
Use ioWorkSafe for updateFillers for simplification (#2743) 2026-05-01 18:53:30 +02:00
Osten
2400e6ab45
fixed observe, aka #2567 (#2736) 2026-04-30 17:23:49 +02:00
firelight
4cc76ee6c5
Fix(TV): Color on "Skip Chapter" button (#2731) 2026-04-30 17:23:08 +02:00
Luna712
8523a4bd90
Fix DownloadedPlayerActivity not loading new files when activity is already running (#2738) 2026-04-30 17:22:32 +02:00
Luna712
58f45c7bda
Remove unnecessary ?: 0 (#2734) 2026-04-30 00:46:12 +02:00
firelight
d30d71f39e
Fix(TV): Metadata hide episode selector #2715 (#2730) 2026-04-28 23:35:37 +02:00
Luna712
4610d6aae7
Revert "Improve subtitle selection UX: Move "No Subtitles" option to bottom (…" (#2720)
This reverts commit ee6a9af217.
2026-04-28 23:22:30 +02:00
firelight
9257d31090
Fix: Cancel popup dialog if dismissed (#2726) 2026-04-28 23:21:45 +02:00
firelight
2755385fa6
Feat: Ask for path before download from UI (#2699) 2026-04-28 23:21:32 +02:00
Luna712
18d9f5c317
Major rework to player (#2689) 2026-04-28 23:20:43 +02:00
Luna712
53345a804f
Enable abortOnError in lint (#2681) 2026-04-25 22:32:09 +00:00
Luna712
71306d4e98
[skip ci] Delete empty files (#2723) 2026-04-25 22:21:36 +00:00
firelight
6d79b0e5d0
Fix: Remove default headers from downloads, like player (#2722) 2026-04-25 01:17:32 +02:00
firelight
3bdda7d380
Feat: Anime Skip (#2710) 2026-04-25 00:29:37 +02:00
Luna712
659f639acd
Add new TVType for generic Video (#2712) 2026-04-25 00:26:07 +02:00
Luna712
1d750340a0
Fix some typos in singular (#2721) 2026-04-25 00:22:17 +02:00
Bnyro
d4899536d3
refactor(extractors): simplify and combine jwplayer extraction (#2398) 2026-04-22 00:45:04 +00:00
firelight
18ee71664f
Feat: Offline filler database (#2704) 2026-04-20 23:24:37 +00:00
Luna712
f7494f20e1
Support resuming fragmented MP4s (#2690) 2026-04-19 21:42:46 +00:00
Luna712
590a94e318
Fix typo in credits (#2703) 2026-04-19 21:40:12 +00:00
Luna712
2264b90396
Bump nicehttp (#2697) 2026-04-19 21:39:22 +00:00
Luna712
0ed6fd8fef
Bump jsoup and zipline libs (#2517) 2026-04-19 21:39:12 +00:00
Luna712
e3e995b222
Add lint ignore (#2669)
We only care about the source language with this, not translations which would mostly be false positives.
2026-04-19 17:01:50 +00:00
Luna712
7c1554a479
AGP 9! (#2604) 2026-04-19 17:00:47 +00:00
firelight
7926e60fb0
Add plugin hash validation (#2644) 2026-04-19 13:29:37 +00:00
Luna712
68a1d0856c
Fix STATE_IDLE issues in player (#2691) 2026-04-19 13:09:19 +00:00
hrisabhy
ee6a9af217
Improve subtitle selection UX: Move "No Subtitles" option to bottom (#2523) 2026-04-19 12:59:44 +00:00
Luna712
c1eef1de1d
Add new URL for Voe (#2701) 2026-04-19 12:41:05 +00:00
firelight
f175beb51b
Fix concurrent plugin loading (#2700) 2026-04-19 12:05:24 +00:00
Luna712
e55794c200
Bump buildkonfig lib (#2643) 2026-04-18 13:52:14 +00:00
Luna712
c67ba2b485
Add explicit permission checks for notifications in downloader (#2667) 2026-04-18 13:45:55 +00:00
Luna712
6336837903
Revert media3 to 1.9.3 (#2693) 2026-04-18 13:40:05 +00:00
Luna712
636d2507f7
Add missing OptIn (#2668)
This an error level opt in introduced in media3 1.10.0.
2026-04-16 23:28:16 +00:00
Luna712
cd03392364
Remove setup-android action from Dokka action (#2666)
It shouldn't be necessary with setup-gradle.
2026-04-16 23:26:52 +00:00
Luna712
c31c5764ea
Bump nextlibMedia3 (#2658) 2026-04-14 22:22:38 +00:00
Luna712
7925e714e7
Fix editing accounts from MainActivity (#2663) 2026-04-14 21:39:31 +00:00
Luna712
8d416fa2fc
Remove commented android.enableJetifier from gradle.properties (#2662)
It is now deprecated anyway. We will never use it now, so we can just fully remove it.
2026-04-14 20:48:23 +00:00
Luna712
0bb9322276
Don't explicitly enable WebContentsDebugging (#2657)
"this is enabled automatically if the app is declared as `android:debuggable="true"` in its manifest; otherwise, the default is false." - which we set on CloudStream Debug but not release flavors.

"Enabling web contents debugging allows the state of any WebView in the app to be inspected and modified by the user via adb. This is a security liability and should not be enabled in production builds of apps unless this is an explicitly intended use of the app."
2026-04-14 20:47:38 +00:00
Luna712
cfce80e93e
Bump DGP and KGP libs (#2582)
Final compatibility with AGP 9
2026-04-13 22:27:27 +00:00
firelight
fb54d02979
Fix SSL issues (#2655) 2026-04-13 22:21:52 +00:00
Luna712
788189c80c
Bump github-script action (#2642) 2026-04-13 21:52:57 +00:00
Luna712
1b0fdb57a8
Add permissions to workflows (#2654)
https://docs.github.com/en/actions/reference/workflows-and-actions/workflow-syntax#permissions
2026-04-13 21:50:57 +00:00
firelight
2eb63dc334
Change default installer to legacy (#2653)
Switching the default to the more reliable legacy installer until we fix the new installer.
2026-04-13 21:47:12 +00:00
Luna712
bd7db6c20a
Upgrade media3 to 1.10.0 (#2608) 2026-04-12 22:46:11 +02:00
Phisher98
14d56de61e
Adding a subtle shadow and minor adjustments to make the description stand out more on a white background. (#2648) 2026-04-12 22:40:05 +02:00
CranberrySoup
adf2ed6df3
Fix livestreams (#2627) 2026-04-12 22:36:31 +02:00
Luna712
b89f36c9bc
Bump material to 1.14.0-beta01 (#2636) 2026-04-09 22:01:20 +02:00
Luna712
0f1cb3a773
Add strictly for coil lib (#2635) 2026-04-09 21:59:53 +02:00
Phisher98
c304e8556e
Minor Fix IntroDbSkip (#2634) 2026-04-09 21:59:31 +02:00
firelight
a7f5f9a35a
Feat: TheIntroDBSkip + Bugfix (#2631) 2026-04-09 21:58:50 +02:00
Luna712
d7b030e7ef
Update gradle to 9.4.1 (#2610) 2026-04-09 17:19:57 +02:00
Luna712
fe0829ff64
Bump material (#2609) 2026-04-09 17:11:17 +02:00
Luna712
bb4e5da5c9
Bump androidx libraries (#2607) 2026-04-09 17:07:10 +02:00
Luna712
c9a24e198c
Add true configuration cache support for git commit hash (#2285)
Co-authored-by: firelight <147925818+fire-light42@users.noreply.github.com>
2026-04-09 10:32:41 +00:00
Luna712
ca96aa6891
Bump actions (#2588)
* Keep gradle/actions/setup-gradle@v5 for now
2026-04-09 10:16:24 +00:00
Luna712
8bdc1a83d7
Use InternalAPI rather than permanent deprecations in PluginManager (#2615) 2026-04-09 10:12:53 +00:00
firelight
be69ec938e
Merge pull request #2633 from recloudstream/weblate
Translations update from Hosted Weblate
2026-04-09 10:11:32 +00:00
firelight
04b22ba4df
Small backup fix 2026-04-09 10:11:15 +00:00
Hosted Weblate
e22a596d0c
Translated using Weblate (Arabic)
Currently translated at 100.0% (726 of 726 strings)

Translated using Weblate (Albanian)

Currently translated at 68.0% (494 of 726 strings)

Co-authored-by: 007 <juri.malaj@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: hollow04 <ichigo0404@hotmail.com>
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ar/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/sq/
Translation: Cloudstream/App
2026-04-09 07:09:57 +00:00
Onur Civanoğlu
f6920fb05d
feat: Force landscape orientation and pillarbox portrait videos on TV and emulator devices. (#2560) 2026-04-09 01:22:57 +02:00
CranberrySoup
f28924f704
Fix intent launches (#2554) 2026-04-09 01:17:21 +02:00
Luna712
b510942027
Bump newpipeextractor to v0.26.0 (#2624) 2026-04-09 01:11:40 +02:00
firelight
1d03b05a7c
Refactor: New SkipAPI for SkipStamp (#2601) 2026-04-09 01:04:39 +02:00
Luna712
f51885fb6e
Fix MotionEvent gestures getting stuck in player (#2629) 2026-04-09 01:00:53 +02:00
firelight
31165a87c1
Merge pull request #2625 from Luna712/short-commit
Use short commit hashes for libs
2026-04-08 22:40:58 +00:00
firelight
9f792f5b1a
Merge pull request #2616 from recloudstream/weblate
Translations update from Hosted Weblate
2026-04-08 22:40:01 +00:00
Hosted Weblate
418cf08ad4
Translated using Weblate (Albanian)
Currently translated at 57.0% (414 of 726 strings)

Translated using Weblate (Albanian)

Currently translated at 100.0% (4 of 4 strings)

Translated using Weblate (Vietnamese)

Currently translated at 100.0% (726 of 726 strings)

Added translation using Weblate (Albanian)

Translated using Weblate (Hindi)

Currently translated at 56.6% (411 of 726 strings)

Translated using Weblate (Vietnamese)

Currently translated at 100.0% (726 of 726 strings)

Translated using Weblate (Vietnamese)

Currently translated at 100.0% (726 of 726 strings)

Translated using Weblate (Korean)

Currently translated at 100.0% (726 of 726 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Vietnamese)

Currently translated at 100.0% (726 of 726 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (726 of 726 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (726 of 726 strings)

Translated using Weblate (Vietnamese)

Currently translated at 100.0% (726 of 726 strings)

Translated using Weblate (Vietnamese)

Currently translated at 100.0% (726 of 726 strings)

Translated using Weblate (Chinese (Traditional Han script))

Currently translated at 100.0% (726 of 726 strings)

Translated using Weblate (Vietnamese)

Currently translated at 100.0% (726 of 726 strings)

Translated using Weblate (Korean)

Currently translated at 100.0% (726 of 726 strings)

Co-authored-by: 007 <juri.malaj@gmail.com>
Co-authored-by: ByAyzen <Ayzenxyz@proton.me>
Co-authored-by: Hariom Jha <hariom.jha5499@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Man <thebroker2308@gmail.com>
Co-authored-by: hou1234 <gjqmgjsl3@gmail.com>
Co-authored-by: muhaco <cemusa10@gmail.com>
Co-authored-by: xinshoutw <me@xinshou.tw>
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/hi/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ko/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/sq/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/tr/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/vi/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/zh_Hant/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/fastlane/sq/
Translation: Cloudstream/App
Translation: Cloudstream/Fastlane
2026-04-08 17:10:18 +00:00
Luna712
d495cbe32d
Use short commit hashes for libs 2026-04-06 19:01:57 -06:00
Bnyro
08b1d97152
feat(extractors): add playmogo (doodstream mirror) (#2620) 2026-04-06 21:45:29 +00:00
Luna712
62e6895d8e
Replace deprecated viewBinding { enable = true } in Gradle (#2623) 2026-04-06 21:39:27 +00:00
Luna712
ae9a374a83
Don't keep screen on when ended (#2619) 2026-04-06 21:36:49 +00:00
Luna712
154cd7500b
Remove @prerelease annotations and enable some deprecations (#2614) 2026-04-06 21:32:58 +00:00
firelight
76e30d2e75
Merge pull request #2591 from recloudstream/weblate
Translations update from Hosted Weblate
2026-04-04 18:32:47 +00:00
Hosted Weblate
b2cd9612ea
Merge remote-tracking branch 'origin/master' 2026-04-04 18:27:01 +00:00
Luna712
562a5d8192
Fix CustomSubripParser to match assertion usage upstream (#2612)
Also suppresses a deprecation to fix build warnings. Fixes all other warnings in assertions by changing them because that is what it uses upstream also.
2026-04-04 18:26:55 +00:00
Hosted Weblate
bb295ded09
Translated using Weblate (Vietnamese)
Currently translated at 100.0% (726 of 726 strings)

Translated using Weblate (Korean)

Currently translated at 100.0% (726 of 726 strings)

Translated using Weblate (Belarusian)

Currently translated at 99.5% (723 of 726 strings)

Translated using Weblate (Vietnamese)

Currently translated at 100.0% (726 of 726 strings)

Translated using Weblate (French)

Currently translated at 100.0% (726 of 726 strings)

Translated using Weblate (Vietnamese)

Currently translated at 100.0% (726 of 726 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (726 of 726 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (726 of 726 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (726 of 726 strings)

Translated using Weblate (Indonesian)

Currently translated at 100.0% (726 of 726 strings)

Translated using Weblate (Korean)

Currently translated at 100.0% (726 of 726 strings)

Translated using Weblate (Vietnamese)

Currently translated at 100.0% (726 of 726 strings)

Translated using Weblate (Vietnamese)

Currently translated at 100.0% (726 of 726 strings)

Translated using Weblate (Latvian)

Currently translated at 80.8% (587 of 726 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (726 of 726 strings)

Co-authored-by: Ardev Prisec <prisecardev@gmail.com>
Co-authored-by: Dan <jonweblin2205@protonmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Man <thebroker2308@gmail.com>
Co-authored-by: Posemartonis <weblate.drainage895@passmail.net>
Co-authored-by: Sasha Glazko <lenify@users.noreply.hosted.weblate.org>
Co-authored-by: blueocean2308 <bluewhale2308@gmail.com>
Co-authored-by: hou1234 <gjqmgjsl3@gmail.com>
Co-authored-by: opakholis <opakholis@users.noreply.hosted.weblate.org>
Co-authored-by: ℂ𝕠𝕠𝕠𝕝 (𝕘𝕚𝕥𝕙𝕦𝕓.𝕔𝕠𝕞/ℂ𝕠𝕠𝕠𝕝) <coool@mail.lv>
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/be/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/fr/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/id/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ko/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/lv/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/uk/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/vi/
Translation: Cloudstream/App
2026-04-04 18:26:35 +00:00
Luna712
ba9413e972
Change param name in interface to match everywhere else (#2611) 2026-04-04 18:26:17 +00:00
Phisher98
db154a8cd2
Adding IntroDB (#2599) 2026-04-03 16:36:42 +02:00
Nguyen Van Nam
736c6374a6
Fix: thread-safe HashMap for image bitmap cache 2026-03-30 21:23:02 +00:00
firelight
9fe7662f95
Merge pull request #2573 from recloudstream/weblate
Translations update from Hosted Weblate
2026-03-30 23:21:45 +02:00
Hosted Weblate
d23fb0ac4c
Translated using Weblate (Swedish)
Currently translated at 100.0% (726 of 726 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (726 of 726 strings)

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (726 of 726 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (726 of 726 strings)

Translated using Weblate (Ukrainian)

Currently translated at 99.8% (725 of 726 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (726 of 726 strings)

Translated using Weblate (Arabic)

Currently translated at 100.0% (725 of 725 strings)

Translated using Weblate (Arabic)

Currently translated at 100.0% (4 of 4 strings)

Translated using Weblate (Korean)

Currently translated at 100.0% (725 of 725 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Korean)

Currently translated at 100.0% (725 of 725 strings)

Translated using Weblate (Korean)

Currently translated at 100.0% (725 of 725 strings)

Translated using Weblate (Slovak)

Currently translated at 62.6% (454 of 725 strings)

Translated using Weblate (Esperanto)

Currently translated at 23.7% (172 of 725 strings)

Translated using Weblate (Chinese (Traditional Han script))

Currently translated at 100.0% (725 of 725 strings)

Translated using Weblate (Chinese (Traditional Han script))

Currently translated at 100.0% (725 of 725 strings)

Translated using Weblate (Bulgarian)

Currently translated at 99.1% (719 of 725 strings)

Translated using Weblate (Latvian)

Currently translated at 81.2% (589 of 725 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Esperanto)

Currently translated at 17.5% (127 of 725 strings)

Translated using Weblate (Portuguese)

Currently translated at 100.0% (725 of 725 strings)

Translated using Weblate (Vietnamese)

Currently translated at 99.8% (724 of 725 strings)

Translated using Weblate (Hungarian)

Currently translated at 82.0% (595 of 725 strings)

Translated using Weblate (Korean)

Currently translated at 100.0% (725 of 725 strings)

Translated using Weblate (Belarusian)

Currently translated at 99.5% (722 of 725 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Belarusian)

Currently translated at 99.5% (722 of 725 strings)

Translated using Weblate (Filipino)

Currently translated at 21.2% (154 of 725 strings)

Translated using Weblate (Hungarian)

Currently translated at 77.3% (561 of 725 strings)

Translated using Weblate (Dutch)

Currently translated at 89.1% (646 of 725 strings)

Translated using Weblate (Tamil)

Currently translated at 100.0% (725 of 725 strings)

Translated using Weblate (German)

Currently translated at 100.0% (725 of 725 strings)

Translated using Weblate (Tamil)

Currently translated at 100.0% (725 of 725 strings)

Translated using Weblate (Hungarian)

Currently translated at 75.4% (547 of 725 strings)

Co-authored-by: Ardev Prisec <prisecardev@gmail.com>
Co-authored-by: Aron Folkerts <aronfolkerts@gmail.com>
Co-authored-by: Daniel Konstantinov <bgshadow2010@gmail.com>
Co-authored-by: David Hermann <theumis@users.noreply.hosted.weblate.org>
Co-authored-by: Fjuro <fjuro@users.noreply.hosted.weblate.org>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Jen Xie <aulaul825879@gmail.com>
Co-authored-by: Massimo Pissarello <mapi68@gmail.com>
Co-authored-by: Matthaiks <kitynska@gmail.com>
Co-authored-by: Nguyễn Tiến Đạt <dn16092000@gmail.com>
Co-authored-by: Romhányi-Kakucska Viktor <viktor@romhanyi.dev>
Co-authored-by: Sasha Glazko <lenify@users.noreply.hosted.weblate.org>
Co-authored-by: Wacky Wars <wackywars21@gmail.com>
Co-authored-by: bittin1ddc447d824349b2 <bittin@reimu.nl>
Co-authored-by: clearstripe <sakurasan000510@gmail.com>
Co-authored-by: hollow <ichigo0404@hotmail.com>
Co-authored-by: hou1234 <gjqmgjsl3@gmail.com>
Co-authored-by: jpkaster 77 <jpkaster81@gmail.com>
Co-authored-by: programutox <programutox@disroot.org>
Co-authored-by: tomas293 <tomaskopodstreleny@gmail.com>
Co-authored-by: தமிழ்நேரம் <tamilneram247@gmail.com>
Co-authored-by: ℂ𝕠𝕠𝕠𝕝 (𝕘𝕚𝕥𝕙𝕦𝕓.𝕔𝕠𝕞/ℂ𝕠𝕠𝕠𝕝) <coool@mail.lv>
Co-authored-by: 大王叫我来巡山 <hamburger2048@users.noreply.hosted.weblate.org>
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ar/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/be/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/bg/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/cs/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/de/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/eo/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/fil/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/hu/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/it/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ko/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/lv/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/nl/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/pl/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/pt/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/sk/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/sv/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ta/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/uk/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/vi/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/zh_Hans/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/zh_Hant/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/fastlane/ar/
Translation: Cloudstream/App
Translation: Cloudstream/Fastlane
2026-03-30 15:10:01 +00:00
firelight
c26f236202
Fix: Minor UX bugs with #2461 2026-03-30 00:29:27 +02:00
recloudstream[bot]
673569a747 chore(locales): fix locale issues 2026-03-29 22:12:16 +00:00
Phisher98
7a2222b252
Adding Metdata on Player (Initial Draft) (TV) (#2461) 2026-03-30 00:11:58 +02:00
PiterDev
76a2feb79c
Add fallback url for kitsu sync (#2552) 2026-03-29 20:33:36 +02:00
Nguyen Van Nam
81c7d90a5f
Fix: Subtitle deletion matches on substring extension, can delete non-subtitle files (#2584) 2026-03-29 18:15:34 +00:00
Osten
235863f9d2
Bump to 4.7.0 2026-03-29 14:06:17 +02:00
Osten
07eb9973f8
Increased DOWNLOAD_PARTIAL_MIN_SIZE to 50MB 2026-03-29 13:54:51 +02:00
Osten
a23c136d81
Fixed partial downloads + resume bugs 2026-03-26 01:13:13 +01:00
Osten
89400be5e5
Remove google dependenciesInfo + bumb nicehttp 2026-03-25 18:31:57 +01:00
Phisher98
d06afa32fd
Tracks naming fix and minor UI improvements (#2480) 2026-03-23 22:14:48 +00:00
Luna712
f674b427ac
Use assemblePrereleaseRelease for building prerelease (#2365) 2026-03-23 21:48:48 +00:00
Luna712
f5b46949ec
Add support for configuration cache with keystore (#2328) 2026-03-22 23:16:39 +00:00
firelight
dce70ac229
Merge pull request #2565 from recloudstream/weblate
Translations update from Hosted Weblate
2026-03-23 00:16:30 +01:00
Osten
45699b72a8
Added .close to m3u8 hslLazy 2026-03-22 13:41:12 +01:00
Osten
a74a0840d6
Fixed BackPressedCallbackHelper activity leak 2026-03-22 13:04:22 +01:00
Hosted Weblate
73e19212cc
Merge remote-tracking branch 'origin/master' 2026-03-22 08:34:50 +01:00
Osten
ee1e90e0f4
Emergency fix for OOM and leaks 2026-03-22 08:34:43 +01:00
Hosted Weblate
51bd1c4a6c
Translated using Weblate (Slovak)
Currently translated at 62.6% (454 of 725 strings)

Translated using Weblate (Esperanto)

Currently translated at 23.7% (172 of 725 strings)

Translated using Weblate (Chinese (Traditional Han script))

Currently translated at 100.0% (725 of 725 strings)

Translated using Weblate (Chinese (Traditional Han script))

Currently translated at 100.0% (725 of 725 strings)

Translated using Weblate (Bulgarian)

Currently translated at 99.1% (719 of 725 strings)

Translated using Weblate (Latvian)

Currently translated at 81.2% (589 of 725 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Esperanto)

Currently translated at 17.5% (127 of 725 strings)

Translated using Weblate (Portuguese)

Currently translated at 100.0% (725 of 725 strings)

Translated using Weblate (Vietnamese)

Currently translated at 99.8% (724 of 725 strings)

Translated using Weblate (Hungarian)

Currently translated at 82.0% (595 of 725 strings)

Translated using Weblate (Korean)

Currently translated at 100.0% (725 of 725 strings)

Translated using Weblate (Belarusian)

Currently translated at 99.5% (722 of 725 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Belarusian)

Currently translated at 99.5% (722 of 725 strings)

Translated using Weblate (Filipino)

Currently translated at 21.2% (154 of 725 strings)

Translated using Weblate (Hungarian)

Currently translated at 77.3% (561 of 725 strings)

Translated using Weblate (Dutch)

Currently translated at 89.1% (646 of 725 strings)

Translated using Weblate (Tamil)

Currently translated at 100.0% (725 of 725 strings)

Translated using Weblate (German)

Currently translated at 100.0% (725 of 725 strings)

Translated using Weblate (Tamil)

Currently translated at 100.0% (725 of 725 strings)

Translated using Weblate (Hungarian)

Currently translated at 75.4% (547 of 725 strings)

Co-authored-by: Aron Folkerts <aronfolkerts@gmail.com>
Co-authored-by: Daniel Konstantinov <bgshadow2010@gmail.com>
Co-authored-by: David Hermann <theumis@users.noreply.hosted.weblate.org>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Jen Xie <aulaul825879@gmail.com>
Co-authored-by: Nguyễn Tiến Đạt <dn16092000@gmail.com>
Co-authored-by: Romhányi-Kakucska Viktor <viktor@romhanyi.dev>
Co-authored-by: Sasha Glazko <lenify@users.noreply.hosted.weblate.org>
Co-authored-by: Wacky Wars <wackywars21@gmail.com>
Co-authored-by: clearstripe <sakurasan000510@gmail.com>
Co-authored-by: jpkaster 77 <jpkaster81@gmail.com>
Co-authored-by: programutox <programutox@disroot.org>
Co-authored-by: tomas293 <tomaskopodstreleny@gmail.com>
Co-authored-by: தமிழ்நேரம் <tamilneram247@gmail.com>
Co-authored-by: ℂ𝕠𝕠𝕠𝕝 (𝕘𝕚𝕥𝕙𝕦𝕓.𝕔𝕠𝕞/ℂ𝕠𝕠𝕠𝕝) <coool@mail.lv>
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/be/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/bg/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/de/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/eo/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/fil/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/hu/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ko/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/lv/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/nl/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/pt/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/sk/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ta/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/vi/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/zh_Hant/
Translation: Cloudstream/App
2026-03-20 09:09:57 +00:00
Luna712
19efb1ffc3
Fix BuildConfig import (#2566) 2026-03-13 23:21:12 +00:00
Luna712
86cca03dd7
Use a new method to pass if debug to fix debug logging in library (#2330)
* Use a new method to pass if debug to fix debug logging in library
2026-03-13 22:39:34 +00:00
Nivin
ef07f761d7
Prefer player default live position for HLS/DASH (#2547) 2026-03-13 22:17:53 +00:00
Bnyro
904dda0c60
feat(extractors): add new extractor for vidsonic.net (#2557) 2026-03-13 22:03:27 +00:00
Bnyro
8d3846d2a3
feat(extractors): add support for vidara.to (#2556)
* feat(extractors): add support for vidara.to

* Allow soft subtitle failure in Streamup
2026-03-13 21:59:59 +00:00
Osten
ccc0a45065
Fixed shared pool, closes #2082 (#2553) 2026-03-13 21:54:11 +00:00
firelight
06907bed05
Translated using Weblate (Vietnamese) (#2530)
Co-authored-by: Aron Folkerts <aronfolkerts@gmail.com>
Co-authored-by: David Hermann <theumis@users.noreply.hosted.weblate.org>
Co-authored-by: Nguyễn Tiến Đạt <dn16092000@gmail.com>
Co-authored-by: Romhányi-Kakucska Viktor <viktor@romhanyi.dev>
Co-authored-by: Sasha Glazko <lenify@users.noreply.hosted.weblate.org>
Co-authored-by: Wacky Wars <wackywars21@gmail.com>
Co-authored-by: clearstripe <sakurasan000510@gmail.com>
Co-authored-by: தமிழ்நேரம் <tamilneram247@gmail.com>
2026-03-13 22:54:03 +01:00
Bnyro
b0d3731faa
feat(extractors): add vide0 doodstream mirror (#2558) 2026-03-11 14:19:57 +00:00
Hosted Weblate
618f9cde65
Translated using Weblate (Vietnamese)
Currently translated at 99.8% (724 of 725 strings)

Translated using Weblate (Hungarian)

Currently translated at 82.0% (595 of 725 strings)

Translated using Weblate (Korean)

Currently translated at 100.0% (725 of 725 strings)

Translated using Weblate (Belarusian)

Currently translated at 99.5% (722 of 725 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Belarusian)

Currently translated at 99.5% (722 of 725 strings)

Translated using Weblate (Filipino)

Currently translated at 21.2% (154 of 725 strings)

Translated using Weblate (Hungarian)

Currently translated at 77.3% (561 of 725 strings)

Translated using Weblate (Dutch)

Currently translated at 89.1% (646 of 725 strings)

Translated using Weblate (Tamil)

Currently translated at 100.0% (725 of 725 strings)

Translated using Weblate (German)

Currently translated at 100.0% (725 of 725 strings)

Translated using Weblate (Tamil)

Currently translated at 100.0% (725 of 725 strings)

Translated using Weblate (Hungarian)

Currently translated at 75.4% (547 of 725 strings)

Co-authored-by: Aron Folkerts <aronfolkerts@gmail.com>
Co-authored-by: David Hermann <theumis@users.noreply.hosted.weblate.org>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Nguyễn Tiến Đạt <dn16092000@gmail.com>
Co-authored-by: Romhányi-Kakucska Viktor <viktor@romhanyi.dev>
Co-authored-by: Sasha Glazko <lenify@users.noreply.hosted.weblate.org>
Co-authored-by: Wacky Wars <wackywars21@gmail.com>
Co-authored-by: clearstripe <sakurasan000510@gmail.com>
Co-authored-by: தமிழ்நேரம் <tamilneram247@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/be/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/de/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/fil/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/hu/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ko/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/nl/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ta/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/vi/
Translation: Cloudstream/App
2026-03-09 19:09:55 +01:00
Luna712
1fb6ce310d
Bump material (#2519) 2026-02-28 23:34:24 +01:00
Luna712
2ca21051d5
Bump androidx libraries (#2518) 2026-02-28 23:29:54 +01:00
firelight
a8f6ef0ea5
Fix: Nextlib textrenderer from #2510 2026-02-28 23:23:24 +01:00
Luna712
809b66af81
Revert "Revert "Update media3 to 1.9.2"" (#2510) 2026-02-28 23:02:49 +01:00
CranberrySoup
ecc3e506f9
Backup fix (#2542)
* Fix subtitle selection

* Move logic to getLanguageDataFromName

* Update BackupUtils.kt
2026-02-28 22:59:10 +01:00
saimuel
ef9e49d955
Remove dead Extractors (#2511) 2026-02-28 22:58:33 +01:00
DieGon7771
a65828e2b0
Fix trailer zoom not resetting after fullscreen exit (#2512) 2026-02-28 22:57:01 +01:00
Saurabh Kaperwan
9f2067bbff
fix gofile extractor (#2525)
* fix gofile extractor

* minor fix
2026-02-28 22:54:34 +01:00
Phisher98
514a808218
Removing default headers that caused some streams to return 2004. (#2533) 2026-02-28 22:25:44 +01:00
Phisher98
8e71baeb84
Make video info slightly dimmer (#2508) 2026-02-20 23:10:41 +00:00
firelight
543d1b4478
Translated using Weblate (#2482)
Co-authored-by: Broo Mohamed <broo91398@gmail.com>
Co-authored-by: Camila Sciocca <hellocamilatranslation@gmail.com>
Co-authored-by: Dan <jonweblin2205@protonmail.com>
Co-authored-by: Daniel Wiik <d.wiik@outlook.com>
Co-authored-by: Deepak C <deepakchatgpt19@gmail.com>
Co-authored-by: Fjuro <fjuro@alius.cz>
Co-authored-by: Fjuro <fjuro@users.noreply.hosted.weblate.org>
Co-authored-by: Francisco Serrador <fserrador@gmail.com>
Co-authored-by: Kehribar <103407696+dpentx@users.noreply.github.com>
Co-authored-by: Kerim Demirkaynak <aschannel111@gmail.com>
Co-authored-by: Luiz Felipe Sudorio dos Santos <luizfelipe@post.com>
Co-authored-by: MD Sakibur Rahman <msr.official01@gmail.com>
Co-authored-by: Massimo Pissarello <mapi68@gmail.com>
Co-authored-by: Matthaiks <kitynska@gmail.com>
Co-authored-by: Milo Ivir <mail@milotype.de>
Co-authored-by: Oliver <oliver.puff@gmx.de>
Co-authored-by: Posemartonis <weblate.drainage895@passmail.net>
Co-authored-by: Sasha Glazko <lenify@tutanota.com>
Co-authored-by: Sasha Glazko <lenify@users.noreply.hosted.weblate.org>
Co-authored-by: ShowhyT <showhy@proton.me>
Co-authored-by: Takeru Mikenu <mikenu-jp@users.noreply.hosted.weblate.org>
Co-authored-by: Timo Panda <pandoroo@users.noreply.hosted.weblate.org>
Co-authored-by: XC3 <darkofficial110@gmail.com>
Co-authored-by: kokolo <ivansto314@gmail.com>
Co-authored-by: lamrichiasmaa <lamrichiasma@gmail.com>
Co-authored-by: lizamimiku-wq <lizamimiku@gmail.com>
Co-authored-by: opakholis <opakholis@users.noreply.hosted.weblate.org>
Co-authored-by: tjy122 <tning0134@gmail.com>
Co-authored-by: 大王叫我来巡山 <hamburger2048@users.noreply.hosted.weblate.org>
2026-02-20 23:08:25 +00:00
Saurabh Kaperwan
6e423ba24e
Add multiple extractors new domains (#2516) 2026-02-20 23:02:55 +00:00
Hosted Weblate
46f9c95376
Translated using Weblate (French)
Currently translated at 100.0% (725 of 725 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (German)

Currently translated at 98.8% (717 of 725 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (725 of 725 strings)

Translated using Weblate (Russian)

Currently translated at 100.0% (725 of 725 strings)

Translated using Weblate (Indonesian)

Currently translated at 100.0% (725 of 725 strings)

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (725 of 725 strings)

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (725 of 725 strings)

Translated using Weblate (English)

Currently translated at 99.8% (724 of 725 strings)

Translated using Weblate (Swedish)

Currently translated at 100.0% (725 of 725 strings)

Translated using Weblate (Indonesian)

Currently translated at 98.6% (715 of 725 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (725 of 725 strings)

Translated using Weblate (Swedish)

Currently translated at 100.0% (725 of 725 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (725 of 725 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (725 of 725 strings)

Translated using Weblate (Croatian)

Currently translated at 100.0% (725 of 725 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (725 of 725 strings)

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 99.8% (724 of 725 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (725 of 725 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (725 of 725 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (725 of 725 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Croatian)

Currently translated at 99.3% (718 of 723 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (723 of 723 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (723 of 723 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (723 of 723 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (723 of 723 strings)

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 99.8% (722 of 723 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (723 of 723 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (723 of 723 strings)

Merge remote-tracking branch 'origin/master'

Added translation using Weblate (Arabic (Egyptian))

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Russian)

Currently translated at 99.5% (712 of 715 strings)

Translated using Weblate (Belarusian)

Currently translated at 99.5% (712 of 715 strings)

Translated using Weblate (Spanish)

Currently translated at 99.8% (714 of 715 strings)

Translated using Weblate (Belarusian)

Currently translated at 90.4% (647 of 715 strings)

Translated using Weblate (Indonesian)

Currently translated at 100.0% (715 of 715 strings)

Translated using Weblate (Belarusian)

Currently translated at 85.5% (612 of 715 strings)

Translated using Weblate (Bengali)

Currently translated at 48.9% (350 of 715 strings)

Translated using Weblate (German)

Currently translated at 100.0% (715 of 715 strings)

Translated using Weblate (Belarusian)

Currently translated at 65.5% (469 of 715 strings)

Translated using Weblate (French)

Currently translated at 100.0% (715 of 715 strings)

Translated using Weblate (Croatian)

Currently translated at 99.8% (714 of 715 strings)

Translated using Weblate (Belarusian)

Currently translated at 58.0% (415 of 715 strings)

Translated using Weblate (Arabic)

Currently translated at 100.0% (715 of 715 strings)

Co-authored-by: Broo Mohamed <broo91398@gmail.com>
Co-authored-by: Camila Sciocca <hellocamilatranslation@gmail.com>
Co-authored-by: Dan <jonweblin2205@protonmail.com>
Co-authored-by: Daniel Wiik <d.wiik@outlook.com>
Co-authored-by: Deepak C <deepakchatgpt19@gmail.com>
Co-authored-by: Fjuro <fjuro@alius.cz>
Co-authored-by: Fjuro <fjuro@users.noreply.hosted.weblate.org>
Co-authored-by: Francisco Serrador <fserrador@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Kehribar <103407696+dpentx@users.noreply.github.com>
Co-authored-by: Kerim Demirkaynak <aschannel111@gmail.com>
Co-authored-by: Luiz Felipe Sudorio dos Santos <luizfelipe@post.com>
Co-authored-by: MD Sakibur Rahman <msr.official01@gmail.com>
Co-authored-by: Massimo Pissarello <mapi68@gmail.com>
Co-authored-by: Matthaiks <kitynska@gmail.com>
Co-authored-by: Milo Ivir <mail@milotype.de>
Co-authored-by: Oliver <oliver.puff@gmx.de>
Co-authored-by: Posemartonis <weblate.drainage895@passmail.net>
Co-authored-by: Sasha Glazko <lenify@tutanota.com>
Co-authored-by: Sasha Glazko <lenify@users.noreply.hosted.weblate.org>
Co-authored-by: ShowhyT <showhy@proton.me>
Co-authored-by: Takeru Mikenu <mikenu-jp@users.noreply.hosted.weblate.org>
Co-authored-by: Timo Panda <pandoroo@users.noreply.hosted.weblate.org>
Co-authored-by: XC3 <darkofficial110@gmail.com>
Co-authored-by: kokolo <ivansto314@gmail.com>
Co-authored-by: lamrichiasmaa <lamrichiasma@gmail.com>
Co-authored-by: lizamimiku-wq <lizamimiku@gmail.com>
Co-authored-by: opakholis <opakholis@users.noreply.hosted.weblate.org>
Co-authored-by: tjy122 <tning0134@gmail.com>
Co-authored-by: 大王叫我来巡山 <hamburger2048@users.noreply.hosted.weblate.org>
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ar/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/be/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/bn/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/cs/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/de/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/en/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/es/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/fr/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/hr/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/id/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/it/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ja/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/pl/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/pt_BR/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ru/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/sv/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/tr/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/uk/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/zh_Hans/
Translation: Cloudstream/App
2026-02-19 10:09:57 +01:00
Mioki
1d1a7fb6fe
Improved TV Back Button UX (extension content -> extension selection Bttn -> home nav Bttn -> exit dialog) (#2468) 2026-02-18 17:58:48 +01:00
saimuel
eaf2b7bd0d
Add new ByseSX mainUrl (#2506) 2026-02-18 17:41:21 +01:00
firelight
6806a4e2e6
Revert "Update media3 to 1.9.2 (#2342)" (#2509)
This reverts commit ea4ef5c2f3.
2026-02-18 17:31:01 +01:00
firelight
8baee7ee78
Fix(UI): Minor color issue and padding on top chip bar 2026-02-18 00:10:36 +00:00
Luna712
ea4ef5c2f3
Update media3 to 1.9.2 (#2342) 2026-02-18 00:52:58 +01:00
Luna712
ad2168c5bc
Upgrade to minSdk 23 (#2078) 2026-02-18 00:31:01 +01:00
Luna712
76728d858f
Use withStyledAttributes (#2305) 2026-02-17 22:55:30 +01:00
Nivin
88d42613d3
Replace Google suggest API with TheMovieDB multi-search endpoint (#2500) 2026-02-17 21:53:07 +01:00
Mohd Kaif Shaikh
c862d119fb
add Videa.hu extractor (#2491)
* add Videa.hu extractor

* replace import android.util.Base64

* Refactor Videa extractor for improved URL handling
2026-02-17 21:48:29 +01:00
firelight
443c1c81c9
Refactor: Minor code cleanup for #2501 2026-02-17 20:45:39 +00:00
Swapnil Kuwar
8796a73f06
Search result provider pining feature added. (#2501) 2026-02-17 21:44:22 +01:00
Saurabh Kaperwan
960658df61
Remove hubcloud download link (#2502)
Sometimes it is making a get request to a video file
2026-02-17 21:28:03 +01:00
CranberrySoup
3da9b2ec7b
Better priority (#2496) 2026-02-13 19:59:29 +01:00
CranberrySoup
b58e0b893f
Fix resume watching (#2498) 2026-02-13 19:42:38 +01:00
firelight
f6339e44e1
Fix: YT Live + Subrip 2026-02-13 17:40:26 +00:00
Mohd Kaif Shaikh
32f1a2e6c3
Youtube Extractor Fix with NewPipe (#2489) 2026-02-13 18:39:29 +01:00
CranberrySoup
cf084ac2eb
Download rework (#2037) 2026-02-11 19:30:48 +01:00
Mioki
2c62f3fa46
Merge pull request #2478 from okibcn/0K_UqloadFixPR 2026-02-11 01:53:15 +01:00
firelight
8fcce6b5fd
Merge pull request #2488 from phisher98/Gdmirrorbot-improvement
GDMirrorbot Improvement
2026-02-11 00:43:58 +00:00
4530c00a71 Improvement 2026-02-09 19:28:54 +05:30
firelight
2766ac86a1
Merge pull request #2457 from recloudstream/weblate
Translations update from Hosted Weblate
2026-02-06 01:18:35 +00:00
Hosted Weblate
838989beaa
Merge remote-tracking branch 'origin/master' 2026-02-06 02:18:12 +01:00
Luna712
b370b5b9e7
Update gradle to 9.3.1 (#2477) 2026-02-06 01:18:05 +00:00
Hosted Weblate
30b5a4e649
Translated using Weblate (Belarusian)
Currently translated at 46.7% (334 of 715 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (715 of 715 strings)

Translated using Weblate (German)

Currently translated at 99.1% (709 of 715 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (715 of 715 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (715 of 715 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (715 of 715 strings)

Translated using Weblate (Vietnamese)

Currently translated at 99.8% (714 of 715 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (715 of 715 strings)

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 99.8% (714 of 715 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (715 of 715 strings)

Translated using Weblate (Belarusian)

Currently translated at 40.1% (286 of 712 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (712 of 712 strings)

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (712 of 712 strings)

Translated using Weblate (Russian)

Currently translated at 100.0% (712 of 712 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (712 of 712 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (712 of 712 strings)

Translated using Weblate (Ukrainian)

Currently translated at 99.8% (709 of 710 strings)

Translated using Weblate (Ukrainian)

Currently translated at 99.8% (709 of 710 strings)

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Spanish)

Currently translated at 100.0% (710 of 710 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (710 of 710 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (710 of 710 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (710 of 710 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (710 of 710 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (710 of 710 strings)

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (710 of 710 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (710 of 710 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (German)

Currently translated at 100.0% (709 of 709 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Russian)

Currently translated at 100.0% (709 of 709 strings)

Translated using Weblate (Russian)

Currently translated at 100.0% (709 of 709 strings)

Translated using Weblate (Russian)

Currently translated at 99.5% (706 of 709 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (709 of 709 strings)

Translated using Weblate (French)

Currently translated at 100.0% (709 of 709 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (709 of 709 strings)

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Polish)

Currently translated at 100.0% (709 of 709 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (709 of 709 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (709 of 709 strings)

Translated using Weblate (Vietnamese)

Currently translated at 100.0% (709 of 709 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (709 of 709 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (709 of 709 strings)

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (709 of 709 strings)

Translated using Weblate (Spanish)

Currently translated at 99.7% (707 of 709 strings)

Co-authored-by: AlaxLima <thanhkhoidangngoc@gmail.com>
Co-authored-by: Ardev Prisec <prisecardev@gmail.com>
Co-authored-by: Artem <artemkozhin80@gmail.com>
Co-authored-by: BruttoDiego <bruttodiego6@gmail.com>
Co-authored-by: Bryan Tank <perso@bryantank.fr>
Co-authored-by: Christopher Allen <nsn90255@gmail.com>
Co-authored-by: Dan <jonweblin2205@protonmail.com>
Co-authored-by: Ettore Atalan <atalanttore@googlemail.com>
Co-authored-by: Fjuro <fjuro@alius.cz>
Co-authored-by: Haru Ijima <haruijimakun@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Kehribar <103407696+dpentx@users.noreply.github.com>
Co-authored-by: Kraptor123 <kraptor121@gmail.com>
Co-authored-by: Massimo Pissarello <mapi68@gmail.com>
Co-authored-by: Matthaiks <kitynska@gmail.com>
Co-authored-by: Mioki <okibcn@gmail.com>
Co-authored-by: Nguyễn Tiến Đạt <dn16092000@gmail.com>
Co-authored-by: Sasha Glazko <lenify@tutanota.com>
Co-authored-by: ShowhyT <showhy@proton.me>
Co-authored-by: Takeru Mikenu <mikenu-jp@users.noreply.hosted.weblate.org>
Co-authored-by: Theumis <me@david-hermann.de>
Co-authored-by: sam <cambridgeaccsamuel@gmail.com>
Co-authored-by: Дейв Рандом (MVboss1190) <m.v.boss123443211190@gmail.com>
Co-authored-by: Максим Горпиніч <gorpinicmaksim0@gmail.com>
Co-authored-by: 大王叫我来巡山 <hamburger2048@users.noreply.hosted.weblate.org>
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/be/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/cs/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/de/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/es/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/fr/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/it/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ja/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/pl/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ru/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/tr/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/uk/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/vi/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/zh_Hans/
Translation: Cloudstream/App
2026-02-06 01:05:09 +01:00
Pawloland
a45593283d
Readd extra brightness feature as optional setting (#2469) 2026-02-03 20:19:25 +01:00
firelight
60244d86a4
Fix: Fixed stupid media3 parsing #2476 2026-02-03 19:07:56 +00:00
Phisher98
c25a9dc56b
Adding videoinfo optional in video Show player information (#2464)
* Adding videoinfo optional in video player resolution section
2026-02-02 18:28:56 +00:00
Luna712
6acc3d8f65
Run lint in pull requests (#2358) 2026-02-02 17:39:22 +00:00
Luna712
47b568c289
Update gradle to 9.3.0 (#2439)
* Update gradle to 9.3.0

* Update gradle-wrapper.properties
2026-02-02 17:34:40 +00:00
Mioki
045fc2770f
Fix track selection when same lang/id is used in 2+ audio tracks. Codec & channel configuration in track selection. Solves issue #2427 (#2447) 2026-02-01 18:13:48 +01:00
DieGon7771
bef80875b1
Add toggle for showing/hiding cast panel (#2466) 2026-02-01 17:58:19 +01:00
Mioki
c44d07b4e5
Vidmoly Fix and adds variants (#2470) 2026-02-01 17:49:48 +01:00
firelight
4e2bfd3d43
Fix: Logic bug in fixTitle, Closes #2465 2026-01-29 16:38:58 +00:00
firelight
06456bc548
Fix:(UI) Collapse sync to a single button, closes #2460 and closes #2458 2026-01-28 23:18:43 +00:00
firelight
af1e0757f4
Feat: Zoom (#2456)
* Feat: Zoom
2026-01-28 23:45:32 +01:00
firelight
4271b8104e
Fix(UI): Made outline consistent 2026-01-28 19:37:55 +00:00
CranberrySoup
5e039a80ba
Fix subtitle selection (#2449)
* Fix subtitle selection
2026-01-28 18:05:19 +01:00
firelight
c618e4e505
Fix: Minor fixes to #2454 2026-01-27 17:12:49 +00:00
Phisher98
cbad2cfdaf
Adding VideoInfo on Player (#2454)
Co-authored-by: Bnyro <bnyro@tutanota.com>
2026-01-27 18:06:27 +01:00
firelight
290283dc15
Chore: nicehttp -> 0.4.16 2026-01-26 22:17:31 +00:00
firelight
7ecb7785c2
Fix(UI): Move voice actor view behind actor view for better visibility 2026-01-26 22:11:12 +00:00
firelight
f82fe7b0ce
Bump to 4.6.2 2026-01-26 19:01:16 +00:00
Nivin
4b28140f8b
Add search suggestions to search UI (#2294) 2026-01-26 19:59:31 +01:00
Bnyro
6f1e4a959f
feat(extractors): add streamix extractor (streamup mirror) (#2455) 2026-01-26 19:49:37 +01:00
DieGon7771
0c25630f0b
Update VotingApi.kt (#2451) 2026-01-25 21:00:04 +01:00
firelight
f6f3e3ff73
Fix: Added backwards for subtitle+audio interceptor, Closes #2442 2026-01-25 19:53:39 +00:00
Osten
c1a2ae8704
Fixed #2448 and hdr by removing brightness filter 2026-01-24 20:06:54 +01:00
Yashas
fda9f0f8c0
feat: Add random play button to TV interface (#2430) 2026-01-24 15:15:21 +01:00
PiterDev
58ca69c284
Kitsu added as sync provider (#2440) 2026-01-24 15:04:37 +01:00
CranberrySoup
663c8a93cb
fix chapter skipping (#2444) 2026-01-24 14:44:10 +01:00
Osten
c28ee05bde
Added more software decoding options 2026-01-23 20:48:30 +01:00
firelight
58c84f0f33
Initial AI Policy (#2432) 2026-01-21 21:45:09 +01:00
Bnyro
7925aacf50
feat(extractors): add CineMM extractor (hglink, dhcplay, ...) (#2438) 2026-01-21 21:44:50 +01:00
Luna712
fb806b339f
Use wrap_content in trailer layout (#2437)
Consistent with other player layouts, and fixes error level lint.
2026-01-21 21:44:27 +01:00
Bnyro
2a60145314
feat(extractors): add vidoza/videzz extractor (#2436) 2026-01-21 21:43:37 +01:00
firelight
71b87d09e7
Fix: Video headers jank, Closes #2435 2026-01-21 17:50:41 +00:00
Cloudburst
8a4480dc42 Merge remote-tracking branch 'weblate/master' 2026-01-21 14:58:18 +01:00
Luna712
2abb7e2d3d
Merge pull request #2373 from Luna712/bump-json
Bump json lib
2026-01-19 23:18:03 +00:00
firelight
179f7e29eb
Merge pull request #2252 from Luna712/directories
Replace srcDirs with directories
2026-01-19 23:14:03 +00:00
firelight
f7a73bfb89
Merge pull request #2371 from recloudstream/weblate
Translations update from Hosted Weblate
2026-01-19 23:02:06 +00:00
Hosted Weblate
79801ec694
Translated using Weblate (Spanish)
Currently translated at 99.7% (704 of 706 strings)

Translated using Weblate (Dutch)

Currently translated at 87.8% (620 of 706 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Russian)

Currently translated at 100.0% (706 of 706 strings)

Translated using Weblate (Romanian)

Currently translated at 100.0% (4 of 4 strings)

Translated using Weblate (Romanian)

Currently translated at 87.3% (617 of 706 strings)

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Spanish)

Currently translated at 98.7% (697 of 706 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Korean)

Currently translated at 96.8% (684 of 706 strings)

Translated using Weblate (Russian)

Currently translated at 99.8% (705 of 706 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (French)

Currently translated at 100.0% (706 of 706 strings)

Translated using Weblate (Latvian)

Currently translated at 82.5% (583 of 706 strings)

Translated using Weblate (Turkish)

Currently translated at 99.8% (705 of 706 strings)

Translated using Weblate (German)

Currently translated at 100.0% (706 of 706 strings)

Translated using Weblate (Belarusian)

Currently translated at 25.7% (182 of 706 strings)

Translated using Weblate (Croatian)

Currently translated at 100.0% (706 of 706 strings)

Translated using Weblate (French)

Currently translated at 99.5% (703 of 706 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (706 of 706 strings)

Translated using Weblate (Indonesian)

Currently translated at 100.0% (706 of 706 strings)

Translated using Weblate (Belarusian)

Currently translated at 25.3% (179 of 706 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (706 of 706 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (706 of 706 strings)

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (706 of 706 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (706 of 706 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (706 of 706 strings)

Translated using Weblate (French)

Currently translated at 99.0% (699 of 706 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (706 of 706 strings)

Co-authored-by: Daniel Navarro-Gomez <daniel.navarro.gomez@gmail.com>
Co-authored-by: Doen1el <weblate@mail.danielmuenstermann.de>
Co-authored-by: Fjuro <fjuro@alius.cz>
Co-authored-by: Friso de Boer <collorfrisie@hotmail.com>
Co-authored-by: Haru Ijima <haruijimakun@gmail.com>
Co-authored-by: Heeheon Ryu <heeheon.ryu001@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: João Pedro Nunes <nunes@disroot.org>
Co-authored-by: Massimo Pissarello <mapi68@gmail.com>
Co-authored-by: Matthaiks <kitynska@gmail.com>
Co-authored-by: Milo Ivir <mail@milotype.de>
Co-authored-by: Pose marto <weblate.drainage895@passmail.net>
Co-authored-by: PrivateKeyy <rumaevvadim@gmail.com>
Co-authored-by: Sasha Glazko <lenify@tutanota.com>
Co-authored-by: Takeru Mikenu <mikenu-jp@users.noreply.hosted.weblate.org>
Co-authored-by: Tom G <luq6x@airsworld.net>
Co-authored-by: Wrapty <wrapty@gmail.com>
Co-authored-by: alex <contact@alexionut.ro>
Co-authored-by: avv-dev <vildan.abdullin@gmail.com>
Co-authored-by: opakholis <opakholis@users.noreply.hosted.weblate.org>
Co-authored-by: therry47 <soulietherry@gmail.com>
Co-authored-by: Максим Горпиніч <gorpinicmaksim0@gmail.com>
Co-authored-by: ℂ𝕠𝕠𝕠𝕝 (𝕘𝕚𝕥𝕙𝕦𝕓.𝕔𝕠𝕞/ℂ𝕠𝕠𝕠𝕝) <coool@mail.lv>
Co-authored-by: 大王叫我来巡山 <hamburger2048@users.noreply.hosted.weblate.org>
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/be/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/cs/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/de/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/es/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/fr/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/hr/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/id/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/it/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ja/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ko/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/lv/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/nl/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/pl/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/pt_BR/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ro/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ru/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/tr/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/uk/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/zh_Hans/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/fastlane/ro/
Translation: Cloudstream/App
Translation: Cloudstream/Fastlane
2026-01-19 23:02:05 +00:00
Luna712
fe9eedce39
Update Kotlin to 2.3.0 (#2341) 2026-01-19 23:01:46 +00:00
Hosted Weblate
317cb5dc1a
Translated using Weblate (Dutch)
Currently translated at 87.8% (620 of 706 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Russian)

Currently translated at 100.0% (706 of 706 strings)

Translated using Weblate (Romanian)

Currently translated at 100.0% (4 of 4 strings)

Translated using Weblate (Romanian)

Currently translated at 87.3% (617 of 706 strings)

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Spanish)

Currently translated at 98.7% (697 of 706 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Korean)

Currently translated at 96.8% (684 of 706 strings)

Translated using Weblate (Russian)

Currently translated at 99.8% (705 of 706 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (French)

Currently translated at 100.0% (706 of 706 strings)

Translated using Weblate (Latvian)

Currently translated at 82.5% (583 of 706 strings)

Translated using Weblate (Turkish)

Currently translated at 99.8% (705 of 706 strings)

Translated using Weblate (German)

Currently translated at 100.0% (706 of 706 strings)

Translated using Weblate (Belarusian)

Currently translated at 25.7% (182 of 706 strings)

Translated using Weblate (Croatian)

Currently translated at 100.0% (706 of 706 strings)

Translated using Weblate (French)

Currently translated at 99.5% (703 of 706 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (706 of 706 strings)

Translated using Weblate (Indonesian)

Currently translated at 100.0% (706 of 706 strings)

Translated using Weblate (Belarusian)

Currently translated at 25.3% (179 of 706 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (706 of 706 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (706 of 706 strings)

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (706 of 706 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (706 of 706 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (706 of 706 strings)

Translated using Weblate (French)

Currently translated at 99.0% (699 of 706 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (706 of 706 strings)

Co-authored-by: Daniel Navarro-Gomez <daniel.navarro.gomez@gmail.com>
Co-authored-by: Doen1el <weblate@mail.danielmuenstermann.de>
Co-authored-by: Fjuro <fjuro@alius.cz>
Co-authored-by: Friso de Boer <collorfrisie@hotmail.com>
Co-authored-by: Heeheon Ryu <heeheon.ryu001@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: João Pedro Nunes <nunes@disroot.org>
Co-authored-by: Massimo Pissarello <mapi68@gmail.com>
Co-authored-by: Matthaiks <kitynska@gmail.com>
Co-authored-by: Milo Ivir <mail@milotype.de>
Co-authored-by: Pose marto <weblate.drainage895@passmail.net>
Co-authored-by: PrivateKeyy <rumaevvadim@gmail.com>
Co-authored-by: Sasha Glazko <lenify@tutanota.com>
Co-authored-by: Takeru Mikenu <mikenu-jp@users.noreply.hosted.weblate.org>
Co-authored-by: Tom G <luq6x@airsworld.net>
Co-authored-by: Wrapty <wrapty@gmail.com>
Co-authored-by: alex <contact@alexionut.ro>
Co-authored-by: avv-dev <vildan.abdullin@gmail.com>
Co-authored-by: opakholis <opakholis@users.noreply.hosted.weblate.org>
Co-authored-by: therry47 <soulietherry@gmail.com>
Co-authored-by: Максим Горпиніч <gorpinicmaksim0@gmail.com>
Co-authored-by: ℂ𝕠𝕠𝕠𝕝 (𝕘𝕚𝕥𝕙𝕦𝕓.𝕔𝕠𝕞/ℂ𝕠𝕠𝕠𝕝) <coool@mail.lv>
Co-authored-by: 大王叫我来巡山 <hamburger2048@users.noreply.hosted.weblate.org>
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/be/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/cs/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/de/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/es/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/fr/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/hr/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/id/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/it/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ja/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ko/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/lv/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/nl/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/pl/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/pt_BR/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ro/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ru/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/tr/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/uk/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/zh_Hans/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/fastlane/ro/
Translation: Cloudstream/App
Translation: Cloudstream/Fastlane
2026-01-19 09:01:52 +00:00
Luna712
ee1009a4e3
Don't suppress SimpleDateFormat lint in BackupUtils (#2372)
Just use `Locale.getDefault()` like we do everywhere else in the app.
2026-01-17 15:03:03 +01:00
gittinrep
dd3be24db1
Removes check for available devices before displaying chromecast button (#2412)
Once the button is selected, the chrome cast service will search for devices and notify the user if none have been found
2026-01-17 15:02:38 +01:00
firelight
7b00fce5c0
Fix: Remove duplicate string and unused code from #2416 2026-01-17 14:57:36 +01:00
Pawloland
ed759d6f50
Add extra brightness feature (#2416) 2026-01-17 14:55:54 +01:00
Phisher98
0431d879e3
Minor fix for HomeHead BG poster adding back shadow and minor fixes (#2422)
* Minor fix for HomeHead BG poster adding back shadow and minor fixes
2026-01-17 14:37:15 +01:00
Phisher98
66cf668c58
Minor fix for HomeHead BG poster dull #2409 (#2420) 2026-01-16 11:31:20 +01:00
firelight
ecd8f8b3f6
Fix: Styling fixes on white theme for hero banner #2409 (Part 2) 2026-01-15 20:17:20 +01:00
firelight
51ab4bfffb
Fix: Code cleanup and edgecases fix for hero card #2409 (Part 1) 2026-01-15 19:59:11 +01:00
Jaidev
3b28313fb5
Enhance Hero Card with Dynamic Rating Badge and Larger Layout (#2409) 2026-01-15 19:26:27 +01:00
Bnyro
91983b38ea
feat(extractors): add stream wish mirror streamhls.to (#2397)
- example url: https://streamhls.to/e/uszo5fi7zdda?33
2026-01-12 17:12:59 +01:00
rockhero1234
6090d0f219
Episode title in downloaded & offline logo (#2375) 2026-01-12 17:10:17 +01:00
Phisher98
124288c829
Add background posters on mobile (vertical) (#2408)
* Add background posters on mobile (vertical)
2026-01-12 16:54:43 +01:00
saimuel
1abb9d35ae
Add new StreamWish mainUrl (#2415) 2026-01-12 15:34:06 +01:00
Kraptor123
79d82b3150
fix: make YouTube subtitles nullable (#2405)
* fix: make YouTube subtitles nullable

* Add the comment back
2026-01-11 19:31:53 +01:00
firelight
73f258ca17
Fix: logoUrl final fix 2026-01-09 03:33:26 +01:00
firelight
bd7a90b064
Fix: Phone bindLogo + Prerelease annotation on logo 2026-01-09 03:31:40 +01:00
firelight
57c3d332ae
Fix: Race conditon fix, and code cleanup 2026-01-09 03:24:18 +01:00
Phisher98
fbc588b173
Add logo image (#2384) 2026-01-09 03:21:05 +01:00
firelight
2b7ff8b336
Fix: YT cleanup and subtitle fix 2026-01-09 02:23:37 +01:00
Kraptor123
2aaf99b3fd
Youtube Extractor now plays videos up to 1080p (#2386) 2026-01-09 02:22:47 +01:00
Bnyro
5c0f715973
feat(extractors): add gupload.xyz extractor (#2391) 2026-01-05 02:28:23 +01:00
saimuel
368ee2aca9
new mainUrl DoodExtractor (#2388) 2026-01-05 02:27:25 +01:00
Bnyro
2129c2f982
feat(extractors): add streamembed extractor (#2394) 2026-01-05 02:26:41 +01:00
Kraptor123
f84414dbf6
New Theme - Silent Blue (#2392) 2026-01-04 11:35:15 +01:00
rockhero1234
5e54552338
remove check icon in tvtype chips (#2363) 2026-01-04 11:29:04 +01:00
Bnyro
dc6b9f435d
feat(extractors): add up4stream extractor (#2389) 2026-01-04 10:09:50 +01:00
Bnyro
2795e9e0e2
feat(extractors): add vidnest extractor (#2390) 2026-01-04 10:08:15 +01:00
Luna712
81d9ecde67
Move untranslatable strings to seperate file (#2273)
This could cause crashes or poisoned data on some languages as some untranslatable strings were being translated, including keys and format strings that shouldn't be translatable. Also when translating the episodes key on weblate it caused a conflict between the plural version (which weblate does support) and the actual episodes key, meaning the episodes key was translating as the singular version of the plural episodes version in some cases. Moving to a separate resource file should hopefully prevent these issues.
2025-12-24 02:21:59 +00:00
firelight
b7e38ebc4e
Merge pull request #2361 from recloudstream/weblate
Translations update from Hosted Weblate
2025-12-24 02:07:55 +00:00
Hosted Weblate
ea194d9b48
Merge remote-tracking branch 'origin/master' 2025-12-24 02:07:14 +00:00
Luna712
3fe6a7853a
Replace QuickJS with Zipline (#2256)
QuickJS was renamed to Zipline all the way back in 2021. Unlike old QuickJS, newer Zipline versions are 16kb aligned. Current Zipline is also compatible back to minSdk 21.
2025-12-24 02:07:08 +00:00
Hosted Weblate
fb0df7991c
Merge remote-tracking branch 'origin/master' 2025-12-24 01:57:37 +00:00
Luna712
063d960c3a
Pin rhino version (#2369) 2025-12-24 01:57:28 +00:00
Hosted Weblate
7fd4902180
Translated using Weblate (Belarusian)
Currently translated at 33.4% (277 of 828 strings)

Translated using Weblate (Arabic (Levantine))

Currently translated at 100.0% (828 of 828 strings)

Translated using Weblate (Belarusian)

Currently translated at 27.5% (228 of 828 strings)

Translated using Weblate (Latvian)

Currently translated at 84.9% (703 of 828 strings)

Translated using Weblate (Belarusian)

Currently translated at 25.4% (211 of 828 strings)

Translated using Weblate (Portuguese)

Currently translated at 100.0% (828 of 828 strings)

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (828 of 828 strings)

Translated using Weblate (Belarusian)

Currently translated at 23.0% (191 of 828 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (828 of 828 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (828 of 828 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (828 of 828 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Juan Rubin <juancrubin08@gmail.com>
Co-authored-by: Massimo Pissarello <mapi68@gmail.com>
Co-authored-by: Pizza Party <paol.m@proton.me>
Co-authored-by: Sasha Glazko <lenify@tutanota.com>
Co-authored-by: soldado-do-wolfenstein <luigi.rebelato1234@gmail.com>
Co-authored-by: Максим Горпиніч <gorpinicmaksim0@gmail.com>
Co-authored-by: ℂ𝕠𝕠𝕠𝕝 (𝕘𝕚𝕥𝕙𝕦𝕓.𝕔𝕠𝕞/ℂ𝕠𝕠𝕠𝕝) <coool@mail.lv>
Co-authored-by: 大王叫我来巡山 <hamburger2048@users.noreply.hosted.weblate.org>
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/apc/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/be/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/it/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/lv/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/pt/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/pt_BR/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/uk/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/zh_Hans/
Translation: Cloudstream/App
2025-12-23 20:00:29 +01:00
Luna712
6c2228b964
Improve caching system for actions (#2249) 2025-12-21 02:48:37 +00:00
Luna712
be78306c55
Minor order fix for lint plugin (#2355) 2025-12-21 02:22:07 +00:00
recloudstream[bot]
bc68b3d7c6 chore(locales): fix locale issues 2025-12-21 02:19:29 +00:00
firelight
8067742192
Merge pull request #2340 from recloudstream/weblate
Translations update from Hosted Weblate
2025-12-21 02:19:17 +00:00
firelight
bdcb9b4807
Merge branch 'master' into weblate 2025-12-21 02:17:33 +00:00
Luna712
0593cfbc01
Add linting to library (#2301) 2025-12-21 02:11:54 +00:00
Luna712
caf6704c54
Merge branch 'recloudstream:master' into directories 2025-12-20 18:36:50 -07:00
recloudstream[bot]
0d77f7b91a chore(locales): fix locale issues 2025-12-21 01:27:09 +00:00
Hosted Weblate
b3c44becc7
Merge remote-tracking branch 'origin/master' 2025-12-21 02:26:58 +01:00
Luna712
db2ef08b0a
Add lint.xml and add ignores to it (#2300)
It's more expandable later on this way.
2025-12-21 01:26:53 +00:00
Luna712
568223a496
Use new KMP plugin for library (#2251)
For compatibility with AGP 9, but this works on past AGP also, so we do it now to prepare for AGP 9 and make that simpler.
2025-12-21 01:22:16 +00:00
Hosted Weblate
fd11b5dd6a
Translated using Weblate (Czech)
Currently translated at 100.0% (828 of 828 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (828 of 828 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (828 of 828 strings)

Translated using Weblate (Belarusian)

Currently translated at 20.8% (172 of 825 strings)

Translated using Weblate (Belarusian)

Currently translated at 100.0% (4 of 4 strings)

Translated using Weblate (Belarusian)

Currently translated at 14.7% (122 of 825 strings)

Added translation using Weblate (Belarusian)

Translated using Weblate (Hindi)

Currently translated at 64.1% (529 of 825 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 99.6% (822 of 825 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (825 of 825 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Latvian)

Currently translated at 84.9% (701 of 825 strings)

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (825 of 825 strings)

Translated using Weblate (Russian)

Currently translated at 100.0% (825 of 825 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (825 of 825 strings)

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (825 of 825 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (825 of 825 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (825 of 825 strings)

Translated using Weblate (Spanish)

Currently translated at 98.4% (811 of 824 strings)

Translated using Weblate (German)

Currently translated at 99.8% (823 of 824 strings)

Co-authored-by: Adrian Rodriguez Rodriguez <arrodriguez1809@gmail.com>
Co-authored-by: Fjuro <fjuro@alius.cz>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Massimo Pissarello <mapi68@gmail.com>
Co-authored-by: Matthaiks <kitynska@gmail.com>
Co-authored-by: Oliver <oliver.puff@gmx.de>
Co-authored-by: P Patel <pdvadalia2007@gmail.com>
Co-authored-by: Sasha Glazko <lenify@tutanota.com>
Co-authored-by: Takeru Mikenu <mikenu-jp@users.noreply.hosted.weblate.org>
Co-authored-by: Thiago Papageorgiou <tnpapa.simply253@aleeas.com>
Co-authored-by: korn3r <korn3r@gmail.com>
Co-authored-by: Максим Горпиніч <gorpinicmaksim0@gmail.com>
Co-authored-by: ℂ𝕠𝕠𝕠𝕝 (𝕘𝕚𝕥𝕙𝕦𝕓.𝕔𝕠𝕞/ℂ𝕠𝕠𝕠𝕝) <coool@mail.lv>
Co-authored-by: 大王叫我来巡山 <hamburger2048@users.noreply.hosted.weblate.org>
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/be/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/cs/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/de/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/es/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/hi/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/it/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ja/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/lv/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/pl/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/pt_BR/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ru/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/uk/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/zh_Hans/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/fastlane/be/
Translation: Cloudstream/App
Translation: Cloudstream/Fastlane
2025-12-21 02:01:18 +01:00
Luna712
9cd6e64120
Don't remove trailing newlines in fix locales (#2238)
It seems that weblate actually does add newlines so "to be consistent" we shouldn't remove them. I'm not 100% sure if this just changed at some point or if we do actually want to remove them still.
2025-12-21 01:00:51 +00:00
Luna712
ba74a9062f
Fix broken seeking on some fragmented MP4 files (#2352)
Seek doesn't work (only shows duration of a few seconds and seeking then restarts it) on some fragmented MP4 files if they have multiple sidx boxes. Setting this flag merges those and thus will allow seeking. This can be tested using https://github.com/androidx/media/blob/release/libraries/test_data/src/test/assets/media/mp4/sample_fragmented_seekable_multiple_sidx.mp4
2025-12-20 22:29:23 +01:00
rockhero1234
c048426601
feat:separate episode text in continue watching (#2093) 2025-12-20 16:52:33 +01:00
Luna712
7ef57537ac
Bump material (#2348) 2025-12-20 16:07:48 +01:00
Luna712
bac6939444
Use VERSION_NAME from BuildConfig for app version (#2337) 2025-12-18 19:24:17 +01:00
firelight
ac6b20c178
Fix: Circular progress track color, Closes #2346 2025-12-18 18:20:30 +00:00
rockhero1234
47fac5dd4d
replaybtn (#2335) 2025-12-18 16:09:48 +01:00
Luna712
729ede5484
Fix scroll issue on bottom dialogs and add drag handle to UI (#2333) 2025-12-17 21:40:48 +01:00
rockhero1234
e97645c753
open in browser btn:original trailer url instead of extractedlink (#2332) 2025-12-17 21:34:11 +01:00
firelight
bd77965efb
Merge pull request #2307 from Luna712/minimum-duration-api
Remove "Too short playback" error
2025-12-16 22:16:29 +00:00
firelight
764201bbbd
Chore: Cleanup InAppUpdater 2025-12-16 21:56:26 +00:00
firelight
7cb8e7c846
Merge pull request #2326 from Luna712/remove-prerelease-setting
Replace the "Update to prereleases" setting with a new button
2025-12-16 21:50:48 +00:00
Luna712
8012339137
Merge branch 'recloudstream:master' into remove-prerelease-setting 2025-12-16 14:27:47 -07:00
firelight
1e9e9b4173
Fixed issue with selecting subtitles and source at the same time, Closes #2339 2025-12-16 21:19:34 +00:00
firelight
c555ec1375
Merge pull request #2338 from Luna712/no-install-backup
Don't create backup on first install
2025-12-16 17:31:36 +00:00
Luna712
fc1c0fc1c5
Don't create backup on first install
There is no reason to create a mostly empty backup when the app is first installed.
2025-12-15 15:06:56 -07:00
Luna712
5a3158ce6f
No change there 2025-12-15 11:39:58 -07:00
Luna712
ce944a9193
Remove entirely 2025-12-15 11:38:41 -07:00
Luna712
f684bd59b5
Merge branch 'master' into remove-prerelease-setting 2025-12-15 10:58:33 -07:00
recloudstream[bot]
3c9120f6fa chore(locales): fix locale issues 2025-12-15 17:55:11 +00:00
firelight
66ef8518b8
Merge pull request #2257 from recloudstream/weblate
Translations update from Hosted Weblate
2025-12-15 17:54:57 +00:00
Hosted Weblate
6c8c93958f
Merge remote-tracking branch 'origin/master' 2025-12-15 18:52:05 +01:00
rockhero1234
249b36e8b3
tv episodes layout minor fix (#2334) 2025-12-15 17:52:00 +00:00
Hosted Weblate
e88aa3be44
Merge remote-tracking branch 'origin/master' 2025-12-15 18:47:34 +01:00
Luna712
aa08fa126b
Bump AGP to 8.13.2 (#2318) 2025-12-15 17:47:30 +00:00
Luna712
604a9197d4
Add param doc 2025-12-15 10:18:13 -07:00
Hosted Weblate
97e1c1d3ff
Merge remote-tracking branch 'origin/master' 2025-12-15 00:41:10 +01:00
Nivin
029b72c17b
Add support for external audio tracks in player (#2288) 2025-12-15 00:41:02 +01:00
Hosted Weblate
c74f5dc61f
Merge remote-tracking branch 'origin/master' 2025-12-14 23:25:10 +00:00
Luna712
45cd0e6e3f
Add helper for default back press callback handling (#2243) 2025-12-15 00:25:04 +01:00
Luna712
42a1e58527
Remove native-lib.cpp (#2331)
It was first disabled in 8193e39 and eventually later on in 
f5d1f68 CMakeLists was removed completely so removing this should be fine too.
2025-12-13 23:45:06 +01:00
Hosted Weblate
362949bc23
Translated using Weblate (Latvian)
Currently translated at 85.0% (701 of 824 strings)

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Latvian)

Currently translated at 83.9% (692 of 824 strings)

Translated using Weblate (Hindi)

Currently translated at 54.2% (447 of 824 strings)

Translated using Weblate (Latvian)

Currently translated at 83.8% (691 of 824 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (824 of 824 strings)

Translated using Weblate (Russian)

Currently translated at 100.0% (824 of 824 strings)

Translated using Weblate (Latvian)

Currently translated at 83.7% (690 of 824 strings)

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Latvian)

Currently translated at 82.7% (682 of 824 strings)

Translated using Weblate (Romanian)

Currently translated at 88.8% (732 of 824 strings)

Translated using Weblate (Latvian)

Currently translated at 100.0% (4 of 4 strings)

Translated using Weblate (Latvian)

Currently translated at 77.5% (639 of 824 strings)

Translated using Weblate (Latvian)

Currently translated at 76.0% (627 of 824 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (French)

Currently translated at 99.7% (822 of 824 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (French)

Currently translated at 99.7% (822 of 824 strings)

Translated using Weblate (Russian)

Currently translated at 99.7% (822 of 824 strings)

Translated using Weblate (Tamil)

Currently translated at 96.3% (794 of 824 strings)

Translated using Weblate (Arabic)

Currently translated at 100.0% (824 of 824 strings)

Translated using Weblate (Vietnamese)

Currently translated at 100.0% (824 of 824 strings)

Translated using Weblate (Portuguese)

Currently translated at 100.0% (824 of 824 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Turkish)

Currently translated at 100.0% (829 of 829 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Macedonian)

Currently translated at 100.0% (829 of 829 strings)

Translated using Weblate (Indonesian)

Currently translated at 100.0% (829 of 829 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (829 of 829 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (829 of 829 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (829 of 829 strings)

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Italian)

Currently translated at 100.0% (829 of 829 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (829 of 829 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (829 of 829 strings)

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (829 of 829 strings)

Co-authored-by: Anthony Cyndora <anthony270777@gmail.com>
Co-authored-by: Esat Tuna BECAN <esattunabecan4@gmail.com>
Co-authored-by: Fjuro <fjuro@alius.cz>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Jaidev Subramanian <tarunjai415@gmail.com>
Co-authored-by: Juan Rubin <juancrubin08@gmail.com>
Co-authored-by: Kerim Demirkaynak <aschannel111@gmail.com>
Co-authored-by: MagElwis <m.mhelheli@gmail.com>
Co-authored-by: Man <thebroker2308@gmail.com>
Co-authored-by: Massimo Pissarello <mapi68@gmail.com>
Co-authored-by: Mateus Liberale Gomes <sergiogomes209403@gmail.com>
Co-authored-by: Matthaiks <kitynska@gmail.com>
Co-authored-by: Mikenu Takeru <mikenu-jp@users.noreply.hosted.weblate.org>
Co-authored-by: Pascariu Alex <pascariu610@gmail.com>
Co-authored-by: QSkill <QSkull@protonmail.com>
Co-authored-by: Sisitenr <sisiton2019@gmail.com>
Co-authored-by: VKing9 <vaibhavrathod2282@gmail.com>
Co-authored-by: opakholis <opakholis@users.noreply.hosted.weblate.org>
Co-authored-by: stojkovskistefan <stefanstojkovski@gmail.com>
Co-authored-by: Максим Горпиніч <gorpinicmaksim0@gmail.com>
Co-authored-by: ℂ𝕠𝕠𝕠𝕝 (𝕘𝕚𝕥𝕙𝕦𝕓.𝕔𝕠𝕞/ℂ𝕠𝕠𝕠𝕝) <coool@mail.lv>
Co-authored-by: 大王叫我来巡山 <hamburger2048@users.noreply.hosted.weblate.org>
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ar/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/cs/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/fr/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/hi/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/id/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/it/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ja/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/lv/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/mk/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/pl/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/pt/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/pt_BR/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ro/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ru/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ta/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/tr/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/uk/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/vi/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/zh_Hans/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/fastlane/lv/
Translation: Cloudstream/App
Translation: Cloudstream/Fastlane
2025-12-13 18:00:23 +00:00
Luna712
5ec30d64d2
Fix comment 2025-12-12 23:44:36 -07:00
Luna712
77e4ca32ec
Use install prerelease button preference 2025-12-12 23:17:08 -07:00
Luna712
5c396013b8
Update upload-artifact action to v6 (#2325) 2025-12-13 04:54:22 +01:00
Phisher98
15c70ded91
Adding ByseSX Extractor (Filemoon New Domain) (#2310) 2025-12-13 04:54:10 +01:00
Luna712
50173aaaf6
Remove "Update to prereleases" setting
This setting is very confusing on stable, when there is a seperate flavor for prerelease that is needed. Also causes other issues and conflicts with what you are updating on stable, and is annoying to always get update dialogs on debug versions when it doesn't work or do anything in debug version.
2025-12-12 17:17:49 -07:00
Luna712
6aa856e93c
Readd SearchAutoComplete check for now (#2322)
Seems to break focus on TV, not sure why, I can figure out why later, but for now just fixing like this as this is a critical bug, in my opinion.
2025-12-11 22:24:50 +01:00
Luna712
eaf2ac0792
Add some tools:targetApi to styles to appease lint (#2319)
Part of my work to fix all error level lint issues, in order to eventually enable `failOnError` and ensure better compatability with older API levels and a more consistent reporting of issues.
2025-12-11 21:04:11 +01:00
Luna712
5d2e432614
Make InAppUpdater an object (#2321)
Better than a class with only a companion object I think.
2025-12-11 21:03:37 +01:00
Luna712
70121f4548
Fix crash on Android 5 (#2320)
I just realized I hadn't done a PR to fix this issue yet but this issue is why I've been working on fixing all error level lint issues so that we can enable `failOnError` which would have prevented this.
2025-12-11 20:41:51 +01:00
Luna712
a836b26849
Cleanup InAppUpdater (#2298)
The only functional change here is that the commit in the updater dialog was normalized to what it is everywhere else, meaning it is 7 not 10 characters now.

I also have another patch prepared to convert this entire class to an actual object rather than just a class with only a companion object but since that touches every single line due to indentation changes, I decided to split it in order to make it easier to review.
2025-12-11 20:32:32 +01:00
Luna712
74ceaf9a3f
Add a lint suppression for RestrictedApi (#2312) 2025-12-11 20:27:36 +01:00
Luna712
350d19bd6b
Some minor miscellaneous cleanup (#2306)
* Some minor miscellaneous cleanup

* Remove classes
2025-12-11 18:27:54 +01:00
Luna712
7ded6a4fa1
Add tools:targetApi to appease lint (#2315)
Part of my work to fix all error level lint issues, in order to eventually enable `failOnError` and ensure better compatability with older API levels and a more consistent reporting of issues.
2025-12-11 17:56:34 +01:00
Luna712
9a9e71354c
Remove check for SearchAutoComplete (#2313) 2025-12-11 17:55:00 +01:00
rockhero1234
e0231520d5
added mpvex (#2309) 2025-12-11 17:37:19 +01:00
Luna712
ae5e25726d
Use String.toUri consistently (#2304) 2025-12-11 17:31:36 +01:00
Luna712
d5eba57bc0
Cleanup UnstableApi usage (#2314)
* Remove `@UnstableApi` from GeneratorPlayer and use OptIn instead.
* Remove `@OptIn` from WebviewFragment as it was unnecessary.
* Move `@OptIn` in SaveCaptionStyle to the actual single line we need to OptIn.
* Split `setCues` logic to a new method in ChromcastSubtitlesFragment and only add `@OptIn` to that method as it's only necessary there.
* Add some missing `@OptIn` annotations to fix all remaining `UnsafeOptInUsageError` lint errors.
2025-12-11 17:20:22 +01:00
Luna712
8fabb5c572
Suppress an UnspecifiedRegisterReceiverFlag lint issue (#2316)
Part of my work to fix all error level lint issues, in order to eventually enable `failOnError` and ensure better compatability with older API levels and a more consistent reporting of issues.
2025-12-11 17:17:25 +01:00
Osten
a46b0ac6e6
Download selection fix + sub del fix + Del dialog fix (#2308) 2025-12-08 22:35:11 +01:00
Luna712
e25847cb64
Add API for minimum media duration 2025-12-07 15:24:42 -07:00
Luna712
1a852f1f4c
Use SharedPreferences.edit extension function (#2299) 2025-12-06 15:35:14 +00:00
Luna712
fdad31c10e
Add backward compatibility for one more AcraApplication method (#2302)
`removeKeys()` only seems to be used by one single extension, but I suppose it doesn't hurt to still add back compat for it.
2025-12-06 15:29:57 +00:00
Luna712
f77df2f3bf
Use temurin distribution for setup-java action (#2297)
Per the note on the README for `actions/setup-java`: "AdoptOpenJDK got moved to Eclipse Temurin and won't be updated anymore. It is highly recommended to migrate workflows from `adopt` and `adopt-openj9`, to `temurin` and `semeru` respectively, to keep receiving software and security updates."
2025-12-05 01:52:24 +01:00
Luna712
f2a008922d
Bump rhino to 1.8.1 (#2295) 2025-12-05 01:51:12 +01:00
Luna712
472d0bab8b
Remove unused swiperefreshlayout dependency (#2296) 2025-12-05 01:48:29 +01:00
Luna712
93255dfc22
Add explicit dependency on fragment (#2233)
As with some of my other PRs, explicit dependencies allow for better version control.
2025-12-05 01:33:30 +01:00
Luna712
e47349af7a
Bump material (#2241) 2025-12-05 01:25:18 +01:00
Luna712
cd69597a54
Move app version to BuildConfig (#2291)
Also, the intent seems to be to be to set the version to `-PRE` when in pre release, which doesn't currently work, but this fixes that.
2025-12-05 01:20:08 +01:00
Luna712
b2e06c5966
Remove BuildConfig.BETA (#2290)
It's unused and can be accessed with `BuildConfig.FLAVOR == "prerelease"`
2025-12-05 01:13:38 +01:00
Luna712
2c0fa70101
Clear home page adapter pools when reloading (#2272) 2025-12-05 01:12:14 +01:00
Luna712
0b3aa24e66
Some cleanup/improvements to layouts (#2274) 2025-12-05 01:09:54 +01:00
firelight
d4d273f010
Fix: Configuration change view invalidation on AutofitRecyclerView popup 2025-12-04 23:50:56 +00:00
rockhero1234
81b2718129
horizontal poster in expanded list (#2286) 2025-12-05 00:34:52 +01:00
Luna712
2ac0698bd2
Handle new Android 16 biometrics error type (#2275)
Adds handling for `BiometricManager.BIOMETRIC_ERROR_NOT_ENABLED_FOR_APPS` which was added in API level 36.
2025-11-30 19:32:20 +00:00
Luna712
1dd477a965
Disable MissingTranslation lint (#2276)
Translations are handled by weblate, so we don't really care about missing translations here.
2025-11-30 19:21:09 +00:00
Luna712
110cf571bd
Fix no poster showing wrong poster (#2278) 2025-11-30 19:19:52 +00:00
Luna712
dad6b92ae3
Fix downloads loading background (#2279) 2025-11-30 19:15:11 +00:00
Luna712
d794f6182e
Add Prerelease annotation to extractors that are not in stable (#2281) 2025-11-30 19:11:05 +00:00
Osten
b68fadc956
Minor fixes to recycled DownloadAdapter cards 2025-11-30 00:24:08 +01:00
Osten
1aa6a6215d
Minor fix to ConsistentLiveData 2025-11-28 21:37:55 +01:00
Osten
38296bfb1a Fixed the atrocity of download selection along with some crash fixes and bugs. 2025-11-28 21:24:31 +01:00
Luna712
b05ccb2bc7
Merge branch 'recloudstream:master' into directories 2025-11-28 10:57:57 -07:00
Luna712
7fb6f3f535
Add explicit dependsOn for copyJar (#2261) 2025-11-27 18:37:47 +00:00
Luna712
d43a371b15
Better backward compatibility for AcraApplication (#2265) 2025-11-27 18:34:14 +00:00
Luna712
9d651f1f82
Remove work-runtime dependency (#2234)
We only really need to include the Kotlin version, work-runtime-ktx here.
2025-11-25 15:24:21 +01:00
Luna712
7f9f89cbf6
Use version catalog bundles for coil and lifecycle (#2237) 2025-11-25 15:16:37 +01:00
Luna712
009dcc2b89
Use version catalog for plugins (#2206) 2025-11-24 18:26:07 +01:00
Luna712
3be396216f
Remove acra and replace AcraApplication with CloudStreamApp (#2207) 2025-11-24 18:04:51 +01:00
Luna712
a95d8ddc78
Remove unnecessary overrideLibrary for torrServer (#2235) 2025-11-24 17:53:55 +01:00
rockhero1234
f2de69a1ee
UI improvement (#2209) 2025-11-24 17:50:32 +01:00
firelight
6332f1c344
Merge pull request #2239 from Luna712/panels-backpress
Close overlapping panels on back press
2025-11-24 16:33:53 +00:00
Luna712
2111049cec
Use unique callback ID 2025-11-24 08:50:40 -07:00
firelight
c310ee7ed0
Merge pull request #2250 from Luna712/resvalues
Enable resValues in buildFeatures
2025-11-24 14:31:14 +00:00
firelight
9a7654ebb7
Merge pull request #2258 from phisher98/HubCloud-Improve
Hub cloud improve
2025-11-24 14:29:41 +00:00
075c7440bf HubCloud Improvement 2025-11-24 12:49:37 +05:30
Phisher98
dc2fc15ae3
Merge branch 'recloudstream:master' into master 2025-11-24 12:41:00 +05:30
recloudstream[bot]
511536fda7 chore(locales): fix locale issues 2025-11-23 21:11:24 +00:00
firelight
e40cc27369
Translated using Weblate (Indonesian) (#2236)
Currently translated at 100.0% (829 of 829 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (829 of 829 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (829 of 829 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (829 of 829 strings)

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Italian)

Currently translated at 100.0% (829 of 829 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (829 of 829 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (829 of 829 strings)

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (829 of 829 strings)










Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/cs/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/id/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/it/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ja/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/pl/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/tr/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/uk/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/zh_Hans/
Translation: Cloudstream/App

Co-authored-by: Esat Tuna BECAN <esattunabecan4@gmail.com>
Co-authored-by: Fjuro <fjuro@alius.cz>
Co-authored-by: Massimo Pissarello <mapi68@gmail.com>
Co-authored-by: Matthaiks <kitynska@gmail.com>
Co-authored-by: Mikenu Takeru <mikenu-jp@users.noreply.hosted.weblate.org>
Co-authored-by: opakholis <opakholis@users.noreply.hosted.weblate.org>
Co-authored-by: Максим Горпиніч <gorpinicmaksim0@gmail.com>
Co-authored-by: 大王叫我来巡山 <hamburger2048@users.noreply.hosted.weblate.org>
2025-11-23 21:11:11 +00:00
Luna712
0caddd84d4
Minor cleanup to workflows (#2255) 2025-11-23 21:09:41 +00:00
Luna712
a9771d8a03
Replace srcDirs with directories
This is an error in AGP 9, but works in past AGP releases also. Just to prepare for AGP 9 we can just do this now.
2025-11-22 14:37:49 -07:00
Luna712
003544ad44
Enable resValues in buildFeatures
This will be required in AGP 9, but just to prepare for that, we can do it now. Only the default changed, this should have no effect on older AGP versions.
2025-11-22 13:34:32 -07:00
Hosted Weblate
9d20b9f322
Merge remote-tracking branch 'origin/master' 2025-11-22 20:18:44 +00:00
Luna712
f4b5acd401
Bump checkout action (#2242) 2025-11-22 20:18:37 +00:00
Hosted Weblate
a4ab7086a7
Merge remote-tracking branch 'origin/master' 2025-11-22 21:18:03 +01:00
Phisher98
3a5e29b77d
Vidsrc is Dead and Minor Fix for hubcloud (#2245) 2025-11-22 20:17:57 +00:00
Hosted Weblate
e2622b557c
Merge remote-tracking branch 'origin/master' 2025-11-22 21:13:16 +01:00
Luna712
36594604a8
Migrate freeCompilerArgs to new DSL (#2248)
`jvmDefault.set(JvmDefaultMode.ENABLE)` is equivalent to `-jvm-default=enable`, which replaces `-Xjvm-default=all-compatibility` in Kotlin 2.2, it doesn't yet warn, but does in Kotlin 2.3.

https://youtrack.jetbrains.com/issue/KT-61649
https://youtrack.jetbrains.com/issue/KT-74590
https://youtrack.jetbrains.com/issue/KT-76353
https://kotlinlang.org/docs/gradle-compiler-options.html#migrate-freecompilerargs
2025-11-22 20:13:11 +00:00
0b310ef87c Vidsrc is Dead and Minor Fix for hubcloud 2025-11-21 23:57:55 +05:30
6dabce4e93 Vidsrc is Dead and Minor Fix for hubcloud 2025-11-21 23:42:11 +05:30
90091eb305 Vidsrc is Dead and Minor Fix for hubcloud 2025-11-21 23:41:25 +05:30
Hosted Weblate
a4a2604962
Translated using Weblate (Indonesian)
Currently translated at 100.0% (829 of 829 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (829 of 829 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (829 of 829 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (829 of 829 strings)

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Italian)

Currently translated at 100.0% (829 of 829 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (829 of 829 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (829 of 829 strings)

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (829 of 829 strings)

Co-authored-by: Esat Tuna BECAN <esattunabecan4@gmail.com>
Co-authored-by: Fjuro <fjuro@alius.cz>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Massimo Pissarello <mapi68@gmail.com>
Co-authored-by: Matthaiks <kitynska@gmail.com>
Co-authored-by: Mikenu Takeru <mikenu-jp@users.noreply.hosted.weblate.org>
Co-authored-by: opakholis <opakholis@users.noreply.hosted.weblate.org>
Co-authored-by: Максим Горпиніч <gorpinicmaksim0@gmail.com>
Co-authored-by: 大王叫我来巡山 <hamburger2048@users.noreply.hosted.weblate.org>
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/cs/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/id/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/it/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ja/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/pl/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/tr/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/uk/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/zh_Hans/
Translation: Cloudstream/App
2025-11-21 07:51:24 +00:00
Luna712
032c8404d9
Close overlapping panels on back press 2025-11-19 15:19:46 -07:00
Osten
a3a7b7067b
Include submitList commitCallback to BaseAdapter (from QuickNovel) 2025-11-18 20:29:13 +01:00
Luna712
29f8f02eef
Merge pull request #2146 from Luna712/toolchain
Add jdk toolchain
2025-11-18 17:22:57 +00:00
recloudstream[bot]
4bf659e44a chore(locales): fix locale issues 2025-11-18 17:08:49 +00:00
firelight
d83f324457
Merge pull request #2181 from recloudstream/weblate
Translations update from Hosted Weblate
2025-11-18 17:08:32 +00:00
Hosted Weblate
94552c1a66
Merge remote-tracking branch 'origin/master' 2025-11-18 18:07:23 +01:00
Luna712
10192553ce
Upgrade Gradle wrapper to 9.2.1 (#2230) 2025-11-18 17:07:17 +00:00
rockhero1234
dcc107df09
full series btn (#2220) 2025-11-18 16:18:24 +01:00
Hosted Weblate
34a1a38be0
Merge remote-tracking branch 'origin/master' 2025-11-18 15:12:50 +00:00
Luna712
1f58160630
UI fixes for portrait subtitle offset dialog (#2228) 2025-11-18 16:12:45 +01:00
Hosted Weblate
1d61894d2d
Merge remote-tracking branch 'origin/master' 2025-11-18 15:02:05 +00:00
Luna712
96558ba61b
Handle out of range error in player (#2215) 2025-11-18 16:01:56 +01:00
Kraptor123
c0d5356d81
VkExtractor (#2223) 2025-11-18 15:59:26 +01:00
Hosted Weblate
d75c084b3a
Translated using Weblate (English)
Currently translated at 99.8% (827 of 828 strings)

Translated using Weblate (Russian)

Currently translated at 99.7% (826 of 828 strings)

Translated using Weblate (Arabic)

Currently translated at 100.0% (828 of 828 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (828 of 828 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (828 of 828 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Vietnamese)

Currently translated at 100.0% (828 of 828 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (828 of 828 strings)

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (828 of 828 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (828 of 828 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Polish)

Currently translated at 100.0% (828 of 828 strings)

Translated using Weblate (Assamese)

Currently translated at 91.7% (760 of 828 strings)

Translated using Weblate (Arabic (Levantine))

Currently translated at 97.4% (807 of 828 strings)

Translated using Weblate (Filipino)

Currently translated at 21.0% (174 of 828 strings)

Translated using Weblate (Japanese)

Currently translated at 99.8% (827 of 828 strings)

Translated using Weblate (Ukrainian)

Currently translated at 99.8% (827 of 828 strings)

Translated using Weblate (German)

Currently translated at 99.7% (826 of 828 strings)

Translated using Weblate (Spanish)

Currently translated at 98.6% (817 of 828 strings)

Translated using Weblate (Russian)

Currently translated at 99.8% (827 of 828 strings)

Translated using Weblate (Tamil)

Currently translated at 96.1% (796 of 828 strings)

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 99.8% (827 of 828 strings)

Translated using Weblate (Vietnamese)

Currently translated at 99.8% (827 of 828 strings)

Translated using Weblate (Turkish)

Currently translated at 99.8% (827 of 828 strings)

Translated using Weblate (Swedish)

Currently translated at 93.2% (772 of 828 strings)

Translated using Weblate (Polish)

Currently translated at 99.8% (827 of 828 strings)

Translated using Weblate (Macedonian)

Currently translated at 99.7% (826 of 828 strings)

Translated using Weblate (Italian)

Currently translated at 99.8% (827 of 828 strings)

Translated using Weblate (Indonesian)

Currently translated at 99.7% (826 of 828 strings)

Translated using Weblate (Croatian)

Currently translated at 98.1% (813 of 828 strings)

Translated using Weblate (French)

Currently translated at 98.4% (815 of 828 strings)

Translated using Weblate (Greek)

Currently translated at 94.9% (786 of 828 strings)

Translated using Weblate (Czech)

Currently translated at 99.8% (827 of 828 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 99.6% (825 of 828 strings)

Translated using Weblate (Bulgarian)

Currently translated at 96.3% (798 of 828 strings)

Translated using Weblate (Arabic)

Currently translated at 98.5% (816 of 828 strings)

Translated using Weblate (Portuguese)

Currently translated at 100.0% (828 of 828 strings)

Co-authored-by: Ahmed Al-Nassif <mr.ahmed.nassif@gmail.com>
Co-authored-by: Carrillo Rodriguez <carrillorodriguez672@gmail.com>
Co-authored-by: Deleted User <anonymous2676@users.noreply.hosted.weblate.org>
Co-authored-by: Deleted User <noreply+110771@weblate.org>
Co-authored-by: Esspel <eric.soderstrom06@gmail.com>
Co-authored-by: Fjuro <fjuro@alius.cz>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Itsmechinmoy <167056923+itsmechinmoy@users.noreply.github.com>
Co-authored-by: Ivan Kostov <jiveq1@gmail.com>
Co-authored-by: John Kennedy Peña <jkhp.jkpa@gmail.com>
Co-authored-by: Juan Rubin <juancrubin08@gmail.com>
Co-authored-by: Konstantin <konstantinkreutz@gmail.com>
Co-authored-by: Man <thebroker2308@gmail.com>
Co-authored-by: Massimo Pissarello <mapi68@gmail.com>
Co-authored-by: Matthaiks <kitynska@gmail.com>
Co-authored-by: Mikenu Takeru <mikenu-jp@users.noreply.hosted.weblate.org>
Co-authored-by: Milo Ivir <mail@milotype.de>
Co-authored-by: Nguyễn Tiến Đạt <dn16092000@gmail.com>
Co-authored-by: Pizza Party <paol.m@proton.me>
Co-authored-by: Rere Doloi <reredolire@gmail.com>
Co-authored-by: Rex_sa <rex.sa@pm.me>
Co-authored-by: Saúl Palacios <palacios22c@gmail.com>
Co-authored-by: Serdar Sağlam <teknomobil@msn.com>
Co-authored-by: Sergey Ponomarev <stokito@gmail.com>
Co-authored-by: g333fed <fedorn990@gmail.com>
Co-authored-by: leyakid803 <leyakid803@minduls.com>
Co-authored-by: stojkovskistefan <stefanstojkovski@gmail.com>
Co-authored-by: william piti <loolyowo@gmail.com>
Co-authored-by: zmni <zmni@outlook.com>
Co-authored-by: Максим Горпиніч <gorpinicmaksim0@gmail.com>
Co-authored-by: தமிழ்நேரம் <tamilneram247@gmail.com>
Co-authored-by: 大王叫我来巡山 <hamburger2048@users.noreply.hosted.weblate.org>
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/apc/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ar/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/as/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/bg/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/cs/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/de/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/el/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/en/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/es/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/fil/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/fr/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/hr/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/id/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/it/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ja/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/mk/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/pl/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/pt/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/pt_BR/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ru/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/sv/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ta/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/tr/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/uk/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/vi/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/zh_Hans/
Translation: Cloudstream/App
2025-11-17 12:51:29 +01:00
firelight
0579a15f9b
Fix: PIP problems caused by #2199 + Old PIP problems on low API versions. Closes #2202 2025-11-13 13:58:57 +00:00
Luna712
ac3d057358
Upgrade to targetSdk 36 (#2043) 2025-11-12 17:17:30 +01:00
rockhero1234
5370d019ff
minor ui fixes (#2191) 2025-11-12 17:10:52 +01:00
Luna712
73a98be437
Add explicit jsoup dependency (#2143)
We use it in both app and library, allows better dependency management, and also when I was testing AGP 9 alpha with built in Kotlin this was needed for it not to fail, so just doing this now to kinda prepare a little for that, even though it's a long ways out since dokka also doesn't fully support it yet and it's still in alpha, not stable yet.
2025-11-12 17:09:55 +01:00
rockhero1234
e1aec1d1d3
fix auto subtiltle select downloaded (#2200) 2025-11-12 17:01:21 +01:00
Luna712
ed55cb2a0b
Lock orientation when using the rotate button (#2172) 2025-11-12 00:42:26 +01:00
Luna712
523fbc1325
Bump AGP to 8.13.1 (#2186) 2025-11-12 00:29:26 +01:00
firelight
cc242088cf
Merge pull request #2188 from Luna712/player-scroll-fix
Reset player hide delay when scrolling controls
2025-11-11 23:20:33 +00:00
firelight
7b5e213c1f
Merge pull request #2196 from Luna712/packages
Add some missing explicit packages and minor cleanup
2025-11-11 23:12:17 +00:00
firelight
501186a004
Merge pull request #2169 from Luna712/items-size
More response player quality profile items
2025-11-11 22:56:36 +00:00
Luna712
6a5f0815c1
Use 110dp 2025-11-11 15:37:54 -07:00
firelight
a7e8b1bee3
Merge pull request #2184 from Luna712/fix-future-build
Fix one more build issue on future version of Kotlin
2025-11-11 22:35:52 +00:00
Luna712
4107fe1767
Merge branch 'master' into packages 2025-11-11 15:27:05 -07:00
firelight
0ad0577b17
Merge pull request #2195 from Luna712/activity-ktx
Use activity-ktx version
2025-11-11 22:25:05 +00:00
firelight
808b08e1ab
Merge pull request #2187 from Luna712/replace-url-constructor
Replace deprecated URL constructor
2025-11-11 22:19:10 +00:00
firelight
bdab23d967
Merge pull request #2199 from Luna712/pip-buffering
Allow to enter PIP mode if buffering
2025-11-11 22:17:46 +00:00
firelight
eff2c81cde
Merge pull request #2192 from rockhero1234/overlay_fix
retain previous play status ep. overlay
2025-11-11 22:15:42 +00:00
firelight
feea825ba6
Merge pull request #2197 from Luna712/cronet
Enable http2 and brotli in cronet
2025-11-11 22:08:27 +00:00
firelight
217bbeb3ca
Merge pull request #2198 from Luna712/patch-15
Minor update to english translation for a string
2025-11-11 22:07:26 +00:00
Luna712
37e550adce
Allow to enter PIP mode if buffering 2025-11-11 14:55:33 -07:00
Luna712
1ad6ab3411
Minor update to english translation for a string
This may not only be the case for phones but other devices as well.
2025-11-11 13:48:57 -07:00
Luna712
70a810656a
Enable http2 and brotli in cronet
Not everything supports QUIC.
2025-11-11 12:21:54 -07:00
Luna712
7af45a8318
Add some missing explicit packages and minor cleanup 2025-11-11 11:12:40 -07:00
Luna712
7ea89f7b91
Use activity-ktx version 2025-11-11 10:52:32 -07:00
rockhero1234
1cb8171aa5 retain previous play status ep. overlay 2025-11-11 16:54:54 +05:30
Luna712
f834c851b3
Reset player hide delay when scrolling controls
This also increases the delay time just a bit as before it seems it is to fast once scroll finishes if you don't think fast enough, however, I can remove that part if it isn't wanted.
2025-11-10 15:25:07 -07:00
Luna712
d82f471e82
Replace deprecated URL constructor 2025-11-10 12:30:15 -07:00
Luna712
ea474eeef4
Fix one more build issue on future version of Kotlin
It's a warning on Kotlin 2.3 and will be an error in 2.4:

`Type annotation class 'Nullable' of the inferred type is inaccessible. Check the module classpath for missing or conflicting dependencies. This will become an error in language version 2.4.`
2025-11-10 10:45:15 -07:00
firelight
7efc636413
Merge pull request #2167 from Luna712/player-source-portrait
Add portrait mode layouts for dialogs in player
2025-11-10 12:49:35 +00:00
firelight
f321e98be5
Merge pull request #2177 from Luna712/cleanup
Some cleanup to redundant calls
2025-11-10 12:41:50 +00:00
firelight
cefe43dbc2
Merge pull request #2178 from Luna712/m.ok.ru
Add ok.ru extractor version for m.ok.ru
2025-11-10 12:17:47 +00:00
Luna712
354bf947b7
Fix 2025-11-09 16:04:08 -07:00
Luna712
0775b5e3de
Add ok.ru extractor version for m.ok.ru 2025-11-09 16:02:40 -07:00
recloudstream[bot]
5401867a46 chore(locales): fix locale issues 2025-11-09 21:26:01 +00:00
firelight
0acbeecdbc
Merge pull request #2003 from recloudstream/weblate
Translations update from Hosted Weblate
2025-11-09 21:25:48 +00:00
Luna712
6c8f2a0c5c
Upgrade dokka to 2.1.0 (#2007) 2025-11-09 21:24:27 +00:00
Phisher98
a46fe80ba2
Adding HubCloud and PixelDrain Improvement (#2161) 2025-11-09 21:20:36 +00:00
Luna712
05752bf5ee
Some cleanup to redundant calls
These are all build warnings in Kotlin 2.3, and some are errors in 2.4.
2025-11-09 14:14:56 -07:00
Hosted Weblate
30ce24720a
Merge remote-tracking branch 'origin/master' 2025-11-09 15:33:04 +01:00
Luna712
ef114f9271
Use hidden password in add account input (#2168)
Passwords probably shouldn't be visible by default.
2025-11-09 15:32:59 +01:00
Hosted Weblate
a833cda47c
Merge remote-tracking branch 'origin/master' 2025-11-09 15:17:33 +01:00
Luna712
b7e59a01d3
Fix a few warnings (#2165) 2025-11-09 15:17:27 +01:00
Hosted Weblate
46198951bc
Translated using Weblate (German)
Currently translated at 99.8% (827 of 828 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Turkish)

Currently translated at 100.0% (828 of 828 strings)

Translated using Weblate (Russian)

Currently translated at 100.0% (828 of 828 strings)

Translated using Weblate (Hebrew)

Currently translated at 79.1% (655 of 828 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (828 of 828 strings)

Translated using Weblate (Vietnamese)

Currently translated at 100.0% (828 of 828 strings)

Translated using Weblate (Vietnamese)

Currently translated at 100.0% (828 of 828 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (828 of 828 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (828 of 828 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (828 of 828 strings)

Translated using Weblate (Assamese)

Currently translated at 91.9% (761 of 828 strings)

Translated using Weblate (Arabic (Levantine))

Currently translated at 97.5% (808 of 828 strings)

Translated using Weblate (Burmese)

Currently translated at 76.0% (630 of 828 strings)

Translated using Weblate (Galician)

Currently translated at 49.5% (410 of 828 strings)

Translated using Weblate (Korean)

Currently translated at 89.1% (738 of 828 strings)

Translated using Weblate (Arabic (Najdi))

Currently translated at 54.8% (454 of 828 strings)

Translated using Weblate (Malay)

Currently translated at 73.3% (607 of 828 strings)

Translated using Weblate (qt (generated) (qt))

Currently translated at 90.4% (749 of 828 strings)

Translated using Weblate (Slovak)

Currently translated at 66.5% (551 of 828 strings)

Translated using Weblate (Portuguese)

Currently translated at 98.3% (814 of 828 strings)

Translated using Weblate (Somali)

Currently translated at 68.4% (567 of 828 strings)

Translated using Weblate (Hungarian)

Currently translated at 79.8% (661 of 828 strings)

Translated using Weblate (Urdu)

Currently translated at 87.1% (722 of 828 strings)

Translated using Weblate (Tamil)

Currently translated at 96.2% (797 of 828 strings)

Translated using Weblate (Hebrew)

Currently translated at 76.0% (630 of 828 strings)

Translated using Weblate (Bengali)

Currently translated at 56.8% (471 of 828 strings)

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (828 of 828 strings)

Translated using Weblate (Chinese (Traditional Han script))

Currently translated at 91.4% (757 of 828 strings)

Translated using Weblate (Swedish)

Currently translated at 93.3% (773 of 828 strings)

Translated using Weblate (Romanian)

Currently translated at 88.4% (732 of 828 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (828 of 828 strings)

Translated using Weblate (Norwegian Bokmål)

Currently translated at 73.0% (605 of 828 strings)

Translated using Weblate (Croatian)

Currently translated at 98.3% (814 of 828 strings)

Translated using Weblate (Greek)

Currently translated at 95.0% (787 of 828 strings)

Translated using Weblate (Bulgarian)

Currently translated at 96.4% (799 of 828 strings)

Translated using Weblate (Russian)

Currently translated at 100.0% (828 of 828 strings)

Translated using Weblate (Vietnamese)

Currently translated at 100.0% (828 of 828 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (828 of 828 strings)

Translated using Weblate (Dutch)

Currently translated at 85.0% (704 of 828 strings)

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Spanish)

Currently translated at 98.9% (819 of 828 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (828 of 828 strings)

Translated using Weblate (Indonesian)

Currently translated at 100.0% (828 of 828 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 99.8% (827 of 828 strings)

Translated using Weblate (Vietnamese)

Currently translated at 100.0% (828 of 828 strings)

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Macedonian)

Currently translated at 100.0% (4 of 4 strings)

Translated using Weblate (Macedonian)

Currently translated at 100.0% (828 of 828 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (828 of 828 strings)

Translated using Weblate (Italian)

Currently translated at 98.9% (819 of 828 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (828 of 828 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (828 of 828 strings)

Translated using Weblate (Hindi)

Currently translated at 54.4% (451 of 828 strings)

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (828 of 828 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (828 of 828 strings)

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Vietnamese)

Currently translated at 100.0% (818 of 818 strings)

Translated using Weblate (Catalan)

Currently translated at 55.0% (450 of 818 strings)

Translated using Weblate (Catalan)

Currently translated at 53.1% (435 of 818 strings)

Translated using Weblate (Catalan)

Currently translated at 100.0% (4 of 4 strings)

Translated using Weblate (Catalan)

Currently translated at 51.3% (420 of 818 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (4 of 4 strings)

Translated using Weblate (Spanish)

Currently translated at 99.5% (814 of 818 strings)

Added translation using Weblate (Catalan)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (German)

Currently translated at 99.8% (817 of 818 strings)

Translated using Weblate (French)

Currently translated at 99.8% (817 of 818 strings)

Translated using Weblate (Arabic)

Currently translated at 100.0% (818 of 818 strings)

Translated using Weblate (Latvian)

Currently translated at 76.4% (625 of 818 strings)

Co-authored-by: Ahmed Abd Elfattah <escuro.anjo@gmail.com>
Co-authored-by: Alejandro Calduch <alexddf@gmail.com>
Co-authored-by: Alex Georgiou <alexandrosgeorgiou35@gmail.com>
Co-authored-by: Alexander Kryllov <sashakryllov58@gmail.com>
Co-authored-by: Alexandru <negrualexandru52@gmail.com>
Co-authored-by: Ana Coelho <coelhotraduz@gmail.com>
Co-authored-by: Andreas <andreas.blindheim.koppen@gmail.com>
Co-authored-by: Cloudburst <18114966+C10udburst@users.noreply.github.com>
Co-authored-by: Feike Donia <feikedonia@proton.me>
Co-authored-by: Fjuro <fjuro@alius.cz>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Itsmechinmoy <167056923+itsmechinmoy@users.noreply.github.com>
Co-authored-by: Kaan <kaandogan2820@gmail.com>
Co-authored-by: Lacey Anaya <yecakeh263@anawalls.com>
Co-authored-by: LagradOst <46196380+Blatzar@users.noreply.github.com>
Co-authored-by: LiJu09 <lisojuraj@gmail.com>
Co-authored-by: Man <thebroker2308@gmail.com>
Co-authored-by: Marco Moreno <hibarioath@proton.me>
Co-authored-by: Massimo Pissarello <mapi68@gmail.com>
Co-authored-by: Matthaiks <kitynska@gmail.com>
Co-authored-by: Mikenu Takeru <mikenu-jp@users.noreply.hosted.weblate.org>
Co-authored-by: Milo Ivir <mail@milotype.de>
Co-authored-by: Muhammad Fahad Khan <itxmfahadkhan@gmail.com>
Co-authored-by: Nataniel Dika Kurniawan <hikawaart2@gmail.com>
Co-authored-by: Nicola Bortoletto <nicola.bortoletto@live.com>
Co-authored-by: PiterDev <piterzdev@gmail.com>
Co-authored-by: Pizza Party <paol.m@proton.me>
Co-authored-by: Potorochin Max <ornaras.us@gmail.com>
Co-authored-by: Radoslav Vasilev Vasilev <fifata@gmail.com>
Co-authored-by: Riko Miko <rihardslaskovs@gmail.com>
Co-authored-by: Roi Gabay <roigby@gmail.com>
Co-authored-by: Sam Cooper <samcooper838@gmail.com>
Co-authored-by: Samuel Gadiel <samuelgadiel@gmail.com>
Co-authored-by: Shafici Isxariifshe <mega12xhaphiee@gmail.com>
Co-authored-by: The Initiator <eithansten@gmail.com>
Co-authored-by: Turkish Language Team 🇹🇷 <turkishmark@yandex.com>
Co-authored-by: Willy Anjaya <black.neotrouz@gmail.com>
Co-authored-by: ene-sword-group <enguerrand.neyroud@sword-group.com>
Co-authored-by: htet <htetoh2006@outlook.com>
Co-authored-by: jhihyu lin <thomas.jy.lin@gmail.com>
Co-authored-by: jinu147 <nesqea20@gmail.com>
Co-authored-by: rattenpriester <rattenpriester6840@gmail.com>
Co-authored-by: stojkovskistefan <stefanstojkovski@gmail.com>
Co-authored-by: sundarlal sharma <sundelalsharma11@gmail.com>
Co-authored-by: tabtomi8 <tabtomi88@gmail.com>
Co-authored-by: Максим Горпиніч <gorpinicmaksim0@gmail.com>
Co-authored-by: தமிழ்நேரம் <tamilneram247@gmail.com>
Co-authored-by: 大王叫我来巡山 <hamburger2048@users.noreply.hosted.weblate.org>
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/apc/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ar/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ars/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/as/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/bg/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/bn/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ca/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/cs/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/de/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/el/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/es/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/fr/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/gl/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/he/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/hi/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/hr/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/hu/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/id/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/it/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ja/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ko/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/lv/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/mk/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ms/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/my/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/nb_NO/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/nl/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/pl/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/pt/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/pt_BR/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/qt/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ro/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ru/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/sk/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/so/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/sv/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ta/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/tr/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/uk/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ur/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/vi/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/zh_Hans/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/zh_Hant/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/fastlane/ca/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/fastlane/es/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/fastlane/mk/
Translation: Cloudstream/App
Translation: Cloudstream/Fastlane
2025-11-09 13:51:21 +00:00
Luna712
52100dc5de
Move strictly to version catalog (#2134)
* Move strictly to version catalog

* Update libs.versions.toml
2025-11-08 22:41:08 +00:00
Luna712
3fda1415ae
Bump navigation to 2.9.6 (#2149) 2025-11-08 22:35:21 +00:00
Luna712
8f41722604
Minor improvement to encoding format text 2025-11-08 13:11:11 -07:00
Luna712
b11b324850
Minor padding fixes 2025-11-08 11:52:28 -07:00
Luna712
5049e56f5a
Minor fixes 2025-11-08 11:33:30 -07:00
Luna712
ddbb56a8de
Remove minor outdated APIs (#2159)
* Deprecated for awhile
* Extremely essy to fix (IDE can do it automatically)
* Not even really implemented or functional methods
* Extensions that do still use them are likely broken in other ways at this point due to being mostly unmaintained in that case
2025-11-08 16:15:50 +01:00
Luna712
76ae7cefb3
Use DeprecationLevel.ERROR for old AuthAPI (#2158)
It has been deprecated for 3 months now.
2025-11-08 16:13:14 +01:00
Luna712
3ccb252c09
Fix unchecked cast (#2160) 2025-11-08 16:12:00 +01:00
Luna712
b50ce3977a
Remove APPLICATION_RAWCC from HlsPlaylistParser (#2163)
Per it's own deprecation warning. It isn't supported anyway.
2025-11-08 16:09:07 +01:00
Luna712
829f8edf0b
Replace deprecated url in YoutubeExtractor (#2164) 2025-11-08 16:08:12 +01:00
Luna712
6bb144d10c
Replace deprecated Thread.id in ExceptionHandler (#2166) 2025-11-08 16:05:30 +01:00
Luna712
4425888097
More response player quality profile items
More response for portrait mode as well, so they don't grow massive. Uses the same size as account select linear profile sizes.
2025-11-07 18:18:20 -07:00
Luna712
70dd9e2387
Add portrait layout for source priorities 2025-11-07 16:46:53 -07:00
Luna712
8633682261
A bit better version 2025-11-07 15:48:13 -07:00
Luna712
2afbce665b
Add for subtitle offset dialog also 2025-11-07 14:19:05 -07:00
Luna712
4d40ecc75c
Add portrait mode layout for souece and subtitles select dialog
This doesn't yet fix it for subtitle sync dialog or improvements to quality dialog. For now ir just fixes the source and subtitles select dialog, which is probably the most important. If this method is accepted, I will fix the orhers in similar ways.

Putting a new layout in `layout-port` will make it auto use it instead of the default layout when in portrait mode, and switch back to landscape layout if it's rotated back to landscape mode.

Fixes #2145
Refs #830
2025-11-07 13:59:29 -07:00
Luna712
20fa05b4eb
Require fixLayout() to be overridden (#2155) 2025-11-06 19:04:08 +01:00
Luna712
011a6e0d50
Rename fixPadding to fixLayout and expand usage (#2127) 2025-11-04 21:48:24 +01:00
Luna712
b699e2f3bc
Fix updating UI when changing some settings (#2139) 2025-11-04 21:41:43 +01:00
Luna712
559edb44f2
Fix setting summary (#2141) 2025-11-04 21:35:28 +01:00
Luna712
2307f15bff
Fix library orientation bug (#2140)
Fixes #2129
2025-11-04 14:48:26 +01:00
Luna712
acbedd1c51
Update gradlew (#2115) 2025-10-31 22:00:14 +01:00
Luna712
aec346920e
Fix entering PiP mode even when we shouldn't (#2118) 2025-10-31 03:37:03 +01:00
firelight
38b9734fdb
Fix: Limit video title length to 2 lines, Closes #2105 2025-10-30 21:40:49 +01:00
Luna712
ede1fad282
Make fixSystemBarsPadding not accept a null View (#2114) 2025-10-30 21:25:41 +01:00
firelight
ec06da62ce
Fix: Restore backup now also invalidates library cache, Closes #2112 2025-10-30 20:56:51 +01:00
Luna712
17761e8adf
Fix system bars padding on orientation change in ResultFragmentPhone (#2113) 2025-10-30 20:49:53 +01:00
Yashas
224438cd92
fix: remove listeners before releasing exoplayer (#2104) 2025-10-30 20:44:34 +01:00
Luna712
ae042708e4
Remove handleConfigurationChanged from BaseFragmentHelper (#2111) 2025-10-30 20:20:40 +01:00
Luna712
604880158e
Migrate ResultFragmentTv to use BaseFragment (#2108) 2025-10-30 19:32:03 +01:00
Luna712
3081728afd
Upgrade Gradle wrapper from 9.1.0 to 9.2.0 and use URL validation (#2096) 2025-10-30 17:29:00 +01:00
Luna712
a565f50c46
Add explicit dependency on activity (#2098)
It's implicit right now, but making it explicit makes dependency management easier, especially now that new versions (starting with 1.12.0) require minSdk 23.
2025-10-30 17:10:48 +01:00
Luna712
9600781c4f
Migrate subtitles fragments to use BaseFragment (#2101) 2025-10-30 17:07:29 +01:00
firelight
dbeb815c06
Docs: Additional fixPadding documentation 2025-10-30 17:02:59 +01:00
Luna712
accf840730
Migrate WebviewFragment to use BaseFragment (#2103) 2025-10-30 17:01:33 +01:00
Luna712
3f2d81632f
Migrate EasterEggMonkeFragment to use BaseFragment (#2102) 2025-10-30 17:00:22 +01:00
Luna712
9afaf37091
Migrate settings fragments to use BaseFragment (#2100) 2025-10-30 16:55:44 +01:00
Luna712
cd25048212
Add BaseFragment compat for other Fragment subclasses (#2097) 2025-10-30 00:47:43 +01:00
Luna712
b385c72127
Migrate setup fragments to use BaseFragment (#2095) 2025-10-30 00:35:29 +01:00
firelight
69e8d90ad2
Fix: Correct boundscheck for next episode, Closes #2084 and Closes #2090 2025-10-30 00:26:22 +01:00
Luna712
532c375aad
Migrate SearchFragment to BaseFragment (#2087) 2025-10-29 13:08:13 +01:00
Luna712
a37a56bbfd
Migrate downloads fragments to use BaseFragment (#2088) 2025-10-29 13:05:03 +01:00
Luna712
1ffac969ff
Minor update to english translation for a string (#2092)
Not only phones but other devices too. We should clarify that a bit and use devices here instead of phones.
2025-10-29 12:49:24 +01:00
Luna712
f64be19d15
Add new BaseFragment (#2080) 2025-10-28 22:53:05 +01:00
firelight
993dcd92f0
Fix: Some white theme issues with dialog text and quality profiles 2025-10-28 22:42:34 +01:00
firelight
bcd9d65962
Chore: Refactor AccountAdapter and SelectAdaptor to use BaseAdapter 2025-10-28 18:39:42 +01:00
firelight
2d177cb330
Chore: Refactor ImageAdapter, AccountAdapter, TestResultAdapter and LogcatAdapter to use BaseAdapter 2025-10-28 18:15:34 +01:00
firelight
297e6de658
Fix: Temporarily removed voting api due to bad gateway 2025-10-28 17:42:59 +01:00
firelight
fe68f72e9d
Fix: loadImage fix for resources with attr, Closes #2082 2025-10-28 17:34:18 +01:00
firelight
bc07b86445
Feat: Added CronetDataSource for better cache and networking (#2079) 2025-10-28 17:24:43 +01:00
firelight
a1a5c36db4
Fix: Recycle cache theme invalidation, Closes #2082 2025-10-27 19:02:43 +01:00
firelight
6c30af3790
Fix: Unified resume logic to allow resume from external apps, Closes #2070 2025-10-26 16:37:09 +01:00
firelight
df091502fe
Fix: Homepage switching provider pop-in, might also fix #2072 2025-10-26 14:03:56 +01:00
firelight
9295795ab2
Fix: Upcoming episodes without hourglass icon if we have an faulty poster, also clear image 2025-10-26 02:17:27 +01:00
firelight
856245a23b
Chore: Refactor EpisodeAdapter to use BaseAdapter, and expanded BaseAdapter to allow custom content 2025-10-26 02:50:45 +02:00
firelight
73fec27d00
Chore: Refactor SearchHistoryAdaptor to use BaseAdapter 2025-10-26 02:06:29 +02:00
firelight
95db2d728e
Chore: Refactor PluginAdapter to use BaseAdapter, and fixed ghosting issue 2025-10-26 01:53:57 +02:00
firelight
ce5816ae77
Fix: Random crash on long running sessions, Closes #2071 2025-10-26 00:30:06 +02:00
firelight
68b215cada
Chore: Refactor RepoAdapter to use BaseAdapter 2025-10-26 00:13:12 +02:00
firelight
eb3519731a
Chore: Refactor ProfilesAdapter to use BaseAdapter 2025-10-25 22:36:43 +02:00
firelight
d77fcde347
Chore: Refactor PriorityAdapter to use BaseAdapter 2025-10-25 22:24:39 +02:00
firelight
38e52e24db
Fix: Watch status on unwatched episodes, whoops 2025-10-25 22:00:47 +02:00
firelight
ee3b07916e
Chore: Refactor SubtitleOffsetItemAdapter to use BaseAdapter 2025-10-25 21:55:21 +02:00
firelight
9e72ab2394
Chore: Refactor PageAdapter to use BaseAdapter 2025-10-25 21:41:31 +02:00
firelight
e61715cd99
Chore: Minor refactor to displayPos 2025-10-25 21:26:14 +02:00
rockhero1234
99eaa369ea
feat:check icon on watched episode and auto mark watched (#2023)
* check icon on watched episode

* auto mark episode as watched

* set check above 95 and removed auto watched
2025-10-25 21:24:37 +02:00
rockhero1234
b56e858d48
fix (#2022) 2025-10-25 21:19:07 +02:00
firelight
8dcb38a3bb
Chore: Refactor SearchAdapter to use BaseAdapter, and made NoStateAdapter easier to use 2025-10-25 21:11:19 +02:00
firelight
66b8fe963d
Chore: Refactor BaseAdapter for better view recycling, migrate Actors to BaseAdapter 2025-10-25 20:03:48 +02:00
Luna712
526372a577
Bump version to 4.6.1 (#2068)
Since we've had a major change with edge to edge, bumping the version could help know if it's related if an issue is created.
2025-10-25 19:22:54 +02:00
Luna712
5e3c9ee726
Bump tmdb lib (#2054) 2025-10-25 18:55:51 +02:00
Luna712
b0c78f7820
Unify clear search icons logic (#2062)
Reduces code duplication, and also adds support for them to show on repo and extensions search.
2025-10-25 18:51:10 +02:00
Luna712
eb93b8803d
Add full support for edge-to-edge (#2002) 2025-10-25 18:38:57 +02:00
firelight
29491ae634
Fix: Improved shared pool recycling for actors, quicksearch and recommendations 2025-10-25 15:26:41 +02:00
firelight
071b50e4ae
Fix: Improved shared pool recycling for episodes, search and homepage 2025-10-25 15:09:22 +02:00
Luna712
a100c94d40
Remove backwards compatible constructors that have been deprecated for over a year (#2044) 2025-10-25 14:37:07 +02:00
Luna712
dccfae8506
Bump KGP to 2.2.21 (#2057) 2025-10-25 14:36:18 +02:00
Luna712
2cc86bcb6a
Bump material (#2055) 2025-10-25 14:30:00 +02:00
Luna712
bda260525b
[skip ci] Bump upload-artifact action (#2058) 2025-10-25 12:15:55 +02:00
firelight
168c2e8432
Fix: Skip loading visibility in white theme, Closes #2049 2025-10-24 13:55:34 +02:00
firelight
eaa26b20e3
Fix: Inconsistent icon color for certain icons in settings on light themes, Closes #2047 2025-10-23 21:41:54 +02:00
firelight
ffd3c47dd9
Fix: Contrast issues on AccountSelectActivity on light themes, Closes #2048 2025-10-23 21:30:02 +02:00
firelight
a03079e48c
Fix: Contrast issues on light themes, Closes #2049 2025-10-23 21:06:42 +02:00
firelight
b3054e9bd1
Fix: Subtitle preview with elevation, Closes #2053 2025-10-23 20:16:20 +02:00
Luna712
5898eb2593
Enable deprecations in SubtitleHelper (#2036) 2025-10-23 19:03:44 +02:00
Luna712
4270f159b8
Make old rating system use DeprecationLevel.ERROR (#2041)
It's been deprecated for about 3 months now. This also deprecated `fromOld` and `toOld` since in theory those should never have been used in extensions and also `toRatingInt()` since again, in theory, wouldn't be used once converting to use the new score API.
2025-10-20 21:18:31 +02:00
firelight
5b1400e212
Fix: Subtitles not showing on cancel press, Closes #2042 2025-10-20 20:58:36 +02:00
firelight
28f044ad33
Fix: OOM on removeKeys, Closes #2035 2025-10-19 19:53:10 +02:00
firelight
fe0475f441
Fix(UI): Varius highlight/color changes for better accessibility, Closes #2024 2025-10-18 20:34:05 +02:00
Luna712
50e746c51d
Suppress some internal deprecations (#2019) 2025-10-18 20:10:56 +02:00
Luna712
34833d23d0
Remove usage of deprecated unsafeCheckOpNoThrow (#2018) 2025-10-18 20:10:11 +02:00
Luna712
98e6572bab
Replace deprecated StaticLayout constructor (#2020) 2025-10-18 20:08:31 +02:00
Luna712
7dd650b236
Update some depreciations (#2028) 2025-10-18 20:06:21 +02:00
Luna712
6dc0d6ed73
Replace use of deprecated Util.SDK_INT (#2030) 2025-10-18 20:04:07 +02:00
firelight
1f8cccdbd0
Fix: Next player episode and episode list progress issue, Closes #2025 2025-10-18 18:56:04 +02:00
Luna712
5bcf457814
Enable auto rotate preference by default (#2014)
* Enable auto rotate preference by default

It makes sense to adjust the screen orientation based on the orientation of the video by default.

* Update callsite also
2025-10-18 00:13:37 +02:00
Luna712
760dea2b4f
Provider tests: handle if implementing paginated search (#2016) 2025-10-18 00:12:34 +02:00
Luna712
2e255e6586
Use DeprecationLevel.ERROR for some methods (#2017) 2025-10-18 00:11:38 +02:00
firelight
d84a241026
Feat: Added subtitle alignment setting, and added 400dp elevation closes #2009 2025-10-16 16:34:27 +02:00
Luna712
535cb86934
Make constructor for UpdatedMatroskaExtractor private (#1999)
`'internal' declaration exposes 'public/*package*/' type 'EbmlReader'. This will become an error in language version 2.4.`
2025-10-16 15:54:37 +02:00
rockhero1234
505f869dbf
feat:resume btn with circular progress (#1998) 2025-10-16 15:52:19 +02:00
rockhero1234
e113cee434
fix(tv):not show rotate btn (#2010)
* fix(tv):not show rotate btn

* also emulator
2025-10-16 15:36:22 +02:00
Luna712
2bfee2e4a3
Fix library crash (#2006) 2025-10-16 01:18:15 +02:00
Osten
ac810db3d9
Bump 4.6.0 2025-10-15 19:07:47 +02:00
firelight
876ce09b38
Fix: Show the correct season names in episode list in the player 2025-10-15 17:56:52 +02:00
firelight
2687613e4f
Fix: Hide episode rating if rating < 0.1 to avoid "Rating: 0.0" 2025-10-15 14:03:53 +02:00
firelight
fbc8e6214f
Fix: Reset the episodeProgress view visibility to avoid recycling errors, and readded the "Upcoming Icon" 2025-10-15 13:58:19 +02:00
firelight
566fd741cf
Fix(TV): Minor focus issue on homepage actionbar, solved by keeping the same views instead of replacing them. 2025-10-15 02:11:48 +02:00
Luna712
f2056e7dd1
Bump newpipeextractor to v0.24.8 (#2001) 2025-10-13 18:24:06 +02:00
Luna712
66093253ef
Revert "No gradle cache on prerelease for now (#1986)" (#1996)
This reverts commit 7d4864baa6.
2025-10-12 02:33:55 +02:00
firelight
01792fe704
Increase gradle build memory 2025-10-11 23:54:58 +00:00
Luna712
8483104e67
Fix gradle build (#1997) 2025-10-11 23:53:58 +00:00
firelight
e1b18d9b14
Feat(TV): Added transparent outline to nav_footer_profile_card 2025-10-12 00:59:31 +02:00
firelight
543c0dddf8
Fix(Phone): Season selector with "no season" showing as "Season 0" 2025-10-12 00:38:06 +02:00
Luna712
ac67234076
Bump acra (#1994) 2025-10-12 00:16:44 +02:00
Luna712
a7eacb4a82
Bump qrcode lib (#1990) 2025-10-12 00:09:32 +02:00
Luna712
339e48e66b
Bump navigation libs (#1991) 2025-10-12 00:05:10 +02:00
Luna712
897866bfc5
Bump lifecycle libs (#1992) 2025-10-12 00:02:20 +02:00
Luna712
168e42f1b0
Bump androidx.core:core-ktx (#1993) 2025-10-11 23:59:08 +02:00
Luna712
511c18cd96
Bump coil to 3.3.0 (#1995) 2025-10-11 23:53:58 +02:00
Luna712
ae90ce6be5
Upgrade KGP to 2.2.20 (#1989) 2025-10-11 23:47:57 +02:00
Luna712
521a87857a
Bump gradle and AGP (#1987) 2025-10-11 23:40:27 +02:00
firelight
26504710e4
Fix(TV UI): Correct padding on horizontal views 2025-10-11 22:10:47 +02:00
Luna712
1c3b4363c5
Fix showing episode data in TMDB metaprovider (#1985) 2025-10-11 21:13:15 +02:00
firelight
01decca3f4
UI(TV): New navrail colors 2025-10-11 21:12:13 +02:00
Luna712
7d4864baa6
No gradle cache on prerelease for now (#1986) 2025-10-11 19:46:30 +02:00
firelight
85498f319c
Fix(TV): Minor alpha issue 2025-10-11 17:04:06 +02:00
Luna712
95a42adae2
Bump json lib (#1981) 2025-10-11 16:20:33 +02:00
Luna712
794710a50d
Add score to TMDB metaprovider (#1982) 2025-10-11 14:45:19 +02:00
firelight
dd1f59a7a8
Fix: Minor formatting bug in setPlayerDimen 2025-10-11 14:38:07 +02:00
Luna712
ebb7104747
Bump work-runtime libs (#1980) 2025-10-11 14:32:00 +02:00
Luna712
4d0d2467e0
Bump kotlinxCoroutinesCore (#1977) 2025-10-11 14:29:30 +02:00
valhn
a03f89f9a0
bump nextlib to match media3 version (#1984) 2025-10-11 14:25:23 +02:00
Luna712
2d9abe151b
Cache dependencies in builds (#1983)
* Cache dependencies in builds

When testing this withArtifact Build it improved build speed from ~6 minutes to <2 minutes

* Some newlines
2025-10-11 14:16:51 +02:00
Luna712
e5aa0a3c39
Require optin for prerelease (#1978) 2025-10-10 23:29:17 +00:00
Luna712
ab504fbfa6
Bump junit (#1976) 2025-10-10 21:36:51 +00:00
recloudstream[bot]
986e2a907e chore(locales): fix locale issues 2025-10-10 21:35:53 +00:00
firelight
92eaf3e873
Merge pull request #1928 from recloudstream/weblate
Translations update from Hosted Weblate
2025-10-10 23:35:41 +02:00
Hosted Weblate
cb62fc189c
Merge remote-tracking branch 'origin/master' 2025-10-10 23:35:20 +02:00
Luna712
0dbdebad4b
Bump espresso (#1979) 2025-10-10 21:35:16 +00:00
Hosted Weblate
40d0af8b49
Merge remote-tracking branch 'origin/master' 2025-10-10 21:18:33 +02:00
Luna712
5cd6d93d60
Bump tvprovider lib (#1975) 2025-10-10 21:18:28 +02:00
Hosted Weblate
fa540265f8
Merge remote-tracking branch 'origin/master' 2025-10-10 19:02:44 +00:00
firelight
ede93a3c6b
Fix: White theme UnderlayProgress fix 2025-10-10 21:02:40 +02:00
Hosted Weblate
5c3b37336f
Merge remote-tracking branch 'origin/master' 2025-10-10 18:50:19 +00:00
Luna712
17e56b21bf
Use the newSubtitleFile method (#1964)
* Use the newSubtitleFile method

* Make constructor internal

* Use private again
2025-10-10 20:50:12 +02:00
Hosted Weblate
803cc4b067
Merge remote-tracking branch 'origin/master' 2025-10-10 20:48:18 +02:00
Luna712
00aefad777
Bump compilesdk to 36 (#1974) 2025-10-10 20:48:13 +02:00
Hosted Weblate
fd86a29958
Merge remote-tracking branch 'origin/master' 2025-10-10 18:36:16 +00:00
Luna712
53c2a03c52
Add pagination support to TMDB metaprovider (#1960) 2025-10-10 20:36:11 +02:00
Hosted Weblate
c42cc79f22
Merge remote-tracking branch 'origin/master' 2025-10-10 18:25:59 +00:00
Luna712
f1e4b337c9
Bump tmdb lib (#1973) 2025-10-10 20:25:55 +02:00
Hosted Weblate
1487d1b718
Merge remote-tracking branch 'origin/master' 2025-10-10 20:20:12 +02:00
Luna712
883cf64c6d
Deprecate public constructor for ExtractorLink (#1962) 2025-10-10 20:20:05 +02:00
firelight
e8b8cba8f8
Refactor: Added appliedTheme variable instead of using getDefaultSharedPreferences 2025-10-10 20:14:47 +02:00
doGior
ad51c57b3d
Minor UI changes in dark and amoled themes (#1958)
* Fixed large episode padding when theme is amoled

* Changed card background in dark theme

* Removed padding
2025-10-10 20:09:17 +02:00
Hosted Weblate
76abb125ef
Merge remote-tracking branch 'origin/master' 2025-10-10 20:05:14 +02:00
Luna712
7bfb8fe8c5
Use ERROR deprecation level for SearchResponseList (#1961) 2025-10-10 20:05:09 +02:00
Hosted Weblate
bd1172dfa3
Merge remote-tracking branch 'origin/master' 2025-10-10 17:58:09 +00:00
Luna712
63fb0a4f8b
Bump actions (#1972) 2025-10-10 19:58:05 +02:00
Hosted Weblate
bf79ac1baf
Merge remote-tracking branch 'origin/master' 2025-10-10 17:39:40 +00:00
firelight
0b73841e09
Fix: AlertDialogCustom inheritance fix 2025-10-10 19:39:35 +02:00
Hosted Weblate
da572fdfbf
Merge remote-tracking branch 'origin/master' 2025-10-10 17:38:49 +00:00
Red-To-Tel
053692b631
Update InAppUpdater.kt to fix white text on white background issue (#1967) 2025-10-10 19:38:45 +02:00
Hosted Weblate
141a1a2adb
Translated using Weblate (Turkish)
Currently translated at 100.0% (818 of 818 strings)

Translated using Weblate (Spanish)

Currently translated at 99.5% (814 of 818 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (818 of 818 strings)

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (818 of 818 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (818 of 818 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (818 of 818 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Malay)

Currently translated at 74.5% (608 of 816 strings)

Translated using Weblate (Indonesian)

Currently translated at 100.0% (816 of 816 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 98.8% (807 of 816 strings)

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Turkish)

Currently translated at 100.0% (816 of 816 strings)

Translated using Weblate (Macedonian)

Currently translated at 100.0% (816 of 816 strings)

Translated using Weblate (Arabic (Levantine))

Currently translated at 99.1% (809 of 816 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 98.7% (806 of 816 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Spanish)

Currently translated at 99.5% (812 of 816 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (816 of 816 strings)

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (816 of 816 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (816 of 816 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (816 of 816 strings)

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Vietnamese)

Currently translated at 100.0% (815 of 815 strings)

Co-authored-by: Adrián Gelmotto Ruiz <adriangelmotto@gmail.com>
Co-authored-by: Dört Koldan Taciz <yapilirnasil327@gmail.com>
Co-authored-by: Fjuro <fjuro@alius.cz>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Jimly Asshiddiqy <j_mly@ymail.com>
Co-authored-by: Lenny Tran <lennytran49@gmail.com>
Co-authored-by: Matthaiks <kitynska@gmail.com>
Co-authored-by: Mohammad Abdallah <mhmd.abdallah.l@hotmail.com>
Co-authored-by: Oğuz Ersen <oguz@ersen.moe>
Co-authored-by: Saúl Palacios <palacios22c@gmail.com>
Co-authored-by: diogob003 <diogob003@outlook.com>
Co-authored-by: kerklangsi <arifilah.01@gmail.com>
Co-authored-by: stojkovskistefan <stefanstojkovski@gmail.com>
Co-authored-by: Максим Горпиніч <gorpinicmaksim0@gmail.com>
Co-authored-by: 大王叫我来巡山 <hamburger2048@users.noreply.hosted.weblate.org>
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/apc/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/cs/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/es/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/id/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/mk/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ms/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/pl/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/pt_BR/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/tr/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/uk/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/vi/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/zh_Hans/
Translation: Cloudstream/App
2025-10-10 17:28:06 +00:00
KingLucius
0281eb4185
PercentageCropImageView KDoc and XML usage (#1970) 2025-10-10 19:27:53 +02:00
firelight
3a56d6d36c
Feat(UI): New speed dialog, Closes #1889 2025-10-08 01:11:15 +02:00
firelight
b63990da38
Fix: Hero banner shown in None. Closes #1957 2025-10-07 23:54:33 +02:00
firelight
1f71acabcb
Fix: Single mirror syncdata 2025-10-07 23:44:26 +02:00
Sovan Sinha
bb77d93b5d
Enhancement : hide controls during volume/brightness gestures and restore on pause (#1954)
* player: hide controls during volume/brightness gestures and restore on gesture end if paused

* player: reshow controls only if visible pre-gesture; reveal immediately on gesture completion when paused
2025-10-07 18:23:30 +02:00
firelight
6d93560252
Fix: Deduplicated subtitles 2025-10-07 18:12:46 +02:00
GCDarcy
6611c8a607
Added the option in settings for people to display the series/movie title instead of the name of the current source (partial support for languages) (#1956) 2025-10-07 17:49:19 +02:00
Osten
716b809ea2
Emergency patch for TV performance 2025-10-06 21:40:00 +02:00
firelight
2ca106ecb1
Fix: Recycle setMaxViewPoolSize on HomeChildItemAdapter for larger devices 2025-10-05 22:50:04 +02:00
firelight
dcdf15f484
Fix: Optimized homepage by properly recycling all nested recycleviews 2025-10-05 17:18:30 +02:00
firelight
ca737b1194
Fix(TV): Poster size for remove item 2025-10-05 02:20:45 +02:00
firelight
233fe87cdc
Fix(TV): Focus issue with account 2025-10-05 01:05:55 +02:00
firelight
8250a65aca
Fix: HTML encoded description, and clickable homepage hero 2025-10-05 00:26:27 +02:00
KingLucius
0d83418150
feat(TV UI): Crop the Main banner from the Top (#1952) 2025-10-05 00:04:31 +02:00
firelight
60fab25032
Fix: Minor margin issue (Phone) + Minor 1px rendering issue (TV) 2025-10-04 02:17:19 +02:00
firelight
a70fb87594
Feat: Infinite scrolling on quicksearch and trakt (#1949) 2025-10-04 02:02:42 +02:00
firelight
6632f764b0
Feat: New TV UI for Homepage (#1942) 2025-10-03 22:22:39 +02:00
Phisher98
ccf3b05088
Dailymotion Fix (#1947)
* Dailymotion Improvement

* Dailymotion Improvement Minor Fix
2025-10-03 17:35:44 +02:00
firelight
26570d688f
Chore: Bump versionName 2025-10-02 19:54:54 +02:00
firelight
6d4c530e16
Chore: Bump media3 to 1.8.0 2025-10-02 19:52:08 +02:00
rockhero1234
373d746a3f
feat(library):scroll top on sort (#1938) 2025-10-02 19:34:48 +02:00
firelight
eb016eb39e
Chore: Cleanup unused xml files 2025-10-02 19:16:13 +02:00
firelight
c783e82c80
Fix: Minor typo + testing fix 2025-10-02 19:06:24 +02:00
rockhero1234
7a909ec7c4
ui:circular progress bars (#1941) 2025-10-02 19:04:46 +02:00
rockhero1234
90144a6b01
ui(fix):torrent ui in player (#1940) 2025-09-29 19:28:34 +02:00
firelight
e761ba437f
Fix: Minor bug with subtitle suffix on cached subtitles 2025-09-29 01:13:13 +02:00
Diogo
30cf12d6cc
Use IETF BCP 47 language tag as much as possible (#1815)
* Use IETF BCP 47 as much as possible since not all languages have ISO 639-1 tag
* Fix online subtitles for langs with 2+ letters
* Show flag emoji while filtering online subtitles language
* Show flag on player subtitles download / auto select languages
* Use language code instead of name to filter auto select / download languages
2025-09-29 01:07:20 +02:00
firelight
1f385116dd
Fix: More focus shenanigans 2025-09-28 22:06:38 +02:00
firelight
7948577df7
Fix: Minor focus issue and code formatting 2025-09-28 21:41:40 +02:00
rockhero1234
27acc4b4e1
feat(player):episodes overlay (#1933) 2025-09-28 21:39:39 +02:00
firelight
b5fb1da210
Feat(Trakt): Added score to homepage and search 2025-09-28 21:17:50 +02:00
KingLucius
97ff20ea5e
feat(Trakt): Update Trakt meta provider with last APIs changes (#1936) 2025-09-28 21:17:00 +02:00
Aryan Singh
a4d1d98f7f
Add Android TV channel preview support (#1929) 2025-09-28 14:01:30 +00:00
firelight
91fbec3d08
Refactor: Added VideoGenerator to make IGenerator easier to use correctly. 2025-09-26 21:49:05 +02:00
firelight
9d944f0c44
Fix: Fixed play mirror watch history by assigning it the correct id, Closes #1931 2025-09-26 20:39:53 +02:00
Phisher98
ec6a71521f
GDMirrorBot Improvement and Fixes (#1930)
* GDMirrorbot Improvement
2025-09-26 13:16:25 +02:00
LeopoldoDelgadillo
7f769bd1d3
"Play mirror" function on play context window. (#1926) 2025-09-23 23:41:16 +02:00
rockhero1234
182b38a7a4
feat:hold profile for account edit dialog (#1927)
* feat:hold profile for account edit dialog

* fixed
2025-09-23 23:36:48 +02:00
Osten
7c0dc6c084 Updated style for "SearchBox", aka dub/sub/rating. 2025-09-21 23:50:36 +02:00
firelight
15c320ba4a
Fix: Made score toString removeTrailingZeros act properly on scores with higher precision 2025-09-20 22:13:24 +02:00
firelight
0b11c6475b
Fix: Capitalized AppLanguages 2025-09-20 21:36:06 +02:00
recloudstream[bot]
62fa9e12df chore(locales): fix locale issues 2025-09-20 19:26:29 +00:00
Diogo
69b1709c09
Fix: locale workflow (#1914)
* Rename from values-<language>-r<COUNTRY> to values-b+<language>+<COUNTRY>

* Sort locales by language name instead of iso in locales.py

* Revert to deprecated codes for Indonesian (id → in) and Hebrew (he -> iw)

* Remove "jv" as it's translation file has no strings

* Add name and flag for "ckb" (Sorani / Central Kurdish)
2025-09-20 21:26:13 +02:00
firelight
d8a1aa1f7b
Fix(Player): Fixed #1923 by only allowing volume override when in fullscreen 2025-09-20 14:08:33 +02:00
firelight
53a5f60646
Fix: Removed subSource, and removed "Null subtitles" toast 2025-09-20 14:04:21 +02:00
Diogo
7f010dce44
Addic7ed, Subdl: fix and use IETF language tag (#1895) 2025-09-20 13:56:53 +02:00
Phisher98
9993f79cb6
VidStack Improvement (#1920) 2025-09-20 13:51:03 +02:00
Kraptor123
f5bd9f3121
2 New Themes Dracula Theme And Lavender Dreams (#1908)
* New 2 Themes Dracula And Lavender Dreams

* dracula theme new color changes
2025-09-20 13:41:39 +02:00
Bnyro
5994a0bad1
feat: properly insert copied repo data as new repository (#1917) 2025-09-20 13:35:44 +02:00
Bnyro
237690069d
feat: add streamup extractor api (#1916) 2025-09-20 13:34:27 +02:00
recloudstream[bot]
feeae8907d chore(locales): fix locale issues 2025-09-16 22:33:04 +00:00
firelight
72b849bccb
Merge pull request #1701 from recloudstream/weblate
Translations update from Hosted Weblate
2025-09-17 00:32:45 +02:00
Hosted Weblate
fede044009
Merge remote-tracking branch 'origin/master' 2025-09-15 20:17:10 +02:00
recloudstream[bot]
b270989cf3 chore(locales): fix locale issues 2025-09-15 18:17:06 +00:00
Hosted Weblate
79c2386f39
Merge remote-tracking branch 'origin/master' 2025-09-15 20:16:53 +02:00
Diogo
4d5b74c65b
Settings: translate languages and use IETF BCP 47 tag (#1894) 2025-09-15 20:16:50 +02:00
Hosted Weblate
1df005e705
Merge remote-tracking branch 'origin/master' 2025-09-15 19:52:08 +02:00
rockhero1234
56e5eb2d63
fix:removed volume overlay on trailers (#1904) 2025-09-15 19:52:02 +02:00
Hosted Weblate
7af581ba8f
Translated using Weblate (Filipino)
Currently translated at 21.4% (175 of 815 strings)

Translated using Weblate (Malay)

Currently translated at 72.1% (588 of 815 strings)

Translated using Weblate (Malay)

Currently translated at 72.1% (588 of 815 strings)

Translated using Weblate (Indonesian)

Currently translated at 100.0% (815 of 815 strings)

Translated using Weblate (Korean)

Currently translated at 90.6% (739 of 815 strings)

Translated using Weblate (French)

Currently translated at 100.0% (815 of 815 strings)

Translated using Weblate (Kurdish (Central))

Currently translated at 24.9% (203 of 815 strings)

Translated using Weblate (Arabic)

Currently translated at 99.2% (809 of 815 strings)

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Kurdish (Central))

Currently translated at 100.0% (4 of 4 strings)

Translated using Weblate (Macedonian)

Currently translated at 100.0% (815 of 815 strings)

Added translation using Weblate (Kurdish (Central))

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Indonesian)

Currently translated at 97.9% (798 of 815 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Portuguese)

Currently translated at 100.0% (815 of 815 strings)

Translated using Weblate (Spanish)

Currently translated at 99.2% (809 of 815 strings)

Translated using Weblate (Russian)

Currently translated at 100.0% (815 of 815 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (815 of 815 strings)

Translated using Weblate (Croatian)

Currently translated at 100.0% (4 of 4 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (815 of 815 strings)

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (815 of 815 strings)

Translated using Weblate (Croatian)

Currently translated at 100.0% (815 of 815 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (815 of 815 strings)

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Polish)

Currently translated at 100.0% (815 of 815 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (German)

Currently translated at 100.0% (814 of 814 strings)

Translated using Weblate (Russian)

Currently translated at 100.0% (814 of 814 strings)

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (814 of 814 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (814 of 814 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (814 of 814 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (814 of 814 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (814 of 814 strings)

Translated using Weblate (French)

Currently translated at 100.0% (814 of 814 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Russian)

Currently translated at 100.0% (813 of 813 strings)

Translated using Weblate (French)

Currently translated at 100.0% (813 of 813 strings)

Translated using Weblate (French)

Currently translated at 100.0% (813 of 813 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (813 of 813 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (813 of 813 strings)

Translated using Weblate (Portuguese)

Currently translated at 100.0% (813 of 813 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (813 of 813 strings)

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (813 of 813 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (813 of 813 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Odia)

Currently translated at 34.0% (276 of 811 strings)

Translated using Weblate (Vietnamese)

Currently translated at 100.0% (811 of 811 strings)

Translated using Weblate (German)

Currently translated at 100.0% (811 of 811 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (811 of 811 strings)

Translated using Weblate (French)

Currently translated at 99.5% (807 of 811 strings)

Translated using Weblate (Portuguese)

Currently translated at 100.0% (811 of 811 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (811 of 811 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (811 of 811 strings)

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (811 of 811 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (811 of 811 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (811 of 811 strings)

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (806 of 806 strings)

Translated using Weblate (Russian)

Currently translated at 100.0% (806 of 806 strings)

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Spanish (Argentina))

Currently translated at 100.0% (4 of 4 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (French)

Currently translated at 100.0% (806 of 806 strings)

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (806 of 806 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (806 of 806 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (806 of 806 strings)

Translated using Weblate (Portuguese)

Currently translated at 100.0% (806 of 806 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (806 of 806 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (806 of 806 strings)

Translated using Weblate (German)

Currently translated at 100.0% (805 of 805 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Assamese)

Currently translated at 100.0% (4 of 4 strings)

Translated using Weblate (Portuguese)

Currently translated at 100.0% (805 of 805 strings)

Translated using Weblate (Vietnamese)

Currently translated at 100.0% (805 of 805 strings)

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (805 of 805 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (805 of 805 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (805 of 805 strings)

Translated using Weblate (Vietnamese)

Currently translated at 99.8% (804 of 805 strings)

Translated using Weblate (Romanian)

Currently translated at 91.0% (733 of 805 strings)

Translated using Weblate (Romanian)

Currently translated at 91.0% (733 of 805 strings)

Translated using Weblate (French)

Currently translated at 99.7% (803 of 805 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (805 of 805 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Russian)

Currently translated at 100.0% (805 of 805 strings)

Translated using Weblate (Spanish)

Currently translated at 99.5% (801 of 805 strings)

Translated using Weblate (Vietnamese)

Currently translated at 99.8% (804 of 805 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (805 of 805 strings)

Translated using Weblate (Hindi)

Currently translated at 55.2% (445 of 805 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (805 of 805 strings)

Translated using Weblate (Arabic (Levantine))

Currently translated at 100.0% (805 of 805 strings)

Translated using Weblate (Arabic)

Currently translated at 100.0% (805 of 805 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (805 of 805 strings)

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (805 of 805 strings)

Translated using Weblate (French)

Currently translated at 99.8% (804 of 805 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (805 of 805 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (805 of 805 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (803 of 803 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (803 of 803 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (803 of 803 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Turkish)

Currently translated at 100.0% (800 of 800 strings)

Added translation using Weblate (Javanese)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Indonesian)

Currently translated at 99.6% (797 of 800 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (4 of 4 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (800 of 800 strings)

Translated using Weblate (Macedonian)

Currently translated at 100.0% (800 of 800 strings)

Translated using Weblate (Bulgarian)

Currently translated at 99.8% (799 of 800 strings)

Translated using Weblate (Portuguese)

Currently translated at 100.0% (800 of 800 strings)

Translated using Weblate (Portuguese)

Currently translated at 100.0% (800 of 800 strings)

Update translation files

Updated by "Remove blank strings" hook in Weblate.

Translated using Weblate (Turkish)

Currently translated at 99.6% (797 of 800 strings)

Translated using Weblate (Turkish)

Currently translated at 99.6% (797 of 800 strings)

Translated using Weblate (Arabic (Levantine))

Currently translated at 100.0% (800 of 800 strings)

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Spanish)

Currently translated at 99.2% (794 of 800 strings)

Translated using Weblate (Spanish)

Currently translated at 99.2% (794 of 800 strings)

Translated using Weblate (German)

Currently translated at 100.0% (800 of 800 strings)

Translated using Weblate (Russian)

Currently translated at 100.0% (800 of 800 strings)

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (800 of 800 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (800 of 800 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Italian)

Currently translated at 100.0% (800 of 800 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (800 of 800 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (800 of 800 strings)

Translated using Weblate (Bulgarian)

Currently translated at 100.0% (796 of 796 strings)

Translated using Weblate (Bulgarian)

Currently translated at 100.0% (796 of 796 strings)

Translated using Weblate (Bulgarian)

Currently translated at 100.0% (796 of 796 strings)

Translated using Weblate (Bulgarian)

Currently translated at 100.0% (796 of 796 strings)

Translated using Weblate (Macedonian)

Currently translated at 100.0% (796 of 796 strings)

Translated using Weblate (Macedonian)

Currently translated at 100.0% (796 of 796 strings)

Translated using Weblate (Tamil)

Currently translated at 100.0% (796 of 796 strings)

Translated using Weblate (Tamil)

Currently translated at 100.0% (796 of 796 strings)

Translated using Weblate (Russian)

Currently translated at 100.0% (796 of 796 strings)

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Arabic (Levantine))

Currently translated at 100.0% (796 of 796 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (796 of 796 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (796 of 796 strings)

Translated using Weblate (Urdu)

Currently translated at 90.5% (721 of 796 strings)

Translated using Weblate (Urdu)

Currently translated at 90.5% (721 of 796 strings)

Translated using Weblate (Urdu)

Currently translated at 90.5% (721 of 796 strings)

Translated using Weblate (Urdu)

Currently translated at 90.5% (721 of 796 strings)

Translated using Weblate (Urdu)

Currently translated at 90.5% (721 of 796 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (796 of 796 strings)

Translated using Weblate (Italian)

Currently translated at 99.4% (792 of 796 strings)

Translated using Weblate (Portuguese)

Currently translated at 100.0% (796 of 796 strings)

Translated using Weblate (Persian)

Currently translated at 58.0% (462 of 796 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Spanish)

Currently translated at 98.7% (786 of 796 strings)

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (796 of 796 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (796 of 796 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (796 of 796 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (796 of 796 strings)

Translated using Weblate (Swedish)

Currently translated at 97.2% (771 of 793 strings)

Translated using Weblate (Russian)

Currently translated at 100.0% (793 of 793 strings)

Update translation files

Updated by "Remove blank strings" hook in Weblate.

Translated using Weblate (Afrikaans)

Currently translated at 29.7% (236 of 793 strings)

Translated using Weblate (Arabic (Levantine))

Currently translated at 98.9% (785 of 793 strings)

Translated using Weblate (qt (generated) (qt))

Currently translated at 94.1% (747 of 793 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (793 of 793 strings)

Translated using Weblate (Hungarian)

Currently translated at 83.1% (659 of 793 strings)

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (793 of 793 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (793 of 793 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (793 of 793 strings)

Translated using Weblate (Dutch)

Currently translated at 85.4% (678 of 793 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (790 of 790 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (788 of 788 strings)

Translated using Weblate (Arabic)

Currently translated at 100.0% (782 of 782 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Dutch)

Currently translated at 50.0% (2 of 4 strings)

Translated using Weblate (Dutch)

Currently translated at 86.3% (675 of 782 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Portuguese)

Currently translated at 100.0% (782 of 782 strings)

Translated using Weblate (Korean)

Currently translated at 93.3% (730 of 782 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Japanese)

Currently translated at 100.0% (782 of 782 strings)

Translated using Weblate (Swedish)

Currently translated at 98.0% (767 of 782 strings)

Translated using Weblate (Dutch)

Currently translated at 84.3% (660 of 782 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (782 of 782 strings)

Translated using Weblate (Croatian)

Currently translated at 100.0% (782 of 782 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (782 of 782 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (782 of 782 strings)

Translated using Weblate (Ukrainian)

Currently translated at 99.7% (780 of 782 strings)

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Macedonian)

Currently translated at 100.0% (782 of 782 strings)

Translated using Weblate (Ukrainian)

Currently translated at 99.7% (780 of 782 strings)

Translated using Weblate (German)

Currently translated at 100.0% (782 of 782 strings)

Translated using Weblate (Macedonian)

Currently translated at 99.8% (781 of 782 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (782 of 782 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (782 of 782 strings)

Translated using Weblate (German)

Currently translated at 99.8% (781 of 782 strings)

Translated using Weblate (Hindi)

Currently translated at 54.3% (425 of 782 strings)

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Arabic (Levantine))

Currently translated at 100.0% (782 of 782 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Tamil)

Currently translated at 95.5% (747 of 782 strings)

Translated using Weblate (Vietnamese)

Currently translated at 99.8% (781 of 782 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (782 of 782 strings)

Translated using Weblate (Greek)

Currently translated at 100.0% (782 of 782 strings)

Translated using Weblate (Arabic)

Currently translated at 99.4% (778 of 782 strings)

Translated using Weblate (Russian)

Currently translated at 100.0% (782 of 782 strings)

Translated using Weblate (Bulgarian)

Currently translated at 100.0% (782 of 782 strings)

Translated using Weblate (Bulgarian)

Currently translated at 100.0% (782 of 782 strings)

Translated using Weblate (Indonesian)

Currently translated at 100.0% (782 of 782 strings)

Translated using Weblate (French)

Currently translated at 100.0% (782 of 782 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (782 of 782 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (782 of 782 strings)

Translated using Weblate (French)

Currently translated at 99.8% (781 of 782 strings)

Translated using Weblate (Spanish)

Currently translated at 99.8% (781 of 782 strings)

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (782 of 782 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (782 of 782 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (782 of 782 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (782 of 782 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (782 of 782 strings)

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (780 of 780 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (780 of 780 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (780 of 780 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (780 of 780 strings)

Translated using Weblate (Spanish)

Currently translated at 99.8% (779 of 780 strings)

Translated using Weblate (Russian)

Currently translated at 100.0% (780 of 780 strings)

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (780 of 780 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (780 of 780 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (780 of 780 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (780 of 780 strings)

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Russian)

Currently translated at 100.0% (777 of 777 strings)

Translated using Weblate (Russian)

Currently translated at 100.0% (777 of 777 strings)

Translated using Weblate (Russian)

Currently translated at 100.0% (777 of 777 strings)

Translated using Weblate (Russian)

Currently translated at 100.0% (777 of 777 strings)

Translated using Weblate (Russian)

Currently translated at 100.0% (777 of 777 strings)

Translated using Weblate (Russian)

Currently translated at 100.0% (777 of 777 strings)

Translated using Weblate (Russian)

Currently translated at 100.0% (777 of 777 strings)

Translated using Weblate (Russian)

Currently translated at 100.0% (777 of 777 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (777 of 777 strings)

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (777 of 777 strings)

Translated using Weblate (Greek)

Currently translated at 100.0% (777 of 777 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (777 of 777 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (777 of 777 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (777 of 777 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (777 of 777 strings)

Translated using Weblate (Greek)

Currently translated at 99.7% (775 of 777 strings)

Translated using Weblate (Arabic)

Currently translated at 100.0% (777 of 777 strings)

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Assamese)

Currently translated at 97.2% (756 of 777 strings)

Translated using Weblate (Ukrainian)

Currently translated at 99.8% (776 of 777 strings)

Translated using Weblate (German)

Currently translated at 99.8% (776 of 777 strings)

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 99.8% (776 of 777 strings)

Translated using Weblate (Chinese (Traditional Han script))

Currently translated at 96.7% (752 of 777 strings)

Translated using Weblate (Vietnamese)

Currently translated at 99.4% (773 of 777 strings)

Translated using Weblate (Swedish)

Currently translated at 97.4% (757 of 777 strings)

Translated using Weblate (Polish)

Currently translated at 99.8% (776 of 777 strings)

Translated using Weblate (Macedonian)

Currently translated at 99.0% (770 of 777 strings)

Translated using Weblate (Italian)

Currently translated at 99.6% (774 of 777 strings)

Translated using Weblate (Croatian)

Currently translated at 99.3% (772 of 777 strings)

Translated using Weblate (Czech)

Currently translated at 99.8% (776 of 777 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 99.8% (776 of 777 strings)

Translated using Weblate (Arabic)

Currently translated at 99.8% (776 of 777 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (777 of 777 strings)

Translated using Weblate (Portuguese)

Currently translated at 100.0% (777 of 777 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (777 of 777 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Spanish)

Currently translated at 100.0% (777 of 777 strings)

Translated using Weblate (French)

Currently translated at 100.0% (777 of 777 strings)

Translated using Weblate (Indonesian)

Currently translated at 100.0% (777 of 777 strings)

Translated using Weblate (Arabic (Levantine))

Currently translated at 100.0% (777 of 777 strings)

Co-authored-by: Adolfo Jayme Barrientos <fitojb@ubuntu.com>
Co-authored-by: Aerin Park <aerin.gy.park@gmail.com>
Co-authored-by: Ahmed Abd El-Fattah <a.aelfattah5@gmail.com>
Co-authored-by: Anarchydr <patrikpik879@gmail.com>
Co-authored-by: Angel Ivanov <angel.forcebg@gmail.com>
Co-authored-by: Angga Wangza <wangza00@gmail.com>
Co-authored-by: Anonymous <noreply@weblate.org>
Co-authored-by: Arina <hello.arina.s@gmail.com>
Co-authored-by: Bernardo Gomes <bernardo.gomes@bebitterbebetter.com.br>
Co-authored-by: Boqirz <alveromodar@gmail.com>
Co-authored-by: Chris V <krisvasilev2003@gmail.com>
Co-authored-by: Christopher Allen <nsn90255@gmail.com>
Co-authored-by: Cloudburst <18114966+C10udburst@users.noreply.github.com>
Co-authored-by: Cris P <cristineipop2015@gmail.com>
Co-authored-by: Dan <jonweblin2205@protonmail.com>
Co-authored-by: Darias <yd5uecg8e@mozmail.com>
Co-authored-by: Deleted User <noreply+124913@weblate.org>
Co-authored-by: Dinh Nguyen <dinhitcom@gmail.com>
Co-authored-by: Do you know my name? <anonymous2676@users.noreply.hosted.weblate.org>
Co-authored-by: Empty Context <weblate.come585@passmail.net>
Co-authored-by: Esspel <eric.soderstrom06@gmail.com>
Co-authored-by: Fjuro <fjuro@alius.cz>
Co-authored-by: Fjuro <git@alius.cz>
Co-authored-by: Francisco Serrador <fserrador@gmail.com>
Co-authored-by: Fritz Blümke <fritzbluemke@gmail.com>
Co-authored-by: Geovani Amaral <geovani.af4@gmail.com>
Co-authored-by: GiannosOB <giannos2105@gmail.com>
Co-authored-by: Harshit Sethi <hstsethi@outlook.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Itsmechinmoy <itsmechinmoy@users.noreply.hosted.weblate.org>
Co-authored-by: Ivan Kostov <jiveq1@gmail.com>
Co-authored-by: Jagattananda Satapathy <buzzcraze.official@gmail.com>
Co-authored-by: Jagrit Rajoriya <jagritrajoriya51@gmail.com>
Co-authored-by: Jimmy Dahlberg <jimmydaswag@hotmail.com>
Co-authored-by: John Kennedy Peña <jkhp.jkpa@gmail.com>
Co-authored-by: Juan Rubin <juancrubin08@gmail.com>
Co-authored-by: Juzé <dedakir923@exoular.com>
Co-authored-by: Kerim Demirkaynak <aschannel111@gmail.com>
Co-authored-by: Kingsis Trader <kingsistrader@gmail.com>
Co-authored-by: Lacey Anaya <yecakeh263@anawalls.com>
Co-authored-by: Lourenço Martins <hlourencoam93@gmail.com>
Co-authored-by: MM <metalmario90@gmail.com>
Co-authored-by: Maksim_220 Кабанов <law820314@gmail.com>
Co-authored-by: Massimo Pissarello <mapi68@gmail.com>
Co-authored-by: Matthaiks <kitynska@gmail.com>
Co-authored-by: Mickael Marques da mota <mickaelmarquesdamota@gmail.com>
Co-authored-by: Milo Ivir <mail@milotype.de>
Co-authored-by: MrSliv69 <mrsliv6969@gmail.com>
Co-authored-by: Nataniel Dika Kurniawan <hikawaart2@gmail.com>
Co-authored-by: Nguyễn Tiến Đạt <dn16092000@gmail.com>
Co-authored-by: Night Sky <mdrouhin2+weblate@gmail.com>
Co-authored-by: Niko <nikomoto1@gmail.com>
Co-authored-by: Pizza Party <paol.m@proton.me>
Co-authored-by: Plamen Ivanov <paco.iwanow@gmail.com>
Co-authored-by: Py- Droid <droidpy587@gmail.com>
Co-authored-by: Quentin <mrbydix@users.noreply.hosted.weblate.org>
Co-authored-by: Ramazan S <me@ramazansancar.com.tr>
Co-authored-by: Rex_sa <rex.sa@pm.me>
Co-authored-by: Reza Almanda <rezaalmanda27@gmail.com>
Co-authored-by: SBS1313 <simonsaade005@gmail.com>
Co-authored-by: Saúl Palacios <palacios22c@gmail.com>
Co-authored-by: Serdar Sağlam <teknomobil@msn.com>
Co-authored-by: Sergei Bumazhnov <bumazhnov94@gmail.com>
Co-authored-by: Sergey Ponomarev <stokito@gmail.com>
Co-authored-by: Simeon Tthhuueett <simeontthhuueett@gmail.com>
Co-authored-by: Sofia <sofimanci2112@gmail.com>
Co-authored-by: Somme4096 <somme4096@gmail.com>
Co-authored-by: Splow95 <splownder.mau@gmail.com>
Co-authored-by: Uzair Syed <ghost.lord59531@gmail.com>
Co-authored-by: Vdrsl <Nivin2983@gmail.com>
Co-authored-by: Vitalii Panyk <likenistop4ik@gmail.com>
Co-authored-by: alb bla <explodedhiuehthr@tutamail.com>
Co-authored-by: bbstacks <bbstacks1225@gmail.com>
Co-authored-by: dabao1955 <dabao1955@163.com>
Co-authored-by: dedakir923 <dedakir923@exoular.com>
Co-authored-by: ene-sword-group <enguerrand.neyroud@sword-group.com>
Co-authored-by: hidden <rahandgamer400@gmail.com>
Co-authored-by: icosahedr.online <sapero@icosahedr.online>
Co-authored-by: khalidbelk <khalid.belkassmi-el-hafi@epitech.eu>
Co-authored-by: maxim <maximtested@gmail.com>
Co-authored-by: michte <michteting@proton.me>
Co-authored-by: oguzugur28 <oguzugur2834@gmail.com>
Co-authored-by: ssantos <ssantos@web.de>
Co-authored-by: stojkovskistefan <stefanstojkovski@gmail.com>
Co-authored-by: vanapro1 <law820314@gmail.com>
Co-authored-by: william piti <loolyowo@gmail.com>
Co-authored-by: yigit bilgin <yigitbilginbw@hotmail.com>
Co-authored-by: zmni <zmni@outlook.com>
Co-authored-by: λpex_herbivore <weblate@imveganbtw.win>
Co-authored-by: Максим Горпиніч <gorpinicmaksim0@gmail.com>
Co-authored-by: Максим Горпиніч <gorpinicmaksim5@gmail.com>
Co-authored-by: Максим Горпиніч <maksimgorpinic2005a@gmail.com>
Co-authored-by: Максим Горпиніч <maksimgorpinic4@gmail.com>
Co-authored-by: தமிழ்நேரம் <anishprabu.t@gmail.com>
Co-authored-by: 大王叫我来巡山 <hamburger2048@users.noreply.hosted.weblate.org>
Co-authored-by: 송의찬 <arksos1357@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/af/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/apc/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ar/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/as/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/bg/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ckb/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/cs/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/de/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/el/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/es/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/fa/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/fil/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/fr/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/hi/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/hr/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/hu/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/id/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/it/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ja/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ko/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/mk/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ms/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/nl/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/or/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/pl/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/pt/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/pt_BR/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/qt/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ro/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ru/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/sv/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ta/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/tr/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/uk/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ur/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/vi/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/zh_Hans/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/zh_Hant/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/fastlane/as/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/fastlane/ckb/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/fastlane/es_AR/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/fastlane/hr/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/fastlane/ja/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/fastlane/nl/
Translation: Cloudstream/App
Translation: Cloudstream/Fastlane
2025-09-13 20:02:05 +02:00
KingLucius
2d617da99a
feat(Emulator UI): Click anywhere to hide Episodes (#1899) 2025-09-10 14:43:35 +02:00
KingLucius
994211d32f
Fix: crash on API version < 25 (#1900) 2025-09-10 01:19:17 +02:00
firelight
9b50b11bfa
Feat: Added "Mexican Spanish" as a language in subtitlehelper 2025-09-05 18:13:11 +00:00
Diogo
569f593793
SubtitleHelper: add IETF BCP 47 and OpenSubtitles (#1863) 2025-09-05 20:02:05 +02:00
rockhero1234
bf630923c7
ui:2x alignment and animation (#1885) 2025-09-05 19:52:56 +02:00
BlipBlob
d2472f0d2a
Fix broken resolveUsingWebView (#1887)
* webview

* webview 2
2025-09-05 19:49:44 +02:00
KingLucius
b740afd648
feat(TV UI): Netflix-like Horizontal scrolling behavior (#1888) 2025-09-05 19:45:33 +02:00
BlipBlob
909cdbfffc
Paginated search (#1731) 2025-09-04 01:01:57 +02:00
firelight
4a36048b3e
Fix: Made plugin languages filter only show existing languages. 2025-09-04 00:10:19 +02:00
firelight
91fe001103
Fix: Change color of 2x to always be white, also Fixes #1882 2025-09-03 23:10:53 +02:00
rockhero1234
94c560071a
ui:improve 2x overlay btn (#1883)
* ui:improve 2x overlay btn

* no foreground

* tint in drawable
2025-09-03 23:05:54 +02:00
firelight
c5d1b5f87e
Fix(TV): Focus for reload 2025-08-31 23:40:53 +02:00
rockhero1234
2cce3fe6ad
feat:reload provider btn on emulator and tv (#1877) 2025-08-31 20:01:31 +02:00
Jace
8215aa0b19
[skip ci] feat: Created discoverium.yml file to be discoverable by Discoverium. (#1876) 2025-08-31 19:52:37 +02:00
firelight
27a125705c
Fix(TV): FCast crashing, Closes #1872 2025-08-31 19:51:02 +02:00
firelight
0ffe3822c4
Change versionName to 4.5.5 2025-08-30 17:10:48 +02:00
rockhero1234
37caf794ea
feat:shareable movie/tvshow links (#1860) 2025-08-30 17:08:37 +02:00
rockhero1234
20109d89fc
feat:reload provider on long press source btn (#1871) 2025-08-29 16:28:18 +02:00
rockhero1234
2c4894cc14
feat:head profile image on phone (#1868) 2025-08-29 16:24:05 +02:00
firelight
e8b7829d90
Revert "Hide PIP settings option on TV (#1829)" (#1869)
This reverts commit b2ce0f81f2.
2025-08-27 23:57:56 +02:00
rockhero1234
e60453ba2b
feat:mark as watched up to this episode (#1828) 2025-08-24 15:38:25 +02:00
Phisher98
e193214759
Minor Fix for Filemoon (#1858) 2025-08-22 16:29:57 +02:00
firelight
6cc8b01119
Feat(TV): Added network stream to downloads tab, and updated nextfocus for easier navigation. Closes #1283 2025-08-21 01:13:13 +02:00
firelight
b87e85ba7d
Fix: Force reload account when loading homepage, Closes #1851 2025-08-20 19:20:14 +02:00
Phisher98
b32a27b76f
Dailymotion Minor Fix (#1848)
* Dailymotion

* Dailymotion

* Dailymotion
2025-08-19 17:09:28 +02:00
firelight
5122a72adf
Fix: popCurrentPage fix in player 2025-08-18 20:55:33 +02:00
Phisher98
ec093fb36c
DailyMotion Fix (#1844) 2025-08-18 20:54:42 +02:00
rockhero1234
c4a111ef3a
fix:retain old RepositoryData constructor (#1841) 2025-08-17 14:52:04 +02:00
firelight
ddfaf7e701
Fix: Sync step size crashfix, Closes #1838 2025-08-16 22:09:56 +02:00
KingLucius
b2ce0f81f2
Hide PIP settings option on TV (#1829) 2025-08-15 23:58:25 +02:00
rockhero1234
f3ff6bb4a5
feat:local profile photo (#1826) 2025-08-13 15:40:04 +02:00
rockhero1234
54366bb6c6
feat:added repo icon (#1825)
* feat:added repo icon

* fixes
2025-08-13 15:25:48 +02:00
int3debug
1a36bb4523
fix(setup): mark setup as completed when skipping (#1824) 2025-08-12 15:03:00 +02:00
firelight
4169fd5ae4
Fix: Migrate to authdata for better set/get key security, split up auth into files, added preliminary BackupAPI, use Result instead of Resource. (#1822) 2025-08-12 00:51:29 +02:00
firelight
d103884ac0
Chore: Removed unused code 2025-08-11 21:44:29 +02:00
Diogo
89dee1bd72
Fix: unclosed file descriptor, bump libs min ver (#1818)
* Fix: close inputPFD:ParcelFileDescriptor in AppContextUtils
* Security: bump libs minor version
2025-08-11 21:42:03 +02:00
rockhero1234
eecce5b007
Always show pinned providers (#1820)
* always show pinned

* fix
2025-08-11 18:22:21 +02:00
firelight
df9d16a110
Fix: Readded old tokens to nonTransferableKeys, added invalidateToken to AuthAPI 2025-08-08 18:11:13 +02:00
KingLucius
0054b58b63
Show PIN login only on TV UI (#1814) 2025-08-08 13:53:34 +02:00
firelight
87e89fb5cc
Chore: Code cleanup for SyncAPI, and added supportedWatchTypes 2025-08-08 01:07:59 +02:00
firelight
ab16d24296
Fix: Updated error message to show correct fail error 2025-08-07 19:14:22 +02:00
firelight
f5e9393305
Hotfix(Simkl): Fixed authorization 2025-08-07 19:07:37 +02:00
firelight
fc621cb4d5
Feat(MainAPI): Added headers to SubtitleFile (#1810)
* Feat(MainAPI): Added headers to SubtitleFile

* Feat: Added headers to subtitle implementation
2025-08-07 18:56:29 +02:00
firelight
fcada71b67
Initial migration to stateless auth (#1803)
* Initial migration to stateless auth

* Fix: Fixed AuthLoginResponse password, and made sure access token is non-null

* Docs: Added more docummentation for Auth

* Feat: Tie accounts ids to CloudStream accounts, and added none account
2025-08-07 18:30:23 +02:00
Phisher98
8573de14fd
Improved StreamWishExtractor and Added FileMoon Extractor Separately and Improved also Filsim (#1808) 2025-08-05 18:55:16 +02:00
firelight
17c3584004
Fixed missing imports from last commit 2025-08-05 15:32:50 +02:00
firelight
17c46cf9a5
Fix(Android 14+): Inconsistent back button behavior in player, Closes #1804 2025-08-05 15:29:50 +02:00
firelight
940060c82d
Chore: Migrate to Score api for personalRating 2025-07-31 22:41:22 +00:00
firelight
7610a6b9d5
Chore: Migrate to Score api for AbstractSyncStatus 2025-07-31 22:31:46 +00:00
firelight
f71f22a7d4
Fix(Crash): Avoid crash on LoudnessEnhancer exception, change color instead 2025-07-29 00:55:10 +00:00
firelight
c4cf2d9ca6
Fix: Made more navigation buttons scroll to top on long click 2025-07-29 00:14:58 +00:00
firelight
ef7a970efe
Fix: Added hashCode and equals to Score, fixes inconsistent AsyncListDiffer behavior 2025-07-28 22:34:23 +00:00
firelight
905edfbd94
Fix(UI): Do not show rating if below 0.1/10.0 2025-07-24 13:55:53 +00:00
rockhero1234
0197a65017
Toggle rating label (#1782) 2025-07-24 15:52:27 +02:00
firelight
6daa2946f5
Fix(Player): Fixed motion events in vertical video, Closes #1778 2025-07-23 22:32:02 +00:00
rockhero1234
6ddc88d269
Show estimated download time in notification (#1770) 2025-07-24 00:08:13 +02:00
Nivin
0e44e19e10
Add DRM request headers support in player (#1768) 2025-07-23 20:09:55 +02:00
Osten
16004b8a93
Fix TV backbutton 2025-07-23 14:01:35 +00:00
int3debug
1fd561f5e5
feat: enhance player error logging with url, headers, and referer (#1756) 2025-07-23 14:59:08 +02:00
rockhero1234
13a49063b1
feat:pin providers (#1761) 2025-07-23 14:37:59 +02:00
firelight
4a5ad63c35
Fix: Weird inconsistent subtitle elevation fix? Closes #1777 2025-07-23 12:08:54 +00:00
Osten
91652da920 Bump to 4.5.4 for backwards compatible constructors 2025-07-22 21:20:48 +02:00
firelight
c6254d30a9
Update .gitignore 2025-07-22 18:14:36 +02:00
Onur Civanoğlu
cc5555979a
Add quick scroll-to-top functionality via long press on Home button (#1763) 2025-07-22 18:06:08 +02:00
Osten
aeba48e1ec Merge branch 'master' of https://github.com/recloudstream/cloudstream 2025-07-22 16:26:12 +02:00
Osten
f689dedf68 Bump to 4.5.3 2025-07-22 16:25:54 +02:00
Sarlay
555d977c69
Added a rating preview on the poster (#1745) 2025-07-21 22:16:31 +02:00
Phisher98
ed37c073b1
Dailymotion Improvement to Add Subtitles (#1765) 2025-07-21 15:00:28 +02:00
int3debug
8cc922006f
chore: downgrade media3 to 1.6.1 due to ExoPlaybackException (#1757) 2025-07-19 21:07:03 +02:00
firelight
276bf9f986
Fix(UI): Updated style for buttons in dialog, Closes #1753 2025-07-19 19:04:22 +00:00
firelight
8b6d0ec8c4
Added new class Score (#1748) 2025-07-19 18:09:50 +02:00
firelight
1226b019c6
Fix(TV): Added focus outline to subtitle color selection 2025-07-18 16:38:18 +00:00
int3debug
9d58f04167
chore: update media3 to 1.8.0-beta01 (#1743) 2025-07-18 14:06:16 +02:00
firelight
fc00204ebf
Fix(Phone): Disable seekbar when not shown, Closes #1749 2025-07-17 23:06:57 +00:00
firelight
cdee3ca6aa
Fix: Added top padding to subtitles to prevent {\an7-9} to display outside the screen, Closes #1747 2025-07-17 22:46:13 +00:00
firelight
cd6423ace7
Fix: Small fix to override aligment for some {\anX} types 2025-07-17 22:39:55 +00:00
Osten
b29ba766b0
Updated ErrorLoadingException for Player Toast, fixes torrent blocking other links 2025-07-15 17:23:58 +00:00
Osten
da55a87792
Fixed subtitle crash 2025-07-14 14:11:28 +00:00
firelight
990ce2b8e3
Feat: Added better support for use as an external 2025-07-12 21:18:15 +02:00
firelight
dede16aadb
Feat: Added JustPlayer 2025-07-12 19:49:38 +02:00
firelight
8582f405c3
Fix: Disable 2x for non fullscreen trailers 2025-07-12 19:25:00 +02:00
firelight
c7bbc29743
Feat: Added NextPlayer 2025-07-12 19:20:59 +02:00
firelight
020496353a
Fix: Disable 2x while locked 2025-07-12 19:06:48 +02:00
firelight
d62b969252
Fix: Only show "AlwaysAskAction" in settings 2025-07-12 17:44:37 +02:00
firelight
58b8279f49
Added LibreTorrent and BiglyBT, Closes #1741 2025-07-12 17:37:27 +02:00
Nivin
68b281cd98
Add 'Always ask' option for video player selection (#1723)
* Add 'Always ask' option for video player selection

Introduces an 'Always ask' option in player settings, allowing users to choose a player each time an episode is played. Updates the settings UI, string resources, and episode handling logic to support this feature.

* Refactor AlwaysAskAction as a dedicated VideoClickAction

Introduced AlwaysAskAction as a dedicated VideoClickAction for the 'Always Ask' player option. Refactored logic in ResultViewModel2 to handle player selection dialog via AlwaysAskAction instead of a special action constant. Cleaned up related code and removed the now-unnecessary string and constant definitions.
2025-07-12 16:42:26 +02:00
rockhero1234
0f0d541c53
Added 2x speed on hold (#1729)
* Added 2x speed on hold

* Toggle in Setting & fixes

* fix
2025-07-12 16:39:00 +02:00
BlipBlob
3636a34df7
Make cue rules apply to embedded subtitles (#1735)
* player

* fixes

* Bugfix with styles

---------

Co-authored-by: firelight <147925818+fire-light42@users.noreply.github.com>
2025-07-12 16:27:23 +02:00
BlipBlob
8d25c933cb
Update M3u8Helper.kt (#1733) 2025-07-02 19:04:32 +02:00
CranberrySoup
fa36bcb9f0
Fix subtitle overlap (#1726)
* Update CustomSubtitleDecoderFactory.kt
2025-07-02 01:29:58 +02:00
firelight
3dd7467003
Fix(M3u8 Downloader Part 3): Updated audio detection to conform with the RFC 2025-07-01 13:58:21 +02:00
firelight
d136226fb1
Fix(M3u8 Downloader Part 2): Updated HlsPlaylistParser to include invalid/missing codec and mime types 2025-07-01 01:41:39 +02:00
firelight
8f57588108
Update VideoClickAction.kt 2025-06-30 17:51:29 +02:00
firelight
795629ee42
Feat: Added Vlc Nightly, Closes #1725 2025-06-30 16:16:50 +02:00
firelight
c2e6604fa4
Fix(M3u8 Downloader): Fixed m3u8 missing audio bugs in downloads by adding a real m3u8 parser, and fixed a bug crashing the downloader caused by missing encryption (#1727) 2025-06-30 16:06:58 +02:00
Osten
6780b98330
Fixed issues with embedded subtitles 2025-06-27 23:09:21 +02:00
firelight
5cbbc1bd12
Fix(TV UI): Made focus in settings highlight with border for consistency and reliability 2025-06-27 19:37:39 +02:00
firelight
76c80e2c89
Feat: Added skip loading for acquire links, and updated UI for the dialog 2025-06-27 18:14:44 +02:00
firelight
6609a11a23
Feat: Minor change to skip loading to show how many links are loaded 2025-06-27 00:03:57 +02:00
firelight
63aaba2993
Chore: Replaced all instances of outdated mvvm apis (amap) 2025-06-26 23:44:52 +02:00
firelight
d2e64f29c7
Chore: Replaced all instances of outdated mvvm apis 2025-06-26 23:34:58 +02:00
firelight
fabef62ea6
Fix(TV): Made backbutton hide episodes instead of exit, Closes #1268 2025-06-26 21:57:04 +02:00
firelight
aaa2821f31
Feat: Added settings for poster size, and changed back to hardware bitmaps for #1720 2025-06-26 18:50:41 +02:00
firelight
409a0aadc3
Feat(TV): Added long-hold popup parity, to replace toast for TV 2025-06-26 01:44:49 +02:00
firelight
d1593ee22e
Fix: Fixed the subtitle elevation in player when opening the UI 2025-06-23 17:09:36 +02:00
firelight
1a841f845d
Feat: Added overscanning setting for TV, Closes #1557 2025-06-23 02:47:34 +02:00
firelight
df15813540
fix: MainAPI added uniqueUrl for consistent keys on JSON 2025-06-23 02:04:14 +02:00
firelight
244484f609
Feat: Add go to downloads button in home if there is no connection 2025-06-23 01:13:19 +02:00
firelight
3d30f9d99b
chore: Removed unused parameters in Resource.Failure, and readded title_shadow for test layout 2025-06-23 00:52:32 +02:00
Luna712
fedfb2250e
Fix typos in unimplimented methods in MainAPI (#1549) 2025-06-23 00:32:42 +02:00
firelight
bdb1e12f3b
feat(TV) : Remove all continue watching items 2025-06-23 00:14:30 +02:00
firelight
959048936a
Minor fix for CloudMailRu 2025-06-22 23:16:51 +02:00
Kraptor123
fe8ca8672d
CloudMailRuExtractor (#1715) 2025-06-22 23:14:55 +02:00
firelight
ce3298822c
Added settings for parallel, and concurrent downloads. Closes #1714 2025-06-22 21:46:29 +02:00
firelight
6f30bb2df4
Fixed #1717 2025-06-22 16:36:07 +02:00
Osten
b3b3559c18 Added more checks for ___DO_NOT_CALL_FROM_A_PLUGIN 2025-06-17 19:20:51 +02:00
Phisher98
2db253eb31
Vidstack Improvements (#1707) 2025-06-17 00:37:17 +02:00
Kraptor123
6280bbd6e9
minor fix (#1705) 2025-06-12 22:49:30 +02:00
Phisher98
20b1d754a6
GDMirrorbot Fix (#1706) 2025-06-12 22:49:13 +02:00
redblacker8
3654831d8d
Fix vidhidepro for other case (#1689) 2025-05-30 00:28:45 +00:00
recloudstream[bot]
982dc9b5ba chore(locales): fix locale issues 2025-05-30 00:27:58 +00:00
Weblate (bot)
f892b66754
Translated using Weblate (#1692) 2025-05-30 00:27:44 +00:00
feroxx
f71ea63224
Fix Trailer and yt playing (#1694)
* Bump newpipeextractor to v0.24.6
2025-05-30 00:26:46 +00:00
Phisher98
0281675ae8
Voe Fix (#1696) 2025-05-20 16:16:40 +00:00
recloudstream[bot]
5183024b7a chore(locales): fix locale issues 2025-05-16 00:10:07 +00:00
Weblate (bot)
18caefa9f9
Translations update from Weblate
Currently translated at 100.0% (782 of 782 strings)

Translated using Weblate (German)

Currently translated at 99.8% (781 of 782 strings)

Translated using Weblate (Hindi)

Currently translated at 54.3% (425 of 782 strings)

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Arabic (Levantine))

Currently translated at 100.0% (782 of 782 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Tamil)

Currently translated at 95.5% (747 of 782 strings)

Translated using Weblate (Vietnamese)

Currently translated at 99.8% (781 of 782 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (782 of 782 strings)

Translated using Weblate (Greek)

Currently translated at 100.0% (782 of 782 strings)

Translated using Weblate (Arabic)

Currently translated at 99.4% (778 of 782 strings)

Translated using Weblate (Russian)

Currently translated at 100.0% (782 of 782 strings)

Translated using Weblate (Bulgarian)

Currently translated at 100.0% (782 of 782 strings)

Translated using Weblate (Bulgarian)

Currently translated at 100.0% (782 of 782 strings)

Translated using Weblate (Indonesian)

Currently translated at 100.0% (782 of 782 strings)

Translated using Weblate (French)

Currently translated at 100.0% (782 of 782 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (782 of 782 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (782 of 782 strings)

Translated using Weblate (French)

Currently translated at 99.8% (781 of 782 strings)

Translated using Weblate (Spanish)

Currently translated at 99.8% (781 of 782 strings)

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (782 of 782 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (782 of 782 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (782 of 782 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (782 of 782 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (782 of 782 strings)

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (780 of 780 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (780 of 780 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (780 of 780 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (780 of 780 strings)

Translated using Weblate (Spanish)

Currently translated at 99.8% (779 of 780 strings)

Translated using Weblate (Russian)

Currently translated at 100.0% (780 of 780 strings)

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (780 of 780 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (780 of 780 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (780 of 780 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (780 of 780 strings)

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Russian)

Currently translated at 100.0% (777 of 777 strings)

Translated using Weblate (Russian)

Currently translated at 100.0% (777 of 777 strings)

Translated using Weblate (Russian)

Currently translated at 100.0% (777 of 777 strings)

Translated using Weblate (Russian)

Currently translated at 100.0% (777 of 777 strings)

Translated using Weblate (Russian)

Currently translated at 100.0% (777 of 777 strings)

Translated using Weblate (Russian)

Currently translated at 100.0% (777 of 777 strings)

Translated using Weblate (Russian)

Currently translated at 100.0% (777 of 777 strings)

Translated using Weblate (Russian)

Currently translated at 100.0% (777 of 777 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (777 of 777 strings)

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (777 of 777 strings)

Translated using Weblate (Greek)

Currently translated at 100.0% (777 of 777 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (777 of 777 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (777 of 777 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (777 of 777 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (777 of 777 strings)

Translated using Weblate (Greek)

Currently translated at 99.7% (775 of 777 strings)

Translated using Weblate (Arabic)

Currently translated at 100.0% (777 of 777 strings)

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Assamese)

Currently translated at 97.2% (756 of 777 strings)

Translated using Weblate (Ukrainian)

Currently translated at 99.8% (776 of 777 strings)

Translated using Weblate (German)

Currently translated at 99.8% (776 of 777 strings)

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 99.8% (776 of 777 strings)

Translated using Weblate (Chinese (Traditional Han script))

Currently translated at 96.7% (752 of 777 strings)

Translated using Weblate (Vietnamese)

Currently translated at 99.4% (773 of 777 strings)

Translated using Weblate (Swedish)

Currently translated at 97.4% (757 of 777 strings)

Translated using Weblate (Polish)

Currently translated at 99.8% (776 of 777 strings)

Translated using Weblate (Macedonian)

Currently translated at 99.0% (770 of 777 strings)

Translated using Weblate (Italian)

Currently translated at 99.6% (774 of 777 strings)

Translated using Weblate (Croatian)

Currently translated at 99.3% (772 of 777 strings)

Translated using Weblate (Czech)

Currently translated at 99.8% (776 of 777 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 99.8% (776 of 777 strings)

Translated using Weblate (Arabic)

Currently translated at 99.8% (776 of 777 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (777 of 777 strings)

Translated using Weblate (Portuguese)

Currently translated at 100.0% (777 of 777 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (777 of 777 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Spanish)

Currently translated at 100.0% (777 of 777 strings)

Translated using Weblate (French)

Currently translated at 100.0% (777 of 777 strings)

Translated using Weblate (Indonesian)

Currently translated at 100.0% (777 of 777 strings)

Translated using Weblate (Arabic (Levantine))

Currently translated at 100.0% (777 of 777 strings)

































Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/apc/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ar/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/as/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/bg/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/cs/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/de/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/el/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/es/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/fr/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/hi/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/hr/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/id/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/it/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ja/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/mk/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/pl/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/pt/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/pt_BR/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ru/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/sv/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ta/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/tr/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/uk/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/vi/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/zh_Hans/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/zh_Hant/
Translation: Cloudstream/App

Co-authored-by: Ahmed Abd El-Fattah <a.aelfattah5@gmail.com>
Co-authored-by: Boqirz <alveromodar@gmail.com>
Co-authored-by: Christopher Allen <nsn90255@gmail.com>
Co-authored-by: Dan <jonweblin2205@protonmail.com>
Co-authored-by: Do you know my name? <anonymous2676@users.noreply.hosted.weblate.org>
Co-authored-by: Fjuro <fjuro@alius.cz>
Co-authored-by: Francisco Serrador <fserrador@gmail.com>
Co-authored-by: GiannosOB <giannos2105@gmail.com>
Co-authored-by: Harshit Sethi <hstsethi@outlook.com>
Co-authored-by: Ivan Kostov <jiveq1@gmail.com>
Co-authored-by: Lacey Anaya <yecakeh263@anawalls.com>
Co-authored-by: Massimo Pissarello <mapi68@gmail.com>
Co-authored-by: Matthaiks <kitynska@gmail.com>
Co-authored-by: Nguyễn Tiến Đạt <dn16092000@gmail.com>
Co-authored-by: Pizza Party <paol.m@proton.me>
Co-authored-by: Plamen Ivanov <paco.iwanow@gmail.com>
Co-authored-by: Quentin <mrbydix@users.noreply.hosted.weblate.org>
Co-authored-by: Ramazan S <me@ramazansancar.com.tr>
Co-authored-by: Rex_sa <rex.sa@pm.me>
Co-authored-by: Reza Almanda <rezaalmanda27@gmail.com>
Co-authored-by: Serdar Sağlam <teknomobil@msn.com>
Co-authored-by: Sergey Ponomarev <stokito@gmail.com>
Co-authored-by: dedakir923 <dedakir923@exoular.com>
Co-authored-by: khalidbelk <khalid.belkassmi-el-hafi@epitech.eu>
Co-authored-by: maxim <maximtested@gmail.com>
Co-authored-by: ssantos <ssantos@web.de>
Co-authored-by: william piti <loolyowo@gmail.com>
Co-authored-by: Максим Горпиніч <maksimgorpinic2005a@gmail.com>
Co-authored-by: தமிழ்நேரம் <anishprabu.t@gmail.com>
Co-authored-by: 大王叫我来巡山 <hamburger2048@users.noreply.hosted.weblate.org>
2025-05-16 00:09:52 +00:00
Bnyro
418da4da7e
fix: vidhide fails to extract relative urls (#1691) 2025-05-15 23:55:28 +00:00
firelight
4217a716cd
Updated the safe function for more ergonomic code (#1675) 2025-04-29 20:33:52 +02:00
firelight
19220557f8
Better video cache abrupt exit 2025-04-27 22:21:44 +02:00
firelight
31ed9e9bf1
Fixed caption regex 2025-04-27 21:28:52 +02:00
IndusAryan
3455a25469
fix: fixed coil headers again again 💀 💀 (#1668)
* fixed coil headers again again 💀 💀

* add few logs and verbose function name

* update agp again
2025-04-27 20:53:55 +02:00
Phisher98
149783b26f
Minor Fix for AniListApi Recommendation null (#1672)
* Minor Fix for VidStack

* Fix Voe Extractor

* Minor Fix for AniListApi Recommendation null
2025-04-27 20:41:14 +02:00
Phisher98
00aa63682a
Fix Voe Extractor (#1667)
* Minor Fix for VidStack

* Fix Voe Extractor
2025-04-21 21:08:40 +02:00
Phisher98
1ffc8dd147
Minor Fix for VidStack (#1666) 2025-04-17 19:15:48 +02:00
Luna712
590fbd89db
Add volume booster above 100% (#1444) 2025-04-17 19:13:49 +02:00
firelight
775d117a97
Added more subtitle options and general subtitle fixes.
Added Bold, Italic and Background radius. Fixed subtitle size override, and anX anchor
2025-04-16 23:27:37 +02:00
Osten
6990f58d68
Fixed pause unpause issue 2025-04-12 21:58:08 +02:00
Bnyro
e0f2299d1d
feat: add secvideo (fsst, dsst, csst) extractor (#1654) 2025-04-10 19:48:56 +02:00
Bnyro
6fd5548f8a
feat: add nathanfromsubject mirror of voe (#1657) 2025-04-10 19:48:00 +02:00
int3debug
97f33c6b6e
refact: unify torrent error messages (#1655) 2025-04-10 19:45:16 +02:00
Bnyro
adb4315eb2
feat: add vinovo extractor (#1649) 2025-04-09 18:13:01 +02:00
Bnyro
706581c4a2
feat: add bigwarp extractors (#1650) 2025-04-08 21:58:26 +02:00
Bnyro
18c87c9361
feat: add earnvids extractors based on vidhide and fix vidhide (#1651) 2025-04-08 21:57:34 +02:00
Osten
381e3ebf25
Removed Prerelease annotation 2025-04-04 22:20:18 +02:00
Osten
d9541585c7
Fix name of MyDramaListDemo 2025-04-04 22:05:57 +02:00
KingLucius
66e48c7d49
Fix MyDramaList Api key (#1642)
* Fix MyDramaList Api key

* Update build.gradle.kts
2025-04-04 22:00:54 +02:00
Osten
ea8bb101fb
Bump to 4.5.2 2025-04-04 21:49:49 +02:00
recloudstream[bot]
ed2aaea0ee chore(locales): fix locale issues 2025-04-04 19:48:41 +00:00
Osten
3e739fdc1a
Merge pull request #1537 from recloudstream/weblate
Translations update from Hosted Weblate
2025-04-04 21:48:27 +02:00
Hosted Weblate
0ef0540d8c
Merge remote-tracking branch 'origin/master' 2025-04-04 21:47:57 +02:00
KingLucius
ce71940a34
Long click source to copy URL (#1638) 2025-04-04 21:47:53 +02:00
Hosted Weblate
6055278c5c
Translated using Weblate (Spanish)
Currently translated at 100.0% (777 of 777 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (777 of 777 strings)

Translated using Weblate (Arabic)

Currently translated at 100.0% (777 of 777 strings)

Translated using Weblate (Indonesian)

Currently translated at 99.6% (774 of 777 strings)

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (777 of 777 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (777 of 777 strings)

Translated using Weblate (German)

Currently translated at 100.0% (777 of 777 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (777 of 777 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (777 of 777 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (777 of 777 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Vietnamese)

Currently translated at 99.8% (774 of 775 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (775 of 775 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (775 of 775 strings)

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (775 of 775 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (775 of 775 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (775 of 775 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (775 of 775 strings)

Translated using Weblate (Arabic)

Currently translated at 100.0% (775 of 775 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (775 of 775 strings)

Translated using Weblate (Afrikaans)

Currently translated at 30.1% (233 of 773 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Romanian)

Currently translated at 91.9% (711 of 773 strings)

Translated using Weblate (Romanian)

Currently translated at 91.9% (711 of 773 strings)

Translated using Weblate (Hindi)

Currently translated at 54.4% (421 of 773 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (773 of 773 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (773 of 773 strings)

Translated using Weblate (Swedish)

Currently translated at 98.0% (758 of 773 strings)

Translated using Weblate (French)

Currently translated at 100.0% (773 of 773 strings)

Translated using Weblate (Persian)

Currently translated at 50.1% (388 of 773 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Russian)

Currently translated at 97.4% (753 of 773 strings)

Translated using Weblate (Arabic (Levantine))

Currently translated at 100.0% (773 of 773 strings)

Translated using Weblate (Vietnamese)

Currently translated at 99.8% (772 of 773 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (773 of 773 strings)

Translated using Weblate (Indonesian)

Currently translated at 99.8% (772 of 773 strings)

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (773 of 773 strings)

Translated using Weblate (Vietnamese)

Currently translated at 99.6% (770 of 773 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (773 of 773 strings)

Translated using Weblate (Croatian)

Currently translated at 100.0% (773 of 773 strings)

Translated using Weblate (Arabic)

Currently translated at 100.0% (773 of 773 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (773 of 773 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (773 of 773 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (773 of 773 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (773 of 773 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (German)

Currently translated at 99.7% (769 of 771 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Persian)

Currently translated at 49.5% (382 of 771 strings)

Translated using Weblate (Persian)

Currently translated at 46.3% (357 of 771 strings)

Translated using Weblate (Macedonian)

Currently translated at 100.0% (771 of 771 strings)

Translated using Weblate (Vietnamese)

Currently translated at 99.8% (770 of 771 strings)

Translated using Weblate (Indonesian)

Currently translated at 100.0% (771 of 771 strings)

Translated using Weblate (Indonesian)

Currently translated at 99.8% (770 of 771 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (771 of 771 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Vietnamese)

Currently translated at 99.8% (770 of 771 strings)

Translated using Weblate (Japanese)

Currently translated at 25.0% (1 of 4 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (771 of 771 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (771 of 771 strings)

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (771 of 771 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (771 of 771 strings)

Translated using Weblate (Vietnamese)

Currently translated at 99.8% (770 of 771 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (771 of 771 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (771 of 771 strings)

Translated using Weblate (Arabic)

Currently translated at 100.0% (771 of 771 strings)

Translated using Weblate (English)

Currently translated at 100.0% (771 of 771 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (765 of 765 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (765 of 765 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Vietnamese)

Currently translated at 100.0% (756 of 756 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Azerbaijani)

Currently translated at 34.2% (259 of 756 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Spanish)

Currently translated at 99.8% (755 of 756 strings)

Translated using Weblate (Vietnamese)

Currently translated at 99.8% (755 of 756 strings)

Translated using Weblate (French)

Currently translated at 100.0% (756 of 756 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (756 of 756 strings)

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Hungarian)

Currently translated at 86.6% (655 of 756 strings)

Translated using Weblate (Chinese (Traditional Han script))

Currently translated at 99.4% (752 of 756 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Vietnamese)

Currently translated at 99.8% (755 of 756 strings)

Translated using Weblate (Chinese (Traditional Han script))

Currently translated at 99.0% (749 of 756 strings)

Translated using Weblate (Arabic (Levantine))

Currently translated at 100.0% (756 of 756 strings)

Translated using Weblate (Korean)

Currently translated at 96.0% (726 of 756 strings)

Translated using Weblate (Macedonian)

Currently translated at 100.0% (756 of 756 strings)

Translated using Weblate (Assamese)

Currently translated at 100.0% (756 of 756 strings)

Translated using Weblate (Portuguese)

Currently translated at 100.0% (756 of 756 strings)

Translated using Weblate (Azerbaijani)

Currently translated at 30.0% (227 of 756 strings)

Translated using Weblate (Arabic)

Currently translated at 100.0% (756 of 756 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (756 of 756 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (756 of 756 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (756 of 756 strings)

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (756 of 756 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (756 of 756 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (756 of 756 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Arabic (Levantine))

Currently translated at 99.8% (755 of 756 strings)

Translated using Weblate (Korean)

Currently translated at 95.7% (724 of 756 strings)

Translated using Weblate (qt (generated) (qt))

Currently translated at 98.1% (742 of 756 strings)

Translated using Weblate (German)

Currently translated at 98.8% (747 of 756 strings)

Translated using Weblate (Spanish)

Currently translated at 99.6% (753 of 756 strings)

Translated using Weblate (Russian)

Currently translated at 99.3% (751 of 756 strings)

Translated using Weblate (Urdu)

Currently translated at 92.4% (699 of 756 strings)

Translated using Weblate (Tamil)

Currently translated at 98.6% (746 of 756 strings)

Translated using Weblate (Chinese (Traditional Han script))

Currently translated at 98.9% (748 of 756 strings)

Translated using Weblate (Romanian)

Currently translated at 93.1% (704 of 756 strings)

Translated using Weblate (Macedonian)

Currently translated at 99.6% (753 of 756 strings)

Translated using Weblate (Greek)

Currently translated at 93.2% (705 of 756 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 99.3% (751 of 756 strings)

Translated using Weblate (Vietnamese)

Currently translated at 100.0% (756 of 756 strings)

Translated using Weblate (Vietnamese)

Currently translated at 99.6% (753 of 756 strings)

Translated using Weblate (Vietnamese)

Currently translated at 99.4% (752 of 756 strings)

Translated using Weblate (Swedish)

Currently translated at 100.0% (756 of 756 strings)

Translated using Weblate (Vietnamese)

Currently translated at 98.9% (748 of 756 strings)

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Portuguese)

Currently translated at 100.0% (756 of 756 strings)

Translated using Weblate (Croatian)

Currently translated at 100.0% (756 of 756 strings)

Translated using Weblate (French)

Currently translated at 100.0% (756 of 756 strings)

Translated using Weblate (Assamese)

Currently translated at 100.0% (756 of 756 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Arabic (Levantine))

Currently translated at 100.0% (756 of 756 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (756 of 756 strings)

Translated using Weblate (Vietnamese)

Currently translated at 98.9% (748 of 756 strings)

Translated using Weblate (Indonesian)

Currently translated at 100.0% (756 of 756 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (756 of 756 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (756 of 756 strings)

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (756 of 756 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (756 of 756 strings)

Translated using Weblate (Arabic)

Currently translated at 100.0% (756 of 756 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (756 of 756 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Dutch)

Currently translated at 87.2% (657 of 753 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (753 of 753 strings)

Co-authored-by: 404NotFound <404others@pm.me>
Co-authored-by: Ahmed Abd El-Fattah <a.aelfattah5@gmail.com>
Co-authored-by: An Nguyen <annguyen.it.utc@gmail.com>
Co-authored-by: Anarchydr <patrikpik879@gmail.com>
Co-authored-by: Anonymous <noreply@weblate.org>
Co-authored-by: Balázs Sipos <balazs.sipos118@gmail.com>
Co-authored-by: Bruno Fragoso <darth_signa@hotmail.com>
Co-authored-by: Chip <itsjustchipoverhere@gmail.com>
Co-authored-by: Christo <jchristomuller@gmail.com>
Co-authored-by: Cris P <cristineipop2015@gmail.com>
Co-authored-by: Dan <jonweblin2205@protonmail.com>
Co-authored-by: Doctorredits_here <182783629+doctorreditshere@users.noreply.github.com>
Co-authored-by: Esspel <eric.soderstrom06@gmail.com>
Co-authored-by: Fikri Akbar <akbarfikri1221@gmail.com>
Co-authored-by: Fjuro <fjuro@users.noreply.hosted.weblate.org>
Co-authored-by: Francisco Serrador <fserrador@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Itsmechinmoy <itsmechinmoy@users.noreply.hosted.weblate.org>
Co-authored-by: Jamil Farajov <jamilfarajov@gmail.com>
Co-authored-by: Julian <hello@apollo.moe>
Co-authored-by: KING APPS <kiperking1@gmail.com>
Co-authored-by: Konstantin <konstantinkreutz@gmail.com>
Co-authored-by: LaTruite <sanchezlatruite@tutamail.com>
Co-authored-by: Lancelot65 <lancelotbulte@gmail.com>
Co-authored-by: Lionharth <leon.fredriksson@icloud.com>
Co-authored-by: Maddyhf <madhavsharma91458@gmail.com>
Co-authored-by: Massimo Pissarello <mapi68@gmail.com>
Co-authored-by: Matthaiks <kitynska@gmail.com>
Co-authored-by: Metehan Öztürk <metehan61ozturk@gmail.com>
Co-authored-by: Milo Ivir <mail@milotype.de>
Co-authored-by: Mina Myoui <myouiminayang@gmail.com>
Co-authored-by: MindustryLogic <xyndermultilanguagelism@gmail.com>
Co-authored-by: Nguyễn Tiến Đạt <dn16092000@gmail.com>
Co-authored-by: Ohirok <ohirok@users.noreply.hosted.weblate.org>
Co-authored-by: Parsa Nobahari <parsa.nobahari@gmail.com>
Co-authored-by: Pizza Party <paol.m@proton.me>
Co-authored-by: Ramazan S <me@ramazansancar.com.tr>
Co-authored-by: Rere Doloi <reredolire@gmail.com>
Co-authored-by: Rex_sa <rex.sa@pm.me>
Co-authored-by: Riccardo Giordano <rickygiordano03@gmail.com>
Co-authored-by: SBS1313 <simonsaade005@gmail.com>
Co-authored-by: Saúl Palacios <palacios22c@gmail.com>
Co-authored-by: Serdar Sağlam <teknomobil@msn.com>
Co-authored-by: Siber <siber@users.noreply.hosted.weblate.org>
Co-authored-by: Tom Brand <tom9358@gmail.com>
Co-authored-by: dedakir923 <dedakir923@exoular.com>
Co-authored-by: gacarel <gacarel657@bariswc.com>
Co-authored-by: hugoalh <hugoalh@users.noreply.hosted.weblate.org>
Co-authored-by: leyakid803 <leyakid803@minduls.com>
Co-authored-by: stojkovskistefan <stefanstojkovski@gmail.com>
Co-authored-by: zmni <zmni@outlook.com>
Co-authored-by: М Ш <muslimsahmurzaev@gmail.com>
Co-authored-by: Максим Горпиніч <maksimgorpinic2005a@gmail.com>
Co-authored-by: 大王叫我来巡山 <hamburger2048@users.noreply.hosted.weblate.org>
Co-authored-by: 송의찬 <arksos1357@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/af/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/apc/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ar/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/as/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/az/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/cs/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/de/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/el/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/en/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/es/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/fa/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/fr/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/hi/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/hr/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/hu/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/id/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/it/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ko/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/mk/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/nl/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/pl/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/pt/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/pt_BR/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/qt/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ro/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ru/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/sv/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ta/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/tr/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/uk/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ur/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/vi/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/zh_Hans/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/zh_Hant/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/fastlane/ja/
Translation: Cloudstream/App
Translation: Cloudstream/Fastlane
2025-04-04 21:47:41 +02:00
KingLucius
f5cd549b69
feat(Extensions): newExtractorLink for developers (#1632)
* feat(Extensions): newExtractorLink for developers

* remove isM3u8 and use type
2025-04-04 21:47:34 +02:00
firelight
4c610aa40c
Fix: Removed head request from downloads as it is slow and timeout does not work 2025-04-02 00:08:30 +00:00
CranberrySoup
5e90819802
Group subtitles with the same name (#1628)
* Group subtitles

* fix empty names
2025-04-01 19:52:57 +02:00
CranberrySoup
da3c4b8181
Fix gradient overlay on loading (#1637) 2025-04-01 19:39:31 +02:00
Osten
b5dd0f1cb9
Nicehttp -> 0.4.13 2025-03-31 01:00:27 +02:00
KingLucius
b9df1387d8
Audio track language in Tracks dialog (#1629) 2025-03-30 16:29:17 +02:00
firelight
4cc398447e
Update prerelease.yml MDL_API_KEY 2025-03-29 20:06:00 +01:00
KingLucius
39a3151cb4
feat(Extensions): MyDramaList Meta provider (#1622)
* feat(Extensions): MyDramaList Meta provider

* use JsonProperty

* BuildConfig KEY & applyMedia
2025-03-29 20:03:01 +01:00
Datj0000
1e69418044
feat: voice search (#1623) 2025-03-29 19:49:32 +01:00
firelight
7e148a4d6a
Biometric crashfix 2025-03-29 18:21:49 +00:00
KingLucius
bc557d1660
Bump biometric & navigation Libs (#1625) 2025-03-29 19:15:09 +01:00
Matt Alexander
950eb6f759
Update README.md (#1626)
Fix docs typo
2025-03-29 18:18:18 +01:00
firelight
d92fbd3f99
Bugfix: MKV Handle any recursive query 2025-03-27 19:23:06 +00:00
KingLucius
7aaa82ef4f
Bump Media3 to 1.6.0 (#1624)
Co-authored-by: firelight <147925818+fire-light42@users.noreply.github.com>
2025-03-27 18:49:55 +01:00
IndusAryan
d5aa758b15
chore: update dependencies and gradle plugin version (#1577)
* Update some libs

* bump gradle to 8.13
2025-03-27 18:46:20 +01:00
Phisher98
79c7e0312c
Update VidStack.kt (#1611)
Making them Public
2025-03-16 12:51:38 +01:00
Phisher98
a03cc93453
Update GDMirrorbot.kt (#1612) 2025-03-16 12:51:27 +01:00
Bnyro
17fe74d432
fix: remove dead code from filesim extractor (#1607) 2025-03-13 20:27:30 +01:00
firelight
429be4cc13
Added timeout API 2025-03-12 19:30:21 +00:00
firelight
d7355c4772
Fix: Added ID_SEEK_HEAD parsing for MKV container. (#1604) 2025-03-11 20:26:09 +01:00
firelight
8f773f20fb
Chore: Bump NiceHttp to 0.4.12 2025-03-11 14:13:26 +00:00
firelight
4c4eee71cb
Fix: Prevent seeking on non seekable media 2025-03-10 21:12:48 +00:00
firelight
75ee406c4e
Fix: Added timeout of 2min to MainAPI 2025-03-09 01:29:40 +00:00
firelight
44fadaf9b0
fix: Released and removed unused data 2025-03-09 01:02:51 +00:00
firelight
f915cd0c20
Feat: Added player notification and play in background via PIP. (#1585)
* Feat: Added player notification and play in background via PIP.
2025-03-08 17:06:16 +01:00
firelight
935fd43d16
Fixed shitty extentions 2025-03-08 15:29:00 +00:00
firelight
c21cf0c115
Fix: getPairList duplicate + reset null 2025-03-08 14:52:56 +00:00
firelight
67d49bcb06
Revert "Filesim (#1597)" (#1599)
This reverts commit ba33f761ed.
2025-03-08 02:04:18 +01:00
Redowan Ahmed Apu
a064fddd96
Get embed url (#1592)
optimize import and regex
2025-03-08 01:04:03 +01:00
Phisher98
ba33f761ed
Filesim (#1597) 2025-03-08 01:02:56 +01:00
int3debug
8d0612a9ae
feat(ui): add torrent sorting option to plugin fragment (#1587) 2025-03-06 12:33:27 +01:00
Phisher98
ade27410ed
Adding LuluStream Extractor Separately and Fixed (#1588)
* Adding VidStack Extractor

* Adding VidStack Extractor

* Adding GDMirrorbot Extractor

* Adding LuluStream Extractor Separately and Fixed
2025-03-06 12:28:00 +01:00
IndusAryan
db9e362fbb
refactor: convert monkey activity 🐒 into a fragment monke 🦍 (#1576)
* Turn monkey activity 🐒 into a fragment monke 🦍
2025-03-05 00:45:12 +01:00
Bnyro
127a9c006d
fix: filesim extractor doesn't work anymore due to embeds (#1581) 2025-03-03 18:22:40 +01:00
Phisher98
cdb70d5707
Adding VidStack and GDMirrorbot Extractor (#1579) 2025-03-03 18:21:52 +01:00
firelight
0a38434dec
Fixed seasons with one episode 2025-03-01 12:50:05 +00:00
Phisher98
8bea8f6a49
Adding Manually Update Plugins (#1512) 2025-03-01 01:02:59 +01:00
IndusAryan
1c6db0e514
refactor: overall navigation mechanism and split logic #1429 (#1430) 2025-03-01 00:41:14 +01:00
Gaurang Khatavkar
ab23f23c71
Feature: episode sort button (#1565)
- Add sort direction indicator (▲/▼) to button text
2025-02-28 21:26:40 +01:00
Osten
846ff38c3b
Lazy system.load torrent lib 2025-02-26 19:12:16 +01:00
Gaurang Khatavkar
126062bb26
fix: update switch track color to match primary theme color (#1569) 2025-02-25 14:22:32 +01:00
int3debug
2f79092da1
bugfix(subdl): allow special-chars in password (#1568) 2025-02-23 19:34:56 +00:00
Redowan Ahmed Apu
361964eb2b
Update Vidguard.kt (#1560)
Fixing embed url
2025-02-22 19:10:45 +00:00
KingLucius
713b55dd98
feat(Subtitles): SubDL Login Fix (#1563) 2025-02-22 19:09:56 +00:00
Luna712
0b94f76627
Move metaproviders to library (#1541)
* Move metaproviders to library

So that providers can extend them when using the library dependency.

* Remove gson
2025-02-16 18:46:48 +01:00
Luna712
157a02e6af
Revert "Bump newpipeextractor to v0.24.5 (#1548)" (#1556)
This reverts commit 82038643c8.
2025-02-16 18:45:14 +01:00
Luna712
743527aa40
Bump coil to 3.1.0 (#1538) 2025-02-11 14:43:06 +01:00
Luna712
71b5c69426
Replace use of gson in PluginManager (#1544) 2025-02-11 14:42:48 +01:00
Luna712
82038643c8
Bump newpipeextractor to v0.24.5 (#1548) 2025-02-11 14:41:01 +01:00
Bnyro
0e962d0f2f
refactor: replace PendingIntent#getActivity with PendingIntentCompat#getActivity (#1555) 2025-02-11 14:31:23 +01:00
Bnyro
12626cce51
fix: new episode notifications for subscriptions not opening series page when clicking (#1554) 2025-02-11 14:24:58 +01:00
Luna712
de1dbbf2a5
Move SubtitleHelper to library (#1542)
So that providers can use it when using the library dependency.
2025-02-06 02:29:00 +01:00
recloudstream[bot]
840274da4c chore(locales): fix locale issues 2025-02-04 23:53:03 +00:00
Weblate (bot)
4304be2cad
Translated using Weblate (Arabic (Levantine)) (#1503) 2025-02-05 00:52:50 +01:00
Osten
668867768c
bump to 4.5.1 2025-02-05 00:52:31 +01:00
Osten
1907b382fd
Remove prerelase tag on api 2025-02-05 00:42:12 +01:00
Luna712
42fc9aac92
Bump navigation libs (#1526) 2025-02-05 00:39:54 +01:00
Luna712
fa9bcfa4cf
Bump rhino to 1.8.0 (#1518) 2025-02-05 00:38:54 +01:00
KingLucius
83032db8eb
feat(DRM): License URL support for Extensions (#1432)
* feat(DRM): License URL support for Extensions

* Direct Modify DrmExtractorLink

* Clean
2025-02-05 00:31:19 +01:00
Luna712
9a9c04cbea
metaproviders: use new* methods (#1216)
* metaproviders: use new* methods

* very minor var fixes

---------

Co-authored-by: firelight <147925818+fire-light42@users.noreply.github.com>
2025-02-05 00:28:45 +01:00
IndusAryan
513569d350
Use ignore battery intent directly. (#1535) 2025-02-05 00:28:06 +01:00
Osten
6ff64637b6
software decoding auto 2025-02-01 23:16:32 +01:00
Luna712
e5ac4a0f94
Fix installer on some older devices (#1533) 2025-01-31 20:59:47 +01:00
Taha Sökmen
c5577a5a0c
Update Filesim extractor (#1532) 2025-01-31 17:26:14 +01:00
Luna712
b6a43bb86e
Fix PackageInstaller on Android 15 (#1531)
* Fix PackageInstaller on Android 15
2025-01-30 22:27:18 +01:00
Luna712
30e1bcba79
Use exitProcess on TV (#1529) 2025-01-30 21:52:38 +01:00
Luna712
234145c9bf
Fix focus issues on old APIs for logcat (#1530) 2025-01-30 21:52:13 +01:00
Luna712
5ee365638f
Make logcat a RecyclerView (#1528) 2025-01-30 19:13:31 +01:00
CranberrySoup
7b60246e28
Make the plugin part crossplatform (#1527) 2025-01-30 18:39:27 +01:00
KingLucius
b95e630bd8
feat(Extensions): addTrailer with headers support (#1524)
* feat(Extensions): addTrailer with headers support

* Update MainAPI.kt

* Reformat
2025-01-30 16:51:06 +01:00
KingLucius
a01db6a228
Respect "User-Agent" header in ExtractorLink (#1523)
* Respect "User-Agent" header in ExtractorLink

* Update CS3IPlayer.kt

* Reformat
2025-01-30 16:49:51 +01:00
Luna712
2c6656d3c0
Rename torrentserver package ref to match new package (#1519)
* Rename torrentserver package ref to match new package

* Order
2025-01-29 20:35:54 +01:00
Luna712
05fd0e8b60
Pin conscrypt to 2.5.2 (#1520) 2025-01-29 20:35:25 +01:00
Luna712
21906420d8
Fix to display prerelease icon in setup on prerelease (#1522) 2025-01-29 20:34:40 +01:00
Luna712
e2a37355f1
Restore showing login name for SyncAPI in settings (#1525)
This used to do this but it seems to have been lost in 83318b0
2025-01-29 20:31:20 +01:00
Luna712
469710684a
Bump some dependencies (#1497)
* Bump some dependencies

* Revert bump

* Bump
2025-01-28 15:20:05 +01:00
Luna712
f523e6fee1
Cleanup redundant warnings in MainAPI (#1513) 2025-01-28 15:19:12 +01:00
Luna712
ed6646cb49
Handle SocketTimeoutException in PlayerError (#1514) 2025-01-28 15:18:39 +01:00
Luna712
6acd01d80e
Suppress deprecations in CS3IPlayer (#1515) 2025-01-28 15:18:16 +01:00
Luna712
86da2f019e
Restore package declaration for Torrent (#1516)
Seems to have been accidentally removed in 812226b.
2025-01-28 15:17:54 +01:00
Osten
55f66a5588
torrent server bump for less crashes 2025-01-27 19:45:06 +01:00
Luna712
7d58c6e8a7
Fix isCastApiAvailable (#1509) 2025-01-27 00:22:51 +01:00
Luna712
bc7617f2d0
Temporarily use ConcatenatingMediaSource as fallback (#1511)
Torrents seem to fail otherwise with "Must add at least one source to the concatenation", as mediaItemSlices.size is 0. I suspect the cause may be due to `loadExo(context, listOf(), listOf(), null)`
2025-01-27 00:22:11 +01:00
Luna712
7d2f898c22
Fix loading local plugins under targetsdk 34+ (#1477) 2025-01-26 21:28:11 +01:00
Luna712
679f3651f8
Fix many build warnings/deprecations (#1478) 2025-01-26 21:25:39 +01:00
KingLucius
642004db5a
feat(Extensions): Prefer last registered ExtractorAPI (#1506)
* feat(Extensions): Prefer last registered ExtractorAPI

* Iterate in Reverse

* Update ExtractorApi.kt
2025-01-25 15:45:03 +01:00
IndusAryan
7bd695e720
fix exit dialog appearing (#1507) 2025-01-25 15:43:05 +01:00
firelight
1eced92b51
Added software decoding option 2025-01-23 21:12:26 +00:00
IndusAryan
94f012f01c
use finish instead of exit process. (#1505) 2025-01-23 21:48:44 +01:00
firelight
569107831c
Bump code to 4.5.0 2025-01-23 01:06:38 +01:00
KingLucius
2c53f0bd23
Merge pull request #1500 from KingLucius/bumpPipe
Trailers fix
2025-01-22 17:29:45 +01:00
recloudstream[bot]
3b3f9b74ab chore(locales): fix locale issues 2025-01-21 23:39:36 +00:00
firelight
a7e5c850a3
Merge pull request #1491 from recloudstream/weblate
Translations update from Hosted Weblate
2025-01-21 23:39:20 +00:00
Hosted Weblate
0e9b36281c
Merge remote-tracking branch 'origin/master' 2025-01-21 23:38:48 +00:00
Luna712
e668bd0830
gradle: enable build and configuration cache (#1495) 2025-01-22 00:38:44 +01:00
Hosted Weblate
5fb3d545ef
Merge remote-tracking branch 'origin/master' 2025-01-22 00:38:15 +01:00
Phisher98
e8be266a21
Adding QuickJS Javascript Engine deobfuscator 1st Phase (#1485) 2025-01-22 00:38:12 +01:00
Hosted Weblate
fe6054c366
Merge remote-tracking branch 'origin/master' 2025-01-21 23:34:15 +00:00
Luna712
2e14c22ef6
generate_dokka: remove unused directory usage (#1499) 2025-01-22 00:34:11 +01:00
Hosted Weblate
7de929e198
Merge remote-tracking branch 'origin/master' 2025-01-22 00:33:01 +01:00
firelight
e7ea39b786
May have fixed TV audio 2025-01-21 23:32:56 +00:00
Hosted Weblate
10e3d99114
Merge remote-tracking branch 'origin/master' 2025-01-21 23:22:30 +00:00
Luna712
3f6dd01ec7
Dokka: fix compatibility with multiplatform and configuration cache (#1493)
* Dokka: fix compatibility with multiplatform/modules

Fixes many "<Error class: unknown class>" such as with LiveData and RecyclerView as well as potential conflicts in class names between modules
2025-01-22 00:22:25 +01:00
Hosted Weblate
7de0ea8145
Merge remote-tracking branch 'origin/master' 2025-01-22 00:18:37 +01:00
firelight
c12bd878c3
Added NoSuchMethodException error message 2025-01-21 23:18:33 +00:00
Hosted Weblate
93ca6d6a14
Merge remote-tracking branch 'origin/master' 2025-01-21 23:08:53 +00:00
firelight
40abf49281
Fixed #1486 by adding updateUrl 2025-01-21 23:08:48 +00:00
Hosted Weblate
050ae611ac
Merge remote-tracking branch 'origin/master' 2025-01-21 22:16:23 +01:00
Luna712
578eb48ad8
Support configuration cache for getting git commit (#1494) 2025-01-21 22:16:19 +01:00
Hosted Weblate
216776b7f3
Merge remote-tracking branch 'origin/master' 2025-01-21 22:11:23 +01:00
Riccardo Giordano
1436c15113
Changed YoutubeExtractor (#1496) 2025-01-21 22:11:17 +01:00
Hosted Weblate
2164ac48b2
Merge remote-tracking branch 'origin/master' 2025-01-21 21:45:17 +01:00
Bnyro
cfc219c102
fix: don't attempt to fix urls that are JSON arrays (#1498) 2025-01-21 21:45:11 +01:00
Hosted Weblate
43c567f076
Translated using Weblate (Arabic)
Currently translated at 100.0% (753 of 753 strings)

Translated using Weblate (Azerbaijani)

Currently translated at 27.3% (206 of 753 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (753 of 753 strings)

Update translation files

Updated by "Remove blank strings" hook in Weblate.

Translated using Weblate (Filipino)

Currently translated at 15.0% (113 of 753 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (753 of 753 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (753 of 753 strings)

Translated using Weblate (Macedonian)

Currently translated at 100.0% (753 of 753 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (753 of 753 strings)

Translated using Weblate (Portuguese)

Currently translated at 100.0% (753 of 753 strings)

Translated using Weblate (Assamese)

Currently translated at 100.0% (753 of 753 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Azerbaijani)

Currently translated at 26.8% (202 of 753 strings)

Translated using Weblate (Afrikaans)

Currently translated at 28.6% (216 of 753 strings)

Translated using Weblate (Arabic (Levantine))

Currently translated at 100.0% (753 of 753 strings)

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (753 of 753 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (753 of 753 strings)

Translated using Weblate (Indonesian)

Currently translated at 100.0% (753 of 753 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (753 of 753 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (753 of 753 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (753 of 753 strings)

Translated using Weblate (Macedonian)

Currently translated at 100.0% (753 of 753 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Portuguese)

Currently translated at 100.0% (751 of 751 strings)

Translated using Weblate (Slovak)

Currently translated at 100.0% (4 of 4 strings)

Translated using Weblate (Slovak)

Currently translated at 72.4% (544 of 751 strings)

Translated using Weblate (Russian)

Currently translated at 100.0% (751 of 751 strings)

Translated using Weblate (Slovak)

Currently translated at 72.4% (544 of 751 strings)

Translated using Weblate (Assamese)

Currently translated at 100.0% (751 of 751 strings)

Translated using Weblate (Japanese)

Currently translated at 68.7% (516 of 751 strings)

Translated using Weblate (Japanese)

Currently translated at 68.7% (516 of 751 strings)

Translated using Weblate (Macedonian)

Currently translated at 100.0% (751 of 751 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (751 of 751 strings)

Translated using Weblate (Azerbaijani)

Currently translated at 24.2% (182 of 751 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (751 of 751 strings)

Translated using Weblate (Macedonian)

Currently translated at 100.0% (751 of 751 strings)

Translated using Weblate (Indonesian)

Currently translated at 100.0% (751 of 751 strings)

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Spanish)

Currently translated at 100.0% (751 of 751 strings)

Translated using Weblate (Russian)

Currently translated at 100.0% (751 of 751 strings)

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (751 of 751 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (751 of 751 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (751 of 751 strings)

Translated using Weblate (Chinese (Traditional Han script))

Currently translated at 99.6% (748 of 751 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (751 of 751 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (751 of 751 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (751 of 751 strings)

Translated using Weblate (Arabic)

Currently translated at 100.0% (751 of 751 strings)

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Arabic (Levantine))

Currently translated at 100.0% (751 of 751 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (751 of 751 strings)

Translated using Weblate (Macedonian)

Currently translated at 100.0% (4 of 4 strings)

Translated using Weblate (German)

Currently translated at 99.6% (747 of 750 strings)

Co-authored-by: Ahmed Abd El-Fattah <a.aelfattah5@gmail.com>
Co-authored-by: Ahmed Abd Elfattah <escuro.anjo@gmail.com>
Co-authored-by: Aydın <mtahaydn@gmail.com>
Co-authored-by: Chokdee Kedarim <ckedarim707@gmail.com>
Co-authored-by: Dan <jonweblin2205@protonmail.com>
Co-authored-by: Deleted User <noreply+48943@weblate.org>
Co-authored-by: Fjuro <fjuro@alius.cz>
Co-authored-by: Francisco Serrador <fserrador@gmail.com>
Co-authored-by: Hank <hank108129@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Itsmechinmoy <itsmechinmoy@users.noreply.hosted.weblate.org>
Co-authored-by: Jamil Farajov <jamilfarajov@gmail.com>
Co-authored-by: Juan Rubin <juancrubin08@gmail.com>
Co-authored-by: Juraj Kollár <juraj.kollar.2013@gmail.com>
Co-authored-by: Kerim Demirkaynak <aschannel111@gmail.com>
Co-authored-by: Lauritz Zeiske <Lauritz.Zeiske@web.de>
Co-authored-by: Massimo Pissarello <mapi68@gmail.com>
Co-authored-by: Matthaiks <kitynska@gmail.com>
Co-authored-by: Meteor2 <ryumeteor175@gmail.com>
Co-authored-by: Pizza Party <paol.m@proton.me>
Co-authored-by: Quite Suspicious <quiteunsuspicious@gmail.com>
Co-authored-by: Rafael Henrique <rafael.henrique2125@gmail.com>
Co-authored-by: Riccardo Giordano <rickygiordano03@gmail.com>
Co-authored-by: Serdar Sağlam <teknomobil@msn.com>
Co-authored-by: maxim <maximtested@gmail.com>
Co-authored-by: rezi nagro <rezinagro@hotmail.com>
Co-authored-by: stojkovskistefan <stefanstojkovski@gmail.com>
Co-authored-by: zmni <zmni@outlook.com>
Co-authored-by: Максим Горпиніч <maksimgorpinic2005a@gmail.com>
Co-authored-by: 大王叫我来巡山 <hamburger2048@users.noreply.hosted.weblate.org>
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/af/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/apc/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ar/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/as/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/az/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/cs/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/de/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/es/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/fil/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/id/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/it/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ja/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/mk/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/pl/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/pt/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/pt_BR/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ru/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/sk/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/tr/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/uk/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/zh_Hans/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/zh_Hant/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/fastlane/mk/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/fastlane/sk/
Translation: Cloudstream/App
Translation: Cloudstream/Fastlane
2025-01-21 11:00:35 +01:00
Luna712
eb9b309e72
Use MainAPI to get folder prefix (#1472) 2025-01-15 23:26:08 +00:00
Kai Kitching
f1b95ff8f9
Update ReadMe Documentation (#1004) 2025-01-15 23:14:53 +00:00
Weblate (bot)
726a6ce821
Translated using Weblate (#1470) 2025-01-15 23:03:24 +00:00
Bilal Aslam
c35cdb7da9
Implement click functionality on cast names to initiate a Google search (#1465) 2025-01-15 23:02:46 +00:00
KingLucius
63a8b2d938
feat(Extensions): Extensions API documentation & deprecate old classes (#1475) 2025-01-15 22:52:52 +00:00
salman731
105fbf7c1a
add DoH DNS servers (#1481) 2025-01-15 22:44:29 +00:00
Luna712
a4db6df792
Migrate dokka to 2.0.0 (#1490) 2025-01-15 22:32:36 +00:00
KingLucius
6da673c2ce
feat(TV UI): Fix trailer button visibility (#1482) 2025-01-13 21:36:57 +01:00
int3debug
567c5c07dd
refact(player) preferred media toast (#1480) 2025-01-13 21:36:23 +01:00
Luna712
b9185cff05
Remove unused glide libs (#1483) 2025-01-13 21:35:33 +01:00
Osten
13d8489bb1
Updated SafeFile dependency 2025-01-13 21:33:21 +01:00
Luna712
9c31d0a61e
Use StringUtils in some places (#1471) 2025-01-09 01:01:52 +01:00
KingLucius
e2852d2313
Fix issue when removing last element of List (#1476) 2025-01-09 01:01:12 +01:00
Luna712
f36939ff35
Migrate to non-transitive R classes (#1469) 2025-01-05 02:49:24 +01:00
firelight
69399eb995
Cache subtitles from the internet 2025-01-05 02:36:21 +01:00
Luna712
d03e03b925
Fix app:makeJar build (#1468) 2025-01-04 23:39:41 +01:00
Luna712
ce5974c313
Upgrade AGP for better SDK 35 support and fix deprecations (#1460) 2025-01-04 22:36:04 +01:00
recloudstream[bot]
843a5e75fa chore(locales): fix locale issues 2025-01-04 21:26:37 +00:00
firelight
10ee1fd717
Merge pull request #1380 from recloudstream/weblate
Translations update from Hosted Weblate
2025-01-04 22:26:23 +01:00
Hosted Weblate
54dc2f4f0d
Merge remote-tracking branch 'origin/master' 2025-01-04 21:24:57 +00:00
Luna712
7c65245d36
Fix back pressed conflicts (#1437) 2025-01-04 22:24:52 +01:00
Hosted Weblate
50977b4bcd
Merge remote-tracking branch 'origin/master' 2025-01-04 22:16:35 +01:00
Luna712
e15910f0b9
Add extractor for archive.org (#1447) 2025-01-04 22:16:32 +01:00
Hosted Weblate
927acb6313
Merge remote-tracking branch 'origin/master' 2025-01-04 20:59:16 +00:00
Luna712
521d3a8011
Updated folder names in getFolder method for tense consistency. (#1446)
AsianDrama-> AsianDramas, OVA -> OVAs, Torrent -> Torrents
2025-01-04 21:59:12 +01:00
Hosted Weblate
e4bdf000bc
Merge remote-tracking branch 'origin/master' 2025-01-04 20:58:09 +00:00
Luna712
e909c82a55
MainAPI: add missing builder methods (#1463) 2025-01-04 21:58:05 +01:00
Hosted Weblate
b7d5e8d60f
Merge remote-tracking branch 'origin/master' 2025-01-04 20:54:32 +00:00
IndusAryan
59b57dfe8e
Opt out of edge to edge in a15 and above (#1459) 2025-01-04 21:54:28 +01:00
Hosted Weblate
de19fa8937
Merge remote-tracking branch 'origin/master' 2025-01-04 20:54:08 +00:00
KingLucius
6dcd3d6dc0
Make "Restart" next up focused button (#1466) 2025-01-04 21:54:04 +01:00
Hosted Weblate
dad12dd24d
Translated using Weblate (French)
Currently translated at 99.6% (747 of 750 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (750 of 750 strings)

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (750 of 750 strings)

Translated using Weblate (Dutch)

Currently translated at 87.3% (655 of 750 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (750 of 750 strings)

Translated using Weblate (Indonesian)

Currently translated at 100.0% (750 of 750 strings)

Translated using Weblate (Arabic (Levantine))

Currently translated at 100.0% (750 of 750 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (750 of 750 strings)

Translated using Weblate (Macedonian)

Currently translated at 100.0% (750 of 750 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (750 of 750 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (748 of 748 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (748 of 748 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (748 of 748 strings)

Translated using Weblate (Arabic)

Currently translated at 100.0% (748 of 748 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (748 of 748 strings)

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (748 of 748 strings)

Translated using Weblate (Vietnamese)

Currently translated at 99.7% (746 of 748 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (748 of 748 strings)

Translated using Weblate (Indonesian)

Currently translated at 100.0% (748 of 748 strings)

Translated using Weblate (Macedonian)

Currently translated at 100.0% (748 of 748 strings)

Translated using Weblate (Arabic (Levantine))

Currently translated at 100.0% (748 of 748 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (748 of 748 strings)

Translated using Weblate (Azerbaijani)

Currently translated at 23.0% (172 of 746 strings)

Added translation using Weblate (Azerbaijani)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Macedonian)

Currently translated at 100.0% (746 of 746 strings)

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Turkish)

Currently translated at 100.0% (746 of 746 strings)

Translated using Weblate (German)

Currently translated at 100.0% (746 of 746 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (746 of 746 strings)

Translated using Weblate (Tamil)

Currently translated at 100.0% (746 of 746 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Swedish)

Currently translated at 99.3% (741 of 746 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (4 of 4 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (746 of 746 strings)

Translated using Weblate (Vietnamese)

Currently translated at 100.0% (746 of 746 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Korean)

Currently translated at 97.0% (724 of 746 strings)

Translated using Weblate (French)

Currently translated at 99.8% (745 of 746 strings)

Translated using Weblate (Tamil)

Currently translated at 94.9% (708 of 746 strings)

Translated using Weblate (Chinese (Traditional Han script))

Currently translated at 100.0% (746 of 746 strings)

Translated using Weblate (Hindi)

Currently translated at 55.7% (416 of 746 strings)

Translated using Weblate (Vietnamese)

Currently translated at 100.0% (746 of 746 strings)

Translated using Weblate (Indonesian)

Currently translated at 100.0% (746 of 746 strings)

Translated using Weblate (Russian)

Currently translated at 100.0% (746 of 746 strings)

Translated using Weblate (Russian)

Currently translated at 100.0% (746 of 746 strings)

Translated using Weblate (Russian)

Currently translated at 100.0% (746 of 746 strings)

Translated using Weblate (Croatian)

Currently translated at 99.8% (745 of 746 strings)

Translated using Weblate (Russian)

Currently translated at 99.8% (745 of 746 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (746 of 746 strings)

Translated using Weblate (Japanese)

Currently translated at 69.0% (515 of 746 strings)

Translated using Weblate (Persian)

Currently translated at 41.5% (310 of 746 strings)

Translated using Weblate (Japanese)

Currently translated at 68.7% (513 of 746 strings)

Translated using Weblate (Swedish)

Currently translated at 98.7% (737 of 746 strings)

Translated using Weblate (Vietnamese)

Currently translated at 100.0% (746 of 746 strings)

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (746 of 746 strings)

Translated using Weblate (Portuguese)

Currently translated at 100.0% (746 of 746 strings)

Translated using Weblate (Persian)

Currently translated at 100.0% (4 of 4 strings)

Translated using Weblate (Tamil)

Currently translated at 93.4% (697 of 746 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (746 of 746 strings)

Translated using Weblate (Japanese)

Currently translated at 68.0% (508 of 746 strings)

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Japanese)

Currently translated at 60.5% (452 of 746 strings)

Translated using Weblate (Assamese)

Currently translated at 100.0% (746 of 746 strings)

Translated using Weblate (Japanese)

Currently translated at 56.4% (421 of 746 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (746 of 746 strings)

Translated using Weblate (Arabic (Levantine))

Currently translated at 100.0% (746 of 746 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (746 of 746 strings)

Translated using Weblate (Arabic)

Currently translated at 100.0% (746 of 746 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (746 of 746 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (746 of 746 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (746 of 746 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (746 of 746 strings)

Translated using Weblate (Assamese)

Currently translated at 100.0% (745 of 745 strings)

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (745 of 745 strings)

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (745 of 745 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (745 of 745 strings)

Translated using Weblate (Chinese (Traditional Han script))

Currently translated at 100.0% (745 of 745 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (745 of 745 strings)

Translated using Weblate (Arabic (Levantine))

Currently translated at 100.0% (745 of 745 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (745 of 745 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (745 of 745 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (745 of 745 strings)

Translated using Weblate (Arabic)

Currently translated at 100.0% (745 of 745 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (744 of 744 strings)

Translated using Weblate (Persian)

Currently translated at 39.7% (296 of 744 strings)

Translated using Weblate (Galician)

Currently translated at 54.1% (403 of 744 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Romanian)

Currently translated at 94.6% (704 of 744 strings)

Translated using Weblate (Chinese (Traditional Han script))

Currently translated at 100.0% (744 of 744 strings)

Translated using Weblate (Bulgarian)

Currently translated at 100.0% (4 of 4 strings)

Translated using Weblate (Bulgarian)

Currently translated at 93.0% (692 of 744 strings)

Translated using Weblate (Assamese)

Currently translated at 100.0% (744 of 744 strings)

Translated using Weblate (German)

Currently translated at 100.0% (744 of 744 strings)

Translated using Weblate (Vietnamese)

Currently translated at 100.0% (744 of 744 strings)

Translated using Weblate (Arabic)

Currently translated at 100.0% (744 of 744 strings)

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Portuguese)

Currently translated at 99.8% (743 of 744 strings)

Translated using Weblate (Arabic (Levantine))

Currently translated at 100.0% (744 of 744 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (744 of 744 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (744 of 744 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (744 of 744 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (744 of 744 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (744 of 744 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (744 of 744 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (French)

Currently translated at 96.7% (715 of 739 strings)

Translated using Weblate (Russian)

Currently translated at 100.0% (739 of 739 strings)

Translated using Weblate (Croatian)

Currently translated at 100.0% (739 of 739 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (739 of 739 strings)

Translated using Weblate (Vietnamese)

Currently translated at 100.0% (739 of 739 strings)

Translated using Weblate (Portuguese)

Currently translated at 100.0% (739 of 739 strings)

Translated using Weblate (Arabic)

Currently translated at 100.0% (739 of 739 strings)

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Italian)

Currently translated at 100.0% (739 of 739 strings)

Translated using Weblate (Arabic (Levantine))

Currently translated at 100.0% (739 of 739 strings)

Translated using Weblate (qt (generated) (qt))

Currently translated at 100.0% (739 of 739 strings)

Translated using Weblate (Arabic (Levantine))

Currently translated at 100.0% (739 of 739 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (739 of 739 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (739 of 739 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (739 of 739 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (739 of 739 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (739 of 739 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (739 of 739 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Arabic (Levantine))

Currently translated at 100.0% (734 of 734 strings)

Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Translated using Weblate (German)

Currently translated at 100.0% (742 of 742 strings)

Co-authored-by: Ahmed Abd El-Fattah <a.aelfattah5@gmail.com>
Co-authored-by: Alexey Lysenko <abesmon@gmail.com>
Co-authored-by: Anarchydr <patrikpik879@gmail.com>
Co-authored-by: Antonio N <antonioenpidev@gmail.com>
Co-authored-by: Bhupesh Yadav <thebhupeshyadav@gmail.com>
Co-authored-by: Boyan Alexiev <nneauu@gmail.com>
Co-authored-by: Cleverson Cândido <optimuspraimu@gmail.com>
Co-authored-by: Cloudburst <18114966+C10udburst@users.noreply.github.com>
Co-authored-by: Cris P <cristineipop2015@gmail.com>
Co-authored-by: Dan <jonweblin2205@protonmail.com>
Co-authored-by: Doctorredits_here <alkaf.alkaf2018@tutamail.com>
Co-authored-by: Emmanuel HEMERIT <emmanuel@hemer.it>
Co-authored-by: Fjuro <fjuro@alius.cz>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Huy Nguyen <chung41901@gmail.com>
Co-authored-by: Itsmechinmoy <itsmechinmoy@users.noreply.hosted.weblate.org>
Co-authored-by: James Sands <social.phenol08@icloud.com>
Co-authored-by: Jamil Farajov <jamilfarajov@gmail.com>
Co-authored-by: John Titor <utkin2007@gmail.com>
Co-authored-by: Jose Delvani <jsdelvani@users.noreply.hosted.weblate.org>
Co-authored-by: Konstantin <konstantinkreutz@gmail.com>
Co-authored-by: Kyivska Hryvnya <Hryvnya@users.noreply.hosted.weblate.org>
Co-authored-by: Massimo Pissarello <mapi68@gmail.com>
Co-authored-by: Matthaiks <kitynska@gmail.com>
Co-authored-by: Meteor2 <ryumeteor175@gmail.com>
Co-authored-by: Milo Ivir <mail@milotype.de>
Co-authored-by: Nguyễn Tiến Đạt <dn16092000@gmail.com>
Co-authored-by: PaneradFisk <andre.bergvall@icloud.com>
Co-authored-by: Pavithran <pavithran08.ee@gmail.com>
Co-authored-by: Peter Dave Hello <hsu@peterdavehello.org>
Co-authored-by: PiterDev <piterzdev@gmail.com>
Co-authored-by: Pizza Party <paol.m@proton.me>
Co-authored-by: PumbaLP Galant <PumbaLP@users.noreply.hosted.weblate.org>
Co-authored-by: Ramazan S <ramazansancar4545@gmail.com>
Co-authored-by: Rex_sa <rex.sa@pm.me>
Co-authored-by: Reza Almanda <rezaalmanda27@gmail.com>
Co-authored-by: Sanloz <lozdovskij@gmail.com>
Co-authored-by: Sarp “zarpcik” Küçük <sarpkucuk@gmail.com>
Co-authored-by: Saúl Palacios <palacios22c@gmail.com>
Co-authored-by: Serdar Sağlam <teknomobil@msn.com>
Co-authored-by: Stefan <halloherbert@users.noreply.hosted.weblate.org>
Co-authored-by: Tiago Lucas <tiago.slucas@gmail.com>
Co-authored-by: Tom Brand <tom9358@gmail.com>
Co-authored-by: Yuson Chen <yunshangcn@gmail.com>
Co-authored-by: befag74614 <befag74614@skrank.com>
Co-authored-by: bittin1ddc447d824349b2 <bittin@reimu.nl>
Co-authored-by: enly sure <enlysure@gmail.com>
Co-authored-by: gallegonovato <fran-carro@hotmail.es>
Co-authored-by: hammond <hammond@disroot.org>
Co-authored-by: hugoalh <hugoalh@users.noreply.hosted.weblate.org>
Co-authored-by: immeteor2 <ryumeteor175@gmail.com>
Co-authored-by: kaajjo <claymanoff@gmail.com>
Co-authored-by: kowih83264 <kowih83264@inikale.com>
Co-authored-by: maxim <maximtested@gmail.com>
Co-authored-by: mojtaba piri <Mpcuteangel@gmail.com>
Co-authored-by: ngocanhtve <ngocanh.tve@gmail.com>
Co-authored-by: only <wantable00@gmail.com>
Co-authored-by: stojkovskistefan <stefanstojkovski@gmail.com>
Co-authored-by: therry47 <soulietherry@gmail.com>
Co-authored-by: Максим Горпиніч <maksimgorpinic2005a@gmail.com>
Co-authored-by: தமிழ்நேரம் <anishprabu.t@gmail.com>
Co-authored-by: 大王叫我来巡山 <hamburger2048@users.noreply.hosted.weblate.org>
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/apc/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ar/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/as/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/az/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/bg/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/cs/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/de/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/es/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/fa/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/fr/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/gl/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/hi/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/hr/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/id/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/it/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ja/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ko/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/mk/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/nl/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/pl/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/pt/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/pt_BR/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/qt/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ro/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ru/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/sv/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ta/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/tr/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/uk/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/vi/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/zh_Hans/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/zh_Hant/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/fastlane/bg/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/fastlane/fa/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/fastlane/tr/
Translation: Cloudstream/App
Translation: Cloudstream/Fastlane
2025-01-04 21:53:56 +01:00
KingLucius
c499b3193e
Bundle NextLib dependencies (#1467) 2025-01-04 21:53:50 +01:00
Luna712
cdfceed035
Fix some false positives in duplicate data check (#1464)
For some reason sometimes the ids are returning literal null values as strings, so we instead make them return an actual null so that the checks properly read them as null.
2025-01-03 00:36:21 +01:00
Phisher98
50e580807d
Chill Fix Again (#1461) 2025-01-02 22:56:50 +01:00
Luna712
a5c02301f5
Handle more PlaybackException errors (#1462) 2025-01-02 22:56:08 +01:00
Luna712
7df4390473
Sync up all compileSdk and targetSdk (#1457) 2024-12-31 22:07:15 +01:00
firelight
812226b56a
switch underlying torrent implementation 2024-12-31 22:04:43 +01:00
Luna712
b3a4af19cd
Add StringUtils (#1440) 2024-12-31 19:50:03 +01:00
Luna712
ed6b848094
Fix to define Cartoon as episode based (#1441) 2024-12-31 19:49:04 +01:00
firelight
01a95b7cc8
fix same url 2024-12-31 19:46:58 +01:00
Phisher98
1c47281cd3
Chillx Fix (#1453) 2024-12-31 19:40:08 +01:00
Luna712
384818091b
Use RECEIVER_EXPORTED for PiP (#1456) 2024-12-31 19:39:34 +01:00
Luna712
05ca01185d
Add new TVTypes for generic Audio and Podcast (#1442)
* Add new TVTypes for generic Audio and Podcast

* Use when
2024-12-31 18:01:41 +01:00
Luna712
2d89cfa888
Fix PiP new targetsdk (#1449) 2024-12-31 17:59:58 +01:00
Luna712
c038c4bc92
Use FLAG_IMMUTABLE creating pending intent in PackageInstaller (#1450) 2024-12-31 17:57:44 +01:00
firelight
678ddb6b0a
Make nextlib decoding the fallback option 2024-12-31 01:53:47 +00:00
IndusAryan
4f5effe5fa
fix: broken downloads and services affected by android 15 support (#1448)
The previous release was removed due to crashes when downloading or using services. This patch aims to fix the issues.
2024-12-31 01:34:25 +00:00
firelight
2c180a0a2e
nextlib to MODE_PREFER 2024-12-30 02:21:21 +01:00
firelight
5b6f69c507
nextlib 2024-12-29 20:05:11 +01:00
IndusAryan
f5d1f689ed
update target sdk to 35 (android 15), gradle & exoplayer (#1434) 2024-12-29 18:32:43 +01:00
Luna712
bcb34bba96
Fix path for AsianDrama downloads (#1439) 2024-12-29 04:25:56 +01:00
firelight
282b25b665
fixed #1425 2024-12-16 05:48:25 +01:00
firelight
5780827bb6
Fixed critical bug with dns caused by coil PR 2024-12-16 05:30:57 +01:00
KingLucius
3d8f7c905b
Move to Dependencies version catalog (#1423) 2024-12-12 20:27:19 +01:00
DR
87b320d021
Fix tv launcher icons for different app flavors (#1422) 2024-12-12 20:22:20 +01:00
Osten
8e3d1e1454
fix bug from 2021 on edge case commit: b85950 2024-12-09 18:09:07 +01:00
firelight
54df562b10
fixed #1368 coil headers again 💀 2024-12-07 22:25:35 +00:00
firelight
803f93c68e
fix #1411 2024-12-07 18:39:55 +00:00
firelight
352c21c009
bump versionName to 4.4.1 2024-12-06 16:05:31 +00:00
firelight
4f8f917910
fix #1413 2024-12-06 16:00:32 +00:00
firelight
c9b1c3187c
fix #1418 2024-12-06 15:45:31 +00:00
firelight
680030d87c
fix library palette 2024-12-06 15:29:57 +00:00
IndusAryan
79f5d1a7aa
add singleton image loader, remove unused libs, increase disk & decrease memory cache (#1396) 2024-12-06 16:12:28 +01:00
firelight
6ac0b02fa0
Html for text 2024-12-06 14:48:14 +00:00
DR
7ad563be60
Add subtitle settings in player (#1417) 2024-12-06 15:40:58 +01:00
firelight
5a7ff3d47c
Update newpipe 2024-12-06 14:34:56 +00:00
DR
6013262579
Update CustomSubtitleDecoderFactory.kt (#1415) 2024-12-01 03:13:34 +01:00
Osten
e026584035
might have fixed autoplay 2024-11-18 22:15:52 +01:00
Osten
f9b5a8a84e
fix inapp magnet links not displaying 2024-11-17 15:28:52 +01:00
Phisher98
e43fc249a3
Added new Domains to Mixdrop (#1408) 2024-11-09 20:11:31 +01:00
Osten
08b4802829 fixed missing highlight on TV 2024-11-03 00:53:56 +01:00
Osten
9d0d76dfe0 added subtitle outline width 2024-11-02 22:00:41 +01:00
Osten
76184e0abc resend dropped torrent requests 2024-10-31 11:30:35 +01:00
Osten
0b1399f825 fixed issues with magnet links 2024-10-30 21:44:29 +01:00
Osten
620d0068b1
fix #1402 2024-10-30 14:22:30 +01:00
Osten
249d50ec72
modify port 2024-10-29 11:41:31 +01:00
Osten
9aa3b0e06e added torrent support 2024-10-29 00:57:51 +01:00
firelight
7194391375
fixed ugly M3 style on tv 2024-10-26 17:24:53 +00:00
IndusAryan
83318b0b0f
feat(refactor): replace glide with coil image loading library (fast & small) (#1368) 2024-10-26 18:19:39 +02:00
RowdyRushya
62b3c697d6
fix vidstreaming extractor (#1393) 2024-10-25 17:30:04 +02:00
Elvis Tony
217cf416ab
Update CommonActivity.kt - Added Numpad 1,2 Channel Up,Down for Navigating Episodes (#1387)
Added KeyEvent Support for Numpad 1 & Channel Down for Previous Episode and Numpad 2 & Channel Up for Next Episode.

Source: [Documentation](https://developer.android.com/reference/android/view/KeyEvent#KEYCODE_CHANNEL_UP)
2024-10-21 16:58:16 +02:00
CranberrySoup
f30319ff7c
Update OpenSubtitlesApi.kt (#1382) 2024-10-16 21:42:40 +02:00
firelight
d870978f3a
Removed crash reporting 2024-10-14 18:01:24 +00:00
Weblate (bot)
3ece1abfff
Translations update from Hosted Weblate (#1348)
Co-authored-by: Anarchydr <patrikpik879@gmail.com>
Co-authored-by: Cloudburst <18114966+C10udburst@users.noreply.github.com>
Co-authored-by: Dan <jonweblin2205@protonmail.com>
Co-authored-by: Fjuro <fjuro@alius.cz>
Co-authored-by: James Sands <social.phenol08@icloud.com>
Co-authored-by: Jose Delvani <jsdelvani@users.noreply.hosted.weblate.org>
Co-authored-by: Kyivska Hryvnya <Hryvnya@users.noreply.hosted.weblate.org>
Co-authored-by: Massimo Pissarello <mapi68@gmail.com>
Co-authored-by: Matthaiks <kitynska@gmail.com>
Co-authored-by: Pizza Party <paol.m@proton.me>
Co-authored-by: PumbaLP Galant <PumbaLP@users.noreply.hosted.weblate.org>
Co-authored-by: Rex_sa <rex.sa@pm.me>
Co-authored-by: Sanloz <lozdovskij@gmail.com>
Co-authored-by: Tiago Lucas <tiago.slucas@gmail.com>
Co-authored-by: gallegonovato <fran-carro@hotmail.es>
2024-10-13 19:24:46 +02:00
Jay Rathod
54f22139d8
feat: option to choose backup target directory (#1354) 2024-10-13 18:04:07 +02:00
b4byhuey
4cf0bc761f
Added Filegram and Fix Vidguard Extractor (#1370) 2024-10-13 17:15:03 +02:00
CranberrySoup
15a27b4f1f
Update player_custom_layout.xml (#1366) 2024-10-04 21:41:39 +02:00
Jay Rathod
3a657d7bfc
#1302 Option to not show exit confirmation dialog (#1345) 2024-10-01 20:12:04 +00:00
Jay Rathod
3c385ea5e4
fix accidental motion in player when accessing systemBars (#1358) 2024-10-01 20:08:40 +00:00
CranberrySoup
f4fd303306
Fix fcast bottom dialog (#1357) 2024-09-29 17:14:59 +02:00
firelight
bd95ecf5ba
Small changes to VideoClickAction API 2024-09-26 20:32:22 +02:00
CranberrySoup
078de970d5
Update FcastAction.kt (#1352) 2024-09-26 19:41:54 +02:00
CranberrySoup
d899ecb82f
Fix navigation bar in light mode (#1350) 2024-09-24 16:23:33 +02:00
firelight
cffc14a6df
fixes critical issues with #1329 2024-09-24 15:28:10 +02:00
Cloudburst
f7594e5239
VideoClickAction api (#1329) 2024-09-22 20:56:34 +02:00
Hosted Weblate
07eb60941a Translated using Weblate (Turkish)
Currently translated at 100.0% (742 of 742 strings)

Translated using Weblate (Assamese)

Currently translated at 100.0% (742 of 742 strings)

Translated using Weblate (Spanish (Argentina))

Currently translated at 75.0% (3 of 4 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (742 of 742 strings)

Translated using Weblate (Russian)

Currently translated at 100.0% (742 of 742 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (742 of 742 strings)

Merge remote-tracking branch 'origin/master'

Translated using Weblate (French)

Currently translated at 97.1% (721 of 742 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (742 of 742 strings)

Translated using Weblate (French)

Currently translated at 97.1% (721 of 742 strings)

Translated using Weblate (Arabic)

Currently translated at 100.0% (742 of 742 strings)

Translated using Weblate (Indonesian)

Currently translated at 100.0% (742 of 742 strings)

Translated using Weblate (Arabic (Levantine))

Currently translated at 100.0% (742 of 742 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (742 of 742 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (742 of 742 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (742 of 742 strings)

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Portuguese)

Currently translated at 99.8% (741 of 742 strings)

Translated using Weblate (Swedish)

Currently translated at 100.0% (742 of 742 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Chinese (Simplified Han script))

Currently translated at 100.0% (742 of 742 strings)

Translated using Weblate (Malay)

Currently translated at 71.2% (529 of 742 strings)

Translated using Weblate (Malay)

Currently translated at 68.8% (511 of 742 strings)

Translated using Weblate (Malay)

Currently translated at 68.8% (511 of 742 strings)

Translated using Weblate (Assamese)

Currently translated at 100.0% (742 of 742 strings)

Translated using Weblate (Vietnamese)

Currently translated at 100.0% (742 of 742 strings)

Translated using Weblate (Arabic (Levantine))

Currently translated at 75.0% (3 of 4 strings)

Translated using Weblate (Malay)

Currently translated at 67.5% (501 of 742 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (742 of 742 strings)

Translated using Weblate (Arabic)

Currently translated at 100.0% (742 of 742 strings)

Translated using Weblate (Arabic (Levantine))

Currently translated at 100.0% (742 of 742 strings)

Translated using Weblate (Malay)

Currently translated at 30.4% (226 of 742 strings)

Translated using Weblate (Croatian)

Currently translated at 99.7% (740 of 742 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (742 of 742 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 99.3% (737 of 742 strings)

Translated using Weblate (Malay)

Currently translated at 22.7% (169 of 742 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (742 of 742 strings)

Translated using Weblate (Arabic)

Currently translated at 100.0% (742 of 742 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (742 of 742 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (742 of 742 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (742 of 742 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (742 of 742 strings)

Translated using Weblate (Arabic (Levantine))

Currently translated at 100.0% (742 of 742 strings)

Translated using Weblate (Arabic (Levantine))

Currently translated at 100.0% (741 of 741 strings)

Translated using Weblate (Hindi)

Currently translated at 45.7% (339 of 741 strings)

Translated using Weblate (French)

Currently translated at 96.3% (714 of 741 strings)

Translated using Weblate (Hindi)

Currently translated at 41.8% (310 of 741 strings)

Translated using Weblate (Croatian)

Currently translated at 99.7% (739 of 741 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (741 of 741 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (741 of 741 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (741 of 741 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (741 of 741 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (741 of 741 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (741 of 741 strings)

Translated using Weblate (Arabic)

Currently translated at 100.0% (741 of 741 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Korean)

Currently translated at 98.3% (728 of 740 strings)

Translated using Weblate (Greek)

Currently translated at 95.9% (710 of 740 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (740 of 740 strings)

Translated using Weblate (Vietnamese)

Currently translated at 100.0% (740 of 740 strings)

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Turkish)

Currently translated at 100.0% (740 of 740 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (740 of 740 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (740 of 740 strings)

Translated using Weblate (Arabic (Levantine))

Currently translated at 100.0% (740 of 740 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (740 of 740 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (740 of 740 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (740 of 740 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (740 of 740 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (740 of 740 strings)

Translated using Weblate (Arabic)

Currently translated at 100.0% (740 of 740 strings)

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Vietnamese)

Currently translated at 100.0% (4 of 4 strings)

Translated using Weblate (Vietnamese)

Currently translated at 100.0% (737 of 737 strings)

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Russian)

Currently translated at 99.5% (734 of 737 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Russian)

Currently translated at 98.3% (725 of 737 strings)

Translated using Weblate (Croatian)

Currently translated at 100.0% (737 of 737 strings)

Translated using Weblate (Croatian)

Currently translated at 98.6% (727 of 737 strings)

Merge remote-tracking branch 'origin/master'

Translated using Weblate (German)

Currently translated at 99.8% (736 of 737 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (737 of 737 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (737 of 737 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (737 of 737 strings)

Translated using Weblate (Japanese)

Currently translated at 45.8% (338 of 737 strings)

Translated using Weblate (Persian)

Currently translated at 37.3% (275 of 737 strings)

Translated using Weblate (French)

Currently translated at 95.5% (704 of 737 strings)

Co-authored-by: Ahmad Danish Farhan Ahmad Zawani <danishfaz5+weblate@gmail.com>
Co-authored-by: Akshay Anurag <akshay.california@gmail.com>
Co-authored-by: Balmunk <reilria77@gmail.com>
Co-authored-by: ButterflyOfFire <boffire@users.noreply.hosted.weblate.org>
Co-authored-by: Chaya Endot <cheyenne.xyn@gmail.com>
Co-authored-by: Cloudburst <18114966+C10udburst@users.noreply.github.com>
Co-authored-by: Dan <jonweblin2205@protonmail.com>
Co-authored-by: Doctorredits_here <alkaf.alkaf2018@tutamail.com>
Co-authored-by: Fjuro <fjuro@alius.cz>
Co-authored-by: Fqwe1 <Fqwe1@users.noreply.hosted.weblate.org>
Co-authored-by: Gnkalk <github.fngyb@slmail.me>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Itsmechinmoy <itsmechinmoy@users.noreply.hosted.weblate.org>
Co-authored-by: John Titor <utkin2007@gmail.com>
Co-authored-by: Jose Delvani <jsdelvani@users.noreply.hosted.weblate.org>
Co-authored-by: Massimo Pissarello <mapi68@gmail.com>
Co-authored-by: Matthaiks <kitynska@gmail.com>
Co-authored-by: Milo Ivir <mail@milotype.de>
Co-authored-by: N. Hao <nguyenviethao2002@gmail.com>
Co-authored-by: Nifou <nifou@mailfence.com>
Co-authored-by: Pixelcode <pixelcode@dismail.de>
Co-authored-by: Pizza Party <paol.m@proton.me>
Co-authored-by: QSkill <QSkull@protonmail.com>
Co-authored-by: Rex_sa <rex.sa@pm.me>
Co-authored-by: Roberto Rojas <robertjes18@gmail.com>
Co-authored-by: Semih <semihbrn10@gmail.com>
Co-authored-by: Tiago Lucas <tiago.slucas@gmail.com>
Co-authored-by: Tomas Andersson <jotakswe@users.noreply.hosted.weblate.org>
Co-authored-by: Xenoon <vladprokopiev2008@gmail.com>
Co-authored-by: akinobu nishi <at0onsleeping@gmail.com>
Co-authored-by: bbstacks <bbstacks1225@gmail.com>
Co-authored-by: enly sure <enlysure@gmail.com>
Co-authored-by: gallegonovato <fran-carro@hotmail.es>
Co-authored-by: helpless_helper <dis.hd.eif.y.bk.ao.up@gmail.com>
Co-authored-by: kerim <kerimmkirac@gmail.com>
Co-authored-by: mustafa salah <mus120a@gmail.com>
Co-authored-by: tuan041 <tuananh163025ttt@gmail.com>
Co-authored-by: Ömer Faruk Sancak <keyiflerolsun@gmail.com>
Co-authored-by: ΣΤΑΥΡΟΣ ΔΑΛΙΑΚΟΠΟΥΛΟΣ <stavros.daliakopoulos@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/apc/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ar/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/as/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/cs/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/de/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/el/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/es/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/fa/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/fr/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/hi/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/hr/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/id/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/it/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ja/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ko/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ms/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/pl/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/pt/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/pt_BR/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ru/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/sv/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/tr/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/uk/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/vi/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/zh_Hans/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/fastlane/apc/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/fastlane/es_AR/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/fastlane/vi/
Translation: Cloudstream/App
Translation: Cloudstream/Fastlane
2024-09-22 20:55:35 +02:00
IndusAryan
0d941c98ba
renovate media3 dependency (#1316) 2024-09-22 19:56:44 +02:00
Phisher98
79df626c1a
Update PixelDrainExtractor.kt (#1342)
Enhancement for Pixeldrain Links
2024-09-22 19:38:44 +02:00
5r9
57a920201a
Fix SubDL Create Account URL (#1340) 2024-09-19 17:02:17 +02:00
Redowan Ahmed Apu
a53877ae55
Fixing some extractors (#1339)
* Changing download link to embed link

* Adding DoodLiExtractor
2024-09-17 14:37:46 +02:00
b4byhuey
6c2d4c3b87
Update Chillx.kt (#1336) 2024-09-13 21:41:13 +02:00
redblacker8
f208301de2
Added GamoVideo extractor, improved streamtape, fix mixdrop and Vidmoly (#1324) 2024-09-13 21:39:58 +02:00
firelight
9e55a19bf3
fixed very buggy code from #1228 2024-09-11 19:39:49 +02:00
int3debug
b4c5ac2490
refact: be more precise in the hint (#1330) 2024-09-11 14:40:04 +02:00
Hosted Weblate
6664e6d434 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (742 of 742 strings)

Translated using Weblate (Malay)

Currently translated at 71.2% (529 of 742 strings)

Translated using Weblate (Malay)

Currently translated at 68.8% (511 of 742 strings)

Translated using Weblate (Malay)

Currently translated at 68.8% (511 of 742 strings)

Translated using Weblate (Assamese)

Currently translated at 100.0% (742 of 742 strings)

Translated using Weblate (Vietnamese)

Currently translated at 100.0% (742 of 742 strings)

Translated using Weblate (Arabic (Levantine))

Currently translated at 75.0% (3 of 4 strings)

Translated using Weblate (Malay)

Currently translated at 67.5% (501 of 742 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (742 of 742 strings)

Translated using Weblate (Arabic)

Currently translated at 100.0% (742 of 742 strings)

Translated using Weblate (Arabic (Levantine))

Currently translated at 100.0% (742 of 742 strings)

Translated using Weblate (Malay)

Currently translated at 30.4% (226 of 742 strings)

Translated using Weblate (Croatian)

Currently translated at 99.7% (740 of 742 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (742 of 742 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 99.3% (737 of 742 strings)

Translated using Weblate (Malay)

Currently translated at 22.7% (169 of 742 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (742 of 742 strings)

Translated using Weblate (Arabic)

Currently translated at 100.0% (742 of 742 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (742 of 742 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (742 of 742 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (742 of 742 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (742 of 742 strings)

Translated using Weblate (Arabic (Levantine))

Currently translated at 100.0% (742 of 742 strings)

Translated using Weblate (Arabic (Levantine))

Currently translated at 100.0% (741 of 741 strings)

Translated using Weblate (Hindi)

Currently translated at 45.7% (339 of 741 strings)

Translated using Weblate (French)

Currently translated at 96.3% (714 of 741 strings)

Translated using Weblate (Hindi)

Currently translated at 41.8% (310 of 741 strings)

Translated using Weblate (Croatian)

Currently translated at 99.7% (739 of 741 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (741 of 741 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (741 of 741 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (741 of 741 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (741 of 741 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (741 of 741 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (741 of 741 strings)

Translated using Weblate (Arabic)

Currently translated at 100.0% (741 of 741 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Korean)

Currently translated at 98.3% (728 of 740 strings)

Translated using Weblate (Greek)

Currently translated at 95.9% (710 of 740 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (740 of 740 strings)

Translated using Weblate (Vietnamese)

Currently translated at 100.0% (740 of 740 strings)

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Turkish)

Currently translated at 100.0% (740 of 740 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (740 of 740 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (740 of 740 strings)

Translated using Weblate (Arabic (Levantine))

Currently translated at 100.0% (740 of 740 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (740 of 740 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (740 of 740 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (740 of 740 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (740 of 740 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (740 of 740 strings)

Translated using Weblate (Arabic)

Currently translated at 100.0% (740 of 740 strings)

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Vietnamese)

Currently translated at 100.0% (4 of 4 strings)

Translated using Weblate (Vietnamese)

Currently translated at 100.0% (737 of 737 strings)

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Russian)

Currently translated at 99.5% (734 of 737 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Russian)

Currently translated at 98.3% (725 of 737 strings)

Translated using Weblate (Croatian)

Currently translated at 100.0% (737 of 737 strings)

Translated using Weblate (Croatian)

Currently translated at 98.6% (727 of 737 strings)

Merge remote-tracking branch 'origin/master'

Translated using Weblate (German)

Currently translated at 99.8% (736 of 737 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (737 of 737 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (737 of 737 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (737 of 737 strings)

Translated using Weblate (Japanese)

Currently translated at 45.8% (338 of 737 strings)

Translated using Weblate (Persian)

Currently translated at 37.3% (275 of 737 strings)

Translated using Weblate (French)

Currently translated at 95.5% (704 of 737 strings)

Co-authored-by: Ahmad Danish Farhan Ahmad Zawani <danishfaz5+weblate@gmail.com>
Co-authored-by: Akshay Anurag <akshay.california@gmail.com>
Co-authored-by: Balmunk <reilria77@gmail.com>
Co-authored-by: Chaya Endot <cheyenne.xyn@gmail.com>
Co-authored-by: Cloudburst <18114966+C10udburst@users.noreply.github.com>
Co-authored-by: Dan <jonweblin2205@protonmail.com>
Co-authored-by: Fjuro <fjuro@alius.cz>
Co-authored-by: Fqwe1 <Fqwe1@users.noreply.hosted.weblate.org>
Co-authored-by: Gnkalk <github.fngyb@slmail.me>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Itsmechinmoy <itsmechinmoy@users.noreply.hosted.weblate.org>
Co-authored-by: John Titor <utkin2007@gmail.com>
Co-authored-by: Jose Delvani <jsdelvani@users.noreply.hosted.weblate.org>
Co-authored-by: Massimo Pissarello <mapi68@gmail.com>
Co-authored-by: Matthaiks <kitynska@gmail.com>
Co-authored-by: Milo Ivir <mail@milotype.de>
Co-authored-by: N. Hao <nguyenviethao2002@gmail.com>
Co-authored-by: Nifou <nifou@mailfence.com>
Co-authored-by: Pixelcode <pixelcode@dismail.de>
Co-authored-by: Pizza Party <paol.m@proton.me>
Co-authored-by: QSkill <QSkull@protonmail.com>
Co-authored-by: Rex_sa <rex.sa@pm.me>
Co-authored-by: Semih <semihbrn10@gmail.com>
Co-authored-by: akinobu nishi <at0onsleeping@gmail.com>
Co-authored-by: bbstacks <bbstacks1225@gmail.com>
Co-authored-by: enly sure <enlysure@gmail.com>
Co-authored-by: gallegonovato <fran-carro@hotmail.es>
Co-authored-by: helpless_helper <dis.hd.eif.y.bk.ao.up@gmail.com>
Co-authored-by: mustafa salah <mus120a@gmail.com>
Co-authored-by: tuan041 <tuananh163025ttt@gmail.com>
Co-authored-by: Ömer Faruk Sancak <keyiflerolsun@gmail.com>
Co-authored-by: ΣΤΑΥΡΟΣ ΔΑΛΙΑΚΟΠΟΥΛΟΣ <stavros.daliakopoulos@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/apc/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ar/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/as/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/cs/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/de/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/el/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/es/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/fa/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/fr/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/hi/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/hr/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/it/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ja/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ko/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ms/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/pl/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/pt_BR/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ru/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/tr/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/uk/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/vi/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/zh_Hans/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/fastlane/apc/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/fastlane/vi/
Translation: Cloudstream/App
Translation: Cloudstream/Fastlane
2024-09-08 19:14:54 +02:00
Cloudburst
1a211f7b3b
fix dokka & newpipe build issue (#1326) 2024-09-08 19:14:30 +02:00
firelight
984daeb3a2
fixed imports 2024-08-31 03:59:57 +02:00
KingLucius
9f2c05747d
feat(UI): Hide Navigation footer on Mobile UI (#1312) 2024-08-31 03:56:41 +02:00
firelight
b95f8ee211
fixed downloads on non resumable streams (over 100%) 2024-08-31 03:50:47 +02:00
KingLucius
660129147a
feat(TV UI): Navigation rail redesign (#1252) 2024-08-27 23:51:43 +02:00
KingLucius
4961394697
feat(UI): Fix sync icon size (#1299) 2024-08-27 23:30:03 +02:00
CranberrySoup
973c4ee7ce
Subtitle offset preview (#1305) 2024-08-27 23:26:04 +02:00
b4byhuey
f3f4009fe1
Fix DoodExtractor (#1303) 2024-08-27 16:59:08 +02:00
redblacker8
e6766f4c0c
Fixed okru extractor (#1301)
Co-authored-by: misajimenezmx <misajimenez.mx@gmail.com>
2024-08-24 23:44:44 +02:00
b4byhuey
52fa1838c8
Improved VidhidePro + Added Lulustream (#1298) 2024-08-24 03:23:54 +02:00
Misael Jiménez
444a72dbf6
Fixed VidGuard and StreamSilk extractors (#1292) 2024-08-23 18:41:39 +02:00
Misael Jiménez
bddd5310da
Fix StreamWishExtractor and Voe (#1288) 2024-08-21 17:48:44 +02:00
b4byhuey
aadcbb45c6
Update Chillx Extractor (#1289) 2024-08-21 17:47:10 +02:00
Misael Jiménez
68a17d0d8f
Added StreamSilk extractor. (#1290) 2024-08-21 17:44:50 +02:00
RowdyRushya
87bd622781
update vidsrc2to encryption (#1287) 2024-08-21 00:25:06 +02:00
Misael Jiménez
7bdf146187
Added VidHidePro Extractor (#1286) 2024-08-19 22:49:11 +02:00
RowdyRushya
adb8dc26ea
update vidplay encryption (#1285) 2024-08-19 19:58:52 +02:00
firelight
711cc687ac
fix trailer issue 2024-08-18 01:19:45 +02:00
CranberrySoup
ee7abbfa01
Update media dependency (#1275) 2024-08-18 01:12:55 +02:00
aicynide
6160f4d94a
feat: add mpv+ytdl app (#1274) 2024-08-18 01:02:42 +02:00
firelight
06979781cd
Revert "Updated VidhideExtractor (#1279)" (#1284)
This reverts commit ee52d355c7.
2024-08-18 01:01:50 +02:00
Misael Jiménez
ee52d355c7
Updated VidhideExtractor (#1279) 2024-08-16 19:26:18 +02:00
Luna712
d67fc368fd
Fix BackPressedCallback conflict between activities (#1258) 2024-08-16 19:22:31 +02:00
Hosted Weblate
71a98bc396 Translated using Weblate (Greek)
Currently translated at 95.9% (710 of 740 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (740 of 740 strings)

Translated using Weblate (Vietnamese)

Currently translated at 100.0% (740 of 740 strings)

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Turkish)

Currently translated at 100.0% (740 of 740 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (740 of 740 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (740 of 740 strings)

Translated using Weblate (Arabic (Levantine))

Currently translated at 100.0% (740 of 740 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (740 of 740 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (740 of 740 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (740 of 740 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (740 of 740 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (740 of 740 strings)

Translated using Weblate (Arabic)

Currently translated at 100.0% (740 of 740 strings)

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Vietnamese)

Currently translated at 100.0% (4 of 4 strings)

Translated using Weblate (Vietnamese)

Currently translated at 100.0% (737 of 737 strings)

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Russian)

Currently translated at 99.5% (734 of 737 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Russian)

Currently translated at 98.3% (725 of 737 strings)

Translated using Weblate (Croatian)

Currently translated at 100.0% (737 of 737 strings)

Translated using Weblate (Croatian)

Currently translated at 98.6% (727 of 737 strings)

Merge remote-tracking branch 'origin/master'

Translated using Weblate (German)

Currently translated at 99.8% (736 of 737 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (737 of 737 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (737 of 737 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (737 of 737 strings)

Translated using Weblate (Japanese)

Currently translated at 45.8% (338 of 737 strings)

Translated using Weblate (Persian)

Currently translated at 37.3% (275 of 737 strings)

Translated using Weblate (French)

Currently translated at 95.5% (704 of 737 strings)

Co-authored-by: Cloudburst <18114966+C10udburst@users.noreply.github.com>
Co-authored-by: Dan <jonweblin2205@protonmail.com>
Co-authored-by: Fjuro <fjuro@alius.cz>
Co-authored-by: Fqwe1 <Fqwe1@users.noreply.hosted.weblate.org>
Co-authored-by: Gnkalk <github.fngyb@slmail.me>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: John Titor <utkin2007@gmail.com>
Co-authored-by: Jose Delvani <jsdelvani@users.noreply.hosted.weblate.org>
Co-authored-by: Massimo Pissarello <mapi68@gmail.com>
Co-authored-by: Matthaiks <kitynska@gmail.com>
Co-authored-by: Milo Ivir <mail@milotype.de>
Co-authored-by: Pixelcode <pixelcode@dismail.de>
Co-authored-by: Pizza Party <paol.m@proton.me>
Co-authored-by: Rex_sa <rex.sa@pm.me>
Co-authored-by: Semih <semihbrn10@gmail.com>
Co-authored-by: akinobu nishi <at0onsleeping@gmail.com>
Co-authored-by: gallegonovato <fran-carro@hotmail.es>
Co-authored-by: tuan041 <tuananh163025ttt@gmail.com>
Co-authored-by: Ömer Faruk Sancak <keyiflerolsun@gmail.com>
Co-authored-by: ΣΤΑΥΡΟΣ ΔΑΛΙΑΚΟΠΟΥΛΟΣ <stavros.daliakopoulos@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/apc/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ar/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/cs/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/de/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/el/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/es/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/fa/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/fr/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/hr/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/it/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ja/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/pl/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/pt_BR/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ru/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/tr/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/uk/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/vi/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/fastlane/vi/
Translation: Cloudstream/App
Translation: Cloudstream/Fastlane
2024-08-15 17:24:10 +02:00
b4byhuey
6158bac1ca
Update StreamWishExtractor (#1264) 2024-08-15 17:20:27 +02:00
Gian-Fr
4d3ab40093
Updated SuperVideo extractor url from supervideo.tv to supervideo.cc (#1265) 2024-08-12 04:04:14 +02:00
int3debug
c4ccc5d351
feat(ui): settings for thumbnail on seekbar (#1256) 2024-08-09 00:34:26 +02:00
Phisher98
fcac19737c
Update VidSrcTo.kt Domain Changed (#1257)
Vidsrc is changed from to to cc
2024-08-07 15:47:15 +02:00
Luna712
77dc9f7484
Add support for progress on header downloads (#1238) 2024-08-05 20:57:51 +02:00
Luna712
f6a65f38db
Add support for Next Episode in downloads (#1228) 2024-08-05 20:49:04 +02:00
CranberrySoup
4d9a080341
Create jitpack.yml (#1248) 2024-08-04 15:59:57 +02:00
CranberrySoup
7936ccf5d3
Update FcastManager.kt (#1244) 2024-08-02 12:30:37 +02:00
recloudstream[bot]
15b5013e28 chore(locales): fix locale issues 2024-08-02 09:40:37 +00:00
Hosted Weblate
6f522828a4 Update translation files
Updated by "Remove blank strings" hook in Weblate.

Translated using Weblate (Amharic)

Currently translated at 28.9% (213 of 737 strings)

Translated using Weblate (Filipino)

Currently translated at 14.6% (108 of 737 strings)

Translated using Weblate (Arabic (Najdi))

Currently translated at 60.2% (444 of 737 strings)

Translated using Weblate (Malay)

Currently translated at 21.9% (162 of 737 strings)

Translated using Weblate (qt (generated) (qt))

Currently translated at 100.0% (737 of 737 strings)

Translated using Weblate (Portuguese)

Currently translated at 95.2% (702 of 737 strings)

Translated using Weblate (Tamil)

Currently translated at 94.0% (693 of 737 strings)

Co-authored-by: Beabfekad Zikie <beabfekadz@gmail.com>
Co-authored-by: Cloudburst <18114966+C10udburst@users.noreply.github.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Sam Cooper <samcooper838@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/am/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ars/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/fil/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ms/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/pt/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/qt/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ta/
Translation: Cloudstream/App
2024-08-02 11:40:24 +02:00
Cloudburst
ad727b96cf
[skip ci] match weblate xml style 2024-08-02 11:40:03 +02:00
recloudstream[bot]
67e278b2b7 chore(locales): fix locale issues 2024-08-02 09:20:56 +00:00
Hosted Weblate
7f1cba99e4 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (737 of 737 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (737 of 737 strings)

Translated using Weblate (German)

Currently translated at 98.6% (727 of 737 strings)

Translated using Weblate (qt (generated) (qt))

Currently translated at 100.0% (737 of 737 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (737 of 737 strings)

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Arabic (Levantine))

Currently translated at 100.0% (737 of 737 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (737 of 737 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (737 of 737 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (737 of 737 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (737 of 737 strings)

Translated using Weblate (Arabic)

Currently translated at 100.0% (737 of 737 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (727 of 727 strings)

Translated using Weblate (Russian)

Currently translated at 96.9% (705 of 727 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (727 of 727 strings)

Translated using Weblate (Arabic (Levantine))

Currently translated at 100.0% (727 of 727 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (727 of 727 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (727 of 727 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (727 of 727 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (727 of 727 strings)

Translated using Weblate (Arabic)

Currently translated at 100.0% (727 of 727 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Italian)

Currently translated at 100.0% (725 of 725 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (725 of 725 strings)

Translated using Weblate (Arabic)

Currently translated at 100.0% (725 of 725 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (725 of 725 strings)

Translated using Weblate (Arabic (Levantine))

Currently translated at 100.0% (725 of 725 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (725 of 725 strings)

Translated using Weblate (German)

Currently translated at 99.7% (723 of 725 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (725 of 725 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (725 of 725 strings)

Translated using Weblate (Arabic (Levantine))

Currently translated at 99.7% (723 of 725 strings)

Translated using Weblate (German)

Currently translated at 96.8% (702 of 725 strings)

Update translation files

Updated by "Remove blank strings" hook in Weblate.

Translated using Weblate (Assamese)

Currently translated at 97.3% (706 of 725 strings)

Translated using Weblate (Assamese)

Currently translated at 97.3% (706 of 725 strings)

Translated using Weblate (Maltese)

Currently translated at 31.5% (229 of 725 strings)

Translated using Weblate (Maltese)

Currently translated at 31.5% (229 of 725 strings)

Translated using Weblate (Nepali)

Currently translated at 32.0% (232 of 725 strings)

Translated using Weblate (Nepali)

Currently translated at 32.0% (232 of 725 strings)

Translated using Weblate (Nepali)

Currently translated at 32.0% (232 of 725 strings)

Translated using Weblate (Nepali)

Currently translated at 32.0% (232 of 725 strings)

Translated using Weblate (Afrikaans)

Currently translated at 29.1% (211 of 725 strings)

Translated using Weblate (Afrikaans)

Currently translated at 29.1% (211 of 725 strings)

Translated using Weblate (Afrikaans)

Currently translated at 29.1% (211 of 725 strings)

Translated using Weblate (Lithuanian)

Currently translated at 45.1% (327 of 725 strings)

Translated using Weblate (Lithuanian)

Currently translated at 45.1% (327 of 725 strings)

Translated using Weblate (Lithuanian)

Currently translated at 45.1% (327 of 725 strings)

Translated using Weblate (Lithuanian)

Currently translated at 45.1% (327 of 725 strings)

Translated using Weblate (Arabic (Levantine))

Currently translated at 99.1% (719 of 725 strings)

Translated using Weblate (Arabic (Levantine))

Currently translated at 99.1% (719 of 725 strings)

Translated using Weblate (Amharic)

Currently translated at 29.2% (212 of 725 strings)

Translated using Weblate (Amharic)

Currently translated at 29.2% (212 of 725 strings)

Translated using Weblate (Amharic)

Currently translated at 29.2% (212 of 725 strings)

Translated using Weblate (Amharic)

Currently translated at 29.2% (212 of 725 strings)

Translated using Weblate (Amharic)

Currently translated at 29.2% (212 of 725 strings)

Translated using Weblate (Amharic)

Currently translated at 29.2% (212 of 725 strings)

Translated using Weblate (Tigrinya)

Currently translated at 15.1% (110 of 725 strings)

Translated using Weblate (Tigrinya)

Currently translated at 15.1% (110 of 725 strings)

Translated using Weblate (Tigrinya)

Currently translated at 15.1% (110 of 725 strings)

Translated using Weblate (Tigrinya)

Currently translated at 15.1% (110 of 725 strings)

Translated using Weblate (Filipino)

Currently translated at 14.7% (107 of 725 strings)

Translated using Weblate (Filipino)

Currently translated at 14.7% (107 of 725 strings)

Translated using Weblate (Filipino)

Currently translated at 14.7% (107 of 725 strings)

Translated using Weblate (Filipino)

Currently translated at 14.7% (107 of 725 strings)

Translated using Weblate (Burmese)

Currently translated at 86.2% (625 of 725 strings)

Translated using Weblate (Burmese)

Currently translated at 86.2% (625 of 725 strings)

Translated using Weblate (Burmese)

Currently translated at 86.2% (625 of 725 strings)

Translated using Weblate (Burmese)

Currently translated at 86.2% (625 of 725 strings)

Translated using Weblate (Galician)

Currently translated at 36.4% (264 of 725 strings)

Translated using Weblate (Galician)

Currently translated at 36.4% (264 of 725 strings)

Translated using Weblate (Galician)

Currently translated at 36.4% (264 of 725 strings)

Translated using Weblate (Galician)

Currently translated at 36.4% (264 of 725 strings)

Translated using Weblate (Galician)

Currently translated at 36.4% (264 of 725 strings)

Translated using Weblate (Odia)

Currently translated at 36.4% (264 of 725 strings)

Translated using Weblate (Odia)

Currently translated at 36.4% (264 of 725 strings)

Translated using Weblate (Odia)

Currently translated at 36.4% (264 of 725 strings)

Translated using Weblate (Odia)

Currently translated at 36.4% (264 of 725 strings)

Translated using Weblate (Korean)

Currently translated at 97.1% (704 of 725 strings)

Translated using Weblate (Korean)

Currently translated at 97.1% (704 of 725 strings)

Translated using Weblate (Korean)

Currently translated at 97.1% (704 of 725 strings)

Translated using Weblate (Arabic (Najdi))

Currently translated at 61.1% (443 of 725 strings)

Translated using Weblate (Arabic (Najdi))

Currently translated at 61.1% (443 of 725 strings)

Translated using Weblate (Arabic (Najdi))

Currently translated at 61.1% (443 of 725 strings)

Translated using Weblate (Arabic (Najdi))

Currently translated at 61.1% (443 of 725 strings)

Translated using Weblate (Arabic (Najdi))

Currently translated at 61.1% (443 of 725 strings)

Translated using Weblate (Latvian)

Currently translated at 83.8% (608 of 725 strings)

Translated using Weblate (Latvian)

Currently translated at 83.8% (608 of 725 strings)

Translated using Weblate (Latvian)

Currently translated at 83.8% (608 of 725 strings)

Translated using Weblate (Latvian)

Currently translated at 83.8% (608 of 725 strings)

Translated using Weblate (Malay)

Currently translated at 22.6% (164 of 725 strings)

Translated using Weblate (Malay)

Currently translated at 22.6% (164 of 725 strings)

Translated using Weblate (Malay)

Currently translated at 22.6% (164 of 725 strings)

Translated using Weblate (Malay)

Currently translated at 22.6% (164 of 725 strings)

Translated using Weblate (Malay)

Currently translated at 22.6% (164 of 725 strings)

Translated using Weblate (Malay)

Currently translated at 22.6% (164 of 725 strings)

Translated using Weblate (Malay)

Currently translated at 22.6% (164 of 725 strings)

Translated using Weblate (Japanese)

Currently translated at 46.3% (336 of 725 strings)

Translated using Weblate (Japanese)

Currently translated at 46.3% (336 of 725 strings)

Translated using Weblate (Japanese)

Currently translated at 46.3% (336 of 725 strings)

Translated using Weblate (Japanese)

Currently translated at 46.3% (336 of 725 strings)

Translated using Weblate (Japanese)

Currently translated at 46.3% (336 of 725 strings)

Translated using Weblate (Japanese)

Currently translated at 46.3% (336 of 725 strings)

Translated using Weblate (qt (generated) (qt))

Currently translated at 47.0% (341 of 725 strings)

Translated using Weblate (qt (generated) (qt))

Currently translated at 47.0% (341 of 725 strings)

Translated using Weblate (qt (generated) (qt))

Currently translated at 47.0% (341 of 725 strings)

Translated using Weblate (qt (generated) (qt))

Currently translated at 47.0% (341 of 725 strings)

Translated using Weblate (qt (generated) (qt))

Currently translated at 47.0% (341 of 725 strings)

Translated using Weblate (qt (generated) (qt))

Currently translated at 47.0% (341 of 725 strings)

Translated using Weblate (Slovak)

Currently translated at 64.2% (466 of 725 strings)

Translated using Weblate (Slovak)

Currently translated at 64.2% (466 of 725 strings)

Translated using Weblate (Slovak)

Currently translated at 64.2% (466 of 725 strings)

Translated using Weblate (Slovak)

Currently translated at 64.2% (466 of 725 strings)

Translated using Weblate (Slovak)

Currently translated at 64.2% (466 of 725 strings)

Translated using Weblate (Slovak)

Currently translated at 64.2% (466 of 725 strings)

Translated using Weblate (Portuguese)

Currently translated at 96.8% (702 of 725 strings)

Translated using Weblate (Portuguese)

Currently translated at 96.8% (702 of 725 strings)

Translated using Weblate (Portuguese)

Currently translated at 96.8% (702 of 725 strings)

Translated using Weblate (Portuguese)

Currently translated at 96.8% (702 of 725 strings)

Translated using Weblate (Portuguese)

Currently translated at 96.8% (702 of 725 strings)

Translated using Weblate (Portuguese)

Currently translated at 96.8% (702 of 725 strings)

Translated using Weblate (Somali)

Currently translated at 77.5% (562 of 725 strings)

Translated using Weblate (Somali)

Currently translated at 77.5% (562 of 725 strings)

Translated using Weblate (Somali)

Currently translated at 77.5% (562 of 725 strings)

Translated using Weblate (Somali)

Currently translated at 77.5% (562 of 725 strings)

Translated using Weblate (Somali)

Currently translated at 77.5% (562 of 725 strings)

Translated using Weblate (Somali)

Currently translated at 77.5% (562 of 725 strings)

Translated using Weblate (Norwegian Nynorsk)

Currently translated at 40.5% (294 of 725 strings)

Translated using Weblate (Norwegian Nynorsk)

Currently translated at 40.5% (294 of 725 strings)

Translated using Weblate (Norwegian Nynorsk)

Currently translated at 40.5% (294 of 725 strings)

Translated using Weblate (Norwegian Nynorsk)

Currently translated at 40.5% (294 of 725 strings)

Translated using Weblate (Norwegian Nynorsk)

Currently translated at 40.5% (294 of 725 strings)

Translated using Weblate (Norwegian Nynorsk)

Currently translated at 40.5% (294 of 725 strings)

Translated using Weblate (Norwegian Nynorsk)

Currently translated at 40.5% (294 of 725 strings)

Translated using Weblate (Ukrainian)

Currently translated at 99.1% (719 of 725 strings)

Translated using Weblate (Ukrainian)

Currently translated at 99.1% (719 of 725 strings)

Translated using Weblate (Ukrainian)

Currently translated at 99.1% (719 of 725 strings)

Translated using Weblate (Ukrainian)

Currently translated at 99.1% (719 of 725 strings)

Translated using Weblate (Esperanto)

Currently translated at 31.4% (228 of 725 strings)

Translated using Weblate (Esperanto)

Currently translated at 31.4% (228 of 725 strings)

Translated using Weblate (Esperanto)

Currently translated at 31.4% (228 of 725 strings)

Translated using Weblate (Esperanto)

Currently translated at 31.4% (228 of 725 strings)

Translated using Weblate (Esperanto)

Currently translated at 31.4% (228 of 725 strings)

Translated using Weblate (Esperanto)

Currently translated at 31.4% (228 of 725 strings)

Translated using Weblate (Esperanto)

Currently translated at 31.4% (228 of 725 strings)

Translated using Weblate (Persian)

Currently translated at 34.0% (247 of 725 strings)

Translated using Weblate (Persian)

Currently translated at 34.0% (247 of 725 strings)

Translated using Weblate (Persian)

Currently translated at 34.0% (247 of 725 strings)

Translated using Weblate (Persian)

Currently translated at 34.0% (247 of 725 strings)

Translated using Weblate (Persian)

Currently translated at 34.0% (247 of 725 strings)

Translated using Weblate (Persian)

Currently translated at 34.0% (247 of 725 strings)

Translated using Weblate (Hungarian)

Currently translated at 88.6% (643 of 725 strings)

Translated using Weblate (Hungarian)

Currently translated at 88.6% (643 of 725 strings)

Translated using Weblate (Hungarian)

Currently translated at 88.6% (643 of 725 strings)

Translated using Weblate (Hungarian)

Currently translated at 88.6% (643 of 725 strings)

Translated using Weblate (Hungarian)

Currently translated at 88.6% (643 of 725 strings)

Translated using Weblate (German)

Currently translated at 96.6% (701 of 725 strings)

Translated using Weblate (German)

Currently translated at 96.6% (701 of 725 strings)

Translated using Weblate (German)

Currently translated at 96.6% (701 of 725 strings)

Translated using Weblate (German)

Currently translated at 96.6% (701 of 725 strings)

Translated using Weblate (German)

Currently translated at 96.6% (701 of 725 strings)

Translated using Weblate (Spanish)

Currently translated at 99.1% (719 of 725 strings)

Translated using Weblate (Spanish)

Currently translated at 99.1% (719 of 725 strings)

Translated using Weblate (Spanish)

Currently translated at 99.1% (719 of 725 strings)

Translated using Weblate (Russian)

Currently translated at 97.2% (705 of 725 strings)

Translated using Weblate (Russian)

Currently translated at 97.2% (705 of 725 strings)

Translated using Weblate (Russian)

Currently translated at 97.2% (705 of 725 strings)

Translated using Weblate (Russian)

Currently translated at 97.2% (705 of 725 strings)

Translated using Weblate (Russian)

Currently translated at 97.2% (705 of 725 strings)

Translated using Weblate (Russian)

Currently translated at 97.2% (705 of 725 strings)

Translated using Weblate (Kannada)

Currently translated at 32.4% (235 of 725 strings)

Translated using Weblate (Kannada)

Currently translated at 32.4% (235 of 725 strings)

Translated using Weblate (Kannada)

Currently translated at 32.4% (235 of 725 strings)

Translated using Weblate (Kannada)

Currently translated at 32.4% (235 of 725 strings)

Translated using Weblate (Kannada)

Currently translated at 32.4% (235 of 725 strings)

Translated using Weblate (Kannada)

Currently translated at 32.4% (235 of 725 strings)

Translated using Weblate (Kannada)

Currently translated at 32.4% (235 of 725 strings)

Translated using Weblate (Urdu)

Currently translated at 96.8% (702 of 725 strings)

Translated using Weblate (Urdu)

Currently translated at 96.8% (702 of 725 strings)

Translated using Weblate (Urdu)

Currently translated at 96.8% (702 of 725 strings)

Translated using Weblate (Urdu)

Currently translated at 96.8% (702 of 725 strings)

Translated using Weblate (Urdu)

Currently translated at 96.8% (702 of 725 strings)

Translated using Weblate (Tamil)

Currently translated at 97.3% (706 of 725 strings)

Translated using Weblate (Tamil)

Currently translated at 97.3% (706 of 725 strings)

Translated using Weblate (Tamil)

Currently translated at 97.3% (706 of 725 strings)

Translated using Weblate (Tamil)

Currently translated at 97.3% (706 of 725 strings)

Translated using Weblate (Hebrew)

Currently translated at 86.2% (625 of 725 strings)

Translated using Weblate (Hebrew)

Currently translated at 86.2% (625 of 725 strings)

Translated using Weblate (Hebrew)

Currently translated at 86.2% (625 of 725 strings)

Translated using Weblate (Hebrew)

Currently translated at 86.2% (625 of 725 strings)

Translated using Weblate (Hebrew)

Currently translated at 86.2% (625 of 725 strings)

Translated using Weblate (Hebrew)

Currently translated at 86.2% (625 of 725 strings)

Translated using Weblate (Hebrew)

Currently translated at 86.2% (625 of 725 strings)

Translated using Weblate (Bengali)

Currently translated at 63.5% (461 of 725 strings)

Translated using Weblate (Bengali)

Currently translated at 63.5% (461 of 725 strings)

Translated using Weblate (Bengali)

Currently translated at 63.5% (461 of 725 strings)

Translated using Weblate (Bengali)

Currently translated at 63.5% (461 of 725 strings)

Translated using Weblate (Bengali)

Currently translated at 63.5% (461 of 725 strings)

Translated using Weblate (Bengali)

Currently translated at 63.5% (461 of 725 strings)

Translated using Weblate (Bengali)

Currently translated at 63.5% (461 of 725 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 97.5% (707 of 725 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 97.5% (707 of 725 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 97.5% (707 of 725 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 97.5% (707 of 725 strings)

Translated using Weblate (Chinese (Traditional))

Currently translated at 97.5% (707 of 725 strings)

Translated using Weblate (Vietnamese)

Currently translated at 98.6% (715 of 725 strings)

Translated using Weblate (Vietnamese)

Currently translated at 98.6% (715 of 725 strings)

Translated using Weblate (Vietnamese)

Currently translated at 98.6% (715 of 725 strings)

Translated using Weblate (Vietnamese)

Currently translated at 98.6% (715 of 725 strings)

Translated using Weblate (Vietnamese)

Currently translated at 98.6% (715 of 725 strings)

Translated using Weblate (Turkish)

Currently translated at 99.1% (719 of 725 strings)

Translated using Weblate (Turkish)

Currently translated at 99.1% (719 of 725 strings)

Translated using Weblate (Turkish)

Currently translated at 99.1% (719 of 725 strings)

Translated using Weblate (Turkish)

Currently translated at 99.1% (719 of 725 strings)

Translated using Weblate (Turkish)

Currently translated at 99.1% (719 of 725 strings)

Translated using Weblate (Tagalog)

Currently translated at 48.4% (351 of 725 strings)

Translated using Weblate (Tagalog)

Currently translated at 48.4% (351 of 725 strings)

Translated using Weblate (Tagalog)

Currently translated at 48.4% (351 of 725 strings)

Translated using Weblate (Tagalog)

Currently translated at 48.4% (351 of 725 strings)

Translated using Weblate (Tagalog)

Currently translated at 48.4% (351 of 725 strings)

Translated using Weblate (Tagalog)

Currently translated at 48.4% (351 of 725 strings)

Translated using Weblate (Swedish)

Currently translated at 97.7% (709 of 725 strings)

Translated using Weblate (Swedish)

Currently translated at 97.7% (709 of 725 strings)

Translated using Weblate (Swedish)

Currently translated at 97.7% (709 of 725 strings)

Translated using Weblate (Swedish)

Currently translated at 97.7% (709 of 725 strings)

Translated using Weblate (Swedish)

Currently translated at 97.7% (709 of 725 strings)

Translated using Weblate (Romanian)

Currently translated at 97.5% (707 of 725 strings)

Translated using Weblate (Romanian)

Currently translated at 97.5% (707 of 725 strings)

Translated using Weblate (Romanian)

Currently translated at 97.5% (707 of 725 strings)

Translated using Weblate (Polish)

Currently translated at 99.1% (719 of 725 strings)

Translated using Weblate (Polish)

Currently translated at 99.1% (719 of 725 strings)

Translated using Weblate (Polish)

Currently translated at 99.1% (719 of 725 strings)

Translated using Weblate (Polish)

Currently translated at 99.1% (719 of 725 strings)

Translated using Weblate (Polish)

Currently translated at 99.1% (719 of 725 strings)

Translated using Weblate (Norwegian Bokmål)

Currently translated at 82.3% (597 of 725 strings)

Translated using Weblate (Norwegian Bokmål)

Currently translated at 82.3% (597 of 725 strings)

Translated using Weblate (Norwegian Bokmål)

Currently translated at 82.3% (597 of 725 strings)

Translated using Weblate (Norwegian Bokmål)

Currently translated at 82.3% (597 of 725 strings)

Translated using Weblate (Norwegian Bokmål)

Currently translated at 82.3% (597 of 725 strings)

Translated using Weblate (Dutch)

Currently translated at 90.3% (655 of 725 strings)

Translated using Weblate (Dutch)

Currently translated at 90.3% (655 of 725 strings)

Translated using Weblate (Dutch)

Currently translated at 90.3% (655 of 725 strings)

Translated using Weblate (Dutch)

Currently translated at 90.3% (655 of 725 strings)

Translated using Weblate (Dutch)

Currently translated at 90.3% (655 of 725 strings)

Translated using Weblate (Malayalam)

Currently translated at 47.1% (342 of 725 strings)

Translated using Weblate (Malayalam)

Currently translated at 47.1% (342 of 725 strings)

Translated using Weblate (Malayalam)

Currently translated at 47.1% (342 of 725 strings)

Translated using Weblate (Malayalam)

Currently translated at 47.1% (342 of 725 strings)

Translated using Weblate (Malayalam)

Currently translated at 47.1% (342 of 725 strings)

Translated using Weblate (Malayalam)

Currently translated at 47.1% (342 of 725 strings)

Translated using Weblate (Malayalam)

Currently translated at 47.1% (342 of 725 strings)

Translated using Weblate (Macedonian)

Currently translated at 97.3% (706 of 725 strings)

Translated using Weblate (Macedonian)

Currently translated at 97.3% (706 of 725 strings)

Translated using Weblate (Macedonian)

Currently translated at 97.3% (706 of 725 strings)

Translated using Weblate (Macedonian)

Currently translated at 97.3% (706 of 725 strings)

Translated using Weblate (Italian)

Currently translated at 99.1% (719 of 725 strings)

Translated using Weblate (Italian)

Currently translated at 99.1% (719 of 725 strings)

Translated using Weblate (Italian)

Currently translated at 99.1% (719 of 725 strings)

Translated using Weblate (Italian)

Currently translated at 99.1% (719 of 725 strings)

Translated using Weblate (Italian)

Currently translated at 99.1% (719 of 725 strings)

Translated using Weblate (Italian)

Currently translated at 99.1% (719 of 725 strings)

Translated using Weblate (Indonesian)

Currently translated at 97.7% (709 of 725 strings)

Translated using Weblate (Indonesian)

Currently translated at 97.7% (709 of 725 strings)

Translated using Weblate (Indonesian)

Currently translated at 97.7% (709 of 725 strings)

Translated using Weblate (Indonesian)

Currently translated at 97.7% (709 of 725 strings)

Translated using Weblate (Croatian)

Currently translated at 98.0% (711 of 725 strings)

Translated using Weblate (Croatian)

Currently translated at 98.0% (711 of 725 strings)

Translated using Weblate (Hindi)

Currently translated at 41.9% (304 of 725 strings)

Translated using Weblate (Hindi)

Currently translated at 41.9% (304 of 725 strings)

Translated using Weblate (Hindi)

Currently translated at 41.9% (304 of 725 strings)

Translated using Weblate (Hindi)

Currently translated at 41.9% (304 of 725 strings)

Translated using Weblate (Hindi)

Currently translated at 41.9% (304 of 725 strings)

Translated using Weblate (Hindi)

Currently translated at 41.9% (304 of 725 strings)

Translated using Weblate (Hindi)

Currently translated at 41.9% (304 of 725 strings)

Translated using Weblate (French)

Currently translated at 96.9% (703 of 725 strings)

Translated using Weblate (French)

Currently translated at 96.9% (703 of 725 strings)

Translated using Weblate (French)

Currently translated at 96.9% (703 of 725 strings)

Translated using Weblate (French)

Currently translated at 96.9% (703 of 725 strings)

Translated using Weblate (French)

Currently translated at 96.9% (703 of 725 strings)

Translated using Weblate (French)

Currently translated at 96.9% (703 of 725 strings)

Translated using Weblate (Greek)

Currently translated at 97.6% (708 of 725 strings)

Translated using Weblate (Greek)

Currently translated at 97.6% (708 of 725 strings)

Translated using Weblate (Greek)

Currently translated at 97.6% (708 of 725 strings)

Translated using Weblate (Greek)

Currently translated at 97.6% (708 of 725 strings)

Translated using Weblate (Czech)

Currently translated at 99.1% (719 of 725 strings)

Translated using Weblate (Czech)

Currently translated at 99.1% (719 of 725 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 99.1% (719 of 725 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 99.1% (719 of 725 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 99.1% (719 of 725 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 99.1% (719 of 725 strings)

Translated using Weblate (Bulgarian)

Currently translated at 93.7% (680 of 725 strings)

Translated using Weblate (Bulgarian)

Currently translated at 93.7% (680 of 725 strings)

Translated using Weblate (Bulgarian)

Currently translated at 93.7% (680 of 725 strings)

Translated using Weblate (Bulgarian)

Currently translated at 93.7% (680 of 725 strings)

Translated using Weblate (Bulgarian)

Currently translated at 93.7% (680 of 725 strings)

Translated using Weblate (Arabic)

Currently translated at 99.1% (719 of 725 strings)

Translated using Weblate (Arabic)

Currently translated at 99.1% (719 of 725 strings)

Translated using Weblate (Arabic)

Currently translated at 99.1% (719 of 725 strings)

Translated using Weblate (Arabic)

Currently translated at 99.1% (719 of 725 strings)

Co-authored-by: --//-- <htetoh2006@outlook.com>
Co-authored-by: Aayush Shah <shahaayush999@gmail.com>
Co-authored-by: Abinanthankv <abinanthankv@protonmail.com>
Co-authored-by: Ahmed seif al-nasr <ahmdsyfalnsr2@gmail.com>
Co-authored-by: Alessandro Burzio <alebu3007@gmail.com>
Co-authored-by: Alex Georgiou <alexandrosgeorgiou35@gmail.com>
Co-authored-by: Alexander Svärd <genc.demiri@hotmail.com>
Co-authored-by: Alexandru <negrualexandru52@gmail.com>
Co-authored-by: Allan Nordhøy <epost@anotheragency.no>
Co-authored-by: Anarchydr <patrikpik879@gmail.com>
Co-authored-by: Anonymous <noreply@weblate.org>
Co-authored-by: Astrid <github@astrid.exposed>
Co-authored-by: Aydın <mtahaydn@gmail.com>
Co-authored-by: Beabfekad Zikie <beabfekadz@gmail.com>
Co-authored-by: Cait Martin Newnham <85128509+helloiamcait@users.noreply.github.com>
Co-authored-by: Carlos Luiz <ecarlos-luiz@hotmail.com>
Co-authored-by: Cloudburst <18114966+C10udburst@users.noreply.github.com>
Co-authored-by: Colgrave <hanqixu.blogs@simplelogin.co>
Co-authored-by: Dan <jonweblin2205@protonmail.com>
Co-authored-by: DarkOrbFX <darkorbfx@gmail.com>
Co-authored-by: Deleted User <Skrripy@users.noreply.hosted.weblate.org>
Co-authored-by: Deleted User <noreply+53776@weblate.org>
Co-authored-by: Don Apis <apisapisapis@gmail.com>
Co-authored-by: Eryk Michalak <gnu.ewm@protonmail.com>
Co-authored-by: FastAct <alex.rijckaert@gmail.com>
Co-authored-by: Fedorov Alexei <aleksejfedorov963@gmail.com>
Co-authored-by: Felipe Nogueira <contato.fnog@gmail.com>
Co-authored-by: Filip Drogrishki <alekfilip425@gmail.com>
Co-authored-by: Fjuro <fjuro@alius.cz>
Co-authored-by: Fqwe1 <Fqwe1@users.noreply.hosted.weblate.org>
Co-authored-by: Giuseppe Terrana <terranagiuseppe03@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Itsmechinmoy <gituborah280@gmail.com>
Co-authored-by: J. Lavoie <j.lavoie@net-c.ca>
Co-authored-by: Joel Brink <joel.brink.handy@gmail.com>
Co-authored-by: Jose Delvani <jsdelvani@users.noreply.hosted.weblate.org>
Co-authored-by: Julian <hello@apollo.moe>
Co-authored-by: Kaan Çetin <cetinkaan895@hotmail.com>
Co-authored-by: Kai <rafahdamin@gmail.com>
Co-authored-by: Kardi Demha <kardi.demha@gmail.com>
Co-authored-by: LagradOst <46196380+Blatzar@users.noreply.github.com>
Co-authored-by: LiJu09 <lisojuraj@gmail.com>
Co-authored-by: Ma Ue <MattiaU59@gmail.com>
Co-authored-by: Massimo Pissarello <mapi68@gmail.com>
Co-authored-by: Matthaiks <kitynska@gmail.com>
Co-authored-by: Michael John Scerri <michaeljscerri@gmail.com>
Co-authored-by: Muhammad Fahad Khan <itxmfahadkhan@gmail.com>
Co-authored-by: Márkó <gost1336@gmail.com>
Co-authored-by: Osten <11805592+LagradOst@users.noreply.github.com>
Co-authored-by: Overmet15 <overmet15@gmail.com>
Co-authored-by: PiterDev <piterzdev@gmail.com>
Co-authored-by: Pizza Party <paol.m@proton.me>
Co-authored-by: Prathap Rathod <prathap0144@gmail.com>
Co-authored-by: Radoslav Vasilev Vasilev <fifata@gmail.com>
Co-authored-by: Rex_sa <rex.sa@pm.me>
Co-authored-by: Roi Gabay <roigby@gmail.com>
Co-authored-by: Rudy Tantono <rudzlong@gmail.com>
Co-authored-by: Sam Cooper <samcooper838@gmail.com>
Co-authored-by: Samuel Gadiel <samuelgadiel@gmail.com>
Co-authored-by: Sandyran <sandyran@protonmail.com>
Co-authored-by: Sarlay <raphmd0@gmail.com>
Co-authored-by: SeMih Budur <zaaf10@hotmail.de>
Co-authored-by: Shafici Isxariifshe <mega12xhaphiee@gmail.com>
Co-authored-by: ShareASmile <ShareASmile@users.noreply.hosted.weblate.org>
Co-authored-by: Sintayew Gashaw <sintayewgashaw4@gmail.com>
Co-authored-by: SleepyOwl <artem726artem@gmail.com>
Co-authored-by: Subham Jena <subhamjena8465@gmail.com>
Co-authored-by: Sufyan Zahoor Jutt <sufyanpahore@gmail.com>
Co-authored-by: TZVS <akyasan@tuta.io>
Co-authored-by: The Initiator <eithansten@gmail.com>
Co-authored-by: TubaApollo <86665265+TubaApollo@users.noreply.github.com>
Co-authored-by: Veselin Ivanov <slavitransbg@gmail.com>
Co-authored-by: Vrwi <jurgisbums@gmail.com>
Co-authored-by: Walter H <walter75@gmail.com>
Co-authored-by: XblateX <blate@users.noreply.hosted.weblate.org>
Co-authored-by: ZsoltiHUB <zsoltizsolti043@gmail.com>
Co-authored-by: akku vijay <akkuvijay@duck.com>
Co-authored-by: dabao1955 <dabao1955@163.com>
Co-authored-by: duckling <salmanfc.bd@gmail.com>
Co-authored-by: edgolron <edgolron@tutanota.com>
Co-authored-by: eightyy8 <oliver.kha@pm.me>
Co-authored-by: gallegonovato <fran-carro@hotmail.es>
Co-authored-by: george kitsoukakis <norhorn@gmail.com>
Co-authored-by: jinu147 <nesqea20@gmail.com>
Co-authored-by: kaajjo <claymanoff@gmail.com>
Co-authored-by: l <thisuserooo@gmail.com>
Co-authored-by: ngocanhtve <ngocanh.tve@gmail.com>
Co-authored-by: phlostically <phlostically@mailinator.com>
Co-authored-by: sonacore <sonacore@gmail.com>
Co-authored-by: stojkovskistefan <stefanstojkovski@gmail.com>
Co-authored-by: tuan041 <30403510+tuan041@users.noreply.github.com>
Co-authored-by: tuan041 <tuananh163025ttt@gmail.com>
Co-authored-by: Ömer Faruk Sancak <keyiflerolsun@gmail.com>
Co-authored-by: Влад Николаев <vladnic1990@gmail.com>
Co-authored-by: தமிழ்நேரம் <anishprabu.t@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/af/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/am/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/apc/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ar/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ars/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/as/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/bg/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/bn/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/cs/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/de/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/el/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/eo/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/es/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/fa/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/fil/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/fr/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/gl/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/he/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/hi/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/hr/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/hu/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/id/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/it/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ja/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/kn/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ko/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/lt/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/lv/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/mk/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ml/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ms/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/mt/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/my/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/nb_NO/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ne/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/nl/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/nn/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/or/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/pl/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/pt/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/pt_BR/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/qt/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ro/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ru/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/sk/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/so/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/sv/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ta/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ti/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/tl/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/tr/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/uk/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ur/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/vi/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/zh_Hans/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/zh_Hant/
Translation: Cloudstream/App
2024-08-02 11:20:40 +02:00
recloudstream[bot]
ff29fe6ee6 chore(locales): fix locale issues 2024-08-01 22:14:37 +00:00
Luna712
aac2311722
Fix TV focus issues for add repo input (#1239) 2024-08-02 00:14:23 +02:00
Ömer Faruk Sancak
60e3c48aca
Helper Added: CryptoJS (#1237) 2024-08-02 00:13:54 +02:00
CranberrySoup
14dd418652
Update build.gradle.kts (#1240) 2024-08-01 03:28:47 +02:00
Cloudburst
5012821216
[skip ci] add trailing nline to strings to be consistent with weblate 2024-07-31 10:44:25 +02:00
Luna712
ab379ab31c
Support for multi deleting downloads and other major improvements/fixes (#1177) 2024-07-30 20:54:54 +02:00
Luna712
8fcb3e3121
Fix cast recycler scrolling (#1221) 2024-07-30 20:45:25 +02:00
Ömer Faruk Sancak
30adb1cd9d
fixed: Test Search & VidMoxy, RapidVid extractors (#1219) 2024-07-30 20:38:51 +02:00
KingLucius
63e27c2ea5
Fix Trailers on API<33 (#1226)
Recent NewPipeExtractor updates pushed minimum sdk to 33 which needs desugar_jdk_libs_nio
2024-07-30 20:16:11 +02:00
epireyn
b2f08847e1
Add system dark theme (#1208) 2024-07-29 01:01:45 +02:00
epireyn
150ad5fc9f
Add sorting by release date (#1206) 2024-07-29 01:00:44 +02:00
firelight
82f8ab489e
Fix prerelease test function 2024-07-29 00:58:35 +02:00
epireyn
04dda008c4
Clean up and mark questionable code issues (#1209) 2024-07-29 00:39:04 +02:00
Luna712
0aa48f335a
Fix subscription icon displaying for movie types in result previews (#1222) 2024-07-29 00:26:22 +02:00
Luna712
a28ee41368
Fix for navigation UI bug (#1220) 2024-07-28 23:59:37 +02:00
Osten
2fc279f4ae
Bump 4.4.0 2024-07-25 20:26:21 +02:00
epireyn
15d2d21631
Add the option to hide video controls (#1210) 2024-07-25 20:25:17 +02:00
KingLucius
e3ff1cf455
feat(UI): Show Episode Runtime (#1207) 2024-07-25 20:23:49 +02:00
KingLucius
dfd127265a
Trailers Fix (#1213) 2024-07-25 20:23:31 +02:00
firelight
c8a863e332
Fixed ExampleInstrumentedTest 2024-07-24 22:38:16 +02:00
RowdyRushya
0c418fdf9b
Updated VidSrc encryption methods (#1205) 2024-07-21 00:06:04 +02:00
firelight
4c7379c766
Revert #979 Episode download cache 2024-07-20 19:14:11 +02:00
KingLucius
bb8144a52e
feat(TV UI): Player's Top controls redesign (#1203) 2024-07-19 19:35:29 +02:00
firelight
073af50f5f
fixed html plot in preview 2024-07-19 18:28:36 +02:00
firelight
63465ed7a9
fix autohide 2024-07-19 18:24:06 +02:00
RowdyRushya
12de924559
updating vidplay encryption method (#1202) 2024-07-19 18:10:34 +02:00
firelight
627dd45309
0bytes downloads fix 2024-07-18 02:02:35 +02:00
KingLucius
a157115cfa
feat(Subtitles): SubSource subtitles provider (#1199) 2024-07-15 17:15:59 +02:00
IndusAryan
694193fa3e
refactor(fix): result sync, fix slider theme and trailer fix (#1187) 2024-07-15 17:10:41 +02:00
RowdyRushya
febb843424
Fix VidSrcTo extractor (#1198) 2024-07-15 17:06:20 +02:00
firelight
8be8e54746
Fixed log 2024-07-08 23:17:25 +02:00
Ömer Faruk Sancak
e86c926c30
Extractor: added Pichive & Sobreatsesuyp (#1184) 2024-07-08 22:59:02 +02:00
KingLucius
145c42f1c8
feat(UI): Use same Episode holder size (#1180) 2024-07-05 18:10:58 +02:00
KingLucius
9b1ac5fc28
feat(Trakt): Skip specials season for next airing (#1181) 2024-07-05 18:05:32 +02:00
KingLucius
699a6979a5
feat(TV UI): Fix clone site focus (#1179) 2024-07-05 18:04:32 +02:00
firelight
e1d4a46309
bugfix on lib startup 2024-07-05 15:26:44 +02:00
Luna712
c1b5f5c128
Fix download button display bug in adapter (#1175) 2024-07-04 23:51:07 +02:00
firelight
e5c9e96c83
fix filesystem 2024-07-04 22:33:21 +02:00
CranberrySoup
02b956940a
Port large parts of the API to crossplatform (#1163) 2024-07-04 20:07:01 +02:00
Luna712
03b8b6e637
Major performance and bug fixes to downloads (#1164) 2024-07-04 19:37:08 +02:00
Luna712
29ec554334
Fix an IllegalStateException crash (#1171) 2024-07-04 02:39:26 +02:00
CranberrySoup
5f64e40a7e
Fix debug exceptions in releases (#1168) 2024-07-03 03:42:10 +02:00
Cloudburst
d17111c1c1
[skip ci] update issue templates 2024-07-02 22:40:36 +02:00
IndusAryan
a5582a7a67
feat(ui): ability to play any local video from files using file chooser (#1158) 2024-07-01 23:34:36 +02:00
CranberrySoup
1a05651510
Fix nsfw visibility (#1162) 2024-06-30 17:08:06 +02:00
IndusAryan
ad27eb3b0e
feat(ui): show currently syncing api logo on navigation bar and rail (#1146) 2024-06-30 16:17:30 +02:00
Ömer Faruk Sancak
6b93af5803
Extractor: VideoSeyred » Referer Fix (#1159) 2024-06-28 17:24:57 +02:00
Phisher98
55a0eb66cb
MyCloud New Domain Adding Extractor for it (#1157) 2024-06-26 21:06:46 +02:00
recloudstream[bot]
b776642775 chore(locales): fix locale issues 2024-06-24 19:10:15 +00:00
Cloudburst
09fe9873cf
fix locales.py 2024-06-24 21:09:41 +02:00
Weblate (bot)
0d40b5ebe3
Translations update from Hosted Weblate (#1042)
Co-authored-by: Aaditya Bhandari <bhandariaaditya4@gmail.com>
Co-authored-by: Adrian Hermida <adrian.hermida.baloira@gmail.com>
Co-authored-by: Akhlak Ur Rahman <akhlak.pro.red@gmail.com>
Co-authored-by: Alexander Svärd <genc.demiri@hotmail.com>
Co-authored-by: Anarchydr <patrikpik879@gmail.com>
Co-authored-by: Andre Costa <andrecaeu@gmail.com>
Co-authored-by: Antonio N <antonioenpidev@gmail.com>
Co-authored-by: Azgar <azgaresncf@gmail.com>
Co-authored-by: Colgrave <hanqixu.blogs@simplelogin.co>
Co-authored-by: Dan <jonweblin2205@protonmail.com>
Co-authored-by: Eji-san <ejierubani@gmail.com>
Co-authored-by: Ettore Atalan <atalanttore@googlemail.com>
Co-authored-by: Evgeniy Khramov <65224669+thejenja@users.noreply.github.com>
Co-authored-by: FUTURE <alwaysoutsmartyou@gmail.com>
Co-authored-by: Fikri Akbar <akbarfikri1221@gmail.com>
Co-authored-by: Fjuro <fjuro@alius.cz>
Co-authored-by: Huzaifah Asif <huzaifahasif3@gmail.com>
Co-authored-by: Itsmechinmoy <gituborah280@gmail.com>
Co-authored-by: Jose Delvani <delvani.eletricista@gmail.com>
Co-authored-by: Konstantinos Tranoudis <kontranpro@gmail.com>
Co-authored-by: Krisna A. Prayoga <krisnaadiprayoga@gmail.com>
Co-authored-by: Luna712 <142361265+Luna712@users.noreply.github.com>
Co-authored-by: Marian Turba <puki247@gmail.com>
Co-authored-by: Massimo Pissarello <mapi68@gmail.com>
Co-authored-by: Matthaiks <kitynska@gmail.com>
Co-authored-by: Milo Ivir <mail@milotype.de>
Co-authored-by: Mæve Rey <mrey@users.noreply.hosted.weblate.org>
Co-authored-by: Naga <yz2000.pro@gmail.com>
Co-authored-by: Nicoara Alex <alex.nicoara@yahoo.com>
Co-authored-by: Nuno Ferreira <nuno.f.gamer@gmail.com>
Co-authored-by: Only1337 <ymurathanusta@gmail.com>
Co-authored-by: Pizza Party <paol.m@proton.me>
Co-authored-by: Putra Iskandar <piskndar@gmail.com>
Co-authored-by: Qareen Skoll <qareen101@protonmail.com>
Co-authored-by: Rex_sa <rex.sa@pm.me>
Co-authored-by: SeMih Budur <zaaf10@hotmail.de>
Co-authored-by: Semih <semihbrn10@gmail.com>
Co-authored-by: Sufyan Zahoor Jutt <sufyanpahore@gmail.com>
Co-authored-by: Waheed Nazir <mwaheednazir8@gmail.com>
Co-authored-by: Walter H <walter75@gmail.com>
Co-authored-by: Wei-Cheng Yeh (IID) <iid@ccns.ncku.edu.tw>
Co-authored-by: amir <amirasyraf32@gmail.com>
Co-authored-by: bittin1ddc447d824349b2 <bittin@reimu.nl>
Co-authored-by: gallegonovato <fran-carro@hotmail.es>
Co-authored-by: hugoalh <hugoalh@users.noreply.hosted.weblate.org>
Co-authored-by: ngocanhtve <ngocanh.tve@gmail.com>
Co-authored-by: programutox <programutox@disroot.org>
Co-authored-by: rwi <isaac.royallll@gmail.com>
Co-authored-by: stojkovskistefan <stefanstojkovski@gmail.com>
Co-authored-by: streaming s <fsrmllll1111@gmail.com>
Co-authored-by: tuan041 <tuananh163025ttt@gmail.com>
Co-authored-by: user0020 <855309c256@gmail.com>
Co-authored-by: ΣΤΑΥΡΟΣ ΔΑΛΙΑΚΟΠΟΥΛΟΣ <stavros.daliakopoulos@gmail.com>
Co-authored-by: Сергей (MrSabin) <sabin.21011986@gmail.com>
Co-authored-by: தமிழ்நேரம் <anishprabu.t@gmail.com>
Co-authored-by: 电棍老板 <qwertyuiop9296@outlook.com>
Co-authored-by: 구병우 <dodamby@ajou.ac.kr>
2024-06-24 21:03:09 +02:00
CranberrySoup
9ca1d02bdc
Improve tests (#1142) 2024-06-24 20:05:34 +02:00
Luna712
b06d9f224d
Downloads: performance improvements and merge adapters (#1145) 2024-06-24 20:04:45 +02:00
imgbot[bot]
b9746c2b17
[ImgBot] Optimize images (#1144)
/app/src/main/res/drawable/example_qr.png -- 45.27kb -> 1.28kb (97.17%)

Signed-off-by: ImgBotApp <ImgBotHelp@gmail.com>
Co-authored-by: ImgBotApp <ImgBotHelp@gmail.com>
2024-06-19 19:03:55 +02:00
IndusAryan
c71d5d8add
feat(ui): new dialog on adding repository and auto redirection (#1025) 2024-06-19 16:36:40 +02:00
KingLucius
afa178a63a
feat(TV UI): Accounts PIN login support (#1123) 2024-06-19 16:06:08 +02:00
Misael Jiménez
b702b7b1ec
Fix DoodExtractor. (#1134)
Fix StreamWishExtractor
2024-06-19 15:40:23 +02:00
KingLucius
bda6673cfd
feat(Extensions): Consider time zone in Trakt durations (#1140) 2024-06-18 23:24:35 +02:00
KingLucius
7a0cd07dc1
feat(TV UI): Press Right to focus save on Logcat (#1136) 2024-06-18 05:02:32 +02:00
KingLucius
30d223cfe3
feat(UI): Reorganize Settings (#1137)
- Accounts Section & Remove "account" from title.
- Security Section for Biometric that is hidden on TV.
- Move "send logs" to "Action" section.
2024-06-17 03:01:14 +02:00
Stormunblessed
4c061edd7c
goodstream (#1133) 2024-06-15 23:47:30 +02:00
KingLucius
4c95610238
feat(UI): Hide Platform's not related settings (#1128) 2024-06-09 16:38:08 +02:00
RowdyRushya
3345326cb2
Extractor: VidSrcTo: better handling of runtime errors (#1121) 2024-06-08 21:19:29 +02:00
KingLucius
607a4510b6
feat(Extensions): Trakt season names remove (#1124) 2024-06-08 21:08:35 +02:00
KingLucius
f775c1725d
feat(TV UI): Subtitles Filter button focus fix (#1125) 2024-06-08 21:07:33 +02:00
firelight
7eec0eff02
Revert "chore: refactor gradlelocalproperties and update gradle plugin (#957)" (#1120)
This reverts commit 358a20eb77.
2024-06-05 23:41:06 +02:00
IndusAryan
358a20eb77
chore: refactor gradlelocalproperties and update gradle plugin (#957) 2024-06-05 23:18:33 +02:00
int3debug
0391a3b89c
feature(ui): added wikipedia to links (#1119) 2024-06-05 23:09:05 +02:00
int3debug
9bebfe4590
feature(ui): hide NSFW plugins (#1117)
Hide NSFW plugins if Settings / Providers NSFW is disabled
2024-06-05 23:07:54 +02:00
KingLucius
b3e3dadc72
Remove IndexSubtitles provider (#1111) 2024-06-01 18:17:41 +02:00
KingLucius
b87fdfbf85
feat(TV UI): Account switch focus fix (#1112) 2024-06-01 18:16:42 +02:00
KingLucius
dff56026de
SubDL Account login support (#1101) 2024-05-29 22:39:55 +02:00
IndusAryan
5502e478c4
chore: update material,kotlin compiler,newpipe extractor,rhino-js,guava,corektx (#1091) 2024-05-27 16:05:56 +02:00
CranberrySoup
960f8449b7
Update ResultViewModel2.kt (#1102) 2024-05-27 15:54:51 +02:00
Ömer Faruk Sancak
d0852449a5
Extractor: Added FourPichive (#1103)
🕊
2024-05-27 15:54:25 +02:00
KingLucius
e697bf7554
Next Airing episode support in Trakt meta provider (#1072) 2024-05-21 22:06:28 +02:00
Luna712
db2bf5e7be
Remove subscene (#1096)
subscene.com just shows a "Subscene is closed" message now.
2024-05-19 12:43:46 +02:00
KingLucius
469a71236b
SubDL subtitles provider (#1082) 2024-05-18 18:15:23 +02:00
CranberrySoup
4d5cd288ab
Ported more files for multiplatform (#1056) 2024-05-18 13:47:12 +02:00
KingLucius
af828de8d5
feat(TV UI: Fix online subtitles dialog focus (#1085) 2024-05-18 13:41:37 +02:00
CranberrySoup
ee4d1dedc5
Add basic fcast support (#1084) 2024-05-09 21:46:54 +02:00
KingLucius
f1cc4db89c
Show Season number for next airing episode (#1071) 2024-05-09 17:08:18 +02:00
b4byhuey
3874cb9f9d
Update Dailymotion Extractor (#1081) 2024-05-09 17:06:33 +02:00
phisher98
0a5399d9b6
Updates and Chillx Extractor Updated (#1065) 2024-05-05 01:00:42 +02:00
KingLucius
71bd48f493
feat(ui): Hide Downloads & Settings Back button on TV (#1074) 2024-05-04 13:17:52 +02:00
KingLucius
83c473d9f8
More external Ids in Trakt meta provider (#1075) 2024-05-04 13:16:09 +02:00
RowdyRushya
c28a3cb987
Extractor: new VidSrcTo extractor (#1044) 2024-05-04 13:15:34 +02:00
int3debug
d3828eeafe
refact: rename logcat file (#1061)
Rename logcat file to prevent override
2024-05-02 23:59:05 +02:00
int3debug
c07e6d3222
hotfix: Remove resume information (#1063) 2024-05-02 23:58:32 +02:00
KingLucius
949b5830b6
feat(ui): Fix downloads focus on TV (#1066) 2024-05-01 19:29:49 +02:00
b4byhuey
ff1ffbeb83
Update Voe.kt (#1062) 2024-04-28 21:42:38 +02:00
Luna712
138e1a1f0e
Don't check year when checking duplicates if year is empty (#1060)
Some sources don't use year which makes this not match when it really should match
2024-04-27 22:40:15 +02:00
KingLucius
004c481a5e
feat(ui): Episode Air date & Upcoming countdown (#1058) 2024-04-27 18:11:22 +02:00
b4byhuey
e2946cad6b
Added Vidguard Extractor (#1053) 2024-04-27 18:00:40 +02:00
int3debug
e6b9d621f9
feat(ui): added option to reset sub delay (#1041) 2024-04-22 17:00:27 +02:00
KingLucius
0019f85501
Trakt meta provider for extensions (#1026) 2024-04-22 16:59:14 +02:00
IndusAryan
0744189020
feat(ui): show account name and image on main settings page (#1001) 2024-04-22 16:48:54 +02:00
Ömer Faruk Sancak
4399a612df
Update Vidmoly.kt (#1051) 2024-04-22 01:14:36 +02:00
KingLucius
e01ff4d843
Fix NewPipeExtractor lib path (#1050) 2024-04-22 01:13:55 +02:00
KingLucius
6cef9f7ea2
Filtering first unwatched episode respects watched state (#1049) 2024-04-20 22:18:49 +02:00
int3debug
9a18ef6411
bugfix: fixing regex special chars break it (#1047) 2024-04-17 23:48:33 +02:00
CranberrySoup
6df3ef14f6
First steps for multiplatform API (#1003)
* First steps for multiplatform api

* Buildconfig testing

* Fix publishing and classes.jar

* Update build.gradle.kts
2024-04-16 23:07:28 +02:00
int3debug
5db541d7cc
feat(ui): added reset button to subtitle delay (#1040) 2024-04-14 02:13:12 +02:00
CranberrySoup
aa8972870c
Show download size on videos (#1038) 2024-04-14 00:45:58 +02:00
Rushikesh Chavan
afdc4988ac
Extractor: Update Vidplay Extractor (#1036) 2024-04-13 19:52:08 +02:00
KingLucius
e6c111532d
Defaults Play button to first unwatched Episode (#1035) 2024-04-13 19:51:39 +02:00
recloudstream[bot]
ffa7b0248a chore(locales): fix locale issues 2024-04-10 15:26:36 +00:00
firelight
c13d290377
Merge pull request #1012 from recloudstream/weblate
Translations update from Hosted Weblate
2024-04-10 17:26:17 +02:00
Hosted Weblate
1bf7e14eab
Merge remote-tracking branch 'origin/master' 2024-04-10 17:24:19 +02:00
phisher98
145ceea50f
Created vtbe and EPlay Extractor (#1014) 2024-04-10 17:24:15 +02:00
Hosted Weblate
2fad760426
Merge remote-tracking branch 'origin/master' 2024-04-10 17:16:09 +02:00
KingLucius
ff0dea3fbb
Fix focus for Tracks selection on TV (#1030) 2024-04-10 17:16:04 +02:00
Hosted Weblate
44e5b86176
Merge remote-tracking branch 'origin/master' 2024-04-10 17:14:51 +02:00
KingLucius
d8f89df163
Show player controls on pressing Pad Down (#1031) 2024-04-10 17:14:47 +02:00
Hosted Weblate
a74563d003
Translated using Weblate (Russian)
Currently translated at 100.0% (697 of 697 strings)

Translated using Weblate (Russian)

Currently translated at 100.0% (4 of 4 strings)

Translated using Weblate (Russian)

Currently translated at 100.0% (697 of 697 strings)

Translated using Weblate (Vietnamese)

Currently translated at 75.0% (3 of 4 strings)

Translated using Weblate (Vietnamese)

Currently translated at 98.7% (688 of 697 strings)

Translated using Weblate (French)

Currently translated at 96.8% (675 of 697 strings)

Translated using Weblate (Arabic (Levantine))

Currently translated at 100.0% (697 of 697 strings)

Translated using Weblate (Persian)

Currently translated at 34.7% (242 of 697 strings)

Translated using Weblate (Vietnamese)

Currently translated at 98.8% (689 of 697 strings)

Translated using Weblate (Russian)

Currently translated at 97.1% (677 of 697 strings)

Translated using Weblate (Indonesian)

Currently translated at 100.0% (697 of 697 strings)

Translated using Weblate (Malayalam)

Currently translated at 100.0% (4 of 4 strings)

Translated using Weblate (Malayalam)

Currently translated at 48.4% (338 of 697 strings)

Translated using Weblate (Indonesian)

Currently translated at 99.8% (696 of 697 strings)

Translated using Weblate (Maltese)

Currently translated at 100.0% (4 of 4 strings)

Translated using Weblate (Maltese)

Currently translated at 32.1% (224 of 697 strings)

Translated using Weblate (Portuguese)

Currently translated at 100.0% (697 of 697 strings)

Added translation using Weblate (Maltese)

Translated using Weblate (Spanish)

Currently translated at 100.0% (697 of 697 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (697 of 697 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 98.1% (684 of 697 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (697 of 697 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (697 of 697 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (697 of 697 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (697 of 697 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (697 of 697 strings)

Translated using Weblate (Arabic)

Currently translated at 100.0% (697 of 697 strings)

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Spanish)

Currently translated at 99.4% (690 of 694 strings)

Translated using Weblate (Odia)

Currently translated at 37.5% (258 of 688 strings)

Co-authored-by: Andre Costa <andrecaeu@gmail.com>
Co-authored-by: Anonymous <noreply@weblate.org>
Co-authored-by: Argo Carpathians <chrisarabagas@gmail.com>
Co-authored-by: Clxff H3r4ld0 <123844876+clxf12@users.noreply.github.com>
Co-authored-by: Colgrave <hanqixu.blogs@simplelogin.co>
Co-authored-by: Fjuro <fjuro@alius.cz>
Co-authored-by: Fqwe1 <Fqwe1@users.noreply.hosted.weblate.org>
Co-authored-by: Gnkalk <github.fngyb@slmail.me>
Co-authored-by: Herderson Riker <herdersonriker@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Joshua Joseph <joshuasaju2@gmail.com>
Co-authored-by: Long Kim <kimlong01102000@icloud.com>
Co-authored-by: Massimo Pissarello <mapi68@gmail.com>
Co-authored-by: Matthaiks <kitynska@gmail.com>
Co-authored-by: Michael John Scerri <michaeljscerri@gmail.com>
Co-authored-by: Mika <akimivanov43@gmail.com>
Co-authored-by: Pizza Party <paol.m@proton.me>
Co-authored-by: Rex_sa <rex.sa@pm.me>
Co-authored-by: Thanh <pancakes21f@gmail.com>
Co-authored-by: aleksej0R <omolice@hotmail.fr>
Co-authored-by: gallegonovato <fran-carro@hotmail.es>
Co-authored-by: kaajjo <claymanoff@gmail.com>
Co-authored-by: maxim <maximtested@gmail.com>
Co-authored-by: samwiaba <sambastianc@gmail.com>
Co-authored-by: Ömer Faruk Sancak <keyiflerolsun@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/apc/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ar/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/cs/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/es/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/fa/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/fr/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/id/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/it/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ml/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/mt/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/or/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/pl/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/pt/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/pt_BR/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ru/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/tr/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/uk/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/vi/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/zh_Hans/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/fastlane/ml/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/fastlane/mt/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/fastlane/ru/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/fastlane/vi/
Translation: Cloudstream/App
Translation: Cloudstream/Fastlane
2024-04-08 04:02:02 +02:00
firelight
0a24661e4c
fix latest commit 2024-03-25 01:48:23 +01:00
firelight
ed2bdf44fb
New TvTypes + General fixes 2024-03-25 01:38:39 +01:00
IndusAryan
51d91bf9a7
feat(ui): add ignore battery optimisation dialog for uniterrupted downloads and notifications (#915) 2024-03-25 01:18:26 +01:00
firelight
fb89fd60b8
Merge pull request #996 from KingLucius/playFirstUnwatched
Set play button to first unwatched Episode on TV
2024-03-25 01:05:41 +01:00
recloudstream[bot]
7db7742c73 chore(locales): fix locale issues 2024-03-25 00:04:49 +00:00
firelight
b246d80861
Merge pull request #890 from recloudstream/weblate
Translations update from Hosted Weblate
2024-03-25 01:04:36 +01:00
Hosted Weblate
d321aba3a7
Merge remote-tracking branch 'origin/master' 2024-03-25 01:03:08 +01:00
IndusAryan
22937424fa
feat(ui): authenticate first when enabling security settings (#991) 2024-03-25 01:03:04 +01:00
Hosted Weblate
7f0034e872
Merge remote-tracking branch 'origin/master' 2024-03-25 00:59:59 +01:00
IndusAryan
35e38a53ad
refactor: format build date and time and make it copyable (#1002) 2024-03-25 00:59:55 +01:00
Hosted Weblate
6d8a31809d
Merge remote-tracking branch 'origin/master' 2024-03-25 00:55:53 +01:00
KingLucius
650c7583af
Fix Alert Dialog width on TV (#1010)
* Fix Alert Dialog width on TV

* Fix width for AlertDialogCustom on TV
2024-03-25 00:55:37 +01:00
Hosted Weblate
34af3a4b2f
Merge remote-tracking branch 'origin/master' 2024-03-25 00:47:29 +01:00
int3debug
9ef1f1cc41
fix: extension activity interruption (#1005)
fixed interruption with only local plugins

Co-authored-by: int3debug <gh.ditch236@passinbox.com>
2024-03-25 00:47:26 +01:00
Hosted Weblate
6ede44d85f
Merge remote-tracking branch 'origin/master' 2024-03-25 00:42:23 +01:00
KingLucius
2f03ca7de9
Extenstions' Github & Rate buttons are now focusable on TV (#1008)
- Disables useless focus for (Description, Author .. etc.) buttons one the left.
- Make GitHub & Rate focusable on TV.
2024-03-25 00:42:18 +01:00
Hosted Weblate
7ce2dfc4aa
Merge remote-tracking branch 'origin/master' 2024-03-25 00:41:08 +01:00
int3debug
16510923d2
fix: No access rights after restore from backup (#1009)
Co-authored-by: int3debug <gh.ditch236@passinbox.com>
2024-03-25 00:41:04 +01:00
Hosted Weblate
a9c2c0644a
Translated using Weblate (Indonesian)
Currently translated at 100.0% (4 of 4 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (688 of 688 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 98.4% (677 of 688 strings)

Translated using Weblate (Indonesian)

Currently translated at 100.0% (688 of 688 strings)

Translated using Weblate (French)

Currently translated at 98.1% (675 of 688 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (688 of 688 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (688 of 688 strings)

Translated using Weblate (Arabic (Levantine))

Currently translated at 100.0% (688 of 688 strings)

Translated using Weblate (Ukrainian)

Currently translated at 99.8% (687 of 688 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (688 of 688 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (688 of 688 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (688 of 688 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (688 of 688 strings)

Translated using Weblate (Croatian)

Currently translated at 99.2% (683 of 688 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (688 of 688 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (688 of 688 strings)

Translated using Weblate (Arabic)

Currently translated at 100.0% (688 of 688 strings)

Translated using Weblate (German)

Currently translated at 99.7% (686 of 688 strings)

Translated using Weblate (English)

Currently translated at 100.0% (688 of 688 strings)

Translated using Weblate (Portuguese)

Currently translated at 100.0% (688 of 688 strings)

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (688 of 688 strings)

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Afrikaans)

Currently translated at 100.0% (4 of 4 strings)

Translated using Weblate (Afrikaans)

Currently translated at 29.7% (205 of 688 strings)

Translated using Weblate (Arabic (Levantine))

Currently translated at 100.0% (688 of 688 strings)

Translated using Weblate (Korean)

Currently translated at 100.0% (4 of 4 strings)

Translated using Weblate (Ukrainian)

Currently translated at 99.7% (686 of 688 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (688 of 688 strings)

Translated using Weblate (Hindi)

Currently translated at 100.0% (4 of 4 strings)

Translated using Weblate (Hindi)

Currently translated at 40.9% (282 of 688 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (688 of 688 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (688 of 688 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (688 of 688 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (688 of 688 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (688 of 688 strings)

Translated using Weblate (Arabic)

Currently translated at 100.0% (688 of 688 strings)

Merge remote-tracking branch 'origin/master'

Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Arabic (Levantine))

Currently translated at 99.7% (684 of 686 strings)

Translated using Weblate (Ukrainian)

Currently translated at 99.7% (684 of 686 strings)

Translated using Weblate (German)

Currently translated at 99.8% (685 of 686 strings)

Translated using Weblate (Malayalam)

Currently translated at 44.0% (302 of 686 strings)

Translated using Weblate (Indonesian)

Currently translated at 100.0% (686 of 686 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (686 of 686 strings)

Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Arabic (Levantine))

Currently translated at 98.6% (678 of 687 strings)

Translated using Weblate (German)

Currently translated at 98.9% (680 of 687 strings)

Translated using Weblate (German)

Currently translated at 98.9% (680 of 687 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (687 of 687 strings)

Translated using Weblate (Swedish)

Currently translated at 99.8% (686 of 687 strings)

Translated using Weblate (Arabic)

Currently translated at 100.0% (687 of 687 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 98.6% (678 of 687 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (687 of 687 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (687 of 687 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (687 of 687 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (687 of 687 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (684 of 684 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (684 of 684 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (684 of 684 strings)

Translated using Weblate (Swedish)

Currently translated at 99.8% (683 of 684 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (684 of 684 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (684 of 684 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (684 of 684 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (684 of 684 strings)

Translated using Weblate (Arabic)

Currently translated at 100.0% (684 of 684 strings)

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (4 of 4 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (684 of 684 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (4 of 4 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (684 of 684 strings)

Translated using Weblate (Persian)

Currently translated at 33.7% (228 of 675 strings)

Translated using Weblate (Swedish)

Currently translated at 100.0% (675 of 675 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (4 of 4 strings)

Translated using Weblate (Hungarian)

Currently translated at 95.1% (642 of 675 strings)

Translated using Weblate (Romanian)

Currently translated at 94.2% (636 of 675 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (4 of 4 strings)

Translated using Weblate (Portuguese)

Currently translated at 100.0% (675 of 675 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (675 of 675 strings)

Translated using Weblate (Portuguese)

Currently translated at 100.0% (675 of 675 strings)

Translated using Weblate (Hungarian)

Currently translated at 86.3% (583 of 675 strings)

Translated using Weblate (Hindi)

Currently translated at 41.6% (281 of 675 strings)

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Russian)

Currently translated at 100.0% (675 of 675 strings)

Translated using Weblate (German)

Currently translated at 98.0% (662 of 675 strings)

Translated using Weblate (Portuguese)

Currently translated at 96.4% (651 of 675 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (675 of 675 strings)

Translated using Weblate (French)

Currently translated at 100.0% (675 of 675 strings)

Translated using Weblate (Indonesian)

Currently translated at 100.0% (675 of 675 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (675 of 675 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 97.3% (657 of 675 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (675 of 675 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (675 of 675 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (675 of 675 strings)

Translated using Weblate (Arabic)

Currently translated at 100.0% (675 of 675 strings)

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Italian)

Currently translated at 100.0% (675 of 675 strings)

Translated using Weblate (Croatian)

Currently translated at 100.0% (675 of 675 strings)

Translated using Weblate (Arabic (Levantine))

Currently translated at 99.7% (672 of 674 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (674 of 674 strings)

Translated using Weblate (Vietnamese)

Currently translated at 98.6% (665 of 674 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (674 of 674 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (4 of 4 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (674 of 674 strings)

Translated using Weblate (Croatian)

Currently translated at 100.0% (674 of 674 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (674 of 674 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (674 of 674 strings)

Translated using Weblate (Bulgarian)

Currently translated at 98.9% (667 of 674 strings)

Translated using Weblate (Arabic)

Currently translated at 100.0% (674 of 674 strings)

Translated using Weblate (Nepali)

Currently translated at 26.8% (181 of 674 strings)

Translated using Weblate (Afrikaans)

Currently translated at 29.9% (202 of 674 strings)

Translated using Weblate (Amharic)

Currently translated at 29.6% (200 of 674 strings)

Translated using Weblate (Norwegian Nynorsk)

Currently translated at 42.8% (289 of 674 strings)

Translated using Weblate (Kannada)

Currently translated at 33.8% (228 of 674 strings)

Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Macedonian)

Currently translated at 100.0% (4 of 4 strings)

Translated using Weblate (Dutch)

Currently translated at 99.5% (666 of 669 strings)

Translated using Weblate (Macedonian)

Currently translated at 100.0% (669 of 669 strings)

Translated using Weblate (Portuguese)

Currently translated at 99.2% (664 of 669 strings)

Translated using Weblate (Portuguese)

Currently translated at 99.2% (664 of 669 strings)

Translated using Weblate (Portuguese)

Currently translated at 97.0% (649 of 669 strings)

Translated using Weblate (Portuguese)

Currently translated at 97.0% (649 of 669 strings)

Translated using Weblate (Portuguese)

Currently translated at 95.9% (642 of 669 strings)

Translated using Weblate (French)

Currently translated at 99.4% (665 of 669 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (4 of 4 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (669 of 669 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (669 of 669 strings)

Translated using Weblate (Esperanto)

Currently translated at 33.7% (226 of 669 strings)

Translated using Weblate (Urdu)

Currently translated at 100.0% (669 of 669 strings)

Translated using Weblate (Indonesian)

Currently translated at 100.0% (669 of 669 strings)

Translated using Weblate (Bulgarian)

Currently translated at 99.8% (668 of 669 strings)

Translated using Weblate (Arabic (Levantine))

Currently translated at 100.0% (669 of 669 strings)

Translated using Weblate (Swedish)

Currently translated at 100.0% (669 of 669 strings)

Translated using Weblate (French)

Currently translated at 99.4% (665 of 669 strings)

Translated using Weblate (Portuguese)

Currently translated at 95.9% (642 of 669 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (669 of 669 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Japanese)

Currently translated at 50.2% (336 of 669 strings)

Translated using Weblate (Hungarian)

Currently translated at 82.8% (554 of 669 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (669 of 669 strings)

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Russian)

Currently translated at 100.0% (669 of 669 strings)

Translated using Weblate (Russian)

Currently translated at 100.0% (669 of 669 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Croatian)

Currently translated at 100.0% (4 of 4 strings)

Translated using Weblate (Russian)

Currently translated at 94.7% (634 of 669 strings)

Translated using Weblate (Croatian)

Currently translated at 75.0% (3 of 4 strings)

Translated using Weblate (Croatian)

Currently translated at 100.0% (669 of 669 strings)

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Arabic (Levantine))

Currently translated at 100.0% (669 of 669 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (669 of 669 strings)

Translated using Weblate (German)

Currently translated at 99.1% (663 of 669 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (669 of 669 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (669 of 669 strings)

Translated using Weblate (Swedish)

Currently translated at 100.0% (669 of 669 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (669 of 669 strings)

Translated using Weblate (Arabic)

Currently translated at 100.0% (669 of 669 strings)

Translated using Weblate (Norwegian Bokmål)

Currently translated at 90.2% (603 of 668 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (668 of 668 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (668 of 668 strings)

Translated using Weblate (Swedish)

Currently translated at 100.0% (668 of 668 strings)

Translated using Weblate (Japanese)

Currently translated at 49.8% (333 of 668 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 96.5% (645 of 668 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (668 of 668 strings)

Translated using Weblate (Arabic)

Currently translated at 100.0% (668 of 668 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Swedish)

Currently translated at 100.0% (4 of 4 strings)

Translated using Weblate (Japanese)

Currently translated at 47.3% (316 of 668 strings)

Translated using Weblate (Swedish)

Currently translated at 100.0% (668 of 668 strings)

Translated using Weblate (Swedish)

Currently translated at 99.4% (664 of 668 strings)

Translated using Weblate (Nepali)

Currently translated at 26.9% (180 of 668 strings)

Translated using Weblate (German)

Currently translated at 99.1% (662 of 668 strings)

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Odia)

Currently translated at 38.3% (256 of 668 strings)

Translated using Weblate (Croatian)

Currently translated at 99.7% (666 of 668 strings)

Translated using Weblate (Nepali)

Currently translated at 16.9% (113 of 668 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Polish)

Currently translated at 99.7% (666 of 668 strings)

Translated using Weblate (Malayalam)

Currently translated at 45.2% (302 of 668 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Arabic)

Currently translated at 100.0% (668 of 668 strings)

Translated using Weblate (Bengali)

Currently translated at 48.5% (324 of 668 strings)

Translated using Weblate (Bengali)

Currently translated at 48.5% (324 of 668 strings)

Translated using Weblate (Persian)

Currently translated at 27.6% (185 of 668 strings)

Translated using Weblate (Persian)

Currently translated at 27.6% (185 of 668 strings)

Translated using Weblate (Bengali)

Currently translated at 36.8% (246 of 668 strings)

Translated using Weblate (Tagalog)

Currently translated at 51.9% (347 of 668 strings)

Translated using Weblate (Swedish)

Currently translated at 78.8% (527 of 668 strings)

Translated using Weblate (Malayalam)

Currently translated at 39.0% (261 of 668 strings)

Translated using Weblate (Arabic (Levantine))

Currently translated at 100.0% (4 of 4 strings)

Translated using Weblate (Polish)

Currently translated at 98.6% (659 of 668 strings)

Co-authored-by: Aayush Shah <shahaayush999@gmail.com>
Co-authored-by: Ahmed Abd El-Fattah <a.aelfattah5@gmail.com>
Co-authored-by: Alexander Svärd <genc.demiri@hotmail.com>
Co-authored-by: Allan Nordhøy <epost@anotheragency.no>
Co-authored-by: Amir <amearb@duck.com>
Co-authored-by: Anarchydr <patrikpik879@gmail.com>
Co-authored-by: Andre Costa <andrecaeu@gmail.com>
Co-authored-by: Anonymous <noreply@weblate.org>
Co-authored-by: Apostol Penkov <apostol.penkov@gmail.com>
Co-authored-by: AppsTool <appstool03@gmail.com>
Co-authored-by: Argo Carpathians <chrisarabagas@gmail.com>
Co-authored-by: Bálint László <blaszlobors@gmail.com>
Co-authored-by: CPavRou <mag@cleparo.fr>
Co-authored-by: CakesTwix <cakestwix1@gmail.com>
Co-authored-by: Cloudburst <18114966+C10udburst@users.noreply.github.com>
Co-authored-by: Clxff H3r4ld0 <123844876+clxf12@users.noreply.github.com>
Co-authored-by: Colgrave <hanqixu.blogs@simplelogin.co>
Co-authored-by: Dan <jonweblin2205@protonmail.com>
Co-authored-by: DarkOrbFX <darkorbfx@gmail.com>
Co-authored-by: Davi Silveira <davilego10@gmail.com>
Co-authored-by: Davide Marcoli <davide.marcoli13@gmail.com>
Co-authored-by: Ettore Atalan <atalanttore@googlemail.com>
Co-authored-by: Fjuro <fjuro@alius.cz>
Co-authored-by: Fjuro <ifjuro@proton.me>
Co-authored-by: Fqwe1 <Fqwe1@users.noreply.hosted.weblate.org>
Co-authored-by: Friso de Boer <collorfrisie@hotmail.com>
Co-authored-by: Gnkalk <github.fngyb@slmail.me>
Co-authored-by: H Tamás <hovanszki@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Hubert Naciasta <hubert.naciasta@skiff.com>
Co-authored-by: IamNotNickerson <IamNickerson@users.noreply.hosted.weblate.org>
Co-authored-by: Jean-Michel <arsene_lupin_57@hotmail.fr>
Co-authored-by: Joana Trashlieva <j.trashlieva@gmail.com>
Co-authored-by: Jose Delvani <delvani.eletricista@gmail.com>
Co-authored-by: Julia Sugawara <jm.sugawara@gmail.com>
Co-authored-by: Just Rocket (just) <phatal1988@gmail.com>
Co-authored-by: Kjev <77635620+Kjev666@users.noreply.github.com>
Co-authored-by: Levent SD <leventsd@gmail.com>
Co-authored-by: Luna712 <142361265+Luna712@users.noreply.github.com>
Co-authored-by: Massimo Pissarello <mapi68@gmail.com>
Co-authored-by: Matthaiks <kitynska@gmail.com>
Co-authored-by: Mc wolmarans <marthinuswolmarans61@gmail.com>
Co-authored-by: Milo Ivir <mail@milotype.de>
Co-authored-by: Naga <yz2000.pro@gmail.com>
Co-authored-by: NamelessGO <66227691+NameLessGO@users.noreply.github.com>
Co-authored-by: Only1337 <ymurathanusta@gmail.com>
Co-authored-by: Ovi329 <avijitb129@gmail.com>
Co-authored-by: Pizza Party <paol.m@proton.me>
Co-authored-by: Rex_sa <rex.sa@pm.me>
Co-authored-by: Sanjeev Dhawan <smstranscom@gmail.com>
Co-authored-by: Semih <semihbrn10@gmail.com>
Co-authored-by: Slawa <slawa@slawagurevich.com>
Co-authored-by: Subham Jena <subhamjena8465@gmail.com>
Co-authored-by: Sufyan Zahoor Jutt <sufyanpahore@gmail.com>
Co-authored-by: T1z3n <info@njbraun.de>
Co-authored-by: TecnoLAZ <luispaulodias89@gmail.com>
Co-authored-by: Yosra Boussaid <yosra.boussaid@users.noreply.hosted.weblate.org>
Co-authored-by: Zhenye Dong <dongzhenye@gmail.com>
Co-authored-by: arcopnt <arcopnt@posteo.com>
Co-authored-by: dabao1955 <dabao1955@163.com>
Co-authored-by: delvani <inavleb@users.noreply.hosted.weblate.org>
Co-authored-by: gallegonovato <fran-carro@hotmail.es>
Co-authored-by: konatu saino <shironyann.tdbr@gmail.com>
Co-authored-by: lucasmz <github@lucasmz.dev>
Co-authored-by: maxim <maximtested@gmail.com>
Co-authored-by: oops-wtf <cert.potatoes@gmail.com>
Co-authored-by: simmon <simmon@nplob.com>
Co-authored-by: stojkovskistefan <stefanstojkovski@gmail.com>
Co-authored-by: tuan041 <tuananh163025ttt@gmail.com>
Co-authored-by: v1s7 <v1s7@users.noreply.hosted.weblate.org>
Co-authored-by: Ícaro Rodrigo Ferreira Da Fonseca Bezerra <icaro.bezerra@sptech.school>
Co-authored-by: Ömer Faruk Sancak <keyiflerolsun@gmail.com>
Co-authored-by: Сергій <sergiy.goncharuk.1@gmail.com>
Co-authored-by: सौम्य भाटी <saumyabhati2006@gmail.com>
Co-authored-by: 电棍老板 <qwertyuiop9296@outlook.com>
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/af/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/am/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/apc/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ar/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/bg/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/bn/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/cs/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/de/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/en/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/eo/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/es/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/fa/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/fr/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/hi/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/hr/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/hu/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/id/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/it/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ja/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/kn/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/mk/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ml/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/nb_NO/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ne/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/nl/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/nn/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/or/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/pl/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/pt/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/pt_BR/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ro/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ru/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/sv/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/tl/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/tr/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/uk/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ur/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/vi/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/zh_Hans/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/fastlane/af/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/fastlane/apc/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/fastlane/hi/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/fastlane/hr/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/fastlane/hu/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/fastlane/id/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/fastlane/ko/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/fastlane/mk/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/fastlane/pl/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/fastlane/pt_BR/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/fastlane/sv/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/fastlane/zh_Hans/
Translation: Cloudstream/App
Translation: Cloudstream/Fastlane
2024-03-24 20:01:55 +01:00
firelight
4468ce3d80
Revert "make cloudstream very superfast boi, fast app startup and navigation …" (#1007)
This reverts commit faeb71da2c.
2024-03-22 23:06:05 +01:00
IndusAryan
faeb71da2c
make cloudstream very superfast boi, fast app startup and navigation (#965) 2024-03-22 22:56:05 +01:00
int3debug
86bc0b8345
fixed first setup extension activity interruption (#1000)
Co-authored-by: int3debug <gh.ditch236@passinbox.com>
2024-03-22 22:31:01 +01:00
int3debug
1ff0b5dccd
add build-date to main_settings (#995) 2024-03-20 08:33:50 +01:00
KingLucius
a2e63174be Set play button to first unwatched episode on TV 2024-03-19 17:47:36 +02:00
Osten
eb60be54ed fixed crash + fixed lib + fixed preview 2024-03-18 15:54:54 +01:00
Osten
8d5b73495d Added BaseAdapter to store internal state 2024-03-18 03:58:30 +01:00
KingLucius
a3bb853691
Extension's Settings Focus on TV (#990) 2024-03-17 17:07:18 +01:00
Osten
375b3ec46e
Update HomeParentItemAdapter.kt
Should fix last item problem
2024-03-17 16:42:31 +01:00
Osten
ad67b9ddab + Fixed ephemeral scroll
+ Fixed Unable to remove Subs
+ Fixed download 1 frame visual glitch
+ Maybe fixed worker
+ Updated layout API
+ Bump
2024-03-17 03:37:09 +01:00
KingLucius
638cc4fee9
New TV UI bug fixes (#983) 2024-03-16 03:50:49 +01:00
IndusAryan
4817b29b9c
refactor: toast view to use data binding (#919) 2024-03-14 00:12:13 +01:00
IndusAryan
040ac77b1a
refactor: add clipboard helper and improve repo url copy (#946) 2024-03-14 00:04:58 +01:00
firelight
527046766a
Fixed OOM when using restore data 2024-03-13 23:36:23 +01:00
Luna712
adc653943b
Improve synopsis/description display on phone and emulator (#967) 2024-03-13 18:29:12 +01:00
IndusAryan
81df68e137
fix(hotfix): bottom sheet appearing when turning biometrics off and remove toast. (#971)
* fix biometric regressions

* use nullable context

* aha!
2024-03-10 23:15:23 +01:00
Luna712
a01bb9e55b
Fix nonTransferableKeys in BackupUtils (#979)
* Fix nonTransferableKeys in BackupUtils

* Whoops...

* really...
2024-03-10 23:12:51 +01:00
Luna712
807bd85fa9
Move biometric_key to keys section in strings (#978) 2024-03-10 23:11:02 +01:00
KingLucius
510d11f705
New TV UI (#950) 2024-03-09 15:24:38 +01:00
firelight
bd69054f5d
Updated lib icon 2024-03-08 03:16:36 +01:00
firelight
694e7abbdf
Fixes #816 2024-03-08 03:00:00 +01:00
firelight
e3f9f255c7
Revert "feat: make cloudstream compilation and builds fast! using gradle conf…" (#968)
This reverts commit 21b341e12f.
2024-03-08 02:07:35 +01:00
IndusAryan
21b341e12f
feat: make cloudstream compilation and builds fast! using gradle configuration cache (#959) 2024-03-08 01:56:31 +01:00
IndusAryan
e3999d6e9a
feat(security): add biometric fingerprint sensor / face unlock authentication (#826) 2024-03-08 01:45:20 +01:00
Mater Yoda
f0f4ec87bc
Added lavender color (#949) 2024-03-08 01:20:49 +01:00
self-similarity
809a38507b
Update SimklApi.kt (#961) 2024-03-02 23:45:18 +01:00
KingLucius
1a380a3239
TV show airing status for phone (#953)
* TV show airing status for phone

* Bump Nicehttp & remove toImmutableList
2024-02-29 17:07:45 +01:00
Sofie
93d81ea038
WebViewResolver: added timeout (#941) 2024-02-19 21:18:36 +01:00
Sofie
e007714701
fix Rabbitstream (#936)
* fix Rabbitstream

* .
2024-02-19 21:06:55 +01:00
KingLucius
805f80b2ac
Long press Repo to copy URL (#934) 2024-02-19 16:46:02 +01:00
KingLucius
b5fb0997c4
[TV] Limit Homepage Header Description to 3 lines & 6 Tags (#938) 2024-02-19 16:44:50 +01:00
KingLucius
ca918b1581
[TV] More space around result description (#939) 2024-02-19 16:43:41 +01:00
IndusAryan
09779b4ee0
chore: add tooltips on results toolbar and rename speed mode (#925)
* add tooltips on results toolbar and better summaries, rename speed mode

* remove redundant space
2024-02-15 21:45:34 +01:00
Sofie
012d38398e
fix Acefile & Gofile (#926) 2024-02-15 21:42:47 +01:00
Ömer Faruk Sancak
d1db4c3370
Extractor: Added PlayRu (#930) 2024-02-15 21:42:11 +01:00
Sarlay
8d318ca84a
Fixed Chillx subtitles (#931)
* Fixed subtitles tracks for Chillx.kt

* Update Chillx.kt
2024-02-15 21:41:34 +01:00
KingLucius
eea6e13346
Make Rating non-focusable (Old API) (#935) 2024-02-15 21:40:44 +01:00
CranberrySoup
2b7d102716
Add SubScene (#923)
* Lower targetSdk to get all installed packages

* Update sdk version

* Let's not be too radical

* Many fixes

* Revert targetSdk

* Make account homepage persistent

* Add SubScene and change subtitle API

Co-authored-by: Aymanbest <51868001+aymanbest@users.noreply.github.com>

* Fix file deletion

---------

Co-authored-by: Aymanbest <51868001+aymanbest@users.noreply.github.com>
2024-02-06 23:27:35 +01:00
Osten
9ea7674a0f
Update MainAPI.kt 2024-02-02 22:18:54 +01:00
IndusAryan
3dcf7076d0
feat(ui): tap video duration to toggle remaining time counter (#878) 2024-01-21 20:11:51 +01:00
Sofie
8b14fcb881
added Mediafire (#906) 2024-01-21 15:35:33 +01:00
IndusAryan
01f21e0fe8
refactor: move buildconfig, bump ksp & better trailer scraping (#834) 2024-01-19 21:09:07 +01:00
coxju
bdef6524e7
feat : run custom js in webviewresolver (#888)
Co-authored-by: coxju <coxju>
2024-01-19 20:38:37 +01:00
Cloudburst
f40a8d9418
make *rotate_video_key untransatable (#896) 2024-01-19 20:12:52 +01:00
IndusAryan
03fcb106ac
new simple messages when updating app i.e, refined changelogs (#900) 2024-01-19 20:12:33 +01:00
coxju
636e157c63
fix: trailers not playing (#898)
Co-authored-by: coxju <coxju>
2024-01-19 12:03:20 +01:00
CranberrySoup
5af1b80cb7
Fix crash on plugin reload (#895)
* Update Event.kt

* Update Event.kt
2024-01-18 22:57:54 +01:00
coxju
5dfc08aabb
feat: added emturbovid extractor (#893)
Co-authored-by: coxju <coxju>
2024-01-17 23:28:17 +01:00
coxju
1676094488
feat (loadExtractor) : match mirror domains of extractor link (#877)
Co-authored-by: coxju <coxju>
2024-01-17 22:32:22 +01:00
Sir Aguacata
19145c6cc4
Screw it, Self host keys (#892) 2024-01-17 22:30:20 +01:00
coxju
ebb72d6a0c
feat : invalidate link cache after 20 mins (#875)
- additionaly clear cache if there is player errors or no links found

Co-authored-by: coxju <coxju>
2024-01-17 22:29:44 +01:00
Sir Aguacata
399b28c75b
Rest in piece old key repo (#891) 2024-01-17 00:35:23 +01:00
IndusAryan
601483e103
feat: limit genre tags on home to 2 lines and on result page, 10 tags max (#885) 2024-01-16 18:41:43 +01:00
recloudstream[bot]
9733d0b316 chore(locales): fix locale issues 2024-01-16 17:40:50 +00:00
Weblate (bot)
0cf199248a
Translated using Weblate (Croatian) (#856)
Currently translated at 100.0% (4 of 4 strings)

Translated using Weblate (Russian)

Currently translated at 94.7% (634 of 669 strings)

Translated using Weblate (Croatian)

Currently translated at 75.0% (3 of 4 strings)

Translated using Weblate (Croatian)

Currently translated at 100.0% (669 of 669 strings)

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Arabic (Levantine))

Currently translated at 100.0% (669 of 669 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (669 of 669 strings)

Translated using Weblate (German)

Currently translated at 99.1% (663 of 669 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (669 of 669 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (669 of 669 strings)

Translated using Weblate (Swedish)

Currently translated at 100.0% (669 of 669 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (669 of 669 strings)

Translated using Weblate (Arabic)

Currently translated at 100.0% (669 of 669 strings)

Translated using Weblate (Norwegian Bokmål)

Currently translated at 90.2% (603 of 668 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (668 of 668 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (668 of 668 strings)

Translated using Weblate (Swedish)

Currently translated at 100.0% (668 of 668 strings)

Translated using Weblate (Japanese)

Currently translated at 49.8% (333 of 668 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 96.5% (645 of 668 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (668 of 668 strings)

Translated using Weblate (Arabic)

Currently translated at 100.0% (668 of 668 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Swedish)

Currently translated at 100.0% (4 of 4 strings)

Translated using Weblate (Japanese)

Currently translated at 47.3% (316 of 668 strings)

Translated using Weblate (Swedish)

Currently translated at 100.0% (668 of 668 strings)

Translated using Weblate (Swedish)

Currently translated at 99.4% (664 of 668 strings)

Translated using Weblate (Nepali)

Currently translated at 26.9% (180 of 668 strings)

Translated using Weblate (German)

Currently translated at 99.1% (662 of 668 strings)

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Odia)

Currently translated at 38.3% (256 of 668 strings)

Translated using Weblate (Croatian)

Currently translated at 99.7% (666 of 668 strings)

Translated using Weblate (Nepali)

Currently translated at 16.9% (113 of 668 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Polish)

Currently translated at 99.7% (666 of 668 strings)

Translated using Weblate (Malayalam)

Currently translated at 45.2% (302 of 668 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Arabic)

Currently translated at 100.0% (668 of 668 strings)

Translated using Weblate (Bengali)

Currently translated at 48.5% (324 of 668 strings)

Translated using Weblate (Bengali)

Currently translated at 48.5% (324 of 668 strings)

Translated using Weblate (Persian)

Currently translated at 27.6% (185 of 668 strings)

Translated using Weblate (Persian)

Currently translated at 27.6% (185 of 668 strings)

Translated using Weblate (Bengali)

Currently translated at 36.8% (246 of 668 strings)

Translated using Weblate (Tagalog)

Currently translated at 51.9% (347 of 668 strings)

Translated using Weblate (Swedish)

Currently translated at 78.8% (527 of 668 strings)

Translated using Weblate (Malayalam)

Currently translated at 39.0% (261 of 668 strings)

Translated using Weblate (Arabic (Levantine))

Currently translated at 100.0% (4 of 4 strings)

Translated using Weblate (Polish)

Currently translated at 98.6% (659 of 668 strings)























Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/apc/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ar/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/bn/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/cs/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/de/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/es/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/fa/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/hr/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ja/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ml/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/nb_NO/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ne/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/or/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/pl/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ru/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/sv/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/tl/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/tr/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/uk/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/zh_Hans/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/fastlane/apc/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/fastlane/hr/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/fastlane/sv/
Translation: Cloudstream/App
Translation: Cloudstream/Fastlane

Co-authored-by: Aayush Shah <shahaayush999@gmail.com>
Co-authored-by: Alexander Svärd <genc.demiri@hotmail.com>
Co-authored-by: Allan Nordhøy <epost@anotheragency.no>
Co-authored-by: Amir <amearb@duck.com>
Co-authored-by: Anarchydr <patrikpik879@gmail.com>
Co-authored-by: Cloudburst <18114966+C10udburst@users.noreply.github.com>
Co-authored-by: Ettore Atalan <atalanttore@googlemail.com>
Co-authored-by: Fjuro <ifjuro@proton.me>
Co-authored-by: Hubert Naciasta <hubert.naciasta@skiff.com>
Co-authored-by: IamNotNickerson <IamNickerson@users.noreply.hosted.weblate.org>
Co-authored-by: Milo Ivir <mail@milotype.de>
Co-authored-by: Ovi329 <avijitb129@gmail.com>
Co-authored-by: Pizza Party <paol.m@proton.me>
Co-authored-by: Rex_sa <rex.sa@pm.me>
Co-authored-by: Slawa <slawa@slawagurevich.com>
Co-authored-by: Subham Jena <subhamjena8465@gmail.com>
Co-authored-by: dabao1955 <dabao1955@163.com>
Co-authored-by: gallegonovato <fran-carro@hotmail.es>
Co-authored-by: v1s7 <v1s7@users.noreply.hosted.weblate.org>
Co-authored-by: Ömer Faruk Sancak <keyiflerolsun@gmail.com>
Co-authored-by: Сергій <sergiy.goncharuk.1@gmail.com>
2024-01-16 18:40:37 +01:00
Sofie
2624947b5b
fix keys (#887)
Co-authored-by: ghost <ghost@gmail.com>
2024-01-16 18:37:31 +01:00
coxju
31c783d0b4
feat: added extractor vidhide and streamwish (#889)
Co-authored-by: coxju <coxju>
2024-01-16 18:36:02 +01:00
firelight
9f1b172f34
fix plugin downloads trash can 2024-01-14 01:06:06 +01:00
IndusAryan
93dce8682e
fix system bars not appearing properly (#879) 2024-01-13 22:45:30 +01:00
IndusAryan
723c653b07
feat(ui): long press title to copy (#872)
* new feature: hold to copy movie title

* remove title copy hint
2024-01-12 16:48:43 +01:00
coxju
0c73f5e59a
fix: library not loading in TV (#871) 2024-01-11 17:08:37 +01:00
coxju
0eb152c5db
fix: search only if selection changed (#868) 2024-01-11 15:54:28 +01:00
IndusAryan
8c5ab86714
hotfix window compat bug (#870) 2024-01-11 15:53:31 +01:00
Ömer Faruk Sancak
85a769a898
Extractor: ContentX add external subtitle (#869) 2024-01-11 15:52:34 +01:00
Sir Aguacata
96aa56209b
Revert the repo change to get keys (#867) 2024-01-11 00:47:40 +01:00
coxju
d71d3890b5
feat: show random button on library (#855) 2024-01-10 22:28:06 +01:00
IndusAryan
19b1a40cf8
use window insets compat controller (#847) 2024-01-10 22:20:43 +01:00
Yutatsu
e5f483b0b2
Fix vidplay extractor (#866) 2024-01-10 22:06:45 +01:00
coxju
6f1e0bef80
feat: show the episodic range with current selection checked (#851) 2024-01-10 22:05:56 +01:00
LagradOst
5e6272be3f fix 2024-01-10 19:10:34 +01:00
coxju
97ec98b9e2
feat : show favorite button in bottom dialog (#858)
Co-authored-by: coxju <coxju>
2024-01-10 18:55:10 +01:00
coxju
42fd0b5c76
new streamtape extractor (#857) 2024-01-08 23:46:19 +01:00
Ömer Faruk Sancak
42774f6183
Extractor: ContentX expanded and fix (#859)
* Extractor: ContentX expanded and fix
2024-01-08 23:45:53 +01:00
Sofie
f687508521
Extractors: fix acefile, pixeldrain & vidplay tracks (#854)
Co-authored-by: ghost <ghost@gmail.com>
2024-01-05 17:08:48 +01:00
recloudstream[bot]
dbba6d7f27 chore(locales): fix locale issues 2024-01-05 16:08:37 +00:00
Hosted Weblate
f4da170a57 Translated using Weblate (Polish)
Currently translated at 99.7% (666 of 668 strings)

Translated using Weblate (Malayalam)

Currently translated at 45.2% (302 of 668 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Arabic)

Currently translated at 100.0% (668 of 668 strings)

Translated using Weblate (Bengali)

Currently translated at 48.5% (324 of 668 strings)

Translated using Weblate (Bengali)

Currently translated at 48.5% (324 of 668 strings)

Translated using Weblate (Persian)

Currently translated at 27.6% (185 of 668 strings)

Translated using Weblate (Persian)

Currently translated at 27.6% (185 of 668 strings)

Translated using Weblate (Bengali)

Currently translated at 36.8% (246 of 668 strings)

Translated using Weblate (Tagalog)

Currently translated at 51.9% (347 of 668 strings)

Translated using Weblate (Swedish)

Currently translated at 78.8% (527 of 668 strings)

Translated using Weblate (Malayalam)

Currently translated at 39.0% (261 of 668 strings)

Translated using Weblate (Arabic (Levantine))

Currently translated at 100.0% (4 of 4 strings)

Translated using Weblate (Polish)

Currently translated at 98.6% (659 of 668 strings)

Co-authored-by: Amir <amearb@duck.com>
Co-authored-by: Cloudburst <18114966+C10udburst@users.noreply.github.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Hubert Naciasta <hubert.naciasta@skiff.com>
Co-authored-by: IamNotNickerson <IamNickerson@users.noreply.hosted.weblate.org>
Co-authored-by: Ovi329 <avijitb129@gmail.com>
Co-authored-by: Pizza Party <paol.m@proton.me>
Co-authored-by: Rex_sa <rex.sa@pm.me>
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ar/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/bn/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/fa/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ml/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/pl/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/sv/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/tl/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/fastlane/apc/
Translation: Cloudstream/App
Translation: Cloudstream/Fastlane
2024-01-05 17:08:20 +01:00
Cloudburst
2a1876f54c
fix build_to_archive.yml 2024-01-03 10:28:39 +01:00
wrongwrong
f1d0a8e955
Fixed to not use API that will be discontinued in the future (#843) 2024-01-03 10:24:42 +01:00
IndusAryan
1c6be2d5cb
refactor(bump): upgrade workflow versions to use node16 (#793) 2024-01-03 10:24:28 +01:00
Horis
fc802cdcdd
add extractors (#849) 2024-01-03 10:24:12 +01:00
Ömer Faruk Sancak
2cfdab5498
Extractor: added some extractors (#833)
* Extractor: added some extractors

* Extractor: fix same import

* Extractor: PeaceMakerst fix

* Extractor: source fix
2023-12-31 21:31:05 +01:00
recloudstream[bot]
4c2ee28d5a chore(locales): fix locale issues 2023-12-28 13:17:57 +00:00
firelight
657f2fbcb2
Merge pull request #824 from recloudstream/weblate
Translations update from Hosted Weblate
2023-12-28 14:17:41 +01:00
Hosted Weblate
b5ac668493
Added translation using Weblate (Nepali)
Translated using Weblate (Ukrainian)

Currently translated at 100.0% (4 of 4 strings)

Translated using Weblate (Arabic (Levantine))

Currently translated at 75.0% (3 of 4 strings)

Translated using Weblate (Arabic (Levantine))

Currently translated at 100.0% (668 of 668 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (668 of 668 strings)

Translated using Weblate (Hindi)

Currently translated at 41.9% (280 of 668 strings)

Translated using Weblate (French)

Currently translated at 98.5% (658 of 668 strings)

Translated using Weblate (Italian)

Currently translated at 99.2% (663 of 668 strings)

Translated using Weblate (Hindi)

Currently translated at 38.1% (255 of 668 strings)

Translated using Weblate (Burmese)

Currently translated at 94.9% (634 of 668 strings)

Translated using Weblate (Galician)

Currently translated at 38.9% (260 of 668 strings)

Translated using Weblate (Odia)

Currently translated at 38.1% (255 of 668 strings)

Translated using Weblate (Latvian)

Currently translated at 92.3% (617 of 668 strings)

Translated using Weblate (Somali)

Currently translated at 85.1% (569 of 668 strings)

Translated using Weblate (Norwegian Nynorsk)

Currently translated at 43.1% (288 of 668 strings)

Translated using Weblate (Persian)

Currently translated at 22.6% (151 of 668 strings)

Translated using Weblate (Tamil)

Currently translated at 21.1% (141 of 668 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 94.0% (628 of 668 strings)

Translated using Weblate (Tagalog)

Currently translated at 51.3% (343 of 668 strings)

Translated using Weblate (Swedish)

Currently translated at 78.7% (526 of 668 strings)

Translated using Weblate (Romanian)

Currently translated at 90.8% (607 of 668 strings)

Translated using Weblate (Polish)

Currently translated at 94.9% (634 of 668 strings)

Translated using Weblate (Norwegian Bokmål)

Currently translated at 89.5% (598 of 668 strings)

Translated using Weblate (French)

Currently translated at 98.5% (658 of 668 strings)

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (668 of 668 strings)

Translated using Weblate (Ukrainian)

Currently translated at 99.5% (665 of 668 strings)

Translated using Weblate (Arabic)

Currently translated at 100.0% (668 of 668 strings)

Translated using Weblate (Lithuanian)

Currently translated at 48.5% (324 of 668 strings)

Translated using Weblate (Amharic)

Currently translated at 29.6% (198 of 668 strings)

Translated using Weblate (Tigrinya)

Currently translated at 15.1% (101 of 668 strings)

Translated using Weblate (Korean)

Currently translated at 92.3% (617 of 668 strings)

Translated using Weblate (Malay)

Currently translated at 22.9% (153 of 668 strings)

Translated using Weblate (Japanese)

Currently translated at 46.5% (311 of 668 strings)

Translated using Weblate (qt (generated) (qt))

Currently translated at 50.5% (338 of 668 strings)

Translated using Weblate (Portuguese)

Currently translated at 94.1% (629 of 668 strings)

Translated using Weblate (Hungarian)

Currently translated at 82.0% (548 of 668 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (668 of 668 strings)

Translated using Weblate (Russian)

Currently translated at 94.9% (634 of 668 strings)

Translated using Weblate (Kannada)

Currently translated at 33.9% (227 of 668 strings)

Translated using Weblate (Urdu)

Currently translated at 94.9% (634 of 668 strings)

Translated using Weblate (Hebrew)

Currently translated at 94.9% (634 of 668 strings)

Translated using Weblate (Bengali)

Currently translated at 36.3% (243 of 668 strings)

Translated using Weblate (Chinese (Traditional))

Currently translated at 100.0% (668 of 668 strings)

Translated using Weblate (Malayalam)

Currently translated at 38.7% (259 of 668 strings)

Translated using Weblate (Macedonian)

Currently translated at 92.3% (617 of 668 strings)

Translated using Weblate (Greek)

Currently translated at 94.0% (628 of 668 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (668 of 668 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 94.9% (634 of 668 strings)

Translated using Weblate (Bulgarian)

Currently translated at 93.5% (625 of 668 strings)

Translated using Weblate (Chinese (Traditional))

Currently translated at 98.8% (660 of 668 strings)

Translated using Weblate (Chinese (Traditional))

Currently translated at 91.6% (612 of 668 strings)

Translated using Weblate (Macedonian)

Currently translated at 100.0% (4 of 4 strings)

Translated using Weblate (Chinese (Traditional))

Currently translated at 92.1% (610 of 662 strings)

Translated using Weblate (Macedonian)

Currently translated at 92.2% (611 of 662 strings)

Translated using Weblate (German)

Currently translated at 100.0% (4 of 4 strings)

Translated using Weblate (German)

Currently translated at 99.6% (660 of 662 strings)

Translated using Weblate (Arabic)

Currently translated at 100.0% (662 of 662 strings)

Translated using Weblate (English)

Currently translated at 75.0% (3 of 4 strings)

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Italian)

Currently translated at 100.0% (662 of 662 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (662 of 662 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (662 of 662 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (662 of 662 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (662 of 662 strings)

Translated using Weblate (Italian)

Currently translated at 99.8% (660 of 661 strings)

Translated using Weblate (Italian)

Currently translated at 98.7% (653 of 661 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (German)

Currently translated at 99.6% (659 of 661 strings)

Translated using Weblate (French)

Currently translated at 98.1% (649 of 661 strings)

Co-authored-by: Aayush Shah <shahaayush999@gmail.com>
Co-authored-by: Azgar <azgar4485@gmail.com>
Co-authored-by: Dan <jonweblin2205@protonmail.com>
Co-authored-by: Emanuele Frasca <noostale@live.it>
Co-authored-by: Ettore Atalan <atalanttore@googlemail.com>
Co-authored-by: Filip Drogrishki <alekfilip425@gmail.com>
Co-authored-by: Fjuro <ifjuro@proton.me>
Co-authored-by: Giuseppe Terrana <terranagiuseppe03@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Lacey Anaya <yecakeh263@anawalls.com>
Co-authored-by: Luna712 <142361265+Luna712@users.noreply.github.com>
Co-authored-by: Massimo Pissarello <mapi68@gmail.com>
Co-authored-by: Pizza Party <paol.m@proton.me>
Co-authored-by: Rex_sa <rex.sa@pm.me>
Co-authored-by: Samuele Righi <blackdestinyx145@gmail.com>
Co-authored-by: Wei-Cheng Yeh (IID) <iid@ccns.ncku.edu.tw>
Co-authored-by: almost gamer <almost.gamer01+language@gmail.com>
Co-authored-by: gallegonovato <fran-carro@hotmail.es>
Co-authored-by: Ömer Faruk Sancak <keyiflerolsun@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/am/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/apc/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ar/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/bg/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/bn/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/cs/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/de/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/el/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/es/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/fa/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/fr/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/gl/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/he/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/hi/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/hu/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/it/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ja/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/kn/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ko/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/lt/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/lv/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/mk/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ml/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ms/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/my/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/nb_NO/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/nn/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/or/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/pl/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/pt/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/pt_BR/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/qt/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ro/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ru/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/so/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/sv/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ta/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ti/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/tl/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/tr/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/uk/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ur/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/zh_Hans/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/zh_Hant/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/fastlane/apc/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/fastlane/de/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/fastlane/en/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/fastlane/mk/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/fastlane/uk/
Translation: Cloudstream/App
Translation: Cloudstream/Fastlane
2023-12-28 01:52:53 +01:00
Sofie
9d3b2ba3d2
vidplay/fallback : change to previous key (#836)
* change key

* fix rabbitstream's key
2023-12-23 23:55:02 +01:00
Osten
5f51a8f7bc
Update WatchType.kt 2023-12-21 00:10:20 +01:00
LagradOst
e886fde8b8 lib longhold 2023-12-21 00:07:39 +01:00
Sofie
1356a954f3
Vidplay: change for more accurate key (#831) 2023-12-20 01:18:32 +01:00
firelight
3d90af29eb
bookmark button on preview 2023-12-19 15:59:24 +01:00
recloudstream[bot]
2a4ce89452 chore(locales): fix locale issues 2023-12-19 14:22:10 +00:00
firelight
0543f1ffae
Merge pull request #799 from recloudstream/weblate
Translations update from Hosted Weblate
2023-12-19 14:21:55 +00:00
coxju
a5f7920bca
feat (player): optional rotate button in player and setting to enable auto rotate based on video orientation (#813)
Co-authored-by: coxju <coxju>
2023-12-19 15:20:58 +01:00
Hosted Weblate
e8fe2944bb
Translated using Weblate (German)
Currently translated at 100.0% (4 of 4 strings)

Translated using Weblate (German)

Currently translated at 99.6% (660 of 662 strings)

Translated using Weblate (Arabic)

Currently translated at 100.0% (662 of 662 strings)

Translated using Weblate (English)

Currently translated at 75.0% (3 of 4 strings)

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Italian)

Currently translated at 100.0% (662 of 662 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (662 of 662 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (662 of 662 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (662 of 662 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (662 of 662 strings)

Translated using Weblate (Italian)

Currently translated at 99.8% (660 of 661 strings)

Translated using Weblate (Italian)

Currently translated at 98.7% (653 of 661 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (German)

Currently translated at 99.6% (659 of 661 strings)

Translated using Weblate (French)

Currently translated at 98.1% (649 of 661 strings)

Co-authored-by: Azgar <azgar4485@gmail.com>
Co-authored-by: Ettore Atalan <atalanttore@googlemail.com>
Co-authored-by: Fjuro <ifjuro@proton.me>
Co-authored-by: Giuseppe Terrana <terranagiuseppe03@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Lacey Anaya <yecakeh263@anawalls.com>
Co-authored-by: Massimo Pissarello <mapi68@gmail.com>
Co-authored-by: Rex_sa <rex.sa@pm.me>
Co-authored-by: Samuele Righi <blackdestinyx145@gmail.com>
Co-authored-by: gallegonovato <fran-carro@hotmail.es>
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ar/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/cs/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/de/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/es/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/fr/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/it/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/fastlane/de/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/fastlane/en/
Translation: Cloudstream/App
Translation: Cloudstream/Fastlane
2023-12-19 09:10:19 +00:00
Luna712
db91552f39
PluginManager: uncomment setReadOnly for Android 14 (#823) 2023-12-18 18:49:08 +01:00
Luna712
484c21cc1c
CS3IPlayer: stop player when releasing (#822) 2023-12-17 20:04:20 +01:00
Sofie
ff9144ef54
fix exception (#819) 2023-12-16 20:13:19 +01:00
Luna712
10a477c2bd
Show toast when reloading links (#818)
I'm not really sure if this should be done or not. But I like to know if I actually press the button or miss click as I often have to press it twice for it to do anything, which might just be another issue though.
2023-12-16 18:42:51 +01:00
firelight
6d51c59b18
fix visibility 2023-12-15 15:24:08 +00:00
Sofie
f98ce0558d
add prevent option in CloudflareKiller (#808)
* add prevent option in CloudflareKiller
2023-12-15 15:34:58 +01:00
firelight
f5e6d98cb0
refactor (library search): sort and query current page only and delay search when typing (#806)
* refactor (library): delay search when typing

* fix comment

* review fixes

---------

Co-authored-by: Funny-Pen-7005 <Funny-Pen-7005>
2023-12-15 15:32:21 +01:00
coxju
91dc83e6a3
refactor (search filter) : syncing main tytype chips and bottom dialog tytype chips (#811) 2023-12-15 15:20:37 +01:00
IndusAryan
fe30a85a1c
refactor: general and ui settings and added explicit unstable api opt ins (#787) 2023-12-13 22:18:12 +01:00
yueehaoo
6e5a52e440
Fixing Source List Displaying Empty Items (#810)
* Fixing source list displaying empty items
2023-12-13 20:49:42 +01:00
coxju
410cedc128
refactor (home) : show account icon when no provider selected (#812)
Co-authored-by: Funny-Pen-7005 <Funny-Pen-7005>
2023-12-13 20:23:30 +01:00
Luna712
3c152e04d1
Support showing content ratings for TmdbProvider (#705)
* Support showing content ratings for TmdbProvider
2023-12-09 18:54:29 +01:00
Osten
d0aed5e51a
bump 2023-12-09 18:54:09 +01:00
Funny-Pen-7005
530619c8d0
fixes (library): reverted and updated currentPage logic (#802)
Co-authored-by: Funny-Pen-7005 <Funny-Pen-7005>
2023-12-09 16:38:39 +01:00
firelight
3ef8f3030c
fix from pr (#801) 2023-12-09 15:04:26 +01:00
Funny-Pen-7005
2d87983eca
fix (library tab): save and restore tab selection (#798)
Co-authored-by: Funny-Pen-7005 <Funny-Pen-7005>
2023-12-09 14:55:13 +01:00
Sofie
6f3a8c1cd2
extractor: added vidplay and fix few extractors (#795)
* extractor: added Vidplay

* fix id

* fix Chillx

* fix Linkbox

* update m3u8helper in chillx

* fix Dailymotion

---------

Co-authored-by: Sofie99 <Sofie99@gmail.com>
2023-12-08 17:28:16 +01:00
recloudstream[bot]
dfd6ce7651 chore(locales): fix locale issues 2023-12-07 20:54:23 +00:00
firelight
88ad64b3b0
Merge pull request #790 from recloudstream/weblate
Translations update from Hosted Weblate
2023-12-07 20:54:07 +00:00
Hosted Weblate
cebdbd2199
Merge remote-tracking branch 'origin/master' 2023-12-07 20:51:46 +00:00
IndusAryan
25b042fb83
refactor(bump): update glide module and fix regressions (#789)
* upgrade glide module and glide ksp

* fix glide breaking changes and regressions
2023-12-07 21:51:42 +01:00
Hosted Weblate
fac0ef4c25
Merge remote-tracking branch 'origin/master' 2023-12-07 20:44:17 +00:00
IndusAryan
f7bc83024a
upstream kotlin symbol processing (#788) 2023-12-07 21:44:12 +01:00
Hosted Weblate
5b170c0573
Merge remote-tracking branch 'origin/master' 2023-12-07 21:43:56 +01:00
firelight
38cc121755
Update build.gradle.kts (#797) 2023-12-07 21:43:52 +01:00
Hosted Weblate
951b2110ad
Merge remote-tracking branch 'origin/master' 2023-12-07 21:42:39 +01:00
IndusAryan
d4aefc4e64
bump guava, json(tests), kgp, desugaring (#781)
* bump guava(for ksp)

* Update build.gradle.kts

* .

* Update kotlin gradle plugin
2023-12-07 21:42:32 +01:00
Hosted Weblate
c324eaf543
Translated using Weblate (Hungarian)
Currently translated at 81.5% (539 of 661 strings)

Translated using Weblate (Vietnamese)

Currently translated at 100.0% (661 of 661 strings)

Translated using Weblate (Arabic (Levantine))

Currently translated at 100.0% (661 of 661 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (4 of 4 strings)

Translated using Weblate (Arabic (Levantine))

Currently translated at 100.0% (661 of 661 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (661 of 661 strings)

Co-authored-by: Gyuri Bajzik <bajzikgy@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Pizza Party <paol.m@proton.me>
Co-authored-by: ngocanhtve <ngocanh.tve@gmail.com>
Co-authored-by: Ömer Faruk Sancak <keyiflerolsun@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/apc/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/hu/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/tr/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/vi/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/fastlane/tr/
Translation: Cloudstream/App
Translation: Cloudstream/Fastlane
2023-12-02 08:04:30 +01:00
recloudstream[bot]
962ff1c058 chore(locales): fix locale issues 2023-11-27 21:48:42 +00:00
firelight
7165b57268
Merge pull request #754 from recloudstream/weblate
Translations update from Hosted Weblate
2023-11-27 21:48:24 +00:00
Hosted Weblate
e80dc63381
Translated using Weblate (Russian)
Currently translated at 94.7% (626 of 661 strings)

Translated using Weblate (Russian)

Currently translated at 94.5% (625 of 661 strings)

Translated using Weblate (Dutch)

Currently translated at 100.0% (661 of 661 strings)

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Portuguese)

Currently translated at 94.8% (627 of 661 strings)

Translated using Weblate (Japanese)

Currently translated at 46.4% (307 of 661 strings)

Translated using Weblate (Indonesian)

Currently translated at 100.0% (661 of 661 strings)

Translated using Weblate (Bengali)

Currently translated at 36.3% (240 of 661 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Slovak)

Currently translated at 68.2% (451 of 661 strings)

Translated using Weblate (Vietnamese)

Currently translated at 99.6% (659 of 661 strings)

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Arabic (Najdi))

Currently translated at 66.5% (440 of 661 strings)

Translated using Weblate (Dutch)

Currently translated at 94.8% (627 of 661 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (661 of 661 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (4 of 4 strings)

Translated using Weblate (French)

Currently translated at 96.3% (637 of 661 strings)

Translated using Weblate (French)

Currently translated at 96.3% (637 of 661 strings)

Translated using Weblate (Turkish)

Currently translated at 25.0% (1 of 4 strings)

Translated using Weblate (Afrikaans)

Currently translated at 30.4% (201 of 661 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (661 of 661 strings)

Translated using Weblate (Arabic (Levantine))

Currently translated at 100.0% (661 of 661 strings)

Translated using Weblate (Arabic (Levantine))

Currently translated at 100.0% (661 of 661 strings)

Translated using Weblate (Croatian)

Currently translated at 100.0% (661 of 661 strings)

Translated using Weblate (Arabic)

Currently translated at 100.0% (661 of 661 strings)

Translated using Weblate (Afrikaans)

Currently translated at 100.0% (4 of 4 strings)

Translated using Weblate (Arabic (Levantine))

Currently translated at 68.3% (452 of 661 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (661 of 661 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (661 of 661 strings)

Translated using Weblate (Arabic (Levantine))

Currently translated at 56.8% (372 of 654 strings)

Translated using Weblate (Hindi)

Currently translated at 38.3% (251 of 654 strings)

Translated using Weblate (Arabic (Levantine))

Currently translated at 52.4% (343 of 654 strings)

Translated using Weblate (Arabic (Levantine))

Currently translated at 43.4% (284 of 654 strings)

Translated using Weblate (Arabic (Levantine))

Currently translated at 42.2% (276 of 654 strings)

Translated using Weblate (Arabic (Levantine))

Currently translated at 39.6% (259 of 654 strings)

Translated using Weblate (Indonesian)

Currently translated at 100.0% (654 of 654 strings)

Added translation using Weblate (Afrikaans)

Translated using Weblate (German)

Currently translated at 99.5% (651 of 654 strings)

Translated using Weblate (Croatian)

Currently translated at 100.0% (654 of 654 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (654 of 654 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (654 of 654 strings)

Translated using Weblate (Czech)

Currently translated at 100.0% (654 of 654 strings)

Co-authored-by: Alexthegib <traducoes@skiff.com>
Co-authored-by: Anarchydr <patrikpik879@gmail.com>
Co-authored-by: Clxff H3r4ld0 <123844876+clxf12@users.noreply.github.com>
Co-authored-by: Fjuro <ifjuro@proton.me>
Co-authored-by: Fqwe1 <Fqwe1@users.noreply.hosted.weblate.org>
Co-authored-by: Guillaume THOMAS <t.guillaume319@laposte.net>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Jay Jay Cabugat <cabugatjayjay@gmail.com>
Co-authored-by: Leon de Klerk <deklerkleon5@gmail.com>
Co-authored-by: LiJu09 <lisojuraj@gmail.com>
Co-authored-by: LiberiBg <matheo.ngn@gmail.com>
Co-authored-by: Luna712 <hanstavo1@gmail.com>
Co-authored-by: Murat Han <murathancw@gmail.com>
Co-authored-by: Nepx <anandabaskara@outlook.com>
Co-authored-by: Pizza Party <paol.m@proton.me>
Co-authored-by: Ranforingus <ranforingus@hotmail.com>
Co-authored-by: Rex_sa <rex.sa@pm.me>
Co-authored-by: Sam Cooper <samcooper838@gmail.com>
Co-authored-by: Samiul Islam <samiulislamsharan@gmail.com>
Co-authored-by: SehrGuterCode <philemonpfeiffer@gmail.com>
Co-authored-by: gallegonovato <fran-carro@hotmail.es>
Co-authored-by: maxim <maximtested@gmail.com>
Co-authored-by: ngocanhtve <ngocanh.tve@gmail.com>
Co-authored-by: 跨性别 <github@lgbt.sh>
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/af/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/apc/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ar/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ars/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/bn/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/cs/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/de/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/es/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/fr/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/hi/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/hr/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/id/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ja/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/nl/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/pt/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ru/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/sk/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/tr/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/uk/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/vi/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/fastlane/af/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/fastlane/tr/
Translation: Cloudstream/App
Translation: Cloudstream/Fastlane
2023-11-26 02:07:17 +01:00
firelight
fa7ebc05b3
Refix youtube
This reverts commit df0122c146.
2023-11-21 22:47:01 +01:00
IndusAryan
df0122c146
fix: bump rhino js and upgrade desugaring level (#774)
* fix and bump rhino js

* upgrade desugaring level

* uppercase run to Run
2023-11-18 14:31:41 +00:00
IndusAryan
b49368100b
upgrade gradle (#775) 2023-11-18 14:31:27 +00:00
Sofie
0077cebaa6
fixed AesHelper (#773)
Co-authored-by: Sofie99 <Sofie99@gmail.com>
2023-11-18 14:30:56 +00:00
IndusAryan
a2085202ec
refactor: remove kapt and it's annotation processor, clean gradle, upgrade build-dir deprecation (#764)
* remove kapt and its annotation processor

* cleanup

* change deprecated builddir
2023-11-15 17:31:02 +01:00
CranberrySoup
765071ebef
Fixed flag and name for Levantine Arabic and Najdi Arabic (#770) 2023-11-15 17:30:29 +01:00
self-similarity
e11d36aed8
Save selected subtitle language (#765) 2023-11-12 16:36:21 +01:00
Luna712
5bf2b4ead2
Massive changes to account flow (#741)
* Massive changes to account flow
2023-11-11 23:47:23 +01:00
Cloudburst
de61501b22
Update prerelease.yml 2023-11-11 17:45:10 +01:00
Cloudburst
685884e67f fix makeJar task 2023-11-11 17:40:47 +01:00
Luna712
6db295a799
Upgrade gradle (#726) 2023-11-11 17:30:36 +01:00
self-similarity
2b60e3a893
Fix faulty automatic subtitle selection (#760) 2023-11-10 23:49:37 +00:00
Luna712
3adf036135
Fix some deprecations and other warnings (#750)
* Fix some deprecations and other warnings
2023-11-10 23:48:53 +00:00
IndusAryan
c4aab5e5a8
feat: make cloudstream fast boi, ksp migration (#689)
* migrate from kapt to ksp

* fook codefactor
2023-11-10 17:02:51 +01:00
KingLucius
7e2908c0bb
Fix top bar in Extensions & Test settings (#753) 2023-11-10 15:36:38 +01:00
Sofie
22a0c25d83
extractor: fixed Rabbitstream (#757)
* Extractor: added Rabbitstream

* Extractor: added Rabbitstream

* fixed Rabbitstream

---------

Co-authored-by: Sofie99 <Sofie99@gmail.com>
2023-11-10 15:28:27 +01:00
self-similarity
11136fe63d
Fix selecting sources in cast (#752) 2023-11-05 22:33:11 +00:00
Luna712
a6786aaf98
Add done button for when creating new PINs (#742)
* Add done button for when creating new PINs

* Cleanup
2023-11-02 23:28:25 +00:00
Luna712
5b0cbbf09f
Use nicer grid layout for account select on TV (#737) 2023-11-02 21:14:16 +01:00
IndusAryan
6a8c251013
bump navigation lib (#749) 2023-11-02 21:07:34 +01:00
KingLucius
908f83c50e
Fix scroll for Library TV layout (#695)
* Fix scroll for Library TV layout

* Fixed without NestedScrollView
2023-11-02 21:03:00 +01:00
recloudstream[bot]
6f40d2750f chore(locales): fix locale issues 2023-11-02 19:59:11 +00:00
Weblate (bot)
199f5b3a9d
Translations update from Hosted Weblate (#681)
Co-authored-by: Ahmed Abd El-Fattah <a.aelfattah5@gmail.com>
Co-authored-by: Fjuro <ifjuro@proton.me>
Co-authored-by: Fqwe1 <Fqwe1@users.noreply.hosted.weblate.org>
Co-authored-by: Giuseppe Terrana <terranagiuseppe03@gmail.com>
Co-authored-by: Luna712 <142361265+Luna712@users.noreply.github.com>
Co-authored-by: Rex_sa <rex.sa@pm.me>
Co-authored-by: gallegonovato <fran-carro@hotmail.es>
Co-authored-by: ngocanhtve <ngocanh.tve@gmail.com>
2023-11-02 20:58:52 +01:00
KingLucius
6ce9f29331
Fix settings top bar on TV (#738) 2023-11-02 20:50:49 +01:00
firelight
8b73c35e43
faster account skip startup 2023-10-31 00:34:01 +01:00
Luna712
65313b4579
Add account selection activity and support profile locks (#736) 2023-10-31 00:32:01 +01:00
IndusAryan
a8fdf5e8f2
remove useless parent (#735) 2023-10-30 15:25:50 +00:00
Luna712
87c5aada8f
Bump androidx.preference:preference-ktx (#734) 2023-10-29 16:35:48 +00:00
Luna712
f0e429436f
Use TV results layout on emulator (#710)
* Use TV results layout on emulator

* Add subscription support to emulator

* Update
2023-10-29 01:20:04 +02:00
self-similarity
137d833d4a
Improved Simkl autosync and fixed syncing seasons (#722)
* Improved simkl autosync and fixed syncing seasons
2023-10-29 00:55:49 +02:00
Luna712
b2e0b7dec8
Fix "Multiple substitutions specified in non-positional format" (#727) 2023-10-29 00:52:58 +02:00
Luna712
d542febcda
Reload library when deleting bookmarks (#725) 2023-10-29 00:41:19 +02:00
Luna712
f0ebfa47c8
Bump material to 1.10.0 (#728) 2023-10-29 00:40:20 +02:00
Luna712
51a877f405
Fix some strings (#730) 2023-10-29 00:29:16 +02:00
Luna712
4b93524e57
Convert the rest of SingleSelectionHelper to ViewBinding (#724) 2023-10-26 02:15:50 +02:00
firelight
ef36bccc90
Delete old MultiAnimeProvider.kt (#717) 2023-10-26 02:10:08 +02:00
Luna712
968bd59188
Warn of potential duplicates when adding to library (#691) 2023-10-26 02:09:21 +02:00
Luna712
e4ba852007
Use bottom dialogs for synopsis (#709)
* Use bottom dialogs for synopsis

* Add bottomTextDialog
2023-10-25 16:43:29 +02:00
Luna712
504258bf15
Show confirm exit dialog on emulator layout (#704) 2023-10-23 18:42:17 +02:00
KingLucius
48053164dc
Old APIs focus fixes (#692)
* Movie button focus fix in TV layout

* Cast item focusable in old API

* Media description focus fix in old API

* Switch account button focus fix in old APi
2023-10-23 18:38:53 +02:00
Luna712
2a4468eb44
Add more info on homepage to emulator layout (#698)
* Add more info on homepage to emulator layout

* Support for continue watching and bookmarks

It does some manual changes to avoid having to duplicate the entire layout for minor changes
2023-10-23 18:33:44 +02:00
Luna712
5153a74d4f
Library/LocalList: enable subscriptions on emulator layout (#702) 2023-10-23 18:21:32 +02:00
KingLucius
138dea88c4
Poster cropped at 20% from Top (#693) 2023-10-23 18:16:48 +02:00
IndusAryan
eb58cb1184
fix crash when navigation graph is null (#706) 2023-10-23 18:11:05 +02:00
firelight
c9bffef7cb
Merge pull request #690 from Luna712/locallist-sort
Enable sorting by updated date in LocalList
2023-10-20 13:31:46 +00:00
IndusAryan
a7a6f2282a
Update build.gradle.kts (#694) 2023-10-17 19:13:29 +00:00
Luna712
8ed7418fe4 Enable sorting by updated date in LocalList 2023-10-14 10:30:45 -06:00
Luna712
3cb2196e62
Add favorites (#682)
* Add favorites
2023-10-14 01:02:12 +02:00
KingLucius
7e9d1ded7f
Larger top poster in TV loading layout (#685) 2023-10-14 00:54:34 +02:00
Luna712
b7322ffb19
Add clear search query icons (#687) 2023-10-14 00:44:51 +02:00
CranberrySoup
fd1620f3d7
Fix unresponsive settings (#688)
* Lower targetSdk to get all installed packages

* Update sdk version

* Let's not be too radical

* Many fixes

* Revert targetSdk

* Make account homepage persistent

* Update mobile_navigation.xml

* Update SettingsFragment.kt
2023-10-14 00:34:26 +02:00
KingLucius
fc8c0e809d
Focus fixes for old devices (#686)
- Fix Library on TV main buttons focus.
- Quick search back button focus.
2023-10-12 17:56:54 +00:00
self-similarity
1ccd3d732d
Reduce image cache to 100mb (#683)
* Reduce image cache to 100mb
2023-10-12 01:06:22 +02:00
LagradOst
bb6a17e23c resize images for lower mem footprint 2023-10-11 18:31:46 +02:00
recloudstream[bot]
2f2bbd7d88 chore(locales): fix locale issues 2023-10-10 20:19:06 +00:00
Sir Aguacata
749d131099
Added new primary colors for comfort (#653) 2023-10-10 22:18:34 +02:00
Weblate (bot)
de6dfec452
Translations update from Hosted Weblate (#596)
Co-authored-by: Alexandru <negrualexandru52@gmail.com>
Co-authored-by: Anarchydr <patrikpik879@gmail.com>
Co-authored-by: Antonio N <antonioenpidev@gmail.com>
Co-authored-by: Beabfekad Zikie <beabfekadz@gmail.com>
Co-authored-by: Beach Cow <Beachcow@skiff.com>
Co-authored-by: Boz Osman <nachodev@proton.me>
Co-authored-by: Cait Martin Newnham <85128509+helloiamcait@users.noreply.github.com>
Co-authored-by: Carlos Luiz <ecarlos-luiz@hotmail.com>
Co-authored-by: Chi Uma <jivanov.2048@gmail.com>
Co-authored-by: Cloudburst <18114966+C10udburst@users.noreply.github.com>
Co-authored-by: Dan <jonweblin2205@protonmail.com>
Co-authored-by: Don Apis <apisapisapis@gmail.com>
Co-authored-by: GobinathAL <gobinathal8@gmail.com>
Co-authored-by: Gyuri Bajzik <bajzikgy@gmail.com>
Co-authored-by: Joel Brink <joel.brink.handy@gmail.com>
Co-authored-by: John <yes20866@gmail.com>
Co-authored-by: Julian <hello@apollo.moe>
Co-authored-by: Milo Ivir <mail@milotype.de>
Co-authored-by: Mubarek Seyd Juhar <mubareksd@gmail.com>
Co-authored-by: Muhammad Fahad Khan <itxmfahadkhan@gmail.com>
Co-authored-by: Pizza Party <paol.m@proton.me>
Co-authored-by: Radoslav Lelchev <rlelchev@abv.bg>
Co-authored-by: Rex_sa <rex.sa@pm.me>
Co-authored-by: Roi Gabay <roigby@gmail.com>
Co-authored-by: Sam Cooper <samcooper838@gmail.com>
Co-authored-by: Samiul Islam <samiulislamsharan@gmail.com>
Co-authored-by: ShareASmile <aapshergill@gmail.com>
Co-authored-by: Skrripy <Skrripy@users.noreply.hosted.weblate.org>
Co-authored-by: Skrripy <rozihrash.ya6w7@simplelogin.com>
Co-authored-by: Subham Jena <subhamjena8465@gmail.com>
Co-authored-by: esfzzddfse <esfzzddfse@proton.me>
Co-authored-by: gallegonovato <fran-carro@hotmail.es>
Co-authored-by: l <thisuserooo@gmail.com>
Co-authored-by: mbottari <mbottari@quantum-systems.com>
Co-authored-by: pedrolinharesmoreira <pedrolinhares@unifei.edu.br>
Co-authored-by: shivashranz <shivatheboss11@gmail.com>
Co-authored-by: tabtomi8 <tabtomi88@gmail.com>
Co-authored-by: ßozo Mamed <bozo-mamed-27@hotmail.com>
Co-authored-by: Влад Николаев <vladnic1990@gmail.com>
2023-10-10 22:18:21 +02:00
LagradOst
b4da93c1de revert jackson 2023-10-10 21:45:36 +02:00
LagradOst
dd45ac9e8a reverted to android 14 -> 13 2023-10-10 20:49:04 +02:00
LagradOst
b47209483a reverted to instant outline 2023-10-10 18:05:31 +02:00
self-similarity
91b195241e
Automatic backups (#592)
Co-authored-by: Cloudburst <18114966+C10udburst@users.noreply.github.com>
2023-10-10 17:19:27 +02:00
KingLucius
abbad1bc94
Delete Focus frame from empty Downloads list & Search TV Layout (#675)
* Delete Focus frame in search TV layout

* Delete focus frame for empty Downloads list

* Chip rounded stroke frame
2023-10-10 17:17:18 +02:00
KingLucius
b120a7bce2
Library on TV (#663)
* implementation for Library on TV
2023-10-10 17:16:35 +02:00
Luna712
5b4fd8d77d
Fix issue where DownloadedPlayerActivity interferes with MainActivity (#674)
* Fix issue where DownloadedPlayerActivity interferes with MainActivity
2023-10-10 17:05:34 +02:00
LagradOst
d277d8a9aa bump upstream 2023-10-10 16:56:30 +02:00
LagradOst
33eb3a3b29 lib fix2 2023-10-07 21:48:24 +02:00
LagradOst
f14557fe6a lib fix 2023-10-07 01:54:34 +02:00
LagradOst
77294dc68e cleanup 2023-10-07 01:39:30 +02:00
Luna712
0a327ccbda
Reload library when reloading home (#656)
So that library is reloaded when switching accounts.

Fixes #650
2023-10-06 23:50:31 +02:00
LagradOst
177b1e47f3 added extra logging 2023-10-04 11:33:55 +02:00
Luna712
3f5119525c
Make library preferences account specific (#649) 2023-10-03 22:59:26 +02:00
Luna712
b5d4c3bd27
Make player preferences account specific (#646) 2023-10-03 19:26:56 +02:00
Luna712
cc00e73e16
Make homepage preferences account specific (#647)
* Make homepage preferences account specific

* Fix accidentally removed whitespace

* Fix in setkey
2023-10-03 19:25:31 +02:00
Luna712
462073bd74
Make search prefs account specific (#640) 2023-10-03 16:56:38 +02:00
LagradOst
08060314ad preview seekbar m3u8 2023-10-03 16:50:34 +02:00
Luna712
1d90858f64
Make search history account specific (#638)
* Make search history account specific

* Update for clear history
2023-10-02 21:04:40 +02:00
LagradOst
bd05a67f26 preview seekbar 2023-10-02 17:44:06 +02:00
KingLucius
bb8cbb5167
More Amazon FireTV focus fixes (#636)
* cast item: mimic the same focus as ATV

* Source & Subtitles priority focus

* Subtitles sync focus

* Account management focus fixes
2023-10-01 01:26:07 +02:00
KingLucius
16c2290090
Amazon FireTV focus fixes (#635)
* Fix quick search button focus

* Switch profile button focus

* Cast & Recommendations focus

* Player: Profiles settings focus

* Player: Subtitles encoding settings focus

* profile selection: card item focus

* Search history item selectable & deleteable

* Search: search filter button next focus fix
2023-09-28 12:22:51 +02:00
KingLucius
194678c419
Player Source & Subs navigation change (#633) 2023-09-28 12:21:03 +02:00
Osten
0351053d80
Readded downloads to tv 2023-09-25 22:57:18 +02:00
Sofie
74060e7da3
Chillx: fix key (#628) 2023-09-25 13:48:35 +02:00
IndusAryan
1e2a11d6e4
refactor: speedostream and newpipe, tmdb update (#632)
* migrate speedostream (yomovies)

* update tmdb and newpipe
2023-09-25 13:48:05 +02:00
CranberrySoup
b8917ffa39
Fix episode layout when using RTL language (#631)
* Fix episode layout when using RTL language
2023-09-25 11:40:58 +02:00
CranberrySoup
d4fff7cee6
Add homepage search on TV (#618)
* Add search button on homepage for TV
2023-09-21 22:50:31 +02:00
LagradOst
527a6388a9 small fix 2023-09-21 22:46:23 +02:00
CranberrySoup
15333123cd
TV UI fixes (#612)
* TV UI fixes
2023-09-18 23:22:39 +02:00
LagradOst
2ae5b6cefb fixed the fucking updater 💀 2023-09-18 22:28:26 +02:00
LagradOst
0d2a19b350 bump 2023-09-17 20:38:59 +02:00
LagradOst
bff9727f96 Merge remote-tracking branch 'origin/master' 2023-09-17 20:35:11 +02:00
LagradOst
a82059cb57 fix 2023-09-17 20:35:01 +02:00
CranberrySoup
627c1bb223
Many UI fixes (#606)
* Lower targetSdk to get all installed packages

* Update sdk version

* Let's not be too radical

* Many fixes

* Revert targetSdk

* Make account homepage persistent
2023-09-16 00:30:34 +02:00
CranberrySoup
24977a8d62
Potential fix for crash loops (#608) 2023-09-15 22:47:59 +02:00
LagradOst
6957a8f95d bump 2023-09-14 20:30:44 +02:00
Sofie
2bed79b1f1
Update Gofile.kt (#600) 2023-09-14 12:53:54 +02:00
self-similarity
a5450e5da2
More robust player release (#601) 2023-09-14 12:53:35 +02:00
LagradOst
8fe34d3d2a Merge remote-tracking branch 'origin/master' 2023-09-11 23:05:47 +02:00
LagradOst
7d6ba8c7a4 tv changes for better centering + bigger text + better contrast 2023-09-11 23:05:10 +02:00
self-similarity
2baa75496e
Fix opensubtitles (#598)
* Fix OpenSubtitles
2023-09-11 20:13:42 +02:00
Sofie
01e7acdeac
getTracker: switched to anilist api (#593)
* getTracker: switched to anilist api

---------

Co-authored-by: Sofie99 <Sofie99@gmail.com>
2023-09-11 14:31:11 +02:00
LagradOst
10bc688eaf fixed tracker on dub 2023-09-11 14:29:30 +02:00
LagradOst
7f7c81828a added UI event for seekbar 2023-09-11 13:37:11 +02:00
KingLucius
f6b0ea8dfa
Stream button type switch support (#597)
* Stream button type switch support

* Hide Hls playlist switch
2023-09-10 15:31:01 +02:00
LagradOst
0afbc90cd2 fixed last fix 2023-09-09 23:57:18 +02:00
LagradOst
85c4c74222 fixed shitty external extractor code 2023-09-09 23:53:35 +02:00
LagradOst
b6e99d7358 backend change for events in player 2023-09-09 23:18:21 +02:00
self-similarity
130cc16e25
Simkl API optimizations (#581)
* Fix episode removal in simkl

* Simkl API optimizations
2023-09-09 00:13:04 +02:00
recloudstream[bot]
1629db2fc9 chore(locales): fix locale issues 2023-09-08 08:01:34 +00:00
Weblate (bot)
f05c65cf5c
Translated using Weblate (Odia) (#574)
Currently translated at 39.5% (249 of 630 strings)

Translated using Weblate (Odia)

Currently translated at 25.0% (1 of 4 strings)

Translated using Weblate (Odia)

Currently translated at 38.8% (245 of 630 strings)

Translated using Weblate (German)

Currently translated at 99.8% (629 of 630 strings)

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Tamil)

Currently translated at 20.9% (132 of 630 strings)

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (4 of 4 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (630 of 630 strings)

Translated using Weblate (Croatian)

Currently translated at 99.8% (629 of 630 strings)

Translated using Weblate (Croatian)

Currently translated at 99.3% (626 of 630 strings)

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Arabic (Najdi))

Currently translated at 54.9% (346 of 630 strings)

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (630 of 630 strings)

Merge remote-tracking branch 'origin/master'

Translated using Weblate (French)

Currently translated at 100.0% (630 of 630 strings)

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Hungarian)

Currently translated at 85.7% (540 of 630 strings)

Translated using Weblate (Romanian)

Currently translated at 95.7% (603 of 630 strings)

Translated using Weblate (Arabic (Najdi))

Currently translated at 50.1% (316 of 630 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (630 of 630 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 96.1% (606 of 630 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Arabic (Najdi))

Currently translated at 44.9% (283 of 630 strings)

Translated using Weblate (Arabic (Najdi))

Currently translated at 39.6% (250 of 630 strings)

Translated using Weblate (Arabic (Najdi))

Currently translated at 39.5% (249 of 630 strings)

Translated using Weblate (German)

Currently translated at 100.0% (4 of 4 strings)

Translated using Weblate (German)

Currently translated at 100.0% (4 of 4 strings)

Translated using Weblate (German)

Currently translated at 99.8% (629 of 630 strings)

Translated using Weblate (German)

Currently translated at 99.8% (629 of 630 strings)

Translated using Weblate (Arabic (Najdi))

Currently translated at 33.4% (211 of 630 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (630 of 630 strings)

Translated using Weblate (German)

Currently translated at 99.8% (629 of 630 strings)

Translated using Weblate (German)

Currently translated at 99.8% (629 of 630 strings)

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Merge remote-tracking branch 'origin/master'

Update translation files

Updated by "Remove blank strings" hook in Weblate.

Translated using Weblate (Arabic (Najdi))

Currently translated at 32.0% (202 of 630 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 91.5% (577 of 630 strings)

Translated using Weblate (Arabic (Saudi Arabia))

Currently translated at 100.0% (4 of 4 strings)

Translated using Weblate (Arabic (Najdi))

Currently translated at 23.9% (151 of 630 strings)

Added translation using Weblate (Arabic (South Levantine))

Translated using Weblate (Amharic)

Currently translated at 14.9% (94 of 630 strings)

Translated using Weblate (Tigrinya)

Currently translated at 15.0% (95 of 630 strings)

Added translation using Weblate (Amharic)

Added translation using Weblate (Tigrinya)

Merge remote-tracking branch 'origin/master'

Translated using Weblate (Hungarian)

Currently translated at 85.2% (537 of 630 strings)

Translated using Weblate (Hungarian)

Currently translated at 81.4% (513 of 630 strings)


















Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/am/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ars/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/de/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/fr/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/hr/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/hu/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/or/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/pt_BR/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ro/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ta/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/ti/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/app/uk/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/fastlane/ar_SA/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/fastlane/de/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/fastlane/or/
Translate-URL: https://hosted.weblate.org/projects/cloudstream/fastlane/uk/
Translation: Cloudstream/App
Translation: Cloudstream/Fastlane

Co-authored-by: Alexandru <negrualexandru52@gmail.com>
Co-authored-by: Anarchydr <patrikpik879@gmail.com>
Co-authored-by: Cait Martin Newnham <85128509+helloiamcait@users.noreply.github.com>
Co-authored-by: Carlos Luiz <ecarlos-luiz@hotmail.com>
Co-authored-by: Chi Uma <jivanov.2048@gmail.com>
Co-authored-by: GobinathAL <gobinathal8@gmail.com>
Co-authored-by: Gyuri Bajzik <bajzikgy@gmail.com>
Co-authored-by: Joel Brink <joel.brink.handy@gmail.com>
Co-authored-by: Julian <hello@apollo.moe>
Co-authored-by: Mubarek Seyd Juhar <mubareksd@gmail.com>
Co-authored-by: Sam Cooper <samcooper838@gmail.com>
Co-authored-by: Skrripy <rozihrash.ya6w7@simplelogin.com>
Co-authored-by: Subham Jena <subhamjena8465@gmail.com>
Co-authored-by: mbottari <mbottari@quantum-systems.com>
Co-authored-by: pedrolinharesmoreira <pedrolinhares@unifei.edu.br>
Co-authored-by: tabtomi8 <tabtomi88@gmail.com>
2023-09-08 10:01:11 +02:00
IndusAryan
4ddd78ebb6
fook jitpack (#595) 2023-09-08 10:00:00 +02:00
LagradOst
49731cd699 changed drm API a bit 2023-09-06 22:42:22 +02:00
LagradOst
3fe247fb19 added drm player support 2023-09-06 20:53:43 +02:00
CranberrySoup
0839775172
Upgrade SDK (#590)
* Update sdk version

* Let's not be too radical
2023-09-04 22:36:36 +02:00
LagradOst
6211b02e85 switched from isM3u8 to ExtractorLinkType 2023-09-03 23:32:43 +02:00
Sofie
9c991f2abd
extractor: fix chillx (#583)
* Extractor: added Rabbitstream

* Extractor: added Rabbitstream

* extractor: fix Chillx

* comply

---------

Co-authored-by: Sofie99 <Sofie99@gmail.com>
2023-09-02 00:32:18 +02:00
LagradOst
6089cbc484 fixed subs on downloads 2023-08-30 00:52:34 +02:00
LagradOst
ce1f48978b fixed download error 2023-08-28 20:56:58 +02:00
LagradOst
f01820059b delete resume watching + delete bookmarks buttons. fixed backup crash 2023-08-27 19:07:08 +02:00
LagradOst
7d3b8c464e Merge remote-tracking branch 'origin/master' 2023-08-25 23:16:45 +02:00
LagradOst
8193e39b30 bump + refactor 2023-08-25 23:16:34 +02:00
recloudstream[bot]
557003895b chore(locales): fix locale issues 2023-08-25 08:59:37 +00:00
Weblate (bot)
d0c03321b9
Translations update from Hosted Weblate (#568)
Co-authored-by: Carlos Luiz <ecarlos-luiz@hotmail.com>
Co-authored-by: Joel Brink <joel.brink.handy@gmail.com>
Co-authored-by: Julian <hello@apollo.moe>
Co-authored-by: Mubarek Seyd Juhar <mubareksd@gmail.com>
Co-authored-by: Sam Cooper <samcooper838@gmail.com>
Co-authored-by: Skrripy <rozihrash.ya6w7@simplelogin.com>
Co-authored-by: mbottari <mbottari@quantum-systems.com>
Co-authored-by: tabtomi8 <tabtomi88@gmail.com>
2023-08-25 10:59:18 +02:00
Sofie
2d82480398
fix Rabbitstream (#573)
Co-authored-by: Sofie99 <Sofie99@gmail.com>
2023-08-25 10:58:58 +02:00
LagradOst
b38a9b1ff5 fuck android 2023-08-24 21:39:05 +02:00
LagradOst
1a4cbcaea0 small fix 2023-08-24 21:17:42 +02:00
948 changed files with 87253 additions and 36841 deletions

View file

@ -80,13 +80,13 @@ body:
label: Acknowledgements label: Acknowledgements
description: Your issue will be closed if you haven't done these steps. description: Your issue will be closed if you haven't done these steps.
options: options:
- label: I am sure my issue is related to the app and **NOT some extension**.
required: true
- label: I have searched the existing issues and this is a new ticket, **NOT** a duplicate or related to another open issue. - label: I have searched the existing issues and this is a new ticket, **NOT** a duplicate or related to another open issue.
required: true required: true
- label: I have written a short but informative title. - label: I have written a short but informative title.
required: true required: true
- label: I have updated the app to pre-release version **[Latest](https://github.com/recloudstream/cloudstream/releases)**. - label: I have updated the app to pre-release version **[Latest](https://github.com/recloudstream/cloudstream/releases)**.
required: true required: true
- label: If related to a provider, I have checked the site and it works, but not the app.
required: true
- label: I will fill out all of the requested information in this form. - label: I will fill out all of the requested information in this form.
required: true required: true

View file

@ -2,7 +2,7 @@ blank_issues_enabled: false
contact_links: contact_links:
- name: Request a new provider or report bug with an existing provider - name: Request a new provider or report bug with an existing provider
url: https://github.com/recloudstream url: https://github.com/recloudstream
about: Please do not report any provider bugs here or request new providers. This repository does not contain any providers. Please find the appropriate repository and report your issue there or join the discord. about: EXTREMELY IMPORTANT - Please do not report any provider bugs here or request new providers. This repository does not contain any providers. Please find the appropriate repository and report your issue there or join the discord.
- name: Discord - name: Discord
url: https://discord.gg/5Hus6fM url: https://discord.gg/5Hus6fM
about: Join our discord for faster support on smaller issues. about: Join our discord for faster support on smaller issues.

View file

@ -27,9 +27,7 @@ body:
label: Acknowledgements label: Acknowledgements
description: Your issue will be closed if you haven't done these steps. description: Your issue will be closed if you haven't done these steps.
options: options:
- label: My suggestion is **NOT** about adding a new provider
required: true
- label: I have searched the existing issues and this is a new ticket, **NOT** a duplicate or related to another open issue. - label: I have searched the existing issues and this is a new ticket, **NOT** a duplicate or related to another open issue.
required: true required: true
- label: I have written a short but informative title.
required: true
- label: I will fill out all of the requested information in this form.
required: true

28
.github/locales.py vendored
View file

@ -7,7 +7,7 @@ import lxml.etree as ET # builtin library doesn't preserve comments
SETTINGS_PATH = "app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsGeneral.kt" SETTINGS_PATH = "app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsGeneral.kt"
START_MARKER = "/* begin language list */" START_MARKER = "/* begin language list */"
END_MARKER = "/* end language list */" END_MARKER = "/* end language list */"
XML_NAME = "app/src/main/res/values-" XML_NAME = "app/src/main/res/values-b+"
ISO_MAP_URL = "https://raw.githubusercontent.com/haliaeetus/iso-639/master/data/iso_639-1.min.json" ISO_MAP_URL = "https://raw.githubusercontent.com/haliaeetus/iso-639/master/data/iso_639-1.min.json"
INDENT = " "*4 INDENT = " "*4
@ -20,29 +20,29 @@ rest, after_src = rest.split(END_MARKER)
# Load already added langs # Load already added langs
languages = {} languages = {}
for lang in re.finditer(r'Triple\("(.*)", "(.*)", "(.*)"\)', rest): for lang in re.finditer(r'Pair\("(.*)", "(.*)"\)', rest):
flag, name, iso = lang.groups() name, iso = lang.groups()
languages[iso] = (flag, name) languages[iso] = name
# Add not yet added langs # Add not yet added langs
for folder in glob.glob(f"{XML_NAME}*"): for folder in glob.glob(f"{XML_NAME}*"):
iso = folder[len(XML_NAME):] iso = folder[len(XML_NAME):].replace("+", "-")
if iso not in languages.keys(): if iso not in languages.keys():
entry = iso_map.get(iso.lower(),{'nativeName':iso}) entry = iso_map.get(iso.lower(), {'nativeName':iso}) # fallback to iso code if not found
languages[iso] = ("", entry['nativeName'].split(',')[0]) languages[iso] = entry['nativeName'].split(',')[0] # first name if there are multiple
# Create triples # Create pairs
triples = [] pairs = []
for iso in sorted(languages.keys()): for iso in sorted(languages, key=lambda iso: languages[iso].lower()): # sort by language name
flag, name = languages[iso] name = languages[iso]
triples.append(f'{INDENT}Triple("{flag}", "{name}", "{iso}"),') pairs.append(f'{INDENT}Pair("{name}", "{iso}"),')
# Update settings file # Update settings file
open(SETTINGS_PATH, "w+",encoding='utf-8').write( open(SETTINGS_PATH, "w+",encoding='utf-8').write(
before_src + before_src +
START_MARKER + START_MARKER +
"\n" + "\n" +
"\n".join(triples) + "\n".join(pairs) +
"\n" + "\n" +
END_MARKER + END_MARKER +
after_src after_src
@ -53,6 +53,8 @@ for file in glob.glob(f"{XML_NAME}*/strings.xml"):
try: try:
tree = ET.parse(file) tree = ET.parse(file)
for child in tree.getroot(): for child in tree.getroot():
if not child.text:
continue
if child.text.startswith("\\@string/"): if child.text.startswith("\\@string/"):
print(f"[{file}] fixing {child.attrib['name']}") print(f"[{file}] fixing {child.attrib['name']}")
child.text = child.text.replace("\\@string/", "@string/") child.text = child.text.replace("\\@string/", "@string/")

View file

@ -9,6 +9,9 @@ on:
- '**/wcokey.txt' - '**/wcokey.txt'
workflow_dispatch: workflow_dispatch:
permissions:
contents: read
concurrency: concurrency:
group: "Archive-build" group: "Archive-build"
cancel-in-progress: true cancel-in-progress: true
@ -19,26 +22,31 @@ jobs:
steps: steps:
- name: Generate access token - name: Generate access token
id: generate_token id: generate_token
uses: tibdex/github-app-token@v1 uses: tibdex/github-app-token@v2
with: with:
app_id: ${{ secrets.GH_APP_ID }} app_id: ${{ secrets.GH_APP_ID }}
private_key: ${{ secrets.GH_APP_KEY }} private_key: ${{ secrets.GH_APP_KEY }}
repository: "recloudstream/secrets" repository: "recloudstream/secrets"
- name: Generate access token (archive) - name: Generate access token (archive)
id: generate_archive_token id: generate_archive_token
uses: tibdex/github-app-token@v1 uses: tibdex/github-app-token@v2
with: with:
app_id: ${{ secrets.GH_APP_ID }} app_id: ${{ secrets.GH_APP_ID }}
private_key: ${{ secrets.GH_APP_KEY }} private_key: ${{ secrets.GH_APP_KEY }}
repository: "recloudstream/cloudstream-archive" repository: "recloudstream/cloudstream-archive"
- uses: actions/checkout@v2
- uses: actions/checkout@v6
- name: Set up JDK 17 - name: Set up JDK 17
uses: actions/setup-java@v2 uses: actions/setup-java@v5
with: with:
java-version: '17' distribution: temurin
distribution: 'adopt' java-version: 17
- name: Grant execute permission for gradlew - name: Grant execute permission for gradlew
run: chmod +x gradlew run: chmod +x gradlew
- name: Fetch keystore - name: Fetch keystore
id: fetch_keystore id: fetch_keystore
run: | run: |
@ -49,24 +57,31 @@ jobs:
KEY_PWD="$(cat keystore_password.txt)" KEY_PWD="$(cat keystore_password.txt)"
echo "::add-mask::${KEY_PWD}" echo "::add-mask::${KEY_PWD}"
echo "key_pwd=$KEY_PWD" >> $GITHUB_OUTPUT echo "key_pwd=$KEY_PWD" >> $GITHUB_OUTPUT
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v5
with:
cache-encryption-key: ${{ secrets.GRADLE_ENCRYPTION_KEY }}
- name: Run Gradle - name: Run Gradle
run: | run: ./gradlew assemblePrereleaseRelease
./gradlew assemblePrerelease
env: env:
SIGNING_KEY_ALIAS: "key0" SIGNING_KEY_ALIAS: "key0"
SIGNING_KEY_PASSWORD: ${{ steps.fetch_keystore.outputs.key_pwd }} SIGNING_KEY_PASSWORD: ${{ steps.fetch_keystore.outputs.key_pwd }}
SIGNING_STORE_PASSWORD: ${{ steps.fetch_keystore.outputs.key_pwd }} SIGNING_STORE_PASSWORD: ${{ steps.fetch_keystore.outputs.key_pwd }}
SIMKL_CLIENT_ID: ${{ secrets.SIMKL_CLIENT_ID }} SIMKL_CLIENT_ID: ${{ secrets.SIMKL_CLIENT_ID }}
SIMKL_CLIENT_SECRET: ${{ secrets.SIMKL_CLIENT_SECRET }} SIMKL_CLIENT_SECRET: ${{ secrets.SIMKL_CLIENT_SECRET }}
- uses: actions/checkout@v3 TRAKT_CLIENT_ID: ${{ secrets.TRAKT_CLIENT_ID }}
MDL_API_KEY: ${{ secrets.MDL_API_KEY }}
- uses: actions/checkout@v6
with: with:
repository: "recloudstream/cloudstream-archive" repository: "recloudstream/cloudstream-archive"
token: ${{ steps.generate_archive_token.outputs.token }} token: ${{ steps.generate_archive_token.outputs.token }}
path: "archive" path: "archive"
- name: Move build - name: Move build
run: | run: cp app/build/outputs/apk/prerelease/release/*.apk "archive/$(git rev-parse --short HEAD).apk"
cp app/build/outputs/apk/prerelease/release/*.apk "archive/$(git rev-parse --short HEAD).apk"
- name: Push archive - name: Push archive
run: | run: |

View file

@ -1,37 +1,37 @@
name: Dokka name: Dokka
# https://docs.github.com/en/actions/learn-github-actions/workflow-syntax-for-github-actions#concurrency
concurrency:
group: "dokka"
cancel-in-progress: true
on: on:
push: push:
branches: branches: [ master ]
# choose your default branch
- master
- main
paths-ignore: paths-ignore:
- '*.md' - '*.md'
permissions:
contents: read
concurrency:
group: "dokka"
cancel-in-progress: true
jobs: jobs:
build: build:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Generate access token - name: Generate access token
id: generate_token id: generate_token
uses: tibdex/github-app-token@v1 uses: tibdex/github-app-token@v2
with: with:
app_id: ${{ secrets.GH_APP_ID }} app_id: ${{ secrets.GH_APP_ID }}
private_key: ${{ secrets.GH_APP_KEY }} private_key: ${{ secrets.GH_APP_KEY }}
repository: "recloudstream/dokka" repository: "recloudstream/dokka"
- name: Checkout - name: Checkout
uses: actions/checkout@master uses: actions/checkout@v6
with: with:
path: "src" path: "src"
- name: Checkout dokka - name: Checkout dokka
uses: actions/checkout@master uses: actions/checkout@v6
with: with:
repository: "recloudstream/dokka" repository: "recloudstream/dokka"
path: "dokka" path: "dokka"
@ -40,25 +40,28 @@ jobs:
- name: Clean old builds - name: Clean old builds
run: | run: |
cd $GITHUB_WORKSPACE/dokka/ cd $GITHUB_WORKSPACE/dokka/
rm -rf "./-cloudstream" rm -rf "./app"
rm -rf "./library"
- name: Set up JDK 17 - name: Set up JDK 17
uses: actions/setup-java@v1 uses: actions/setup-java@v5
with: with:
distribution: temurin
java-version: 17 java-version: 17
- name: Setup Android SDK - name: Setup Gradle
uses: android-actions/setup-android@v2 uses: gradle/actions/setup-gradle@v5
with:
cache-encryption-key: ${{ secrets.GRADLE_ENCRYPTION_KEY }}
- name: Generate Dokka - name: Generate Dokka
run: | run: |
cd $GITHUB_WORKSPACE/src/ cd $GITHUB_WORKSPACE/src/
chmod +x gradlew chmod +x gradlew
./gradlew app:dokkaHtml ./gradlew docs:dokkaGeneratePublicationHtml
- name: Copy Dokka - name: Copy Dokka
run: | run: cp -r $GITHUB_WORKSPACE/src/docs/build/dokka/html/* $GITHUB_WORKSPACE/dokka/
cp -r $GITHUB_WORKSPACE/src/app/build/dokka/html/* $GITHUB_WORKSPACE/dokka/
- name: Push builds - name: Push builds
run: | run: |

View file

@ -1,88 +0,0 @@
name: Issue automatic actions
on:
issues:
types: [opened]
jobs:
issue-moderator:
runs-on: ubuntu-latest
steps:
- name: Generate access token
id: generate_token
uses: tibdex/github-app-token@v1
with:
app_id: ${{ secrets.GH_APP_ID }}
private_key: ${{ secrets.GH_APP_KEY }}
- name: Similarity analysis
id: similarity
uses: actions-cool/issues-similarity-analysis@v1
with:
token: ${{ steps.generate_token.outputs.token }}
filter-threshold: 0.60
title-excludes: ''
comment-title: |
### Your issue looks similar to these issues:
Please close if duplicate.
comment-body: '${index}. ${similarity} #${number}'
- name: Label if possible duplicate
if: steps.similarity.outputs.similar-issues-found =='true'
uses: actions/github-script@v6
with:
github-token: ${{ steps.generate_token.outputs.token }}
script: |
github.rest.issues.addLabels({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
labels: ["possible duplicate"]
})
- uses: actions/checkout@v2
- name: Automatically close issues that dont follow the issue template
uses: lucasbento/auto-close-issues@v1.0.2
with:
github-token: ${{ steps.generate_token.outputs.token }}
issue-close-message: |
@${issue.user.login}: hello! :wave:
This issue is being automatically closed because it does not follow the issue template."
closed-issues-label: "invalid"
- name: Check if issue mentions a provider
id: provider_check
env:
GH_TEXT: "${{ github.event.issue.title }} ${{ github.event.issue.body }}"
run: |
wget --output-document check_issue.py "https://raw.githubusercontent.com/recloudstream/.github/master/.github/check_issue.py"
pip3 install httpx
RES="$(python3 ./check_issue.py)"
echo "name=${RES}" >> $GITHUB_OUTPUT
- name: Comment if issue mentions a provider
if: steps.provider_check.outputs.name != 'none'
uses: actions-cool/issues-helper@v3
with:
actions: 'create-comment'
token: ${{ steps.generate_token.outputs.token }}
body: |
Hello ${{ github.event.issue.user.login }}.
Please do not report any provider bugs here. This repository does not contain any providers. Please find the appropriate repository and report your issue there or join the [discord](https://discord.gg/5Hus6fM).
Found provider name: `${{ steps.provider_check.outputs.name }}`
- name: Label if mentions provider
if: steps.provider_check.outputs.name != 'none'
uses: actions/github-script@v6
with:
github-token: ${{ steps.generate_token.outputs.token }}
script: |
github.rest.issues.addLabels({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
labels: ["possible provider issue"]
})
- name: Add eyes reaction to all issues
uses: actions-cool/emoji-helper@v1.0.0
with:
type: 'issue'
token: ${{ steps.generate_token.outputs.token }}
emoji: 'eyes'

View file

@ -12,25 +12,32 @@ concurrency:
group: "pre-release" group: "pre-release"
cancel-in-progress: true cancel-in-progress: true
permissions:
contents: write
jobs: jobs:
build: build:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Generate access token - name: Generate access token
id: generate_token id: generate_token
uses: tibdex/github-app-token@v1 uses: tibdex/github-app-token@v2
with: with:
app_id: ${{ secrets.GH_APP_ID }} app_id: ${{ secrets.GH_APP_ID }}
private_key: ${{ secrets.GH_APP_KEY }} private_key: ${{ secrets.GH_APP_KEY }}
repository: "recloudstream/secrets" repository: "recloudstream/secrets"
- uses: actions/checkout@v2
- uses: actions/checkout@v6
- name: Set up JDK 17 - name: Set up JDK 17
uses: actions/setup-java@v2 uses: actions/setup-java@v5
with: with:
java-version: '17' distribution: temurin
distribution: 'adopt' java-version: 17
- name: Grant execute permission for gradlew - name: Grant execute permission for gradlew
run: chmod +x gradlew run: chmod +x gradlew
- name: Fetch keystore - name: Fetch keystore
id: fetch_keystore id: fetch_keystore
run: | run: |
@ -41,17 +48,25 @@ jobs:
KEY_PWD="$(cat keystore_password.txt)" KEY_PWD="$(cat keystore_password.txt)"
echo "::add-mask::${KEY_PWD}" echo "::add-mask::${KEY_PWD}"
echo "key_pwd=$KEY_PWD" >> $GITHUB_OUTPUT echo "key_pwd=$KEY_PWD" >> $GITHUB_OUTPUT
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v5
with:
cache-encryption-key: ${{ secrets.GRADLE_ENCRYPTION_KEY }}
- name: Run Gradle - name: Run Gradle
run: | run: ./gradlew assemblePrereleaseRelease androidSourcesJar makeJar
./gradlew assemblePrerelease makeJar androidSourcesJar
env: env:
SIGNING_KEY_ALIAS: "key0" SIGNING_KEY_ALIAS: "key0"
SIGNING_KEY_PASSWORD: ${{ steps.fetch_keystore.outputs.key_pwd }} SIGNING_KEY_PASSWORD: ${{ steps.fetch_keystore.outputs.key_pwd }}
SIGNING_STORE_PASSWORD: ${{ steps.fetch_keystore.outputs.key_pwd }} SIGNING_STORE_PASSWORD: ${{ steps.fetch_keystore.outputs.key_pwd }}
SIMKL_CLIENT_ID: ${{ secrets.SIMKL_CLIENT_ID }} SIMKL_CLIENT_ID: ${{ secrets.SIMKL_CLIENT_ID }}
SIMKL_CLIENT_SECRET: ${{ secrets.SIMKL_CLIENT_SECRET }} SIMKL_CLIENT_SECRET: ${{ secrets.SIMKL_CLIENT_SECRET }}
TRAKT_CLIENT_ID: ${{ secrets.TRAKT_CLIENT_ID }}
MDL_API_KEY: ${{ secrets.MDL_API_KEY }}
- name: Create pre-release - name: Create pre-release
uses: "marvinpinto/action-automatic-releases@latest" uses: marvinpinto/action-automatic-releases@latest
with: with:
repo_token: "${{ secrets.GITHUB_TOKEN }}" repo_token: "${{ secrets.GITHUB_TOKEN }}"
automatic_release_tag: "pre-release" automatic_release_tag: "pre-release"

View file

@ -2,22 +2,35 @@ name: Artifact Build
on: [pull_request] on: [pull_request]
permissions:
contents: read
jobs: jobs:
build: build:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v6
- name: Set up JDK 17 - name: Set up JDK 17
uses: actions/setup-java@v2 uses: actions/setup-java@v5
with: with:
java-version: '17' distribution: temurin
distribution: 'adopt' java-version: 17
- name: Grant execute permission for gradlew - name: Grant execute permission for gradlew
run: chmod +x gradlew run: chmod +x gradlew
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v5
with:
cache-encryption-key: ${{ secrets.GRADLE_ENCRYPTION_KEY }}
cache-read-only: false
- name: Run Gradle - name: Run Gradle
run: ./gradlew assemblePrereleaseDebug run: ./gradlew assemblePrereleaseDebug lint check
- name: Upload Artifact - name: Upload Artifact
uses: actions/upload-artifact@v2 uses: actions/upload-artifact@v7
with: with:
name: pull-request-build name: pull-request-build
path: "app/build/outputs/apk/prerelease/debug/*.apk" path: "app/build/outputs/apk/prerelease/debug/*.apk"

View file

@ -1,37 +1,41 @@
name: Fix locale issues name: Fix locale issues
on: on:
workflow_dispatch:
push: push:
branches: [ master ]
paths: paths:
- '**.xml' - '**.xml'
branches: workflow_dispatch:
- master
concurrency: concurrency:
group: "locale" group: "locale"
cancel-in-progress: true cancel-in-progress: true
permissions:
contents: read
jobs: jobs:
create: create:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Generate access token - name: Generate access token
id: generate_token id: generate_token
uses: tibdex/github-app-token@v1 uses: tibdex/github-app-token@v2
with: with:
app_id: ${{ secrets.GH_APP_ID }} app_id: ${{ secrets.GH_APP_ID }}
private_key: ${{ secrets.GH_APP_KEY }} private_key: ${{ secrets.GH_APP_KEY }}
repository: "recloudstream/cloudstream" repository: "recloudstream/cloudstream"
- uses: actions/checkout@v2
- uses: actions/checkout@v6
with: with:
token: ${{ steps.generate_token.outputs.token }} token: ${{ steps.generate_token.outputs.token }}
- name: Install dependencies - name: Install dependencies
run: | run: pip3 install lxml requests
pip3 install lxml
- name: Edit files - name: Edit files
run: | run: python3 .github/locales.py
python3 .github/locales.py
- name: Commit to the repo - name: Commit to the repo
run: | run: |
git config --local user.email "111277985+recloudstream[bot]@users.noreply.github.com" git config --local user.email "111277985+recloudstream[bot]@users.noreply.github.com"

218
.gitignore vendored
View file

@ -1,5 +1,3 @@
*.iml
.gradle
/local.properties /local.properties
/.idea/caches /.idea/caches
/.idea/misc.xml /.idea/misc.xml
@ -11,6 +9,220 @@
.DS_Store .DS_Store
/build /build
/captures /captures
.externalNativeBuild
.cxx .cxx
.kotlin/*
# Created by https://www.toptal.com/developers/gitignore/api/kotlin,java,android,androidstudio,visualstudiocode
# Edit at https://www.toptal.com/developers/gitignore?templates=kotlin,java,android,androidstudio,visualstudiocode
### Android ###
# Gradle files
.gradle/
build/
# Local configuration file (sdk path, etc)
local.properties local.properties
# Log/OS Files
*.log
# Android Studio generated files and folders
captures/
.externalNativeBuild/
.cxx/
*.apk
output.json
# IntelliJ
*.iml
.idea/
misc.xml
deploymentTargetDropDown.xml
render.experimental.xml
# Keystore files
*.jks
*.keystore
# Google Services (e.g. APIs or Firebase)
google-services.json
# Android Profiling
*.hprof
### Android Patch ###
gen-external-apklibs
# Replacement of .externalNativeBuild directories introduced
# with Android Studio 3.5.
### Java ###
# Compiled class file
*.class
# Log file
# BlueJ files
*.ctxt
# Mobile Tools for Java (J2ME)
.mtj.tmp/
# Package Files #
*.jar
*.war
*.nar
*.ear
*.zip
*.tar.gz
*.rar
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*
replay_pid*
### Kotlin ###
# Compiled class file
# Log file
# BlueJ files
# Mobile Tools for Java (J2ME)
# Package Files #
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
### VisualStudioCode ###
.vscode/*
# Local History for Visual Studio Code
.history/
# Built Visual Studio Code Extensions
*.vsix
### VisualStudioCode Patch ###
# Ignore all local history of files
.history
.ionide
### AndroidStudio ###
# Covers files to be ignored for android development using Android Studio.
# Built application files
*.ap_
*.aab
# Files for the ART/Dalvik VM
*.dex
# Java class files
# Generated files
bin/
gen/
out/
# Gradle files
.gradle
# Signing files
.signing/
# Local configuration file (sdk path, etc)
# Proguard folder generated by Eclipse
proguard/
# Log Files
# Android Studio
/*/build/
/*/local.properties
/*/out
/*/*/build
/*/*/production
.navigation/
*.ipr
*~
*.swp
# Keystore files
# Google Services (e.g. APIs or Firebase)
# google-services.json
# Android Patch
# External native build folder generated in Android Studio 2.2 and later
.externalNativeBuild
# NDK
obj/
# IntelliJ IDEA
*.iws
/out/
# User-specific configurations
.idea/caches/
.idea/libraries/
.idea/shelf/
.idea/workspace.xml
.idea/tasks.xml
.idea/.name
.idea/compiler.xml
.idea/copyright/profiles_settings.xml
.idea/encodings.xml
.idea/misc.xml
.idea/modules.xml
.idea/scopes/scope_settings.xml
.idea/dictionaries
.idea/vcs.xml
.idea/jsLibraryMappings.xml
.idea/datasources.xml
.idea/dataSources.ids
.idea/sqlDataSources.xml
.idea/dynamic.xml
.idea/uiDesigner.xml
.idea/assetWizardSettings.xml
.idea/gradle.xml
.idea/jarRepositories.xml
.idea/navEditor.xml
# Legacy Eclipse project files
.classpath
.project
.cproject
.settings/
# Mobile Tools for Java (J2ME)
# Package Files #
# virtual machine crash logs (Reference: http://www.java.com/en/download/help/error_hotspot.xml)
## Plugin-specific files:
# mpeltonen/sbt-idea plugin
.idea_modules/
# JIRA plugin
atlassian-ide-plugin.xml
# Mongo Explorer plugin
.idea/mongoSettings.xml
# Crashlytics plugin (for Android Studio and IntelliJ)
com_crashlytics_export_strings.xml
crashlytics.properties
crashlytics-build.properties
fabric.properties
### AndroidStudio Patch ###
!/gradle/wrapper/gradle-wrapper.jar
# End of https://www.toptal.com/developers/gitignore/api/kotlin,java,android,androidstudio,visualstudiocode

1
.idea/.name generated
View file

@ -1 +0,0 @@
CloudStream

View file

@ -1,123 +0,0 @@
<component name="ProjectCodeStyleConfiguration">
<code_scheme name="Project" version="173">
<JetCodeStyleSettings>
<option name="CODE_STYLE_DEFAULTS" value="KOTLIN_OFFICIAL" />
</JetCodeStyleSettings>
<codeStyleSettings language="XML">
<option name="FORCE_REARRANGE_MODE" value="1" />
<indentOptions>
<option name="CONTINUATION_INDENT_SIZE" value="4" />
</indentOptions>
<arrangement>
<rules>
<section>
<rule>
<match>
<AND>
<NAME>xmlns:android</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>^$</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>xmlns:.*</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>^$</XML_NAMESPACE>
</AND>
</match>
<order>BY_NAME</order>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*:id</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*:name</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>name</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>^$</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>style</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>^$</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>^$</XML_NAMESPACE>
</AND>
</match>
<order>BY_NAME</order>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
</AND>
</match>
<order>ANDROID_ATTRIBUTE_ORDER</order>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>.*</XML_NAMESPACE>
</AND>
</match>
<order>BY_NAME</order>
</rule>
</section>
</rules>
</arrangement>
</codeStyleSettings>
<codeStyleSettings language="kotlin">
<option name="CODE_STYLE_DEFAULTS" value="KOTLIN_OFFICIAL" />
</codeStyleSettings>
</code_scheme>
</component>

View file

@ -1,5 +0,0 @@
<component name="ProjectCodeStyleConfiguration">
<state>
<option name="USE_PER_PROJECT_SETTINGS" value="true" />
</state>
</component>

6
.idea/compiler.xml generated
View file

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<bytecodeTargetLevel target="17" />
</component>
</project>

7
.idea/discord.xml generated
View file

@ -1,7 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="DiscordProjectSettings">
<option name="show" value="PROJECT_FILES" />
<option name="description" value="" />
</component>
</project>

20
.idea/gradle.xml generated
View file

@ -1,20 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="GradleMigrationSettings" migrationVersion="1" />
<component name="GradleSettings">
<option name="linkedExternalProjectsSettings">
<GradleProjectSettings>
<option name="delegatedBuild" value="true" />
<option name="testRunner" value="GRADLE" />
<option name="distributionType" value="DEFAULT_WRAPPED" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="modules">
<set>
<option value="$PROJECT_DIR$" />
<option value="$PROJECT_DIR$/app" />
</set>
</option>
</GradleProjectSettings>
</option>
</component>
</project>

View file

@ -1,40 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="RemoteRepositoriesConfiguration">
<remote-repository>
<option name="id" value="central" />
<option name="name" value="Maven Central repository" />
<option name="url" value="https://repo1.maven.org/maven2" />
</remote-repository>
<remote-repository>
<option name="id" value="jboss.community" />
<option name="name" value="JBoss Community repository" />
<option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" />
</remote-repository>
<remote-repository>
<option name="id" value="BintrayJCenter" />
<option name="name" value="BintrayJCenter" />
<option name="url" value="https://jcenter.bintray.com/" />
</remote-repository>
<remote-repository>
<option name="id" value="Google" />
<option name="name" value="Google" />
<option name="url" value="https://dl.google.com/dl/android/maven2/" />
</remote-repository>
<remote-repository>
<option name="id" value="maven" />
<option name="name" value="maven" />
<option name="url" value="https://github.com/psiegman/mvn-repo/raw/master/releases" />
</remote-repository>
<remote-repository>
<option name="id" value="maven2" />
<option name="name" value="maven2" />
<option name="url" value="https://jitpack.io" />
</remote-repository>
<remote-repository>
<option name="id" value="MavenRepo" />
<option name="name" value="MavenRepo" />
<option name="url" value="https://repo.maven.apache.org/maven2/" />
</remote-repository>
</component>
</project>

6
.idea/vcs.xml generated
View file

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="" vcs="Git" />
</component>
</project>

View file

@ -1,6 +0,0 @@
{
"githubPullRequests.ignoredPullRequestBranches": [
"master"
],
"java.configuration.updateBuildConfiguration": "interactive"
}

11
AI-POLICY.md Normal file
View file

@ -0,0 +1,11 @@
# AI Policy
AI is a great tool. However, we want you to follow these rules regarding usage of AI in order to ensure the quality of both code and discussions.
1. Always state any AI usage in pull requests and issues.
2. Always test code before making a pull request. We do not want to test your AI generated code.
3. Listen to humans over computers. Contributors to CloudStream know this codebase better than an AI.
4. You should be able to explain and fix any code you submit. We do in-depth reviews and will reject low effort contributions.

View file

@ -1,11 +1,46 @@
# CloudStream # CloudStream
**⚠️ Warning: By default this app doesn't provide any video sources, you have to install extensions in order to add functionality to the app.** **⚠️ Warning: By default, this app doesn't provide any video sources; you have to install extensions to add functionality to the app.**
[![Discord](https://invidget.switchblade.xyz/5Hus6fM)](https://discord.gg/5Hus6fM) [![Discord](https://invidget.switchblade.xyz/5Hus6fM)](https://discord.gg/5Hus6fM)
### Features:
## Table of Contents:
+ [About Us:](#about_us)
+ [Installation Steps:](#install_rules)
+ [Contributing:](#contributing)
+ [Issues:](#issues)
+ [Bugs Reports:](#bug_report)
+ [Enhancement:](#enhancment)
+ [Extension Development:](#extensions)
+ [Language Support:](#languages)
+ [Further Sources](#contact_and_sources)
<a id="about_us"></a>
## About us:
**CloudStream is a media center that prioritizes and emphasizes complete freedom and flexibility for users and developers.**
CloudStream is an extension-based multimedia player with tracking support. There are extensions to view videos from:
+ [Librevox (audio-books)](https://librivox.org/)
+ [Youtube](https://www.youtube.com/)
+ [Twitch](https://www.twitch.tv/)
+ [iptv-org (A collection of publicly available IPTV (Internet Protocol television) channels from all over the world.)](https://github.com/iptv-org/iptv)
+ [nginx](https://nginx.org/)
+ And more...
**Please don't create illegal extensions or use any that host any copyrighted media.** For more details about our stance on the DMCA and EUCD, you can read about it on our organization: [reCloudStream](https://github.com/recloudstream)
#### Important Copyright Note:
Our documentation is unmaintained and open to contributions; therefore, apps and sources, extensions in recommended sources, and recommended apps are not officially moderated or endorsed by CloudStream; if you or another copyright owner identify an extension that breaches your copyright, please let us know.
#### Features:
+ **AdFree**, No ads whatsoever + **AdFree**, No ads whatsoever
+ No tracking/analytics + No tracking/analytics
+ Bookmarks + Bookmarks
@ -13,7 +48,64 @@
+ Chromecast + Chromecast
+ Extension system for personal customization + Extension system for personal customization
<a id="install_rules"></a>
## Installation:
Our documentation provides the steps to install and configure CloudStream for your streaming needs.
[Getting Started With CloudStream:](https://recloudstream.github.io/csdocs/)
<a id="contributing"></a>
## Contributing:
We **happily** accept any contributions to our project. To find out where you can start contributing towards the project, please look [at our issues tab](/cloudstream/issues)
<a id="issues"></a>
### Issues:
While we **actively** accept issues and pull requests, we do require you fill out an [template](https://github.com/recloudstream/cloudstream/issues/new/choose) for issues. These include the following:
<a id="bug_report"></a>
- [Bug Report Template: ](https://github.com/recloudstream/cloudstream/issues/new?assignees=&labels=bug&projects=&template=application-bug.yml)
- For bug reports, we want as much info as possible, including your downloaded version of CloudeStream, device and updated version (if possible, current API),
expected behavior of the program, and the actual behavior that the program did, most importantly we require clear, reproducible steps of the bug. If your bug can't be reproduced, it is unlikely we'll work on your issue.
<a id="enhancment"></a>
- [Feature Request Template: ](https://github.com/recloudstream/cloudstream/issues/new?assignees=&labels=enhancement&projects=&template=feature-request.yml)
- Before adding a feature request, please check to see if a feature request already has been requested.
### Extensions:
**Further details on creating extensions for CloudStream are found in our documentation.**
[Guide: For Extension Developers](https://recloudstream.github.io/csdocs/devs/gettingstarted/)
<a id="contact_and_sources"></a>
## Further Sources:
As well as providing clear install steps, our [website](https://dweb.link/ipns/cloudstream.on.fleek.co/) includes a wide variety of other tools, such as:
- [Troubleshooting](https://recloudstream.github.io/csdocs/troubleshooting/)
- [Further CloudStream Repositories](https://recloudstream.github.io/csdocs/repositories/)
- Set-Up for other devices, such as:
- [Android TV](https://recloudstream.github.io/csdocs/other-devices/tv/)
- [Windows](https://recloudstream.github.io/csdocs/other-devices/windows/)
- [Linux](https://recloudstream.github.io/csdocs/other-devices/linux/)
- And more...
<a id="languages"> </a>
### Supported languages: ### Supported languages:
Even if you can't contribute to the code or documentation, we always look for those who can contribute to translation and language support. Your contribution is exceptionally appreciated; you can check our translation from the figure below.
<a href="https://hosted.weblate.org/engage/cloudstream/"> <a href="https://hosted.weblate.org/engage/cloudstream/">
<img src="https://hosted.weblate.org/widgets/cloudstream/-/app/multi-auto.svg" alt="Translation status" /> <img src="https://hosted.weblate.org/widgets/cloudstream/-/app/multi-auto.svg" alt="Translation status" />
</a> </a>

View file

@ -1,6 +0,0 @@
# Set this to the minimum version your project supports.
cmake_minimum_required(VERSION 3.18)
project(CrashHandler)
find_library(log-lib log)
add_library(native-lib SHARED src/main/cpp/native-lib.cpp)
target_link_libraries(native-lib ${log-lib})

View file

@ -1,47 +1,96 @@
import com.android.build.gradle.internal.cxx.configure.gradleLocalProperties import com.android.build.gradle.internal.cxx.configure.gradleLocalProperties
import org.jetbrains.dokka.gradle.DokkaTask import org.jetbrains.dokka.gradle.engine.parameters.KotlinPlatform
import java.io.ByteArrayOutputStream import org.jetbrains.dokka.gradle.engine.parameters.VisibilityModifier
import java.net.URL import org.jetbrains.kotlin.gradle.dsl.JvmDefaultMode
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
import org.jetbrains.kotlin.gradle.tasks.KotlinJvmCompile
plugins { plugins {
id("com.android.application") alias(libs.plugins.android.application)
id("kotlin-android") alias(libs.plugins.dokka)
id("kotlin-kapt") alias(libs.plugins.kotlin.serialization)
id("org.jetbrains.dokka")
} }
val tmpFilePath = System.getProperty("user.home") + "/work/_temp/keystore/" val javaTarget = JvmTarget.fromTarget(libs.versions.jvmTarget.get())
val prereleaseStoreFile: File? = File(tmpFilePath).listFiles()?.first()
fun String.execute() = ByteArrayOutputStream().use { baot -> abstract class GenerateGitHashTask : DefaultTask() {
if (project.exec {
workingDir = projectDir @get:InputFile
commandLine = this@execute.split(Regex("\\s")) @get:PathSensitive(PathSensitivity.RELATIVE)
standardOutput = baot abstract val headFile: RegularFileProperty
}.exitValue == 0)
String(baot.toByteArray()).trim() @get:InputDirectory
else null @get:PathSensitive(PathSensitivity.RELATIVE)
abstract val headsDir: DirectoryProperty
@get:OutputDirectory
abstract val outputDir: DirectoryProperty
@TaskAction
fun generate() {
val head = headFile.get().asFile
val hash = try {
if (head.exists()) {
// Read the commit hash from .git/HEAD
val headContent = head.readText().trim()
if (headContent.startsWith("ref:")) {
val refPath = headContent.substring(5) // e.g., refs/heads/main
val commitFile = File(head.parentFile, refPath)
if (commitFile.exists()) commitFile.readText().trim() else ""
} else headContent // If it's a detached HEAD (commit hash directly)
} else "" // If .git/HEAD doesn't exist
} catch (_: Throwable) {
"" // Just set to an empty string if any exception occurs
}.take(7) // Get the short commit hash
val outFile = outputDir.file("git-hash.txt").get().asFile
outFile.parentFile.mkdirs()
outFile.writeText(hash)
}
}
val generateGitHash = tasks.register<GenerateGitHashTask>("generateGitHash") {
val gitDir = layout.projectDirectory.dir("../.git")
headFile.set(gitDir.file("HEAD"))
headsDir.set(gitDir.dir("refs/heads"))
outputDir.set(layout.buildDirectory.dir("generated/git"))
} }
android { android {
@Suppress("UnstableApiUsage")
testOptions { testOptions {
unitTests.isReturnDefaultValues = true unitTests.isReturnDefaultValues = true
} }
viewBinding { // Looks like google likes to add metadata only they can read https://gitlab.com/IzzyOnDroid/repo/-/work_items/491
enable = true dependenciesInfo {
// Disables dependency metadata when building APKs.
includeInApk = false
// Disables dependency metadata when building Android App Bundles.
includeInBundle = false
} }
externalNativeBuild { androidComponents {
cmake { onVariants { variant ->
path("CMakeLists.txt") variant.sources.assets?.addGeneratedSourceDirectory(
generateGitHash,
GenerateGitHashTask::outputDir
)
} }
} }
signingConfigs { signingConfigs {
// We just use SIGNING_KEY_ALIAS here since it won't change
// so won't kill the configuration cache.
if (System.getenv("SIGNING_KEY_ALIAS") != null) {
create("prerelease") { create("prerelease") {
if (prereleaseStoreFile != null) { val tmpFilePath = System.getProperty("user.home") + "/work/_temp/keystore/"
storeFile = file(prereleaseStoreFile) val prereleaseStoreFile: File? = File(tmpFilePath).listFiles()?.first()
storeFile = prereleaseStoreFile?.let { file(it) }
storePassword = System.getenv("SIGNING_STORE_PASSWORD") storePassword = System.getenv("SIGNING_STORE_PASSWORD")
keyAlias = System.getenv("SIGNING_KEY_ALIAS") keyAlias = System.getenv("SIGNING_KEY_ALIAS")
keyPassword = System.getenv("SIGNING_KEY_PASSWORD") keyPassword = System.getenv("SIGNING_KEY_PASSWORD")
@ -49,28 +98,24 @@ android {
} }
} }
compileSdk = 33 compileSdk = libs.versions.compileSdk.get().toInt()
buildToolsVersion = "30.0.3"
defaultConfig { defaultConfig {
applicationId = "com.lagradost.cloudstream3" applicationId = "com.lagradost.cloudstream3"
minSdk = 21 minSdk = libs.versions.minSdk.get().toInt()
targetSdk = 29 targetSdk = libs.versions.targetSdk.get().toInt()
versionCode = libs.versions.versionCode.get().toInt()
versionName = libs.versions.versionName.get()
versionCode = 59 manifestPlaceholders["target_sdk_version"] = libs.versions.targetSdk.get()
versionName = "4.1.7"
resValue("string", "app_version", "${defaultConfig.versionName}${versionNameSuffix ?: ""}")
resValue("string", "commit_hash", "git rev-parse --short HEAD".execute() ?: "")
resValue("bool", "is_prerelease", "false")
// Reads local.properties // Reads local.properties
val localProperties = gradleLocalProperties(rootDir) val localProperties = gradleLocalProperties(rootDir, project.providers)
buildConfigField( buildConfigField(
"String", "long",
"BUILDDATE", "BUILD_DATE",
"new java.text.SimpleDateFormat(\"yyyy-MM-dd HH:mm\").format(new java.util.Date(" + System.currentTimeMillis() + "L));" "${System.currentTimeMillis()}"
) )
buildConfigField( buildConfigField(
"String", "String",
@ -83,10 +128,6 @@ android {
"\"" + (System.getenv("SIMKL_CLIENT_SECRET") ?: localProperties["simkl.secret"]) + "\"" "\"" + (System.getenv("SIMKL_CLIENT_SECRET") ?: localProperties["simkl.secret"]) + "\""
) )
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
kapt {
includeCompileClasspath = true
}
} }
buildTypes { buildTypes {
@ -108,184 +149,195 @@ android {
) )
} }
} }
flavorDimensions.add("state") flavorDimensions.add("state")
productFlavors { productFlavors {
create("stable") { create("stable") {
dimension = "state" dimension = "state"
resValue("bool", "is_prerelease", "false")
} }
create("prerelease") { create("prerelease") {
dimension = "state" dimension = "state"
resValue("bool", "is_prerelease", "true")
buildConfigField("boolean", "BETA", "true")
applicationIdSuffix = ".prerelease" applicationIdSuffix = ".prerelease"
if (signingConfigs.names.contains("prerelease")) {
signingConfig = signingConfigs.getByName("prerelease") signingConfig = signingConfigs.getByName("prerelease")
} else {
logger.warn("No prerelease signing config!")
}
versionNameSuffix = "-PRE" versionNameSuffix = "-PRE"
versionCode = (System.currentTimeMillis() / 60000).toInt() versionCode = (System.currentTimeMillis() / 60000).toInt()
} }
} }
//toolchain {
// languageVersion.set(JavaLanguageVersion.of(17))
// }
// jvmToolchain(17)
compileOptions { compileOptions {
isCoreLibraryDesugaringEnabled = true isCoreLibraryDesugaringEnabled = true
sourceCompatibility = JavaVersion.toVersion(javaTarget.target)
targetCompatibility = JavaVersion.toVersion(javaTarget.target)
}
sourceCompatibility = JavaVersion.VERSION_1_8 java {
targetCompatibility = JavaVersion.VERSION_1_8 // Use Java 17 toolchain even if a higher JDK runs the build.
// We still use Java 8 for now which higher JDKs have deprecated.
toolchain {
languageVersion.set(JavaLanguageVersion.of(libs.versions.jdkToolchain.get()))
} }
kotlinOptions {
jvmTarget = "1.8"
freeCompilerArgs = listOf("-Xjvm-default=compatibility")
} }
lint { lint {
abortOnError = false
checkReleaseBuilds = false checkReleaseBuilds = false
} }
buildFeatures {
buildConfig = true
viewBinding = true
}
packaging {
jniLibs {
// Enables legacy JNI packaging to reduce APK size (similar to builds before minSdk 23).
// Note: This may increase app startup time slightly.
useLegacyPackaging = true
}
}
namespace = "com.lagradost.cloudstream3" namespace = "com.lagradost.cloudstream3"
} }
repositories {
maven("https://jitpack.io")
}
dependencies { dependencies {
implementation("com.google.android.mediahome:video:1.0.0") // Testing
implementation("androidx.test.ext:junit-ktx:1.1.5") testImplementation(libs.junit)
testImplementation("org.json:json:20180813") testImplementation(libs.json)
androidTestImplementation(libs.core)
androidTestImplementation(libs.classgraph)
androidTestImplementation(libs.espresso.core)
androidTestImplementation(libs.ext.junit)
androidTestImplementation(libs.instancio.core)
androidTestImplementation(libs.junit.ktx)
androidTestImplementation(libs.kotlin.test)
implementation("androidx.core:core-ktx:1.10.1") // Android Core & Lifecycle
implementation("androidx.appcompat:appcompat:1.6.1") // need target 32 for 1.5.0 implementation(libs.core.ktx)
implementation(libs.activity.ktx)
implementation(libs.annotation)
implementation(libs.appcompat)
implementation(libs.fragment.ktx)
implementation(libs.bundles.lifecycle)
implementation(libs.bundles.navigation)
implementation(libs.kotlinx.collections.immutable)
implementation(libs.kotlinx.serialization.json) // JSON Parser
// dont change this to 1.6.0 it looks ugly af // Design & UI
implementation("com.google.android.material:material:1.5.0") implementation(libs.preference.ktx)
implementation("androidx.constraintlayout:constraintlayout:2.1.4") implementation(libs.material)
implementation("androidx.navigation:navigation-fragment-ktx:2.6.0") implementation(libs.constraintlayout)
implementation("androidx.navigation:navigation-ui-ktx:2.6.0")
implementation("androidx.lifecycle:lifecycle-livedata-ktx:2.6.1")
implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1")
testImplementation("junit:junit:4.13.2")
androidTestImplementation("androidx.test.ext:junit:1.1.5")
androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1")
androidTestImplementation("androidx.test:core")
//implementation("io.karn:khttp-android:0.1.2") //okhttp instead // Coil Image Loading
// implementation("org.jsoup:jsoup:1.13.1") implementation(libs.bundles.coil)
implementation("com.fasterxml.jackson.module:jackson-module-kotlin:2.13.1")
implementation("androidx.preference:preference-ktx:1.2.0") // Media 3 (ExoPlayer)
implementation(libs.bundles.media3)
implementation(libs.video)
implementation("com.github.bumptech.glide:glide:4.13.1") // FFmpeg Decoding
kapt("com.github.bumptech.glide:compiler:4.13.1") implementation(libs.bundles.nextlib)
implementation("com.github.bumptech.glide:okhttp3-integration:4.13.0")
implementation("jp.wasabeef:glide-transformations:4.3.0") // Anime-db for filler
implementation(libs.anime.db)
implementation("androidx.swiperefreshlayout:swiperefreshlayout:1.1.0") // PlayBack
implementation(libs.colorpicker) // Subtitle Color Picker
implementation(libs.newpipeextractor) // For Trailers
implementation(libs.juniversalchardet) // Subtitle Decoding
// implementation("androidx.leanback:leanback-paging:1.1.0-alpha09") // UI Stuff
implementation(libs.shimmer) // Shimmering Effect (Loading Skeleton)
implementation(libs.palette.ktx) // Palette for Images -> Colors
implementation(libs.tvprovider)
implementation(libs.overlappingpanels) // Gestures
implementation(libs.biometric) // Fingerprint Authentication
implementation(libs.previewseekbar.media3) // SeekBar Preview
implementation(libs.qrcode.kotlin) // QR Code for PIN Auth on TV
// Media 3 // Extensions & Other Libs
implementation("androidx.media3:media3-common:1.1.1") implementation(libs.jsoup) // HTML Parser
implementation("androidx.media3:media3-exoplayer:1.1.1") implementation(libs.rhino) // Run JavaScript
implementation("androidx.media3:media3-datasource-okhttp:1.1.1") implementation(libs.safefile) // To Prevent the URI File Fu*kery
implementation("androidx.media3:media3-ui:1.1.1") coreLibraryDesugaring(libs.desugar.jdk.libs.nio) // NIO Flavor Needed for NewPipeExtractor
implementation("androidx.media3:media3-session:1.1.1") implementation(libs.conscrypt.android) // To Fix SSL Fu*kery on Android 9
implementation("androidx.media3:media3-cast:1.1.1") implementation(libs.jackson.module.kotlin) // JSON Parser
implementation("androidx.media3:media3-exoplayer-hls:1.1.1") implementation(libs.zipline)
implementation("androidx.media3:media3-exoplayer-dash:1.1.1")
// Custom ffmpeg extension for audio codecs
implementation("com.github.recloudstream:media-ffmpeg:1.1.0")
//implementation("com.google.android.exoplayer:extension-leanback:2.14.0") // Deprecated; will be removed once extensions have time to migrate from using it
// Bug reports
implementation("ch.acra:acra-core:5.11.0")
implementation("ch.acra:acra-toast:5.11.0")
compileOnly("com.google.auto.service:auto-service-annotations:1.0")
//either for java sources:
annotationProcessor("com.google.auto.service:auto-service:1.0")
//or for kotlin sources (requires kapt gradle plugin):
kapt("com.google.auto.service:auto-service:1.0")
// subtitle color picker
implementation("com.jaredrummler:colorpicker:1.1.0")
//run JS
// do not upgrade to 1.7.14, since in 1.7.14 Rhino uses the `SourceVersion` class, which is not
// available on Android (even when using desugaring), and `NoClassDefFoundError` is thrown
implementation("org.mozilla:rhino:1.7.13")
// TorrentStream
//implementation("com.github.TorrentStream:TorrentStream-Android:2.7.0")
// Downloading
implementation("androidx.work:work-runtime:2.8.1")
implementation("androidx.work:work-runtime-ktx:2.8.1")
// Networking
// implementation("com.squareup.okhttp3:okhttp:4.9.2")
// implementation("com.squareup.okhttp3:okhttp-dnsoverhttps:4.9.1")
implementation("com.github.Blatzar:NiceHttp:0.4.3")
// To fix SSL fuckery on android 9
implementation("org.conscrypt:conscrypt-android:2.2.1")
// Util to skip the URI file fuckery 🙏
implementation("com.github.tachiyomiorg:unifile:17bec43")
// API because cba maintaining it myself
implementation("com.uwetrottmann.tmdb2:tmdb-java:2.6.0")
implementation("com.github.discord:OverlappingPanels:0.1.5")
// debugImplementation because LeakCanary should only run in debug builds.
//debugImplementation("com.squareup.leakcanary:leakcanary-android:2.12")
// for shimmer when loading
implementation("com.facebook.shimmer:shimmer:0.5.0")
implementation("androidx.tvprovider:tvprovider:1.0.0")
// used for subtitle decoding https://github.com/albfernandez/juniversalchardet
implementation("com.github.albfernandez:juniversalchardet:2.4.0")
// newpipe yt taken from https://github.com/TeamNewPipe/NewPipe/blob/dev/app/build.gradle#L204
// this should be updated frequently to avoid trailer fu*kery
implementation("com.github.TeamNewPipe:NewPipeExtractor:1f08d28")
coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:1.1.6")
// Library/extensions searching with Levenshtein distance
implementation("me.xdrop:fuzzywuzzy:1.4.0") implementation("me.xdrop:fuzzywuzzy:1.4.0")
// color palette for images -> colors // Torrent Support
implementation("androidx.palette:palette-ktx:1.0.0") implementation(libs.torrentserver)
// Downloading & Networking
implementation(libs.work.runtime.ktx)
implementation(libs.nicehttp) // HTTP Lib
implementation(project(":library"))
} }
tasks.register("androidSourcesJar", Jar::class) { tasks.register<Jar>("androidSourcesJar") {
archiveClassifier.set("sources") archiveClassifier.set("sources")
from(android.sourceSets.getByName("main").java.srcDirs) //full sources from(android.sourceSets.getByName("main").java.directories) // Full Sources
} }
// this is used by the gradlew plugin tasks.register<Copy>("copyJar") {
tasks.register("makeJar", Copy::class) { dependsOn("build", ":library:jvmJar")
from("build/intermediates/compile_app_classes_jar/prereleaseDebug") from(
into("build") "build/intermediates/compile_app_classes_jar/prereleaseDebug/bundlePrereleaseDebugClassesToCompileJar",
include("classes.jar") "../library/build/libs"
dependsOn("build") )
into("build/app-classes")
include("classes.jar", "library-jvm*.jar")
// Remove the version
rename("library-jvm.*.jar", "library-jvm.jar")
} }
tasks.withType<DokkaTask>().configureEach { // Merge the app classes and the library classes into classes.jar
moduleName.set("Cloudstream") tasks.register<Jar>("makeJar") {
// Duplicates cause hard to catch errors, better to fail at compile time.
duplicatesStrategy = DuplicatesStrategy.FAIL
dependsOn(tasks.getByName("copyJar"))
from(
zipTree("build/app-classes/classes.jar"),
zipTree("build/app-classes/library-jvm.jar")
)
destinationDirectory.set(layout.buildDirectory)
archiveBaseName = "classes"
}
tasks.withType<KotlinJvmCompile> {
compilerOptions {
jvmTarget.set(javaTarget)
jvmDefault.set(JvmDefaultMode.ENABLE)
freeCompilerArgs.add("-Xannotation-default-target=param-property")
optIn.addAll(
"com.lagradost.cloudstream3.InternalAPI",
"com.lagradost.cloudstream3.Prerelease",
"kotlin.uuid.ExperimentalUuidApi",
)
}
}
dokka {
moduleName = "App"
dokkaSourceSets { dokkaSourceSets {
named("main") { configureEach {
sourceLink { suppress = name != "prereleaseDebug"
// Unix based directory relative path to the root of the project (where you execute gradle respectively). analysisPlatform = KotlinPlatform.JVM
localDirectory.set(file("src/main/java")) displayName = "JVM"
documentedVisibilities(
VisibilityModifier.Public,
VisibilityModifier.Protected
)
// URL showing where the source code can be accessed through the web browser sourceLink {
remoteUrl.set(URL("https://github.com/recloudstream/cloudstream/tree/master/app/src/main/java")) localDirectory = file("..")
// Suffix which is used to append the line number to the URL. Use #L for GitHub remoteUrl("https://github.com/recloudstream/cloudstream/tree/master")
remoteLineSuffix.set("#L") remoteLineSuffix = "#L"
} }
} }
} }

13
app/lint.xml Normal file
View file

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<lint>
<!-- ByteOrderMark has errors in values-b+ja/strings.xml, but it's handled by weblate so we don't really care. -->
<issue id="ByteOrderMark" severity="ignore" />
<!-- We don't care about MissingTranslation since it's handled by weblate. -->
<issue id="MissingTranslation" severity="ignore" />
<!-- We only care about the source language here. -->
<issue id="StringFormatInvalid">
<ignore path="**/res/values-*/**" />
</issue>
</lint>

View file

@ -7,8 +7,11 @@ import android.view.LayoutInflater
import androidx.test.core.app.ActivityScenario import androidx.test.core.app.ActivityScenario
import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.viewbinding.ViewBinding import androidx.viewbinding.ViewBinding
import com.lagradost.cloudstream3.databinding.BottomResultviewPreviewBinding
import com.lagradost.cloudstream3.databinding.FragmentHomeBinding import com.lagradost.cloudstream3.databinding.FragmentHomeBinding
import com.lagradost.cloudstream3.databinding.FragmentHomeTvBinding import com.lagradost.cloudstream3.databinding.FragmentHomeTvBinding
import com.lagradost.cloudstream3.databinding.FragmentLibraryBinding
import com.lagradost.cloudstream3.databinding.FragmentLibraryTvBinding
import com.lagradost.cloudstream3.databinding.FragmentPlayerBinding import com.lagradost.cloudstream3.databinding.FragmentPlayerBinding
import com.lagradost.cloudstream3.databinding.FragmentPlayerTvBinding import com.lagradost.cloudstream3.databinding.FragmentPlayerTvBinding
import com.lagradost.cloudstream3.databinding.FragmentResultBinding import com.lagradost.cloudstream3.databinding.FragmentResultBinding
@ -17,6 +20,7 @@ import com.lagradost.cloudstream3.databinding.FragmentSearchBinding
import com.lagradost.cloudstream3.databinding.FragmentSearchTvBinding import com.lagradost.cloudstream3.databinding.FragmentSearchTvBinding
import com.lagradost.cloudstream3.databinding.HomeResultGridBinding import com.lagradost.cloudstream3.databinding.HomeResultGridBinding
import com.lagradost.cloudstream3.databinding.HomepageParentBinding import com.lagradost.cloudstream3.databinding.HomepageParentBinding
import com.lagradost.cloudstream3.databinding.HomepageParentEmulatorBinding
import com.lagradost.cloudstream3.databinding.HomepageParentTvBinding import com.lagradost.cloudstream3.databinding.HomepageParentTvBinding
import com.lagradost.cloudstream3.databinding.PlayerCustomLayoutBinding import com.lagradost.cloudstream3.databinding.PlayerCustomLayoutBinding
import com.lagradost.cloudstream3.databinding.PlayerCustomLayoutTvBinding import com.lagradost.cloudstream3.databinding.PlayerCustomLayoutTvBinding
@ -85,6 +89,8 @@ class ExampleInstrumentedTest {
// testAllLayouts<ActivityMainBinding>(activity,R.layout.activity_main, R.layout.activity_main_tv) // testAllLayouts<ActivityMainBinding>(activity,R.layout.activity_main, R.layout.activity_main_tv)
//testAllLayouts<ActivityMainBinding>(activity, R.layout.activity_main_tv) //testAllLayouts<ActivityMainBinding>(activity, R.layout.activity_main_tv)
testAllLayouts<BottomResultviewPreviewBinding>(activity, R.layout.bottom_resultview_preview,R.layout.bottom_resultview_preview_tv)
testAllLayouts<FragmentPlayerBinding>(activity, R.layout.fragment_player,R.layout.fragment_player_tv) testAllLayouts<FragmentPlayerBinding>(activity, R.layout.fragment_player,R.layout.fragment_player_tv)
testAllLayouts<FragmentPlayerTvBinding>(activity, R.layout.fragment_player,R.layout.fragment_player_tv) testAllLayouts<FragmentPlayerTvBinding>(activity, R.layout.fragment_player,R.layout.fragment_player_tv)
@ -117,9 +123,12 @@ class ExampleInstrumentedTest {
// testAllLayouts<HomeScrollViewBinding>(activity, R.layout.home_scroll_view, R.layout.home_scroll_view_tv) // testAllLayouts<HomeScrollViewBinding>(activity, R.layout.home_scroll_view, R.layout.home_scroll_view_tv)
// testAllLayouts<HomeScrollViewTvBinding>(activity, R.layout.home_scroll_view, R.layout.home_scroll_view_tv) // testAllLayouts<HomeScrollViewTvBinding>(activity, R.layout.home_scroll_view, R.layout.home_scroll_view_tv)
testAllLayouts<HomepageParentTvBinding>(activity, R.layout.homepage_parent_tv, R.layout.homepage_parent) testAllLayouts<HomepageParentTvBinding>(activity, R.layout.homepage_parent_tv, R.layout.homepage_parent_emulator, R.layout.homepage_parent)
testAllLayouts<HomepageParentBinding>(activity, R.layout.homepage_parent_tv, R.layout.homepage_parent) testAllLayouts<HomepageParentEmulatorBinding>(activity, R.layout.homepage_parent_tv, R.layout.homepage_parent_emulator, R.layout.homepage_parent)
testAllLayouts<HomepageParentBinding>(activity, R.layout.homepage_parent_tv, R.layout.homepage_parent_emulator, R.layout.homepage_parent)
testAllLayouts<FragmentLibraryTvBinding>(activity, R.layout.fragment_library_tv, R.layout.fragment_library)
testAllLayouts<FragmentLibraryBinding>(activity, R.layout.fragment_library_tv, R.layout.fragment_library)
} }
} }
} }
@ -127,14 +136,14 @@ class ExampleInstrumentedTest {
@Test @Test
@Throws(AssertionError::class) @Throws(AssertionError::class)
fun providerCorrectData() { fun providerCorrectData() {
val isoNames = SubtitleHelper.languages.map { it.ISO_639_1 } val langTagsIETF = SubtitleHelper.languages.map { it.IETF_tag }
Assert.assertFalse("ISO does not contain any languages", isoNames.isNullOrEmpty()) Assert.assertFalse("IETFTagNames does not contain any languages", langTagsIETF.isNullOrEmpty())
for (api in getAllProviders()) { for (api in getAllProviders()) {
Assert.assertTrue("Api does not contain a mainUrl", api.mainUrl != "NONE") Assert.assertTrue("Api does not contain a mainUrl", api.mainUrl != "NONE")
Assert.assertTrue("Api does not contain a name", api.name != "NONE") Assert.assertTrue("Api does not contain a name", api.name != "NONE")
Assert.assertTrue( Assert.assertTrue(
"Api ${api.name} does not contain a valid language code", "Api ${api.name} does not contain a valid language code",
isoNames.contains(api.lang) langTagsIETF.contains(api.lang)
) )
Assert.assertTrue( Assert.assertTrue(
"Api ${api.name} does not contain any supported types", "Api ${api.name} does not contain any supported types",
@ -148,7 +157,7 @@ class ExampleInstrumentedTest {
fun providerCorrectHomepage() { fun providerCorrectHomepage() {
runBlocking { runBlocking {
getAllProviders().toList().amap { api -> getAllProviders().toList().amap { api ->
TestingUtils.testHomepage(api, ::println) TestingUtils.testHomepage(api, TestingUtils.Logger())
} }
} }
println("Done providerCorrectHomepage") println("Done providerCorrectHomepage")
@ -160,7 +169,6 @@ class ExampleInstrumentedTest {
TestingUtils.getDeferredProviderTests( TestingUtils.getDeferredProviderTests(
this, this,
getAllProviders(), getAllProviders(),
::println
) { _, _ -> } ) { _, _ -> }
} }
} }

View file

@ -0,0 +1,135 @@
package com.lagradost.cloudstream3
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.platform.app.InstrumentationRegistry
import com.lagradost.cloudstream3.utils.AppUtils.toJson
import dalvik.system.DexFile
import kotlinx.serialization.ExperimentalSerializationApi
import kotlinx.serialization.InternalSerializationApi
import kotlinx.serialization.KSerializer
import kotlinx.serialization.Serializable
import kotlinx.serialization.serializer
import kotlinx.serialization.serializerOrNull
import org.instancio.Instancio
import org.junit.Test
import org.junit.runner.RunWith
import kotlin.reflect.KClass
import kotlin.reflect.jvm.jvmName
import kotlin.test.assertEquals
import kotlin.test.assertNotNull
@RunWith(AndroidJUnit4::class)
class SerializationClassTester {
// Same as app, or using app reference
val jacksonMapper = mapper
val kotlinxMapper = json
@Test
fun isIdenticalSerialization() {
val serializableClasses = findSerializableClasses("com.lagradost")
println("Number of serializable classes: ${serializableClasses.size}")
serializableClasses.forEach { kClass ->
val instance = Instancio.create(kClass.java)
val jacksonJson = jacksonMapper.writeValueAsString(instance)
val kotlinxJson = serializeWithKotlinx(kClass, instance)
assertEquals(
jacksonJson,
kotlinxJson,
"""
Serialization mismatch for:
${kClass.qualifiedName}
Jackson:
$jacksonJson
Kotlinx:
$kotlinxJson
""".trimIndent()
)
println("Identical serialization for: ${kClass.jvmName}")
}
}
@OptIn(InternalSerializationApi::class, ExperimentalSerializationApi::class)
@Test
fun isIdenticalDeserialization() {
val serializableClasses = findSerializableClasses("com.lagradost")
println("Number of serializable classes: ${serializableClasses.size}")
serializableClasses.forEach { kClass ->
val instance = Instancio.create(kClass.java)
// Convert to JSON to get example JSON object
// We prefer jackson here because the app may have many jackson JSON strings in local storage
val originalJson = jacksonMapper.writeValueAsString(instance)
// Create an object from the JSON using kotlinx
val serializer =
kClass.serializerOrNull() ?: kotlinxMapper.serializersModule.getContextual(kClass)
assertNotNull(serializer, "The class: ${kClass.jvmName} must be serializable!")
val kotlinxDecoded = kotlinxMapper.decodeFromString(serializer, originalJson)
// Create an object from the JSON using jackson
val mapperDecoded = jacksonMapper.readValue(originalJson, kClass.java)
// Deep inspect both object using the mapper toJson function.
// This deep equality check can be performed using other methods, but this just works.
val jacksonJson = mapperDecoded.toJson()
val kotlinxJson = kotlinxDecoded.toJson()
assertEquals(
jacksonJson,
kotlinxJson,
"""
Serialization mismatch for:
${kClass.qualifiedName}
Jackson:
$jacksonJson
Kotlinx:
$kotlinxJson
""".trimIndent()
)
println("Identical deserialization for: ${kClass.jvmName}")
}
}
// DEX files are the best solution to read all our classes dynamically.
// ClassGraph() can be used instead, but it only gives results on the JVM, not Android.
@Suppress("DEPRECATION")
private fun findSerializableClasses(packageName: String): List<KClass<*>> {
val context = InstrumentationRegistry
.getInstrumentation()
.targetContext
val dexFile = DexFile(context.packageCodePath)
return dexFile.entries()
.toList()
.filter { it.startsWith(packageName) }
.mapNotNull {
runCatching { Class.forName(it).kotlin }.getOrNull()
}.filter { kClass ->
// Not possible to use .hasAnnotation() on newer Android versions.
kClass.java.annotations.any {
it is Serializable
}
}
}
@OptIn(InternalSerializationApi::class)
@Suppress("UNCHECKED_CAST")
private fun serializeWithKotlinx(
kClass: KClass<*>,
value: Any
): String {
val serializer = kClass.serializer() as KSerializer<Any>
return kotlinxMapper.encodeToString(serializer, value)
}
}

View file

@ -0,0 +1,157 @@
package com.lagradost.cloudstream3.utils.serializers
import android.net.Uri
import com.lagradost.cloudstream3.utils.AppUtils.parseJson
import com.lagradost.cloudstream3.utils.AppUtils.toJson
import kotlinx.serialization.ExperimentalSerializationApi
import kotlinx.serialization.KeepGeneratedSerializer
import kotlinx.serialization.Serializable
import org.junit.Assert.assertEquals
import org.junit.Assert.assertFalse
import org.junit.Assert.assertNull
import org.junit.Assert.assertTrue
import org.junit.Test
@OptIn(ExperimentalSerializationApi::class)
@KeepGeneratedSerializer
@Serializable(with = NonEmptyData.Serializer::class)
data class NonEmptyData(
val title: String = "",
val tags: List<String> = emptyList(),
val meta: Map<String, String> = emptyMap(),
val name: String = "hello",
) {
object Serializer : NonEmptySerializer<NonEmptyData>(NonEmptyData.generatedSerializer())
}
@OptIn(ExperimentalSerializationApi::class)
@KeepGeneratedSerializer
@Serializable(with = WriteOnlyData.Serializer::class)
data class WriteOnlyData(
val fieldA: String = "",
val fieldB: String = "",
) {
object Serializer : WriteOnlySerializer<WriteOnlyData>(
WriteOnlyData.generatedSerializer(),
setOf("fieldB"),
)
}
@OptIn(ExperimentalSerializationApi::class)
@KeepGeneratedSerializer
@Serializable(with = MultiWriteOnly.Serializer::class)
data class MultiWriteOnly(
val fieldA: String = "",
val fieldB: String = "",
val fieldC: String = "",
) {
object Serializer : WriteOnlySerializer<MultiWriteOnly>(
MultiWriteOnly.generatedSerializer(),
setOf("fieldB", "fieldC"),
)
}
@Serializable
data class UriData(
@Serializable(with = UriSerializer::class)
val uri: Uri = Uri.EMPTY,
)
class SerializerTest {
@Test
fun nonEmptySerializerOmitsEmptyStrings() {
val data = NonEmptyData(title = "", name = "hello")
val result = data.toJson()
assertFalse(result.contains("title"))
assertTrue(result.contains("name"))
}
@Test
fun nonEmptySerializerOmitsEmptyLists() {
val data = NonEmptyData(tags = emptyList(), name = "hello")
val result = data.toJson()
assertFalse(result.contains("tags"))
}
@Test
fun nonEmptySerializerOmitsEmptyMaps() {
val data = NonEmptyData(meta = emptyMap(), name = "hello")
val result = data.toJson()
assertFalse(result.contains("meta"))
}
@Test
fun nonEmptySerializerKeepsNonEmptyFields() {
val data = NonEmptyData(title = "hello", tags = listOf("a"), meta = mapOf("k" to "v"))
val result = data.toJson()
assertTrue(result.contains("title"))
assertTrue(result.contains("tags"))
assertTrue(result.contains("meta"))
}
@Test
fun nonEmptySerializerDoesNotAffectDeserialization() {
val input = """{"title":"hello","tags":["a"],"meta":{"k":"v"},"name":"world"}"""
val result = parseJson<NonEmptyData>(input)
assertEquals("hello", result.title)
assertEquals(listOf("a"), result.tags)
assertEquals(mapOf("k" to "v"), result.meta)
assertEquals("world", result.name)
}
@Test
fun writeOnlySerializerOmitsFieldOnSerialize() {
val data = WriteOnlyData(fieldA = "hello", fieldB = "secret")
val result = data.toJson()
assertTrue(result.contains("fieldA"))
assertFalse(result.contains("fieldB"))
}
@Test
fun writeOnlySerializerDeserializesNormally() {
val input = """{"fieldA":"hello","fieldB":"secret"}"""
val result = parseJson<WriteOnlyData>(input)
assertEquals("hello", result.fieldA)
assertEquals("secret", result.fieldB)
}
@Test
fun writeOnlySerializerDeserializesMissingAsDefault() {
val input = """{"fieldA":"hello"}"""
val result = parseJson<WriteOnlyData>(input)
assertEquals("hello", result.fieldA)
assertEquals("", result.fieldB)
}
@Test
fun writeOnlySerializerHandlesMultipleKeys() {
val data = MultiWriteOnly(fieldA = "hello", fieldB = "secret1", fieldC = "secret2")
val result = data.toJson()
assertTrue(result.contains("fieldA"))
assertFalse(result.contains("fieldB"))
assertFalse(result.contains("fieldC"))
}
@Test
fun uriSerializerSerializesUriToString() {
val data = UriData(uri = Uri.parse("https://example.com/path?query=1"))
val result = data.toJson()
assertTrue(result.contains("https://example.com/path?query=1"))
}
@Test
fun uriSerializerDeserializesStringToUri() {
val input = """{"uri":"https://example.com/path?query=1"}"""
val result = parseJson<UriData>(input)
assertEquals(Uri.parse("https://example.com/path?query=1"), result.uri)
}
@Test
fun uriSerializerRoundtripsCorrectly() {
val data = UriData(uri = Uri.parse("https://example.com/path?query=1"))
val encoded = data.toJson()
val decoded = parseJson<UriData>(encoded)
assertEquals(data.uri, decoded.uri)
}
}

View file

@ -25,9 +25,8 @@
android:endY="245.72" android:endY="245.72"
android:endX="292.58" android:endX="292.58"
android:type="linear"> android:type="linear">
<item android:offset="0" android:color="#FF5D49EA"/> <item android:offset="0" android:color="#3FAA11"/>
<item android:offset="0.45" android:color="#FF452FE4"/> <item android:offset="1" android:color="#39A11D"/>
<item android:offset="1" android:color="#FF2309DB"/>
</gradient> </gradient>
</aapt:attr> </aapt:attr>
</path> </path>
@ -40,9 +39,8 @@
android:endY="245.72" android:endY="245.72"
android:endX="248.76" android:endX="248.76"
android:type="linear"> android:type="linear">
<item android:offset="0" android:color="#FF4F6DFB"/> <item android:offset="0" android:color="#37DB25"/>
<item android:offset="0.6" android:color="#FF3559E7"/> <item android:offset="1" android:color="#11DD6D"/>
<item android:offset="1" android:color="#FF2149D8"/>
</gradient> </gradient>
</aapt:attr> </aapt:attr>
</path> </path>
@ -55,46 +53,45 @@
android:endY="245.69" android:endY="245.69"
android:endX="210.03" android:endX="210.03"
android:type="linear"> android:type="linear">
<item android:offset="0" android:color="#FF56B6FE"/> <item android:offset="0" android:color="#40F15D"/>
<item android:offset="0.61" android:color="#FF599CFA"/> <item android:offset="1" android:color="#42C54F"/>
<item android:offset="1" android:color="#FF5C89F7"/>
</gradient> </gradient>
</aapt:attr> </aapt:attr>
</path> </path>
<path <path
android:pathData="M358.81,285q-13.53,0 -22.64,-9.1t-9,-22.72q0,-13.62 9,-22.64 9,-9.18 22.64,-9.19 13.79,0 22.38,10l-5.62,5.44a20.82,20.82 0,0 0,-16.76 -7.91,23 23,0 0,0 -16.94,6.81q-6.72,6.72 -6.72,17.53t6.72,17.53a23,23 0,0 0,16.94 6.81q10.63,0 18.46,-8.94l5.7,5.53a29.57,29.57 0,0 1,-10.63 8A32.44,32.44 0,0 1,358.81 285Z" android:pathData="M358.81,285q-13.53,0 -22.64,-9.1t-9,-22.72q0,-13.62 9,-22.64 9,-9.18 22.64,-9.19 13.79,0 22.38,10l-5.62,5.44a20.82,20.82 0,0 0,-16.76 -7.91,23 23,0 0,0 -16.94,6.81q-6.72,6.72 -6.72,17.53t6.72,17.53a23,23 0,0 0,16.94 6.81q10.63,0 18.46,-8.94l5.7,5.53a29.57,29.57 0,0 1,-10.63 8A32.44,32.44 0,0 1,358.81 285Z"
android:fillColor="#2e24ff"/> android:fillColor="#39A11D"/>
<path <path
android:pathData="M397.78,222.69v60.93H390V222.69Z" android:pathData="M397.78,222.69v60.93H390V222.69Z"
android:fillColor="#2e24ff"/> android:fillColor="#39A11D"/>
<path <path
android:pathData="M404.5,262.77q0,-9.61 6,-15.91a20.6,20.6 0,0 1,15.41 -6.3,20.31 20.31,0 0,1 15.31,6.3 21.87,21.87 0,0 1,6.13 15.91q0,9.71 -6.13,15.92A20.3,20.3 0,0 1,426 285a20.6,20.6 0,0 1,-15.41 -6.29Q404.5,272.39 404.5,262.77ZM412.33,262.77a15.31,15.31 0,0 0,3.91 10.9,13.38 13.38,0 0,0 19.41,0 17,17 0,0 0,0 -21.7,13.18 13.18,0 0,0 -19.41,0A15.18,15.18 0,0 0,412.33 262.77Z" android:pathData="M404.5,262.77q0,-9.61 6,-15.91a20.6,20.6 0,0 1,15.41 -6.3,20.31 20.31,0 0,1 15.31,6.3 21.87,21.87 0,0 1,6.13 15.91q0,9.71 -6.13,15.92A20.3,20.3 0,0 1,426 285a20.6,20.6 0,0 1,-15.41 -6.29Q404.5,272.39 404.5,262.77ZM412.33,262.77a15.31,15.31 0,0 0,3.91 10.9,13.38 13.38,0 0,0 19.41,0 17,17 0,0 0,0 -21.7,13.18 13.18,0 0,0 -19.41,0A15.18,15.18 0,0 0,412.33 262.77Z"
android:fillColor="#2e24ff"/> android:fillColor="#39A11D"/>
<path <path
android:pathData="M490.7,283.62h-7.48v-5.78h-0.35a13.86,13.86 0,0 1,-5.48 5.1,15.77 15.77,0 0,1 -7.7,2q-7.67,0 -11.79,-4.38t-4.13,-12.47v-26.2h7.83v25.69q0.25,10.22 10.3,10.22a9.81,9.81 0,0 0,7.83 -3.79,13.7 13.7,0 0,0 3.14,-9.06V241.93h7.83Z" android:pathData="M490.7,283.62h-7.48v-5.78h-0.35a13.86,13.86 0,0 1,-5.48 5.1,15.77 15.77,0 0,1 -7.7,2q-7.67,0 -11.79,-4.38t-4.13,-12.47v-26.2h7.83v25.69q0.25,10.22 10.3,10.22a9.81,9.81 0,0 0,7.83 -3.79,13.7 13.7,0 0,0 3.14,-9.06V241.93h7.83Z"
android:fillColor="#2e24ff"/> android:fillColor="#39A11D"/>
<path <path
android:pathData="M517.25,285a18.34,18.34 0,0 1,-14 -6.46,24.34 24.34,0 0,1 0,-31.49 18.35,18.35 0,0 1,14 -6.47,18.07 18.07,0 0,1 8.39,2 14.84,14.84 0,0 1,5.83 5.19h0.34l-0.34,-5.78L531.47,222.69h7.82v60.93h-7.48v-5.78h-0.34a14.84,14.84 0,0 1,-5.83 5.19A18.07,18.07 0,0 1,517.25 285ZM518.53,277.86a12,12 0,0 0,9.45 -4.17q3.82,-4.17 3.83,-10.9A15.54,15.54 0,0 0,528 252a12.05,12.05 0,0 0,-9.45 -4.26,12.19 12.19,0 0,0 -9.44,4.26 15.5,15.5 0,0 0,-3.83 10.8,15.32 15.32,0 0,0 3.83,10.81A12.19,12.19 0,0 0,518.53 277.84Z" android:pathData="M517.25,285a18.34,18.34 0,0 1,-14 -6.46,24.34 24.34,0 0,1 0,-31.49 18.35,18.35 0,0 1,14 -6.47,18.07 18.07,0 0,1 8.39,2 14.84,14.84 0,0 1,5.83 5.19h0.34l-0.34,-5.78L531.47,222.69h7.82v60.93h-7.48v-5.78h-0.34a14.84,14.84 0,0 1,-5.83 5.19A18.07,18.07 0,0 1,517.25 285ZM518.53,277.86a12,12 0,0 0,9.45 -4.17q3.82,-4.17 3.83,-10.9A15.54,15.54 0,0 0,528 252a12.05,12.05 0,0 0,-9.45 -4.26,12.19 12.19,0 0,0 -9.44,4.26 15.5,15.5 0,0 0,-3.83 10.8,15.32 15.32,0 0,0 3.83,10.81A12.19,12.19 0,0 0,518.53 277.84Z"
android:fillColor="#2e24ff"/> android:fillColor="#39A11D"/>
<path <path
android:pathData="M587.8,267.33a15.91,15.91 0,0 1,-5.87 12.88A22.43,22.43 0,0 1,567.46 285a21.39,21.39 0,0 1,-13.36 -4.42,22.65 22.65,0 0,1 -8,-12.08l7.49,-3.07a19.3,19.3 0,0 0,2.13 4.94,15.72 15.72,0 0,0 3.19,3.78 14.25,14.25 0,0 0,4 2.47,12.26 12.26,0 0,0 4.68,0.9 13.47,13.47 0,0 0,8.76 -2.77,9 9,0 0,0 3.41,-7.36 8.8,8.8 0,0 0,-2.81 -6.55q-2.64,-2.64 -9.87,-5.11 -7.32,-2.64 -9.11,-3.57 -9.69,-4.94 -9.7,-14.55a14.84,14.84 0,0 1,5.37 -11.49A19.53,19.53 0,0 1,567 221.33a20.5,20.5 0,0 1,12.09 3.58,16.67 16.67,0 0,1 6.8,8.76l-7.31,3.06a10.84,10.84 0,0 0,-4 -5.65,13.1 13.1,0 0,0 -15.11,0.28 7.41,7.41 0,0 0,-3.15 6.19,7.14 7.14,0 0,0 2.47,5.42q2.73,2.29 11.83,5.42 9.27,3.17 13.23,7.72A16.53,16.53 0,0 1,587.8 267.33Z" android:pathData="M587.8,267.33a15.91,15.91 0,0 1,-5.87 12.88A22.43,22.43 0,0 1,567.46 285a21.39,21.39 0,0 1,-13.36 -4.42,22.65 22.65,0 0,1 -8,-12.08l7.49,-3.07a19.3,19.3 0,0 0,2.13 4.94,15.72 15.72,0 0,0 3.19,3.78 14.25,14.25 0,0 0,4 2.47,12.26 12.26,0 0,0 4.68,0.9 13.47,13.47 0,0 0,8.76 -2.77,9 9,0 0,0 3.41,-7.36 8.8,8.8 0,0 0,-2.81 -6.55q-2.64,-2.64 -9.87,-5.11 -7.32,-2.64 -9.11,-3.57 -9.69,-4.94 -9.7,-14.55a14.84,14.84 0,0 1,5.37 -11.49A19.53,19.53 0,0 1,567 221.33a20.5,20.5 0,0 1,12.09 3.58,16.67 16.67,0 0,1 6.8,8.76l-7.31,3.06a10.84,10.84 0,0 0,-4 -5.65,13.1 13.1,0 0,0 -15.11,0.28 7.41,7.41 0,0 0,-3.15 6.19,7.14 7.14,0 0,0 2.47,5.42q2.73,2.29 11.83,5.42 9.27,3.17 13.23,7.72A16.53,16.53 0,0 1,587.8 267.33Z"
android:fillColor="#5252ff"/> android:fillColor="#68C671"/>
<path <path
android:pathData="M610.26,284.3a11.88,11.88 0,0 1,-8.46 -3.15c-2.25,-2.09 -3.4,-5 -3.45,-8.76V249.07H591v-7.14h7.32V229.16h7.83v12.77h10.21v7.14H606.18v20.77c0,2.78 0.54,4.66 1.61,5.66a5.27,5.27 0,0 0,3.66 1.48,7.9 7.9,0 0,0 1.83,-0.21 9,9 0,0 0,1.66 -0.55l2.47,7A21.23,21.23 0,0 1,610.26 284.3Z" android:pathData="M610.26,284.3a11.88,11.88 0,0 1,-8.46 -3.15c-2.25,-2.09 -3.4,-5 -3.45,-8.76V249.07H591v-7.14h7.32V229.16h7.83v12.77h10.21v7.14H606.18v20.77c0,2.78 0.54,4.66 1.61,5.66a5.27,5.27 0,0 0,3.66 1.48,7.9 7.9,0 0,0 1.83,-0.21 9,9 0,0 0,1.66 -0.55l2.47,7A21.23,21.23 0,0 1,610.26 284.3Z"
android:fillColor="#5252ff"/> android:fillColor="#68C671"/>
<path <path
android:pathData="M631.71,283.62h-7.83V241.93h7.48v6.8h0.35a11.31,11.31 0,0 1,4.89 -5.66,13.66 13.66,0 0,1 7.27,-2.34 14.7,14.7 0,0 1,5.79 1l-2.38,7.57a12.93,12.93 0,0 0,-4.6 -0.6,10.11 10.11,0 0,0 -7.7,3.58 12,12 0,0 0,-3.27 8.34Z" android:pathData="M631.71,283.62h-7.83V241.93h7.48v6.8h0.35a11.31,11.31 0,0 1,4.89 -5.66,13.66 13.66,0 0,1 7.27,-2.34 14.7,14.7 0,0 1,5.79 1l-2.38,7.57a12.93,12.93 0,0 0,-4.6 -0.6,10.11 10.11,0 0,0 -7.7,3.58 12,12 0,0 0,-3.27 8.34Z"
android:fillColor="#5252ff"/> android:fillColor="#68C671"/>
<path <path
android:pathData="M670.93,285a19.93,19.93 0,0 1,-15.14 -6.29q-6,-6.3 -6,-15.92a22.65,22.65 0,0 1,5.79 -15.87,19.15 19.15,0 0,1 14.8,-6.34q9.29,0 14.77,6t5.49,16.81l-0.09,0.85L657.83,264.24a13.56,13.56 0,0 0,4.08 9.87,13.06 13.06,0 0,0 9.36,3.75q7.49,0 11.75,-7.49l7,3.4a20.69,20.69 0,0 1,-7.78 8.25A21.51,21.51 0,0 1,670.93 285ZM658.42,257.77h23.92a10.43,10.43 0,0 0,-3.53 -7.19,12.38 12.38,0 0,0 -8.56,-2.85 11.34,11.34 0,0 0,-7.61 2.72A13.09,13.09 0,0 0,658.42 257.75Z" android:pathData="M670.93,285a19.93,19.93 0,0 1,-15.14 -6.29q-6,-6.3 -6,-15.92a22.65,22.65 0,0 1,5.79 -15.87,19.15 19.15,0 0,1 14.8,-6.34q9.29,0 14.77,6t5.49,16.81l-0.09,0.85L657.83,264.24a13.56,13.56 0,0 0,4.08 9.87,13.06 13.06,0 0,0 9.36,3.75q7.49,0 11.75,-7.49l7,3.4a20.69,20.69 0,0 1,-7.78 8.25A21.51,21.51 0,0 1,670.93 285ZM658.42,257.77h23.92a10.43,10.43 0,0 0,-3.53 -7.19,12.38 12.38,0 0,0 -8.56,-2.85 11.34,11.34 0,0 0,-7.61 2.72A13.09,13.09 0,0 0,658.42 257.75Z"
android:fillColor="#5252ff"/> android:fillColor="#68C671"/>
<path <path
android:pathData="M714.08,240.56q8.67,0 13.7,4.64c3.34,3.1 5,7.33 5,12.72v25.7h-7.49v-5.78H725Q720.11,285 712,285a16.83,16.83 0,0 1,-11.53 -4.08,13 13,0 0,1 -4.63,-10.21 12.38,12.38 0,0 1,4.89 -10.3q4.89,-3.83 13.06,-3.83a23.16,23.16 0,0 1,11.49 2.55v-1.78a8.9,8.9 0,0 0,-3.24 -6.94,11.08 11.08,0 0,0 -7.57,-2.85 12,12 0,0 0,-10.38 5.53l-6.89,-4.34Q702.93,240.57 714.08,240.56ZM704,270.86a6.24,6.24 0,0 0,2.59 5.1,9.57 9.57,0 0,0 6.09,2.05 12.5,12.5 0,0 0,8.81 -3.66,11.47 11.47,0 0,0 3.87,-8.6q-3.66,-2.88 -10.21,-2.89a13.22,13.22 0,0 0,-8 2.3A6.81,6.81 0,0 0,704 270.86Z" android:pathData="M714.08,240.56q8.67,0 13.7,4.64c3.34,3.1 5,7.33 5,12.72v25.7h-7.49v-5.78H725Q720.11,285 712,285a16.83,16.83 0,0 1,-11.53 -4.08,13 13,0 0,1 -4.63,-10.21 12.38,12.38 0,0 1,4.89 -10.3q4.89,-3.83 13.06,-3.83a23.16,23.16 0,0 1,11.49 2.55v-1.78a8.9,8.9 0,0 0,-3.24 -6.94,11.08 11.08,0 0,0 -7.57,-2.85 12,12 0,0 0,-10.38 5.53l-6.89,-4.34Q702.93,240.57 714.08,240.56ZM704,270.86a6.24,6.24 0,0 0,2.59 5.1,9.57 9.57,0 0,0 6.09,2.05 12.5,12.5 0,0 0,8.81 -3.66,11.47 11.47,0 0,0 3.87,-8.6q-3.66,-2.88 -10.21,-2.89a13.22,13.22 0,0 0,-8 2.3A6.81,6.81 0,0 0,704 270.86Z"
android:fillColor="#5252ff"/> android:fillColor="#68C671"/>
<path <path
android:pathData="M749.47,283.62h-7.82V241.93h7.48v5.78h0.34a14,14 0,0 1,5.49 -5.1,15.06 15.06,0 0,1 7.36,-2.05 15.22,15.22 0,0 1,8.09 2.13,12.56 12.56,0 0,1 5.1,5.87q5.19,-8 14.39,-8 7.23,0 11.14,4.43T805,257.58v26h-7.83V258.77q0,-5.86 -2.13,-8.46t-7.15,-2.6a9.35,9.35 0,0 0,-7.57 3.83,14 14,0 0,0 -3.06,9v23.06h-7.83V258.77q0,-5.86 -2.13,-8.46t-7.15,-2.6a9.35,9.35 0,0 0,-7.57 3.83,14 14,0 0,0 -3.07,9Z" android:pathData="M749.47,283.62h-7.82V241.93h7.48v5.78h0.34a14,14 0,0 1,5.49 -5.1,15.06 15.06,0 0,1 7.36,-2.05 15.22,15.22 0,0 1,8.09 2.13,12.56 12.56,0 0,1 5.1,5.87q5.19,-8 14.39,-8 7.23,0 11.14,4.43T805,257.58v26h-7.83V258.77q0,-5.86 -2.13,-8.46t-7.15,-2.6a9.35,9.35 0,0 0,-7.57 3.83,14 14,0 0,0 -3.06,9v23.06h-7.83V258.77q0,-5.86 -2.13,-8.46t-7.15,-2.6a9.35,9.35 0,0 0,-7.57 3.83,14 14,0 0,0 -3.07,9Z"
android:fillColor="#5252ff"/> android:fillColor="#68C671"/>
<path <path
android:pathData="M-13.76,555.76c10.3,-20.89 58.91,-113.94 157.31,-139.7C261.3,385.24 405.9,462.43 469.89,613.28"> android:pathData="M-13.76,555.76c10.3,-20.89 58.91,-113.94 157.31,-139.7C261.3,385.24 405.9,462.43 469.89,613.28">
<aapt:attr name="android:fillColor"> <aapt:attr name="android:fillColor">
@ -104,9 +101,9 @@
android:endY="252.3" android:endY="252.3"
android:endX="373.57" android:endX="373.57"
android:type="linear"> android:type="linear">
<item android:offset="0" android:color="#FF5D49EA"/> <item android:offset="0" android:color="#68C671"/>
<item android:offset="0.45" android:color="#FF452FE4"/> <item android:offset="0.45" android:color="#11DD6D"/>
<item android:offset="1" android:color="#FF2309DB"/> <item android:offset="1" android:color="#39A11D"/>
</gradient> </gradient>
</aapt:attr> </aapt:attr>
</path> </path>
@ -117,9 +114,9 @@
android:startX="400.11" android:startX="400.11"
android:endX="900" android:endX="900"
android:type="linear"> android:type="linear">
<item android:offset="0" android:color="#FF5D49EA"/> <item android:offset="0" android:color="#68C671"/>
<item android:offset="0.45" android:color="#FF452FE4"/> <item android:offset="0.45" android:color="#11DD6D"/>
<item android:offset="1" android:color="#FF2309DB"/> <item android:offset="1" android:color="#39A11D"/>
</gradient> </gradient>
</aapt:attr> </aapt:attr>
</path> </path>
@ -132,9 +129,9 @@
android:endY="252.3" android:endY="252.3"
android:endX="373.57" android:endX="373.57"
android:type="linear"> android:type="linear">
<item android:offset="0" android:color="#FF5D49EA"/> <item android:offset="0" android:color="#68C671"/>
<item android:offset="0.45" android:color="#FF452FE4"/> <item android:offset="0.45" android:color="#11DD6D"/>
<item android:offset="1" android:color="#FF2309DB"/> <item android:offset="1" android:color="#39A11D"/>
</gradient> </gradient>
</aapt:attr> </aapt:attr>
</path> </path>
@ -145,9 +142,9 @@
android:startX="700.11" android:startX="700.11"
android:endX="900.57" android:endX="900.57"
android:type="linear"> android:type="linear">
<item android:offset="0" android:color="#FF5D49EA"/> <item android:offset="0" android:color="#68C671"/>
<item android:offset="0.45" android:color="#FF452FE4"/> <item android:offset="0.45" android:color="#11DD6D"/>
<item android:offset="1" android:color="#FF2309DB"/> <item android:offset="1" android:color="#39A11D"/>
</gradient> </gradient>
</aapt:attr> </aapt:attr>
</path> </path>
@ -158,9 +155,9 @@
android:startX="400.11" android:startX="400.11"
android:endX="800.57" android:endX="800.57"
android:type="linear"> android:type="linear">
<item android:offset="0" android:color="#FF5D49EA"/> <item android:offset="0" android:color="#68C671"/>
<item android:offset="0.45" android:color="#FF452FE4"/> <item android:offset="0.45" android:color="#11DD6D"/>
<item android:offset="1" android:color="#FF2309DB"/> <item android:offset="1" android:color="#39A11D"/>
</gradient> </gradient>
</aapt:attr> </aapt:attr>
</path> </path>

View file

@ -6,16 +6,63 @@
<uses-permission android:name="android.permission.INTERNET" /> <!-- unless you only use cs3 as a player for downloaded stuff, you need this --> <uses-permission android:name="android.permission.INTERNET" /> <!-- unless you only use cs3 as a player for downloaded stuff, you need this -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <!-- Downloads --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <!-- Downloads -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- Downloads on low api devices --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- Downloads on low api devices -->
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" /> <!-- Plugin API --> <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" tools:ignore="ScopedStorage" /> <!-- Plugin API -->
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <!-- some dependency needs this -->
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> <!-- Used for player vertical slide --> <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> <!-- Used for player vertical slide -->
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" /> <!-- Used for app update --> <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" /> <!-- Used for app update -->
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" /> <!-- Used for app notifications on Android 13+ --> <uses-permission android:name="android.permission.POST_NOTIFICATIONS" /> <!-- Used for app notifications on Android 13+ -->
<uses-permission android:name="com.android.providers.tv.permission.WRITE_EPG_DATA" /> <!-- Used for Android TV watch next --> <uses-permission android:name="com.android.providers.tv.permission.WRITE_EPG_DATA" /> <!-- Used for Android TV watch next -->
<uses-permission android:name="android.permission.UPDATE_PACKAGES_WITHOUT_USER_ACTION" /> <!-- Used for updates without prompt --> <uses-permission android:name="android.permission.UPDATE_PACKAGES_WITHOUT_USER_ACTION" /> <!-- Used for updates without prompt -->
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> <!-- Used for update service --> <uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> <!-- Used for update service -->
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC" />
<uses-permission android:name="android.permission.USE_BIOMETRIC" />
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" /> <!-- We can use this directly as CS3 is not on Play Store -->
<uses-permission android:name="com.android.providers.tv.permission.READ_EPG_DATA" /> <!-- We can use to read the tv channel list -->
<!-- Required for OpenInAppAction and getting arbitrary Aniyomi packages -->
<uses-permission
android:name="android.permission.QUERY_ALL_PACKAGES"
tools:ignore="QueryAllPackagesPermission" />
<queries>
<!--
QUERY_ALL_PACKAGES does not work on some devices running Android 11+ (like Google TV 14),
so we must explicitly specify the packages and intent patterns we query to ensure visibility.
-->
<!-- For external video players -->
<intent>
<action android:name="android.intent.action.VIEW" />
<data android:mimeType="video/*" />
</intent>
<intent>
<action android:name="android.intent.action.VIEW" />
<data android:mimeType="application/x-mpegURL" />
</intent>
<intent>
<action android:name="android.intent.action.VIEW" />
<data android:mimeType="application/vnd.apple.mpegurl" />
</intent>
<intent>
<action android:name="android.intent.action.VIEW" />
<data android:scheme="magnet" />
</intent>
<!-- Common players supported in actions/temp -->
<package android:name="org.videolan.vlc" />
<package android:name="org.videolan.vlc.debug" />
<package android:name="is.xyz.mpv" />
<package android:name="is.xyz.mpv.ytdl" />
<package android:name="app.marlboroadvance.mpvex" />
<package android:name="live.mehiz.mpvkt" />
<package android:name="live.mehiz.mpvkt.preview" />
<package android:name="com.brouken.player" />
<package android:name="dev.anilbeesetti.nextplayer" />
<package android:name="com.instantbits.cast.webvideo" />
<package android:name="com.gianlu.aria2android" />
<!-- Torrent clients -->
<package android:name="org.proninyaroslav.libretorrent" />
<package android:name="com.biglybt.android.client" />
</queries>
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" /> <!-- Required for getting arbitrary Aniyomi packages -->
<!-- Fixes android tv fuckery --> <!-- Fixes android tv fuckery -->
<uses-feature <uses-feature
android:name="android.hardware.touchscreen" android:name="android.hardware.touchscreen"
@ -24,28 +71,24 @@
android:name="android.software.leanback" android:name="android.software.leanback"
android:required="false" /> android:required="false" />
<queries>
<package android:name="org.videolan.vlc" />
<package android:name="com.instantbits.cast.webvideo" />
<package android:name="is.xyz.mpv" />
</queries>
<!-- Without the large heap Exoplayer buffering gets reset due to OOM. --> <!-- Without the large heap Exoplayer buffering gets reset due to OOM. -->
<!--TODO https://stackoverflow.com/questions/41799732/chromecast-button-not-visible-in-android--> <!--TODO https://stackoverflow.com/questions/41799732/chromecast-button-not-visible-in-android-->
<application <application
android:name=".AcraApplication" android:name=".CloudStreamApp"
android:allowBackup="true" android:allowBackup="true"
android:appCategory="video" android:appCategory="video"
android:banner="@mipmap/ic_banner" android:banner="@mipmap/ic_banner"
android:fullBackupContent="@xml/backup_descriptor" android:fullBackupContent="@xml/backup_descriptor"
android:dataExtractionRules="@xml/data_extraction_rules"
android:icon="@mipmap/ic_launcher" android:icon="@mipmap/ic_launcher"
android:label="@string/app_name" android:label="@string/app_name"
android:largeHeap="true" android:largeHeap="true"
android:pageSizeCompat="enabled"
android:roundIcon="@mipmap/ic_launcher_round" android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true" android:supportsRtl="true"
android:theme="@style/AppTheme" android:theme="@style/AppTheme"
android:usesCleartextTraffic="true" android:usesCleartextTraffic="true"
tools:targetApi="o"> tools:targetApi="${target_sdk_version}">
<meta-data <meta-data
android:name="com.google.android.gms.cast.framework.OPTIONS_PROVIDER_CLASS_NAME" android:name="com.google.android.gms.cast.framework.OPTIONS_PROVIDER_CLASS_NAME"
@ -61,7 +104,10 @@
android:exported="true" android:exported="true"
android:resizeableActivity="true" android:resizeableActivity="true"
android:screenOrientation="userLandscape" android:screenOrientation="userLandscape"
android:supportsPictureInPicture="true"> android:supportsPictureInPicture="true"
android:taskAffinity="com.lagradost.cloudstream3.downloadedplayer"
android:launchMode="singleTask"
tools:ignore="DiscouragedApi">
<intent-filter> <intent-filter>
<action android:name="android.intent.action.VIEW" /> <action android:name="android.intent.action.VIEW" />
@ -79,25 +125,55 @@
<data android:mimeType="*/*" /> <data android:mimeType="*/*" />
</intent-filter> </intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<action android:name="android.intent.action.SEND" />
<action android:name="android.intent.action.OPEN_DOCUMENT" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="magnet" />
</intent-filter>
<!--<intent-filter tools:ignore="AppLinkUrlError">
<action android:name="android.intent.action.VIEW" />
<action android:name="android.intent.action.SEND" />
<action android:name="android.intent.action.OPEN_DOCUMENT" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="application/x-bittorrent" />
</intent-filter>-->
</activity> </activity>
<!-- <!--
android:launchMode="singleTask" android:launchMode="singleTask"
is a bit experimental, it makes loading repositories from browser still stay on the same page is a bit experimental, it makes loading repositories from browser still stay on the same page
no idea about side effects no idea about side effects
Not exported to prevent bypassing the AccountSelectActivity
--> -->
<activity <activity
android:name=".MainActivity" android:name=".MainActivity"
android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout|keyboard|keyboardHidden|navigation" android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout|keyboard|keyboardHidden|navigation|uiMode"
android:exported="true" android:exported="false"
android:launchMode="singleTask" android:launchMode="singleTask"
android:resizeableActivity="true" android:resizeableActivity="true"
android:supportsPictureInPicture="true"> android:supportsPictureInPicture="true" />
<activity
android:name=".ui.account.AccountSelectActivity"
android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout|keyboard|keyboardHidden"
android:exported="true">
<intent-filter android:exported="true"> <intent-filter android:exported="true">
<action android:name="android.intent.action.MAIN" /> <action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" /> <category android:name="android.intent.category.LAUNCHER" />
<category android:name="android.intent.category.LEANBACK_LAUNCHER" /> <category android:name="android.intent.category.LEANBACK_LAUNCHER" />
</intent-filter> </intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<!-- cloudstreamplayer://encodedUrl?name=Dune --> <!-- cloudstreamplayer://encodedUrl?name=Dune -->
<intent-filter> <intent-filter>
@ -124,7 +200,14 @@
<data android:scheme="cloudstreamrepo" /> <data android:scheme="cloudstreamrepo" />
</intent-filter> </intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="csshare" />
</intent-filter>
<!-- Allow searching with intents: cloudstreamsearch://Your%20Name --> <!-- Allow searching with intents: cloudstreamsearch://Your%20Name -->
<intent-filter> <intent-filter>
<action android:name="android.intent.action.VIEW" /> <action android:name="android.intent.action.VIEW" />
@ -148,7 +231,7 @@
<data android:scheme="cloudstreamcontinuewatching" /> <data android:scheme="cloudstreamcontinuewatching" />
</intent-filter> </intent-filter>
<intent-filter> <intent-filter android:autoVerify="false">
<action android:name="android.intent.action.VIEW" /> <action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.DEFAULT" />
@ -161,15 +244,11 @@
</intent-filter> </intent-filter>
</activity> </activity>
<activity
android:name=".ui.EasterEggMonke"
android:exported="true" />
<receiver <receiver
android:name=".receivers.VideoDownloadRestartReceiver" android:name=".receivers.VideoDownloadRestartReceiver"
android:enabled="false" android:enabled="false"
android:exported="true"> android:exported="false">
<intent-filter android:exported="true"> <intent-filter android:exported="false">
<action android:name="restart_service" /> <action android:name="restart_service" />
</intent-filter> </intent-filter>
</receiver> </receiver>
@ -177,14 +256,28 @@
<service <service
android:name=".services.VideoDownloadService" android:name=".services.VideoDownloadService"
android:enabled="true" android:enabled="true"
android:foregroundServiceType="dataSync"
android:exported="false" /> android:exported="false" />
<service
android:name=".services.DownloadQueueService"
android:enabled="true"
android:foregroundServiceType="dataSync"
android:exported="false" />
<!-- Necessary for WorkManager services: https://stackoverflow.com/a/77186316 -->
<service
android:name="androidx.work.impl.foreground.SystemForegroundService"
android:foregroundServiceType="dataSync"
tools:node="merge" />
<activity <activity
android:name=".ui.ControllerActivity" android:name=".ui.ControllerActivity"
android:exported="false" /> android:exported="false" />
<service <service
android:name=".utils.PackageInstallerService" android:name=".services.PackageInstallerService"
android:foregroundServiceType="dataSync"
android:exported="false" /> android:exported="false" />
<provider <provider

View file

@ -1,28 +0,0 @@
#include <jni.h>
#include <csignal>
#include <android/log.h>
#define TAG "CloudStream Crash Handler"
volatile sig_atomic_t gSignalStatus = 0;
void handleNativeCrash(int signal) {
gSignalStatus = signal;
}
extern "C" JNIEXPORT void JNICALL
Java_com_lagradost_cloudstream3_NativeCrashHandler_initNativeCrashHandler(JNIEnv *env, jobject) {
#define REGISTER_SIGNAL(X) signal(X, handleNativeCrash);
REGISTER_SIGNAL(SIGSEGV)
#undef REGISTER_SIGNAL
}
//extern "C" JNIEXPORT void JNICALL
//Java_com_lagradost_cloudstream3_NativeCrashHandler_triggerNativeCrash(JNIEnv *env, jobject thiz) {
// int *p = nullptr;
// *p = 0;
//}
extern "C" JNIEXPORT int JNICALL
Java_com_lagradost_cloudstream3_NativeCrashHandler_getSignalStatus(JNIEnv *env, jobject) {
//__android_log_print(ANDROID_LOG_INFO, TAG, "Got signal status %d", gSignalStatus);
return gSignalStatus;
}

View file

@ -1,222 +1,78 @@
package com.lagradost.cloudstream3 package com.lagradost.cloudstream3
import android.app.Activity
import android.app.Application
import android.content.Context
import android.content.ContextWrapper
import android.content.Intent
import android.widget.Toast
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentActivity
import com.google.auto.service.AutoService
import com.lagradost.cloudstream3.mvvm.normalSafeApiCall
import com.lagradost.cloudstream3.mvvm.suspendSafeApiCall
import com.lagradost.cloudstream3.plugins.PluginManager
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.isTvSettings
import com.lagradost.cloudstream3.utils.AppUtils.openBrowser
import com.lagradost.cloudstream3.utils.Coroutines.runOnMainThread
import com.lagradost.cloudstream3.utils.DataStore.getKey
import com.lagradost.cloudstream3.utils.DataStore.getKeys
import com.lagradost.cloudstream3.utils.DataStore.removeKey
import com.lagradost.cloudstream3.utils.DataStore.removeKeys
import com.lagradost.cloudstream3.utils.DataStore.setKey
import kotlinx.coroutines.runBlocking
import org.acra.ACRA
import org.acra.ReportField
import org.acra.config.CoreConfiguration
import org.acra.data.CrashReportData
import org.acra.data.StringFormat
import org.acra.ktx.initAcra
import org.acra.sender.ReportSender
import org.acra.sender.ReportSenderFactory
import java.io.File
import java.io.FileNotFoundException
import java.io.PrintStream
import java.lang.Exception
import java.lang.ref.WeakReference
import kotlin.concurrent.thread
import kotlin.system.exitProcess
class CustomReportSender : ReportSender {
// Sends all your crashes to google forms
override fun send(context: Context, errorContent: CrashReportData) {
println("Sending report")
val url =
"https://docs.google.com/forms/d/e/1FAIpQLSfO4r353BJ79TTY_-t5KWSIJT2xfqcQWY81xjAA1-1N0U2eSg/formResponse"
val data = mapOf(
"entry.1993829403" to errorContent.toJSON()
)
thread { // to not run it on main thread
runBlocking {
suspendSafeApiCall {
app.post(url, data = data)
//println("Report response: $post")
}
}
}
runOnMainThread { // to run it on main looper
normalSafeApiCall {
Toast.makeText(context, R.string.acra_report_toast, Toast.LENGTH_SHORT).show()
}
}
}
}
@AutoService(ReportSenderFactory::class)
class CustomSenderFactory : ReportSenderFactory {
override fun create(context: Context, config: CoreConfiguration): ReportSender {
return CustomReportSender()
}
override fun enabled(config: CoreConfiguration): Boolean {
return true
}
}
class ExceptionHandler(val errorFile: File, val onError: (() -> Unit)) :
Thread.UncaughtExceptionHandler {
override fun uncaughtException(thread: Thread, error: Throwable) {
ACRA.errorReporter.handleException(error)
try {
PrintStream(errorFile).use { ps ->
ps.println(String.format("Currently loading extension: ${PluginManager.currentlyLoading ?: "none"}"))
ps.println(
String.format(
"Fatal exception on thread %s (%d)",
thread.name,
thread.id
)
)
error.printStackTrace(ps)
}
} catch (ignored: FileNotFoundException) {
}
try {
onError.invoke()
} catch (ignored: Exception) {
}
exitProcess(1)
}
}
class AcraApplication : Application() {
override fun onCreate() {
super.onCreate()
//NativeCrashHandler.initCrashHandler()
ExceptionHandler(filesDir.resolve("last_error")) {
val intent = context!!.packageManager.getLaunchIntentForPackage(context!!.packageName)
startActivity(Intent.makeRestartActivityTask(intent!!.component))
}.also {
exceptionHandler = it
Thread.setDefaultUncaughtExceptionHandler(it)
}
}
override fun attachBaseContext(base: Context?) {
super.attachBaseContext(base)
context = base
initAcra {
//core configuration:
buildConfigClass = BuildConfig::class.java
reportFormat = StringFormat.JSON
reportContent = listOf(
ReportField.BUILD_CONFIG, ReportField.USER_CRASH_DATE,
ReportField.ANDROID_VERSION, ReportField.PHONE_MODEL,
ReportField.STACK_TRACE,
)
// removed this due to bug when starting the app, moved it to when it actually crashes
//each plugin you chose above can be configured in a block like this:
/*toast {
text = getString(R.string.acra_report_toast)
//opening this block automatically enables the plugin.
}*/
}
}
companion object {
var exceptionHandler: ExceptionHandler? = null
/** Use to get activity from Context */
tailrec fun Context.getActivity(): Activity? = this as? Activity
?: (this as? ContextWrapper)?.baseContext?.getActivity()
private var _context: WeakReference<Context>? = null
var context
get() = _context?.get()
private set(value) {
_context = WeakReference(value)
}
fun <T : Any> getKeyClass(path: String, valueType: Class<T>): T? {
return context?.getKey(path, valueType)
}
fun <T : Any> setKeyClass(path: String, value: T) {
context?.setKey(path, value)
}
fun removeKeys(folder: String): Int? {
return context?.removeKeys(folder)
}
fun <T> setKey(path: String, value: T) {
context?.setKey(path, value)
}
fun <T> setKey(folder: String, path: String, value: T) {
context?.setKey(folder, path, value)
}
inline fun <reified T : Any> getKey(path: String, defVal: T?): T? {
return context?.getKey(path, defVal)
}
inline fun <reified T : Any> getKey(path: String): T? {
return context?.getKey(path)
}
inline fun <reified T : Any> getKey(folder: String, path: String): T? {
return context?.getKey(folder, path)
}
inline fun <reified T : Any> getKey(folder: String, path: String, defVal: T?): T? {
return context?.getKey(folder, path, defVal)
}
fun getKeys(folder: String): List<String>? {
return context?.getKeys(folder)
}
fun removeKey(folder: String, path: String) {
context?.removeKey(folder, path)
}
fun removeKey(path: String) {
context?.removeKey(path)
}
/** /**
* If fallbackWebview is true and a fragment is supplied then it will open a webview with the url if the browser fails. * Deprecated alias for CloudStreamApp for backwards compatibility with plugins.
* */ * Use CloudStreamApp instead.
fun openBrowser(url: String, fallbackWebview: Boolean = false, fragment: Fragment? = null) { */
context?.openBrowser(url, fallbackWebview, fragment) @Deprecated(
} message = "AcraApplication is deprecated, use CloudStreamApp instead",
replaceWith = ReplaceWith("com.lagradost.cloudstream3.CloudStreamApp"),
/** Will fallback to webview if in TV layout */ level = DeprecationLevel.WARNING
fun openBrowser(url: String, activity: FragmentActivity?) {
openBrowser(
url,
isTvSettings(),
activity?.supportFragmentManager?.fragments?.lastOrNull()
) )
} class AcraApplication {
companion object {
@Deprecated(
message = "AcraApplication is deprecated, use CloudStreamApp instead",
replaceWith = ReplaceWith("com.lagradost.cloudstream3.CloudStreamApp.context"),
level = DeprecationLevel.WARNING
)
val context get() = CloudStreamApp.context
@Deprecated(
message = "AcraApplication is deprecated, use CloudStreamApp instead",
replaceWith = ReplaceWith("com.lagradost.cloudstream3.CloudStreamApp.removeKeys(folder)"),
level = DeprecationLevel.WARNING
)
fun removeKeys(folder: String): Int? =
CloudStreamApp.removeKeys(folder)
@Deprecated(
message = "AcraApplication is deprecated, use CloudStreamApp instead",
replaceWith = ReplaceWith("com.lagradost.cloudstream3.CloudStreamApp.setKey(path, value)"),
level = DeprecationLevel.WARNING
)
fun <T> setKey(path: String, value: T) =
CloudStreamApp.setKey(path, value)
@Deprecated(
message = "AcraApplication is deprecated, use CloudStreamApp instead",
replaceWith = ReplaceWith("com.lagradost.cloudstream3.CloudStreamApp.setKey(folder, path, value)"),
level = DeprecationLevel.WARNING
)
fun <T> setKey(folder: String, path: String, value: T) =
CloudStreamApp.setKey(folder, path, value)
@Deprecated(
message = "AcraApplication is deprecated, use CloudStreamApp instead",
replaceWith = ReplaceWith("com.lagradost.cloudstream3.CloudStreamApp.getKey(path, defVal)"),
level = DeprecationLevel.WARNING
)
inline fun <reified T : Any> getKey(path: String, defVal: T?): T? =
CloudStreamApp.getKey(path, defVal)
@Deprecated(
message = "AcraApplication is deprecated, use CloudStreamApp instead",
replaceWith = ReplaceWith("com.lagradost.cloudstream3.CloudStreamApp.getKey(path)"),
level = DeprecationLevel.WARNING
)
inline fun <reified T : Any> getKey(path: String): T? =
CloudStreamApp.getKey(path)
@Deprecated(
message = "AcraApplication is deprecated, use CloudStreamApp instead",
replaceWith = ReplaceWith("com.lagradost.cloudstream3.CloudStreamApp.getKey(folder, path)"),
level = DeprecationLevel.WARNING
)
inline fun <reified T : Any> getKey(folder: String, path: String): T? =
CloudStreamApp.getKey(folder, path)
@Deprecated(
message = "AcraApplication is deprecated, use CloudStreamApp instead",
replaceWith = ReplaceWith("com.lagradost.cloudstream3.CloudStreamApp.getKey(folder, path, defVal)"),
level = DeprecationLevel.WARNING
)
inline fun <reified T : Any> getKey(folder: String, path: String, defVal: T?): T? =
CloudStreamApp.getKey(folder, path, defVal)
} }
} }

View file

@ -0,0 +1,181 @@
package com.lagradost.cloudstream3
import android.app.Activity
import android.app.Application
import android.content.Context
import android.content.ContextWrapper
import android.content.Intent
import android.os.Build
import android.widget.Toast
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentActivity
import coil3.ImageLoader
import coil3.PlatformContext
import coil3.SingletonImageLoader
import com.lagradost.api.setContext
import com.lagradost.cloudstream3.BuildConfig
import com.lagradost.cloudstream3.mvvm.safe
import com.lagradost.cloudstream3.mvvm.safeAsync
import com.lagradost.cloudstream3.plugins.PluginManager
import com.lagradost.cloudstream3.ui.settings.Globals.EMULATOR
import com.lagradost.cloudstream3.ui.settings.Globals.TV
import com.lagradost.cloudstream3.ui.settings.Globals.isLayout
import com.lagradost.cloudstream3.utils.AppContextUtils.openBrowser
import com.lagradost.cloudstream3.utils.AppDebug
import com.lagradost.cloudstream3.utils.Coroutines.runOnMainThread
import com.lagradost.cloudstream3.utils.DataStore.getKey
import com.lagradost.cloudstream3.utils.DataStore.getKeys
import com.lagradost.cloudstream3.utils.DataStore.removeKey
import com.lagradost.cloudstream3.utils.DataStore.removeKeys
import com.lagradost.cloudstream3.utils.DataStore.setKey
import com.lagradost.cloudstream3.utils.ImageLoader.buildImageLoader
import kotlinx.coroutines.runBlocking
import java.io.File
import java.io.FileNotFoundException
import java.io.PrintStream
import java.lang.ref.WeakReference
import java.util.Locale
import kotlin.concurrent.thread
import kotlin.system.exitProcess
class ExceptionHandler(
val errorFile: File,
val onError: (() -> Unit)
) : Thread.UncaughtExceptionHandler {
override fun uncaughtException(thread: Thread, error: Throwable) {
try {
val threadId = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.BAKLAVA) {
thread.threadId()
} else {
@Suppress("DEPRECATION")
thread.id
}
PrintStream(errorFile).use { ps ->
ps.println("Currently loading extension: ${PluginManager.currentlyLoading ?: "none"}")
ps.println("Fatal exception on thread ${thread.name} ($threadId)")
error.printStackTrace(ps)
}
} catch (_: FileNotFoundException) {
}
try {
onError()
} catch (_: Exception) {
}
exitProcess(1)
}
}
class CloudStreamApp : Application(), SingletonImageLoader.Factory {
override fun onCreate() {
super.onCreate()
// If we want to initialize Coil as early as possible, maybe when
// loading an image or GIF in a splash screen activity.
// buildImageLoader(applicationContext)
ExceptionHandler(filesDir.resolve("last_error")) {
val intent = context!!.packageManager.getLaunchIntentForPackage(context!!.packageName)
startActivity(Intent.makeRestartActivityTask(intent!!.component))
}.also {
exceptionHandler = it
Thread.setDefaultUncaughtExceptionHandler(it)
}
AppDebug.isDebug = BuildConfig.DEBUG
}
override fun attachBaseContext(base: Context?) {
super.attachBaseContext(base)
context = base
}
override fun newImageLoader(context: PlatformContext): ImageLoader {
// Coil module will be initialized globally when first loadImage() is invoked.
return buildImageLoader(applicationContext)
}
companion object {
var exceptionHandler: ExceptionHandler? = null
/** Use to get Activity from Context. */
tailrec fun Context.getActivity(): Activity? {
return when (this) {
is Activity -> this
is ContextWrapper -> baseContext.getActivity()
else -> null
}
}
private var _context: WeakReference<Context>? = null
var context
get() = _context?.get()
private set(value) {
_context = WeakReference(value)
setContext(WeakReference(value))
}
fun <T : Any> getKeyClass(path: String, valueType: Class<T>): T? {
return context?.getKey(path, valueType)
}
fun <T : Any> setKeyClass(path: String, value: T) {
context?.setKey(path, value)
}
fun removeKeys(folder: String): Int? {
return context?.removeKeys(folder)
}
fun <T> setKey(path: String, value: T) {
context?.setKey(path, value)
}
fun <T> setKey(folder: String, path: String, value: T) {
context?.setKey(folder, path, value)
}
inline fun <reified T : Any> getKey(path: String, defVal: T?): T? {
return context?.getKey(path, defVal)
}
inline fun <reified T : Any> getKey(path: String): T? {
return context?.getKey(path)
}
inline fun <reified T : Any> getKey(folder: String, path: String): T? {
return context?.getKey(folder, path)
}
inline fun <reified T : Any> getKey(folder: String, path: String, defVal: T?): T? {
return context?.getKey(folder, path, defVal)
}
fun getKeys(folder: String): List<String>? {
return context?.getKeys(folder)
}
fun removeKey(folder: String, path: String) {
context?.removeKey(folder, path)
}
fun removeKey(path: String) {
context?.removeKey(path)
}
/** If fallbackWebView is true and a fragment is supplied then it will open a WebView with the URL if the browser fails. */
fun openBrowser(url: String, fallbackWebView: Boolean = false, fragment: Fragment? = null) {
context?.openBrowser(url, fallbackWebView, fragment)
}
/** Will fall back to WebView if in TV or emulator layout. */
fun openBrowser(url: String, activity: FragmentActivity?) {
openBrowser(
url,
isLayout(TV or EMULATOR),
activity?.supportFragmentManager?.fragments?.lastOrNull()
)
}
}
}

View file

@ -1,16 +1,23 @@
package com.lagradost.cloudstream3 package com.lagradost.cloudstream3
import android.Manifest import android.annotation.SuppressLint
import android.app.Activity import android.app.Activity
import android.app.PictureInPictureParams import android.app.PictureInPictureParams
import android.content.Context import android.content.Context
import android.content.pm.PackageManager import android.content.pm.PackageManager
import android.content.res.Configuration
import android.content.res.Resources import android.content.res.Resources
import android.Manifest
import android.os.Build import android.os.Build
import android.os.Handler
import android.os.Looper
import android.util.DisplayMetrics
import android.util.Log import android.util.Log
import android.view.* import android.view.Gravity
import android.view.KeyEvent
import android.view.View
import android.view.View.NO_ID import android.view.View.NO_ID
import android.widget.TextView import android.view.ViewGroup
import android.widget.Toast import android.widget.Toast
import androidx.activity.ComponentActivity import androidx.activity.ComponentActivity
import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.result.contract.ActivityResultContracts
@ -20,27 +27,41 @@ import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.widget.SearchView import androidx.appcompat.widget.SearchView
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.core.view.children import androidx.core.view.children
import androidx.core.view.isNotEmpty
import androidx.preference.PreferenceManager import androidx.preference.PreferenceManager
import com.google.android.gms.cast.framework.CastSession import com.google.android.gms.cast.framework.CastSession
import com.google.android.material.chip.ChipGroup import com.google.android.material.chip.ChipGroup
import com.google.android.material.navigationrail.NavigationRailView import com.google.android.material.navigationrail.NavigationRailView
import com.lagradost.cloudstream3.AcraApplication.Companion.getKey import com.lagradost.cloudstream3.CloudStreamApp.Companion.getKey
import com.lagradost.cloudstream3.AcraApplication.Companion.removeKey import com.lagradost.cloudstream3.CloudStreamApp.Companion.removeKey
import com.lagradost.cloudstream3.actions.OpenInAppAction
import com.lagradost.cloudstream3.actions.VideoClickActionHolder
import com.lagradost.cloudstream3.databinding.ToastBinding
import com.lagradost.cloudstream3.mvvm.logError import com.lagradost.cloudstream3.mvvm.logError
import com.lagradost.cloudstream3.ui.player.PlayerEventType import com.lagradost.cloudstream3.syncproviders.AccountManager
import com.lagradost.cloudstream3.ui.result.ResultFragment import com.lagradost.cloudstream3.ui.home.HomeChildItemAdapter
import com.lagradost.cloudstream3.ui.result.UiText import com.lagradost.cloudstream3.ui.home.ParentItemAdapter
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.updateTv import com.lagradost.cloudstream3.ui.player.PlayerPipHelper.isPIPPossible
import com.lagradost.cloudstream3.utils.AppUtils.isRtl import com.lagradost.cloudstream3.ui.player.Torrent
import com.lagradost.cloudstream3.utils.DataStoreHelper import com.lagradost.cloudstream3.ui.result.ActorAdaptor
import com.lagradost.cloudstream3.ui.result.EpisodeAdapter
import com.lagradost.cloudstream3.ui.result.ImageAdapter
import com.lagradost.cloudstream3.ui.search.SearchAdapter
import com.lagradost.cloudstream3.ui.settings.Globals.isLayout
import com.lagradost.cloudstream3.ui.settings.Globals.TV
import com.lagradost.cloudstream3.ui.settings.Globals.updateTv
import com.lagradost.cloudstream3.ui.settings.extensions.PluginAdapter
import com.lagradost.cloudstream3.utils.AppContextUtils.isRtl
import com.lagradost.cloudstream3.utils.Coroutines.ioSafe
import com.lagradost.cloudstream3.utils.Event import com.lagradost.cloudstream3.utils.Event
import com.lagradost.cloudstream3.utils.UIHelper import com.lagradost.cloudstream3.utils.UIHelper.showInputMethod
import com.lagradost.cloudstream3.utils.UIHelper.hasPIPPermission
import com.lagradost.cloudstream3.utils.UIHelper.shouldShowPIPMode
import com.lagradost.cloudstream3.utils.UIHelper.toPx import com.lagradost.cloudstream3.utils.UIHelper.toPx
import org.schabi.newpipe.extractor.NewPipe import com.lagradost.cloudstream3.utils.UiText
import java.lang.ref.WeakReference import java.lang.ref.WeakReference
import java.util.* import java.util.Locale
import kotlin.math.max
import kotlin.math.min
import org.schabi.newpipe.extractor.NewPipe
enum class FocusDirection { enum class FocusDirection {
Start, Start,
@ -58,24 +79,48 @@ object CommonActivity {
_activity = WeakReference(value) _activity = WeakReference(value)
} }
@MainThread
fun setActivityInstance(newActivity: Activity?) {
activity = newActivity
}
@MainThread @MainThread
fun Activity?.getCastSession(): CastSession? { fun Activity?.getCastSession(): CastSession? {
return (this as MainActivity?)?.mSessionManager?.currentCastSession return (this as MainActivity?)?.mSessionManager?.currentCastSession
} }
val displayMetrics: DisplayMetrics = Resources.getSystem().displayMetrics
var canEnterPipMode: Boolean = false // screenWidth and screenHeight does always
var canShowPipMode: Boolean = false // refer to the screen while in landscape mode
val screenWidth: Int
get() {
return max(displayMetrics.widthPixels, displayMetrics.heightPixels)
}
val screenHeight: Int
get() {
return min(displayMetrics.widthPixels, displayMetrics.heightPixels)
}
val screenWidthWithOrientation: Int
get() {
return displayMetrics.widthPixels
}
val screenHeightWithOrientation: Int
get() {
return displayMetrics.heightPixels
}
var isPipDesired: Boolean = false
var isInPIPMode: Boolean = false var isInPIPMode: Boolean = false
val onColorSelectedEvent = Event<Pair<Int, Int>>() val onColorSelectedEvent = Event<Pair<Int, Int>>()
val onDialogDismissedEvent = Event<Int>() val onDialogDismissedEvent = Event<Int>()
var playerEventListener: ((PlayerEventType) -> Unit)? = null
var keyEventListener: ((Pair<KeyEvent?, Boolean>) -> Boolean)? = null var keyEventListener: ((Pair<KeyEvent?, Boolean>) -> Boolean)? = null
var appliedTheme: Int = 0
var appliedColor: Int = 0
private var currentToast: Toast? = null
var currentToast: Toast? = null
fun showToast(@StringRes message: Int, duration: Int? = null) { fun showToast(@StringRes message: Int, duration: Int? = null) {
val act = activity ?: return val act = activity ?: return
@ -131,42 +176,50 @@ object CommonActivity {
} catch (e: Exception) { } catch (e: Exception) {
logError(e) logError(e)
} }
try { try {
val inflater = val binding = ToastBinding.inflate(act.layoutInflater)
act.getSystemService(AppCompatActivity.LAYOUT_INFLATER_SERVICE) as LayoutInflater binding.text.text = message.trim()
val layout: View = inflater.inflate(
R.layout.toast,
act.findViewById<View>(R.id.toast_layout_root) as ViewGroup?
)
val text = layout.findViewById(R.id.text) as TextView
text.text = message.trim()
// custom toasts are deprecated and won't appear when cs3 sets minSDK to api30 (A11)
val toast = Toast(act) val toast = Toast(act)
toast.setGravity(Gravity.CENTER_HORIZONTAL or Gravity.BOTTOM, 0, 5.toPx)
toast.duration = duration ?: Toast.LENGTH_SHORT toast.duration = duration ?: Toast.LENGTH_SHORT
toast.view = layout toast.setGravity(Gravity.CENTER_HORIZONTAL or Gravity.BOTTOM, 0, 5.toPx)
//https://github.com/PureWriter/ToastCompat @Suppress("DEPRECATION")
toast.show() toast.view =
binding.root // FIXME Find an alternative using default Toasts since custom toasts are deprecated and won't appear with api30 set as minSDK version.
currentToast = toast currentToast = toast
toast.show()
val handler = Handler(Looper.getMainLooper())
val ref = WeakReference(toast)
/* Clean up activity leak */
handler.postDelayed({
if (ref.get() == currentToast) {
currentToast = null
}
}, 10_000)
} catch (e: Exception) { } catch (e: Exception) {
logError(e) logError(e)
} }
} }
/** /**
* Not all languages can be fetched from locale with a code. * Set locale
* This map allows sidestepping the default Locale(languageCode) * @param languageTag shall a IETF BCP 47 conformant tag.
* when setting the app language. * Check [com.lagradost.cloudstream3.utils.SubtitleHelper].
**/ *
val appLanguageExceptions = hashMapOf( * See locales on:
"zh-rTW" to Locale.TRADITIONAL_CHINESE * https://github.com/unicode-org/cldr-json/blob/main/cldr-json/cldr-core/availableLocales.json
) * https://www.iana.org/assignments/language-subtag-registry/language-subtag-registry
* https://android.googlesource.com/platform/frameworks/base/+/android-16.0.0_r2/core/res/res/values/locale_config.xml
fun setLocale(context: Context?, languageCode: String?) { * https://iso639-3.sil.org/code_tables/639/data/all
if (context == null || languageCode == null) return */
val locale = appLanguageExceptions[languageCode] ?: Locale(languageCode) fun setLocale(context: Context?, languageTag: String?) {
if (context == null || languageTag == null) return
val locale = Locale.forLanguageTag(languageTag)
val resources: Resources = context.resources val resources: Resources = context.resources
val config = resources.configuration val config = resources.configuration
Locale.setDefault(locale) Locale.setDefault(locale)
@ -174,7 +227,12 @@ object CommonActivity {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
context.createConfigurationContext(config) context.createConfigurationContext(config)
resources.updateConfiguration(config, resources.displayMetrics)
@Suppress("DEPRECATION")
resources.updateConfiguration(
config,
resources.displayMetrics
) // FIXME this should be replaced
} }
fun Context.updateLocale() { fun Context.updateLocale() {
@ -183,44 +241,38 @@ object CommonActivity {
setLocale(this, localeCode) setLocale(this, localeCode)
} }
fun init(act: ComponentActivity?) { fun init(act: Activity) {
if (act == null) return setActivityInstance(act)
activity = act ioSafe { Torrent.deleteAllFiles() }
//https://stackoverflow.com/questions/52594181/how-to-know-if-user-has-disabled-picture-in-picture-feature-permission val componentActivity = activity as? ComponentActivity ?: return
//https://developer.android.com/guide/topics/ui/picture-in-picture
canShowPipMode =
Build.VERSION.SDK_INT >= Build.VERSION_CODES.N && // OS SUPPORT
act.packageManager.hasSystemFeature(PackageManager.FEATURE_PICTURE_IN_PICTURE) && // HAS FEATURE, MIGHT BE BLOCKED DUE TO POWER DRAIN
act.hasPIPPermission() // CHECK IF FEATURE IS ENABLED IN SETTINGS
act.updateLocale() componentActivity.updateLocale()
act.updateTv() componentActivity.updateTv()
AccountManager.initMainAPI()
NewPipe.init(DownloaderTestImpl.getInstance()) NewPipe.init(DownloaderTestImpl.getInstance())
for (resumeApp in resumeApps) { MainActivity.activityResultLauncher =
resumeApp.launcher = componentActivity.registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
act.registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> if (result.resultCode == AppCompatActivity.RESULT_OK) {
val resultCode = result.resultCode val actionUid =
val data = result.data getKey<String>("last_click_action") ?: return@registerForActivityResult
if (resultCode == AppCompatActivity.RESULT_OK && data != null && resumeApp.position != null && resumeApp.duration != null) { Log.d(TAG, "Loading action $actionUid result handler")
val pos = resumeApp.getPosition(data) val action = VideoClickActionHolder.getByUniqueId(actionUid) as? OpenInAppAction
val dur = resumeApp.getDuration(data) ?: return@registerForActivityResult
if (dur > 0L && pos > 0L) action.onResultSafe(act, result.data)
DataStoreHelper.setViewPos(getKey(resumeApp.lastId), pos, dur) removeKey("last_click_action")
removeKey(resumeApp.lastId) removeKey("last_opened")
ResultFragment.updateUI()
}
} }
} }
// Ask for notification permissions on Android 13 // Ask for notification permissions on Android 13
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU && if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU &&
ContextCompat.checkSelfPermission( ContextCompat.checkSelfPermission(
act, componentActivity,
Manifest.permission.POST_NOTIFICATIONS Manifest.permission.POST_NOTIFICATIONS
) != PackageManager.PERMISSION_GRANTED ) != PackageManager.PERMISSION_GRANTED
) { ) {
val requestPermissionLauncher = act.registerForActivityResult( val requestPermissionLauncher = componentActivity.registerForActivityResult(
ActivityResultContracts.RequestPermission() ActivityResultContracts.RequestPermission()
) { isGranted: Boolean -> ) { isGranted: Boolean ->
Log.d(TAG, "Notification permission: $isGranted") Log.d(TAG, "Notification permission: $isGranted")
@ -231,17 +283,22 @@ object CommonActivity {
} }
} }
/** Enters pip mode if it is both possible and desired to do so*/
private fun Activity.enterPIPMode() { private fun Activity.enterPIPMode() {
if (!shouldShowPIPMode(canEnterPipMode) || !canShowPipMode) return if (!isPipDesired || !this.isPIPPossible()) return
try { try {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
try { try {
enterPictureInPictureMode(PictureInPictureParams.Builder().build()) enterPictureInPictureMode(PictureInPictureParams.Builder().build())
} catch (e: Exception) { } catch (_: Exception) {
// Use fallback just in case
@Suppress("DEPRECATION")
enterPictureInPictureMode() enterPictureInPictureMode()
} }
} else { } else {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
@Suppress("DEPRECATION")
enterPictureInPictureMode() enterPictureInPictureMode()
} }
} }
@ -250,9 +307,32 @@ object CommonActivity {
} }
} }
fun onUserLeaveHint(act: Activity?) { fun onUserLeaveHint(act: Activity) {
if (canEnterPipMode && canShowPipMode) { // On Android 12 and later we use setAutoEnterEnabled() instead.
act?.enterPIPMode() if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) return
act.enterPIPMode()
}
fun updateTheme(act: Activity) {
val settingsManager = PreferenceManager.getDefaultSharedPreferences(act)
if (settingsManager
.getString(act.getString(R.string.app_theme_key), "AmoledLight") == "System"
&& Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q
) {
loadThemes(act)
}
}
private fun mapSystemTheme(act: Activity): Int {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
val currentNightMode =
act.resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK
return when (currentNightMode) {
Configuration.UI_MODE_NIGHT_NO -> R.style.LightMode // Night mode is not active, we're using the light theme
else -> R.style.AppTheme // Night mode is active, we're using dark theme
}
} else {
return R.style.AppTheme
} }
} }
@ -262,6 +342,7 @@ object CommonActivity {
val currentTheme = val currentTheme =
when (settingsManager.getString(act.getString(R.string.app_theme_key), "AmoledLight")) { when (settingsManager.getString(act.getString(R.string.app_theme_key), "AmoledLight")) {
"System" -> mapSystemTheme(act)
"Black" -> R.style.AppTheme "Black" -> R.style.AppTheme
"Light" -> R.style.LightMode "Light" -> R.style.LightMode
"Amoled" -> R.style.AmoledMode "Amoled" -> R.style.AmoledMode
@ -269,18 +350,25 @@ object CommonActivity {
"Monet" -> if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) "Monet" -> if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S)
R.style.MonetMode else R.style.AppTheme R.style.MonetMode else R.style.AppTheme
"Dracula" -> R.style.DraculaMode
"Lavender" -> R.style.LavenderMode
"SilentBlue" -> R.style.SilentBlueMode
else -> R.style.AppTheme else -> R.style.AppTheme
} }
val currentOverlayTheme = val currentOverlayTheme =
when (settingsManager.getString(act.getString(R.string.primary_color_key), "Normal")) { when (settingsManager.getString(act.getString(R.string.primary_color_key), "Normal")) {
"Normal" -> R.style.OverlayPrimaryColorNormal "Normal" -> R.style.OverlayPrimaryColorNormal
"DandelionYellow" -> R.style.OverlayPrimaryColorDandelionYellow
"CarnationPink" -> R.style.OverlayPrimaryColorCarnationPink "CarnationPink" -> R.style.OverlayPrimaryColorCarnationPink
"Orange" -> R.style.OverlayPrimaryColorOrange
"DarkGreen" -> R.style.OverlayPrimaryColorDarkGreen "DarkGreen" -> R.style.OverlayPrimaryColorDarkGreen
"Maroon" -> R.style.OverlayPrimaryColorMaroon "Maroon" -> R.style.OverlayPrimaryColorMaroon
"NavyBlue" -> R.style.OverlayPrimaryColorNavyBlue "NavyBlue" -> R.style.OverlayPrimaryColorNavyBlue
"Grey" -> R.style.OverlayPrimaryColorGrey "Grey" -> R.style.OverlayPrimaryColorGrey
"White" -> R.style.OverlayPrimaryColorWhite "White" -> R.style.OverlayPrimaryColorWhite
"CoolBlue" -> R.style.OverlayPrimaryColorCoolBlue
"Brown" -> R.style.OverlayPrimaryColorBrown "Brown" -> R.style.OverlayPrimaryColorBrown
"Purple" -> R.style.OverlayPrimaryColorPurple "Purple" -> R.style.OverlayPrimaryColorPurple
"Green" -> R.style.OverlayPrimaryColorGreen "Green" -> R.style.OverlayPrimaryColorGreen
@ -289,6 +377,7 @@ object CommonActivity {
"Banana" -> R.style.OverlayPrimaryColorBanana "Banana" -> R.style.OverlayPrimaryColorBanana
"Party" -> R.style.OverlayPrimaryColorParty "Party" -> R.style.OverlayPrimaryColorParty
"Pink" -> R.style.OverlayPrimaryColorPink "Pink" -> R.style.OverlayPrimaryColorPink
"Lavender" -> R.style.OverlayPrimaryColorLavender
"Monet" -> if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) "Monet" -> if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S)
R.style.OverlayPrimaryColorMonet else R.style.OverlayPrimaryColorNormal R.style.OverlayPrimaryColorMonet else R.style.OverlayPrimaryColorNormal
@ -297,9 +386,13 @@ object CommonActivity {
else -> R.style.OverlayPrimaryColorNormal else -> R.style.OverlayPrimaryColorNormal
} }
act.theme.applyStyle(currentTheme, true) act.theme.applyStyle(currentTheme, true)
act.theme.applyStyle(currentOverlayTheme, true) act.theme.applyStyle(currentOverlayTheme, true)
appliedTheme = currentTheme
appliedColor = currentOverlayTheme
act.updateTv()
if (isLayout(TV)) act.theme.applyStyle(R.style.AppThemeTvOverlay, true)
act.theme.applyStyle( act.theme.applyStyle(
R.style.LoadedStyle, R.style.LoadedStyle,
true true
@ -328,6 +421,13 @@ object CommonActivity {
currentLook = currentLook.parent as? View ?: break currentLook = currentLook.parent as? View ?: break
}*/ }*/
private fun View.hasContent(): Boolean {
return isShown && when (this) {
is ViewGroup -> this.isNotEmpty()
else -> true
}
}
/** skips the initial stage of searching for an id using the view, see getNextFocus for specification */ /** skips the initial stage of searching for an id using the view, see getNextFocus for specification */
fun continueGetNextFocus( fun continueGetNextFocus(
root: Any?, root: Any?,
@ -348,16 +448,17 @@ object CommonActivity {
} ?: return null } ?: return null
next = localLook(view, nextId) ?: next next = localLook(view, nextId) ?: next
val shown = next.hasContent()
// if cant focus but visible then break and let android decide // if cant focus but visible then break and let android decide
// the exception if is the view is a parent and has children that wants focus // the exception if is the view is a parent and has children that wants focus
val hasChildrenThatWantsFocus = (next as? ViewGroup)?.let { parent -> val hasChildrenThatWantsFocus = (next as? ViewGroup)?.let { parent ->
parent.descendantFocusability == ViewGroup.FOCUS_AFTER_DESCENDANTS && parent.childCount > 0 parent.descendantFocusability == ViewGroup.FOCUS_AFTER_DESCENDANTS && parent.isNotEmpty()
} ?: false } ?: false
if (!next.isFocusable && next.isShown && !hasChildrenThatWantsFocus) return null if (!next.isFocusable && shown && !hasChildrenThatWantsFocus) return null
// if not shown then continue because we will "skip" over views to get to a replacement // if not shown then continue because we will "skip" over views to get to a replacement
if (!next.isShown) { if (!shown) {
// we don't want a while true loop, so we let android decide if we find a recursive view // we don't want a while true loop, so we let android decide if we find a recursive view
if (next == view) return null if (next == view) return null
return getNextFocus(root, next, direction, depth + 1) return getNextFocus(root, next, direction, depth + 1)
@ -430,98 +531,8 @@ object CommonActivity {
} }
fun onKeyDown(act: Activity?, keyCode: Int, event: KeyEvent?) { fun onKeyDown(act: Activity?, keyCode: Int, event: KeyEvent?): Boolean? {
//println("Keycode: $keyCode") return null
//showToast(
// this,
// "Got Keycode $keyCode | ${KeyEvent.keyCodeToString(keyCode)} \n ${event?.action}",
// Toast.LENGTH_LONG
//)
// Tested keycodes on remote:
// KeyEvent.KEYCODE_MEDIA_FAST_FORWARD
// KeyEvent.KEYCODE_MEDIA_REWIND
// KeyEvent.KEYCODE_MENU
// KeyEvent.KEYCODE_MEDIA_NEXT
// KeyEvent.KEYCODE_MEDIA_PREVIOUS
// KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE
// 149 keycode_numpad 5
when (keyCode) {
KeyEvent.KEYCODE_FORWARD, KeyEvent.KEYCODE_D, KeyEvent.KEYCODE_MEDIA_SKIP_FORWARD, KeyEvent.KEYCODE_MEDIA_FAST_FORWARD -> {
PlayerEventType.SeekForward
}
KeyEvent.KEYCODE_A, KeyEvent.KEYCODE_MEDIA_SKIP_BACKWARD, KeyEvent.KEYCODE_MEDIA_REWIND -> {
PlayerEventType.SeekBack
}
KeyEvent.KEYCODE_MEDIA_NEXT, KeyEvent.KEYCODE_BUTTON_R1, KeyEvent.KEYCODE_N -> {
PlayerEventType.NextEpisode
}
KeyEvent.KEYCODE_MEDIA_PREVIOUS, KeyEvent.KEYCODE_BUTTON_L1, KeyEvent.KEYCODE_B -> {
PlayerEventType.PrevEpisode
}
KeyEvent.KEYCODE_MEDIA_PAUSE -> {
PlayerEventType.Pause
}
KeyEvent.KEYCODE_MEDIA_PLAY, KeyEvent.KEYCODE_BUTTON_START -> {
PlayerEventType.Play
}
KeyEvent.KEYCODE_L, KeyEvent.KEYCODE_NUMPAD_7, KeyEvent.KEYCODE_7 -> {
PlayerEventType.Lock
}
KeyEvent.KEYCODE_H, KeyEvent.KEYCODE_MENU -> {
PlayerEventType.ToggleHide
}
KeyEvent.KEYCODE_M, KeyEvent.KEYCODE_VOLUME_MUTE -> {
PlayerEventType.ToggleMute
}
KeyEvent.KEYCODE_S, KeyEvent.KEYCODE_NUMPAD_9, KeyEvent.KEYCODE_9 -> {
PlayerEventType.ShowMirrors
}
// OpenSubtitles shortcut
KeyEvent.KEYCODE_O, KeyEvent.KEYCODE_NUMPAD_8, KeyEvent.KEYCODE_8 -> {
PlayerEventType.SearchSubtitlesOnline
}
KeyEvent.KEYCODE_E, KeyEvent.KEYCODE_NUMPAD_3, KeyEvent.KEYCODE_3 -> {
PlayerEventType.ShowSpeed
}
KeyEvent.KEYCODE_R, KeyEvent.KEYCODE_NUMPAD_0, KeyEvent.KEYCODE_0 -> {
PlayerEventType.Resize
}
KeyEvent.KEYCODE_C, KeyEvent.KEYCODE_NUMPAD_4, KeyEvent.KEYCODE_4 -> {
PlayerEventType.SkipOp
}
KeyEvent.KEYCODE_V, KeyEvent.KEYCODE_NUMPAD_5, KeyEvent.KEYCODE_5 -> {
PlayerEventType.SkipCurrentChapter
}
KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE, KeyEvent.KEYCODE_P, KeyEvent.KEYCODE_SPACE, KeyEvent.KEYCODE_NUMPAD_ENTER, KeyEvent.KEYCODE_ENTER -> { // space is not captured due to navigation
PlayerEventType.PlayPauseToggle
}
else -> null
}?.let { playerEvent ->
playerEventListener?.invoke(playerEvent)
}
//when (keyCode) {
// KeyEvent.KEYCODE_DPAD_CENTER -> {
// println("DPAD PRESSED")
// }
//}
} }
/** overrides focus and custom key events */ /** overrides focus and custom key events */
@ -558,6 +569,7 @@ object CommonActivity {
else -> null else -> null
} }
// println("NEXT FOCUS : $nextView") // println("NEXT FOCUS : $nextView")
if (nextView != null) { if (nextView != null) {
nextView.requestFocus() nextView.requestFocus()
@ -565,10 +577,15 @@ object CommonActivity {
return true return true
} }
if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER && // TODO: Figure out why removing the check for SearchAutoComplete seems
// to break focus on TV as it shouldn't need to be used.
// Also handle KEYCODE_ENTER here because some remotes (e.g. LG Magic Remote)
// send KEYCODE_ENTER instead of KEYCODE_DPAD_CENTER when clicking the OK button.
@SuppressLint("RestrictedApi")
if ((keyCode == KeyEvent.KEYCODE_DPAD_CENTER || keyCode == KeyEvent.KEYCODE_ENTER) &&
(act.currentFocus is SearchView || act.currentFocus is SearchView.SearchAutoComplete) (act.currentFocus is SearchView || act.currentFocus is SearchView.SearchAutoComplete)
) { ) {
UIHelper.showInputMethod(act.currentFocus?.findFocus()) showInputMethod(act.currentFocus?.findFocus())
} }
//println("Keycode: $keyCode") //println("Keycode: $keyCode")
@ -577,7 +594,6 @@ object CommonActivity {
// "Got Keycode $keyCode | ${KeyEvent.keyCodeToString(keyCode)} \n ${event?.action}", // "Got Keycode $keyCode | ${KeyEvent.keyCodeToString(keyCode)} \n ${event?.action}",
// Toast.LENGTH_LONG // Toast.LENGTH_LONG
//) //)
} }
// if someone else want to override the focus then don't handle the event as it is already // if someone else want to override the focus then don't handle the event as it is already

View file

@ -2,6 +2,7 @@ package com.lagradost.cloudstream3
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
import okhttp3.RequestBody import okhttp3.RequestBody
import okhttp3.RequestBody.Companion.toRequestBody
import org.schabi.newpipe.extractor.downloader.Downloader import org.schabi.newpipe.extractor.downloader.Downloader
import org.schabi.newpipe.extractor.downloader.Request import org.schabi.newpipe.extractor.downloader.Request
import org.schabi.newpipe.extractor.downloader.Response import org.schabi.newpipe.extractor.downloader.Response
@ -10,7 +11,7 @@ import java.util.concurrent.TimeUnit
class DownloaderTestImpl private constructor(builder: OkHttpClient.Builder) : Downloader() { class DownloaderTestImpl private constructor(builder: OkHttpClient.Builder) : Downloader() {
private val client: OkHttpClient private val client: OkHttpClient = builder.readTimeout(30, TimeUnit.SECONDS).build()
override fun execute(request: Request): Response { override fun execute(request: Request): Response {
val httpMethod: String = request.httpMethod() val httpMethod: String = request.httpMethod()
val url: String = request.url() val url: String = request.url()
@ -18,7 +19,7 @@ class DownloaderTestImpl private constructor(builder: OkHttpClient.Builder) : Do
val dataToSend: ByteArray? = request.dataToSend() val dataToSend: ByteArray? = request.dataToSend()
var requestBody: RequestBody? = null var requestBody: RequestBody? = null
if (dataToSend != null) { if (dataToSend != null) {
requestBody = RequestBody.create(null, dataToSend) requestBody = dataToSend.toRequestBody(null, 0, dataToSend.size)
} }
val requestBuilder: okhttp3.Request.Builder = okhttp3.Request.Builder() val requestBuilder: okhttp3.Request.Builder = okhttp3.Request.Builder()
.method(httpMethod, requestBody).url(url) .method(httpMethod, requestBody).url(url)
@ -73,8 +74,4 @@ class DownloaderTestImpl private constructor(builder: OkHttpClient.Builder) : Do
return instance return instance
} }
} }
init {
client = builder.readTimeout(30, TimeUnit.SECONDS).build()
}
} }

View file

@ -1,11 +0,0 @@
package com.lagradost.cloudstream3
import android.view.LayoutInflater
import androidx.annotation.LayoutRes
import androidx.recyclerview.widget.RecyclerView
import com.lagradost.cloudstream3.ui.HeaderViewDecoration
fun setHeaderDecoration(view: RecyclerView, @LayoutRes headerViewRes: Int) {
val headerView = LayoutInflater.from(view.context).inflate(headerViewRes, null)
view.addItemDecoration(HeaderViewDecoration(headerView))
}

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -1,53 +0,0 @@
package com.lagradost.cloudstream3
import com.lagradost.cloudstream3.MainActivity.Companion.lastError
import com.lagradost.cloudstream3.mvvm.logError
import com.lagradost.cloudstream3.plugins.PluginManager.checkSafeModeFile
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
object NativeCrashHandler {
// external fun triggerNativeCrash()
private external fun initNativeCrashHandler()
private external fun getSignalStatus(): Int
private fun initSignalPolling() = CoroutineScope(Dispatchers.IO).launch {
//launch {
// delay(10000)
// triggerNativeCrash()
//}
while (true) {
delay(10_000)
val signal = getSignalStatus()
// Signal is initialized to zero
if (signal == 0) continue
// Do not crash in safe mode!
if (lastError != null) continue
if (checkSafeModeFile()) continue
AcraApplication.exceptionHandler?.uncaughtException(
Thread.currentThread(),
RuntimeException("Native crash with code: $signal. Try uninstalling extensions.\n")
)
}
}
fun initCrashHandler() {
try {
System.loadLibrary("native-lib")
initNativeCrashHandler()
} catch (t: Throwable) {
// Make debug crash.
if (BuildConfig.DEBUG) throw t
logError(t)
return
}
initSignalPolling()
}
}

View file

@ -1,88 +0,0 @@
package com.lagradost.cloudstream3
import com.lagradost.cloudstream3.mvvm.logError
import kotlinx.coroutines.*
//https://stackoverflow.com/questions/34697828/parallel-operations-on-kotlin-collections
/*
fun <T, R> Iterable<T>.pmap(
numThreads: Int = maxOf(Runtime.getRuntime().availableProcessors() - 2, 1),
exec: ExecutorService = Executors.newFixedThreadPool(numThreads),
transform: (T) -> R,
): List<R> {
// default size is just an inlined version of kotlin.collections.collectionSizeOrDefault
val defaultSize = if (this is Collection<*>) this.size else 10
val destination = Collections.synchronizedList(ArrayList<R>(defaultSize))
for (item in this) {
exec.submit { destination.add(transform(item)) }
}
exec.shutdown()
exec.awaitTermination(1, TimeUnit.DAYS)
return ArrayList<R>(destination)
}*/
@OptIn(DelicateCoroutinesApi::class)
suspend fun <K, V, R> Map<out K, V>.amap(f: suspend (Map.Entry<K, V>) -> R): List<R> =
with(CoroutineScope(GlobalScope.coroutineContext)) {
map { async { f(it) } }.map { it.await() }
}
fun <K, V, R> Map<out K, V>.apmap(f: suspend (Map.Entry<K, V>) -> R): List<R> = runBlocking {
map { async { f(it) } }.map { it.await() }
}
@OptIn(DelicateCoroutinesApi::class)
suspend fun <A, B> List<A>.amap(f: suspend (A) -> B): List<B> =
with(CoroutineScope(GlobalScope.coroutineContext)) {
map { async { f(it) } }.map { it.await() }
}
fun <A, B> List<A>.apmap(f: suspend (A) -> B): List<B> = runBlocking {
map { async { f(it) } }.map { it.await() }
}
fun <A, B> List<A>.apmapIndexed(f: suspend (index: Int, A) -> B): List<B> = runBlocking {
mapIndexed { index, a -> async { f(index, a) } }.map { it.await() }
}
@OptIn(DelicateCoroutinesApi::class)
suspend fun <A, B> List<A>.amapIndexed(f: suspend (index: Int, A) -> B): List<B> =
with(CoroutineScope(GlobalScope.coroutineContext)) {
mapIndexed { index, a -> async { f(index, a) } }.map { it.await() }
}
// run code in parallel
/*fun <R> argpmap(
vararg transforms: () -> R,
numThreads: Int = maxOf(Runtime.getRuntime().availableProcessors() - 2, 1),
exec: ExecutorService = Executors.newFixedThreadPool(numThreads)
) {
for (item in transforms) {
exec.submit { item.invoke() }
}
exec.shutdown()
exec.awaitTermination(1, TimeUnit.DAYS)
}*/
// built in try catch
fun <R> argamap(
vararg transforms: suspend () -> R,
) = runBlocking {
transforms.map {
async {
try {
it.invoke()
} catch (e: Exception) {
logError(e)
}
}
}.map { it.await() }
}

View file

@ -0,0 +1,26 @@
package com.lagradost.cloudstream3.actions
import android.content.Context
import com.lagradost.cloudstream3.R
import com.lagradost.cloudstream3.ui.result.LinkLoadingResult
import com.lagradost.cloudstream3.ui.result.ResultEpisode
import com.lagradost.cloudstream3.utils.txt
class AlwaysAskAction : VideoClickAction() {
override val name = txt(R.string.player_settings_always_ask)
override val isPlayer = true
// Only show in settings, not on a video
override fun shouldShow(context: Context?, video: ResultEpisode?): Boolean = video == null
override suspend fun runAction(
context: Context?,
video: ResultEpisode,
result: LinkLoadingResult,
index: Int?
) {
// This is handled specially in ResultViewModel2.kt by detecting the AlwaysAskAction
// and showing the player selection dialog instead of executing the action directly
throw NotImplementedError("AlwaysAskAction is handled specially by the calling code")
}
}

View file

@ -0,0 +1,135 @@
package com.lagradost.cloudstream3.actions
import android.app.Activity
import android.content.ComponentName
import android.content.Context
import android.content.Intent
import androidx.core.content.FileProvider
import androidx.core.net.toUri
import com.lagradost.cloudstream3.CloudStreamApp.Companion.getKey
import com.lagradost.cloudstream3.CloudStreamApp.Companion.setKey
import com.lagradost.cloudstream3.R
import com.lagradost.cloudstream3.mvvm.logError
import com.lagradost.cloudstream3.ui.result.LinkLoadingResult
import com.lagradost.cloudstream3.ui.result.ResultEpisode
import com.lagradost.cloudstream3.ui.result.ResultFragment
import com.lagradost.cloudstream3.utils.UiText
import com.lagradost.cloudstream3.utils.txt
import com.lagradost.cloudstream3.utils.AppContextUtils.isAppInstalled
import com.lagradost.cloudstream3.utils.DataStoreHelper
import java.io.File
fun updateDurationAndPosition(position: Long, duration: Long) {
if (position <= 0 || duration <= 0) return
val episode = getKey<ResultEpisode>("last_opened") ?: return
DataStoreHelper.setViewPosAndResume(episode.id, position, duration, episode, null)
ResultFragment.updateUI()
}
/**
* Util method that may be helpful for creating intents for apps that support m3u8 files.
* All sources are written to a temporary m3u8 file, which is then sent to the app.
*/
fun makeTempM3U8Intent(
context: Context,
intent: Intent,
result: LinkLoadingResult
) {
if (result.links.size == 1) {
intent.setDataAndType(result.links.first().url.toUri(), "video/*")
return
}
intent.apply {
addFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION)
addFlags(Intent.FLAG_GRANT_PREFIX_URI_PERMISSION)
addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION)
}
val outputFile = File.createTempFile("mirrorlist", ".m3u8", context.cacheDir)
var text = "#EXTM3U\n#EXT-X-VERSION:3"
result.links.forEach { link ->
text += "\n#EXTINF:0,${link.name}\n${link.url}"
}
//With subtitles it doesn't work for no reason :(
/*for (sub in result.subs) {
val normalizedName = sub.name.replace("[^a-zA-Z0-9 ]".toRegex(), "")
text += "\n#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID=\"subs\",NAME=\"${normalizedName}\",DEFAULT=NO,AUTOSELECT=NO,FORCED=NO,LANGUAGE=\"${sub.languageCode}\",URI=\"${sub.url}\""
}*/
text += "\n#EXT-X-ENDLIST"
outputFile.writeText(text)
intent.setDataAndType(
FileProvider.getUriForFile(
context,
context.applicationContext.packageName + ".provider",
outputFile
), "application/x-mpegURL"
)
}
abstract class OpenInAppAction(
open val appName: UiText,
open val packageName: String,
private val intentClass: String? = null,
private val action: String = Intent.ACTION_VIEW
) : VideoClickAction() {
override val name: UiText
get() = txt(R.string.episode_action_play_in_format, appName)
override val isPlayer = true
override fun shouldShow(context: Context?, video: ResultEpisode?) =
context?.isAppInstalled(packageName) != false
override suspend fun runAction(
context: Context?,
video: ResultEpisode,
result: LinkLoadingResult,
index: Int?
) {
if (context == null) return
val intent = Intent(action)
intent.setPackage(packageName)
if (intentClass != null) {
intent.component = ComponentName(packageName, intentClass)
}
putExtra(context, intent, video, result, index)
setKey("last_opened", video)
launchResult(intent)
}
/**
* Before intent is sent, this function is called to put extra data into the intent.
* @see VideoClickAction.runAction
* */
@Throws
abstract suspend fun putExtra(
context: Context,
intent: Intent,
video: ResultEpisode,
result: LinkLoadingResult,
index: Int?
)
/**
* This function is called when the app is opened again after the intent was sent.
* You can use it to for example update duration and position.
* @see updateDurationAndPosition
*/
@Throws
abstract fun onResult(activity: Activity, intent: Intent?)
/** Safe version of onResult, we don't trust extension devs to not crash the app */
fun onResultSafe(activity: Activity, intent: Intent?) {
try {
onResult(activity, intent)
} catch (t: Throwable) {
logError(t)
}
}
}

View file

@ -0,0 +1,205 @@
package com.lagradost.cloudstream3.actions
import android.app.Activity
import android.content.ActivityNotFoundException
import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.widget.Toast
import androidx.core.app.ActivityOptionsCompat
import com.lagradost.api.Log
import com.lagradost.cloudstream3.CommonActivity
import com.lagradost.cloudstream3.ErrorLoadingException
import com.lagradost.cloudstream3.MainActivity
import com.lagradost.cloudstream3.R
import com.lagradost.cloudstream3.actions.temp.BiglyBTPackage
import com.lagradost.cloudstream3.actions.temp.CopyClipboardAction
import com.lagradost.cloudstream3.actions.temp.JustPlayerPackage
import com.lagradost.cloudstream3.actions.temp.LibreTorrentPackage
import com.lagradost.cloudstream3.actions.temp.MpvExPackage
import com.lagradost.cloudstream3.actions.temp.MpvKtPackage
import com.lagradost.cloudstream3.actions.temp.MpvKtPreviewPackage
import com.lagradost.cloudstream3.actions.temp.MpvPackage
import com.lagradost.cloudstream3.actions.temp.MpvRxPackage
import com.lagradost.cloudstream3.actions.temp.MpvYTDLPackage
import com.lagradost.cloudstream3.actions.temp.NextPlayerPackage
import com.lagradost.cloudstream3.actions.temp.OnlyPlayer
import com.lagradost.cloudstream3.actions.temp.PlayInBrowserAction
import com.lagradost.cloudstream3.actions.temp.PlayMirrorAction
import com.lagradost.cloudstream3.actions.temp.ViewM3U8Action
import com.lagradost.cloudstream3.actions.temp.VlcNightlyPackage
import com.lagradost.cloudstream3.actions.temp.VlcPackage
import com.lagradost.cloudstream3.actions.temp.WebVideoCastPackage
import com.lagradost.cloudstream3.actions.temp.fcast.FcastAction
import com.lagradost.cloudstream3.mvvm.logError
import com.lagradost.cloudstream3.ui.result.LinkLoadingResult
import com.lagradost.cloudstream3.ui.result.ResultEpisode
import com.lagradost.cloudstream3.utils.Coroutines.atomicListOf
import com.lagradost.cloudstream3.utils.Coroutines.ioSafe
import com.lagradost.cloudstream3.utils.ExtractorLinkType
import com.lagradost.cloudstream3.utils.UiText
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import java.util.concurrent.Callable
import java.util.concurrent.FutureTask
import kotlin.reflect.jvm.jvmName
object VideoClickActionHolder {
val allVideoClickActions = atomicListOf(
// Default
PlayInBrowserAction(),
CopyClipboardAction(),
ViewM3U8Action(),
PlayMirrorAction(),
// main support external apps
VlcPackage(),
MpvPackage(),
MpvExPackage(),
NextPlayerPackage(),
JustPlayerPackage(),
FcastAction(),
LibreTorrentPackage(),
BiglyBTPackage(),
// forks/backup apps
VlcNightlyPackage(),
WebVideoCastPackage(),
MpvYTDLPackage(),
MpvKtPackage(),
MpvKtPreviewPackage(),
OnlyPlayer(),
MpvRxPackage(),
// Always Ask option
AlwaysAskAction(),
// added by plugins
// ...
)
init {
Log.d("VideoClickActionHolder", "allVideoClickActions: ${allVideoClickActions.map { it.uniqueId() }}")
}
private const val ACTION_ID_OFFSET = 1000
fun makeOptionMap(activity: Activity?, video: ResultEpisode) = allVideoClickActions
// We need to have index before filtering
.mapIndexed { id, it -> it to id + ACTION_ID_OFFSET }
.filter { it.first.shouldShowSafe(activity, video) }
.map { it.first.name to it.second }
fun getActionById(id: Int): VideoClickAction? = allVideoClickActions.getOrNull(id - ACTION_ID_OFFSET)
fun getByUniqueId(uniqueId: String): VideoClickAction? = allVideoClickActions.firstOrNull { it.uniqueId() == uniqueId }
fun uniqueIdToId(uniqueId: String?): Int? {
if (uniqueId == null) return null
return allVideoClickActions
.mapIndexed { id, it -> it to id + ACTION_ID_OFFSET }
.firstOrNull { it.first.uniqueId() == uniqueId }
?.second
}
fun getPlayers(activity: Activity? = null) = allVideoClickActions.filter { it.isPlayer && it.shouldShowSafe(activity, null) }
}
abstract class VideoClickAction {
abstract val name: UiText
/** if true, the app will show dialog to select source - result.links[index] */
open val oneSource : Boolean = false
/** if true, this action could be selected as default player (one press action) in settings */
open val isPlayer: Boolean = false
/** Which type of sources this action can handle. */
open val sourceTypes: Set<ExtractorLinkType> = ExtractorLinkType.entries.toSet()
/** Determines which plugin a given provider is from. This is the full path to the plugin. */
var sourcePlugin: String? = null
/** Even if VideoClickAction should not run any UI code, startActivity requires it,
* this is a wrapper for runOnUiThread in a suspended safe context that bubble up exceptions */
@Throws
suspend fun <T> uiThread(callable : Callable<T>) : T? {
val future = FutureTask{
try {
Result.success(callable.call())
} catch (t : Throwable) {
Result.failure(t)
}
}
CommonActivity.activity?.runOnUiThread(future) ?: throw ErrorLoadingException("No UI Activity, this should never happened")
val result = withContext(Dispatchers.IO) {
return@withContext future.get()
}
return result.getOrThrow()
}
/** Internally uses activityResultLauncher,
* use this when the activity has a result like watched position */
@Throws
suspend fun launchResult(intent : Intent?, options : ActivityOptionsCompat? = null) {
if (intent == null) {
return
}
uiThread {
MainActivity.activityResultLauncher?.launch(intent,options)
}
}
/** Internally uses startActivity, use this when you don't
* have any result that needs to be stored when exiting the activity */
@Throws
suspend fun launch(intent : Intent?, bundle : Bundle? = null) {
if (intent == null) {
return
}
uiThread {
CommonActivity.activity?.startActivity(intent, bundle)
}
}
fun uniqueId() = "$sourcePlugin:${this::class.jvmName}"
@Throws
abstract fun shouldShow(context: Context?, video: ResultEpisode?): Boolean
/** Safe version of shouldShow, as we don't trust extension devs to handle exceptions,
* however no dev *should* throw in shouldShow */
fun shouldShowSafe(context: Context?, video: ResultEpisode?): Boolean {
return try {
shouldShow(context,video)
} catch (t : Throwable) {
logError(t)
false
}
}
/**
* This function is called when the action is clicked.
* @param context The current activity
* @param video The episode/movie that was clicked
* @param result The result of the link loading, contains video & subtitle links
* @param index if oneSource is true, this is the index of the selected source
*/
@Throws
abstract suspend fun runAction(context: Context?, video: ResultEpisode, result: LinkLoadingResult, index: Int?)
/** Safe version of runAction, as we don't trust extension devs to handle exceptions */
fun runActionSafe(context: Context?, video: ResultEpisode, result: LinkLoadingResult, index: Int?) = ioSafe {
try {
runAction(context, video, result, index)
} catch (_ : NotImplementedError) {
CommonActivity.showToast("runAction has not been implemented for ${name.asStringNull(context)}, please contact the extension developer of $sourcePlugin", Toast.LENGTH_LONG)
} catch (error : ErrorLoadingException) {
CommonActivity.showToast(error.message, Toast.LENGTH_LONG)
} catch (_: ActivityNotFoundException) {
CommonActivity.showToast(R.string.app_not_found_error, Toast.LENGTH_LONG)
} catch (t : Throwable) {
logError(t)
CommonActivity.showToast(t.toString(), Toast.LENGTH_LONG)
}
}
}

View file

@ -0,0 +1,30 @@
package com.lagradost.cloudstream3.actions.temp
import android.app.Activity
import android.content.Context
import android.content.Intent
import com.lagradost.cloudstream3.actions.OpenInAppAction
import com.lagradost.cloudstream3.ui.result.LinkLoadingResult
import com.lagradost.cloudstream3.ui.result.ResultEpisode
import com.lagradost.cloudstream3.utils.txt
/** https://github.com/devgianlu/Aria2Android */
@Suppress("unused")
class Aria2Package : OpenInAppAction(
appName = txt("Aria2"),
packageName = "com.gianlu.aria2android",
intentClass = "com.gianlu.aria2android.MainActivity"
) {
override val oneSource: Boolean = true
override suspend fun putExtra(
context: Context,
intent: Intent,
video: ResultEpisode,
result: LinkLoadingResult,
index: Int?
) {
throw NotImplementedError("Aria2Android is missing getIntent, and onNewIntent, meaning it cant handle intents")
}
override fun onResult(activity: Activity, intent: Intent?) = Unit
}

View file

@ -0,0 +1,36 @@
package com.lagradost.cloudstream3.actions.temp
import android.app.Activity
import android.content.Context
import android.content.Intent
import androidx.core.net.toUri
import com.lagradost.cloudstream3.actions.OpenInAppAction
import com.lagradost.cloudstream3.ui.result.LinkLoadingResult
import com.lagradost.cloudstream3.ui.result.ResultEpisode
import com.lagradost.cloudstream3.utils.ExtractorLinkType
import com.lagradost.cloudstream3.utils.txt
/** https://github.com/BiglySoftware/BiglyBT-Android */
class BiglyBTPackage : OpenInAppAction(
appName = txt("BiglyBT"),
packageName = "com.biglybt.android.client",
intentClass = "com.biglybt.android.client.activity.IntentHandler"
) {
// Only torrents are supported by the app
override val sourceTypes: Set<ExtractorLinkType> =
setOf(ExtractorLinkType.MAGNET, ExtractorLinkType.TORRENT)
override val oneSource: Boolean = true
override suspend fun putExtra(
context: Context,
intent: Intent,
video: ResultEpisode,
result: LinkLoadingResult,
index: Int?
) {
intent.data = result.links[index!!].url.toUri()
}
override fun onResult(activity: Activity, intent: Intent?) = Unit
}

View file

@ -0,0 +1,162 @@
package com.lagradost.cloudstream3.actions.temp
import android.app.Activity
import android.content.Context
import android.content.Intent
import android.net.Uri
import com.fasterxml.jackson.annotation.JsonProperty
import com.lagradost.cloudstream3.actions.OpenInAppAction
import com.lagradost.cloudstream3.BuildConfig
import com.lagradost.cloudstream3.ui.player.ExtractorUri
import com.lagradost.cloudstream3.ui.player.SubtitleData
import com.lagradost.cloudstream3.ui.player.SubtitleOrigin
import com.lagradost.cloudstream3.ui.result.LinkLoadingResult
import com.lagradost.cloudstream3.ui.result.ResultEpisode
import com.lagradost.cloudstream3.utils.AppUtils.toJson
import com.lagradost.cloudstream3.utils.DataStoreHelper.getViewPos
import com.lagradost.cloudstream3.utils.DrmExtractorLink
import com.lagradost.cloudstream3.utils.ExtractorLink
import com.lagradost.cloudstream3.utils.ExtractorLinkPlayList
import com.lagradost.cloudstream3.utils.ExtractorLinkType
import com.lagradost.cloudstream3.utils.newExtractorLink
import com.lagradost.cloudstream3.utils.Qualities
import com.lagradost.cloudstream3.utils.SubtitleHelper.fromCodeToLangTagIETF
import com.lagradost.cloudstream3.utils.SubtitleHelper.fromLanguageToTagIETF
import com.lagradost.cloudstream3.utils.txt
/**
* If you want to support CloudStream 3 as an external player, then this shows how to play any video link
* For basic interactions, just `intent.data = uri` works
*
* However for more advanced use, CloudStream 3 also supports playlists of MinimalVideoLink and MinimalSubtitleLink with a `String[]` of JSON
* These are passed as LINKS_EXTRA and SUBTITLE_EXTRA respectively
*/
@Suppress("Unused")
class CloudStreamPackage : OpenInAppAction(
appName = txt("CloudStream"),
packageName = BuildConfig.APPLICATION_ID, //"com.lagradost.cloudstream3" or "com.lagradost.cloudstream3.prerelease"
intentClass = "com.lagradost.cloudstream3.ui.player.DownloadedPlayerActivity"
) {
override val oneSource: Boolean = false
companion object {
const val SUBTITLE_EXTRA: String = "subs" // Json of an array of MinimalVideoLink
const val LINKS_EXTRA: String = "links" // Json of an array of MinimalSubtitleLink
const val TITLE_EXTRA: String = "title" // Unused (String)
const val ID_EXTRA: String =
"id" // Identification number for the video(s), used to store start time (Int)
const val POSITION_EXTRA: String = "pos" // Start time in MS (Long)
const val DURATION_EXTRA: String = "dur" // Duration time in MS (Long)
}
data class MinimalVideoLink(
@JsonProperty("uri")
val uri: Uri?,
@JsonProperty("url")
val url: String?,
@JsonProperty("mimeType")
val mimeType: String = "video/mp4",
@JsonProperty("name")
val name: String?,
@JsonProperty("headers")
var headers: Map<String, String> = mapOf(),
@JsonProperty("quality")
val quality: Int?,
) {
companion object {
fun fromExtractor(link: ExtractorLink): MinimalVideoLink = MinimalVideoLink(
uri = null,
url = link.url,
name = link.name,
mimeType = link.type.getMimeType(),
headers = if (link.referer.isBlank()) emptyMap() else mapOf("referer" to link.referer) + link.headers,
quality = link.quality
)
}
suspend fun toExtractorLink(): Pair<ExtractorLink?, ExtractorUri?> =
url?.let { url ->
newExtractorLink(
source = "NONE",
name = name ?: "Unknown",
url = url,
type = ExtractorLinkType.entries.firstOrNull { ty -> ty.getMimeType() == mimeType }
?: ExtractorLinkType.VIDEO) {
this@newExtractorLink.headers =
this@MinimalVideoLink.headers
this@newExtractorLink.quality =
this@MinimalVideoLink.quality ?: Qualities.Unknown.value
}
} to uri?.let { uri ->
ExtractorUri(
uri = uri,
name = name ?: "Unknown",
)
}
}
data class MinimalSubtitleLink(
@JsonProperty("url")
val url: String,
@JsonProperty("mimeType")
val mimeType: String = "text/vtt",
@JsonProperty("name")
val name: String?,
@JsonProperty("headers")
var headers: Map<String, String> = mapOf(),
) {
companion object {
fun fromSubtitle(sub: SubtitleData): MinimalSubtitleLink = MinimalSubtitleLink(
url = sub.url,
mimeType = sub.mimeType,
name = sub.originalName,
headers = sub.headers,
)
}
fun toSubtitleData(): SubtitleData = SubtitleData(
url = url,
nameSuffix = "",
mimeType = mimeType,
originalName = name ?: "Unknown",
headers = headers,
origin = SubtitleOrigin.URL,
languageCode = fromCodeToLangTagIETF(name) ?:
fromLanguageToTagIETF(name, true) ?:
name,
)
}
override suspend fun putExtra(
context: Context,
intent: Intent,
video: ResultEpisode,
result: LinkLoadingResult,
index: Int?
) {
intent.apply {
val position = getViewPos(video.id)?.position
if (position != null)
putExtra(POSITION_EXTRA, position)
putExtra(ID_EXTRA, video.id)
putExtra(TITLE_EXTRA, video.name)
putExtra(
SUBTITLE_EXTRA,
result.subs.map { MinimalSubtitleLink.fromSubtitle(it).toJson() }.toTypedArray()
)
putExtra(
LINKS_EXTRA,
result.links.filter { it !is ExtractorLinkPlayList && it !is DrmExtractorLink }
.map { MinimalVideoLink.fromExtractor(it).toJson() }.toTypedArray()
)
}
}
override fun onResult(activity: Activity, intent: Intent?) {
// No results yet
}
}

View file

@ -0,0 +1,27 @@
package com.lagradost.cloudstream3.actions.temp
import android.content.Context
import com.lagradost.cloudstream3.actions.VideoClickAction
import com.lagradost.cloudstream3.ui.result.LinkLoadingResult
import com.lagradost.cloudstream3.ui.result.ResultEpisode
import com.lagradost.cloudstream3.utils.txt
import com.lagradost.cloudstream3.utils.UIHelper.clipboardHelper
class CopyClipboardAction: VideoClickAction() {
override val name = txt("Copy to clipboard")
override val oneSource = true
override fun shouldShow(context: Context?, video: ResultEpisode?) = true
override suspend fun runAction(
context: Context?,
video: ResultEpisode,
result: LinkLoadingResult,
index: Int?
) {
if (index == null) return
val link = result.links.getOrNull(index) ?: return
clipboardHelper(txt(link.name), link.url)
}
}

View file

@ -0,0 +1,37 @@
package com.lagradost.cloudstream3.actions.temp
import android.app.Activity
import android.content.Context
import android.content.Intent
import androidx.core.net.toUri
import com.lagradost.cloudstream3.actions.OpenInAppAction
import com.lagradost.cloudstream3.ui.result.LinkLoadingResult
import com.lagradost.cloudstream3.ui.result.ResultEpisode
import com.lagradost.cloudstream3.utils.ExtractorLinkType
import com.lagradost.cloudstream3.utils.txt
/** https://github.com/moneytoo/Player/ */
class JustPlayerPackage : OpenInAppAction(
appName = txt("JustPlayer"),
packageName = "com.brouken.player",
intentClass = "com.brouken.player.PlayerActivity"
) {
override val sourceTypes: Set<ExtractorLinkType> =
setOf(ExtractorLinkType.VIDEO, ExtractorLinkType.M3U8, ExtractorLinkType.DASH)
override val oneSource: Boolean = true
override suspend fun putExtra(
context: Context,
intent: Intent,
video: ResultEpisode,
result: LinkLoadingResult,
index: Int?
) {
// While JustPlayer has support for subs, it cant add both subs and links at the same time
// See https://github.com/moneytoo/Player/blob/49d80eb8de7a7bfc662393fdf114788fed1ebb2e/app/src/main/java/com/brouken/player/PlayerActivity.java#L794
intent.data = result.links[index!!].url.toUri()
}
override fun onResult(activity: Activity, intent: Intent?) = Unit
}

View file

@ -0,0 +1,36 @@
package com.lagradost.cloudstream3.actions.temp
import android.app.Activity
import android.content.Context
import android.content.Intent
import androidx.core.net.toUri
import com.lagradost.cloudstream3.actions.OpenInAppAction
import com.lagradost.cloudstream3.ui.result.LinkLoadingResult
import com.lagradost.cloudstream3.ui.result.ResultEpisode
import com.lagradost.cloudstream3.utils.ExtractorLinkType
import com.lagradost.cloudstream3.utils.txt
/** https://github.com/proninyaroslav/libretorrent */
class LibreTorrentPackage : OpenInAppAction(
appName = txt("LibreTorrent"),
packageName = "org.proninyaroslav.libretorrent",
intentClass = "org.proninyaroslav.libretorrent.ui.addtorrent.AddTorrentActivity"
) {
// Only torrents are supported by the app
override val sourceTypes: Set<ExtractorLinkType> =
setOf(ExtractorLinkType.MAGNET, ExtractorLinkType.TORRENT)
override val oneSource: Boolean = true
override suspend fun putExtra(
context: Context,
intent: Intent,
video: ResultEpisode,
result: LinkLoadingResult,
index: Int?
) {
intent.data = result.links[index!!].url.toUri()
}
override fun onResult(activity: Activity, intent: Intent?) = Unit
}

View file

@ -0,0 +1,68 @@
package com.lagradost.cloudstream3.actions.temp
import android.app.Activity
import android.content.Context
import android.content.Intent
import androidx.core.net.toUri
import com.lagradost.cloudstream3.actions.OpenInAppAction
import com.lagradost.cloudstream3.actions.updateDurationAndPosition
import com.lagradost.cloudstream3.ui.result.LinkLoadingResult
import com.lagradost.cloudstream3.ui.result.ResultEpisode
import com.lagradost.cloudstream3.utils.txt
import com.lagradost.cloudstream3.utils.DataStoreHelper.getViewPos
import com.lagradost.cloudstream3.utils.ExtractorLinkType
class MpvKtPreviewPackage: MpvKtPackage(
appName = "mpvKt Preview",
packageName = "live.mehiz.mpvkt.preview",
)
open class MpvKtPackage(
appName: String = "mpvKt",
packageName: String = "live.mehiz.mpvkt",
): OpenInAppAction(
appName = txt(appName),
packageName = packageName,
intentClass = "live.mehiz.mpvkt.ui.player.PlayerActivity"
) {
override val oneSource = true
override val sourceTypes = setOf(
ExtractorLinkType.VIDEO,
ExtractorLinkType.DASH,
ExtractorLinkType.M3U8
)
override suspend fun putExtra(
context: Context,
intent: Intent,
video: ResultEpisode,
result: LinkLoadingResult,
index: Int?
) {
val link = result.links.getOrNull(index ?: 0) ?: return
intent.apply {
putExtra("subs", result.subs.map { it.url.toUri() }.toTypedArray())
setDataAndType(link.url.toUri(), "video/*")
// m3u8 plays, but changing sources feature is not available
// makeTempM3U8Intent(activity, this, result)
//putExtra("headers", link.headers.flatMap { listOf(it.key, it.value) }.toTypedArray())
val position = getViewPos(video.id)?.position
if (position != null)
putExtra("position", position.toInt())
putExtra("secure_uri", true)
}
}
override fun onResult(activity: Activity, intent: Intent?) {
val position = intent?.getIntExtra("position", -1)?.toLong() ?: -1
val duration = intent?.getIntExtra("duration", -1)?.toLong() ?: -1
updateDurationAndPosition(position, duration)
}
}

View file

@ -0,0 +1,68 @@
package com.lagradost.cloudstream3.actions.temp
import android.app.Activity
import android.content.Context
import android.content.Intent
import androidx.core.net.toUri
import com.lagradost.api.Log
import com.lagradost.cloudstream3.actions.OpenInAppAction
import com.lagradost.cloudstream3.actions.makeTempM3U8Intent
import com.lagradost.cloudstream3.actions.updateDurationAndPosition
import com.lagradost.cloudstream3.ui.result.LinkLoadingResult
import com.lagradost.cloudstream3.ui.result.ResultEpisode
import com.lagradost.cloudstream3.utils.txt
import com.lagradost.cloudstream3.utils.DataStoreHelper.getViewPos
import com.lagradost.cloudstream3.utils.ExtractorLinkType
// https://github.com/mpv-android/mpv-android/blob/0eb3cdc6f1632636b9c30d52ec50e4b017661980/app/src/main/java/is/xyz/mpv/MPVActivity.kt#L904
// https://mpv-android.github.io/mpv-android/intent.html
//https://github.com/marlboro-advance/mpvEx
class MpvExPackage: MpvPackage("mpvEx","app.marlboroadvance.mpvex","app.marlboroadvance.mpvex.ui.player.PlayerActivity")
class MpvYTDLPackage : MpvPackage("MPV YTDL", "is.xyz.mpv.ytdl") {
override val sourceTypes = setOf(
ExtractorLinkType.VIDEO,
ExtractorLinkType.DASH,
ExtractorLinkType.M3U8
)
}
open class MpvPackage(appName: String = "MPV", packageName: String = "is.xyz.mpv",intentClass:String = "is.xyz.mpv.MPVActivity"): OpenInAppAction(
txt(appName),
packageName,
intentClass
) {
override val oneSource = true // mpv has poor playlist support on TV
override suspend fun putExtra(
context: Context,
intent: Intent,
video: ResultEpisode,
result: LinkLoadingResult,
index: Int?
) {
intent.apply {
putExtra("subs", result.subs.map { it.url.toUri() }.toTypedArray())
putExtra("title", video.name)
if (index != null) {
setDataAndType((result.links.getOrNull(index)?.url ?: return).toUri(), "video/*")
} else {
makeTempM3U8Intent(context, this, result)
}
val position = getViewPos(video.id)?.position
if (position != null)
putExtra("position", position.toInt())
putExtra("secure_uri", true)
}
}
override fun onResult(activity: Activity, intent: Intent?) {
val position = intent?.getIntExtra("position", -1) ?: -1
val duration = intent?.getIntExtra("duration", -1) ?: -1
Log.d("MPV", "Position: $position, Duration: $duration")
updateDurationAndPosition(position.toLong(), duration.toLong())
}
}

View file

@ -0,0 +1,75 @@
package com.lagradost.cloudstream3.actions.temp
import android.app.Activity
import android.content.Context
import android.content.Intent
import androidx.core.net.toUri
import com.lagradost.api.Log
import com.lagradost.cloudstream3.actions.OpenInAppAction
import com.lagradost.cloudstream3.actions.updateDurationAndPosition
import com.lagradost.cloudstream3.isEpisodeBased
import com.lagradost.cloudstream3.ui.result.LinkLoadingResult
import com.lagradost.cloudstream3.ui.result.ResultEpisode
import com.lagradost.cloudstream3.utils.DataStoreHelper.getViewPos
import com.lagradost.cloudstream3.utils.txt
/** https://github.com/Riteshp2001/mpvRx
*
* https://github.com/Riteshp2001/mpvRx/blob/00e0c5e803ab53e5757426cbf2248448ba1f49bf/app/src/main/java/app/gyrolet/mpvrx/utils/media/MediaUtils.kt#L132
* https://github.com/Riteshp2001/mpvRx/blob/00e0c5e803ab53e5757426cbf2248448ba1f49bf/app/src/main/java/app/gyrolet/mpvrx/utils/media/MediaUtils.kt#L56
* */
class MpvRxPackage : OpenInAppAction(
appName = txt("mpvRx"),
packageName = "app.gyrolet.mpvrx",
intentClass = "app.gyrolet.mpvrx.ui.player.PlayerActivity"
) {
override val oneSource = true
override suspend fun putExtra(
context: Context,
intent: Intent,
video: ResultEpisode,
result: LinkLoadingResult,
index: Int?
) {
intent.apply {
putExtra("title", video.name)
val link = result.links[index!!]
val headers = link.headers
setData(link.url.toUri())
if (headers.isNotEmpty()) {
// PlayerActivity expects a flat array: [key1, value1, key2, value2, ...]
val flat = headers.entries.flatMap { listOf(it.key, it.value) }.toTypedArray()
intent.putExtra("headers", flat)
}
/*val subs = result.subs // disabled due to https://github.com/Riteshp2001/mpvRx/issues/146
intent.putExtra("subs", subs.map { it.url.toUri() }.toTypedArray())
intent.putExtra(
"subs.titles",
subs.map { it.name }.toTypedArray(),
)
intent.putExtra(
"subs.langs",
subs.map { it.languageCode }.toTypedArray(),
)
val selected = subs.firstOrNull { it.matchesLanguageCode("en") }?.url?.toUri()
intent.putExtra("subs.enable", selected?.let { arrayOf(it) } ?: arrayOf<Uri>() )*/
if (video.tvType.isEpisodeBased()) {
video.season?.let { intent.putExtra("introdb_season", it) }
video.episode.let { intent.putExtra("introdb_episode", it) }
}
val position = getViewPos(video.id)?.position
if (position != null)
putExtra("position", position.toInt())
}
}
override fun onResult(activity: Activity, intent: Intent?) {
val position = intent?.getIntExtra("position", -1) ?: -1
val duration = intent?.getIntExtra("duration", -1) ?: -1
Log.d("MPV", "Position: $position, Duration: $duration")
updateDurationAndPosition(position.toLong(), duration.toLong())
}
}

View file

@ -0,0 +1,35 @@
package com.lagradost.cloudstream3.actions.temp
import android.app.Activity
import android.content.Context
import android.content.Intent
import androidx.core.net.toUri
import com.lagradost.cloudstream3.actions.OpenInAppAction
import com.lagradost.cloudstream3.ui.result.LinkLoadingResult
import com.lagradost.cloudstream3.ui.result.ResultEpisode
import com.lagradost.cloudstream3.utils.ExtractorLinkType
import com.lagradost.cloudstream3.utils.txt
/** https://github.com/anilbeesetti/nextplayer */
class NextPlayerPackage : OpenInAppAction(
appName = txt("NextPlayer"),
packageName = "dev.anilbeesetti.nextplayer",
intentClass = "dev.anilbeesetti.nextplayer.feature.player.PlayerActivity"
) {
override val sourceTypes: Set<ExtractorLinkType> =
setOf(ExtractorLinkType.VIDEO, ExtractorLinkType.M3U8, ExtractorLinkType.DASH)
override val oneSource: Boolean = true
override suspend fun putExtra(
context: Context,
intent: Intent,
video: ResultEpisode,
result: LinkLoadingResult,
index: Int?
) {
intent.data = result.links[index!!].url.toUri()
}
override fun onResult(activity: Activity, intent: Intent?) = Unit
}

View file

@ -0,0 +1,44 @@
package com.lagradost.cloudstream3.actions.temp
import android.app.Activity
import android.content.Context
import android.content.Intent
import android.os.Bundle
import androidx.core.net.toUri
import com.lagradost.cloudstream3.actions.OpenInAppAction
import com.lagradost.cloudstream3.ui.result.LinkLoadingResult
import com.lagradost.cloudstream3.ui.result.ResultEpisode
import com.lagradost.cloudstream3.utils.txt
/** https://github.com/Kindness-Kismet/only_player/tree/main
* https://github.com/Kindness-Kismet/only_player/blob/main/feature/player/src/main/java/one/only/player/feature/player/PlayerActivity.kt */
class OnlyPlayer : OpenInAppAction(
txt("Only Player"),
"one.only.player",
intentClass = "one.only.player.feature.player.PlayerActivity"
) {
override val oneSource = true
override suspend fun putExtra(
context: Context,
intent: Intent,
video: ResultEpisode,
result: LinkLoadingResult,
index: Int?
) {
/** https://github.com/Kindness-Kismet/only_player/blob/d3f55049a2913fa762d31b311146073cc2da46cb/app/src/main/java/one/only/player/navigation/CloudNavGraph.kt#L39 */
intent.apply {
val link = result.links[index!!]
setData(link.url.toUri())
putExtra("headers", Bundle().apply {
for ((key, value) in link.headers) {
putExtra(key, value)
}
})
}
}
override fun onResult(activity: Activity, intent: Intent?) {
/* onResult does not get called */
}
}

View file

@ -0,0 +1,39 @@
package com.lagradost.cloudstream3.actions.temp
import android.content.Context
import android.content.Intent
import androidx.core.net.toUri
import com.lagradost.cloudstream3.R
import com.lagradost.cloudstream3.actions.VideoClickAction
import com.lagradost.cloudstream3.ui.result.LinkLoadingResult
import com.lagradost.cloudstream3.ui.result.ResultEpisode
import com.lagradost.cloudstream3.utils.txt
import com.lagradost.cloudstream3.utils.ExtractorLinkType
class PlayInBrowserAction: VideoClickAction() {
override val name = txt(R.string.episode_action_play_in_format, "Browser")
override val oneSource = true
override val isPlayer = true
override val sourceTypes: Set<ExtractorLinkType> = setOf(
ExtractorLinkType.VIDEO,
ExtractorLinkType.DASH,
ExtractorLinkType.M3U8
)
override fun shouldShow(context: Context?, video: ResultEpisode?) = true
override suspend fun runAction(
context: Context?,
video: ResultEpisode,
result: LinkLoadingResult,
index: Int?
) {
val link = result.links.getOrNull(index ?: 0) ?: return
val i = Intent(Intent.ACTION_VIEW)
i.data = link.url.toUri()
launch(i)
}
}

View file

@ -0,0 +1,65 @@
package com.lagradost.cloudstream3.actions.temp
import android.app.Activity
import android.content.Context
import com.lagradost.cloudstream3.R
import com.lagradost.cloudstream3.actions.VideoClickAction
import com.lagradost.cloudstream3.ui.player.ExtractorUri
import com.lagradost.cloudstream3.ui.player.GeneratorPlayer
import com.lagradost.cloudstream3.ui.player.LOADTYPE_INAPP
import com.lagradost.cloudstream3.ui.player.SubtitleData
import com.lagradost.cloudstream3.ui.player.VideoGenerator
import com.lagradost.cloudstream3.ui.result.LinkLoadingResult
import com.lagradost.cloudstream3.ui.result.ResultEpisode
import com.lagradost.cloudstream3.utils.ExtractorLink
import com.lagradost.cloudstream3.utils.ExtractorLinkType
import com.lagradost.cloudstream3.utils.UIHelper.navigate
import com.lagradost.cloudstream3.utils.txt
class PlayMirrorAction : VideoClickAction() {
override val name = txt(R.string.episode_action_play_mirror)
override val oneSource = true
override val isPlayer = true
override val sourceTypes: Set<ExtractorLinkType> = LOADTYPE_INAPP
override fun shouldShow(context: Context?, video: ResultEpisode?) = true
override suspend fun runAction(
context: Context?,
video: ResultEpisode,
result: LinkLoadingResult,
index: Int?
) {
//Implemented a generator to handle the single
val activity = context as? Activity ?: return
val link = index?.let { result.links[it] }
val generatorMirror = object : VideoGenerator<ResultEpisode>(listOf(video)) {
override val hasCache: Boolean = false
override val canSkipLoading: Boolean = false
override fun getId(index: Int): Int = video.id
override suspend fun generateLinks(
clearCache: Boolean,
sourceTypes: Set<ExtractorLinkType>,
callback: (Pair<ExtractorLink?, ExtractorUri?>) -> Unit,
subtitleCallback: (SubtitleData) -> Unit,
offset: Int,
isCasting: Boolean
): Boolean {
index?.let { callback(link to null) }
result.subs.forEach { subtitle -> subtitleCallback(subtitle) }
return true
}
}
activity.navigate(
R.id.global_to_navigation_player,
GeneratorPlayer.newInstance(
generatorMirror, 0, result.syncData
)
)
}
}

View file

@ -0,0 +1,30 @@
package com.lagradost.cloudstream3.actions.temp
import android.content.Context
import android.content.Intent
import com.lagradost.cloudstream3.R
import com.lagradost.cloudstream3.actions.VideoClickAction
import com.lagradost.cloudstream3.actions.makeTempM3U8Intent
import com.lagradost.cloudstream3.ui.result.LinkLoadingResult
import com.lagradost.cloudstream3.ui.result.ResultEpisode
import com.lagradost.cloudstream3.utils.txt
class ViewM3U8Action: VideoClickAction() {
override val name = txt(R.string.episode_action_play_in_format, "m3u8 player")
override val isPlayer = true
override fun shouldShow(context: Context?, video: ResultEpisode?) = true
override suspend fun runAction(
context: Context?,
video: ResultEpisode,
result: LinkLoadingResult,
index: Int?
) {
if (context == null) return
val i = Intent(Intent.ACTION_VIEW)
makeTempM3U8Intent(context, i, result)
launch(i)
}
}

View file

@ -0,0 +1,77 @@
package com.lagradost.cloudstream3.actions.temp
import android.app.Activity
import android.content.Context
import android.content.Intent
import android.os.Build
import androidx.core.net.toUri
import com.lagradost.api.Log
import com.lagradost.cloudstream3.CloudStreamApp.Companion.getKey
import com.lagradost.cloudstream3.actions.OpenInAppAction
import com.lagradost.cloudstream3.actions.makeTempM3U8Intent
import com.lagradost.cloudstream3.actions.updateDurationAndPosition
import com.lagradost.cloudstream3.ui.result.LinkLoadingResult
import com.lagradost.cloudstream3.ui.result.ResultEpisode
import com.lagradost.cloudstream3.utils.txt
import com.lagradost.cloudstream3.ui.subtitles.SUBTITLE_AUTO_SELECT_KEY
import com.lagradost.cloudstream3.utils.DataStoreHelper.getViewPos
// https://github.com/videolan/vlc-android/blob/3706c4be2da6800b3d26344fc04fab03ffa4b860/application/vlc-android/src/org/videolan/vlc/gui/video/VideoPlayerActivity.kt#L1898
// https://wiki.videolan.org/Android_Player_Intents/
class VlcNightlyPackage : VlcPackage() {
override val packageName = "org.videolan.vlc.debug"
override val appName = txt("VLC Nightly")
}
open class VlcPackage: OpenInAppAction(
appName = txt("VLC"),
packageName = "org.videolan.vlc",
intentClass = if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) {
"org.videolan.vlc.gui.video.VideoPlayerActivity"
} else {
null
},
action = if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) {
"org.videolan.vlc.player.result"
} else {
Intent.ACTION_VIEW
}
) {
// while VLC supports multi links, it has poor support, so we disable it for now
override val oneSource = true
override suspend fun putExtra(
context: Context,
intent: Intent,
video: ResultEpisode,
result: LinkLoadingResult,
index: Int?
) {
if (index != null) {
intent.setDataAndType(result.links[index].url.toUri(), "video/*")
} else {
makeTempM3U8Intent(context, intent, result)
}
val position = getViewPos(video.id)?.position ?: 0L
intent.putExtra("from_start", false)
intent.putExtra("position", position)
intent.putExtra("secure_uri", true)
intent.putExtra("title", video.name)
val subsLang = getKey(SUBTITLE_AUTO_SELECT_KEY) ?: "en"
result.subs.firstOrNull {
subsLang == it.languageCode
}?.let {
intent.putExtra("subtitles_location", it.url)
}
}
override fun onResult(activity: Activity, intent: Intent?) {
val position = intent?.getLongExtra("extra_position", -1) ?: -1
val duration = intent?.getLongExtra("extra_duration", -1) ?: -1
Log.d("VLC", "Position: $position, Duration: $duration")
updateDurationAndPosition(position, duration)
}
}

View file

@ -0,0 +1,61 @@
package com.lagradost.cloudstream3.actions.temp
import android.app.Activity
import android.content.Context
import android.content.Intent
import android.os.Bundle
import androidx.core.net.toUri
import com.lagradost.cloudstream3.USER_AGENT
import com.lagradost.cloudstream3.actions.OpenInAppAction
import com.lagradost.cloudstream3.ui.result.LinkLoadingResult
import com.lagradost.cloudstream3.ui.result.ResultEpisode
import com.lagradost.cloudstream3.utils.txt
import com.lagradost.cloudstream3.utils.ExtractorLinkType
// https://www.webvideocaster.com/integrations
class WebVideoCastPackage: OpenInAppAction(
txt("Web Video Cast"),
"com.instantbits.cast.webvideo"
) {
override val oneSource = true
override val sourceTypes = setOf(
ExtractorLinkType.VIDEO,
ExtractorLinkType.DASH,
ExtractorLinkType.M3U8
)
override suspend fun putExtra(
context: Context,
intent: Intent,
video: ResultEpisode,
result: LinkLoadingResult,
index: Int?
) {
val link = result.links[index ?: 0]
intent.apply {
setDataAndType(link.url.toUri(), "video/*")
val title = video.name ?: video.headerName
putExtra("subs", result.subs.map { it.url.toUri() }.toTypedArray())
putExtra("title", title)
video.poster?.let { putExtra("poster", it) }
val headers = Bundle().apply {
if (link.referer.isNotBlank())
putString("Referer", link.referer)
putString("User-Agent", USER_AGENT)
for ((key, value) in link.headers) {
putString(key, value)
}
}
putExtra("android.media.intent.extra.HTTP_HEADERS", headers)
putExtra("secure_uri", true)
}
}
override fun onResult(activity: Activity, intent: Intent?) = Unit
}

View file

@ -0,0 +1,69 @@
package com.lagradost.cloudstream3.actions.temp.fcast
import android.content.Context
import com.lagradost.cloudstream3.CloudStreamApp.Companion.getActivity
import com.lagradost.cloudstream3.R
import com.lagradost.cloudstream3.USER_AGENT
import com.lagradost.cloudstream3.actions.VideoClickAction
import com.lagradost.cloudstream3.ui.result.LinkLoadingResult
import com.lagradost.cloudstream3.ui.result.ResultEpisode
import com.lagradost.cloudstream3.utils.txt
import com.lagradost.cloudstream3.utils.DataStoreHelper.getViewPos
import com.lagradost.cloudstream3.utils.ExtractorLink
import com.lagradost.cloudstream3.utils.ExtractorLinkType
import com.lagradost.cloudstream3.utils.SingleSelectionHelper.showBottomDialog
class FcastAction: VideoClickAction() {
override val name = txt("Fcast to device")
override val oneSource = true
override val sourceTypes = setOf(
ExtractorLinkType.VIDEO,
ExtractorLinkType.DASH,
ExtractorLinkType.M3U8
)
override fun shouldShow(context: Context?, video: ResultEpisode?) = FcastManager.currentDevices.isNotEmpty()
override suspend fun runAction(
context: Context?,
video: ResultEpisode,
result: LinkLoadingResult,
index: Int?
) {
val link = result.links.getOrNull(index ?: 0) ?: return
val devices = FcastManager.currentDevices.toList()
uiThread {
context?.getActivity()?.showBottomDialog(
devices.map { it.name },
-1,
txt(R.string.player_settings_select_cast_device).asString(context),
false,
{}) {
val position = getViewPos(video.id)?.position
castTo(devices.getOrNull(it), link, position)
}
}
}
private fun castTo(device: PublicDeviceInfo?, link: ExtractorLink, position: Long?) {
val host = device?.host ?: return
FcastSession(host).use { session ->
session.sendMessage(
Opcode.Play,
PlayMessage(
link.type.getMimeType(),
link.url,
time = position?.let { it / 1000.0 },
headers = mapOf(
"referer" to link.referer,
"user-agent" to USER_AGENT
) + link.headers
)
)
}
}
}

View file

@ -0,0 +1,195 @@
package com.lagradost.cloudstream3.actions.temp.fcast
import android.content.Context
import android.net.nsd.NsdManager
import android.net.nsd.NsdManager.ResolveListener
import android.net.nsd.NsdServiceInfo
import android.os.Build
import android.os.ext.SdkExtensions
import android.util.Log
import com.lagradost.cloudstream3.mvvm.safe
import com.lagradost.cloudstream3.utils.Coroutines.ioSafe
class FcastManager {
private var nsdManager: NsdManager? = null
// Used for receiver
private val registrationListenerTcp = DefaultRegistrationListener()
private fun getDeviceName(): String {
return "${Build.MANUFACTURER}-${Build.MODEL}"
}
/**
* Start the fcast service
* @param registerReceiver If true will register the app as a compatible fcast receiver for discovery in other app
*/
fun init(context: Context, registerReceiver: Boolean) = ioSafe {
nsdManager = context.getSystemService(Context.NSD_SERVICE) as NsdManager
val serviceType = "_fcast._tcp"
if (registerReceiver) {
val serviceName = "$APP_PREFIX-${getDeviceName()}"
val serviceInfo = NsdServiceInfo().apply {
this.serviceName = serviceName
this.serviceType = serviceType
this.port = TCP_PORT
}
nsdManager?.registerService(
serviceInfo,
NsdManager.PROTOCOL_DNS_SD,
registrationListenerTcp
)
}
nsdManager?.discoverServices(
serviceType,
NsdManager.PROTOCOL_DNS_SD,
DefaultDiscoveryListener()
)
}
fun stop() {
nsdManager?.unregisterService(registrationListenerTcp)
}
inner class DefaultDiscoveryListener : NsdManager.DiscoveryListener {
val tag = "DiscoveryListener"
override fun onStartDiscoveryFailed(serviceType: String?, errorCode: Int) {
Log.d(tag, "Discovery failed: $serviceType, error code: $errorCode")
}
override fun onStopDiscoveryFailed(serviceType: String?, errorCode: Int) {
Log.d(tag, "Stop discovery failed: $serviceType, error code: $errorCode")
}
override fun onDiscoveryStarted(serviceType: String?) {
Log.d(tag, "Discovery started: $serviceType")
}
override fun onDiscoveryStopped(serviceType: String?) {
Log.d(tag, "Discovery stopped: $serviceType")
}
override fun onServiceFound(serviceInfo: NsdServiceInfo?) {
// Safe here as, java.lang.NoClassDefFoundError: Failed resolution of: Landroid/net/nsd/NsdManager$ServiceInfoCallback
safe {
if (serviceInfo == null) return@safe
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R && SdkExtensions.getExtensionVersion(
Build.VERSION_CODES.TIRAMISU
) >= 7
) {
nsdManager?.registerServiceInfoCallback(
serviceInfo,
Runnable::run,
object : NsdManager.ServiceInfoCallback {
override fun onServiceInfoCallbackRegistrationFailed(errorCode: Int) {
Log.e(tag, "Service registration failed: $errorCode")
}
override fun onServiceUpdated(serviceInfo: NsdServiceInfo) {
Log.d(
tag,
"Service updated: ${serviceInfo.serviceName}," +
"Net: ${serviceInfo.hostAddresses.firstOrNull()?.hostAddress}"
)
synchronized(_currentDevices) {
_currentDevices.removeIf { it.rawName == serviceInfo.serviceName }
_currentDevices.add(PublicDeviceInfo(serviceInfo))
}
}
override fun onServiceLost() {
Log.d(tag, "Service lost: ${serviceInfo.serviceName},")
synchronized(_currentDevices) {
_currentDevices.removeIf { it.rawName == serviceInfo.serviceName }
}
}
override fun onServiceInfoCallbackUnregistered() {}
})
} else {
@Suppress("DEPRECATION")
nsdManager?.resolveService(serviceInfo, object : ResolveListener {
override fun onResolveFailed(
serviceInfo: NsdServiceInfo?,
errorCode: Int
) {
}
override fun onServiceResolved(serviceInfo: NsdServiceInfo?) {
if (serviceInfo == null) return
synchronized(_currentDevices) {
_currentDevices.add(PublicDeviceInfo(serviceInfo))
}
Log.d(
tag,
"Service found: ${serviceInfo.serviceName}, Net: ${serviceInfo.host.hostAddress}"
)
}
})
}
}
}
override fun onServiceLost(serviceInfo: NsdServiceInfo?) {
if (serviceInfo == null) return
// May remove duplicates, but net and port is null here, preventing device specific identification
synchronized(_currentDevices) {
_currentDevices.removeAll {
it.rawName == serviceInfo.serviceName
}
}
Log.d(tag, "Service lost: ${serviceInfo.serviceName}")
}
}
companion object {
const val APP_PREFIX = "CloudStream"
private val _currentDevices: MutableList<PublicDeviceInfo> = mutableListOf()
val currentDevices: List<PublicDeviceInfo> = _currentDevices
class DefaultRegistrationListener : NsdManager.RegistrationListener {
val tag = "DiscoveryService"
override fun onServiceRegistered(serviceInfo: NsdServiceInfo) {
Log.d(tag, "Service registered: ${serviceInfo.serviceName}")
}
override fun onRegistrationFailed(serviceInfo: NsdServiceInfo, errorCode: Int) {
Log.e(tag, "Service registration failed: errorCode=$errorCode")
}
override fun onServiceUnregistered(serviceInfo: NsdServiceInfo) {
Log.d(tag, "Service unregistered: ${serviceInfo.serviceName}")
}
override fun onUnregistrationFailed(serviceInfo: NsdServiceInfo, errorCode: Int) {
Log.e(tag, "Service unregistration failed: errorCode=$errorCode")
}
}
const val TCP_PORT = 46899
}
}
class PublicDeviceInfo(serviceInfo: NsdServiceInfo) {
val rawName: String = serviceInfo.serviceName
val host: String? = if (
Build.VERSION.SDK_INT >= Build.VERSION_CODES.R &&
SdkExtensions.getExtensionVersion(
Build.VERSION_CODES.TIRAMISU
) >= 7
) {
serviceInfo.hostAddresses.firstOrNull()?.hostAddress
} else {
@Suppress("DEPRECATION")
serviceInfo.host.hostAddress
}
val name = rawName.replace("-", " ") + host?.let { " $it" }
}

View file

@ -0,0 +1,60 @@
package com.lagradost.cloudstream3.actions.temp.fcast
import android.util.Log
import androidx.annotation.WorkerThread
import com.lagradost.cloudstream3.utils.AppUtils.toJson
import com.lagradost.cloudstream3.utils.Coroutines.ioSafe
import com.lagradost.safefile.closeQuietly
import java.io.DataOutputStream
import java.net.Socket
import kotlin.jvm.Throws
class FcastSession(private val hostAddress: String): AutoCloseable {
val tag = "FcastSession"
private var socket: Socket? = null
@Throws
@WorkerThread
fun open(): Socket {
val socket = Socket(hostAddress, FcastManager.TCP_PORT)
this.socket = socket
return socket
}
override fun close() {
socket?.closeQuietly()
socket = null
}
@Throws
private fun acquireSocket(): Socket {
return socket ?: open()
}
fun ping() {
sendMessage(Opcode.Ping, null)
}
fun <T> sendMessage(opcode: Opcode, message: T) {
ioSafe {
val socket = acquireSocket()
val outputStream = DataOutputStream(socket.getOutputStream())
val json = message?.toJson()
val content = json?.toByteArray() ?: ByteArray(0)
// Little endian starting from 1
// https://gitlab.com/futo-org/fcast/-/wikis/Protocol-version-1
val size = content.size + 1
val sizeArray = ByteArray(4) { num ->
(size shr 8 * num and 0xff).toByte()
}
Log.d(tag, "Sending message with size: $size, opcode: $opcode")
outputStream.write(sizeArray)
outputStream.write(ByteArray(1) { opcode.value })
outputStream.write(content)
}
}
}

View file

@ -0,0 +1,62 @@
package com.lagradost.cloudstream3.actions.temp.fcast
// See https://gitlab.com/futo-org/fcast/-/wikis/Protocol-version-1
enum class Opcode(val value: Byte) {
None(0),
Play(1),
Pause(2),
Resume(3),
Stop(4),
Seek(5),
PlaybackUpdate(6),
VolumeUpdate(7),
SetVolume(8),
PlaybackError(9),
SetSpeed(10),
Version(11),
Ping(12),
Pong(13);
}
data class PlayMessage(
val container: String,
val url: String? = null,
val content: String? = null,
val time: Double? = null,
val speed: Double? = null,
val headers: Map<String, String>? = null
)
data class SeekMessage(
val time: Double
)
data class PlaybackUpdateMessage(
val generationTime: Long,
val time: Double,
val duration: Double,
val state: Int,
val speed: Double
)
data class VolumeUpdateMessage(
val generationTime: Long,
val volume: Double
)
data class PlaybackErrorMessage(
val message: String
)
data class SetSpeedMessage(
val speed: Double
)
data class SetVolumeMessage(
val volume: Double
)
data class VersionMessage(
val version: Long
)

View file

@ -1,40 +0,0 @@
package com.lagradost.cloudstream3.extractors
import android.util.Log
import com.lagradost.cloudstream3.app
import com.lagradost.cloudstream3.utils.ExtractorApi
import com.lagradost.cloudstream3.utils.ExtractorLink
import com.lagradost.cloudstream3.utils.Qualities
open class AStreamHub : ExtractorApi() {
override val name = "AStreamHub"
override val mainUrl = "https://astreamhub.com"
override val requiresReferer = true
override suspend fun getUrl(url: String, referer: String?): List<ExtractorLink> {
val sources = mutableListOf<ExtractorLink>()
app.get(url).document.selectFirst("body > script").let { script ->
val text = script?.html() ?: ""
Log.i("Dev", "text => $text")
if (text.isNotBlank()) {
val m3link = "(?<=file:)(.*)(?=,)".toRegex().find(text)
?.groupValues?.get(0)?.trim()?.trim('"') ?: ""
Log.i("Dev", "m3link => $m3link")
if (m3link.isNotBlank()) {
sources.add(
ExtractorLink(
name = name,
source = name,
url = m3link,
isM3u8 = true,
quality = Qualities.Unknown.value,
referer = referer ?: url
)
)
}
}
}
return sources
}
}

View file

@ -1,39 +0,0 @@
package com.lagradost.cloudstream3.extractors
import com.lagradost.cloudstream3.app
import com.lagradost.cloudstream3.base64Decode
import com.lagradost.cloudstream3.utils.*
open class Acefile : ExtractorApi() {
override val name = "Acefile"
override val mainUrl = "https://acefile.co"
override val requiresReferer = false
override suspend fun getUrl(url: String, referer: String?): List<ExtractorLink> {
val sources = mutableListOf<ExtractorLink>()
app.get(url).document.select("script").map { script ->
if (script.data().contains("eval(function(p,a,c,k,e,d)")) {
val data = getAndUnpack(script.data())
val id = data.substringAfter("{\"id\":\"").substringBefore("\",")
val key = data.substringAfter("var nfck=\"").substringBefore("\";")
app.get("https://acefile.co/local/$id?key=$key").text.let {
base64Decode(
it.substringAfter("JSON.parse(atob(\"").substringBefore("\"))")
).let { res ->
sources.add(
ExtractorLink(
name,
name,
res.substringAfter("\"file\":\"").substringBefore("\","),
"$mainUrl/",
Qualities.Unknown.value,
)
)
}
}
}
}
return sources
}
}

View file

@ -1,46 +0,0 @@
package com.lagradost.cloudstream3.extractors
import com.lagradost.cloudstream3.app
import com.lagradost.cloudstream3.utils.ExtractorApi
import com.lagradost.cloudstream3.utils.ExtractorLink
import com.lagradost.cloudstream3.utils.M3u8Helper
import com.lagradost.cloudstream3.utils.getQualityFromName
import java.net.URI
open class AsianLoad : ExtractorApi() {
override var name = "AsianLoad"
override var mainUrl = "https://asianhdplay.pro"
override val requiresReferer = true
private val sourceRegex = Regex("""sources:[\W\w]*?file:\s*?["'](.*?)["']""")
override suspend fun getUrl(url: String, referer: String?): List<ExtractorLink> {
val extractedLinksList: MutableList<ExtractorLink> = mutableListOf()
with(app.get(url, referer = referer)) {
sourceRegex.findAll(this.text).forEach { sourceMatch ->
val extractedUrl = sourceMatch.groupValues[1]
// Trusting this isn't mp4, may fuck up stuff
if (URI(extractedUrl).path.endsWith(".m3u8")) {
M3u8Helper.generateM3u8(
name,
extractedUrl,
url,
headers = mapOf("referer" to this.url)
).forEach { link ->
extractedLinksList.add(link)
}
} else if (extractedUrl.endsWith(".mp4")) {
extractedLinksList.add(
ExtractorLink(
name,
name,
extractedUrl,
url.replace(" ", "%20"),
getQualityFromName(sourceMatch.groupValues[2]),
)
)
}
}
return extractedLinksList
}
}
}

View file

@ -1,29 +0,0 @@
package com.lagradost.cloudstream3.extractors
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 BullStream : ExtractorApi() {
override val name = "BullStream"
override val mainUrl = "https://bullstream.xyz"
override val requiresReferer = false
val regex = Regex("(?<=sniff\\()(.*)(?=\\)\\);)")
override suspend fun getUrl(url: String, referer: String?): List<ExtractorLink>? {
val data = regex.find(app.get(url).text)?.value
?.replace("\"", "")
?.split(",")
?: return null
val m3u8 = "$mainUrl/m3u8/${data[1]}/${data[2]}/master.txt?s=1&cache=${data[4]}"
//println("shiv : $m3u8")
return M3u8Helper.generateM3u8(
name,
m3u8,
url,
headers = mapOf("referer" to url, "accept" to "*/*")
)
}
}

View file

@ -1,23 +0,0 @@
package com.lagradost.cloudstream3.extractors
import com.lagradost.cloudstream3.utils.*
open class ByteShare : ExtractorApi() {
override val name = "ByteShare"
override val mainUrl = "https://byteshare.to"
override val requiresReferer = false
override suspend fun getUrl(url: String, referer: String?): List<ExtractorLink> {
val sources = mutableListOf<ExtractorLink>()
sources.add(
ExtractorLink(
name,
name,
url.replace("/embed/", "/download/"),
"",
Qualities.Unknown.value,
)
)
return sources
}
}

View file

@ -1,140 +0,0 @@
package com.lagradost.cloudstream3.extractors
import com.fasterxml.jackson.annotation.JsonProperty
import com.lagradost.cloudstream3.*
import com.lagradost.cloudstream3.utils.AppUtils
import com.lagradost.cloudstream3.utils.ExtractorApi
import com.lagradost.cloudstream3.utils.ExtractorLink
import com.lagradost.cloudstream3.utils.Qualities
import javax.crypto.Cipher
import javax.crypto.SecretKeyFactory
import javax.crypto.spec.IvParameterSpec
import javax.crypto.spec.PBEKeySpec
import javax.crypto.spec.SecretKeySpec
class Moviesapi : Chillx() {
override val name = "Moviesapi"
override val mainUrl = "https://w1.moviesapi.club"
}
class Bestx : Chillx() {
override val name = "Bestx"
override val mainUrl = "https://bestx.stream"
}
class Watchx : Chillx() {
override val name = "Watchx"
override val mainUrl = "https://watchx.top"
}
open class Chillx : ExtractorApi() {
override val name = "Chillx"
override val mainUrl = "https://chillx.top"
override val requiresReferer = true
companion object {
private const val KEY = "11x&W5UBrcqn\$9Yl"
}
override suspend fun getUrl(
url: String,
referer: String?,
subtitleCallback: (SubtitleFile) -> Unit,
callback: (ExtractorLink) -> Unit
) {
val master = Regex("MasterJS\\s*=\\s*'([^']+)").find(
app.get(
url,
referer = referer
).text
)?.groupValues?.get(1)
val encData = AppUtils.tryParseJson<AESData>(base64Decode(master ?: return))
val decrypt = cryptoAESHandler(encData ?: return, KEY, false)
val source = Regex(""""?file"?:\s*"([^"]+)""").find(decrypt)?.groupValues?.get(1)
val tracks = Regex("""tracks:\s*\[(.+)]""").find(decrypt)?.groupValues?.get(1)
// required
val headers = mapOf(
"Accept" to "*/*",
"Connection" to "keep-alive",
"Sec-Fetch-Dest" to "empty",
"Sec-Fetch-Mode" to "cors",
"Sec-Fetch-Site" to "cross-site",
"Origin" to mainUrl,
)
callback.invoke(
ExtractorLink(
name,
name,
source ?: return,
"$mainUrl/",
Qualities.P1080.value,
headers = headers,
isM3u8 = true
)
)
AppUtils.tryParseJson<List<Tracks>>("[$tracks]")
?.filter { it.kind == "captions" }?.map { track ->
subtitleCallback.invoke(
SubtitleFile(
track.label ?: "",
track.file ?: return@map null
)
)
}
}
private fun cryptoAESHandler(
data: AESData,
pass: String,
encrypt: Boolean = true
): String {
val factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA512")
val spec = PBEKeySpec(
pass.toCharArray(),
data.salt?.hexToByteArray(),
data.iterations?.toIntOrNull() ?: 1,
256
)
val key = factory.generateSecret(spec)
val cipher = Cipher.getInstance("AES/CBC/PKCS5Padding")
return if (!encrypt) {
cipher.init(
Cipher.DECRYPT_MODE,
SecretKeySpec(key.encoded, "AES"),
IvParameterSpec(data.iv?.hexToByteArray())
)
String(cipher.doFinal(base64DecodeArray(data.ciphertext.toString())))
} else {
cipher.init(
Cipher.ENCRYPT_MODE,
SecretKeySpec(key.encoded, "AES"),
IvParameterSpec(data.iv?.hexToByteArray())
)
base64Encode(cipher.doFinal(data.ciphertext?.toByteArray()))
}
}
private fun String.hexToByteArray(): ByteArray {
check(length % 2 == 0) { "Must have an even length" }
return chunked(2)
.map { it.toInt(16).toByte() }
.toByteArray()
}
data class AESData(
@JsonProperty("ciphertext") val ciphertext: String? = null,
@JsonProperty("iv") val iv: String? = null,
@JsonProperty("salt") val salt: String? = null,
@JsonProperty("iterations") val iterations: String? = null,
)
data class Tracks(
@JsonProperty("file") val file: String? = null,
@JsonProperty("label") val label: String? = null,
@JsonProperty("kind") val kind: String? = null,
)
}

View file

@ -1,105 +0,0 @@
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.AppUtils.tryParseJson
import com.lagradost.cloudstream3.utils.ExtractorApi
import com.lagradost.cloudstream3.utils.ExtractorLink
import com.lagradost.cloudstream3.utils.M3u8Helper.Companion.generateM3u8
import com.lagradost.cloudstream3.utils.Qualities
import java.net.URL
open class Dailymotion : ExtractorApi() {
override val mainUrl = "https://www.dailymotion.com"
override val name = "Dailymotion"
override val requiresReferer = false
@Suppress("RegExpSimplifiable")
private val videoIdRegex = "^[kx][a-zA-Z0-9]+\$".toRegex()
// https://www.dailymotion.com/video/k3JAHfletwk94ayCVIu
// https://www.dailymotion.com/embed/video/k3JAHfletwk94ayCVIu
override suspend fun getUrl(
url: String,
referer: String?,
subtitleCallback: (SubtitleFile) -> Unit,
callback: (ExtractorLink) -> Unit
) {
val embedUrl = getEmbedUrl(url) ?: return
val doc = app.get(embedUrl).document
val prefix = "window.__PLAYER_CONFIG__ = "
val configStr = doc.selectFirst("script:containsData($prefix)")?.data() ?: return
val config = tryParseJson<Config>(configStr.substringAfter(prefix)) ?: return
val id = getVideoId(embedUrl) ?: return
val dmV1st = config.dmInternalData.v1st
val dmTs = config.dmInternalData.ts
val metaDataUrl =
"$mainUrl/player/metadata/video/$id?locale=en&dmV1st=$dmV1st&dmTs=$dmTs&is_native_app=0"
val cookies = mapOf(
"v1st" to dmV1st,
"dmvk" to config.context.dmvk,
"ts" to dmTs.toString()
)
val metaData = app.get(metaDataUrl, referer = embedUrl, cookies = cookies)
.parsedSafe<MetaData>() ?: return
metaData.qualities.forEach { (_, video) ->
video.forEach {
getStream(it.url, this.name, callback)
}
}
}
private fun getEmbedUrl(url: String): String? {
if (url.contains("/embed/")) {
return url
}
val vid = getVideoId(url) ?: return null
return "$mainUrl/embed/video/$vid"
}
private fun getVideoId(url: String): String? {
val path = URL(url).path
val id = path.substringAfter("video/")
if (id.matches(videoIdRegex)) {
return id
}
return null
}
private suspend fun getStream(
streamLink: String,
name: String,
callback: (ExtractorLink) -> Unit
) {
return generateM3u8(
name,
streamLink,
"",
).forEach(callback)
}
data class Config(
val context: Context,
val dmInternalData: InternalData
)
data class InternalData(
val ts: Int,
val v1st: String
)
data class Context(
@JsonProperty("access_token") val accessToken: String?,
val dmvk: String,
)
data class MetaData(
val qualities: Map<String, List<VideoLink>>
)
data class VideoLink(
val type: String,
val url: String
)
}

View file

@ -1,75 +0,0 @@
package com.lagradost.cloudstream3.extractors
import com.lagradost.cloudstream3.app
import com.lagradost.cloudstream3.utils.ExtractorApi
import com.lagradost.cloudstream3.utils.ExtractorLink
import com.lagradost.cloudstream3.utils.Qualities
import com.lagradost.cloudstream3.utils.getQualityFromName
import kotlinx.coroutines.delay
class Dooood : DoodLaExtractor() {
override var mainUrl = "https://dooood.com"
}
class DoodWfExtractor : DoodLaExtractor() {
override var mainUrl = "https://dood.wf"
}
class DoodCxExtractor : DoodLaExtractor() {
override var mainUrl = "https://dood.cx"
}
class DoodShExtractor : DoodLaExtractor() {
override var mainUrl = "https://dood.sh"
}
class DoodWatchExtractor : DoodLaExtractor() {
override var mainUrl = "https://dood.watch"
}
class DoodPmExtractor : DoodLaExtractor() {
override var mainUrl = "https://dood.pm"
}
class DoodToExtractor : DoodLaExtractor() {
override var mainUrl = "https://dood.to"
}
class DoodSoExtractor : DoodLaExtractor() {
override var mainUrl = "https://dood.so"
}
class DoodWsExtractor : DoodLaExtractor() {
override var mainUrl = "https://dood.ws"
}
class DoodYtExtractor : DoodLaExtractor() {
override var mainUrl = "https://dood.yt"
}
open class DoodLaExtractor : ExtractorApi() {
override var name = "DoodStream"
override var mainUrl = "https://dood.la"
override val requiresReferer = false
override fun getExtractorUrl(id: String): String {
return "$mainUrl/d/$id"
}
override suspend fun getUrl(url: String, referer: String?): List<ExtractorLink>? {
val response0 = app.get(url).text // html of DoodStream page to look for /pass_md5/...
val md5 =mainUrl+(Regex("/pass_md5/[^']*").find(response0)?.value ?: return null) // get https://dood.ws/pass_md5/...
val trueUrl = app.get(md5, referer = url).text + "zUEJeL3mUN?token=" + md5.substringAfterLast("/") //direct link to extract (zUEJeL3mUN is random)
val quality = Regex("\\d{3,4}p").find(response0.substringAfter("<title>").substringBefore("</title>"))?.groupValues?.get(0)
return listOf(
ExtractorLink(
this.name,
this.name,
trueUrl,
mainUrl,
getQualityFromName(quality),
false
)
) // links are valid in 8h
}
}

View file

@ -1,54 +0,0 @@
package com.lagradost.cloudstream3.extractors
import com.lagradost.cloudstream3.amap
import com.lagradost.cloudstream3.app
import com.lagradost.cloudstream3.utils.ExtractorApi
import com.lagradost.cloudstream3.utils.ExtractorLink
import com.lagradost.cloudstream3.utils.M3u8Helper.Companion.generateM3u8
import com.lagradost.cloudstream3.utils.getAndUnpack
import org.jsoup.nodes.Document
open class Fastream: ExtractorApi() {
override var mainUrl = "https://fastream.to"
override var name = "Fastream"
override val requiresReferer = false
suspend fun getstream(
response: Document,
sources: ArrayList<ExtractorLink>): Boolean{
response.select("script").amap { script ->
if (script.data().contains(Regex("eval\\(function\\(p,a,c,k,e,[rd]"))) {
val unpacked = getAndUnpack(script.data())
//val m3u8regex = Regex("((https:|http:)\\/\\/.*\\.m3u8)")
val newm3u8link = unpacked.substringAfter("file:\"").substringBefore("\"")
//val m3u8link = m3u8regex.find(unpacked)?.value ?: return@forEach
generateM3u8(
name,
newm3u8link,
mainUrl
).forEach { link ->
sources.add(link)
}
}
}
return true
}
override suspend fun getUrl(url: String, referer: String?): List<ExtractorLink> {
val sources = ArrayList<ExtractorLink>()
val idregex = Regex("emb.html\\?(.*)=")
if (url.contains(Regex("(emb.html.*fastream)"))) {
val id = idregex.find(url)?.destructured?.component1() ?: ""
val response = app.post("https://fastream.to/dl", allowRedirects = false,
data = mapOf(
"op" to "embed",
"file_code" to id,
"auto" to "1"
)
).document
getstream(response, sources)
}
val response = app.get(url, referer = url).document
getstream(response, sources)
return sources
}
}

View file

@ -1,83 +0,0 @@
package com.lagradost.cloudstream3.extractors
import com.lagradost.cloudstream3.SubtitleFile
import com.lagradost.cloudstream3.app
import com.lagradost.cloudstream3.utils.*
import com.lagradost.cloudstream3.utils.M3u8Helper.Companion.generateM3u8
class Guccihide : Filesim() {
override val name = "Guccihide"
override var mainUrl = "https://guccihide.com"
}
class Ahvsh : Filesim() {
override val name = "Ahvsh"
override var mainUrl = "https://ahvsh.com"
}
class Moviesm4u : Filesim() {
override val mainUrl = "https://moviesm4u.com"
override val name = "Moviesm4u"
}
class FileMoonIn : Filesim() {
override val mainUrl = "https://filemoon.in"
override val name = "FileMoon"
}
class StreamhideTo : Filesim() {
override val mainUrl = "https://streamhide.to"
override val name = "Streamhide"
}
class StreamhideCom : Filesim() {
override var name: String = "Streamhide"
override var mainUrl: String = "https://streamhide.com"
}
class Movhide : Filesim() {
override var name: String = "Movhide"
override var mainUrl: String = "https://movhide.pro"
}
class Ztreamhub : Filesim() {
override val mainUrl: String = "https://ztreamhub.com" //Here 'cause works
override val name = "Zstreamhub"
}
class FileMoon : Filesim() {
override val mainUrl = "https://filemoon.to"
override val name = "FileMoon"
}
class FileMoonSx : Filesim() {
override val mainUrl = "https://filemoon.sx"
override val name = "FileMoonSx"
}
open class Filesim : ExtractorApi() {
override val name = "Filesim"
override val mainUrl = "https://files.im"
override val requiresReferer = true
override suspend fun getUrl(
url: String,
referer: String?,
subtitleCallback: (SubtitleFile) -> Unit,
callback: (ExtractorLink) -> Unit
) {
val response = app.get(url, referer = referer)
val script = if (!getPacked(response.text).isNullOrEmpty()) {
getAndUnpack(response.text)
} else {
response.document.selectFirst("script:containsData(sources:)")?.data()
}
val m3u8 =
Regex("file:\\s*\"(.*?m3u8.*?)\"").find(script ?: return)?.groupValues?.getOrNull(1)
generateM3u8(
name,
m3u8 ?: return,
mainUrl
).forEach(callback)
}
}

View file

@ -1,44 +0,0 @@
package com.lagradost.cloudstream3.extractors
import com.lagradost.cloudstream3.app
import com.lagradost.cloudstream3.utils.ExtractorApi
import com.lagradost.cloudstream3.utils.ExtractorLink
import com.lagradost.cloudstream3.utils.Qualities
open class GMPlayer : ExtractorApi() {
override val name = "GM Player"
override val mainUrl = "https://gmplayer.xyz"
override val requiresReferer = true
override suspend fun getUrl(url: String, referer: String?): List<ExtractorLink>? {
val ref = referer ?: return null
val id = url.substringAfter("/video/").substringBefore("/")
val m3u8 = app.post(
"$mainUrl/player/index.php?data=$id&do=getVideo",
mapOf(
"accept" to "*/*",
"referer" to ref,
"x-requested-with" to "XMLHttpRequest",
"origin" to mainUrl
),
data = mapOf("hash" to id, "r" to ref)
).parsed<GmResponse>().videoSource ?: return null
return listOf(
ExtractorLink(
this.name,
this.name,
m3u8,
ref,
Qualities.Unknown.value,
headers = mapOf("accept" to "*/*"),
isM3u8 = true
)
)
}
private data class GmResponse(
val videoSource: String? = null
)
}

View file

@ -1,62 +0,0 @@
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.ExtractorApi
import com.lagradost.cloudstream3.utils.ExtractorLink
import com.lagradost.cloudstream3.utils.Qualities
open class Gofile : ExtractorApi() {
override val name = "Gofile"
override val mainUrl = "https://gofile.io"
override val requiresReferer = false
private val mainApi = "https://api.gofile.io"
override suspend fun getUrl(
url: String,
referer: String?,
subtitleCallback: (SubtitleFile) -> Unit,
callback: (ExtractorLink) -> Unit
) {
val id = Regex("/(?:\\?c=|d/)([\\da-zA-Z]+)").find(url)?.groupValues?.get(1)
val token = app.get("$mainApi/createAccount").parsedSafe<Account>()?.data?.get("token")
val websiteToken = app.get("$mainUrl/dist/js/alljs.js").text.let {
Regex("websiteToken\\s*=\\s*\"([^\"]+)").find(it)?.groupValues?.get(1)
}
app.get("$mainApi/getContent?contentId=$id&token=$token&websiteToken=$websiteToken")
.parsedSafe<Source>()?.data?.contents?.forEach {
callback.invoke(
ExtractorLink(
this.name,
this.name,
it.value["link"] ?: return,
"",
getQuality(it.value["name"]),
headers = mapOf(
"Cookie" to "accountToken=$token"
)
)
)
}
}
private fun getQuality(str: String?): Int {
return Regex("(\\d{3,4})[pP]").find(str ?: "")?.groupValues?.getOrNull(1)?.toIntOrNull()
?: Qualities.Unknown.value
}
data class Account(
@JsonProperty("data") val data: HashMap<String, String>? = null,
)
data class Data(
@JsonProperty("contents") val contents: HashMap<String, HashMap<String, String>>? = null,
)
data class Source(
@JsonProperty("data") val data: Data? = null,
)
}

View file

@ -1,88 +0,0 @@
package com.lagradost.cloudstream3.extractors
import com.fasterxml.jackson.annotation.JsonProperty
import com.lagradost.cloudstream3.SubtitleFile
import com.lagradost.cloudstream3.utils.ExtractorLink
import com.lagradost.cloudstream3.app
import com.lagradost.cloudstream3.utils.*
class Vanfem : GuardareStream() {
override var name = "Vanfem"
override var mainUrl = "https://vanfem.com/"
}
class CineGrabber : GuardareStream() {
override var name = "CineGrabber"
override var mainUrl = "https://cinegrabber.com"
}
open class GuardareStream : ExtractorApi() {
override var name = "Guardare"
override var mainUrl = "https://guardare.stream"
override val requiresReferer = false
data class GuardareJsonData(
@JsonProperty("data") val data: List<GuardareData>,
@JsonProperty("captions") val captions: List<GuardareCaptions?>?,
)
data class GuardareData(
@JsonProperty("file") val file: String,
@JsonProperty("label") val label: String,
@JsonProperty("type") val type: String
)
// https://cinegrabber.com/asset/userdata/224879/caption/gqdmzh-71ez76z8/876438.srt
data class GuardareCaptions(
@JsonProperty("id") val id: String,
@JsonProperty("hash") val hash: String,
@JsonProperty("language") val language: String?,
@JsonProperty("extension") val extension: String
) {
fun getUrl(mainUrl: String, userId: String): String {
return "$mainUrl/asset/userdata/$userId/caption/$hash/$id.$extension"
}
}
override suspend fun getUrl(
url: String,
referer: String?,
subtitleCallback: (SubtitleFile) -> Unit,
callback: (ExtractorLink) -> Unit
) {
val response =
app.post(url.replace("/v/", "/api/source/"), data = mapOf("d" to mainUrl)).text
val jsonVideoData = AppUtils.parseJson<GuardareJsonData>(response)
jsonVideoData.data.forEach {
callback.invoke(
ExtractorLink(
this.name,
this.name,
it.file + ".${it.type}",
mainUrl,
it.label.filter { it.isDigit() }.toInt(),
false
)
)
}
if (!jsonVideoData.captions.isNullOrEmpty()){
val iframe = app.get(url)
// var USER_ID = '224879';
val userIdRegex = Regex("""USER_ID.*?(\d+)""")
val userId = userIdRegex.find(iframe.text)?.groupValues?.getOrNull(1) ?: return
jsonVideoData.captions.forEach {
if (it == null) return@forEach
val subUrl = it.getUrl(mainUrl, userId)
subtitleCallback.invoke(
SubtitleFile(
it.language ?: "",
subUrl
)
)
}
}
}
}

View file

@ -1,100 +0,0 @@
package com.lagradost.cloudstream3.extractors
import com.fasterxml.jackson.annotation.JsonProperty
import com.lagradost.cloudstream3.app
import com.lagradost.cloudstream3.utils.*
import com.lagradost.cloudstream3.utils.AppUtils.tryParseJson
class Neonime7n : Hxfile() {
override val name = "Neonime7n"
override val mainUrl = "https://neonime.fun"
override val redirect = false
}
class Neonime8n : Hxfile() {
override val name = "Neonime8n"
override val mainUrl = "https://8njctn.neonime.net"
override val redirect = false
}
class KotakAnimeid : Hxfile() {
override val name = "KotakAnimeid"
override val mainUrl = "https://nontonanimeid.bio"
override val requiresReferer = true
}
class Yufiles : Hxfile() {
override val name = "Yufiles"
override val mainUrl = "https://yufiles.com"
}
class Aico : Hxfile() {
override val name = "Aico"
override val mainUrl = "https://aico.pw"
}
open class Hxfile : ExtractorApi() {
override val name = "Hxfile"
override val mainUrl = "https://hxfile.co"
override val requiresReferer = false
open val redirect = true
override suspend fun getUrl(url: String, referer: String?): List<ExtractorLink>? {
val sources = mutableListOf<ExtractorLink>()
val document = app.get(url, allowRedirects = redirect, referer = referer).document
with(document) {
this.select("script").map { script ->
if (script.data().contains("eval(function(p,a,c,k,e,d)")) {
val data =
getAndUnpack(script.data()).substringAfter("sources:[").substringBefore("]")
tryParseJson<List<ResponseSource>>("[$data]")?.map {
sources.add(
ExtractorLink(
name,
name,
it.file,
referer = mainUrl,
quality = when {
url.contains("hxfile.co") -> getQualityFromName(
Regex("\\d\\.(.*?).mp4").find(
document.select("title").text()
)?.groupValues?.get(1).toString()
)
else -> getQualityFromName(it.label)
}
)
)
}
} else if (script.data().contains("\"sources\":[")) {
val data = script.data().substringAfter("\"sources\":[").substringBefore("]")
tryParseJson<List<ResponseSource>>("[$data]")?.map {
sources.add(
ExtractorLink(
name,
name,
it.file,
referer = mainUrl,
quality = when {
it.label?.contains("HD") == true -> Qualities.P720.value
it.label?.contains("SD") == true -> Qualities.P480.value
else -> getQualityFromName(it.label)
}
)
)
}
}
else {
null
}
}
}
return sources
}
private data class ResponseSource(
@JsonProperty("file") val file: String,
@JsonProperty("type") val type: String?,
@JsonProperty("label") val label: String?
)
}

View file

@ -1,81 +0,0 @@
package com.lagradost.cloudstream3.extractors
import com.fasterxml.jackson.annotation.JsonProperty
import com.lagradost.cloudstream3.app
import com.lagradost.cloudstream3.utils.AppUtils.tryParseJson
import com.lagradost.cloudstream3.utils.ExtractorApi
import com.lagradost.cloudstream3.utils.ExtractorLink
import com.lagradost.cloudstream3.utils.Qualities
import com.lagradost.cloudstream3.utils.getQualityFromName
class Meownime : JWPlayer() {
override val name = "Meownime"
override val mainUrl = "https://meownime.ltd"
}
class DesuOdchan : JWPlayer() {
override val name = "DesuOdchan"
override val mainUrl = "https://desustream.me/odchan/"
}
class DesuArcg : JWPlayer() {
override val name = "DesuArcg"
override val mainUrl = "https://desustream.me/arcg/"
}
class DesuDrive : JWPlayer() {
override val name = "DesuDrive"
override val mainUrl = "https://desustream.me/desudrive/"
}
class DesuOdvip : JWPlayer() {
override val name = "DesuOdvip"
override val mainUrl = "https://desustream.me/odvip/"
}
open class JWPlayer : ExtractorApi() {
override val name = "JWPlayer"
override val mainUrl = "https://www.jwplayer.com"
override val requiresReferer = false
override suspend fun getUrl(url: String, referer: String?): List<ExtractorLink>? {
val sources = mutableListOf<ExtractorLink>()
with(app.get(url).document) {
val data = this.select("script").mapNotNull { script ->
if (script.data().contains("sources: [")) {
script.data().substringAfter("sources: [")
.substringBefore("],").replace("'", "\"")
} else if (script.data().contains("otakudesu('")) {
script.data().substringAfter("otakudesu('")
.substringBefore("');")
} else {
null
}
}
tryParseJson<List<ResponseSource>>("$data")?.map {
sources.add(
ExtractorLink(
name,
name,
it.file,
referer = url,
quality = getQualityFromName(
Regex("(\\d{3,4}p)").find(it.file)?.groupValues?.get(
1
)
)
)
)
}
}
return sources
}
private data class ResponseSource(
@JsonProperty("file") val file: String,
@JsonProperty("type") val type: String?,
@JsonProperty("label") val label: String?
)
}

View file

@ -1,27 +0,0 @@
package com.lagradost.cloudstream3.extractors
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 Jawcloud : ExtractorApi() {
override var name = "Jawcloud"
override var mainUrl = "https://jawcloud.co"
override val requiresReferer = false
override suspend fun getUrl(url: String, referer: String?): List<ExtractorLink>? {
val doc = app.get(url).document
val urlString = doc.select("html body div source").attr("src")
val sources = mutableListOf<ExtractorLink>()
if (urlString.contains("m3u8"))
M3u8Helper.generateM3u8(
name,
urlString,
url,
headers = app.get(url).headers.toMap()
).forEach { link -> sources.add(link) }
return sources
}
}

View file

@ -1,59 +0,0 @@
package com.lagradost.cloudstream3.extractors
import com.lagradost.cloudstream3.app
import com.lagradost.cloudstream3.utils.ExtractorApi
import com.lagradost.cloudstream3.utils.ExtractorLink
import com.lagradost.cloudstream3.utils.Qualities
import com.lagradost.cloudstream3.utils.getQualityFromName
import java.net.URI
open class MultiQuality : ExtractorApi() {
override var name = "MultiQuality"
override var mainUrl = "https://anihdplay.com"
private val sourceRegex = Regex("""file:\s*['"](.*?)['"],label:\s*['"](.*?)['"]""")
private val m3u8Regex = Regex(""".*?(\d*).m3u8""")
private val urlRegex = Regex("""(.*?)([^/]+$)""")
override val requiresReferer = false
override fun getExtractorUrl(id: String): String {
return "$mainUrl/loadserver.php?id=$id"
}
override suspend fun getUrl(url: String, referer: String?): List<ExtractorLink> {
val extractedLinksList: MutableList<ExtractorLink> = mutableListOf()
with(app.get(url)) {
sourceRegex.findAll(this.text).forEach { sourceMatch ->
val extractedUrl = sourceMatch.groupValues[1]
// Trusting this isn't mp4, may fuck up stuff
if (URI(extractedUrl).path.endsWith(".m3u8")) {
with(app.get(extractedUrl)) {
m3u8Regex.findAll(this.text).forEach { match ->
extractedLinksList.add(
ExtractorLink(
name,
name = name,
urlRegex.find(this.url)!!.groupValues[1] + match.groupValues[0],
url,
getQualityFromName(match.groupValues[1]),
isM3u8 = true
)
)
}
}
} else if (extractedUrl.endsWith(".mp4")) {
extractedLinksList.add(
ExtractorLink(
name,
"$name ${sourceMatch.groupValues[2]}",
extractedUrl,
url.replace(" ", "%20"),
Qualities.Unknown.value,
)
)
}
}
return extractedLinksList
}
}
}

View file

@ -1,67 +0,0 @@
package com.lagradost.cloudstream3.extractors
import com.fasterxml.jackson.annotation.JsonProperty
import com.lagradost.cloudstream3.utils.*
import com.lagradost.cloudstream3.app
import com.lagradost.cloudstream3.utils.AppUtils.parseJson
data class DataOptionsJson (
@JsonProperty("flashvars") var flashvars : Flashvars? = Flashvars(),
)
data class Flashvars (
@JsonProperty("metadata") var metadata : String? = null,
@JsonProperty("hlsManifestUrl") var hlsManifestUrl : String? = null, //m3u8
)
data class MetadataOkru (
@JsonProperty("videos") var videos: ArrayList<Videos> = arrayListOf(),
)
data class Videos (
@JsonProperty("name") var name : String,
@JsonProperty("url") var url : String,
@JsonProperty("seekSchema") var seekSchema : Int? = null,
@JsonProperty("disallowed") var disallowed : Boolean? = null
)
class OkRuHttps: OkRu(){
override var mainUrl = "https://ok.ru"
}
open class OkRu : ExtractorApi() {
override var name = "Okru"
override var mainUrl = "http://ok.ru"
override val requiresReferer = false
override suspend fun getUrl(url: String, referer: String?): List<ExtractorLink>? {
val doc = app.get(url).document
val sources = ArrayList<ExtractorLink>()
val datajson = doc.select("div[data-options]").attr("data-options")
if (datajson.isNotBlank()) {
val main = parseJson<DataOptionsJson>(datajson)
val metadatajson = parseJson<MetadataOkru>(main.flashvars?.metadata!!)
val servers = metadatajson.videos
servers.forEach {
val quality = it.name.uppercase()
.replace("MOBILE","144p")
.replace("LOWEST","240p")
.replace("LOW","360p")
.replace("SD","480p")
.replace("HD","720p")
.replace("FULL","1080p")
.replace("QUAD","1440p")
.replace("ULTRA","4k")
val extractedurl = it.url.replace("\\\\u0026", "&")
sources.add(ExtractorLink(
name,
name = this.name,
extractedurl,
url,
getQualityFromName(quality),
isM3u8 = false
))
}
}
return sources
}
}

View file

@ -1,39 +0,0 @@
package com.lagradost.cloudstream3.extractors
import com.fasterxml.jackson.annotation.JsonProperty
import com.lagradost.cloudstream3.app
import com.lagradost.cloudstream3.utils.ExtractorApi
import com.lagradost.cloudstream3.utils.ExtractorLink
import com.lagradost.cloudstream3.utils.Qualities
data class Okrulinkdata (
@JsonProperty("status" ) var status : String? = null,
@JsonProperty("url" ) var url : String? = null
)
open class Okrulink: ExtractorApi() {
override var mainUrl = "https://okru.link"
override var name = "Okrulink"
override val requiresReferer = false
override suspend fun getUrl(url: String, referer: String?): List<ExtractorLink> {
val sources = mutableListOf<ExtractorLink>()
val key = url.substringAfter("html?t=")
val request = app.post("https://apizz.okru.link/decoding", allowRedirects = false,
data = mapOf("video" to key)
).parsedSafe<Okrulinkdata>()
if (request?.url != null) {
sources.add(
ExtractorLink(
name,
name,
request.url!!,
"",
Qualities.Unknown.value,
isM3u8 = false
)
)
}
return sources
}
}

View file

@ -1,99 +0,0 @@
package com.lagradost.cloudstream3.extractors
import com.lagradost.cloudstream3.SubtitleFile
import com.lagradost.cloudstream3.amap
import com.lagradost.cloudstream3.app
import com.lagradost.cloudstream3.mvvm.suspendSafeApiCall
import com.lagradost.cloudstream3.utils.ExtractorLink
import com.lagradost.cloudstream3.utils.extractorApis
import com.lagradost.cloudstream3.utils.getQualityFromName
import com.lagradost.cloudstream3.utils.loadExtractor
import org.jsoup.Jsoup
/**
* overrideMainUrl is necessary for for other vidstream clones like vidembed.cc
* If they diverge it'd be better to make them separate.
* */
open class Pelisplus(val mainUrl: String) {
val name: String = "Vidstream"
private fun getExtractorUrl(id: String): String {
return "$mainUrl/play?id=$id"
}
private fun getDownloadUrl(id: String): String {
return "$mainUrl/download?id=$id"
}
private val normalApis = arrayListOf(MultiQuality())
// https://gogo-stream.com/streaming.php?id=MTE3NDg5
suspend fun getUrl(
id: String,
isCasting: Boolean = false,
subtitleCallback: (SubtitleFile) -> Unit,
callback: (ExtractorLink) -> Unit
): Boolean {
try {
normalApis.amap { api ->
val url = api.getExtractorUrl(id)
api.getSafeUrl(url, subtitleCallback = subtitleCallback, callback = callback)
}
val extractorUrl = getExtractorUrl(id)
/** Stolen from GogoanimeProvider.kt extractor */
suspendSafeApiCall {
val link = getDownloadUrl(id)
println("Generated vidstream download link: $link")
val page = app.get(link, referer = extractorUrl)
val pageDoc = Jsoup.parse(page.text)
val qualityRegex = Regex("(\\d+)P")
//a[download]
pageDoc.select(".dowload > a")?.amap { element ->
val href = element.attr("href") ?: return@amap
val qual = if (element.text()
.contains("HDP")
) "1080" else qualityRegex.find(element.text())?.destructured?.component1()
.toString()
if (!loadExtractor(href, link, subtitleCallback, callback)) {
callback.invoke(
ExtractorLink(
this.name,
name = this.name,
href,
page.url,
getQualityFromName(qual),
element.attr("href").contains(".m3u8")
)
)
}
}
}
with(app.get(extractorUrl)) {
val document = Jsoup.parse(this.text)
val primaryLinks = document.select("ul.list-server-items > li.linkserver")
//val extractedLinksList: MutableList<ExtractorLink> = mutableListOf()
// All vidstream links passed to extractors
primaryLinks.distinctBy { it.attr("data-video") }.forEach { element ->
val link = element.attr("data-video")
//val name = element.text()
// Matches vidstream links with extractors
extractorApis.filter { !it.requiresReferer || !isCasting }.amap { api ->
if (link.startsWith(api.mainUrl)) {
api.getSafeUrl(link, extractorUrl, subtitleCallback, callback)
}
}
}
return true
}
} catch (e: Exception) {
return false
}
}
}

View file

@ -1,30 +0,0 @@
package com.lagradost.cloudstream3.extractors
import com.lagradost.cloudstream3.SubtitleFile
import com.lagradost.cloudstream3.utils.ExtractorApi
import com.lagradost.cloudstream3.utils.ExtractorLink
import com.lagradost.cloudstream3.utils.Qualities
open class Pixeldrain : ExtractorApi() {
override val name = "Pixeldrain"
override val mainUrl = "https://pixeldrain.com"
override val requiresReferer = false
override suspend fun getUrl(
url: String,
referer: String?,
subtitleCallback: (SubtitleFile) -> Unit,
callback: (ExtractorLink) -> Unit
) {
val mId = Regex("/([ul]/[\\da-zA-Z\\-]+)").find(url)?.groupValues?.get(1)?.split("/")
callback.invoke(
ExtractorLink(
this.name,
this.name,
"$mainUrl/api/file/${mId?.last() ?: return}?download",
url,
Qualities.Unknown.value,
)
)
}
}

View file

@ -1,45 +0,0 @@
package com.lagradost.cloudstream3.extractors
import com.fasterxml.jackson.annotation.JsonProperty
import com.lagradost.cloudstream3.app
import com.lagradost.cloudstream3.utils.AppUtils.tryParseJson
import com.lagradost.cloudstream3.utils.ExtractorApi
import com.lagradost.cloudstream3.utils.ExtractorLink
import com.lagradost.cloudstream3.utils.getQualityFromName
open class Solidfiles : ExtractorApi() {
override val name = "Solidfiles"
override val mainUrl = "https://www.solidfiles.com"
override val requiresReferer = false
override suspend fun getUrl(url: String, referer: String?): List<ExtractorLink> {
val sources = mutableListOf<ExtractorLink>()
with(app.get(url).document) {
this.select("script").map { script ->
if (script.data().contains("\"streamUrl\":")) {
val data = script.data().substringAfter("constant('viewerOptions', {").substringBefore("});")
val source = tryParseJson<ResponseSource>("{$data}")
val quality = Regex("\\d{3,4}p").find(source!!.nodeName)?.groupValues?.get(0)
sources.add(
ExtractorLink(
name,
name,
source.streamUrl,
referer = url,
quality = getQualityFromName(quality)
)
)
}
}
}
return sources
}
private data class ResponseSource(
@JsonProperty("streamUrl") val streamUrl: String,
@JsonProperty("nodeName") val nodeName: String
)
}

View file

@ -1,42 +0,0 @@
package com.lagradost.cloudstream3.extractors
import com.fasterxml.jackson.annotation.JsonProperty
import com.lagradost.cloudstream3.app
import com.lagradost.cloudstream3.utils.AppUtils.tryParseJson
import com.lagradost.cloudstream3.utils.ExtractorApi
import com.lagradost.cloudstream3.utils.ExtractorLink
import com.lagradost.cloudstream3.utils.M3u8Helper
class SpeedoStream1 : SpeedoStream() {
override val mainUrl = "https://speedostream.pm"
}
open class SpeedoStream : ExtractorApi() {
override val name = "SpeedoStream"
override val mainUrl = "https://speedostream.mom"
override val requiresReferer = true
override suspend fun getUrl(url: String, referer: String?): List<ExtractorLink> {
val sources = mutableListOf<ExtractorLink>()
app.get(url, referer = referer).document.select("script").map { script ->
if (script.data().contains("jwplayer(\"vplayer\").setup(")) {
val data = script.data().substringAfter("sources: [")
.substringBefore("],").replace("file", "\"file\"").trim()
tryParseJson<File>(data)?.let {
M3u8Helper.generateM3u8(
name,
it.file,
"$mainUrl/",
).forEach { m3uData -> sources.add(m3uData) }
}
}
}
return sources
}
private data class File(
@JsonProperty("file") val file: String,
)
}

View file

@ -1,42 +0,0 @@
package com.lagradost.cloudstream3.extractors
import com.lagradost.cloudstream3.app
import com.lagradost.cloudstream3.utils.ExtractorApi
import com.lagradost.cloudstream3.utils.ExtractorLink
import com.lagradost.cloudstream3.utils.Qualities
class StreamTapeNet : StreamTape() {
override var mainUrl = "https://streamtape.net"
}
class ShaveTape : StreamTape(){
override var mainUrl = "https://shavetape.cash"
}
open class StreamTape : ExtractorApi() {
override var name = "StreamTape"
override var mainUrl = "https://streamtape.com"
override val requiresReferer = false
private val linkRegex =
Regex("""'robotlink'\)\.innerHTML = '(.+?)'\+ \('(.+?)'\)""")
override suspend fun getUrl(url: String, referer: String?): List<ExtractorLink>? {
with(app.get(url)) {
linkRegex.find(this.text)?.let {
val extractedUrl =
"https:${it.groups[1]!!.value + it.groups[2]!!.value.substring(3)}"
return listOf(
ExtractorLink(
name,
name,
extractedUrl,
url,
Qualities.Unknown.value,
)
)
}
}
return null
}
}

View file

@ -1,42 +0,0 @@
package com.lagradost.cloudstream3.extractors
import com.fasterxml.jackson.annotation.JsonProperty
import com.lagradost.cloudstream3.app
import com.lagradost.cloudstream3.utils.AppUtils.tryParseJson
import com.lagradost.cloudstream3.utils.ExtractorApi
import com.lagradost.cloudstream3.utils.ExtractorLink
import com.lagradost.cloudstream3.utils.getAndUnpack
import com.lagradost.cloudstream3.utils.Qualities
import com.lagradost.cloudstream3.utils.M3u8Helper
open class StreamoUpload : ExtractorApi() {
override val name = "StreamoUpload"
override val mainUrl = "https://streamoupload.xyz"
override val requiresReferer = true
override suspend fun getUrl(url: String, referer: String?): List<ExtractorLink> {
val sources = mutableListOf<ExtractorLink>()
val response = app.get(url, referer = referer)
val scriptElements = response.document.select("script").map { script ->
if (script.data().contains("eval(function(p,a,c,k,e,d)")) {
val data = getAndUnpack(script.data())
.substringAfter("sources:[")
.substringBefore("],")
.replace("file", "\"file\"")
.trim()
tryParseJson<File>(data)?.let {
M3u8Helper.generateM3u8(
name,
it.file,
"$mainUrl/",
).forEach { m3uData -> sources.add(m3uData) }
}
}
}
return sources
}
private data class File(
@JsonProperty("file") val file: String,
)
}

View file

@ -1,42 +0,0 @@
package com.lagradost.cloudstream3.extractors
import com.fasterxml.jackson.annotation.JsonProperty
import com.lagradost.cloudstream3.utils.ExtractorLink
import com.lagradost.cloudstream3.app
import com.lagradost.cloudstream3.utils.*
import com.lagradost.cloudstream3.utils.AppUtils.parseJson
data class Files(
@JsonProperty("file") val id: String,
@JsonProperty("label") val label: String? = null,
)
open class Supervideo : ExtractorApi() {
override var name = "Supervideo"
override var mainUrl = "https://supervideo.tv"
override val requiresReferer = false
override suspend fun getUrl(url: String, referer: String?): List<ExtractorLink>? {
val extractedLinksList: MutableList<ExtractorLink> = mutableListOf()
val response = app.get(url).text
val jstounpack = Regex("eval((.|\\n)*?)</script>").find(response)?.groups?.get(1)?.value
val unpacjed = JsUnpacker(jstounpack).unpack()
val extractedUrl =
unpacjed?.let { Regex("""sources:((.|\n)*?)image""").find(it) }?.groups?.get(1)?.value.toString()
.replace("file", """"file"""").replace("label", """"label"""")
.substringBeforeLast(",")
val parsedlinks = parseJson<List<Files>>(extractedUrl)
parsedlinks.forEach { data ->
if (data.label.isNullOrBlank()) { // mp4 links (with labels) are slow. Use only m3u8 link.
M3u8Helper.generateM3u8(
name,
data.id,
url,
headers = mapOf("referer" to url)
).forEach { link ->
extractedLinksList.add(link)
}
}
}
return extractedLinksList
}
}

View file

@ -1,64 +0,0 @@
package com.lagradost.cloudstream3.extractors
import com.lagradost.cloudstream3.utils.*
import com.lagradost.cloudstream3.app
import com.fasterxml.jackson.annotation.JsonProperty
import com.fasterxml.jackson.module.kotlin.readValue
import com.lagradost.cloudstream3.USER_AGENT
import com.lagradost.cloudstream3.mapper
import com.lagradost.cloudstream3.utils.AppUtils.parseJson
class Cinestart: Tomatomatela() {
override var name: String = "Cinestart"
override val mainUrl: String = "https://cinestart.net"
override val details = "vr.php?v="
}
class TomatomatelalClub: Tomatomatela() {
override var name: String = "Tomatomatela"
override val mainUrl: String = "https://tomatomatela.club"
}
open class Tomatomatela : ExtractorApi() {
override var name = "Tomatomatela"
override val mainUrl = "https://tomatomatela.com"
override val requiresReferer = false
private data class Tomato (
@JsonProperty("status") val status: Int,
@JsonProperty("file") val file: String?
)
open val details = "details.php?v="
open val embeddetails = "/embed.html#"
override suspend fun getUrl(url: String, referer: String?): List<ExtractorLink>? {
val link = url.replace("$mainUrl$embeddetails","$mainUrl/$details")
val sources = ArrayList<ExtractorLink>()
val server = app.get(link, allowRedirects = false,
headers = mapOf(
"User-Agent" to USER_AGENT,
"Accept" to "application/json, text/javascript, */*; q=0.01",
"Accept-Language" to "en-US,en;q=0.5",
"X-Requested-With" to "XMLHttpRequest",
"DNT" to "1",
"Connection" to "keep-alive",
"Sec-Fetch-Dest" to "empty",
"Sec-Fetch-Mode" to "cors",
"Sec-Fetch-Site" to "same-origin"
)
).parsedSafe<Tomato>()
if (server?.file != null) {
sources.add(
ExtractorLink(
name,
name,
server.file,
"",
Qualities.Unknown.value,
isM3u8 = false
)
)
}
return sources
}
}

View file

@ -1,37 +0,0 @@
package com.lagradost.cloudstream3.extractors
import com.lagradost.cloudstream3.utils.*
import com.lagradost.cloudstream3.app
class Uqload1 : Uqload() {
override var mainUrl = "https://uqload.com"
}
class Uqload2 : Uqload() {
override var mainUrl = "https://uqload.co"
}
open class Uqload : ExtractorApi() {
override val name: String = "Uqload"
override val mainUrl: String = "https://www.uqload.com"
private val srcRegex = Regex("""sources:.\[(.*?)\]""") // would be possible to use the parse and find src attribute
override val requiresReferer = true
override suspend fun getUrl(url: String, referer: String?): List<ExtractorLink>? {
with(app.get(url)) { // raised error ERROR_CODE_PARSING_CONTAINER_UNSUPPORTED (3003) is due to the response: "error_nofile"
srcRegex.find(this.text)?.groupValues?.get(1)?.replace("\"", "")?.let { link ->
return listOf(
ExtractorLink(
name,
name,
link,
url,
Qualities.Unknown.value,
)
)
}
}
return null
}
}

View file

@ -1,100 +0,0 @@
package com.lagradost.cloudstream3.extractors
import com.lagradost.cloudstream3.SubtitleFile
import com.lagradost.cloudstream3.amap
import com.lagradost.cloudstream3.app
import com.lagradost.cloudstream3.utils.*
import kotlinx.coroutines.delay
import java.net.URI
class VidSrcExtractor2 : VidSrcExtractor() {
override val mainUrl = "https://vidsrc.me/embed"
override suspend fun getUrl(
url: String,
referer: String?,
subtitleCallback: (SubtitleFile) -> Unit,
callback: (ExtractorLink) -> Unit
) {
val newUrl = url.lowercase().replace(mainUrl, super.mainUrl)
super.getUrl(newUrl, referer, subtitleCallback, callback)
}
}
open class VidSrcExtractor : ExtractorApi() {
override val name = "VidSrc"
private val absoluteUrl = "https://v2.vidsrc.me"
override val mainUrl = "$absoluteUrl/embed"
override val requiresReferer = false
companion object {
/** Infinite function to validate the vidSrc pass */
suspend fun validatePass(url: String) {
val uri = URI(url)
val host = uri.host
// Basically turn https://tm3p.vidsrc.stream/ -> https://vidsrc.stream/
val referer = host.split(".").let {
val size = it.size
"https://" + it.subList(maxOf(0, size - 2), size).joinToString(".") + "/"
}
while (true) {
app.get(url, referer = referer)
delay(60_000)
}
}
}
override suspend fun getUrl(
url: String,
referer: String?,
subtitleCallback: (SubtitleFile) -> Unit,
callback: (ExtractorLink) -> Unit
) {
val iframedoc = app.get(url).document
val serverslist =
iframedoc.select("div#sources.button_content div#content div#list div").map {
val datahash = it.attr("data-hash")
if (datahash.isNotBlank()) {
val links = try {
app.get(
"$absoluteUrl/srcrcp/$datahash",
referer = "https://rcp.vidsrc.me/"
).url
} catch (e: Exception) {
""
}
links
} else ""
}
serverslist.amap { server ->
val linkfixed = server.replace("https://vidsrc.xyz/", "https://embedsito.com/")
if (linkfixed.contains("/prorcp")) {
val srcresponse = app.get(server, referer = absoluteUrl).text
val m3u8Regex = Regex("((https:|http:)//.*\\.m3u8)")
val srcm3u8 = m3u8Regex.find(srcresponse)?.value ?: return@amap
val passRegex = Regex("""['"](.*set_pass[^"']*)""")
val pass = passRegex.find(srcresponse)?.groupValues?.get(1)?.replace(
Regex("""^//"""), "https://"
)
callback.invoke(
ExtractorLink(
this.name,
this.name,
srcm3u8,
"https://vidsrc.stream/",
Qualities.Unknown.value,
extractorData = pass,
isM3u8 = true
)
)
} else {
loadExtractor(linkfixed, url, subtitleCallback, callback)
}
}
}
}

View file

@ -1,271 +0,0 @@
package com.lagradost.cloudstream3.extractors
import com.lagradost.cloudstream3.app
import com.lagradost.cloudstream3.utils.ExtractorApi
import com.lagradost.cloudstream3.utils.ExtractorLink
import com.lagradost.cloudstream3.utils.M3u8Helper.Companion.generateM3u8
import kotlinx.coroutines.delay
import java.math.BigInteger
class VideovardSX : WcoStream() {
override var mainUrl = "https://videovard.sx"
}
open class VideoVard : ExtractorApi() {
override var name = "Videovard" // Cause works for animekisa and wco
override var mainUrl = "https://videovard.to"
override val requiresReferer = false
//The following code was extracted from https://github.com/saikou-app/saikou/blob/main/app/src/main/java/ani/saikou/parsers/anime/extractors/VideoVard.kt
override suspend fun getUrl(url: String, referer: String?): List<ExtractorLink> {
val id = url.substringAfter("e/").substringBefore("/")
val sources = mutableListOf<ExtractorLink>()
val hash = app.get("$mainUrl/api/make/download/$id").parsed<HashResponse>()
delay(11_000)
val resm3u8 = app.post(
"$mainUrl/api/player/setup",
mapOf("Referer" to "$mainUrl/"),
data = mapOf(
"cmd" to "get_stream",
"file_code" to id,
"hash" to hash.hash!!
)
).parsed<SetupResponse>()
val m3u8 = decode(resm3u8.src!!, resm3u8.seed)
sources.addAll(
generateM3u8(
name,
m3u8,
mainUrl,
headers = mapOf("Referer" to mainUrl)
)
)
return sources
}
companion object {
private val big0 = 0.toBigInteger()
private val big3 = 3.toBigInteger()
private val big4 = 4.toBigInteger()
private val big15 = 15.toBigInteger()
private val big16 = 16.toBigInteger()
private val big255 = 255.toBigInteger()
private fun decode(dataFile: String, seed: String): String {
val dataSeed = replace(seed)
val newDataSeed = binaryDigest(dataSeed)
val newDataFile = bytes2blocks(ascii2bytes(dataFile))
var list = listOf(1633837924, 1650680933).map { it.toBigInteger() }
val xorList = mutableListOf<BigInteger>()
for (i in newDataFile.indices step 2) {
val temp = newDataFile.slice(i..i + 1)
xorList += xorBlocks(list, tearDecode(temp, newDataSeed))
list = temp
}
val result = replace(unPad(blocks2bytes(xorList)).map { it.toInt().toChar() }.joinToString(""))
return padLastChars(result)
}
private fun binaryDigest(input: String): List<BigInteger> {
val keys = listOf(1633837924, 1650680933, 1667523942, 1684366951).map { it.toBigInteger() }
var list1 = keys.slice(0..1)
var list2 = list1
val blocks = bytes2blocks(digestPad(input))
for (i in blocks.indices step 4) {
list1 = tearCode(xorBlocks(blocks.slice(i..i + 1), list1), keys).toMutableList()
list2 = tearCode(xorBlocks(blocks.slice(i + 2..i + 3), list2), keys).toMutableList()
val temp = list1[0]
list1[0] = list1[1]
list1[1] = list2[0]
list2[0] = list2[1]
list2[1] = temp
}
return listOf(list1[0], list1[1], list2[0], list2[1])
}
private fun tearDecode(a90: List<BigInteger>, a91: List<BigInteger>): MutableList<BigInteger> {
var (a95, a96) = a90
var a97 = (-957401312).toBigInteger()
for (_i in 0 until 32) {
a96 -= ((((a95 shl 4) xor rShift(a95, 5)) + a95) xor (a97 + a91[rShift(a97, 11).and(3.toBigInteger()).toInt()]))
a97 += 1640531527.toBigInteger()
a95 -= ((((a96 shl 4) xor rShift(a96, 5)) + a96) xor (a97 + a91[a97.and(3.toBigInteger()).toInt()]))
}
return mutableListOf(a95, a96)
}
private fun digestPad(string: String): List<BigInteger> {
val empList = mutableListOf<BigInteger>()
val length = string.length
val extra = big15 - (length.toBigInteger() % big16)
empList.add(extra)
for (i in 0 until length) {
empList.add(string[i].code.toBigInteger())
}
for (i in 0 until extra.toInt()) {
empList.add(big0)
}
return empList
}
private fun bytes2blocks(a22: List<BigInteger>): List<BigInteger> {
val empList = mutableListOf<BigInteger>()
val length = a22.size
var listIndex = 0
for (i in 0 until length) {
val subIndex = i % 4
val shiftedByte = a22[i] shl (3 - subIndex) * 8
if (subIndex == 0) {
empList.add(shiftedByte)
} else {
empList[listIndex] = empList[listIndex] or shiftedByte
}
if (subIndex == 3) listIndex += 1
}
return empList
}
private fun blocks2bytes(inp: List<BigInteger>): List<BigInteger> {
val tempList = mutableListOf<BigInteger>()
inp.indices.forEach { i ->
tempList += (big255 and rShift(inp[i], 24))
tempList += (big255 and rShift(inp[i], 16))
tempList += (big255 and rShift(inp[i], 8))
tempList += (big255 and inp[i])
}
return tempList
}
private fun unPad(a46: List<BigInteger>): List<BigInteger> {
val evenOdd = a46[0].toInt().mod(2)
return (1 until (a46.size - evenOdd)).map {
a46[it]
}
}
private fun xorBlocks(a76: List<BigInteger>, a77: List<BigInteger>): List<BigInteger> {
return listOf(a76[0] xor a77[0], a76[1] xor a77[1])
}
private fun rShift(input: BigInteger, by: Int): BigInteger {
return (input.mod(4294967296.toBigInteger()) shr by)
}
private fun tearCode(list1: List<BigInteger>, list2: List<BigInteger>): MutableList<BigInteger> {
var a1 = list1[0]
var a2 = list1[1]
var temp = big0
for (_i in 0 until 32) {
a1 += (a2 shl 4 xor rShift(a2, 5)) + a2 xor temp + list2[(temp and big3).toInt()]
temp -= 1640531527.toBigInteger()
a2 += (a1 shl 4 xor rShift(a1, 5)) + a1 xor temp + list2[(rShift(temp, 11) and big3).toInt()]
}
return mutableListOf(a1, a2)
}
private fun ascii2bytes(input: String): List<BigInteger> {
val abc = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"
val abcMap = abc.mapIndexed { i, c -> c to i.toBigInteger() }.toMap()
var index = -1
val length = input.length
var listIndex = 0
val bytes = mutableListOf<BigInteger>()
while (true) {
for (i in input) {
if (abc.contains(i)) {
index++
break
}
}
bytes.add((abcMap[input.getOrNull(index)?:return bytes]!! * big4))
while (true) {
index++
if (abc.contains(input[index])) {
break
}
}
var temp = abcMap[input[index]]!!
bytes[listIndex] = bytes[listIndex] or rShift(temp, 4)
listIndex++
temp = (big15.and(temp))
if ((temp == big0) && (index == (length - 1))) return bytes
bytes.add((temp * big4 * big4))
while (true) {
index++
if (index >= length) return bytes
if (abc.contains(input[index])) break
}
temp = abcMap[input[index]]!!
bytes[listIndex] = bytes[listIndex] or rShift(temp, 2)
listIndex++
temp = (big3 and temp)
if ((temp == big0) && (index == (length - 1))) {
return bytes
}
bytes.add((temp shl 6))
for (i in input) {
index++
if (abc.contains(input[index])) {
break
}
}
bytes[listIndex] = bytes[listIndex] or abcMap[input[index]]!!
listIndex++
}
}
private fun replace(a: String): String {
val map = mapOf(
'0' to '5',
'1' to '6',
'2' to '7',
'5' to '0',
'6' to '1',
'7' to '2'
)
var b = ""
a.forEach {
b += if (map.containsKey(it)) map[it] else it
}
return b
}
private fun padLastChars(input:String):String{
return if(input.reversed()[3].isDigit()) input
else input.dropLast(4)
}
private data class HashResponse(
val hash: String? = null,
val version:String? = null
)
private data class SetupResponse(
val seed: String,
val src: String?=null,
val link:String?=null
)
}
}

View file

@ -1,69 +0,0 @@
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<Source>(videoData)?.file?.let { m3uLink ->
M3u8Helper.generateM3u8(
name,
m3uLink,
"$mainUrl/"
).forEach(callback)
}
tryParseJson<List<SubSource>>("[${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,
)
}

View file

@ -1,101 +0,0 @@
package com.lagradost.cloudstream3.extractors
import com.lagradost.cloudstream3.SubtitleFile
import com.lagradost.cloudstream3.amap
import com.lagradost.cloudstream3.app
import com.lagradost.cloudstream3.argamap
import com.lagradost.cloudstream3.utils.ExtractorLink
import com.lagradost.cloudstream3.utils.extractorApis
import com.lagradost.cloudstream3.utils.getQualityFromName
import com.lagradost.cloudstream3.utils.loadExtractor
import org.jsoup.Jsoup
/**
* overrideMainUrl is necessary for for other vidstream clones like vidembed.cc
* If they diverge it'd be better to make them separate.
* */
class Vidstream(val mainUrl: String) {
val name: String = "Vidstream"
private fun getExtractorUrl(id: String): String {
return "$mainUrl/streaming.php?id=$id"
}
private fun getDownloadUrl(id: String): String {
return "$mainUrl/download?id=$id"
}
private val normalApis = arrayListOf(MultiQuality())
// https://gogo-stream.com/streaming.php?id=MTE3NDg5
suspend fun getUrl(
id: String,
isCasting: Boolean = false,
subtitleCallback: (SubtitleFile) -> Unit,
callback: (ExtractorLink) -> Unit,
): Boolean {
val extractorUrl = getExtractorUrl(id)
argamap(
{
normalApis.amap { api ->
val url = api.getExtractorUrl(id)
api.getSafeUrl(
url,
callback = callback,
subtitleCallback = subtitleCallback
)
}
}, {
/** Stolen from GogoanimeProvider.kt extractor */
val link = getDownloadUrl(id)
println("Generated vidstream download link: $link")
val page = app.get(link, referer = extractorUrl)
val pageDoc = Jsoup.parse(page.text)
val qualityRegex = Regex("(\\d+)P")
//a[download]
pageDoc.select(".dowload > a")?.amap { element ->
val href = element.attr("href") ?: return@amap
val qual = if (element.text()
.contains("HDP")
) "1080" else qualityRegex.find(element.text())?.destructured?.component1()
.toString()
if (!loadExtractor(href, link, subtitleCallback, callback)) {
callback.invoke(
ExtractorLink(
this.name,
name = this.name,
href,
page.url,
getQualityFromName(qual),
element.attr("href").contains(".m3u8")
)
)
}
}
}, {
with(app.get(extractorUrl)) {
val document = Jsoup.parse(this.text)
val primaryLinks = document.select("ul.list-server-items > li.linkserver")
//val extractedLinksList: MutableList<ExtractorLink> = mutableListOf()
// All vidstream links passed to extractors
primaryLinks.distinctBy { it.attr("data-video") }.forEach { element ->
val link = element.attr("data-video")
//val name = element.text()
// Matches vidstream links with extractors
extractorApis.filter { !it.requiresReferer || !isCasting }.amap { api ->
if (link.startsWith(api.mainUrl)) {
api.getSafeUrl(link, extractorUrl, subtitleCallback, callback)
}
}
}
}
}
)
return true
}
}

View file

@ -1,36 +0,0 @@
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
class Tubeless : Voe() {
override var mainUrl = "https://tubelessceliolymph.com"
}
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 script = res.select("script").find { it.data().contains("sources =") }?.data()
val link = Regex("[\"']hls[\"']:\\s*[\"'](.*)[\"']").find(script ?: return)?.groupValues?.get(1)
M3u8Helper.generateM3u8(
name,
link ?: return,
"$mainUrl/",
headers = mapOf("Origin" to "$mainUrl/")
).forEach(callback)
}
}

View file

@ -1,133 +0,0 @@
package com.lagradost.cloudstream3.extractors
import com.fasterxml.jackson.annotation.JsonProperty
import com.lagradost.cloudstream3.ErrorLoadingException
import com.lagradost.cloudstream3.extractors.helper.NineAnimeHelper.cipher
import com.lagradost.cloudstream3.extractors.helper.NineAnimeHelper.encrypt
import com.lagradost.cloudstream3.app
import com.lagradost.cloudstream3.utils.ExtractorApi
import com.lagradost.cloudstream3.utils.ExtractorLink
import com.lagradost.cloudstream3.utils.Qualities
class Vidstreamz : WcoStream() {
override var mainUrl = "https://vidstreamz.online"
}
class Vizcloud : WcoStream() {
override var mainUrl = "https://vizcloud2.ru"
}
class Vizcloud2 : WcoStream() {
override var mainUrl = "https://vizcloud2.online"
}
class VizcloudOnline : WcoStream() {
override var mainUrl = "https://vizcloud.online"
}
class VizcloudXyz : WcoStream() {
override var mainUrl = "https://vizcloud.xyz"
}
class VizcloudLive : WcoStream() {
override var mainUrl = "https://vizcloud.live"
}
class VizcloudInfo : WcoStream() {
override var mainUrl = "https://vizcloud.info"
}
class MwvnVizcloudInfo : WcoStream() {
override var mainUrl = "https://mwvn.vizcloud.info"
}
class VizcloudDigital : WcoStream() {
override var mainUrl = "https://vizcloud.digital"
}
class VizcloudCloud : WcoStream() {
override var mainUrl = "https://vizcloud.cloud"
}
class VizcloudSite : WcoStream() {
override var mainUrl = "https://vizcloud.site"
}
class Mcloud : WcoStream() {
override var name = "Mcloud"
override var mainUrl = "https://mcloud.to"
override val requiresReferer = true
}
open class WcoStream : ExtractorApi() {
override var name = "VidStream" // Cause works for animekisa and wco
override var mainUrl = "https://vidstream.pro"
override val requiresReferer = false
private val regex = Regex("(.+?/)e(?:mbed)?/([a-zA-Z0-9]+)")
companion object {
// taken from https://github.com/saikou-app/saikou/blob/b35364c8c2a00364178a472fccf1ab72f09815b4/app/src/main/java/ani/saikou/parsers/anime/extractors/VizCloud.kt
// GNU General Public License v3.0 https://github.com/saikou-app/saikou/blob/main/LICENSE.md
private var lastChecked = 0L
private const val jsonLink =
"https://raw.githubusercontent.com/chenkaslowankiya/BruhFlow/main/keys.json"
private var cipherKey: VizCloudKey? = null
suspend fun getKey(): VizCloudKey {
cipherKey =
if (cipherKey != null && (lastChecked - System.currentTimeMillis()) < 1000 * 60 * 30) cipherKey!!
else {
lastChecked = System.currentTimeMillis()
app.get(jsonLink).parsed()
}
return cipherKey!!
}
data class VizCloudKey(
@JsonProperty("cipherKey") val cipherKey: String,
@JsonProperty("mainKey") val mainKey: String,
@JsonProperty("encryptKey") val encryptKey: String,
@JsonProperty("dashTable") val dashTable: String
)
private const val baseTable =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+=/_"
private fun dashify(id: String, dashTable: String): String {
val table = dashTable.split(" ")
return id.mapIndexedNotNull { i, c ->
table.getOrNull((baseTable.indexOf(c) * 16) + (i % 16))
}.joinToString("-")
}
}
//private val key = "LCbu3iYC7ln24K7P" // key credits @Modder4869
override suspend fun getUrl(url: String, referer: String?): List<ExtractorLink> {
val group = regex.find(url)?.groupValues!!
val host = group[1]
val viz = getKey()
val id = encrypt(
cipher(
viz.cipherKey,
encrypt(group[2], viz.encryptKey).also { println(it) }
).also { println(it) },
viz.encryptKey
).also { println(it) }
val link =
"${host}mediainfo/${dashify(id, viz.dashTable)}?key=${viz.mainKey}" //
val response = app.get(link, referer = referer)
data class Sources(@JsonProperty("file") val file: String)
data class Media(@JsonProperty("sources") val sources: List<Sources>)
data class Data(@JsonProperty("media") val media: Media)
data class Response(@JsonProperty("data") val data: Data)
if (!response.text.startsWith("{")) throw ErrorLoadingException("Seems like 9Anime kiddies changed stuff again, Go touch some grass for bout an hour Or use a different Server")
return response.parsed<Response>().data.media.sources.map {
ExtractorLink(name, it.file,it.file,host,Qualities.Unknown.value,it.file.contains(".m3u8"))
}
}
}

View file

@ -1,88 +0,0 @@
package com.lagradost.cloudstream3.extractors
import com.lagradost.cloudstream3.SubtitleFile
import com.lagradost.cloudstream3.mvvm.logError
import com.lagradost.cloudstream3.utils.ExtractorApi
import com.lagradost.cloudstream3.utils.ExtractorLink
import com.lagradost.cloudstream3.utils.schemaStripRegex
import org.schabi.newpipe.extractor.ServiceList
import org.schabi.newpipe.extractor.services.youtube.extractors.YoutubeStreamExtractor
import org.schabi.newpipe.extractor.services.youtube.linkHandler.YoutubeStreamLinkHandlerFactory
import org.schabi.newpipe.extractor.stream.SubtitlesStream
import org.schabi.newpipe.extractor.stream.VideoStream
class YoutubeShortLinkExtractor : YoutubeExtractor() {
override val mainUrl = "https://youtu.be"
override fun getExtractorUrl(id: String): String {
return "$mainUrl/$id"
}
}
class YoutubeMobileExtractor : YoutubeExtractor() {
override val mainUrl = "https://m.youtube.com"
}
class YoutubeNoCookieExtractor : YoutubeExtractor() {
override val mainUrl = "https://www.youtube-nocookie.com"
}
open class YoutubeExtractor : ExtractorApi() {
override val mainUrl = "https://www.youtube.com"
override val requiresReferer = false
override val name = "YouTube"
companion object {
private var ytVideos: MutableMap<String, List<VideoStream>> = mutableMapOf()
private var ytVideosSubtitles: MutableMap<String, List<SubtitlesStream>> = mutableMapOf()
}
override fun getExtractorUrl(id: String): String {
return "$mainUrl/watch?v=$id"
}
override suspend fun getUrl(
url: String,
referer: String?,
subtitleCallback: (SubtitleFile) -> Unit,
callback: (ExtractorLink) -> Unit
) {
if (ytVideos[url].isNullOrEmpty()) {
val link =
YoutubeStreamLinkHandlerFactory.getInstance().fromUrl(
url.replace(
schemaStripRegex, ""
)
)
val s = object : YoutubeStreamExtractor(
ServiceList.YouTube,
link
) {
}
s.fetchPage()
ytVideos[url] = s.videoStreams
ytVideosSubtitles[url] = try {
s.subtitlesDefault.filterNotNull()
} catch (e: Exception) {
logError(e)
emptyList()
}
}
ytVideos[url]?.mapNotNull {
if (it.isVideoOnly || it.height <= 0) return@mapNotNull null
ExtractorLink(
this.name,
this.name,
it.url ?: return@mapNotNull null,
"",
it.height
)
}?.forEach(callback)
ytVideosSubtitles[url]?.mapNotNull {
SubtitleFile(it.languageTag ?: return@mapNotNull null, it.url ?: return@mapNotNull null)
}?.forEach(subtitleCallback)
}
}

View file

@ -1,76 +0,0 @@
package com.lagradost.cloudstream3.extractors
import com.fasterxml.jackson.annotation.JsonProperty
import com.lagradost.cloudstream3.APIHolder.getCaptchaToken
import com.lagradost.cloudstream3.ErrorLoadingException
import com.lagradost.cloudstream3.SubtitleFile
import com.lagradost.cloudstream3.app
import com.lagradost.cloudstream3.utils.AppUtils.tryParseJson
import com.lagradost.cloudstream3.utils.ExtractorApi
import com.lagradost.cloudstream3.utils.ExtractorLink
import com.lagradost.cloudstream3.utils.M3u8Helper
open class Zorofile : ExtractorApi() {
override val name = "Zorofile"
override val mainUrl = "https://zorofile.com"
override val requiresReferer = true
override suspend fun getUrl(
url: String,
referer: String?,
subtitleCallback: (SubtitleFile) -> Unit,
callback: (ExtractorLink) -> Unit
) {
val id = url.split("?").first().split("/").last()
val token = app.get(
url,
referer = referer
).document.select("button.g-recaptcha").attr("data-sitekey").let { captchaKey ->
getCaptchaToken(
url,
captchaKey,
referer = referer
)
} ?: throw ErrorLoadingException("can't bypass captcha")
val data = app.post(
"$mainUrl/dl",
data = mapOf(
"op" to "embed",
"file_code" to id,
"auto" to "1",
"referer" to "$referer/",
"g-recaptcha-response" to token
),
referer = url,
headers = mapOf(
"Accept" to "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8",
"Content-Type" to "application/x-www-form-urlencoded",
"Origin" to mainUrl,
"Sec-Fetch-Dest" to "iframe",
"Sec-Fetch-Mode" to "navigate",
"Sec-Fetch-Site" to "same-origin",
"Sec-Fetch-User" to "?1",
"Upgrade-Insecure-Requests" to "1",
)
).document.select("script").find { it.data().contains("var holaplayer;") }?.data()
?.substringAfter("sources: [")?.substringBefore("],")?.replace("src", "\"src\"")
?.replace("type", "\"type\"")
tryParseJson<Sources>("$data")?.let { res ->
return M3u8Helper.generateM3u8(
name,
res.src ?: return@let,
"$mainUrl/",
headers = mapOf(
"Origin" to mainUrl,
)
).forEach(callback)
}
}
private data class Sources(
@JsonProperty("src") val src: String? = null,
@JsonProperty("type") val type: String? = null,
)
}

View file

@ -1,73 +0,0 @@
package com.lagradost.cloudstream3.metaproviders
import com.lagradost.cloudstream3.*
import com.lagradost.cloudstream3.LoadResponse.Companion.addAniListId
import com.lagradost.cloudstream3.LoadResponse.Companion.addTrailer
import com.lagradost.cloudstream3.syncproviders.AccountManager.Companion.aniListApi
import com.lagradost.cloudstream3.syncproviders.SyncAPI
import com.lagradost.cloudstream3.syncproviders.providers.AniListApi
import com.lagradost.cloudstream3.syncproviders.providers.MALApi
import com.lagradost.cloudstream3.utils.SyncUtil
// wont be implemented
class MultiAnimeProvider : MainAPI() {
override var name = "MultiAnime"
override var lang = "en"
override val usesWebView = true
override val supportedTypes = setOf(TvType.Anime)
private val syncApi: SyncAPI = aniListApi
private val syncUtilType by lazy {
when (syncApi) {
is AniListApi -> "anilist"
is MALApi -> "myanimelist"
else -> throw ErrorLoadingException("Invalid Api")
}
}
private val validApis
get() =
synchronized(APIHolder.apis) {
APIHolder.apis.filter {
it.lang == this.lang && it::class.java != this::class.java && it.supportedTypes.contains(
TvType.Anime
)
}
}
private fun filterName(name: String): String {
return Regex("""[^a-zA-Z0-9-]""").replace(name, "")
}
override suspend fun search(query: String): List<SearchResponse>? {
return syncApi.search(query)?.map {
AnimeSearchResponse(it.name, it.url, this.name, TvType.Anime, it.posterUrl)
}
}
override suspend fun load(url: String): LoadResponse? {
return syncApi.getResult(url)?.let { res ->
val data = SyncUtil.getUrlsFromId(res.id, syncUtilType).amap { url ->
validApis.firstOrNull { api -> url.startsWith(api.mainUrl) }?.load(url)
}.filterNotNull()
val type =
if (data.any { it.type == TvType.AnimeMovie }) TvType.AnimeMovie else TvType.Anime
newAnimeLoadResponse(
res.title ?: throw ErrorLoadingException("No Title found"),
url,
type
) {
posterUrl = res.posterUrl
plot = res.synopsis
tags = res.genres
rating = res.publicScore
addTrailer(res.trailers)
addAniListId(res.id.toIntOrNull())
recommendations = res.recommendations
}
}
}
}

Some files were not shown because too many files have changed in this diff Show more