mirror of
https://github.com/recloudstream/cloudstream.git
synced 2024-08-15 01:53:11 +00:00
Port large parts of the API to crossplatform (#1163)
This commit is contained in:
parent
03b8b6e637
commit
02b956940a
181 changed files with 730 additions and 608 deletions
|
@ -263,6 +263,8 @@ tasks.register<Copy>("copyJar") {
|
||||||
|
|
||||||
// Merge the app classes and the library classes into classes.jar
|
// Merge the app classes and the library classes into classes.jar
|
||||||
tasks.register<Jar>("makeJar") {
|
tasks.register<Jar>("makeJar") {
|
||||||
|
// Duplicates cause hard to catch errors, better to fail at compile time.
|
||||||
|
duplicatesStrategy = DuplicatesStrategy.FAIL
|
||||||
dependsOn(tasks.getByName("copyJar"))
|
dependsOn(tasks.getByName("copyJar"))
|
||||||
from(
|
from(
|
||||||
zipTree("build/app-classes/classes.jar"),
|
zipTree("build/app-classes/classes.jar"),
|
||||||
|
|
|
@ -8,13 +8,14 @@ import android.content.Intent
|
||||||
import android.widget.Toast
|
import android.widget.Toast
|
||||||
import androidx.fragment.app.Fragment
|
import androidx.fragment.app.Fragment
|
||||||
import androidx.fragment.app.FragmentActivity
|
import androidx.fragment.app.FragmentActivity
|
||||||
|
import com.lagradost.api.setContext
|
||||||
import com.lagradost.cloudstream3.mvvm.normalSafeApiCall
|
import com.lagradost.cloudstream3.mvvm.normalSafeApiCall
|
||||||
import com.lagradost.cloudstream3.mvvm.suspendSafeApiCall
|
import com.lagradost.cloudstream3.mvvm.suspendSafeApiCall
|
||||||
import com.lagradost.cloudstream3.plugins.PluginManager
|
import com.lagradost.cloudstream3.plugins.PluginManager
|
||||||
import com.lagradost.cloudstream3.ui.settings.Globals.EMULATOR
|
import com.lagradost.cloudstream3.ui.settings.Globals.EMULATOR
|
||||||
import com.lagradost.cloudstream3.ui.settings.Globals.TV
|
import com.lagradost.cloudstream3.ui.settings.Globals.TV
|
||||||
import com.lagradost.cloudstream3.ui.settings.Globals.isLayout
|
import com.lagradost.cloudstream3.ui.settings.Globals.isLayout
|
||||||
import com.lagradost.cloudstream3.utils.AppUtils.openBrowser
|
import com.lagradost.cloudstream3.utils.AppContextUtils.openBrowser
|
||||||
import com.lagradost.cloudstream3.utils.Coroutines.runOnMainThread
|
import com.lagradost.cloudstream3.utils.Coroutines.runOnMainThread
|
||||||
import com.lagradost.cloudstream3.utils.DataStore.getKey
|
import com.lagradost.cloudstream3.utils.DataStore.getKey
|
||||||
import com.lagradost.cloudstream3.utils.DataStore.getKeys
|
import com.lagradost.cloudstream3.utils.DataStore.getKeys
|
||||||
|
@ -151,6 +152,7 @@ class AcraApplication : Application() {
|
||||||
get() = _context?.get()
|
get() = _context?.get()
|
||||||
private set(value) {
|
private set(value) {
|
||||||
_context = WeakReference(value)
|
_context = WeakReference(value)
|
||||||
|
setContext(WeakReference(value))
|
||||||
}
|
}
|
||||||
|
|
||||||
fun <T : Any> getKeyClass(path: String, valueType: Class<T>): T? {
|
fun <T : Any> getKeyClass(path: String, valueType: Class<T>): T? {
|
||||||
|
|
|
@ -36,7 +36,7 @@ import com.lagradost.cloudstream3.ui.player.PlayerEventType
|
||||||
import com.lagradost.cloudstream3.ui.result.ResultFragment
|
import com.lagradost.cloudstream3.ui.result.ResultFragment
|
||||||
import com.lagradost.cloudstream3.ui.result.UiText
|
import com.lagradost.cloudstream3.ui.result.UiText
|
||||||
import com.lagradost.cloudstream3.ui.settings.Globals.updateTv
|
import com.lagradost.cloudstream3.ui.settings.Globals.updateTv
|
||||||
import com.lagradost.cloudstream3.utils.AppUtils.isRtl
|
import com.lagradost.cloudstream3.utils.AppContextUtils.isRtl
|
||||||
import com.lagradost.cloudstream3.utils.DataStoreHelper
|
import com.lagradost.cloudstream3.utils.DataStoreHelper
|
||||||
import com.lagradost.cloudstream3.utils.Event
|
import com.lagradost.cloudstream3.utils.Event
|
||||||
import com.lagradost.cloudstream3.utils.UIHelper
|
import com.lagradost.cloudstream3.utils.UIHelper
|
||||||
|
|
|
@ -56,9 +56,7 @@ import com.google.common.collect.Comparators.min
|
||||||
import com.jaredrummler.android.colorpicker.ColorPickerDialogListener
|
import com.jaredrummler.android.colorpicker.ColorPickerDialogListener
|
||||||
import com.lagradost.cloudstream3.APIHolder.allProviders
|
import com.lagradost.cloudstream3.APIHolder.allProviders
|
||||||
import com.lagradost.cloudstream3.APIHolder.apis
|
import com.lagradost.cloudstream3.APIHolder.apis
|
||||||
import com.lagradost.cloudstream3.APIHolder.getApiDubstatusSettings
|
|
||||||
import com.lagradost.cloudstream3.APIHolder.initAll
|
import com.lagradost.cloudstream3.APIHolder.initAll
|
||||||
import com.lagradost.cloudstream3.APIHolder.updateHasTrailers
|
|
||||||
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.AcraApplication.Companion.setKey
|
import com.lagradost.cloudstream3.AcraApplication.Companion.setKey
|
||||||
|
@ -121,16 +119,18 @@ import com.lagradost.cloudstream3.ui.settings.SettingsGeneral
|
||||||
import com.lagradost.cloudstream3.ui.setup.HAS_DONE_SETUP_KEY
|
import com.lagradost.cloudstream3.ui.setup.HAS_DONE_SETUP_KEY
|
||||||
import com.lagradost.cloudstream3.ui.setup.SetupFragmentExtensions
|
import com.lagradost.cloudstream3.ui.setup.SetupFragmentExtensions
|
||||||
import com.lagradost.cloudstream3.utils.ApkInstaller
|
import com.lagradost.cloudstream3.utils.ApkInstaller
|
||||||
import com.lagradost.cloudstream3.utils.AppUtils.html
|
import com.lagradost.cloudstream3.utils.AppContextUtils.getApiDubstatusSettings
|
||||||
import com.lagradost.cloudstream3.utils.AppUtils.isCastApiAvailable
|
import com.lagradost.cloudstream3.utils.AppContextUtils.html
|
||||||
import com.lagradost.cloudstream3.utils.AppUtils.isLtr
|
import com.lagradost.cloudstream3.utils.AppContextUtils.isCastApiAvailable
|
||||||
import com.lagradost.cloudstream3.utils.AppUtils.isNetworkAvailable
|
import com.lagradost.cloudstream3.utils.AppContextUtils.isLtr
|
||||||
import com.lagradost.cloudstream3.utils.AppUtils.isRtl
|
import com.lagradost.cloudstream3.utils.AppContextUtils.isNetworkAvailable
|
||||||
import com.lagradost.cloudstream3.utils.AppUtils.loadCache
|
import com.lagradost.cloudstream3.utils.AppContextUtils.isRtl
|
||||||
import com.lagradost.cloudstream3.utils.AppUtils.loadRepository
|
import com.lagradost.cloudstream3.utils.AppContextUtils.loadCache
|
||||||
import com.lagradost.cloudstream3.utils.AppUtils.loadResult
|
import com.lagradost.cloudstream3.utils.AppContextUtils.loadRepository
|
||||||
import com.lagradost.cloudstream3.utils.AppUtils.loadSearchResult
|
import com.lagradost.cloudstream3.utils.AppContextUtils.loadResult
|
||||||
import com.lagradost.cloudstream3.utils.AppUtils.setDefaultFocus
|
import com.lagradost.cloudstream3.utils.AppContextUtils.loadSearchResult
|
||||||
|
import com.lagradost.cloudstream3.utils.AppContextUtils.setDefaultFocus
|
||||||
|
import com.lagradost.cloudstream3.utils.AppContextUtils.updateHasTrailers
|
||||||
import com.lagradost.cloudstream3.utils.BackupUtils.backup
|
import com.lagradost.cloudstream3.utils.BackupUtils.backup
|
||||||
import com.lagradost.cloudstream3.utils.BackupUtils.setUpBackup
|
import com.lagradost.cloudstream3.utils.BackupUtils.setUpBackup
|
||||||
import com.lagradost.cloudstream3.utils.BiometricAuthenticator.BiometricCallback
|
import com.lagradost.cloudstream3.utils.BiometricAuthenticator.BiometricCallback
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
package com.lagradost.cloudstream3.network
|
package com.lagradost.cloudstream3.network
|
||||||
|
|
||||||
|
import android.util.Base64
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
import android.webkit.CookieManager
|
import android.webkit.CookieManager
|
||||||
import androidx.annotation.AnyThread
|
import androidx.annotation.AnyThread
|
||||||
|
|
|
@ -14,7 +14,6 @@ import androidx.fragment.app.FragmentActivity
|
||||||
import com.fasterxml.jackson.annotation.JsonProperty
|
import com.fasterxml.jackson.annotation.JsonProperty
|
||||||
import com.google.gson.Gson
|
import com.google.gson.Gson
|
||||||
import com.lagradost.cloudstream3.*
|
import com.lagradost.cloudstream3.*
|
||||||
import com.lagradost.cloudstream3.APIHolder.getApiProviderLangSettings
|
|
||||||
import com.lagradost.cloudstream3.APIHolder.removePluginMapping
|
import com.lagradost.cloudstream3.APIHolder.removePluginMapping
|
||||||
import com.lagradost.cloudstream3.AcraApplication.Companion.getActivity
|
import com.lagradost.cloudstream3.AcraApplication.Companion.getActivity
|
||||||
import com.lagradost.cloudstream3.AcraApplication.Companion.getKey
|
import com.lagradost.cloudstream3.AcraApplication.Companion.getKey
|
||||||
|
@ -33,6 +32,7 @@ import com.lagradost.cloudstream3.ui.result.UiText
|
||||||
import com.lagradost.cloudstream3.ui.result.txt
|
import com.lagradost.cloudstream3.ui.result.txt
|
||||||
import com.lagradost.cloudstream3.ui.settings.extensions.REPOSITORIES_KEY
|
import com.lagradost.cloudstream3.ui.settings.extensions.REPOSITORIES_KEY
|
||||||
import com.lagradost.cloudstream3.ui.settings.extensions.RepositoryData
|
import com.lagradost.cloudstream3.ui.settings.extensions.RepositoryData
|
||||||
|
import com.lagradost.cloudstream3.utils.AppContextUtils.getApiProviderLangSettings
|
||||||
import com.lagradost.cloudstream3.utils.Coroutines.main
|
import com.lagradost.cloudstream3.utils.Coroutines.main
|
||||||
import com.lagradost.cloudstream3.utils.ExtractorApi
|
import com.lagradost.cloudstream3.utils.ExtractorApi
|
||||||
import com.lagradost.cloudstream3.utils.UIHelper.colorFromAttribute
|
import com.lagradost.cloudstream3.utils.UIHelper.colorFromAttribute
|
||||||
|
|
|
@ -10,7 +10,7 @@ import androidx.work.PeriodicWorkRequest
|
||||||
import androidx.work.WorkManager
|
import androidx.work.WorkManager
|
||||||
import androidx.work.WorkerParameters
|
import androidx.work.WorkerParameters
|
||||||
import com.lagradost.cloudstream3.R
|
import com.lagradost.cloudstream3.R
|
||||||
import com.lagradost.cloudstream3.utils.AppUtils.createNotificationChannel
|
import com.lagradost.cloudstream3.utils.AppContextUtils.createNotificationChannel
|
||||||
import com.lagradost.cloudstream3.utils.BackupUtils
|
import com.lagradost.cloudstream3.utils.BackupUtils
|
||||||
import com.lagradost.cloudstream3.utils.UIHelper.colorFromAttribute
|
import com.lagradost.cloudstream3.utils.UIHelper.colorFromAttribute
|
||||||
import java.util.concurrent.TimeUnit
|
import java.util.concurrent.TimeUnit
|
||||||
|
|
|
@ -10,13 +10,13 @@ import androidx.core.app.NotificationCompat
|
||||||
import androidx.core.net.toUri
|
import androidx.core.net.toUri
|
||||||
import androidx.work.*
|
import androidx.work.*
|
||||||
import com.lagradost.cloudstream3.*
|
import com.lagradost.cloudstream3.*
|
||||||
import com.lagradost.cloudstream3.APIHolder.getApiDubstatusSettings
|
|
||||||
import com.lagradost.cloudstream3.APIHolder.getApiFromNameNull
|
import com.lagradost.cloudstream3.APIHolder.getApiFromNameNull
|
||||||
import com.lagradost.cloudstream3.R
|
import com.lagradost.cloudstream3.R
|
||||||
import com.lagradost.cloudstream3.mvvm.logError
|
import com.lagradost.cloudstream3.mvvm.logError
|
||||||
import com.lagradost.cloudstream3.plugins.PluginManager
|
import com.lagradost.cloudstream3.plugins.PluginManager
|
||||||
import com.lagradost.cloudstream3.ui.result.txt
|
import com.lagradost.cloudstream3.ui.result.txt
|
||||||
import com.lagradost.cloudstream3.utils.AppUtils.createNotificationChannel
|
import com.lagradost.cloudstream3.utils.AppContextUtils.createNotificationChannel
|
||||||
|
import com.lagradost.cloudstream3.utils.AppContextUtils.getApiDubstatusSettings
|
||||||
import com.lagradost.cloudstream3.utils.Coroutines.ioWork
|
import com.lagradost.cloudstream3.utils.Coroutines.ioWork
|
||||||
import com.lagradost.cloudstream3.utils.DataStoreHelper
|
import com.lagradost.cloudstream3.utils.DataStoreHelper
|
||||||
import com.lagradost.cloudstream3.utils.DataStoreHelper.getAllSubscriptions
|
import com.lagradost.cloudstream3.utils.DataStoreHelper.getAllSubscriptions
|
||||||
|
|
|
@ -3,15 +3,22 @@ package com.lagradost.cloudstream3.syncproviders
|
||||||
import com.lagradost.cloudstream3.AcraApplication.Companion.getKey
|
import com.lagradost.cloudstream3.AcraApplication.Companion.getKey
|
||||||
import com.lagradost.cloudstream3.AcraApplication.Companion.removeKeys
|
import com.lagradost.cloudstream3.AcraApplication.Companion.removeKeys
|
||||||
import com.lagradost.cloudstream3.AcraApplication.Companion.setKey
|
import com.lagradost.cloudstream3.AcraApplication.Companion.setKey
|
||||||
|
import com.lagradost.cloudstream3.LoadResponse
|
||||||
import com.lagradost.cloudstream3.syncproviders.providers.*
|
import com.lagradost.cloudstream3.syncproviders.providers.*
|
||||||
import java.util.concurrent.TimeUnit
|
import java.util.concurrent.TimeUnit
|
||||||
|
|
||||||
abstract class AccountManager(private val defIndex: Int) : AuthAPI {
|
abstract class AccountManager(private val defIndex: Int) : AuthAPI {
|
||||||
companion object {
|
companion object {
|
||||||
val malApi = MALApi(0)
|
val malApi = MALApi(0).also { api ->
|
||||||
val aniListApi = AniListApi(0)
|
LoadResponse.Companion.malIdPrefix = api.idPrefix
|
||||||
|
}
|
||||||
|
val aniListApi = AniListApi(0).also { api ->
|
||||||
|
LoadResponse.Companion.aniListIdPrefix = api.idPrefix
|
||||||
|
}
|
||||||
|
val simklApi = SimklApi(0).also { api ->
|
||||||
|
LoadResponse.Companion.simklIdPrefix = api.idPrefix
|
||||||
|
}
|
||||||
val openSubtitlesApi = OpenSubtitlesApi(0)
|
val openSubtitlesApi = OpenSubtitlesApi(0)
|
||||||
val simklApi = SimklApi(0)
|
|
||||||
val addic7ed = Addic7ed()
|
val addic7ed = Addic7ed()
|
||||||
val subDlApi = SubDlApi(0)
|
val subDlApi = SubDlApi(0)
|
||||||
val localListApi = LocalList()
|
val localListApi = LocalList()
|
||||||
|
|
|
@ -2,20 +2,10 @@ package com.lagradost.cloudstream3.syncproviders
|
||||||
|
|
||||||
import com.lagradost.cloudstream3.*
|
import com.lagradost.cloudstream3.*
|
||||||
import com.lagradost.cloudstream3.ui.SyncWatchType
|
import com.lagradost.cloudstream3.ui.SyncWatchType
|
||||||
import com.lagradost.cloudstream3.ui.WatchType
|
|
||||||
import com.lagradost.cloudstream3.ui.library.ListSorting
|
import com.lagradost.cloudstream3.ui.library.ListSorting
|
||||||
import com.lagradost.cloudstream3.ui.result.UiText
|
import com.lagradost.cloudstream3.ui.result.UiText
|
||||||
import me.xdrop.fuzzywuzzy.FuzzySearch
|
import me.xdrop.fuzzywuzzy.FuzzySearch
|
||||||
|
|
||||||
enum class SyncIdName {
|
|
||||||
Anilist,
|
|
||||||
MyAnimeList,
|
|
||||||
Trakt,
|
|
||||||
Imdb,
|
|
||||||
Simkl,
|
|
||||||
LocalList,
|
|
||||||
}
|
|
||||||
|
|
||||||
interface SyncAPI : OAuth2API {
|
interface SyncAPI : OAuth2API {
|
||||||
/**
|
/**
|
||||||
* Set this to true if the user updates something on the list like watch status or score
|
* Set this to true if the user updates something on the list like watch status or score
|
|
@ -17,7 +17,7 @@ import com.lagradost.cloudstream3.ui.SyncWatchType
|
||||||
import com.lagradost.cloudstream3.ui.library.ListSorting
|
import com.lagradost.cloudstream3.ui.library.ListSorting
|
||||||
import com.lagradost.cloudstream3.ui.result.txt
|
import com.lagradost.cloudstream3.ui.result.txt
|
||||||
import com.lagradost.cloudstream3.utils.AppUtils.parseJson
|
import com.lagradost.cloudstream3.utils.AppUtils.parseJson
|
||||||
import com.lagradost.cloudstream3.utils.AppUtils.splitQuery
|
import com.lagradost.cloudstream3.utils.AppContextUtils.splitQuery
|
||||||
import com.lagradost.cloudstream3.utils.AppUtils.toJson
|
import com.lagradost.cloudstream3.utils.AppUtils.toJson
|
||||||
import com.lagradost.cloudstream3.utils.AppUtils.tryParseJson
|
import com.lagradost.cloudstream3.utils.AppUtils.tryParseJson
|
||||||
import com.lagradost.cloudstream3.utils.Coroutines.ioSafe
|
import com.lagradost.cloudstream3.utils.Coroutines.ioSafe
|
||||||
|
|
|
@ -20,7 +20,7 @@ import com.lagradost.cloudstream3.ui.SyncWatchType
|
||||||
import com.lagradost.cloudstream3.ui.library.ListSorting
|
import com.lagradost.cloudstream3.ui.library.ListSorting
|
||||||
import com.lagradost.cloudstream3.ui.result.txt
|
import com.lagradost.cloudstream3.ui.result.txt
|
||||||
import com.lagradost.cloudstream3.utils.AppUtils.parseJson
|
import com.lagradost.cloudstream3.utils.AppUtils.parseJson
|
||||||
import com.lagradost.cloudstream3.utils.AppUtils.splitQuery
|
import com.lagradost.cloudstream3.utils.AppContextUtils.splitQuery
|
||||||
import com.lagradost.cloudstream3.utils.DataStore.toKotlinObject
|
import com.lagradost.cloudstream3.utils.DataStore.toKotlinObject
|
||||||
import java.net.URL
|
import java.net.URL
|
||||||
import java.security.SecureRandom
|
import java.security.SecureRandom
|
||||||
|
|
|
@ -15,6 +15,7 @@ import com.lagradost.cloudstream3.subtitles.AbstractSubtitleEntities
|
||||||
import com.lagradost.cloudstream3.syncproviders.AuthAPI
|
import com.lagradost.cloudstream3.syncproviders.AuthAPI
|
||||||
import com.lagradost.cloudstream3.syncproviders.InAppAuthAPI
|
import com.lagradost.cloudstream3.syncproviders.InAppAuthAPI
|
||||||
import com.lagradost.cloudstream3.syncproviders.InAppAuthAPIManager
|
import com.lagradost.cloudstream3.syncproviders.InAppAuthAPIManager
|
||||||
|
import com.lagradost.cloudstream3.utils.AppContextUtils
|
||||||
import com.lagradost.cloudstream3.utils.AppUtils
|
import com.lagradost.cloudstream3.utils.AppUtils
|
||||||
import okhttp3.Interceptor
|
import okhttp3.Interceptor
|
||||||
import okhttp3.Response
|
import okhttp3.Response
|
||||||
|
|
|
@ -12,7 +12,9 @@ import com.lagradost.cloudstream3.AcraApplication.Companion.openBrowser
|
||||||
import com.lagradost.cloudstream3.AcraApplication.Companion.removeKey
|
import com.lagradost.cloudstream3.AcraApplication.Companion.removeKey
|
||||||
import com.lagradost.cloudstream3.AcraApplication.Companion.setKey
|
import com.lagradost.cloudstream3.AcraApplication.Companion.setKey
|
||||||
import com.lagradost.cloudstream3.BuildConfig
|
import com.lagradost.cloudstream3.BuildConfig
|
||||||
|
import com.lagradost.cloudstream3.LoadResponse.Companion.readIdFromString
|
||||||
import com.lagradost.cloudstream3.R
|
import com.lagradost.cloudstream3.R
|
||||||
|
import com.lagradost.cloudstream3.SimklSyncServices
|
||||||
import com.lagradost.cloudstream3.TvType
|
import com.lagradost.cloudstream3.TvType
|
||||||
import com.lagradost.cloudstream3.app
|
import com.lagradost.cloudstream3.app
|
||||||
import com.lagradost.cloudstream3.mapper
|
import com.lagradost.cloudstream3.mapper
|
||||||
|
@ -29,7 +31,6 @@ import com.lagradost.cloudstream3.ui.SyncWatchType
|
||||||
import com.lagradost.cloudstream3.ui.library.ListSorting
|
import com.lagradost.cloudstream3.ui.library.ListSorting
|
||||||
import com.lagradost.cloudstream3.ui.result.txt
|
import com.lagradost.cloudstream3.ui.result.txt
|
||||||
import com.lagradost.cloudstream3.utils.AppUtils.toJson
|
import com.lagradost.cloudstream3.utils.AppUtils.toJson
|
||||||
import com.lagradost.cloudstream3.utils.AppUtils.tryParseJson
|
|
||||||
import okhttp3.Interceptor
|
import okhttp3.Interceptor
|
||||||
import okhttp3.Response
|
import okhttp3.Response
|
||||||
import java.math.BigInteger
|
import java.math.BigInteger
|
||||||
|
@ -184,32 +185,6 @@ class SimklApi(index: Int) : AccountManager(index), SyncAPI {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Set of sync services simkl is compatible with.
|
|
||||||
* Add more as required: https://simkl.docs.apiary.io/#reference/search/id-lookup/get-items-by-id
|
|
||||||
*/
|
|
||||||
enum class SyncServices(val originalName: String) {
|
|
||||||
Simkl("simkl"),
|
|
||||||
Imdb("imdb"),
|
|
||||||
Tmdb("tmdb"),
|
|
||||||
AniList("anilist"),
|
|
||||||
Mal("mal"),
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The ID string is a way to keep a collection of services in one single ID using a map
|
|
||||||
* This adds a database service (like imdb) to the string and returns the new string.
|
|
||||||
*/
|
|
||||||
fun addIdToString(idString: String?, database: SyncServices, id: String?): String? {
|
|
||||||
if (id == null) return idString
|
|
||||||
return (readIdFromString(idString) + mapOf(database to id)).toJson()
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Read the id string to get all other ids */
|
|
||||||
fun readIdFromString(idString: String?): Map<SyncServices, String> {
|
|
||||||
return tryParseJson(idString) ?: return emptyMap()
|
|
||||||
}
|
|
||||||
|
|
||||||
fun getPosterUrl(poster: String): String {
|
fun getPosterUrl(poster: String): String {
|
||||||
return "https://wsrv.nl/?url=https://simkl.in/posters/${poster}_m.webp"
|
return "https://wsrv.nl/?url=https://simkl.in/posters/${poster}_m.webp"
|
||||||
}
|
}
|
||||||
|
@ -361,13 +336,13 @@ class SimklApi(index: Int) : AccountManager(index), SyncAPI {
|
||||||
@JsonProperty("anilist") val anilist: String? = null,
|
@JsonProperty("anilist") val anilist: String? = null,
|
||||||
) {
|
) {
|
||||||
companion object {
|
companion object {
|
||||||
fun fromMap(map: Map<SyncServices, String>): Ids {
|
fun fromMap(map: Map<SimklSyncServices, String>): Ids {
|
||||||
return Ids(
|
return Ids(
|
||||||
simkl = map[SyncServices.Simkl]?.toIntOrNull(),
|
simkl = map[SimklSyncServices.Simkl]?.toIntOrNull(),
|
||||||
imdb = map[SyncServices.Imdb],
|
imdb = map[SimklSyncServices.Imdb],
|
||||||
tmdb = map[SyncServices.Tmdb],
|
tmdb = map[SimklSyncServices.Tmdb],
|
||||||
mal = map[SyncServices.Mal],
|
mal = map[SimklSyncServices.Mal],
|
||||||
anilist = map[SyncServices.AniList]
|
anilist = map[SimklSyncServices.AniList]
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -749,13 +724,13 @@ class SimklApi(index: Int) : AccountManager(index), SyncAPI {
|
||||||
@JsonProperty("anilist") val anilist: String?,
|
@JsonProperty("anilist") val anilist: String?,
|
||||||
@JsonProperty("traktslug") val traktslug: String?
|
@JsonProperty("traktslug") val traktslug: String?
|
||||||
) {
|
) {
|
||||||
fun matchesId(database: SyncServices, id: String): Boolean {
|
fun matchesId(database: SimklSyncServices, id: String): Boolean {
|
||||||
return when (database) {
|
return when (database) {
|
||||||
SyncServices.Simkl -> this.simkl == id.toIntOrNull()
|
SimklSyncServices.Simkl -> this.simkl == id.toIntOrNull()
|
||||||
SyncServices.AniList -> this.anilist == id
|
SimklSyncServices.AniList -> this.anilist == id
|
||||||
SyncServices.Mal -> this.mal == id
|
SimklSyncServices.Mal -> this.mal == id
|
||||||
SyncServices.Tmdb -> this.tmdb == id
|
SimklSyncServices.Tmdb -> this.tmdb == id
|
||||||
SyncServices.Imdb -> this.imdb == id
|
SimklSyncServices.Imdb -> this.imdb == id
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -916,7 +891,7 @@ class SimklApi(index: Int) : AccountManager(index), SyncAPI {
|
||||||
|
|
||||||
|
|
||||||
/** See https://simkl.docs.apiary.io/#reference/search/id-lookup/get-items-by-id */
|
/** See https://simkl.docs.apiary.io/#reference/search/id-lookup/get-items-by-id */
|
||||||
suspend fun searchByIds(serviceMap: Map<SyncServices, String>): Array<MediaObject>? {
|
suspend fun searchByIds(serviceMap: Map<SimklSyncServices, String>): Array<MediaObject>? {
|
||||||
if (serviceMap.isEmpty()) return emptyArray()
|
if (serviceMap.isEmpty()) return emptyArray()
|
||||||
|
|
||||||
return app.get(
|
return app.get(
|
||||||
|
|
|
@ -23,13 +23,13 @@ import com.lagradost.cloudstream3.R
|
||||||
import com.lagradost.cloudstream3.mvvm.Resource
|
import com.lagradost.cloudstream3.mvvm.Resource
|
||||||
import com.lagradost.cloudstream3.mvvm.logError
|
import com.lagradost.cloudstream3.mvvm.logError
|
||||||
import com.lagradost.cloudstream3.mvvm.safeApiCall
|
import com.lagradost.cloudstream3.mvvm.safeApiCall
|
||||||
import com.lagradost.cloudstream3.sortSubs
|
|
||||||
import com.lagradost.cloudstream3.sortUrls
|
import com.lagradost.cloudstream3.sortUrls
|
||||||
import com.lagradost.cloudstream3.ui.player.LoadType
|
import com.lagradost.cloudstream3.ui.player.LoadType
|
||||||
import com.lagradost.cloudstream3.ui.player.RepoLinkGenerator
|
import com.lagradost.cloudstream3.ui.player.RepoLinkGenerator
|
||||||
import com.lagradost.cloudstream3.ui.player.SubtitleData
|
import com.lagradost.cloudstream3.ui.player.SubtitleData
|
||||||
import com.lagradost.cloudstream3.ui.result.ResultEpisode
|
import com.lagradost.cloudstream3.ui.result.ResultEpisode
|
||||||
import com.lagradost.cloudstream3.ui.subtitles.ChromecastSubtitlesFragment
|
import com.lagradost.cloudstream3.ui.subtitles.ChromecastSubtitlesFragment
|
||||||
|
import com.lagradost.cloudstream3.utils.AppContextUtils.sortSubs
|
||||||
import com.lagradost.cloudstream3.utils.AppUtils.toJson
|
import com.lagradost.cloudstream3.utils.AppUtils.toJson
|
||||||
import com.lagradost.cloudstream3.utils.CastHelper.awaitLinks
|
import com.lagradost.cloudstream3.utils.CastHelper.awaitLinks
|
||||||
import com.lagradost.cloudstream3.utils.CastHelper.getMediaInfo
|
import com.lagradost.cloudstream3.utils.CastHelper.getMediaInfo
|
||||||
|
|
|
@ -15,7 +15,7 @@ import com.lagradost.cloudstream3.MainActivity
|
||||||
import com.lagradost.cloudstream3.USER_AGENT
|
import com.lagradost.cloudstream3.USER_AGENT
|
||||||
import com.lagradost.cloudstream3.databinding.FragmentWebviewBinding
|
import com.lagradost.cloudstream3.databinding.FragmentWebviewBinding
|
||||||
import com.lagradost.cloudstream3.network.WebViewResolver
|
import com.lagradost.cloudstream3.network.WebViewResolver
|
||||||
import com.lagradost.cloudstream3.utils.AppUtils.loadRepository
|
import com.lagradost.cloudstream3.utils.AppContextUtils.loadRepository
|
||||||
|
|
||||||
|
|
||||||
class WebviewFragment : Fragment() {
|
class WebviewFragment : Fragment() {
|
||||||
|
|
|
@ -27,7 +27,7 @@ import com.lagradost.cloudstream3.mvvm.logError
|
||||||
import com.lagradost.cloudstream3.mvvm.observe
|
import com.lagradost.cloudstream3.mvvm.observe
|
||||||
import com.lagradost.cloudstream3.ui.result.setImage
|
import com.lagradost.cloudstream3.ui.result.setImage
|
||||||
import com.lagradost.cloudstream3.ui.result.setLinearListLayout
|
import com.lagradost.cloudstream3.ui.result.setLinearListLayout
|
||||||
import com.lagradost.cloudstream3.utils.AppUtils.setDefaultFocus
|
import com.lagradost.cloudstream3.utils.AppContextUtils.setDefaultFocus
|
||||||
import com.lagradost.cloudstream3.utils.DataStoreHelper
|
import com.lagradost.cloudstream3.utils.DataStoreHelper
|
||||||
import com.lagradost.cloudstream3.utils.DataStoreHelper.getDefaultAccount
|
import com.lagradost.cloudstream3.utils.DataStoreHelper.getDefaultAccount
|
||||||
import com.lagradost.cloudstream3.utils.UIHelper.dismissSafe
|
import com.lagradost.cloudstream3.utils.UIHelper.dismissSafe
|
||||||
|
|
|
@ -13,8 +13,9 @@ import com.lagradost.cloudstream3.R
|
||||||
import com.lagradost.cloudstream3.databinding.DownloadChildEpisodeBinding
|
import com.lagradost.cloudstream3.databinding.DownloadChildEpisodeBinding
|
||||||
import com.lagradost.cloudstream3.databinding.DownloadHeaderEpisodeBinding
|
import com.lagradost.cloudstream3.databinding.DownloadHeaderEpisodeBinding
|
||||||
import com.lagradost.cloudstream3.mvvm.logError
|
import com.lagradost.cloudstream3.mvvm.logError
|
||||||
|
import com.lagradost.cloudstream3.utils.AppContextUtils.getNameFull
|
||||||
|
import com.lagradost.cloudstream3.utils.DataStoreHelper
|
||||||
import com.lagradost.cloudstream3.ui.download.button.DownloadStatusTell
|
import com.lagradost.cloudstream3.ui.download.button.DownloadStatusTell
|
||||||
import com.lagradost.cloudstream3.utils.AppUtils.getNameFull
|
|
||||||
import com.lagradost.cloudstream3.utils.DataStoreHelper.fixVisual
|
import com.lagradost.cloudstream3.utils.DataStoreHelper.fixVisual
|
||||||
import com.lagradost.cloudstream3.utils.DataStoreHelper.getViewPos
|
import com.lagradost.cloudstream3.utils.DataStoreHelper.getViewPos
|
||||||
import com.lagradost.cloudstream3.utils.UIHelper.setImage
|
import com.lagradost.cloudstream3.utils.UIHelper.setImage
|
||||||
|
|
|
@ -9,11 +9,11 @@ import com.lagradost.cloudstream3.CommonActivity.showToast
|
||||||
import com.lagradost.cloudstream3.R
|
import com.lagradost.cloudstream3.R
|
||||||
import com.lagradost.cloudstream3.mvvm.logError
|
import com.lagradost.cloudstream3.mvvm.logError
|
||||||
import com.lagradost.cloudstream3.ui.player.DownloadFileGenerator
|
import com.lagradost.cloudstream3.ui.player.DownloadFileGenerator
|
||||||
|
import com.lagradost.cloudstream3.ui.player.ExtractorUri
|
||||||
import com.lagradost.cloudstream3.ui.player.GeneratorPlayer
|
import com.lagradost.cloudstream3.ui.player.GeneratorPlayer
|
||||||
import com.lagradost.cloudstream3.utils.AppUtils.getNameFull
|
import com.lagradost.cloudstream3.utils.AppContextUtils.getNameFull
|
||||||
import com.lagradost.cloudstream3.utils.AppUtils.setDefaultFocus
|
import com.lagradost.cloudstream3.utils.AppContextUtils.setDefaultFocus
|
||||||
import com.lagradost.cloudstream3.utils.DOWNLOAD_HEADER_CACHE
|
import com.lagradost.cloudstream3.utils.DOWNLOAD_HEADER_CACHE
|
||||||
import com.lagradost.cloudstream3.utils.ExtractorUri
|
|
||||||
import com.lagradost.cloudstream3.utils.UIHelper.navigate
|
import com.lagradost.cloudstream3.utils.UIHelper.navigate
|
||||||
import com.lagradost.cloudstream3.utils.VideoDownloadHelper
|
import com.lagradost.cloudstream3.utils.VideoDownloadHelper
|
||||||
import com.lagradost.cloudstream3.utils.VideoDownloadManager
|
import com.lagradost.cloudstream3.utils.VideoDownloadManager
|
||||||
|
|
|
@ -39,7 +39,8 @@ import com.lagradost.cloudstream3.ui.result.FOCUS_SELF
|
||||||
import com.lagradost.cloudstream3.ui.result.setLinearListLayout
|
import com.lagradost.cloudstream3.ui.result.setLinearListLayout
|
||||||
import com.lagradost.cloudstream3.ui.settings.Globals.TV
|
import com.lagradost.cloudstream3.ui.settings.Globals.TV
|
||||||
import com.lagradost.cloudstream3.ui.settings.Globals.isLayout
|
import com.lagradost.cloudstream3.ui.settings.Globals.isLayout
|
||||||
import com.lagradost.cloudstream3.utils.AppUtils.loadResult
|
import com.lagradost.cloudstream3.utils.AppContextUtils.loadResult
|
||||||
|
import com.lagradost.cloudstream3.utils.Coroutines.main
|
||||||
import com.lagradost.cloudstream3.utils.DOWNLOAD_EPISODE_CACHE
|
import com.lagradost.cloudstream3.utils.DOWNLOAD_EPISODE_CACHE
|
||||||
import com.lagradost.cloudstream3.utils.DataStore
|
import com.lagradost.cloudstream3.utils.DataStore
|
||||||
import com.lagradost.cloudstream3.utils.UIHelper.dismissSafe
|
import com.lagradost.cloudstream3.utils.UIHelper.dismissSafe
|
||||||
|
|
|
@ -25,8 +25,6 @@ import com.google.android.material.bottomsheet.BottomSheetDialog
|
||||||
import com.google.android.material.chip.Chip
|
import com.google.android.material.chip.Chip
|
||||||
import com.lagradost.cloudstream3.*
|
import com.lagradost.cloudstream3.*
|
||||||
import com.lagradost.cloudstream3.APIHolder.apis
|
import com.lagradost.cloudstream3.APIHolder.apis
|
||||||
import com.lagradost.cloudstream3.APIHolder.filterProviderByPreferredMedia
|
|
||||||
import com.lagradost.cloudstream3.APIHolder.getApiProviderLangSettings
|
|
||||||
import com.lagradost.cloudstream3.CommonActivity.showToast
|
import com.lagradost.cloudstream3.CommonActivity.showToast
|
||||||
import com.lagradost.cloudstream3.databinding.FragmentHomeBinding
|
import com.lagradost.cloudstream3.databinding.FragmentHomeBinding
|
||||||
import com.lagradost.cloudstream3.databinding.HomeEpisodesExpandedBinding
|
import com.lagradost.cloudstream3.databinding.HomeEpisodesExpandedBinding
|
||||||
|
@ -46,11 +44,13 @@ import com.lagradost.cloudstream3.ui.settings.Globals.EMULATOR
|
||||||
import com.lagradost.cloudstream3.ui.settings.Globals.PHONE
|
import com.lagradost.cloudstream3.ui.settings.Globals.PHONE
|
||||||
import com.lagradost.cloudstream3.ui.settings.Globals.TV
|
import com.lagradost.cloudstream3.ui.settings.Globals.TV
|
||||||
import com.lagradost.cloudstream3.ui.settings.Globals.isLayout
|
import com.lagradost.cloudstream3.ui.settings.Globals.isLayout
|
||||||
import com.lagradost.cloudstream3.utils.AppUtils.isRecyclerScrollable
|
import com.lagradost.cloudstream3.utils.AppContextUtils.filterProviderByPreferredMedia
|
||||||
import com.lagradost.cloudstream3.utils.AppUtils.loadSearchResult
|
import com.lagradost.cloudstream3.utils.AppContextUtils.getApiProviderLangSettings
|
||||||
import com.lagradost.cloudstream3.utils.AppUtils.ownHide
|
import com.lagradost.cloudstream3.utils.AppContextUtils.isRecyclerScrollable
|
||||||
import com.lagradost.cloudstream3.utils.AppUtils.ownShow
|
import com.lagradost.cloudstream3.utils.AppContextUtils.loadSearchResult
|
||||||
import com.lagradost.cloudstream3.utils.AppUtils.setDefaultFocus
|
import com.lagradost.cloudstream3.utils.AppContextUtils.ownHide
|
||||||
|
import com.lagradost.cloudstream3.utils.AppContextUtils.ownShow
|
||||||
|
import com.lagradost.cloudstream3.utils.AppContextUtils.setDefaultFocus
|
||||||
import com.lagradost.cloudstream3.utils.Coroutines.ioSafe
|
import com.lagradost.cloudstream3.utils.Coroutines.ioSafe
|
||||||
import com.lagradost.cloudstream3.utils.DataStoreHelper
|
import com.lagradost.cloudstream3.utils.DataStoreHelper
|
||||||
import com.lagradost.cloudstream3.utils.Event
|
import com.lagradost.cloudstream3.utils.Event
|
||||||
|
|
|
@ -22,7 +22,7 @@ import com.lagradost.cloudstream3.ui.settings.Globals.EMULATOR
|
||||||
import com.lagradost.cloudstream3.ui.settings.Globals.PHONE
|
import com.lagradost.cloudstream3.ui.settings.Globals.PHONE
|
||||||
import com.lagradost.cloudstream3.ui.settings.Globals.TV
|
import com.lagradost.cloudstream3.ui.settings.Globals.TV
|
||||||
import com.lagradost.cloudstream3.ui.settings.Globals.isLayout
|
import com.lagradost.cloudstream3.ui.settings.Globals.isLayout
|
||||||
import com.lagradost.cloudstream3.utils.AppUtils.isRecyclerScrollable
|
import com.lagradost.cloudstream3.utils.AppContextUtils.isRecyclerScrollable
|
||||||
|
|
||||||
class LoadClickCallback(
|
class LoadClickCallback(
|
||||||
val action: Int = 0,
|
val action: Int = 0,
|
||||||
|
|
|
@ -16,7 +16,6 @@ import androidx.viewbinding.ViewBinding
|
||||||
import androidx.viewpager2.widget.ViewPager2
|
import androidx.viewpager2.widget.ViewPager2
|
||||||
import com.google.android.material.chip.Chip
|
import com.google.android.material.chip.Chip
|
||||||
import com.google.android.material.chip.ChipGroup
|
import com.google.android.material.chip.ChipGroup
|
||||||
import com.lagradost.cloudstream3.APIHolder.getId
|
|
||||||
import com.lagradost.cloudstream3.AcraApplication.Companion.getActivity
|
import com.lagradost.cloudstream3.AcraApplication.Companion.getActivity
|
||||||
import com.lagradost.cloudstream3.CommonActivity.activity
|
import com.lagradost.cloudstream3.CommonActivity.activity
|
||||||
import com.lagradost.cloudstream3.HomePageList
|
import com.lagradost.cloudstream3.HomePageList
|
||||||
|
@ -36,6 +35,7 @@ import com.lagradost.cloudstream3.ui.home.HomeFragment.Companion.selectHomepage
|
||||||
import com.lagradost.cloudstream3.ui.result.FOCUS_SELF
|
import com.lagradost.cloudstream3.ui.result.FOCUS_SELF
|
||||||
import com.lagradost.cloudstream3.ui.result.ResultViewModel2
|
import com.lagradost.cloudstream3.ui.result.ResultViewModel2
|
||||||
import com.lagradost.cloudstream3.ui.result.START_ACTION_RESUME_LATEST
|
import com.lagradost.cloudstream3.ui.result.START_ACTION_RESUME_LATEST
|
||||||
|
import com.lagradost.cloudstream3.ui.result.getId
|
||||||
import com.lagradost.cloudstream3.ui.result.setLinearListLayout
|
import com.lagradost.cloudstream3.ui.result.setLinearListLayout
|
||||||
import com.lagradost.cloudstream3.ui.search.SEARCH_ACTION_LOAD
|
import com.lagradost.cloudstream3.ui.search.SEARCH_ACTION_LOAD
|
||||||
import com.lagradost.cloudstream3.ui.search.SEARCH_ACTION_SHOW_METADATA
|
import com.lagradost.cloudstream3.ui.search.SEARCH_ACTION_SHOW_METADATA
|
||||||
|
|
|
@ -6,9 +6,6 @@ import androidx.lifecycle.MutableLiveData
|
||||||
import androidx.lifecycle.ViewModel
|
import androidx.lifecycle.ViewModel
|
||||||
import androidx.lifecycle.viewModelScope
|
import androidx.lifecycle.viewModelScope
|
||||||
import com.lagradost.cloudstream3.APIHolder.apis
|
import com.lagradost.cloudstream3.APIHolder.apis
|
||||||
import com.lagradost.cloudstream3.APIHolder.filterHomePageListByFilmQuality
|
|
||||||
import com.lagradost.cloudstream3.APIHolder.filterProviderByPreferredMedia
|
|
||||||
import com.lagradost.cloudstream3.APIHolder.filterSearchResultByFilmQuality
|
|
||||||
import com.lagradost.cloudstream3.APIHolder.getApiFromNameNull
|
import com.lagradost.cloudstream3.APIHolder.getApiFromNameNull
|
||||||
import com.lagradost.cloudstream3.AcraApplication.Companion.context
|
import com.lagradost.cloudstream3.AcraApplication.Companion.context
|
||||||
import com.lagradost.cloudstream3.AcraApplication.Companion.getKey
|
import com.lagradost.cloudstream3.AcraApplication.Companion.getKey
|
||||||
|
@ -36,8 +33,11 @@ import com.lagradost.cloudstream3.ui.search.SearchClickCallback
|
||||||
import com.lagradost.cloudstream3.ui.search.SearchHelper
|
import com.lagradost.cloudstream3.ui.search.SearchHelper
|
||||||
import com.lagradost.cloudstream3.ui.settings.Globals.TV
|
import com.lagradost.cloudstream3.ui.settings.Globals.TV
|
||||||
import com.lagradost.cloudstream3.ui.settings.Globals.isLayout
|
import com.lagradost.cloudstream3.ui.settings.Globals.isLayout
|
||||||
import com.lagradost.cloudstream3.utils.AppUtils.addProgramsToContinueWatching
|
import com.lagradost.cloudstream3.utils.AppContextUtils.addProgramsToContinueWatching
|
||||||
import com.lagradost.cloudstream3.utils.AppUtils.loadResult
|
import com.lagradost.cloudstream3.utils.AppContextUtils.filterHomePageListByFilmQuality
|
||||||
|
import com.lagradost.cloudstream3.utils.AppContextUtils.filterProviderByPreferredMedia
|
||||||
|
import com.lagradost.cloudstream3.utils.AppContextUtils.filterSearchResultByFilmQuality
|
||||||
|
import com.lagradost.cloudstream3.utils.AppContextUtils.loadResult
|
||||||
import com.lagradost.cloudstream3.utils.Coroutines.ioSafe
|
import com.lagradost.cloudstream3.utils.Coroutines.ioSafe
|
||||||
import com.lagradost.cloudstream3.utils.DOWNLOAD_HEADER_CACHE
|
import com.lagradost.cloudstream3.utils.DOWNLOAD_HEADER_CACHE
|
||||||
import com.lagradost.cloudstream3.utils.DataStoreHelper
|
import com.lagradost.cloudstream3.utils.DataStoreHelper
|
||||||
|
|
|
@ -53,9 +53,9 @@ import com.lagradost.cloudstream3.ui.settings.Globals.EMULATOR
|
||||||
import com.lagradost.cloudstream3.ui.settings.Globals.PHONE
|
import com.lagradost.cloudstream3.ui.settings.Globals.PHONE
|
||||||
import com.lagradost.cloudstream3.ui.settings.Globals.TV
|
import com.lagradost.cloudstream3.ui.settings.Globals.TV
|
||||||
import com.lagradost.cloudstream3.ui.settings.Globals.isLayout
|
import com.lagradost.cloudstream3.ui.settings.Globals.isLayout
|
||||||
import com.lagradost.cloudstream3.utils.AppUtils.loadResult
|
import com.lagradost.cloudstream3.utils.AppContextUtils.loadResult
|
||||||
import com.lagradost.cloudstream3.utils.AppUtils.loadSearchResult
|
import com.lagradost.cloudstream3.utils.AppContextUtils.loadSearchResult
|
||||||
import com.lagradost.cloudstream3.utils.AppUtils.reduceDragSensitivity
|
import com.lagradost.cloudstream3.utils.AppContextUtils.reduceDragSensitivity
|
||||||
import com.lagradost.cloudstream3.utils.DataStoreHelper.currentAccount
|
import com.lagradost.cloudstream3.utils.DataStoreHelper.currentAccount
|
||||||
import com.lagradost.cloudstream3.utils.SingleSelectionHelper.showBottomDialog
|
import com.lagradost.cloudstream3.utils.SingleSelectionHelper.showBottomDialog
|
||||||
import com.lagradost.cloudstream3.utils.UIHelper.fixPaddingStatusbar
|
import com.lagradost.cloudstream3.utils.UIHelper.fixPaddingStatusbar
|
||||||
|
|
|
@ -16,7 +16,7 @@ import com.lagradost.cloudstream3.syncproviders.SyncAPI
|
||||||
import com.lagradost.cloudstream3.ui.AutofitRecyclerView
|
import com.lagradost.cloudstream3.ui.AutofitRecyclerView
|
||||||
import com.lagradost.cloudstream3.ui.search.SearchClickCallback
|
import com.lagradost.cloudstream3.ui.search.SearchClickCallback
|
||||||
import com.lagradost.cloudstream3.ui.search.SearchResultBuilder
|
import com.lagradost.cloudstream3.ui.search.SearchResultBuilder
|
||||||
import com.lagradost.cloudstream3.utils.AppUtils
|
import com.lagradost.cloudstream3.utils.AppContextUtils
|
||||||
import com.lagradost.cloudstream3.utils.UIHelper.toPx
|
import com.lagradost.cloudstream3.utils.UIHelper.toPx
|
||||||
import kotlin.math.roundToInt
|
import kotlin.math.roundToInt
|
||||||
|
|
||||||
|
@ -26,7 +26,7 @@ class PageAdapter(
|
||||||
private val resView: AutofitRecyclerView,
|
private val resView: AutofitRecyclerView,
|
||||||
val clickCallback: (SearchClickCallback) -> Unit
|
val clickCallback: (SearchClickCallback) -> Unit
|
||||||
) :
|
) :
|
||||||
AppUtils.DiffAdapter<SyncAPI.LibraryItem>(items) {
|
AppContextUtils.DiffAdapter<SyncAPI.LibraryItem>(items) {
|
||||||
|
|
||||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
|
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
|
||||||
return LibraryItemViewHolder(
|
return LibraryItemViewHolder(
|
||||||
|
|
|
@ -44,8 +44,8 @@ import com.lagradost.cloudstream3.mvvm.normalSafeApiCall
|
||||||
import com.lagradost.cloudstream3.syncproviders.AccountManager.Companion.unixTimeMs
|
import com.lagradost.cloudstream3.syncproviders.AccountManager.Companion.unixTimeMs
|
||||||
import com.lagradost.cloudstream3.ui.subtitles.SaveCaptionStyle
|
import com.lagradost.cloudstream3.ui.subtitles.SaveCaptionStyle
|
||||||
import com.lagradost.cloudstream3.ui.subtitles.SubtitlesFragment
|
import com.lagradost.cloudstream3.ui.subtitles.SubtitlesFragment
|
||||||
import com.lagradost.cloudstream3.utils.AppUtils
|
import com.lagradost.cloudstream3.utils.AppContextUtils
|
||||||
import com.lagradost.cloudstream3.utils.AppUtils.requestLocalAudioFocus
|
import com.lagradost.cloudstream3.utils.AppContextUtils.requestLocalAudioFocus
|
||||||
import com.lagradost.cloudstream3.utils.DataStoreHelper
|
import com.lagradost.cloudstream3.utils.DataStoreHelper
|
||||||
import com.lagradost.cloudstream3.utils.EpisodeSkip
|
import com.lagradost.cloudstream3.utils.EpisodeSkip
|
||||||
import com.lagradost.cloudstream3.utils.UIHelper
|
import com.lagradost.cloudstream3.utils.UIHelper
|
||||||
|
@ -258,7 +258,7 @@ abstract class AbstractPlayerFragment(
|
||||||
|
|
||||||
private fun requestAudioFocus() {
|
private fun requestAudioFocus() {
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||||
activity?.requestLocalAudioFocus(AppUtils.getFocusRequest())
|
activity?.requestLocalAudioFocus(AppContextUtils.getFocusRequest())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -57,14 +57,13 @@ import com.lagradost.cloudstream3.mvvm.debugAssert
|
||||||
import com.lagradost.cloudstream3.mvvm.logError
|
import com.lagradost.cloudstream3.mvvm.logError
|
||||||
import com.lagradost.cloudstream3.mvvm.normalSafeApiCall
|
import com.lagradost.cloudstream3.mvvm.normalSafeApiCall
|
||||||
import com.lagradost.cloudstream3.ui.subtitles.SaveCaptionStyle
|
import com.lagradost.cloudstream3.ui.subtitles.SaveCaptionStyle
|
||||||
import com.lagradost.cloudstream3.utils.AppUtils.isUsingMobileData
|
import com.lagradost.cloudstream3.utils.AppContextUtils.isUsingMobileData
|
||||||
import com.lagradost.cloudstream3.utils.DataStoreHelper.currentAccount
|
import com.lagradost.cloudstream3.utils.DataStoreHelper.currentAccount
|
||||||
import com.lagradost.cloudstream3.utils.DrmExtractorLink
|
import com.lagradost.cloudstream3.utils.DrmExtractorLink
|
||||||
import com.lagradost.cloudstream3.utils.EpisodeSkip
|
import com.lagradost.cloudstream3.utils.EpisodeSkip
|
||||||
import com.lagradost.cloudstream3.utils.ExtractorLink
|
import com.lagradost.cloudstream3.utils.ExtractorLink
|
||||||
import com.lagradost.cloudstream3.utils.ExtractorLinkPlayList
|
import com.lagradost.cloudstream3.utils.ExtractorLinkPlayList
|
||||||
import com.lagradost.cloudstream3.utils.ExtractorLinkType
|
import com.lagradost.cloudstream3.utils.ExtractorLinkType
|
||||||
import com.lagradost.cloudstream3.utils.ExtractorUri
|
|
||||||
import com.lagradost.cloudstream3.utils.SubtitleHelper.fromTwoLettersToLanguage
|
import com.lagradost.cloudstream3.utils.SubtitleHelper.fromTwoLettersToLanguage
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import java.lang.IllegalArgumentException
|
import java.lang.IllegalArgumentException
|
||||||
|
|
|
@ -4,7 +4,6 @@ import com.lagradost.cloudstream3.AcraApplication.Companion.context
|
||||||
import com.lagradost.cloudstream3.R
|
import com.lagradost.cloudstream3.R
|
||||||
import com.lagradost.cloudstream3.ui.player.PlayerSubtitleHelper.Companion.toSubtitleMimeType
|
import com.lagradost.cloudstream3.ui.player.PlayerSubtitleHelper.Companion.toSubtitleMimeType
|
||||||
import com.lagradost.cloudstream3.utils.ExtractorLink
|
import com.lagradost.cloudstream3.utils.ExtractorLink
|
||||||
import com.lagradost.cloudstream3.utils.ExtractorUri
|
|
||||||
import com.lagradost.cloudstream3.utils.VideoDownloadManager
|
import com.lagradost.cloudstream3.utils.VideoDownloadManager
|
||||||
import kotlin.math.max
|
import kotlin.math.max
|
||||||
import kotlin.math.min
|
import kotlin.math.min
|
||||||
|
|
|
@ -8,10 +8,14 @@ import androidx.activity.OnBackPressedCallback
|
||||||
import androidx.appcompat.app.AppCompatActivity
|
import androidx.appcompat.app.AppCompatActivity
|
||||||
import com.lagradost.cloudstream3.CommonActivity
|
import com.lagradost.cloudstream3.CommonActivity
|
||||||
import com.lagradost.cloudstream3.R
|
import com.lagradost.cloudstream3.R
|
||||||
|
import com.lagradost.cloudstream3.utils.UIHelper.navigate
|
||||||
|
import com.lagradost.safefile.SafeFile
|
||||||
import com.lagradost.cloudstream3.mvvm.normalSafeApiCall
|
import com.lagradost.cloudstream3.mvvm.normalSafeApiCall
|
||||||
import com.lagradost.cloudstream3.ui.player.OfflinePlaybackHelper.playLink
|
import com.lagradost.cloudstream3.ui.player.OfflinePlaybackHelper.playLink
|
||||||
import com.lagradost.cloudstream3.ui.player.OfflinePlaybackHelper.playUri
|
import com.lagradost.cloudstream3.ui.player.OfflinePlaybackHelper.playUri
|
||||||
|
|
||||||
|
const val DTAG = "PlayerActivity"
|
||||||
|
|
||||||
class DownloadedPlayerActivity : AppCompatActivity() {
|
class DownloadedPlayerActivity : AppCompatActivity() {
|
||||||
private val dTAG = "DownloadedPlayerAct"
|
private val dTAG = "DownloadedPlayerAct"
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
package com.lagradost.cloudstream3.ui.player
|
package com.lagradost.cloudstream3.ui.player
|
||||||
|
|
||||||
import com.lagradost.cloudstream3.utils.ExtractorLink
|
import com.lagradost.cloudstream3.utils.ExtractorLink
|
||||||
import com.lagradost.cloudstream3.utils.ExtractorUri
|
|
||||||
|
|
||||||
class ExtractorLinkGenerator(
|
class ExtractorLinkGenerator(
|
||||||
private val links: List<ExtractorLink>,
|
private val links: List<ExtractorLink>,
|
||||||
|
|
|
@ -45,7 +45,7 @@ import com.lagradost.cloudstream3.ui.settings.Globals
|
||||||
import com.lagradost.cloudstream3.ui.settings.Globals.EMULATOR
|
import com.lagradost.cloudstream3.ui.settings.Globals.EMULATOR
|
||||||
import com.lagradost.cloudstream3.ui.settings.Globals.TV
|
import com.lagradost.cloudstream3.ui.settings.Globals.TV
|
||||||
import com.lagradost.cloudstream3.ui.settings.Globals.isLayout
|
import com.lagradost.cloudstream3.ui.settings.Globals.isLayout
|
||||||
import com.lagradost.cloudstream3.utils.AppUtils.isUsingMobileData
|
import com.lagradost.cloudstream3.utils.AppContextUtils.isUsingMobileData
|
||||||
import com.lagradost.cloudstream3.utils.DataStoreHelper
|
import com.lagradost.cloudstream3.utils.DataStoreHelper
|
||||||
import com.lagradost.cloudstream3.utils.SingleSelectionHelper.showDialog
|
import com.lagradost.cloudstream3.utils.SingleSelectionHelper.showDialog
|
||||||
import com.lagradost.cloudstream3.utils.UIHelper.colorFromAttribute
|
import com.lagradost.cloudstream3.utils.UIHelper.colorFromAttribute
|
||||||
|
|
|
@ -49,6 +49,7 @@ import com.lagradost.cloudstream3.ui.settings.Globals.isLayout
|
||||||
import com.lagradost.cloudstream3.ui.subtitles.SUBTITLE_AUTO_SELECT_KEY
|
import com.lagradost.cloudstream3.ui.subtitles.SUBTITLE_AUTO_SELECT_KEY
|
||||||
import com.lagradost.cloudstream3.ui.subtitles.SubtitlesFragment.Companion.getAutoSelectLanguageISO639_1
|
import com.lagradost.cloudstream3.ui.subtitles.SubtitlesFragment.Companion.getAutoSelectLanguageISO639_1
|
||||||
import com.lagradost.cloudstream3.utils.*
|
import com.lagradost.cloudstream3.utils.*
|
||||||
|
import com.lagradost.cloudstream3.utils.AppContextUtils.sortSubs
|
||||||
import com.lagradost.cloudstream3.utils.Coroutines.ioSafe
|
import com.lagradost.cloudstream3.utils.Coroutines.ioSafe
|
||||||
import com.lagradost.cloudstream3.utils.Coroutines.runOnMainThread
|
import com.lagradost.cloudstream3.utils.Coroutines.runOnMainThread
|
||||||
import com.lagradost.cloudstream3.utils.SingleSelectionHelper.showDialog
|
import com.lagradost.cloudstream3.utils.SingleSelectionHelper.showDialog
|
||||||
|
|
|
@ -2,7 +2,6 @@ package com.lagradost.cloudstream3.ui.player
|
||||||
|
|
||||||
import com.lagradost.cloudstream3.utils.ExtractorLink
|
import com.lagradost.cloudstream3.utils.ExtractorLink
|
||||||
import com.lagradost.cloudstream3.utils.ExtractorLinkType
|
import com.lagradost.cloudstream3.utils.ExtractorLinkType
|
||||||
import com.lagradost.cloudstream3.utils.ExtractorUri
|
|
||||||
|
|
||||||
enum class LoadType {
|
enum class LoadType {
|
||||||
Unknown,
|
Unknown,
|
||||||
|
|
|
@ -6,7 +6,6 @@ import android.util.Rational
|
||||||
import com.lagradost.cloudstream3.ui.subtitles.SaveCaptionStyle
|
import com.lagradost.cloudstream3.ui.subtitles.SaveCaptionStyle
|
||||||
import com.lagradost.cloudstream3.utils.EpisodeSkip
|
import com.lagradost.cloudstream3.utils.EpisodeSkip
|
||||||
import com.lagradost.cloudstream3.utils.ExtractorLink
|
import com.lagradost.cloudstream3.utils.ExtractorLink
|
||||||
import com.lagradost.cloudstream3.utils.ExtractorUri
|
|
||||||
|
|
||||||
enum class PlayerEventType(val value: Int) {
|
enum class PlayerEventType(val value: Int) {
|
||||||
//Stop(-1),
|
//Stop(-1),
|
||||||
|
|
|
@ -1,13 +1,31 @@
|
||||||
package com.lagradost.cloudstream3.ui.player
|
package com.lagradost.cloudstream3.ui.player
|
||||||
|
|
||||||
|
import android.net.Uri
|
||||||
|
import com.lagradost.cloudstream3.TvType
|
||||||
import com.lagradost.cloudstream3.amap
|
import com.lagradost.cloudstream3.amap
|
||||||
import com.lagradost.cloudstream3.utils.ExtractorLink
|
import com.lagradost.cloudstream3.utils.ExtractorLink
|
||||||
import com.lagradost.cloudstream3.utils.ExtractorUri
|
import com.lagradost.cloudstream3.ui.player.ExtractorUri
|
||||||
import com.lagradost.cloudstream3.utils.INFER_TYPE
|
import com.lagradost.cloudstream3.utils.INFER_TYPE
|
||||||
import com.lagradost.cloudstream3.utils.Qualities
|
import com.lagradost.cloudstream3.utils.Qualities
|
||||||
import com.lagradost.cloudstream3.utils.loadExtractor
|
import com.lagradost.cloudstream3.utils.loadExtractor
|
||||||
import com.lagradost.cloudstream3.utils.unshortenLinkSafe
|
import com.lagradost.cloudstream3.utils.unshortenLinkSafe
|
||||||
|
|
||||||
|
data class ExtractorUri(
|
||||||
|
val uri: Uri,
|
||||||
|
val name: String,
|
||||||
|
|
||||||
|
val basePath: String? = null,
|
||||||
|
val relativePath: String? = null,
|
||||||
|
val displayName: String? = null,
|
||||||
|
|
||||||
|
val id: Int? = null,
|
||||||
|
val parentId: Int? = null,
|
||||||
|
val episode: Int? = null,
|
||||||
|
val season: Int? = null,
|
||||||
|
val headerName: String? = null,
|
||||||
|
val tvType: TvType? = null,
|
||||||
|
)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Used to open the player more easily with the LinkGenerator
|
* Used to open the player more easily with the LinkGenerator
|
||||||
**/
|
**/
|
||||||
|
|
|
@ -5,7 +5,7 @@ import android.content.ContentUris
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
import androidx.core.content.ContextCompat.getString
|
import androidx.core.content.ContextCompat.getString
|
||||||
import com.lagradost.cloudstream3.R
|
import com.lagradost.cloudstream3.R
|
||||||
import com.lagradost.cloudstream3.utils.ExtractorUri
|
import com.lagradost.cloudstream3.ui.player.ExtractorUri
|
||||||
import com.lagradost.cloudstream3.utils.UIHelper.navigate
|
import com.lagradost.cloudstream3.utils.UIHelper.navigate
|
||||||
import com.lagradost.safefile.SafeFile
|
import com.lagradost.safefile.SafeFile
|
||||||
|
|
||||||
|
|
|
@ -15,7 +15,6 @@ import com.lagradost.cloudstream3.ui.result.ResultEpisode
|
||||||
import com.lagradost.cloudstream3.utils.Coroutines.ioSafe
|
import com.lagradost.cloudstream3.utils.Coroutines.ioSafe
|
||||||
import com.lagradost.cloudstream3.utils.EpisodeSkip
|
import com.lagradost.cloudstream3.utils.EpisodeSkip
|
||||||
import com.lagradost.cloudstream3.utils.ExtractorLink
|
import com.lagradost.cloudstream3.utils.ExtractorLink
|
||||||
import com.lagradost.cloudstream3.utils.ExtractorUri
|
|
||||||
import kotlinx.coroutines.Job
|
import kotlinx.coroutines.Job
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
|
|
||||||
|
|
|
@ -9,14 +9,11 @@ import android.util.Log
|
||||||
import androidx.annotation.WorkerThread
|
import androidx.annotation.WorkerThread
|
||||||
import androidx.core.graphics.scale
|
import androidx.core.graphics.scale
|
||||||
import com.lagradost.cloudstream3.mvvm.logError
|
import com.lagradost.cloudstream3.mvvm.logError
|
||||||
import com.lagradost.cloudstream3.ui.settings.Globals
|
|
||||||
import com.lagradost.cloudstream3.ui.settings.Globals.TV
|
import com.lagradost.cloudstream3.ui.settings.Globals.TV
|
||||||
import com.lagradost.cloudstream3.ui.settings.Globals.isLayout
|
import com.lagradost.cloudstream3.ui.settings.Globals.isLayout
|
||||||
import com.lagradost.cloudstream3.ui.settings.SettingsFragment
|
|
||||||
import com.lagradost.cloudstream3.utils.Coroutines.ioSafe
|
import com.lagradost.cloudstream3.utils.Coroutines.ioSafe
|
||||||
import com.lagradost.cloudstream3.utils.ExtractorLink
|
import com.lagradost.cloudstream3.utils.ExtractorLink
|
||||||
import com.lagradost.cloudstream3.utils.ExtractorLinkType
|
import com.lagradost.cloudstream3.utils.ExtractorLinkType
|
||||||
import com.lagradost.cloudstream3.utils.ExtractorUri
|
|
||||||
import com.lagradost.cloudstream3.utils.M3u8Helper
|
import com.lagradost.cloudstream3.utils.M3u8Helper
|
||||||
import com.lagradost.cloudstream3.utils.M3u8Helper2
|
import com.lagradost.cloudstream3.utils.M3u8Helper2
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
|
|
|
@ -7,7 +7,6 @@ import com.lagradost.cloudstream3.LoadResponse
|
||||||
import com.lagradost.cloudstream3.ui.APIRepository
|
import com.lagradost.cloudstream3.ui.APIRepository
|
||||||
import com.lagradost.cloudstream3.ui.result.ResultEpisode
|
import com.lagradost.cloudstream3.ui.result.ResultEpisode
|
||||||
import com.lagradost.cloudstream3.utils.ExtractorLink
|
import com.lagradost.cloudstream3.utils.ExtractorLink
|
||||||
import com.lagradost.cloudstream3.utils.ExtractorUri
|
|
||||||
import kotlin.math.max
|
import kotlin.math.max
|
||||||
import kotlin.math.min
|
import kotlin.math.min
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,7 @@ import android.view.LayoutInflater
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import androidx.recyclerview.widget.RecyclerView
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
import com.lagradost.cloudstream3.databinding.PlayerPrioritizeItemBinding
|
import com.lagradost.cloudstream3.databinding.PlayerPrioritizeItemBinding
|
||||||
import com.lagradost.cloudstream3.utils.AppUtils
|
import com.lagradost.cloudstream3.utils.AppContextUtils
|
||||||
|
|
||||||
data class SourcePriority<T>(
|
data class SourcePriority<T>(
|
||||||
val data: T,
|
val data: T,
|
||||||
|
@ -13,7 +13,7 @@ data class SourcePriority<T>(
|
||||||
)
|
)
|
||||||
|
|
||||||
class PriorityAdapter<T>(override val items: MutableList<SourcePriority<T>>) :
|
class PriorityAdapter<T>(override val items: MutableList<SourcePriority<T>>) :
|
||||||
AppUtils.DiffAdapter<SourcePriority<T>>(items) {
|
AppContextUtils.DiffAdapter<SourcePriority<T>>(items) {
|
||||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
|
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
|
||||||
return PriorityViewHolder(
|
return PriorityViewHolder(
|
||||||
PlayerPrioritizeItemBinding.inflate(LayoutInflater.from(parent.context),parent,false),
|
PlayerPrioritizeItemBinding.inflate(LayoutInflater.from(parent.context),parent,false),
|
||||||
|
|
|
@ -13,7 +13,7 @@ import androidx.recyclerview.widget.RecyclerView
|
||||||
import com.lagradost.cloudstream3.R
|
import com.lagradost.cloudstream3.R
|
||||||
import com.lagradost.cloudstream3.databinding.PlayerQualityProfileItemBinding
|
import com.lagradost.cloudstream3.databinding.PlayerQualityProfileItemBinding
|
||||||
import com.lagradost.cloudstream3.ui.result.UiImage
|
import com.lagradost.cloudstream3.ui.result.UiImage
|
||||||
import com.lagradost.cloudstream3.utils.AppUtils
|
import com.lagradost.cloudstream3.utils.AppContextUtils
|
||||||
import com.lagradost.cloudstream3.utils.UIHelper.setImage
|
import com.lagradost.cloudstream3.utils.UIHelper.setImage
|
||||||
|
|
||||||
class ProfilesAdapter(
|
class ProfilesAdapter(
|
||||||
|
@ -21,7 +21,7 @@ class ProfilesAdapter(
|
||||||
val usedProfile: Int,
|
val usedProfile: Int,
|
||||||
val clickCallback: (oldIndex: Int?, newIndex: Int) -> Unit,
|
val clickCallback: (oldIndex: Int?, newIndex: Int) -> Unit,
|
||||||
) :
|
) :
|
||||||
AppUtils.DiffAdapter<QualityDataHelper.QualityProfile>(
|
AppContextUtils.DiffAdapter<QualityDataHelper.QualityProfile>(
|
||||||
items,
|
items,
|
||||||
comparison = { first: QualityDataHelper.QualityProfile, second: QualityDataHelper.QualityProfile ->
|
comparison = { first: QualityDataHelper.QualityProfile, second: QualityDataHelper.QualityProfile ->
|
||||||
first.id == second.id
|
first.id == second.id
|
||||||
|
|
|
@ -17,8 +17,6 @@ import androidx.fragment.app.Fragment
|
||||||
import androidx.lifecycle.ViewModelProvider
|
import androidx.lifecycle.ViewModelProvider
|
||||||
import androidx.recyclerview.widget.GridLayoutManager
|
import androidx.recyclerview.widget.GridLayoutManager
|
||||||
import com.google.android.material.bottomsheet.BottomSheetDialog
|
import com.google.android.material.bottomsheet.BottomSheetDialog
|
||||||
import com.lagradost.cloudstream3.APIHolder.filterProviderByPreferredMedia
|
|
||||||
import com.lagradost.cloudstream3.APIHolder.filterSearchResultByFilmQuality
|
|
||||||
import com.lagradost.cloudstream3.APIHolder.getApiFromNameNull
|
import com.lagradost.cloudstream3.APIHolder.getApiFromNameNull
|
||||||
import com.lagradost.cloudstream3.CommonActivity.activity
|
import com.lagradost.cloudstream3.CommonActivity.activity
|
||||||
import com.lagradost.cloudstream3.HomePageList
|
import com.lagradost.cloudstream3.HomePageList
|
||||||
|
@ -34,12 +32,13 @@ import com.lagradost.cloudstream3.ui.search.SearchAdapter
|
||||||
import com.lagradost.cloudstream3.ui.search.SearchClickCallback
|
import com.lagradost.cloudstream3.ui.search.SearchClickCallback
|
||||||
import com.lagradost.cloudstream3.ui.search.SearchHelper
|
import com.lagradost.cloudstream3.ui.search.SearchHelper
|
||||||
import com.lagradost.cloudstream3.ui.search.SearchViewModel
|
import com.lagradost.cloudstream3.ui.search.SearchViewModel
|
||||||
import com.lagradost.cloudstream3.ui.settings.Globals
|
|
||||||
import com.lagradost.cloudstream3.ui.settings.Globals.EMULATOR
|
import com.lagradost.cloudstream3.ui.settings.Globals.EMULATOR
|
||||||
import com.lagradost.cloudstream3.ui.settings.Globals.PHONE
|
import com.lagradost.cloudstream3.ui.settings.Globals.PHONE
|
||||||
import com.lagradost.cloudstream3.ui.settings.Globals.TV
|
import com.lagradost.cloudstream3.ui.settings.Globals.TV
|
||||||
import com.lagradost.cloudstream3.ui.settings.Globals.isLayout
|
import com.lagradost.cloudstream3.ui.settings.Globals.isLayout
|
||||||
import com.lagradost.cloudstream3.utils.AppUtils.ownShow
|
import com.lagradost.cloudstream3.utils.AppContextUtils.filterProviderByPreferredMedia
|
||||||
|
import com.lagradost.cloudstream3.utils.AppContextUtils.filterSearchResultByFilmQuality
|
||||||
|
import com.lagradost.cloudstream3.utils.AppContextUtils.ownShow
|
||||||
import com.lagradost.cloudstream3.utils.UIHelper
|
import com.lagradost.cloudstream3.utils.UIHelper
|
||||||
import com.lagradost.cloudstream3.utils.UIHelper.fixPaddingStatusbar
|
import com.lagradost.cloudstream3.utils.UIHelper.fixPaddingStatusbar
|
||||||
import com.lagradost.cloudstream3.utils.UIHelper.getSpanCount
|
import com.lagradost.cloudstream3.utils.UIHelper.getSpanCount
|
||||||
|
|
|
@ -138,7 +138,7 @@ class ActorAdaptor(
|
||||||
voiceActorImageHolder.isVisible = false
|
voiceActorImageHolder.isVisible = false
|
||||||
voiceActorName.isVisible = false
|
voiceActorName.isVisible = false
|
||||||
} else {
|
} else {
|
||||||
voiceActorName.text = actor.voiceActor.name
|
voiceActorName.text = actor.voiceActor?.name
|
||||||
voiceActorImageHolder.isVisible = voiceActorImage.setImage(vaImage)
|
voiceActorImageHolder.isVisible = voiceActorImage.setImage(vaImage)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,7 +21,7 @@ import com.lagradost.cloudstream3.ui.settings.Globals.EMULATOR
|
||||||
import com.lagradost.cloudstream3.ui.settings.Globals.PHONE
|
import com.lagradost.cloudstream3.ui.settings.Globals.PHONE
|
||||||
import com.lagradost.cloudstream3.ui.settings.Globals.TV
|
import com.lagradost.cloudstream3.ui.settings.Globals.TV
|
||||||
import com.lagradost.cloudstream3.ui.settings.Globals.isLayout
|
import com.lagradost.cloudstream3.ui.settings.Globals.isLayout
|
||||||
import com.lagradost.cloudstream3.utils.AppUtils.html
|
import com.lagradost.cloudstream3.utils.AppContextUtils.html
|
||||||
import com.lagradost.cloudstream3.utils.UIHelper.setImage
|
import com.lagradost.cloudstream3.utils.UIHelper.setImage
|
||||||
import com.lagradost.cloudstream3.utils.UIHelper.toPx
|
import com.lagradost.cloudstream3.utils.UIHelper.toPx
|
||||||
import com.lagradost.cloudstream3.utils.VideoDownloadHelper
|
import com.lagradost.cloudstream3.utils.VideoDownloadHelper
|
||||||
|
|
|
@ -3,12 +3,12 @@ package com.lagradost.cloudstream3.ui.result
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import androidx.fragment.app.Fragment
|
import androidx.fragment.app.Fragment
|
||||||
import androidx.preference.PreferenceManager
|
import androidx.preference.PreferenceManager
|
||||||
import com.lagradost.cloudstream3.APIHolder.getApiDubstatusSettings
|
|
||||||
import com.lagradost.cloudstream3.DubStatus
|
import com.lagradost.cloudstream3.DubStatus
|
||||||
import com.lagradost.cloudstream3.R
|
import com.lagradost.cloudstream3.R
|
||||||
import com.lagradost.cloudstream3.SearchResponse
|
import com.lagradost.cloudstream3.SearchResponse
|
||||||
import com.lagradost.cloudstream3.TvType
|
import com.lagradost.cloudstream3.TvType
|
||||||
import com.lagradost.cloudstream3.ui.result.EpisodeAdapter.Companion.getPlayerAction
|
import com.lagradost.cloudstream3.ui.result.EpisodeAdapter.Companion.getPlayerAction
|
||||||
|
import com.lagradost.cloudstream3.utils.AppContextUtils.getApiDubstatusSettings
|
||||||
import com.lagradost.cloudstream3.utils.DataStoreHelper
|
import com.lagradost.cloudstream3.utils.DataStoreHelper
|
||||||
import com.lagradost.cloudstream3.utils.DataStoreHelper.getVideoWatchState
|
import com.lagradost.cloudstream3.utils.DataStoreHelper.getVideoWatchState
|
||||||
import com.lagradost.cloudstream3.utils.DataStoreHelper.getViewPos
|
import com.lagradost.cloudstream3.utils.DataStoreHelper.getViewPos
|
||||||
|
|
|
@ -29,7 +29,6 @@ import com.google.android.gms.cast.framework.CastContext
|
||||||
import com.google.android.gms.cast.framework.CastState
|
import com.google.android.gms.cast.framework.CastState
|
||||||
import com.google.android.material.bottomsheet.BottomSheetDialog
|
import com.google.android.material.bottomsheet.BottomSheetDialog
|
||||||
import com.lagradost.cloudstream3.APIHolder
|
import com.lagradost.cloudstream3.APIHolder
|
||||||
import com.lagradost.cloudstream3.APIHolder.updateHasTrailers
|
|
||||||
import com.lagradost.cloudstream3.CommonActivity.showToast
|
import com.lagradost.cloudstream3.CommonActivity.showToast
|
||||||
import com.lagradost.cloudstream3.DubStatus
|
import com.lagradost.cloudstream3.DubStatus
|
||||||
import com.lagradost.cloudstream3.LoadResponse
|
import com.lagradost.cloudstream3.LoadResponse
|
||||||
|
@ -57,10 +56,11 @@ import com.lagradost.cloudstream3.ui.result.ResultFragment.getStoredData
|
||||||
import com.lagradost.cloudstream3.ui.result.ResultFragment.updateUIEvent
|
import com.lagradost.cloudstream3.ui.result.ResultFragment.updateUIEvent
|
||||||
import com.lagradost.cloudstream3.ui.search.SearchAdapter
|
import com.lagradost.cloudstream3.ui.search.SearchAdapter
|
||||||
import com.lagradost.cloudstream3.ui.search.SearchHelper
|
import com.lagradost.cloudstream3.ui.search.SearchHelper
|
||||||
import com.lagradost.cloudstream3.utils.AppUtils.getNameFull
|
import com.lagradost.cloudstream3.utils.AppContextUtils.getNameFull
|
||||||
import com.lagradost.cloudstream3.utils.AppUtils.isCastApiAvailable
|
import com.lagradost.cloudstream3.utils.AppContextUtils.isCastApiAvailable
|
||||||
import com.lagradost.cloudstream3.utils.AppUtils.loadCache
|
import com.lagradost.cloudstream3.utils.AppContextUtils.loadCache
|
||||||
import com.lagradost.cloudstream3.utils.AppUtils.openBrowser
|
import com.lagradost.cloudstream3.utils.AppContextUtils.openBrowser
|
||||||
|
import com.lagradost.cloudstream3.utils.AppContextUtils.updateHasTrailers
|
||||||
import com.lagradost.cloudstream3.utils.BatteryOptimizationChecker.openBatteryOptimizationSettings
|
import com.lagradost.cloudstream3.utils.BatteryOptimizationChecker.openBatteryOptimizationSettings
|
||||||
import com.lagradost.cloudstream3.utils.ExtractorLink
|
import com.lagradost.cloudstream3.utils.ExtractorLink
|
||||||
import com.lagradost.cloudstream3.utils.SingleSelectionHelper.showBottomDialog
|
import com.lagradost.cloudstream3.utils.SingleSelectionHelper.showBottomDialog
|
||||||
|
|
|
@ -17,7 +17,6 @@ import androidx.fragment.app.Fragment
|
||||||
import androidx.lifecycle.ViewModelProvider
|
import androidx.lifecycle.ViewModelProvider
|
||||||
import androidx.recyclerview.widget.RecyclerView
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
import com.google.android.material.bottomsheet.BottomSheetDialog
|
import com.google.android.material.bottomsheet.BottomSheetDialog
|
||||||
import com.lagradost.cloudstream3.APIHolder.updateHasTrailers
|
|
||||||
import com.lagradost.cloudstream3.CommonActivity
|
import com.lagradost.cloudstream3.CommonActivity
|
||||||
import com.lagradost.cloudstream3.DubStatus
|
import com.lagradost.cloudstream3.DubStatus
|
||||||
import com.lagradost.cloudstream3.LoadResponse
|
import com.lagradost.cloudstream3.LoadResponse
|
||||||
|
@ -40,13 +39,13 @@ import com.lagradost.cloudstream3.ui.result.ResultFragment.updateUIEvent
|
||||||
import com.lagradost.cloudstream3.ui.search.SEARCH_ACTION_FOCUSED
|
import com.lagradost.cloudstream3.ui.search.SEARCH_ACTION_FOCUSED
|
||||||
import com.lagradost.cloudstream3.ui.search.SearchAdapter
|
import com.lagradost.cloudstream3.ui.search.SearchAdapter
|
||||||
import com.lagradost.cloudstream3.ui.search.SearchHelper
|
import com.lagradost.cloudstream3.ui.search.SearchHelper
|
||||||
import com.lagradost.cloudstream3.ui.settings.Globals
|
|
||||||
import com.lagradost.cloudstream3.ui.settings.Globals.EMULATOR
|
import com.lagradost.cloudstream3.ui.settings.Globals.EMULATOR
|
||||||
import com.lagradost.cloudstream3.ui.settings.Globals.TV
|
import com.lagradost.cloudstream3.ui.settings.Globals.TV
|
||||||
import com.lagradost.cloudstream3.ui.settings.Globals.isLayout
|
import com.lagradost.cloudstream3.ui.settings.Globals.isLayout
|
||||||
import com.lagradost.cloudstream3.utils.AppUtils.html
|
import com.lagradost.cloudstream3.utils.AppContextUtils.html
|
||||||
import com.lagradost.cloudstream3.utils.AppUtils.isRtl
|
import com.lagradost.cloudstream3.utils.AppContextUtils.isRtl
|
||||||
import com.lagradost.cloudstream3.utils.AppUtils.loadCache
|
import com.lagradost.cloudstream3.utils.AppContextUtils.loadCache
|
||||||
|
import com.lagradost.cloudstream3.utils.AppContextUtils.updateHasTrailers
|
||||||
import com.lagradost.cloudstream3.utils.SingleSelectionHelper.showBottomDialog
|
import com.lagradost.cloudstream3.utils.SingleSelectionHelper.showBottomDialog
|
||||||
import com.lagradost.cloudstream3.utils.SingleSelectionHelper.showBottomDialogInstant
|
import com.lagradost.cloudstream3.utils.SingleSelectionHelper.showBottomDialogInstant
|
||||||
import com.lagradost.cloudstream3.utils.UIHelper
|
import com.lagradost.cloudstream3.utils.UIHelper
|
||||||
|
|
|
@ -18,7 +18,7 @@ import androidx.lifecycle.ViewModel
|
||||||
import androidx.lifecycle.viewModelScope
|
import androidx.lifecycle.viewModelScope
|
||||||
import com.lagradost.cloudstream3.*
|
import com.lagradost.cloudstream3.*
|
||||||
import com.lagradost.cloudstream3.APIHolder.apis
|
import com.lagradost.cloudstream3.APIHolder.apis
|
||||||
import com.lagradost.cloudstream3.APIHolder.getId
|
import com.lagradost.cloudstream3.APIHolder.getApiFromNameNull
|
||||||
import com.lagradost.cloudstream3.APIHolder.unixTime
|
import com.lagradost.cloudstream3.APIHolder.unixTime
|
||||||
import com.lagradost.cloudstream3.APIHolder.unixTimeMS
|
import com.lagradost.cloudstream3.APIHolder.unixTimeMS
|
||||||
import com.lagradost.cloudstream3.AcraApplication.Companion.setKey
|
import com.lagradost.cloudstream3.AcraApplication.Companion.setKey
|
||||||
|
@ -27,9 +27,9 @@ import com.lagradost.cloudstream3.CommonActivity.getCastSession
|
||||||
import com.lagradost.cloudstream3.CommonActivity.showToast
|
import com.lagradost.cloudstream3.CommonActivity.showToast
|
||||||
import com.lagradost.cloudstream3.LoadResponse.Companion.addTrailer
|
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.getImdbId
|
|
||||||
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.LoadResponse.Companion.readIdFromString
|
||||||
import com.lagradost.cloudstream3.MainActivity.Companion.MPV
|
import com.lagradost.cloudstream3.MainActivity.Companion.MPV
|
||||||
import com.lagradost.cloudstream3.MainActivity.Companion.MPV_COMPONENT
|
import com.lagradost.cloudstream3.MainActivity.Companion.MPV_COMPONENT
|
||||||
import com.lagradost.cloudstream3.MainActivity.Companion.MPV_PACKAGE
|
import com.lagradost.cloudstream3.MainActivity.Companion.MPV_PACKAGE
|
||||||
|
@ -56,10 +56,11 @@ import com.lagradost.cloudstream3.ui.player.SubtitleData
|
||||||
import com.lagradost.cloudstream3.ui.result.EpisodeAdapter.Companion.getPlayerAction
|
import com.lagradost.cloudstream3.ui.result.EpisodeAdapter.Companion.getPlayerAction
|
||||||
import com.lagradost.cloudstream3.ui.subtitles.SubtitlesFragment
|
import com.lagradost.cloudstream3.ui.subtitles.SubtitlesFragment
|
||||||
import com.lagradost.cloudstream3.utils.*
|
import com.lagradost.cloudstream3.utils.*
|
||||||
import com.lagradost.cloudstream3.utils.AppUtils.getNameFull
|
import com.lagradost.cloudstream3.utils.AppContextUtils.getNameFull
|
||||||
import com.lagradost.cloudstream3.utils.AppUtils.isAppInstalled
|
import com.lagradost.cloudstream3.utils.AppContextUtils.isAppInstalled
|
||||||
import com.lagradost.cloudstream3.utils.AppUtils.isConnectedToChromecast
|
import com.lagradost.cloudstream3.utils.AppContextUtils.isConnectedToChromecast
|
||||||
import com.lagradost.cloudstream3.utils.AppUtils.setDefaultFocus
|
import com.lagradost.cloudstream3.utils.AppContextUtils.setDefaultFocus
|
||||||
|
import com.lagradost.cloudstream3.utils.AppContextUtils.sortSubs
|
||||||
import com.lagradost.cloudstream3.utils.CastHelper.startCast
|
import com.lagradost.cloudstream3.utils.CastHelper.startCast
|
||||||
import com.lagradost.cloudstream3.utils.Coroutines.ioSafe
|
import com.lagradost.cloudstream3.utils.Coroutines.ioSafe
|
||||||
import com.lagradost.cloudstream3.utils.Coroutines.ioWork
|
import com.lagradost.cloudstream3.utils.Coroutines.ioWork
|
||||||
|
@ -301,6 +302,23 @@ fun LoadResponse.toResultData(repo: APIRepository): ResultData {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
data class ExtractorSubtitleLink(
|
||||||
|
val name: String,
|
||||||
|
override val url: String,
|
||||||
|
override val referer: String,
|
||||||
|
override val headers: Map<String, String> = mapOf()
|
||||||
|
) : IDownloadableMinimum
|
||||||
|
|
||||||
|
fun LoadResponse.getId(): Int {
|
||||||
|
// this fixes an issue with outdated api as getLoadResponseIdFromUrl might be fucked
|
||||||
|
return (if (this is ResultViewModel2.LoadResponseFromSearch) this.id else null)
|
||||||
|
?: getLoadResponseIdFromUrl(url, apiName)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getLoadResponseIdFromUrl(url: String, apiName: String): Int {
|
||||||
|
return url.replace(getApiFromNameNull(apiName)?.mainUrl ?: "", "").replace("/", "")
|
||||||
|
.hashCode()
|
||||||
|
}
|
||||||
|
|
||||||
data class LinkProgress(
|
data class LinkProgress(
|
||||||
val linksLoaded: Int,
|
val linksLoaded: Int,
|
||||||
|
@ -856,7 +874,7 @@ class ResultViewModel2 : ViewModel() {
|
||||||
loadResponse: LoadResponse? = null,
|
loadResponse: LoadResponse? = null,
|
||||||
statusChangedCallback: ((statusChanged: Boolean) -> Unit)? = null
|
statusChangedCallback: ((statusChanged: Boolean) -> Unit)? = null
|
||||||
) {
|
) {
|
||||||
val (response,currentId) = loadResponse?.let { load ->
|
val (response, currentId) = loadResponse?.let { load ->
|
||||||
(load to load.getId())
|
(load to load.getId())
|
||||||
} ?: ((currentResponse ?: return) to (currentId ?: return))
|
} ?: ((currentResponse ?: return) to (currentId ?: return))
|
||||||
|
|
||||||
|
@ -1140,12 +1158,16 @@ class ResultViewModel2 : ViewModel() {
|
||||||
|
|
||||||
val message = if (duplicateEntries.size == 1) {
|
val message = if (duplicateEntries.size == 1) {
|
||||||
val list = when (listType) {
|
val list = when (listType) {
|
||||||
LibraryListType.BOOKMARKS -> getResultWatchState(duplicateEntries[0].id ?: 0).stringRes
|
LibraryListType.BOOKMARKS -> getResultWatchState(
|
||||||
|
duplicateEntries[0].id ?: 0
|
||||||
|
).stringRes
|
||||||
|
|
||||||
LibraryListType.FAVORITES -> R.string.favorites_list_name
|
LibraryListType.FAVORITES -> R.string.favorites_list_name
|
||||||
LibraryListType.SUBSCRIPTIONS -> R.string.subscription_list_name
|
LibraryListType.SUBSCRIPTIONS -> R.string.subscription_list_name
|
||||||
}
|
}
|
||||||
|
|
||||||
context.getString(R.string.duplicate_message_single,
|
context.getString(
|
||||||
|
R.string.duplicate_message_single,
|
||||||
"${normalizeString(duplicateEntries[0].name)} (${context.getString(list)}) — ${duplicateEntries[0].apiName}"
|
"${normalizeString(duplicateEntries[0].name)} (${context.getString(list)}) — ${duplicateEntries[0].apiName}"
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
|
@ -1170,9 +1192,11 @@ class ResultViewModel2 : ViewModel() {
|
||||||
DialogInterface.BUTTON_POSITIVE -> {
|
DialogInterface.BUTTON_POSITIVE -> {
|
||||||
checkDuplicatesCallback.invoke(true, emptyList())
|
checkDuplicatesCallback.invoke(true, emptyList())
|
||||||
}
|
}
|
||||||
|
|
||||||
DialogInterface.BUTTON_NEGATIVE -> {
|
DialogInterface.BUTTON_NEGATIVE -> {
|
||||||
checkDuplicatesCallback.invoke(false, emptyList())
|
checkDuplicatesCallback.invoke(false, emptyList())
|
||||||
}
|
}
|
||||||
|
|
||||||
DialogInterface.BUTTON_NEUTRAL -> {
|
DialogInterface.BUTTON_NEUTRAL -> {
|
||||||
checkDuplicatesCallback.invoke(true, duplicateEntries.map { it.id })
|
checkDuplicatesCallback.invoke(true, duplicateEntries.map { it.id })
|
||||||
}
|
}
|
||||||
|
@ -1189,17 +1213,17 @@ class ResultViewModel2 : ViewModel() {
|
||||||
|
|
||||||
private fun getImdbIdFromSyncData(syncData: Map<String, String>?): String? {
|
private fun getImdbIdFromSyncData(syncData: Map<String, String>?): String? {
|
||||||
return normalSafeApiCall {
|
return normalSafeApiCall {
|
||||||
SimklApi.readIdFromString(
|
readIdFromString(
|
||||||
syncData?.get(AccountManager.simklApi.idPrefix)
|
syncData?.get(AccountManager.simklApi.idPrefix)
|
||||||
)[SimklApi.Companion.SyncServices.Imdb]
|
)[SimklSyncServices.Imdb]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getTMDbIdFromSyncData(syncData: Map<String, String>?): String? {
|
private fun getTMDbIdFromSyncData(syncData: Map<String, String>?): String? {
|
||||||
return normalSafeApiCall {
|
return normalSafeApiCall {
|
||||||
SimklApi.readIdFromString(
|
readIdFromString(
|
||||||
syncData?.get(AccountManager.simklApi.idPrefix)
|
syncData?.get(AccountManager.simklApi.idPrefix)
|
||||||
)[SimklApi.Companion.SyncServices.Tmdb]
|
)[SimklSyncServices.Tmdb]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1303,7 +1327,8 @@ class ResultViewModel2 : ViewModel() {
|
||||||
postPopup(
|
postPopup(
|
||||||
text,
|
text,
|
||||||
links.links.apmap {
|
links.links.apmap {
|
||||||
val size = it.getVideoSize()?.let { size -> " " + formatFileSize(context, size) } ?: ""
|
val size =
|
||||||
|
it.getVideoSize()?.let { size -> " " + formatFileSize(context, size) } ?: ""
|
||||||
txt("${it.name} ${Qualities.getStringByInt(it.quality)}$size")
|
txt("${it.name} ${Qualities.getStringByInt(it.quality)}$size")
|
||||||
}) {
|
}) {
|
||||||
callback.invoke(links to (it ?: return@postPopup))
|
callback.invoke(links to (it ?: return@postPopup))
|
||||||
|
@ -1928,7 +1953,8 @@ class ResultViewModel2 : ViewModel() {
|
||||||
.distinct().map {
|
.distinct().map {
|
||||||
// this actually would be nice if we improved a bit as 3rd season == season 3 == III ect
|
// this actually would be nice if we improved a bit as 3rd season == season 3 == III ect
|
||||||
// right now it just removes the dubbed status
|
// right now it just removes the dubbed status
|
||||||
it.lowercase().replace(Regex("""\(?[ds]ub(bed)?\)?(\s|$)""") , "").trim()
|
it.lowercase().replace(Regex("""\(?[ds]ub(bed)?\)?(\s|$)"""), "")
|
||||||
|
.trim()
|
||||||
},
|
},
|
||||||
TrackerType.getTypes(this.type),
|
TrackerType.getTypes(this.type),
|
||||||
this.year
|
this.year
|
||||||
|
@ -2276,7 +2302,7 @@ class ResultViewModel2 : ViewModel() {
|
||||||
|
|
||||||
private suspend fun postSuccessful(
|
private suspend fun postSuccessful(
|
||||||
loadResponse: LoadResponse,
|
loadResponse: LoadResponse,
|
||||||
mainId : Int,
|
mainId: Int,
|
||||||
apiRepository: APIRepository,
|
apiRepository: APIRepository,
|
||||||
updateEpisodes: Boolean,
|
updateEpisodes: Boolean,
|
||||||
updateFillers: Boolean,
|
updateFillers: Boolean,
|
||||||
|
@ -2292,7 +2318,11 @@ class ResultViewModel2 : ViewModel() {
|
||||||
postEpisodes(loadResponse, mainId, updateFillers)
|
postEpisodes(loadResponse, mainId, updateFillers)
|
||||||
}
|
}
|
||||||
|
|
||||||
private suspend fun postEpisodes(loadResponse: LoadResponse, mainId : Int, updateFillers: Boolean) {
|
private suspend fun postEpisodes(
|
||||||
|
loadResponse: LoadResponse,
|
||||||
|
mainId: Int,
|
||||||
|
updateFillers: Boolean
|
||||||
|
) {
|
||||||
_episodes.postValue(Resource.Loading())
|
_episodes.postValue(Resource.Loading())
|
||||||
|
|
||||||
if (updateFillers && loadResponse is AnimeLoadResponse) {
|
if (updateFillers && loadResponse is AnimeLoadResponse) {
|
||||||
|
@ -2313,7 +2343,12 @@ class ResultViewModel2 : ViewModel() {
|
||||||
?: 0)
|
?: 0)
|
||||||
|
|
||||||
val totalIndex =
|
val totalIndex =
|
||||||
i.season?.let { season -> loadResponse.getTotalEpisodeIndex(episode, season) }
|
i.season?.let { season ->
|
||||||
|
loadResponse.getTotalEpisodeIndex(
|
||||||
|
episode,
|
||||||
|
season
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
if (!existingEpisodes.contains(id)) {
|
if (!existingEpisodes.contains(id)) {
|
||||||
existingEpisodes.add(id)
|
existingEpisodes.add(id)
|
||||||
|
@ -2366,7 +2401,12 @@ class ResultViewModel2 : ViewModel() {
|
||||||
loadResponse.seasonNames.getSeason(episode.season)
|
loadResponse.seasonNames.getSeason(episode.season)
|
||||||
|
|
||||||
val totalIndex =
|
val totalIndex =
|
||||||
episode.season?.let { season -> loadResponse.getTotalEpisodeIndex(episodeIndex, season) }
|
episode.season?.let { season ->
|
||||||
|
loadResponse.getTotalEpisodeIndex(
|
||||||
|
episodeIndex,
|
||||||
|
season
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
val ep =
|
val ep =
|
||||||
buildResultEpisode(
|
buildResultEpisode(
|
||||||
|
@ -2546,7 +2586,13 @@ class ResultViewModel2 : ViewModel() {
|
||||||
ResumeProgress(
|
ResumeProgress(
|
||||||
progress = (viewPos.position / 1000).toInt(),
|
progress = (viewPos.position / 1000).toInt(),
|
||||||
maxProgress = (viewPos.duration / 1000).toInt(),
|
maxProgress = (viewPos.duration / 1000).toInt(),
|
||||||
txt(R.string.resume_remaining, secondsToReadable(((viewPos.duration - viewPos.position) / 1_000).toInt(), "0 mins"))
|
txt(
|
||||||
|
R.string.resume_remaining,
|
||||||
|
secondsToReadable(
|
||||||
|
((viewPos.duration - viewPos.position) / 1_000).toInt(),
|
||||||
|
"0 mins"
|
||||||
|
)
|
||||||
|
)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2672,17 +2718,26 @@ class ResultViewModel2 : ViewModel() {
|
||||||
override var posterHeaders: Map<String, String>? = null,
|
override var posterHeaders: Map<String, String>? = null,
|
||||||
override var backgroundPosterUrl: String? = null,
|
override var backgroundPosterUrl: String? = null,
|
||||||
override var contentRating: String? = null,
|
override var contentRating: String? = null,
|
||||||
val id : Int?,
|
val id: Int?,
|
||||||
) : LoadResponse
|
) : LoadResponse
|
||||||
|
|
||||||
fun loadSmall(activity: Activity?, searchResponse : SearchResponse) = ioSafe {
|
fun loadSmall(activity: Activity?, searchResponse: SearchResponse) = ioSafe {
|
||||||
val url = searchResponse.url
|
val url = searchResponse.url
|
||||||
_page.postValue(Resource.Loading(url))
|
_page.postValue(Resource.Loading(url))
|
||||||
_episodes.postValue(Resource.Loading())
|
_episodes.postValue(Resource.Loading())
|
||||||
val api = APIHolder.getApiFromNameNull(searchResponse.apiName) ?: APIHolder.getApiFromUrlNull(searchResponse.url) ?: APIRepository.noneApi
|
val api =
|
||||||
|
APIHolder.getApiFromNameNull(searchResponse.apiName) ?: APIHolder.getApiFromUrlNull(
|
||||||
|
searchResponse.url
|
||||||
|
) ?: APIRepository.noneApi
|
||||||
val repo = APIRepository(api)
|
val repo = APIRepository(api)
|
||||||
val response = LoadResponseFromSearch(name = searchResponse.name, url = searchResponse.url, apiName = api.name, type = searchResponse.type ?: TvType.Others,
|
val response = LoadResponseFromSearch(
|
||||||
posterUrl = searchResponse.posterUrl, id = searchResponse.id).apply {
|
name = searchResponse.name,
|
||||||
|
url = searchResponse.url,
|
||||||
|
apiName = api.name,
|
||||||
|
type = searchResponse.type ?: TvType.Others,
|
||||||
|
posterUrl = searchResponse.posterUrl,
|
||||||
|
id = searchResponse.id
|
||||||
|
).apply {
|
||||||
if (searchResponse is SyncAPI.LibraryItem) {
|
if (searchResponse is SyncAPI.LibraryItem) {
|
||||||
this.plot = searchResponse.plot
|
this.plot = searchResponse.plot
|
||||||
this.rating = searchResponse.personalRating?.times(100) ?: searchResponse.rating
|
this.rating = searchResponse.personalRating?.times(100) ?: searchResponse.rating
|
||||||
|
@ -2701,7 +2756,8 @@ class ResultViewModel2 : ViewModel() {
|
||||||
mainId = mainId,
|
mainId = mainId,
|
||||||
apiRepository = repo,
|
apiRepository = repo,
|
||||||
updateEpisodes = false,
|
updateEpisodes = false,
|
||||||
updateFillers = false)
|
updateFillers = false
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun load(
|
fun load(
|
||||||
|
|
|
@ -10,7 +10,7 @@ import androidx.annotation.StringRes
|
||||||
import androidx.core.view.isGone
|
import androidx.core.view.isGone
|
||||||
import androidx.core.view.isVisible
|
import androidx.core.view.isVisible
|
||||||
import com.lagradost.cloudstream3.mvvm.logError
|
import com.lagradost.cloudstream3.mvvm.logError
|
||||||
import com.lagradost.cloudstream3.utils.AppUtils.html
|
import com.lagradost.cloudstream3.utils.AppContextUtils.html
|
||||||
import com.lagradost.cloudstream3.utils.UIHelper.setImage
|
import com.lagradost.cloudstream3.utils.UIHelper.setImage
|
||||||
|
|
||||||
sealed class UiText {
|
sealed class UiText {
|
||||||
|
|
|
@ -24,11 +24,7 @@ import androidx.recyclerview.widget.RecyclerView
|
||||||
import com.google.android.material.bottomsheet.BottomSheetBehavior
|
import com.google.android.material.bottomsheet.BottomSheetBehavior
|
||||||
import com.google.android.material.bottomsheet.BottomSheetDialog
|
import com.google.android.material.bottomsheet.BottomSheetDialog
|
||||||
import com.google.android.material.button.MaterialButton
|
import com.google.android.material.button.MaterialButton
|
||||||
import com.lagradost.cloudstream3.APIHolder.filterProviderByPreferredMedia
|
|
||||||
import com.lagradost.cloudstream3.APIHolder.filterSearchResultByFilmQuality
|
|
||||||
import com.lagradost.cloudstream3.APIHolder.getApiFromNameNull
|
import com.lagradost.cloudstream3.APIHolder.getApiFromNameNull
|
||||||
import com.lagradost.cloudstream3.APIHolder.getApiProviderLangSettings
|
|
||||||
import com.lagradost.cloudstream3.APIHolder.getApiSettings
|
|
||||||
import com.lagradost.cloudstream3.AcraApplication.Companion.removeKey
|
import com.lagradost.cloudstream3.AcraApplication.Companion.removeKey
|
||||||
import com.lagradost.cloudstream3.AcraApplication.Companion.removeKeys
|
import com.lagradost.cloudstream3.AcraApplication.Companion.removeKeys
|
||||||
import com.lagradost.cloudstream3.AllLanguagesName
|
import com.lagradost.cloudstream3.AllLanguagesName
|
||||||
|
@ -58,9 +54,13 @@ import com.lagradost.cloudstream3.ui.result.setLinearListLayout
|
||||||
import com.lagradost.cloudstream3.ui.settings.Globals.EMULATOR
|
import com.lagradost.cloudstream3.ui.settings.Globals.EMULATOR
|
||||||
import com.lagradost.cloudstream3.ui.settings.Globals.TV
|
import com.lagradost.cloudstream3.ui.settings.Globals.TV
|
||||||
import com.lagradost.cloudstream3.ui.settings.Globals.isLayout
|
import com.lagradost.cloudstream3.ui.settings.Globals.isLayout
|
||||||
import com.lagradost.cloudstream3.utils.AppUtils.ownHide
|
import com.lagradost.cloudstream3.utils.AppContextUtils.filterProviderByPreferredMedia
|
||||||
import com.lagradost.cloudstream3.utils.AppUtils.ownShow
|
import com.lagradost.cloudstream3.utils.AppContextUtils.filterSearchResultByFilmQuality
|
||||||
import com.lagradost.cloudstream3.utils.AppUtils.setDefaultFocus
|
import com.lagradost.cloudstream3.utils.AppContextUtils.getApiProviderLangSettings
|
||||||
|
import com.lagradost.cloudstream3.utils.AppContextUtils.getApiSettings
|
||||||
|
import com.lagradost.cloudstream3.utils.AppContextUtils.ownHide
|
||||||
|
import com.lagradost.cloudstream3.utils.AppContextUtils.ownShow
|
||||||
|
import com.lagradost.cloudstream3.utils.AppContextUtils.setDefaultFocus
|
||||||
import com.lagradost.cloudstream3.utils.Coroutines.main
|
import com.lagradost.cloudstream3.utils.Coroutines.main
|
||||||
import com.lagradost.cloudstream3.utils.DataStoreHelper
|
import com.lagradost.cloudstream3.utils.DataStoreHelper
|
||||||
import com.lagradost.cloudstream3.utils.DataStoreHelper.currentAccount
|
import com.lagradost.cloudstream3.utils.DataStoreHelper.currentAccount
|
||||||
|
|
|
@ -11,7 +11,7 @@ import com.lagradost.cloudstream3.ui.download.DownloadClickEvent
|
||||||
import com.lagradost.cloudstream3.ui.result.START_ACTION_LOAD_EP
|
import com.lagradost.cloudstream3.ui.result.START_ACTION_LOAD_EP
|
||||||
import com.lagradost.cloudstream3.ui.settings.Globals.PHONE
|
import com.lagradost.cloudstream3.ui.settings.Globals.PHONE
|
||||||
import com.lagradost.cloudstream3.ui.settings.Globals.isLayout
|
import com.lagradost.cloudstream3.ui.settings.Globals.isLayout
|
||||||
import com.lagradost.cloudstream3.utils.AppUtils.loadSearchResult
|
import com.lagradost.cloudstream3.utils.AppContextUtils.loadSearchResult
|
||||||
import com.lagradost.cloudstream3.utils.DataStoreHelper
|
import com.lagradost.cloudstream3.utils.DataStoreHelper
|
||||||
import com.lagradost.cloudstream3.utils.VideoDownloadHelper
|
import com.lagradost.cloudstream3.utils.VideoDownloadHelper
|
||||||
|
|
||||||
|
|
|
@ -19,7 +19,7 @@ import com.lagradost.cloudstream3.isMovieType
|
||||||
import com.lagradost.cloudstream3.syncproviders.SyncAPI
|
import com.lagradost.cloudstream3.syncproviders.SyncAPI
|
||||||
import com.lagradost.cloudstream3.ui.settings.Globals.TV
|
import com.lagradost.cloudstream3.ui.settings.Globals.TV
|
||||||
import com.lagradost.cloudstream3.ui.settings.Globals.isLayout
|
import com.lagradost.cloudstream3.ui.settings.Globals.isLayout
|
||||||
import com.lagradost.cloudstream3.utils.AppUtils.getNameFull
|
import com.lagradost.cloudstream3.utils.AppContextUtils.getNameFull
|
||||||
import com.lagradost.cloudstream3.utils.DataStoreHelper
|
import com.lagradost.cloudstream3.utils.DataStoreHelper
|
||||||
import com.lagradost.cloudstream3.utils.DataStoreHelper.fixVisual
|
import com.lagradost.cloudstream3.utils.DataStoreHelper.fixVisual
|
||||||
import com.lagradost.cloudstream3.utils.SubtitleHelper
|
import com.lagradost.cloudstream3.utils.SubtitleHelper
|
||||||
|
|
|
@ -9,8 +9,6 @@ import android.view.inputmethod.EditorInfo
|
||||||
import android.widget.TextView
|
import android.widget.TextView
|
||||||
import androidx.annotation.UiThread
|
import androidx.annotation.UiThread
|
||||||
import androidx.appcompat.app.AlertDialog
|
import androidx.appcompat.app.AlertDialog
|
||||||
import androidx.core.content.ContextCompat
|
|
||||||
import androidx.core.graphics.drawable.toBitmapOrNull
|
|
||||||
import androidx.core.view.isGone
|
import androidx.core.view.isGone
|
||||||
import androidx.core.view.isVisible
|
import androidx.core.view.isVisible
|
||||||
import androidx.fragment.app.FragmentActivity
|
import androidx.fragment.app.FragmentActivity
|
||||||
|
@ -49,7 +47,7 @@ import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.hideOn
|
||||||
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.setPaddingBottom
|
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.setPaddingBottom
|
||||||
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.setToolBarScrollFlags
|
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.setToolBarScrollFlags
|
||||||
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.setUpToolbar
|
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.setUpToolbar
|
||||||
import com.lagradost.cloudstream3.utils.AppUtils.html
|
import com.lagradost.cloudstream3.utils.AppContextUtils.html
|
||||||
import com.lagradost.cloudstream3.utils.BackupUtils
|
import com.lagradost.cloudstream3.utils.BackupUtils
|
||||||
import com.lagradost.cloudstream3.utils.BiometricAuthenticator.BiometricCallback
|
import com.lagradost.cloudstream3.utils.BiometricAuthenticator.BiometricCallback
|
||||||
import com.lagradost.cloudstream3.utils.BiometricAuthenticator.authCallback
|
import com.lagradost.cloudstream3.utils.BiometricAuthenticator.authCallback
|
||||||
|
@ -64,9 +62,7 @@ import com.lagradost.cloudstream3.utils.UIHelper.colorFromAttribute
|
||||||
import com.lagradost.cloudstream3.utils.UIHelper.dismissSafe
|
import com.lagradost.cloudstream3.utils.UIHelper.dismissSafe
|
||||||
import com.lagradost.cloudstream3.utils.UIHelper.hideKeyboard
|
import com.lagradost.cloudstream3.utils.UIHelper.hideKeyboard
|
||||||
import com.lagradost.cloudstream3.utils.UIHelper.setImage
|
import com.lagradost.cloudstream3.utils.UIHelper.setImage
|
||||||
import com.lagradost.cloudstream3.utils.UIHelper.toPx
|
|
||||||
import qrcode.QRCode
|
import qrcode.QRCode
|
||||||
import java.io.ByteArrayOutputStream
|
|
||||||
|
|
||||||
class SettingsAccount : PreferenceFragmentCompat(), BiometricCallback {
|
class SettingsAccount : PreferenceFragmentCompat(), BiometricCallback {
|
||||||
companion object {
|
companion object {
|
||||||
|
|
|
@ -7,19 +7,17 @@ import androidx.navigation.fragment.findNavController
|
||||||
import androidx.preference.PreferenceFragmentCompat
|
import androidx.preference.PreferenceFragmentCompat
|
||||||
import androidx.preference.PreferenceManager
|
import androidx.preference.PreferenceManager
|
||||||
import com.lagradost.cloudstream3.*
|
import com.lagradost.cloudstream3.*
|
||||||
import com.lagradost.cloudstream3.APIHolder.getApiDubstatusSettings
|
|
||||||
import com.lagradost.cloudstream3.APIHolder.getApiProviderLangSettings
|
|
||||||
import com.lagradost.cloudstream3.AcraApplication.Companion.removeKey
|
|
||||||
import com.lagradost.cloudstream3.ui.APIRepository
|
import com.lagradost.cloudstream3.ui.APIRepository
|
||||||
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.getPref
|
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.getPref
|
||||||
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.setPaddingBottom
|
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.setPaddingBottom
|
||||||
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.setToolBarScrollFlags
|
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.setToolBarScrollFlags
|
||||||
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.setUpToolbar
|
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.setUpToolbar
|
||||||
|
import com.lagradost.cloudstream3.utils.AppContextUtils.getApiDubstatusSettings
|
||||||
|
import com.lagradost.cloudstream3.utils.AppContextUtils.getApiProviderLangSettings
|
||||||
import com.lagradost.cloudstream3.utils.DataStoreHelper
|
import com.lagradost.cloudstream3.utils.DataStoreHelper
|
||||||
import com.lagradost.cloudstream3.utils.SingleSelectionHelper.showMultiDialog
|
import com.lagradost.cloudstream3.utils.SingleSelectionHelper.showMultiDialog
|
||||||
import com.lagradost.cloudstream3.utils.SubtitleHelper
|
import com.lagradost.cloudstream3.utils.SubtitleHelper
|
||||||
import com.lagradost.cloudstream3.utils.UIHelper.hideKeyboard
|
import com.lagradost.cloudstream3.utils.UIHelper.hideKeyboard
|
||||||
import com.lagradost.cloudstream3.utils.UIHelper.navigate
|
|
||||||
|
|
||||||
class SettingsProviders : PreferenceFragmentCompat() {
|
class SettingsProviders : PreferenceFragmentCompat() {
|
||||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||||
|
|
|
@ -33,8 +33,8 @@ import com.lagradost.cloudstream3.ui.settings.Globals.TV
|
||||||
import com.lagradost.cloudstream3.ui.settings.Globals.isLayout
|
import com.lagradost.cloudstream3.ui.settings.Globals.isLayout
|
||||||
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.setToolBarScrollFlags
|
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.setToolBarScrollFlags
|
||||||
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.setUpToolbar
|
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.setUpToolbar
|
||||||
import com.lagradost.cloudstream3.utils.AppUtils.addRepositoryDialog
|
import com.lagradost.cloudstream3.utils.AppContextUtils.addRepositoryDialog
|
||||||
import com.lagradost.cloudstream3.utils.AppUtils.setDefaultFocus
|
import com.lagradost.cloudstream3.utils.AppContextUtils.setDefaultFocus
|
||||||
import com.lagradost.cloudstream3.utils.Coroutines.ioSafe
|
import com.lagradost.cloudstream3.utils.Coroutines.ioSafe
|
||||||
import com.lagradost.cloudstream3.utils.Coroutines.main
|
import com.lagradost.cloudstream3.utils.Coroutines.main
|
||||||
import com.lagradost.cloudstream3.utils.UIHelper.dismissSafe
|
import com.lagradost.cloudstream3.utils.UIHelper.dismissSafe
|
||||||
|
|
|
@ -20,7 +20,7 @@ import com.lagradost.cloudstream3.ui.result.setText
|
||||||
import com.lagradost.cloudstream3.ui.result.txt
|
import com.lagradost.cloudstream3.ui.result.txt
|
||||||
import com.lagradost.cloudstream3.ui.settings.Globals.TV
|
import com.lagradost.cloudstream3.ui.settings.Globals.TV
|
||||||
import com.lagradost.cloudstream3.ui.settings.Globals.isLayout
|
import com.lagradost.cloudstream3.ui.settings.Globals.isLayout
|
||||||
import com.lagradost.cloudstream3.utils.AppUtils.html
|
import com.lagradost.cloudstream3.utils.AppContextUtils.html
|
||||||
import com.lagradost.cloudstream3.utils.Coroutines.ioSafe
|
import com.lagradost.cloudstream3.utils.Coroutines.ioSafe
|
||||||
import com.lagradost.cloudstream3.utils.Coroutines.main
|
import com.lagradost.cloudstream3.utils.Coroutines.main
|
||||||
import com.lagradost.cloudstream3.utils.SubtitleHelper.fromTwoLettersToLanguage
|
import com.lagradost.cloudstream3.utils.SubtitleHelper.fromTwoLettersToLanguage
|
||||||
|
|
|
@ -8,7 +8,6 @@ import androidx.appcompat.widget.SearchView
|
||||||
import androidx.core.view.isVisible
|
import androidx.core.view.isVisible
|
||||||
import androidx.fragment.app.Fragment
|
import androidx.fragment.app.Fragment
|
||||||
import androidx.fragment.app.activityViewModels
|
import androidx.fragment.app.activityViewModels
|
||||||
import com.lagradost.cloudstream3.APIHolder.getApiProviderLangSettings
|
|
||||||
import com.lagradost.cloudstream3.AllLanguagesName
|
import com.lagradost.cloudstream3.AllLanguagesName
|
||||||
import com.lagradost.cloudstream3.BuildConfig
|
import com.lagradost.cloudstream3.BuildConfig
|
||||||
import com.lagradost.cloudstream3.R
|
import com.lagradost.cloudstream3.R
|
||||||
|
@ -24,6 +23,7 @@ import com.lagradost.cloudstream3.ui.settings.Globals.isLayout
|
||||||
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.setToolBarScrollFlags
|
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.setToolBarScrollFlags
|
||||||
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.setUpToolbar
|
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.setUpToolbar
|
||||||
import com.lagradost.cloudstream3.ui.settings.appLanguages
|
import com.lagradost.cloudstream3.ui.settings.appLanguages
|
||||||
|
import com.lagradost.cloudstream3.utils.AppContextUtils.getApiProviderLangSettings
|
||||||
import com.lagradost.cloudstream3.utils.SingleSelectionHelper.showMultiDialog
|
import com.lagradost.cloudstream3.utils.SingleSelectionHelper.showMultiDialog
|
||||||
import com.lagradost.cloudstream3.utils.SubtitleHelper
|
import com.lagradost.cloudstream3.utils.SubtitleHelper
|
||||||
import com.lagradost.cloudstream3.utils.UIHelper.toPx
|
import com.lagradost.cloudstream3.utils.UIHelper.toPx
|
||||||
|
|
|
@ -15,7 +15,7 @@ import com.lagradost.cloudstream3.databinding.ProviderTestItemBinding
|
||||||
import com.lagradost.cloudstream3.mvvm.getAllMessages
|
import com.lagradost.cloudstream3.mvvm.getAllMessages
|
||||||
import com.lagradost.cloudstream3.mvvm.getStackTracePretty
|
import com.lagradost.cloudstream3.mvvm.getStackTracePretty
|
||||||
import com.lagradost.cloudstream3.plugins.PluginManager
|
import com.lagradost.cloudstream3.plugins.PluginManager
|
||||||
import com.lagradost.cloudstream3.utils.AppUtils
|
import com.lagradost.cloudstream3.utils.AppContextUtils
|
||||||
import com.lagradost.cloudstream3.utils.Coroutines.ioSafe
|
import com.lagradost.cloudstream3.utils.Coroutines.ioSafe
|
||||||
import com.lagradost.cloudstream3.utils.Coroutines.runOnMainThread
|
import com.lagradost.cloudstream3.utils.Coroutines.runOnMainThread
|
||||||
import com.lagradost.cloudstream3.utils.SubtitleHelper.getFlagFromIso
|
import com.lagradost.cloudstream3.utils.SubtitleHelper.getFlagFromIso
|
||||||
|
@ -23,7 +23,7 @@ import com.lagradost.cloudstream3.utils.TestingUtils
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
|
||||||
class TestResultAdapter(override val items: MutableList<Pair<MainAPI, TestingUtils.TestResultProvider>>) :
|
class TestResultAdapter(override val items: MutableList<Pair<MainAPI, TestingUtils.TestResultProvider>>) :
|
||||||
AppUtils.DiffAdapter<Pair<MainAPI, TestingUtils.TestResultProvider>>(items) {
|
AppContextUtils.DiffAdapter<Pair<MainAPI, TestingUtils.TestResultProvider>>(items) {
|
||||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
|
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
|
||||||
return ProviderTestViewHolder(
|
return ProviderTestViewHolder(
|
||||||
ProviderTestItemBinding.inflate(LayoutInflater.from(parent.context), parent, false)
|
ProviderTestItemBinding.inflate(LayoutInflater.from(parent.context), parent, false)
|
||||||
|
|
|
@ -13,7 +13,7 @@ import androidx.core.view.isVisible
|
||||||
import androidx.core.widget.ContentLoadingProgressBar
|
import androidx.core.widget.ContentLoadingProgressBar
|
||||||
import com.google.android.material.button.MaterialButton
|
import com.google.android.material.button.MaterialButton
|
||||||
import com.lagradost.cloudstream3.R
|
import com.lagradost.cloudstream3.R
|
||||||
import com.lagradost.cloudstream3.utils.AppUtils.animateProgressTo
|
import com.lagradost.cloudstream3.utils.AppContextUtils.animateProgressTo
|
||||||
|
|
||||||
class TestView @JvmOverloads constructor(
|
class TestView @JvmOverloads constructor(
|
||||||
context: Context,
|
context: Context,
|
||||||
|
|
|
@ -11,11 +11,11 @@ import androidx.fragment.app.Fragment
|
||||||
import androidx.navigation.fragment.findNavController
|
import androidx.navigation.fragment.findNavController
|
||||||
import androidx.preference.PreferenceManager
|
import androidx.preference.PreferenceManager
|
||||||
import com.lagradost.cloudstream3.APIHolder
|
import com.lagradost.cloudstream3.APIHolder
|
||||||
import com.lagradost.cloudstream3.APIHolder.getApiProviderLangSettings
|
|
||||||
import com.lagradost.cloudstream3.AllLanguagesName
|
import com.lagradost.cloudstream3.AllLanguagesName
|
||||||
import com.lagradost.cloudstream3.R
|
import com.lagradost.cloudstream3.R
|
||||||
import com.lagradost.cloudstream3.databinding.FragmentSetupProviderLanguagesBinding
|
import com.lagradost.cloudstream3.databinding.FragmentSetupProviderLanguagesBinding
|
||||||
import com.lagradost.cloudstream3.mvvm.normalSafeApiCall
|
import com.lagradost.cloudstream3.mvvm.normalSafeApiCall
|
||||||
|
import com.lagradost.cloudstream3.utils.AppContextUtils.getApiProviderLangSettings
|
||||||
import com.lagradost.cloudstream3.utils.SubtitleHelper
|
import com.lagradost.cloudstream3.utils.SubtitleHelper
|
||||||
import com.lagradost.cloudstream3.utils.UIHelper.fixPaddingStatusbar
|
import com.lagradost.cloudstream3.utils.UIHelper.fixPaddingStatusbar
|
||||||
|
|
||||||
|
|
|
@ -51,6 +51,7 @@ import com.google.android.gms.common.GoogleApiAvailability
|
||||||
import com.google.android.gms.common.wrappers.Wrappers
|
import com.google.android.gms.common.wrappers.Wrappers
|
||||||
import com.google.android.material.bottomsheet.BottomSheetDialog
|
import com.google.android.material.bottomsheet.BottomSheetDialog
|
||||||
import com.lagradost.cloudstream3.*
|
import com.lagradost.cloudstream3.*
|
||||||
|
import com.lagradost.cloudstream3.APIHolder.apis
|
||||||
import com.lagradost.cloudstream3.CommonActivity.activity
|
import com.lagradost.cloudstream3.CommonActivity.activity
|
||||||
import com.lagradost.cloudstream3.CommonActivity.showToast
|
import com.lagradost.cloudstream3.CommonActivity.showToast
|
||||||
import com.lagradost.cloudstream3.MainActivity.Companion.afterRepositoryLoadedEvent
|
import com.lagradost.cloudstream3.MainActivity.Companion.afterRepositoryLoadedEvent
|
||||||
|
@ -60,9 +61,9 @@ import com.lagradost.cloudstream3.plugins.RepositoryManager
|
||||||
import com.lagradost.cloudstream3.syncproviders.AccountManager.Companion.appStringResumeWatching
|
import com.lagradost.cloudstream3.syncproviders.AccountManager.Companion.appStringResumeWatching
|
||||||
import com.lagradost.cloudstream3.syncproviders.providers.Kitsu
|
import com.lagradost.cloudstream3.syncproviders.providers.Kitsu
|
||||||
import com.lagradost.cloudstream3.ui.WebviewFragment
|
import com.lagradost.cloudstream3.ui.WebviewFragment
|
||||||
|
import com.lagradost.cloudstream3.ui.player.SubtitleData
|
||||||
import com.lagradost.cloudstream3.ui.result.ResultFragment
|
import com.lagradost.cloudstream3.ui.result.ResultFragment
|
||||||
import com.lagradost.cloudstream3.ui.settings.Globals
|
import com.lagradost.cloudstream3.ui.settings.Globals
|
||||||
import com.lagradost.cloudstream3.ui.settings.extensions.ExtensionsFragment
|
|
||||||
import com.lagradost.cloudstream3.ui.settings.extensions.PluginsFragment
|
import com.lagradost.cloudstream3.ui.settings.extensions.PluginsFragment
|
||||||
import com.lagradost.cloudstream3.ui.settings.extensions.RepositoryData
|
import com.lagradost.cloudstream3.ui.settings.extensions.RepositoryData
|
||||||
import com.lagradost.cloudstream3.utils.Coroutines.ioSafe
|
import com.lagradost.cloudstream3.utils.Coroutines.ioSafe
|
||||||
|
@ -79,7 +80,7 @@ import java.io.*
|
||||||
import java.net.URL
|
import java.net.URL
|
||||||
import java.net.URLDecoder
|
import java.net.URLDecoder
|
||||||
|
|
||||||
object AppUtils {
|
object AppContextUtils {
|
||||||
fun RecyclerView.setMaxViewPoolSize(maxViewTypeId: Int, maxPoolSize: Int) {
|
fun RecyclerView.setMaxViewPoolSize(maxViewTypeId: Int, maxPoolSize: Int) {
|
||||||
for (i in 0..maxViewTypeId)
|
for (i in 0..maxViewTypeId)
|
||||||
recycledViewPool.setMaxRecycledViews(i, maxPoolSize)
|
recycledViewPool.setMaxRecycledViews(i, maxPoolSize)
|
||||||
|
@ -371,6 +372,168 @@ object AppUtils {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun sortSubs(subs: Set<SubtitleData>): List<SubtitleData> {
|
||||||
|
return subs.sortedBy { it.name }
|
||||||
|
}
|
||||||
|
|
||||||
|
fun Context.getApiSettings(): HashSet<String> {
|
||||||
|
//val settingsManager = PreferenceManager.getDefaultSharedPreferences(this)
|
||||||
|
|
||||||
|
val hashSet = HashSet<String>()
|
||||||
|
val activeLangs = getApiProviderLangSettings()
|
||||||
|
val hasUniversal = activeLangs.contains(AllLanguagesName)
|
||||||
|
hashSet.addAll(synchronized(apis) { apis.filter { hasUniversal || activeLangs.contains(it.lang) } }
|
||||||
|
.map { it.name })
|
||||||
|
|
||||||
|
/*val set = settingsManager.getStringSet(
|
||||||
|
this.getString(R.string.search_providers_list_key),
|
||||||
|
hashSet
|
||||||
|
)?.toHashSet() ?: hashSet
|
||||||
|
|
||||||
|
val list = HashSet<String>()
|
||||||
|
for (name in set) {
|
||||||
|
val api = getApiFromNameNull(name) ?: continue
|
||||||
|
if (activeLangs.contains(api.lang)) {
|
||||||
|
list.add(name)
|
||||||
|
}
|
||||||
|
}*/
|
||||||
|
//if (list.isEmpty()) return hashSet
|
||||||
|
//return list
|
||||||
|
return hashSet
|
||||||
|
}
|
||||||
|
|
||||||
|
fun Context.getApiDubstatusSettings(): HashSet<DubStatus> {
|
||||||
|
val settingsManager = PreferenceManager.getDefaultSharedPreferences(this)
|
||||||
|
val hashSet = HashSet<DubStatus>()
|
||||||
|
hashSet.addAll(DubStatus.values())
|
||||||
|
val list = settingsManager.getStringSet(
|
||||||
|
this.getString(R.string.display_sub_key),
|
||||||
|
hashSet.map { it.name }.toMutableSet()
|
||||||
|
) ?: return hashSet
|
||||||
|
|
||||||
|
val names = DubStatus.values().map { it.name }.toHashSet()
|
||||||
|
//if(realSet.isEmpty()) return hashSet
|
||||||
|
|
||||||
|
return list.filter { names.contains(it) }.map { DubStatus.valueOf(it) }.toHashSet()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun Context.getApiProviderLangSettings(): HashSet<String> {
|
||||||
|
val settingsManager = PreferenceManager.getDefaultSharedPreferences(this)
|
||||||
|
val hashSet = hashSetOf(AllLanguagesName) // def is all languages
|
||||||
|
// hashSet.add("en") // def is only en
|
||||||
|
val list = settingsManager.getStringSet(
|
||||||
|
this.getString(R.string.provider_lang_key),
|
||||||
|
hashSet
|
||||||
|
)
|
||||||
|
|
||||||
|
if (list.isNullOrEmpty()) return hashSet
|
||||||
|
return list.toHashSet()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun Context.getApiTypeSettings(): HashSet<TvType> {
|
||||||
|
val settingsManager = PreferenceManager.getDefaultSharedPreferences(this)
|
||||||
|
val hashSet = HashSet<TvType>()
|
||||||
|
hashSet.addAll(TvType.values())
|
||||||
|
val list = settingsManager.getStringSet(
|
||||||
|
this.getString(R.string.search_types_list_key),
|
||||||
|
hashSet.map { it.name }.toMutableSet()
|
||||||
|
)
|
||||||
|
|
||||||
|
if (list.isNullOrEmpty()) return hashSet
|
||||||
|
|
||||||
|
val names = TvType.values().map { it.name }.toHashSet()
|
||||||
|
val realSet = list.filter { names.contains(it) }.map { TvType.valueOf(it) }.toHashSet()
|
||||||
|
if (realSet.isEmpty()) return hashSet
|
||||||
|
|
||||||
|
return realSet
|
||||||
|
}
|
||||||
|
|
||||||
|
fun Context.updateHasTrailers() {
|
||||||
|
LoadResponse.isTrailersEnabled = getHasTrailers()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun Context.getHasTrailers(): Boolean {
|
||||||
|
val settingsManager = PreferenceManager.getDefaultSharedPreferences(this)
|
||||||
|
return settingsManager.getBoolean(this.getString(R.string.show_trailers_key), true)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun Context.filterProviderByPreferredMedia(hasHomePageIsRequired: Boolean = true): List<MainAPI> {
|
||||||
|
// We are getting the weirdest crash ever done:
|
||||||
|
// java.lang.ClassCastException: com.lagradost.cloudstream3.TvType cannot be cast to com.lagradost.cloudstream3.TvType
|
||||||
|
// Trying fixing using classloader fuckery
|
||||||
|
val oldLoader = Thread.currentThread().contextClassLoader
|
||||||
|
Thread.currentThread().contextClassLoader = TvType::class.java.classLoader
|
||||||
|
|
||||||
|
val default = TvType.values()
|
||||||
|
.sorted()
|
||||||
|
.filter { it != TvType.NSFW }
|
||||||
|
.map { it.ordinal }
|
||||||
|
|
||||||
|
Thread.currentThread().contextClassLoader = oldLoader
|
||||||
|
|
||||||
|
val defaultSet = default.map { it.toString() }.toSet()
|
||||||
|
val currentPrefMedia = try {
|
||||||
|
PreferenceManager.getDefaultSharedPreferences(this)
|
||||||
|
.getStringSet(this.getString(R.string.prefer_media_type_key), defaultSet)
|
||||||
|
?.mapNotNull { it.toIntOrNull() ?: return@mapNotNull null }
|
||||||
|
} catch (e: Throwable) {
|
||||||
|
null
|
||||||
|
} ?: default
|
||||||
|
val langs = this.getApiProviderLangSettings()
|
||||||
|
val hasUniversal = langs.contains(AllLanguagesName)
|
||||||
|
val allApis = synchronized(apis) {
|
||||||
|
apis.filter { api -> (hasUniversal || langs.contains(api.lang)) && (api.hasMainPage || !hasHomePageIsRequired) }
|
||||||
|
}
|
||||||
|
return if (currentPrefMedia.isEmpty()) {
|
||||||
|
allApis
|
||||||
|
} else {
|
||||||
|
// Filter API depending on preferred media type
|
||||||
|
allApis.filter { api -> api.supportedTypes.any { currentPrefMedia.contains(it.ordinal) } }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun Context.filterSearchResultByFilmQuality(data: List<SearchResponse>): List<SearchResponse> {
|
||||||
|
// Filter results omitting entries with certain quality
|
||||||
|
if (data.isNotEmpty()) {
|
||||||
|
val filteredSearchQuality = PreferenceManager.getDefaultSharedPreferences(this)
|
||||||
|
?.getStringSet(getString(R.string.pref_filter_search_quality_key), setOf())
|
||||||
|
?.mapNotNull { entry ->
|
||||||
|
entry.toIntOrNull() ?: return@mapNotNull null
|
||||||
|
} ?: listOf()
|
||||||
|
if (filteredSearchQuality.isNotEmpty()) {
|
||||||
|
return data.filter { item ->
|
||||||
|
val searchQualVal = item.quality?.ordinal ?: -1
|
||||||
|
//Log.i("filterSearch", "QuickSearch item => ${item.toJson()}")
|
||||||
|
!filteredSearchQuality.contains(searchQualVal)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return data
|
||||||
|
}
|
||||||
|
|
||||||
|
fun Context.filterHomePageListByFilmQuality(data: HomePageList): HomePageList {
|
||||||
|
// Filter results omitting entries with certain quality
|
||||||
|
if (data.list.isNotEmpty()) {
|
||||||
|
val filteredSearchQuality = PreferenceManager.getDefaultSharedPreferences(this)
|
||||||
|
?.getStringSet(getString(R.string.pref_filter_search_quality_key), setOf())
|
||||||
|
?.mapNotNull { entry ->
|
||||||
|
entry.toIntOrNull() ?: return@mapNotNull null
|
||||||
|
} ?: listOf()
|
||||||
|
if (filteredSearchQuality.isNotEmpty()) {
|
||||||
|
return HomePageList(
|
||||||
|
name = data.name,
|
||||||
|
isHorizontalImages = data.isHorizontalImages,
|
||||||
|
list = data.list.filter { item ->
|
||||||
|
val searchQualVal = item.quality?.ordinal ?: -1
|
||||||
|
//Log.i("filterSearch", "QuickSearch item => ${item.toJson()}")
|
||||||
|
!filteredSearchQuality.contains(searchQualVal)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return data
|
||||||
|
}
|
||||||
|
|
||||||
fun Activity.loadRepository(url: String) {
|
fun Activity.loadRepository(url: String) {
|
||||||
ioSafe {
|
ioSafe {
|
||||||
val repo = RepositoryManager.parseRepository(url) ?: return@ioSafe
|
val repo = RepositoryManager.parseRepository(url) ?: return@ioSafe
|
||||||
|
@ -532,24 +695,6 @@ object AppUtils {
|
||||||
return queryPairs
|
return queryPairs
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Any object as json string */
|
|
||||||
fun Any.toJson(): String {
|
|
||||||
if (this is String) return this
|
|
||||||
return mapper.writeValueAsString(this)
|
|
||||||
}
|
|
||||||
|
|
||||||
inline fun <reified T> parseJson(value: String): T {
|
|
||||||
return mapper.readValue(value)
|
|
||||||
}
|
|
||||||
|
|
||||||
inline fun <reified T> tryParseJson(value: String?): T? {
|
|
||||||
return try {
|
|
||||||
parseJson(value ?: return null)
|
|
||||||
} catch (_: Exception) {
|
|
||||||
null
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**| S1:E2 Hello World
|
/**| S1:E2 Hello World
|
||||||
* | Episode 2. Hello world
|
* | Episode 2. Hello world
|
||||||
* | Hello World
|
* | Hello World
|
||||||
|
@ -619,7 +764,7 @@ object AppUtils {
|
||||||
val settingsManager = PreferenceManager.getDefaultSharedPreferences(this)
|
val settingsManager = PreferenceManager.getDefaultSharedPreferences(this)
|
||||||
Kitsu.isEnabled =
|
Kitsu.isEnabled =
|
||||||
settingsManager.getBoolean(this.getString(R.string.show_kitsu_posters_key), true)
|
settingsManager.getBoolean(this.getString(R.string.show_kitsu_posters_key), true)
|
||||||
}catch (t : Throwable) {
|
} catch (t: Throwable) {
|
||||||
logError(t)
|
logError(t)
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,7 +3,6 @@ package com.lagradost.cloudstream3.utils
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import com.fasterxml.jackson.annotation.JsonProperty
|
import com.fasterxml.jackson.annotation.JsonProperty
|
||||||
import com.lagradost.cloudstream3.*
|
import com.lagradost.cloudstream3.*
|
||||||
import com.lagradost.cloudstream3.APIHolder.filterProviderByPreferredMedia
|
|
||||||
import com.lagradost.cloudstream3.APIHolder.unixTimeMS
|
import com.lagradost.cloudstream3.APIHolder.unixTimeMS
|
||||||
import com.lagradost.cloudstream3.AcraApplication.Companion.context
|
import com.lagradost.cloudstream3.AcraApplication.Companion.context
|
||||||
import com.lagradost.cloudstream3.AcraApplication.Companion.getKey
|
import com.lagradost.cloudstream3.AcraApplication.Companion.getKey
|
||||||
|
@ -18,6 +17,7 @@ import com.lagradost.cloudstream3.ui.WatchType
|
||||||
import com.lagradost.cloudstream3.ui.library.ListSorting
|
import com.lagradost.cloudstream3.ui.library.ListSorting
|
||||||
import com.lagradost.cloudstream3.ui.result.UiImage
|
import com.lagradost.cloudstream3.ui.result.UiImage
|
||||||
import com.lagradost.cloudstream3.ui.result.VideoWatchState
|
import com.lagradost.cloudstream3.ui.result.VideoWatchState
|
||||||
|
import com.lagradost.cloudstream3.utils.AppContextUtils.filterProviderByPreferredMedia
|
||||||
import kotlin.reflect.KClass
|
import kotlin.reflect.KClass
|
||||||
import kotlin.reflect.KProperty
|
import kotlin.reflect.KProperty
|
||||||
|
|
||||||
|
|
|
@ -24,7 +24,7 @@ import okio.sink
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import android.text.TextUtils
|
import android.text.TextUtils
|
||||||
import com.lagradost.cloudstream3.MainActivity.Companion.deleteFileOnExit
|
import com.lagradost.cloudstream3.MainActivity.Companion.deleteFileOnExit
|
||||||
import com.lagradost.cloudstream3.utils.AppUtils.setDefaultFocus
|
import com.lagradost.cloudstream3.utils.AppContextUtils.setDefaultFocus
|
||||||
import java.io.BufferedReader
|
import java.io.BufferedReader
|
||||||
import java.io.IOException
|
import java.io.IOException
|
||||||
import java.io.InputStreamReader
|
import java.io.InputStreamReader
|
||||||
|
|
|
@ -15,7 +15,7 @@ import com.lagradost.cloudstream3.MainActivity
|
||||||
import com.lagradost.cloudstream3.MainActivity.Companion.deleteFileOnExit
|
import com.lagradost.cloudstream3.MainActivity.Companion.deleteFileOnExit
|
||||||
import com.lagradost.cloudstream3.R
|
import com.lagradost.cloudstream3.R
|
||||||
import com.lagradost.cloudstream3.app
|
import com.lagradost.cloudstream3.app
|
||||||
import com.lagradost.cloudstream3.utils.AppUtils.createNotificationChannel
|
import com.lagradost.cloudstream3.utils.AppContextUtils.createNotificationChannel
|
||||||
import com.lagradost.cloudstream3.utils.Coroutines.ioSafe
|
import com.lagradost.cloudstream3.utils.Coroutines.ioSafe
|
||||||
import com.lagradost.cloudstream3.utils.UIHelper.colorFromAttribute
|
import com.lagradost.cloudstream3.utils.UIHelper.colorFromAttribute
|
||||||
import kotlinx.coroutines.delay
|
import kotlinx.coroutines.delay
|
||||||
|
|
|
@ -24,6 +24,7 @@ import com.lagradost.cloudstream3.APIHolder.getApiFromNameNull
|
||||||
import com.lagradost.cloudstream3.AcraApplication.Companion.removeKey
|
import com.lagradost.cloudstream3.AcraApplication.Companion.removeKey
|
||||||
import com.lagradost.cloudstream3.AcraApplication.Companion.setKey
|
import com.lagradost.cloudstream3.AcraApplication.Companion.setKey
|
||||||
import com.lagradost.cloudstream3.BuildConfig
|
import com.lagradost.cloudstream3.BuildConfig
|
||||||
|
import com.lagradost.cloudstream3.IDownloadableMinimum
|
||||||
import com.lagradost.cloudstream3.MainActivity
|
import com.lagradost.cloudstream3.MainActivity
|
||||||
import com.lagradost.cloudstream3.R
|
import com.lagradost.cloudstream3.R
|
||||||
import com.lagradost.cloudstream3.TvType
|
import com.lagradost.cloudstream3.TvType
|
||||||
|
@ -107,16 +108,6 @@ object VideoDownloadManager {
|
||||||
Stop,
|
Stop,
|
||||||
}
|
}
|
||||||
|
|
||||||
interface IDownloadableMinimum {
|
|
||||||
val url: String
|
|
||||||
val referer: String
|
|
||||||
val headers: Map<String, String>
|
|
||||||
}
|
|
||||||
|
|
||||||
fun IDownloadableMinimum.getId(): Int {
|
|
||||||
return url.hashCode()
|
|
||||||
}
|
|
||||||
|
|
||||||
data class DownloadEpisodeMetadata(
|
data class DownloadEpisodeMetadata(
|
||||||
@JsonProperty("id") val id: Int,
|
@JsonProperty("id") val id: Int,
|
||||||
@JsonProperty("mainName") val mainName: String,
|
@JsonProperty("mainName") val mainName: String,
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
import com.codingfeline.buildkonfig.compiler.FieldSpec
|
import com.codingfeline.buildkonfig.compiler.FieldSpec
|
||||||
|
import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi
|
||||||
|
|
||||||
plugins {
|
plugins {
|
||||||
kotlin("multiplatform")
|
kotlin("multiplatform")
|
||||||
|
@ -12,6 +13,11 @@ kotlin {
|
||||||
androidTarget()
|
androidTarget()
|
||||||
jvm()
|
jvm()
|
||||||
|
|
||||||
|
@OptIn(ExperimentalKotlinGradlePluginApi::class)
|
||||||
|
compilerOptions {
|
||||||
|
freeCompilerArgs.add("-Xexpect-actual-classes")
|
||||||
|
}
|
||||||
|
|
||||||
sourceSets {
|
sourceSets {
|
||||||
commonMain.dependencies {
|
commonMain.dependencies {
|
||||||
implementation("com.github.Blatzar:NiceHttp:0.4.11") // HTTP Lib
|
implementation("com.github.Blatzar:NiceHttp:0.4.11") // HTTP Lib
|
||||||
|
@ -19,6 +25,9 @@ kotlin {
|
||||||
^ Don't Bump Jackson above 2.13.1 , Crashes on Android TV's and FireSticks that have Min API
|
^ Don't Bump Jackson above 2.13.1 , Crashes on Android TV's and FireSticks that have Min API
|
||||||
Level 25 or Less. */
|
Level 25 or Less. */
|
||||||
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0")
|
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0")
|
||||||
|
implementation("me.xdrop:fuzzywuzzy:1.4.0") // Match extractors
|
||||||
|
implementation("org.mozilla:rhino:1.7.15") // run JavaScript
|
||||||
|
implementation("com.github.teamnewpipe:NewPipeExtractor:fafd471")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,20 @@
|
||||||
|
package com.lagradost.api
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import java.lang.ref.WeakReference
|
||||||
|
|
||||||
|
var ctx: WeakReference<Context>? = null
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Helper function for Android specific context. Not usable in JVM.
|
||||||
|
* Do not use this unless absolutely necessary.
|
||||||
|
*/
|
||||||
|
actual fun getContext(): Any? {
|
||||||
|
return ctx?.get()
|
||||||
|
}
|
||||||
|
|
||||||
|
actual fun setContext(context: WeakReference<Any>) {
|
||||||
|
if (context.get() is Context) {
|
||||||
|
ctx = context as? WeakReference<Context>
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,13 +1,12 @@
|
||||||
package com.lagradost.cloudstream3.network
|
package com.lagradost.cloudstream3.network
|
||||||
|
|
||||||
import android.annotation.SuppressLint
|
import android.annotation.SuppressLint
|
||||||
|
import android.content.Context
|
||||||
import android.net.http.SslError
|
import android.net.http.SslError
|
||||||
import android.os.Handler
|
import android.os.Handler
|
||||||
import android.os.Looper
|
import android.os.Looper
|
||||||
import android.webkit.*
|
import android.webkit.*
|
||||||
import com.lagradost.cloudstream3.AcraApplication
|
import com.lagradost.api.getContext
|
||||||
import com.lagradost.cloudstream3.AcraApplication.Companion.context
|
|
||||||
import com.lagradost.cloudstream3.USER_AGENT
|
|
||||||
import com.lagradost.cloudstream3.app
|
import com.lagradost.cloudstream3.app
|
||||||
import com.lagradost.cloudstream3.mvvm.debugException
|
import com.lagradost.cloudstream3.mvvm.debugException
|
||||||
import com.lagradost.cloudstream3.mvvm.logError
|
import com.lagradost.cloudstream3.mvvm.logError
|
||||||
|
@ -33,40 +32,24 @@ import java.net.URI
|
||||||
* @param scriptCallback will be called with the result from custom js
|
* @param scriptCallback will be called with the result from custom js
|
||||||
* @param timeout close webview after timeout
|
* @param timeout close webview after timeout
|
||||||
* */
|
* */
|
||||||
class WebViewResolver(
|
actual class WebViewResolver actual constructor(
|
||||||
val interceptUrl: Regex,
|
val interceptUrl: Regex,
|
||||||
val additionalUrls: List<Regex> = emptyList(),
|
val additionalUrls: List<Regex>,
|
||||||
val userAgent: String? = USER_AGENT,
|
val userAgent: String?,
|
||||||
val useOkhttp: Boolean = true,
|
val useOkhttp: Boolean,
|
||||||
val script: String? = null,
|
val script: String?,
|
||||||
val scriptCallback: ((String) -> Unit)? = null,
|
val scriptCallback: ((String) -> Unit)?,
|
||||||
val timeout: Long = DEFAULT_TIMEOUT
|
val timeout: Long
|
||||||
) :
|
) :
|
||||||
Interceptor {
|
Interceptor {
|
||||||
|
|
||||||
constructor(
|
actual companion object {
|
||||||
interceptUrl: Regex,
|
|
||||||
additionalUrls: List<Regex> = emptyList(),
|
|
||||||
userAgent: String? = USER_AGENT,
|
|
||||||
useOkhttp: Boolean = true,
|
|
||||||
script: String? = null,
|
|
||||||
scriptCallback: ((String) -> Unit)? = null,
|
|
||||||
) : this(interceptUrl, additionalUrls, userAgent, useOkhttp, script, scriptCallback, DEFAULT_TIMEOUT)
|
|
||||||
|
|
||||||
constructor(
|
|
||||||
interceptUrl: Regex,
|
|
||||||
additionalUrls: List<Regex> = emptyList(),
|
|
||||||
userAgent: String? = USER_AGENT,
|
|
||||||
useOkhttp: Boolean = true
|
|
||||||
) : this(interceptUrl, additionalUrls, userAgent, useOkhttp, null, null, DEFAULT_TIMEOUT)
|
|
||||||
|
|
||||||
companion object {
|
|
||||||
private const val DEFAULT_TIMEOUT = 60_000L
|
|
||||||
var webViewUserAgent: String? = null
|
var webViewUserAgent: String? = null
|
||||||
|
actual val DEFAULT_TIMEOUT = 60_000L
|
||||||
|
|
||||||
@JvmName("getWebViewUserAgent1")
|
@JvmName("getWebViewUserAgent1")
|
||||||
fun getWebViewUserAgent(): String? {
|
fun getWebViewUserAgent(): String? {
|
||||||
return webViewUserAgent ?: context?.let { ctx ->
|
return webViewUserAgent ?: (getContext() as? Context)?.let { ctx ->
|
||||||
runBlocking {
|
runBlocking {
|
||||||
mainWork {
|
mainWork {
|
||||||
WebView(ctx).settings.userAgentString.also { userAgent ->
|
WebView(ctx).settings.userAgentString.also { userAgent ->
|
||||||
|
@ -137,7 +120,7 @@ class WebViewResolver(
|
||||||
WebView.setWebContentsDebuggingEnabled(true)
|
WebView.setWebContentsDebuggingEnabled(true)
|
||||||
try {
|
try {
|
||||||
webView = WebView(
|
webView = WebView(
|
||||||
AcraApplication.context
|
(getContext() as? Context)
|
||||||
?: throw RuntimeException("No base context in WebViewResolver")
|
?: throw RuntimeException("No base context in WebViewResolver")
|
||||||
).apply {
|
).apply {
|
||||||
// Bare minimum to bypass captcha
|
// Bare minimum to bypass captcha
|
|
@ -0,0 +1,16 @@
|
||||||
|
package com.lagradost.api
|
||||||
|
|
||||||
|
import java.lang.ref.WeakReference
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set context for android specific code such as webview.
|
||||||
|
* Does nothing on JVM.
|
||||||
|
*/
|
||||||
|
expect fun setContext(context: WeakReference<Any>)
|
||||||
|
/**
|
||||||
|
* Helper function for Android specific context.
|
||||||
|
* Do not use this unless absolutely necessary.
|
||||||
|
* setContext() must be called before this is called.
|
||||||
|
* @return Context if on android, null if not.
|
||||||
|
*/
|
||||||
|
expect fun getContext(): Any?
|
|
@ -1,34 +1,26 @@
|
||||||
package com.lagradost.cloudstream3
|
package com.lagradost.cloudstream3
|
||||||
|
|
||||||
import android.annotation.SuppressLint
|
|
||||||
import android.content.Context
|
|
||||||
import android.net.Uri
|
|
||||||
import android.util.Base64.encodeToString
|
|
||||||
import androidx.annotation.WorkerThread
|
|
||||||
import androidx.preference.PreferenceManager
|
|
||||||
import com.fasterxml.jackson.annotation.JsonProperty
|
import com.fasterxml.jackson.annotation.JsonProperty
|
||||||
import com.fasterxml.jackson.databind.DeserializationFeature
|
import com.fasterxml.jackson.databind.DeserializationFeature
|
||||||
import com.fasterxml.jackson.databind.json.JsonMapper
|
import com.fasterxml.jackson.databind.json.JsonMapper
|
||||||
import com.fasterxml.jackson.module.kotlin.kotlinModule
|
import com.fasterxml.jackson.module.kotlin.kotlinModule
|
||||||
import com.lagradost.cloudstream3.mvvm.logError
|
import com.lagradost.cloudstream3.mvvm.logError
|
||||||
import com.lagradost.cloudstream3.mvvm.normalSafeApiCall
|
import com.lagradost.cloudstream3.mvvm.normalSafeApiCall
|
||||||
import com.lagradost.cloudstream3.syncproviders.AccountManager.Companion.aniListApi
|
|
||||||
import com.lagradost.cloudstream3.syncproviders.AccountManager.Companion.malApi
|
|
||||||
import com.lagradost.cloudstream3.syncproviders.AccountManager.Companion.simklApi
|
|
||||||
import com.lagradost.cloudstream3.syncproviders.SyncIdName
|
import com.lagradost.cloudstream3.syncproviders.SyncIdName
|
||||||
import com.lagradost.cloudstream3.syncproviders.providers.SimklApi
|
|
||||||
import com.lagradost.cloudstream3.ui.player.SubtitleData
|
|
||||||
import com.lagradost.cloudstream3.ui.result.ResultViewModel2
|
|
||||||
import com.lagradost.cloudstream3.utils.*
|
import com.lagradost.cloudstream3.utils.*
|
||||||
import com.lagradost.cloudstream3.utils.AppUtils.toJson
|
import com.lagradost.cloudstream3.utils.AppUtils.toJson
|
||||||
|
import com.lagradost.cloudstream3.utils.AppUtils.tryParseJson
|
||||||
import com.lagradost.cloudstream3.utils.Coroutines.mainWork
|
import com.lagradost.cloudstream3.utils.Coroutines.mainWork
|
||||||
import com.lagradost.cloudstream3.utils.Coroutines.threadSafeListOf
|
import com.lagradost.cloudstream3.utils.Coroutines.threadSafeListOf
|
||||||
import com.lagradost.nicehttp.RequestBodyTypes
|
import com.lagradost.nicehttp.RequestBodyTypes
|
||||||
import okhttp3.Interceptor
|
import okhttp3.Interceptor
|
||||||
import okhttp3.MediaType.Companion.toMediaTypeOrNull
|
import okhttp3.MediaType.Companion.toMediaTypeOrNull
|
||||||
import okhttp3.RequestBody.Companion.toRequestBody
|
import okhttp3.RequestBody.Companion.toRequestBody
|
||||||
|
import java.net.URI
|
||||||
import java.text.SimpleDateFormat
|
import java.text.SimpleDateFormat
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
import kotlin.io.encoding.Base64
|
||||||
|
import kotlin.io.encoding.ExperimentalEncodingApi
|
||||||
import kotlin.math.absoluteValue
|
import kotlin.math.absoluteValue
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -111,17 +103,6 @@ object APIHolder {
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getLoadResponseIdFromUrl(url: String, apiName: String): Int {
|
|
||||||
return url.replace(getApiFromNameNull(apiName)?.mainUrl ?: "", "").replace("/", "")
|
|
||||||
.hashCode()
|
|
||||||
}
|
|
||||||
|
|
||||||
fun LoadResponse.getId(): Int {
|
|
||||||
// this fixes an issue with outdated api as getLoadResponseIdFromUrl might be fucked
|
|
||||||
return (if (this is ResultViewModel2.LoadResponseFromSearch) this.id else null)
|
|
||||||
?: getLoadResponseIdFromUrl(url, apiName)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the website captcha token
|
* Gets the website captcha token
|
||||||
* discovered originally by https://github.com/ahmedgamal17
|
* discovered originally by https://github.com/ahmedgamal17
|
||||||
|
@ -137,10 +118,9 @@ object APIHolder {
|
||||||
// To get the key
|
// To get the key
|
||||||
suspend fun getCaptchaToken(url: String, key: String, referer: String? = null): String? {
|
suspend fun getCaptchaToken(url: String, key: String, referer: String? = null): String? {
|
||||||
try {
|
try {
|
||||||
val uri = Uri.parse(url)
|
val uri = URI.create(url)
|
||||||
val domain = encodeToString(
|
val domain = base64Encode(
|
||||||
(uri.scheme + "://" + uri.host + ":443").encodeToByteArray(),
|
(uri.scheme + "://" + uri.host + ":443").encodeToByteArray(),
|
||||||
0
|
|
||||||
).replace("\n", "").replace("=", ".")
|
).replace("\n", "").replace("=", ".")
|
||||||
|
|
||||||
val vToken =
|
val vToken =
|
||||||
|
@ -275,165 +255,6 @@ object APIHolder {
|
||||||
return app.post("https://graphql.anilist.co", requestBody = data)
|
return app.post("https://graphql.anilist.co", requestBody = data)
|
||||||
.parsedSafe()
|
.parsedSafe()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
fun Context.getApiSettings(): HashSet<String> {
|
|
||||||
//val settingsManager = PreferenceManager.getDefaultSharedPreferences(this)
|
|
||||||
|
|
||||||
val hashSet = HashSet<String>()
|
|
||||||
val activeLangs = getApiProviderLangSettings()
|
|
||||||
val hasUniversal = activeLangs.contains(AllLanguagesName)
|
|
||||||
hashSet.addAll(synchronized(apis) { apis.filter { hasUniversal || activeLangs.contains(it.lang) } }
|
|
||||||
.map { it.name })
|
|
||||||
|
|
||||||
/*val set = settingsManager.getStringSet(
|
|
||||||
this.getString(R.string.search_providers_list_key),
|
|
||||||
hashSet
|
|
||||||
)?.toHashSet() ?: hashSet
|
|
||||||
|
|
||||||
val list = HashSet<String>()
|
|
||||||
for (name in set) {
|
|
||||||
val api = getApiFromNameNull(name) ?: continue
|
|
||||||
if (activeLangs.contains(api.lang)) {
|
|
||||||
list.add(name)
|
|
||||||
}
|
|
||||||
}*/
|
|
||||||
//if (list.isEmpty()) return hashSet
|
|
||||||
//return list
|
|
||||||
return hashSet
|
|
||||||
}
|
|
||||||
|
|
||||||
fun Context.getApiDubstatusSettings(): HashSet<DubStatus> {
|
|
||||||
val settingsManager = PreferenceManager.getDefaultSharedPreferences(this)
|
|
||||||
val hashSet = HashSet<DubStatus>()
|
|
||||||
hashSet.addAll(DubStatus.values())
|
|
||||||
val list = settingsManager.getStringSet(
|
|
||||||
this.getString(R.string.display_sub_key),
|
|
||||||
hashSet.map { it.name }.toMutableSet()
|
|
||||||
) ?: return hashSet
|
|
||||||
|
|
||||||
val names = DubStatus.values().map { it.name }.toHashSet()
|
|
||||||
//if(realSet.isEmpty()) return hashSet
|
|
||||||
|
|
||||||
return list.filter { names.contains(it) }.map { DubStatus.valueOf(it) }.toHashSet()
|
|
||||||
}
|
|
||||||
|
|
||||||
fun Context.getApiProviderLangSettings(): HashSet<String> {
|
|
||||||
val settingsManager = PreferenceManager.getDefaultSharedPreferences(this)
|
|
||||||
val hashSet = hashSetOf(AllLanguagesName) // def is all languages
|
|
||||||
// hashSet.add("en") // def is only en
|
|
||||||
val list = settingsManager.getStringSet(
|
|
||||||
this.getString(R.string.provider_lang_key),
|
|
||||||
hashSet
|
|
||||||
)
|
|
||||||
|
|
||||||
if (list.isNullOrEmpty()) return hashSet
|
|
||||||
return list.toHashSet()
|
|
||||||
}
|
|
||||||
|
|
||||||
fun Context.getApiTypeSettings(): HashSet<TvType> {
|
|
||||||
val settingsManager = PreferenceManager.getDefaultSharedPreferences(this)
|
|
||||||
val hashSet = HashSet<TvType>()
|
|
||||||
hashSet.addAll(TvType.values())
|
|
||||||
val list = settingsManager.getStringSet(
|
|
||||||
this.getString(R.string.search_types_list_key),
|
|
||||||
hashSet.map { it.name }.toMutableSet()
|
|
||||||
)
|
|
||||||
|
|
||||||
if (list.isNullOrEmpty()) return hashSet
|
|
||||||
|
|
||||||
val names = TvType.values().map { it.name }.toHashSet()
|
|
||||||
val realSet = list.filter { names.contains(it) }.map { TvType.valueOf(it) }.toHashSet()
|
|
||||||
if (realSet.isEmpty()) return hashSet
|
|
||||||
|
|
||||||
return realSet
|
|
||||||
}
|
|
||||||
|
|
||||||
fun Context.updateHasTrailers() {
|
|
||||||
LoadResponse.isTrailersEnabled = getHasTrailers()
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun Context.getHasTrailers(): Boolean {
|
|
||||||
val settingsManager = PreferenceManager.getDefaultSharedPreferences(this)
|
|
||||||
return settingsManager.getBoolean(this.getString(R.string.show_trailers_key), true)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun Context.filterProviderByPreferredMedia(hasHomePageIsRequired: Boolean = true): List<MainAPI> {
|
|
||||||
// We are getting the weirdest crash ever done:
|
|
||||||
// java.lang.ClassCastException: com.lagradost.cloudstream3.TvType cannot be cast to com.lagradost.cloudstream3.TvType
|
|
||||||
// Trying fixing using classloader fuckery
|
|
||||||
val oldLoader = Thread.currentThread().contextClassLoader
|
|
||||||
Thread.currentThread().contextClassLoader = TvType::class.java.classLoader
|
|
||||||
|
|
||||||
val default = TvType.values()
|
|
||||||
.sorted()
|
|
||||||
.filter { it != TvType.NSFW }
|
|
||||||
.map { it.ordinal }
|
|
||||||
|
|
||||||
Thread.currentThread().contextClassLoader = oldLoader
|
|
||||||
|
|
||||||
val defaultSet = default.map { it.toString() }.toSet()
|
|
||||||
val currentPrefMedia = try {
|
|
||||||
PreferenceManager.getDefaultSharedPreferences(this)
|
|
||||||
.getStringSet(this.getString(R.string.prefer_media_type_key), defaultSet)
|
|
||||||
?.mapNotNull { it.toIntOrNull() ?: return@mapNotNull null }
|
|
||||||
} catch (e: Throwable) {
|
|
||||||
null
|
|
||||||
} ?: default
|
|
||||||
val langs = this.getApiProviderLangSettings()
|
|
||||||
val hasUniversal = langs.contains(AllLanguagesName)
|
|
||||||
val allApis = synchronized(apis) {
|
|
||||||
apis.filter { api -> (hasUniversal || langs.contains(api.lang)) && (api.hasMainPage || !hasHomePageIsRequired) }
|
|
||||||
}
|
|
||||||
return if (currentPrefMedia.isEmpty()) {
|
|
||||||
allApis
|
|
||||||
} else {
|
|
||||||
// Filter API depending on preferred media type
|
|
||||||
allApis.filter { api -> api.supportedTypes.any { currentPrefMedia.contains(it.ordinal) } }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun Context.filterSearchResultByFilmQuality(data: List<SearchResponse>): List<SearchResponse> {
|
|
||||||
// Filter results omitting entries with certain quality
|
|
||||||
if (data.isNotEmpty()) {
|
|
||||||
val filteredSearchQuality = PreferenceManager.getDefaultSharedPreferences(this)
|
|
||||||
?.getStringSet(getString(R.string.pref_filter_search_quality_key), setOf())
|
|
||||||
?.mapNotNull { entry ->
|
|
||||||
entry.toIntOrNull() ?: return@mapNotNull null
|
|
||||||
} ?: listOf()
|
|
||||||
if (filteredSearchQuality.isNotEmpty()) {
|
|
||||||
return data.filter { item ->
|
|
||||||
val searchQualVal = item.quality?.ordinal ?: -1
|
|
||||||
//Log.i("filterSearch", "QuickSearch item => ${item.toJson()}")
|
|
||||||
!filteredSearchQuality.contains(searchQualVal)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return data
|
|
||||||
}
|
|
||||||
|
|
||||||
fun Context.filterHomePageListByFilmQuality(data: HomePageList): HomePageList {
|
|
||||||
// Filter results omitting entries with certain quality
|
|
||||||
if (data.list.isNotEmpty()) {
|
|
||||||
val filteredSearchQuality = PreferenceManager.getDefaultSharedPreferences(this)
|
|
||||||
?.getStringSet(getString(R.string.pref_filter_search_quality_key), setOf())
|
|
||||||
?.mapNotNull { entry ->
|
|
||||||
entry.toIntOrNull() ?: return@mapNotNull null
|
|
||||||
} ?: listOf()
|
|
||||||
if (filteredSearchQuality.isNotEmpty()) {
|
|
||||||
return HomePageList(
|
|
||||||
name = data.name,
|
|
||||||
isHorizontalImages = data.isHorizontalImages,
|
|
||||||
list = data.list.filter { item ->
|
|
||||||
val searchQualVal = item.quality?.ordinal ?: -1
|
|
||||||
//Log.i("filterSearch", "QuickSearch item => ${item.toJson()}")
|
|
||||||
!filteredSearchQuality.contains(searchQualVal)
|
|
||||||
}
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return data
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -656,7 +477,7 @@ abstract class MainAPI {
|
||||||
//emptyList<MainPageData>() //
|
//emptyList<MainPageData>() //
|
||||||
open val mainPage = listOf(MainPageData("", "", false))
|
open val mainPage = listOf(MainPageData("", "", false))
|
||||||
|
|
||||||
@WorkerThread
|
// @WorkerThread
|
||||||
open suspend fun getMainPage(
|
open suspend fun getMainPage(
|
||||||
page: Int,
|
page: Int,
|
||||||
request: MainPageRequest,
|
request: MainPageRequest,
|
||||||
|
@ -664,17 +485,17 @@ abstract class MainAPI {
|
||||||
throw NotImplementedError()
|
throw NotImplementedError()
|
||||||
}
|
}
|
||||||
|
|
||||||
@WorkerThread
|
// @WorkerThread
|
||||||
open suspend fun search(query: String): List<SearchResponse>? {
|
open suspend fun search(query: String): List<SearchResponse>? {
|
||||||
throw NotImplementedError()
|
throw NotImplementedError()
|
||||||
}
|
}
|
||||||
|
|
||||||
@WorkerThread
|
// @WorkerThread
|
||||||
open suspend fun quickSearch(query: String): List<SearchResponse>? {
|
open suspend fun quickSearch(query: String): List<SearchResponse>? {
|
||||||
throw NotImplementedError()
|
throw NotImplementedError()
|
||||||
}
|
}
|
||||||
|
|
||||||
@WorkerThread
|
// @WorkerThread
|
||||||
/**
|
/**
|
||||||
* Based on data from search() or getMainPage() it generates a LoadResponse,
|
* Based on data from search() or getMainPage() it generates a LoadResponse,
|
||||||
* basically opening the info page from a link.
|
* basically opening the info page from a link.
|
||||||
|
@ -692,13 +513,13 @@ abstract class MainAPI {
|
||||||
* This function might be updated to include exoplayer timestamps etc in the future
|
* This function might be updated to include exoplayer timestamps etc in the future
|
||||||
* if the need arises.
|
* if the need arises.
|
||||||
* */
|
* */
|
||||||
@WorkerThread
|
// @WorkerThread
|
||||||
open suspend fun extractorVerifierJob(extractorData: String?) {
|
open suspend fun extractorVerifierJob(extractorData: String?) {
|
||||||
throw NotImplementedError()
|
throw NotImplementedError()
|
||||||
}
|
}
|
||||||
|
|
||||||
/**Callback is fired once a link is found, will return true if method is executed successfully*/
|
/**Callback is fired once a link is found, will return true if method is executed successfully*/
|
||||||
@WorkerThread
|
// @WorkerThread
|
||||||
open suspend fun loadLinks(
|
open suspend fun loadLinks(
|
||||||
data: String,
|
data: String,
|
||||||
isCasting: Boolean,
|
isCasting: Boolean,
|
||||||
|
@ -723,27 +544,16 @@ abstract class MainAPI {
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Might need a different implementation for desktop*/
|
/** Might need a different implementation for desktop*/
|
||||||
@SuppressLint("NewApi")
|
|
||||||
fun base64Decode(string: String): String {
|
fun base64Decode(string: String): String {
|
||||||
return String(base64DecodeArray(string), Charsets.ISO_8859_1)
|
return String(base64DecodeArray(string), Charsets.ISO_8859_1)
|
||||||
}
|
}
|
||||||
|
@OptIn(ExperimentalEncodingApi::class)
|
||||||
@SuppressLint("NewApi")
|
|
||||||
fun base64DecodeArray(string: String): ByteArray {
|
fun base64DecodeArray(string: String): ByteArray {
|
||||||
return try {
|
return Base64.decode(string)
|
||||||
android.util.Base64.decode(string, android.util.Base64.DEFAULT)
|
|
||||||
} catch (e: Exception) {
|
|
||||||
Base64.getDecoder().decode(string)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@OptIn(ExperimentalEncodingApi::class)
|
||||||
@SuppressLint("NewApi")
|
|
||||||
fun base64Encode(array: ByteArray): String {
|
fun base64Encode(array: ByteArray): String {
|
||||||
return try {
|
return Base64.encode(array)
|
||||||
String(android.util.Base64.encode(array, android.util.Base64.NO_WRAP), Charsets.ISO_8859_1)
|
|
||||||
} catch (e: Exception) {
|
|
||||||
String(Base64.getEncoder().encode(array))
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fun MainAPI.fixUrlNull(url: String?): String? {
|
fun MainAPI.fixUrlNull(url: String?): String? {
|
||||||
|
@ -779,10 +589,6 @@ fun sortUrls(urls: Set<ExtractorLink>): List<ExtractorLink> {
|
||||||
return urls.sortedBy { t -> -t.quality }
|
return urls.sortedBy { t -> -t.quality }
|
||||||
}
|
}
|
||||||
|
|
||||||
fun sortSubs(subs: Set<SubtitleData>): List<SubtitleData> {
|
|
||||||
return subs.sortedBy { it.name }
|
|
||||||
}
|
|
||||||
|
|
||||||
fun capitalizeString(str: String): String {
|
fun capitalizeString(str: String): String {
|
||||||
return capitalizeStringNullable(str) ?: str
|
return capitalizeStringNullable(str) ?: str
|
||||||
}
|
}
|
||||||
|
@ -1204,11 +1010,25 @@ interface LoadResponse {
|
||||||
var contentRating: String?
|
var contentRating: String?
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
private val malIdPrefix = malApi.idPrefix
|
var malIdPrefix = "" //malApi.idPrefix
|
||||||
private val aniListIdPrefix = aniListApi.idPrefix
|
var aniListIdPrefix = "" //aniListApi.idPrefix
|
||||||
private val simklIdPrefix = simklApi.idPrefix
|
var simklIdPrefix = "" //simklApi.idPrefix
|
||||||
var isTrailersEnabled = true
|
var isTrailersEnabled = true
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The ID string is a way to keep a collection of services in one single ID using a map
|
||||||
|
* This adds a database service (like imdb) to the string and returns the new string.
|
||||||
|
*/
|
||||||
|
fun addIdToString(idString: String?, database: SimklSyncServices, id: String?): String? {
|
||||||
|
if (id == null) return idString
|
||||||
|
return (readIdFromString(idString) + mapOf(database to id)).toJson()
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Read the id string to get all other ids */
|
||||||
|
fun readIdFromString(idString: String?): Map<SimklSyncServices, String> {
|
||||||
|
return tryParseJson(idString) ?: return emptyMap()
|
||||||
|
}
|
||||||
|
|
||||||
fun LoadResponse.isMovie(): Boolean {
|
fun LoadResponse.isMovie(): Boolean {
|
||||||
return this.type.isMovieType() || this is MovieLoadResponse
|
return this.type.isMovieType() || this is MovieLoadResponse
|
||||||
}
|
}
|
||||||
|
@ -1232,12 +1052,12 @@ interface LoadResponse {
|
||||||
* Internal helper function to add simkl ids from other databases.
|
* Internal helper function to add simkl ids from other databases.
|
||||||
*/
|
*/
|
||||||
private fun LoadResponse.addSimklId(
|
private fun LoadResponse.addSimklId(
|
||||||
database: SimklApi.Companion.SyncServices,
|
database: SimklSyncServices,
|
||||||
id: String?
|
id: String?
|
||||||
) {
|
) {
|
||||||
normalSafeApiCall {
|
normalSafeApiCall {
|
||||||
this.syncData[simklIdPrefix] =
|
this.syncData[simklIdPrefix] =
|
||||||
SimklApi.addIdToString(this.syncData[simklIdPrefix], database, id.toString())
|
addIdToString(this.syncData[simklIdPrefix], database, id.toString())
|
||||||
?: return@normalSafeApiCall
|
?: return@normalSafeApiCall
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1257,30 +1077,28 @@ interface LoadResponse {
|
||||||
|
|
||||||
fun LoadResponse.getImdbId(): String? {
|
fun LoadResponse.getImdbId(): String? {
|
||||||
return normalSafeApiCall {
|
return normalSafeApiCall {
|
||||||
SimklApi.readIdFromString(this.syncData[simklIdPrefix])
|
readIdFromString(this.syncData[simklIdPrefix])[SimklSyncServices.Imdb]
|
||||||
?.get(SimklApi.Companion.SyncServices.Imdb)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun LoadResponse.getTMDbId(): String? {
|
fun LoadResponse.getTMDbId(): String? {
|
||||||
return normalSafeApiCall {
|
return normalSafeApiCall {
|
||||||
SimklApi.readIdFromString(this.syncData[simklIdPrefix])
|
readIdFromString(this.syncData[simklIdPrefix])[SimklSyncServices.Tmdb]
|
||||||
?.get(SimklApi.Companion.SyncServices.Tmdb)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun LoadResponse.addMalId(id: Int?) {
|
fun LoadResponse.addMalId(id: Int?) {
|
||||||
this.syncData[malIdPrefix] = (id ?: return).toString()
|
this.syncData[malIdPrefix] = (id ?: return).toString()
|
||||||
this.addSimklId(SimklApi.Companion.SyncServices.Mal, id.toString())
|
this.addSimklId(SimklSyncServices.Mal, id.toString())
|
||||||
}
|
}
|
||||||
|
|
||||||
fun LoadResponse.addAniListId(id: Int?) {
|
fun LoadResponse.addAniListId(id: Int?) {
|
||||||
this.syncData[aniListIdPrefix] = (id ?: return).toString()
|
this.syncData[aniListIdPrefix] = (id ?: return).toString()
|
||||||
this.addSimklId(SimklApi.Companion.SyncServices.AniList, id.toString())
|
this.addSimklId(SimklSyncServices.AniList, id.toString())
|
||||||
}
|
}
|
||||||
|
|
||||||
fun LoadResponse.addSimklId(id: Int?) {
|
fun LoadResponse.addSimklId(id: Int?) {
|
||||||
this.addSimklId(SimklApi.Companion.SyncServices.Simkl, id.toString())
|
this.addSimklId(SimklSyncServices.Simkl, id.toString())
|
||||||
}
|
}
|
||||||
|
|
||||||
fun LoadResponse.addImdbUrl(url: String?) {
|
fun LoadResponse.addImdbUrl(url: String?) {
|
||||||
|
@ -1362,7 +1180,7 @@ interface LoadResponse {
|
||||||
|
|
||||||
fun LoadResponse.addImdbId(id: String?) {
|
fun LoadResponse.addImdbId(id: String?) {
|
||||||
// TODO add imdb sync
|
// TODO add imdb sync
|
||||||
this.addSimklId(SimklApi.Companion.SyncServices.Imdb, id)
|
this.addSimklId(SimklSyncServices.Imdb, id)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun LoadResponse.addTrackId(id: String?) {
|
fun LoadResponse.addTrackId(id: String?) {
|
||||||
|
@ -1375,7 +1193,7 @@ interface LoadResponse {
|
||||||
|
|
||||||
fun LoadResponse.addTMDbId(id: String?) {
|
fun LoadResponse.addTMDbId(id: String?) {
|
||||||
// TODO add TMDb sync
|
// TODO add TMDb sync
|
||||||
this.addSimklId(SimklApi.Companion.SyncServices.Tmdb, id)
|
this.addSimklId(SimklSyncServices.Tmdb, id)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun LoadResponse.addRating(text: String?) {
|
fun LoadResponse.addRating(text: String?) {
|
||||||
|
@ -1466,7 +1284,7 @@ data class NextAiring(
|
||||||
constructor(
|
constructor(
|
||||||
episode: Int,
|
episode: Int,
|
||||||
unixTime: Long,
|
unixTime: Long,
|
||||||
) : this (
|
) : this(
|
||||||
episode,
|
episode,
|
||||||
unixTime,
|
unixTime,
|
||||||
null
|
null
|
||||||
|
@ -1929,6 +1747,28 @@ fun <T> MainAPI.newEpisode(
|
||||||
return builder
|
return builder
|
||||||
}
|
}
|
||||||
|
|
||||||
|
interface IDownloadableMinimum {
|
||||||
|
val url: String
|
||||||
|
val referer: String
|
||||||
|
val headers: Map<String, String>
|
||||||
|
}
|
||||||
|
|
||||||
|
fun IDownloadableMinimum.getId(): Int {
|
||||||
|
return url.hashCode()
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set of sync services simkl is compatible with.
|
||||||
|
* Add more as required: https://simkl.docs.apiary.io/#reference/search/id-lookup/get-items-by-id
|
||||||
|
*/
|
||||||
|
enum class SimklSyncServices(val originalName: String) {
|
||||||
|
Simkl("simkl"),
|
||||||
|
Imdb("imdb"),
|
||||||
|
Tmdb("tmdb"),
|
||||||
|
AniList("anilist"),
|
||||||
|
Mal("mal"),
|
||||||
|
}
|
||||||
|
|
||||||
data class TvSeriesLoadResponse(
|
data class TvSeriesLoadResponse(
|
||||||
override var name: String,
|
override var name: String,
|
||||||
override var url: String,
|
override var url: String,
|
|
@ -1,6 +1,6 @@
|
||||||
package com.lagradost.cloudstream3.extractors
|
package com.lagradost.cloudstream3.extractors
|
||||||
|
|
||||||
import android.util.Log
|
import com.lagradost.api.Log
|
||||||
import com.lagradost.cloudstream3.app
|
import com.lagradost.cloudstream3.app
|
||||||
import com.lagradost.cloudstream3.utils.ExtractorApi
|
import com.lagradost.cloudstream3.utils.ExtractorApi
|
||||||
import com.lagradost.cloudstream3.utils.ExtractorLink
|
import com.lagradost.cloudstream3.utils.ExtractorLink
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
package com.lagradost.cloudstream3.extractors
|
package com.lagradost.cloudstream3.extractors
|
||||||
|
|
||||||
import android.util.Log
|
import com.lagradost.api.Log
|
||||||
import com.lagradost.cloudstream3.*
|
import com.lagradost.cloudstream3.*
|
||||||
import com.lagradost.cloudstream3.utils.*
|
import com.lagradost.cloudstream3.utils.*
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
package com.lagradost.cloudstream3.extractors
|
package com.lagradost.cloudstream3.extractors
|
||||||
|
|
||||||
import android.util.Log
|
import com.lagradost.api.Log
|
||||||
import com.lagradost.cloudstream3.*
|
import com.lagradost.cloudstream3.*
|
||||||
import com.lagradost.cloudstream3.utils.*
|
import com.lagradost.cloudstream3.utils.*
|
||||||
import com.lagradost.cloudstream3.extractors.helper.AesHelper
|
import com.lagradost.cloudstream3.extractors.helper.AesHelper
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
package com.lagradost.cloudstream3.extractors
|
package com.lagradost.cloudstream3.extractors
|
||||||
|
|
||||||
import android.util.Log
|
import com.lagradost.api.Log
|
||||||
import com.lagradost.cloudstream3.*
|
import com.lagradost.cloudstream3.*
|
||||||
import com.lagradost.cloudstream3.utils.*
|
import com.lagradost.cloudstream3.utils.*
|
||||||
import com.fasterxml.jackson.annotation.JsonProperty
|
import com.fasterxml.jackson.annotation.JsonProperty
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue