Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
48 commits
Select commit Hold shift + click to select a range
12de924
updating vidplay encryption method (#1202)
RowdyRushya Jul 19, 2024
63465ed
fix autohide
fire-light42 Jul 19, 2024
073af50
fixed html plot in preview
fire-light42 Jul 19, 2024
bb8144a
feat(TV UI): Player's Top controls redesign (#1203)
KingLucius Jul 19, 2024
4c7379c
Revert #979 Episode download cache
fire-light42 Jul 20, 2024
0c418fd
Updated VidSrc encryption methods (#1205)
RowdyRushya Jul 20, 2024
c8a863e
Fixed ExampleInstrumentedTest
fire-light42 Jul 24, 2024
dfd1272
Trailers Fix (#1213)
KingLucius Jul 25, 2024
e3ff1cf
feat(UI): Show Episode Runtime (#1207)
KingLucius Jul 25, 2024
15d2d21
Add the option to hide video controls (#1210)
epireyn Jul 25, 2024
2fc279f
Bump 4.4.0
LagradOst Jul 25, 2024
a28ee41
Fix for navigation UI bug (#1220)
Luna712 Jul 28, 2024
0aa48f3
Fix subscription icon displaying for movie types in result previews (…
Luna712 Jul 28, 2024
04dda00
Clean up and mark questionable code issues (#1209)
epireyn Jul 28, 2024
82f8ab4
Fix prerelease test function
fire-light42 Jul 28, 2024
150ad5f
Add sorting by release date (#1206)
epireyn Jul 28, 2024
b2f0884
Add system dark theme (#1208)
epireyn Jul 28, 2024
63e27c2
Fix Trailers on API<33 (#1226)
KingLucius Jul 30, 2024
30adb1c
fixed: Test Search & VidMoxy, RapidVid extractors (#1219)
keyiflerolsun Jul 30, 2024
8fcb3e3
Fix cast recycler scrolling (#1221)
Luna712 Jul 30, 2024
ab379ab
Support for multi deleting downloads and other major improvements/fix…
Luna712 Jul 30, 2024
5012821
[skip ci] add trailing nline to strings to be consistent with weblate
C10udburst Jul 31, 2024
14dd418
Update build.gradle.kts (#1240)
CranberrySoup Aug 1, 2024
60e3c48
Helper Added: CryptoJS (#1237)
keyiflerolsun Aug 1, 2024
aac2311
Fix TV focus issues for add repo input (#1239)
Luna712 Aug 1, 2024
ff29fe6
chore(locales): fix locale issues
recloudstream[bot] Aug 1, 2024
7f1cba9
Translated using Weblate (Ukrainian)
weblate Aug 1, 2024
67e278b
chore(locales): fix locale issues
recloudstream[bot] Aug 2, 2024
ad727b9
[skip ci] match weblate xml style
C10udburst Aug 2, 2024
6f52282
Update translation files
weblate Aug 2, 2024
15b5013
chore(locales): fix locale issues
recloudstream[bot] Aug 2, 2024
7936ccf
Update FcastManager.kt (#1244)
CranberrySoup Aug 2, 2024
4d9a080
Create jitpack.yml (#1248)
CranberrySoup Aug 4, 2024
f6a65f3
Add support for Next Episode in downloads (#1228)
Luna712 Aug 5, 2024
77dc9f7
Add support for progress on header downloads (#1238)
Luna712 Aug 5, 2024
fcac197
Update VidSrcTo.kt Domain Changed (#1257)
phisher98 Aug 7, 2024
c4ccc5d
feat(ui): settings for thumbnail on seekbar (#1256)
int3debug Aug 8, 2024
4d3ab40
Updated SuperVideo extractor url from supervideo.tv to supervideo.cc …
Gian-Fr Aug 12, 2024
cd44465
rebased from upstream
3a4oT Aug 12, 2024
8e23862
updated README
3a4oT Jul 18, 2024
0498ffd
added prebuild repository.
3a4oT Jul 18, 2024
db67c89
replace repo path for in app updater and config files.
3a4oT Jul 18, 2024
8492c47
try to set default
3a4oT Jul 18, 2024
872ee4b
Updated README.md
3a4oT Jul 18, 2024
2aa4160
updated app version
3a4oT Jul 18, 2024
b828733
updated app README.md
3a4oT Jul 19, 2024
85b5192
updated app README.md
3a4oT Jul 19, 2024
ae26b21
updated app README.md
3a4oT Jul 19, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/ISSUE_TEMPLATE/application-bug.yml
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ body:
required: true
- label: I have written a short but informative title.
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/3a4oT/cloudstream/releases)**.
required: true
- label: I will fill out all of the requested information in this form.
required: true
4 changes: 4 additions & 0 deletions .github/locales.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import re
import glob
import requests
import os
import lxml.etree as ET # builtin library doesn't preserve comments


Expand Down Expand Up @@ -61,5 +62,8 @@
with open(file, 'wb') as fp:
fp.write(b'<?xml version="1.0" encoding="utf-8"?>\n')
tree.write(fp, encoding="utf-8", method="xml", pretty_print=True, xml_declaration=False)
# Remove trailing new line to be consistent with weblate
fp.seek(-1, os.SEEK_END)
fp.truncate()
except ET.ParseError as ex:
print(f"[{file}] {ex}")
27 changes: 13 additions & 14 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,19 +1,18 @@
# CloudStream
# Модифікований клієнт [CloudStream](https://github.com/recloudstream/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.**
<img src="https://github.com/user-attachments/assets/2fe0a7f3-abc1-484f-b062-016080b499d6" width="800">

## 📖 Що це таке?
Це спеціальна програма для OS Android iз запропонованим розширенням (ви самі маєте вирішити чи активувати запропоноване розширення) для перегляду фільмів, серіалів та аніме в якісному українському дубляжу від різних постачальників в стрімінговій програмі [Cloudstream](https://github.com/recloudstream/cloudstream). Підтримує AndroidTV

[![Discord](https://invidget.switchblade.xyz/5Hus6fM)](https://discord.gg/5Hus6fM)
## 👨🏻‍🔧 Як завантажити?
Можна [завантажити APK файл](https://github.com/3a4oT/cloudstream/releases/download/4.3.333/stream-UKR-4-3-333.apk). Або зібрати самому із вихідного коду.

### Features:
+ **AdFree**, No ads whatsoever
+ No tracking/analytics
+ Bookmarks
+ Phone and TV support
+ Chromecast
+ Extension system for personal customization
## ⚙️ Активація розширення
При першому запуску, у вас з'явиться екран налаштування. Після вибору мови, ви потрапите на екран `Розширення` де буде опція під назвою - **"піратити - це погано, ризикуєш? :)"**. Все що вам потрібно - це натиснути на кнопку завантаження, розширення встановиться автоматично. (якщо пропустили цей екран - перейдіть в `Додаток -> Параметри -> Розширення`)

## 🇺🇦 Як відрізняється від оригінального клієнта **CloudStream**
- Вирізані всі локалізації окрім української та англійської
- Модифіковно розширення за замовчуванням. Використано форк розширення від [CakesTwix](https://github.com/CakesTwix/cloudstream-extensions-uk). Велика дяка за роботу :))
- Змінено URL для функції автооновлення.

### Supported languages:
<a href="https://hosted.weblate.org/engage/cloudstream/">
<img src="https://hosted.weblate.org/widgets/cloudstream/-/app/multi-auto.svg" alt="Translation status" />
</a>
4 changes: 2 additions & 2 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ android {
targetSdk = 33 /* Android 14 is Fu*ked
^ https://developer.android.com/about/versions/14/behavior-changes-14#safer-dynamic-code-loading*/
versionCode = 63
versionName = "4.3.2"
versionName = "4.3.333"

resValue("string", "app_version", "${defaultConfig.versionName}${versionNameSuffix ?: ""}")
resValue("string", "commit_hash", "git rev-parse --short HEAD".execute() ?: "")
Expand Down Expand Up @@ -290,7 +290,7 @@ tasks.withType<DokkaTask>().configureEach {
localDirectory.set(file("src/main/java"))

// URL showing where the source code can be accessed through the web browser
remoteUrl.set(URL("https://github.com/recloudstream/cloudstream/tree/master/app/src/main/java"))
remoteUrl.set(URL("https://github.com/3a4oT/cloudstream/tree/master/app/src/main/java"))

// Suffix which is used to append the line number to the URL. Use #L for GitHub
remoteLineSuffix.set("#L")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -154,7 +154,7 @@ class ExampleInstrumentedTest {
fun providerCorrectHomepage() {
runBlocking {
getAllProviders().toList().amap { api ->
TestingUtils.testHomepage(api, ::println)
TestingUtils.testHomepage(api, TestingUtils.Logger())
}
}
println("Done providerCorrectHomepage")
Expand All @@ -166,7 +166,6 @@ class ExampleInstrumentedTest {
TestingUtils.getDeferredProviderTests(
this,
getAllProviders(),
::println
) { _, _ -> }
}
}
Expand Down
2 changes: 1 addition & 1 deletion app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@
-->
<activity
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:launchMode="singleTask"
android:resizeableActivity="true"
Expand Down
12 changes: 3 additions & 9 deletions app/src/main/java/com/lagradost/cloudstream3/AcraApplication.kt
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ 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

Expand Down Expand Up @@ -81,14 +82,8 @@ class ExceptionHandler(val errorFile: File, val onError: (() -> Unit)) :
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
)
)
ps.println("Currently loading extension: ${PluginManager.currentlyLoading ?: "none"}")
ps.println("Fatal exception on thread ${thread.name} (${thread.id})")
error.printStackTrace(ps)
}
} catch (ignored: FileNotFoundException) {
Expand All @@ -106,7 +101,6 @@ 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))
Expand Down
44 changes: 27 additions & 17 deletions app/src/main/java/com/lagradost/cloudstream3/CommonActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import android.app.Activity
import android.app.PictureInPictureParams
import android.content.Context
import android.content.pm.PackageManager
import android.content.res.Configuration
import android.content.res.Resources
import android.os.Build
import android.util.DisplayMetrics
Expand Down Expand Up @@ -164,7 +165,7 @@ object CommonActivity {
val toast = Toast(act)
toast.duration = duration ?: Toast.LENGTH_SHORT
toast.setGravity(Gravity.CENTER_HORIZONTAL or Gravity.BOTTOM, 0, 5.toPx)
toast.view = binding.root
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
toast.show()

Expand Down Expand Up @@ -276,12 +277,35 @@ object CommonActivity {
}
}

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
}
}

fun loadThemes(act: Activity?) {
if (act == null) return
val settingsManager = PreferenceManager.getDefaultSharedPreferences(act)

val currentTheme =
when (settingsManager.getString(act.getString(R.string.app_theme_key), "AmoledLight")) {
"System" -> mapSystemTheme(act)
"Black" -> R.style.AppTheme
"Light" -> R.style.LightMode
"Amoled" -> R.style.AmoledMode
Expand Down Expand Up @@ -352,8 +376,8 @@ object CommonActivity {
currentLook = currentLook.parent as? View ?: break
}*/

private fun View.hasContent() : Boolean {
return isShown && when(this) {
private fun View.hasContent(): Boolean {
return isShown && when (this) {
//is RecyclerView -> this.childCount > 0
is ViewGroup -> this.childCount > 0
else -> true
Expand Down Expand Up @@ -464,20 +488,6 @@ object CommonActivity {


fun onKeyDown(act: Activity?, keyCode: Int, event: KeyEvent?) {
//println("Keycode: $keyCode")
//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) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import java.util.concurrent.TimeUnit


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 {
val httpMethod: String = request.httpMethod()
val url: String = request.url()
Expand Down Expand Up @@ -74,8 +74,4 @@ class DownloaderTestImpl private constructor(builder: OkHttpClient.Builder) : Do
return instance
}
}

init {
client = builder.readTimeout(30, TimeUnit.SECONDS).build()
}
}
Loading