mirror of
https://github.com/recloudstream/cloudstream.git
synced 2024-08-15 01:53:11 +00:00
Ported more files
This commit is contained in:
parent
e6b9d621f9
commit
c1c4763044
12 changed files with 160 additions and 127 deletions
|
@ -29,6 +29,7 @@ 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.AcraApplication.Companion.getKey
|
||||||
import com.lagradost.cloudstream3.AcraApplication.Companion.removeKey
|
import com.lagradost.cloudstream3.AcraApplication.Companion.removeKey
|
||||||
|
import com.lagradost.cloudstream3.MainActivity.Companion.resumeApps
|
||||||
import com.lagradost.cloudstream3.databinding.ToastBinding
|
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.ui.player.PlayerEventType
|
||||||
|
|
|
@ -31,13 +31,6 @@ import java.text.SimpleDateFormat
|
||||||
import java.util.*
|
import java.util.*
|
||||||
import kotlin.math.absoluteValue
|
import kotlin.math.absoluteValue
|
||||||
|
|
||||||
const val USER_AGENT =
|
|
||||||
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36"
|
|
||||||
|
|
||||||
//val baseHeader = mapOf("User-Agent" to USER_AGENT)
|
|
||||||
val mapper = JsonMapper.builder().addModule(kotlinModule())
|
|
||||||
.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false).build()!!
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Defines the constant for the all languages preference, if this is set then it is
|
* Defines the constant for the all languages preference, if this is set then it is
|
||||||
* the equivalent of all languages being set
|
* the equivalent of all languages being set
|
||||||
|
|
|
@ -161,8 +161,6 @@ import com.lagradost.cloudstream3.utils.UIHelper.requestRW
|
||||||
import com.lagradost.cloudstream3.utils.UIHelper.toPx
|
import com.lagradost.cloudstream3.utils.UIHelper.toPx
|
||||||
import com.lagradost.cloudstream3.utils.USER_PROVIDER_API
|
import com.lagradost.cloudstream3.utils.USER_PROVIDER_API
|
||||||
import com.lagradost.cloudstream3.utils.USER_SELECTED_HOMEPAGE_API
|
import com.lagradost.cloudstream3.utils.USER_SELECTED_HOMEPAGE_API
|
||||||
import com.lagradost.nicehttp.Requests
|
|
||||||
import com.lagradost.nicehttp.ResponseParser
|
|
||||||
import com.lagradost.safefile.SafeFile
|
import com.lagradost.safefile.SafeFile
|
||||||
import kotlinx.coroutines.sync.Mutex
|
import kotlinx.coroutines.sync.Mutex
|
||||||
import kotlinx.coroutines.sync.withLock
|
import kotlinx.coroutines.sync.withLock
|
||||||
|
@ -173,7 +171,6 @@ import java.net.URLDecoder
|
||||||
import java.nio.charset.Charset
|
import java.nio.charset.Charset
|
||||||
import kotlin.math.abs
|
import kotlin.math.abs
|
||||||
import kotlin.math.absoluteValue
|
import kotlin.math.absoluteValue
|
||||||
import kotlin.reflect.KClass
|
|
||||||
import kotlin.system.exitProcess
|
import kotlin.system.exitProcess
|
||||||
|
|
||||||
//https://github.com/videolan/vlc-android/blob/3706c4be2da6800b3d26344fc04fab03ffa4b860/application/vlc-android/src/org/videolan/vlc/gui/video/VideoPlayerActivity.kt#L1898
|
//https://github.com/videolan/vlc-android/blob/3706c4be2da6800b3d26344fc04fab03ffa4b860/application/vlc-android/src/org/videolan/vlc/gui/video/VideoPlayerActivity.kt#L1898
|
||||||
|
@ -186,117 +183,93 @@ import kotlin.system.exitProcess
|
||||||
|
|
||||||
//https://github.com/jellyfin/jellyfin-android/blob/6cbf0edf84a3da82347c8d59b5d5590749da81a9/app/src/main/java/org/jellyfin/mobile/bridge/ExternalPlayer.kt#L225
|
//https://github.com/jellyfin/jellyfin-android/blob/6cbf0edf84a3da82347c8d59b5d5590749da81a9/app/src/main/java/org/jellyfin/mobile/bridge/ExternalPlayer.kt#L225
|
||||||
|
|
||||||
const val VLC_PACKAGE = "org.videolan.vlc"
|
|
||||||
const val MPV_PACKAGE = "is.xyz.mpv"
|
|
||||||
const val WEB_VIDEO_CAST_PACKAGE = "com.instantbits.cast.webvideo"
|
|
||||||
|
|
||||||
val VLC_COMPONENT = ComponentName(VLC_PACKAGE, "$VLC_PACKAGE.gui.video.VideoPlayerActivity")
|
|
||||||
val MPV_COMPONENT = ComponentName(MPV_PACKAGE, "$MPV_PACKAGE.MPVActivity")
|
|
||||||
|
|
||||||
//TODO REFACTOR AF
|
|
||||||
open class ResultResume(
|
|
||||||
val packageString: String,
|
|
||||||
val action: String = Intent.ACTION_VIEW,
|
|
||||||
val position: String? = null,
|
|
||||||
val duration: String? = null,
|
|
||||||
var launcher: ActivityResultLauncher<Intent>? = null,
|
|
||||||
) {
|
|
||||||
val defaultTime = -1L
|
|
||||||
|
|
||||||
val lastId get() = "${packageString}_last_open_id"
|
|
||||||
suspend fun launch(id: Int?, callback: suspend Intent.() -> Unit) {
|
|
||||||
val intent = Intent(action)
|
|
||||||
|
|
||||||
if (id != null)
|
|
||||||
setKey(lastId, id)
|
|
||||||
else
|
|
||||||
removeKey(lastId)
|
|
||||||
|
|
||||||
intent.setPackage(packageString)
|
|
||||||
callback.invoke(intent)
|
|
||||||
launcher?.launch(intent)
|
|
||||||
}
|
|
||||||
|
|
||||||
open fun getPosition(intent: Intent?): Long {
|
|
||||||
return defaultTime
|
|
||||||
}
|
|
||||||
|
|
||||||
open fun getDuration(intent: Intent?): Long {
|
|
||||||
return defaultTime
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
val VLC = object : ResultResume(
|
|
||||||
VLC_PACKAGE,
|
|
||||||
// Android 13 intent restrictions fucks up specifically launching the VLC player
|
|
||||||
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) {
|
|
||||||
"org.videolan.vlc.player.result"
|
|
||||||
} else {
|
|
||||||
Intent.ACTION_VIEW
|
|
||||||
},
|
|
||||||
"extra_position",
|
|
||||||
"extra_duration",
|
|
||||||
) {
|
|
||||||
override fun getPosition(intent: Intent?): Long {
|
|
||||||
return intent?.getLongExtra(this.position, defaultTime) ?: defaultTime
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getDuration(intent: Intent?): Long {
|
|
||||||
return intent?.getLongExtra(this.duration, defaultTime) ?: defaultTime
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
val MPV = object : ResultResume(
|
|
||||||
MPV_PACKAGE,
|
|
||||||
//"is.xyz.mpv.MPVActivity.result", // resume not working :pensive:
|
|
||||||
position = "position",
|
|
||||||
duration = "duration",
|
|
||||||
) {
|
|
||||||
override fun getPosition(intent: Intent?): Long {
|
|
||||||
return intent?.getIntExtra(this.position, defaultTime.toInt())?.toLong() ?: defaultTime
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getDuration(intent: Intent?): Long {
|
|
||||||
return intent?.getIntExtra(this.duration, defaultTime.toInt())?.toLong() ?: defaultTime
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
val WEB_VIDEO = ResultResume(WEB_VIDEO_CAST_PACKAGE)
|
|
||||||
|
|
||||||
val resumeApps = arrayOf(
|
|
||||||
VLC, MPV, WEB_VIDEO
|
|
||||||
)
|
|
||||||
|
|
||||||
// Short name for requests client to make it nicer to use
|
|
||||||
|
|
||||||
var app = Requests(responseParser = object : ResponseParser {
|
|
||||||
val mapper: ObjectMapper = jacksonObjectMapper().configure(
|
|
||||||
DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,
|
|
||||||
false
|
|
||||||
)
|
|
||||||
|
|
||||||
override fun <T : Any> parse(text: String, kClass: KClass<T>): T {
|
|
||||||
return mapper.readValue(text, kClass.java)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun <T : Any> parseSafe(text: String, kClass: KClass<T>): T? {
|
|
||||||
return try {
|
|
||||||
mapper.readValue(text, kClass.java)
|
|
||||||
} catch (e: Exception) {
|
|
||||||
null
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun writeValueAsString(obj: Any): String {
|
|
||||||
return mapper.writeValueAsString(obj)
|
|
||||||
}
|
|
||||||
}).apply {
|
|
||||||
defaultHeaders = mapOf("user-agent" to USER_AGENT)
|
|
||||||
}
|
|
||||||
|
|
||||||
class MainActivity : AppCompatActivity(), ColorPickerDialogListener,
|
class MainActivity : AppCompatActivity(), ColorPickerDialogListener,
|
||||||
BiometricAuthenticator.BiometricAuthCallback {
|
BiometricAuthenticator.BiometricAuthCallback {
|
||||||
companion object {
|
companion object {
|
||||||
|
const val VLC_PACKAGE = "org.videolan.vlc"
|
||||||
|
const val MPV_PACKAGE = "is.xyz.mpv"
|
||||||
|
const val WEB_VIDEO_CAST_PACKAGE = "com.instantbits.cast.webvideo"
|
||||||
|
|
||||||
|
val VLC_COMPONENT = ComponentName(VLC_PACKAGE, "$VLC_PACKAGE.gui.video.VideoPlayerActivity")
|
||||||
|
val MPV_COMPONENT = ComponentName(MPV_PACKAGE, "$MPV_PACKAGE.MPVActivity")
|
||||||
|
|
||||||
|
//TODO REFACTOR AF
|
||||||
|
open class ResultResume(
|
||||||
|
val packageString: String,
|
||||||
|
val action: String = Intent.ACTION_VIEW,
|
||||||
|
val position: String? = null,
|
||||||
|
val duration: String? = null,
|
||||||
|
var launcher: ActivityResultLauncher<Intent>? = null,
|
||||||
|
) {
|
||||||
|
val defaultTime = -1L
|
||||||
|
|
||||||
|
val lastId get() = "${packageString}_last_open_id"
|
||||||
|
suspend fun launch(id: Int?, callback: suspend Intent.() -> Unit) {
|
||||||
|
val intent = Intent(action)
|
||||||
|
|
||||||
|
if (id != null)
|
||||||
|
setKey(lastId, id)
|
||||||
|
else
|
||||||
|
removeKey(lastId)
|
||||||
|
|
||||||
|
intent.setPackage(packageString)
|
||||||
|
callback.invoke(intent)
|
||||||
|
launcher?.launch(intent)
|
||||||
|
}
|
||||||
|
|
||||||
|
open fun getPosition(intent: Intent?): Long {
|
||||||
|
return defaultTime
|
||||||
|
}
|
||||||
|
|
||||||
|
open fun getDuration(intent: Intent?): Long {
|
||||||
|
return defaultTime
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val VLC = object : ResultResume(
|
||||||
|
VLC_PACKAGE,
|
||||||
|
// Android 13 intent restrictions fucks up specifically launching the VLC player
|
||||||
|
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) {
|
||||||
|
"org.videolan.vlc.player.result"
|
||||||
|
} else {
|
||||||
|
Intent.ACTION_VIEW
|
||||||
|
},
|
||||||
|
"extra_position",
|
||||||
|
"extra_duration",
|
||||||
|
) {
|
||||||
|
override fun getPosition(intent: Intent?): Long {
|
||||||
|
return intent?.getLongExtra(this.position, defaultTime) ?: defaultTime
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getDuration(intent: Intent?): Long {
|
||||||
|
return intent?.getLongExtra(this.duration, defaultTime) ?: defaultTime
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val MPV = object : ResultResume(
|
||||||
|
MPV_PACKAGE,
|
||||||
|
//"is.xyz.mpv.MPVActivity.result", // resume not working :pensive:
|
||||||
|
position = "position",
|
||||||
|
duration = "duration",
|
||||||
|
) {
|
||||||
|
override fun getPosition(intent: Intent?): Long {
|
||||||
|
return intent?.getIntExtra(this.position, defaultTime.toInt())?.toLong()
|
||||||
|
?: defaultTime
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getDuration(intent: Intent?): Long {
|
||||||
|
return intent?.getIntExtra(this.duration, defaultTime.toInt())?.toLong()
|
||||||
|
?: defaultTime
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val WEB_VIDEO = ResultResume(WEB_VIDEO_CAST_PACKAGE)
|
||||||
|
|
||||||
|
val resumeApps = arrayOf(
|
||||||
|
VLC, MPV, WEB_VIDEO
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
const val TAG = "MAINACT"
|
const val TAG = "MAINACT"
|
||||||
const val ANIMATED_OUTLINE: Boolean = false
|
const val ANIMATED_OUTLINE: Boolean = false
|
||||||
var lastError: String? = null
|
var lastError: String? = null
|
||||||
|
@ -1402,7 +1375,7 @@ class MainActivity : AppCompatActivity(), ColorPickerDialogListener,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
observe(viewModel.watchStatus,::setWatchStatus)
|
observe(viewModel.watchStatus, ::setWatchStatus)
|
||||||
observe(syncViewModel.userData, ::setUserData)
|
observe(syncViewModel.userData, ::setUserData)
|
||||||
observeNullable(viewModel.subscribeStatus, ::setSubscribeStatus)
|
observeNullable(viewModel.subscribeStatus, ::setSubscribeStatus)
|
||||||
|
|
||||||
|
@ -1828,7 +1801,7 @@ class MainActivity : AppCompatActivity(), ColorPickerDialogListener,
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onAuthenticationError() {
|
override fun onAuthenticationError() {
|
||||||
finish()
|
finish()
|
||||||
}
|
}
|
||||||
|
|
||||||
private var backPressedCallback: OnBackPressedCallback? = null
|
private var backPressedCallback: OnBackPressedCallback? = null
|
||||||
|
|
|
@ -29,6 +29,14 @@ import com.lagradost.cloudstream3.LoadResponse.Companion.addTrailer
|
||||||
import com.lagradost.cloudstream3.LoadResponse.Companion.getAniListId
|
import com.lagradost.cloudstream3.LoadResponse.Companion.getAniListId
|
||||||
import com.lagradost.cloudstream3.LoadResponse.Companion.getMalId
|
import com.lagradost.cloudstream3.LoadResponse.Companion.getMalId
|
||||||
import com.lagradost.cloudstream3.LoadResponse.Companion.isMovie
|
import com.lagradost.cloudstream3.LoadResponse.Companion.isMovie
|
||||||
|
import com.lagradost.cloudstream3.MainActivity.Companion.MPV
|
||||||
|
import com.lagradost.cloudstream3.MainActivity.Companion.MPV_COMPONENT
|
||||||
|
import com.lagradost.cloudstream3.MainActivity.Companion.MPV_PACKAGE
|
||||||
|
import com.lagradost.cloudstream3.MainActivity.Companion.VLC
|
||||||
|
import com.lagradost.cloudstream3.MainActivity.Companion.VLC_COMPONENT
|
||||||
|
import com.lagradost.cloudstream3.MainActivity.Companion.VLC_PACKAGE
|
||||||
|
import com.lagradost.cloudstream3.MainActivity.Companion.WEB_VIDEO
|
||||||
|
import com.lagradost.cloudstream3.MainActivity.Companion.WEB_VIDEO_CAST_PACKAGE
|
||||||
import com.lagradost.cloudstream3.metaproviders.SyncRedirector
|
import com.lagradost.cloudstream3.metaproviders.SyncRedirector
|
||||||
import com.lagradost.cloudstream3.mvvm.*
|
import com.lagradost.cloudstream3.mvvm.*
|
||||||
import com.lagradost.cloudstream3.syncproviders.AccountManager
|
import com.lagradost.cloudstream3.syncproviders.AccountManager
|
||||||
|
@ -1345,7 +1353,7 @@ class ResultViewModel2 : ViewModel() {
|
||||||
|
|
||||||
private fun launchActivity(
|
private fun launchActivity(
|
||||||
activity: Activity?,
|
activity: Activity?,
|
||||||
resumeApp: ResultResume,
|
resumeApp: MainActivity.Companion.ResultResume,
|
||||||
id: Int? = null,
|
id: Int? = null,
|
||||||
work: suspend (Intent.(Activity) -> Unit)
|
work: suspend (Intent.(Activity) -> Unit)
|
||||||
): Job? {
|
): Job? {
|
||||||
|
|
|
@ -0,0 +1,11 @@
|
||||||
|
package com.lagradost.cloudstream3.utils
|
||||||
|
|
||||||
|
import android.os.Handler
|
||||||
|
import android.os.Looper
|
||||||
|
|
||||||
|
actual fun runOnMainThreadNative(work: () -> Unit) {
|
||||||
|
val mainHandler = Handler(Looper.getMainLooper())
|
||||||
|
mainHandler.post {
|
||||||
|
work()
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,35 @@
|
||||||
|
package com.lagradost.cloudstream3
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.databind.DeserializationFeature
|
||||||
|
import com.fasterxml.jackson.databind.ObjectMapper
|
||||||
|
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
|
||||||
|
import com.lagradost.nicehttp.Requests
|
||||||
|
import com.lagradost.nicehttp.ResponseParser
|
||||||
|
import kotlin.reflect.KClass
|
||||||
|
|
||||||
|
// Short name for requests client to make it nicer to use
|
||||||
|
|
||||||
|
var app = Requests(responseParser = object : ResponseParser {
|
||||||
|
val mapper: ObjectMapper = jacksonObjectMapper().configure(
|
||||||
|
DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,
|
||||||
|
false
|
||||||
|
)
|
||||||
|
|
||||||
|
override fun <T : Any> parse(text: String, kClass: KClass<T>): T {
|
||||||
|
return mapper.readValue(text, kClass.java)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun <T : Any> parseSafe(text: String, kClass: KClass<T>): T? {
|
||||||
|
return try {
|
||||||
|
mapper.readValue(text, kClass.java)
|
||||||
|
} catch (e: Exception) {
|
||||||
|
null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun writeValueAsString(obj: Any): String {
|
||||||
|
return mapper.writeValueAsString(obj)
|
||||||
|
}
|
||||||
|
}).apply {
|
||||||
|
defaultHeaders = mapOf("user-agent" to USER_AGENT)
|
||||||
|
}
|
|
@ -1,3 +1,14 @@
|
||||||
package com.lagradost.cloudstream3
|
package com.lagradost.cloudstream3
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.databind.DeserializationFeature
|
||||||
|
import com.fasterxml.jackson.databind.json.JsonMapper
|
||||||
|
import com.fasterxml.jackson.module.kotlin.kotlinModule
|
||||||
|
|
||||||
|
const val USER_AGENT =
|
||||||
|
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36"
|
||||||
|
|
||||||
|
//val baseHeader = mapOf("User-Agent" to USER_AGENT)
|
||||||
|
val mapper = JsonMapper.builder().addModule(kotlinModule())
|
||||||
|
.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false).build()!!
|
||||||
|
|
||||||
class ErrorLoadingException(message: String? = null) : Exception(message)
|
class ErrorLoadingException(message: String? = null) : Exception(message)
|
|
@ -1,12 +1,11 @@
|
||||||
package com.lagradost.cloudstream3.utils
|
package com.lagradost.cloudstream3.utils
|
||||||
|
|
||||||
import android.os.Handler
|
|
||||||
import android.os.Looper
|
|
||||||
import com.lagradost.cloudstream3.mvvm.launchSafe
|
import com.lagradost.cloudstream3.mvvm.launchSafe
|
||||||
import com.lagradost.cloudstream3.mvvm.logError
|
import com.lagradost.cloudstream3.mvvm.logError
|
||||||
import kotlinx.coroutines.*
|
import kotlinx.coroutines.*
|
||||||
import java.util.Collections.synchronizedList
|
import java.util.Collections.synchronizedList
|
||||||
|
|
||||||
|
expect fun runOnMainThreadNative(work: (() -> Unit))
|
||||||
object Coroutines {
|
object Coroutines {
|
||||||
fun <T> T.main(work: suspend ((T) -> Unit)): Job {
|
fun <T> T.main(work: suspend ((T) -> Unit)): Job {
|
||||||
val value = this
|
val value = this
|
||||||
|
@ -50,10 +49,7 @@ object Coroutines {
|
||||||
}
|
}
|
||||||
|
|
||||||
fun runOnMainThread(work: (() -> Unit)) {
|
fun runOnMainThread(work: (() -> Unit)) {
|
||||||
val mainHandler = Handler(Looper.getMainLooper())
|
runOnMainThreadNative(work)
|
||||||
mainHandler.post {
|
|
||||||
work()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
|
@ -0,0 +1,5 @@
|
||||||
|
package com.lagradost.cloudstream3.utils
|
||||||
|
|
||||||
|
actual fun runOnMainThreadNative(work: () -> Unit) {
|
||||||
|
work.invoke()
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue