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
|
||||
tasks.register<Jar>("makeJar") {
|
||||
// Duplicates cause hard to catch errors, better to fail at compile time.
|
||||
duplicatesStrategy = DuplicatesStrategy.FAIL
|
||||
dependsOn(tasks.getByName("copyJar"))
|
||||
from(
|
||||
zipTree("build/app-classes/classes.jar"),
|
||||
|
|
|
@ -8,13 +8,14 @@ import android.content.Intent
|
|||
import android.widget.Toast
|
||||
import androidx.fragment.app.Fragment
|
||||
import androidx.fragment.app.FragmentActivity
|
||||
import com.lagradost.api.setContext
|
||||
import com.lagradost.cloudstream3.mvvm.normalSafeApiCall
|
||||
import com.lagradost.cloudstream3.mvvm.suspendSafeApiCall
|
||||
import com.lagradost.cloudstream3.plugins.PluginManager
|
||||
import com.lagradost.cloudstream3.ui.settings.Globals.EMULATOR
|
||||
import com.lagradost.cloudstream3.ui.settings.Globals.TV
|
||||
import com.lagradost.cloudstream3.ui.settings.Globals.isLayout
|
||||
import com.lagradost.cloudstream3.utils.AppUtils.openBrowser
|
||||
import com.lagradost.cloudstream3.utils.AppContextUtils.openBrowser
|
||||
import com.lagradost.cloudstream3.utils.Coroutines.runOnMainThread
|
||||
import com.lagradost.cloudstream3.utils.DataStore.getKey
|
||||
import com.lagradost.cloudstream3.utils.DataStore.getKeys
|
||||
|
@ -151,6 +152,7 @@ class AcraApplication : Application() {
|
|||
get() = _context?.get()
|
||||
private set(value) {
|
||||
_context = WeakReference(value)
|
||||
setContext(WeakReference(value))
|
||||
}
|
||||
|
||||
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.UiText
|
||||
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.Event
|
||||
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.lagradost.cloudstream3.APIHolder.allProviders
|
||||
import com.lagradost.cloudstream3.APIHolder.apis
|
||||
import com.lagradost.cloudstream3.APIHolder.getApiDubstatusSettings
|
||||
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.removeKey
|
||||
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.SetupFragmentExtensions
|
||||
import com.lagradost.cloudstream3.utils.ApkInstaller
|
||||
import com.lagradost.cloudstream3.utils.AppUtils.html
|
||||
import com.lagradost.cloudstream3.utils.AppUtils.isCastApiAvailable
|
||||
import com.lagradost.cloudstream3.utils.AppUtils.isLtr
|
||||
import com.lagradost.cloudstream3.utils.AppUtils.isNetworkAvailable
|
||||
import com.lagradost.cloudstream3.utils.AppUtils.isRtl
|
||||
import com.lagradost.cloudstream3.utils.AppUtils.loadCache
|
||||
import com.lagradost.cloudstream3.utils.AppUtils.loadRepository
|
||||
import com.lagradost.cloudstream3.utils.AppUtils.loadResult
|
||||
import com.lagradost.cloudstream3.utils.AppUtils.loadSearchResult
|
||||
import com.lagradost.cloudstream3.utils.AppUtils.setDefaultFocus
|
||||
import com.lagradost.cloudstream3.utils.AppContextUtils.getApiDubstatusSettings
|
||||
import com.lagradost.cloudstream3.utils.AppContextUtils.html
|
||||
import com.lagradost.cloudstream3.utils.AppContextUtils.isCastApiAvailable
|
||||
import com.lagradost.cloudstream3.utils.AppContextUtils.isLtr
|
||||
import com.lagradost.cloudstream3.utils.AppContextUtils.isNetworkAvailable
|
||||
import com.lagradost.cloudstream3.utils.AppContextUtils.isRtl
|
||||
import com.lagradost.cloudstream3.utils.AppContextUtils.loadCache
|
||||
import com.lagradost.cloudstream3.utils.AppContextUtils.loadRepository
|
||||
import com.lagradost.cloudstream3.utils.AppContextUtils.loadResult
|
||||
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.setUpBackup
|
||||
import com.lagradost.cloudstream3.utils.BiometricAuthenticator.BiometricCallback
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
package com.lagradost.cloudstream3.network
|
||||
|
||||
import android.util.Base64
|
||||
import android.util.Log
|
||||
import android.webkit.CookieManager
|
||||
import androidx.annotation.AnyThread
|
||||
|
|
|
@ -14,7 +14,6 @@ import androidx.fragment.app.FragmentActivity
|
|||
import com.fasterxml.jackson.annotation.JsonProperty
|
||||
import com.google.gson.Gson
|
||||
import com.lagradost.cloudstream3.*
|
||||
import com.lagradost.cloudstream3.APIHolder.getApiProviderLangSettings
|
||||
import com.lagradost.cloudstream3.APIHolder.removePluginMapping
|
||||
import com.lagradost.cloudstream3.AcraApplication.Companion.getActivity
|
||||
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.settings.extensions.REPOSITORIES_KEY
|
||||
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.ExtractorApi
|
||||
import com.lagradost.cloudstream3.utils.UIHelper.colorFromAttribute
|
||||
|
|
|
@ -10,7 +10,7 @@ import androidx.work.PeriodicWorkRequest
|
|||
import androidx.work.WorkManager
|
||||
import androidx.work.WorkerParameters
|
||||
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.UIHelper.colorFromAttribute
|
||||
import java.util.concurrent.TimeUnit
|
||||
|
|
|
@ -10,13 +10,13 @@ import androidx.core.app.NotificationCompat
|
|||
import androidx.core.net.toUri
|
||||
import androidx.work.*
|
||||
import com.lagradost.cloudstream3.*
|
||||
import com.lagradost.cloudstream3.APIHolder.getApiDubstatusSettings
|
||||
import com.lagradost.cloudstream3.APIHolder.getApiFromNameNull
|
||||
import com.lagradost.cloudstream3.R
|
||||
import com.lagradost.cloudstream3.mvvm.logError
|
||||
import com.lagradost.cloudstream3.plugins.PluginManager
|
||||
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.DataStoreHelper
|
||||
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.removeKeys
|
||||
import com.lagradost.cloudstream3.AcraApplication.Companion.setKey
|
||||
import com.lagradost.cloudstream3.LoadResponse
|
||||
import com.lagradost.cloudstream3.syncproviders.providers.*
|
||||
import java.util.concurrent.TimeUnit
|
||||
|
||||
abstract class AccountManager(private val defIndex: Int) : AuthAPI {
|
||||
companion object {
|
||||
val malApi = MALApi(0)
|
||||
val aniListApi = AniListApi(0)
|
||||
val malApi = MALApi(0).also { api ->
|
||||
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 simklApi = SimklApi(0)
|
||||
val addic7ed = Addic7ed()
|
||||
val subDlApi = SubDlApi(0)
|
||||
val localListApi = LocalList()
|
||||
|
|
|
@ -2,20 +2,10 @@ package com.lagradost.cloudstream3.syncproviders
|
|||
|
||||
import com.lagradost.cloudstream3.*
|
||||
import com.lagradost.cloudstream3.ui.SyncWatchType
|
||||
import com.lagradost.cloudstream3.ui.WatchType
|
||||
import com.lagradost.cloudstream3.ui.library.ListSorting
|
||||
import com.lagradost.cloudstream3.ui.result.UiText
|
||||
import me.xdrop.fuzzywuzzy.FuzzySearch
|
||||
|
||||
enum class SyncIdName {
|
||||
Anilist,
|
||||
MyAnimeList,
|
||||
Trakt,
|
||||
Imdb,
|
||||
Simkl,
|
||||
LocalList,
|
||||
}
|
||||
|
||||
interface SyncAPI : OAuth2API {
|
||||
/**
|
||||
* 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.result.txt
|
||||
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.tryParseJson
|
||||
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.result.txt
|
||||
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 java.net.URL
|
||||
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.InAppAuthAPI
|
||||
import com.lagradost.cloudstream3.syncproviders.InAppAuthAPIManager
|
||||
import com.lagradost.cloudstream3.utils.AppContextUtils
|
||||
import com.lagradost.cloudstream3.utils.AppUtils
|
||||
import okhttp3.Interceptor
|
||||
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.setKey
|
||||
import com.lagradost.cloudstream3.BuildConfig
|
||||
import com.lagradost.cloudstream3.LoadResponse.Companion.readIdFromString
|
||||
import com.lagradost.cloudstream3.R
|
||||
import com.lagradost.cloudstream3.SimklSyncServices
|
||||
import com.lagradost.cloudstream3.TvType
|
||||
import com.lagradost.cloudstream3.app
|
||||
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.result.txt
|
||||
import com.lagradost.cloudstream3.utils.AppUtils.toJson
|
||||
import com.lagradost.cloudstream3.utils.AppUtils.tryParseJson
|
||||
import okhttp3.Interceptor
|
||||
import okhttp3.Response
|
||||
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 {
|
||||
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,
|
||||
) {
|
||||
companion object {
|
||||
fun fromMap(map: Map<SyncServices, String>): Ids {
|
||||
fun fromMap(map: Map<SimklSyncServices, String>): Ids {
|
||||
return Ids(
|
||||
simkl = map[SyncServices.Simkl]?.toIntOrNull(),
|
||||
imdb = map[SyncServices.Imdb],
|
||||
tmdb = map[SyncServices.Tmdb],
|
||||
mal = map[SyncServices.Mal],
|
||||
anilist = map[SyncServices.AniList]
|
||||
simkl = map[SimklSyncServices.Simkl]?.toIntOrNull(),
|
||||
imdb = map[SimklSyncServices.Imdb],
|
||||
tmdb = map[SimklSyncServices.Tmdb],
|
||||
mal = map[SimklSyncServices.Mal],
|
||||
anilist = map[SimklSyncServices.AniList]
|
||||
)
|
||||
}
|
||||
}
|
||||
|
@ -749,13 +724,13 @@ class SimklApi(index: Int) : AccountManager(index), SyncAPI {
|
|||
@JsonProperty("anilist") val anilist: String?,
|
||||
@JsonProperty("traktslug") val traktslug: String?
|
||||
) {
|
||||
fun matchesId(database: SyncServices, id: String): Boolean {
|
||||
fun matchesId(database: SimklSyncServices, id: String): Boolean {
|
||||
return when (database) {
|
||||
SyncServices.Simkl -> this.simkl == id.toIntOrNull()
|
||||
SyncServices.AniList -> this.anilist == id
|
||||
SyncServices.Mal -> this.mal == id
|
||||
SyncServices.Tmdb -> this.tmdb == id
|
||||
SyncServices.Imdb -> this.imdb == id
|
||||
SimklSyncServices.Simkl -> this.simkl == id.toIntOrNull()
|
||||
SimklSyncServices.AniList -> this.anilist == id
|
||||
SimklSyncServices.Mal -> this.mal == id
|
||||
SimklSyncServices.Tmdb -> this.tmdb == 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 */
|
||||
suspend fun searchByIds(serviceMap: Map<SyncServices, String>): Array<MediaObject>? {
|
||||
suspend fun searchByIds(serviceMap: Map<SimklSyncServices, String>): Array<MediaObject>? {
|
||||
if (serviceMap.isEmpty()) return emptyArray()
|
||||
|
||||
return app.get(
|
||||
|
|
|
@ -23,13 +23,13 @@ import com.lagradost.cloudstream3.R
|
|||
import com.lagradost.cloudstream3.mvvm.Resource
|
||||
import com.lagradost.cloudstream3.mvvm.logError
|
||||
import com.lagradost.cloudstream3.mvvm.safeApiCall
|
||||
import com.lagradost.cloudstream3.sortSubs
|
||||
import com.lagradost.cloudstream3.sortUrls
|
||||
import com.lagradost.cloudstream3.ui.player.LoadType
|
||||
import com.lagradost.cloudstream3.ui.player.RepoLinkGenerator
|
||||
import com.lagradost.cloudstream3.ui.player.SubtitleData
|
||||
import com.lagradost.cloudstream3.ui.result.ResultEpisode
|
||||
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.CastHelper.awaitLinks
|
||||
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.databinding.FragmentWebviewBinding
|
||||
import com.lagradost.cloudstream3.network.WebViewResolver
|
||||
import com.lagradost.cloudstream3.utils.AppUtils.loadRepository
|
||||
import com.lagradost.cloudstream3.utils.AppContextUtils.loadRepository
|
||||
|
||||
|
||||
class WebviewFragment : Fragment() {
|
||||
|
|
|
@ -27,7 +27,7 @@ import com.lagradost.cloudstream3.mvvm.logError
|
|||
import com.lagradost.cloudstream3.mvvm.observe
|
||||
import com.lagradost.cloudstream3.ui.result.setImage
|
||||
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.getDefaultAccount
|
||||
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.DownloadHeaderEpisodeBinding
|
||||
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.utils.AppUtils.getNameFull
|
||||
import com.lagradost.cloudstream3.utils.DataStoreHelper.fixVisual
|
||||
import com.lagradost.cloudstream3.utils.DataStoreHelper.getViewPos
|
||||
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.mvvm.logError
|
||||
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.utils.AppUtils.getNameFull
|
||||
import com.lagradost.cloudstream3.utils.AppUtils.setDefaultFocus
|
||||
import com.lagradost.cloudstream3.utils.AppContextUtils.getNameFull
|
||||
import com.lagradost.cloudstream3.utils.AppContextUtils.setDefaultFocus
|
||||
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.VideoDownloadHelper
|
||||
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.settings.Globals.TV
|
||||
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.DataStore
|
||||
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.lagradost.cloudstream3.*
|
||||
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.databinding.FragmentHomeBinding
|
||||
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.TV
|
||||
import com.lagradost.cloudstream3.ui.settings.Globals.isLayout
|
||||
import com.lagradost.cloudstream3.utils.AppUtils.isRecyclerScrollable
|
||||
import com.lagradost.cloudstream3.utils.AppUtils.loadSearchResult
|
||||
import com.lagradost.cloudstream3.utils.AppUtils.ownHide
|
||||
import com.lagradost.cloudstream3.utils.AppUtils.ownShow
|
||||
import com.lagradost.cloudstream3.utils.AppUtils.setDefaultFocus
|
||||
import com.lagradost.cloudstream3.utils.AppContextUtils.filterProviderByPreferredMedia
|
||||
import com.lagradost.cloudstream3.utils.AppContextUtils.getApiProviderLangSettings
|
||||
import com.lagradost.cloudstream3.utils.AppContextUtils.isRecyclerScrollable
|
||||
import com.lagradost.cloudstream3.utils.AppContextUtils.loadSearchResult
|
||||
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.DataStoreHelper
|
||||
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.TV
|
||||
import com.lagradost.cloudstream3.ui.settings.Globals.isLayout
|
||||
import com.lagradost.cloudstream3.utils.AppUtils.isRecyclerScrollable
|
||||
import com.lagradost.cloudstream3.utils.AppContextUtils.isRecyclerScrollable
|
||||
|
||||
class LoadClickCallback(
|
||||
val action: Int = 0,
|
||||
|
|
|
@ -16,7 +16,6 @@ import androidx.viewbinding.ViewBinding
|
|||
import androidx.viewpager2.widget.ViewPager2
|
||||
import com.google.android.material.chip.Chip
|
||||
import com.google.android.material.chip.ChipGroup
|
||||
import com.lagradost.cloudstream3.APIHolder.getId
|
||||
import com.lagradost.cloudstream3.AcraApplication.Companion.getActivity
|
||||
import com.lagradost.cloudstream3.CommonActivity.activity
|
||||
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.ResultViewModel2
|
||||
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.search.SEARCH_ACTION_LOAD
|
||||
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.viewModelScope
|
||||
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.AcraApplication.Companion.context
|
||||
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.settings.Globals.TV
|
||||
import com.lagradost.cloudstream3.ui.settings.Globals.isLayout
|
||||
import com.lagradost.cloudstream3.utils.AppUtils.addProgramsToContinueWatching
|
||||
import com.lagradost.cloudstream3.utils.AppUtils.loadResult
|
||||
import com.lagradost.cloudstream3.utils.AppContextUtils.addProgramsToContinueWatching
|
||||
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.DOWNLOAD_HEADER_CACHE
|
||||
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.TV
|
||||
import com.lagradost.cloudstream3.ui.settings.Globals.isLayout
|
||||
import com.lagradost.cloudstream3.utils.AppUtils.loadResult
|
||||
import com.lagradost.cloudstream3.utils.AppUtils.loadSearchResult
|
||||
import com.lagradost.cloudstream3.utils.AppUtils.reduceDragSensitivity
|
||||
import com.lagradost.cloudstream3.utils.AppContextUtils.loadResult
|
||||
import com.lagradost.cloudstream3.utils.AppContextUtils.loadSearchResult
|
||||
import com.lagradost.cloudstream3.utils.AppContextUtils.reduceDragSensitivity
|
||||
import com.lagradost.cloudstream3.utils.DataStoreHelper.currentAccount
|
||||
import com.lagradost.cloudstream3.utils.SingleSelectionHelper.showBottomDialog
|
||||
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.search.SearchClickCallback
|
||||
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 kotlin.math.roundToInt
|
||||
|
||||
|
@ -26,7 +26,7 @@ class PageAdapter(
|
|||
private val resView: AutofitRecyclerView,
|
||||
val clickCallback: (SearchClickCallback) -> Unit
|
||||
) :
|
||||
AppUtils.DiffAdapter<SyncAPI.LibraryItem>(items) {
|
||||
AppContextUtils.DiffAdapter<SyncAPI.LibraryItem>(items) {
|
||||
|
||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
|
||||
return LibraryItemViewHolder(
|
||||
|
|
|
@ -44,8 +44,8 @@ import com.lagradost.cloudstream3.mvvm.normalSafeApiCall
|
|||
import com.lagradost.cloudstream3.syncproviders.AccountManager.Companion.unixTimeMs
|
||||
import com.lagradost.cloudstream3.ui.subtitles.SaveCaptionStyle
|
||||
import com.lagradost.cloudstream3.ui.subtitles.SubtitlesFragment
|
||||
import com.lagradost.cloudstream3.utils.AppUtils
|
||||
import com.lagradost.cloudstream3.utils.AppUtils.requestLocalAudioFocus
|
||||
import com.lagradost.cloudstream3.utils.AppContextUtils
|
||||
import com.lagradost.cloudstream3.utils.AppContextUtils.requestLocalAudioFocus
|
||||
import com.lagradost.cloudstream3.utils.DataStoreHelper
|
||||
import com.lagradost.cloudstream3.utils.EpisodeSkip
|
||||
import com.lagradost.cloudstream3.utils.UIHelper
|
||||
|
@ -258,7 +258,7 @@ abstract class AbstractPlayerFragment(
|
|||
|
||||
private fun requestAudioFocus() {
|
||||
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.normalSafeApiCall
|
||||
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.DrmExtractorLink
|
||||
import com.lagradost.cloudstream3.utils.EpisodeSkip
|
||||
import com.lagradost.cloudstream3.utils.ExtractorLink
|
||||
import com.lagradost.cloudstream3.utils.ExtractorLinkPlayList
|
||||
import com.lagradost.cloudstream3.utils.ExtractorLinkType
|
||||
import com.lagradost.cloudstream3.utils.ExtractorUri
|
||||
import com.lagradost.cloudstream3.utils.SubtitleHelper.fromTwoLettersToLanguage
|
||||
import java.io.File
|
||||
import java.lang.IllegalArgumentException
|
||||
|
|
|
@ -4,7 +4,6 @@ import com.lagradost.cloudstream3.AcraApplication.Companion.context
|
|||
import com.lagradost.cloudstream3.R
|
||||
import com.lagradost.cloudstream3.ui.player.PlayerSubtitleHelper.Companion.toSubtitleMimeType
|
||||
import com.lagradost.cloudstream3.utils.ExtractorLink
|
||||
import com.lagradost.cloudstream3.utils.ExtractorUri
|
||||
import com.lagradost.cloudstream3.utils.VideoDownloadManager
|
||||
import kotlin.math.max
|
||||
import kotlin.math.min
|
||||
|
|
|
@ -8,10 +8,14 @@ import androidx.activity.OnBackPressedCallback
|
|||
import androidx.appcompat.app.AppCompatActivity
|
||||
import com.lagradost.cloudstream3.CommonActivity
|
||||
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.ui.player.OfflinePlaybackHelper.playLink
|
||||
import com.lagradost.cloudstream3.ui.player.OfflinePlaybackHelper.playUri
|
||||
|
||||
const val DTAG = "PlayerActivity"
|
||||
|
||||
class DownloadedPlayerActivity : AppCompatActivity() {
|
||||
private val dTAG = "DownloadedPlayerAct"
|
||||
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
package com.lagradost.cloudstream3.ui.player
|
||||
|
||||
import com.lagradost.cloudstream3.utils.ExtractorLink
|
||||
import com.lagradost.cloudstream3.utils.ExtractorUri
|
||||
|
||||
class ExtractorLinkGenerator(
|
||||
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.TV
|
||||
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.SingleSelectionHelper.showDialog
|
||||
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.SubtitlesFragment.Companion.getAutoSelectLanguageISO639_1
|
||||
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.runOnMainThread
|
||||
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.ExtractorLinkType
|
||||
import com.lagradost.cloudstream3.utils.ExtractorUri
|
||||
|
||||
enum class LoadType {
|
||||
Unknown,
|
||||
|
|
|
@ -6,7 +6,6 @@ import android.util.Rational
|
|||
import com.lagradost.cloudstream3.ui.subtitles.SaveCaptionStyle
|
||||
import com.lagradost.cloudstream3.utils.EpisodeSkip
|
||||
import com.lagradost.cloudstream3.utils.ExtractorLink
|
||||
import com.lagradost.cloudstream3.utils.ExtractorUri
|
||||
|
||||
enum class PlayerEventType(val value: Int) {
|
||||
//Stop(-1),
|
||||
|
|
|
@ -1,13 +1,31 @@
|
|||
package com.lagradost.cloudstream3.ui.player
|
||||
|
||||
import android.net.Uri
|
||||
import com.lagradost.cloudstream3.TvType
|
||||
import com.lagradost.cloudstream3.amap
|
||||
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.Qualities
|
||||
import com.lagradost.cloudstream3.utils.loadExtractor
|
||||
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
|
||||
**/
|
||||
|
|
|
@ -5,7 +5,7 @@ import android.content.ContentUris
|
|||
import android.net.Uri
|
||||
import androidx.core.content.ContextCompat.getString
|
||||
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.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.EpisodeSkip
|
||||
import com.lagradost.cloudstream3.utils.ExtractorLink
|
||||
import com.lagradost.cloudstream3.utils.ExtractorUri
|
||||
import kotlinx.coroutines.Job
|
||||
import kotlinx.coroutines.launch
|
||||
|
||||
|
|
|
@ -9,14 +9,11 @@ import android.util.Log
|
|||
import androidx.annotation.WorkerThread
|
||||
import androidx.core.graphics.scale
|
||||
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.isLayout
|
||||
import com.lagradost.cloudstream3.ui.settings.SettingsFragment
|
||||
import com.lagradost.cloudstream3.utils.Coroutines.ioSafe
|
||||
import com.lagradost.cloudstream3.utils.ExtractorLink
|
||||
import com.lagradost.cloudstream3.utils.ExtractorLinkType
|
||||
import com.lagradost.cloudstream3.utils.ExtractorUri
|
||||
import com.lagradost.cloudstream3.utils.M3u8Helper
|
||||
import com.lagradost.cloudstream3.utils.M3u8Helper2
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
|
|
|
@ -7,7 +7,6 @@ import com.lagradost.cloudstream3.LoadResponse
|
|||
import com.lagradost.cloudstream3.ui.APIRepository
|
||||
import com.lagradost.cloudstream3.ui.result.ResultEpisode
|
||||
import com.lagradost.cloudstream3.utils.ExtractorLink
|
||||
import com.lagradost.cloudstream3.utils.ExtractorUri
|
||||
import kotlin.math.max
|
||||
import kotlin.math.min
|
||||
|
||||
|
|
|
@ -4,7 +4,7 @@ import android.view.LayoutInflater
|
|||
import android.view.ViewGroup
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import com.lagradost.cloudstream3.databinding.PlayerPrioritizeItemBinding
|
||||
import com.lagradost.cloudstream3.utils.AppUtils
|
||||
import com.lagradost.cloudstream3.utils.AppContextUtils
|
||||
|
||||
data class SourcePriority<T>(
|
||||
val data: T,
|
||||
|
@ -13,7 +13,7 @@ data class 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 {
|
||||
return PriorityViewHolder(
|
||||
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.databinding.PlayerQualityProfileItemBinding
|
||||
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
|
||||
|
||||
class ProfilesAdapter(
|
||||
|
@ -21,7 +21,7 @@ class ProfilesAdapter(
|
|||
val usedProfile: Int,
|
||||
val clickCallback: (oldIndex: Int?, newIndex: Int) -> Unit,
|
||||
) :
|
||||
AppUtils.DiffAdapter<QualityDataHelper.QualityProfile>(
|
||||
AppContextUtils.DiffAdapter<QualityDataHelper.QualityProfile>(
|
||||
items,
|
||||
comparison = { first: QualityDataHelper.QualityProfile, second: QualityDataHelper.QualityProfile ->
|
||||
first.id == second.id
|
||||
|
|
|
@ -17,8 +17,6 @@ import androidx.fragment.app.Fragment
|
|||
import androidx.lifecycle.ViewModelProvider
|
||||
import androidx.recyclerview.widget.GridLayoutManager
|
||||
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.CommonActivity.activity
|
||||
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.SearchHelper
|
||||
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.PHONE
|
||||
import com.lagradost.cloudstream3.ui.settings.Globals.TV
|
||||
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.fixPaddingStatusbar
|
||||
import com.lagradost.cloudstream3.utils.UIHelper.getSpanCount
|
||||
|
|
|
@ -138,7 +138,7 @@ class ActorAdaptor(
|
|||
voiceActorImageHolder.isVisible = false
|
||||
voiceActorName.isVisible = false
|
||||
} else {
|
||||
voiceActorName.text = actor.voiceActor.name
|
||||
voiceActorName.text = actor.voiceActor?.name
|
||||
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.TV
|
||||
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.toPx
|
||||
import com.lagradost.cloudstream3.utils.VideoDownloadHelper
|
||||
|
|
|
@ -3,12 +3,12 @@ package com.lagradost.cloudstream3.ui.result
|
|||
import android.os.Bundle
|
||||
import androidx.fragment.app.Fragment
|
||||
import androidx.preference.PreferenceManager
|
||||
import com.lagradost.cloudstream3.APIHolder.getApiDubstatusSettings
|
||||
import com.lagradost.cloudstream3.DubStatus
|
||||
import com.lagradost.cloudstream3.R
|
||||
import com.lagradost.cloudstream3.SearchResponse
|
||||
import com.lagradost.cloudstream3.TvType
|
||||
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.getVideoWatchState
|
||||
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.material.bottomsheet.BottomSheetDialog
|
||||
import com.lagradost.cloudstream3.APIHolder
|
||||
import com.lagradost.cloudstream3.APIHolder.updateHasTrailers
|
||||
import com.lagradost.cloudstream3.CommonActivity.showToast
|
||||
import com.lagradost.cloudstream3.DubStatus
|
||||
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.search.SearchAdapter
|
||||
import com.lagradost.cloudstream3.ui.search.SearchHelper
|
||||
import com.lagradost.cloudstream3.utils.AppUtils.getNameFull
|
||||
import com.lagradost.cloudstream3.utils.AppUtils.isCastApiAvailable
|
||||
import com.lagradost.cloudstream3.utils.AppUtils.loadCache
|
||||
import com.lagradost.cloudstream3.utils.AppUtils.openBrowser
|
||||
import com.lagradost.cloudstream3.utils.AppContextUtils.getNameFull
|
||||
import com.lagradost.cloudstream3.utils.AppContextUtils.isCastApiAvailable
|
||||
import com.lagradost.cloudstream3.utils.AppContextUtils.loadCache
|
||||
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.ExtractorLink
|
||||
import com.lagradost.cloudstream3.utils.SingleSelectionHelper.showBottomDialog
|
||||
|
|
|
@ -17,7 +17,6 @@ import androidx.fragment.app.Fragment
|
|||
import androidx.lifecycle.ViewModelProvider
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import com.google.android.material.bottomsheet.BottomSheetDialog
|
||||
import com.lagradost.cloudstream3.APIHolder.updateHasTrailers
|
||||
import com.lagradost.cloudstream3.CommonActivity
|
||||
import com.lagradost.cloudstream3.DubStatus
|
||||
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.SearchAdapter
|
||||
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.TV
|
||||
import com.lagradost.cloudstream3.ui.settings.Globals.isLayout
|
||||
import com.lagradost.cloudstream3.utils.AppUtils.html
|
||||
import com.lagradost.cloudstream3.utils.AppUtils.isRtl
|
||||
import com.lagradost.cloudstream3.utils.AppUtils.loadCache
|
||||
import com.lagradost.cloudstream3.utils.AppContextUtils.html
|
||||
import com.lagradost.cloudstream3.utils.AppContextUtils.isRtl
|
||||
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.showBottomDialogInstant
|
||||
import com.lagradost.cloudstream3.utils.UIHelper
|
||||
|
|
|
@ -18,7 +18,7 @@ import androidx.lifecycle.ViewModel
|
|||
import androidx.lifecycle.viewModelScope
|
||||
import com.lagradost.cloudstream3.*
|
||||
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.unixTimeMS
|
||||
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.LoadResponse.Companion.addTrailer
|
||||
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.isMovie
|
||||
import com.lagradost.cloudstream3.LoadResponse.Companion.readIdFromString
|
||||
import com.lagradost.cloudstream3.MainActivity.Companion.MPV
|
||||
import com.lagradost.cloudstream3.MainActivity.Companion.MPV_COMPONENT
|
||||
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.subtitles.SubtitlesFragment
|
||||
import com.lagradost.cloudstream3.utils.*
|
||||
import com.lagradost.cloudstream3.utils.AppUtils.getNameFull
|
||||
import com.lagradost.cloudstream3.utils.AppUtils.isAppInstalled
|
||||
import com.lagradost.cloudstream3.utils.AppUtils.isConnectedToChromecast
|
||||
import com.lagradost.cloudstream3.utils.AppUtils.setDefaultFocus
|
||||
import com.lagradost.cloudstream3.utils.AppContextUtils.getNameFull
|
||||
import com.lagradost.cloudstream3.utils.AppContextUtils.isAppInstalled
|
||||
import com.lagradost.cloudstream3.utils.AppContextUtils.isConnectedToChromecast
|
||||
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.Coroutines.ioSafe
|
||||
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(
|
||||
val linksLoaded: Int,
|
||||
|
@ -856,7 +874,7 @@ class ResultViewModel2 : ViewModel() {
|
|||
loadResponse: LoadResponse? = null,
|
||||
statusChangedCallback: ((statusChanged: Boolean) -> Unit)? = null
|
||||
) {
|
||||
val (response,currentId) = loadResponse?.let { load ->
|
||||
val (response, currentId) = loadResponse?.let { load ->
|
||||
(load to load.getId())
|
||||
} ?: ((currentResponse ?: return) to (currentId ?: return))
|
||||
|
||||
|
@ -1140,12 +1158,16 @@ class ResultViewModel2 : ViewModel() {
|
|||
|
||||
val message = if (duplicateEntries.size == 1) {
|
||||
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.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}"
|
||||
)
|
||||
} else {
|
||||
|
@ -1170,9 +1192,11 @@ class ResultViewModel2 : ViewModel() {
|
|||
DialogInterface.BUTTON_POSITIVE -> {
|
||||
checkDuplicatesCallback.invoke(true, emptyList())
|
||||
}
|
||||
|
||||
DialogInterface.BUTTON_NEGATIVE -> {
|
||||
checkDuplicatesCallback.invoke(false, emptyList())
|
||||
}
|
||||
|
||||
DialogInterface.BUTTON_NEUTRAL -> {
|
||||
checkDuplicatesCallback.invoke(true, duplicateEntries.map { it.id })
|
||||
}
|
||||
|
@ -1189,17 +1213,17 @@ class ResultViewModel2 : ViewModel() {
|
|||
|
||||
private fun getImdbIdFromSyncData(syncData: Map<String, String>?): String? {
|
||||
return normalSafeApiCall {
|
||||
SimklApi.readIdFromString(
|
||||
readIdFromString(
|
||||
syncData?.get(AccountManager.simklApi.idPrefix)
|
||||
)[SimklApi.Companion.SyncServices.Imdb]
|
||||
)[SimklSyncServices.Imdb]
|
||||
}
|
||||
}
|
||||
|
||||
private fun getTMDbIdFromSyncData(syncData: Map<String, String>?): String? {
|
||||
return normalSafeApiCall {
|
||||
SimklApi.readIdFromString(
|
||||
readIdFromString(
|
||||
syncData?.get(AccountManager.simklApi.idPrefix)
|
||||
)[SimklApi.Companion.SyncServices.Tmdb]
|
||||
)[SimklSyncServices.Tmdb]
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1303,7 +1327,8 @@ class ResultViewModel2 : ViewModel() {
|
|||
postPopup(
|
||||
text,
|
||||
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")
|
||||
}) {
|
||||
callback.invoke(links to (it ?: return@postPopup))
|
||||
|
@ -1928,7 +1953,8 @@ class ResultViewModel2 : ViewModel() {
|
|||
.distinct().map {
|
||||
// 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
|
||||
it.lowercase().replace(Regex("""\(?[ds]ub(bed)?\)?(\s|$)""") , "").trim()
|
||||
it.lowercase().replace(Regex("""\(?[ds]ub(bed)?\)?(\s|$)"""), "")
|
||||
.trim()
|
||||
},
|
||||
TrackerType.getTypes(this.type),
|
||||
this.year
|
||||
|
@ -2276,7 +2302,7 @@ class ResultViewModel2 : ViewModel() {
|
|||
|
||||
private suspend fun postSuccessful(
|
||||
loadResponse: LoadResponse,
|
||||
mainId : Int,
|
||||
mainId: Int,
|
||||
apiRepository: APIRepository,
|
||||
updateEpisodes: Boolean,
|
||||
updateFillers: Boolean,
|
||||
|
@ -2292,7 +2318,11 @@ class ResultViewModel2 : ViewModel() {
|
|||
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())
|
||||
|
||||
if (updateFillers && loadResponse is AnimeLoadResponse) {
|
||||
|
@ -2313,7 +2343,12 @@ class ResultViewModel2 : ViewModel() {
|
|||
?: 0)
|
||||
|
||||
val totalIndex =
|
||||
i.season?.let { season -> loadResponse.getTotalEpisodeIndex(episode, season) }
|
||||
i.season?.let { season ->
|
||||
loadResponse.getTotalEpisodeIndex(
|
||||
episode,
|
||||
season
|
||||
)
|
||||
}
|
||||
|
||||
if (!existingEpisodes.contains(id)) {
|
||||
existingEpisodes.add(id)
|
||||
|
@ -2366,7 +2401,12 @@ class ResultViewModel2 : ViewModel() {
|
|||
loadResponse.seasonNames.getSeason(episode.season)
|
||||
|
||||
val totalIndex =
|
||||
episode.season?.let { season -> loadResponse.getTotalEpisodeIndex(episodeIndex, season) }
|
||||
episode.season?.let { season ->
|
||||
loadResponse.getTotalEpisodeIndex(
|
||||
episodeIndex,
|
||||
season
|
||||
)
|
||||
}
|
||||
|
||||
val ep =
|
||||
buildResultEpisode(
|
||||
|
@ -2546,7 +2586,13 @@ class ResultViewModel2 : ViewModel() {
|
|||
ResumeProgress(
|
||||
progress = (viewPos.position / 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 backgroundPosterUrl: String? = null,
|
||||
override var contentRating: String? = null,
|
||||
val id : Int?,
|
||||
val id: Int?,
|
||||
) : LoadResponse
|
||||
|
||||
fun loadSmall(activity: Activity?, searchResponse : SearchResponse) = ioSafe {
|
||||
fun loadSmall(activity: Activity?, searchResponse: SearchResponse) = ioSafe {
|
||||
val url = searchResponse.url
|
||||
_page.postValue(Resource.Loading(url))
|
||||
_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 response = LoadResponseFromSearch(name = searchResponse.name, url = searchResponse.url, apiName = api.name, type = searchResponse.type ?: TvType.Others,
|
||||
posterUrl = searchResponse.posterUrl, id = searchResponse.id).apply {
|
||||
val response = LoadResponseFromSearch(
|
||||
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) {
|
||||
this.plot = searchResponse.plot
|
||||
this.rating = searchResponse.personalRating?.times(100) ?: searchResponse.rating
|
||||
|
@ -2701,7 +2756,8 @@ class ResultViewModel2 : ViewModel() {
|
|||
mainId = mainId,
|
||||
apiRepository = repo,
|
||||
updateEpisodes = false,
|
||||
updateFillers = false)
|
||||
updateFillers = false
|
||||
)
|
||||
}
|
||||
|
||||
fun load(
|
||||
|
|
|
@ -10,7 +10,7 @@ import androidx.annotation.StringRes
|
|||
import androidx.core.view.isGone
|
||||
import androidx.core.view.isVisible
|
||||
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
|
||||
|
||||
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.BottomSheetDialog
|
||||
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.getApiProviderLangSettings
|
||||
import com.lagradost.cloudstream3.APIHolder.getApiSettings
|
||||
import com.lagradost.cloudstream3.AcraApplication.Companion.removeKey
|
||||
import com.lagradost.cloudstream3.AcraApplication.Companion.removeKeys
|
||||
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.TV
|
||||
import com.lagradost.cloudstream3.ui.settings.Globals.isLayout
|
||||
import com.lagradost.cloudstream3.utils.AppUtils.ownHide
|
||||
import com.lagradost.cloudstream3.utils.AppUtils.ownShow
|
||||
import com.lagradost.cloudstream3.utils.AppUtils.setDefaultFocus
|
||||
import com.lagradost.cloudstream3.utils.AppContextUtils.filterProviderByPreferredMedia
|
||||
import com.lagradost.cloudstream3.utils.AppContextUtils.filterSearchResultByFilmQuality
|
||||
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.DataStoreHelper
|
||||
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.settings.Globals.PHONE
|
||||
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.VideoDownloadHelper
|
||||
|
||||
|
|
|
@ -19,7 +19,7 @@ import com.lagradost.cloudstream3.isMovieType
|
|||
import com.lagradost.cloudstream3.syncproviders.SyncAPI
|
||||
import com.lagradost.cloudstream3.ui.settings.Globals.TV
|
||||
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.fixVisual
|
||||
import com.lagradost.cloudstream3.utils.SubtitleHelper
|
||||
|
|
|
@ -9,8 +9,6 @@ import android.view.inputmethod.EditorInfo
|
|||
import android.widget.TextView
|
||||
import androidx.annotation.UiThread
|
||||
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.isVisible
|
||||
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.setToolBarScrollFlags
|
||||
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.BiometricAuthenticator.BiometricCallback
|
||||
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.hideKeyboard
|
||||
import com.lagradost.cloudstream3.utils.UIHelper.setImage
|
||||
import com.lagradost.cloudstream3.utils.UIHelper.toPx
|
||||
import qrcode.QRCode
|
||||
import java.io.ByteArrayOutputStream
|
||||
|
||||
class SettingsAccount : PreferenceFragmentCompat(), BiometricCallback {
|
||||
companion object {
|
||||
|
|
|
@ -7,19 +7,17 @@ import androidx.navigation.fragment.findNavController
|
|||
import androidx.preference.PreferenceFragmentCompat
|
||||
import androidx.preference.PreferenceManager
|
||||
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.settings.SettingsFragment.Companion.getPref
|
||||
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.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.SingleSelectionHelper.showMultiDialog
|
||||
import com.lagradost.cloudstream3.utils.SubtitleHelper
|
||||
import com.lagradost.cloudstream3.utils.UIHelper.hideKeyboard
|
||||
import com.lagradost.cloudstream3.utils.UIHelper.navigate
|
||||
|
||||
class SettingsProviders : PreferenceFragmentCompat() {
|
||||
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.SettingsFragment.Companion.setToolBarScrollFlags
|
||||
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.setUpToolbar
|
||||
import com.lagradost.cloudstream3.utils.AppUtils.addRepositoryDialog
|
||||
import com.lagradost.cloudstream3.utils.AppUtils.setDefaultFocus
|
||||
import com.lagradost.cloudstream3.utils.AppContextUtils.addRepositoryDialog
|
||||
import com.lagradost.cloudstream3.utils.AppContextUtils.setDefaultFocus
|
||||
import com.lagradost.cloudstream3.utils.Coroutines.ioSafe
|
||||
import com.lagradost.cloudstream3.utils.Coroutines.main
|
||||
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.settings.Globals.TV
|
||||
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.main
|
||||
import com.lagradost.cloudstream3.utils.SubtitleHelper.fromTwoLettersToLanguage
|
||||
|
|
|
@ -8,7 +8,6 @@ import androidx.appcompat.widget.SearchView
|
|||
import androidx.core.view.isVisible
|
||||
import androidx.fragment.app.Fragment
|
||||
import androidx.fragment.app.activityViewModels
|
||||
import com.lagradost.cloudstream3.APIHolder.getApiProviderLangSettings
|
||||
import com.lagradost.cloudstream3.AllLanguagesName
|
||||
import com.lagradost.cloudstream3.BuildConfig
|
||||
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.setUpToolbar
|
||||
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.SubtitleHelper
|
||||
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.getStackTracePretty
|
||||
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.runOnMainThread
|
||||
import com.lagradost.cloudstream3.utils.SubtitleHelper.getFlagFromIso
|
||||
|
@ -23,7 +23,7 @@ import com.lagradost.cloudstream3.utils.TestingUtils
|
|||
import java.io.File
|
||||
|
||||
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 {
|
||||
return ProviderTestViewHolder(
|
||||
ProviderTestItemBinding.inflate(LayoutInflater.from(parent.context), parent, false)
|
||||
|
|
|
@ -13,7 +13,7 @@ import androidx.core.view.isVisible
|
|||
import androidx.core.widget.ContentLoadingProgressBar
|
||||
import com.google.android.material.button.MaterialButton
|
||||
import com.lagradost.cloudstream3.R
|
||||
import com.lagradost.cloudstream3.utils.AppUtils.animateProgressTo
|
||||
import com.lagradost.cloudstream3.utils.AppContextUtils.animateProgressTo
|
||||
|
||||
class TestView @JvmOverloads constructor(
|
||||
context: Context,
|
||||
|
|
|
@ -11,11 +11,11 @@ import androidx.fragment.app.Fragment
|
|||
import androidx.navigation.fragment.findNavController
|
||||
import androidx.preference.PreferenceManager
|
||||
import com.lagradost.cloudstream3.APIHolder
|
||||
import com.lagradost.cloudstream3.APIHolder.getApiProviderLangSettings
|
||||
import com.lagradost.cloudstream3.AllLanguagesName
|
||||
import com.lagradost.cloudstream3.R
|
||||
import com.lagradost.cloudstream3.databinding.FragmentSetupProviderLanguagesBinding
|
||||
import com.lagradost.cloudstream3.mvvm.normalSafeApiCall
|
||||
import com.lagradost.cloudstream3.utils.AppContextUtils.getApiProviderLangSettings
|
||||
import com.lagradost.cloudstream3.utils.SubtitleHelper
|
||||
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.material.bottomsheet.BottomSheetDialog
|
||||
import com.lagradost.cloudstream3.*
|
||||
import com.lagradost.cloudstream3.APIHolder.apis
|
||||
import com.lagradost.cloudstream3.CommonActivity.activity
|
||||
import com.lagradost.cloudstream3.CommonActivity.showToast
|
||||
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.providers.Kitsu
|
||||
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.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.RepositoryData
|
||||
import com.lagradost.cloudstream3.utils.Coroutines.ioSafe
|
||||
|
@ -79,7 +80,7 @@ import java.io.*
|
|||
import java.net.URL
|
||||
import java.net.URLDecoder
|
||||
|
||||
object AppUtils {
|
||||
object AppContextUtils {
|
||||
fun RecyclerView.setMaxViewPoolSize(maxViewTypeId: Int, maxPoolSize: Int) {
|
||||
for (i in 0..maxViewTypeId)
|
||||
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) {
|
||||
ioSafe {
|
||||
val repo = RepositoryManager.parseRepository(url) ?: return@ioSafe
|
||||
|
@ -532,24 +695,6 @@ object AppUtils {
|
|||
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
|
||||
* | Episode 2. Hello world
|
||||
* | Hello World
|
||||
|
@ -619,7 +764,7 @@ object AppUtils {
|
|||
val settingsManager = PreferenceManager.getDefaultSharedPreferences(this)
|
||||
Kitsu.isEnabled =
|
||||
settingsManager.getBoolean(this.getString(R.string.show_kitsu_posters_key), true)
|
||||
}catch (t : Throwable) {
|
||||
} catch (t: Throwable) {
|
||||
logError(t)
|
||||
}
|
||||
|
|
@ -3,7 +3,6 @@ package com.lagradost.cloudstream3.utils
|
|||
import android.content.Context
|
||||
import com.fasterxml.jackson.annotation.JsonProperty
|
||||
import com.lagradost.cloudstream3.*
|
||||
import com.lagradost.cloudstream3.APIHolder.filterProviderByPreferredMedia
|
||||
import com.lagradost.cloudstream3.APIHolder.unixTimeMS
|
||||
import com.lagradost.cloudstream3.AcraApplication.Companion.context
|
||||
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.result.UiImage
|
||||
import com.lagradost.cloudstream3.ui.result.VideoWatchState
|
||||
import com.lagradost.cloudstream3.utils.AppContextUtils.filterProviderByPreferredMedia
|
||||
import kotlin.reflect.KClass
|
||||
import kotlin.reflect.KProperty
|
||||
|
||||
|
|
|
@ -24,7 +24,7 @@ import okio.sink
|
|||
import java.io.File
|
||||
import android.text.TextUtils
|
||||
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.IOException
|
||||
import java.io.InputStreamReader
|
||||
|
|
|
@ -15,7 +15,7 @@ import com.lagradost.cloudstream3.MainActivity
|
|||
import com.lagradost.cloudstream3.MainActivity.Companion.deleteFileOnExit
|
||||
import com.lagradost.cloudstream3.R
|
||||
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.UIHelper.colorFromAttribute
|
||||
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.setKey
|
||||
import com.lagradost.cloudstream3.BuildConfig
|
||||
import com.lagradost.cloudstream3.IDownloadableMinimum
|
||||
import com.lagradost.cloudstream3.MainActivity
|
||||
import com.lagradost.cloudstream3.R
|
||||
import com.lagradost.cloudstream3.TvType
|
||||
|
@ -107,16 +108,6 @@ object VideoDownloadManager {
|
|||
Stop,
|
||||
}
|
||||
|
||||
interface IDownloadableMinimum {
|
||||
val url: String
|
||||
val referer: String
|
||||
val headers: Map<String, String>
|
||||
}
|
||||
|
||||
fun IDownloadableMinimum.getId(): Int {
|
||||
return url.hashCode()
|
||||
}
|
||||
|
||||
data class DownloadEpisodeMetadata(
|
||||
@JsonProperty("id") val id: Int,
|
||||
@JsonProperty("mainName") val mainName: String,
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
import com.codingfeline.buildkonfig.compiler.FieldSpec
|
||||
import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi
|
||||
|
||||
plugins {
|
||||
kotlin("multiplatform")
|
||||
|
@ -12,6 +13,11 @@ kotlin {
|
|||
androidTarget()
|
||||
jvm()
|
||||
|
||||
@OptIn(ExperimentalKotlinGradlePluginApi::class)
|
||||
compilerOptions {
|
||||
freeCompilerArgs.add("-Xexpect-actual-classes")
|
||||
}
|
||||
|
||||
sourceSets {
|
||||
commonMain.dependencies {
|
||||
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
|
||||
Level 25 or Less. */
|
||||
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
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.content.Context
|
||||
import android.net.http.SslError
|
||||
import android.os.Handler
|
||||
import android.os.Looper
|
||||
import android.webkit.*
|
||||
import com.lagradost.cloudstream3.AcraApplication
|
||||
import com.lagradost.cloudstream3.AcraApplication.Companion.context
|
||||
import com.lagradost.cloudstream3.USER_AGENT
|
||||
import com.lagradost.api.getContext
|
||||
import com.lagradost.cloudstream3.app
|
||||
import com.lagradost.cloudstream3.mvvm.debugException
|
||||
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 timeout close webview after timeout
|
||||
* */
|
||||
class WebViewResolver(
|
||||
actual class WebViewResolver actual constructor(
|
||||
val interceptUrl: Regex,
|
||||
val additionalUrls: List<Regex> = emptyList(),
|
||||
val userAgent: String? = USER_AGENT,
|
||||
val useOkhttp: Boolean = true,
|
||||
val script: String? = null,
|
||||
val scriptCallback: ((String) -> Unit)? = null,
|
||||
val timeout: Long = DEFAULT_TIMEOUT
|
||||
val additionalUrls: List<Regex>,
|
||||
val userAgent: String?,
|
||||
val useOkhttp: Boolean,
|
||||
val script: String?,
|
||||
val scriptCallback: ((String) -> Unit)?,
|
||||
val timeout: Long
|
||||
) :
|
||||
Interceptor {
|
||||
|
||||
constructor(
|
||||
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
|
||||
actual companion object {
|
||||
var webViewUserAgent: String? = null
|
||||
actual val DEFAULT_TIMEOUT = 60_000L
|
||||
|
||||
@JvmName("getWebViewUserAgent1")
|
||||
fun getWebViewUserAgent(): String? {
|
||||
return webViewUserAgent ?: context?.let { ctx ->
|
||||
return webViewUserAgent ?: (getContext() as? Context)?.let { ctx ->
|
||||
runBlocking {
|
||||
mainWork {
|
||||
WebView(ctx).settings.userAgentString.also { userAgent ->
|
||||
|
@ -137,7 +120,7 @@ class WebViewResolver(
|
|||
WebView.setWebContentsDebuggingEnabled(true)
|
||||
try {
|
||||
webView = WebView(
|
||||
AcraApplication.context
|
||||
(getContext() as? Context)
|
||||
?: throw RuntimeException("No base context in WebViewResolver")
|
||||
).apply {
|
||||
// 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
|
||||
|
||||
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.databind.DeserializationFeature
|
||||
import com.fasterxml.jackson.databind.json.JsonMapper
|
||||
import com.fasterxml.jackson.module.kotlin.kotlinModule
|
||||
import com.lagradost.cloudstream3.mvvm.logError
|
||||
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.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.AppUtils.toJson
|
||||
import com.lagradost.cloudstream3.utils.AppUtils.tryParseJson
|
||||
import com.lagradost.cloudstream3.utils.Coroutines.mainWork
|
||||
import com.lagradost.cloudstream3.utils.Coroutines.threadSafeListOf
|
||||
import com.lagradost.nicehttp.RequestBodyTypes
|
||||
import okhttp3.Interceptor
|
||||
import okhttp3.MediaType.Companion.toMediaTypeOrNull
|
||||
import okhttp3.RequestBody.Companion.toRequestBody
|
||||
import java.net.URI
|
||||
import java.text.SimpleDateFormat
|
||||
import java.util.*
|
||||
import kotlin.io.encoding.Base64
|
||||
import kotlin.io.encoding.ExperimentalEncodingApi
|
||||
import kotlin.math.absoluteValue
|
||||
|
||||
/**
|
||||
|
@ -111,17 +103,6 @@ object APIHolder {
|
|||
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
|
||||
* discovered originally by https://github.com/ahmedgamal17
|
||||
|
@ -137,10 +118,9 @@ object APIHolder {
|
|||
// To get the key
|
||||
suspend fun getCaptchaToken(url: String, key: String, referer: String? = null): String? {
|
||||
try {
|
||||
val uri = Uri.parse(url)
|
||||
val domain = encodeToString(
|
||||
val uri = URI.create(url)
|
||||
val domain = base64Encode(
|
||||
(uri.scheme + "://" + uri.host + ":443").encodeToByteArray(),
|
||||
0
|
||||
).replace("\n", "").replace("=", ".")
|
||||
|
||||
val vToken =
|
||||
|
@ -275,165 +255,6 @@ object APIHolder {
|
|||
return app.post("https://graphql.anilist.co", requestBody = data)
|
||||
.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>() //
|
||||
open val mainPage = listOf(MainPageData("", "", false))
|
||||
|
||||
@WorkerThread
|
||||
// @WorkerThread
|
||||
open suspend fun getMainPage(
|
||||
page: Int,
|
||||
request: MainPageRequest,
|
||||
|
@ -664,17 +485,17 @@ abstract class MainAPI {
|
|||
throw NotImplementedError()
|
||||
}
|
||||
|
||||
@WorkerThread
|
||||
// @WorkerThread
|
||||
open suspend fun search(query: String): List<SearchResponse>? {
|
||||
throw NotImplementedError()
|
||||
}
|
||||
|
||||
@WorkerThread
|
||||
// @WorkerThread
|
||||
open suspend fun quickSearch(query: String): List<SearchResponse>? {
|
||||
throw NotImplementedError()
|
||||
}
|
||||
|
||||
@WorkerThread
|
||||
// @WorkerThread
|
||||
/**
|
||||
* Based on data from search() or getMainPage() it generates a LoadResponse,
|
||||
* 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
|
||||
* if the need arises.
|
||||
* */
|
||||
@WorkerThread
|
||||
// @WorkerThread
|
||||
open suspend fun extractorVerifierJob(extractorData: String?) {
|
||||
throw NotImplementedError()
|
||||
}
|
||||
|
||||
/**Callback is fired once a link is found, will return true if method is executed successfully*/
|
||||
@WorkerThread
|
||||
// @WorkerThread
|
||||
open suspend fun loadLinks(
|
||||
data: String,
|
||||
isCasting: Boolean,
|
||||
|
@ -723,27 +544,16 @@ abstract class MainAPI {
|
|||
}
|
||||
|
||||
/** Might need a different implementation for desktop*/
|
||||
@SuppressLint("NewApi")
|
||||
fun base64Decode(string: String): String {
|
||||
return String(base64DecodeArray(string), Charsets.ISO_8859_1)
|
||||
}
|
||||
|
||||
@SuppressLint("NewApi")
|
||||
@OptIn(ExperimentalEncodingApi::class)
|
||||
fun base64DecodeArray(string: String): ByteArray {
|
||||
return try {
|
||||
android.util.Base64.decode(string, android.util.Base64.DEFAULT)
|
||||
} catch (e: Exception) {
|
||||
Base64.getDecoder().decode(string)
|
||||
}
|
||||
return Base64.decode(string)
|
||||
}
|
||||
|
||||
@SuppressLint("NewApi")
|
||||
@OptIn(ExperimentalEncodingApi::class)
|
||||
fun base64Encode(array: ByteArray): String {
|
||||
return try {
|
||||
String(android.util.Base64.encode(array, android.util.Base64.NO_WRAP), Charsets.ISO_8859_1)
|
||||
} catch (e: Exception) {
|
||||
String(Base64.getEncoder().encode(array))
|
||||
}
|
||||
return Base64.encode(array)
|
||||
}
|
||||
|
||||
fun MainAPI.fixUrlNull(url: String?): String? {
|
||||
|
@ -779,10 +589,6 @@ fun sortUrls(urls: Set<ExtractorLink>): List<ExtractorLink> {
|
|||
return urls.sortedBy { t -> -t.quality }
|
||||
}
|
||||
|
||||
fun sortSubs(subs: Set<SubtitleData>): List<SubtitleData> {
|
||||
return subs.sortedBy { it.name }
|
||||
}
|
||||
|
||||
fun capitalizeString(str: String): String {
|
||||
return capitalizeStringNullable(str) ?: str
|
||||
}
|
||||
|
@ -1204,11 +1010,25 @@ interface LoadResponse {
|
|||
var contentRating: String?
|
||||
|
||||
companion object {
|
||||
private val malIdPrefix = malApi.idPrefix
|
||||
private val aniListIdPrefix = aniListApi.idPrefix
|
||||
private val simklIdPrefix = simklApi.idPrefix
|
||||
var malIdPrefix = "" //malApi.idPrefix
|
||||
var aniListIdPrefix = "" //aniListApi.idPrefix
|
||||
var simklIdPrefix = "" //simklApi.idPrefix
|
||||
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 {
|
||||
return this.type.isMovieType() || this is MovieLoadResponse
|
||||
}
|
||||
|
@ -1232,12 +1052,12 @@ interface LoadResponse {
|
|||
* Internal helper function to add simkl ids from other databases.
|
||||
*/
|
||||
private fun LoadResponse.addSimklId(
|
||||
database: SimklApi.Companion.SyncServices,
|
||||
database: SimklSyncServices,
|
||||
id: String?
|
||||
) {
|
||||
normalSafeApiCall {
|
||||
this.syncData[simklIdPrefix] =
|
||||
SimklApi.addIdToString(this.syncData[simklIdPrefix], database, id.toString())
|
||||
addIdToString(this.syncData[simklIdPrefix], database, id.toString())
|
||||
?: return@normalSafeApiCall
|
||||
}
|
||||
}
|
||||
|
@ -1257,30 +1077,28 @@ interface LoadResponse {
|
|||
|
||||
fun LoadResponse.getImdbId(): String? {
|
||||
return normalSafeApiCall {
|
||||
SimklApi.readIdFromString(this.syncData[simklIdPrefix])
|
||||
?.get(SimklApi.Companion.SyncServices.Imdb)
|
||||
readIdFromString(this.syncData[simklIdPrefix])[SimklSyncServices.Imdb]
|
||||
}
|
||||
}
|
||||
|
||||
fun LoadResponse.getTMDbId(): String? {
|
||||
return normalSafeApiCall {
|
||||
SimklApi.readIdFromString(this.syncData[simklIdPrefix])
|
||||
?.get(SimklApi.Companion.SyncServices.Tmdb)
|
||||
readIdFromString(this.syncData[simklIdPrefix])[SimklSyncServices.Tmdb]
|
||||
}
|
||||
}
|
||||
|
||||
fun LoadResponse.addMalId(id: Int?) {
|
||||
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?) {
|
||||
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?) {
|
||||
this.addSimklId(SimklApi.Companion.SyncServices.Simkl, id.toString())
|
||||
this.addSimklId(SimklSyncServices.Simkl, id.toString())
|
||||
}
|
||||
|
||||
fun LoadResponse.addImdbUrl(url: String?) {
|
||||
|
@ -1362,7 +1180,7 @@ interface LoadResponse {
|
|||
|
||||
fun LoadResponse.addImdbId(id: String?) {
|
||||
// TODO add imdb sync
|
||||
this.addSimklId(SimklApi.Companion.SyncServices.Imdb, id)
|
||||
this.addSimklId(SimklSyncServices.Imdb, id)
|
||||
}
|
||||
|
||||
fun LoadResponse.addTrackId(id: String?) {
|
||||
|
@ -1375,7 +1193,7 @@ interface LoadResponse {
|
|||
|
||||
fun LoadResponse.addTMDbId(id: String?) {
|
||||
// TODO add TMDb sync
|
||||
this.addSimklId(SimklApi.Companion.SyncServices.Tmdb, id)
|
||||
this.addSimklId(SimklSyncServices.Tmdb, id)
|
||||
}
|
||||
|
||||
fun LoadResponse.addRating(text: String?) {
|
||||
|
@ -1466,7 +1284,7 @@ data class NextAiring(
|
|||
constructor(
|
||||
episode: Int,
|
||||
unixTime: Long,
|
||||
) : this (
|
||||
) : this(
|
||||
episode,
|
||||
unixTime,
|
||||
null
|
||||
|
@ -1929,6 +1747,28 @@ fun <T> MainAPI.newEpisode(
|
|||
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(
|
||||
override var name: String,
|
||||
override var url: String,
|
|
@ -1,6 +1,6 @@
|
|||
package com.lagradost.cloudstream3.extractors
|
||||
|
||||
import android.util.Log
|
||||
import com.lagradost.api.Log
|
||||
import com.lagradost.cloudstream3.app
|
||||
import com.lagradost.cloudstream3.utils.ExtractorApi
|
||||
import com.lagradost.cloudstream3.utils.ExtractorLink
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
package com.lagradost.cloudstream3.extractors
|
||||
|
||||
import android.util.Log
|
||||
import com.lagradost.api.Log
|
||||
import com.lagradost.cloudstream3.*
|
||||
import com.lagradost.cloudstream3.utils.*
|
||||
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
package com.lagradost.cloudstream3.extractors
|
||||
|
||||
import android.util.Log
|
||||
import com.lagradost.api.Log
|
||||
import com.lagradost.cloudstream3.*
|
||||
import com.lagradost.cloudstream3.utils.*
|
||||
import com.lagradost.cloudstream3.extractors.helper.AesHelper
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
package com.lagradost.cloudstream3.extractors
|
||||
|
||||
import android.util.Log
|
||||
import com.lagradost.api.Log
|
||||
import com.lagradost.cloudstream3.*
|
||||
import com.lagradost.cloudstream3.utils.*
|
||||
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