From 9290cec8ea65061edcb3843021a77b1aa2bc64c3 Mon Sep 17 00:00:00 2001 From: firelight <147925818+fire-light42@users.noreply.github.com> Date: Tue, 7 Jul 2026 13:39:50 +0000 Subject: [PATCH 01/38] Fix: Repo dismiss --- .../cloudstream3/plugins/RepositoryManager.kt | 12 ++-- .../settings/extensions/ExtensionsFragment.kt | 70 ++++++++++--------- 2 files changed, 42 insertions(+), 40 deletions(-) diff --git a/app/src/main/java/com/lagradost/cloudstream3/plugins/RepositoryManager.kt b/app/src/main/java/com/lagradost/cloudstream3/plugins/RepositoryManager.kt index 523798b6e..5868146c7 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/plugins/RepositoryManager.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/plugins/RepositoryManager.kt @@ -141,13 +141,11 @@ object RepositoryManager { } } else if (fixedUrl.matches("^[a-zA-Z0-9!_-]+$".toRegex())) { safeAsync { - app.get("https://cutt.ly/${fixedUrl}", allowRedirects = false).let { it2 -> - it2.headers["Location"]?.let { url -> - if (url.startsWith("https://cutt.ly/404")) return@safeAsync null - if (url.removeSuffix("/") == "https://cutt.ly") return@safeAsync null - return@safeAsync url - } - } + val response = app.get("https://cutt.ly/${fixedUrl}", allowRedirects = false) + val url = response.headers["Location"] ?: return@safeAsync null + if (url.startsWith("https://cutt.ly/404")) return@safeAsync null + if (url.removeSuffix("/") == "https://cutt.ly") return@safeAsync null + return@safeAsync url } } else null } diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/ExtensionsFragment.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/ExtensionsFragment.kt index 9b3f381d0..ea0d5b2bd 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/ExtensionsFragment.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/ExtensionsFragment.kt @@ -275,42 +275,46 @@ class ExtensionsFragment : BaseFragment( } } - binding.applyBtt.setOnClickListener secondListener@{ + binding.applyBtt.setOnClickListener secondListener@{ val name = binding.repoNameInput.text?.toString() val urlInput = binding.repoUrlInput.text?.toString() - ioSafe { - val url = urlInput?.let { it1 -> RepositoryManager.parseRepoUrl(it1) } - if (url.isNullOrBlank()) { - main { - showToast(R.string.error_invalid_data, Toast.LENGTH_SHORT) - } - } else { - val repository = RepositoryManager.parseRepository(url) - - // Exit if wrong repository - if (repository == null) { - showToast(R.string.no_repository_found_error, Toast.LENGTH_LONG) - return@ioSafe - } - - val fixedName = if (!name.isNullOrBlank()) name - else repository.name - val newRepo = RepositoryData(repository.iconUrl, fixedName, url) - RepositoryManager.addRepository(newRepo) - extensionViewModel.loadStats() - extensionViewModel.loadRepositories() - - val plugins = RepositoryManager.getRepoPlugins(newRepo) - if (plugins.isNullOrEmpty()) { - showToast(R.string.no_plugins_found_error, Toast.LENGTH_LONG) - } else { - this@ExtensionsFragment.activity?.addRepositoryDialog( - newRepo - ) - } - } + if (urlInput.isNullOrEmpty()) { + showToast(R.string.error_invalid_url, Toast.LENGTH_SHORT) + return@secondListener + } + ioSafe { + val url = RepositoryManager.parseRepoUrl(urlInput) + if (url.isNullOrBlank()) { + showToast(R.string.error_invalid_data, Toast.LENGTH_SHORT) + return@ioSafe + } + val repository = RepositoryManager.parseRepository(url) + + // Exit if wrong repository + if (repository == null) { + showToast(R.string.no_repository_found_error, Toast.LENGTH_LONG) + return@ioSafe + } + + val fixedName = if (!name.isNullOrBlank()) name + else repository.name + val newRepo = RepositoryData(repository.iconUrl, fixedName, url) + RepositoryManager.addRepository(newRepo) + extensionViewModel.loadStats() + extensionViewModel.loadRepositories() + + dialog.dismissSafe(activity) // Only dismiss if the repo was added + + val plugins = RepositoryManager.getRepoPlugins(newRepo) + if (plugins.isNullOrEmpty()) { + showToast(R.string.no_plugins_found_error, Toast.LENGTH_LONG) + return@ioSafe + } + + this@ExtensionsFragment.activity?.addRepositoryDialog( + newRepo + ) } - dialog.dismissSafe(activity) } binding.cancelBtt.setOnClickListener { dialog.dismissSafe(activity) From e8c005dfeb8ead311cd2c8039b1e6b6ca0b7823a Mon Sep 17 00:00:00 2001 From: firelight <147925818+fire-light42@users.noreply.github.com> Date: Tue, 7 Jul 2026 14:05:07 +0000 Subject: [PATCH 02/38] [skip ci] Fix: Leading space in Vids (#3022) --- .../kotlin/com/lagradost/cloudstream3/extractors/Vids.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/extractors/Vids.kt b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/extractors/Vids.kt index 33fcdfd3a..1312570d3 100644 --- a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/extractors/Vids.kt +++ b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/extractors/Vids.kt @@ -10,7 +10,7 @@ import com.lagradost.cloudstream3.utils.newExtractorLink @Prerelease open class Vids : ExtractorApi() { override val name: String = "Vids" - override val mainUrl: String = " https://vids.st" + override val mainUrl: String = "https://vids.st" override val requiresReferer: Boolean = false private val streamUrlRegex = Regex("""const url = "(.*?)";""") From 55b5017068efd32a11088d8dd6f7af9353a6854a Mon Sep 17 00:00:00 2001 From: firelight <147925818+fire-light42@users.noreply.github.com> Date: Tue, 7 Jul 2026 14:06:47 +0000 Subject: [PATCH 03/38] [skip ci] Fix: Sync episode setting, Closes #3014 (#3021) --- .../com/lagradost/cloudstream3/ui/player/GeneratorPlayer.kt | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/player/GeneratorPlayer.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/player/GeneratorPlayer.kt index 09b6db50f..d9e9cbded 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/player/GeneratorPlayer.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/player/GeneratorPlayer.kt @@ -1698,8 +1698,10 @@ class GeneratorPlayer : FullScreenPlayer() { if (settingsManager.getBoolean( ctx.getString(R.string.episode_sync_enabled_key), true ) - ) maxEpisodeSet = meta.episode - sync.modifyMaxEpisode(meta.totalEpisodeIndex ?: meta.episode) + ) { + maxEpisodeSet = meta.episode + sync.modifyMaxEpisode(meta.totalEpisodeIndex ?: meta.episode) + } } } From 94ce0d438548df4e916de5c869155705b1a5d7c3 Mon Sep 17 00:00:00 2001 From: firelight <147925818+fire-light42@users.noreply.github.com> Date: Tue, 7 Jul 2026 14:09:34 +0000 Subject: [PATCH 04/38] Fix: Repo dismiss (#3020) --- .../cloudstream3/plugins/RepositoryManager.kt | 12 ++-- .../settings/extensions/ExtensionsFragment.kt | 70 ++++++++++--------- 2 files changed, 42 insertions(+), 40 deletions(-) diff --git a/app/src/main/java/com/lagradost/cloudstream3/plugins/RepositoryManager.kt b/app/src/main/java/com/lagradost/cloudstream3/plugins/RepositoryManager.kt index 523798b6e..5868146c7 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/plugins/RepositoryManager.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/plugins/RepositoryManager.kt @@ -141,13 +141,11 @@ object RepositoryManager { } } else if (fixedUrl.matches("^[a-zA-Z0-9!_-]+$".toRegex())) { safeAsync { - app.get("https://cutt.ly/${fixedUrl}", allowRedirects = false).let { it2 -> - it2.headers["Location"]?.let { url -> - if (url.startsWith("https://cutt.ly/404")) return@safeAsync null - if (url.removeSuffix("/") == "https://cutt.ly") return@safeAsync null - return@safeAsync url - } - } + val response = app.get("https://cutt.ly/${fixedUrl}", allowRedirects = false) + val url = response.headers["Location"] ?: return@safeAsync null + if (url.startsWith("https://cutt.ly/404")) return@safeAsync null + if (url.removeSuffix("/") == "https://cutt.ly") return@safeAsync null + return@safeAsync url } } else null } diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/ExtensionsFragment.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/ExtensionsFragment.kt index 9b3f381d0..ea0d5b2bd 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/ExtensionsFragment.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/ExtensionsFragment.kt @@ -275,42 +275,46 @@ class ExtensionsFragment : BaseFragment( } } - binding.applyBtt.setOnClickListener secondListener@{ + binding.applyBtt.setOnClickListener secondListener@{ val name = binding.repoNameInput.text?.toString() val urlInput = binding.repoUrlInput.text?.toString() - ioSafe { - val url = urlInput?.let { it1 -> RepositoryManager.parseRepoUrl(it1) } - if (url.isNullOrBlank()) { - main { - showToast(R.string.error_invalid_data, Toast.LENGTH_SHORT) - } - } else { - val repository = RepositoryManager.parseRepository(url) - - // Exit if wrong repository - if (repository == null) { - showToast(R.string.no_repository_found_error, Toast.LENGTH_LONG) - return@ioSafe - } - - val fixedName = if (!name.isNullOrBlank()) name - else repository.name - val newRepo = RepositoryData(repository.iconUrl, fixedName, url) - RepositoryManager.addRepository(newRepo) - extensionViewModel.loadStats() - extensionViewModel.loadRepositories() - - val plugins = RepositoryManager.getRepoPlugins(newRepo) - if (plugins.isNullOrEmpty()) { - showToast(R.string.no_plugins_found_error, Toast.LENGTH_LONG) - } else { - this@ExtensionsFragment.activity?.addRepositoryDialog( - newRepo - ) - } - } + if (urlInput.isNullOrEmpty()) { + showToast(R.string.error_invalid_url, Toast.LENGTH_SHORT) + return@secondListener + } + ioSafe { + val url = RepositoryManager.parseRepoUrl(urlInput) + if (url.isNullOrBlank()) { + showToast(R.string.error_invalid_data, Toast.LENGTH_SHORT) + return@ioSafe + } + val repository = RepositoryManager.parseRepository(url) + + // Exit if wrong repository + if (repository == null) { + showToast(R.string.no_repository_found_error, Toast.LENGTH_LONG) + return@ioSafe + } + + val fixedName = if (!name.isNullOrBlank()) name + else repository.name + val newRepo = RepositoryData(repository.iconUrl, fixedName, url) + RepositoryManager.addRepository(newRepo) + extensionViewModel.loadStats() + extensionViewModel.loadRepositories() + + dialog.dismissSafe(activity) // Only dismiss if the repo was added + + val plugins = RepositoryManager.getRepoPlugins(newRepo) + if (plugins.isNullOrEmpty()) { + showToast(R.string.no_plugins_found_error, Toast.LENGTH_LONG) + return@ioSafe + } + + this@ExtensionsFragment.activity?.addRepositoryDialog( + newRepo + ) } - dialog.dismissSafe(activity) } binding.cancelBtt.setOnClickListener { dialog.dismissSafe(activity) From 5bae7d35d8199eff2533001dfffb89a52f35035e Mon Sep 17 00:00:00 2001 From: firelight <147925818+fire-light42@users.noreply.github.com> Date: Tue, 7 Jul 2026 14:17:39 +0000 Subject: [PATCH 05/38] Fix: Subtitle ordering on names (#3012) --- .../com/lagradost/cloudstream3/utils/AppContextUtils.kt | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/lagradost/cloudstream3/utils/AppContextUtils.kt b/app/src/main/java/com/lagradost/cloudstream3/utils/AppContextUtils.kt index 65519c0f1..c0be85a3f 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/utils/AppContextUtils.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/utils/AppContextUtils.kt @@ -365,8 +365,14 @@ object AppContextUtils { } } + /** Sort subtitles by names */ fun sortSubs(subs: Set): List { - return subs.sortedBy { it.name } + // Be aware, sorting by "$originalName $nameSuffix" causes "a (b) 1" < "a 1", + // where "originalName then nameSuffix" preserves "a 1" < "a (b) 1", because we do not compare '(' and '1'. + return subs + .sortedWith( + compareBy { subtitle: SubtitleData -> subtitle.originalName } + .thenBy { subtitle: SubtitleData -> subtitle.nameSuffix }) } fun Context.getApiSettings(): HashSet { From 894a18a831bdc554f527c9444d4876bbc21633a5 Mon Sep 17 00:00:00 2001 From: firelight <147925818+fire-light42@users.noreply.github.com> Date: Tue, 7 Jul 2026 18:34:00 +0000 Subject: [PATCH 06/38] Feat: Loading apply button (#3025) --- .../cloudstream3/ui/account/AccountHelper.kt | 70 +++++++++------- .../cloudstream3/ui/player/GeneratorPlayer.kt | 83 +++++++++++-------- .../ui/settings/SettingsAccount.kt | 5 ++ .../settings/extensions/ExtensionsFragment.kt | 70 +++++++++------- .../lagradost/cloudstream3/utils/UIHelper.kt | 36 ++++++++ 5 files changed, 166 insertions(+), 98 deletions(-) diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/account/AccountHelper.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/account/AccountHelper.kt index 1d6b41e5b..7725bad91 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/account/AccountHelper.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/account/AccountHelper.kt @@ -37,8 +37,10 @@ import com.lagradost.cloudstream3.utils.DataStoreHelper import com.lagradost.cloudstream3.utils.DataStoreHelper.getDefaultAccount import com.lagradost.cloudstream3.utils.ImageLoader.loadImage import com.lagradost.cloudstream3.utils.UIHelper.dismissSafe +import com.lagradost.cloudstream3.utils.UIHelper.hideProgress import com.lagradost.cloudstream3.utils.UIHelper.navigate import com.lagradost.cloudstream3.utils.UIHelper.showInputMethod +import com.lagradost.cloudstream3.utils.UIHelper.showProgress object AccountHelper { fun showAccountEditDialog( @@ -164,7 +166,7 @@ object AccountHelper { canSetPin = true - binding.editProfilePhotoButton.setOnClickListener({ + binding.editProfilePhotoButton.setOnClickListener { val bottomSheetDialog = BottomSheetDialog(context) val sheetBinding = BottomInputDialogBinding.inflate(LayoutInflater.from(context)) bottomSheetDialog.setContentView(sheetBinding.root) @@ -174,42 +176,46 @@ object AccountHelper { text1.text = context.getString(R.string.edit_profile_image_title) nginxTextInput.hint = context.getString(R.string.edit_profile_image_hint) - applyBtt.setOnClickListener({ + applyBtt.setOnClickListener { val url = sheetBinding.nginxTextInput.text.toString() - if (url.isNotEmpty()) { - val imageLoader = ImageLoader(context) - val request = ImageRequest.Builder(context) - .data(url) - .allowHardware(false) - .listener( - onSuccess = { _, _ -> - currentEditAccount = currentEditAccount.copy(customImage = url) - binding.accountImage.loadImage(url) - showToast( - R.string.edit_profile_image_success, - Toast.LENGTH_SHORT - ) - bottomSheetDialog.dismiss() - }, - onError = { _, _ -> - showToast( - R.string.edit_profile_image_error_invalid, - Toast.LENGTH_SHORT - ) - } - ) - .build() - imageLoader.enqueue(request) - } else { + if (url.isEmpty()) { showToast(R.string.edit_profile_image_error_empty, Toast.LENGTH_SHORT) + return@setOnClickListener } + applyBtt.showProgress() + val imageLoader = ImageLoader(context) + val request = ImageRequest.Builder(context) + .data(url) + .allowHardware(false) + .listener( + onSuccess = { _, _ -> + currentEditAccount = currentEditAccount.copy(customImage = url) + binding.accountImage.loadImage(url) + showToast( + R.string.edit_profile_image_success, + Toast.LENGTH_SHORT + ) + bottomSheetDialog.dismissSafe() + }, + onError = { _, _ -> + showToast( + R.string.edit_profile_image_error_invalid, + Toast.LENGTH_SHORT + ) + applyBtt.hideProgress() + }, + onCancel = { + applyBtt.hideProgress() + } + ) + .build() + imageLoader.enqueue(request) + } + sheetBinding.cancelBtt.setOnClickListener { bottomSheetDialog.dismissSafe() - }) - sheetBinding.cancelBtt.setOnClickListener({ - bottomSheetDialog.dismissSafe() - }) + } } - }) + } } fun showPinInputDialog( diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/player/GeneratorPlayer.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/player/GeneratorPlayer.kt index d9e9cbded..b64355e23 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/player/GeneratorPlayer.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/player/GeneratorPlayer.kt @@ -117,8 +117,10 @@ import com.lagradost.cloudstream3.utils.UIHelper.clipboardHelper import com.lagradost.cloudstream3.utils.UIHelper.colorFromAttribute import com.lagradost.cloudstream3.utils.UIHelper.dismissSafe import com.lagradost.cloudstream3.utils.UIHelper.fixSystemBarsPadding +import com.lagradost.cloudstream3.utils.UIHelper.hideProgress import com.lagradost.cloudstream3.utils.UIHelper.hideSystemUI import com.lagradost.cloudstream3.utils.UIHelper.popCurrentPage +import com.lagradost.cloudstream3.utils.UIHelper.showProgress import com.lagradost.cloudstream3.utils.UIHelper.toPx import com.lagradost.cloudstream3.utils.downloader.DownloadUtils.getImageBitmapFromUrl import com.lagradost.cloudstream3.utils.setText @@ -790,47 +792,58 @@ class GeneratorPlayer : FullScreenPlayer() { } binding.applyBtt.setOnClickListener { - currentSubtitle?.let { currentSubtitle -> - providers.firstOrNull { it.idPrefix == currentSubtitle.idPrefix }?.let { api -> - ioSafe { - when (val apiResource = - Resource.fromResult(api.resource(currentSubtitle))) { - is Resource.Success -> { - val subtitles = apiResource.value.getSubtitles().map { resource -> - SubtitleData( - originalName = resource.name ?: getName( - currentSubtitle, - true - ), - nameSuffix = "", - url = resource.url, - origin = resource.origin, - mimeType = resource.url.toSubtitleMimeType(), - headers = currentSubtitle.headers, - languageCode = currentSubtitle.lang - ) - } - if (subtitles.isEmpty()) { - showToast(R.string.no_subtitles) - return@ioSafe - } - runOnMainThread { - addAndSelectSubtitles(*subtitles.toTypedArray()) - } - } + val currentSubtitle = currentSubtitle + if (currentSubtitle == null) { + dialog.dismissSafe() + return@setOnClickListener + } - is Resource.Failure -> { - showToast(apiResource.errorString) - } + val api = providers.firstOrNull { it.idPrefix == currentSubtitle.idPrefix } + if (api == null) { + dialog.dismissSafe() + return@setOnClickListener + } - is Resource.Loading -> { - // not possible - } + binding.applyBtt.showProgress() + ioSafe { + val apiResource = + Resource.fromResult(api.resource(currentSubtitle)) + binding.applyBtt.hideProgress() + when (apiResource) { + is Resource.Success -> { + val subtitles = apiResource.value.getSubtitles().map { resource -> + SubtitleData( + originalName = resource.name ?: getName( + currentSubtitle, + true + ), + nameSuffix = "", + url = resource.url, + origin = resource.origin, + mimeType = resource.url.toSubtitleMimeType(), + headers = currentSubtitle.headers, + languageCode = currentSubtitle.lang + ) } + if (subtitles.isEmpty()) { + showToast(R.string.no_subtitles) + return@ioSafe + } + dialog.dismissSafe() + runOnMainThread { + addAndSelectSubtitles(*subtitles.toTypedArray()) + } + } + + is Resource.Failure -> { + showToast(apiResource.errorString) + } + + is Resource.Loading -> { + // not possible } } } - dialog.dismissSafe() } dialog.setOnDismissListener { diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsAccount.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsAccount.kt index 8d96a6b14..75ba55674 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsAccount.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsAccount.kt @@ -65,6 +65,8 @@ import com.lagradost.cloudstream3.utils.SingleSelectionHelper.showBottomDialogTe 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.hideProgress +import com.lagradost.cloudstream3.utils.UIHelper.showProgress import com.lagradost.cloudstream3.utils.setText import com.lagradost.cloudstream3.utils.txt import qrcode.QRCode @@ -348,6 +350,7 @@ class SettingsAccount : BasePreferenceFragmentCompat(), BiometricCallback { email = if (req.email) binding.loginEmailInput.text?.toString() else null, server = if (req.server) binding.loginServerInput.text?.toString() else null, ) + binding.applyBtt.showProgress() ioSafe { try { if (api.login(loginData)) { @@ -377,6 +380,8 @@ class SettingsAccount : BasePreferenceFragmentCompat(), BiometricCallback { api.name ) ) + } finally { + binding.applyBtt.hideProgress() } } } diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/ExtensionsFragment.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/ExtensionsFragment.kt index ea0d5b2bd..107227497 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/ExtensionsFragment.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/ExtensionsFragment.kt @@ -39,6 +39,8 @@ 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 +import com.lagradost.cloudstream3.utils.UIHelper.hideProgress +import com.lagradost.cloudstream3.utils.UIHelper.showProgress import com.lagradost.cloudstream3.utils.setText class ExtensionsFragment : BaseFragment( @@ -275,45 +277,50 @@ class ExtensionsFragment : BaseFragment( } } - binding.applyBtt.setOnClickListener secondListener@{ + binding.applyBtt.setOnClickListener secondListener@{ val name = binding.repoNameInput.text?.toString() val urlInput = binding.repoUrlInput.text?.toString() if (urlInput.isNullOrEmpty()) { showToast(R.string.error_invalid_url, Toast.LENGTH_SHORT) return@secondListener } + binding.applyBtt.showProgress() ioSafe { - val url = RepositoryManager.parseRepoUrl(urlInput) - if (url.isNullOrBlank()) { - showToast(R.string.error_invalid_data, Toast.LENGTH_SHORT) - return@ioSafe + try { + val url = RepositoryManager.parseRepoUrl(urlInput) + if (url.isNullOrBlank()) { + showToast(R.string.error_invalid_data, Toast.LENGTH_SHORT) + return@ioSafe + } + val repository = RepositoryManager.parseRepository(url) + + // Exit if wrong repository + if (repository == null) { + showToast(R.string.no_repository_found_error, Toast.LENGTH_LONG) + return@ioSafe + } + + val fixedName = if (!name.isNullOrBlank()) name + else repository.name + val newRepo = RepositoryData(repository.iconUrl, fixedName, url) + RepositoryManager.addRepository(newRepo) + extensionViewModel.loadStats() + extensionViewModel.loadRepositories() + + dialog.dismissSafe(activity) // Only dismiss if the repo was added + + val plugins = RepositoryManager.getRepoPlugins(newRepo) + if (plugins.isNullOrEmpty()) { + showToast(R.string.no_plugins_found_error, Toast.LENGTH_LONG) + return@ioSafe + } + + this@ExtensionsFragment.activity?.addRepositoryDialog( + newRepo + ) + } finally { + binding.applyBtt.hideProgress() } - val repository = RepositoryManager.parseRepository(url) - - // Exit if wrong repository - if (repository == null) { - showToast(R.string.no_repository_found_error, Toast.LENGTH_LONG) - return@ioSafe - } - - val fixedName = if (!name.isNullOrBlank()) name - else repository.name - val newRepo = RepositoryData(repository.iconUrl, fixedName, url) - RepositoryManager.addRepository(newRepo) - extensionViewModel.loadStats() - extensionViewModel.loadRepositories() - - dialog.dismissSafe(activity) // Only dismiss if the repo was added - - val plugins = RepositoryManager.getRepoPlugins(newRepo) - if (plugins.isNullOrEmpty()) { - showToast(R.string.no_plugins_found_error, Toast.LENGTH_LONG) - return@ioSafe - } - - this@ExtensionsFragment.activity?.addRepositoryDialog( - newRepo - ) } } binding.cancelBtt.setOnClickListener { @@ -321,6 +328,7 @@ class ExtensionsFragment : BaseFragment( } } + val isTv = isLayout(TV) binding.apply { addRepoButton.isGone = isTv diff --git a/app/src/main/java/com/lagradost/cloudstream3/utils/UIHelper.kt b/app/src/main/java/com/lagradost/cloudstream3/utils/UIHelper.kt index c12674816..69f22e8ef 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/utils/UIHelper.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/utils/UIHelper.kt @@ -65,9 +65,12 @@ import androidx.navigation.fragment.NavHostFragment import androidx.palette.graphics.Palette import androidx.preference.PreferenceManager import com.google.android.material.appbar.AppBarLayout +import com.google.android.material.button.MaterialButton import com.google.android.material.chip.Chip import com.google.android.material.chip.ChipDrawable import com.google.android.material.chip.ChipGroup +import com.google.android.material.progressindicator.CircularProgressIndicatorSpec +import com.google.android.material.progressindicator.IndeterminateDrawable import com.lagradost.cloudstream3.CloudStreamApp.Companion.context import com.lagradost.cloudstream3.CommonActivity.activity import com.lagradost.cloudstream3.CommonActivity.showToast @@ -583,6 +586,39 @@ object UIHelper { } } + /** + * Source: https://stackoverflow.com/questions/70954321/circular-progress-indicator-inside-buttons-android-material-design + * + * Shows indeterminate progress bar on this button in place of where icon would be. + * By default the tint of progress bar is the same as iconTint. + * + * @param tintColor (@ColorInt Int) Sets custom progress bar tint color. + */ + fun MaterialButton.showProgress(@ColorInt tintColor: Int = this.iconTint.defaultColor) = + // Use runOnMainThreadNative to allow process on io threads, to make the code a bit cleaner + runOnMainThreadNative { + val spec = CircularProgressIndicatorSpec( + context, null, 0, + com.google.android.material.R.style.Widget_Material3_CircularProgressIndicator_ExtraSmall + ) + + spec.indicatorColors = intArrayOf(tintColor) + + val progressIndicatorDrawable = + IndeterminateDrawable.createCircularDrawable(context, spec) + + this.icon = progressIndicatorDrawable + if (this.getTag(R.id.text1) == null) + this.setTag(R.id.text1, this.text) + this.text = "" + } + + fun MaterialButton.hideProgress() = + runOnMainThreadNative { + this.text = this.getTag(R.id.text1) as? String + this.icon = null + } + /**id, stringRes */ @SuppressLint("RestrictedApi") fun View.popupMenuNoIcons( From 678726e9eeebb868edaa3f6ac469362deaff8216 Mon Sep 17 00:00:00 2001 From: Luna712 <142361265+Luna712@users.noreply.github.com> Date: Wed, 8 Jul 2026 08:17:17 -0600 Subject: [PATCH 07/38] GogoHelper: use more clear name for private method (#3028) --- .../lagradost/cloudstream3/extractors/helper/GogoHelper.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/extractors/helper/GogoHelper.kt b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/extractors/helper/GogoHelper.kt index 7bbe403f8..477c965ce 100644 --- a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/extractors/helper/GogoHelper.kt +++ b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/extractors/helper/GogoHelper.kt @@ -28,7 +28,7 @@ object GogoHelper { * @param id base64Decode(show_id) + IV * @return the encryption key */ - private fun getKey(id: String): String? { + private fun getEncryptionKey(id: String): String? { return safe { id.map { it.code.toString(16) @@ -64,7 +64,7 @@ object GogoHelper { * @param iv secret iv from site, required non-null if isUsingAdaptiveKeys is off * @param secretKey secret key for decryption from site, required non-null if isUsingAdaptiveKeys is off * @param secretDecryptKey secret key to decrypt the response json, required non-null if isUsingAdaptiveKeys is off - * @param isUsingAdaptiveKeys generates keys from IV and ID, see getKey() + * @param isUsingAdaptiveKeys generates keys from IV and ID, see [getEncryptionKey] * @param isUsingAdaptiveData generate encrypt-ajax data based on $("script[data-name='episode']")[0].dataset.value */ suspend fun extractVidstream( @@ -89,7 +89,7 @@ object GogoHelper { val foundIv = iv ?: (document ?: app.get(iframeUrl).document.also { document = it }) .select("""div.wrapper[class*=container]""") .attr("class").split("-").lastOrNull() ?: return@safeApiCall - val foundKey = secretKey ?: getKey(base64Decode(id) + foundIv) ?: return@safeApiCall + val foundKey = secretKey ?: getEncryptionKey(base64Decode(id) + foundIv) ?: return@safeApiCall val foundDecryptKey = secretDecryptKey ?: foundKey val url = Url(iframeUrl) From 60cfeba7351f27ea52b64aaa983178a3dee9a2dc Mon Sep 17 00:00:00 2001 From: firelight <147925818+fire-light42@users.noreply.github.com> Date: Wed, 8 Jul 2026 17:13:50 +0000 Subject: [PATCH 08/38] Fix: Sync delay, Progress on sync button and runOnMainThreadNative fix (#3032) --- .../java/com/lagradost/cloudstream3/MainActivity.kt | 6 ++++-- .../lagradost/cloudstream3/ui/result/SyncViewModel.kt | 1 + .../java/com/lagradost/cloudstream3/utils/UIHelper.kt | 4 ++++ .../lagradost/cloudstream3/utils/Coroutines.android.kt | 10 ++++++++-- 4 files changed, 17 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/lagradost/cloudstream3/MainActivity.kt b/app/src/main/java/com/lagradost/cloudstream3/MainActivity.kt index 0cbed1809..7db33284e 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/MainActivity.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/MainActivity.kt @@ -171,6 +171,7 @@ import com.lagradost.cloudstream3.utils.UIHelper.hideKeyboard import com.lagradost.cloudstream3.utils.UIHelper.navigate import com.lagradost.cloudstream3.utils.UIHelper.requestRW import com.lagradost.cloudstream3.utils.UIHelper.setNavigationBarColorCompat +import com.lagradost.cloudstream3.utils.UIHelper.showProgress import com.lagradost.cloudstream3.utils.UIHelper.toPx import com.lagradost.cloudstream3.utils.USER_PROVIDER_API import com.lagradost.cloudstream3.utils.USER_SELECTED_HOMEPAGE_API @@ -1428,8 +1429,9 @@ class MainActivity : AppCompatActivity(), ColorPickerDialogListener, BiometricCa else -> { resultviewPreviewBookmark.isEnabled = false - resultviewPreviewBookmark.setIconResource(R.drawable.ic_baseline_bookmark_border_24) - resultviewPreviewBookmark.setText(R.string.loading) + resultviewPreviewBookmark.showProgress() + //resultviewPreviewBookmark.setIconResource(R.drawable.ic_baseline_bookmark_border_24) + //resultviewPreviewBookmark.setText(R.string.loading) } } } diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/result/SyncViewModel.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/result/SyncViewModel.kt index 6c5c64ff8..3161a1204 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/result/SyncViewModel.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/result/SyncViewModel.kt @@ -182,6 +182,7 @@ class SyncViewModel : ViewModel() { fun publishUserData() = ioSafe { Log.i(TAG, "publishUserData") val user = userData.value + _userDataResponse.postValue(Resource.Loading()) if (user is Resource.Success) { syncs.forEach { (prefix, id) -> repos.firstOrNull { it.idPrefix == prefix }?.updateStatus(id, user.value) diff --git a/app/src/main/java/com/lagradost/cloudstream3/utils/UIHelper.kt b/app/src/main/java/com/lagradost/cloudstream3/utils/UIHelper.kt index 69f22e8ef..a848bee26 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/utils/UIHelper.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/utils/UIHelper.kt @@ -597,6 +597,10 @@ object UIHelper { fun MaterialButton.showProgress(@ColorInt tintColor: Int = this.iconTint.defaultColor) = // Use runOnMainThreadNative to allow process on io threads, to make the code a bit cleaner runOnMainThreadNative { + // No need to set it again, as then it will reset the animation + if(this.icon is IndeterminateDrawable<*>) { + return@runOnMainThreadNative + } val spec = CircularProgressIndicatorSpec( context, null, 0, com.google.android.material.R.style.Widget_Material3_CircularProgressIndicator_ExtraSmall diff --git a/library/src/androidMain/kotlin/com/lagradost/cloudstream3/utils/Coroutines.android.kt b/library/src/androidMain/kotlin/com/lagradost/cloudstream3/utils/Coroutines.android.kt index 048e7fc02..22bd3b20b 100644 --- a/library/src/androidMain/kotlin/com/lagradost/cloudstream3/utils/Coroutines.android.kt +++ b/library/src/androidMain/kotlin/com/lagradost/cloudstream3/utils/Coroutines.android.kt @@ -1,14 +1,20 @@ package com.lagradost.cloudstream3.utils +import android.annotation.SuppressLint import android.os.Handler import android.os.Looper import androidx.annotation.AnyThread import androidx.annotation.MainThread +@SuppressLint("ThreadConstraint") // mainLooper.isCurrentThread does not switch the context @AnyThread actual fun runOnMainThreadNative(@MainThread work: () -> Unit) { - val mainHandler = Handler(Looper.getMainLooper()) - mainHandler.post { + val mainLooper = Looper.getMainLooper() + if (mainLooper.isCurrentThread) { + // Do the work directly if we already are on the main thread, no need to enqueue it work() + } else { + // Otherwise post it to the other main thread + Handler(mainLooper).post(work) } } From 5cb939df69c6f6bda9aeb660e277c25ff3279119 Mon Sep 17 00:00:00 2001 From: firelight <147925818+fire-light42@users.noreply.github.com> Date: Wed, 8 Jul 2026 17:29:06 +0000 Subject: [PATCH 09/38] Fix: Corrupted HSL files due to 404 (#3013) --- .../kotlin/com/lagradost/cloudstream3/utils/M3u8Helper.kt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/M3u8Helper.kt b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/M3u8Helper.kt index aa4515b30..d34f5f500 100644 --- a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/M3u8Helper.kt +++ b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/M3u8Helper.kt @@ -234,6 +234,10 @@ object M3u8Helper2 { body.close() if (tsData.isEmpty()) throw ErrorLoadingException("no data") + // Some sources respond with "error 404" or similar, this checks for small responses that + // looks like ASCII + if (tsData.size < 128 && tsData.all { it >= 0 }) throw ErrorLoadingException("ASCII found instead of data") + return if (isEncrypted) { getDecrypted(encryptionData, tsData, encryptionIv, index) } else { From a123c5935c867dbcbbcfa6a0eed07f5e862029c1 Mon Sep 17 00:00:00 2001 From: firelight <147925818+fire-light42@users.noreply.github.com> Date: Wed, 8 Jul 2026 17:30:23 +0000 Subject: [PATCH 10/38] Fix slow startup in downloader --- .../java/com/lagradost/cloudstream3/plugins/PluginManager.kt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/src/main/java/com/lagradost/cloudstream3/plugins/PluginManager.kt b/app/src/main/java/com/lagradost/cloudstream3/plugins/PluginManager.kt index de41cbc74..829d871d2 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/plugins/PluginManager.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/plugins/PluginManager.kt @@ -512,6 +512,9 @@ object PluginManager { val res = dir.mkdirs() if (!res) { Log.w(TAG, "Failed to create local directories") + // We have tried to load local plugins, but exit early. + // This needs to be true to prevent the downloader waiting for plugins. + loadedLocalPlugins = true return } } From 480d48bea48f97696a15246fbd91b335c7a66fb3 Mon Sep 17 00:00:00 2001 From: firelight <147925818+fire-light42@users.noreply.github.com> Date: Wed, 8 Jul 2026 23:26:42 +0000 Subject: [PATCH 11/38] Fix: Switch focus on skip chapter (#3024) --- .../com/lagradost/cloudstream3/ui/player/FullScreenPlayer.kt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/player/FullScreenPlayer.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/player/FullScreenPlayer.kt index 5f5110552..20c37dcf4 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/player/FullScreenPlayer.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/player/FullScreenPlayer.kt @@ -1202,6 +1202,10 @@ open class FullScreenPlayer : AbstractPlayerFragment( } skipChapterButton.setOnClickListener { + // Switch focus for a better UX, as otherwise it is reset to a random button like "back button" + if(skipChapterButton.hasFocus()) { + playerPausePlay.requestFocus() + } player.handleEvent(CSPlayerEvent.SkipCurrentChapter) } From 694c9c44134d9116caffb10e443f15ae4e732e00 Mon Sep 17 00:00:00 2001 From: Luna712 <142361265+Luna712@users.noreply.github.com> Date: Wed, 8 Jul 2026 17:41:54 -0600 Subject: [PATCH 12/38] Add JsInterpreter to replace Rhino usage (#2812) --- gradle/libs.versions.toml | 5 +- library/build.gradle.kts | 1 + .../com/lagradost/cloudstream3/MainAPI.kt | 5 + .../cloudstream3/extractors/StreamTape.kt | 24 +- .../cloudstream3/extractors/Userload.kt | 30 +- .../cloudstream3/utils/JsInterpreter.kt | 1631 +++++++++++ .../cloudstream3/utils/JsInterpreterTest.kt | 2410 +++++++++++++++++ 7 files changed, 4063 insertions(+), 43 deletions(-) create mode 100644 library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/JsInterpreter.kt create mode 100644 library/src/commonTest/kotlin/com/lagradost/cloudstream3/utils/JsInterpreterTest.kt diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index d0c8eef94..8935ab52a 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -29,7 +29,7 @@ juniversalchardet = "2.5.0" kotlinGradlePlugin = "2.3.20" kotlinxAtomicfu = "0.33.0" kotlinxCollectionsImmutable = "0.4.0" -kotlinxCoroutinesCore = "1.11.0" +kotlinxCoroutines = "1.11.0" kotlinxDatetime = "0.8.0" kotlinxSerializationJson = "1.11.0" ksoup = "0.2.6" @@ -96,7 +96,8 @@ kotlin-reflect = { module = "org.jetbrains.kotlin:kotlin-reflect", version.ref = kotlin-test = { group = "org.jetbrains.kotlin", name = "kotlin-test", version.ref = "kotlinGradlePlugin" } kotlinx-atomicfu = { module = "org.jetbrains.kotlinx:atomicfu", version.ref = "kotlinxAtomicfu" } kotlinx-collections-immutable = { module = "org.jetbrains.kotlinx:kotlinx-collections-immutable", version.ref = "kotlinxCollectionsImmutable" } -kotlinx-coroutines-core = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "kotlinxCoroutinesCore" } +kotlinx-coroutines-core = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "kotlinxCoroutines" } +kotlinx-coroutines-test = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-test", version.ref = "kotlinxCoroutines" } kotlinx-datetime = { module = "org.jetbrains.kotlinx:kotlinx-datetime", version.ref = "kotlinxDatetime" } kotlinx-serialization-json = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json", version.ref = "kotlinxSerializationJson" } ksoup = { module = "com.fleeksoft.ksoup:ksoup", version.ref = "ksoup" } diff --git a/library/build.gradle.kts b/library/build.gradle.kts index 23351f7d0..9b769d1e5 100644 --- a/library/build.gradle.kts +++ b/library/build.gradle.kts @@ -76,6 +76,7 @@ kotlin { commonTest.dependencies { implementation(libs.kotlin.test) + implementation(libs.kotlinx.coroutines.test) } val jvmCommonMain by creating { diff --git a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/MainAPI.kt b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/MainAPI.kt index c34eb83f6..72d69dc45 100644 --- a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/MainAPI.kt +++ b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/MainAPI.kt @@ -804,6 +804,11 @@ fun fixTitle(str: String): String { * * Use like the following: rhino.evaluateString(scope, js, "JavaScript", 1, null) **/ +// Deprecate after next stable +/* @Deprecated( + message = "Use JsContext or evalJs instead.", + level = DeprecationLevel.WARNING, +) */ suspend fun getRhinoContext(): org.mozilla.javascript.Context { return Coroutines.mainWork { val rhino = org.mozilla.javascript.Context.enter() diff --git a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/extractors/StreamTape.kt b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/extractors/StreamTape.kt index 211b5ecf9..979674863 100644 --- a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/extractors/StreamTape.kt +++ b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/extractors/StreamTape.kt @@ -4,8 +4,8 @@ import com.lagradost.cloudstream3.app import com.lagradost.cloudstream3.utils.ExtractorApi import com.lagradost.cloudstream3.utils.ExtractorLink import com.lagradost.cloudstream3.utils.Qualities +import com.lagradost.cloudstream3.utils.evalJs import com.lagradost.cloudstream3.utils.newExtractorLink -import org.mozilla.javascript.Context class Watchadsontape : StreamTape() { override var mainUrl = "https://watchadsontape.com" @@ -30,24 +30,14 @@ open class StreamTape : ExtractorApi() { override suspend fun getUrl(url: String, referer: String?): List? { with(app.get(url)) { - var result = + val result = this.document.select("script").firstOrNull { it.html().contains("botlink').innerHTML") } - ?.html()?.lines()?.firstOrNull{ it.contains("botlink').innerHTML") }?.let { - val scriptContent = - it.substringAfter(").innerHTML").replaceFirst("=", "var url =") - val rhino = Context.enter() - rhino.setInterpretedMode(true) - val scope = rhino.initStandardObjects() - var result = "" - try { - rhino.evaluateString(scope, scriptContent, "url", 1, null) - result = scope.get("url", scope).toString() - }finally { - rhino.close() - } - result + ?.html()?.lines()?.firstOrNull { it.contains("botlink').innerHTML") }?.let { + val scriptContent = it.substringAfter(").innerHTML").replaceFirst("=", "var url =") + evalJs(scriptContent, "url")?.toString() } - if(!result.isNullOrEmpty()){ + + if (!result.isNullOrEmpty()) { val extractedUrl = "https:${result}&stream=1" return listOf( newExtractorLink( diff --git a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/extractors/Userload.kt b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/extractors/Userload.kt index 08dcb634e..ed2c20f31 100644 --- a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/extractors/Userload.kt +++ b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/extractors/Userload.kt @@ -3,9 +3,6 @@ package com.lagradost.cloudstream3.extractors import com.lagradost.cloudstream3.utils.ExtractorLink import com.lagradost.cloudstream3.app import com.lagradost.cloudstream3.utils.* -import org.mozilla.javascript.Context -import org.mozilla.javascript.EvaluatorException -import org.mozilla.javascript.Scriptable open class Userload : ExtractorApi() { override var name = "Userload" @@ -32,20 +29,11 @@ open class Userload : ExtractorApi() { return array } - private fun evaluateMath(mathExpression : String): String { - val rhino = Context.enter() - rhino.initStandardObjects() - rhino.setInterpretedMode(true) - val scope: Scriptable = rhino.initStandardObjects() - return try { - rhino.evaluateString(scope, "eval($mathExpression)", "JavaScript", 1, null).toString() - } - catch (e: EvaluatorException){ - "" - } + private suspend fun evaluateMath(mathExpression: String): String { + return jsValueToString(evalJs("eval($mathExpression)")) } - private fun decodeVideoJs(text: String): List { + private suspend fun decodeVideoJs(text: String): List { text.replace("""\s+|/\*.*?\*/""".toRegex(), "") val data = text.split("""+(゚Д゚)[゚o゚]""")[1] val chars = data.split("""+ (゚Д゚)[゚ε゚]+""").drop(1) @@ -68,22 +56,16 @@ open class Userload : ExtractorApi() { subchar.add(splitInput(v).map { evaluateMath(it).substringBefore(".") }.toString().filter { it.isDigit() }) } var txtresult = "" - subchar.forEach{ + subchar.forEach { txtresult = txtresult.plus(it.toInt(8).toChar()) } val val1 = Regex(""""morocco="((.|\\n)*?)"&mycountry="""").find(txtresult)?.groups?.get(1)?.value.toString().drop(1).dropLast(1) val val2 = txtresult.substringAfter("""&mycountry="+""").substringBefore(")") - return listOf( - val1, - val2 - ) - - + return listOf(val1, val2) } override suspend fun getUrl(url: String, referer: String?): List? { - val extractedLinksList: MutableList = mutableListOf() val response = app.get(url).text @@ -113,4 +95,4 @@ open class Userload : ExtractorApi() { return extractedLinksList } -} \ No newline at end of file +} diff --git a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/JsInterpreter.kt b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/JsInterpreter.kt new file mode 100644 index 000000000..39d950ed1 --- /dev/null +++ b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/JsInterpreter.kt @@ -0,0 +1,1631 @@ +package com.lagradost.cloudstream3.utils + +import androidx.annotation.VisibleForTesting +import com.lagradost.cloudstream3.Prerelease +import com.lagradost.cloudstream3.mvvm.logError +import com.lagradost.cloudstream3.utils.StringUtils.decodeUrl +import com.lagradost.cloudstream3.utils.StringUtils.encodeUrl +import kotlinx.coroutines.CancellationException +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.currentCoroutineContext +import kotlinx.coroutines.isActive +import kotlin.math.E +import kotlin.math.PI +import kotlin.math.abs +import kotlin.math.ceil +import kotlin.math.cos +import kotlin.math.floor +import kotlin.math.ln +import kotlin.math.log10 +import kotlin.math.log2 +import kotlin.math.pow +import kotlin.math.round +import kotlin.math.sin +import kotlin.math.sqrt +import kotlin.math.tan +import kotlin.math.truncate +import kotlin.random.Random +import kotlin.time.Duration +import kotlin.time.Duration.Companion.seconds +import kotlin.time.TimeMark +import kotlin.time.TimeSource + +/** + * Lightweight pure-Kotlin JavaScript interpreter designed to replace Rhino for + * our own deobfuscation use-cases. + * + * Supports the subset of JS that appears in obfuscated video-hosting scripts: + * - Variable declarations (var / let / const) + * - String, number (including hex `0x..` and legacy octal `0..`) and boolean literals + * - Arithmetic / bitwise / comparison / logical operators + * - String concatenation with + + * - String methods: split, join, reverse, replace, charAt, charCodeAt, + * fromCharCode, substr, substring, slice, indexOf, + * trim, toLowerCase, toUpperCase, toString, length + * - Array literals and methods: join, reverse, split, push, pop, + * map, filter, forEach, length + * - parseInt / parseFloat / isNaN / isFinite + * - Math.* (sin, cos, floor, ceil, round, abs, pow, sqrt, log, max, min, random) + * - String.fromCharCode + * - Ternary operator (a ? b : c) + * - if / else / while / for statements + * - Function declarations and calls (named and anonymous) + * - return / break / continue + * - Template literals (back-tick strings) + * - instanceof + * - typeof + * + * Every evaluation is bounded by an execution budget (wall-clock time and/or instruction + * count, see [JS_DEFAULT_MAX_EXECUTION_TIME] / [JS_DEFAULT_MAX_INSTRUCTIONS]) so that + * untrusted/obfuscated scripts containing an infinite loop (such as `while(true){}`) + * cannot hang the calling thread forever. Note that since evaluation is synchronous, wrapping a call + * in `withTimeout` will not pre-empt it mid-flight (there's no suspension point for the + * coroutine machinery to act on) so the budget below is what actually guarantees the call + * returns. + * + * Usage: + * val result = evalJs("var x = 1+2; x") + * // result == 3.0 (numbers are always Double internally) + * + * // Drop-in replacement for the old Rhino-based evaluateString pattern: + * val ctx = JsContext() + * ctx.eval("var url = 'https:' + computeSuffix()") + * val url = ctx["url"] // retrieves the variable as a String + * + * // Or simpler: + * val url = evalJs("var url = 'https:' + computeSuffix()", "url") + */ + +/** Default wall-clock budget for a single [evalJs] / [JsContext.eval] call before it's aborted. */ +private val JS_DEFAULT_MAX_EXECUTION_TIME: Duration = 5.seconds + +/** Hard backstop on statements/expressions executed, independent of wall-clock time. */ +private const val JS_DEFAULT_MAX_INSTRUCTIONS: Long = 50_000_000L + +/** + * Convert any JS runtime value to its JavaScript string representation. + * Mirrors what JS `String(value)` would produce. + */ +@Prerelease +fun jsValueToString(v: Any?): String = toJsString(v) + +/** + * Stateful JS execution context. Keeps variables alive between [eval] calls, + * mimicking the Rhino "scope" object that extensions used to hold on to. + * + * Instances are created via [newJsContext], not by calling this constructor directly. + * + * @param maxExecutionTime wall-clock budget given to each [eval] call. Can still be + * changed after construction (e.g. from within [newJsContext]'s initializer + * block) as long as it's set before the first [eval]/[get]/[set] call, since the + * underlying interpreter is built lazily from whatever values these hold at that + * point. Changes made afterward have no effect. + * @param maxInstructions hard cap on statements/expressions executed per [eval] call, + * independent of wall-clock time. Same lazy-initialization caveat as + * [maxExecutionTime] applies. + * @param scope the [CoroutineScope] this context's cancellation is tied to. Supplied + * automatically by [newJsContext] from the caller's own coroutine context. + */ +@Prerelease +class JsContext internal constructor( + var maxExecutionTime: Duration = JS_DEFAULT_MAX_EXECUTION_TIME, + var maxInstructions: Long = JS_DEFAULT_MAX_INSTRUCTIONS, + private val scope: CoroutineScope, +) { + /** + * Built lazily so that any changes made to [maxExecutionTime]/[maxInstructions] inside + * [newJsContext]'s initializer block (before the first [eval]/[get]/[set] call) are + * still in effect when JsInterpreter is actually constructed. Once this has been + * accessed once, further changes to the two vars above have no effect. + */ + private val interpreter: JsInterpreter by lazy { + JsInterpreter(maxExecutionTime, maxInstructions, scope) + } + + /** + * Evaluate [code] in this context. Returns the last expression value. + * + * @throws CancellationException if this context's underlying coroutine scope + * has been cancelled, e.g. by an enclosing `withTimeout`. + */ + @Throws(CancellationException::class) + suspend fun eval(code: String): Any? = interpreter.eval(code) + + /** + * Retrieve a variable set by previously evaluated code, or via [set]. + * Returns `null` if never set. + */ + operator fun get(name: String): Any? = interpreter.getVar(name) + + /** Expose a Kotlin value to subsequently evaluated JS code under the name [name]. */ + operator fun set(name: String, value: Any?) = interpreter.setVar(name, value) +} + +/** + * Creates a new [JsContext], running [initializer] on it before returning. + * + * The context's cancellation is automatically tied to whichever coroutine calls this + * function. If that coroutine is later cancelled (e.g. an enclosing `withTimeout` + * expires), any in-flight or subsequent [JsContext.eval] call on the returned + * context will throw [CancellationException]. + * + * [JsContext.maxExecutionTime] / [JsContext.maxInstructions] can be changed from + * within [initializer] (via `this.maxExecutionTime = ...`) and will take effect, since + * the underlying interpreter isn't built until the context is first used. + * + * Usage: + * val ctx = newJsContext { + * maxInstructions = 10_000 + * set("x", 1.0) + * eval("x + 1") + * } + */ +@Prerelease +suspend fun newJsContext( + initializer: suspend JsContext.() -> Unit = {}, +): JsContext { + val scope = CoroutineScope(currentCoroutineContext()) + return JsContext(scope = scope).apply { initializer() } +} + +/** + * Evaluate [js] and return its last value, or the value of [variable] if specified. + * Convenience wrapper for one-shot evaluations, equivalent to the old + * `rhino.evaluateString(scope, js, ...)`. + * + * Cancellation is automatically tied to whichever coroutine calls this function. If + * that coroutine is cancelled (e.g. an enclosing `withTimeout` expires), this call + * throws [CancellationException]. + * + * @param js The JavaScript code to evaluate. + * @param variable Optional variable name to retrieve from the scope after evaluation. + * @param maxExecutionTime wall-clock budget before the script is forcibly aborted. + * Defaults to [JS_DEFAULT_MAX_EXECUTION_TIME]; pass a smaller value for time-sensitive + * call sites (e.g. inside a `withTimeout`, which cannot itself interrupt this call). + * @param maxInstructions hard cap on statements/expressions executed, independent of + * wall-clock time. Defaults to [JS_DEFAULT_MAX_INSTRUCTIONS]. + * @return The last expression value, or the named variable value if [variable] is specified. + * Returns [Unit] on evaluation failure, timeout, or when the result is JS undefined. + * JS null is represented as Kotlin null. Use [jsValueToString] to convert to a JS string. + */ +@Prerelease +@Throws(CancellationException::class) +suspend fun evalJs( + js: String, + variable: String? = null, + maxExecutionTime: Duration = JS_DEFAULT_MAX_EXECUTION_TIME, + maxInstructions: Long = JS_DEFAULT_MAX_INSTRUCTIONS, +): Any? { + val scope = CoroutineScope(currentCoroutineContext()) + return evalJsInternal(js, variable, maxExecutionTime, maxInstructions, scope) +} + +@VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) +internal fun evalJsInternal( + js: String, + variable: String? = null, + maxExecutionTime: Duration = JS_DEFAULT_MAX_EXECUTION_TIME, + maxInstructions: Long = JS_DEFAULT_MAX_INSTRUCTIONS, + scope: CoroutineScope? = null, +): Any? { + val interpreter = JsInterpreter(maxExecutionTime, maxInstructions, scope) + val result = interpreter.eval(js) + return if (variable != null) interpreter.getVar(variable) else result +} + +private enum class TT { + NUMBER, STRING, IDENT, PLUS, MINUS, STAR, SLASH, PERCENT, POW, EQ, EQEQ, EQEQEQ, + NEQ, NEQEQ, LT, LTEQ, GT, GTEQ, AND, OR, NOT, AMP, PIPE, CARET, TILDE, + LSHIFT, RSHIFT, URSHIFT, PLUSEQ, MINUSEQ, STAREQ, SLASHEQ, PERCENTEQ, POWEQ, + PLUSPLUS, MINUSMINUS, DOT, COMMA, SEMI, COLON, QUESTION, LPAREN, RPAREN, + LBRACE, RBRACE, LBRACKET, RBRACKET, EOF +} + +private data class Token(val type: TT, val raw: String, val pos: Int) + +private class Lexer(private val src: String) { + var pos = 0 + private val tokens = mutableListOf() + private var idx = 0 + + init { tokenize() } + + private fun tokenize() { + while (pos < src.length) { + skipWhitespaceAndComments() + if (pos >= src.length) break + val c = src[pos] + when { + c.isDigit() || (c == '.' && pos + 1 < src.length && src[pos + 1].isDigit()) -> readNumber() + c == '"' || c == '\'' || c == '`' -> readString(c) + c.isLetter() || c == '_' || c == '$' -> readIdent() + else -> readOp() + } + } + tokens.add(Token(TT.EOF, "", pos)) + } + + private fun skipWhitespaceAndComments() { + while (pos < src.length) { + val c = src[pos] + if (c.isWhitespace()) { pos++; continue } + if (c == '/' && pos + 1 < src.length) { + when (src[pos + 1]) { + '/' -> { pos = src.indexOf('\n', pos).let { if (it < 0) src.length else it + 1 }; continue } + '*' -> { + val end = src.indexOf("*/", pos + 2) + pos = if (end < 0) src.length else end + 2; continue + } + else -> {} + } + } + break + } + } + + private fun readNumber() { + val start = pos + if (pos + 1 < src.length && src[pos] == '0' && + (src[pos + 1] == 'x' || src[pos + 1] == 'X') + ) { + pos += 2 + while (pos < src.length && src[pos].isLetterOrDigit()) pos++ + } else { + while (pos < src.length && (src[pos].isDigit() || src[pos] == '.')) pos++ + if (pos < src.length && (src[pos] == 'e' || src[pos] == 'E')) { + pos++ + if (pos < src.length && (src[pos] == '+' || src[pos] == '-')) pos++ + while (pos < src.length && src[pos].isDigit()) pos++ + } + } + tokens.add(Token(TT.NUMBER, src.substring(start, pos), start)) + } + + private fun readString(quote: Char) { + val start = pos++ + val sb = StringBuilder() + if (quote == '`') { + // template literal. We flatten it to a plain string (no interpolation yet) + while (pos < src.length && src[pos] != '`') { + if (src[pos] == '\\' && pos + 1 < src.length) { + sb.append(unescape(src[++pos])); pos++ + } else sb.append(src[pos++]) + } + if (pos < src.length) pos++ // consume closing ` + } else { + while (pos < src.length && src[pos] != quote) { + if (src[pos] == '\\' && pos + 1 < src.length) { + sb.append(unescape(src[++pos])); pos++ + } else sb.append(src[pos++]) + } + if (pos < src.length) pos++ + } + tokens.add(Token(TT.STRING, sb.toString(), start)) + } + + private fun unescape(c: Char): Char = when (c) { + 'n' -> '\n'; 'r' -> '\r'; 't' -> '\t'; 'b' -> '\b' + '\'' -> '\''; '"' -> '"'; '\\' -> '\\'; '`' -> '`' + else -> c + } + + private fun readIdent() { + val start = pos + while (pos < src.length && (src[pos].isLetterOrDigit() || src[pos] == '_' || src[pos] == '$')) pos++ + tokens.add(Token(TT.IDENT, src.substring(start, pos), start)) + } + + private fun readOp() { + val start = pos + val c = src[pos++] + val next = if (pos < src.length) src[pos] else '\u0000' + val nn = if (pos + 1 < src.length) src[pos + 1] else '\u0000' + fun adv(t: TT, n: Int = 0): Token { pos += n; return Token(t, "", start) } + val tok = when (c) { + '+' -> when (next) { '+' -> adv(TT.PLUSPLUS, 1); '=' -> adv(TT.PLUSEQ, 1); else -> Token(TT.PLUS, "+", start) } + '-' -> when (next) { '-' -> adv(TT.MINUSMINUS, 1); '=' -> adv(TT.MINUSEQ, 1); else -> Token(TT.MINUS, "-", start) } + '*' -> when { + next == '*' && nn == '=' -> adv(TT.POWEQ, 2) + next == '*' -> adv(TT.POW, 1) + next == '=' -> adv(TT.STAREQ, 1) + else -> Token(TT.STAR, "*", start) + } + '/' -> if (next == '=') adv(TT.SLASHEQ, 1) else Token(TT.SLASH, "/", start) + '%' -> if (next == '=') adv(TT.PERCENTEQ, 1) else Token(TT.PERCENT, "%", start) + '=' -> when { next == '=' && nn == '=' -> adv(TT.EQEQEQ, 2); next == '=' -> adv(TT.EQEQ, 1); else -> Token(TT.EQ, "=", start) } + '!' -> when { next == '=' && nn == '=' -> adv(TT.NEQEQ, 2); next == '=' -> adv(TT.NEQ, 1); else -> Token(TT.NOT, "!", start) } + '<' -> when { next == '<' -> adv(TT.LSHIFT, 1); next == '=' -> adv(TT.LTEQ, 1); else -> Token(TT.LT, "<", start) } + '>' -> when { next == '>' && nn == '>' -> adv(TT.URSHIFT, 2); next == '>' -> adv(TT.RSHIFT, 1); next == '=' -> adv(TT.GTEQ, 1); else -> Token(TT.GT, ">", start) } + '&' -> if (next == '&') adv(TT.AND, 1) else Token(TT.AMP, "&", start) + '|' -> if (next == '|') adv(TT.OR, 1) else Token(TT.PIPE, "|", start) + '^' -> Token(TT.CARET, "^", start) + '~' -> Token(TT.TILDE, "~", start) + '.' -> Token(TT.DOT, ".", start) + ',' -> Token(TT.COMMA, ",", start) + ';' -> Token(TT.SEMI, ";", start) + ':' -> Token(TT.COLON, ":", start) + '?' -> Token(TT.QUESTION, "?", start) + '(' -> Token(TT.LPAREN, "(", start) + ')' -> Token(TT.RPAREN, ")", start) + '{' -> Token(TT.LBRACE, "{", start) + '}' -> Token(TT.RBRACE, "}", start) + '[' -> Token(TT.LBRACKET, "[", start) + ']' -> Token(TT.RBRACKET, "]", start) + else -> Token(TT.SEMI, "", start) // swallow unknown + } + tokens.add(tok) + } + + fun peek(offset: Int = 0): Token = tokens.getOrElse(idx + offset) { tokens.last() } + fun consume(): Token = tokens[idx++] + fun expect(t: TT): Token { + val tok = consume() + if (tok.type != t) throw RuntimeException("Expected $t got ${tok.type} ('${tok.raw}') at ${tok.pos}") + return tok + } + fun matchIf(t: TT): Boolean = if (peek().type == t) { consume(); true } else false +} + +private sealed class Node +private data class NumLit(val v: Double) : Node() +private data class StrLit(val v: String) : Node() +private data class BoolLit(val v: Boolean) : Node() +private object NullLit : Node() +private object UndefinedLit : Node() +private data class Ident(val name: String) : Node() +private data class ArrayLit(val elems: List) : Node() +private data class ObjLit(val pairs: List>) : Node() +private data class MemberExpr(val obj: Node, val prop: Node, val computed: Boolean) : Node() +private data class CallExpr(val callee: Node, val args: List) : Node() +private data class NewExpr(val callee: Node, val args: List) : Node() +private data class UnaryExpr(val op: String, val expr: Node, val prefix: Boolean) : Node() +private data class BinExpr(val op: String, val left: Node, val right: Node) : Node() +private data class AssignExpr(val op: String, val left: Node, val right: Node) : Node() +private data class CondExpr(val test: Node, val cons: Node, val alt: Node) : Node() +private data class TypeofExpr(val expr: Node) : Node() +private data class SeqExpr(val exprs: List) : Node() +private data class FuncExpr(val name: String?, val params: List, val body: List) : Node() +private data class VarDecl(val decls: List>) : Node() +private data class ExprStmt(val expr: Node) : Node() +private data class BlockStmt(val stmts: List) : Node() +private data class ReturnStmt(val expr: Node?) : Node() +private data class IfStmt(val test: Node, val cons: Node, val alt: Node?) : Node() +private data class WhileStmt(val test: Node, val body: Node) : Node() +private data class ForStmt(val init: Node?, val test: Node?, val update: Node?, val body: Node) : Node() +private data class ForInStmt(val decl: String, val obj: Node, val body: Node) : Node() +private object BreakStmt : Node() +private object ContinueStmt : Node() +private data class TryCatch(val body: List, val catchParam: String?, val catchBody: List?, val finallyBody: List?) : Node() +private data class ThrowStmt(val expr: Node) : Node() + +private class Parser(private val lex: Lexer) { + + fun parseProgram(): List { + val stmts = mutableListOf() + while (lex.peek().type != TT.EOF) stmts.add(parseStatement()) + return stmts + } + + private fun parseStatement(): Node { + return when (lex.peek().type) { + TT.LBRACE -> parseBlock() + TT.SEMI -> { lex.consume(); BlockStmt(emptyList()) } + TT.IDENT -> when (lex.peek().raw) { + "var", "let", "const" -> parseVarDecl() + "function" -> parseFunctionDecl() + "return" -> parseReturn() + "if" -> parseIf() + "while" -> parseWhile() + "for" -> parseFor() + "break" -> { lex.consume(); lex.matchIf(TT.SEMI); BreakStmt } + "continue" -> { lex.consume(); lex.matchIf(TT.SEMI); ContinueStmt } + "try" -> parseTryCatch() + "throw" -> parseThrow() + "typeof" -> parseExprStmt() + else -> parseExprStmt() + } + else -> parseExprStmt() + } + } + + private fun parseBlock(): BlockStmt { + lex.expect(TT.LBRACE) + val stmts = mutableListOf() + while (lex.peek().type != TT.RBRACE && lex.peek().type != TT.EOF) stmts.add(parseStatement()) + lex.expect(TT.RBRACE) + return BlockStmt(stmts) + } + + private fun parseVarDecl(): VarDecl { + lex.consume() // var / let / const + val decls = mutableListOf>() + do { + val name = lex.expect(TT.IDENT).raw + val init = if (lex.matchIf(TT.EQ)) parseAssign() else null + decls.add(name to init) + } while (lex.matchIf(TT.COMMA)) + lex.matchIf(TT.SEMI) + return VarDecl(decls) + } + + private fun parseFunctionDecl(): Node { + lex.consume() // "function" + val name = if (lex.peek().type == TT.IDENT) lex.consume().raw else null + val params = parseParams() + val body = parseBlock().stmts + return if (name != null) VarDecl(listOf(name to FuncExpr(name, params, body))) else FuncExpr(name, params, body) + } + + private fun parseParams(): List { + lex.expect(TT.LPAREN) + val params = mutableListOf() + while (lex.peek().type != TT.RPAREN && lex.peek().type != TT.EOF) { + params.add(lex.expect(TT.IDENT).raw) + if (!lex.matchIf(TT.COMMA)) break + } + lex.expect(TT.RPAREN) + return params + } + + private fun parseReturn(): ReturnStmt { + lex.consume() + val expr = if (lex.peek().type == TT.SEMI || lex.peek().type == TT.RBRACE || lex.peek().type == TT.EOF) null else parseAssign() + lex.matchIf(TT.SEMI) + return ReturnStmt(expr) + } + + private fun parseIf(): IfStmt { + lex.consume() + lex.expect(TT.LPAREN) + val test = parseAssign() + lex.expect(TT.RPAREN) + val cons = parseStatement() + val alt = if (lex.peek().type == TT.IDENT && lex.peek().raw == "else") { lex.consume(); parseStatement() } else null + return IfStmt(test, cons, alt) + } + + private fun parseWhile(): WhileStmt { + lex.consume() + lex.expect(TT.LPAREN) + val test = parseAssign() + lex.expect(TT.RPAREN) + return WhileStmt(test, parseStatement()) + } + + private fun parseFor(): Node { + lex.consume() + lex.expect(TT.LPAREN) + // for..in check + if (lex.peek().type == TT.IDENT && (lex.peek().raw == "var" || lex.peek().raw == "let" || lex.peek().raw == "const")) { + val savedIdx = lex.peek() + lex.consume() + val varName = lex.expect(TT.IDENT).raw + if (lex.peek().type == TT.IDENT && lex.peek().raw == "in") { + lex.consume() + val obj = parseAssign() + lex.expect(TT.RPAREN) + return ForInStmt(varName, obj, parseStatement()) + } + // backtrack is hard so we just reconstruct as normal for + val init: Node? = if (lex.peek().type != TT.SEMI) { + val initExpr = if (lex.matchIf(TT.EQ)) parseAssign() else null + VarDecl(listOf(varName to initExpr)) + } else VarDecl(listOf(varName to null)) + lex.matchIf(TT.SEMI) + val test = if (lex.peek().type != TT.SEMI) parseAssign() else null + lex.matchIf(TT.SEMI) + val update = if (lex.peek().type != TT.RPAREN) parseAssign() else null + lex.expect(TT.RPAREN) + return ForStmt(init, test, update, parseStatement()) + } + val init = if (lex.peek().type != TT.SEMI) parseAssign() else null + lex.matchIf(TT.SEMI) + val test = if (lex.peek().type != TT.SEMI) parseAssign() else null + lex.matchIf(TT.SEMI) + val update = if (lex.peek().type != TT.RPAREN) parseAssign() else null + lex.expect(TT.RPAREN) + return ForStmt(init, test, update, parseStatement()) + } + + private fun parseTryCatch(): TryCatch { + lex.consume() // "try" + val body = parseBlock().stmts + var catchParam: String? = null + var catchBody: List? = null + if (lex.peek().type == TT.IDENT && lex.peek().raw == "catch") { + lex.consume() + if (lex.matchIf(TT.LPAREN)) { + catchParam = lex.expect(TT.IDENT).raw + lex.expect(TT.RPAREN) + } + catchBody = parseBlock().stmts + } + val finallyBody = if (lex.peek().type == TT.IDENT && lex.peek().raw == "finally") { + lex.consume(); parseBlock().stmts + } else null + return TryCatch(body, catchParam, catchBody, finallyBody) + } + + private fun parseThrow(): ThrowStmt { + lex.consume() + val expr = parseAssign() + lex.matchIf(TT.SEMI) + return ThrowStmt(expr) + } + + private fun parseExprStmt(): Node { + val expr = parseSeq() + lex.matchIf(TT.SEMI) + return ExprStmt(expr) + } + + private fun parseSeq(): Node { + val first = parseAssign() + if (lex.peek().type != TT.COMMA) return first + val exprs = mutableListOf(first) + while (lex.matchIf(TT.COMMA)) exprs.add(parseAssign()) + return SeqExpr(exprs) + } + + private fun parseAssign(): Node { + val left = parseTernary() + val op = when (lex.peek().type) { + TT.EQ -> "="; TT.PLUSEQ -> "+="; TT.MINUSEQ -> "-="; TT.STAREQ -> "*="; TT.SLASHEQ -> "/="; TT.PERCENTEQ -> "%="; TT.POWEQ -> "**=" + else -> return left + } + lex.consume() + return AssignExpr(op, left, parseAssign()) + } + + private fun parseTernary(): Node { + val test = parseOr() + if (!lex.matchIf(TT.QUESTION)) return test + val cons = parseAssign() + lex.expect(TT.COLON) + return CondExpr(test, cons, parseAssign()) + } + + private fun parseOr(): Node = parseBin(::parseAnd, TT.OR to "||") + private fun parseAnd(): Node = parseBin(::parseBitor, TT.AND to "&&") + private fun parseBitor(): Node = parseBin(::parseBitxor, TT.PIPE to "|") + private fun parseBitxor(): Node = parseBin(::parseBitand, TT.CARET to "^") + private fun parseBitand(): Node = parseBin(::parseEq, TT.AMP to "&") + private fun parseEq(): Node = parseBin(::parseRel, TT.EQEQ to "==", TT.EQEQEQ to "===", TT.NEQ to "!=", TT.NEQEQ to "!==") + private fun parseRel(): Node { + var left = parseShift() + while (true) { + left = when { + lex.peek().type == TT.LT -> { lex.consume(); BinExpr("<", left, parseShift()) } + lex.peek().type == TT.LTEQ -> { lex.consume(); BinExpr("<=", left, parseShift()) } + lex.peek().type == TT.GT -> { lex.consume(); BinExpr(">", left, parseShift()) } + lex.peek().type == TT.GTEQ -> { lex.consume(); BinExpr(">=", left, parseShift()) } + lex.peek().type == TT.IDENT && lex.peek().raw == "in" -> { lex.consume(); BinExpr("in", left, parseShift()) } + lex.peek().type == TT.IDENT && lex.peek().raw == "instanceof" -> { lex.consume(); BinExpr("instanceof", left, parseShift()) } + else -> break + } + } + return left + } + private fun parseShift(): Node = parseBin(::parseAdd, TT.LSHIFT to "<<", TT.RSHIFT to ">>", TT.URSHIFT to ">>>") + private fun parseAdd(): Node = parseBin(::parseMul, TT.PLUS to "+", TT.MINUS to "-") + private fun parseMul(): Node = parseBin(::parsePow, TT.STAR to "*", TT.SLASH to "/", TT.PERCENT to "%") + + /** `**` binds tighter than `* / %` and is right-associative: `2 ** 3 ** 2 == 2 ** (3 ** 2)`. */ + private fun parsePow(): Node { + val base = parseUnary() + if (lex.peek().type == TT.POW) { + lex.consume() + return BinExpr("**", base, parsePow()) + } + return base + } + + private fun parseBin(next: () -> Node, vararg ops: Pair): Node { + var left = next() + while (true) { + val op = ops.firstOrNull { it.first == lex.peek().type } ?: break + lex.consume() + left = BinExpr(op.second, left, next()) + } + return left + } + + private fun parseUnary(): Node { + return when (lex.peek().type) { + TT.MINUS -> { lex.consume(); UnaryExpr("-", parseUnary(), true) } + TT.PLUS -> { lex.consume(); UnaryExpr("+", parseUnary(), true) } + TT.NOT -> { lex.consume(); UnaryExpr("!", parseUnary(), true) } + TT.TILDE -> { lex.consume(); UnaryExpr("~", parseUnary(), true) } + TT.PLUSPLUS -> { lex.consume(); UnaryExpr("++", parsePostfix(), true) } + TT.MINUSMINUS -> { lex.consume(); UnaryExpr("--", parsePostfix(), true) } + TT.IDENT -> when (lex.peek().raw) { + "typeof" -> { lex.consume(); TypeofExpr(parseUnary()) } + "void" -> { lex.consume(); parseUnary(); UndefinedLit } + "new" -> parseNew() + else -> parsePostfix() + } + else -> parsePostfix() + } + } + + private fun parseNew(): Node { + lex.consume() // "new" + val callee = parsePrimary() + val args = if (lex.peek().type == TT.LPAREN) parseArgs() else emptyList() + var expr: Node = NewExpr(callee, args) + // Allow member access and calls on the constructed object: new Foo().bar, new Foo()[0] + while (true) { + expr = when (lex.peek().type) { + TT.DOT -> { + lex.consume() + val prop = lex.expect(TT.IDENT).raw + MemberExpr(expr, StrLit(prop), false) + } + TT.LBRACKET -> { + lex.consume() + val prop = parseAssign() + lex.expect(TT.RBRACKET) + MemberExpr(expr, prop, true) + } + TT.LPAREN -> CallExpr(expr, parseArgs()) + else -> break + } + } + return expr + } + + private fun parsePostfix(): Node { + var expr = parseCall() + while (true) { + expr = when (lex.peek().type) { + TT.PLUSPLUS -> { lex.consume(); UnaryExpr("++", expr, false) } + TT.MINUSMINUS -> { lex.consume(); UnaryExpr("--", expr, false) } + else -> break + } + } + return expr + } + + private fun parseCall(): Node { + var expr = parsePrimary() + while (true) { + expr = when (lex.peek().type) { + TT.LPAREN -> CallExpr(expr, parseArgs()) + TT.DOT -> { + lex.consume() + val prop = lex.expect(TT.IDENT).raw + MemberExpr(expr, StrLit(prop), false) + } + TT.LBRACKET -> { + lex.consume() + val prop = parseAssign() + lex.expect(TT.RBRACKET) + MemberExpr(expr, prop, true) + } + else -> break + } + } + return expr + } + + private fun parseArgs(): List { + lex.expect(TT.LPAREN) + val args = mutableListOf() + while (lex.peek().type != TT.RPAREN && lex.peek().type != TT.EOF) { + args.add(parseAssign()) + if (!lex.matchIf(TT.COMMA)) break + } + lex.expect(TT.RPAREN) + return args + } + + private fun parsePrimary(): Node { + val tok = lex.peek() + return when (tok.type) { + TT.NUMBER -> { + lex.consume() + val raw = tok.raw + val value = when { + raw.startsWith("0x") || raw.startsWith("0X") -> + raw.drop(2).toLongOrNull(16)?.toDouble() ?: Double.NaN + // Legacy octal literal, a leading zero followed only by octal digits + // (0-7), e.g. "010" == 8. If any digit is 8/9 it's just decimal ("08" == 8). + raw.length > 1 && raw[0] == '0' && raw.all { it in '0'..'7' } -> + raw.toLongOrNull(8)?.toDouble() ?: Double.NaN + else -> raw.toDoubleOrNull() ?: Double.NaN + } + NumLit(value) + } + TT.STRING -> { lex.consume(); StrLit(tok.raw) } + TT.LPAREN -> { + lex.consume() + val expr = parseSeq() + lex.expect(TT.RPAREN) + expr + } + TT.LBRACKET -> { + lex.consume() + val elems = mutableListOf() + while (lex.peek().type != TT.RBRACKET && lex.peek().type != TT.EOF) { + if (lex.peek().type == TT.COMMA) { + // Elision, a "hole" in the array, e.g. the middle slot of [1,,3]. + // Reads back as undefined but still occupies a slot/length. + elems.add(UndefinedLit) + lex.consume() + } else { + elems.add(parseAssign()) + if (lex.peek().type == TT.COMMA) lex.consume() else break + } + } + lex.expect(TT.RBRACKET) + ArrayLit(elems) + } + TT.LBRACE -> { + lex.consume() + val pairs = mutableListOf>() + while (lex.peek().type != TT.RBRACE && lex.peek().type != TT.EOF) { + val key = when (lex.peek().type) { + TT.IDENT, TT.STRING -> lex.consume().raw + TT.NUMBER -> lex.consume().raw + else -> lex.consume().raw + } + lex.expect(TT.COLON) + pairs.add(key to parseAssign()) + lex.matchIf(TT.COMMA) + } + lex.expect(TT.RBRACE) + ObjLit(pairs) + } + TT.IDENT -> { + val name = tok.raw + lex.consume() + when (name) { + "true" -> BoolLit(true) + "false" -> BoolLit(false) + "null" -> NullLit + "undefined" -> UndefinedLit + "function" -> { + val fname = if (lex.peek().type == TT.IDENT) lex.consume().raw else null + val params = parseParams() + FuncExpr(fname, params, parseBlock().stmts) + } + else -> Ident(name) + } + } + else -> { lex.consume(); UndefinedLit } + } + } +} + +private class ReturnSignal(val value: Any?) : Throwable() +private object BreakSignal : Throwable() +private object ContinueSignal : Throwable() +private class ThrowSignal(val value: Any?) : Throwable() + +/** + * Thrown when the enclosing [CoroutineScope] is cancelled (e.g. by [withTimeout]). + * Extends [CancellationException] so coroutines recognize and handle it correctly. + * + * We use a dedicated subclass rather than [CancellationException] directly so that + * tests can use [assertFailsWith]<[JsCancellationException]> to verify that cancellation + * originated from the interpreter's scope check rather than some other source. The class + * is [internal] rather than private for the same reason. + * + * The [TryCatch] handler in [JsInterpreter.execNode] explicitly rethrows this before + * its generic `catch (Exception)` clause, so a JS script's own try/catch block cannot + * swallow it and keep a cancelled loop alive. + */ +@VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) +internal class JsCancellationException(message: String) : CancellationException(message) + +/** + * Internal signal thrown once a script exceeds its execution budget (time or instruction + * count), or the enclosing [CoroutineScope] has been cancelled. + * + * Deliberately extends [Throwable] rather than [Exception]. The interpreter's own + * `try`/`catch` node handling (see [JsInterpreter.execNode]'s `TryCatch` branch) only catches + * `Exception`, so a JS script can't wrap an infinite loop in its own try/catch and swallow this, + * keeping the loop alive forever. + */ +private class JsExecutionLimitExceeded(message: String) : Throwable(message) + +private fun toNumber(v: Any?): Double = when (v) { + null -> 0.0 // In JS Number(null) === 0 + is Unit -> Double.NaN // In JS Number(undefined) === NaN + is Double -> v + is Boolean -> if (v) 1.0 else 0.0 + is String -> stringToNumber(v) + is JsList -> stringToNumber(toJsString(v)) + else -> Double.NaN +} + +/** + * Returns the numeric value of [c] in the given [radix] (2..36), or -1 if [c] isn't a valid + * digit for that radix. Only handles ASCII '0'-'9'/'a'-'z'/'A'-'Z', which is all JS + * number syntax (and parseInt) ever recognizes anyway. + */ +private fun digitValue(c: Char, radix: Int): Int { + val d = when (c) { + in '0'..'9' -> c - '0' + in 'a'..'z' -> c - 'a' + 10 + in 'A'..'Z' -> c - 'A' + 10 + else -> return -1 + } + return if (d < radix) d else -1 +} + +/** Mirrors the JS ToNumber(string) abstract operation closely enough for our use-cases. */ +private fun stringToNumber(s: String): Double { + val trimmed = s.trim() + if (trimmed.isEmpty()) return 0.0 // In JS Number("") === 0, Number(" ") === 0 + when (trimmed) { + "Infinity", "+Infinity" -> return Double.POSITIVE_INFINITY + "-Infinity" -> return Double.NEGATIVE_INFINITY + } + return when { + trimmed.startsWith("0x") || trimmed.startsWith("0X") -> trimmed.drop(2).toLongOrNull(16)?.toDouble() ?: Double.NaN + trimmed.startsWith("0o") || trimmed.startsWith("0O") -> trimmed.drop(2).toLongOrNull(8)?.toDouble() ?: Double.NaN + trimmed.startsWith("0b") || trimmed.startsWith("0B") -> trimmed.drop(2).toLongOrNull(2)?.toDouble() ?: Double.NaN + else -> trimmed.toDoubleOrNull() ?: Double.NaN + } +} + +private fun toBoolean(v: Any?): Boolean = when (v) { + null, is Unit -> false + is Boolean -> v + is Double -> v != 0.0 && !v.isNaN() + is String -> v.isNotEmpty() + is JsList -> true + is JsObject -> true + else -> true +} + +/** Array.prototype.join/toString treats holes/null/undefined elements as the empty string. */ +private fun joinElement(e: Any?): String = if (e == null || e is Unit) "" else toJsString(e) + +private fun toJsString(v: Any?): String = when (v) { + null -> "null" + is Unit -> "undefined" + is Boolean -> v.toString() + is Double -> if (v == floor(v) && !v.isInfinite()) v.toLong().toString() else v.toString() + is String -> v + is JsList -> v.elements.joinToString(",") { joinElement(it) } + is JsObject -> "[object Object]" + is NativeFn -> v.toString() + is JsFunction -> "function ${v.name ?: ""}() { [native code] }" + else -> v.toString() +} + +private fun strictEq(a: Any?, b: Any?): Boolean = when { + a is Double && b is Double -> a == b + a is String && b is String -> a == b + a is Boolean && b is Boolean -> a == b + a == null && b == null -> true + a is Unit && b is Unit -> true + else -> a === b +} + +private fun looseEq(a: Any?, b: Any?): Boolean { + if (strictEq(a, b)) return true + // null == undefined + val aNullish = a == null || a is Unit + val bNullish = b == null || b is Unit + if (aNullish || bNullish) return aNullish && bNullish + // number coercion + val an = a is Double || a is Boolean + val bn = b is Double || b is Boolean + if (an || bn) return toNumber(a) == toNumber(b) + if (a is String || b is String) return toJsString(a) == toJsString(b) + return false +} + +private class JsList(val elements: MutableList = mutableListOf()) { + var length: Int + get() = elements.size + set(v) { while (elements.size < v) elements.add(Unit); while (elements.size > v) elements.removeAt(elements.size - 1) } + + operator fun get(idx: Int): Any? = elements.getOrElse(idx) { Unit } + operator fun set(idx: Int, v: Any?) { while (elements.size <= idx) elements.add(Unit); elements[idx] = v } +} + +private class JsObject(val props: MutableMap = mutableMapOf(), var constructor: JsFunction? = null) + +private class JsFunction( + val name: String?, + val params: List, + val body: List, + val closure: Scope, +) + +private class Scope(val parent: Scope? = null) { + val vars = mutableMapOf() + + fun get(name: String): Any? { + if (vars.containsKey(name)) return vars[name] + return parent?.get(name) ?: Unit + } + + fun set(name: String, value: Any?) { + val scope = findOwner(name) + if (scope != null) scope.vars[name] = value else vars[name] = value + } + + fun define(name: String, value: Any?) { vars[name] = value } + + private fun findOwner(name: String): Scope? = + if (vars.containsKey(name)) this else parent?.findOwner(name) +} + +private class JsInterpreter( + private val maxExecutionTime: Duration = JS_DEFAULT_MAX_EXECUTION_TIME, + private val maxInstructions: Long = JS_DEFAULT_MAX_INSTRUCTIONS, + private val scope: CoroutineScope? = null, +) { + private val globalScope = Scope() + + // Execution budget, reset at the start of every top-level eval() call. + private var instructionCount = 0L + private var startMark: TimeMark = TimeSource.Monotonic.markNow() + + init { installGlobals() } + + private fun installGlobals() { + val mathObj = JsObject(mutableMapOf( + "PI" to PI, "E" to E, + "floor" to nativeFn("floor") { args -> floor(toNumber(args.getOrNull(0))) }, + "ceil" to nativeFn("ceil") { args -> ceil(toNumber(args.getOrNull(0))) }, + "round" to nativeFn("round") { args -> round(toNumber(args.getOrNull(0))) }, + "abs" to nativeFn("abs") { args -> abs(toNumber(args.getOrNull(0))) }, + "sqrt" to nativeFn("sqrt") { args -> sqrt(toNumber(args.getOrNull(0))) }, + "pow" to nativeFn("pow") { args -> toNumber(args.getOrNull(0)).pow(toNumber(args.getOrNull(1))) }, + "log" to nativeFn("log") { args -> ln(toNumber(args.getOrNull(0))) }, + "sin" to nativeFn("sin") { args -> sin(toNumber(args.getOrNull(0))) }, + "cos" to nativeFn("cos") { args -> cos(toNumber(args.getOrNull(0))) }, + "tan" to nativeFn("tan") { args -> tan(toNumber(args.getOrNull(0))) }, + "max" to nativeFn("max") { args -> args.maxOfOrNull { toNumber(it) } ?: Double.NEGATIVE_INFINITY }, + "min" to nativeFn("min") { args -> args.minOfOrNull { toNumber(it) } ?: Double.POSITIVE_INFINITY }, + "random" to nativeFn("random") { _ -> Random.nextDouble() }, + "trunc" to nativeFn("trunc") { args -> truncate(toNumber(args.getOrNull(0))) }, + "log2" to nativeFn("log2") { args -> log2(toNumber(args.getOrNull(0))) }, + "log10" to nativeFn("log10") { args -> log10(toNumber(args.getOrNull(0))) }, + )) + globalScope.define("Math", mathObj) + + // For String.fromCharCode + val stringObj = JsObject(mutableMapOf( + "fromCharCode" to nativeFn("fromCharCode") { args -> args.joinToString("") { toNumber(it).toInt().toChar().toString() } } + )) + globalScope.define("String", stringObj) + + globalScope.define("parseInt", nativeFn("parseInt") { args -> + val s = toJsString(args.getOrNull(0)).trim() + var i = 0 + var negative = false + if (i < s.length && (s[i] == '+' || s[i] == '-')) { + negative = s[i] == '-' + i++ + } + var radix = args.getOrNull(1)?.let { toNumber(it).toInt() } ?: 0 + if (radix != 0 && (radix < 2 || radix > 36)) { + Double.NaN + } else { + val stripHexPrefix = radix == 0 || radix == 16 + if (radix == 0) radix = 10 + if (stripHexPrefix && i + 1 < s.length && s[i] == '0' && (s[i + 1] == 'x' || s[i + 1] == 'X')) { + radix = 16 + i += 2 + } + val start = i + while (i < s.length && digitValue(s[i], radix) != -1) i++ + if (i == start) { + Double.NaN + } else { + var value = 0.0 + for (idx in start until i) value = value * radix + digitValue(s[idx], radix) + if (negative) -value else value + } + } + }) + globalScope.define("parseFloat", nativeFn("parseFloat") { args -> toNumber(args.getOrNull(0)) }) + globalScope.define("isNaN", nativeFn("isNaN") { args -> toNumber(args.getOrNull(0)).isNaN() }) + globalScope.define("isFinite", nativeFn("isFinite") { args -> toNumber(args.getOrNull(0)).isFinite() }) + globalScope.define("decodeURIComponent", nativeFn("decodeURIComponent") { args -> toJsString(args.getOrNull(0)).decodeUrl() }) + globalScope.define("encodeURIComponent", nativeFn("encodeURIComponent") { args -> toJsString(args.getOrNull(0)).encodeUrl() }) + globalScope.define("escape", nativeFn("escape") { args -> toJsString(args.getOrNull(0)).encodeUrl() }) + globalScope.define("unescape", nativeFn("unescape") { args -> toJsString(args.getOrNull(0)).decodeUrl() }) + // Nested eval() reuses the current budget rather than resetting it, otherwise a + // script could keep itself alive forever via `while(true){ eval("1") }`. + globalScope.define("eval", nativeFn("eval") { args -> evalInternal(toJsString(args.getOrNull(0))) }) + globalScope.define("undefined", Unit) + globalScope.define("NaN", Double.NaN) + globalScope.define("Infinity", Double.POSITIVE_INFINITY) + + globalScope.define("Array", nativeFn("Array") { args -> + if (args.size == 1 && args[0] is Double) JsList(MutableList((args[0] as Double).toInt()) { Unit }) + else JsList(args.toMutableList()) + }) + + globalScope.define("Object", NativeFn({ args -> + // Object() called as a function, wrap primitive or return object as-is + when (val v = args.getOrNull(0)) { + null, is Unit -> JsObject() + is JsObject -> v + is JsList -> v + else -> JsObject() + } + }, "Object", mutableMapOf( + "keys" to nativeFn("keys") { args -> + when (val o = args.getOrNull(0)) { + is JsObject -> JsList(o.props.keys.map { it as Any? }.toMutableList()) + else -> JsList() + } + }, + "values" to nativeFn("values") { args -> + when (val o = args.getOrNull(0)) { + is JsObject -> JsList(o.props.values.toMutableList()) + else -> JsList() + } + } + ))) + + globalScope.define("Function", nativeFn("Function") { _ -> nativeFn("anonymous") { Unit } }) + globalScope.define("Number", nativeFn("Number") { args -> toNumber(args.getOrNull(0)) }) + globalScope.define("Boolean", nativeFn("Boolean") { args -> toBoolean(args.getOrNull(0)) }) + + // console.log (no-op for silence, but avoids errors) + val consoleObj = JsObject(mutableMapOf( + "log" to nativeFn("log") { _ -> Unit }, + "error" to nativeFn("error") { _ -> Unit }, + "warn" to nativeFn("warn") { _ -> Unit }, + )) + globalScope.define("console", consoleObj) + } + + private fun nativeFn(name: String, fn: (List) -> Any?): Any? = NativeFn(fn, name) + + fun eval(code: String): Any? { + instructionCount = 0 + startMark = TimeSource.Monotonic.markNow() + return evalInternal(code) + } + + /** Runs [code] against the current budget, without resetting it. */ + private fun evalInternal(code: String): Any? { + return try { + val lexer = Lexer(code) + val parser = Parser(lexer) + val stmts = parser.parseProgram() + var last: Any? = Unit + for (stmt in stmts) last = execNode(stmt, globalScope) + last + } catch (r: ReturnSignal) { + r.value + } catch (e: JsCancellationException) { + // CancellationException must never be swallowed. It signals that the + // enclosing coroutine has been cancelled and must propagate so that the + // coroutine can clean up correctly. + throw e + } catch (t: Throwable) { + logError(t) + Unit + } + } + + /** + * Called on every statement execution. Throws [JsExecutionLimitExceeded] once the + * script has used up its time or instruction budget, or the enclosing [CoroutineScope] + * has been cancelled. This is what lets something like `evalJs("while(true){}")` + * return instead of burning the CPU forever. + * + * [JsExecutionLimitExceeded] extends [Throwable] rather than [Exception], so a JS + * script cannot catch it with its own try/catch block (the [TryCatch] handler in + * [execNode] only catches [Exception]). + */ + private fun checkBudget() { + instructionCount++ + if (instructionCount >= maxInstructions) { + throw JsExecutionLimitExceeded("script exceeded max instruction count of $maxInstructions") + } + if (scope != null && !scope.isActive) { + throw JsCancellationException("script cancelled: coroutine scope is no longer active") + } + // Only sample the clock every 1024 ticks. Calling elapsedNow() on every single + // statement would add measurable overhead to normal (non-runaway) scripts. + if (instructionCount and 0x3FFL == 0L && startMark.elapsedNow() >= maxExecutionTime) { + throw JsExecutionLimitExceeded("script exceeded max execution time of $maxExecutionTime") + } + } + + fun getVar(name: String): Any? = globalScope.get(name).let { if (it is Unit) null else it } + fun setVar(name: String, value: Any?) = globalScope.define(name, value) + + private fun execNode(node: Node, scope: Scope): Any? { + checkBudget() + return when (node) { + is VarDecl -> { + for ((name, init) in node.decls) scope.define(name, init?.let { evalExpr(it, scope) }) + Unit + } + is ExprStmt -> evalExpr(node.expr, scope) + is BlockStmt -> { + val inner = Scope(scope) + var last: Any? = Unit + for (s in node.stmts) last = execNode(s, inner) + last + } + is ReturnStmt -> throw ReturnSignal(node.expr?.let { evalExpr(it, scope) }) + is IfStmt -> { + if (toBoolean(evalExpr(node.test, scope))) execNode(node.cons, scope) + else node.alt?.let { execNode(it, scope) } + } + is WhileStmt -> { + try { + while (toBoolean(evalExpr(node.test, scope))) { + try { execNode(node.body, scope) } catch (_: ContinueSignal) {} + } + } catch (_: BreakSignal) {} + Unit + } + is ForStmt -> { + val inner = Scope(scope) + node.init?.let { execNode(it, inner) } + try { + while (node.test == null || toBoolean(evalExpr(node.test, inner))) { + try { execNode(node.body, inner) } catch (_: ContinueSignal) {} + node.update?.let { evalExpr(it, inner) } + } + } catch (_: BreakSignal) {} + Unit + } + is ForInStmt -> { + val obj = evalExpr(node.obj, scope) + val inner = Scope(scope) + try { + when (obj) { + is JsObject -> for (key in obj.props.keys) { + inner.define(node.decl, key) + try { execNode(node.body, inner) } catch (_: ContinueSignal) {} + } + is JsList -> for (i in obj.elements.indices) { + inner.define(node.decl, i.toDouble()) + try { execNode(node.body, inner) } catch (_: ContinueSignal) {} + } + else -> {} + } + } catch (_: BreakSignal) {} + Unit + } + is TryCatch -> { + try { + for (s in node.body) execNode(s, scope) + } catch (ts: ThrowSignal) { + if (node.catchBody != null) { + val inner = Scope(scope) + if (node.catchParam != null) inner.define(node.catchParam, ts.value) + for (s in node.catchBody) execNode(s, inner) + } + } catch (e: JsCancellationException) { + // CancellationException must never be swallowed by a JS try/catch. + // It must propagate so withTimeout and structured concurrency + // work correctly. + throw e + } catch (_: Exception) { + // swallow other exceptions inside try (e.g. runtime errors) + } finally { + node.finallyBody?.forEach { execNode(it, scope) } + } + Unit + } + is ThrowStmt -> throw ThrowSignal(evalExpr(node.expr, scope)) + is BreakStmt -> throw BreakSignal + is ContinueStmt -> throw ContinueSignal + else -> evalExpr(node, scope) + } + } + + private fun evalExpr(node: Node, scope: Scope): Any? = when (node) { + is NumLit -> node.v + is StrLit -> node.v + is BoolLit -> node.v + NullLit -> null + UndefinedLit -> Unit + is Ident -> scope.get(node.name) + is ArrayLit -> JsList(node.elems.map { evalExpr(it, scope) }.toMutableList()) + is ObjLit -> JsObject(node.pairs.associate { (k, v) -> k to evalExpr(v, scope) }.toMutableMap()) + is FuncExpr -> { + val fn = JsFunction(node.name, node.params, node.body, scope) + if (node.name != null) scope.define(node.name, fn) + fn + } + is SeqExpr -> node.exprs.fold(Unit as Any?) { _, e -> evalExpr(e, scope) } + is TypeofExpr -> { + val v = try { evalExpr(node.expr, scope) } catch (_: Exception) { Unit } + when (v) { + is Unit -> "undefined" + null -> "object" + is Double -> "number" + is Boolean -> "boolean" + is String -> "string" + is JsFunction, is NativeFn -> "function" + else -> "object" + } + } + is UnaryExpr -> evalUnary(node, scope) + is BinExpr -> evalBinary(node, scope) + is AssignExpr -> evalAssign(node, scope) + is CondExpr -> if (toBoolean(evalExpr(node.test, scope))) evalExpr(node.cons, scope) else evalExpr(node.alt, scope) + is MemberExpr -> evalMember(node, scope) + is CallExpr -> evalCall(node, scope) + is NewExpr -> evalNew(node, scope) + else -> Unit + } + + private fun evalUnary(node: UnaryExpr, scope: Scope): Any? { + if (node.op == "++" || node.op == "--") { + val delta = if (node.op == "++") 1.0 else -1.0 + val old = toNumber(evalExpr(node.expr, scope)) + val newVal = old + delta + assignTo(node.expr, newVal, scope) + return if (node.prefix) newVal else old + } + val v = evalExpr(node.expr, scope) + return when (node.op) { + "-" -> -toNumber(v) + "+" -> toNumber(v) + "!" -> !toBoolean(v) + "~" -> toNumber(v).toLong().inv().toDouble() + else -> Unit + } + } + + private fun evalBinary(node: BinExpr, scope: Scope): Any? { + // Short-circuit + if (node.op == "&&") { + val l = evalExpr(node.left, scope) + return if (!toBoolean(l)) l else evalExpr(node.right, scope) + } + if (node.op == "||") { + val l = evalExpr(node.left, scope) + return if (toBoolean(l)) l else evalExpr(node.right, scope) + } + val l = evalExpr(node.left, scope) + val r = evalExpr(node.right, scope) + return when (node.op) { + "+" -> { + val lp = if (l is JsList || l is JsObject || l is NativeFn || l is JsFunction) toJsString(l) else l + val rp = if (r is JsList || r is JsObject || r is NativeFn || r is JsFunction) toJsString(r) else r + if (lp is String || rp is String) toJsString(lp) + toJsString(rp) + else toNumber(lp) + toNumber(rp) + } + "-" -> toNumber(l) - toNumber(r) + "*" -> toNumber(l) * toNumber(r) + "/" -> toNumber(l) / toNumber(r) + "%" -> toNumber(l) % toNumber(r) + "**" -> toNumber(l).pow(toNumber(r)) + "<" -> toNumber(l) < toNumber(r) + "<=" -> toNumber(l) <= toNumber(r) + ">" -> toNumber(l) > toNumber(r) + ">=" -> toNumber(l) >= toNumber(r) + "==" -> looseEq(l, r) + "!=" -> !looseEq(l, r) + "===" -> strictEq(l, r) + "!==" -> !strictEq(l, r) + "&" -> (toNumber(l).toLong() and toNumber(r).toLong()).toDouble() + "|" -> (toNumber(l).toLong() or toNumber(r).toLong()).toDouble() + "^" -> (toNumber(l).toLong() xor toNumber(r).toLong()).toDouble() + "<<" -> (toNumber(l).toLong() shl toNumber(r).toInt()).toDouble() + ">>" -> (toNumber(l).toLong() shr toNumber(r).toInt()).toDouble() + ">>>" -> (toNumber(l).toInt().toLong() and 0xFFFFFFFFL ushr toNumber(r).toInt()).toDouble() + "instanceof" -> when (r) { + is NativeFn -> when (r.name) { + "Array" -> l is JsList + "Object" -> l is JsObject || l is JsList + "Function" -> l is JsFunction || l is NativeFn + "String" -> l is String + "Number" -> l is Double + "Boolean" -> l is Boolean + else -> false + } + is JsFunction -> l is JsObject && l.constructor === r + else -> false + } + "in" -> when (r) { + is JsObject -> toJsString(l) in r.props + is JsList -> toNumber(l).toInt().let { it >= 0 && it < r.elements.size } + else -> false + } + else -> Unit + } + } + + private fun evalAssign(node: AssignExpr, scope: Scope): Any? { + val right = evalExpr(node.right, scope) + val value = if (node.op == "=") right else { + val left = evalExpr(node.left, scope) + when (node.op) { + "+=" -> if (left is String || right is String) toJsString(left) + toJsString(right) else toNumber(left) + toNumber(right) + "-=" -> toNumber(left) - toNumber(right) + "*=" -> toNumber(left) * toNumber(right) + "/=" -> toNumber(left) / toNumber(right) + "%=" -> toNumber(left) % toNumber(right) + "**=" -> toNumber(left).pow(toNumber(right)) + else -> right + } + } + assignTo(node.left, value, scope) + return value + } + + private fun assignTo(target: Node, value: Any?, scope: Scope) { + when (target) { + is Ident -> scope.set(target.name, value) + is MemberExpr -> { + val obj = evalExpr(target.obj, scope) + val key = propKey(target.prop, target.computed, scope) + when (obj) { + is JsObject -> obj.props[key] = value + is JsList -> { + val idx = key.toIntOrNull() + if (idx != null) obj[idx] = value + else if (key == "length") obj.length = toNumber(value).toInt() + } + else -> {} + } + } + // Anything else (e.g. `true++` or `5 = 3`) is not a valid assignment target in + // JS. This would be a SyntaxError/ReferenceError there, so we fail the same way + // here rather than silently doing nothing. + else -> throw RuntimeException("Invalid assignment target: $target") + } + } + + /** Resolves a MemberExpr property node to its string key without unsafe casts. */ + private fun propKey(prop: Node, computed: Boolean, scope: Scope): String = + if (computed) toJsString(evalExpr(prop, scope)) + else (prop as? StrLit)?.v ?: toJsString(evalExpr(prop, scope)) + + private fun evalMember(node: MemberExpr, scope: Scope): Any? { + val obj = evalExpr(node.obj, scope) + val key = propKey(node.prop, node.computed, scope) + return getMember(obj, key) + } + + private fun getMember(obj: Any?, key: String): Any? = when (obj) { + is NativeFn -> obj.props[key] ?: Unit + is JsObject -> obj.props[key] ?: Unit + is JsList -> when (key) { + "length" -> obj.length.toDouble() + "join" -> nativeFn("join") { args -> + val sep = args.getOrNull(0)?.let { toJsString(it) } ?: "," + obj.elements.joinToString(sep) { joinElement(it) } + } + "reverse" -> nativeFn("reverse") { _ -> obj.elements.reverse(); obj } + "push" -> nativeFn("push") { args -> args.forEach { obj.elements.add(it) }; obj.elements.size.toDouble() } + "pop" -> nativeFn("pop") { _ -> if (obj.elements.isEmpty()) Unit else obj.elements.removeAt(obj.elements.size - 1) } + "shift" -> nativeFn("shift") { _ -> if (obj.elements.isEmpty()) Unit else obj.elements.removeAt(0) } + "unshift" -> nativeFn("unshift") { args -> args.reversed().forEach { obj.elements.add(0, it) }; obj.elements.size.toDouble() } + "slice" -> nativeFn("slice") { args -> + val start = args.getOrNull(0)?.let { toNumber(it).toInt() } ?: 0 + val end = args.getOrNull(1)?.let { toNumber(it).toInt() } ?: obj.elements.size + val s = if (start < 0) maxOf(0, obj.elements.size + start) else minOf(start, obj.elements.size) + val e = if (end < 0) maxOf(0, obj.elements.size + end) else minOf(end, obj.elements.size) + JsList(obj.elements.subList(maxOf(0, s), maxOf(s, e)).toMutableList()) + } + "splice" -> nativeFn("splice") { args -> + val start = args.getOrNull(0)?.let { toNumber(it).toInt() }?.let { if (it < 0) maxOf(0, obj.elements.size + it) else minOf(it, obj.elements.size) } ?: 0 + val deleteCount = args.getOrNull(1)?.let { toNumber(it).toInt() }?.coerceIn(0, obj.elements.size - start) ?: (obj.elements.size - start) + val removed = JsList(obj.elements.subList(start, start + deleteCount).toMutableList()) + repeat(deleteCount) { obj.elements.removeAt(start) } + args.drop(2).forEachIndexed { i, v -> obj.elements.add(start + i, v) } + removed + } + "indexOf" -> nativeFn("indexOf") { args -> + val v = args.getOrNull(0); val start = args.getOrNull(1)?.let { toNumber(it).toInt() } ?: 0 + obj.elements.indexOfFirst { strictEq(it, v) }.let { if (it < start) -1.0 else it.toDouble() } + } + "map" -> nativeFn("map") { args -> + val fn = args.getOrNull(0) + JsList(obj.elements.mapIndexed { i, v -> callAny(fn, listOf(v, i.toDouble(), obj), null) }.toMutableList()) + } + "filter" -> nativeFn("filter") { args -> + val fn = args.getOrNull(0) + JsList(obj.elements.filterIndexed { i, v -> toBoolean(callAny(fn, listOf(v, i.toDouble(), obj), null)) }.toMutableList()) + } + "forEach" -> nativeFn("forEach") { args -> + val fn = args.getOrNull(0) + obj.elements.forEachIndexed { i, v -> callAny(fn, listOf(v, i.toDouble(), obj), null) } + Unit + } + "reduce" -> nativeFn("reduce") { args -> + val fn = args.getOrNull(0) + var acc: Any? = if (args.size > 1) args[1] else obj.elements.firstOrNull() ?: Unit + val startIdx = if (args.size > 1) 0 else 1 + for (i in startIdx until obj.elements.size) acc = callAny(fn, listOf(acc, obj.elements[i], i.toDouble(), obj), null) + acc + } + "concat" -> nativeFn("concat") { args -> + val result = JsList(obj.elements.toMutableList()) + args.forEach { a -> when (a) { is JsList -> result.elements.addAll(a.elements); else -> result.elements.add(a) } } + result + } + "find" -> nativeFn("find") { args -> + val fn = args.getOrNull(0) + obj.elements.firstOrNull { toBoolean(callAny(fn, listOf(it), null)) } ?: Unit + } + "some" -> nativeFn("some") { args -> + val fn = args.getOrNull(0) + obj.elements.any { toBoolean(callAny(fn, listOf(it), null)) } + } + "every" -> nativeFn("every") { args -> + val fn = args.getOrNull(0) + obj.elements.all { toBoolean(callAny(fn, listOf(it), null)) } + } + "sort" -> nativeFn("sort") { args -> + val fn = args.getOrNull(0) + if (fn == null) obj.elements.sortWith { a, b -> toJsString(a).compareTo(toJsString(b)) } + else obj.elements.sortWith { a, b -> toNumber(callAny(fn, listOf(a, b), null)).toInt() } + obj + } + "includes" -> nativeFn("includes") { args -> obj.elements.any { looseEq(it, args.getOrNull(0)) } } + "toString" -> nativeFn("toString") { _ -> obj.elements.joinToString(",") { joinElement(it) } } + "flat" -> nativeFn("flat") { _ -> + val result = JsList() + obj.elements.forEach { if (it is JsList) result.elements.addAll(it.elements) else result.elements.add(it) } + result + } + else -> key.toIntOrNull()?.let { obj[it] } ?: Unit + } + is String -> when (key) { + "length" -> obj.length.toDouble() + "split" -> nativeFn("split") { args -> + val sep = args.getOrNull(0) + when { + sep == null || sep is Unit -> JsList(mutableListOf(obj)) + sep is String && sep.isEmpty() -> JsList(obj.map { it.toString() as Any? }.toMutableList()) + sep is String -> JsList(obj.split(sep).map { it as Any? }.toMutableList()) + else -> JsList(obj.split(toJsString(sep)).map { it as Any? }.toMutableList()) + } + } + "join" -> nativeFn("join") { args -> obj } // strings don't have join but just in case + "replace" -> nativeFn("replace") { args -> + val from = args.getOrNull(0); val to = toJsString(args.getOrNull(1)) + when (from) { + is String -> obj.replaceFirst(from, to) + else -> obj.replace(toJsString(from), to) + } + } + "replaceAll" -> nativeFn("replaceAll") { args -> + val from = args.getOrNull(0); val to = toJsString(args.getOrNull(1)) + obj.replace(toJsString(from), to) + } + "indexOf" -> nativeFn("indexOf") { args -> obj.indexOf(toJsString(args.getOrNull(0))).toDouble() } + "lastIndexOf" -> nativeFn("lastIndexOf") { args -> obj.lastIndexOf(toJsString(args.getOrNull(0))).toDouble() } + "includes" -> nativeFn("includes") { args -> obj.contains(toJsString(args.getOrNull(0))) } + "startsWith" -> nativeFn("startsWith") { args -> obj.startsWith(toJsString(args.getOrNull(0))) } + "endsWith" -> nativeFn("endsWith") { args -> obj.endsWith(toJsString(args.getOrNull(0))) } + "slice" -> nativeFn("slice") { args -> + val start = args.getOrNull(0)?.let { toNumber(it).toInt() }?.let { if (it < 0) maxOf(0, obj.length + it) else minOf(it, obj.length) } ?: 0 + val end = args.getOrNull(1)?.let { toNumber(it).toInt() }?.let { if (it < 0) maxOf(0, obj.length + it) else minOf(it, obj.length) } ?: obj.length + if (end <= start) "" else obj.substring(start, end) + } + "substr" -> nativeFn("substr") { args -> + val start = args.getOrNull(0)?.let { toNumber(it).toInt() }?.let { if (it < 0) maxOf(0, obj.length + it) else minOf(it, obj.length) } ?: 0 + val len = args.getOrNull(1)?.let { toNumber(it).toInt() } ?: (obj.length - start) + if (len <= 0) "" else obj.substring(start, minOf(start + len, obj.length)) + } + "substring" -> nativeFn("substring") { args -> + val a = args.getOrNull(0)?.let { toNumber(it).toInt().coerceIn(0, obj.length) } ?: 0 + val b = args.getOrNull(1)?.let { toNumber(it).toInt().coerceIn(0, obj.length) } ?: obj.length + obj.substring(minOf(a, b), maxOf(a, b)) + } + "charAt" -> nativeFn("charAt") { args -> + val i = args.getOrNull(0)?.let { toNumber(it).toInt() } ?: 0 + if (i < 0 || i >= obj.length) "" else obj[i].toString() + } + "charCodeAt" -> nativeFn("charCodeAt") { args -> + val i = args.getOrNull(0)?.let { toNumber(it).toInt() } ?: 0 + if (i < 0 || i >= obj.length) Double.NaN else obj[i].code.toDouble() + } + "codePointAt" -> nativeFn("codePointAt") { args -> + val i = args.getOrNull(0)?.let { toNumber(it).toInt() } ?: 0 + if (i < 0 || i >= obj.length) Double.NaN else obj[i].code.toDouble() + } + "toUpperCase", "toLocaleUpperCase" -> nativeFn("toUpperCase") { _ -> obj.uppercase() } + "toLowerCase", "toLocaleLowerCase" -> nativeFn("toLowerCase") { _ -> obj.lowercase() } + "trim" -> nativeFn("trim") { _ -> obj.trim() } + "trimStart", "trimLeft" -> nativeFn("trimStart") { _ -> obj.trimStart() } + "trimEnd", "trimRight" -> nativeFn("trimEnd") { _ -> obj.trimEnd() } + "repeat" -> nativeFn("repeat") { args -> obj.repeat(toNumber(args.getOrNull(0)).toInt().coerceAtLeast(0)) } + "padStart" -> nativeFn("padStart") { args -> + val len = toNumber(args.getOrNull(0)).toInt(); val pad = args.getOrNull(1)?.let { toJsString(it) } ?: " " + if (obj.length >= len) obj else (pad.repeat(len) + obj).takeLast(len) + } + "padEnd" -> nativeFn("padEnd") { args -> + val len = toNumber(args.getOrNull(0)).toInt(); val pad = args.getOrNull(1)?.let { toJsString(it) } ?: " " + if (obj.length >= len) obj else (obj + pad.repeat(len)).take(len) + } + "toString" -> nativeFn("toString") { _ -> obj } + "valueOf" -> nativeFn("valueOf") { _ -> obj } + "match" -> nativeFn("match") { args -> + val pattern = toJsString(args.getOrNull(0)) + try { + val result = Regex(pattern).find(obj) + if (result == null) null + else JsList(result.groupValues.map { it as Any? }.toMutableList()) + } catch (_: Exception) { null } + } + else -> key.toIntOrNull()?.let { + if (it >= 0 && it < obj.length) obj[it].toString() else Unit + } ?: Unit + } + is Double -> when (key) { + "toString" -> nativeFn("toString") { args -> + val radix = args.getOrNull(0)?.let { toNumber(it).toInt() } ?: 10 + if (radix == 10) toJsString(obj) else obj.toLong().toString(radix) + } + "toFixed" -> nativeFn("toFixed") { args -> + val digits = (args.getOrNull(0)?.let { toNumber(it).toInt() } ?: 0).coerceIn(0, 20) + val factor = 10.0.pow(digits) + val rounded = round(obj * factor) / factor + val sign = if (rounded < 0) "-" else "" + val absVal = abs(rounded) + val intPart = absVal.toLong() + val fracPart = round((absVal - intPart) * factor).toLong() + val fracStr = fracPart.toString().padStart(digits, '0') + if (digits == 0) "$sign$intPart" else "$sign$intPart.$fracStr" + } + else -> Unit + } + else -> Unit + } + + private fun evalCall(node: CallExpr, scope: Scope): Any? { + val (callee, thisVal) = resolveCallee(node.callee, scope) + val args = node.args.map { evalExpr(it, scope) } + return callAny(callee, args, thisVal) + } + + private fun resolveCallee(calleeNode: Node, scope: Scope): Pair { + return if (calleeNode is MemberExpr) { + val obj = evalExpr(calleeNode.obj, scope) + val key = propKey(calleeNode.prop, calleeNode.computed, scope) + getMember(obj, key) to obj + } else { + evalExpr(calleeNode, scope) to null + } + } + + private fun evalNew(node: NewExpr, scope: Scope): Any? { + val callee = evalExpr(node.callee, scope) + val args = node.args.map { evalExpr(it, scope) } + // NativeFn constructors (e.g. Array) return their value directly + if (callee is NativeFn) return callee.fn(args) + val thisVal = JsObject(constructor = callee as? JsFunction) + val result = callAny(callee, args, thisVal) + // JS 'new' returns the constructed object unless the constructor explicitly returns an object + return if (result is JsObject) result else thisVal + } + + private fun callAny(callee: Any?, args: List, thisVal: Any?): Any? = when (callee) { + is NativeFn -> callee.fn(args) + is JsFunction -> { + val fnScope = Scope(callee.closure) + fnScope.define("this", thisVal) + fnScope.define("arguments", JsList(args.toMutableList())) + callee.params.forEachIndexed { i, p -> fnScope.define(p, args.getOrElse(i) { Unit }) } + try { + var last: Any? = Unit + for (s in callee.body) last = execNode(s, fnScope) + last + } catch (r: ReturnSignal) { + r.value + } + } + else -> Unit + } +} + +// Wrapper so we can store Kotlin lambdas as "callable" values +private class NativeFn(val fn: (List) -> Any?, val name: String, val props: MutableMap = mutableMapOf()) { + override fun toString(): String = "function $name() { [native code] }" +} diff --git a/library/src/commonTest/kotlin/com/lagradost/cloudstream3/utils/JsInterpreterTest.kt b/library/src/commonTest/kotlin/com/lagradost/cloudstream3/utils/JsInterpreterTest.kt new file mode 100644 index 000000000..182ea6c95 --- /dev/null +++ b/library/src/commonTest/kotlin/com/lagradost/cloudstream3/utils/JsInterpreterTest.kt @@ -0,0 +1,2410 @@ +package com.lagradost.cloudstream3.utils + +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Job +import kotlinx.coroutines.cancel +import kotlinx.coroutines.channels.Channel +import kotlinx.coroutines.launch +import kotlinx.coroutines.test.runTest +import kotlinx.coroutines.withTimeout +import kotlinx.coroutines.withTimeoutOrNull +import kotlin.math.E +import kotlin.math.PI +import kotlin.math.abs +import kotlin.test.Test +import kotlin.test.assertEquals +import kotlin.test.assertNull +import kotlin.test.assertTrue +import kotlin.test.assertFailsWith +import kotlin.test.assertFalse +import kotlin.time.Duration +import kotlin.time.Duration.Companion.milliseconds +import kotlin.time.Duration.Companion.seconds +import kotlin.time.TimeSource + +class JsInterpreterTest { + + private fun bool(code: String, variable: String? = null): Boolean = evalJsInternal(code, variable) as? Boolean ?: false + private fun num(code: String, variable: String? = null): Double = evalJsInternal(code, variable) as? Double ?: Double.NaN + private fun str(code: String, variable: String? = null): String = jsValueToString(evalJsInternal(code, variable)) + + private fun assertApprox(expected: Double, actual: Double, tol: Double = 1e-9) { + assertTrue(abs(actual - expected) <= tol, "Expected $expected ± $tol but was $actual") + } + + @Test + fun integerLiteral() { + assertEquals(42.0, num("42")) + } + + @Test + fun negativeLiteral() { + assertEquals(-7.0, num("-7")) + } + + @Test + fun floatLiteral() { + assertApprox(3.14, num("3.14")) + } + + @Test + fun hexLiteral() { + assertEquals(255.0, num("0xff")) + } + + @Test + fun stringLiteralDouble() { + assertEquals("hi", str("\"hi\"")) + } + + @Test + fun stringLiteralSingle() { + assertEquals("hi", str("'hi'")) + } + + @Test + fun templateLiteral() { + assertEquals("hi", str("`hi`")) + } + + @Test + fun booleanTrue() { + assertTrue(bool("true")) + } + + @Test + fun booleanFalse() { + assertFalse(bool("false")) + } + + @Test + fun nullLiteral() { + assertNull(evalJsInternal("null")) + } + + @Test + fun undefinedLiteral() { + assertEquals(Unit, evalJsInternal("undefined")) + } + + @Test + fun addition() { + assertEquals(5.0, num("2+3")) + } + + @Test + fun subtraction() { + assertEquals(1.0, num("3-2")) + } + + @Test + fun multiplication() { + assertEquals(6.0, num("2*3")) + } + + @Test + fun division() { + assertEquals(2.5, num("5/2")) + } + + @Test + fun modulo() { + assertEquals(1.0, num("7%3")) + } + + @Test + fun operatorPrecedence() { + assertEquals(7.0, num("1+2*3")) + } + + @Test + fun parenthesesOverride() { + assertEquals(9.0, num("(1+2)*3")) + } + + @Test + fun unaryMinus() { + assertEquals(-5.0, num("-(2+3)")) + } + + @Test + fun unaryPlusCoerces() { + assertEquals(3.0, num("+'3'")) + } + + @Test + fun stringMinusNumberCoercesToNumber() { + // "3" - 1 => 2 (JS coerces string to number for subtraction) + assertEquals(2.0, num("'3'-1")) + } + + @Test + fun stringTimesStringCoercesToNumber() { + // "3" * "4" => 12 + assertEquals(12.0, num("'3'*'4'")) + } + + @Test + fun nanArithmetic() { + // NaN + 1 => NaN + assertTrue(num("NaN+1").isNaN()) + } + + @Test + fun infinityPositive() { + assertTrue(num("Infinity").isInfinite() && num("Infinity") > 0) + } + + @Test + fun infinityArithmetic() { + assertTrue(num("Infinity+1").isInfinite()) + } + + @Test + fun divisionByZeroIsInfinity() { + assertTrue(num("1/0").isInfinite() && num("1/0") > 0) + } + + @Test + fun bitwiseAnd() { + assertEquals(2.0, num("6&3")) + } + + @Test + fun bitwiseOr() { + assertEquals(7.0, num("5|3")) + } + + @Test + fun bitwiseXor() { + assertEquals(6.0, num("5^3")) + } + + @Test + fun bitwiseNot() { + assertEquals(-6.0, num("~5")) + } + + @Test + fun bitwiseNotOnNegative() { + assertEquals(4.0, num("~(-5)")) + } + + @Test + fun bitwiseNotTruncatesFloat() { + // ~3.9 == ~3 == -4 + assertEquals(-4.0, num("~3.9")) + } + + @Test + fun leftShift() { + assertEquals(20.0, num("5<<2")) + } + + @Test + fun rightShift() { + assertEquals(1.0, num("5>>2")) + } + + @Test + fun unsignedRightShift() { + assertEquals(1.0, num("5>>>2")) + } + + @Test + fun unsignedRightShiftOnNegative() { + // (-1 >>> 0) in JS == 4294967295 (treats as unsigned 32-bit) + assertEquals(4294967295.0, num("-1>>>0")) + } + + @Test + fun bitwiseOrWithZeroTruncatesFloat() { + // 3.9|0 == 3 (common JS truncation idiom) + assertEquals(3.0, num("3.9|0")) + } + + @Test + fun lessThanTrue() { + assertTrue(bool("1<2")) + } + + @Test + fun lessThanFalse() { + assertFalse(bool("2<1")) + } + + @Test + fun greaterThanTrue() { + assertTrue(bool("2>1")) + } + + @Test + fun lessThanOrEqualEqual() { + assertTrue(bool("2<=2")) + } + + @Test + fun greaterThanOrEqualEqual() { + assertTrue(bool("2>=2")) + } + + @Test + fun looseEqNumberString() { + assertTrue(bool("1=='1'")) + } + + @Test + fun looseEqNullUndefined() { + // null == undefined is true in JS + assertTrue(bool("null==undefined")) + } + + @Test + fun looseEqNullNotZero() { + // null == 0 is false in JS + assertFalse(bool("null==0")) + } + + @Test + fun looseNeqWorks() { + assertTrue(bool("1!='2'")) + } + + @Test + fun strictEqSameType() { + assertTrue(bool("1===1")) + } + + @Test + fun strictEqDifferentType() { + assertFalse(bool("1==='1'")) + } + + @Test + fun strictNeq() { + assertTrue(bool("1!=='1'")) + } + + @Test + fun instanceofArrayTrue() { + assertTrue(bool("[] instanceof Array")) + } + + @Test + fun instanceofArrayFalseForObject() { + assertFalse(bool("({}) instanceof Array")) + } + + @Test + fun instanceofObjectTrueForPlainObject() { + assertTrue(bool("({}) instanceof Object")) + } + + @Test + fun instanceofObjectTrueForArray() { + // Arrays are objects in JS + assertTrue(bool("[] instanceof Object")) + } + + @Test + fun instanceofFunctionTrue() { + assertTrue(bool("(function(){}) instanceof Function")) + } + + @Test + fun instanceofFunctionFalseForArray() { + assertFalse(bool("[] instanceof Function")) + } + + @Test + fun instanceofUserDefinedConstructorTrue() { + assertTrue(bool("function Dog(){} var d = new Dog(); d instanceof Dog")) + } + + @Test + fun instanceofUserDefinedConstructorFalseForOtherClass() { + assertFalse(bool("function Cat(){} function Dog(){} var d = new Dog(); d instanceof Cat")) + } + + @Test + fun instanceofUserDefinedConstructorFalseForPlainObject() { + assertFalse(bool("function Dog(){} ({}) instanceof Dog")) + } + + @Test + fun instanceofUserDefinedConstructorWithProperties() { + val code = """ + function Point(x, y) { this.x = x; this.y = y; } + var p = new Point(1, 2); + (p instanceof Point) && p.x === 1 && p.y === 2 + """.trimIndent() + assertTrue(bool(code)) + } + + @Test + fun inOperatorOnObject() { + assertTrue(bool("'a' in {a:1}")) + } + + @Test + fun inOperatorOnObjectMissing() { + assertFalse(bool("'z' in {a:1}")) + } + + @Test + fun inOperatorOnArray() { + assertTrue(bool("0 in [10,20]")) + } + + @Test + fun logicalAndRightWhenLeftTruthy() { + assertEquals(2.0, num("1&&2")) + } + + @Test + fun logicalAndLeftWhenLeftFalsy() { + assertEquals(0.0, num("0&&2")) + } + + @Test + fun logicalOrLeftWhenTruthy() { + assertEquals(1.0, num("1||2")) + } + + @Test + fun logicalOrRightWhenLeftFalsy() { + assertEquals(2.0, num("0||2")) + } + + @Test + fun logicalNot() { + assertTrue(bool("!false")) + } + + @Test + fun logicalNotOnZero() { + assertTrue(bool("!0")) + } + + @Test + fun logicalNotOnEmptyString() { + assertTrue(bool("!''")) + } + + @Test + fun logicalNotOnNonEmptyString() { + assertFalse(bool("!'x'")) + } + + @Test + fun ternaryTrueBranch() { + assertEquals(1.0, num("true?1:2")) + } + + @Test + fun ternaryFalseBranch() { + assertEquals(2.0, num("false?1:2")) + } + + @Test + fun nestedTernary() { + // 1>2 ? 'a' : 3>2 ? 'b' : 'c' => 'b' + assertEquals("b", str("1>2?'a':3>2?'b':'c'")) + } + + @Test + fun varDeclarationAndRead() { + assertEquals(10.0, num("var x=10; x")) + } + + @Test + fun letDeclaration() { + assertEquals("hello", str("let s='hello'; s")) + } + + @Test + fun constDeclaration() { + assertApprox(3.14, num("const PI=3.14; PI")) + } + + @Test + fun multiVarDeclaration() { + assertEquals(3.0, num("var a=1, b=2; a+b")) + } + + @Test + fun assignmentPlusEquals() { + assertEquals(15.0, num("var x=10; x+=5; x")) + } + + @Test + fun assignmentMinusEquals() { + assertEquals(5.0, num("var x=10; x-=5; x")) + } + + @Test + fun assignmentTimesEquals() { + assertEquals(20.0, num("var x=4; x*=5; x")) + } + + @Test + fun assignmentDivideEquals() { + assertEquals(5.0, num("var x=10; x/=2; x")) + } + + @Test + fun assignmentModuloEquals() { + assertEquals(1.0, num("var x=7; x%=3; x")) + } + + @Test + fun prefixIncrement() { + assertEquals(6.0, num("var x=5; ++x")) + } + + @Test + fun postfixIncrementReturnsOldValue() { + assertEquals(5.0, num("var x=5; x++")) + } + + @Test + fun postfixIncrementMutatesVariable() { + assertEquals(6.0, num("var x=5; x++; x")) + } + + @Test + fun prefixDecrement() { + assertEquals(4.0, num("var x=5; --x")) + } + + @Test + fun postfixDecrement() { + assertEquals(5.0, num("var x=5; x--")) + } + + @Test + fun postfixDecrementMutates() { + assertEquals(4.0, num("var x=5; x--; x")) + } + + @Test + fun commaOperatorReturnsLast() { + // Sequence/comma expression: (1, 2, 3) => 3 + assertEquals(3.0, num("(1,2,3)")) + } + + @Test + fun typeofNumber() { + assertEquals("number", str("typeof 42")) + } + + @Test + fun typeofString() { + assertEquals("string", str("typeof 'x'")) + } + + @Test + fun typeofBoolean() { + assertEquals("boolean", str("typeof true")) + } + + @Test + fun typeofUndefined() { + assertEquals("undefined", str("typeof undefined")) + } + + @Test + fun typeofFunction() { + assertEquals("function", str("typeof function(){}")) + } + + @Test + fun typeofNull() { + // typeof null === "object" in JS + assertEquals("object", str("typeof null")) + } + + @Test + fun typeofObject() { + assertEquals("object", str("typeof {}")) + } + + @Test + fun typeofArray() { + assertEquals("object", str("typeof []")) + } + + @Test + fun typeofUndeclaredVariable() { + // typeof on an undeclared variable should not throw, returns "undefined" + assertEquals("undefined", str("typeof neverDeclaredXyz")) + } + + @Test + fun voidOperator() { + assertEquals(Unit, evalJsInternal("void 0")) + } + + @Test + fun voidOperatorOnExpression() { + assertEquals(Unit, evalJsInternal("void (1+2)")) + } + + @Test + fun stringConcatenation() { + assertEquals("ab", str("'a'+'b'")) + } + + @Test + fun numberPlusStringCoercesToString() { + assertEquals("1x", str("1+'x'")) + } + + @Test + fun stringLength() { + assertEquals(5.0, num("'hello'.length")) + } + + @Test + fun stringCharAt() { + assertEquals("e", str("'hello'.charAt(1)")) + } + + @Test + fun stringCharAtOutOfRange() { + assertEquals("", str("'hello'.charAt(99)")) + } + + @Test + fun stringCharCodeAt() { + assertEquals(104.0, num("'hello'.charCodeAt(0)")) + } + + @Test + fun stringCodePointAt() { + assertEquals(104.0, num("'hello'.codePointAt(0)")) + } + + @Test + fun stringBracketIndexing() { + // 'hello'[1] === 'e' + assertEquals("e", str("'hello'[1]")) + } + + @Test + fun stringBracketIndexingFirst() { + assertEquals("h", str("'hello'[0]")) + } + + @Test + fun stringIndexOfFound() { + assertEquals(1.0, num("'hello'.indexOf('e')")) + } + + @Test + fun stringIndexOfNotFound() { + assertEquals(-1.0, num("'hello'.indexOf('z')")) + } + + @Test + fun stringLastIndexOf() { + assertEquals(3.0, num("'abcabc'.lastIndexOf('a')")) + } + + @Test + fun stringLastIndexOfNotFound() { + assertEquals(-1.0, num("'hello'.lastIndexOf('z')")) + } + + @Test + fun stringSlice() { + assertEquals("ell", str("'hello'.slice(1,4)")) + } + + @Test + fun stringSliceNegativeIndex() { + assertEquals("lo", str("'hello'.slice(-2)")) + } + + @Test + fun stringSliceNegativeEnd() { + assertEquals("hel", str("'hello'.slice(0,-2)")) + } + + @Test + fun stringSubstr() { + assertEquals("ell", str("'hello'.substr(1,3)")) + } + + @Test + fun stringSubstring() { + assertEquals("ell", str("'hello'.substring(1,4)")) + } + + @Test + fun stringSubstringSwapsArgs() { + // substring swaps start/end if start > end + assertEquals("ell", str("'hello'.substring(4,1)")) + } + + @Test + fun stringSplitAndJoin() { + assertEquals("a-b-c", str("'a|b|c'.split('|').join('-')")) + } + + @Test + fun stringSplitEmptySepGivesChars() { + assertEquals("h,e,l,l,o", str("'hello'.split('').join(',')")) + } + + @Test + fun stringReplaceFirstOccurrence() { + assertEquals("xbc", str("'abc'.replace('a','x')")) + } + + @Test + fun stringReplaceAll() { + assertEquals("xbxbxb", str("'ababab'.replace('a','x').replace('a','x').replace('a','x')")) + } + + @Test + fun stringReplaceAllMethod() { + assertEquals("xbxbxb", str("'ababab'.replaceAll('a','x')")) + } + + @Test + fun stringToUpperCase() { + assertEquals("HELLO", str("'hello'.toUpperCase()")) + } + + @Test + fun stringToLowerCase() { + assertEquals("hello", str("'HELLO'.toLowerCase()")) + } + + @Test + fun stringTrim() { + assertEquals("hi", str("' hi '.trim()")) + } + + @Test + fun stringTrimStart() { + assertEquals("hi ", str("' hi '.trimStart()")) + } + + @Test + fun stringTrimEnd() { + assertEquals(" hi", str("' hi '.trimEnd()")) + } + + @Test + fun stringRepeat() { + assertEquals("aaa", str("'a'.repeat(3)")) + } + + @Test + fun stringRepeatZero() { + assertEquals("", str("'a'.repeat(0)")) + } + + @Test + fun stringPadStart() { + assertEquals("005", str("'5'.padStart(3,'0')")) + } + + @Test + fun stringPadEnd() { + assertEquals("500", str("'5'.padEnd(3,'0')")) + } + + @Test + fun stringPadStartNoOpWhenLongEnough() { + assertEquals("hello", str("'hello'.padStart(3,'0')")) + } + + @Test + fun stringIncludes() { + assertTrue(bool("'hello'.includes('ell')")) + } + + @Test + fun stringIncludesFalse() { + assertFalse(bool("'hello'.includes('xyz')")) + } + + @Test + fun stringStartsWith() { + assertTrue(bool("'hello'.startsWith('hel')")) + } + + @Test + fun stringEndsWith() { + assertTrue(bool("'hello'.endsWith('llo')")) + } + + @Test + fun stringFromCharCode() { + assertEquals("A", str("String.fromCharCode(65)")) + } + + @Test + fun stringFromCharCodeMultiple() { + assertEquals("Hi", str("String.fromCharCode(72,105)")) + } + + @Test + fun stringToString() { + assertEquals("hello", str("'hello'.toString()")) + } + + @Test + fun stringMatch() { + // match returns array of groups; [0] is the full match + assertEquals("ell", str("'hello'.match('ell')[0]")) + } + + @Test + fun stringMatchNoMatch() { + assertNull(evalJsInternal("'hello'.match('xyz')")) + } + + @Test + fun numberToStringRadix16() { + assertEquals("ff", str("(255).toString(16)")) + } + + @Test + fun numberToStringRadix2() { + assertEquals("1010", str("(10).toString(2)")) + } + + @Test + fun numberToFixed() { + assertEquals("3.14", str("(3.14159).toFixed(2)")) + } + + @Test + fun toFixedZeroDigits() { + assertEquals("4", str("(3.6).toFixed(0)")) + } + + @Test + fun toFixedTwoDigits() { + assertEquals("3.14", str("(3.14159).toFixed(2)")) + } + + @Test + fun toFixedPadsWithZeroes() { + assertEquals("3.10", str("(3.1).toFixed(2)")) + } + + @Test + fun toFixedNegativeNumber() { + assertEquals("-3.14", str("(-3.14159).toFixed(2)")) + } + + @Test + fun toFixedNegativeBetweenZeroAndMinusOne() { + assertEquals("-0.50", str("(-0.5).toFixed(2)")) + } + + @Test + fun toFixedWholeNumber() { + assertEquals("5.00", str("(5).toFixed(2)")) + } + + @Test + fun toFixedZeroValue() { + assertEquals("0.00", str("(0).toFixed(2)")) + } + + @Test + fun arrayLiteralAndLength() { + assertEquals(3.0, num("[1,2,3].length")) + } + + @Test + fun arrayIndexAccess() { + assertEquals(2.0, num("[1,2,3][1]")) + } + + @Test + fun arrayJoin() { + assertEquals("1,2,3", str("[1,2,3].join(',')")) + } + + @Test + fun arrayJoinDefaultSep() { + assertEquals("1,2,3", str("[1,2,3].join()")) + } + + @Test + fun arrayReverse() { + assertEquals("3,2,1", str("[1,2,3].reverse().join(',')")) + } + + @Test + fun arrayPushReturnsNewLength() { + assertEquals(4.0, num("var a=[1,2,3]; a.push(4)")) + } + + @Test + fun arrayPushMutates() { + assertEquals("1,2,3,4", str("var a=[1,2,3]; a.push(4); a.join(',')")) + } + + @Test + fun arrayPopRemovesLastElement() { + assertEquals(3.0, num("var a=[1,2,3]; a.pop()")) + } + + @Test + fun arrayPopMutates() { + assertEquals("1,2", str("var a=[1,2,3]; a.pop(); a.join(',')")) + } + + @Test + fun arrayShift() { + assertEquals(1.0, num("var a=[1,2,3]; a.shift()")) + } + + @Test + fun arrayShiftMutates() { + assertEquals("2,3", str("var a=[1,2,3]; a.shift(); a.join(',')")) + } + + @Test + fun arrayUnshift() { + assertEquals(4.0, num("var a=[2,3,4]; a.unshift(1)")) + } + + @Test + fun arrayUnshiftMutates() { + assertEquals("1,2,3,4", str("var a=[2,3,4]; a.unshift(1); a.join(',')")) + } + + @Test + fun arraySlice() { + assertEquals("2,3", str("[1,2,3,4].slice(1,3).join(',')")) + } + + @Test + fun arraySliceNegative() { + assertEquals("3,4", str("[1,2,3,4].slice(-2).join(',')")) + } + + @Test + fun arraySpliceRemove() { + assertEquals("2,3", str("var a=[1,2,3,4]; a.splice(1,2).join(',')")) + } + + @Test + fun arraySpliceMutates() { + assertEquals("1,4", str("var a=[1,2,3,4]; a.splice(1,2); a.join(',')")) + } + + @Test + fun arraySpliceInsert() { + assertEquals("1,9,8,4", str("var a=[1,2,3,4]; a.splice(1,2,9,8); a.join(',')")) + } + + @Test + fun arrayMap() { + assertEquals("2,4,6", str("[1,2,3].map(function(x){return x*2}).join(',')")) + } + + @Test + fun arrayFilter() { + assertEquals("2,4", str("[1,2,3,4].filter(function(x){return x%2===0}).join(',')")) + } + + @Test + fun arrayReduce() { + assertEquals(10.0, num("[1,2,3,4].reduce(function(acc,x){return acc+x},0)")) + } + + @Test + fun arrayReduceNoInitial() { + assertEquals(10.0, num("[1,2,3,4].reduce(function(acc,x){return acc+x})")) + } + + @Test + fun arrayForEachSideEffect() { + assertEquals(6.0, num("var s=0; [1,2,3].forEach(function(x){s+=x}); s")) + } + + @Test + fun arrayFind() { + assertEquals(3.0, num("[1,2,3,4].find(function(x){return x>2})")) + } + + @Test + fun arrayFindNotFound() { + assertEquals(Unit, evalJsInternal("[1,2,3].find(function(x){return x>9})")) + } + + @Test + fun arrayIndexOf() { + assertEquals(2.0, num("[10,20,30].indexOf(30)")) + } + + @Test + fun arrayIndexOfNotFound() { + assertEquals(-1.0, num("[10,20,30].indexOf(99)")) + } + + @Test + fun arrayIncludes() { + assertTrue(bool("[1,2,3].includes(2)")) + } + + @Test + fun arrayIncludesFalse() { + assertFalse(bool("[1,2,3].includes(9)")) + } + + @Test + fun arrayConcat() { + assertEquals("1,2,3,4", str("[1,2].concat([3,4]).join(',')")) + } + + @Test + fun arraySome() { + assertTrue(bool("[1,2,3].some(function(x){return x>2})")) + } + + @Test + fun arraySomeFalse() { + assertFalse(bool("[1,2,3].some(function(x){return x>9})")) + } + + @Test + fun arrayEvery() { + assertFalse(bool("[1,2,3].every(function(x){return x>2})")) + } + + @Test + fun arrayEveryTrue() { + assertTrue(bool("[3,4,5].every(function(x){return x>2})")) + } + + @Test + fun arraySortDefault() { + // Default sort is lexicographic: [10,9,2] => [10,2,9] + assertEquals("10,2,9", str("[10,9,2].sort().join(',')")) + } + + @Test + fun arraySortWithComparator() { + assertEquals("1,2,10", str("[10,1,2].sort(function(a,b){return a-b}).join(',')")) + } + + @Test + fun arrayFlat() { + assertEquals("1,2,3,4", str("[[1,2],[3,4]].flat().join(',')")) + } + + @Test + fun arrayToString() { + assertEquals("1,2,3", str("[1,2,3].toString()")) + } + + @Test + fun newArrayWithSize() { + assertEquals(5.0, num("new Array(5).length")) + } + + @Test + fun objectPropertyAccessWithDot() { + assertEquals(1.0, num("var o={a:1}; o.a")) + } + + @Test + fun objectPropertyAccessWithBracket() { + assertEquals(2.0, num("var o={b:2}; o['b']")) + } + + @Test + fun objectPropertyAssignment() { + assertEquals(99.0, num("var o={}; o.x=99; o.x")) + } + + @Test + fun objectKeys() { + assertEquals("a,b", str("Object.keys({a:1,b:2}).join(',')")) + } + + @Test + fun objectValues() { + assertEquals("1,2", str("Object.values({a:1,b:2}).join(',')")) + } + + @Test + fun objectToStringCoercion() { + // ({}) + "" => "[object Object]" + assertEquals("[object Object]", str("({})+''")) + + // []+{} => "[object Object]" + assertEquals("[object Object]", str("[]+{}")) + } + + @Test + fun ifTrueBranch() { + assertEquals(1.0, num("var r=0; if(true){r=1} r")) + } + + @Test + fun ifFalseUsesElse() { + assertEquals(2.0, num("var r=0; if(false){r=1}else{r=2} r")) + } + + @Test + fun ifElseIfChain() { + assertEquals(2.0, num("var x=5; var r=0; if(x<3){r=1}else if(x<7){r=2}else{r=3} r")) + } + + @Test + fun whileLoop() { + assertEquals(10.0, num("var i=0; while(i<10){i++} i")) + } + + @Test + fun whileBreak() { + assertEquals(5.0, num("var i=0; while(true){if(i===5)break; i++} i")) + } + + @Test + fun whileContinue() { + assertEquals(25.0, num("var i=0; var s=0; while(i<10){i++; if(i%2===0)continue; s+=i} s")) + } + + @Test + fun forLoop() { + assertEquals(10.0, num("var s=0; for(var i=1;i<=4;i++){s+=i} s")) + } + + @Test + fun forLoopWithBreak() { + assertEquals(3.0, num("var i; for(i=0;i<10;i++){if(i===3)break} i")) + } + + @Test + fun forLoopNoInitTestUpdate() { + // All three parts optional; behaves like while(true) with internal break + assertEquals(3.0, num("var i=0; for(;;){if(i>=3)break; i++} i")) + } + + @Test + fun forInOverObjectKeys() { + assertEquals("a,b,c", str("var o={a:1,b:2,c:3}; var keys=[]; for(var k in o){keys.push(k)} keys.sort().join(',')")) + } + + @Test + fun forInOverArrayGivesIndices() { + assertEquals("0,1,2", str("var a=[10,20,30]; var idx=[]; for(var i in a){idx.push(i)} idx.join(',')")) + } + + @Test + fun namedFunctionDeclarationAndCall() { + assertEquals(7.0, num("function add(a,b){return a+b} add(3,4)")) + } + + @Test + fun anonymousFunctionExpression() { + assertEquals(12.0, num("var mul=function(a,b){return a*b}; mul(3,4)")) + } + + @Test + fun recursiveFunction() { + assertEquals(120.0, num("function fact(n){if(n<=1)return 1; return n*fact(n-1)} fact(5)")) + } + + @Test + fun closureCapturesOuterVariable() { + assertEquals(3.0, num("var c=0; function inc(){c+=1} inc();inc();inc(); c")) + } + + @Test + fun immediatelyInvokedFunctionExpression() { + assertEquals(9.0, num("(function(x){return x*x})(3)")) + } + + @Test + fun functionAsArgument() { + assertEquals(6.0, num("function apply(f,x){return f(x)} apply(function(n){return n+1},5)")) + } + + @Test + fun nestedClosure() { + val code = """ + function makeAdder(n) { + return function(x) { return x + n; } + } + var add5 = makeAdder(5); + add5(3) + """.trimIndent() + assertEquals(8.0, num(code)) + } + + @Test + fun closureCounterFactory() { + val code = """ + function makeCounter() { + var count = 0; + return function() { count += 1; return count; } + } + var c = makeCounter(); + c(); c(); c() + """.trimIndent() + assertEquals(3.0, num(code)) + } + + @Test + fun argumentsObject() { + val code = """ + function sum() { + var total = 0; + for(var i=0; i= 0.0 && r < 1.0, "Math.random() should be in [0,1) but was $r") + } + + @Test + fun mathRandomProducesDifferentValues() { + val results = (1..20).map { num("Math.random()") }.toSet() + assertTrue(results.size > 1, "Math.random() produced identical values across 20 calls") + } + + @Test + fun parseIntDecimal() { + assertEquals(42.0, num("parseInt('42')")) + } + + @Test + fun parseIntHex() { + assertEquals(255.0, num("parseInt('ff',16)")) + } + + @Test + fun parseIntBinary() { + assertEquals(5.0, num("parseInt('101',2)")) + } + + @Test + fun parseIntInvalid() { + assertTrue(num("parseInt('abc')").isNaN()) + } + + @Test + fun parseIntLeadingWhitespace() { + assertEquals(42.0, num("parseInt(' 42 ')")) + } + + @Test + fun parseFloat() { + assertApprox(3.14, num("parseFloat('3.14')")) + } + + @Test + fun isNanTrue() { + assertTrue(bool("isNaN(NaN)")) + } + + @Test + fun isNanFalse() { + assertFalse(bool("isNaN(1)")) + } + + @Test + fun isFiniteFalse() { + assertFalse(bool("isFinite(Infinity)")) + } + + @Test + fun isFiniteTrue() { + assertTrue(bool("isFinite(1)")) + } + + @Test + fun consoleLogDoesNotThrow() { + // console.log is a no-op; just ensure it runs without exception + assertEquals(Unit, evalJsInternal("console.log('test', 1, 2)")) + } + + @Test + fun decodeURIComponentBasic() { + assertEquals("hello world", str("decodeURIComponent('hello%20world')")) + } + + @Test + fun encodeURIComponentBasic() { + assertTrue(str("encodeURIComponent('hello world')").contains("%")) + } + + @Test + fun tryCatchSwallowsThrownValue() { + assertEquals(42.0, num("var r=0; try{throw 42}catch(e){r=e} r")) + } + + @Test + fun finallyAlwaysRuns() { + assertEquals(99.0, num("var r=0; try{throw 1}catch(e){}finally{r=99} r")) + } + + @Test + fun tryWithoutThrowSkipsCatch() { + assertEquals(1.0, num("var r=0; try{r=1}catch(e){r=99} r")) + } + + @Test + fun tryCatchThrowString() { + assertEquals("oops", str("var r=''; try{throw 'oops'}catch(e){r=e} r")) + } + + @Test + fun tryCatchThrowObject() { + assertEquals(404.0, num("var r=0; try{throw {code:404}}catch(e){r=e.code} r")) + } + + @Test + fun evaluateMathSimpleAddition() { + assertEquals("5", jsValueToString(evalJsInternal("eval(2+3)"))) + } + + @Test + fun evaluateMathNestedParens() { + assertEquals("12", jsValueToString(evalJsInternal("eval((2+4)*2)"))) + } + + @Test + fun evaluateMathProducesCharCode() { + val code = "eval(1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1)" + assertEquals(65.0, (evalJsInternal(code) as? Double) ?: 0.0) + } + + @Test + fun evalJsWithVariableReturnsNamedVar() { + assertEquals(42.0, num("var x = 42", "x")) + } + + @Test + fun evalJsWithVariableAfterComputation() { + assertEquals(7.0, num("var x = 1 + 2 * 3", "x")) + } + + @Test + fun evalJsWithVariableStringValue() { + assertEquals("https://example.com", str("var url = 'https://example.com'", "url")) + } + + @Test + fun evalJsWithVariableNullValue() { + assertNull(evalJsInternal("var x = null", "x")) + } + + @Test + fun evalJsWithVariableReturnsNullForUndefined() { + assertNull(evalJsInternal("var x = 42", "y")) + } + + @Test + fun evalJsWithVariableUnitWhenNoVariable() { + assertEquals(Unit, evalJsInternal("var x = 42")) + } + + @Test + fun evalJsWithVariableAfterMultipleStatements() { + assertEquals(15.0, num("var x = 0; for(var i=1;i<=5;i++){x+=i}", "x")) + } + + @Test + fun emptyArrayPlusEmptyArrayIsEmptyString() { + // [] + [] => "" + assertEquals("", str("[]+[]")) + } + + @Test + fun unaryPlusEmptyArrayIsZero() { + // +[] => 0 + assertEquals(0.0, num("+[]")) + } + + @Test + fun notArrayIsFalse() { + // ![] => false (array is truthy, so ![] is false) + assertFalse(bool("![]")) + } + + @Test + fun doubleNotArrayIsTrue() { + // !![] => true + assertTrue(bool("!![]")) + } + + @Test + fun unaryPlusDoubleNotArrayIsOne() { + // +!![] => 1 + assertEquals(1.0, num("+!![]")) + } + + @Test + fun unaryPlusNotArrayIsZero() { + // +![] => 0 + assertEquals(0.0, num("+![]")) + } + + @Test + fun falseCoercedToString() { + // ![]+[] => "false" + assertEquals("false", str("![]+[]")) + } + + @Test + fun trueCoercedToString() { + // !![]+[] => "true" + assertEquals("true", str("!![]+[]")) + } + + @Test + fun falseStringViaStringConcat() { + // (![]+""): false + "" => "false" + assertEquals("false", str("![]+''")) + } + + @Test + fun trueStringViaStringConcat() { + // (!![]+""): true + "" => "true" + assertEquals("true", str("!![]+''")) + } + + @Test + fun undefinedCoercedToString() { + assertEquals("undefined", str("[][0]+[]")) + } + + @Test + fun charF() { + // (![]+[])[0] => "false"[0] => "f" + assertEquals("f", str("(![]+[])[0]")) + } + + @Test + fun charA() { + // (![]+[])[1] => "false"[1] => "a" + assertEquals("a", str("(![]+[])[1]")) + } + + @Test + fun charL() { + // (![]+[])[2] => "false"[2] => "l" + assertEquals("l", str("(![]+[])[2]")) + } + + @Test + fun charS() { + // (![]+[])[3] => "false"[3] => "s" + assertEquals("s", str("(![]+[])[3]")) + } + + @Test + fun charE() { + // (![]+[])[4] => "false"[4] => "e" + assertEquals("e", str("(![]+[])[4]")) + } + + @Test + fun charT() { + // (!![]+[])[0] => "true"[0] => "t" + assertEquals("t", str("(!![]+[])[0]")) + } + + @Test + fun charR() { + // (!![]+[])[1] => "true"[1] => "r" + assertEquals("r", str("(!![]+[])[1]")) + } + + @Test + fun charU() { + // (!![]+[])[2] => "true"[2] => "u" + assertEquals("u", str("(!![]+[])[2]")) + } + + @Test + fun indexViaArithmetic() { + // (![]+[])[+[]] => "false"[0] => "f" (index built from +[]) + assertEquals("f", str("(![]+[])[+[]]")) + } + + @Test + fun indexOneViaArithmetic() { + // (![]+[])[+!![]] => "false"[1] => "a" + assertEquals("a", str("(![]+[])[+!![]]")) + } + + @Test + fun arrayToStringCoercion() { + // [1,2,3]+[] => "1,2,3" + assertEquals("1,2,3", str("[1,2,3]+[]")) + } + + @Test + fun objectStringCharO() { + // ([]+{})[1] => "[object Object]"[1] => "o" + assertEquals("o", str("([]+{})[1]")) + } + + @Test + fun objectStringCharB() { + // ([]+{})[2] => "[object Object]"[2] => "b" + assertEquals("b", str("([]+{})[2]")) + } + + @Test + fun filterFunctionToString() { + // []["filter"]+"" => "function filter() { [native code] }" + assertEquals("function filter() { [native code] }", str("[]['filter']+''")) + } + + @Test + fun filterStringCharF() { + // ([]["filter"]+[])[0] => "function filter() { [native code] }"[0] => "f" + assertEquals("f", str("([]['filter']+[])[0]")) + } + + @Test + fun filterStringCharU() { + // ([]["filter"]+[])[1] => "u" + assertEquals("u", str("([]['filter']+[])[1]")) + } + + @Test + fun filterStringCharN() { + // ([]["filter"]+[])[2] => "n" + assertEquals("n", str("([]['filter']+[])[2]")) + } + + @Test + fun filterStringCharC() { + // ([]["filter"]+[])[3] => "c" + assertEquals("c", str("([]['filter']+[])[3]")) + } + + @Test + fun filterStringCharI() { + assertEquals("i", str("([]['filter']+[])[5]")) + } + + @Test + fun nativeCodeBracketChar() { + // "function filter() { [native code] }" contains '[' at index 20 + val s = "function filter() { [native code] }" + val idx = s.indexOf('[') + assertEquals("[", str("([]['filter']+[])[$idx]")) + } + + @Test + fun nativeCodeSpaceChar() { + // space at index 8 + assertEquals(" ", str("([]['filter']+[])[8]")) + } + + @Test + fun buildsNumberViaAddition() { + // +!![] + +!![] + +!![] => 3 + assertEquals(3.0, num("+!![]+!![]+!![]")) + } + + @Test + fun buildsNumberTen() { + assertEquals("10", str("(+!![])+[+[]]")) + } + + @Test + fun stringFromCharCodeViaNativeExtraction() { + assertEquals("A", str("String['fromCharCode'](65)")) + } + + @Test + fun fullAlphaFromFalseTrue() { + assertEquals("ftaseru", str(""" + var f = ![]+[]; + var t = !![]+[]; + f[0]+t[0]+f[1]+f[3]+f[4]+t[1]+t[2] + """.trimIndent())) + } + + @Test + fun functionToStringContainsNativeCode() { + // Any array method coerced to string should contain "native code" + assertTrue(str("[]['map']+''").contains("native code")) + } + + @Test + fun functionToStringContainsFunctionKeyword() { + assertTrue(str("[]['join']+''").startsWith("function")) + } + + @Test + fun typeofCoercion() { + // typeof([]) + [] => "object" + assertEquals("object", str("typeof([])+[]")) + } + + @Test + fun typeofFunctionCoercion() { + // typeof([]['filter']) => "function" + assertEquals("function", str("typeof([]['filter'])")) + } + + @Test + fun hexEncodedStringDecoding() { + val code = """ + var encoded = '48|65|6c|6c|6f'; + var decoded = encoded.split('|').map(function(h){ + return String.fromCharCode(parseInt(h, 16)); + }).join(''); + decoded + """.trimIndent() + assertEquals("Hello", str(code)) + } + + @Test + fun charCodeArrayToString() { + val code = """ + var codes = [72, 101, 108, 108, 111]; + var s = ''; + for(var i=0; i 0) { + r = alpha[n % 16] + r; + n = Math.floor(n / 16); + } + return r || '0'; + } + toBase16(255) + """.trimIndent() + assertEquals("ff", str(code)) + } + + @Test + fun xorDeobfuscation() { + val code = """ + var _0x1 = function(s) { + return s.split('').map(function(c) { + return String.fromCharCode(c.charCodeAt(0) ^ 1); + }).join(''); + }; + _0x1('ifmmp') + """.trimIndent() + val expected = "ifmmp".map { (it.code xor 1).toChar() }.joinToString("") + assertEquals(expected, str(code)) + } + + @Test + fun symtabLookupPattern() { + val code = """ + var symtab = ['hello', '', 'world', 'foo']; + var tokens = '0 2'.split(' '); + var result = tokens.map(function(w){ + var idx = parseInt(w,10); + var v = symtab[idx]; + return (v !== undefined && v !== '') ? v : w; + }).join(' '); + result + """.trimIndent() + assertEquals("hello world", str(code)) + } + + @Test + fun hunterDecoderDufHelper() { + val code = """ + function duf(d, e) { + var str = '0123456789abcdefghijklmnopqrstuvwxyz'; + var h = str.substring(0, e); + var j = 0.0; + var rev = d.split('').reverse().join(''); + for(var c=0; c= 0) j += idx * Math.pow(e, c); + } + return Math.floor(j); + } + duf('z', 36) + """.trimIndent() + assertEquals(35.0, num(code)) + } + + @Test + fun chainedStringMethods() { + assertEquals("OLLEH", str("'hello'.split('').reverse().join('').toUpperCase()")) + } + + @Test + fun deeplyNestedArithmetic() { + assertEquals(39.0, num("((((1+1)*3)+((2*3)+1))*3)")) + } + + @Test + fun closureOverLoopVariable() { + val code = """ + var fns = []; + for(var i=0; i<3; i++){ + (function(j){ fns.push(function(){return j;}); })(i); + } + fns[0]()+fns[1]()+fns[2]() + """.trimIndent() + assertEquals(3.0, num(code)) + } + + @Test + fun multilineStringConcatenation() { + val code = """ + var a = 'foo'; + var b = 'bar'; + var c = a + b; + c + """.trimIndent() + assertEquals("foobar", str(code)) + } + + @Test + fun bitwiseTruncationPattern() { + assertEquals(5.0, num("(11/2)|0")) + } + + @Test + fun infiniteLoopIsAbortedByExecutionBudget() { + assertEquals(Unit, evalJsInternal("while(true){}")) + } + + @Test + fun infiniteLoopIsAbortedByTimeBudget() { + val mark = TimeSource.Monotonic.markNow() + val result = evalJsInternal("while(true){}", maxExecutionTime = 200.milliseconds) + assertEquals(Unit, result) + // Generous upper bound just to avoid flakiness on slow machines. + assertTrue(mark.elapsedNow() < 2.seconds) + } + + @Test + fun infiniteLoopIsAbortedByTinyInstructionBudget() { + // A tiny instruction cap but a generous time budget, the instruction count is what + // should abort this, not the clock. + assertEquals(Unit, evalJsInternal("while(true){}", maxExecutionTime = 60.seconds, maxInstructions = 1000)) + } + + @Test + fun finiteLoopCompletesNormally() { + assertEquals(45.0, num("var s=0; for (var i=0;i<10;i++){ s+=i; }", "s")) + } + + @Test + fun exponentiation() { + assertEquals(1024.0, num("2**10")) + } + + @Test + fun exponentiationIsRightAssociative() { + // 2 ** (3 ** 2) == 2 ** 9 == 512, NOT (2 ** 3) ** 2 == 64 + assertEquals(512.0, num("2**3**2")) + } + + @Test + fun exponentiationWithNegativeExponent() { + assertEquals(0.5, num("2**-1")) + } + + @Test + fun exponentiationOverflowsToInfinity() { + assertTrue(num("10**1000").isInfinite()) + } + + @Test + fun assignmentPowEquals() { + assertEquals(8.0, num("var x=2; x**=3", "x")) + } + + @Test + fun legacyOctalLiteral() { + // 010 (octal) == 8 + assertEquals(8.0, num("010")) + } + + @Test + fun legacyOctalLiteralArithmetic() { + // 010 (octal, 8) - 03 (octal, 3) == 5 + assertEquals(5.0, num("010 - 03")) + } + + @Test + fun octalLikeLiteralWithNonOctalDigitIsDecimal() { + // "08" contains a non-octal digit (8), so JS treats it as plain decimal 8. + assertEquals(8.0, num("08")) + } + + @Test + fun arrayElisionsCountTowardLength() { + assertEquals(3.0, num("[,,,].length")) + } + + @Test + fun arrayTrailingCommaDoesNotAddElement() { + assertEquals(2.0, num("[1,2,].length")) + } + + @Test + fun arrayTrailingElisionAfterCommaAddsAHole() { + assertEquals(3.0, num("[1,2,,].length")) + } + + @Test + fun arrayHoleJoinsAsEmptyString() { + // Array.prototype.join treats holes/undefined/null as "", not the literal "undefined". + assertEquals("1,,3", str("[1,,3].join(',')")) + } + + @Test + fun parseIntStopsAtExponentNotation() { + // 0.0000005 stringifies to "5e-7"; parseInt reads the leading "5" and stops at "e". + assertEquals(5.0, num("parseInt(0.0000005)")) + } + + @Test + fun parseIntWithExplicitRadix() { + assertEquals(255.0, num("parseInt('ff', 16)")) + } + + @Test + fun parseIntStopsAtFirstNonDigit() { + assertEquals(42.0, num("parseInt('42px')")) + } + + @Test + fun parseIntInvalidInputIsNaN() { + assertTrue(num("parseInt('xyz')").isNaN()) + } + + @Test + fun emptyStringCoercesToZero() { + assertEquals(0.0, num("\"\" - 0")) + } + + @Test + fun emptyStringMinusNegatedEmptyStringIsZero() { + assertEquals(0.0, evalJsInternal("\"\" - - \"\"")) + } + + @Test + fun emptyStringMinusNumber() { + assertEquals(-1.0, evalJsInternal("\"\" - 1")) + } + + @Test + fun nullCoercesToZeroNotNaN() { + assertEquals(1.0, num("null + 1")) + } + + @Test + fun undefinedCoercesToNaNNotZero() { + // Unlike null, undefined coerces to NaN, not 0. + assertTrue(num("undefined + 1").isNaN()) + } + + @Test + fun postfixIncrementOnNonLvalueFailsGracefully() { + assertEquals(2.0, evalJsInternal("true+1")) + // `true++` has no valid assignment target (a SyntaxError in real JS); evalJs falls + // back to Unit instead of returning a bogus number. + assertEquals(Unit, evalJsInternal("true++")) + } + + @Test + fun booleanAdditionCoercesToNumber() { + assertEquals(1.0, num("true + false")) + } + + @Test + fun arrayPlusArrayConcatenatesAsStrings() { + assertEquals("1,2,34,5,6", str("[1, 2, 3] + [4, 5, 6]")) + } + + @Test + fun commaOperatorWithTwoOperands() { + assertEquals(2.0, num("10,2")) + } + + @Test + fun doubleNegationOfEmptyStringIsFalse() { + assertFalse(bool("!!\"\"")) + } + + @Test + fun looseEqualityBooleanVsNonNumericStringIsFalse() { + assertFalse(bool("true == \"true\"")) + } + + @Test + fun nullPlusZeroIsZero() { + assertEquals(0.0, num("null + 0")) + } + + @Test + fun zeroDividedByZeroIsNaN() { + assertTrue(num("0/0").isNaN()) + } + + @Test + fun exponentiationInfinityComparisonIsFalse() { + assertFalse(bool("1/0 > 10 ** 1000")) + } + + @Test + fun nullMinusZeroThenStringConcat() { + assertEquals("00", str("(null - 0) + \"0\"")) + } + + @Test + fun nonNumericStringMinusNumberThenAddBoolean() { + assertTrue(num("true + (\"true\" - 0) ").isNaN()) + } + + @Test + fun negatedTruthyNumbersSumToZero() { + assertEquals(0.0, num("!5 + !5")) + } + + @Test + fun numberAdditionThenStringConcatenation() { + assertEquals("33", str("1 + 2 + \"3\"")) + } + + @Test + fun typeofNaNIsNumber() { + assertEquals("number", str("typeof NaN")) + } + + @Test + fun undefinedPlusFalseIsNaN() { + assertTrue(num("undefined + false").isNaN()) + } + + @Test + fun logicalAndShortCircuitsOnFalsyEmptyString() { + assertEquals("", str("\"\" && -0")) + } + + @Test + fun combinedCoercionOfNaNEmptyStringAndArrayHoleIsZero() { + assertEquals(0.0, evalJsInternal("+!!NaN * \"\" - - [,]")) + } + + /** Returns a [CoroutineScope] backed by a plain [Job] with no dispatcher attached. */ + private fun activeScope(): CoroutineScope = CoroutineScope(Job()) + + @Test + fun scopeEvalJsFiniteScriptReturnsCorrectResult() { + // Normal script with an active scope should behave identically to plain evalJs. + val scope = activeScope() + val result = evalJsInternal("var s=0; for(var i=1;i<=10;i++){s+=i}", "s", scope = scope) + assertEquals(55.0, result as? Double ?: 0.0) + scope.cancel() + } + + @Test + fun scopeEvalJsStringResultWithActiveScope() { + val scope = activeScope() + val result = jsValueToString(evalJsInternal("'hello'.split('').reverse().join('')", scope = scope)) + assertEquals("olleh", result) + scope.cancel() + } + + @Test + fun scopeEvalJsVariableLookupWithActiveScope() { + val scope = activeScope() + val result = evalJsInternal("var x = 21 * 2", "x", scope = scope) + assertEquals(42.0, result as? Double ?: 0.0) + scope.cancel() + } + + @Test + fun scopeEvalJsCancelledBeforeCallThrowsJsCancellationException() { + // Cancel the scope before calling evalJs. The very first budget check sees + // isActive==false and throws JsCancellationException immediately. + val scope = activeScope() + scope.cancel() + assertFailsWith { + evalJsInternal("var x = 1 + 2", "x", scope = scope) + } + } + + @Test + fun scopeEvalJsInfiniteLoopAbortedWhenScopeCancelled() { + // Pre-cancel the scope and confirm an infinite loop aborts well within the + // time budget. A sub-1s return against a 5s budget proves it was + // scope cancellation, not the clock, that stopped the script. + val scope = activeScope() + scope.cancel() + val mark = TimeSource.Monotonic.markNow() + assertFailsWith { + evalJsInternal("while(true){}", scope = scope) + } + assertTrue( + mark.elapsedNow() < 1.seconds, + "Expected abort well before 5s time budget; elapsed: ${mark.elapsedNow()}", + ) + } + + @Test + fun scopeEvalJsInfiniteLoopAbortedByOwnBudgetEvenWithActiveScope() { + // Even with an active (never-cancelled) scope the internal budget still fires. + val scope = activeScope() + val mark = TimeSource.Monotonic.markNow() + val result = evalJsInternal("while(true){}", maxExecutionTime = 200.milliseconds, scope = scope) + assertEquals(Unit, result) + assertTrue(mark.elapsedNow() < 2.seconds) + scope.cancel() + } + + @Test + fun scopeEvalJsJsTryCatchCannotSwallowCancellation() { + // A JS try/catch must not be able to intercept the cancellation signal and keep + // the infinite loop alive. JsCancellationException extends CancellationException + // which the TryCatch node handler explicitly rethrows before catch(_: Exception). + val scope = activeScope() + scope.cancel() + val mark = TimeSource.Monotonic.markNow() + assertFailsWith { + evalJsInternal("while(true){ try{ throw 1; }catch(e){} }", scope = scope) + } + assertTrue( + mark.elapsedNow() < 1.seconds, + "JS try/catch appears to have swallowed the cancellation; elapsed: ${mark.elapsedNow()}", + ) + } + + @Test + fun scopeEvalJsCancelledScopeThrowsJsCancellationException() { + // A cancelled scope must propagate CancellationException so that withTimeout + // and structured concurrency see the cancellation correctly. Swallowing it + // silently as Unit would break withTimeout. + val scope = activeScope() + scope.cancel() + assertFailsWith { + evalJsInternal("1+1", scope = scope) + } + } + + @Test + fun suspendEvalJsWithTimeoutCancelsInfiniteLoop() = runTest { + /** + * activeScope() provides a real CoroutineScope with a real Job, so withTimeout + * fires after a genuine 300ms rather than instantly via the virtual clock. + * The test coroutine suspends at done.receive(), keeping runTest alive until + * the background coroutine finishes. + * + * We measure elapsed time inside the coroutine. If withTimeout fired before + * evalJs started, elapsed would be ~0ms. ~300ms proves evalJs was genuinely + * running and cancelled mid-execution, not trivially before it began. + */ + var elapsed = Duration.ZERO + val done = Channel() + activeScope().launch { + assertFailsWith { + withTimeout(300.milliseconds) { + val mark = TimeSource.Monotonic.markNow() + try { + evalJs("while(true){}") + } finally { + elapsed = mark.elapsedNow() + } + } + } + + done.send(Unit) + } + + done.receive() + assertTrue(elapsed > 200.milliseconds, "evalJs should have run for ~300ms but elapsed: $elapsed") + assertTrue(elapsed < 1.seconds, "evalJs ran too long: $elapsed") + } + + @Test + fun newJsContextWithNoInitializerIsUsable() = runTest { + val ctx = newJsContext() + assertEquals(3.0, ctx.eval("1+2") as? Double ?: 0.0) + } + + @Test + fun newJsContextInitializerRunsBeforeReturning() = runTest { + val ctx = newJsContext { + set("x", 10.0) + eval("var y = x + 1") + } + + assertEquals(11.0, ctx["y"] as? Double ?: 0.0) + } + + @Test + fun jsContextGetReturnsNullForNeverSetVariable() = runTest { + val ctx = newJsContext() + assertNull(ctx["neverSet"]) + } + + @Test + fun jsContextSetThenGetRoundTripsSameValue() = runTest { + val ctx = newJsContext() + ctx["greeting"] = "hello" + assertEquals("hello", ctx["greeting"]) + } + + @Test + fun jsContextSetOverwritesPreviousValue() = runTest { + val ctx = newJsContext() + ctx["x"] = 1.0 + ctx["x"] = 2.0 + assertEquals(2.0, ctx["x"] as? Double ?: 0.0) + } + + @Test + fun jsContextSetNullIsRetrievedAsNull() = runTest { + val ctx = newJsContext() + ctx["x"] = null + assertNull(ctx["x"]) + } + + @Test + fun jsContextGetAfterEvalSetsVariable() = runTest { + val ctx = newJsContext() + ctx.eval("var fromJs = 42") + assertEquals(42.0, ctx["fromJs"] as? Double ?: 0.0) + } + + @Test + fun jsContextPersistsVariablesAcrossManyEvalCalls() = runTest { + val ctx = newJsContext() + ctx.eval("var total = 0") + repeat(5) { ctx.eval("total += 1") } + assertEquals(5.0, ctx["total"] as? Double ?: 0.0) + } + + @Test + fun jsContextFunctionDeclaredInOneEvalUsableInAnother() = runTest { + val ctx = newJsContext() + ctx.eval("function double(n) { return n * 2; }") + val result = ctx.eval("double(21)") + assertEquals(42.0, result as? Double ?: 0.0) + } + + @Test + fun jsContextArrayMutatedAcrossEvalsPersists() = runTest { + val ctx = newJsContext() + ctx.eval("var arr = [1,2,3]") + ctx.eval("arr.push(4)") + assertEquals("1,2,3,4", ctx.eval("arr.join(',')") as? String) + } + + @Test + fun jsContextEvalReturnsLastStatementValue() = runTest { + val ctx = newJsContext() + assertEquals(9.0, ctx.eval("var a = 3; a * a") as? Double ?: 0.0) + } + + @Test + fun jsContextEvalReturnsUnitForDeclarationOnlyStatement() = runTest { + val ctx = newJsContext() + assertEquals(Unit, ctx.eval("var a = 3")) + } + + @Test + fun jsContextEvalReturnsStringValue() = runTest { + val ctx = newJsContext() + assertEquals("ab", ctx.eval("'a' + 'b'")) + } + + @Test + fun separateJsContextsDoNotShareVariables() = runTest { + val ctx1 = newJsContext { set("x", 1.0) } + val ctx2 = newJsContext { set("x", 2.0) } + assertEquals(1.0, ctx1["x"] as? Double ?: 0.0) + assertEquals(2.0, ctx2["x"] as? Double ?: 0.0) + } + + @Test + fun separateJsContextsDoNotShareFunctions() = runTest { + val ctx1 = newJsContext { eval("function f(){ return 1; }") } + val ctx2 = newJsContext() + assertEquals(1.0, ctx1.eval("f()") as? Double ?: 0.0) + // f was never declared in ctx2, so calling it should not crash and yields Unit. + assertEquals(Unit, ctx2.eval("typeof f === 'function' ? f() : undefined")) + } + + @Test + fun jsContextEvalDefaultBudgetHandlesNormalScript() = runTest { + val ctx = newJsContext() + val result = ctx.eval("var s=0; for(var i=1;i<=1000;i++){s+=i} s") + assertEquals(500500.0, result as? Double ?: 0.0) + } + + @Test + fun jsContextEvalInfiniteLoopAbortedByDefaultInstructionBudget() = runTest { + val ctx = newJsContext() + assertEquals(Unit, ctx.eval("while(true){}")) + } + + @Test + fun jsContextEvalInfiniteLoopAbortedByCustomTimeBudget() = runTest { + val ctx = newJsContext() + ctx.maxExecutionTime = 200.milliseconds + val mark = TimeSource.Monotonic.markNow() + val result = ctx.eval("while(true){}") + assertEquals(Unit, result) + assertTrue(mark.elapsedNow() < 2.seconds) + } + + @Test + fun jsContextEvalInfiniteLoopAbortedByTinyInstructionBudget() = runTest { + val ctx = newJsContext() + ctx.maxExecutionTime = 60.seconds + ctx.maxInstructions = 1000 + // High time budget; instruction cap should be what stops it. + val result = ctx.eval("while(true){}") + assertEquals(Unit, result) + } + + @Test + fun jsContextEvalCustomBudgetAppliesOnlyToThatCall() = runTest { + val ctx = newJsContext() + ctx.maxInstructions = 100 + // Abort this call + assertEquals(Unit, ctx.eval("while(true){}")) + // The next call, using the defaults again, runs a normal script fine. + val result = ctx.eval("1+1") + assertEquals(2.0, result as? Double ?: 0.0) + } + + @Test + fun jsContextEvalVariablesSurviveAnAbortedPriorCall() = runTest { + val ctx = newJsContext() + ctx.maxInstructions = 100 + ctx.eval("var x = 5") + ctx.eval("while(true){}") + assertEquals(5.0, ctx["x"] as? Double ?: 0.0) + } + + @Test + fun jsContextEvalCancelledWhenEnclosingCoroutineCancelledViaWithTimeout() = runTest { + val done = Channel() + var elapsed = Duration.ZERO + activeScope().launch { + assertFailsWith { + withTimeout(300.milliseconds) { + val ctx = newJsContext() + val mark = TimeSource.Monotonic.markNow() + try { + ctx.eval("while(true){}") + } finally { + elapsed = mark.elapsedNow() + } + } + } + + done.send(Unit) + } + + done.receive() + assertTrue(elapsed > 200.milliseconds, "expected genuine ~300ms run, was $elapsed") + assertTrue(elapsed < 1.seconds, "expected prompt cancellation, was $elapsed") + } + + @Test + fun jsContextEvalNotCancelledWhenWithTimeoutDoesNotExpire() = runTest { + val ctx = newJsContext() + val result = withTimeoutOrNull(5.seconds) { + ctx.eval("var s=0; for(var i=0;i<100;i++){s+=i} s") + } + + assertEquals(4950.0, result as? Double ?: 0.0) + } + + @Test + fun jsContextJsTryCatchCannotSwallowEnclosingCancellation() = runTest { + val done = Channel() + var elapsed = Duration.ZERO + activeScope().launch { + assertFailsWith { + withTimeout(300.milliseconds) { + val ctx = newJsContext() + val mark = TimeSource.Monotonic.markNow() + try { + ctx.eval("while(true){ try{ throw 1; }catch(e){} }") + } finally { + elapsed = mark.elapsedNow() + } + } + } + done.send(Unit) + } + + done.receive() + assertTrue(elapsed < 1.seconds, "JS try/catch appears to have swallowed cancellation; elapsed: $elapsed") + } + + @Test + fun jsContextUrlExtractionPattern() = runTest { + val ctx = newJsContext() + ctx.eval("var url = '/e/abc123?t=' + (1000+337) + '&s=xyz'") + assertEquals("/e/abc123?t=1337&s=xyz", ctx["url"]?.toString()) + } + + @Test + fun jsContextInitializerCanReadBackItsOwnEvalResult() = runTest { + var capturedDuringInit: Any? = null + newJsContext { + capturedDuringInit = eval("2 * 21") + } + + assertEquals(42.0, capturedDuringInit as? Double ?: 0.0) + } + + @Test + fun jsContextSequentialIndependentComputations() = runTest { + val ctx = newJsContext() + assertEquals(4.0, ctx.eval("2+2") as? Double ?: 0.0) + assertEquals("hi", ctx.eval("'h'+'i'") as? String) + assertFalse(ctx.eval("1 > 2") as? Boolean ?: true) + } +} From 59eaed0c82515d3adfd843cbc6f62f0760b539e0 Mon Sep 17 00:00:00 2001 From: firelight <147925818+fire-light42@users.noreply.github.com> Date: Thu, 9 Jul 2026 11:08:53 +0000 Subject: [PATCH 13/38] Fix: Subsouce and cache issue (#3033) --- .../syncproviders/AccountManager.kt | 6 +- .../syncproviders/SubtitleRepo.kt | 8 +- .../syncproviders/providers/SubSource.kt | 223 ++++++++++-------- 3 files changed, 133 insertions(+), 104 deletions(-) diff --git a/app/src/main/java/com/lagradost/cloudstream3/syncproviders/AccountManager.kt b/app/src/main/java/com/lagradost/cloudstream3/syncproviders/AccountManager.kt index 3bc5f2733..68fba9777 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/syncproviders/AccountManager.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/syncproviders/AccountManager.kt @@ -70,7 +70,8 @@ abstract class AccountManager { SubtitleRepo(openSubtitlesApi), SubtitleRepo(addic7ed), SubtitleRepo(subDlApi), - PlainAuthRepo(animeSkipApi) + PlainAuthRepo(animeSkipApi), + SubtitleRepo(subSourceApi) ) fun updateAccountIds() { @@ -120,7 +121,8 @@ abstract class AccountManager { val subtitleProviders = arrayOf( SubtitleRepo(openSubtitlesApi), SubtitleRepo(addic7ed), - SubtitleRepo(subDlApi) + SubtitleRepo(subDlApi), + SubtitleRepo(subSourceApi) ) val syncApis = arrayOf( SyncRepo(malApi), diff --git a/app/src/main/java/com/lagradost/cloudstream3/syncproviders/SubtitleRepo.kt b/app/src/main/java/com/lagradost/cloudstream3/syncproviders/SubtitleRepo.kt index 0b8c3e5ae..161001611 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/syncproviders/SubtitleRepo.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/syncproviders/SubtitleRepo.kt @@ -2,7 +2,6 @@ package com.lagradost.cloudstream3.syncproviders import androidx.annotation.WorkerThread import com.lagradost.cloudstream3.APIHolder.unixTime -import com.lagradost.cloudstream3.ErrorLoadingException import com.lagradost.cloudstream3.subtitles.AbstractSubtitleEntities.SubtitleEntity import com.lagradost.cloudstream3.subtitles.AbstractSubtitleEntities.SubtitleSearch import com.lagradost.cloudstream3.subtitles.SubtitleResource @@ -14,7 +13,8 @@ class SubtitleRepo(override val api: SubtitleAPI) : AuthRepo(api) { data class SavedSearchResponse( val unixTime: Long, val response: List, - val query: SubtitleSearch + val query: SubtitleSearch, + val idPrefix: String, ) data class SavedResourceResponse( @@ -66,7 +66,7 @@ class SubtitleRepo(override val api: SubtitleAPI) : AuthRepo(api) { var found: List? = null for (item in searchCache) { // 120 min save - if (item.query == query && (unixTime - item.unixTime) < 60 * 120) { + if (item.idPrefix == idPrefix && item.query == query && (unixTime - item.unixTime) < 60 * 120) { found = item.response break } @@ -79,7 +79,7 @@ class SubtitleRepo(override val api: SubtitleAPI) : AuthRepo(api) { // only cache valid return values if (returnValue.isNotEmpty()) { - val add = SavedSearchResponse(unixTime, returnValue, query) + val add = SavedSearchResponse(unixTime, returnValue, query, idPrefix) searchCache.withLock { if (searchCache.size > CACHE_SIZE) { searchCache[searchCacheIndex] = add // rolling cache diff --git a/app/src/main/java/com/lagradost/cloudstream3/syncproviders/providers/SubSource.kt b/app/src/main/java/com/lagradost/cloudstream3/syncproviders/providers/SubSource.kt index fb463ebee..317c3dc90 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/syncproviders/providers/SubSource.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/syncproviders/providers/SubSource.kt @@ -7,11 +7,10 @@ import com.lagradost.cloudstream3.subtitles.AbstractSubtitleEntities import com.lagradost.cloudstream3.subtitles.SubtitleResource import com.lagradost.cloudstream3.syncproviders.AuthData import com.lagradost.cloudstream3.syncproviders.SubtitleAPI -import com.lagradost.cloudstream3.utils.AppUtils.parseJson -import com.lagradost.cloudstream3.utils.AppUtils.toJson import com.lagradost.cloudstream3.utils.SubtitleHelper import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable +import java.util.concurrent.TimeUnit class SubSourceApi : SubtitleAPI() { override val name = "SubSource" @@ -20,77 +19,70 @@ class SubSourceApi : SubtitleAPI() { override val requiresLogin = false companion object { - const val APIURL = "https://api.subsource.net/api" - const val DOWNLOADENDPOINT = "https://api.subsource.net/api/downloadSub" + const val APIURL = "https://api.subsource.net/v1" } override suspend fun search( auth: AuthData?, query: AbstractSubtitleEntities.SubtitleSearch ): List? { - //Only supports Imdb Id search for now if (query.imdbId == null) return null val queryLang = SubtitleHelper.fromTagToEnglishLanguageName(query.lang) val type = if ((query.seasonNumber ?: 0) > 0) TvType.TvSeries else TvType.Movie - val searchRes = app.post( - url = "$APIURL/searchMovie", - data = mapOf( - "query" to query.imdbId!! - ) - ).parsedSafe() ?: return null + val searchResponse = app.post( + url = "$APIURL/movie/search", + json = mapOf( + "includeSeasons" to false, + "limit" to 15, + "query" to query.imdbId!!, + "signal" to "{}" + ), + cacheTime = 120, + cacheUnit = TimeUnit.MINUTES, + ).parsedSafe() ?: return null - val postData = if (type == TvType.TvSeries) { - mapOf( - "langs" to "[]", - "movieName" to searchRes.found.first().linkName, - "season" to "season-${query.seasonNumber}" - ) - } else { - mapOf( - "langs" to "[]", - "movieName" to searchRes.found.first().linkName, - ) + val firstResult = searchResponse.results.firstOrNull() ?: return null + + val apiResponse = app.get( + url = "$APIURL${firstResult.link.replace("series", "subtitles")}", + cacheTime = 120, + cacheUnit = TimeUnit.MINUTES, + ).parsedSafe() ?: return null + + val filteredSubtitles = apiResponse.subtitles.filter { sub -> + sub.releaseType != "trailer" && + sub.language.equals(queryLang, true) } - val getMovieRes = app.post( - url = "$APIURL/getMovie", - data = postData - ).parsedSafe().let { - // api doesn't has episode number or lang filtering - if (type == TvType.Movie) { - it?.subs?.filter { sub -> - sub.lang == queryLang - } - } else { - it?.subs?.filter { sub -> - sub.releaseName!!.contains( - String.format( - null, - "E%02d", - query.epNumber - ) - ) && sub.lang == queryLang - } + // api doesn't has episode number or lang filtering + val subtitles = if (type == TvType.Movie) { + filteredSubtitles + } else { + val shouldContain = String.format( + null, + "E%02d", + query.epNumber + ) + filteredSubtitles.filter { sub -> + sub.releaseInfo.contains( + shouldContain + ) } - } ?: return null + } - return getMovieRes.map { subtitle -> + return subtitles.map { subtitle -> AbstractSubtitleEntities.SubtitleEntity( idPrefix = this.idPrefix, - name = subtitle.releaseName!!, - lang = subtitle.lang!!, - data = SubData( - movie = subtitle.linkName!!, - lang = subtitle.lang, - id = subtitle.subId.toString(), - ).toJson(), + name = subtitle.releaseInfo, + lang = subtitle.language, + data = subtitle.link, type = type, source = this.name, epNumber = query.epNumber, seasonNumber = query.seasonNumber, - isHearingImpaired = subtitle.hi == 1, + isHearingImpaired = subtitle.hearingImpaired == 1, ) } } @@ -99,79 +91,114 @@ class SubSourceApi : SubtitleAPI() { auth: AuthData?, subtitle: AbstractSubtitleEntities.SubtitleEntity ) { - val parsedSub = parseJson(subtitle.data) - - val subRes = app.post( - url = "$APIURL/getSub", - data = mapOf( - "movie" to parsedSub.movie, - "lang" to subtitle.lang, - "id" to parsedSub.id - ) - ).parsedSafe() ?: return + val data = app.get("$APIURL/subtitle/${subtitle.data}") + .parsedSafe() + ?: return this.addZipUrl( - "$DOWNLOADENDPOINT/${subRes.sub.downloadToken}" + "$APIURL/subtitle/download/${data.subtitle.downloadToken}" ) { name, _ -> name } } + @Serializable - data class ApiSearch( - @JsonProperty("success") @SerialName("success") val success: Boolean, - @JsonProperty("found") @SerialName("found") val found: List, + data class SearchRoot( + @JsonProperty("success") @SerialName("success") var success: Boolean? = null, + @JsonProperty("results") @SerialName("results") var results: ArrayList = arrayListOf(), + @JsonProperty("users") @SerialName("users") var users: ArrayList = arrayListOf() ) @Serializable - data class Found( - @JsonProperty("id") @SerialName("id") val id: Long, - @JsonProperty("title") @SerialName("title") val title: String, - @JsonProperty("seasons") @SerialName("seasons") val seasons: Long, - @JsonProperty("type") @SerialName("type") val type: String, - @JsonProperty("releaseYear") @SerialName("releaseYear") val releaseYear: Long, - @JsonProperty("linkName") @SerialName("linkName") val linkName: String, + data class Users( + + @JsonProperty("id") @SerialName("id") var id: Int? = null, + @JsonProperty("displayname") @SerialName("displayname") var displayname: String? = null, + @JsonProperty("avatar") @SerialName("avatar") var avatar: String? = null, + @JsonProperty("badges") @SerialName("badges") var badges: ArrayList = arrayListOf() + ) @Serializable - data class ApiResponse( - @JsonProperty("success") @SerialName("success") val success: Boolean, - @JsonProperty("movie") @SerialName("movie") val movie: Movie, - @JsonProperty("subs") @SerialName("subs") val subs: List, + data class Results( + @JsonProperty("id") @SerialName("id") var id: Int? = null, + @JsonProperty("title") @SerialName("title") var title: String? = null, + @JsonProperty("type") @SerialName("type") var type: String? = null, + @JsonProperty("link") @SerialName("link") var link: String, + @JsonProperty("releaseYear") @SerialName("releaseYear") var releaseYear: Int? = null, + @JsonProperty("poster") @SerialName("poster") var poster: String? = null, + @JsonProperty("subtitleCount") @SerialName("subtitleCount") var subtitleCount: String? = null, + @JsonProperty("rating") @SerialName("rating") var rating: Double? = null, + @JsonProperty("cast") @SerialName("cast") var cast: ArrayList = arrayListOf(), + @JsonProperty("genres") @SerialName("genres") var genres: ArrayList = arrayListOf(), + @JsonProperty("score") @SerialName("score") var score: Double? = null ) @Serializable - data class Movie( - @JsonProperty("id") @SerialName("id") val id: Long? = null, - @JsonProperty("type") @SerialName("type") val type: String? = null, - @JsonProperty("year") @SerialName("year") val year: Long? = null, - @JsonProperty("fullName") @SerialName("fullName") val fullName: String? = null, + + data class ItemRoot( + + // @SerialName("media_type" ) var mediaType : String? = null, + @JsonProperty("subtitles") @SerialName("subtitles") var subtitles: ArrayList, + //@SerialName("movie" ) var movie : Movie? = Movie() + ) @Serializable - data class Sub( - @JsonProperty("hi") @SerialName("hi") val hi: Int? = null, - @JsonProperty("fullLink") @SerialName("fullLink") val fullLink: String? = null, - @JsonProperty("linkName") @SerialName("linkName") val linkName: String? = null, - @JsonProperty("lang") @SerialName("lang") val lang: String? = null, - @JsonProperty("releaseName") @SerialName("releaseName") val releaseName: String? = null, - @JsonProperty("subId") @SerialName("subId") val subId: Long? = null, + data class Subtitles( + + @JsonProperty("id") @SerialName("id") var id: Int? = null, + @JsonProperty("language") @SerialName("language") var language: String, + @JsonProperty("release_type") @SerialName("release_type") var releaseType: String? = null, + @JsonProperty("release_info") @SerialName("release_info") var releaseInfo: String, + @JsonProperty("upload_date") @SerialName("upload_date") var uploadDate: String? = null, + @JsonProperty("hearing_impaired") @SerialName("hearing_impaired") var hearingImpaired: Int? = null, + @JsonProperty("caption") @SerialName("caption") var caption: String? = null, + @JsonProperty("rating") @SerialName("rating") var rating: String? = null, + @JsonProperty("uploader_id") @SerialName("uploader_id") var uploaderId: Int? = null, + @JsonProperty("uploader_displayname") @SerialName("uploader_displayname") var uploaderDisplayname: String? = null, + @JsonProperty("uploader_badges") @SerialName("uploader_badges") var uploaderBadges: ArrayList = arrayListOf(), + @JsonProperty("link") @SerialName("link") var link: String, + @JsonProperty("production_type") @SerialName("production_type") var productionType: String? = null, + @JsonProperty("last_subtitle") @SerialName("last_subtitle") var lastSubtitle: Boolean? = null + ) @Serializable - data class SubData( - @JsonProperty("movie") @SerialName("movie") val movie: String, - @JsonProperty("lang") @SerialName("lang") val lang: String, - @JsonProperty("id") @SerialName("id") val id: String, + data class DownloadRoot( + @JsonProperty("subtitle") @SerialName("subtitle") var subtitle: Subtitle, + //@SerializedName("movie" ) var movie : Movie? = Movie(), + //@SerializedName("donationLinks" ) var donationLinks : DonationLinks? = DonationLinks(), + //@SerializedName("isDownloaded" ) var isDownloaded : Boolean? = null, + //@SerializedName("user_rated" ) var userRated : String? = null ) @Serializable - data class SubTitleLink( - @JsonProperty("sub") @SerialName("sub") val sub: SubToken, - ) + data class Subtitle( + + @JsonProperty("id") @SerialName("id") var id: Int? = null, + @JsonProperty("uploaded_at") @SerialName("uploaded_at") var uploadedAt: String? = null, + @JsonProperty("language") @SerialName("language") var language: String? = null, + @JsonProperty("rating") @SerialName("rating") var rating: String? = null, + //SerialName("rates" ) var rates : Rates? = Rates(), + @JsonProperty("uploaded_by") @SerialName("uploaded_by") var uploadedBy: Int? = null, + //@SerialName("contribs" ) var contribs : ArrayList = arrayListOf(), + @JsonProperty("release_info") @SerialName("release_info") var releaseInfo: ArrayList = arrayListOf(), + @JsonProperty("commentary") @SerialName("commentary") var commentary: String? = null, + @JsonProperty("files") @SerialName("files") var files: String? = null, + @JsonProperty("size") @SerialName("size") var size: String? = null, + @JsonProperty("downloads") @SerialName("downloads") var downloads: Int? = null, + @JsonProperty("comments") @SerialName("comments") var comments: Int? = null, + @JsonProperty("production_type") @SerialName("production_type") var productionType: String? = null, + @JsonProperty("release_type") @SerialName("release_type") var releaseType: String? = null, + @JsonProperty("episode") @SerialName("episode") var episode: String? = null, + @JsonProperty("hearing_impaired") @SerialName("hearing_impaired") var hearingImpaired: Int? = null, + @JsonProperty("foreign_parts") @SerialName("foreign_parts") var foreignParts: String? = null, + @JsonProperty("framerate") @SerialName("framerate") var framerate: String? = null, + @JsonProperty("preview") @SerialName("preview") var preview: String? = null, + @JsonProperty("user_uploaded") @SerialName("user_uploaded") var userUploaded: Boolean? = null, + @JsonProperty("download_token") @SerialName("download_token") var downloadToken: String - @Serializable - data class SubToken( - @JsonProperty("downloadToken") @SerialName("downloadToken") val downloadToken: String, ) } From e428d422ebdd8d4def84c555401fbd55b7e39a73 Mon Sep 17 00:00:00 2001 From: firelight <147925818+fire-light42@users.noreply.github.com> Date: Thu, 9 Jul 2026 11:12:37 +0000 Subject: [PATCH 14/38] Fix: Remove uiReset for better UX for errors (#3023) --- .../com/lagradost/cloudstream3/ui/player/GeneratorPlayer.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/player/GeneratorPlayer.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/player/GeneratorPlayer.kt index b64355e23..91e3ff970 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/player/GeneratorPlayer.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/player/GeneratorPlayer.kt @@ -509,7 +509,8 @@ class GeneratorPlayer : FullScreenPlayer() { showDownloadProgress(DownloadEvent(0, 0, 0, null)) - uiReset() + // uiReset() // Removed due to UX + currentSelectedLink = link // setEpisodes(viewModel.getAllMeta() ?: emptyList()) setPlayerDimen(null) From 66afc3b1eec4a387113312770b4765d175179ba9 Mon Sep 17 00:00:00 2001 From: firelight <147925818+fire-light42@users.noreply.github.com> Date: Thu, 9 Jul 2026 15:50:05 +0000 Subject: [PATCH 15/38] Feat: Animation to actor adapter (#3035) --- .../cloudstream3/ui/result/ActorAdaptor.kt | 23 ++++++++++++++++++- app/src/main/res/layout/cast_item.xml | 1 + 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/result/ActorAdaptor.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/result/ActorAdaptor.kt index 056588d0b..fe8c617f2 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/result/ActorAdaptor.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/result/ActorAdaptor.kt @@ -5,6 +5,9 @@ import android.content.Intent import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.view.animation.Animation +import android.view.animation.OvershootInterpolator +import android.view.animation.ScaleAnimation import androidx.core.view.isVisible import com.lagradost.cloudstream3.ActorData import com.lagradost.cloudstream3.ActorRole @@ -46,6 +49,24 @@ class ActorAdaptor( } } + override fun onUpdateContent(holder: ViewHolderState, item: ActorData, position: Int) { + when (val binding = holder.view) { + is CastItemBinding -> { + val anim: Animation = ScaleAnimation( + 0.8f, 1f, + 0.8f, 1f, + Animation.RELATIVE_TO_SELF, 0.5f, + Animation.RELATIVE_TO_SELF, 0.5f + ) + anim.fillAfter = true + anim.duration = 200 + anim.interpolator = OvershootInterpolator() + binding.voiceActorImageHolder2.startAnimation(anim) + } + } + super.onUpdateContent(holder, item, position) + } + override fun onBindContent(holder: ViewHolderState, item: ActorData, position: Int) { when (val binding = holder.view) { is CastItemBinding -> { @@ -137,4 +158,4 @@ class ActorAdaptor( } } } -} \ No newline at end of file +} diff --git a/app/src/main/res/layout/cast_item.xml b/app/src/main/res/layout/cast_item.xml index 4f7bdf74d..610b4e3e4 100644 --- a/app/src/main/res/layout/cast_item.xml +++ b/app/src/main/res/layout/cast_item.xml @@ -47,6 +47,7 @@ Date: Thu, 9 Jul 2026 15:51:16 +0000 Subject: [PATCH 16/38] Remove AM/PM when on 24h settings --- .../lagradost/cloudstream3/ui/settings/SettingsFragment.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsFragment.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsFragment.kt index e41109b59..6943e5cf4 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsFragment.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsFragment.kt @@ -249,7 +249,7 @@ class SettingsFragment : BaseFragment( val appVersion = BuildConfig.VERSION_NAME val commitHash = activity?.currentCommitHash() ?: "" - val buildTimestamp = SimpleDateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, + val buildTimestamp = SimpleDateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.MEDIUM, Locale.getDefault() ).apply { timeZone = TimeZone.getTimeZone("UTC") }.format(Date(BuildConfig.BUILD_DATE)).replace("UTC", "") @@ -262,4 +262,4 @@ class SettingsFragment : BaseFragment( true } } -} \ No newline at end of file +} From 11202d269de03ac38bc3fd09efc441d1f2011966 Mon Sep 17 00:00:00 2001 From: Luna712 <142361265+Luna712@users.noreply.github.com> Date: Thu, 9 Jul 2026 11:40:00 -0600 Subject: [PATCH 17/38] [skip ci] SyncUtil: fix type for tryParseJson (#3038) --- app/src/main/java/com/lagradost/cloudstream3/utils/SyncUtil.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/lagradost/cloudstream3/utils/SyncUtil.kt b/app/src/main/java/com/lagradost/cloudstream3/utils/SyncUtil.kt index b8e2c1b76..43e61ad88 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/utils/SyncUtil.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/utils/SyncUtil.kt @@ -72,7 +72,7 @@ object SyncUtil { // Gogoanime, Twistmoe and 9anime val url = "https://raw.githubusercontent.com/MALSync/MAL-Sync-Backup/master/data/pages/$site/$slug.json" val response = app.get(url, cacheTime = 1, cacheUnit = TimeUnit.DAYS).text - val mapped = tryParseJson(response) + val mapped = tryParseJson(response) val overrideMal = mapped?.malId ?: mapped?.mal?.id ?: mapped?.anilist?.malId val overrideAnilist = mapped?.aniId ?: mapped?.anilist?.id From 0e3191e28b843e5b0f838e39fea056d69170fad1 Mon Sep 17 00:00:00 2001 From: Luna712 <142361265+Luna712@users.noreply.github.com> Date: Thu, 9 Jul 2026 11:41:14 -0600 Subject: [PATCH 18/38] [skip ci] Update commented deprecation message for getRhinoContext (#3037) --- .../kotlin/com/lagradost/cloudstream3/MainAPI.kt | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/MainAPI.kt b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/MainAPI.kt index 72d69dc45..99421a800 100644 --- a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/MainAPI.kt +++ b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/MainAPI.kt @@ -797,16 +797,9 @@ fun fixTitle(str: String): String { } } -/** - * Get rhino context in a safe way as it needs to be initialized on the main thread. - * - * Make sure you get the scope using: val scope: Scriptable = rhino.initSafeStandardObjects() - * - * Use like the following: rhino.evaluateString(scope, js, "JavaScript", 1, null) - **/ // Deprecate after next stable /* @Deprecated( - message = "Use JsContext or evalJs instead.", + message = "Use newJsContext or evalJs instead.", level = DeprecationLevel.WARNING, ) */ suspend fun getRhinoContext(): org.mozilla.javascript.Context { From 8bdc5999968265d74dae8ddff3656950be255edc Mon Sep 17 00:00:00 2001 From: Luna712 <142361265+Luna712@users.noreply.github.com> Date: Thu, 9 Jul 2026 11:43:49 -0600 Subject: [PATCH 19/38] test: some cleanup to JsInterpreterTest (#3036) --- .../cloudstream3/utils/JsInterpreterTest.kt | 55 +++++++++---------- 1 file changed, 27 insertions(+), 28 deletions(-) diff --git a/library/src/commonTest/kotlin/com/lagradost/cloudstream3/utils/JsInterpreterTest.kt b/library/src/commonTest/kotlin/com/lagradost/cloudstream3/utils/JsInterpreterTest.kt index 182ea6c95..ded236f4e 100644 --- a/library/src/commonTest/kotlin/com/lagradost/cloudstream3/utils/JsInterpreterTest.kt +++ b/library/src/commonTest/kotlin/com/lagradost/cloudstream3/utils/JsInterpreterTest.kt @@ -28,6 +28,10 @@ class JsInterpreterTest { private fun num(code: String, variable: String? = null): Double = evalJsInternal(code, variable) as? Double ?: Double.NaN private fun str(code: String, variable: String? = null): String = jsValueToString(evalJsInternal(code, variable)) + private suspend fun JsContext.bool(code: String): Boolean = eval(code) as? Boolean ?: false + private suspend fun JsContext.num(code: String): Double = eval(code) as? Double ?: Double.NaN + private suspend fun JsContext.str(code: String): String = jsValueToString(eval(code)) + private fun assertApprox(expected: Double, actual: Double, tol: Double = 1e-9) { assertTrue(abs(actual - expected) <= tol, "Expected $expected ± $tol but was $actual") } @@ -1384,18 +1388,18 @@ class JsInterpreterTest { @Test fun evaluateMathSimpleAddition() { - assertEquals("5", jsValueToString(evalJsInternal("eval(2+3)"))) + assertEquals("5", str("eval(2+3)")) } @Test fun evaluateMathNestedParens() { - assertEquals("12", jsValueToString(evalJsInternal("eval((2+4)*2)"))) + assertEquals("12", str("eval((2+4)*2)")) } @Test fun evaluateMathProducesCharCode() { val code = "eval(1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1)" - assertEquals(65.0, (evalJsInternal(code) as? Double) ?: 0.0) + assertEquals(65.0, num(code)) } @Test @@ -1925,12 +1929,12 @@ class JsInterpreterTest { @Test fun emptyStringMinusNegatedEmptyStringIsZero() { - assertEquals(0.0, evalJsInternal("\"\" - - \"\"")) + assertEquals(0.0, num("\"\" - - \"\"")) } @Test fun emptyStringMinusNumber() { - assertEquals(-1.0, evalJsInternal("\"\" - 1")) + assertEquals(-1.0, num("\"\" - 1")) } @Test @@ -1946,7 +1950,7 @@ class JsInterpreterTest { @Test fun postfixIncrementOnNonLvalueFailsGracefully() { - assertEquals(2.0, evalJsInternal("true+1")) + assertEquals(2.0, num("true+1")) // `true++` has no valid assignment target (a SyntaxError in real JS); evalJs falls // back to Unit instead of returning a bogus number. assertEquals(Unit, evalJsInternal("true++")) @@ -2029,7 +2033,7 @@ class JsInterpreterTest { @Test fun combinedCoercionOfNaNEmptyStringAndArrayHoleIsZero() { - assertEquals(0.0, evalJsInternal("+!!NaN * \"\" - - [,]")) + assertEquals(0.0, num("+!!NaN * \"\" - - [,]")) } /** Returns a [CoroutineScope] backed by a plain [Job] with no dispatcher attached. */ @@ -2153,7 +2157,6 @@ class JsInterpreterTest { } } } - done.send(Unit) } @@ -2165,7 +2168,7 @@ class JsInterpreterTest { @Test fun newJsContextWithNoInitializerIsUsable() = runTest { val ctx = newJsContext() - assertEquals(3.0, ctx.eval("1+2") as? Double ?: 0.0) + assertEquals(3.0, ctx.num("1+2")) } @Test @@ -2225,8 +2228,7 @@ class JsInterpreterTest { fun jsContextFunctionDeclaredInOneEvalUsableInAnother() = runTest { val ctx = newJsContext() ctx.eval("function double(n) { return n * 2; }") - val result = ctx.eval("double(21)") - assertEquals(42.0, result as? Double ?: 0.0) + assertEquals(42.0, ctx.num("double(21)")) } @Test @@ -2234,13 +2236,13 @@ class JsInterpreterTest { val ctx = newJsContext() ctx.eval("var arr = [1,2,3]") ctx.eval("arr.push(4)") - assertEquals("1,2,3,4", ctx.eval("arr.join(',')") as? String) + assertEquals("1,2,3,4", ctx.str("arr.join(',')")) } @Test fun jsContextEvalReturnsLastStatementValue() = runTest { val ctx = newJsContext() - assertEquals(9.0, ctx.eval("var a = 3; a * a") as? Double ?: 0.0) + assertEquals(9.0, ctx.num("var a = 3; a * a")) } @Test @@ -2252,7 +2254,7 @@ class JsInterpreterTest { @Test fun jsContextEvalReturnsStringValue() = runTest { val ctx = newJsContext() - assertEquals("ab", ctx.eval("'a' + 'b'")) + assertEquals("ab", ctx.str("'a' + 'b'")) } @Test @@ -2267,7 +2269,7 @@ class JsInterpreterTest { fun separateJsContextsDoNotShareFunctions() = runTest { val ctx1 = newJsContext { eval("function f(){ return 1; }") } val ctx2 = newJsContext() - assertEquals(1.0, ctx1.eval("f()") as? Double ?: 0.0) + assertEquals(1.0, ctx1.num("f()")) // f was never declared in ctx2, so calling it should not crash and yields Unit. assertEquals(Unit, ctx2.eval("typeof f === 'function' ? f() : undefined")) } @@ -2275,8 +2277,7 @@ class JsInterpreterTest { @Test fun jsContextEvalDefaultBudgetHandlesNormalScript() = runTest { val ctx = newJsContext() - val result = ctx.eval("var s=0; for(var i=1;i<=1000;i++){s+=i} s") - assertEquals(500500.0, result as? Double ?: 0.0) + assertEquals(500500.0, ctx.num("var s=0; for(var i=1;i<=1000;i++){s+=i} s")) } @Test @@ -2312,8 +2313,7 @@ class JsInterpreterTest { // Abort this call assertEquals(Unit, ctx.eval("while(true){}")) // The next call, using the defaults again, runs a normal script fine. - val result = ctx.eval("1+1") - assertEquals(2.0, result as? Double ?: 0.0) + assertEquals(2.0, ctx.num("1+1")) } @Test @@ -2341,7 +2341,6 @@ class JsInterpreterTest { } } } - done.send(Unit) } @@ -2354,10 +2353,10 @@ class JsInterpreterTest { fun jsContextEvalNotCancelledWhenWithTimeoutDoesNotExpire() = runTest { val ctx = newJsContext() val result = withTimeoutOrNull(5.seconds) { - ctx.eval("var s=0; for(var i=0;i<100;i++){s+=i} s") + ctx.num("var s=0; for(var i=0;i<100;i++){s+=i} s") } - assertEquals(4950.0, result as? Double ?: 0.0) + assertEquals(4950.0, result ?: Double.NaN) } @Test @@ -2392,19 +2391,19 @@ class JsInterpreterTest { @Test fun jsContextInitializerCanReadBackItsOwnEvalResult() = runTest { - var capturedDuringInit: Any? = null + var capturedDuringInit: Double? = null newJsContext { - capturedDuringInit = eval("2 * 21") + capturedDuringInit = num("2 * 21") } - assertEquals(42.0, capturedDuringInit as? Double ?: 0.0) + assertEquals(42.0, capturedDuringInit ?: Double.NaN) } @Test fun jsContextSequentialIndependentComputations() = runTest { val ctx = newJsContext() - assertEquals(4.0, ctx.eval("2+2") as? Double ?: 0.0) - assertEquals("hi", ctx.eval("'h'+'i'") as? String) - assertFalse(ctx.eval("1 > 2") as? Boolean ?: true) + assertEquals(4.0, ctx.num("2+2")) + assertEquals("hi", ctx.str("'h'+'i'")) + assertFalse(ctx.bool("1 > 2")) } } From 3796406e636356f556c16e04e1da4e37d6a19038 Mon Sep 17 00:00:00 2001 From: Osten <11805592+LagradOst@users.noreply.github.com> Date: Fri, 10 Jul 2026 01:46:50 +0200 Subject: [PATCH 20/38] Bump to 4.8.0 --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 8935ab52a..f20c19832 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -63,7 +63,7 @@ compileSdk = "36" targetSdk = "36" versionCode = "68" -versionName = "4.7.0" +versionName = "4.8.0" [libraries] activity-ktx = { module = "androidx.activity:activity-ktx", version.ref = "activityKtx" } From 189162fac9183f17fcb26bf3b6b6f09e8001397c Mon Sep 17 00:00:00 2001 From: Luna712 <142361265+Luna712@users.noreply.github.com> Date: Fri, 10 Jul 2026 10:12:06 -0600 Subject: [PATCH 21/38] AesHelper: make the new cryptoAESHandler suspend (#3039) --- .../cloudstream3/extractors/helper/AesHelper.kt | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/extractors/helper/AesHelper.kt b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/extractors/helper/AesHelper.kt index 22527bcfb..a09159245 100644 --- a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/extractors/helper/AesHelper.kt +++ b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/extractors/helper/AesHelper.kt @@ -9,6 +9,7 @@ import dev.whyoleg.cryptography.CryptographyProvider import dev.whyoleg.cryptography.DelicateCryptographyApi import dev.whyoleg.cryptography.algorithms.AES import dev.whyoleg.cryptography.algorithms.MD5 +import kotlinx.coroutines.runBlocking import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -21,7 +22,7 @@ object AesHelper { @OptIn(DelicateCryptographyApi::class) @Prerelease - fun cryptoAESHandler( + suspend fun cryptoAESHandler( data: String, pass: ByteArray, encrypt: Boolean = true, @@ -35,14 +36,14 @@ object AesHelper { saltLength = parse.s.length / 2, ) ?: return null - val aesKey = aesCbc.keyDecoder().decodeFromByteArrayBlocking(AES.Key.Format.RAW, key) + val aesKey = aesCbc.keyDecoder().decodeFromByteArray(AES.Key.Format.RAW, key) val cipher = aesKey.cipher(padding = padding) return if (!encrypt) { - val plainBytes = cipher.decryptWithIvBlocking(iv, base64DecodeArray(parse.ct)) + val plainBytes = cipher.decryptWithIv(iv, base64DecodeArray(parse.ct)) plainBytes.decodeToString() } else { - base64Encode(cipher.encryptWithIvBlocking(iv, parse.ct.encodeToByteArray())) + base64Encode(cipher.encryptWithIv(iv, parse.ct.encodeToByteArray())) } } @@ -60,7 +61,7 @@ object AesHelper { // If it ends with NoPadding (e.g. "AES/CBC/NoPadding"), then it // doesn't have padding, otherwise we treat as if it does. val hasPadding = !padding.endsWith("NoPadding") - return cryptoAESHandler(data, pass, encrypt, hasPadding) + return runBlocking { cryptoAESHandler(data, pass, encrypt, hasPadding) } } // https://stackoverflow.com/a/41434590/8166854 From b681d443e42b0fd5daa413cc42b7f6ff38181ebb Mon Sep 17 00:00:00 2001 From: Luna712 <142361265+Luna712@users.noreply.github.com> Date: Fri, 10 Jul 2026 10:18:30 -0600 Subject: [PATCH 22/38] [skip ci] Make some classes serializable (#2874) --- .../ui/player/PlayerSubtitleHelper.kt | 33 +++++---- .../cloudstream3/ui/result/ResultFragment.kt | 53 ++++++++------- .../com/lagradost/cloudstream3/MainAPI.kt | 67 +++++++++++-------- .../cloudstream3/utils/ExtractorApi.kt | 29 ++++---- 4 files changed, 102 insertions(+), 80 deletions(-) diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/player/PlayerSubtitleHelper.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/player/PlayerSubtitleHelper.kt index ee6170aa5..f62bad58d 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/player/PlayerSubtitleHelper.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/player/PlayerSubtitleHelper.kt @@ -8,11 +8,14 @@ import androidx.annotation.OptIn import androidx.media3.common.MimeTypes import androidx.media3.common.util.UnstableApi import androidx.media3.ui.SubtitleView +import com.fasterxml.jackson.annotation.JsonIgnore import com.lagradost.cloudstream3.SubtitleFile import com.lagradost.cloudstream3.ui.subtitles.SaveCaptionStyle import com.lagradost.cloudstream3.ui.subtitles.SubtitlesFragment.Companion.setSubtitleViewStyle import com.lagradost.cloudstream3.utils.SubtitleHelper.fromLanguageToTagIETF import com.lagradost.cloudstream3.utils.UIHelper.toPx +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable enum class SubtitleStatus { IS_ACTIVE, @@ -32,17 +35,19 @@ enum class SubtitleOrigin { * @param url Url for the subtitle, when EMBEDDED_IN_VIDEO this variable is used as the real backend id * @param headers if empty it will use the base onlineDataSource headers else only the specified headers * @param languageCode usually, tags such as "en", "es-mx", or "zh-hant-TW". But it could be something like "English 4" - * */ + */ +@Serializable data class SubtitleData( - val originalName: String, - val nameSuffix: String, - val url: String, - val origin: SubtitleOrigin, - val mimeType: String, - val headers: Map, - val languageCode: String?, + @SerialName("originalName") val originalName: String, + @SerialName("nameSuffix") val nameSuffix: String, + @SerialName("url") val url: String, + @SerialName("origin") val origin: SubtitleOrigin, + @SerialName("mimeType") val mimeType: String, + @SerialName("headers") val headers: Map, + @SerialName("languageCode") val languageCode: String?, ) { - /** Internal ID for exoplayer, unique for each link*/ + /** Internal ID for media3, unique for each link. */ + @JsonIgnore fun getId(): String { return if (origin == SubtitleOrigin.EMBEDDED_IN_VIDEO) url else "$url|$name" @@ -54,22 +59,22 @@ data class SubtitleData( } /** Tries hard to figure out a valid IETF tag based on language code and name. Will return null if not found. */ + @JsonIgnore fun getIETF_tag(): String? { return fromLanguageToTagIETF(this.languageCode) ?: fromLanguageToTagIETF(this.originalName, halfMatch = true) } - val name = "$originalName $nameSuffix" + @SerialName("name") val name = "$originalName $nameSuffix" /** * Gets the URL, but tries to fix it if it is malformed. */ + @JsonIgnore fun getFixedUrl(): String { // Some extensions fail to include the protocol, this helps with that. val fixedSubUrl = if (this.url.startsWith("//")) { "https:${this.url}" - } else { - this.url - } + } else this.url return fixedSubUrl } } @@ -142,4 +147,4 @@ class PlayerSubtitleHelper { setSubStyle(it) } } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultFragment.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultFragment.kt index cbf94fd97..71909c5d3 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultFragment.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultFragment.kt @@ -21,6 +21,8 @@ import com.lagradost.cloudstream3.utils.DataStoreHelper.getViewPos import com.lagradost.cloudstream3.utils.Event import com.lagradost.cloudstream3.utils.ImageLoader.loadImage import com.lagradost.cloudstream3.utils.UiImage +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable const val START_ACTION_RESUME_LATEST = 1 const val START_ACTION_LOAD_EP = 2 @@ -34,33 +36,32 @@ enum class VideoWatchState { Watched } +@Serializable data class ResultEpisode( - val headerName: String, - val name: String?, - val poster: String?, - val episode: Int, - val seasonIndex: Int?, // this is the "season" index used season names - val season: Int?, // this is the display - val data: String, - val apiName: String, - val id: Int, - val index: Int, - val position: Long, // time in MS - val duration: Long, // duration in MS - val score: Score?, - val description: String?, - val isFiller: Boolean?, - val tvType: TvType, - val parentId: Int, - /** - * Conveys if the episode itself is marked as watched - **/ - val videoWatchState: VideoWatchState, - /** Sum of all previous season episode counts + episode */ - val totalEpisodeIndex: Int? = null, - val airDate: Long? = null, - val runTime: Int? = null, - val seasonData: SeasonData? = null, + @SerialName("headerName") val headerName: String, + @SerialName("name") val name: String?, + @SerialName("poster") val poster: String?, + @SerialName("episode") val episode: Int, + @SerialName("seasonIndex") val seasonIndex: Int?, // this is the "season" index used season names + @SerialName("season") val season: Int?, // this is the display + @SerialName("data") val data: String, + @SerialName("apiName") val apiName: String, + @SerialName("id") val id: Int, + @SerialName("index") val index: Int, + @SerialName("position") val position: Long, // time in MS + @SerialName("duration") val duration: Long, // duration in MS + @SerialName("score") val score: Score?, + @SerialName("description") val description: String?, + @SerialName("isFiller") val isFiller: Boolean?, + @SerialName("tvType") val tvType: TvType, + @SerialName("parentId") val parentId: Int, + /** Conveys if the episode itself is marked as watched. */ + @SerialName("videoWatchState") val videoWatchState: VideoWatchState, + /** Sum of all previous season episode counts + episode. */ + @SerialName("totalEpisodeIndex") val totalEpisodeIndex: Int? = null, + @SerialName("airDate") val airDate: Long? = null, + @SerialName("runTime") val runTime: Int? = null, + @SerialName("seasonData") val seasonData: SeasonData? = null, ) fun ResultEpisode.getRealPosition(): Long { diff --git a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/MainAPI.kt b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/MainAPI.kt index 99421a800..53b773e59 100644 --- a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/MainAPI.kt +++ b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/MainAPI.kt @@ -39,6 +39,8 @@ import kotlinx.datetime.format.byUnicodePattern import kotlinx.datetime.format.char import kotlinx.datetime.format.parse import kotlinx.datetime.toInstant +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable import kotlinx.serialization.json.Json import kotlin.io.encoding.Base64 import kotlin.jvm.JvmName @@ -325,7 +327,7 @@ object APIHolder { ).toJson().toRequestBody(RequestBodyTypes.JSON.toMediaTypeOrNull()) return app.post("https://graphql.anilist.co", requestBody = data) - .parsedSafe() + .parsedSafe() } } @@ -393,18 +395,19 @@ const val PROVIDER_STATUS_SLOW = 2 const val PROVIDER_STATUS_OK = 1 const val PROVIDER_STATUS_DOWN = 0 +@Serializable data class ProvidersInfoJson( - @JsonProperty("name") var name: String, - @JsonProperty("url") var url: String, - @JsonProperty("credentials") var credentials: String? = null, - @JsonProperty("status") var status: Int, + @JsonProperty("name") @SerialName("name") var name: String, + @JsonProperty("url") @SerialName("url") var url: String, + @JsonProperty("credentials") @SerialName("credentials") var credentials: String? = null, + @JsonProperty("status") @SerialName("status") var status: Int, ) +@Serializable data class SettingsJson( - @JsonProperty("enableAdult") var enableAdult: Boolean = false, + @JsonProperty("enableAdult") @SerialName("enableAdult") var enableAdult: Boolean = false, ) - data class MainPageData( val name: String, val data: String, @@ -868,10 +871,10 @@ enum class DubStatus(val id: Int) { * of this as a decimal class specifically for ratings. * */ @JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY) +@Serializable class Score private constructor( /** Decimal between [0, 10^9] representing the min score and max score respectively */ - @JsonProperty("data") - private val data: Int, + @JsonProperty("data") @SerialName("data") private val data: Int, ) { override fun hashCode(): Int = this.data.hashCode() override fun equals(other: Any?): Boolean = other is Score && this.data == other.data @@ -1197,9 +1200,10 @@ suspend fun newSubtitleFile( * @see newAudioFile * */ @ConsistentCopyVisibility +@Serializable data class AudioFile internal constructor( - var url: String, - var headers: Map? = null + @JsonProperty("url") @SerialName("url") var url: String, + @JsonProperty("headers") @SerialName("headers") var headers: Map? = null, ) /** Creates an AudioFile with optional initializer for setting additional properties. @@ -2176,10 +2180,11 @@ data class NextAiring( * @param name To be shown next to the season like "Season $displaySeason $name" but if displaySeason is null then "$name" * @param displaySeason What to be displayed next to the season name, if null then the name is the only thing shown. * */ +@Serializable data class SeasonData( - val season: Int, - val name: String? = null, - val displaySeason: Int? = null, // will use season if null + @JsonProperty("season") @SerialName("season") val season: Int, + @JsonProperty("name") @SerialName("name") val name: String? = null, + @JsonProperty("displaySeason") @SerialName("displaySeason") val displaySeason: Int? = null, // will use season if null ) /** Abstract interface of EpisodeResponse */ @@ -2737,32 +2742,38 @@ data class Tracker( val cover: String? = null, ) +@Serializable data class AniSearch( - @JsonProperty("data") var data: Data? = Data() + @JsonProperty("data") @SerialName("data") var data: Data? = Data(), ) { + @Serializable data class Data( - @JsonProperty("Page") var page: Page? = Page() + @JsonProperty("Page") @SerialName("Page") var page: Page? = Page(), ) { + @Serializable data class Page( - @JsonProperty("media") var media: ArrayList = arrayListOf() + @JsonProperty("media") @SerialName("media") var media: ArrayList = arrayListOf(), ) { + @Serializable data class Media( - @JsonProperty("title") var title: Title? = null, - @JsonProperty("id") var id: Int? = null, - @JsonProperty("idMal") var idMal: Int? = null, - @JsonProperty("seasonYear") var seasonYear: Int? = null, - @JsonProperty("format") var format: String? = null, - @JsonProperty("coverImage") var coverImage: CoverImage? = null, - @JsonProperty("bannerImage") var bannerImage: String? = null, + @JsonProperty("title") @SerialName("title") var title: Title? = null, + @JsonProperty("id") @SerialName("id") var id: Int? = null, + @JsonProperty("idMal") @SerialName("idMal") var idMal: Int? = null, + @JsonProperty("seasonYear") @SerialName("seasonYear") var seasonYear: Int? = null, + @JsonProperty("format") @SerialName("format") var format: String? = null, + @JsonProperty("coverImage") @SerialName("coverImage") var coverImage: CoverImage? = null, + @JsonProperty("bannerImage") @SerialName("bannerImage") var bannerImage: String? = null, ) { + @Serializable data class CoverImage( - @JsonProperty("extraLarge") var extraLarge: String? = null, - @JsonProperty("large") var large: String? = null, + @JsonProperty("extraLarge") @SerialName("extraLarge") var extraLarge: String? = null, + @JsonProperty("large") @SerialName("large") var large: String? = null, ) + @Serializable data class Title( - @JsonProperty("romaji") var romaji: String? = null, - @JsonProperty("english") var english: String? = null, + @JsonProperty("romaji") @SerialName("romaji") var romaji: String? = null, + @JsonProperty("english") @SerialName("english") var english: String? = null, ) { fun isMatchingTitles(title: String?): Boolean { if (title == null) return false diff --git a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/ExtractorApi.kt b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/ExtractorApi.kt index 8ef391050..554170df5 100644 --- a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/ExtractorApi.kt +++ b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/ExtractorApi.kt @@ -328,6 +328,9 @@ import io.ktor.http.decodeURLPart import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.delay import kotlinx.coroutines.ensureActive +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import kotlinx.serialization.Transient import kotlin.coroutines.cancellation.CancellationException import kotlin.uuid.ExperimentalUuidApi import kotlin.uuid.Uuid @@ -418,6 +421,7 @@ enum class ExtractorLinkType { MAGNET; // See https://www.iana.org/assignments/media-types/media-types.xhtml + @JsonIgnore fun getMimeType(): String { return when (this) { VIDEO -> "video/mp4" @@ -685,26 +689,27 @@ open class DrmExtractorLink private constructor( * @property audioTracks List of separate audio tracks that can be used with this video * @see newExtractorLink * */ +@Serializable open class ExtractorLink @Deprecated("Use newExtractorLink", level = DeprecationLevel.WARNING) constructor( - open val source: String, - open val name: String, - override val url: String, - override var referer: String, - open var quality: Int, - override var headers: Map = mapOf(), + @SerialName("source") open val source: String, + @SerialName("name") open val name: String, + @SerialName("url") override val url: String, + @SerialName("referer") override var referer: String, + @SerialName("quality") open var quality: Int, + @SerialName("headers") override var headers: Map = mapOf(), /** Used for getExtractorVerifierJob() */ - open var extractorData: String? = null, - open var type: ExtractorLinkType, + @SerialName("extractorData") open var extractorData: String? = null, + @SerialName("type") open var type: ExtractorLinkType, /** List of separate audio tracks that can be merged with this video */ - open var audioTracks: List = emptyList(), + @SerialName("audioTracks") open var audioTracks: List = emptyList(), ) : IDownloadableMinimum { - val isM3u8: Boolean get() = type == ExtractorLinkType.M3U8 - val isDash: Boolean get() = type == ExtractorLinkType.DASH + @get:JsonIgnore val isM3u8: Boolean get() = type == ExtractorLinkType.M3U8 + @get:JsonIgnore val isDash: Boolean get() = type == ExtractorLinkType.DASH // Cached video size - private var videoSize: Long? = null + @Transient private var videoSize: Long? = null /** * Get video size in bytes with one head request. Only available for ExtractorLinkType.Video From c36652d265a970f261060a5707293361b278e667 Mon Sep 17 00:00:00 2001 From: Luna712 <142361265+Luna712@users.noreply.github.com> Date: Fri, 10 Jul 2026 10:40:25 -0600 Subject: [PATCH 23/38] [skip ci] DownloadObjects: migrate to kotlinx serialization (#3026) --- .../utils/downloader/DownloadManager.kt | 4 +- .../utils/downloader/DownloadObjects.kt | 181 ++++++++++-------- 2 files changed, 106 insertions(+), 79 deletions(-) diff --git a/app/src/main/java/com/lagradost/cloudstream3/utils/downloader/DownloadManager.kt b/app/src/main/java/com/lagradost/cloudstream3/utils/downloader/DownloadManager.kt index 7cb190667..adefedd20 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/utils/downloader/DownloadManager.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/utils/downloader/DownloadManager.kt @@ -1640,11 +1640,11 @@ object VideoDownloadManager { } fun getDownloadResumePackage(context: Context, id: Int): DownloadResumePackage? { - return context.getKey(KEY_RESUME_PACKAGES, id.toString()) + return context.getKey(KEY_RESUME_PACKAGES, id.toString()) } fun getDownloadQueuePackage(context: Context, id: Int): DownloadQueueWrapper? { - return context.getKey(KEY_RESUME_IN_QUEUE, id.toString()) + return context.getKey(KEY_RESUME_IN_QUEUE, id.toString()) } fun getDownloadEpisodeMetadata( diff --git a/app/src/main/java/com/lagradost/cloudstream3/utils/downloader/DownloadObjects.kt b/app/src/main/java/com/lagradost/cloudstream3/utils/downloader/DownloadObjects.kt index 25a9fdf2a..946e7ecf9 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/utils/downloader/DownloadObjects.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/utils/downloader/DownloadObjects.kt @@ -1,23 +1,32 @@ package com.lagradost.cloudstream3.utils.downloader import android.net.Uri +import com.fasterxml.jackson.annotation.JsonIgnore import com.fasterxml.jackson.annotation.JsonProperty import com.lagradost.cloudstream3.Score +import com.lagradost.cloudstream3.SkipSerializationTest import com.lagradost.cloudstream3.TvType import com.lagradost.cloudstream3.services.DownloadQueueService import com.lagradost.cloudstream3.ui.player.SubtitleData import com.lagradost.cloudstream3.ui.result.ResultEpisode import com.lagradost.cloudstream3.utils.ExtractorLink +import com.lagradost.cloudstream3.utils.serializers.UriSerializer +import com.lagradost.cloudstream3.utils.serializers.WriteOnlySerializer import com.lagradost.safefile.SafeFile +import kotlinx.serialization.ExperimentalSerializationApi +import kotlinx.serialization.KeepGeneratedSerializer +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable import java.io.IOException import java.io.OutputStream import java.util.Objects object DownloadObjects { /** An item can either be something to resume or something new to start */ + @Serializable data class DownloadQueueWrapper( - @JsonProperty("resumePackage") val resumePackage: DownloadResumePackage?, - @JsonProperty("downloadItem") val downloadItem: DownloadQueueItem?, + @JsonProperty("resumePackage") @SerialName("resumePackage") val resumePackage: DownloadResumePackage?, + @JsonProperty("downloadItem") @SerialName("downloadItem") val downloadItem: DownloadQueueItem?, ) { init { assert(resumePackage != null || downloadItem != null) { @@ -26,56 +35,66 @@ object DownloadObjects { } /** Loop through the current download instances to see if it is currently downloading. Also includes link loading. */ + @JsonIgnore fun isCurrentlyDownloading(): Boolean { return DownloadQueueService.downloadInstances.value.any { it.downloadQueueWrapper.id == this.id } } - @JsonProperty("id") + @JsonProperty("id") @SerialName("id") val id = resumePackage?.item?.ep?.id ?: downloadItem!!.episode.id - @JsonProperty("parentId") + @JsonProperty("parentId") @SerialName("parentId") val parentId = resumePackage?.item?.ep?.parentId ?: downloadItem!!.episode.parentId } /** General data about the episode and show to start a download from. */ + @Serializable data class DownloadQueueItem( - @JsonProperty("episode") val episode: ResultEpisode, - @JsonProperty("isMovie") val isMovie: Boolean, - @JsonProperty("resultName") val resultName: String, - @JsonProperty("resultType") val resultType: TvType, - @JsonProperty("resultPoster") val resultPoster: String?, - @JsonProperty("apiName") val apiName: String, - @JsonProperty("resultId") val resultId: Int, - @JsonProperty("resultUrl") val resultUrl: String, - @JsonProperty("links") val links: List? = null, - @JsonProperty("subs") val subs: List? = null, + @JsonProperty("episode") @SerialName("episode") val episode: ResultEpisode, + @JsonProperty("isMovie") @SerialName("isMovie") val isMovie: Boolean, + @JsonProperty("resultName") @SerialName("resultName") val resultName: String, + @JsonProperty("resultType") @SerialName("resultType") val resultType: TvType, + @JsonProperty("resultPoster") @SerialName("resultPoster") val resultPoster: String?, + @JsonProperty("apiName") @SerialName("apiName") val apiName: String, + @JsonProperty("resultId") @SerialName("resultId") val resultId: Int, + @JsonProperty("resultUrl") @SerialName("resultUrl") val resultUrl: String, + @JsonProperty("links") @SerialName("links") val links: List? = null, + @JsonProperty("subs") @SerialName("subs") val subs: List? = null, ) { fun toWrapper(): DownloadQueueWrapper { return DownloadQueueWrapper(null, this) } } + interface DownloadCached { + val id: Int + } - abstract class DownloadCached( - @JsonProperty("id") open val id: Int, - ) - + @OptIn(ExperimentalSerializationApi::class) // KeepGeneratedSerializer is an experimental annotation for now + @KeepGeneratedSerializer + @Serializable(with = DownloadEpisodeCached.Serializer::class) data class DownloadEpisodeCached( - @JsonProperty("name") val name: String?, - @JsonProperty("poster") val poster: String?, - @JsonProperty("episode") val episode: Int, - @JsonProperty("season") val season: Int?, - @JsonProperty("parentId") val parentId: Int, - @JsonProperty("score") var score: Score? = null, - @JsonProperty("description") val description: String?, - @JsonProperty("cacheTime") val cacheTime: Long, - override val id: Int, - ) : DownloadCached(id) { + @JsonProperty("name") @SerialName("name") val name: String?, + @JsonProperty("poster") @SerialName("poster") val poster: String?, + @JsonProperty("episode") @SerialName("episode") val episode: Int, + @JsonProperty("season") @SerialName("season") val season: Int?, + @JsonProperty("parentId") @SerialName("parentId") val parentId: Int, + @JsonProperty("score") @SerialName("score") var score: Score? = null, + @JsonProperty("description") @SerialName("description") val description: String?, + @JsonProperty("cacheTime") @SerialName("cacheTime") val cacheTime: Long, + @JsonProperty("id") @SerialName("id") override val id: Int, + ) : DownloadCached { + object Serializer : WriteOnlySerializer( + DownloadEpisodeCached.generatedSerializer(), + setOf("rating"), + ) + @JsonProperty("rating", access = JsonProperty.Access.WRITE_ONLY) + @SerialName("rating") @Deprecated( "`rating` is the old scoring system, use score instead", replaceWith = ReplaceWith("score"), - level = DeprecationLevel.ERROR + level = DeprecationLevel.ERROR, ) var rating: Int? = null set(value) { @@ -87,74 +106,81 @@ object DownloadObjects { } /** What to display to the user for a downloaded show/movie. Includes info such as name, poster and url */ + @Serializable data class DownloadHeaderCached( - @JsonProperty("apiName") val apiName: String, - @JsonProperty("url") val url: String, - @JsonProperty("type") val type: TvType, - @JsonProperty("name") val name: String, - @JsonProperty("poster") val poster: String?, - @JsonProperty("cacheTime") val cacheTime: Long, - override val id: Int, - ) : DownloadCached(id) + @JsonProperty("apiName") @SerialName("apiName") val apiName: String, + @JsonProperty("url") @SerialName("url") val url: String, + @JsonProperty("type") @SerialName("type") val type: TvType, + @JsonProperty("name") @SerialName("name") val name: String, + @JsonProperty("poster") @SerialName("poster") val poster: String?, + @JsonProperty("cacheTime") @SerialName("cacheTime") val cacheTime: Long, + @JsonProperty("id") @SerialName("id") override val id: Int, + ) : DownloadCached + @Serializable data class DownloadResumePackage( - @JsonProperty("item") val item: DownloadItem, + @JsonProperty("item") @SerialName("item") val item: DownloadItem, /** Tills which link should get resumed */ - @JsonProperty("linkIndex") val linkIndex: Int?, + @JsonProperty("linkIndex") @SerialName("linkIndex") val linkIndex: Int?, ) { fun toWrapper(): DownloadQueueWrapper { return DownloadQueueWrapper(this, null) } } + @Serializable data class DownloadItem( - @JsonProperty("source") val source: String?, - @JsonProperty("folder") val folder: String?, - @JsonProperty("ep") val ep: DownloadEpisodeMetadata, - @JsonProperty("links") val links: List, + @JsonProperty("source") @SerialName("source") val source: String?, + @JsonProperty("folder") @SerialName("folder") val folder: String?, + @JsonProperty("ep") @SerialName("ep") val ep: DownloadEpisodeMetadata, + @JsonProperty("links") @SerialName("links") val links: List, ) /** Metadata for a specific episode and how to display it. */ + @Serializable data class DownloadEpisodeMetadata( - @JsonProperty("id") val id: Int, - @JsonProperty("parentId") val parentId: Int, - @JsonProperty("mainName") val mainName: String, - @JsonProperty("sourceApiName") val sourceApiName: String?, - @JsonProperty("poster") val poster: String?, - @JsonProperty("name") val name: String?, - @JsonProperty("season") val season: Int?, - @JsonProperty("episode") val episode: Int?, - @JsonProperty("type") val type: TvType?, + @JsonProperty("id") @SerialName("id") val id: Int, + @JsonProperty("parentId") @SerialName("parentId") val parentId: Int, + @JsonProperty("mainName") @SerialName("mainName") val mainName: String, + @JsonProperty("sourceApiName") @SerialName("sourceApiName") val sourceApiName: String?, + @JsonProperty("poster") @SerialName("poster") val poster: String?, + @JsonProperty("name") @SerialName("name") val name: String?, + @JsonProperty("season") @SerialName("season") val season: Int?, + @JsonProperty("episode") @SerialName("episode") val episode: Int?, + @JsonProperty("type") @SerialName("type") val type: TvType?, ) - + @Serializable data class DownloadedFileInfo( - @JsonProperty("totalBytes") val totalBytes: Long, - @JsonProperty("relativePath") val relativePath: String, - @JsonProperty("displayName") val displayName: String, - @JsonProperty("extraInfo") val extraInfo: String? = null, - @JsonProperty("basePath") val basePath: String? = null, // null is for legacy downloads. See getBasePath() + @JsonProperty("totalBytes") @SerialName("totalBytes") val totalBytes: Long, + @JsonProperty("relativePath") @SerialName("relativePath") val relativePath: String, + @JsonProperty("displayName") @SerialName("displayName") val displayName: String, + @JsonProperty("extraInfo") @SerialName("extraInfo") val extraInfo: String? = null, + @JsonProperty("basePath") @SerialName("basePath") val basePath: String? = null, // null is for legacy downloads. See getBasePath() // Hash of the link associated with this DownloadFile, used so not override old data in the DownloadedFileInfo - @JsonProperty("linkHash") val linkHash : Int? = null + @JsonProperty("linkHash") @SerialName("linkHash") val linkHash: Int? = null, ) + @Serializable + @SkipSerializationTest // Uri has issues with Jackson data class DownloadedFileInfoResult( - @JsonProperty("fileLength") val fileLength: Long, - @JsonProperty("totalBytes") val totalBytes: Long, - @JsonProperty("path") val path: Uri, + @JsonProperty("fileLength") @SerialName("fileLength") val fileLength: Long, + @JsonProperty("totalBytes") @SerialName("totalBytes") val totalBytes: Long, + @JsonProperty("path") @SerialName("path") + @Serializable(with = UriSerializer::class) + val path: Uri, ) - + @Serializable data class ResumeWatching( - @JsonProperty("parentId") val parentId: Int, - @JsonProperty("episodeId") val episodeId: Int?, - @JsonProperty("episode") val episode: Int?, - @JsonProperty("season") val season: Int?, - @JsonProperty("updateTime") val updateTime: Long, - @JsonProperty("isFromDownload") val isFromDownload: Boolean, + @JsonProperty("parentId") @SerialName("parentId") val parentId: Int, + @JsonProperty("episodeId") @SerialName("episodeId") val episodeId: Int?, + @JsonProperty("episode") @SerialName("episode") val episode: Int?, + @JsonProperty("season") @SerialName("season") val season: Int?, + @JsonProperty("updateTime") @SerialName("updateTime") val updateTime: Long, + @JsonProperty("isFromDownload") @SerialName("isFromDownload") val isFromDownload: Boolean, ) - data class DownloadStatus( /** if you should retry with the same args and hope for a better result */ val retrySame: Boolean, @@ -164,20 +190,19 @@ object DownloadObjects { val success: Boolean, ) - data class CreateNotificationMetadata( val type: VideoDownloadManager.DownloadType, val bytesDownloaded: Long, val bytesTotal: Long, val hlsProgress: Long? = null, val hlsTotal: Long? = null, - val bytesPerSecond: Long + val bytesPerSecond: Long, ) data class StreamData( private val fileLength: Long, val file: SafeFile, - //val fileStream: OutputStream, + // val fileStream: OutputStream, ) { @Throws(IOException::class) fun open(): OutputStream { @@ -198,9 +223,11 @@ object DownloadObjects { val exists: Boolean get() = file.exists() == true } - - /** bytes have the size end-start where the byte range is [start,end) - * note that ByteArray is a pointer and therefore cant be stored without cloning it */ + /** + * Bytes have the size end-start where the byte range is [start,end) + * note that ByteArray is a pointer and therefore can't be stored + * without cloning it. + */ data class LazyStreamDownloadResponse( val bytes: ByteArray, val startByte: Long, @@ -221,4 +248,4 @@ object DownloadObjects { return Objects.hash(startByte, endByte) } } -} \ No newline at end of file +} From e75b5e64a7ea49498d87208542bb38ce468db152 Mon Sep 17 00:00:00 2001 From: Kraptor123 <89366989+Kraptor123@users.noreply.github.com> Date: Fri, 10 Jul 2026 19:52:23 +0300 Subject: [PATCH 24/38] shortcode: Add py.md as alternative to cutt.ly (#3001) --- .../cloudstream3/plugins/RepositoryManager.kt | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/lagradost/cloudstream3/plugins/RepositoryManager.kt b/app/src/main/java/com/lagradost/cloudstream3/plugins/RepositoryManager.kt index 5868146c7..7fec67637 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/plugins/RepositoryManager.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/plugins/RepositoryManager.kt @@ -141,11 +141,19 @@ object RepositoryManager { } } else if (fixedUrl.matches("^[a-zA-Z0-9!_-]+$".toRegex())) { safeAsync { - val response = app.get("https://cutt.ly/${fixedUrl}", allowRedirects = false) - val url = response.headers["Location"] ?: return@safeAsync null - if (url.startsWith("https://cutt.ly/404")) return@safeAsync null - if (url.removeSuffix("/") == "https://cutt.ly") return@safeAsync null - return@safeAsync url + if (fixedUrl.startsWith("!")) { + val response = app.get("https://py.md/${fixedUrl.removePrefix("!")}", allowRedirects = false) + val url = response.headers["Location"] ?: return@safeAsync null + if (url.startsWith("https://py.md/404")) return@safeAsync null + if (url.removeSuffix("/") == "https://py.md") return@safeAsync null + return@safeAsync url + } else { + val response = app.get("https://cutt.ly/${fixedUrl}", allowRedirects = false) + val url = response.headers["Location"] ?: return@safeAsync null + if (url.startsWith("https://cutt.ly/404")) return@safeAsync null + if (url.removeSuffix("/") == "https://cutt.ly") return@safeAsync null + return@safeAsync url + } } } else null } From 5b0c5afebad244dded6b47467339b4d0befefeca Mon Sep 17 00:00:00 2001 From: Luna712 <142361265+Luna712@users.noreply.github.com> Date: Fri, 10 Jul 2026 10:53:36 -0600 Subject: [PATCH 25/38] EmturbovidExtractor: replace selectXpath (#2977) This will be necessary when we finally fully migrate to ksoup, which currently doesn't have selectXpath, but for our usages that is not necessary. This way is also more consistent with how we do it everywhere else. --- .../extractors/EmturbovidExtractor.kt | 24 +++++++++---------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/extractors/EmturbovidExtractor.kt b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/extractors/EmturbovidExtractor.kt index f4a5cdb2b..ca821b21c 100644 --- a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/extractors/EmturbovidExtractor.kt +++ b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/extractors/EmturbovidExtractor.kt @@ -8,35 +8,33 @@ import com.lagradost.cloudstream3.utils.Qualities import com.lagradost.cloudstream3.utils.newExtractorLink open class EmturbovidExtractor : ExtractorApi() { - override var name = "Emturbovid" - override var mainUrl = "https://emturbovid.com" + override val name = "Emturbovid" + override val mainUrl = "https://emturbovid.com" override val requiresReferer = false override suspend fun getUrl(url: String, referer: String?): List? { - val response = app.get( - url, referer = referer ?: "$mainUrl/" - ) - val playerScript = - response.document.selectXpath("//script[contains(text(),'var urlPlay')]") - .html() + val response = app.get(url, referer = referer ?: "$mainUrl/") + val playerScript = response.document + .select("script") + .first { it.data().contains("var urlPlay") } + .html() val sources = mutableListOf() if (playerScript.isNotBlank()) { - val m3u8Url = - playerScript.substringAfter("var urlPlay = '").substringBefore("'") - + val m3u8Url = playerScript.substringAfter("var urlPlay = '").substringBefore("'") sources.add( newExtractorLink( source = name, name = name, url = m3u8Url, - type = ExtractorLinkType.M3U8 + type = ExtractorLinkType.M3U8, ) { this.referer = "$mainUrl/" this.quality = Qualities.Unknown.value } ) } + return sources } -} \ No newline at end of file +} From 8c3dbdc5b68be080715e8b3c6676cfadd03f51df Mon Sep 17 00:00:00 2001 From: Luna712 <142361265+Luna712@users.noreply.github.com> Date: Fri, 10 Jul 2026 10:54:15 -0600 Subject: [PATCH 26/38] Remove fuzzywuzzy from library (#2999) It doesn't use api(), which means extensions don't inherently have access, and they must already have the dependency explicit to use it. It being in app prevents runtime errors if they use it, but it being an implimentation in the library should be completely unused and unnecessary. --- library/build.gradle.kts | 3 --- 1 file changed, 3 deletions(-) diff --git a/library/build.gradle.kts b/library/build.gradle.kts index 9b769d1e5..979e09844 100644 --- a/library/build.gradle.kts +++ b/library/build.gradle.kts @@ -69,9 +69,6 @@ kotlin { implementation(libs.rhino) // Run JavaScript implementation(libs.tmdb.java) // TMDB API v3 Wrapper Made with RetroFit implementation(libs.bundles.cryptography) // Cryptography - - // Deprecated; will be removed once extensions have time to migrate from using it - implementation("me.xdrop:fuzzywuzzy:1.4.0") } commonTest.dependencies { From 3e17b3a5a01b973cd135db259c025c998b7c2680 Mon Sep 17 00:00:00 2001 From: Luna712 <142361265+Luna712@users.noreply.github.com> Date: Fri, 10 Jul 2026 10:55:35 -0600 Subject: [PATCH 27/38] Make some private cryptography methods suspend (#3040) --- .../lagradost/cloudstream3/extractors/ByseSX.kt | 6 +++--- .../cloudstream3/extractors/Rabbitstream.kt | 16 ++++++++-------- .../cloudstream3/extractors/helper/GogoHelper.kt | 8 ++++---- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/extractors/ByseSX.kt b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/extractors/ByseSX.kt index 248b94a73..5248a8861 100644 --- a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/extractors/ByseSX.kt +++ b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/extractors/ByseSX.kt @@ -86,15 +86,15 @@ open class ByseSX : ExtractorApi() { } @OptIn(DelicateCryptographyApi::class) - private fun decryptPlayback(playback: Playback): String? { + private suspend fun decryptPlayback(playback: Playback): String? { val keyBytes = buildAesKey(playback) val ivBytes = b64UrlDecode(playback.iv) val cipherBytes = b64UrlDecode(playback.payload) - val aesKey = aesGcm.keyDecoder().decodeFromByteArrayBlocking(AES.Key.Format.RAW, keyBytes) + val aesKey = aesGcm.keyDecoder().decodeFromByteArray(AES.Key.Format.RAW, keyBytes) // 128-bit GCM tag (default) val cipher = aesKey.cipher() - val plainBytes = cipher.decryptWithIvBlocking(ivBytes, cipherBytes) + val plainBytes = cipher.decryptWithIv(ivBytes, cipherBytes) var jsonStr = plainBytes.decodeToString() if (jsonStr.startsWith("\uFEFF")) jsonStr = jsonStr.substring(1) diff --git a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/extractors/Rabbitstream.kt b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/extractors/Rabbitstream.kt index fe9624430..fdd559258 100644 --- a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/extractors/Rabbitstream.kt +++ b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/extractors/Rabbitstream.kt @@ -133,12 +133,12 @@ open class Rabbitstream : ExtractorApi() { return extractedKey to sources } - private inline fun decryptMapped(input: String, key: String): T? { + private inline suspend fun decryptMapped(input: String, key: String): T? { val decrypt = decrypt(input, key) return AppUtils.tryParseJson(decrypt) } - private fun decrypt(input: String, key: String): String { + private suspend fun decrypt(input: String, key: String): String { return decryptSourceUrl( generateKey( salt = base64DecodeArray(input).copyOfRange(8, 16), @@ -147,7 +147,7 @@ open class Rabbitstream : ExtractorApi() { ) } - private fun generateKey(salt: ByteArray, secret: ByteArray): ByteArray { + private suspend fun generateKey(salt: ByteArray, secret: ByteArray): ByteArray { var key = md5(secret + salt) var currentKey = key while (currentKey.size < 48) { @@ -157,18 +157,18 @@ open class Rabbitstream : ExtractorApi() { return currentKey } - private fun md5(input: ByteArray): ByteArray = - md5Hasher.hashBlocking(input) + private suspend fun md5(input: ByteArray): ByteArray = + md5Hasher.hash(input) @OptIn(DelicateCryptographyApi::class) - private fun decryptSourceUrl(decryptionKey: ByteArray, sourceUrl: String): String { + private suspend fun decryptSourceUrl(decryptionKey: ByteArray, sourceUrl: String): String { val cipherData = base64DecodeArray(sourceUrl) val encrypted = cipherData.copyOfRange(16, cipherData.size) val keyBytes = decryptionKey.copyOfRange(0, 32) val ivBytes = decryptionKey.copyOfRange(32, decryptionKey.size) - val aesKey = aesCbc.keyDecoder().decodeFromByteArrayBlocking(AES.Key.Format.RAW, keyBytes) - val decryptedData = aesKey.cipher(padding = true).decryptWithIvBlocking(ivBytes, encrypted) + val aesKey = aesCbc.keyDecoder().decodeFromByteArray(AES.Key.Format.RAW, keyBytes) + val decryptedData = aesKey.cipher(padding = true).decryptWithIv(ivBytes, encrypted) return decryptedData.decodeToString() } diff --git a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/extractors/helper/GogoHelper.kt b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/extractors/helper/GogoHelper.kt index 477c965ce..86d402002 100644 --- a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/extractors/helper/GogoHelper.kt +++ b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/extractors/helper/GogoHelper.kt @@ -39,7 +39,7 @@ object GogoHelper { // https://github.com/saikou-app/saikou/blob/45d0a99b8a72665a29a1eadfb38c506b842a29d7/app/src/main/java/ani/saikou/parsers/anime/extractors/GogoCDN.kt#L97 // No Licence on the function @OptIn(DelicateCryptographyApi::class) - private fun cryptoHandler( + private suspend fun cryptoHandler( string: String, iv: String, secretKeyString: String, @@ -47,14 +47,14 @@ object GogoHelper { ): String { val ivBytes = iv.encodeToByteArray() val keyBytes = secretKeyString.encodeToByteArray() - val aesKey = aesCbc.keyDecoder().decodeFromByteArrayBlocking(AES.Key.Format.RAW, keyBytes) + val aesKey = aesCbc.keyDecoder().decodeFromByteArray(AES.Key.Format.RAW, keyBytes) val cipher = aesKey.cipher(padding = true) return if (!encrypt) { - val plainBytes = cipher.decryptWithIvBlocking(ivBytes, base64DecodeArray(string)) + val plainBytes = cipher.decryptWithIv(ivBytes, base64DecodeArray(string)) plainBytes.decodeToString() } else { - base64Encode(cipher.encryptWithIvBlocking(ivBytes, string.encodeToByteArray())) + base64Encode(cipher.encryptWithIv(ivBytes, string.encodeToByteArray())) } } From 1463cf40cd9c5ad94e089d4107a29895e3fa71dc Mon Sep 17 00:00:00 2001 From: firelight <147925818+fire-light42@users.noreply.github.com> Date: Fri, 10 Jul 2026 16:57:27 +0000 Subject: [PATCH 28/38] remove prerelease annotations (#3046) --- .../com/lagradost/cloudstream3/network/RequestsHelper.kt | 2 -- .../commonMain/kotlin/com/lagradost/cloudstream3/MainAPI.kt | 5 ----- .../kotlin/com/lagradost/cloudstream3/MainActivity.kt | 1 - .../com/lagradost/cloudstream3/extractors/DoodExtractor.kt | 1 - .../com/lagradost/cloudstream3/extractors/Firestream.kt | 1 - .../kotlin/com/lagradost/cloudstream3/extractors/Flyfile.kt | 1 - .../lagradost/cloudstream3/extractors/StreamWishExtractor.kt | 1 - .../com/lagradost/cloudstream3/extractors/Streamcash.kt | 1 - .../kotlin/com/lagradost/cloudstream3/extractors/Vids.kt | 1 - .../lagradost/cloudstream3/extractors/helper/AesHelper.kt | 1 - .../cloudstream3/extractors/helper/JWPlayerHelper.kt | 1 - .../kotlin/com/lagradost/cloudstream3/utils/Coroutines.kt | 1 - .../kotlin/com/lagradost/cloudstream3/utils/JsInterpreter.kt | 4 ---- .../kotlin/com/lagradost/cloudstream3/utils/Levenshtein.kt | 1 - .../kotlin/com/lagradost/cloudstream3/utils/StringUtils.kt | 2 -- .../cloudstream3/utils/serializers/NonEmptySerializer.kt | 1 - .../cloudstream3/utils/serializers/WriteOnlySerializer.kt | 1 - 17 files changed, 26 deletions(-) diff --git a/app/src/main/java/com/lagradost/cloudstream3/network/RequestsHelper.kt b/app/src/main/java/com/lagradost/cloudstream3/network/RequestsHelper.kt index 6234297d0..203a503e9 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/network/RequestsHelper.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/network/RequestsHelper.kt @@ -22,7 +22,6 @@ fun Requests.initClient(context: Context) { } /** Only use ignoreSSL if you know what you are doing*/ -@Prerelease fun Requests.initClient(context: Context, ignoreSSL: Boolean = false) { this.baseClient = buildDefaultClient(context, ignoreSSL) } @@ -34,7 +33,6 @@ fun buildDefaultClient(context: Context): OkHttpClient { } /** Only use ignoreSSL if you know what you are doing*/ -@Prerelease fun buildDefaultClient(context: Context, ignoreSSL: Boolean = false): OkHttpClient { safe { Security.insertProviderAt(Conscrypt.newProvider(), 1) } diff --git a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/MainAPI.kt b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/MainAPI.kt index 53b773e59..fc860c06b 100644 --- a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/MainAPI.kt +++ b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/MainAPI.kt @@ -97,7 +97,6 @@ class ErrorLoadingException(message: String? = null) : Exception(message) //val baseHeader = mapOf("User-Agent" to USER_AGENT) -@Prerelease val json = Json { encodeDefaults = true explicitNulls = false @@ -1094,7 +1093,6 @@ enum class TvType(value: Int?) { Audio(16), Podcast(17), - @Prerelease Video(18), } @@ -2554,12 +2552,10 @@ fun Episode.addDate(date: String?, format: String = "yyyy-MM-dd") { }.onFailure { logError(it) }.getOrNull() } -@Prerelease fun Episode.addDate(date: LocalDate?) { this.date = date?.atStartOfDayIn(TimeZone.currentSystemDefault())?.toEpochMilliseconds() } -@Prerelease fun Episode.addDate(date: Instant?) { this.date = date?.toEpochMilliseconds() } @@ -2706,7 +2702,6 @@ fun fetchUrls(text: String?): List { return linkRegex.findAll(text).map { it.value.trim().removeSurrounding("\"") }.toList() } -@Prerelease fun isUpcoming(dateString: String?): Boolean { return runCatching { val fmt = DateTimeComponents.Format { diff --git a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/MainActivity.kt b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/MainActivity.kt index 127b075da..dc8317fa0 100644 --- a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/MainActivity.kt +++ b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/MainActivity.kt @@ -33,7 +33,6 @@ var app = Requests(responseParser = jsonResponseParser).apply { /** Same as the default app networking helper, but this instance ignores SSL certificates. * This should NEVER be used for sensitive networking operations such as logins. Only use this when required. */ -@Prerelease @UnsafeSSL var insecureApp = Requests(responseParser = jsonResponseParser).apply { defaultHeaders = mapOf("user-agent" to USER_AGENT) diff --git a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/extractors/DoodExtractor.kt b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/extractors/DoodExtractor.kt index 099406f16..9117d1d78 100644 --- a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/extractors/DoodExtractor.kt +++ b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/extractors/DoodExtractor.kt @@ -88,7 +88,6 @@ class MyVidPlay : DoodLaExtractor() { override var mainUrl = "https://myvidplay.com" } -@Prerelease class Playmogo : DoodLaExtractor() { override var mainUrl = "https://playmogo.com" } diff --git a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/extractors/Firestream.kt b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/extractors/Firestream.kt index c8ef5d0ac..c2fbaeee2 100644 --- a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/extractors/Firestream.kt +++ b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/extractors/Firestream.kt @@ -9,7 +9,6 @@ import com.lagradost.cloudstream3.utils.newExtractorLink import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -@Prerelease class Firestream : ExtractorApi() { override val name: String = "Firestream" override val mainUrl: String = "https://firestream.to" diff --git a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/extractors/Flyfile.kt b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/extractors/Flyfile.kt index eb6d474a5..50042bd19 100644 --- a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/extractors/Flyfile.kt +++ b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/extractors/Flyfile.kt @@ -10,7 +10,6 @@ import com.lagradost.cloudstream3.utils.newExtractorLink import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -@Prerelease open class Flyfile : ExtractorApi() { override val name: String = "FlyFile" override val mainUrl: String = "https://flyfile.app" diff --git a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/extractors/StreamWishExtractor.kt b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/extractors/StreamWishExtractor.kt index 58aa25c8c..03c94db9d 100644 --- a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/extractors/StreamWishExtractor.kt +++ b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/extractors/StreamWishExtractor.kt @@ -28,7 +28,6 @@ class Ewish : StreamWishExtractor() { override val mainUrl = "https://embedwish.com" } -@Prerelease class Hgcloudto : StreamWishExtractor() { override val name = "Hgcloud" override val mainUrl = "https://Hgcloud.to" diff --git a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/extractors/Streamcash.kt b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/extractors/Streamcash.kt index 2775c3062..91ccfb2ad 100644 --- a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/extractors/Streamcash.kt +++ b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/extractors/Streamcash.kt @@ -7,7 +7,6 @@ import com.lagradost.cloudstream3.utils.ExtractorLink import com.lagradost.cloudstream3.utils.ExtractorLinkType import com.lagradost.cloudstream3.utils.newExtractorLink -@Prerelease open class Streamcash: ExtractorApi() { override val name: String = "Streamcash" override val mainUrl: String = "https://streamcash.to" diff --git a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/extractors/Vids.kt b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/extractors/Vids.kt index 1312570d3..9eb01e321 100644 --- a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/extractors/Vids.kt +++ b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/extractors/Vids.kt @@ -7,7 +7,6 @@ import com.lagradost.cloudstream3.utils.ExtractorApi import com.lagradost.cloudstream3.utils.ExtractorLink import com.lagradost.cloudstream3.utils.newExtractorLink -@Prerelease open class Vids : ExtractorApi() { override val name: String = "Vids" override val mainUrl: String = "https://vids.st" diff --git a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/extractors/helper/AesHelper.kt b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/extractors/helper/AesHelper.kt index a09159245..1d2b6bdf3 100644 --- a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/extractors/helper/AesHelper.kt +++ b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/extractors/helper/AesHelper.kt @@ -21,7 +21,6 @@ object AesHelper { private val md5Hasher = provider.get(MD5).hasher() @OptIn(DelicateCryptographyApi::class) - @Prerelease suspend fun cryptoAESHandler( data: String, pass: ByteArray, diff --git a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/extractors/helper/JWPlayerHelper.kt b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/extractors/helper/JWPlayerHelper.kt index c9ba4a624..b026fa237 100644 --- a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/extractors/helper/JWPlayerHelper.kt +++ b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/extractors/helper/JWPlayerHelper.kt @@ -13,7 +13,6 @@ import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import kotlin.collections.orEmpty -@Prerelease object JwPlayerHelper { private val sourceRegex = Regex(""""?sources"?:\s*(\[.*?\])""") private val tracksRegex = Regex(""""?tracks"?:\s*(\[.*?\])""") diff --git a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/Coroutines.kt b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/Coroutines.kt index 444709f88..37cda4124 100644 --- a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/Coroutines.kt +++ b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/Coroutines.kt @@ -68,7 +68,6 @@ object Coroutines { * If you want to iterate over the list then you need to do: * list.withLock { code here } */ - @Prerelease fun atomicListOf(vararg items: T): AtomicMutableList { return AtomicMutableList(items.toMutableList()) } diff --git a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/JsInterpreter.kt b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/JsInterpreter.kt index 39d950ed1..a8a6344aa 100644 --- a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/JsInterpreter.kt +++ b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/JsInterpreter.kt @@ -86,7 +86,6 @@ private const val JS_DEFAULT_MAX_INSTRUCTIONS: Long = 50_000_000L * Convert any JS runtime value to its JavaScript string representation. * Mirrors what JS `String(value)` would produce. */ -@Prerelease fun jsValueToString(v: Any?): String = toJsString(v) /** @@ -106,7 +105,6 @@ fun jsValueToString(v: Any?): String = toJsString(v) * @param scope the [CoroutineScope] this context's cancellation is tied to. Supplied * automatically by [newJsContext] from the caller's own coroutine context. */ -@Prerelease class JsContext internal constructor( var maxExecutionTime: Duration = JS_DEFAULT_MAX_EXECUTION_TIME, var maxInstructions: Long = JS_DEFAULT_MAX_INSTRUCTIONS, @@ -160,7 +158,6 @@ class JsContext internal constructor( * eval("x + 1") * } */ -@Prerelease suspend fun newJsContext( initializer: suspend JsContext.() -> Unit = {}, ): JsContext { @@ -188,7 +185,6 @@ suspend fun newJsContext( * Returns [Unit] on evaluation failure, timeout, or when the result is JS undefined. * JS null is represented as Kotlin null. Use [jsValueToString] to convert to a JS string. */ -@Prerelease @Throws(CancellationException::class) suspend fun evalJs( js: String, diff --git a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/Levenshtein.kt b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/Levenshtein.kt index 2f3957630..82fb3af23 100644 --- a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/Levenshtein.kt +++ b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/Levenshtein.kt @@ -28,7 +28,6 @@ import com.lagradost.cloudstream3.Prerelease import kotlin.math.round // Taken from https://github.com/terrakok/FuzzyKot/blob/f794d43/fuzzykot/src/commonMain/kotlin/com/github/terrakok/fuzzykot/Levenshtein.kt -@Prerelease object Levenshtein { fun ratio(s1: String, s2: String, processor: (String) -> String = { it }): Int { val p1 = processor(s1) diff --git a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/StringUtils.kt b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/StringUtils.kt index 64815f794..8b2fa752e 100644 --- a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/StringUtils.kt +++ b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/StringUtils.kt @@ -5,12 +5,10 @@ import io.ktor.http.decodeURLQueryComponent import io.ktor.http.encodeURLParameter object StringUtils { - @Prerelease fun String.decodeUrl(): String { return this.decodeURLQueryComponent() } - @Prerelease fun String.encodeUrl(): String { return this.encodeURLParameter() } diff --git a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/serializers/NonEmptySerializer.kt b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/serializers/NonEmptySerializer.kt index 82de9f7f7..62b306e1f 100644 --- a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/serializers/NonEmptySerializer.kt +++ b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/serializers/NonEmptySerializer.kt @@ -28,7 +28,6 @@ import kotlinx.serialization.json.JsonTransformingSerializer * object Serializer : NonEmptySerializer(MyData.generatedSerializer()) * } */ -@Prerelease abstract class NonEmptySerializer(tSerializer: KSerializer) : JsonTransformingSerializer(tSerializer) { diff --git a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/serializers/WriteOnlySerializer.kt b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/serializers/WriteOnlySerializer.kt index c7f412eaa..1d06b7fca 100644 --- a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/serializers/WriteOnlySerializer.kt +++ b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/serializers/WriteOnlySerializer.kt @@ -25,7 +25,6 @@ import kotlinx.serialization.json.JsonTransformingSerializer * ) * } */ -@Prerelease abstract class WriteOnlySerializer( tSerializer: KSerializer, private val keysToIgnore: Set, From 0af9b7f569fa0bc177ee04d1c3a38848ee4f4151 Mon Sep 17 00:00:00 2001 From: Luna712 <142361265+Luna712@users.noreply.github.com> Date: Fri, 10 Jul 2026 10:59:59 -0600 Subject: [PATCH 29/38] DataStoreHelper: migrate to kotlinx serialization (#3027) --- .../cloudstream3/utils/DataStoreHelper.kt | 326 ++++++++++-------- 1 file changed, 185 insertions(+), 141 deletions(-) diff --git a/app/src/main/java/com/lagradost/cloudstream3/utils/DataStoreHelper.kt b/app/src/main/java/com/lagradost/cloudstream3/utils/DataStoreHelper.kt index 19caead21..ec896facb 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/utils/DataStoreHelper.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/utils/DataStoreHelper.kt @@ -1,6 +1,7 @@ package com.lagradost.cloudstream3.utils import android.content.Context +import com.fasterxml.jackson.annotation.JsonIgnore import com.fasterxml.jackson.annotation.JsonProperty import com.lagradost.cloudstream3.APIHolder.unixTimeMS import com.lagradost.cloudstream3.CloudStreamApp.Companion.context @@ -31,6 +32,12 @@ import com.lagradost.cloudstream3.ui.result.ResultEpisode import com.lagradost.cloudstream3.ui.result.VideoWatchState import com.lagradost.cloudstream3.utils.AppContextUtils.filterProviderByPreferredMedia import com.lagradost.cloudstream3.utils.downloader.DownloadObjects +import com.lagradost.cloudstream3.utils.serializers.WriteOnlySerializer +import kotlinx.serialization.ExperimentalSerializationApi +import kotlinx.serialization.KeepGeneratedSerializer +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import kotlinx.serialization.Transient import java.util.Calendar import java.util.Date import java.util.GregorianCalendar @@ -43,17 +50,18 @@ const val RESULT_WATCH_STATE = "result_watch_state" const val RESULT_WATCH_STATE_DATA = "result_watch_state_data" const val RESULT_SUBSCRIBED_STATE_DATA = "result_subscribed_state_data" const val RESULT_FAVORITES_STATE_DATA = "result_favorites_state_data" -const val RESULT_RESUME_WATCHING = "result_resume_watching_2" // changed due to id changes +const val RESULT_RESUME_WATCHING = "result_resume_watching_2" // Changed due to id changes const val RESULT_RESUME_WATCHING_OLD = "result_resume_watching" const val RESULT_RESUME_WATCHING_HAS_MIGRATED = "result_resume_watching_migrated" const val RESULT_EPISODE = "result_episode" const val RESULT_SEASON = "result_season" const val RESULT_DUB = "result_dub" const val KEY_RESULT_SORT = "result_sort" -const val USER_PINNED_PROVIDERS = "user_pinned_providers" //key for pinned user set +const val USER_PINNED_PROVIDERS = "user_pinned_providers" // Key for pinned user set class UserPreferenceDelegate( - private val key: String, private val default: T //, private val klass: KClass + private val key: String, + private val default: T, ) { private val klass: KClass = default::class private val realKey get() = "${DataStoreHelper.currentAccount}/$key" @@ -63,7 +71,7 @@ class UserPreferenceDelegate( operator fun setValue( self: Any?, property: KProperty<*>, - t: T? + t: T?, ) { if (t == null) { removeKey(realKey) @@ -82,7 +90,7 @@ object DataStoreHelper { R.drawable.profile_bg_pink, R.drawable.profile_bg_purple, R.drawable.profile_bg_red, - R.drawable.profile_bg_teal + R.drawable.profile_bg_teal, ) private var searchPreferenceProvidersStrings: List by UserPreferenceDelegate( @@ -112,16 +120,17 @@ object DataStoreHelper { private var searchPreferenceTagsStrings: List by UserPreferenceDelegate( "search_pref_tags", listOf(TvType.Movie, TvType.TvSeries).map { it.name }) + var searchPreferenceTags: List get() = deserializeTv(searchPreferenceTagsStrings) set(value) { searchPreferenceTagsStrings = serializeTv(value) } - private var homePreferenceStrings: List by UserPreferenceDelegate( "home_pref_homepage", listOf(TvType.Movie, TvType.TvSeries).map { it.name }) + var homePreference: List get() = deserializeTv(homePreferenceStrings) set(value) { @@ -132,38 +141,38 @@ object DataStoreHelper { "home_bookmarked_last_list", IntArray(0) ) + var playBackSpeed: Float by UserPreferenceDelegate("playback_speed", 1.0f) var resizeMode: Int by UserPreferenceDelegate("resize_mode", 0) var librarySortingMode: Int by UserPreferenceDelegate( "library_sorting_mode", ListSorting.AlphabeticalA.ordinal ) + private var _resultsSortingMode: Int by UserPreferenceDelegate( "results_sorting_mode", EpisodeSortType.NUMBER_ASC.ordinal ) + var resultsSortingMode: EpisodeSortType get() = EpisodeSortType.entries.getOrNull(_resultsSortingMode) ?: EpisodeSortType.NUMBER_ASC set(value) { _resultsSortingMode = value.ordinal } + @Serializable data class Account( - @JsonProperty("keyIndex") - val keyIndex: Int, - @JsonProperty("name") - val name: String, - @JsonProperty("customImage") - val customImage: String? = null, - @JsonProperty("defaultImageIndex") - val defaultImageIndex: Int, - @JsonProperty("lockPin") - val lockPin: String? = null, + @JsonProperty("keyIndex") @SerialName("keyIndex") val keyIndex: Int, + @JsonProperty("name") @SerialName("name") val name: String, + @JsonProperty("customImage") @SerialName("customImage") val customImage: String? = null, + @JsonProperty("defaultImageIndex") @SerialName("defaultImageIndex") val defaultImageIndex: Int, + @JsonProperty("lockPin") @SerialName("lockPin") val lockPin: String? = null, ) { - val image - get() = customImage?.let { UiImage.Image(it) } ?: profileImages.getOrNull( - defaultImageIndex - )?.let { UiImage.Drawable(it) } ?: UiImage.Drawable(profileImages.first()) + @get:JsonIgnore + val image get() = customImage?.let { UiImage.Image(it) } ?: + profileImages.getOrNull(defaultImageIndex)?.let { + UiImage.Drawable(it) + } ?: UiImage.Drawable(profileImages.first()) } const val TAG = "data_store_helper" @@ -188,7 +197,6 @@ object DataStoreHelper { fun setAccount(account: Account) { val homepage = currentHomePage - selectedKeyIndex = account.keyIndex AccountManager.updateAccountIds() showToast(context?.getString(R.string.logged_account, account.name) ?: account.name) @@ -206,7 +214,7 @@ object DataStoreHelper { currentAccounts.getOrNull(currentAccounts.indexOfFirst { it.keyIndex == 0 }) ?: Account( keyIndex = 0, name = context.getString(R.string.default_account), - defaultImageIndex = 0 + defaultImageIndex = 0, ) } } @@ -232,18 +240,21 @@ object DataStoreHelper { } } + @Serializable data class PosDur( - @JsonProperty("position") val position: Long, - @JsonProperty("duration") val duration: Long + @JsonProperty("position") @SerialName("position") val position: Long, + @JsonProperty("duration") @SerialName("duration") val duration: Long, ) fun PosDur.fixVisual(): PosDur { if (duration <= 0) return PosDur(0, duration) val percentage = position * 100 / duration - if (percentage <= 1) return PosDur(0, duration) - if (percentage <= 5) return PosDur(5 * duration / 100, duration) - if (percentage >= 95) return PosDur(duration, duration) - return this + return when { + percentage <= 1 -> PosDur(0, duration) + percentage <= 5 -> PosDur(5 * duration / 100, duration) + percentage >= 95 -> PosDur(duration, duration) + else -> this + } } fun Int.toYear(): Date = @@ -251,28 +262,38 @@ object DataStoreHelper { /** * Used to display notifications on new episodes and posters in library. - **/ + */ + @Serializable abstract class LibrarySearchResponse( - @JsonProperty("id") override var id: Int?, - @JsonProperty("latestUpdatedTime") open val latestUpdatedTime: Long, - @JsonProperty("name") override val name: String, - @JsonProperty("url") override val url: String, - @JsonProperty("apiName") override val apiName: String, - @JsonProperty("type") override var type: TvType?, - @JsonProperty("posterUrl") override var posterUrl: String?, - @JsonProperty("year") open val year: Int?, - @JsonProperty("syncData") open val syncData: Map?, - @JsonProperty("quality") override var quality: SearchQuality?, - @JsonProperty("posterHeaders") override var posterHeaders: Map?, - @JsonProperty("plot") open val plot: String? = null, - @JsonProperty("score") override var score: Score? = null, - @JsonProperty("tags") open val tags: List? = null, + /** + * These fields are marked @Transient because this class is only ever serialized through + * through its subclasses, which redeclare each property with their own @SerialName + * annotations. Without @Transient here, kotlinx.serialization would try to + * generate a serializer for the abstract base class itself (or double-serialize + * these fields), which fails/conflicts since these are meant to be overridden, + * not serialized directly from the parent. + */ + @Transient override var id: Int? = null, + @Transient open val latestUpdatedTime: Long = 0L, + @Transient override val name: String = "", + @Transient override val url: String = "", + @Transient override val apiName: String = "", + @Transient override var type: TvType? = null, + @Transient override var posterUrl: String? = null, + @Transient open val year: Int? = null, + @Transient open val syncData: Map? = null, + @Transient override var quality: SearchQuality? = null, + @Transient override var posterHeaders: Map? = null, + @Transient open val plot: String? = null, + @Transient override var score: Score? = null, + @Transient open val tags: List? = null, ) : SearchResponse { @JsonProperty("rating", access = JsonProperty.Access.WRITE_ONLY) + @SerialName("rating") @Deprecated( "`rating` is the old scoring system, use score instead", replaceWith = ReplaceWith("score"), - level = DeprecationLevel.ERROR + level = DeprecationLevel.ERROR, ) var rating: Int? = null set(value) { @@ -283,23 +304,26 @@ object DataStoreHelper { } } + @OptIn(ExperimentalSerializationApi::class) // KeepGeneratedSerializer is an experimental annotation for now + @KeepGeneratedSerializer + @Serializable(with = SubscribedData.Serializer::class) data class SubscribedData( - @JsonProperty("subscribedTime") val subscribedTime: Long, - @JsonProperty("lastSeenEpisodeCount") val lastSeenEpisodeCount: Map, - override var id: Int?, - override val latestUpdatedTime: Long, - override val name: String, - override val url: String, - override val apiName: String, - override var type: TvType?, - override var posterUrl: String?, - override val year: Int?, - override val syncData: Map? = null, - override var quality: SearchQuality? = null, - override var posterHeaders: Map? = null, - override val plot: String? = null, - override var score: Score? = null, - override val tags: List? = null, + @JsonProperty("subscribedTime") @SerialName("subscribedTime") val subscribedTime: Long, + @JsonProperty("lastSeenEpisodeCount") @SerialName("lastSeenEpisodeCount") val lastSeenEpisodeCount: Map, + @JsonProperty("id") @SerialName("id") override var id: Int?, + @JsonProperty("latestUpdatedTime") @SerialName("latestUpdatedTime") override val latestUpdatedTime: Long, + @JsonProperty("name") @SerialName("name") override val name: String, + @JsonProperty("url") @SerialName("url") override val url: String, + @JsonProperty("apiName") @SerialName("apiName") override val apiName: String, + @JsonProperty("type") @SerialName("type") override var type: TvType?, + @JsonProperty("posterUrl") @SerialName("posterUrl") override var posterUrl: String?, + @JsonProperty("year") @SerialName("year") override val year: Int?, + @JsonProperty("syncData") @SerialName("syncData") override val syncData: Map? = null, + @JsonProperty("quality") @SerialName("quality") override var quality: SearchQuality? = null, + @JsonProperty("posterHeaders") @SerialName("posterHeaders") override var posterHeaders: Map? = null, + @JsonProperty("plot") @SerialName("plot") override val plot: String? = null, + @JsonProperty("score") @SerialName("score") override var score: Score? = null, + @JsonProperty("tags") @SerialName("tags") override val tags: List? = null, ) : LibrarySearchResponse( id, latestUpdatedTime, @@ -314,8 +338,13 @@ object DataStoreHelper { posterHeaders, plot, score, - tags + tags, ) { + object Serializer : WriteOnlySerializer( + SubscribedData.generatedSerializer(), + setOf("rating"), + ) + fun toLibraryItem(): SyncAPI.LibraryItem? { return SyncAPI.LibraryItem( name, @@ -334,27 +363,30 @@ object DataStoreHelper { this.id, plot = this.plot, score = this.score, - tags = this.tags + tags = this.tags, ) } } + @OptIn(ExperimentalSerializationApi::class) // KeepGeneratedSerializer is an experimental annotation for now + @KeepGeneratedSerializer + @Serializable(with = BookmarkedData.Serializer::class) data class BookmarkedData( - @JsonProperty("bookmarkedTime") val bookmarkedTime: Long, - override var id: Int?, - override val latestUpdatedTime: Long, - override val name: String, - override val url: String, - override val apiName: String, - override var type: TvType?, - override var posterUrl: String?, - override val year: Int?, - override val syncData: Map? = null, - override var quality: SearchQuality? = null, - override var posterHeaders: Map? = null, - override val plot: String? = null, - override var score: Score? = null, - override val tags: List? = null, + @JsonProperty("bookmarkedTime") @SerialName("bookmarkedTime") val bookmarkedTime: Long, + @JsonProperty("id") @SerialName("id") override var id: Int?, + @JsonProperty("latestUpdatedTime") @SerialName("latestUpdatedTime") override val latestUpdatedTime: Long, + @JsonProperty("name") @SerialName("name") override val name: String, + @JsonProperty("url") @SerialName("url") override val url: String, + @JsonProperty("apiName") @SerialName("apiName") override val apiName: String, + @JsonProperty("type") @SerialName("type") override var type: TvType?, + @JsonProperty("posterUrl") @SerialName("posterUrl") override var posterUrl: String?, + @JsonProperty("year") @SerialName("year") override val year: Int?, + @JsonProperty("syncData") @SerialName("syncData") override val syncData: Map? = null, + @JsonProperty("quality") @SerialName("quality") override var quality: SearchQuality? = null, + @JsonProperty("posterHeaders") @SerialName("posterHeaders") override var posterHeaders: Map? = null, + @JsonProperty("plot") @SerialName("plot") override val plot: String? = null, + @JsonProperty("score") @SerialName("score") override var score: Score? = null, + @JsonProperty("tags") @SerialName("tags") override val tags: List? = null, ) : LibrarySearchResponse( id, latestUpdatedTime, @@ -367,8 +399,13 @@ object DataStoreHelper { syncData, quality, posterHeaders, - plot + plot, ) { + object Serializer : WriteOnlySerializer( + BookmarkedData.generatedSerializer(), + setOf("rating"), + ) + fun toLibraryItem(id: String): SyncAPI.LibraryItem { return SyncAPI.LibraryItem( name, @@ -387,27 +424,30 @@ object DataStoreHelper { this.id, plot = this.plot, score = this.score, - tags = this.tags + tags = this.tags, ) } } + @OptIn(ExperimentalSerializationApi::class) // KeepGeneratedSerializer is an experimental annotation for now + @KeepGeneratedSerializer + @Serializable(with = FavoritesData.Serializer::class) data class FavoritesData( - @JsonProperty("favoritesTime") val favoritesTime: Long, - override var id: Int?, - override val latestUpdatedTime: Long, - override val name: String, - override val url: String, - override val apiName: String, - override var type: TvType?, - override var posterUrl: String?, - override val year: Int?, - override val syncData: Map? = null, - override var quality: SearchQuality? = null, - override var posterHeaders: Map? = null, - override val plot: String? = null, - override var score: Score? = null, - override val tags: List? = null, + @JsonProperty("favoritesTime") @SerialName("favoritesTime") val favoritesTime: Long, + @JsonProperty("id") @SerialName("id") override var id: Int?, + @JsonProperty("latestUpdatedTime") @SerialName("latestUpdatedTime") override val latestUpdatedTime: Long, + @JsonProperty("name") @SerialName("name") override val name: String, + @JsonProperty("url") @SerialName("url") override val url: String, + @JsonProperty("apiName") @SerialName("apiName") override val apiName: String, + @JsonProperty("type") @SerialName("type") override var type: TvType?, + @JsonProperty("posterUrl") @SerialName("posterUrl") override var posterUrl: String?, + @JsonProperty("year") @SerialName("year") override val year: Int?, + @JsonProperty("syncData") @SerialName("syncData") override val syncData: Map? = null, + @JsonProperty("quality") @SerialName("quality") override var quality: SearchQuality? = null, + @JsonProperty("posterHeaders") @SerialName("posterHeaders") override var posterHeaders: Map? = null, + @JsonProperty("plot") @SerialName("plot") override val plot: String? = null, + @JsonProperty("score") @SerialName("score") override var score: Score? = null, + @JsonProperty("tags") @SerialName("tags") override val tags: List? = null, ) : LibrarySearchResponse( id, latestUpdatedTime, @@ -420,8 +460,13 @@ object DataStoreHelper { syncData, quality, posterHeaders, - plot + plot, ) { + object Serializer : WriteOnlySerializer( + FavoritesData.generatedSerializer(), + setOf("rating"), + ) + fun toLibraryItem(): SyncAPI.LibraryItem? { return SyncAPI.LibraryItem( name, @@ -440,31 +485,32 @@ object DataStoreHelper { this.id, plot = this.plot, score = this.score, - tags = this.tags + tags = this.tags, ) } } + @Serializable data class ResumeWatchingResult( - @JsonProperty("name") override val name: String, - @JsonProperty("url") override val url: String, - @JsonProperty("apiName") override val apiName: String, - @JsonProperty("type") override var type: TvType? = null, - @JsonProperty("posterUrl") override var posterUrl: String?, - @JsonProperty("watchPos") val watchPos: PosDur?, - @JsonProperty("id") override var id: Int?, - @JsonProperty("parentId") val parentId: Int?, - @JsonProperty("episode") val episode: Int?, - @JsonProperty("season") val season: Int?, - @JsonProperty("isFromDownload") val isFromDownload: Boolean, - @JsonProperty("quality") override var quality: SearchQuality? = null, - @JsonProperty("posterHeaders") override var posterHeaders: Map? = null, - @JsonProperty("score") override var score: Score? = null, + @JsonProperty("name") @SerialName("name") override val name: String, + @JsonProperty("url") @SerialName("url") override val url: String, + @JsonProperty("apiName") @SerialName("apiName") override val apiName: String, + @JsonProperty("type") @SerialName("type") override var type: TvType? = null, + @JsonProperty("posterUrl") @SerialName("posterUrl") override var posterUrl: String?, + @JsonProperty("watchPos") @SerialName("watchPos") val watchPos: PosDur?, + @JsonProperty("id") @SerialName("id") override var id: Int?, + @JsonProperty("parentId") @SerialName("parentId") val parentId: Int?, + @JsonProperty("episode") @SerialName("episode") val episode: Int?, + @JsonProperty("season") @SerialName("season") val season: Int?, + @JsonProperty("isFromDownload") @SerialName("isFromDownload") val isFromDownload: Boolean, + @JsonProperty("quality") @SerialName("quality") override var quality: SearchQuality? = null, + @JsonProperty("posterHeaders") @SerialName("posterHeaders") override var posterHeaders: Map? = null, + @JsonProperty("score") @SerialName("score") override var score: Score? = null, ) : SearchResponse /** * A datastore wide account for future implementations of a multiple account system - **/ + */ fun getAllWatchStateIds(): List? { val folder = "$currentAccount/$RESULT_WATCH_STATE" @@ -500,7 +546,7 @@ object DataStoreHelper { } fun migrateResumeWatching() { - // if (getKey(RESULT_RESUME_WATCHING_HAS_MIGRATED, false) != true) { + // if (getKey(RESULT_RESUME_WATCHING_HAS_MIGRATED, false) != true) { setKey(RESULT_RESUME_WATCHING_HAS_MIGRATED, true) getAllResumeStateIdsOld()?.forEach { id -> getLastWatchedOld(id)?.let { @@ -510,12 +556,12 @@ object DataStoreHelper { it.episode, it.season, it.isFromDownload, - it.updateTime + it.updateTime, ) removeLastWatchedOld(it.parentId) } } - //} + // } } fun setLastWatched( @@ -536,7 +582,7 @@ object DataStoreHelper { episode, season, updateTime ?: System.currentTimeMillis(), - isFromDownload + isFromDownload, ) ) } @@ -553,7 +599,7 @@ object DataStoreHelper { fun getLastWatched(id: Int?): DownloadObjects.ResumeWatching? { if (id == null) return null - return getKey( + return getKey( "$currentAccount/$RESULT_RESUME_WATCHING", id.toString(), ) @@ -561,7 +607,7 @@ object DataStoreHelper { private fun getLastWatchedOld(id: Int?): DownloadObjects.ResumeWatching? { if (id == null) return null - return getKey( + return getKey( "$currentAccount/$RESULT_RESUME_WATCHING_OLD", id.toString(), ) @@ -575,18 +621,18 @@ object DataStoreHelper { fun getBookmarkedData(id: Int?): BookmarkedData? { if (id == null) return null - return getKey("$currentAccount/$RESULT_WATCH_STATE_DATA", id.toString()) + return getKey("$currentAccount/$RESULT_WATCH_STATE_DATA", id.toString()) } fun getAllBookmarkedData(): List { return getKeys("$currentAccount/$RESULT_WATCH_STATE_DATA")?.mapNotNull { - getKey(it) + getKey(it) } ?: emptyList() } fun getAllSubscriptions(): List { return getKeys("$currentAccount/$RESULT_SUBSCRIBED_STATE_DATA")?.mapNotNull { - getKey(it) + getKey(it) } ?: emptyList() } @@ -598,12 +644,12 @@ object DataStoreHelper { /** * Set new seen episodes and update time - **/ + */ fun updateSubscribedData(id: Int?, data: SubscribedData?, episodeResponse: EpisodeResponse?) { if (id == null || data == null || episodeResponse == null) return val newData = data.copy( latestUpdatedTime = unixTimeMS, - lastSeenEpisodeCount = episodeResponse.getLatestEpisodes() + lastSeenEpisodeCount = episodeResponse.getLatestEpisodes(), ) setKey("$currentAccount/$RESULT_SUBSCRIBED_STATE_DATA", id.toString(), newData) } @@ -616,12 +662,12 @@ object DataStoreHelper { fun getSubscribedData(id: Int?): SubscribedData? { if (id == null) return null - return getKey("$currentAccount/$RESULT_SUBSCRIBED_STATE_DATA", id.toString()) + return getKey("$currentAccount/$RESULT_SUBSCRIBED_STATE_DATA", id.toString()) } fun getAllFavorites(): List { return getKeys("$currentAccount/$RESULT_FAVORITES_STATE_DATA")?.mapNotNull { - getKey(it) + getKey(it) } ?: emptyList() } @@ -639,7 +685,7 @@ object DataStoreHelper { fun getFavoritesData(id: Int?): FavoritesData? { if (id == null) return null - return getKey("$currentAccount/$RESULT_FAVORITES_STATE_DATA", id.toString()) + return getKey("$currentAccount/$RESULT_FAVORITES_STATE_DATA", id.toString()) } fun setViewPos(id: Int?, pos: Long, dur: Long) { @@ -648,10 +694,10 @@ object DataStoreHelper { setKey("$currentAccount/$VIDEO_POS_DUR", id.toString(), PosDur(pos, dur)) } - /** Sets the position, duration, and resume data of an episode/movie, - * - * if nextEpisode is not specified it will not be able to set the next episode as resumable if progress > NEXT_WATCH_EPISODE_PERCENTAGE - * */ + /** + * Sets the position, duration, and resume data of an episode/movie, + * If nextEpisode is not specified it will not be able to set the next episode as resumable if progress > NEXT_WATCH_EPISODE_PERCENTAGE + */ fun setViewPosAndResume(id: Int?, position: Long, duration: Long, currentEpisode: Any?, nextEpisode: Any?) { setViewPos(id, position, duration) if (id != null) { @@ -687,7 +733,7 @@ object DataStoreHelper { resumeMeta.id, resumeMeta.episode, resumeMeta.season, - isFromDownload = false + isFromDownload = false, ) } @@ -697,7 +743,7 @@ object DataStoreHelper { resumeMeta.id, resumeMeta.episode, resumeMeta.season, - isFromDownload = true + isFromDownload = true, ) } } @@ -706,17 +752,16 @@ object DataStoreHelper { fun getViewPos(id: Int?): PosDur? { if (id == null) return null - return getKey("$currentAccount/$VIDEO_POS_DUR", id.toString(), null) + return getKey("$currentAccount/$VIDEO_POS_DUR", id.toString(), null) } fun getVideoWatchState(id: Int?): VideoWatchState? { if (id == null) return null - return getKey("$currentAccount/$VIDEO_WATCH_STATE", id.toString(), null) + return getKey("$currentAccount/$VIDEO_WATCH_STATE", id.toString(), null) } fun setVideoWatchState(id: Int?, watchState: VideoWatchState) { if (id == null) return - // None == No key if (watchState == VideoWatchState.None) { removeKey("$currentAccount/$VIDEO_WATCH_STATE", id.toString()) @@ -727,7 +772,7 @@ object DataStoreHelper { fun getDub(id: Int): DubStatus? { return DubStatus.entries - .getOrNull(getKey("$currentAccount/$RESULT_DUB", id.toString(), -1) ?: -1) + .getOrNull(getKey("$currentAccount/$RESULT_DUB", id.toString(), -1) ?: -1) } fun setDub(id: Int, status: DubStatus) { @@ -748,13 +793,13 @@ object DataStoreHelper { getKey( "$currentAccount/$RESULT_WATCH_STATE", id.toString(), - null + null, ) ) } fun getResultSeason(id: Int): Int? { - return getKey("$currentAccount/$RESULT_SEASON", id.toString(), null) + return getKey("$currentAccount/$RESULT_SEASON", id.toString(), null) } fun setResultSeason(id: Int, value: Int?) { @@ -762,7 +807,7 @@ object DataStoreHelper { } fun getResultEpisode(id: Int): Int? { - return getKey("$currentAccount/$RESULT_EPISODE", id.toString(), null) + return getKey("$currentAccount/$RESULT_EPISODE", id.toString(), null) } fun setResultEpisode(id: Int, value: Int?) { @@ -775,12 +820,11 @@ object DataStoreHelper { fun getSync(id: Int, idPrefixes: List): List { return idPrefixes.map { idPrefix -> - getKey("${idPrefix}_sync", id.toString()) + getKey("${idPrefix}_sync", id.toString()) } } var pinnedProviders: Array - get() = getKey(USER_PINNED_PROVIDERS) ?: emptyArray() + get() = getKey>(USER_PINNED_PROVIDERS) ?: emptyArray() set(value) = setKey(USER_PINNED_PROVIDERS, value) - } From f03b18ff9553ecdc31412b91e389f737d0c9e8d2 Mon Sep 17 00:00:00 2001 From: Luna712 <142361265+Luna712@users.noreply.github.com> Date: Fri, 10 Jul 2026 12:19:33 -0600 Subject: [PATCH 30/38] [skip ci] Enable some deprecations (#3048) --- .../kotlin/com/lagradost/cloudstream3/MainAPI.kt | 10 ++++------ .../cloudstream3/extractors/helper/AesHelper.kt | 5 ++--- .../com/lagradost/cloudstream3/utils/Coroutines.kt | 5 ++--- .../com/lagradost/cloudstream3/utils/StringUtils.kt | 10 ++++------ 4 files changed, 12 insertions(+), 18 deletions(-) diff --git a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/MainAPI.kt b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/MainAPI.kt index fc860c06b..c29ef150f 100644 --- a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/MainAPI.kt +++ b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/MainAPI.kt @@ -799,11 +799,10 @@ fun fixTitle(str: String): String { } } -// Deprecate after next stable -/* @Deprecated( +@Deprecated( message = "Use newJsContext or evalJs instead.", level = DeprecationLevel.WARNING, -) */ +) suspend fun getRhinoContext(): org.mozilla.javascript.Context { return Coroutines.mainWork { val rhino = org.mozilla.javascript.Context.enter() @@ -2560,11 +2559,10 @@ fun Episode.addDate(date: Instant?) { this.date = date?.toEpochMilliseconds() } -// Deprecate after next stable -/* @Deprecated( +@Deprecated( message = "Use addDate with LocalDate, Instant, or String instead.", level = DeprecationLevel.WARNING, -) */ +) fun Episode.addDate(date: java.util.Date?) { this.date = date?.time } diff --git a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/extractors/helper/AesHelper.kt b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/extractors/helper/AesHelper.kt index 1d2b6bdf3..4ae615846 100644 --- a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/extractors/helper/AesHelper.kt +++ b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/extractors/helper/AesHelper.kt @@ -46,11 +46,10 @@ object AesHelper { } } - // Deprecate after next stable - /* @Deprecated( + @Deprecated( message = "Set padding = false for no padding", level = DeprecationLevel.WARNING, - ) */ + ) fun cryptoAESHandler( data: String, pass: ByteArray, diff --git a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/Coroutines.kt b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/Coroutines.kt index 37cda4124..4536eb88b 100644 --- a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/Coroutines.kt +++ b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/Coroutines.kt @@ -72,11 +72,10 @@ object Coroutines { return AtomicMutableList(items.toMutableList()) } - // Deprecate after next stable - /*@Deprecated( + @Deprecated( message = "Use atomicListOf() instead.", replaceWith = ReplaceWith("atomicListOf(*items)"), level = DeprecationLevel.WARNING, - )*/ + ) fun threadSafeListOf(vararg items: T): MutableList = atomicListOf(*items) } diff --git a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/StringUtils.kt b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/StringUtils.kt index 8b2fa752e..fc1055dc6 100644 --- a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/StringUtils.kt +++ b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/StringUtils.kt @@ -13,20 +13,18 @@ object StringUtils { return this.encodeURLParameter() } - // Deprecate after next stable - - /* @Deprecated( + @Deprecated( message = "Use Ktor 'Url' naming convention instead.", replaceWith = ReplaceWith("this.encodeUrl()"), level = DeprecationLevel.WARNING, - ) */ + ) fun String.encodeUri(): String = encodeUrl() - /* @Deprecated( + @Deprecated( message = "Use Ktor 'Url' naming convention instead.", replaceWith = ReplaceWith("this.decodeUrl()"), level = DeprecationLevel.WARNING, - ) */ + ) fun String.decodeUri(): String = decodeUrl() } From 5cd1cb3433ab215392cc3346855790c902d4f1da Mon Sep 17 00:00:00 2001 From: Luna712 <142361265+Luna712@users.noreply.github.com> Date: Fri, 10 Jul 2026 12:26:09 -0600 Subject: [PATCH 31/38] SimklApi: migrate to kotlinx serialization (#2998) --- .../syncproviders/providers/SimklApi.kt | 645 ++++++++++-------- 1 file changed, 350 insertions(+), 295 deletions(-) diff --git a/app/src/main/java/com/lagradost/cloudstream3/syncproviders/providers/SimklApi.kt b/app/src/main/java/com/lagradost/cloudstream3/syncproviders/providers/SimklApi.kt index 075c08bb8..a57ec6716 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/syncproviders/providers/SimklApi.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/syncproviders/providers/SimklApi.kt @@ -2,11 +2,11 @@ package com.lagradost.cloudstream3.syncproviders.providers import androidx.annotation.StringRes import androidx.core.net.toUri +import com.fasterxml.jackson.annotation.JsonIgnore import com.fasterxml.jackson.annotation.JsonInclude import com.fasterxml.jackson.annotation.JsonProperty import com.lagradost.cloudstream3.APIHolder import com.lagradost.cloudstream3.BuildConfig -import com.lagradost.cloudstream3.CloudStreamApp import com.lagradost.cloudstream3.CloudStreamApp.Companion.getKey import com.lagradost.cloudstream3.CloudStreamApp.Companion.getKeys import com.lagradost.cloudstream3.CloudStreamApp.Companion.removeKey @@ -32,7 +32,12 @@ import com.lagradost.cloudstream3.ui.library.ListSorting import com.lagradost.cloudstream3.utils.AppUtils.toJson import com.lagradost.cloudstream3.utils.AppUtils.tryParseJson import com.lagradost.cloudstream3.utils.DataStoreHelper.toYear +import com.lagradost.cloudstream3.utils.serializers.NonEmptySerializer import com.lagradost.cloudstream3.utils.txt +import kotlinx.serialization.ExperimentalSerializationApi +import kotlinx.serialization.KeepGeneratedSerializer +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable import java.math.BigInteger import java.security.SecureRandom import java.text.SimpleDateFormat @@ -45,22 +50,18 @@ import kotlin.time.DurationUnit import kotlin.time.toDuration class SimklApi : SyncAPI() { - override var name = "Simkl" + override val name = "Simkl" override val idPrefix = "simkl" - val key = "simkl-key" override val redirectUrlIdentifier = "simkl" override val hasOAuth2 = true override val hasPin = true override var requireLibraryRefresh = true - override var mainUrl = "https://api.simkl.com" + override val mainUrl = "https://api.simkl.com" override val icon = R.drawable.simkl_logo override val createAccountUrl = "$mainUrl/signup" override val syncIdName = SyncIdName.Simkl - /** Automatically adds simkl auth headers */ - // private val interceptor = HeaderInterceptor() - /** * This is required to override the reported last activity as simkl activites * may not always update based on testing. @@ -69,63 +70,99 @@ class SimklApi : SyncAPI() { private object SimklCache { private const val SIMKL_CACHE_KEY = "SIMKL_API_CACHE" - enum class CacheTimes(val value: String) { OneMonth("30d"), ThirtyMinutes("30m") } - private class SimklCacheWrapper( - @JsonProperty("obj") val obj: T?, - @JsonProperty("validUntil") val validUntil: Long, - @JsonProperty("cacheTime") val cacheTime: Long = APIHolder.unixTime, - ) { - /** Returns true if cache is newer than cacheDays */ - fun isFresh(): Boolean { - return validUntil > APIHolder.unixTime - } + @Serializable + private data class MediaObjectCacheEntry( + @JsonProperty("obj") @SerialName("obj") val obj: MediaObject?, + @JsonProperty("validUntil") @SerialName("validUntil") val validUntil: Long, + @JsonProperty("cacheTime") @SerialName("cacheTime") val cacheTime: Long = APIHolder.unixTime, + ) - fun remainingTime(): Duration { - val unixTime = APIHolder.unixTime - return if (validUntil > unixTime) { - (validUntil - unixTime).toDuration(DurationUnit.SECONDS) - } else { - Duration.ZERO - } + @Serializable + private data class EpisodesCacheEntry( + @JsonProperty("obj") @SerialName("obj") val obj: Array?, + @JsonProperty("validUntil") @SerialName("validUntil") val validUntil: Long, + @JsonProperty("cacheTime") @SerialName("cacheTime") val cacheTime: Long = APIHolder.unixTime, + ) + + /** + * Minimal class used only to peek at an entry's expiry, without caring which of the + * concrete entry types above actually produced it. + */ + @Serializable + private data class CacheFreshness( + @JsonProperty("validUntil") @SerialName("validUntil") val validUntil: Long, + ) + + private fun Long.isFresh(): Boolean = this > APIHolder.unixTime + + private fun Long.remaining(): Duration { + val unixTime = APIHolder.unixTime + return if (this > unixTime) { + (this - unixTime).toDuration(DurationUnit.SECONDS) + } else { + Duration.ZERO } } fun cleanOldCache() { getKeys(SIMKL_CACHE_KEY)?.forEach { - val isOld = CloudStreamApp.getKey>(it)?.isFresh() == false - if (isOld) { - removeKey(it) - } + val isOld = getKey(it)?.validUntil?.isFresh() == false + if (isOld) removeKey(it) } } - fun setKey(path: String, value: T, cacheTime: Duration) { + fun setMediaObject(path: String, value: MediaObject, cacheTime: Duration) { debugPrint { "Set cache: $SIMKL_CACHE_KEY/$path for ${cacheTime.inWholeDays} days or ${cacheTime.inWholeSeconds} seconds." } setKey( SIMKL_CACHE_KEY, path, - // Storing as plain sting is required to make generics work. - SimklCacheWrapper(value, APIHolder.unixTime + cacheTime.inWholeSeconds).toJson() + MediaObjectCacheEntry(value, APIHolder.unixTime + cacheTime.inWholeSeconds).toJson(), ) } - /** - * Gets cached object, if object is not fresh returns null and removes it from cache - */ - inline fun getKey(path: String): T? { + /** Gets the cached [MediaObject], if it's not fresh returns null and removes it from cache */ + fun getMediaObject(path: String): MediaObject? { val cache = getKey(SIMKL_CACHE_KEY, path)?.let { - tryParseJson>(it) + tryParseJson(it) } - return if (cache?.isFresh() == true) { + return if (cache?.validUntil?.isFresh() == true) { debugPrint { "Cache hit at: $SIMKL_CACHE_KEY/$path. " + - "Remains fresh for ${cache.remainingTime().inWholeDays} days or ${cache.remainingTime().inWholeSeconds} seconds." + "Remains fresh for ${cache.validUntil.remaining().inWholeDays} days or ${cache.validUntil.remaining().inWholeSeconds} seconds." + } + cache.obj + } else { + debugPrint { "Cache miss at: $SIMKL_CACHE_KEY/$path" } + removeKey(SIMKL_CACHE_KEY, path) + null + } + } + + fun setEpisodes(path: String, value: Array, cacheTime: Duration) { + debugPrint { "Set cache: $SIMKL_CACHE_KEY/$path for ${cacheTime.inWholeDays} days or ${cacheTime.inWholeSeconds} seconds." } + setKey( + SIMKL_CACHE_KEY, + path, + EpisodesCacheEntry(value, APIHolder.unixTime + cacheTime.inWholeSeconds).toJson(), + ) + } + + /** Gets the cached episode list, if it's not fresh returns null and removes it from cache */ + fun getEpisodes(path: String): Array? { + val cache = getKey(SIMKL_CACHE_KEY, path)?.let { + tryParseJson(it) + } + + return if (cache?.validUntil?.isFresh() == true) { + debugPrint { + "Cache hit at: $SIMKL_CACHE_KEY/$path. " + + "Remains fresh for ${cache.validUntil.remaining().inWholeDays} days or ${cache.validUntil.remaining().inWholeSeconds} seconds." } cache.obj } else { @@ -169,7 +206,7 @@ class SimklApi : SyncAPI() { ) ) ) - } catch (e: Exception) { + } catch (_: Exception) { null } } @@ -185,7 +222,7 @@ class SimklApi : SyncAPI() { enum class SimklListStatusType( var value: Int, @StringRes val stringRes: Int, - val originalName: String? + val originalName: String?, ) { Watching(0, R.string.type_watching, "watching"), Completed(1, R.string.type_completed, "completed"), @@ -204,83 +241,92 @@ class SimklApi : SyncAPI() { } } - // ------------------- @JsonInclude(JsonInclude.Include.NON_EMPTY) + @OptIn(ExperimentalSerializationApi::class) // KeepGeneratedSerializer is an experimental annotation for now + @KeepGeneratedSerializer + @Serializable(with = TokenRequest.Serializer::class) data class TokenRequest( - @JsonProperty("code") val code: String, - @JsonProperty("client_id") val clientId: String = CLIENT_ID, - @JsonProperty("client_secret") val clientSecret: String = CLIENT_SECRET, - @JsonProperty("redirect_uri") val redirectUri: String = "$APP_STRING://simkl", - @JsonProperty("grant_type") val grantType: String = "authorization_code" - ) + @JsonProperty("code") @SerialName("code") val code: String, + @JsonProperty("client_id") @SerialName("client_id") val clientId: String = CLIENT_ID, + @JsonProperty("client_secret") @SerialName("client_secret") val clientSecret: String = CLIENT_SECRET, + @JsonProperty("redirect_uri") @SerialName("redirect_uri") val redirectUri: String = "$APP_STRING://simkl", + @JsonProperty("grant_type") @SerialName("grant_type") val grantType: String = "authorization_code", + ) { + object Serializer : NonEmptySerializer(TokenRequest.generatedSerializer()) + } + @Serializable data class TokenResponse( /** No expiration date */ - @JsonProperty("access_token") val accessToken: String, - @JsonProperty("token_type") val tokenType: String, - @JsonProperty("scope") val scope: String + @JsonProperty("access_token") @SerialName("access_token") val accessToken: String, + @JsonProperty("token_type") @SerialName("token_type") val tokenType: String, + @JsonProperty("scope") @SerialName("scope") val scope: String, ) - // ------------------- /** https://simkl.docs.apiary.io/#reference/users/settings/receive-settings */ + @Serializable data class SettingsResponse( - @JsonProperty("user") - val user: User, - @JsonProperty("account") - val account: Account, + @JsonProperty("user") @SerialName("user") val user: User, + @JsonProperty("account") @SerialName("account") val account: Account, ) { + @Serializable data class User( - @JsonProperty("name") - val name: String, - /** Url */ - @JsonProperty("avatar") - val avatar: String + @JsonProperty("name") @SerialName("name") val name: String, + @JsonProperty("avatar") @SerialName("avatar") val avatar: String, // Url ) + @Serializable data class Account( - @JsonProperty("id") - val id: Int, + @JsonProperty("id") @SerialName("id") val id: Int, ) } + @Serializable data class PinAuthResponse( - @JsonProperty("result") val result: String, - @JsonProperty("device_code") val deviceCode: String, - @JsonProperty("user_code") val userCode: String, - @JsonProperty("verification_url") val verificationUrl: String, - @JsonProperty("expires_in") val expiresIn: Int, - @JsonProperty("interval") val interval: Int, + @JsonProperty("result") @SerialName("result") val result: String, + @JsonProperty("device_code") @SerialName("device_code") val deviceCode: String, + @JsonProperty("user_code") @SerialName("user_code") val userCode: String, + @JsonProperty("verification_url") @SerialName("verification_url") val verificationUrl: String, + @JsonProperty("expires_in") @SerialName("expires_in") val expiresIn: Int, + @JsonProperty("interval") @SerialName("interval") val interval: Int, ) + @Serializable data class PinExchangeResponse( - @JsonProperty("result") val result: String, - @JsonProperty("message") val message: String? = null, - @JsonProperty("access_token") val accessToken: String? = null, + @JsonProperty("result") @SerialName("result") val result: String, + @JsonProperty("message") @SerialName("message") val message: String? = null, + @JsonProperty("access_token") @SerialName("access_token") val accessToken: String? = null, ) - // ------------------- + @Serializable data class ActivitiesResponse( - @JsonProperty("all") val all: String?, - @JsonProperty("tv_shows") val tvShows: UpdatedAt, - @JsonProperty("anime") val anime: UpdatedAt, - @JsonProperty("movies") val movies: UpdatedAt, + @JsonProperty("all") @SerialName("all") val all: String?, + @JsonProperty("tv_shows") @SerialName("tv_shows") val tvShows: UpdatedAt, + @JsonProperty("anime") @SerialName("anime") val anime: UpdatedAt, + @JsonProperty("movies") @SerialName("movies") val movies: UpdatedAt, ) { + @Serializable data class UpdatedAt( - @JsonProperty("all") val all: String?, - @JsonProperty("removed_from_list") val removedFromList: String?, - @JsonProperty("rated_at") val ratedAt: String?, + @JsonProperty("all") @SerialName("all") val all: String?, + @JsonProperty("removed_from_list") @SerialName("removed_from_list") val removedFromList: String?, + @JsonProperty("rated_at") @SerialName("rated_at") val ratedAt: String?, ) } /** https://simkl.docs.apiary.io/#reference/tv/episodes/get-tv-show-episodes */ @JsonInclude(JsonInclude.Include.NON_EMPTY) + @OptIn(ExperimentalSerializationApi::class) // KeepGeneratedSerializer is an experimental annotation for now + @KeepGeneratedSerializer + @Serializable(with = EpisodeMetadata.Serializer::class) data class EpisodeMetadata( - @JsonProperty("title") val title: String?, - @JsonProperty("description") val description: String?, - @JsonProperty("season") val season: Int?, - @JsonProperty("episode") val episode: Int, - @JsonProperty("img") val img: String? + @JsonProperty("title") @SerialName("title") val title: String?, + @JsonProperty("description") @SerialName("description") val description: String?, + @JsonProperty("season") @SerialName("season") val season: Int?, + @JsonProperty("episode") @SerialName("episode") val episode: Int, + @JsonProperty("img") @SerialName("img") val img: String?, ) { + object Serializer : NonEmptySerializer(EpisodeMetadata.generatedSerializer()) + companion object { fun convertToEpisodes(list: List?): List? { return list?.map { @@ -300,40 +346,58 @@ class SimklApi : SyncAPI() { /** * https://simkl.docs.apiary.io/#introduction/about-simkl-api/standard-media-objects - * Useful for finding shows from metadata + * Useful for finding shows from metadata. */ @JsonInclude(JsonInclude.Include.NON_EMPTY) - open class MediaObject( - @JsonProperty("title") val title: String?, - @JsonProperty("year") val year: Int?, - @JsonProperty("ids") val ids: Ids?, - @JsonProperty("total_episodes") val totalEpisodes: Int? = null, - @JsonProperty("status") val status: String? = null, - @JsonProperty("poster") val poster: String? = null, - @JsonProperty("type") val type: String? = null, - @JsonProperty("seasons") val seasons: List? = null, - @JsonProperty("episodes") val episodes: List? = null + @OptIn(ExperimentalSerializationApi::class) // KeepGeneratedSerializer is an experimental annotation for now + @KeepGeneratedSerializer + @Serializable(with = MediaObject.Serializer::class) + data class MediaObject( + @JsonProperty("title") @SerialName("title") val title: String?, + @JsonProperty("year") @SerialName("year") val year: Int?, + @JsonProperty("ids") @SerialName("ids") val ids: Ids?, + @JsonProperty("total_episodes") @SerialName("total_episodes") val totalEpisodes: Int? = null, + @JsonProperty("status") @SerialName("status") val status: String? = null, + @JsonProperty("poster") @SerialName("poster") val poster: String? = null, + @JsonProperty("type") @SerialName("type") val type: String? = null, + @JsonProperty("seasons") @SerialName("seasons") val seasons: List? = null, + @JsonProperty("episodes") @SerialName("episodes") val episodes: List? = null, ) { + object Serializer : NonEmptySerializer(MediaObject.generatedSerializer()) + fun hasEnded(): Boolean { return status == "released" || status == "ended" } @JsonInclude(JsonInclude.Include.NON_EMPTY) + @OptIn(ExperimentalSerializationApi::class) // KeepGeneratedSerializer is an experimental annotation for now + @KeepGeneratedSerializer + @Serializable(with = Season.Serializer::class) data class Season( - @JsonProperty("number") val number: Int, - @JsonProperty("episodes") val episodes: List + @JsonProperty("number") @SerialName("number") val number: Int, + @JsonProperty("episodes") @SerialName("episodes") val episodes: List, ) { - data class Episode(@JsonProperty("number") val number: Int) + object Serializer : NonEmptySerializer(Season.generatedSerializer()) + + @Serializable + data class Episode( + @JsonProperty("number") @SerialName("number") val number: Int, + ) } @JsonInclude(JsonInclude.Include.NON_EMPTY) + @OptIn(ExperimentalSerializationApi::class) // KeepGeneratedSerializer is an experimental annotation for now + @KeepGeneratedSerializer + @Serializable(with = Ids.Serializer::class) data class Ids( - @JsonProperty("simkl") val simkl: Int?, - @JsonProperty("imdb") val imdb: String? = null, - @JsonProperty("tmdb") val tmdb: String? = null, - @JsonProperty("mal") val mal: String? = null, - @JsonProperty("anilist") val anilist: String? = null, + @JsonProperty("simkl") @SerialName("simkl") val simkl: Int?, + @JsonProperty("imdb") @SerialName("imdb") val imdb: String? = null, + @JsonProperty("tmdb") @SerialName("tmdb") val tmdb: String? = null, + @JsonProperty("mal") @SerialName("mal") val mal: String? = null, + @JsonProperty("anilist") @SerialName("anilist") val anilist: String? = null, ) { + object Serializer : NonEmptySerializer(Ids.generatedSerializer()) + companion object { fun fromMap(map: Map): Ids { return Ids( @@ -341,20 +405,21 @@ class SimklApi : SyncAPI() { imdb = map[SimklSyncServices.Imdb], tmdb = map[SimklSyncServices.Tmdb], mal = map[SimklSyncServices.Mal], - anilist = map[SimklSyncServices.AniList] + anilist = map[SimklSyncServices.AniList], ) } } } fun toSyncSearchResult(): SyncAPI.SyncSearchResult? { + val currentIds = this.ids return SyncAPI.SyncSearchResult( this.title ?: return null, "Simkl", - this.ids?.simkl?.toString() ?: return null, - getUrlFromId(this.ids.simkl), + currentIds?.simkl?.toString() ?: return null, + getUrlFromId(currentIds.simkl), this.poster?.let { getPosterUrl(it) }, - if (this.type == "movie") TvType.Movie else TvType.TvSeries + if (this.type == "movie") TvType.Movie else TvType.TvSeries, ) } } @@ -369,7 +434,7 @@ class SimklApi : SyncAPI() { private var addEpisodes: Pair?, List?>? = null, private var removeEpisodes: Pair?, List?>? = null, // Required for knowing if the status should be overwritten - private var onList: Boolean = false + private var onList: Boolean = false, ) { fun token(token: AuthToken) = apply { this.headers = getHeaders(token) } fun apiUrl(url: String) = apply { this.url = url } @@ -383,11 +448,7 @@ class SimklApi : SyncAPI() { fun status(newStatus: Int?, oldStatus: Int?) = apply { onList = oldStatus != null // Only set status if its new - if (newStatus != oldStatus) { - this.status = newStatus - } else { - this.status = null - } + this.status = if (newStatus != oldStatus) newStatus else null } fun episodes( @@ -396,7 +457,6 @@ class SimklApi : SyncAPI() { oldEpisodes: Int?, ) = apply { if (allEpisodes == null || newEpisodes == null) return@apply - fun getEpisodes(rawEpisodes: List) = if (rawEpisodes.any { it.season != null }) { EpisodeMetadata.convertToSeasons(rawEpisodes) to null @@ -407,12 +467,12 @@ class SimklApi : SyncAPI() { // Do not add episodes if there is no change if (newEpisodes > (oldEpisodes ?: 0)) { this.addEpisodes = getEpisodes(allEpisodes.take(newEpisodes)) - // Set to watching if episodes are added and there is no current status if (!onList) { status = SimklListStatusType.Watching.value } } + if ((oldEpisodes ?: 0) > newEpisodes) { this.removeEpisodes = getEpisodes(allEpisodes.drop(newEpisodes)) } @@ -424,19 +484,17 @@ class SimklApi : SyncAPI() { return if (this.status == SimklListStatusType.None.value) { app.post( "$url/sync/history/remove", - json = StatusRequest( + json = HistoryRequest( shows = listOf(HistoryMediaObject(ids = ids)), - movies = emptyList() + movies = emptyList(), ), - headers = headers + headers = headers, ).isSuccessful } else { val statusResponse = this.status?.let { setStatus -> - val newStatus = - SimklListStatusType.entries - .firstOrNull { it.value == setStatus }?.originalName - ?: SimklListStatusType.Watching.originalName!! - + val newStatus = SimklListStatusType.entries.firstOrNull { + it.value == setStatus + }?.originalName ?: SimklListStatusType.Watching.originalName!! app.post( "${this.url}/sync/add-to-list", json = StatusRequest( @@ -446,41 +504,40 @@ class SimklApi : SyncAPI() { null, ids, newStatus, - ) - ), movies = emptyList() + ), + ), + movies = emptyList(), ), - headers = headers + headers = headers, ).isSuccessful } ?: true val episodeRemovalResponse = removeEpisodes?.let { (seasons, episodes) -> app.post( "${this.url}/sync/history/remove", - json = StatusRequest( + json = HistoryRequest( shows = listOf( HistoryMediaObject( ids = ids, seasons = seasons, - episodes = episodes - ) + episodes = episodes, + ), ), - movies = emptyList() + movies = emptyList(), ), - headers = headers + headers = headers, ).isSuccessful } ?: true // You cannot rate if you are planning to watch it. - val shouldRate = - score != null && status != SimklListStatusType.Planning.value + val shouldRate = score != null && status != SimklListStatusType.Planning.value val realScore = if (shouldRate) score else null - val historyResponse = // Only post if there are episodes or score to upload if (addEpisodes != null || shouldRate) { app.post( "${this.url}/sync/history", - json = StatusRequest( + json = HistoryRequest( shows = listOf( HistoryMediaObject( null, @@ -490,34 +547,33 @@ class SimklApi : SyncAPI() { addEpisodes?.second, realScore, realScore?.let { time }, - ) - ), movies = emptyList() + ), + ), + movies = emptyList(), ), - headers = headers + headers = headers, ).isSuccessful - } else { - true - } - + } else true statusResponse && episodeRemovalResponse && historyResponse } } } } - fun getHeaders(token: AuthToken): Map = - mapOf("Authorization" to "Bearer ${token.accessToken}", "simkl-api-key" to CLIENT_ID) + fun getHeaders(token: AuthToken): Map = mapOf( + "Authorization" to "Bearer ${token.accessToken}", + "simkl-api-key" to CLIENT_ID, + ) suspend fun getEpisodes( simklId: Int?, type: String?, episodes: Int?, - hasEnded: Boolean? + hasEnded: Boolean?, ): Array? { if (simklId == null) return null - val cacheKey = "Episodes/$simklId" - val cache = SimklCache.getKey>(cacheKey) + val cache = SimklCache.getEpisodes(cacheKey) // Return cached result if its higher or equal the amount of episodes. if (cache != null && cache.size >= (episodes ?: 0)) { @@ -534,6 +590,7 @@ class SimklApi : SyncAPI() { }.toTypedArray() } } + val url = when (type) { "anime" -> "https://api.simkl.com/anime/episodes/$simklId" "tv" -> "https://api.simkl.com/tv/episodes/$simklId" @@ -548,57 +605,86 @@ class SimklApi : SyncAPI() { if (hasEnded == true) SimklCache.CacheTimes.OneMonth.value else SimklCache.CacheTimes.ThirtyMinutes.value // 1 Month cache - SimklCache.setKey(cacheKey, it, Duration.parse(cacheTime)) + SimklCache.setEpisodes(cacheKey, it, Duration.parse(cacheTime)) } } @JsonInclude(JsonInclude.Include.NON_EMPTY) - class HistoryMediaObject( - @JsonProperty("title") title: String? = null, - @JsonProperty("year") year: Int? = null, - @JsonProperty("ids") ids: Ids? = null, - @JsonProperty("seasons") seasons: List? = null, - @JsonProperty("episodes") episodes: List? = null, - @JsonProperty("rating") val rating: Int? = null, - @JsonProperty("rated_at") val ratedAt: String? = null, - ) : MediaObject(title, year, ids, seasons = seasons, episodes = episodes) + @OptIn(ExperimentalSerializationApi::class) // KeepGeneratedSerializer is an experimental annotation for now + @KeepGeneratedSerializer + @Serializable(with = HistoryMediaObject.Serializer::class) + data class HistoryMediaObject( + @JsonProperty("title") @SerialName("title") val title: String? = null, + @JsonProperty("year") @SerialName("year") val year: Int? = null, + @JsonProperty("ids") @SerialName("ids") val ids: MediaObject.Ids? = null, + @JsonProperty("seasons") @SerialName("seasons") val seasons: List? = null, + @JsonProperty("episodes") @SerialName("episodes") val episodes: List? = null, + @JsonProperty("rating") @SerialName("rating") val rating: Int? = null, + @JsonProperty("rated_at") @SerialName("rated_at") val ratedAt: String? = null, + ) { + object Serializer : NonEmptySerializer(HistoryMediaObject.generatedSerializer()) + } @JsonInclude(JsonInclude.Include.NON_EMPTY) - class RatingMediaObject( - @JsonProperty("title") title: String?, - @JsonProperty("year") year: Int?, - @JsonProperty("ids") ids: Ids?, - @JsonProperty("rating") val rating: Int, - @JsonProperty("rated_at") val ratedAt: String? = getDateTime(APIHolder.unixTime) - ) : MediaObject(title, year, ids) + @OptIn(ExperimentalSerializationApi::class) // KeepGeneratedSerializer is an experimental annotation for now + @KeepGeneratedSerializer + @Serializable(with = RatingMediaObject.Serializer::class) + data class RatingMediaObject( + @JsonProperty("title") @SerialName("title") val title: String? = null, + @JsonProperty("year") @SerialName("year") val year: Int? = null, + @JsonProperty("ids") @SerialName("ids") val ids: MediaObject.Ids? = null, + @JsonProperty("rating") @SerialName("rating") val rating: Int, + @JsonProperty("rated_at") @SerialName("rated_at") val ratedAt: String? = getDateTime(APIHolder.unixTime), + ) { + object Serializer : NonEmptySerializer(RatingMediaObject.generatedSerializer()) + } @JsonInclude(JsonInclude.Include.NON_EMPTY) - class StatusMediaObject( - @JsonProperty("title") title: String?, - @JsonProperty("year") year: Int?, - @JsonProperty("ids") ids: Ids?, - @JsonProperty("to") val to: String, - @JsonProperty("watched_at") val watchedAt: String? = getDateTime(APIHolder.unixTime) - ) : MediaObject(title, year, ids) + @OptIn(ExperimentalSerializationApi::class) // KeepGeneratedSerializer is an experimental annotation for now + @KeepGeneratedSerializer + @Serializable(with = StatusMediaObject.Serializer::class) + data class StatusMediaObject( + @JsonProperty("title") @SerialName("title") val title: String? = null, + @JsonProperty("year") @SerialName("year") val year: Int? = null, + @JsonProperty("ids") @SerialName("ids") val ids: MediaObject.Ids? = null, + @JsonProperty("to") @SerialName("to") val to: String, + @JsonProperty("watched_at") @SerialName("watched_at") val watchedAt: String? = getDateTime(APIHolder.unixTime), + ) { + object Serializer : NonEmptySerializer(StatusMediaObject.generatedSerializer()) + } @JsonInclude(JsonInclude.Include.NON_EMPTY) + @OptIn(ExperimentalSerializationApi::class) // KeepGeneratedSerializer is an experimental annotation for now + @KeepGeneratedSerializer + @Serializable(with = StatusRequest.Serializer::class) data class StatusRequest( - @JsonProperty("movies") val movies: List, - @JsonProperty("shows") val shows: List - ) + @JsonProperty("movies") @SerialName("movies") val movies: List, + @JsonProperty("shows") @SerialName("shows") val shows: List, + ) { + object Serializer : NonEmptySerializer(StatusRequest.generatedSerializer()) + } + + /** Same shape as [StatusRequest], for the endpoints that post [HistoryMediaObject]s instead. */ + @JsonInclude(JsonInclude.Include.NON_EMPTY) + @OptIn(ExperimentalSerializationApi::class) // KeepGeneratedSerializer is an experimental annotation for now + @KeepGeneratedSerializer + @Serializable(with = HistoryRequest.Serializer::class) + data class HistoryRequest( + @JsonProperty("movies") @SerialName("movies") val movies: List, + @JsonProperty("shows") @SerialName("shows") val shows: List, + ) { + object Serializer : NonEmptySerializer(HistoryRequest.generatedSerializer()) + } /** https://simkl.docs.apiary.io/#reference/sync/get-all-items/get-all-items-in-the-user's-watchlist */ + @Serializable data class AllItemsResponse( - @JsonProperty("shows") - val shows: List = emptyList(), - @JsonProperty("anime") - val anime: List = emptyList(), - @JsonProperty("movies") - val movies: List = emptyList(), + @JsonProperty("shows") @SerialName("shows") val shows: List = emptyList(), + @JsonProperty("anime") @SerialName("anime") val anime: List = emptyList(), + @JsonProperty("movies") @SerialName("movies") val movies: List = emptyList(), ) { companion object { fun merge(first: AllItemsResponse?, second: AllItemsResponse?): AllItemsResponse { - // Replace the first item with the same id, or add the new item fun MutableList.replaceOrAddItem(newItem: T, predicate: (T) -> Boolean) { for (i in this.indices) { @@ -607,10 +693,10 @@ class SimklApi : SyncAPI() { return } } + this.add(newItem) } - // fun merge( first: List?, second: List? @@ -644,15 +730,17 @@ class SimklApi : SyncAPI() { fun toLibraryItem(): SyncAPI.LibraryItem } + @Serializable data class MovieMetadata( - @JsonProperty("last_watched_at") override val lastWatchedAt: String?, - @JsonProperty("status") override val status: String, - @JsonProperty("user_rating") override val userRating: Int?, - @JsonProperty("last_watched") override val lastWatched: String?, - @JsonProperty("watched_episodes_count") override val watchedEpisodesCount: Int?, - @JsonProperty("total_episodes_count") override val totalEpisodesCount: Int?, - val movie: ShowMetadata.Show + @JsonProperty("last_watched_at") @SerialName("last_watched_at") override val lastWatchedAt: String?, + @JsonProperty("status") @SerialName("status") override val status: String, + @JsonProperty("user_rating") @SerialName("user_rating") override val userRating: Int?, + @JsonProperty("last_watched") @SerialName("last_watched") override val lastWatched: String?, + @JsonProperty("watched_episodes_count") @SerialName("watched_episodes_count") override val watchedEpisodesCount: Int?, + @JsonProperty("total_episodes_count") @SerialName("total_episodes_count") override val totalEpisodesCount: Int?, + @JsonProperty("movie") @SerialName("movie") val movie: ShowMetadata.Show, ) : Metadata { + @JsonIgnore override fun getIds(): ShowMetadata.Show.Ids { return this.movie.ids } @@ -672,20 +760,22 @@ class SimklApi : SyncAPI() { null, null, this.movie.year?.toYear(), - movie.ids.simkl + movie.ids.simkl, ) } } + @Serializable data class ShowMetadata( - @JsonProperty("last_watched_at") override val lastWatchedAt: String?, - @JsonProperty("status") override val status: String, - @JsonProperty("user_rating") override val userRating: Int?, - @JsonProperty("last_watched") override val lastWatched: String?, - @JsonProperty("watched_episodes_count") override val watchedEpisodesCount: Int?, - @JsonProperty("total_episodes_count") override val totalEpisodesCount: Int?, - @JsonProperty("show") val show: Show + @JsonProperty("last_watched_at") @SerialName("last_watched_at") override val lastWatchedAt: String?, + @JsonProperty("status") @SerialName("status") override val status: String, + @JsonProperty("user_rating") @SerialName("user_rating") override val userRating: Int?, + @JsonProperty("last_watched") @SerialName("last_watched") override val lastWatched: String?, + @JsonProperty("watched_episodes_count") @SerialName("watched_episodes_count") override val watchedEpisodesCount: Int?, + @JsonProperty("total_episodes_count") @SerialName("total_episodes_count") override val totalEpisodesCount: Int?, + @JsonProperty("show") @SerialName("show") val show: Show, ) : Metadata { + @JsonIgnore override fun getIds(): Show.Ids { return this.show.ids } @@ -705,28 +795,30 @@ class SimklApi : SyncAPI() { null, null, this.show.year?.toYear(), - show.ids.simkl + show.ids.simkl, ) } + @Serializable data class Show( - @JsonProperty("title") val title: String, - @JsonProperty("poster") val poster: String?, - @JsonProperty("year") val year: Int?, - @JsonProperty("ids") val ids: Ids, + @JsonProperty("title") @SerialName("title") val title: String, + @JsonProperty("poster") @SerialName("poster") val poster: String?, + @JsonProperty("year") @SerialName("year") val year: Int?, + @JsonProperty("ids") @SerialName("ids") val ids: Ids, ) { + @Serializable data class Ids( - @JsonProperty("simkl") val simkl: Int, - @JsonProperty("slug") val slug: String?, - @JsonProperty("imdb") val imdb: String?, - @JsonProperty("zap2it") val zap2it: String?, - @JsonProperty("tmdb") val tmdb: String?, - @JsonProperty("offen") val offen: String?, - @JsonProperty("tvdb") val tvdb: String?, - @JsonProperty("mal") val mal: String?, - @JsonProperty("anidb") val anidb: String?, - @JsonProperty("anilist") val anilist: String?, - @JsonProperty("traktslug") val traktslug: String? + @JsonProperty("simkl") @SerialName("simkl") val simkl: Int, + @JsonProperty("slug") @SerialName("slug") val slug: String?, + @JsonProperty("imdb") @SerialName("imdb") val imdb: String?, + @JsonProperty("zap2it") @SerialName("zap2it") val zap2it: String?, + @JsonProperty("tmdb") @SerialName("tmdb") val tmdb: String?, + @JsonProperty("offen") @SerialName("offen") val offen: String?, + @JsonProperty("tvdb") @SerialName("tvdb") val tvdb: String?, + @JsonProperty("mal") @SerialName("mal") val mal: String?, + @JsonProperty("anidb") @SerialName("anidb") val anidb: String?, + @JsonProperty("anilist") @SerialName("anilist") val anilist: String?, + @JsonProperty("traktslug") @SerialName("traktslug") val traktslug: String?, ) { fun matchesId(database: SimklSyncServices, id: String): Boolean { return when (database) { @@ -743,27 +835,10 @@ class SimklApi : SyncAPI() { } } - /** - * Appends api keys to the requests - **/ - /*private inner class HeaderInterceptor : Interceptor { - override fun intercept(chain: Interceptor.Chain): Response { - debugPrint { "${this@SimklApi.name} made request to ${chain.request().url}" } - return chain.proceed( - chain.request() - .newBuilder() - .addHeader("Authorization", "Bearer $token") - .addHeader("simkl-api-key", CLIENT_ID) - .build() - ) - } - }*/ - private suspend fun getUser(token: AuthToken): SettingsResponse = app.post("$mainUrl/users/settings", headers = getHeaders(token)) .parsed() - /** * Useful to get episodes on demand to prevent unnecessary requests. */ @@ -771,7 +846,7 @@ class SimklApi : SyncAPI() { private val simklId: Int?, private val type: String?, private val totalEpisodeCount: Int?, - private val hasEnded: Boolean? + private val hasEnded: Boolean?, ) { suspend fun getEpisodes(): Array? { return getEpisodes(simklId, type, totalEpisodeCount, hasEnded) @@ -786,10 +861,12 @@ class SimklApi : SyncAPI() { val episodeConstructor: SimklEpisodeConstructor, override var isFavorite: Boolean? = null, override var maxEpisodes: Int? = null, - /** Save seen episodes separately to know the change from old to new. - * Required to remove seen episodes if count decreases */ + /** + * Save seen episodes separately to know the change from old to new. + * Required to remove seen episodes if count decreases. + */ val oldEpisodes: Int, - val oldStatus: String? + val oldStatus: String?, ) : SyncAPI.AbstractSyncStatus() override suspend fun status(auth: AuthData?, id: String): SyncAPI.AbstractSyncStatus? { @@ -799,22 +876,23 @@ class SimklApi : SyncAPI() { // Key which assumes all ids are the same each time :/ // This could be some sort of reference system to make multiple IDs // point to the same key. - val idKey = - realIds.toList().map { "${it.first.originalName}=${it.second}" }.sorted().joinToString() + val idKey = realIds.toList().map { + "${it.first.originalName}=${it.second}" + }.sorted().joinToString() - val cachedObject = SimklCache.getKey(idKey) + val cachedObject = SimklCache.getMediaObject(idKey) val searchResult: MediaObject = cachedObject ?: (searchByIds(realIds)?.firstOrNull()?.also { result -> val cacheTime = if (result.hasEnded()) SimklCache.CacheTimes.OneMonth.value else SimklCache.CacheTimes.ThirtyMinutes.value - SimklCache.setKey(idKey, result, Duration.parse(cacheTime)) + SimklCache.setMediaObject(idKey, result, Duration.parse(cacheTime)) }) ?: return null val episodeConstructor = SimklEpisodeConstructor( searchResult.ids?.simkl, searchResult.type, searchResult.totalEpisodes, - searchResult.hasEnded() + searchResult.hasEnded(), ) val foundItem = getSyncListSmart(auth)?.let { list -> @@ -829,19 +907,16 @@ class SimklApi : SyncAPI() { return SimklSyncStatus( status = foundItem.status?.let { SyncWatchType.fromInternalId( - SimklListStatusType.fromString( - it - )?.value + SimklListStatusType.fromString(it)?.value ) - } - ?: return null, + } ?: return null, score = Score.from10(foundItem.userRating), watchedEpisodes = foundItem.watchedEpisodesCount, maxEpisodes = searchResult.totalEpisodes, episodeConstructor = episodeConstructor, oldEpisodes = foundItem.watchedEpisodesCount ?: 0, oldScore = foundItem.userRating, - oldStatus = foundItem.status + oldStatus = foundItem.status, ) } else { return SimklSyncStatus( @@ -852,7 +927,7 @@ class SimklApi : SyncAPI() { episodeConstructor = episodeConstructor, oldEpisodes = 0, oldStatus = null, - oldScore = null + oldScore = null, ) } } @@ -860,12 +935,11 @@ class SimklApi : SyncAPI() { override suspend fun updateStatus( auth: AuthData?, id: String, - newStatus: AbstractSyncStatus + newStatus: AbstractSyncStatus, ): Boolean { - val parsedId = readIdFromString(id) lastScoreTime = APIHolder.unixTime + val parsedId = readIdFromString(id) val simklStatus = newStatus as? SimklSyncStatus - val builder = SimklScoreBuilder.Builder() .apiUrl(this.mainUrl) .score(newStatus.score?.toInt(10), simklStatus?.oldScore) @@ -879,7 +953,6 @@ class SimklApi : SyncAPI() { .token(auth?.token ?: return false) .ids(MediaObject.Ids.fromMap(parsedId)) - // Get episodes only when required val episodes = simklStatus?.episodeConstructor?.getEpisodes() @@ -892,22 +965,19 @@ class SimklApi : SyncAPI() { } builder.episodes(episodes?.toList(), watchedEpisodes, simklStatus?.oldEpisodes) - requireLibraryRefresh = true return builder.execute() } - /** See https://simkl.docs.apiary.io/#reference/search/id-lookup/get-items-by-id */ private suspend fun searchByIds(serviceMap: Map): Array? { if (serviceMap.isEmpty()) return emptyArray() - return app.get( "$mainUrl/search/id", params = mapOf("client_id" to CLIENT_ID) + serviceMap.map { (service, id) -> service.originalName to id } - ).parsedSafe() + ).parsedSafe>() } override suspend fun search(auth: AuthData?, query: String): List? { @@ -918,12 +988,10 @@ class SimklApi : SyncAPI() { override fun loginRequest(): AuthLoginPage? { val lastLoginState = BigInteger(130, SecureRandom()).toString(32) - val url = - "https://simkl.com/oauth/authorize?response_type=code&client_id=$CLIENT_ID&redirect_uri=$APP_STRING://${redirectUrlIdentifier}&state=$lastLoginState" - + val url = "https://simkl.com/oauth/authorize?response_type=code&client_id=$CLIENT_ID&redirect_uri=$APP_STRING://$redirectUrlIdentifier&state=$lastLoginState" return AuthLoginPage( url = url, - payload = lastLoginState + payload = lastLoginState, ) } @@ -938,12 +1006,12 @@ class SimklApi : SyncAPI() { return app.get( "$mainUrl/sync/all-items/", params = params, - headers = getHeaders(auth.token) - ).parsedSafe() + headers = getHeaders(auth.token), + ).parsedSafe() } private suspend fun getActivities(token: AuthToken): ActivitiesResponse? { - return app.post("$mainUrl/sync/activities", headers = getHeaders(token)).parsedSafe() + return app.post("$mainUrl/sync/activities", headers = getHeaders(token)).parsedSafe() } private fun getSyncListCached(auth: AuthData): AllItemsResponse? { @@ -957,18 +1025,13 @@ class SimklApi : SyncAPI() { val lastRemoval = listOf( activities?.tvShows?.removedFromList, activities?.anime?.removedFromList, - activities?.movies?.removedFromList - ).maxOf { - getUnixTime(it) ?: -1 - } - val lastRealUpdate = - listOf( - activities?.tvShows?.all, - activities?.anime?.all, - activities?.movies?.all, - ).maxOf { - getUnixTime(it) ?: -1 - } + activities?.movies?.removedFromList, + ).maxOf { getUnixTime(it) ?: -1 } + val lastRealUpdate = listOf( + activities?.tvShows?.all, + activities?.anime?.all, + activities?.movies?.all, + ).maxOf { getUnixTime(it) ?: -1 } debugPrint { "Cache times: lastCacheUpdate=$lastCacheUpdate, lastRemoval=$lastRemoval, lastRealUpdate=$lastRealUpdate" } val list = if (lastCacheUpdate == null || lastCacheUpdate < lastRemoval) { @@ -980,38 +1043,33 @@ class SimklApi : SyncAPI() { setKey(SIMKL_CACHED_LIST_TIME, userId, lastCacheUpdate) AllItemsResponse.merge( getSyncListCached(auth), - getSyncListSince(auth, lastCacheUpdate) + getSyncListSince(auth, lastCacheUpdate), ) } else { debugPrint { "Cached list update in ${this.name}." } getSyncListCached(auth) } + debugPrint { "List sizes: movies=${list?.movies?.size}, shows=${list?.shows?.size}, anime=${list?.anime?.size}" } - setKey(SIMKL_CACHED_LIST, userId, list) - return list } override suspend fun library(auth: AuthData?): SyncAPI.LibraryMetadata? { val list = getSyncListSmart(auth ?: return null) ?: return null - - val baseMap = - SimklListStatusType.entries - .filter { it.value >= 0 && it.value != SimklListStatusType.ReWatching.value } - .associate { - it.stringRes to emptyList() - } + val baseMap = SimklListStatusType.entries + .filter { it.value >= 0 && it.value != SimklListStatusType.ReWatching.value } + .associate { + it.stringRes to emptyList() + } val syncMap = listOf(list.anime, list.movies, list.shows) .flatten() - .groupBy { - it.status - } + .groupBy { it.status } .mapNotNull { (status, list) -> - val stringRes = - status?.let { SimklListStatusType.fromString(it)?.stringRes } - ?: return@mapNotNull null + val stringRes = status?.let { + SimklListStatusType.fromString(it)?.stringRes + } ?: return@mapNotNull null val libraryList = list.map { it.toLibraryItem() } stringRes to libraryList }.toMap() @@ -1037,15 +1095,14 @@ class SimklApi : SyncAPI() { override suspend fun pinRequest(): AuthPinData? { val pinAuthResp = app.get( - "$mainUrl/oauth/pin?client_id=$CLIENT_ID&redirect_uri=$APP_STRING://${redirectUrlIdentifier}" + "$mainUrl/oauth/pin?client_id=$CLIENT_ID&redirect_uri=$APP_STRING://$redirectUrlIdentifier" ).parsedSafe() ?: return null - return AuthPinData( deviceCode = pinAuthResp.deviceCode, userCode = pinAuthResp.userCode, verificationUrl = pinAuthResp.verificationUrl, expiresIn = pinAuthResp.expiresIn, - interval = pinAuthResp.interval + interval = pinAuthResp.interval, ) } @@ -1053,7 +1110,6 @@ class SimklApi : SyncAPI() { val pinAuthResp = app.get( "$mainUrl/oauth/pin/${payload.userCode}?client_id=$CLIENT_ID" ).parsedSafe() ?: return null - return AuthToken( accessToken = pinAuthResp.accessToken ?: return null, ) @@ -1069,7 +1125,6 @@ class SimklApi : SyncAPI() { val tokenResponse = app.post( "$mainUrl/oauth/token", json = TokenRequest(code) ).parsedSafe() ?: return null - return AuthToken( accessToken = tokenResponse.accessToken, ) @@ -1080,7 +1135,7 @@ class SimklApi : SyncAPI() { return AuthUser( id = user.account.id, name = user.user.name, - profilePicture = user.user.avatar + profilePicture = user.user.avatar, ) } } From 3496e5f8d2ebae4c1b5bdf264782f58375c1eb06 Mon Sep 17 00:00:00 2001 From: BlipBlob <82711292+BlipBlob@users.noreply.github.com> Date: Fri, 10 Jul 2026 22:59:31 +0000 Subject: [PATCH 32/38] [skip ci] Use abiValidation to prevent breaking changes in extension library (#2835) --- .github/workflows/pull_request.yml | 5 + library/README.md | 15 + library/api/jvm/library.api | 7271 ++++++++++++++++++++++++++++ library/build.gradle.kts | 12 + 4 files changed, 7303 insertions(+) create mode 100644 library/README.md create mode 100644 library/api/jvm/library.api diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml index 8f5c62866..433816e0f 100644 --- a/.github/workflows/pull_request.yml +++ b/.github/workflows/pull_request.yml @@ -26,6 +26,11 @@ jobs: cache-encryption-key: ${{ secrets.GRADLE_ENCRYPTION_KEY }} cache-read-only: false + - name: Ensure binary compatibility + # This is to ensure that your code is backwards compatible. + # If this fails you need to add a @Prerelease annotation to new code. + run: ./gradlew library:checkKotlinAbi + - name: Run Gradle run: ./gradlew assemblePrereleaseDebug lint check diff --git a/library/README.md b/library/README.md new file mode 100644 index 000000000..18f21055d --- /dev/null +++ b/library/README.md @@ -0,0 +1,15 @@ +## CloudStream extension library + +This is the official API surface for all CloudStream plugins. + +To ensure that all plugins work on both the stable release and pre-release we must have +binary compatibility on all changes. All new changes must be marked with `@Prerelease` to +prevent accidental usage among extension developers. + +We use Kotlin binary compatibility validation using: + +``./gradlew checkKotlinAbi`` + +If you for some reason must update the binary compatibility then manually edit `api/jvm/library.api` or use: + +``./gradlew updateKotlinAbi`` diff --git a/library/api/jvm/library.api b/library/api/jvm/library.api new file mode 100644 index 000000000..025ebc391 --- /dev/null +++ b/library/api/jvm/library.api @@ -0,0 +1,7271 @@ +public final class com/lagradost/api/BuildConfig { + public static final field INSTANCE Lcom/lagradost/api/BuildConfig; + public final fun getMDL_API_KEY ()Ljava/lang/String; + public final fun getTRAKT_CLIENT_ID ()Ljava/lang/String; +} + +public final class com/lagradost/api/ContextHelper_jvmKt { + public static final fun getContext ()Ljava/lang/Object; + public static final fun setContext (Ljava/lang/ref/WeakReference;)V +} + +public final class com/lagradost/api/Log { + public static final field INSTANCE Lcom/lagradost/api/Log; + public final fun d (Ljava/lang/String;Ljava/lang/String;)V + public final fun e (Ljava/lang/String;Ljava/lang/String;)V + public final fun i (Ljava/lang/String;Ljava/lang/String;)V + public final fun w (Ljava/lang/String;Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/APIHolder { + public static final field INSTANCE Lcom/lagradost/cloudstream3/APIHolder; + public final fun addPluginMapping (Lcom/lagradost/cloudstream3/MainAPI;)V + public final fun capitalize (Ljava/lang/String;)Ljava/lang/String; + public final fun getAllProviders ()Lcom/lagradost/cloudstream3/utils/AtomicMutableList; + public final fun getApiFromNameNull (Ljava/lang/String;)Lcom/lagradost/cloudstream3/MainAPI; + public final fun getApiFromUrlNull (Ljava/lang/String;)Lcom/lagradost/cloudstream3/MainAPI; + public final fun getApiMap ()Ljava/util/Map; + public final fun getApis ()Lcom/lagradost/cloudstream3/utils/AtomicList; + public final fun getCaptchaToken (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static synthetic fun getCaptchaToken$default (Lcom/lagradost/cloudstream3/APIHolder;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; + public final fun getTracker (Ljava/util/List;Ljava/util/Set;Ljava/lang/Integer;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public final fun getTracker (Ljava/util/List;Ljava/util/Set;Ljava/lang/Integer;ZLkotlin/coroutines/Continuation;)Ljava/lang/Object; + public final fun getUnixTime ()J + public final fun getUnixTimeMS ()J + public final fun initAll ()V + public final fun removePluginMapping (Lcom/lagradost/cloudstream3/MainAPI;)V + public final fun setApiMap (Ljava/util/Map;)V + public final fun setApis (Lcom/lagradost/cloudstream3/utils/AtomicList;)V +} + +public final class com/lagradost/cloudstream3/Actor { + public fun (Ljava/lang/String;Ljava/lang/String;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun copy (Ljava/lang/String;Ljava/lang/String;)Lcom/lagradost/cloudstream3/Actor; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/Actor;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/Actor; + public fun equals (Ljava/lang/Object;)Z + public final fun getImage ()Ljava/lang/String; + public final fun getName ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/ActorData { + public fun (Lcom/lagradost/cloudstream3/Actor;Lcom/lagradost/cloudstream3/ActorRole;Ljava/lang/String;Lcom/lagradost/cloudstream3/Actor;)V + public synthetic fun (Lcom/lagradost/cloudstream3/Actor;Lcom/lagradost/cloudstream3/ActorRole;Ljava/lang/String;Lcom/lagradost/cloudstream3/Actor;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Lcom/lagradost/cloudstream3/Actor; + public final fun component2 ()Lcom/lagradost/cloudstream3/ActorRole; + public final fun component3 ()Ljava/lang/String; + public final fun component4 ()Lcom/lagradost/cloudstream3/Actor; + public final fun copy (Lcom/lagradost/cloudstream3/Actor;Lcom/lagradost/cloudstream3/ActorRole;Ljava/lang/String;Lcom/lagradost/cloudstream3/Actor;)Lcom/lagradost/cloudstream3/ActorData; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/ActorData;Lcom/lagradost/cloudstream3/Actor;Lcom/lagradost/cloudstream3/ActorRole;Ljava/lang/String;Lcom/lagradost/cloudstream3/Actor;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/ActorData; + public fun equals (Ljava/lang/Object;)Z + public final fun getActor ()Lcom/lagradost/cloudstream3/Actor; + public final fun getRole ()Lcom/lagradost/cloudstream3/ActorRole; + public final fun getRoleString ()Ljava/lang/String; + public final fun getVoiceActor ()Lcom/lagradost/cloudstream3/Actor; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/ActorRole : java/lang/Enum { + public static final field Background Lcom/lagradost/cloudstream3/ActorRole; + public static final field Main Lcom/lagradost/cloudstream3/ActorRole; + public static final field Supporting Lcom/lagradost/cloudstream3/ActorRole; + public static fun getEntries ()Lkotlin/enums/EnumEntries; + public static fun valueOf (Ljava/lang/String;)Lcom/lagradost/cloudstream3/ActorRole; + public static fun values ()[Lcom/lagradost/cloudstream3/ActorRole; +} + +public final class com/lagradost/cloudstream3/AniSearch { + public static final field Companion Lcom/lagradost/cloudstream3/AniSearch$Companion; + public fun ()V + public fun (Lcom/lagradost/cloudstream3/AniSearch$Data;)V + public synthetic fun (Lcom/lagradost/cloudstream3/AniSearch$Data;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Lcom/lagradost/cloudstream3/AniSearch$Data; + public final fun copy (Lcom/lagradost/cloudstream3/AniSearch$Data;)Lcom/lagradost/cloudstream3/AniSearch; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/AniSearch;Lcom/lagradost/cloudstream3/AniSearch$Data;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/AniSearch; + public fun equals (Ljava/lang/Object;)Z + public final fun getData ()Lcom/lagradost/cloudstream3/AniSearch$Data; + public fun hashCode ()I + public final fun setData (Lcom/lagradost/cloudstream3/AniSearch$Data;)V + public fun toString ()Ljava/lang/String; +} + +public final synthetic class com/lagradost/cloudstream3/AniSearch$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lcom/lagradost/cloudstream3/AniSearch$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lcom/lagradost/cloudstream3/AniSearch; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lcom/lagradost/cloudstream3/AniSearch;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class com/lagradost/cloudstream3/AniSearch$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class com/lagradost/cloudstream3/AniSearch$Data { + public static final field Companion Lcom/lagradost/cloudstream3/AniSearch$Data$Companion; + public fun ()V + public fun (Lcom/lagradost/cloudstream3/AniSearch$Data$Page;)V + public synthetic fun (Lcom/lagradost/cloudstream3/AniSearch$Data$Page;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Lcom/lagradost/cloudstream3/AniSearch$Data$Page; + public final fun copy (Lcom/lagradost/cloudstream3/AniSearch$Data$Page;)Lcom/lagradost/cloudstream3/AniSearch$Data; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/AniSearch$Data;Lcom/lagradost/cloudstream3/AniSearch$Data$Page;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/AniSearch$Data; + public fun equals (Ljava/lang/Object;)Z + public final fun getPage ()Lcom/lagradost/cloudstream3/AniSearch$Data$Page; + public fun hashCode ()I + public final fun setPage (Lcom/lagradost/cloudstream3/AniSearch$Data$Page;)V + public fun toString ()Ljava/lang/String; +} + +public final synthetic class com/lagradost/cloudstream3/AniSearch$Data$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lcom/lagradost/cloudstream3/AniSearch$Data$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lcom/lagradost/cloudstream3/AniSearch$Data; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lcom/lagradost/cloudstream3/AniSearch$Data;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class com/lagradost/cloudstream3/AniSearch$Data$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class com/lagradost/cloudstream3/AniSearch$Data$Page { + public static final field Companion Lcom/lagradost/cloudstream3/AniSearch$Data$Page$Companion; + public fun ()V + public fun (Ljava/util/ArrayList;)V + public synthetic fun (Ljava/util/ArrayList;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/util/ArrayList; + public final fun copy (Ljava/util/ArrayList;)Lcom/lagradost/cloudstream3/AniSearch$Data$Page; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/AniSearch$Data$Page;Ljava/util/ArrayList;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/AniSearch$Data$Page; + public fun equals (Ljava/lang/Object;)Z + public final fun getMedia ()Ljava/util/ArrayList; + public fun hashCode ()I + public final fun setMedia (Ljava/util/ArrayList;)V + public fun toString ()Ljava/lang/String; +} + +public final synthetic class com/lagradost/cloudstream3/AniSearch$Data$Page$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lcom/lagradost/cloudstream3/AniSearch$Data$Page$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lcom/lagradost/cloudstream3/AniSearch$Data$Page; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lcom/lagradost/cloudstream3/AniSearch$Data$Page;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class com/lagradost/cloudstream3/AniSearch$Data$Page$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class com/lagradost/cloudstream3/AniSearch$Data$Page$Media { + public static final field Companion Lcom/lagradost/cloudstream3/AniSearch$Data$Page$Media$Companion; + public fun ()V + public fun (Lcom/lagradost/cloudstream3/AniSearch$Data$Page$Media$Title;Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/String;Lcom/lagradost/cloudstream3/AniSearch$Data$Page$Media$CoverImage;Ljava/lang/String;)V + public synthetic fun (Lcom/lagradost/cloudstream3/AniSearch$Data$Page$Media$Title;Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/String;Lcom/lagradost/cloudstream3/AniSearch$Data$Page$Media$CoverImage;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Lcom/lagradost/cloudstream3/AniSearch$Data$Page$Media$Title; + public final fun component2 ()Ljava/lang/Integer; + public final fun component3 ()Ljava/lang/Integer; + public final fun component4 ()Ljava/lang/Integer; + public final fun component5 ()Ljava/lang/String; + public final fun component6 ()Lcom/lagradost/cloudstream3/AniSearch$Data$Page$Media$CoverImage; + public final fun component7 ()Ljava/lang/String; + public final fun copy (Lcom/lagradost/cloudstream3/AniSearch$Data$Page$Media$Title;Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/String;Lcom/lagradost/cloudstream3/AniSearch$Data$Page$Media$CoverImage;Ljava/lang/String;)Lcom/lagradost/cloudstream3/AniSearch$Data$Page$Media; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/AniSearch$Data$Page$Media;Lcom/lagradost/cloudstream3/AniSearch$Data$Page$Media$Title;Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/String;Lcom/lagradost/cloudstream3/AniSearch$Data$Page$Media$CoverImage;Ljava/lang/String;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/AniSearch$Data$Page$Media; + public fun equals (Ljava/lang/Object;)Z + public final fun getBannerImage ()Ljava/lang/String; + public final fun getCoverImage ()Lcom/lagradost/cloudstream3/AniSearch$Data$Page$Media$CoverImage; + public final fun getFormat ()Ljava/lang/String; + public final fun getId ()Ljava/lang/Integer; + public final fun getIdMal ()Ljava/lang/Integer; + public final fun getSeasonYear ()Ljava/lang/Integer; + public final fun getTitle ()Lcom/lagradost/cloudstream3/AniSearch$Data$Page$Media$Title; + public fun hashCode ()I + public final fun setBannerImage (Ljava/lang/String;)V + public final fun setCoverImage (Lcom/lagradost/cloudstream3/AniSearch$Data$Page$Media$CoverImage;)V + public final fun setFormat (Ljava/lang/String;)V + public final fun setId (Ljava/lang/Integer;)V + public final fun setIdMal (Ljava/lang/Integer;)V + public final fun setSeasonYear (Ljava/lang/Integer;)V + public final fun setTitle (Lcom/lagradost/cloudstream3/AniSearch$Data$Page$Media$Title;)V + public fun toString ()Ljava/lang/String; +} + +public final synthetic class com/lagradost/cloudstream3/AniSearch$Data$Page$Media$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lcom/lagradost/cloudstream3/AniSearch$Data$Page$Media$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lcom/lagradost/cloudstream3/AniSearch$Data$Page$Media; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lcom/lagradost/cloudstream3/AniSearch$Data$Page$Media;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class com/lagradost/cloudstream3/AniSearch$Data$Page$Media$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class com/lagradost/cloudstream3/AniSearch$Data$Page$Media$CoverImage { + public static final field Companion Lcom/lagradost/cloudstream3/AniSearch$Data$Page$Media$CoverImage$Companion; + public fun ()V + public fun (Ljava/lang/String;Ljava/lang/String;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun copy (Ljava/lang/String;Ljava/lang/String;)Lcom/lagradost/cloudstream3/AniSearch$Data$Page$Media$CoverImage; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/AniSearch$Data$Page$Media$CoverImage;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/AniSearch$Data$Page$Media$CoverImage; + public fun equals (Ljava/lang/Object;)Z + public final fun getExtraLarge ()Ljava/lang/String; + public final fun getLarge ()Ljava/lang/String; + public fun hashCode ()I + public final fun setExtraLarge (Ljava/lang/String;)V + public final fun setLarge (Ljava/lang/String;)V + public fun toString ()Ljava/lang/String; +} + +public final synthetic class com/lagradost/cloudstream3/AniSearch$Data$Page$Media$CoverImage$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lcom/lagradost/cloudstream3/AniSearch$Data$Page$Media$CoverImage$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lcom/lagradost/cloudstream3/AniSearch$Data$Page$Media$CoverImage; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lcom/lagradost/cloudstream3/AniSearch$Data$Page$Media$CoverImage;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class com/lagradost/cloudstream3/AniSearch$Data$Page$Media$CoverImage$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class com/lagradost/cloudstream3/AniSearch$Data$Page$Media$Title { + public static final field Companion Lcom/lagradost/cloudstream3/AniSearch$Data$Page$Media$Title$Companion; + public fun ()V + public fun (Ljava/lang/String;Ljava/lang/String;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun copy (Ljava/lang/String;Ljava/lang/String;)Lcom/lagradost/cloudstream3/AniSearch$Data$Page$Media$Title; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/AniSearch$Data$Page$Media$Title;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/AniSearch$Data$Page$Media$Title; + public fun equals (Ljava/lang/Object;)Z + public final fun getEnglish ()Ljava/lang/String; + public final fun getRomaji ()Ljava/lang/String; + public fun hashCode ()I + public final fun isMatchingTitles (Ljava/lang/String;)Z + public final fun setEnglish (Ljava/lang/String;)V + public final fun setRomaji (Ljava/lang/String;)V + public fun toString ()Ljava/lang/String; +} + +public final synthetic class com/lagradost/cloudstream3/AniSearch$Data$Page$Media$Title$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lcom/lagradost/cloudstream3/AniSearch$Data$Page$Media$Title$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lcom/lagradost/cloudstream3/AniSearch$Data$Page$Media$Title; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lcom/lagradost/cloudstream3/AniSearch$Data$Page$Media$Title;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class com/lagradost/cloudstream3/AniSearch$Data$Page$Media$Title$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class com/lagradost/cloudstream3/AnimeLoadResponse : com/lagradost/cloudstream3/EpisodeResponse, com/lagradost/cloudstream3/LoadResponse { + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/lagradost/cloudstream3/TvType;Ljava/lang/String;Ljava/lang/Integer;Ljava/util/Map;Lcom/lagradost/cloudstream3/ShowStatus;Ljava/lang/String;Ljava/util/List;Ljava/util/List;Lcom/lagradost/cloudstream3/Score;Ljava/lang/Integer;Ljava/util/List;Ljava/util/List;Ljava/util/List;ZLjava/util/Map;Ljava/util/Map;Lcom/lagradost/cloudstream3/NextAiring;Ljava/util/List;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/lagradost/cloudstream3/TvType;Ljava/lang/String;Ljava/lang/Integer;Ljava/util/Map;Lcom/lagradost/cloudstream3/ShowStatus;Ljava/lang/String;Ljava/util/List;Ljava/util/List;Lcom/lagradost/cloudstream3/Score;Ljava/lang/Integer;Ljava/util/List;Ljava/util/List;Ljava/util/List;ZLjava/util/Map;Ljava/util/Map;Lcom/lagradost/cloudstream3/NextAiring;Ljava/util/List;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component10 ()Lcom/lagradost/cloudstream3/ShowStatus; + public final fun component11 ()Ljava/lang/String; + public final fun component12 ()Ljava/util/List; + public final fun component13 ()Ljava/util/List; + public final fun component14 ()Lcom/lagradost/cloudstream3/Score; + public final fun component15 ()Ljava/lang/Integer; + public final fun component16 ()Ljava/util/List; + public final fun component17 ()Ljava/util/List; + public final fun component18 ()Ljava/util/List; + public final fun component19 ()Z + public final fun component2 ()Ljava/lang/String; + public final fun component20 ()Ljava/util/Map; + public final fun component21 ()Ljava/util/Map; + public final fun component22 ()Lcom/lagradost/cloudstream3/NextAiring; + public final fun component23 ()Ljava/util/List; + public final fun component24 ()Ljava/lang/String; + public final fun component25 ()Ljava/lang/String; + public final fun component26 ()Ljava/lang/String; + public final fun component27 ()Ljava/lang/String; + public final fun component3 ()Ljava/lang/String; + public final fun component4 ()Ljava/lang/String; + public final fun component5 ()Ljava/lang/String; + public final fun component6 ()Lcom/lagradost/cloudstream3/TvType; + public final fun component7 ()Ljava/lang/String; + public final fun component8 ()Ljava/lang/Integer; + public final fun component9 ()Ljava/util/Map; + public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/lagradost/cloudstream3/TvType;Ljava/lang/String;Ljava/lang/Integer;Ljava/util/Map;Lcom/lagradost/cloudstream3/ShowStatus;Ljava/lang/String;Ljava/util/List;Ljava/util/List;Lcom/lagradost/cloudstream3/Score;Ljava/lang/Integer;Ljava/util/List;Ljava/util/List;Ljava/util/List;ZLjava/util/Map;Ljava/util/Map;Lcom/lagradost/cloudstream3/NextAiring;Ljava/util/List;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lcom/lagradost/cloudstream3/AnimeLoadResponse; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/AnimeLoadResponse;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/lagradost/cloudstream3/TvType;Ljava/lang/String;Ljava/lang/Integer;Ljava/util/Map;Lcom/lagradost/cloudstream3/ShowStatus;Ljava/lang/String;Ljava/util/List;Ljava/util/List;Lcom/lagradost/cloudstream3/Score;Ljava/lang/Integer;Ljava/util/List;Ljava/util/List;Ljava/util/List;ZLjava/util/Map;Ljava/util/Map;Lcom/lagradost/cloudstream3/NextAiring;Ljava/util/List;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/AnimeLoadResponse; + public fun equals (Ljava/lang/Object;)Z + public fun getActors ()Ljava/util/List; + public fun getApiName ()Ljava/lang/String; + public fun getBackgroundPosterUrl ()Ljava/lang/String; + public fun getComingSoon ()Z + public fun getContentRating ()Ljava/lang/String; + public fun getDuration ()Ljava/lang/Integer; + public final fun getEngName ()Ljava/lang/String; + public final fun getEpisodes ()Ljava/util/Map; + public final fun getJapName ()Ljava/lang/String; + public fun getLatestEpisodes ()Ljava/util/Map; + public fun getLogoUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getNextAiring ()Lcom/lagradost/cloudstream3/NextAiring; + public fun getPlot ()Ljava/lang/String; + public fun getPosterHeaders ()Ljava/util/Map; + public fun getPosterUrl ()Ljava/lang/String; + public fun getRating ()Ljava/lang/Integer; + public fun getRecommendations ()Ljava/util/List; + public fun getScore ()Lcom/lagradost/cloudstream3/Score; + public fun getSeasonNames ()Ljava/util/List; + public fun getShowStatus ()Lcom/lagradost/cloudstream3/ShowStatus; + public fun getSyncData ()Ljava/util/Map; + public final fun getSynonyms ()Ljava/util/List; + public fun getTags ()Ljava/util/List; + public fun getTotalEpisodeIndex (II)I + public fun getTrailers ()Ljava/util/List; + public fun getType ()Lcom/lagradost/cloudstream3/TvType; + public fun getUniqueUrl ()Ljava/lang/String; + public fun getUrl ()Ljava/lang/String; + public fun getYear ()Ljava/lang/Integer; + public fun hashCode ()I + public fun setActors (Ljava/util/List;)V + public fun setApiName (Ljava/lang/String;)V + public fun setBackgroundPosterUrl (Ljava/lang/String;)V + public fun setComingSoon (Z)V + public fun setContentRating (Ljava/lang/String;)V + public fun setDuration (Ljava/lang/Integer;)V + public final fun setEngName (Ljava/lang/String;)V + public final fun setEpisodes (Ljava/util/Map;)V + public final fun setJapName (Ljava/lang/String;)V + public fun setLogoUrl (Ljava/lang/String;)V + public fun setName (Ljava/lang/String;)V + public fun setNextAiring (Lcom/lagradost/cloudstream3/NextAiring;)V + public fun setPlot (Ljava/lang/String;)V + public fun setPosterHeaders (Ljava/util/Map;)V + public fun setPosterUrl (Ljava/lang/String;)V + public fun setRating (Ljava/lang/Integer;)V + public fun setRecommendations (Ljava/util/List;)V + public fun setScore (Lcom/lagradost/cloudstream3/Score;)V + public fun setSeasonNames (Ljava/util/List;)V + public fun setShowStatus (Lcom/lagradost/cloudstream3/ShowStatus;)V + public fun setSyncData (Ljava/util/Map;)V + public final fun setSynonyms (Ljava/util/List;)V + public fun setTags (Ljava/util/List;)V + public fun setTrailers (Ljava/util/List;)V + public fun setType (Lcom/lagradost/cloudstream3/TvType;)V + public fun setUniqueUrl (Ljava/lang/String;)V + public fun setUrl (Ljava/lang/String;)V + public fun setYear (Ljava/lang/Integer;)V + public fun toString ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/AnimeSearchResponse : com/lagradost/cloudstream3/SearchResponse { + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/lagradost/cloudstream3/TvType;Ljava/lang/String;Ljava/lang/Integer;Ljava/util/Set;Ljava/lang/String;Ljava/util/Map;Ljava/lang/Integer;Lcom/lagradost/cloudstream3/SearchQuality;Ljava/util/Map;Lcom/lagradost/cloudstream3/Score;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/lagradost/cloudstream3/TvType;Ljava/lang/String;Ljava/lang/Integer;Ljava/util/Set;Ljava/lang/String;Ljava/util/Map;Ljava/lang/Integer;Lcom/lagradost/cloudstream3/SearchQuality;Ljava/util/Map;Lcom/lagradost/cloudstream3/Score;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component10 ()Ljava/lang/Integer; + public final fun component11 ()Lcom/lagradost/cloudstream3/SearchQuality; + public final fun component12 ()Ljava/util/Map; + public final fun component13 ()Lcom/lagradost/cloudstream3/Score; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Ljava/lang/String; + public final fun component4 ()Lcom/lagradost/cloudstream3/TvType; + public final fun component5 ()Ljava/lang/String; + public final fun component6 ()Ljava/lang/Integer; + public final fun component7 ()Ljava/util/Set; + public final fun component8 ()Ljava/lang/String; + public final fun component9 ()Ljava/util/Map; + public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/lagradost/cloudstream3/TvType;Ljava/lang/String;Ljava/lang/Integer;Ljava/util/Set;Ljava/lang/String;Ljava/util/Map;Ljava/lang/Integer;Lcom/lagradost/cloudstream3/SearchQuality;Ljava/util/Map;Lcom/lagradost/cloudstream3/Score;)Lcom/lagradost/cloudstream3/AnimeSearchResponse; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/AnimeSearchResponse;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/lagradost/cloudstream3/TvType;Ljava/lang/String;Ljava/lang/Integer;Ljava/util/Set;Ljava/lang/String;Ljava/util/Map;Ljava/lang/Integer;Lcom/lagradost/cloudstream3/SearchQuality;Ljava/util/Map;Lcom/lagradost/cloudstream3/Score;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/AnimeSearchResponse; + public fun equals (Ljava/lang/Object;)Z + public fun getApiName ()Ljava/lang/String; + public final fun getDubStatus ()Ljava/util/Set; + public final fun getEpisodes ()Ljava/util/Map; + public fun getId ()Ljava/lang/Integer; + public fun getName ()Ljava/lang/String; + public final fun getOtherName ()Ljava/lang/String; + public fun getPosterHeaders ()Ljava/util/Map; + public fun getPosterUrl ()Ljava/lang/String; + public fun getQuality ()Lcom/lagradost/cloudstream3/SearchQuality; + public fun getScore ()Lcom/lagradost/cloudstream3/Score; + public fun getType ()Lcom/lagradost/cloudstream3/TvType; + public fun getUrl ()Ljava/lang/String; + public final fun getYear ()Ljava/lang/Integer; + public fun hashCode ()I + public final fun setDubStatus (Ljava/util/Set;)V + public final fun setEpisodes (Ljava/util/Map;)V + public fun setId (Ljava/lang/Integer;)V + public final fun setOtherName (Ljava/lang/String;)V + public fun setPosterHeaders (Ljava/util/Map;)V + public fun setPosterUrl (Ljava/lang/String;)V + public fun setQuality (Lcom/lagradost/cloudstream3/SearchQuality;)V + public fun setScore (Lcom/lagradost/cloudstream3/Score;)V + public fun setType (Lcom/lagradost/cloudstream3/TvType;)V + public final fun setYear (Ljava/lang/Integer;)V + public fun toString ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/AudioFile { + public static final field Companion Lcom/lagradost/cloudstream3/AudioFile$Companion; + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/util/Map; + public fun equals (Ljava/lang/Object;)Z + public final fun getHeaders ()Ljava/util/Map; + public final fun getUrl ()Ljava/lang/String; + public fun hashCode ()I + public final fun setHeaders (Ljava/util/Map;)V + public final fun setUrl (Ljava/lang/String;)V + public fun toString ()Ljava/lang/String; +} + +public final synthetic class com/lagradost/cloudstream3/AudioFile$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lcom/lagradost/cloudstream3/AudioFile$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lcom/lagradost/cloudstream3/AudioFile; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lcom/lagradost/cloudstream3/AudioFile;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class com/lagradost/cloudstream3/AudioFile$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class com/lagradost/cloudstream3/AutoDownloadMode : java/lang/Enum { + public static final field All Lcom/lagradost/cloudstream3/AutoDownloadMode; + public static final field Companion Lcom/lagradost/cloudstream3/AutoDownloadMode$Companion; + public static final field Disable Lcom/lagradost/cloudstream3/AutoDownloadMode; + public static final field FilterByLang Lcom/lagradost/cloudstream3/AutoDownloadMode; + public static final field NsfwOnly Lcom/lagradost/cloudstream3/AutoDownloadMode; + public static fun getEntries ()Lkotlin/enums/EnumEntries; + public final fun getValue ()I + public static fun valueOf (Ljava/lang/String;)Lcom/lagradost/cloudstream3/AutoDownloadMode; + public static fun values ()[Lcom/lagradost/cloudstream3/AutoDownloadMode; +} + +public final class com/lagradost/cloudstream3/AutoDownloadMode$Companion { + public final fun getEnum (I)Lcom/lagradost/cloudstream3/AutoDownloadMode; +} + +public final class com/lagradost/cloudstream3/DubStatus : java/lang/Enum { + public static final field Dubbed Lcom/lagradost/cloudstream3/DubStatus; + public static final field None Lcom/lagradost/cloudstream3/DubStatus; + public static final field Subbed Lcom/lagradost/cloudstream3/DubStatus; + public static fun getEntries ()Lkotlin/enums/EnumEntries; + public final fun getId ()I + public static fun valueOf (Ljava/lang/String;)Lcom/lagradost/cloudstream3/DubStatus; + public static fun values ()[Lcom/lagradost/cloudstream3/DubStatus; +} + +public final class com/lagradost/cloudstream3/Episode { + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/String;Lcom/lagradost/cloudstream3/Score;Ljava/lang/String;Ljava/lang/Long;Ljava/lang/Integer;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/String;Lcom/lagradost/cloudstream3/Score;Ljava/lang/String;Ljava/lang/Long;Ljava/lang/Integer;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Ljava/lang/Integer; + public final fun component4 ()Ljava/lang/Integer; + public final fun component5 ()Ljava/lang/String; + public final fun component6 ()Lcom/lagradost/cloudstream3/Score; + public final fun component7 ()Ljava/lang/String; + public final fun component8 ()Ljava/lang/Long; + public final fun component9 ()Ljava/lang/Integer; + public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/String;Lcom/lagradost/cloudstream3/Score;Ljava/lang/String;Ljava/lang/Long;Ljava/lang/Integer;)Lcom/lagradost/cloudstream3/Episode; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/Episode;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/String;Lcom/lagradost/cloudstream3/Score;Ljava/lang/String;Ljava/lang/Long;Ljava/lang/Integer;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/Episode; + public fun equals (Ljava/lang/Object;)Z + public final fun getData ()Ljava/lang/String; + public final fun getDate ()Ljava/lang/Long; + public final fun getDescription ()Ljava/lang/String; + public final fun getEpisode ()Ljava/lang/Integer; + public final fun getName ()Ljava/lang/String; + public final fun getPosterUrl ()Ljava/lang/String; + public final fun getRating ()Ljava/lang/Integer; + public final fun getRunTime ()Ljava/lang/Integer; + public final fun getScore ()Lcom/lagradost/cloudstream3/Score; + public final fun getSeason ()Ljava/lang/Integer; + public fun hashCode ()I + public final fun setData (Ljava/lang/String;)V + public final fun setDate (Ljava/lang/Long;)V + public final fun setDescription (Ljava/lang/String;)V + public final fun setEpisode (Ljava/lang/Integer;)V + public final fun setName (Ljava/lang/String;)V + public final fun setPosterUrl (Ljava/lang/String;)V + public final fun setRating (Ljava/lang/Integer;)V + public final fun setRunTime (Ljava/lang/Integer;)V + public final fun setScore (Lcom/lagradost/cloudstream3/Score;)V + public final fun setSeason (Ljava/lang/Integer;)V + public fun toString ()Ljava/lang/String; +} + +public abstract interface class com/lagradost/cloudstream3/EpisodeResponse { + public abstract fun getLatestEpisodes ()Ljava/util/Map; + public abstract fun getNextAiring ()Lcom/lagradost/cloudstream3/NextAiring; + public abstract fun getSeasonNames ()Ljava/util/List; + public abstract fun getShowStatus ()Lcom/lagradost/cloudstream3/ShowStatus; + public abstract fun getTotalEpisodeIndex (II)I + public abstract fun setNextAiring (Lcom/lagradost/cloudstream3/NextAiring;)V + public abstract fun setSeasonNames (Ljava/util/List;)V + public abstract fun setShowStatus (Lcom/lagradost/cloudstream3/ShowStatus;)V +} + +public final class com/lagradost/cloudstream3/ErrorLoadingException : java/lang/Exception { + public fun ()V + public fun (Ljava/lang/String;)V + public synthetic fun (Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V +} + +public final class com/lagradost/cloudstream3/HomePageList { + public fun (Ljava/lang/String;Ljava/util/List;Z)V + public synthetic fun (Ljava/lang/String;Ljava/util/List;ZILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/util/List; + public final fun component3 ()Z + public final fun copy (Ljava/lang/String;Ljava/util/List;Z)Lcom/lagradost/cloudstream3/HomePageList; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/HomePageList;Ljava/lang/String;Ljava/util/List;ZILjava/lang/Object;)Lcom/lagradost/cloudstream3/HomePageList; + public fun equals (Ljava/lang/Object;)Z + public final fun getList ()Ljava/util/List; + public final fun getName ()Ljava/lang/String; + public fun hashCode ()I + public final fun isHorizontalImages ()Z + public final fun setList (Ljava/util/List;)V + public fun toString ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/HomePageResponse { + public fun (Ljava/util/List;Z)V + public synthetic fun (Ljava/util/List;ZILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/util/List; + public final fun component2 ()Z + public final fun copy (Ljava/util/List;Z)Lcom/lagradost/cloudstream3/HomePageResponse; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/HomePageResponse;Ljava/util/List;ZILjava/lang/Object;)Lcom/lagradost/cloudstream3/HomePageResponse; + public fun equals (Ljava/lang/Object;)Z + public final fun getHasNext ()Z + public final fun getItems ()Ljava/util/List; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public abstract interface class com/lagradost/cloudstream3/IDownloadableMinimum { + public abstract fun getHeaders ()Ljava/util/Map; + public abstract fun getReferer ()Ljava/lang/String; + public abstract fun getUrl ()Ljava/lang/String; +} + +public abstract interface annotation class com/lagradost/cloudstream3/InternalAPI : java/lang/annotation/Annotation { +} + +public final class com/lagradost/cloudstream3/LiveSearchResponse : com/lagradost/cloudstream3/SearchResponse { + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/lagradost/cloudstream3/TvType;Ljava/lang/String;Ljava/lang/Integer;Lcom/lagradost/cloudstream3/SearchQuality;Ljava/util/Map;Ljava/lang/String;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/lagradost/cloudstream3/TvType;Ljava/lang/String;Ljava/lang/Integer;Lcom/lagradost/cloudstream3/SearchQuality;Ljava/util/Map;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/lagradost/cloudstream3/TvType;Ljava/lang/String;Ljava/lang/Integer;Lcom/lagradost/cloudstream3/SearchQuality;Ljava/util/Map;Ljava/lang/String;Lcom/lagradost/cloudstream3/Score;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/lagradost/cloudstream3/TvType;Ljava/lang/String;Ljava/lang/Integer;Lcom/lagradost/cloudstream3/SearchQuality;Ljava/util/Map;Ljava/lang/String;Lcom/lagradost/cloudstream3/Score;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component10 ()Lcom/lagradost/cloudstream3/Score; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Ljava/lang/String; + public final fun component4 ()Lcom/lagradost/cloudstream3/TvType; + public final fun component5 ()Ljava/lang/String; + public final fun component6 ()Ljava/lang/Integer; + public final fun component7 ()Lcom/lagradost/cloudstream3/SearchQuality; + public final fun component8 ()Ljava/util/Map; + public final fun component9 ()Ljava/lang/String; + public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/lagradost/cloudstream3/TvType;Ljava/lang/String;Ljava/lang/Integer;Lcom/lagradost/cloudstream3/SearchQuality;Ljava/util/Map;Ljava/lang/String;Lcom/lagradost/cloudstream3/Score;)Lcom/lagradost/cloudstream3/LiveSearchResponse; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/LiveSearchResponse;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/lagradost/cloudstream3/TvType;Ljava/lang/String;Ljava/lang/Integer;Lcom/lagradost/cloudstream3/SearchQuality;Ljava/util/Map;Ljava/lang/String;Lcom/lagradost/cloudstream3/Score;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/LiveSearchResponse; + public fun equals (Ljava/lang/Object;)Z + public fun getApiName ()Ljava/lang/String; + public fun getId ()Ljava/lang/Integer; + public final fun getLang ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getPosterHeaders ()Ljava/util/Map; + public fun getPosterUrl ()Ljava/lang/String; + public fun getQuality ()Lcom/lagradost/cloudstream3/SearchQuality; + public fun getScore ()Lcom/lagradost/cloudstream3/Score; + public fun getType ()Lcom/lagradost/cloudstream3/TvType; + public fun getUrl ()Ljava/lang/String; + public fun hashCode ()I + public fun setId (Ljava/lang/Integer;)V + public final fun setLang (Ljava/lang/String;)V + public fun setPosterHeaders (Ljava/util/Map;)V + public fun setPosterUrl (Ljava/lang/String;)V + public fun setQuality (Lcom/lagradost/cloudstream3/SearchQuality;)V + public fun setScore (Lcom/lagradost/cloudstream3/Score;)V + public fun setType (Lcom/lagradost/cloudstream3/TvType;)V + public fun toString ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/LiveStreamLoadResponse : com/lagradost/cloudstream3/LoadResponse { + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;Lcom/lagradost/cloudstream3/TvType;Lcom/lagradost/cloudstream3/Score;Ljava/util/List;Ljava/lang/Integer;Ljava/util/List;Ljava/util/List;Ljava/util/List;ZLjava/util/Map;Ljava/util/Map;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;Lcom/lagradost/cloudstream3/TvType;Lcom/lagradost/cloudstream3/Score;Ljava/util/List;Ljava/lang/Integer;Ljava/util/List;Ljava/util/List;Ljava/util/List;ZLjava/util/Map;Ljava/util/Map;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component10 ()Ljava/util/List; + public final fun component11 ()Ljava/lang/Integer; + public final fun component12 ()Ljava/util/List; + public final fun component13 ()Ljava/util/List; + public final fun component14 ()Ljava/util/List; + public final fun component15 ()Z + public final fun component16 ()Ljava/util/Map; + public final fun component17 ()Ljava/util/Map; + public final fun component18 ()Ljava/lang/String; + public final fun component19 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun component20 ()Ljava/lang/String; + public final fun component21 ()Ljava/lang/String; + public final fun component3 ()Ljava/lang/String; + public final fun component4 ()Ljava/lang/String; + public final fun component5 ()Ljava/lang/String; + public final fun component6 ()Ljava/lang/Integer; + public final fun component7 ()Ljava/lang/String; + public final fun component8 ()Lcom/lagradost/cloudstream3/TvType; + public final fun component9 ()Lcom/lagradost/cloudstream3/Score; + public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;Lcom/lagradost/cloudstream3/TvType;Lcom/lagradost/cloudstream3/Score;Ljava/util/List;Ljava/lang/Integer;Ljava/util/List;Ljava/util/List;Ljava/util/List;ZLjava/util/Map;Ljava/util/Map;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lcom/lagradost/cloudstream3/LiveStreamLoadResponse; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/LiveStreamLoadResponse;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;Lcom/lagradost/cloudstream3/TvType;Lcom/lagradost/cloudstream3/Score;Ljava/util/List;Ljava/lang/Integer;Ljava/util/List;Ljava/util/List;Ljava/util/List;ZLjava/util/Map;Ljava/util/Map;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/LiveStreamLoadResponse; + public fun equals (Ljava/lang/Object;)Z + public fun getActors ()Ljava/util/List; + public fun getApiName ()Ljava/lang/String; + public fun getBackgroundPosterUrl ()Ljava/lang/String; + public fun getComingSoon ()Z + public fun getContentRating ()Ljava/lang/String; + public final fun getDataUrl ()Ljava/lang/String; + public fun getDuration ()Ljava/lang/Integer; + public fun getLogoUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getPlot ()Ljava/lang/String; + public fun getPosterHeaders ()Ljava/util/Map; + public fun getPosterUrl ()Ljava/lang/String; + public fun getRating ()Ljava/lang/Integer; + public fun getRecommendations ()Ljava/util/List; + public fun getScore ()Lcom/lagradost/cloudstream3/Score; + public fun getSyncData ()Ljava/util/Map; + public fun getTags ()Ljava/util/List; + public fun getTrailers ()Ljava/util/List; + public fun getType ()Lcom/lagradost/cloudstream3/TvType; + public fun getUniqueUrl ()Ljava/lang/String; + public fun getUrl ()Ljava/lang/String; + public fun getYear ()Ljava/lang/Integer; + public fun hashCode ()I + public fun setActors (Ljava/util/List;)V + public fun setApiName (Ljava/lang/String;)V + public fun setBackgroundPosterUrl (Ljava/lang/String;)V + public fun setComingSoon (Z)V + public fun setContentRating (Ljava/lang/String;)V + public final fun setDataUrl (Ljava/lang/String;)V + public fun setDuration (Ljava/lang/Integer;)V + public fun setLogoUrl (Ljava/lang/String;)V + public fun setName (Ljava/lang/String;)V + public fun setPlot (Ljava/lang/String;)V + public fun setPosterHeaders (Ljava/util/Map;)V + public fun setPosterUrl (Ljava/lang/String;)V + public fun setRating (Ljava/lang/Integer;)V + public fun setRecommendations (Ljava/util/List;)V + public fun setScore (Lcom/lagradost/cloudstream3/Score;)V + public fun setSyncData (Ljava/util/Map;)V + public fun setTags (Ljava/util/List;)V + public fun setTrailers (Ljava/util/List;)V + public fun setType (Lcom/lagradost/cloudstream3/TvType;)V + public fun setUniqueUrl (Ljava/lang/String;)V + public fun setUrl (Ljava/lang/String;)V + public fun setYear (Ljava/lang/Integer;)V + public fun toString ()Ljava/lang/String; +} + +public abstract interface class com/lagradost/cloudstream3/LoadResponse { + public static final field Companion Lcom/lagradost/cloudstream3/LoadResponse$Companion; + public abstract fun getActors ()Ljava/util/List; + public abstract fun getApiName ()Ljava/lang/String; + public abstract fun getBackgroundPosterUrl ()Ljava/lang/String; + public abstract fun getComingSoon ()Z + public abstract fun getContentRating ()Ljava/lang/String; + public abstract fun getDuration ()Ljava/lang/Integer; + public abstract fun getLogoUrl ()Ljava/lang/String; + public abstract fun getName ()Ljava/lang/String; + public abstract fun getPlot ()Ljava/lang/String; + public abstract fun getPosterHeaders ()Ljava/util/Map; + public abstract fun getPosterUrl ()Ljava/lang/String; + public fun getRating ()Ljava/lang/Integer; + public abstract fun getRecommendations ()Ljava/util/List; + public abstract fun getScore ()Lcom/lagradost/cloudstream3/Score; + public abstract fun getSyncData ()Ljava/util/Map; + public abstract fun getTags ()Ljava/util/List; + public abstract fun getTrailers ()Ljava/util/List; + public abstract fun getType ()Lcom/lagradost/cloudstream3/TvType; + public abstract fun getUniqueUrl ()Ljava/lang/String; + public abstract fun getUrl ()Ljava/lang/String; + public abstract fun getYear ()Ljava/lang/Integer; + public abstract fun setActors (Ljava/util/List;)V + public abstract fun setApiName (Ljava/lang/String;)V + public abstract fun setBackgroundPosterUrl (Ljava/lang/String;)V + public abstract fun setComingSoon (Z)V + public abstract fun setContentRating (Ljava/lang/String;)V + public abstract fun setDuration (Ljava/lang/Integer;)V + public abstract fun setLogoUrl (Ljava/lang/String;)V + public abstract fun setName (Ljava/lang/String;)V + public abstract fun setPlot (Ljava/lang/String;)V + public abstract fun setPosterHeaders (Ljava/util/Map;)V + public abstract fun setPosterUrl (Ljava/lang/String;)V + public fun setRating (Ljava/lang/Integer;)V + public abstract fun setRecommendations (Ljava/util/List;)V + public abstract fun setScore (Lcom/lagradost/cloudstream3/Score;)V + public abstract fun setSyncData (Ljava/util/Map;)V + public abstract fun setTags (Ljava/util/List;)V + public abstract fun setTrailers (Ljava/util/List;)V + public abstract fun setType (Lcom/lagradost/cloudstream3/TvType;)V + public abstract fun setUniqueUrl (Ljava/lang/String;)V + public abstract fun setUrl (Ljava/lang/String;)V + public abstract fun setYear (Ljava/lang/Integer;)V +} + +public final class com/lagradost/cloudstream3/LoadResponse$Companion { + public final fun addActorNames (Lcom/lagradost/cloudstream3/LoadResponse;Ljava/util/List;)V + public final fun addActors (Lcom/lagradost/cloudstream3/LoadResponse;Ljava/util/List;)V + public final fun addActorsOnly (Lcom/lagradost/cloudstream3/LoadResponse;Ljava/util/List;)V + public final fun addActorsRole (Lcom/lagradost/cloudstream3/LoadResponse;Ljava/util/List;)V + public final fun addAniListId (Lcom/lagradost/cloudstream3/LoadResponse;Ljava/lang/Integer;)V + public final fun addDuration (Lcom/lagradost/cloudstream3/LoadResponse;Ljava/lang/String;)V + public final fun addIdToString (Ljava/lang/String;Lcom/lagradost/cloudstream3/SimklSyncServices;Ljava/lang/String;)Ljava/lang/String; + public final fun addImdbId (Lcom/lagradost/cloudstream3/LoadResponse;Ljava/lang/String;)V + public final fun addImdbUrl (Lcom/lagradost/cloudstream3/LoadResponse;Ljava/lang/String;)V + public final fun addKitsuId (Lcom/lagradost/cloudstream3/LoadResponse;Ljava/lang/Integer;)V + public final fun addKitsuId (Lcom/lagradost/cloudstream3/LoadResponse;Ljava/lang/String;)V + public final fun addMalId (Lcom/lagradost/cloudstream3/LoadResponse;Ljava/lang/Integer;)V + public final fun addRating (Lcom/lagradost/cloudstream3/LoadResponse;Ljava/lang/Integer;)V + public final fun addRating (Lcom/lagradost/cloudstream3/LoadResponse;Ljava/lang/String;)V + public final fun addScore (Lcom/lagradost/cloudstream3/LoadResponse;Lcom/lagradost/cloudstream3/Score;)V + public final fun addScore (Lcom/lagradost/cloudstream3/LoadResponse;Ljava/lang/String;I)V + public static synthetic fun addScore$default (Lcom/lagradost/cloudstream3/LoadResponse$Companion;Lcom/lagradost/cloudstream3/LoadResponse;Ljava/lang/String;IILjava/lang/Object;)V + public final fun addSimklId (Lcom/lagradost/cloudstream3/LoadResponse;Ljava/lang/Integer;)V + public final fun addTMDbId (Lcom/lagradost/cloudstream3/LoadResponse;Ljava/lang/String;)V + public final fun addTrailer (Lcom/lagradost/cloudstream3/LoadResponse;Ljava/lang/String;Ljava/lang/String;ZLjava/util/Map;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public final fun addTrailer (Lcom/lagradost/cloudstream3/LoadResponse;Ljava/lang/String;Ljava/lang/String;ZLkotlin/coroutines/Continuation;)Ljava/lang/Object; + public final fun addTrailer (Lcom/lagradost/cloudstream3/LoadResponse;Ljava/util/List;Ljava/lang/String;ZLkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static synthetic fun addTrailer$default (Lcom/lagradost/cloudstream3/LoadResponse$Companion;Lcom/lagradost/cloudstream3/LoadResponse;Ljava/lang/String;Ljava/lang/String;ZLjava/util/Map;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; + public static synthetic fun addTrailer$default (Lcom/lagradost/cloudstream3/LoadResponse$Companion;Lcom/lagradost/cloudstream3/LoadResponse;Ljava/lang/String;Ljava/lang/String;ZLkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; + public static synthetic fun addTrailer$default (Lcom/lagradost/cloudstream3/LoadResponse$Companion;Lcom/lagradost/cloudstream3/LoadResponse;Ljava/util/List;Ljava/lang/String;ZLkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; + public final fun addTraktId (Lcom/lagradost/cloudstream3/LoadResponse;Ljava/lang/String;)V + public final fun getAniListId (Lcom/lagradost/cloudstream3/LoadResponse;)Ljava/lang/String; + public final fun getAniListIdPrefix ()Ljava/lang/String; + public final fun getImdbId (Lcom/lagradost/cloudstream3/LoadResponse;)Ljava/lang/String; + public final fun getKitsuId (Lcom/lagradost/cloudstream3/LoadResponse;)Ljava/lang/String; + public final fun getKitsuIdPrefix ()Ljava/lang/String; + public final fun getMalId (Lcom/lagradost/cloudstream3/LoadResponse;)Ljava/lang/String; + public final fun getMalIdPrefix ()Ljava/lang/String; + public final fun getSimklIdPrefix ()Ljava/lang/String; + public final fun getTMDbId (Lcom/lagradost/cloudstream3/LoadResponse;)Ljava/lang/String; + public final fun isMovie (Lcom/lagradost/cloudstream3/LoadResponse;)Z + public final fun isTrailersEnabled ()Z + public final fun readIdFromString (Ljava/lang/String;)Ljava/util/Map; + public final fun setAniListIdPrefix (Ljava/lang/String;)V + public final fun setKitsuIdPrefix (Ljava/lang/String;)V + public final fun setMalIdPrefix (Ljava/lang/String;)V + public final fun setSimklIdPrefix (Ljava/lang/String;)V + public final fun setTrailersEnabled (Z)V +} + +public final class com/lagradost/cloudstream3/LoadResponse$DefaultImpls { + public static fun getRating (Lcom/lagradost/cloudstream3/LoadResponse;)Ljava/lang/Integer; + public static fun setRating (Lcom/lagradost/cloudstream3/LoadResponse;Ljava/lang/Integer;)V +} + +public abstract class com/lagradost/cloudstream3/MainAPI { + public static final field Companion Lcom/lagradost/cloudstream3/MainAPI$Companion; + public fun ()V + public fun extractorVerifierJob (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public fun getCanBeOverridden ()Z + public fun getGetMainPageTimeoutMs ()Ljava/lang/Long; + public fun getHasChromecastSupport ()Z + public fun getHasDownloadSupport ()Z + public fun getHasMainPage ()Z + public fun getHasQuickSearch ()Z + public fun getInstantLinkLoading ()Z + public fun getLang ()Ljava/lang/String; + public final fun getLastHomepageRequest ()J + public fun getLoadLinksTimeoutMs ()Ljava/lang/Long; + public fun getLoadTimeoutMs ()Ljava/lang/Long; + public fun getLoadUrl (Lcom/lagradost/cloudstream3/syncproviders/SyncIdName;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public fun getMainPage ()Ljava/util/List; + public fun getMainPage (ILcom/lagradost/cloudstream3/MainPageRequest;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getProviderType ()Lcom/lagradost/cloudstream3/ProviderType; + public fun getQuickSearchTimeoutMs ()Ljava/lang/Long; + public fun getSearchTimeoutMs ()Ljava/lang/Long; + public fun getSequentialMainPage ()Z + public fun getSequentialMainPageDelay ()J + public fun getSequentialMainPageScrollDelay ()J + public final fun getSourcePlugin ()Ljava/lang/String; + public fun getStoredCredentials ()Ljava/lang/String; + public fun getSupportedSyncNames ()Ljava/util/Set; + public fun getSupportedTypes ()Ljava/util/Set; + public fun getUsesWebView ()Z + public fun getVideoInterceptor (Lcom/lagradost/cloudstream3/utils/ExtractorLink;)Lokhttp3/Interceptor; + public fun getVpnStatus ()Lcom/lagradost/cloudstream3/VPNStatus; + public final fun init ()V + public fun load (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public fun loadLinks (Ljava/lang/String;ZLkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public final fun overrideWithNewData (Lcom/lagradost/cloudstream3/ProvidersInfoJson;)V + public fun quickSearch (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public fun search (Ljava/lang/String;ILkotlin/coroutines/Continuation;)Ljava/lang/Object; + public fun search (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public fun setCanBeOverridden (Z)V + public fun setLang (Ljava/lang/String;)V + public final fun setLastHomepageRequest (J)V + public fun setMainUrl (Ljava/lang/String;)V + public fun setName (Ljava/lang/String;)V + public fun setSequentialMainPage (Z)V + public fun setSequentialMainPageDelay (J)V + public fun setSequentialMainPageScrollDelay (J)V + public final fun setSourcePlugin (Ljava/lang/String;)V + public fun setStoredCredentials (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/MainAPI$Companion { + public final fun getOverrideData ()Ljava/util/HashMap; + public final fun getSettingsForProvider ()Lcom/lagradost/cloudstream3/SettingsJson; + public final fun setOverrideData (Ljava/util/HashMap;)V + public final fun setSettingsForProvider (Lcom/lagradost/cloudstream3/SettingsJson;)V +} + +public final class com/lagradost/cloudstream3/MainAPIKt { + public static final field AllLanguagesName Ljava/lang/String; + public static final field PROVIDER_STATUS_BETA_ONLY I + public static final field PROVIDER_STATUS_DOWN I + public static final field PROVIDER_STATUS_KEY Ljava/lang/String; + public static final field PROVIDER_STATUS_OK I + public static final field PROVIDER_STATUS_SLOW I + public static final field USER_AGENT Ljava/lang/String; + public static final fun addDate (Lcom/lagradost/cloudstream3/Episode;Ljava/lang/String;Ljava/lang/String;)V + public static final fun addDate (Lcom/lagradost/cloudstream3/Episode;Ljava/util/Date;)V + public static final fun addDate (Lcom/lagradost/cloudstream3/Episode;Lkotlin/time/Instant;)V + public static final fun addDate (Lcom/lagradost/cloudstream3/Episode;Lkotlinx/datetime/LocalDate;)V + public static synthetic fun addDate$default (Lcom/lagradost/cloudstream3/Episode;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)V + public static final fun addDub (Lcom/lagradost/cloudstream3/AnimeSearchResponse;Ljava/lang/Integer;)V + public static final fun addDubStatus (Lcom/lagradost/cloudstream3/AnimeSearchResponse;Lcom/lagradost/cloudstream3/DubStatus;Ljava/lang/Integer;)V + public static final fun addDubStatus (Lcom/lagradost/cloudstream3/AnimeSearchResponse;Ljava/lang/String;Ljava/lang/Integer;)V + public static final fun addDubStatus (Lcom/lagradost/cloudstream3/AnimeSearchResponse;ZLjava/lang/Integer;)V + public static final fun addDubStatus (Lcom/lagradost/cloudstream3/AnimeSearchResponse;ZZLjava/lang/Integer;Ljava/lang/Integer;)V + public static synthetic fun addDubStatus$default (Lcom/lagradost/cloudstream3/AnimeSearchResponse;Lcom/lagradost/cloudstream3/DubStatus;Ljava/lang/Integer;ILjava/lang/Object;)V + public static synthetic fun addDubStatus$default (Lcom/lagradost/cloudstream3/AnimeSearchResponse;Ljava/lang/String;Ljava/lang/Integer;ILjava/lang/Object;)V + public static synthetic fun addDubStatus$default (Lcom/lagradost/cloudstream3/AnimeSearchResponse;ZLjava/lang/Integer;ILjava/lang/Object;)V + public static synthetic fun addDubStatus$default (Lcom/lagradost/cloudstream3/AnimeSearchResponse;ZZLjava/lang/Integer;Ljava/lang/Integer;ILjava/lang/Object;)V + public static final fun addEpisodes (Lcom/lagradost/cloudstream3/AnimeLoadResponse;Lcom/lagradost/cloudstream3/DubStatus;Ljava/util/List;)V + public static final fun addPoster (Lcom/lagradost/cloudstream3/LoadResponse;Ljava/lang/String;Ljava/util/Map;)V + public static final fun addPoster (Lcom/lagradost/cloudstream3/SearchResponse;Ljava/lang/String;Ljava/util/Map;)V + public static synthetic fun addPoster$default (Lcom/lagradost/cloudstream3/LoadResponse;Ljava/lang/String;Ljava/util/Map;ILjava/lang/Object;)V + public static synthetic fun addPoster$default (Lcom/lagradost/cloudstream3/SearchResponse;Ljava/lang/String;Ljava/util/Map;ILjava/lang/Object;)V + public static final fun addQuality (Lcom/lagradost/cloudstream3/SearchResponse;Ljava/lang/String;)V + public static final fun addSeasonNamesSeasonData (Lcom/lagradost/cloudstream3/EpisodeResponse;Ljava/util/List;)V + public static final fun addSeasonNamesString (Lcom/lagradost/cloudstream3/EpisodeResponse;Ljava/util/List;)V + public static final fun addSub (Lcom/lagradost/cloudstream3/AnimeSearchResponse;Ljava/lang/Integer;)V + public static final fun base64Decode (Ljava/lang/String;)Ljava/lang/String; + public static final fun base64DecodeArray (Ljava/lang/String;)[B + public static final fun base64Encode ([B)Ljava/lang/String; + public static final fun capitalizeString (Ljava/lang/String;)Ljava/lang/String; + public static final fun capitalizeStringNullable (Ljava/lang/String;)Ljava/lang/String; + public static final fun fetchUrls (Ljava/lang/String;)Ljava/util/List; + public static final fun fixTitle (Ljava/lang/String;)Ljava/lang/String; + public static final fun fixUrl (Lcom/lagradost/cloudstream3/MainAPI;Ljava/lang/String;)Ljava/lang/String; + public static final fun fixUrlNull (Lcom/lagradost/cloudstream3/MainAPI;Ljava/lang/String;)Ljava/lang/String; + public static final fun getDurationFromString (Ljava/lang/String;)Ljava/lang/Integer; + public static final fun getFolderPrefix (Lcom/lagradost/cloudstream3/TvType;)Ljava/lang/String; + public static final fun getJson ()Lkotlinx/serialization/json/Json; + public static final fun getMapper ()Lcom/fasterxml/jackson/databind/json/JsonMapper; + public static final fun getQualityFromString (Ljava/lang/String;)Lcom/lagradost/cloudstream3/SearchQuality; + public static final fun getRhinoContext (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static final fun imdbUrlToId (Ljava/lang/String;)Ljava/lang/String; + public static final fun imdbUrlToIdNullable (Ljava/lang/String;)Ljava/lang/String; + public static final fun isAnimeBased (Lcom/lagradost/cloudstream3/LoadResponse;)Z + public static final fun isAnimeOp (Lcom/lagradost/cloudstream3/TvType;)Z + public static final fun isAudioType (Lcom/lagradost/cloudstream3/TvType;)Z + public static final fun isEpisodeBased (Lcom/lagradost/cloudstream3/LoadResponse;)Z + public static final fun isEpisodeBased (Lcom/lagradost/cloudstream3/TvType;)Z + public static final fun isLiveStream (Lcom/lagradost/cloudstream3/TvType;)Z + public static final fun isMovieType (Lcom/lagradost/cloudstream3/TvType;)Z + public static final fun isUpcoming (Ljava/lang/String;)Z + public static final fun mainPage (Ljava/lang/String;Ljava/lang/String;Z)Lcom/lagradost/cloudstream3/MainPageData; + public static synthetic fun mainPage$default (Ljava/lang/String;Ljava/lang/String;ZILjava/lang/Object;)Lcom/lagradost/cloudstream3/MainPageData; + public static final fun mainPageOf ([Lcom/lagradost/cloudstream3/MainPageData;)Ljava/util/List; + public static final fun mainPageOf ([Lkotlin/Pair;)Ljava/util/List; + public static final fun newAnimeLoadResponse (Lcom/lagradost/cloudstream3/MainAPI;Ljava/lang/String;Ljava/lang/String;Lcom/lagradost/cloudstream3/TvType;ZLkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static synthetic fun newAnimeLoadResponse$default (Lcom/lagradost/cloudstream3/MainAPI;Ljava/lang/String;Ljava/lang/String;Lcom/lagradost/cloudstream3/TvType;ZLkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; + public static final fun newAnimeSearchResponse (Lcom/lagradost/cloudstream3/MainAPI;Ljava/lang/String;Ljava/lang/String;Lcom/lagradost/cloudstream3/TvType;ZLkotlin/jvm/functions/Function1;)Lcom/lagradost/cloudstream3/AnimeSearchResponse; + public static synthetic fun newAnimeSearchResponse$default (Lcom/lagradost/cloudstream3/MainAPI;Ljava/lang/String;Ljava/lang/String;Lcom/lagradost/cloudstream3/TvType;ZLkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/AnimeSearchResponse; + public static final fun newAudioFile (Ljava/lang/String;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static synthetic fun newAudioFile$default (Ljava/lang/String;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; + public static final fun newEpisode (Lcom/lagradost/cloudstream3/MainAPI;Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)Lcom/lagradost/cloudstream3/Episode; + public static final fun newEpisode (Lcom/lagradost/cloudstream3/MainAPI;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Z)Lcom/lagradost/cloudstream3/Episode; + public static synthetic fun newEpisode$default (Lcom/lagradost/cloudstream3/MainAPI;Ljava/lang/Object;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/Episode; + public static synthetic fun newEpisode$default (Lcom/lagradost/cloudstream3/MainAPI;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ZILjava/lang/Object;)Lcom/lagradost/cloudstream3/Episode; + public static final fun newHomePageResponse (Lcom/lagradost/cloudstream3/HomePageList;Ljava/lang/Boolean;)Lcom/lagradost/cloudstream3/HomePageResponse; + public static final fun newHomePageResponse (Lcom/lagradost/cloudstream3/MainPageRequest;Ljava/util/List;Ljava/lang/Boolean;)Lcom/lagradost/cloudstream3/HomePageResponse; + public static final fun newHomePageResponse (Ljava/lang/String;Ljava/util/List;Ljava/lang/Boolean;)Lcom/lagradost/cloudstream3/HomePageResponse; + public static final fun newHomePageResponse (Ljava/util/List;Ljava/lang/Boolean;)Lcom/lagradost/cloudstream3/HomePageResponse; + public static synthetic fun newHomePageResponse$default (Lcom/lagradost/cloudstream3/HomePageList;Ljava/lang/Boolean;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/HomePageResponse; + public static synthetic fun newHomePageResponse$default (Lcom/lagradost/cloudstream3/MainPageRequest;Ljava/util/List;Ljava/lang/Boolean;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/HomePageResponse; + public static synthetic fun newHomePageResponse$default (Ljava/lang/String;Ljava/util/List;Ljava/lang/Boolean;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/HomePageResponse; + public static synthetic fun newHomePageResponse$default (Ljava/util/List;Ljava/lang/Boolean;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/HomePageResponse; + public static final fun newLiveSearchResponse (Lcom/lagradost/cloudstream3/MainAPI;Ljava/lang/String;Ljava/lang/String;Lcom/lagradost/cloudstream3/TvType;ZLkotlin/jvm/functions/Function1;)Lcom/lagradost/cloudstream3/LiveSearchResponse; + public static synthetic fun newLiveSearchResponse$default (Lcom/lagradost/cloudstream3/MainAPI;Ljava/lang/String;Ljava/lang/String;Lcom/lagradost/cloudstream3/TvType;ZLkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/LiveSearchResponse; + public static final fun newLiveStreamLoadResponse (Lcom/lagradost/cloudstream3/MainAPI;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static synthetic fun newLiveStreamLoadResponse$default (Lcom/lagradost/cloudstream3/MainAPI;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; + public static final fun newMovieLoadResponse (Lcom/lagradost/cloudstream3/MainAPI;Ljava/lang/String;Ljava/lang/String;Lcom/lagradost/cloudstream3/TvType;Ljava/lang/Object;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static final fun newMovieLoadResponse (Lcom/lagradost/cloudstream3/MainAPI;Ljava/lang/String;Ljava/lang/String;Lcom/lagradost/cloudstream3/TvType;Ljava/lang/String;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static synthetic fun newMovieLoadResponse$default (Lcom/lagradost/cloudstream3/MainAPI;Ljava/lang/String;Ljava/lang/String;Lcom/lagradost/cloudstream3/TvType;Ljava/lang/Object;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; + public static synthetic fun newMovieLoadResponse$default (Lcom/lagradost/cloudstream3/MainAPI;Ljava/lang/String;Ljava/lang/String;Lcom/lagradost/cloudstream3/TvType;Ljava/lang/String;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; + public static final fun newMovieSearchResponse (Lcom/lagradost/cloudstream3/MainAPI;Ljava/lang/String;Ljava/lang/String;Lcom/lagradost/cloudstream3/TvType;ZLkotlin/jvm/functions/Function1;)Lcom/lagradost/cloudstream3/MovieSearchResponse; + public static synthetic fun newMovieSearchResponse$default (Lcom/lagradost/cloudstream3/MainAPI;Ljava/lang/String;Ljava/lang/String;Lcom/lagradost/cloudstream3/TvType;ZLkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/MovieSearchResponse; + public static final fun newSearchResponseList (Ljava/util/List;Ljava/lang/Boolean;)Lcom/lagradost/cloudstream3/SearchResponseList; + public static synthetic fun newSearchResponseList$default (Ljava/util/List;Ljava/lang/Boolean;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/SearchResponseList; + public static final fun newSubtitleFile (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static synthetic fun newSubtitleFile$default (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; + public static final fun newTorrentLoadResponse (Lcom/lagradost/cloudstream3/MainAPI;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static synthetic fun newTorrentLoadResponse$default (Lcom/lagradost/cloudstream3/MainAPI;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; + public static final fun newTorrentSearchResponse (Lcom/lagradost/cloudstream3/MainAPI;Ljava/lang/String;Ljava/lang/String;Lcom/lagradost/cloudstream3/TvType;ZLkotlin/jvm/functions/Function1;)Lcom/lagradost/cloudstream3/TorrentSearchResponse; + public static synthetic fun newTorrentSearchResponse$default (Lcom/lagradost/cloudstream3/MainAPI;Ljava/lang/String;Ljava/lang/String;Lcom/lagradost/cloudstream3/TvType;ZLkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/TorrentSearchResponse; + public static final fun newTvSeriesLoadResponse (Lcom/lagradost/cloudstream3/MainAPI;Ljava/lang/String;Ljava/lang/String;Lcom/lagradost/cloudstream3/TvType;Ljava/util/List;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static synthetic fun newTvSeriesLoadResponse$default (Lcom/lagradost/cloudstream3/MainAPI;Ljava/lang/String;Ljava/lang/String;Lcom/lagradost/cloudstream3/TvType;Ljava/util/List;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; + public static final fun newTvSeriesSearchResponse (Lcom/lagradost/cloudstream3/MainAPI;Ljava/lang/String;Ljava/lang/String;Lcom/lagradost/cloudstream3/TvType;ZLkotlin/jvm/functions/Function1;)Lcom/lagradost/cloudstream3/TvSeriesSearchResponse; + public static synthetic fun newTvSeriesSearchResponse$default (Lcom/lagradost/cloudstream3/MainAPI;Ljava/lang/String;Ljava/lang/String;Lcom/lagradost/cloudstream3/TvType;ZLkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/TvSeriesSearchResponse; + public static final fun sortUrls (Ljava/util/Set;)Ljava/util/List; + public static final fun toNewSearchResponseList (Ljava/util/List;Ljava/lang/Boolean;)Lcom/lagradost/cloudstream3/SearchResponseList; + public static synthetic fun toNewSearchResponseList$default (Ljava/util/List;Ljava/lang/Boolean;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/SearchResponseList; + public static final fun toRatingInt (Ljava/lang/String;)Ljava/lang/Integer; + public static final fun updateUrl (Lcom/lagradost/cloudstream3/MainAPI;Ljava/lang/String;)Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/MainActivityKt { + public static final fun getApp ()Lcom/lagradost/nicehttp/Requests; + public static final fun getInsecureApp ()Lcom/lagradost/nicehttp/Requests; + public static final fun setApp (Lcom/lagradost/nicehttp/Requests;)V + public static final fun setInsecureApp (Lcom/lagradost/nicehttp/Requests;)V +} + +public final class com/lagradost/cloudstream3/MainPageData { + public fun (Ljava/lang/String;Ljava/lang/String;Z)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;ZILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Z + public final fun copy (Ljava/lang/String;Ljava/lang/String;Z)Lcom/lagradost/cloudstream3/MainPageData; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/MainPageData;Ljava/lang/String;Ljava/lang/String;ZILjava/lang/Object;)Lcom/lagradost/cloudstream3/MainPageData; + public fun equals (Ljava/lang/Object;)Z + public final fun getData ()Ljava/lang/String; + public final fun getHorizontalImages ()Z + public final fun getName ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/MainPageRequest { + public fun (Ljava/lang/String;Ljava/lang/String;Z)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Z + public final fun copy (Ljava/lang/String;Ljava/lang/String;Z)Lcom/lagradost/cloudstream3/MainPageRequest; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/MainPageRequest;Ljava/lang/String;Ljava/lang/String;ZILjava/lang/Object;)Lcom/lagradost/cloudstream3/MainPageRequest; + public fun equals (Ljava/lang/Object;)Z + public final fun getData ()Ljava/lang/String; + public final fun getHorizontalImages ()Z + public final fun getName ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/MovieLoadResponse : com/lagradost/cloudstream3/LoadResponse { + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/lagradost/cloudstream3/TvType;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;Lcom/lagradost/cloudstream3/Score;Ljava/util/List;Ljava/lang/Integer;Ljava/util/List;Ljava/util/List;Ljava/util/List;ZLjava/util/Map;Ljava/util/Map;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/lagradost/cloudstream3/TvType;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;Lcom/lagradost/cloudstream3/Score;Ljava/util/List;Ljava/lang/Integer;Ljava/util/List;Ljava/util/List;Ljava/util/List;ZLjava/util/Map;Ljava/util/Map;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component10 ()Ljava/util/List; + public final fun component11 ()Ljava/lang/Integer; + public final fun component12 ()Ljava/util/List; + public final fun component13 ()Ljava/util/List; + public final fun component14 ()Ljava/util/List; + public final fun component15 ()Z + public final fun component16 ()Ljava/util/Map; + public final fun component17 ()Ljava/util/Map; + public final fun component18 ()Ljava/lang/String; + public final fun component19 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun component20 ()Ljava/lang/String; + public final fun component21 ()Ljava/lang/String; + public final fun component3 ()Ljava/lang/String; + public final fun component4 ()Lcom/lagradost/cloudstream3/TvType; + public final fun component5 ()Ljava/lang/String; + public final fun component6 ()Ljava/lang/String; + public final fun component7 ()Ljava/lang/Integer; + public final fun component8 ()Ljava/lang/String; + public final fun component9 ()Lcom/lagradost/cloudstream3/Score; + public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/lagradost/cloudstream3/TvType;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;Lcom/lagradost/cloudstream3/Score;Ljava/util/List;Ljava/lang/Integer;Ljava/util/List;Ljava/util/List;Ljava/util/List;ZLjava/util/Map;Ljava/util/Map;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lcom/lagradost/cloudstream3/MovieLoadResponse; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/MovieLoadResponse;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/lagradost/cloudstream3/TvType;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;Lcom/lagradost/cloudstream3/Score;Ljava/util/List;Ljava/lang/Integer;Ljava/util/List;Ljava/util/List;Ljava/util/List;ZLjava/util/Map;Ljava/util/Map;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/MovieLoadResponse; + public fun equals (Ljava/lang/Object;)Z + public fun getActors ()Ljava/util/List; + public fun getApiName ()Ljava/lang/String; + public fun getBackgroundPosterUrl ()Ljava/lang/String; + public fun getComingSoon ()Z + public fun getContentRating ()Ljava/lang/String; + public final fun getDataUrl ()Ljava/lang/String; + public fun getDuration ()Ljava/lang/Integer; + public fun getLogoUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getPlot ()Ljava/lang/String; + public fun getPosterHeaders ()Ljava/util/Map; + public fun getPosterUrl ()Ljava/lang/String; + public fun getRating ()Ljava/lang/Integer; + public fun getRecommendations ()Ljava/util/List; + public fun getScore ()Lcom/lagradost/cloudstream3/Score; + public fun getSyncData ()Ljava/util/Map; + public fun getTags ()Ljava/util/List; + public fun getTrailers ()Ljava/util/List; + public fun getType ()Lcom/lagradost/cloudstream3/TvType; + public fun getUniqueUrl ()Ljava/lang/String; + public fun getUrl ()Ljava/lang/String; + public fun getYear ()Ljava/lang/Integer; + public fun hashCode ()I + public fun setActors (Ljava/util/List;)V + public fun setApiName (Ljava/lang/String;)V + public fun setBackgroundPosterUrl (Ljava/lang/String;)V + public fun setComingSoon (Z)V + public fun setContentRating (Ljava/lang/String;)V + public final fun setDataUrl (Ljava/lang/String;)V + public fun setDuration (Ljava/lang/Integer;)V + public fun setLogoUrl (Ljava/lang/String;)V + public fun setName (Ljava/lang/String;)V + public fun setPlot (Ljava/lang/String;)V + public fun setPosterHeaders (Ljava/util/Map;)V + public fun setPosterUrl (Ljava/lang/String;)V + public fun setRating (Ljava/lang/Integer;)V + public fun setRecommendations (Ljava/util/List;)V + public fun setScore (Lcom/lagradost/cloudstream3/Score;)V + public fun setSyncData (Ljava/util/Map;)V + public fun setTags (Ljava/util/List;)V + public fun setTrailers (Ljava/util/List;)V + public fun setType (Lcom/lagradost/cloudstream3/TvType;)V + public fun setUniqueUrl (Ljava/lang/String;)V + public fun setUrl (Ljava/lang/String;)V + public fun setYear (Ljava/lang/Integer;)V + public fun toString ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/MovieSearchResponse : com/lagradost/cloudstream3/SearchResponse { + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/lagradost/cloudstream3/TvType;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/Integer;Lcom/lagradost/cloudstream3/SearchQuality;Ljava/util/Map;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/lagradost/cloudstream3/TvType;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/Integer;Lcom/lagradost/cloudstream3/SearchQuality;Ljava/util/Map;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/lagradost/cloudstream3/TvType;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/Integer;Lcom/lagradost/cloudstream3/SearchQuality;Ljava/util/Map;Lcom/lagradost/cloudstream3/Score;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/lagradost/cloudstream3/TvType;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/Integer;Lcom/lagradost/cloudstream3/SearchQuality;Ljava/util/Map;Lcom/lagradost/cloudstream3/Score;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component10 ()Lcom/lagradost/cloudstream3/Score; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Ljava/lang/String; + public final fun component4 ()Lcom/lagradost/cloudstream3/TvType; + public final fun component5 ()Ljava/lang/String; + public final fun component6 ()Ljava/lang/Integer; + public final fun component7 ()Ljava/lang/Integer; + public final fun component8 ()Lcom/lagradost/cloudstream3/SearchQuality; + public final fun component9 ()Ljava/util/Map; + public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/lagradost/cloudstream3/TvType;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/Integer;Lcom/lagradost/cloudstream3/SearchQuality;Ljava/util/Map;Lcom/lagradost/cloudstream3/Score;)Lcom/lagradost/cloudstream3/MovieSearchResponse; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/MovieSearchResponse;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/lagradost/cloudstream3/TvType;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/Integer;Lcom/lagradost/cloudstream3/SearchQuality;Ljava/util/Map;Lcom/lagradost/cloudstream3/Score;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/MovieSearchResponse; + public fun equals (Ljava/lang/Object;)Z + public fun getApiName ()Ljava/lang/String; + public fun getId ()Ljava/lang/Integer; + public fun getName ()Ljava/lang/String; + public fun getPosterHeaders ()Ljava/util/Map; + public fun getPosterUrl ()Ljava/lang/String; + public fun getQuality ()Lcom/lagradost/cloudstream3/SearchQuality; + public fun getScore ()Lcom/lagradost/cloudstream3/Score; + public fun getType ()Lcom/lagradost/cloudstream3/TvType; + public fun getUrl ()Ljava/lang/String; + public final fun getYear ()Ljava/lang/Integer; + public fun hashCode ()I + public fun setId (Ljava/lang/Integer;)V + public fun setPosterHeaders (Ljava/util/Map;)V + public fun setPosterUrl (Ljava/lang/String;)V + public fun setQuality (Lcom/lagradost/cloudstream3/SearchQuality;)V + public fun setScore (Lcom/lagradost/cloudstream3/Score;)V + public fun setType (Lcom/lagradost/cloudstream3/TvType;)V + public final fun setYear (Ljava/lang/Integer;)V + public fun toString ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/NextAiring { + public fun (IJLjava/lang/Integer;)V + public synthetic fun (IJLjava/lang/Integer;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()I + public final fun component2 ()J + public final fun component3 ()Ljava/lang/Integer; + public final fun copy (IJLjava/lang/Integer;)Lcom/lagradost/cloudstream3/NextAiring; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/NextAiring;IJLjava/lang/Integer;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/NextAiring; + public fun equals (Ljava/lang/Object;)Z + public final fun getEpisode ()I + public final fun getSeason ()Ljava/lang/Integer; + public final fun getUnixTime ()J + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/ParCollectionsKt { + public static final fun amap (Ljava/util/List;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static final fun amap (Ljava/util/Map;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static final fun amapIndexed (Ljava/util/List;Lkotlin/jvm/functions/Function3;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static final fun apmap (Ljava/util/List;Lkotlin/jvm/functions/Function2;)Ljava/util/List; + public static final fun apmap (Ljava/util/Map;Lkotlin/jvm/functions/Function2;)Ljava/util/List; + public static final fun apmapIndexed (Ljava/util/List;Lkotlin/jvm/functions/Function3;)Ljava/util/List; + public static final fun argamap ([Lkotlin/jvm/functions/Function1;)Ljava/util/List; + public static final fun runAllAsync ([Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +} + +public abstract interface annotation class com/lagradost/cloudstream3/Prerelease : java/lang/annotation/Annotation { +} + +public final class com/lagradost/cloudstream3/ProviderType : java/lang/Enum { + public static final field DirectProvider Lcom/lagradost/cloudstream3/ProviderType; + public static final field MetaProvider Lcom/lagradost/cloudstream3/ProviderType; + public static fun getEntries ()Lkotlin/enums/EnumEntries; + public static fun valueOf (Ljava/lang/String;)Lcom/lagradost/cloudstream3/ProviderType; + public static fun values ()[Lcom/lagradost/cloudstream3/ProviderType; +} + +public final class com/lagradost/cloudstream3/ProvidersInfoJson { + public static final field Companion Lcom/lagradost/cloudstream3/ProvidersInfoJson$Companion; + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;I)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;IILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Ljava/lang/String; + public final fun component4 ()I + public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;I)Lcom/lagradost/cloudstream3/ProvidersInfoJson; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/ProvidersInfoJson;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;IILjava/lang/Object;)Lcom/lagradost/cloudstream3/ProvidersInfoJson; + public fun equals (Ljava/lang/Object;)Z + public final fun getCredentials ()Ljava/lang/String; + public final fun getName ()Ljava/lang/String; + public final fun getStatus ()I + public final fun getUrl ()Ljava/lang/String; + public fun hashCode ()I + public final fun setCredentials (Ljava/lang/String;)V + public final fun setName (Ljava/lang/String;)V + public final fun setStatus (I)V + public final fun setUrl (Ljava/lang/String;)V + public fun toString ()Ljava/lang/String; +} + +public final synthetic class com/lagradost/cloudstream3/ProvidersInfoJson$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lcom/lagradost/cloudstream3/ProvidersInfoJson$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lcom/lagradost/cloudstream3/ProvidersInfoJson; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lcom/lagradost/cloudstream3/ProvidersInfoJson;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class com/lagradost/cloudstream3/ProvidersInfoJson$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class com/lagradost/cloudstream3/Score { + public static final field Companion Lcom/lagradost/cloudstream3/Score$Companion; + public static final field MAX I + public static final field MAX_ZEROS I + public static final field MIN I + public synthetic fun (ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun equals (Ljava/lang/Object;)Z + public fun hashCode ()I + public final fun toByte (I)B + public final fun toDouble (I)D + public static synthetic fun toDouble$default (Lcom/lagradost/cloudstream3/Score;IILjava/lang/Object;)D + public final fun toFloat (I)F + public static synthetic fun toFloat$default (Lcom/lagradost/cloudstream3/Score;IILjava/lang/Object;)F + public final fun toInt (I)I + public static synthetic fun toInt$default (Lcom/lagradost/cloudstream3/Score;IILjava/lang/Object;)I + public final fun toLong (I)J + public static synthetic fun toLong$default (Lcom/lagradost/cloudstream3/Score;IILjava/lang/Object;)J + public final fun toOld ()I + public fun toString ()Ljava/lang/String; + public final fun toString (IIZC)Ljava/lang/String; + public static synthetic fun toString$default (Lcom/lagradost/cloudstream3/Score;IIZCILjava/lang/Object;)Ljava/lang/String; + public final fun toStringNull (DIIZC)Ljava/lang/String; + public static synthetic fun toStringNull$default (Lcom/lagradost/cloudstream3/Score;DIIZCILjava/lang/Object;)Ljava/lang/String; +} + +public final synthetic class com/lagradost/cloudstream3/Score$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lcom/lagradost/cloudstream3/Score$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lcom/lagradost/cloudstream3/Score; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lcom/lagradost/cloudstream3/Score;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class com/lagradost/cloudstream3/Score$Companion { + public final fun from (Ljava/lang/Double;I)Lcom/lagradost/cloudstream3/Score; + public final fun from (Ljava/lang/Float;I)Lcom/lagradost/cloudstream3/Score; + public final fun from (Ljava/lang/Integer;I)Lcom/lagradost/cloudstream3/Score; + public final fun from (Ljava/lang/String;I)Lcom/lagradost/cloudstream3/Score; + public final fun from10 (Ljava/lang/Double;)Lcom/lagradost/cloudstream3/Score; + public final fun from10 (Ljava/lang/Float;)Lcom/lagradost/cloudstream3/Score; + public final fun from10 (Ljava/lang/Integer;)Lcom/lagradost/cloudstream3/Score; + public final fun from10 (Ljava/lang/String;)Lcom/lagradost/cloudstream3/Score; + public final fun from100 (Ljava/lang/Double;)Lcom/lagradost/cloudstream3/Score; + public final fun from100 (Ljava/lang/Float;)Lcom/lagradost/cloudstream3/Score; + public final fun from100 (Ljava/lang/Integer;)Lcom/lagradost/cloudstream3/Score; + public final fun from100 (Ljava/lang/String;)Lcom/lagradost/cloudstream3/Score; + public final fun from5 (Ljava/lang/Double;)Lcom/lagradost/cloudstream3/Score; + public final fun from5 (Ljava/lang/Float;)Lcom/lagradost/cloudstream3/Score; + public final fun from5 (Ljava/lang/Integer;)Lcom/lagradost/cloudstream3/Score; + public final fun from5 (Ljava/lang/String;)Lcom/lagradost/cloudstream3/Score; + public final fun fromOld (Ljava/lang/Integer;)Lcom/lagradost/cloudstream3/Score; + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class com/lagradost/cloudstream3/SearchQuality : java/lang/Enum { + public static final field BlueRay Lcom/lagradost/cloudstream3/SearchQuality; + public static final field Cam Lcom/lagradost/cloudstream3/SearchQuality; + public static final field CamRip Lcom/lagradost/cloudstream3/SearchQuality; + public static final field DVD Lcom/lagradost/cloudstream3/SearchQuality; + public static final field FourK Lcom/lagradost/cloudstream3/SearchQuality; + public static final field HD Lcom/lagradost/cloudstream3/SearchQuality; + public static final field HDR Lcom/lagradost/cloudstream3/SearchQuality; + public static final field HQ Lcom/lagradost/cloudstream3/SearchQuality; + public static final field HdCam Lcom/lagradost/cloudstream3/SearchQuality; + public static final field SD Lcom/lagradost/cloudstream3/SearchQuality; + public static final field SDR Lcom/lagradost/cloudstream3/SearchQuality; + public static final field Telecine Lcom/lagradost/cloudstream3/SearchQuality; + public static final field Telesync Lcom/lagradost/cloudstream3/SearchQuality; + public static final field UHD Lcom/lagradost/cloudstream3/SearchQuality; + public static final field WebRip Lcom/lagradost/cloudstream3/SearchQuality; + public static final field WorkPrint Lcom/lagradost/cloudstream3/SearchQuality; + public static fun getEntries ()Lkotlin/enums/EnumEntries; + public static fun valueOf (Ljava/lang/String;)Lcom/lagradost/cloudstream3/SearchQuality; + public static fun values ()[Lcom/lagradost/cloudstream3/SearchQuality; +} + +public abstract interface class com/lagradost/cloudstream3/SearchResponse { + public abstract fun getApiName ()Ljava/lang/String; + public abstract fun getId ()Ljava/lang/Integer; + public abstract fun getName ()Ljava/lang/String; + public abstract fun getPosterHeaders ()Ljava/util/Map; + public abstract fun getPosterUrl ()Ljava/lang/String; + public abstract fun getQuality ()Lcom/lagradost/cloudstream3/SearchQuality; + public abstract fun getScore ()Lcom/lagradost/cloudstream3/Score; + public abstract fun getType ()Lcom/lagradost/cloudstream3/TvType; + public abstract fun getUrl ()Ljava/lang/String; + public abstract fun setId (Ljava/lang/Integer;)V + public abstract fun setPosterHeaders (Ljava/util/Map;)V + public abstract fun setPosterUrl (Ljava/lang/String;)V + public abstract fun setQuality (Lcom/lagradost/cloudstream3/SearchQuality;)V + public abstract fun setScore (Lcom/lagradost/cloudstream3/Score;)V + public abstract fun setType (Lcom/lagradost/cloudstream3/TvType;)V +} + +public final class com/lagradost/cloudstream3/SearchResponseList { + public fun (Ljava/util/List;Z)V + public synthetic fun (Ljava/util/List;ZILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/util/List; + public final fun component2 ()Z + public final fun copy (Ljava/util/List;Z)Lcom/lagradost/cloudstream3/SearchResponseList; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/SearchResponseList;Ljava/util/List;ZILjava/lang/Object;)Lcom/lagradost/cloudstream3/SearchResponseList; + public fun equals (Ljava/lang/Object;)Z + public final fun getHasNext ()Z + public final fun getItems ()Ljava/util/List; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/SeasonData { + public static final field Companion Lcom/lagradost/cloudstream3/SeasonData$Companion; + public fun (ILjava/lang/String;Ljava/lang/Integer;)V + public synthetic fun (ILjava/lang/String;Ljava/lang/Integer;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()I + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Ljava/lang/Integer; + public final fun copy (ILjava/lang/String;Ljava/lang/Integer;)Lcom/lagradost/cloudstream3/SeasonData; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/SeasonData;ILjava/lang/String;Ljava/lang/Integer;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/SeasonData; + public fun equals (Ljava/lang/Object;)Z + public final fun getDisplaySeason ()Ljava/lang/Integer; + public final fun getName ()Ljava/lang/String; + public final fun getSeason ()I + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class com/lagradost/cloudstream3/SeasonData$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lcom/lagradost/cloudstream3/SeasonData$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lcom/lagradost/cloudstream3/SeasonData; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lcom/lagradost/cloudstream3/SeasonData;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class com/lagradost/cloudstream3/SeasonData$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class com/lagradost/cloudstream3/SettingsJson { + public static final field Companion Lcom/lagradost/cloudstream3/SettingsJson$Companion; + public fun ()V + public fun (Z)V + public synthetic fun (ZILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Z + public final fun copy (Z)Lcom/lagradost/cloudstream3/SettingsJson; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/SettingsJson;ZILjava/lang/Object;)Lcom/lagradost/cloudstream3/SettingsJson; + public fun equals (Ljava/lang/Object;)Z + public final fun getEnableAdult ()Z + public fun hashCode ()I + public final fun setEnableAdult (Z)V + public fun toString ()Ljava/lang/String; +} + +public final synthetic class com/lagradost/cloudstream3/SettingsJson$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lcom/lagradost/cloudstream3/SettingsJson$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lcom/lagradost/cloudstream3/SettingsJson; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lcom/lagradost/cloudstream3/SettingsJson;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class com/lagradost/cloudstream3/SettingsJson$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class com/lagradost/cloudstream3/ShowStatus : java/lang/Enum { + public static final field Completed Lcom/lagradost/cloudstream3/ShowStatus; + public static final field Ongoing Lcom/lagradost/cloudstream3/ShowStatus; + public static fun getEntries ()Lkotlin/enums/EnumEntries; + public static fun valueOf (Ljava/lang/String;)Lcom/lagradost/cloudstream3/ShowStatus; + public static fun values ()[Lcom/lagradost/cloudstream3/ShowStatus; +} + +public final class com/lagradost/cloudstream3/SimklSyncServices : java/lang/Enum { + public static final field AniList Lcom/lagradost/cloudstream3/SimklSyncServices; + public static final field Imdb Lcom/lagradost/cloudstream3/SimklSyncServices; + public static final field Mal Lcom/lagradost/cloudstream3/SimklSyncServices; + public static final field Simkl Lcom/lagradost/cloudstream3/SimklSyncServices; + public static final field Tmdb Lcom/lagradost/cloudstream3/SimklSyncServices; + public static fun getEntries ()Lkotlin/enums/EnumEntries; + public final fun getOriginalName ()Ljava/lang/String; + public static fun valueOf (Ljava/lang/String;)Lcom/lagradost/cloudstream3/SimklSyncServices; + public static fun values ()[Lcom/lagradost/cloudstream3/SimklSyncServices; +} + +public final class com/lagradost/cloudstream3/SubtitleFile { + public fun (Ljava/lang/String;Ljava/lang/String;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Ljava/util/Map; + public final fun copy (Ljava/lang/String;Ljava/lang/String;)Lcom/lagradost/cloudstream3/SubtitleFile; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/SubtitleFile;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/SubtitleFile; + public fun equals (Ljava/lang/Object;)Z + public final fun getHeaders ()Ljava/util/Map; + public final fun getLang ()Ljava/lang/String; + public final fun getLangTag ()Ljava/lang/String; + public final fun getUrl ()Ljava/lang/String; + public fun hashCode ()I + public final fun setHeaders (Ljava/util/Map;)V + public final fun setLang (Ljava/lang/String;)V + public final fun setUrl (Ljava/lang/String;)V + public fun toString ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/TorrentLoadResponse : com/lagradost/cloudstream3/LoadResponse { + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/lagradost/cloudstream3/TvType;Ljava/lang/String;Ljava/lang/Integer;Lcom/lagradost/cloudstream3/Score;Ljava/util/List;Ljava/lang/Integer;Ljava/util/List;Ljava/util/List;Ljava/util/List;ZLjava/util/Map;Ljava/util/Map;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/lagradost/cloudstream3/TvType;Ljava/lang/String;Ljava/lang/Integer;Lcom/lagradost/cloudstream3/Score;Ljava/util/List;Ljava/lang/Integer;Ljava/util/List;Ljava/util/List;Ljava/util/List;ZLjava/util/Map;Ljava/util/Map;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component10 ()Lcom/lagradost/cloudstream3/Score; + public final fun component11 ()Ljava/util/List; + public final fun component12 ()Ljava/lang/Integer; + public final fun component13 ()Ljava/util/List; + public final fun component14 ()Ljava/util/List; + public final fun component15 ()Ljava/util/List; + public final fun component16 ()Z + public final fun component17 ()Ljava/util/Map; + public final fun component18 ()Ljava/util/Map; + public final fun component19 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun component20 ()Ljava/lang/String; + public final fun component21 ()Ljava/lang/String; + public final fun component22 ()Ljava/lang/String; + public final fun component3 ()Ljava/lang/String; + public final fun component4 ()Ljava/lang/String; + public final fun component5 ()Ljava/lang/String; + public final fun component6 ()Ljava/lang/String; + public final fun component7 ()Lcom/lagradost/cloudstream3/TvType; + public final fun component8 ()Ljava/lang/String; + public final fun component9 ()Ljava/lang/Integer; + public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/lagradost/cloudstream3/TvType;Ljava/lang/String;Ljava/lang/Integer;Lcom/lagradost/cloudstream3/Score;Ljava/util/List;Ljava/lang/Integer;Ljava/util/List;Ljava/util/List;Ljava/util/List;ZLjava/util/Map;Ljava/util/Map;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lcom/lagradost/cloudstream3/TorrentLoadResponse; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/TorrentLoadResponse;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/lagradost/cloudstream3/TvType;Ljava/lang/String;Ljava/lang/Integer;Lcom/lagradost/cloudstream3/Score;Ljava/util/List;Ljava/lang/Integer;Ljava/util/List;Ljava/util/List;Ljava/util/List;ZLjava/util/Map;Ljava/util/Map;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/TorrentLoadResponse; + public fun equals (Ljava/lang/Object;)Z + public fun getActors ()Ljava/util/List; + public fun getApiName ()Ljava/lang/String; + public fun getBackgroundPosterUrl ()Ljava/lang/String; + public fun getComingSoon ()Z + public fun getContentRating ()Ljava/lang/String; + public fun getDuration ()Ljava/lang/Integer; + public fun getLogoUrl ()Ljava/lang/String; + public final fun getMagnet ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getPlot ()Ljava/lang/String; + public fun getPosterHeaders ()Ljava/util/Map; + public fun getPosterUrl ()Ljava/lang/String; + public fun getRating ()Ljava/lang/Integer; + public fun getRecommendations ()Ljava/util/List; + public fun getScore ()Lcom/lagradost/cloudstream3/Score; + public fun getSyncData ()Ljava/util/Map; + public fun getTags ()Ljava/util/List; + public final fun getTorrent ()Ljava/lang/String; + public fun getTrailers ()Ljava/util/List; + public fun getType ()Lcom/lagradost/cloudstream3/TvType; + public fun getUniqueUrl ()Ljava/lang/String; + public fun getUrl ()Ljava/lang/String; + public fun getYear ()Ljava/lang/Integer; + public fun hashCode ()I + public fun setActors (Ljava/util/List;)V + public fun setApiName (Ljava/lang/String;)V + public fun setBackgroundPosterUrl (Ljava/lang/String;)V + public fun setComingSoon (Z)V + public fun setContentRating (Ljava/lang/String;)V + public fun setDuration (Ljava/lang/Integer;)V + public fun setLogoUrl (Ljava/lang/String;)V + public final fun setMagnet (Ljava/lang/String;)V + public fun setName (Ljava/lang/String;)V + public fun setPlot (Ljava/lang/String;)V + public fun setPosterHeaders (Ljava/util/Map;)V + public fun setPosterUrl (Ljava/lang/String;)V + public fun setRating (Ljava/lang/Integer;)V + public fun setRecommendations (Ljava/util/List;)V + public fun setScore (Lcom/lagradost/cloudstream3/Score;)V + public fun setSyncData (Ljava/util/Map;)V + public fun setTags (Ljava/util/List;)V + public final fun setTorrent (Ljava/lang/String;)V + public fun setTrailers (Ljava/util/List;)V + public fun setType (Lcom/lagradost/cloudstream3/TvType;)V + public fun setUniqueUrl (Ljava/lang/String;)V + public fun setUrl (Ljava/lang/String;)V + public fun setYear (Ljava/lang/Integer;)V + public fun toString ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/TorrentSearchResponse : com/lagradost/cloudstream3/SearchResponse { + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/lagradost/cloudstream3/TvType;Ljava/lang/String;Ljava/lang/Integer;Lcom/lagradost/cloudstream3/SearchQuality;Ljava/util/Map;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/lagradost/cloudstream3/TvType;Ljava/lang/String;Ljava/lang/Integer;Lcom/lagradost/cloudstream3/SearchQuality;Ljava/util/Map;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/lagradost/cloudstream3/TvType;Ljava/lang/String;Ljava/lang/Integer;Lcom/lagradost/cloudstream3/SearchQuality;Ljava/util/Map;Lcom/lagradost/cloudstream3/Score;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/lagradost/cloudstream3/TvType;Ljava/lang/String;Ljava/lang/Integer;Lcom/lagradost/cloudstream3/SearchQuality;Ljava/util/Map;Lcom/lagradost/cloudstream3/Score;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Ljava/lang/String; + public final fun component4 ()Lcom/lagradost/cloudstream3/TvType; + public final fun component5 ()Ljava/lang/String; + public final fun component6 ()Ljava/lang/Integer; + public final fun component7 ()Lcom/lagradost/cloudstream3/SearchQuality; + public final fun component8 ()Ljava/util/Map; + public final fun component9 ()Lcom/lagradost/cloudstream3/Score; + public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/lagradost/cloudstream3/TvType;Ljava/lang/String;Ljava/lang/Integer;Lcom/lagradost/cloudstream3/SearchQuality;Ljava/util/Map;Lcom/lagradost/cloudstream3/Score;)Lcom/lagradost/cloudstream3/TorrentSearchResponse; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/TorrentSearchResponse;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/lagradost/cloudstream3/TvType;Ljava/lang/String;Ljava/lang/Integer;Lcom/lagradost/cloudstream3/SearchQuality;Ljava/util/Map;Lcom/lagradost/cloudstream3/Score;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/TorrentSearchResponse; + public fun equals (Ljava/lang/Object;)Z + public fun getApiName ()Ljava/lang/String; + public fun getId ()Ljava/lang/Integer; + public fun getName ()Ljava/lang/String; + public fun getPosterHeaders ()Ljava/util/Map; + public fun getPosterUrl ()Ljava/lang/String; + public fun getQuality ()Lcom/lagradost/cloudstream3/SearchQuality; + public fun getScore ()Lcom/lagradost/cloudstream3/Score; + public fun getType ()Lcom/lagradost/cloudstream3/TvType; + public fun getUrl ()Ljava/lang/String; + public fun hashCode ()I + public fun setId (Ljava/lang/Integer;)V + public fun setPosterHeaders (Ljava/util/Map;)V + public fun setPosterUrl (Ljava/lang/String;)V + public fun setQuality (Lcom/lagradost/cloudstream3/SearchQuality;)V + public fun setScore (Lcom/lagradost/cloudstream3/Score;)V + public fun setType (Lcom/lagradost/cloudstream3/TvType;)V + public fun toString ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/Tracker { + public fun ()V + public fun (Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V + public synthetic fun (Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/Integer; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Ljava/lang/String; + public final fun component4 ()Ljava/lang/String; + public final fun component5 ()Ljava/lang/String; + public final fun copy (Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lcom/lagradost/cloudstream3/Tracker; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/Tracker;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/Tracker; + public fun equals (Ljava/lang/Object;)Z + public final fun getAniId ()Ljava/lang/String; + public final fun getCover ()Ljava/lang/String; + public final fun getImage ()Ljava/lang/String; + public final fun getKitsuId ()Ljava/lang/String; + public final fun getMalId ()Ljava/lang/Integer; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/TrackerType : java/lang/Enum { + public static final field Companion Lcom/lagradost/cloudstream3/TrackerType$Companion; + public static final field MOVIE Lcom/lagradost/cloudstream3/TrackerType; + public static final field MUSIC Lcom/lagradost/cloudstream3/TrackerType; + public static final field ONA Lcom/lagradost/cloudstream3/TrackerType; + public static final field OVA Lcom/lagradost/cloudstream3/TrackerType; + public static final field SPECIAL Lcom/lagradost/cloudstream3/TrackerType; + public static final field TV Lcom/lagradost/cloudstream3/TrackerType; + public static final field TV_SHORT Lcom/lagradost/cloudstream3/TrackerType; + public static fun getEntries ()Lkotlin/enums/EnumEntries; + public static fun valueOf (Ljava/lang/String;)Lcom/lagradost/cloudstream3/TrackerType; + public static fun values ()[Lcom/lagradost/cloudstream3/TrackerType; +} + +public final class com/lagradost/cloudstream3/TrackerType$Companion { + public final fun getTypes (Lcom/lagradost/cloudstream3/TvType;)Ljava/util/Set; +} + +public final class com/lagradost/cloudstream3/TrailerData { + public fun (Ljava/lang/String;Ljava/lang/String;ZLjava/util/Map;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;ZLjava/util/Map;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Z + public final fun component4 ()Ljava/util/Map; + public final fun copy (Ljava/lang/String;Ljava/lang/String;ZLjava/util/Map;)Lcom/lagradost/cloudstream3/TrailerData; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/TrailerData;Ljava/lang/String;Ljava/lang/String;ZLjava/util/Map;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/TrailerData; + public fun equals (Ljava/lang/Object;)Z + public final fun getExtractorUrl ()Ljava/lang/String; + public final fun getHeaders ()Ljava/util/Map; + public final fun getRaw ()Z + public final fun getReferer ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/TvSeriesLoadResponse : com/lagradost/cloudstream3/EpisodeResponse, com/lagradost/cloudstream3/LoadResponse { + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/lagradost/cloudstream3/TvType;Ljava/util/List;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;Lcom/lagradost/cloudstream3/ShowStatus;Lcom/lagradost/cloudstream3/Score;Ljava/util/List;Ljava/lang/Integer;Ljava/util/List;Ljava/util/List;Ljava/util/List;ZLjava/util/Map;Ljava/util/Map;Lcom/lagradost/cloudstream3/NextAiring;Ljava/util/List;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/lagradost/cloudstream3/TvType;Ljava/util/List;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;Lcom/lagradost/cloudstream3/ShowStatus;Lcom/lagradost/cloudstream3/Score;Ljava/util/List;Ljava/lang/Integer;Ljava/util/List;Ljava/util/List;Ljava/util/List;ZLjava/util/Map;Ljava/util/Map;Lcom/lagradost/cloudstream3/NextAiring;Ljava/util/List;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component10 ()Lcom/lagradost/cloudstream3/Score; + public final fun component11 ()Ljava/util/List; + public final fun component12 ()Ljava/lang/Integer; + public final fun component13 ()Ljava/util/List; + public final fun component14 ()Ljava/util/List; + public final fun component15 ()Ljava/util/List; + public final fun component16 ()Z + public final fun component17 ()Ljava/util/Map; + public final fun component18 ()Ljava/util/Map; + public final fun component19 ()Lcom/lagradost/cloudstream3/NextAiring; + public final fun component2 ()Ljava/lang/String; + public final fun component20 ()Ljava/util/List; + public final fun component21 ()Ljava/lang/String; + public final fun component22 ()Ljava/lang/String; + public final fun component23 ()Ljava/lang/String; + public final fun component24 ()Ljava/lang/String; + public final fun component3 ()Ljava/lang/String; + public final fun component4 ()Lcom/lagradost/cloudstream3/TvType; + public final fun component5 ()Ljava/util/List; + public final fun component6 ()Ljava/lang/String; + public final fun component7 ()Ljava/lang/Integer; + public final fun component8 ()Ljava/lang/String; + public final fun component9 ()Lcom/lagradost/cloudstream3/ShowStatus; + public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/lagradost/cloudstream3/TvType;Ljava/util/List;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;Lcom/lagradost/cloudstream3/ShowStatus;Lcom/lagradost/cloudstream3/Score;Ljava/util/List;Ljava/lang/Integer;Ljava/util/List;Ljava/util/List;Ljava/util/List;ZLjava/util/Map;Ljava/util/Map;Lcom/lagradost/cloudstream3/NextAiring;Ljava/util/List;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lcom/lagradost/cloudstream3/TvSeriesLoadResponse; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/TvSeriesLoadResponse;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/lagradost/cloudstream3/TvType;Ljava/util/List;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;Lcom/lagradost/cloudstream3/ShowStatus;Lcom/lagradost/cloudstream3/Score;Ljava/util/List;Ljava/lang/Integer;Ljava/util/List;Ljava/util/List;Ljava/util/List;ZLjava/util/Map;Ljava/util/Map;Lcom/lagradost/cloudstream3/NextAiring;Ljava/util/List;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/TvSeriesLoadResponse; + public fun equals (Ljava/lang/Object;)Z + public fun getActors ()Ljava/util/List; + public fun getApiName ()Ljava/lang/String; + public fun getBackgroundPosterUrl ()Ljava/lang/String; + public fun getComingSoon ()Z + public fun getContentRating ()Ljava/lang/String; + public fun getDuration ()Ljava/lang/Integer; + public final fun getEpisodes ()Ljava/util/List; + public fun getLatestEpisodes ()Ljava/util/Map; + public fun getLogoUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getNextAiring ()Lcom/lagradost/cloudstream3/NextAiring; + public fun getPlot ()Ljava/lang/String; + public fun getPosterHeaders ()Ljava/util/Map; + public fun getPosterUrl ()Ljava/lang/String; + public fun getRating ()Ljava/lang/Integer; + public fun getRecommendations ()Ljava/util/List; + public fun getScore ()Lcom/lagradost/cloudstream3/Score; + public fun getSeasonNames ()Ljava/util/List; + public fun getShowStatus ()Lcom/lagradost/cloudstream3/ShowStatus; + public fun getSyncData ()Ljava/util/Map; + public fun getTags ()Ljava/util/List; + public fun getTotalEpisodeIndex (II)I + public fun getTrailers ()Ljava/util/List; + public fun getType ()Lcom/lagradost/cloudstream3/TvType; + public fun getUniqueUrl ()Ljava/lang/String; + public fun getUrl ()Ljava/lang/String; + public fun getYear ()Ljava/lang/Integer; + public fun hashCode ()I + public fun setActors (Ljava/util/List;)V + public fun setApiName (Ljava/lang/String;)V + public fun setBackgroundPosterUrl (Ljava/lang/String;)V + public fun setComingSoon (Z)V + public fun setContentRating (Ljava/lang/String;)V + public fun setDuration (Ljava/lang/Integer;)V + public final fun setEpisodes (Ljava/util/List;)V + public fun setLogoUrl (Ljava/lang/String;)V + public fun setName (Ljava/lang/String;)V + public fun setNextAiring (Lcom/lagradost/cloudstream3/NextAiring;)V + public fun setPlot (Ljava/lang/String;)V + public fun setPosterHeaders (Ljava/util/Map;)V + public fun setPosterUrl (Ljava/lang/String;)V + public fun setRating (Ljava/lang/Integer;)V + public fun setRecommendations (Ljava/util/List;)V + public fun setScore (Lcom/lagradost/cloudstream3/Score;)V + public fun setSeasonNames (Ljava/util/List;)V + public fun setShowStatus (Lcom/lagradost/cloudstream3/ShowStatus;)V + public fun setSyncData (Ljava/util/Map;)V + public fun setTags (Ljava/util/List;)V + public fun setTrailers (Ljava/util/List;)V + public fun setType (Lcom/lagradost/cloudstream3/TvType;)V + public fun setUniqueUrl (Ljava/lang/String;)V + public fun setUrl (Ljava/lang/String;)V + public fun setYear (Ljava/lang/Integer;)V + public fun toString ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/TvSeriesSearchResponse : com/lagradost/cloudstream3/SearchResponse { + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/lagradost/cloudstream3/TvType;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/Integer;Lcom/lagradost/cloudstream3/SearchQuality;Ljava/util/Map;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/lagradost/cloudstream3/TvType;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/Integer;Lcom/lagradost/cloudstream3/SearchQuality;Ljava/util/Map;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/lagradost/cloudstream3/TvType;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/Integer;Lcom/lagradost/cloudstream3/SearchQuality;Ljava/util/Map;Lcom/lagradost/cloudstream3/Score;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/lagradost/cloudstream3/TvType;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/Integer;Lcom/lagradost/cloudstream3/SearchQuality;Ljava/util/Map;Lcom/lagradost/cloudstream3/Score;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component10 ()Ljava/util/Map; + public final fun component11 ()Lcom/lagradost/cloudstream3/Score; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Ljava/lang/String; + public final fun component4 ()Lcom/lagradost/cloudstream3/TvType; + public final fun component5 ()Ljava/lang/String; + public final fun component6 ()Ljava/lang/Integer; + public final fun component7 ()Ljava/lang/Integer; + public final fun component8 ()Ljava/lang/Integer; + public final fun component9 ()Lcom/lagradost/cloudstream3/SearchQuality; + public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/lagradost/cloudstream3/TvType;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/Integer;Lcom/lagradost/cloudstream3/SearchQuality;Ljava/util/Map;Lcom/lagradost/cloudstream3/Score;)Lcom/lagradost/cloudstream3/TvSeriesSearchResponse; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/TvSeriesSearchResponse;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/lagradost/cloudstream3/TvType;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/Integer;Lcom/lagradost/cloudstream3/SearchQuality;Ljava/util/Map;Lcom/lagradost/cloudstream3/Score;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/TvSeriesSearchResponse; + public fun equals (Ljava/lang/Object;)Z + public fun getApiName ()Ljava/lang/String; + public final fun getEpisodes ()Ljava/lang/Integer; + public fun getId ()Ljava/lang/Integer; + public fun getName ()Ljava/lang/String; + public fun getPosterHeaders ()Ljava/util/Map; + public fun getPosterUrl ()Ljava/lang/String; + public fun getQuality ()Lcom/lagradost/cloudstream3/SearchQuality; + public fun getScore ()Lcom/lagradost/cloudstream3/Score; + public fun getType ()Lcom/lagradost/cloudstream3/TvType; + public fun getUrl ()Ljava/lang/String; + public final fun getYear ()Ljava/lang/Integer; + public fun hashCode ()I + public final fun setEpisodes (Ljava/lang/Integer;)V + public fun setId (Ljava/lang/Integer;)V + public fun setPosterHeaders (Ljava/util/Map;)V + public fun setPosterUrl (Ljava/lang/String;)V + public fun setQuality (Lcom/lagradost/cloudstream3/SearchQuality;)V + public fun setScore (Lcom/lagradost/cloudstream3/Score;)V + public fun setType (Lcom/lagradost/cloudstream3/TvType;)V + public final fun setYear (Ljava/lang/Integer;)V + public fun toString ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/TvType : java/lang/Enum { + public static final field Anime Lcom/lagradost/cloudstream3/TvType; + public static final field AnimeMovie Lcom/lagradost/cloudstream3/TvType; + public static final field AsianDrama Lcom/lagradost/cloudstream3/TvType; + public static final field Audio Lcom/lagradost/cloudstream3/TvType; + public static final field AudioBook Lcom/lagradost/cloudstream3/TvType; + public static final field Cartoon Lcom/lagradost/cloudstream3/TvType; + public static final field CustomMedia Lcom/lagradost/cloudstream3/TvType; + public static final field Documentary Lcom/lagradost/cloudstream3/TvType; + public static final field Live Lcom/lagradost/cloudstream3/TvType; + public static final field Movie Lcom/lagradost/cloudstream3/TvType; + public static final field Music Lcom/lagradost/cloudstream3/TvType; + public static final field NSFW Lcom/lagradost/cloudstream3/TvType; + public static final field OVA Lcom/lagradost/cloudstream3/TvType; + public static final field Others Lcom/lagradost/cloudstream3/TvType; + public static final field Podcast Lcom/lagradost/cloudstream3/TvType; + public static final field Torrent Lcom/lagradost/cloudstream3/TvType; + public static final field TvSeries Lcom/lagradost/cloudstream3/TvType; + public static final field Video Lcom/lagradost/cloudstream3/TvType; + public static fun getEntries ()Lkotlin/enums/EnumEntries; + public static fun valueOf (Ljava/lang/String;)Lcom/lagradost/cloudstream3/TvType; + public static fun values ()[Lcom/lagradost/cloudstream3/TvType; +} + +public abstract interface annotation class com/lagradost/cloudstream3/UnsafeSSL : java/lang/annotation/Annotation { +} + +public final class com/lagradost/cloudstream3/VPNStatus : java/lang/Enum { + public static final field MightBeNeeded Lcom/lagradost/cloudstream3/VPNStatus; + public static final field None Lcom/lagradost/cloudstream3/VPNStatus; + public static final field Torrent Lcom/lagradost/cloudstream3/VPNStatus; + public static fun getEntries ()Lkotlin/enums/EnumEntries; + public static fun valueOf (Ljava/lang/String;)Lcom/lagradost/cloudstream3/VPNStatus; + public static fun values ()[Lcom/lagradost/cloudstream3/VPNStatus; +} + +public class com/lagradost/cloudstream3/extractors/Acefile : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +} + +public final class com/lagradost/cloudstream3/extractors/Acefile$Source { + public fun ()V + public fun (Ljava/lang/String;)V + public synthetic fun (Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun copy (Ljava/lang/String;)Lcom/lagradost/cloudstream3/extractors/Acefile$Source; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/extractors/Acefile$Source;Ljava/lang/String;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/extractors/Acefile$Source; + public fun equals (Ljava/lang/Object;)Z + public final fun getData ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/AesHelper { + public static final field INSTANCE Lcom/lagradost/cloudstream3/extractors/AesHelper; + public final fun decryptAES (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/Ahvsh : com/lagradost/cloudstream3/extractors/Filesim { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/Aico : com/lagradost/cloudstream3/extractors/Hxfile { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/Asnwish : com/lagradost/cloudstream3/extractors/StreamWishExtractor { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/Auvexiug : com/lagradost/cloudstream3/extractors/VidHidePro { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/Awish : com/lagradost/cloudstream3/extractors/StreamWishExtractor { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/BgwpCC : com/lagradost/cloudstream3/extractors/BigwarpIO { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/BigwarpArt : com/lagradost/cloudstream3/extractors/BigwarpIO { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V +} + +public class com/lagradost/cloudstream3/extractors/BigwarpIO : com/lagradost/cloudstream3/extractors/JWPlayer { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V + public fun setName (Ljava/lang/String;)V +} + +public class com/lagradost/cloudstream3/extractors/Blogger : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +} + +public final class com/lagradost/cloudstream3/extractors/ByseBuho : com/lagradost/cloudstream3/extractors/ByseSX { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V + public fun setName (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/ByseQekaho : com/lagradost/cloudstream3/extractors/ByseSX { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V + public fun setName (Ljava/lang/String;)V +} + +public class com/lagradost/cloudstream3/extractors/ByseSX : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public fun setMainUrl (Ljava/lang/String;)V + public fun setName (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/ByseVepoin : com/lagradost/cloudstream3/extractors/ByseSX { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V + public fun setName (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/Bysezejataos : com/lagradost/cloudstream3/extractors/ByseSX { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V + public fun setName (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/Cavanhabg : com/lagradost/cloudstream3/extractors/VidHidePro { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; +} + +public class com/lagradost/cloudstream3/extractors/Cda : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public fun setMainUrl (Ljava/lang/String;)V + public fun setName (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/Cda$PlayerData { + public fun (Lcom/lagradost/cloudstream3/extractors/Cda$VideoPlayerData;)V + public final fun component1 ()Lcom/lagradost/cloudstream3/extractors/Cda$VideoPlayerData; + public final fun copy (Lcom/lagradost/cloudstream3/extractors/Cda$VideoPlayerData;)Lcom/lagradost/cloudstream3/extractors/Cda$PlayerData; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/extractors/Cda$PlayerData;Lcom/lagradost/cloudstream3/extractors/Cda$VideoPlayerData;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/extractors/Cda$PlayerData; + public fun equals (Ljava/lang/Object;)Z + public final fun getVideo ()Lcom/lagradost/cloudstream3/extractors/Cda$VideoPlayerData; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/Cda$VideoPlayerData { + public fun (Ljava/lang/String;Ljava/util/Map;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;)V + public synthetic fun (Ljava/lang/String;Ljava/util/Map;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/util/Map; + public final fun component3 ()Ljava/lang/String; + public final fun component4 ()Ljava/lang/Integer; + public final fun component5 ()Ljava/lang/String; + public final fun copy (Ljava/lang/String;Ljava/util/Map;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;)Lcom/lagradost/cloudstream3/extractors/Cda$VideoPlayerData; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/extractors/Cda$VideoPlayerData;Ljava/lang/String;Ljava/util/Map;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/extractors/Cda$VideoPlayerData; + public fun equals (Ljava/lang/Object;)Z + public final fun getFile ()Ljava/lang/String; + public final fun getHash2 ()Ljava/lang/String; + public final fun getQualities ()Ljava/util/Map; + public final fun getQuality ()Ljava/lang/String; + public final fun getTs ()Ljava/lang/Integer; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/Cdnplayer : com/lagradost/cloudstream3/extractors/XStreamCdn { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/CdnwishCom : com/lagradost/cloudstream3/extractors/StreamWishExtractor { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; +} + +public abstract class com/lagradost/cloudstream3/extractors/CineMMRedirect : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +} + +public class com/lagradost/cloudstream3/extractors/CloudMailRu : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +} + +public class com/lagradost/cloudstream3/extractors/ContentX : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +} + +public final class com/lagradost/cloudstream3/extractors/CsstOnline : com/lagradost/cloudstream3/extractors/SecvideoOnline { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/D0000d : com/lagradost/cloudstream3/extractors/DoodLaExtractor { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/D000dCom : com/lagradost/cloudstream3/extractors/DoodLaExtractor { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/DBfilm : com/lagradost/cloudstream3/extractors/XStreamCdn { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; +} + +public class com/lagradost/cloudstream3/extractors/Dailymotion : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +} + +public final class com/lagradost/cloudstream3/extractors/Dailymotion$MetaData { + public fun (Ljava/util/Map;Lcom/lagradost/cloudstream3/extractors/Dailymotion$SubtitlesWrapper;)V + public final fun component1 ()Ljava/util/Map; + public final fun component2 ()Lcom/lagradost/cloudstream3/extractors/Dailymotion$SubtitlesWrapper; + public final fun copy (Ljava/util/Map;Lcom/lagradost/cloudstream3/extractors/Dailymotion$SubtitlesWrapper;)Lcom/lagradost/cloudstream3/extractors/Dailymotion$MetaData; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/extractors/Dailymotion$MetaData;Ljava/util/Map;Lcom/lagradost/cloudstream3/extractors/Dailymotion$SubtitlesWrapper;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/extractors/Dailymotion$MetaData; + public fun equals (Ljava/lang/Object;)Z + public final fun getQualities ()Ljava/util/Map; + public final fun getSubtitles ()Lcom/lagradost/cloudstream3/extractors/Dailymotion$SubtitlesWrapper; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/Dailymotion$Quality { + public fun (Ljava/lang/String;Ljava/lang/String;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun copy (Ljava/lang/String;Ljava/lang/String;)Lcom/lagradost/cloudstream3/extractors/Dailymotion$Quality; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/extractors/Dailymotion$Quality;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/extractors/Dailymotion$Quality; + public fun equals (Ljava/lang/Object;)Z + public final fun getType ()Ljava/lang/String; + public final fun getUrl ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/Dailymotion$SubtitleData { + public fun (Ljava/lang/String;Ljava/util/List;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/util/List; + public final fun copy (Ljava/lang/String;Ljava/util/List;)Lcom/lagradost/cloudstream3/extractors/Dailymotion$SubtitleData; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/extractors/Dailymotion$SubtitleData;Ljava/lang/String;Ljava/util/List;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/extractors/Dailymotion$SubtitleData; + public fun equals (Ljava/lang/Object;)Z + public final fun getLabel ()Ljava/lang/String; + public final fun getUrls ()Ljava/util/List; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/Dailymotion$SubtitlesWrapper { + public fun (ZLjava/util/Map;)V + public final fun component1 ()Z + public final fun component2 ()Ljava/util/Map; + public final fun copy (ZLjava/util/Map;)Lcom/lagradost/cloudstream3/extractors/Dailymotion$SubtitlesWrapper; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/extractors/Dailymotion$SubtitlesWrapper;ZLjava/util/Map;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/extractors/Dailymotion$SubtitlesWrapper; + public fun equals (Ljava/lang/Object;)Z + public final fun getData ()Ljava/util/Map; + public final fun getEnable ()Z + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/DatabaseGdrive : com/lagradost/cloudstream3/extractors/Gdriveplayer { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/DatabaseGdrive2 : com/lagradost/cloudstream3/extractors/Gdriveplayer { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/DecryptKeys { + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Ljava/lang/String; + public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lcom/lagradost/cloudstream3/extractors/DecryptKeys; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/extractors/DecryptKeys;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/extractors/DecryptKeys; + public fun equals (Ljava/lang/Object;)Z + public final fun getEdge1 ()Ljava/lang/String; + public final fun getEdge2 ()Ljava/lang/String; + public final fun getLegacyFallback ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/DesuArcg : com/lagradost/cloudstream3/extractors/JWPlayer { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/DesuDrive : com/lagradost/cloudstream3/extractors/JWPlayer { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/DesuOdchan : com/lagradost/cloudstream3/extractors/JWPlayer { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/DesuOdvip : com/lagradost/cloudstream3/extractors/JWPlayer { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/DetailsRoot { + public fun (JLjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZLjava/lang/String;)V + public final fun component1 ()J + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Ljava/lang/String; + public final fun component4 ()Ljava/lang/String; + public final fun component5 ()Ljava/lang/String; + public final fun component6 ()Ljava/lang/String; + public final fun component7 ()Z + public final fun component8 ()Ljava/lang/String; + public final fun copy (JLjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZLjava/lang/String;)Lcom/lagradost/cloudstream3/extractors/DetailsRoot; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/extractors/DetailsRoot;JLjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZLjava/lang/String;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/extractors/DetailsRoot; + public fun equals (Ljava/lang/Object;)Z + public final fun getCode ()Ljava/lang/String; + public final fun getCreatedAt ()Ljava/lang/String; + public final fun getDescription ()Ljava/lang/String; + public final fun getEmbedFrameUrl ()Ljava/lang/String; + public final fun getId ()J + public final fun getOwnerPrivate ()Z + public final fun getPosterUrl ()Ljava/lang/String; + public final fun getTitle ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/Dhcplay : com/lagradost/cloudstream3/extractors/CineMMRedirect { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/Dhtpre : com/lagradost/cloudstream3/extractors/VidHidePro { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V + public fun setName (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/Dokicloud : com/lagradost/cloudstream3/extractors/Rabbitstream { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/DoodCxExtractor : com/lagradost/cloudstream3/extractors/DoodLaExtractor { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V +} + +public class com/lagradost/cloudstream3/extractors/DoodLaExtractor : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public fun setMainUrl (Ljava/lang/String;)V + public fun setName (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/DoodLiExtractor : com/lagradost/cloudstream3/extractors/DoodLaExtractor { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/DoodPmExtractor : com/lagradost/cloudstream3/extractors/DoodLaExtractor { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/DoodShExtractor : com/lagradost/cloudstream3/extractors/DoodLaExtractor { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/DoodSoExtractor : com/lagradost/cloudstream3/extractors/DoodLaExtractor { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/DoodToExtractor : com/lagradost/cloudstream3/extractors/DoodLaExtractor { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/DoodWatchExtractor : com/lagradost/cloudstream3/extractors/DoodLaExtractor { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/DoodWfExtractor : com/lagradost/cloudstream3/extractors/DoodLaExtractor { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/DoodWsExtractor : com/lagradost/cloudstream3/extractors/DoodLaExtractor { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/DoodYtExtractor : com/lagradost/cloudstream3/extractors/DoodLaExtractor { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/Doodporn : com/lagradost/cloudstream3/extractors/StreamWishExtractor { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/Doodspro : com/lagradost/cloudstream3/extractors/DoodLaExtractor { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/DoodstreamCom : com/lagradost/cloudstream3/extractors/DoodLaExtractor { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/Dooood : com/lagradost/cloudstream3/extractors/DoodLaExtractor { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/Ds2play : com/lagradost/cloudstream3/extractors/DoodLaExtractor { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/Ds2video : com/lagradost/cloudstream3/extractors/DoodLaExtractor { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/DsstOnline : com/lagradost/cloudstream3/extractors/SecvideoOnline { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/Dsvplay : com/lagradost/cloudstream3/extractors/DoodLaExtractor { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/Dumbalag : com/lagradost/cloudstream3/extractors/VidHidePro { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/Dwish : com/lagradost/cloudstream3/extractors/StreamWishExtractor { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; +} + +public class com/lagradost/cloudstream3/extractors/Embedgram : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +} + +public class com/lagradost/cloudstream3/extractors/EmturbovidExtractor : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +} + +public class com/lagradost/cloudstream3/extractors/Evoload : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +} + +public final class com/lagradost/cloudstream3/extractors/Evoload1 : com/lagradost/cloudstream3/extractors/Evoload { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/Ewish : com/lagradost/cloudstream3/extractors/StreamWishExtractor { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/FEmbed : com/lagradost/cloudstream3/extractors/XStreamCdn { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/FEnet : com/lagradost/cloudstream3/extractors/XStreamCdn { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; +} + +public class com/lagradost/cloudstream3/extractors/Fastream : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public fun setMainUrl (Ljava/lang/String;)V + public fun setName (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/FeHD : com/lagradost/cloudstream3/extractors/XStreamCdn { + public fun ()V + public fun getDomainUrl ()Ljava/lang/String; + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun setDomainUrl (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/Fembed9hd : com/lagradost/cloudstream3/extractors/XStreamCdn { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V + public fun setName (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/FileMoon : com/lagradost/cloudstream3/extractors/FilemoonV2 { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V + public fun setName (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/FileMoonIn : com/lagradost/cloudstream3/extractors/FilemoonV2 { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V + public fun setName (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/FileMoonSx : com/lagradost/cloudstream3/extractors/FilemoonV2 { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V + public fun setName (Ljava/lang/String;)V +} + +public class com/lagradost/cloudstream3/extractors/Filegram : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +} + +public class com/lagradost/cloudstream3/extractors/FilemoonV2 : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public fun setMainUrl (Ljava/lang/String;)V + public fun setName (Ljava/lang/String;)V +} + +public class com/lagradost/cloudstream3/extractors/Filesim : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +} + +public final class com/lagradost/cloudstream3/extractors/Firestream : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public fun getExtractorUrl (Ljava/lang/String;)Ljava/lang/String; + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +} + +public final class com/lagradost/cloudstream3/extractors/FlaswishCom : com/lagradost/cloudstream3/extractors/StreamWishExtractor { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; +} + +public class com/lagradost/cloudstream3/extractors/Flyfile : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public fun getApiUrl ()Ljava/lang/String; + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +} + +public final class com/lagradost/cloudstream3/extractors/FourCX : com/lagradost/cloudstream3/extractors/ContentX { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V + public fun setName (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/FourPichive : com/lagradost/cloudstream3/extractors/ContentX { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V + public fun setName (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/FourPlayRu : com/lagradost/cloudstream3/extractors/ContentX { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V + public fun setName (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/Fplayer : com/lagradost/cloudstream3/extractors/XStreamCdn { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/FsstOnline : com/lagradost/cloudstream3/extractors/SecvideoOnline { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; +} + +public class com/lagradost/cloudstream3/extractors/GDMirrorbot : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public fun setMainUrl (Ljava/lang/String;)V + public fun setName (Ljava/lang/String;)V +} + +public class com/lagradost/cloudstream3/extractors/GUpload : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +} + +public class com/lagradost/cloudstream3/extractors/GamoVideo : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +} + +public class com/lagradost/cloudstream3/extractors/Gdriveplayer : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +} + +public final class com/lagradost/cloudstream3/extractors/Gdriveplayer$Tracks { + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Ljava/lang/String; + public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lcom/lagradost/cloudstream3/extractors/Gdriveplayer$Tracks; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/extractors/Gdriveplayer$Tracks;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/extractors/Gdriveplayer$Tracks; + public fun equals (Ljava/lang/Object;)Z + public final fun getFile ()Ljava/lang/String; + public final fun getKind ()Ljava/lang/String; + public final fun getLabel ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/Gdriveplayerapi : com/lagradost/cloudstream3/extractors/Gdriveplayer { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/Gdriveplayerapp : com/lagradost/cloudstream3/extractors/Gdriveplayer { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/Gdriveplayerbiz : com/lagradost/cloudstream3/extractors/Gdriveplayer { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/Gdriveplayerco : com/lagradost/cloudstream3/extractors/Gdriveplayer { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/Gdriveplayerfun : com/lagradost/cloudstream3/extractors/Gdriveplayer { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/Gdriveplayerio : com/lagradost/cloudstream3/extractors/Gdriveplayer { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/Gdriveplayerme : com/lagradost/cloudstream3/extractors/Gdriveplayer { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/Gdriveplayerorg : com/lagradost/cloudstream3/extractors/Gdriveplayer { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/Gdriveplayerus : com/lagradost/cloudstream3/extractors/Gdriveplayer { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; +} + +public class com/lagradost/cloudstream3/extractors/GenericM3U8 : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public fun setMainUrl (Ljava/lang/String;)V + public fun setName (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/Geodailymotion : com/lagradost/cloudstream3/extractors/Dailymotion { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; +} + +public class com/lagradost/cloudstream3/extractors/Gofile : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +} + +public final class com/lagradost/cloudstream3/extractors/Gofile$AccountData { + public fun ()V + public fun (Ljava/lang/String;)V + public synthetic fun (Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun copy (Ljava/lang/String;)Lcom/lagradost/cloudstream3/extractors/Gofile$AccountData; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/extractors/Gofile$AccountData;Ljava/lang/String;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/extractors/Gofile$AccountData; + public fun equals (Ljava/lang/Object;)Z + public final fun getToken ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/Gofile$AccountResponse { + public fun ()V + public fun (Lcom/lagradost/cloudstream3/extractors/Gofile$AccountData;)V + public synthetic fun (Lcom/lagradost/cloudstream3/extractors/Gofile$AccountData;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Lcom/lagradost/cloudstream3/extractors/Gofile$AccountData; + public final fun copy (Lcom/lagradost/cloudstream3/extractors/Gofile$AccountData;)Lcom/lagradost/cloudstream3/extractors/Gofile$AccountResponse; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/extractors/Gofile$AccountResponse;Lcom/lagradost/cloudstream3/extractors/Gofile$AccountData;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/extractors/Gofile$AccountResponse; + public fun equals (Ljava/lang/Object;)Z + public final fun getData ()Lcom/lagradost/cloudstream3/extractors/Gofile$AccountData; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/Gofile$GofileData { + public fun ()V + public fun (Ljava/util/Map;)V + public synthetic fun (Ljava/util/Map;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/util/Map; + public final fun copy (Ljava/util/Map;)Lcom/lagradost/cloudstream3/extractors/Gofile$GofileData; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/extractors/Gofile$GofileData;Ljava/util/Map;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/extractors/Gofile$GofileData; + public fun equals (Ljava/lang/Object;)Z + public final fun getChildren ()Ljava/util/Map; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/Gofile$GofileFile { + public fun ()V + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Ljava/lang/String; + public final fun component4 ()Ljava/lang/Long; + public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;)Lcom/lagradost/cloudstream3/extractors/Gofile$GofileFile; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/extractors/Gofile$GofileFile;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/extractors/Gofile$GofileFile; + public fun equals (Ljava/lang/Object;)Z + public final fun getLink ()Ljava/lang/String; + public final fun getName ()Ljava/lang/String; + public final fun getSize ()Ljava/lang/Long; + public final fun getType ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/Gofile$GofileResponse { + public fun ()V + public fun (Lcom/lagradost/cloudstream3/extractors/Gofile$GofileData;)V + public synthetic fun (Lcom/lagradost/cloudstream3/extractors/Gofile$GofileData;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Lcom/lagradost/cloudstream3/extractors/Gofile$GofileData; + public final fun copy (Lcom/lagradost/cloudstream3/extractors/Gofile$GofileData;)Lcom/lagradost/cloudstream3/extractors/Gofile$GofileResponse; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/extractors/Gofile$GofileResponse;Lcom/lagradost/cloudstream3/extractors/Gofile$GofileData;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/extractors/Gofile$GofileResponse; + public fun equals (Ljava/lang/Object;)Z + public final fun getData ()Lcom/lagradost/cloudstream3/extractors/Gofile$GofileData; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/GoodstreamExtractor : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public fun setName (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/Guccihide : com/lagradost/cloudstream3/extractors/Filesim { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/Guxhag : com/lagradost/cloudstream3/extractors/VidHidePro { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; +} + +public class com/lagradost/cloudstream3/extractors/HDMomPlayer : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +} + +public final class com/lagradost/cloudstream3/extractors/HDMomPlayer$Track { + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Ljava/lang/String; + public final fun component4 ()Ljava/lang/String; + public final fun component5 ()Ljava/lang/String; + public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lcom/lagradost/cloudstream3/extractors/HDMomPlayer$Track; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/extractors/HDMomPlayer$Track;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/extractors/HDMomPlayer$Track; + public fun equals (Ljava/lang/Object;)Z + public final fun getDefault ()Ljava/lang/String; + public final fun getFile ()Ljava/lang/String; + public final fun getKind ()Ljava/lang/String; + public final fun getLabel ()Ljava/lang/String; + public final fun getLanguage ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public class com/lagradost/cloudstream3/extractors/HDPlayerSystem : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +} + +public final class com/lagradost/cloudstream3/extractors/HDPlayerSystem$SystemResponse { + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Ljava/lang/String; + public final fun component4 ()Ljava/lang/String; + public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lcom/lagradost/cloudstream3/extractors/HDPlayerSystem$SystemResponse; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/extractors/HDPlayerSystem$SystemResponse;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/extractors/HDPlayerSystem$SystemResponse; + public fun equals (Ljava/lang/Object;)Z + public final fun getHls ()Ljava/lang/String; + public final fun getSecuredLink ()Ljava/lang/String; + public final fun getVideoImage ()Ljava/lang/String; + public final fun getVideoSource ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/HDStreamAble : com/lagradost/cloudstream3/extractors/PeaceMakerst { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V + public fun setName (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/Habetar : com/lagradost/cloudstream3/extractors/VidHidePro { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/Haxloppd : com/lagradost/cloudstream3/extractors/VidHidePro { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/Hgcloudto : com/lagradost/cloudstream3/extractors/StreamWishExtractor { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/HglinkTo : com/lagradost/cloudstream3/extractors/CineMMRedirect { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/HgplayCDN : com/lagradost/cloudstream3/extractors/VidHidePro { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/HlsWish : com/lagradost/cloudstream3/extractors/StreamWishExtractor { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/Hotlinger : com/lagradost/cloudstream3/extractors/ContentX { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V + public fun setName (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/HubCloud : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public final fun cleanTitle (Ljava/lang/String;)Ljava/lang/String; + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +} + +public class com/lagradost/cloudstream3/extractors/Hxfile : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRedirect ()Z + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +} + +public class com/lagradost/cloudstream3/extractors/InternetArchive : com/lagradost/cloudstream3/utils/ExtractorApi { + public static final field Companion Lcom/lagradost/cloudstream3/extractors/InternetArchive$Companion; + public fun ()V + public fun getExtractorUrl (Ljava/lang/String;)Ljava/lang/String; + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +} + +public final class com/lagradost/cloudstream3/extractors/InternetArchive$Companion { +} + +public class com/lagradost/cloudstream3/extractors/JWPlayer : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +} + +public class com/lagradost/cloudstream3/extractors/Jeniusplay : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +} + +public final class com/lagradost/cloudstream3/extractors/Jeniusplay$ResponseSource { + public fun (ZLjava/lang/String;Ljava/lang/String;)V + public final fun component1 ()Z + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Ljava/lang/String; + public final fun copy (ZLjava/lang/String;Ljava/lang/String;)Lcom/lagradost/cloudstream3/extractors/Jeniusplay$ResponseSource; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/extractors/Jeniusplay$ResponseSource;ZLjava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/extractors/Jeniusplay$ResponseSource; + public fun equals (Ljava/lang/Object;)Z + public final fun getHls ()Z + public final fun getSecuredLink ()Ljava/lang/String; + public final fun getVideoSource ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/Jodwish : com/lagradost/cloudstream3/extractors/StreamWishExtractor { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/Keephealth : com/lagradost/cloudstream3/extractors/StreamSB { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V + public fun setName (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/KotakAnimeid : com/lagradost/cloudstream3/extractors/Hxfile { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z +} + +public final class com/lagradost/cloudstream3/extractors/Kotakajair : com/lagradost/cloudstream3/extractors/XStreamCdn { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; +} + +public class com/lagradost/cloudstream3/extractors/Krakenfiles : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +} + +public final class com/lagradost/cloudstream3/extractors/Kswplayer : com/lagradost/cloudstream3/extractors/StreamWishExtractor { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/LayarKaca : com/lagradost/cloudstream3/extractors/XStreamCdn { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; +} + +public class com/lagradost/cloudstream3/extractors/Linkbox : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +} + +public final class com/lagradost/cloudstream3/extractors/Linkbox$Data { + public fun ()V + public fun (Lcom/lagradost/cloudstream3/extractors/Linkbox$ItemInfo;Ljava/lang/String;)V + public synthetic fun (Lcom/lagradost/cloudstream3/extractors/Linkbox$ItemInfo;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Lcom/lagradost/cloudstream3/extractors/Linkbox$ItemInfo; + public final fun component2 ()Ljava/lang/String; + public final fun copy (Lcom/lagradost/cloudstream3/extractors/Linkbox$ItemInfo;Ljava/lang/String;)Lcom/lagradost/cloudstream3/extractors/Linkbox$Data; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/extractors/Linkbox$Data;Lcom/lagradost/cloudstream3/extractors/Linkbox$ItemInfo;Ljava/lang/String;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/extractors/Linkbox$Data; + public fun equals (Ljava/lang/Object;)Z + public final fun getItemId ()Ljava/lang/String; + public final fun getItemInfo ()Lcom/lagradost/cloudstream3/extractors/Linkbox$ItemInfo; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/Linkbox$ItemInfo { + public fun ()V + public fun (Ljava/util/ArrayList;)V + public synthetic fun (Ljava/util/ArrayList;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/util/ArrayList; + public final fun copy (Ljava/util/ArrayList;)Lcom/lagradost/cloudstream3/extractors/Linkbox$ItemInfo; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/extractors/Linkbox$ItemInfo;Ljava/util/ArrayList;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/extractors/Linkbox$ItemInfo; + public fun equals (Ljava/lang/Object;)Z + public final fun getResolutionList ()Ljava/util/ArrayList; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/Linkbox$Resolutions { + public fun ()V + public fun (Ljava/lang/String;Ljava/lang/String;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun copy (Ljava/lang/String;Ljava/lang/String;)Lcom/lagradost/cloudstream3/extractors/Linkbox$Resolutions; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/extractors/Linkbox$Resolutions;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/extractors/Linkbox$Resolutions; + public fun equals (Ljava/lang/Object;)Z + public final fun getResolution ()Ljava/lang/String; + public final fun getUrl ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/Linkbox$Responses { + public fun ()V + public fun (Lcom/lagradost/cloudstream3/extractors/Linkbox$Data;)V + public synthetic fun (Lcom/lagradost/cloudstream3/extractors/Linkbox$Data;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Lcom/lagradost/cloudstream3/extractors/Linkbox$Data; + public final fun copy (Lcom/lagradost/cloudstream3/extractors/Linkbox$Data;)Lcom/lagradost/cloudstream3/extractors/Linkbox$Responses; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/extractors/Linkbox$Responses;Lcom/lagradost/cloudstream3/extractors/Linkbox$Data;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/extractors/Linkbox$Responses; + public fun equals (Ljava/lang/Object;)Z + public final fun getData ()Lcom/lagradost/cloudstream3/extractors/Linkbox$Data; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public class com/lagradost/cloudstream3/extractors/LuluStream : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +} + +public final class com/lagradost/cloudstream3/extractors/Lulustream1 : com/lagradost/cloudstream3/extractors/LuluStream { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/Lulustream2 : com/lagradost/cloudstream3/extractors/LuluStream { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/Luluvdoo : com/lagradost/cloudstream3/extractors/LuluStream { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/Luxubu : com/lagradost/cloudstream3/extractors/XStreamCdn { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/Lvturbo : com/lagradost/cloudstream3/extractors/StreamSB { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V + public fun setName (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/M3u8Manifest { + public static final field INSTANCE Lcom/lagradost/cloudstream3/extractors/M3u8Manifest; + public final fun extractLinks (Ljava/lang/String;)Ljava/util/ArrayList; +} + +public class com/lagradost/cloudstream3/extractors/MailRu : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +} + +public final class com/lagradost/cloudstream3/extractors/MailRu$MailRuData { + public fun (Ljava/lang/String;Ljava/util/List;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/util/List; + public final fun copy (Ljava/lang/String;Ljava/util/List;)Lcom/lagradost/cloudstream3/extractors/MailRu$MailRuData; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/extractors/MailRu$MailRuData;Ljava/lang/String;Ljava/util/List;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/extractors/MailRu$MailRuData; + public fun equals (Ljava/lang/Object;)Z + public final fun getProvider ()Ljava/lang/String; + public final fun getVideos ()Ljava/util/List; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/MailRu$MailRuVideoData { + public fun (Ljava/lang/String;Ljava/lang/String;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun copy (Ljava/lang/String;Ljava/lang/String;)Lcom/lagradost/cloudstream3/extractors/MailRu$MailRuVideoData; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/extractors/MailRu$MailRuVideoData;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/extractors/MailRu$MailRuVideoData; + public fun equals (Ljava/lang/Object;)Z + public final fun getKey ()Ljava/lang/String; + public final fun getUrl ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public class com/lagradost/cloudstream3/extractors/Maxstream : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public fun setMainUrl (Ljava/lang/String;)V + public fun setName (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/Mdy : com/lagradost/cloudstream3/extractors/MixDrop { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V +} + +public class com/lagradost/cloudstream3/extractors/Mediafire : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +} + +public final class com/lagradost/cloudstream3/extractors/Megacloud : com/lagradost/cloudstream3/extractors/Rabbitstream { + public fun ()V + public fun extractRealKey (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public fun getEmbed ()Ljava/lang/String; + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/Meownime : com/lagradost/cloudstream3/extractors/JWPlayer { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/MetaGnathTuggers : com/lagradost/cloudstream3/extractors/Voe { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; +} + +public class com/lagradost/cloudstream3/extractors/MixDrop : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public fun getExtractorUrl (Ljava/lang/String;)Ljava/lang/String; + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public fun setMainUrl (Ljava/lang/String;)V + public fun setName (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/MixDropAg : com/lagradost/cloudstream3/extractors/MixDrop { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/MixDropBz : com/lagradost/cloudstream3/extractors/MixDrop { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/MixDropCh : com/lagradost/cloudstream3/extractors/MixDrop { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/MixDropPs : com/lagradost/cloudstream3/extractors/MixDrop { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/MixDropSi : com/lagradost/cloudstream3/extractors/MixDrop { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/MixDropTo : com/lagradost/cloudstream3/extractors/MixDrop { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/Movhide : com/lagradost/cloudstream3/extractors/Filesim { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V + public fun setName (Ljava/lang/String;)V +} + +public class com/lagradost/cloudstream3/extractors/Moviehab : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public fun setMainUrl (Ljava/lang/String;)V + public fun setName (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/MoviehabNet : com/lagradost/cloudstream3/extractors/Moviehab { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/Moviesm4u : com/lagradost/cloudstream3/extractors/Filesim { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; +} + +public class com/lagradost/cloudstream3/extractors/Mp4Upload : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public fun setMainUrl (Ljava/lang/String;)V + public fun setName (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/Multimovies : com/lagradost/cloudstream3/extractors/StreamWishExtractor { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/Multimoviesshg : com/lagradost/cloudstream3/extractors/Filesim { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V +} + +public class com/lagradost/cloudstream3/extractors/Mvidoo : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +} + +public final class com/lagradost/cloudstream3/extractors/Mwish : com/lagradost/cloudstream3/extractors/StreamWishExtractor { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/MxDropTo : com/lagradost/cloudstream3/extractors/MixDrop { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/MyVidPlay : com/lagradost/cloudstream3/extractors/DoodLaExtractor { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/NathanFromSubject : com/lagradost/cloudstream3/extractors/Voe { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/Nekostream : com/lagradost/cloudstream3/extractors/StreamWishExtractor { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/Nekowish : com/lagradost/cloudstream3/extractors/StreamWishExtractor { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/Neonime7n : com/lagradost/cloudstream3/extractors/Hxfile { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRedirect ()Z +} + +public final class com/lagradost/cloudstream3/extractors/Neonime8n : com/lagradost/cloudstream3/extractors/Hxfile { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRedirect ()Z +} + +public final class com/lagradost/cloudstream3/extractors/Obeywish : com/lagradost/cloudstream3/extractors/StreamWishExtractor { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; +} + +public class com/lagradost/cloudstream3/extractors/Odnoklassniki : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +} + +public final class com/lagradost/cloudstream3/extractors/Odnoklassniki$OkRuVideo { + public fun (Ljava/lang/String;Ljava/lang/String;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun copy (Ljava/lang/String;Ljava/lang/String;)Lcom/lagradost/cloudstream3/extractors/Odnoklassniki$OkRuVideo; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/extractors/Odnoklassniki$OkRuVideo;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/extractors/Odnoklassniki$OkRuVideo; + public fun equals (Ljava/lang/Object;)Z + public final fun getName ()Ljava/lang/String; + public final fun getUrl ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public class com/lagradost/cloudstream3/extractors/OkRuHTTP : com/lagradost/cloudstream3/extractors/Odnoklassniki { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V + public fun setName (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/OkRuHTTPMobile : com/lagradost/cloudstream3/extractors/OkRuHTTP { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V +} + +public class com/lagradost/cloudstream3/extractors/OkRuSSL : com/lagradost/cloudstream3/extractors/Odnoklassniki { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V + public fun setName (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/OkRuSSLMobile : com/lagradost/cloudstream3/extractors/OkRuSSL { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V +} + +public class com/lagradost/cloudstream3/extractors/PeaceMakerst : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +} + +public final class com/lagradost/cloudstream3/extractors/PeaceMakerst$PeaceResponse { + public fun (Ljava/lang/String;Ljava/util/List;Ljava/lang/String;Ljava/util/Map;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/util/List; + public final fun component3 ()Ljava/lang/String; + public final fun component4 ()Ljava/util/Map; + public final fun copy (Ljava/lang/String;Ljava/util/List;Ljava/lang/String;Ljava/util/Map;)Lcom/lagradost/cloudstream3/extractors/PeaceMakerst$PeaceResponse; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/extractors/PeaceMakerst$PeaceResponse;Ljava/lang/String;Ljava/util/List;Ljava/lang/String;Ljava/util/Map;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/extractors/PeaceMakerst$PeaceResponse; + public fun equals (Ljava/lang/Object;)Z + public final fun getSIndex ()Ljava/lang/String; + public final fun getSourceList ()Ljava/util/Map; + public final fun getVideoImage ()Ljava/lang/String; + public final fun getVideoSources ()Ljava/util/List; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/PeaceMakerst$Teve2ApiResponse { + public fun (Lcom/lagradost/cloudstream3/extractors/PeaceMakerst$Teve2Media;)V + public final fun component1 ()Lcom/lagradost/cloudstream3/extractors/PeaceMakerst$Teve2Media; + public final fun copy (Lcom/lagradost/cloudstream3/extractors/PeaceMakerst$Teve2Media;)Lcom/lagradost/cloudstream3/extractors/PeaceMakerst$Teve2ApiResponse; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/extractors/PeaceMakerst$Teve2ApiResponse;Lcom/lagradost/cloudstream3/extractors/PeaceMakerst$Teve2Media;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/extractors/PeaceMakerst$Teve2ApiResponse; + public fun equals (Ljava/lang/Object;)Z + public final fun getMedia ()Lcom/lagradost/cloudstream3/extractors/PeaceMakerst$Teve2Media; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/PeaceMakerst$Teve2Link { + public fun (Ljava/lang/String;Ljava/lang/String;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun copy (Ljava/lang/String;Ljava/lang/String;)Lcom/lagradost/cloudstream3/extractors/PeaceMakerst$Teve2Link; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/extractors/PeaceMakerst$Teve2Link;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/extractors/PeaceMakerst$Teve2Link; + public fun equals (Ljava/lang/Object;)Z + public final fun getSecurePath ()Ljava/lang/String; + public final fun getServiceUrl ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/PeaceMakerst$Teve2Media { + public fun (Lcom/lagradost/cloudstream3/extractors/PeaceMakerst$Teve2Link;)V + public final fun component1 ()Lcom/lagradost/cloudstream3/extractors/PeaceMakerst$Teve2Link; + public final fun copy (Lcom/lagradost/cloudstream3/extractors/PeaceMakerst$Teve2Link;)Lcom/lagradost/cloudstream3/extractors/PeaceMakerst$Teve2Media; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/extractors/PeaceMakerst$Teve2Media;Lcom/lagradost/cloudstream3/extractors/PeaceMakerst$Teve2Link;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/extractors/PeaceMakerst$Teve2Media; + public fun equals (Ljava/lang/Object;)Z + public final fun getLink ()Lcom/lagradost/cloudstream3/extractors/PeaceMakerst$Teve2Link; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/PeaceMakerst$VideoSource { + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Ljava/lang/String; + public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lcom/lagradost/cloudstream3/extractors/PeaceMakerst$VideoSource; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/extractors/PeaceMakerst$VideoSource;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/extractors/PeaceMakerst$VideoSource; + public fun equals (Ljava/lang/Object;)Z + public final fun getFile ()Ljava/lang/String; + public final fun getLabel ()Ljava/lang/String; + public final fun getType ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/Peytonepre : com/lagradost/cloudstream3/extractors/VidHidePro { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V + public fun setName (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/Pichive : com/lagradost/cloudstream3/extractors/ContentX { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V + public fun setName (Ljava/lang/String;)V +} + +public class com/lagradost/cloudstream3/extractors/PixelDrain : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +} + +public final class com/lagradost/cloudstream3/extractors/PixelDrainDev : com/lagradost/cloudstream3/extractors/PixelDrain { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V +} + +public class com/lagradost/cloudstream3/extractors/PlayLtXyz : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +} + +public final class com/lagradost/cloudstream3/extractors/PlayRu : com/lagradost/cloudstream3/extractors/ContentX { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V + public fun setName (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/Playback { + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Ljava/lang/String;Lcom/lagradost/cloudstream3/extractors/DecryptKeys;Ljava/lang/String;Ljava/lang/String;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Ljava/lang/String; + public final fun component4 ()Ljava/util/List; + public final fun component5 ()Ljava/lang/String; + public final fun component6 ()Lcom/lagradost/cloudstream3/extractors/DecryptKeys; + public final fun component7 ()Ljava/lang/String; + public final fun component8 ()Ljava/lang/String; + public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Ljava/lang/String;Lcom/lagradost/cloudstream3/extractors/DecryptKeys;Ljava/lang/String;Ljava/lang/String;)Lcom/lagradost/cloudstream3/extractors/Playback; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/extractors/Playback;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Ljava/lang/String;Lcom/lagradost/cloudstream3/extractors/DecryptKeys;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/extractors/Playback; + public fun equals (Ljava/lang/Object;)Z + public final fun getAlgorithm ()Ljava/lang/String; + public final fun getDecryptKeys ()Lcom/lagradost/cloudstream3/extractors/DecryptKeys; + public final fun getExpiresAt ()Ljava/lang/String; + public final fun getIv ()Ljava/lang/String; + public final fun getIv2 ()Ljava/lang/String; + public final fun getKeyParts ()Ljava/util/List; + public final fun getPayload ()Ljava/lang/String; + public final fun getPayload2 ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/PlaybackDecrypt { + public fun (Ljava/util/List;)V + public final fun component1 ()Ljava/util/List; + public final fun copy (Ljava/util/List;)Lcom/lagradost/cloudstream3/extractors/PlaybackDecrypt; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/extractors/PlaybackDecrypt;Ljava/util/List;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/extractors/PlaybackDecrypt; + public fun equals (Ljava/lang/Object;)Z + public final fun getSources ()Ljava/util/List; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/PlaybackDecryptSource { + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;JLjava/lang/Object;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Ljava/lang/String; + public final fun component4 ()Ljava/lang/String; + public final fun component5 ()J + public final fun component6 ()Ljava/lang/Object; + public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;JLjava/lang/Object;)Lcom/lagradost/cloudstream3/extractors/PlaybackDecryptSource; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/extractors/PlaybackDecryptSource;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;JLjava/lang/Object;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/extractors/PlaybackDecryptSource; + public fun equals (Ljava/lang/Object;)Z + public final fun getBitrateKbps ()J + public final fun getHeight ()Ljava/lang/Object; + public final fun getLabel ()Ljava/lang/String; + public final fun getMimeType ()Ljava/lang/String; + public final fun getQuality ()Ljava/lang/String; + public final fun getUrl ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/PlaybackRoot { + public fun (Lcom/lagradost/cloudstream3/extractors/Playback;)V + public final fun component1 ()Lcom/lagradost/cloudstream3/extractors/Playback; + public final fun copy (Lcom/lagradost/cloudstream3/extractors/Playback;)Lcom/lagradost/cloudstream3/extractors/PlaybackRoot; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/extractors/PlaybackRoot;Lcom/lagradost/cloudstream3/extractors/Playback;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/extractors/PlaybackRoot; + public fun equals (Ljava/lang/Object;)Z + public final fun getPlayback ()Lcom/lagradost/cloudstream3/extractors/Playback; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public class com/lagradost/cloudstream3/extractors/PlayerVoxzer : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public fun setMainUrl (Ljava/lang/String;)V + public fun setName (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/Playerwish : com/lagradost/cloudstream3/extractors/StreamWishExtractor { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/Playmogo : com/lagradost/cloudstream3/extractors/DoodLaExtractor { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V +} + +public class com/lagradost/cloudstream3/extractors/Rabbitstream : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public fun extractRealKey (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public fun getEmbed ()Ljava/lang/String; + public fun getKey ()Ljava/lang/String; + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +} + +public final class com/lagradost/cloudstream3/extractors/Rabbitstream$Sources { + public fun ()V + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Ljava/lang/String; + public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lcom/lagradost/cloudstream3/extractors/Rabbitstream$Sources; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/extractors/Rabbitstream$Sources;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/extractors/Rabbitstream$Sources; + public fun equals (Ljava/lang/Object;)Z + public final fun getFile ()Ljava/lang/String; + public final fun getLabel ()Ljava/lang/String; + public final fun getType ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/Rabbitstream$SourcesEncrypted { + public fun ()V + public fun (Ljava/lang/String;Ljava/lang/Boolean;Ljava/util/List;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/Boolean;Ljava/util/List;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/Boolean; + public final fun component3 ()Ljava/util/List; + public final fun copy (Ljava/lang/String;Ljava/lang/Boolean;Ljava/util/List;)Lcom/lagradost/cloudstream3/extractors/Rabbitstream$SourcesEncrypted; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/extractors/Rabbitstream$SourcesEncrypted;Ljava/lang/String;Ljava/lang/Boolean;Ljava/util/List;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/extractors/Rabbitstream$SourcesEncrypted; + public fun equals (Ljava/lang/Object;)Z + public final fun getEncrypted ()Ljava/lang/Boolean; + public final fun getSources ()Ljava/lang/String; + public final fun getTracks ()Ljava/util/List; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/Rabbitstream$SourcesResponses { + public fun ()V + public fun (Ljava/util/List;Ljava/util/List;)V + public synthetic fun (Ljava/util/List;Ljava/util/List;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/util/List; + public final fun component2 ()Ljava/util/List; + public final fun copy (Ljava/util/List;Ljava/util/List;)Lcom/lagradost/cloudstream3/extractors/Rabbitstream$SourcesResponses; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/extractors/Rabbitstream$SourcesResponses;Ljava/util/List;Ljava/util/List;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/extractors/Rabbitstream$SourcesResponses; + public fun equals (Ljava/lang/Object;)Z + public final fun getSources ()Ljava/util/List; + public final fun getTracks ()Ljava/util/List; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/Rabbitstream$Tracks { + public fun ()V + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Ljava/lang/String; + public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lcom/lagradost/cloudstream3/extractors/Rabbitstream$Tracks; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/extractors/Rabbitstream$Tracks;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/extractors/Rabbitstream$Tracks; + public fun equals (Ljava/lang/Object;)Z + public final fun getFile ()Ljava/lang/String; + public final fun getKind ()Ljava/lang/String; + public final fun getLabel ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public class com/lagradost/cloudstream3/extractors/RapidVid : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +} + +public final class com/lagradost/cloudstream3/extractors/Rasacintaku : com/lagradost/cloudstream3/extractors/XStreamCdn { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/Ryderjet : com/lagradost/cloudstream3/extractors/VidHidePro { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V +} + +public class com/lagradost/cloudstream3/extractors/SBPlay : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public fun setMainUrl (Ljava/lang/String;)V + public fun setName (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/SBfull : com/lagradost/cloudstream3/extractors/StreamSB { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/Sbasian : com/lagradost/cloudstream3/extractors/StreamSB { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V + public fun setName (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/Sbface : com/lagradost/cloudstream3/extractors/StreamSB { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V + public fun setName (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/Sbflix : com/lagradost/cloudstream3/extractors/StreamSB { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V + public fun setName (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/Sblona : com/lagradost/cloudstream3/extractors/StreamSB { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V + public fun setName (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/Sblongvu : com/lagradost/cloudstream3/extractors/StreamSB { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/Sbnet : com/lagradost/cloudstream3/extractors/StreamSB { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V + public fun setName (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/Sbrapid : com/lagradost/cloudstream3/extractors/StreamSB { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V + public fun setName (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/Sbsonic : com/lagradost/cloudstream3/extractors/StreamSB { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V + public fun setName (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/Sbspeed : com/lagradost/cloudstream3/extractors/StreamSB { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V + public fun setName (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/Sbthe : com/lagradost/cloudstream3/extractors/StreamSB { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V +} + +public class com/lagradost/cloudstream3/extractors/SecvideoOnline : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +} + +public class com/lagradost/cloudstream3/extractors/Sendvid : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public fun setName (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/Server1uns : com/lagradost/cloudstream3/extractors/VidStack { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun setMainUrl (Ljava/lang/String;)V + public fun setName (Ljava/lang/String;)V + public fun setRequiresReferer (Z)V +} + +public final class com/lagradost/cloudstream3/extractors/SfastwishCom : com/lagradost/cloudstream3/extractors/StreamWishExtractor { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/ShaveTape : com/lagradost/cloudstream3/extractors/StreamTape { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V +} + +public class com/lagradost/cloudstream3/extractors/SibNet : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +} + +public final class com/lagradost/cloudstream3/extractors/Simpulumlamerop : com/lagradost/cloudstream3/extractors/Voe { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V +} + +public class com/lagradost/cloudstream3/extractors/Slmaxed : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public final fun getEmbedRegex ()Lkotlin/text/Regex; + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +} + +public final class com/lagradost/cloudstream3/extractors/Slmaxed$JsonResponse { + public fun ()V + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/Map;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/Map;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Ljava/lang/String; + public final fun component4 ()Ljava/lang/String; + public final fun component5 ()Ljava/util/Map; + public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/Map;)Lcom/lagradost/cloudstream3/extractors/Slmaxed$JsonResponse; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/extractors/Slmaxed$JsonResponse;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/Map;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/extractors/Slmaxed$JsonResponse; + public fun equals (Ljava/lang/Object;)Z + public final fun getMessage ()Ljava/lang/String; + public final fun getResult ()Ljava/util/Map; + public final fun getStatus ()Ljava/lang/String; + public final fun getToken ()Ljava/lang/String; + public final fun getType ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/Slmaxed$Result { + public fun ()V + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Ljava/lang/String; + public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lcom/lagradost/cloudstream3/extractors/Slmaxed$Result; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/extractors/Slmaxed$Result;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/extractors/Slmaxed$Result; + public fun equals (Ljava/lang/Object;)Z + public final fun getFile ()Ljava/lang/String; + public final fun getLabel ()Ljava/lang/String; + public final fun getType ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/Smoothpre : com/lagradost/cloudstream3/extractors/VidHidePro { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V + public fun setName (Ljava/lang/String;)V +} + +public class com/lagradost/cloudstream3/extractors/Sobreatsesuyp : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +} + +public final class com/lagradost/cloudstream3/extractors/Sobreatsesuyp$SobreatsesuypVideoData { + public fun ()V + public fun (Ljava/lang/String;Ljava/lang/String;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun copy (Ljava/lang/String;Ljava/lang/String;)Lcom/lagradost/cloudstream3/extractors/Sobreatsesuyp$SobreatsesuypVideoData; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/extractors/Sobreatsesuyp$SobreatsesuypVideoData;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/extractors/Sobreatsesuyp$SobreatsesuypVideoData; + public fun equals (Ljava/lang/Object;)Z + public final fun getFile ()Ljava/lang/String; + public final fun getTitle ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/Ssbstream : com/lagradost/cloudstream3/extractors/StreamSB { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V +} + +public class com/lagradost/cloudstream3/extractors/StreamEmbed : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public fun setMainUrl (Ljava/lang/String;)V + public fun setName (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/StreamHLS : com/lagradost/cloudstream3/extractors/StreamWishExtractor { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/StreamM4u : com/lagradost/cloudstream3/extractors/XStreamCdn { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; +} + +public class com/lagradost/cloudstream3/extractors/StreamSB : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public fun setMainUrl (Ljava/lang/String;)V + public fun setName (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/StreamSB$Main { + public fun (Lcom/lagradost/cloudstream3/extractors/StreamSB$StreamData;I)V + public final fun component1 ()Lcom/lagradost/cloudstream3/extractors/StreamSB$StreamData; + public final fun component2 ()I + public final fun copy (Lcom/lagradost/cloudstream3/extractors/StreamSB$StreamData;I)Lcom/lagradost/cloudstream3/extractors/StreamSB$Main; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/extractors/StreamSB$Main;Lcom/lagradost/cloudstream3/extractors/StreamSB$StreamData;IILjava/lang/Object;)Lcom/lagradost/cloudstream3/extractors/StreamSB$Main; + public fun equals (Ljava/lang/Object;)Z + public final fun getStatusCode ()I + public final fun getStreamData ()Lcom/lagradost/cloudstream3/extractors/StreamSB$StreamData; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/StreamSB$StreamData { + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/ArrayList;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/ArrayList;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Ljava/lang/String; + public final fun component4 ()Ljava/util/ArrayList; + public final fun component5 ()Ljava/lang/String; + public final fun component6 ()Ljava/lang/String; + public final fun component7 ()Ljava/lang/String; + public final fun component8 ()Ljava/lang/String; + public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/ArrayList;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lcom/lagradost/cloudstream3/extractors/StreamSB$StreamData; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/extractors/StreamSB$StreamData;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/ArrayList;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/extractors/StreamSB$StreamData; + public fun equals (Ljava/lang/Object;)Z + public final fun getBackup ()Ljava/lang/String; + public final fun getCdnImg ()Ljava/lang/String; + public final fun getFile ()Ljava/lang/String; + public final fun getHash ()Ljava/lang/String; + public final fun getId ()Ljava/lang/String; + public final fun getLength ()Ljava/lang/String; + public final fun getSubs ()Ljava/util/ArrayList; + public final fun getTitle ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/StreamSB$Subs { + public fun ()V + public fun (Ljava/lang/String;Ljava/lang/String;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun copy (Ljava/lang/String;Ljava/lang/String;)Lcom/lagradost/cloudstream3/extractors/StreamSB$Subs; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/extractors/StreamSB$Subs;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/extractors/StreamSB$Subs; + public fun equals (Ljava/lang/Object;)Z + public final fun getFile ()Ljava/lang/String; + public final fun getLabel ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/StreamSB1 : com/lagradost/cloudstream3/extractors/StreamSB { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/StreamSB10 : com/lagradost/cloudstream3/extractors/StreamSB { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/StreamSB11 : com/lagradost/cloudstream3/extractors/StreamSB { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/StreamSB2 : com/lagradost/cloudstream3/extractors/StreamSB { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/StreamSB3 : com/lagradost/cloudstream3/extractors/StreamSB { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/StreamSB4 : com/lagradost/cloudstream3/extractors/StreamSB { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/StreamSB5 : com/lagradost/cloudstream3/extractors/StreamSB { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/StreamSB6 : com/lagradost/cloudstream3/extractors/StreamSB { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/StreamSB7 : com/lagradost/cloudstream3/extractors/StreamSB { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/StreamSB8 : com/lagradost/cloudstream3/extractors/StreamSB { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/StreamSB9 : com/lagradost/cloudstream3/extractors/StreamSB { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V +} + +public class com/lagradost/cloudstream3/extractors/StreamSilk : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +} + +public class com/lagradost/cloudstream3/extractors/StreamTape : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public fun setMainUrl (Ljava/lang/String;)V + public fun setName (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/StreamTapeNet : com/lagradost/cloudstream3/extractors/StreamTape { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/StreamTapeXyz : com/lagradost/cloudstream3/extractors/StreamTape { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V +} + +public class com/lagradost/cloudstream3/extractors/StreamWishExtractor : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +} + +public class com/lagradost/cloudstream3/extractors/Streamcash : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public fun getCdnUrl ()Ljava/lang/String; + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +} + +public final class com/lagradost/cloudstream3/extractors/StreamhideCom : com/lagradost/cloudstream3/extractors/Filesim { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V + public fun setName (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/StreamhideTo : com/lagradost/cloudstream3/extractors/Filesim { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; +} + +public class com/lagradost/cloudstream3/extractors/Streamhub : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public fun getExtractorUrl (Ljava/lang/String;)Ljava/lang/String; + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public fun setMainUrl (Ljava/lang/String;)V + public fun setName (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/Streamhub2 : com/lagradost/cloudstream3/extractors/ZplayerV2 { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V + public fun setName (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/Streamlare : com/lagradost/cloudstream3/extractors/Slmaxed { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; +} + +public class com/lagradost/cloudstream3/extractors/StreamoUpload : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +} + +public class com/lagradost/cloudstream3/extractors/Streamplay : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +} + +public final class com/lagradost/cloudstream3/extractors/Streamplay$Source { + public fun ()V + public fun (Ljava/lang/String;Ljava/lang/String;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun copy (Ljava/lang/String;Ljava/lang/String;)Lcom/lagradost/cloudstream3/extractors/Streamplay$Source; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/extractors/Streamplay$Source;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/extractors/Streamplay$Source; + public fun equals (Ljava/lang/Object;)Z + public final fun getFile ()Ljava/lang/String; + public final fun getLabel ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/Streamsss : com/lagradost/cloudstream3/extractors/StreamSB { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/Streamwish2 : com/lagradost/cloudstream3/extractors/StreamWishExtractor { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/Strwish : com/lagradost/cloudstream3/extractors/StreamWishExtractor { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/Strwish2 : com/lagradost/cloudstream3/extractors/StreamWishExtractor { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; +} + +public class com/lagradost/cloudstream3/extractors/Supervideo : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public fun setMainUrl (Ljava/lang/String;)V + public fun setName (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/Swdyu : com/lagradost/cloudstream3/extractors/StreamWishExtractor { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/Swhoi : com/lagradost/cloudstream3/extractors/StreamWishExtractor { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; +} + +public class com/lagradost/cloudstream3/extractors/TRsTX : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +} + +public final class com/lagradost/cloudstream3/extractors/TRsTX$TrstxVideoData { + public fun ()V + public fun (Ljava/lang/String;Ljava/lang/String;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun copy (Ljava/lang/String;Ljava/lang/String;)Lcom/lagradost/cloudstream3/extractors/TRsTX$TrstxVideoData; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/extractors/TRsTX$TrstxVideoData;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/extractors/TRsTX$TrstxVideoData; + public fun equals (Ljava/lang/Object;)Z + public final fun getFile ()Ljava/lang/String; + public final fun getTitle ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public class com/lagradost/cloudstream3/extractors/Tantifilm : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public fun setMainUrl (Ljava/lang/String;)V + public fun setName (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/Tantifilm$TantifilmData { + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Ljava/lang/String; + public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lcom/lagradost/cloudstream3/extractors/Tantifilm$TantifilmData; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/extractors/Tantifilm$TantifilmData;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/extractors/Tantifilm$TantifilmData; + public fun equals (Ljava/lang/Object;)Z + public final fun getFile ()Ljava/lang/String; + public final fun getLabel ()Ljava/lang/String; + public final fun getType ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/Tantifilm$TantifilmJsonData { + public fun (ZLjava/util/List;Ljava/util/List;Z)V + public final fun component1 ()Z + public final fun component2 ()Ljava/util/List; + public final fun component3 ()Ljava/util/List; + public final fun component4 ()Z + public final fun copy (ZLjava/util/List;Ljava/util/List;Z)Lcom/lagradost/cloudstream3/extractors/Tantifilm$TantifilmJsonData; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/extractors/Tantifilm$TantifilmJsonData;ZLjava/util/List;Ljava/util/List;ZILjava/lang/Object;)Lcom/lagradost/cloudstream3/extractors/Tantifilm$TantifilmJsonData; + public fun equals (Ljava/lang/Object;)Z + public final fun getCaptions ()Ljava/util/List; + public final fun getData ()Ljava/util/List; + public final fun getSuccess ()Z + public fun hashCode ()I + public final fun is_vr ()Z + public fun toString ()Ljava/lang/String; +} + +public class com/lagradost/cloudstream3/extractors/TauVideo : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +} + +public final class com/lagradost/cloudstream3/extractors/TauVideo$TauVideoData { + public fun (Ljava/lang/String;Ljava/lang/String;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun copy (Ljava/lang/String;Ljava/lang/String;)Lcom/lagradost/cloudstream3/extractors/TauVideo$TauVideoData; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/extractors/TauVideo$TauVideoData;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/extractors/TauVideo$TauVideoData; + public fun equals (Ljava/lang/Object;)Z + public final fun getLabel ()Ljava/lang/String; + public final fun getUrl ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/TauVideo$TauVideoUrls { + public fun (Ljava/util/List;)V + public final fun component1 ()Ljava/util/List; + public final fun copy (Ljava/util/List;)Lcom/lagradost/cloudstream3/extractors/TauVideo$TauVideoUrls; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/extractors/TauVideo$TauVideoUrls;Ljava/util/List;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/extractors/TauVideo$TauVideoUrls; + public fun equals (Ljava/lang/Object;)Z + public final fun getUrls ()Ljava/util/List; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/Techinmind : com/lagradost/cloudstream3/extractors/GDMirrorbot { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun setMainUrl (Ljava/lang/String;)V + public fun setName (Ljava/lang/String;)V + public fun setRequiresReferer (Z)V +} + +public final class com/lagradost/cloudstream3/extractors/Tubeless : com/lagradost/cloudstream3/extractors/Voe { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/Uasopt : com/lagradost/cloudstream3/extractors/VidHidePro { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/Up4FunTop : com/lagradost/cloudstream3/extractors/Up4Stream { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V +} + +public class com/lagradost/cloudstream3/extractors/Up4Stream : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public fun setMainUrl (Ljava/lang/String;)V + public fun setName (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/Upstream : com/lagradost/cloudstream3/extractors/ZplayerV2 { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V + public fun setName (Ljava/lang/String;)V +} + +public class com/lagradost/cloudstream3/extractors/UpstreamExtractor : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +} + +public class com/lagradost/cloudstream3/extractors/Uqload : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public fun setMainUrl (Ljava/lang/String;)V + public fun setName (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/Uqload1 : com/lagradost/cloudstream3/extractors/Uqload { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/Uqload2 : com/lagradost/cloudstream3/extractors/Uqload { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/Uqloadbz : com/lagradost/cloudstream3/extractors/Uqload { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/Uqloadcx : com/lagradost/cloudstream3/extractors/Uqload { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/UqloadsXyz : com/lagradost/cloudstream3/extractors/StreamWishExtractor { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/Urochsunloath : com/lagradost/cloudstream3/extractors/Voe { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V +} + +public class com/lagradost/cloudstream3/extractors/Userload : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public fun setMainUrl (Ljava/lang/String;)V + public fun setName (Ljava/lang/String;)V +} + +public class com/lagradost/cloudstream3/extractors/Userscloud : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +} + +public class com/lagradost/cloudstream3/extractors/Uservideo : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +} + +public final class com/lagradost/cloudstream3/extractors/Uservideo$Sources { + public fun ()V + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Ljava/lang/String; + public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lcom/lagradost/cloudstream3/extractors/Uservideo$Sources; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/extractors/Uservideo$Sources;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/extractors/Uservideo$Sources; + public fun equals (Ljava/lang/Object;)Z + public final fun getLabel ()Ljava/lang/String; + public final fun getSrc ()Ljava/lang/String; + public final fun getType ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public class com/lagradost/cloudstream3/extractors/Vicloud : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +} + +public final class com/lagradost/cloudstream3/extractors/VidHideHub : com/lagradost/cloudstream3/extractors/VidHidePro { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V +} + +public class com/lagradost/cloudstream3/extractors/VidHidePro : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +} + +public final class com/lagradost/cloudstream3/extractors/VidHidePro1 : com/lagradost/cloudstream3/extractors/VidHidePro { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/VidHidePro2 : com/lagradost/cloudstream3/extractors/VidHidePro { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/VidHidePro3 : com/lagradost/cloudstream3/extractors/VidHidePro { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/VidHidePro4 : com/lagradost/cloudstream3/extractors/VidHidePro { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/VidHidePro5 : com/lagradost/cloudstream3/extractors/VidHidePro { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/VidHidePro6 : com/lagradost/cloudstream3/extractors/VidHidePro { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; +} + +public class com/lagradost/cloudstream3/extractors/VidMoxy : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +} + +public final class com/lagradost/cloudstream3/extractors/VidNest : com/lagradost/cloudstream3/extractors/JWPlayer { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V + public fun setName (Ljava/lang/String;)V +} + +public class com/lagradost/cloudstream3/extractors/VidStack : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public fun setMainUrl (Ljava/lang/String;)V + public fun setName (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/VidaaraxCom : com/lagradost/cloudstream3/extractors/Vidara { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/VidaaraxNet : com/lagradost/cloudstream3/extractors/Vidara { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; +} + +public class com/lagradost/cloudstream3/extractors/Vidara : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +} + +public final class com/lagradost/cloudstream3/extractors/VidaraSo : com/lagradost/cloudstream3/extractors/Vidara { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/Vidaraa : com/lagradost/cloudstream3/extractors/Vidara { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/Vidaratem : com/lagradost/cloudstream3/extractors/Vidara { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/Vidaraw : com/lagradost/cloudstream3/extractors/Vidara { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/Vidarax : com/lagradost/cloudstream3/extractors/Vidara { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/Vidavaca : com/lagradost/cloudstream3/extractors/Vidara { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/Vide0Net : com/lagradost/cloudstream3/extractors/DoodLaExtractor { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/Videa : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +} + +public class com/lagradost/cloudstream3/extractors/VideoSeyred : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +} + +public final class com/lagradost/cloudstream3/extractors/VideoSeyred$VSSource { + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Ljava/lang/String; + public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lcom/lagradost/cloudstream3/extractors/VideoSeyred$VSSource; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/extractors/VideoSeyred$VSSource;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/extractors/VideoSeyred$VSSource; + public fun equals (Ljava/lang/Object;)Z + public final fun getDefault ()Ljava/lang/String; + public final fun getFile ()Ljava/lang/String; + public final fun getType ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/VideoSeyred$VSTrack { + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Ljava/lang/String; + public final fun component4 ()Ljava/lang/String; + public final fun component5 ()Ljava/lang/String; + public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lcom/lagradost/cloudstream3/extractors/VideoSeyred$VSTrack; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/extractors/VideoSeyred$VSTrack;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/extractors/VideoSeyred$VSTrack; + public fun equals (Ljava/lang/Object;)Z + public final fun getDefault ()Ljava/lang/String; + public final fun getFile ()Ljava/lang/String; + public final fun getKind ()Ljava/lang/String; + public final fun getLabel ()Ljava/lang/String; + public final fun getLanguage ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/VideoSeyred$VideoSeyredSource { + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Ljava/util/List;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Ljava/util/List; + public final fun component4 ()Ljava/util/List; + public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Ljava/util/List;)Lcom/lagradost/cloudstream3/extractors/VideoSeyred$VideoSeyredSource; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/extractors/VideoSeyred$VideoSeyredSource;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Ljava/util/List;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/extractors/VideoSeyred$VideoSeyredSource; + public fun equals (Ljava/lang/Object;)Z + public final fun getImage ()Ljava/lang/String; + public final fun getSources ()Ljava/util/List; + public final fun getTitle ()Ljava/lang/String; + public final fun getTracks ()Ljava/util/List; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/Videzz : com/lagradost/cloudstream3/extractors/Vidoza { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/Vidgomunime : com/lagradost/cloudstream3/extractors/StreamSB { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/Vidgomunimesb : com/lagradost/cloudstream3/extractors/StreamSB { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V +} + +public class com/lagradost/cloudstream3/extractors/VidhideExtractor : com/lagradost/cloudstream3/extractors/VidHidePro { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun setMainUrl (Ljava/lang/String;)V + public fun setName (Ljava/lang/String;)V +} + +public class com/lagradost/cloudstream3/extractors/Vidmoly : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +} + +public final class com/lagradost/cloudstream3/extractors/Vidmolybiz : com/lagradost/cloudstream3/extractors/Vidmoly { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/Vidmolyme : com/lagradost/cloudstream3/extractors/Vidmoly { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/Vidmolyto : com/lagradost/cloudstream3/extractors/Vidmoly { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/Vido : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public fun setMainUrl (Ljava/lang/String;)V + public fun setName (Ljava/lang/String;)V +} + +public class com/lagradost/cloudstream3/extractors/Vidoza : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +} + +public class com/lagradost/cloudstream3/extractors/Vids : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +} + +public final class com/lagradost/cloudstream3/extractors/Vidsonic : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +} + +public final class com/lagradost/cloudstream3/extractors/VinovoSi : com/lagradost/cloudstream3/extractors/VinovoTo { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V + public fun setName (Ljava/lang/String;)V +} + +public class com/lagradost/cloudstream3/extractors/VinovoTo : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +} + +public class com/lagradost/cloudstream3/extractors/VkExtractor : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +} + +public class com/lagradost/cloudstream3/extractors/Voe : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +} + +public final class com/lagradost/cloudstream3/extractors/Voe1 : com/lagradost/cloudstream3/extractors/Voe { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/Voe2 : com/lagradost/cloudstream3/extractors/Voe { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; +} + +public class com/lagradost/cloudstream3/extractors/Vtbe : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public fun setMainUrl (Ljava/lang/String;)V + public fun setName (Ljava/lang/String;)V +} + +public class com/lagradost/cloudstream3/extractors/WatchSB : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public fun setMainUrl (Ljava/lang/String;)V + public fun setName (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/Watchadsontape : com/lagradost/cloudstream3/extractors/StreamTape { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V +} + +public class com/lagradost/cloudstream3/extractors/Wibufile : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +} + +public final class com/lagradost/cloudstream3/extractors/WishembedPro : com/lagradost/cloudstream3/extractors/StreamWishExtractor { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/Wishfast : com/lagradost/cloudstream3/extractors/StreamWishExtractor { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/Wishonly : com/lagradost/cloudstream3/extractors/StreamWishExtractor { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; +} + +public class com/lagradost/cloudstream3/extractors/XStreamCdn : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public fun getDomainUrl ()Ljava/lang/String; + public fun getExtractorUrl (Ljava/lang/String;)Ljava/lang/String; + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public fun setDomainUrl (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/Xenolyzb : com/lagradost/cloudstream3/extractors/VidHidePro { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/Yipsu : com/lagradost/cloudstream3/extractors/Voe { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V +} + +public class com/lagradost/cloudstream3/extractors/YourUpload : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +} + +public class com/lagradost/cloudstream3/extractors/YoutubeExtractor : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +} + +public final class com/lagradost/cloudstream3/extractors/YoutubeMobileExtractor : com/lagradost/cloudstream3/extractors/YoutubeExtractor { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/YoutubeNoCookieExtractor : com/lagradost/cloudstream3/extractors/YoutubeExtractor { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/YoutubeShortLinkExtractor : com/lagradost/cloudstream3/extractors/YoutubeExtractor { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/Yufiles : com/lagradost/cloudstream3/extractors/Hxfile { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/Yuguaab : com/lagradost/cloudstream3/extractors/VidHidePro { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/Zplayer : com/lagradost/cloudstream3/extractors/ZplayerV2 { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun setMainUrl (Ljava/lang/String;)V + public fun setName (Ljava/lang/String;)V +} + +public class com/lagradost/cloudstream3/extractors/ZplayerV2 : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getRequiresReferer ()Z + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public fun setMainUrl (Ljava/lang/String;)V + public fun setName (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/extractors/Ztreamhub : com/lagradost/cloudstream3/extractors/Filesim { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/helper/AesHelper { + public static final field INSTANCE Lcom/lagradost/cloudstream3/extractors/helper/AesHelper; + public final fun cryptoAESHandler (Ljava/lang/String;[BZLjava/lang/String;)Ljava/lang/String; + public final fun cryptoAESHandler (Ljava/lang/String;[BZZLkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static synthetic fun cryptoAESHandler$default (Lcom/lagradost/cloudstream3/extractors/helper/AesHelper;Ljava/lang/String;[BZLjava/lang/String;ILjava/lang/Object;)Ljava/lang/String; + public static synthetic fun cryptoAESHandler$default (Lcom/lagradost/cloudstream3/extractors/helper/AesHelper;Ljava/lang/String;[BZZLkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; + public final fun generateKeyAndIv ([B[BIIII)Lkotlin/Pair; + public static synthetic fun generateKeyAndIv$default (Lcom/lagradost/cloudstream3/extractors/helper/AesHelper;[B[BIIIIILjava/lang/Object;)Lkotlin/Pair; + public final fun hexToByteArray (Ljava/lang/String;)[B +} + +public final class com/lagradost/cloudstream3/extractors/helper/AsianEmbedHelper { + public static final field Companion Lcom/lagradost/cloudstream3/extractors/helper/AsianEmbedHelper$Companion; + public fun ()V +} + +public final class com/lagradost/cloudstream3/extractors/helper/AsianEmbedHelper$Companion { + public final fun getUrls (Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +} + +public final class com/lagradost/cloudstream3/extractors/helper/CryptoJS { + public static final field INSTANCE Lcom/lagradost/cloudstream3/extractors/helper/CryptoJS; + public final fun decrypt (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; + public final fun encrypt (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/helper/GogoHelper { + public static final field INSTANCE Lcom/lagradost/cloudstream3/extractors/helper/GogoHelper; + public final fun extractVidstream (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZZLorg/jsoup/nodes/Document;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static synthetic fun extractVidstream$default (Lcom/lagradost/cloudstream3/extractors/helper/GogoHelper;Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZZLorg/jsoup/nodes/Document;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; +} + +public final class com/lagradost/cloudstream3/extractors/helper/GogoHelper$GogoJsonData { + public static final field Companion Lcom/lagradost/cloudstream3/extractors/helper/GogoHelper$GogoJsonData$Companion; + public fun ()V + public fun (Ljava/lang/String;)V + public synthetic fun (Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun copy (Ljava/lang/String;)Lcom/lagradost/cloudstream3/extractors/helper/GogoHelper$GogoJsonData; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/extractors/helper/GogoHelper$GogoJsonData;Ljava/lang/String;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/extractors/helper/GogoHelper$GogoJsonData; + public fun equals (Ljava/lang/Object;)Z + public final fun getData ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class com/lagradost/cloudstream3/extractors/helper/GogoHelper$GogoJsonData$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lcom/lagradost/cloudstream3/extractors/helper/GogoHelper$GogoJsonData$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lcom/lagradost/cloudstream3/extractors/helper/GogoHelper$GogoJsonData; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lcom/lagradost/cloudstream3/extractors/helper/GogoHelper$GogoJsonData;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class com/lagradost/cloudstream3/extractors/helper/GogoHelper$GogoJsonData$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class com/lagradost/cloudstream3/extractors/helper/GogoHelper$GogoSource { + public static final field Companion Lcom/lagradost/cloudstream3/extractors/helper/GogoHelper$GogoSource$Companion; + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Ljava/lang/String; + public final fun component4 ()Ljava/lang/String; + public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lcom/lagradost/cloudstream3/extractors/helper/GogoHelper$GogoSource; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/extractors/helper/GogoHelper$GogoSource;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/extractors/helper/GogoHelper$GogoSource; + public fun equals (Ljava/lang/Object;)Z + public final fun getDefault ()Ljava/lang/String; + public final fun getFile ()Ljava/lang/String; + public final fun getLabel ()Ljava/lang/String; + public final fun getType ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class com/lagradost/cloudstream3/extractors/helper/GogoHelper$GogoSource$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lcom/lagradost/cloudstream3/extractors/helper/GogoHelper$GogoSource$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lcom/lagradost/cloudstream3/extractors/helper/GogoHelper$GogoSource; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lcom/lagradost/cloudstream3/extractors/helper/GogoHelper$GogoSource;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class com/lagradost/cloudstream3/extractors/helper/GogoHelper$GogoSource$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class com/lagradost/cloudstream3/extractors/helper/GogoHelper$GogoSources { + public static final field Companion Lcom/lagradost/cloudstream3/extractors/helper/GogoHelper$GogoSources$Companion; + public fun (Ljava/util/List;Ljava/util/List;)V + public final fun component1 ()Ljava/util/List; + public final fun component2 ()Ljava/util/List; + public final fun copy (Ljava/util/List;Ljava/util/List;)Lcom/lagradost/cloudstream3/extractors/helper/GogoHelper$GogoSources; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/extractors/helper/GogoHelper$GogoSources;Ljava/util/List;Ljava/util/List;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/extractors/helper/GogoHelper$GogoSources; + public fun equals (Ljava/lang/Object;)Z + public final fun getSource ()Ljava/util/List; + public final fun getSourceBk ()Ljava/util/List; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class com/lagradost/cloudstream3/extractors/helper/GogoHelper$GogoSources$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lcom/lagradost/cloudstream3/extractors/helper/GogoHelper$GogoSources$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lcom/lagradost/cloudstream3/extractors/helper/GogoHelper$GogoSources; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lcom/lagradost/cloudstream3/extractors/helper/GogoHelper$GogoSources;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class com/lagradost/cloudstream3/extractors/helper/GogoHelper$GogoSources$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class com/lagradost/cloudstream3/extractors/helper/JwPlayerHelper { + public static final field INSTANCE Lcom/lagradost/cloudstream3/extractors/helper/JwPlayerHelper; + public final fun canParseJwScript (Ljava/lang/String;)Z + public final fun extractStreamLinks (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Ljava/util/Map;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static synthetic fun extractStreamLinks$default (Lcom/lagradost/cloudstream3/extractors/helper/JwPlayerHelper;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Ljava/util/Map;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; +} + +public final class com/lagradost/cloudstream3/extractors/helper/JwPlayerHelper$Track { + public static final field Companion Lcom/lagradost/cloudstream3/extractors/helper/JwPlayerHelper$Track$Companion; + public fun ()V + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Ljava/lang/String; + public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lcom/lagradost/cloudstream3/extractors/helper/JwPlayerHelper$Track; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/extractors/helper/JwPlayerHelper$Track;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/extractors/helper/JwPlayerHelper$Track; + public fun equals (Ljava/lang/Object;)Z + public final fun getFile ()Ljava/lang/String; + public final fun getKind ()Ljava/lang/String; + public final fun getLabel ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class com/lagradost/cloudstream3/extractors/helper/JwPlayerHelper$Track$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lcom/lagradost/cloudstream3/extractors/helper/JwPlayerHelper$Track$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lcom/lagradost/cloudstream3/extractors/helper/JwPlayerHelper$Track; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lcom/lagradost/cloudstream3/extractors/helper/JwPlayerHelper$Track;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class com/lagradost/cloudstream3/extractors/helper/JwPlayerHelper$Track$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class com/lagradost/cloudstream3/extractors/helper/NineAnimeHelper { + public static final field INSTANCE Lcom/lagradost/cloudstream3/extractors/helper/NineAnimeHelper; + public final fun cipher (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; + public final fun decodeVrf (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; + public final fun encode (Ljava/lang/String;)Ljava/lang/String; + public final fun encodeVrf (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; + public final fun encrypt (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/helper/VstreamhubHelper { + public static final field Companion Lcom/lagradost/cloudstream3/extractors/helper/VstreamhubHelper$Companion; + public fun ()V +} + +public final class com/lagradost/cloudstream3/extractors/helper/VstreamhubHelper$Companion { + public final fun getUrls (Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +} + +public final class com/lagradost/cloudstream3/extractors/helper/WcoHelper { + public static final field Companion Lcom/lagradost/cloudstream3/extractors/helper/WcoHelper$Companion; + public fun ()V +} + +public final class com/lagradost/cloudstream3/extractors/helper/WcoHelper$Companion { + public final fun getNewWcoKey (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public final fun getWcoKey (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +} + +public final class com/lagradost/cloudstream3/extractors/helper/WcoHelper$Companion$ExternalKeys { + public static final field Companion Lcom/lagradost/cloudstream3/extractors/helper/WcoHelper$Companion$ExternalKeys$Companion; + public fun ()V + public fun (Ljava/lang/String;Ljava/lang/String;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun copy (Ljava/lang/String;Ljava/lang/String;)Lcom/lagradost/cloudstream3/extractors/helper/WcoHelper$Companion$ExternalKeys; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/extractors/helper/WcoHelper$Companion$ExternalKeys;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/extractors/helper/WcoHelper$Companion$ExternalKeys; + public fun equals (Ljava/lang/Object;)Z + public final fun getWcoKey ()Ljava/lang/String; + public final fun getWcocipher ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class com/lagradost/cloudstream3/extractors/helper/WcoHelper$Companion$ExternalKeys$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lcom/lagradost/cloudstream3/extractors/helper/WcoHelper$Companion$ExternalKeys$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lcom/lagradost/cloudstream3/extractors/helper/WcoHelper$Companion$ExternalKeys; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lcom/lagradost/cloudstream3/extractors/helper/WcoHelper$Companion$ExternalKeys;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class com/lagradost/cloudstream3/extractors/helper/WcoHelper$Companion$ExternalKeys$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class com/lagradost/cloudstream3/extractors/helper/WcoHelper$Companion$NewExternalKeys { + public static final field Companion Lcom/lagradost/cloudstream3/extractors/helper/WcoHelper$Companion$NewExternalKeys$Companion; + public fun ()V + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Ljava/lang/String; + public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lcom/lagradost/cloudstream3/extractors/helper/WcoHelper$Companion$NewExternalKeys; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/extractors/helper/WcoHelper$Companion$NewExternalKeys;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/extractors/helper/WcoHelper$Companion$NewExternalKeys; + public fun equals (Ljava/lang/Object;)Z + public final fun getCipherkey ()Ljava/lang/String; + public final fun getEncryptKey ()Ljava/lang/String; + public final fun getMainKey ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class com/lagradost/cloudstream3/extractors/helper/WcoHelper$Companion$NewExternalKeys$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lcom/lagradost/cloudstream3/extractors/helper/WcoHelper$Companion$NewExternalKeys$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lcom/lagradost/cloudstream3/extractors/helper/WcoHelper$Companion$NewExternalKeys; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lcom/lagradost/cloudstream3/extractors/helper/WcoHelper$Companion$NewExternalKeys;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class com/lagradost/cloudstream3/extractors/helper/WcoHelper$Companion$NewExternalKeys$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class com/lagradost/cloudstream3/metaproviders/CrossTmdbProvider : com/lagradost/cloudstream3/metaproviders/TmdbProvider { + public fun ()V + public fun getApiName ()Ljava/lang/String; + public fun getLang ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getSupportedTypes ()Ljava/util/Set; + public fun getUseMetaLoadResponse ()Z + public fun getUsesWebView ()Z + public fun load (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public fun loadLinks (Ljava/lang/String;ZLkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public fun search (Ljava/lang/String;ILkotlin/coroutines/Continuation;)Ljava/lang/Object; + public fun setLang (Ljava/lang/String;)V + public fun setName (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/metaproviders/CrossTmdbProvider$CrossMetaData { + public static final field Companion Lcom/lagradost/cloudstream3/metaproviders/CrossTmdbProvider$CrossMetaData$Companion; + public fun (ZLjava/util/List;)V + public synthetic fun (ZLjava/util/List;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Z + public final fun component2 ()Ljava/util/List; + public final fun copy (ZLjava/util/List;)Lcom/lagradost/cloudstream3/metaproviders/CrossTmdbProvider$CrossMetaData; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/metaproviders/CrossTmdbProvider$CrossMetaData;ZLjava/util/List;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/metaproviders/CrossTmdbProvider$CrossMetaData; + public fun equals (Ljava/lang/Object;)Z + public final fun getMovies ()Ljava/util/List; + public fun hashCode ()I + public final fun isSuccess ()Z + public fun toString ()Ljava/lang/String; +} + +public final synthetic class com/lagradost/cloudstream3/metaproviders/CrossTmdbProvider$CrossMetaData$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lcom/lagradost/cloudstream3/metaproviders/CrossTmdbProvider$CrossMetaData$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lcom/lagradost/cloudstream3/metaproviders/CrossTmdbProvider$CrossMetaData; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lcom/lagradost/cloudstream3/metaproviders/CrossTmdbProvider$CrossMetaData;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class com/lagradost/cloudstream3/metaproviders/CrossTmdbProvider$CrossMetaData$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public abstract class com/lagradost/cloudstream3/metaproviders/MyDramaListAPI : com/lagradost/cloudstream3/MainAPI { + public static final field API_HOST Ljava/lang/String; + public static final field Companion Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Companion; + public static final field SITE_HOST Ljava/lang/String; + public static final field TAG Ljava/lang/String; + public fun ()V + public fun getHasMainPage ()Z + public fun getMainPage ()Ljava/util/List; + public fun getMainPage (ILcom/lagradost/cloudstream3/MainPageRequest;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public fun getName ()Ljava/lang/String; + public fun getProviderType ()Lcom/lagradost/cloudstream3/ProviderType; + public fun getSupportedTypes ()Ljava/util/Set; + public fun load (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public fun search (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public fun setName (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Cast { + public static final field Companion Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Cast$Companion; + public fun (JLjava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Images;Ljava/lang/String;Ljava/lang/String;)V + public final fun component1 ()J + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Ljava/lang/String; + public final fun component4 ()Ljava/lang/String; + public final fun component5 ()Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Images; + public final fun component6 ()Ljava/lang/String; + public final fun component7 ()Ljava/lang/String; + public final fun copy (JLjava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Images;Ljava/lang/String;Ljava/lang/String;)Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Cast; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Cast;JLjava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Images;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Cast; + public fun equals (Ljava/lang/Object;)Z + public final fun getCharacterName ()Ljava/lang/String; + public final fun getId ()J + public final fun getImages ()Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Images; + public final fun getName ()Ljava/lang/String; + public final fun getRole ()Ljava/lang/String; + public final fun getSlug ()Ljava/lang/String; + public final fun getUrl ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class com/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Cast$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Cast$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Cast; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Cast;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class com/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Cast$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class com/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Companion { + public final fun getAPI_KEY ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Credits { + public static final field Companion Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Credits$Companion; + public fun (Ljava/util/List;Ljava/util/List;)V + public final fun component1 ()Ljava/util/List; + public final fun component2 ()Ljava/util/List; + public final fun copy (Ljava/util/List;Ljava/util/List;)Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Credits; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Credits;Ljava/util/List;Ljava/util/List;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Credits; + public fun equals (Ljava/lang/Object;)Z + public final fun getCast ()Ljava/util/List; + public final fun getCrew ()Ljava/util/List; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class com/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Credits$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Credits$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Credits; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Credits;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class com/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Credits$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class com/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Crew { + public static final field Companion Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Crew$Companion; + public fun (JLjava/lang/String;Ljava/lang/String;Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Images;Ljava/lang/String;)V + public final fun component1 ()J + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Ljava/lang/String; + public final fun component4 ()Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Images; + public final fun component5 ()Ljava/lang/String; + public final fun copy (JLjava/lang/String;Ljava/lang/String;Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Images;Ljava/lang/String;)Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Crew; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Crew;JLjava/lang/String;Ljava/lang/String;Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Images;Ljava/lang/String;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Crew; + public fun equals (Ljava/lang/Object;)Z + public final fun getId ()J + public final fun getImages ()Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Images; + public final fun getJob ()Ljava/lang/String; + public final fun getName ()Ljava/lang/String; + public final fun getSlug ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class com/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Crew$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Crew$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Crew; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Crew;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class com/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Crew$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class com/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Data { + public static final field Companion Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Data$Companion; + public fun ()V + public fun (Lcom/lagradost/cloudstream3/TvType;Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$MediaSummary;)V + public synthetic fun (Lcom/lagradost/cloudstream3/TvType;Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$MediaSummary;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Lcom/lagradost/cloudstream3/TvType; + public final fun component2 ()Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$MediaSummary; + public final fun copy (Lcom/lagradost/cloudstream3/TvType;Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$MediaSummary;)Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Data; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Data;Lcom/lagradost/cloudstream3/TvType;Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$MediaSummary;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Data; + public fun equals (Ljava/lang/Object;)Z + public final fun getMedia ()Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$MediaSummary; + public final fun getType ()Lcom/lagradost/cloudstream3/TvType; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class com/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Data$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Data$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Data; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Data;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class com/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Data$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class com/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Genre { + public static final field Companion Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Genre$Companion; + public fun (JLjava/lang/String;Ljava/lang/String;)V + public final fun component1 ()J + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Ljava/lang/String; + public final fun copy (JLjava/lang/String;Ljava/lang/String;)Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Genre; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Genre;JLjava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Genre; + public fun equals (Ljava/lang/Object;)Z + public final fun getId ()J + public final fun getName ()Ljava/lang/String; + public final fun getSlug ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class com/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Genre$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Genre$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Genre; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Genre;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class com/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Genre$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class com/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Images { + public static final field Companion Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Images$Companion; + public fun ()V + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Ljava/lang/String; + public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Images; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Images;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Images; + public fun equals (Ljava/lang/Object;)Z + public final fun getMedium ()Ljava/lang/String; + public final fun getPoster ()Ljava/lang/String; + public final fun getThumb ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class com/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Images$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Images$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Images; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Images;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class com/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Images$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class com/lagradost/cloudstream3/metaproviders/MyDramaListAPI$LinkData { + public static final field Companion Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$LinkData$Companion; + public fun ()V + public fun (Ljava/lang/Long;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/String;)V + public synthetic fun (Ljava/lang/Long;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/Long; + public final fun component10 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Ljava/lang/Integer; + public final fun component4 ()Ljava/lang/Integer; + public final fun component5 ()Ljava/lang/String; + public final fun component6 ()Ljava/lang/Integer; + public final fun component7 ()Ljava/lang/String; + public final fun component8 ()Ljava/lang/Integer; + public final fun component9 ()Ljava/lang/String; + public final fun copy (Ljava/lang/Long;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/String;)Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$LinkData; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$LinkData;Ljava/lang/Long;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$LinkData; + public fun equals (Ljava/lang/Object;)Z + public final fun getAiredDate ()Ljava/lang/String; + public final fun getDate ()Ljava/lang/String; + public final fun getEpisode ()Ljava/lang/Integer; + public final fun getId ()Ljava/lang/Long; + public final fun getLastSeason ()Ljava/lang/Integer; + public final fun getOrgTitle ()Ljava/lang/String; + public final fun getSeason ()Ljava/lang/Integer; + public final fun getTitle ()Ljava/lang/String; + public final fun getType ()Ljava/lang/String; + public final fun getYear ()Ljava/lang/Integer; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class com/lagradost/cloudstream3/metaproviders/MyDramaListAPI$LinkData$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$LinkData$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$LinkData; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$LinkData;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class com/lagradost/cloudstream3/metaproviders/MyDramaListAPI$LinkData$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class com/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Media { + public static final field Companion Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Media$Companion; + public fun (JLjava/lang/String;Ljava/lang/String;Ljava/lang/String;IJDLjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Images;Ljava/util/List;Ljava/lang/Long;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Trailer;JJJJJJJLjava/lang/String;Ljava/lang/String;ZLjava/util/List;J)V + public synthetic fun (JLjava/lang/String;Ljava/lang/String;Ljava/lang/String;IJDLjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Images;Ljava/util/List;Ljava/lang/Long;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Trailer;JJJJJJJLjava/lang/String;Ljava/lang/String;ZLjava/util/List;JIILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()J + public final fun component10 ()Ljava/lang/String; + public final fun component11 ()Ljava/lang/String; + public final fun component12 ()Ljava/lang/String; + public final fun component13 ()Ljava/lang/String; + public final fun component14 ()Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Images; + public final fun component15 ()Ljava/util/List; + public final fun component16 ()Ljava/lang/Long; + public final fun component17 ()Ljava/lang/String; + public final fun component18 ()Ljava/lang/String; + public final fun component19 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun component20 ()Ljava/util/List; + public final fun component21 ()Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Trailer; + public final fun component22 ()J + public final fun component23 ()J + public final fun component24 ()J + public final fun component25 ()J + public final fun component26 ()J + public final fun component27 ()J + public final fun component28 ()J + public final fun component29 ()Ljava/lang/String; + public final fun component3 ()Ljava/lang/String; + public final fun component30 ()Ljava/lang/String; + public final fun component31 ()Z + public final fun component32 ()Ljava/util/List; + public final fun component33 ()J + public final fun component4 ()Ljava/lang/String; + public final fun component5 ()I + public final fun component6 ()J + public final fun component7 ()D + public final fun component8 ()Ljava/lang/String; + public final fun component9 ()Ljava/lang/String; + public final fun copy (JLjava/lang/String;Ljava/lang/String;Ljava/lang/String;IJDLjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Images;Ljava/util/List;Ljava/lang/Long;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Trailer;JJJJJJJLjava/lang/String;Ljava/lang/String;ZLjava/util/List;J)Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Media; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Media;JLjava/lang/String;Ljava/lang/String;Ljava/lang/String;IJDLjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Images;Ljava/util/List;Ljava/lang/Long;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Trailer;JJJJJJJLjava/lang/String;Ljava/lang/String;ZLjava/util/List;JIILjava/lang/Object;)Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Media; + public fun equals (Ljava/lang/Object;)Z + public final fun fetchCredits (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public final fun fetchRecommendations (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public final fun fetchTrailer (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public final fun fixGenres ()Ljava/util/List; + public final fun getAiredStart ()Ljava/lang/String; + public final fun getAltTitles ()Ljava/util/List; + public final fun getCertification ()Ljava/lang/String; + public final fun getCommentsCount ()J + public final fun getCountry ()Ljava/lang/String; + public final fun getEnableAds ()Z + public final fun getEpisodes ()J + public final fun getGenres ()Ljava/util/List; + public final fun getId ()J + public final fun getImages ()Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Images; + public final fun getLanguage ()Ljava/lang/String; + public final fun getMediaRating ()D + public final fun getMediaType ()Ljava/lang/String; + public final fun getMediaYear ()I + public final fun getOriginalTitle ()Ljava/lang/String; + public final fun getPermalink ()Ljava/lang/String; + public final fun getPopularity ()J + public final fun getRanked ()J + public final fun getRecsCount ()J + public final fun getReleaseDatesFmt ()Ljava/lang/String; + public final fun getReleased ()Ljava/lang/String; + public final fun getReviewsCount ()J + public final fun getRuntime ()J + public final fun getSlug ()Ljava/lang/String; + public final fun getSources ()Ljava/util/List; + public final fun getStatus ()Ljava/lang/String; + public final fun getSynopsis ()Ljava/lang/String; + public final fun getTitle ()Ljava/lang/String; + public final fun getTrailer ()Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Trailer; + public final fun getType ()Ljava/lang/String; + public final fun getUpdatedAt ()J + public final fun getVotes ()Ljava/lang/Long; + public final fun getWatchers ()J + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class com/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Media$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Media$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Media; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Media;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class com/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Media$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class com/lagradost/cloudstream3/metaproviders/MyDramaListAPI$MediaSummary { + public static final field Companion Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$MediaSummary$Companion; + public fun (JLjava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/Double;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Images;)V + public synthetic fun (JLjava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/Double;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Images;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()J + public final fun component10 ()Ljava/lang/String; + public final fun component11 ()Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Images; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Ljava/lang/String; + public final fun component4 ()Ljava/lang/Integer; + public final fun component5 ()Ljava/lang/Double; + public final fun component6 ()Ljava/lang/String; + public final fun component7 ()Ljava/lang/String; + public final fun component8 ()Ljava/lang/String; + public final fun component9 ()Ljava/lang/String; + public final fun copy (JLjava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/Double;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Images;)Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$MediaSummary; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$MediaSummary;JLjava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/Double;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Images;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$MediaSummary; + public fun equals (Ljava/lang/Object;)Z + public final fun getCountry ()Ljava/lang/String; + public final fun getId ()J + public final fun getImages ()Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Images; + public final fun getLanguage ()Ljava/lang/String; + public final fun getMediaType ()Ljava/lang/String; + public final fun getOriginalTitle ()Ljava/lang/String; + public final fun getPermalink ()Ljava/lang/String; + public final fun getRating ()Ljava/lang/Double; + public final fun getTitle ()Ljava/lang/String; + public final fun getType ()Ljava/lang/String; + public final fun getYear ()Ljava/lang/Integer; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class com/lagradost/cloudstream3/metaproviders/MyDramaListAPI$MediaSummary$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$MediaSummary$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$MediaSummary; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$MediaSummary;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class com/lagradost/cloudstream3/metaproviders/MyDramaListAPI$MediaSummary$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class com/lagradost/cloudstream3/metaproviders/MyDramaListAPI$ShowEpisode { + public static final field Companion Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$ShowEpisode$Companion; + public fun (IIDILjava/lang/String;)V + public final fun component1 ()I + public final fun component2 ()I + public final fun component3 ()D + public final fun component4 ()I + public final fun component5 ()Ljava/lang/String; + public final fun copy (IIDILjava/lang/String;)Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$ShowEpisode; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$ShowEpisode;IIDILjava/lang/String;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$ShowEpisode; + public fun equals (Ljava/lang/Object;)Z + public final fun getEpisodeNumber ()I + public final fun getId ()I + public final fun getRating ()D + public final fun getReleasedAt ()Ljava/lang/String; + public final fun getVotes ()I + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class com/lagradost/cloudstream3/metaproviders/MyDramaListAPI$ShowEpisode$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$ShowEpisode$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$ShowEpisode; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$ShowEpisode;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class com/lagradost/cloudstream3/metaproviders/MyDramaListAPI$ShowEpisode$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class com/lagradost/cloudstream3/metaproviders/MyDramaListAPI$ShowEpisodesItem { + public static final field Companion Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$ShowEpisodesItem$Companion; + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Ljava/lang/String;I)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Ljava/util/List; + public final fun component4 ()Ljava/lang/String; + public final fun component5 ()I + public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Ljava/lang/String;I)Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$ShowEpisodesItem; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$ShowEpisodesItem;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Ljava/lang/String;IILjava/lang/Object;)Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$ShowEpisodesItem; + public fun equals (Ljava/lang/Object;)Z + public final fun getEpisodes ()Ljava/util/List; + public final fun getName ()Ljava/lang/String; + public final fun getReleaseDate ()Ljava/lang/String; + public final fun getTimezone ()Ljava/lang/String; + public final fun getTotal ()I + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class com/lagradost/cloudstream3/metaproviders/MyDramaListAPI$ShowEpisodesItem$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$ShowEpisodesItem$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$ShowEpisodesItem; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$ShowEpisodesItem;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class com/lagradost/cloudstream3/metaproviders/MyDramaListAPI$ShowEpisodesItem$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class com/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Source { + public static final field Companion Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Source$Companion; + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Ljava/lang/String; + public final fun component4 ()Ljava/lang/String; + public final fun component5 ()Ljava/lang/String; + public final fun component6 ()Ljava/lang/String; + public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Source; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Source;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Source; + public fun equals (Ljava/lang/Object;)Z + public final fun getImage ()Ljava/lang/String; + public final fun getLink ()Ljava/lang/String; + public final fun getName ()Ljava/lang/String; + public final fun getSource ()Ljava/lang/String; + public final fun getSourceType ()Ljava/lang/String; + public final fun getXid ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class com/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Source$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Source$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Source; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Source;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class com/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Source$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class com/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Tag { + public static final field Companion Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Tag$Companion; + public fun (JLjava/lang/String;Ljava/lang/String;)V + public final fun component1 ()J + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Ljava/lang/String; + public final fun copy (JLjava/lang/String;Ljava/lang/String;)Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Tag; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Tag;JLjava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Tag; + public fun equals (Ljava/lang/Object;)Z + public final fun getId ()J + public final fun getName ()Ljava/lang/String; + public final fun getSlug ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class com/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Tag$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Tag$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Tag; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Tag;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class com/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Tag$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class com/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Trailer { + public static final field Companion Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Trailer$Companion; + public fun ()V + public fun (Ljava/lang/Long;)V + public synthetic fun (Ljava/lang/Long;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/Long; + public final fun copy (Ljava/lang/Long;)Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Trailer; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Trailer;Ljava/lang/Long;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Trailer; + public fun equals (Ljava/lang/Object;)Z + public final fun getId ()Ljava/lang/Long; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class com/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Trailer$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Trailer$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Trailer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Trailer;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class com/lagradost/cloudstream3/metaproviders/MyDramaListAPI$Trailer$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class com/lagradost/cloudstream3/metaproviders/MyDramaListAPI$TrailerDetails { + public static final field Companion Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$TrailerDetails$Companion; + public fun (JLjava/lang/String;)V + public final fun component1 ()J + public final fun component2 ()Ljava/lang/String; + public final fun copy (JLjava/lang/String;)Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$TrailerDetails; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$TrailerDetails;JLjava/lang/String;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$TrailerDetails; + public fun equals (Ljava/lang/Object;)Z + public final fun getId ()J + public final fun getSource ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class com/lagradost/cloudstream3/metaproviders/MyDramaListAPI$TrailerDetails$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$TrailerDetails$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$TrailerDetails; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$TrailerDetails;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class com/lagradost/cloudstream3/metaproviders/MyDramaListAPI$TrailerDetails$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class com/lagradost/cloudstream3/metaproviders/MyDramaListAPI$TrailerNode { + public static final field Companion Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$TrailerNode$Companion; + public fun (Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$TrailerDetails;)V + public final fun component1 ()Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$TrailerDetails; + public final fun copy (Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$TrailerDetails;)Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$TrailerNode; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$TrailerNode;Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$TrailerDetails;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$TrailerNode; + public fun equals (Ljava/lang/Object;)Z + public final fun getTrailerDetails ()Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$TrailerDetails; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class com/lagradost/cloudstream3/metaproviders/MyDramaListAPI$TrailerNode$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$TrailerNode$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$TrailerNode; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$TrailerNode;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class com/lagradost/cloudstream3/metaproviders/MyDramaListAPI$TrailerNode$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class com/lagradost/cloudstream3/metaproviders/MyDramaListAPI$TrailerRoot { + public static final field Companion Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$TrailerRoot$Companion; + public fun (Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$TrailerNode;)V + public final fun component1 ()Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$TrailerNode; + public final fun copy (Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$TrailerNode;)Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$TrailerRoot; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$TrailerRoot;Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$TrailerNode;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$TrailerRoot; + public fun equals (Ljava/lang/Object;)Z + public final fun getTrailer ()Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$TrailerNode; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class com/lagradost/cloudstream3/metaproviders/MyDramaListAPI$TrailerRoot$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$TrailerRoot$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$TrailerRoot; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lcom/lagradost/cloudstream3/metaproviders/MyDramaListAPI$TrailerRoot;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class com/lagradost/cloudstream3/metaproviders/MyDramaListAPI$TrailerRoot$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class com/lagradost/cloudstream3/metaproviders/SyncRedirector { + public static final field INSTANCE Lcom/lagradost/cloudstream3/metaproviders/SyncRedirector; + public final fun redirect (Ljava/lang/String;Lcom/lagradost/cloudstream3/MainAPI;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +} + +public final class com/lagradost/cloudstream3/metaproviders/TmdbLink { + public fun (Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/String;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/Integer; + public final fun component3 ()Ljava/lang/Integer; + public final fun component4 ()Ljava/lang/Integer; + public final fun component5 ()Ljava/lang/String; + public final fun copy (Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/String;)Lcom/lagradost/cloudstream3/metaproviders/TmdbLink; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/metaproviders/TmdbLink;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/String;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/metaproviders/TmdbLink; + public fun equals (Ljava/lang/Object;)Z + public final fun getEpisode ()Ljava/lang/Integer; + public final fun getImdbID ()Ljava/lang/String; + public final fun getMovieName ()Ljava/lang/String; + public final fun getSeason ()Ljava/lang/Integer; + public final fun getTmdbID ()Ljava/lang/Integer; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public class com/lagradost/cloudstream3/metaproviders/TmdbProvider : com/lagradost/cloudstream3/MainAPI { + public fun ()V + public fun fetchContentRating (Ljava/lang/Integer;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public fun getApiName ()Ljava/lang/String; + public fun getDisableSeasonZero ()Z + public fun getHasMainPage ()Z + public fun getIncludeAdult ()Z + public fun getMainPage (ILcom/lagradost/cloudstream3/MainPageRequest;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public fun getProviderType ()Lcom/lagradost/cloudstream3/ProviderType; + public fun getUseMetaLoadResponse ()Z + public fun load (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public fun loadFromImdb (Ljava/lang/String;)Lcom/lagradost/cloudstream3/LoadResponse; + public fun loadFromImdb (Ljava/lang/String;Ljava/util/List;)Lcom/lagradost/cloudstream3/LoadResponse; + public fun loadFromTmdb (I)Lcom/lagradost/cloudstream3/LoadResponse; + public fun loadFromTmdb (ILjava/util/List;)Lcom/lagradost/cloudstream3/LoadResponse; + public fun search (Ljava/lang/String;ILkotlin/coroutines/Continuation;)Ljava/lang/Object; +} + +public class com/lagradost/cloudstream3/metaproviders/TraktProvider : com/lagradost/cloudstream3/MainAPI { + public fun ()V + public fun getHasMainPage ()Z + public fun getMainPage ()Ljava/util/List; + public fun getMainPage (ILcom/lagradost/cloudstream3/MainPageRequest;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public fun getName ()Ljava/lang/String; + public fun getProviderType ()Lcom/lagradost/cloudstream3/ProviderType; + public fun getSupportedTypes ()Ljava/util/Set; + public fun load (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public fun search (Ljava/lang/String;ILkotlin/coroutines/Continuation;)Ljava/lang/Object; + public fun setName (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/metaproviders/TraktProvider$Airs { + public fun ()V + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Ljava/lang/String; + public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Airs; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Airs;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Airs; + public fun equals (Ljava/lang/Object;)Z + public final fun getDay ()Ljava/lang/String; + public final fun getTime ()Ljava/lang/String; + public final fun getTimezone ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/metaproviders/TraktProvider$Cast { + public fun ()V + public fun (Ljava/lang/String;Ljava/util/List;Ljava/lang/Long;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Person;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Images;)V + public synthetic fun (Ljava/lang/String;Ljava/util/List;Ljava/lang/Long;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Person;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Images;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/util/List; + public final fun component3 ()Ljava/lang/Long; + public final fun component4 ()Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Person; + public final fun component5 ()Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Images; + public final fun copy (Ljava/lang/String;Ljava/util/List;Ljava/lang/Long;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Person;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Images;)Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Cast; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Cast;Ljava/lang/String;Ljava/util/List;Ljava/lang/Long;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Person;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Images;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Cast; + public fun equals (Ljava/lang/Object;)Z + public final fun getCharacter ()Ljava/lang/String; + public final fun getCharacters ()Ljava/util/List; + public final fun getEpisodeCount ()Ljava/lang/Long; + public final fun getImages ()Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Images; + public final fun getPerson ()Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Person; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/metaproviders/TraktProvider$Data { + public fun ()V + public fun (Lcom/lagradost/cloudstream3/TvType;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$MediaDetails;)V + public synthetic fun (Lcom/lagradost/cloudstream3/TvType;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$MediaDetails;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Lcom/lagradost/cloudstream3/TvType; + public final fun component2 ()Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$MediaDetails; + public final fun copy (Lcom/lagradost/cloudstream3/TvType;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$MediaDetails;)Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Data; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Data;Lcom/lagradost/cloudstream3/TvType;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$MediaDetails;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Data; + public fun equals (Ljava/lang/Object;)Z + public final fun getMediaDetails ()Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$MediaDetails; + public final fun getType ()Lcom/lagradost/cloudstream3/TvType; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/metaproviders/TraktProvider$Ids { + public fun ()V + public fun (Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;)V + public synthetic fun (Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/Integer; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Ljava/lang/Integer; + public final fun component4 ()Ljava/lang/String; + public final fun component5 ()Ljava/lang/Integer; + public final fun component6 ()Ljava/lang/String; + public final fun copy (Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;)Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Ids; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Ids;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Ids; + public fun equals (Ljava/lang/Object;)Z + public final fun getImdb ()Ljava/lang/String; + public final fun getSlug ()Ljava/lang/String; + public final fun getTmdb ()Ljava/lang/Integer; + public final fun getTrakt ()Ljava/lang/Integer; + public final fun getTvdb ()Ljava/lang/Integer; + public final fun getTvrage ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/metaproviders/TraktProvider$Images { + public fun ()V + public fun (Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;)V + public synthetic fun (Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/util/List; + public final fun component2 ()Ljava/util/List; + public final fun component3 ()Ljava/util/List; + public final fun component4 ()Ljava/util/List; + public final fun component5 ()Ljava/util/List; + public final fun component6 ()Ljava/util/List; + public final fun component7 ()Ljava/util/List; + public final fun component8 ()Ljava/util/List; + public final fun copy (Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;)Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Images; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Images;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Images; + public fun equals (Ljava/lang/Object;)Z + public final fun getBanner ()Ljava/util/List; + public final fun getClearArt ()Ljava/util/List; + public final fun getFanart ()Ljava/util/List; + public final fun getHeadshot ()Ljava/util/List; + public final fun getLogo ()Ljava/util/List; + public final fun getPoster ()Ljava/util/List; + public final fun getScreenshot ()Ljava/util/List; + public final fun getThumb ()Ljava/util/List; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/metaproviders/TraktProvider$LinkData { + public fun ()V + public fun (Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;ZLjava/lang/Integer;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZZZ)V + public synthetic fun (Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;ZLjava/lang/Integer;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZZZILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/Integer; + public final fun component10 ()Ljava/lang/Integer; + public final fun component11 ()Ljava/lang/String; + public final fun component12 ()Ljava/lang/String; + public final fun component13 ()Ljava/lang/String; + public final fun component14 ()Ljava/lang/Integer; + public final fun component15 ()Ljava/lang/String; + public final fun component16 ()Z + public final fun component17 ()Ljava/lang/Integer; + public final fun component18 ()Ljava/lang/Integer; + public final fun component19 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/Integer; + public final fun component20 ()Ljava/lang/String; + public final fun component21 ()Ljava/lang/String; + public final fun component22 ()Ljava/lang/String; + public final fun component23 ()Z + public final fun component24 ()Z + public final fun component25 ()Z + public final fun component3 ()Ljava/lang/String; + public final fun component4 ()Ljava/lang/Integer; + public final fun component5 ()Ljava/lang/String; + public final fun component6 ()Ljava/lang/Integer; + public final fun component7 ()Ljava/lang/String; + public final fun component8 ()Ljava/lang/String; + public final fun component9 ()Ljava/lang/Integer; + public final fun copy (Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;ZLjava/lang/Integer;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZZZ)Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$LinkData; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$LinkData;Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;ZLjava/lang/Integer;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZZZILjava/lang/Object;)Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$LinkData; + public fun equals (Ljava/lang/Object;)Z + public final fun getAiredDate ()Ljava/lang/String; + public final fun getAiredYear ()Ljava/lang/Integer; + public final fun getAniId ()Ljava/lang/String; + public final fun getAnimeId ()Ljava/lang/String; + public final fun getDate ()Ljava/lang/String; + public final fun getEpisode ()Ljava/lang/Integer; + public final fun getEpsTitle ()Ljava/lang/String; + public final fun getId ()Ljava/lang/Integer; + public final fun getImdbId ()Ljava/lang/String; + public final fun getJpTitle ()Ljava/lang/String; + public final fun getLastSeason ()Ljava/lang/Integer; + public final fun getOrgTitle ()Ljava/lang/String; + public final fun getSeason ()Ljava/lang/Integer; + public final fun getTitle ()Ljava/lang/String; + public final fun getTmdbId ()Ljava/lang/Integer; + public final fun getTraktId ()Ljava/lang/Integer; + public final fun getTraktSlug ()Ljava/lang/String; + public final fun getTvdbId ()Ljava/lang/Integer; + public final fun getTvrageId ()Ljava/lang/String; + public final fun getType ()Ljava/lang/String; + public final fun getYear ()Ljava/lang/Integer; + public fun hashCode ()I + public final fun isAnime ()Z + public final fun isAsian ()Z + public final fun isBollywood ()Z + public final fun isCartoon ()Z + public fun toString ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/metaproviders/TraktProvider$MediaDetails { + public fun ()V + public fun (Ljava/lang/String;Ljava/lang/Integer;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Ids;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Double;Ljava/lang/Long;Ljava/lang/Long;Ljava/lang/String;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Airs;Ljava/lang/String;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Images;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$MediaDetails;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/Integer;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Ids;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Double;Ljava/lang/Long;Ljava/lang/Long;Ljava/lang/String;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Airs;Ljava/lang/String;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Images;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$MediaDetails;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component10 ()Ljava/lang/String; + public final fun component11 ()Ljava/lang/String; + public final fun component12 ()Ljava/lang/String; + public final fun component13 ()Ljava/lang/Double; + public final fun component14 ()Ljava/lang/Long; + public final fun component15 ()Ljava/lang/Long; + public final fun component16 ()Ljava/lang/String; + public final fun component17 ()Ljava/util/List; + public final fun component18 ()Ljava/util/List; + public final fun component19 ()Ljava/util/List; + public final fun component2 ()Ljava/lang/Integer; + public final fun component20 ()Ljava/lang/String; + public final fun component21 ()Ljava/lang/Integer; + public final fun component22 ()Ljava/lang/String; + public final fun component23 ()Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Airs; + public final fun component24 ()Ljava/lang/String; + public final fun component25 ()Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Images; + public final fun component26 ()Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$MediaDetails; + public final fun component3 ()Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Ids; + public final fun component4 ()Ljava/lang/String; + public final fun component5 ()Ljava/lang/String; + public final fun component6 ()Ljava/lang/String; + public final fun component7 ()Ljava/lang/Integer; + public final fun component8 ()Ljava/lang/String; + public final fun component9 ()Ljava/lang/String; + public final fun copy (Ljava/lang/String;Ljava/lang/Integer;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Ids;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Double;Ljava/lang/Long;Ljava/lang/Long;Ljava/lang/String;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Airs;Ljava/lang/String;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Images;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$MediaDetails;)Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$MediaDetails; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$MediaDetails;Ljava/lang/String;Ljava/lang/Integer;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Ids;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Double;Ljava/lang/Long;Ljava/lang/Long;Ljava/lang/String;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Airs;Ljava/lang/String;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Images;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$MediaDetails;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$MediaDetails; + public fun equals (Ljava/lang/Object;)Z + public final fun getAiredEpisodes ()Ljava/lang/Integer; + public final fun getAirs ()Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Airs; + public final fun getAvailableTranslations ()Ljava/util/List; + public final fun getCertification ()Ljava/lang/String; + public final fun getCommentCount ()Ljava/lang/Long; + public final fun getCountry ()Ljava/lang/String; + public final fun getFirstAired ()Ljava/lang/String; + public final fun getGenres ()Ljava/util/List; + public final fun getHomepage ()Ljava/lang/String; + public final fun getIds ()Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Ids; + public final fun getImages ()Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Images; + public final fun getLanguage ()Ljava/lang/String; + public final fun getLanguages ()Ljava/util/List; + public final fun getMedia ()Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$MediaDetails; + public final fun getNetwork ()Ljava/lang/String; + public final fun getOverview ()Ljava/lang/String; + public final fun getRating ()Ljava/lang/Double; + public final fun getReleased ()Ljava/lang/String; + public final fun getRuntime ()Ljava/lang/Integer; + public final fun getStatus ()Ljava/lang/String; + public final fun getTagline ()Ljava/lang/String; + public final fun getTitle ()Ljava/lang/String; + public final fun getTrailer ()Ljava/lang/String; + public final fun getUpdatedAt ()Ljava/lang/String; + public final fun getVotes ()Ljava/lang/Long; + public final fun getYear ()Ljava/lang/Integer; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/metaproviders/TraktProvider$People { + public fun ()V + public fun (Ljava/util/List;)V + public synthetic fun (Ljava/util/List;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/util/List; + public final fun copy (Ljava/util/List;)Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$People; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$People;Ljava/util/List;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$People; + public fun equals (Ljava/lang/Object;)Z + public final fun getCast ()Ljava/util/List; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/metaproviders/TraktProvider$Person { + public fun ()V + public fun (Ljava/lang/String;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Ids;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Images;)V + public synthetic fun (Ljava/lang/String;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Ids;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Images;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Ids; + public final fun component3 ()Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Images; + public final fun copy (Ljava/lang/String;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Ids;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Images;)Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Person; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Person;Ljava/lang/String;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Ids;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Images;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Person; + public fun equals (Ljava/lang/Object;)Z + public final fun getIds ()Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Ids; + public final fun getImages ()Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Images; + public final fun getName ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/metaproviders/TraktProvider$Seasons { + public fun ()V + public fun (Ljava/lang/Integer;Ljava/lang/Integer;Ljava/util/List;Ljava/lang/String;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Ids;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Images;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/Double;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;)V + public synthetic fun (Ljava/lang/Integer;Ljava/lang/Integer;Ljava/util/List;Ljava/lang/String;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Ids;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Images;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/Double;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/Integer; + public final fun component10 ()Ljava/lang/Double; + public final fun component11 ()Ljava/lang/String; + public final fun component12 ()Ljava/lang/String; + public final fun component13 ()Ljava/lang/Integer; + public final fun component2 ()Ljava/lang/Integer; + public final fun component3 ()Ljava/util/List; + public final fun component4 ()Ljava/lang/String; + public final fun component5 ()Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Ids; + public final fun component6 ()Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Images; + public final fun component7 ()Ljava/lang/String; + public final fun component8 ()Ljava/lang/Integer; + public final fun component9 ()Ljava/lang/String; + public final fun copy (Ljava/lang/Integer;Ljava/lang/Integer;Ljava/util/List;Ljava/lang/String;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Ids;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Images;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/Double;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;)Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Seasons; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Seasons;Ljava/lang/Integer;Ljava/lang/Integer;Ljava/util/List;Ljava/lang/String;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Ids;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Images;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/Double;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Seasons; + public fun equals (Ljava/lang/Object;)Z + public final fun getAiredEpisodes ()Ljava/lang/Integer; + public final fun getEpisodeCount ()Ljava/lang/Integer; + public final fun getEpisodes ()Ljava/util/List; + public final fun getFirstAired ()Ljava/lang/String; + public final fun getIds ()Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Ids; + public final fun getImages ()Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Images; + public final fun getNetwork ()Ljava/lang/String; + public final fun getNumber ()Ljava/lang/Integer; + public final fun getOverview ()Ljava/lang/String; + public final fun getRating ()Ljava/lang/Double; + public final fun getTitle ()Ljava/lang/String; + public final fun getUpdatedAt ()Ljava/lang/String; + public final fun getVotes ()Ljava/lang/Integer; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/metaproviders/TraktProvider$TraktEpisode { + public fun ()V + public fun (Ljava/util/List;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/String;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Ids;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Images;Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/Double;Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;)V + public synthetic fun (Ljava/util/List;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/String;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Ids;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Images;Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/Double;Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/util/List; + public final fun component10 ()Ljava/lang/Double; + public final fun component11 ()Ljava/lang/Integer; + public final fun component12 ()Ljava/lang/Integer; + public final fun component13 ()Ljava/lang/String; + public final fun component14 ()Ljava/lang/String; + public final fun component15 ()Ljava/lang/Integer; + public final fun component2 ()Ljava/lang/Integer; + public final fun component3 ()Ljava/lang/String; + public final fun component4 ()Ljava/lang/String; + public final fun component5 ()Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Ids; + public final fun component6 ()Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Images; + public final fun component7 ()Ljava/lang/Integer; + public final fun component8 ()Ljava/lang/Integer; + public final fun component9 ()Ljava/lang/String; + public final fun copy (Ljava/util/List;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/String;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Ids;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Images;Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/Double;Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;)Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$TraktEpisode; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$TraktEpisode;Ljava/util/List;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/String;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Ids;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Images;Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/Double;Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$TraktEpisode; + public fun equals (Ljava/lang/Object;)Z + public final fun getAvailableTranslations ()Ljava/util/List; + public final fun getCommentCount ()Ljava/lang/Integer; + public final fun getEpisodeType ()Ljava/lang/String; + public final fun getFirstAired ()Ljava/lang/String; + public final fun getIds ()Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Ids; + public final fun getImages ()Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Images; + public final fun getNumber ()Ljava/lang/Integer; + public final fun getNumberAbs ()Ljava/lang/Integer; + public final fun getOverview ()Ljava/lang/String; + public final fun getRating ()Ljava/lang/Double; + public final fun getRuntime ()Ljava/lang/Integer; + public final fun getSeason ()Ljava/lang/Integer; + public final fun getTitle ()Ljava/lang/String; + public final fun getUpdatedAt ()Ljava/lang/String; + public final fun getVotes ()Ljava/lang/Integer; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/mvvm/ArchComponentExtKt { + public static final field DEBUG_EXCEPTION Ljava/lang/String; + public static final field DEBUG_PRINT Ljava/lang/String; + public static final fun debugAssert (Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;)V + public static final fun debugException (Lkotlin/jvm/functions/Function0;)V + public static final fun debugPrint (Ljava/lang/String;Lkotlin/jvm/functions/Function0;)V + public static synthetic fun debugPrint$default (Ljava/lang/String;Lkotlin/jvm/functions/Function0;ILjava/lang/Object;)V + public static final fun debugWarning (Lkotlin/jvm/functions/Function0;)V + public static final fun debugWarning (Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;)V + public static final fun getAllMessages (Ljava/lang/Throwable;)Ljava/lang/String; + public static final fun getStackTracePretty (Ljava/lang/Throwable;Z)Ljava/lang/String; + public static synthetic fun getStackTracePretty$default (Ljava/lang/Throwable;ZILjava/lang/Object;)Ljava/lang/String; + public static final fun launchSafe (Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/CoroutineContext;Lkotlinx/coroutines/CoroutineStart;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/Job; + public static synthetic fun launchSafe$default (Lkotlinx/coroutines/CoroutineScope;Lkotlin/coroutines/CoroutineContext;Lkotlinx/coroutines/CoroutineStart;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lkotlinx/coroutines/Job; + public static final fun logError (Ljava/lang/Throwable;)V + public static final fun normalSafeApiCall (Lkotlin/jvm/functions/Function0;)Ljava/lang/Object; + public static final fun safe (Lkotlin/jvm/functions/Function0;)Ljava/lang/Object; + public static final fun safeApiCall (Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static final fun safeAsync (Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static final fun safeFail (Ljava/lang/Throwable;)Lcom/lagradost/cloudstream3/mvvm/Resource; + public static final fun suspendSafeApiCall (Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static final fun throwAbleToResource (Ljava/lang/Throwable;)Lcom/lagradost/cloudstream3/mvvm/Resource; +} + +public final class com/lagradost/cloudstream3/mvvm/DebugException : java/lang/Exception { + public fun (Ljava/lang/String;)V +} + +public abstract class com/lagradost/cloudstream3/mvvm/Resource { + public static final field Companion Lcom/lagradost/cloudstream3/mvvm/Resource$Companion; +} + +public final class com/lagradost/cloudstream3/mvvm/Resource$Companion { + public final fun fromResult (Ljava/lang/Object;)Lcom/lagradost/cloudstream3/mvvm/Resource; +} + +public final class com/lagradost/cloudstream3/mvvm/Resource$Failure : com/lagradost/cloudstream3/mvvm/Resource { + public fun (ZLjava/lang/String;)V + public final fun component1 ()Z + public final fun component2 ()Ljava/lang/String; + public final fun copy (ZLjava/lang/String;)Lcom/lagradost/cloudstream3/mvvm/Resource$Failure; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/mvvm/Resource$Failure;ZLjava/lang/String;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/mvvm/Resource$Failure; + public fun equals (Ljava/lang/Object;)Z + public final fun getErrorString ()Ljava/lang/String; + public fun hashCode ()I + public final fun isNetworkError ()Z + public fun toString ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/mvvm/Resource$Loading : com/lagradost/cloudstream3/mvvm/Resource { + public fun ()V + public fun (Ljava/lang/String;)V + public synthetic fun (Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun copy (Ljava/lang/String;)Lcom/lagradost/cloudstream3/mvvm/Resource$Loading; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/mvvm/Resource$Loading;Ljava/lang/String;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/mvvm/Resource$Loading; + public fun equals (Ljava/lang/Object;)Z + public final fun getUrl ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/mvvm/Resource$Success : com/lagradost/cloudstream3/mvvm/Resource { + public fun (Ljava/lang/Object;)V + public final fun component1 ()Ljava/lang/Object; + public final fun copy (Ljava/lang/Object;)Lcom/lagradost/cloudstream3/mvvm/Resource$Success; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/mvvm/Resource$Success;Ljava/lang/Object;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/mvvm/Resource$Success; + public fun equals (Ljava/lang/Object;)Z + public final fun getValue ()Ljava/lang/Object; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/network/WebViewResolver : okhttp3/Interceptor { + public static final field Companion Lcom/lagradost/cloudstream3/network/WebViewResolver$Companion; + public fun (Lkotlin/text/Regex;Ljava/util/List;Ljava/lang/String;ZLjava/lang/String;Lkotlin/jvm/functions/Function1;J)V + public synthetic fun (Lkotlin/text/Regex;Ljava/util/List;Ljava/lang/String;ZLjava/lang/String;Lkotlin/jvm/functions/Function1;JILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun intercept (Lokhttp3/Interceptor$Chain;)Lokhttp3/Response; + public final fun resolveUsingWebView (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public final fun resolveUsingWebView (Ljava/lang/String;Ljava/lang/String;Ljava/util/Map;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public final fun resolveUsingWebView (Lokhttp3/Request;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static synthetic fun resolveUsingWebView$default (Lcom/lagradost/cloudstream3/network/WebViewResolver;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; + public static synthetic fun resolveUsingWebView$default (Lcom/lagradost/cloudstream3/network/WebViewResolver;Ljava/lang/String;Ljava/lang/String;Ljava/util/Map;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; + public static synthetic fun resolveUsingWebView$default (Lcom/lagradost/cloudstream3/network/WebViewResolver;Lokhttp3/Request;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; +} + +public final class com/lagradost/cloudstream3/network/WebViewResolver$Companion { + public final fun getDEFAULT_TIMEOUT ()J + public final fun getWebViewUserAgent ()Ljava/lang/String; + public final fun setWebViewUserAgent (Ljava/lang/String;)V +} + +public abstract class com/lagradost/cloudstream3/plugins/BasePlugin { + public fun ()V + public fun beforeUnload ()V + public final fun getFilename ()Ljava/lang/String; + public final fun get__filename ()Ljava/lang/String; + public fun load ()V + public final fun registerExtractorAPI (Lcom/lagradost/cloudstream3/utils/ExtractorApi;)V + public final fun registerMainAPI (Lcom/lagradost/cloudstream3/MainAPI;)V + public final fun setFilename (Ljava/lang/String;)V + public final fun set__filename (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/plugins/BasePlugin$Manifest { + public static final field Companion Lcom/lagradost/cloudstream3/plugins/BasePlugin$Manifest$Companion; + public fun ()V + public final fun getName ()Ljava/lang/String; + public final fun getPluginClassName ()Ljava/lang/String; + public final fun getRequiresResources ()Z + public final fun getVersion ()Ljava/lang/Integer; + public final fun setName (Ljava/lang/String;)V + public final fun setPluginClassName (Ljava/lang/String;)V + public final fun setRequiresResources (Z)V + public final fun setVersion (Ljava/lang/Integer;)V +} + +public final synthetic class com/lagradost/cloudstream3/plugins/BasePlugin$Manifest$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lcom/lagradost/cloudstream3/plugins/BasePlugin$Manifest$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lcom/lagradost/cloudstream3/plugins/BasePlugin$Manifest; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lcom/lagradost/cloudstream3/plugins/BasePlugin$Manifest;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class com/lagradost/cloudstream3/plugins/BasePlugin$Manifest$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class com/lagradost/cloudstream3/plugins/BasePluginKt { + public static final field PLUGIN_TAG Ljava/lang/String; +} + +public abstract interface annotation class com/lagradost/cloudstream3/plugins/CloudstreamPlugin : java/lang/annotation/Annotation { +} + +public final class com/lagradost/cloudstream3/syncproviders/SyncIdName : java/lang/Enum { + public static final field Anilist Lcom/lagradost/cloudstream3/syncproviders/SyncIdName; + public static final field Imdb Lcom/lagradost/cloudstream3/syncproviders/SyncIdName; + public static final field Kitsu Lcom/lagradost/cloudstream3/syncproviders/SyncIdName; + public static final field LocalList Lcom/lagradost/cloudstream3/syncproviders/SyncIdName; + public static final field MyAnimeList Lcom/lagradost/cloudstream3/syncproviders/SyncIdName; + public static final field Simkl Lcom/lagradost/cloudstream3/syncproviders/SyncIdName; + public static final field Trakt Lcom/lagradost/cloudstream3/syncproviders/SyncIdName; + public static fun getEntries ()Lkotlin/enums/EnumEntries; + public static fun valueOf (Ljava/lang/String;)Lcom/lagradost/cloudstream3/syncproviders/SyncIdName; + public static fun values ()[Lcom/lagradost/cloudstream3/syncproviders/SyncIdName; +} + +public final class com/lagradost/cloudstream3/utils/AppUtils { + public static final field INSTANCE Lcom/lagradost/cloudstream3/utils/AppUtils; + public final fun toJson (Ljava/lang/Object;)Ljava/lang/String; +} + +public class com/lagradost/cloudstream3/utils/AtomicList : java/util/List, kotlin/jvm/internal/markers/KMappedMarker { + public fun ()V + public fun (Ljava/util/List;)V + public synthetic fun (Ljava/util/List;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun add (ILjava/lang/Object;)V + public fun add (Ljava/lang/Object;)Z + public fun addAll (ILjava/util/Collection;)Z + public fun addAll (Ljava/util/Collection;)Z + public fun clear ()V + public fun contains (Ljava/lang/Object;)Z + public fun containsAll (Ljava/util/Collection;)Z + public final fun distinctBy (Lkotlin/jvm/functions/Function1;)Lcom/lagradost/cloudstream3/utils/AtomicList; + public final fun filter (Lkotlin/jvm/functions/Function1;)Lcom/lagradost/cloudstream3/utils/AtomicList; + public fun get (I)Ljava/lang/Object; + public fun getSize ()I + public fun indexOf (Ljava/lang/Object;)I + public fun isEmpty ()Z + public fun iterator ()Ljava/util/Iterator; + public fun lastIndexOf (Ljava/lang/Object;)I + public fun listIterator ()Ljava/util/ListIterator; + public fun listIterator (I)Ljava/util/ListIterator; + public final fun plus (Ljava/lang/Object;)Lcom/lagradost/cloudstream3/utils/AtomicList; + public final fun plus (Ljava/util/Collection;)Lcom/lagradost/cloudstream3/utils/AtomicList; + public fun remove (I)Ljava/lang/Object; + public fun remove (Ljava/lang/Object;)Z + public fun removeAll (Ljava/util/Collection;)Z + public fun replaceAll (Ljava/util/function/UnaryOperator;)V + public fun retainAll (Ljava/util/Collection;)Z + public fun set (ILjava/lang/Object;)Ljava/lang/Object; + public final fun size ()I + public fun sort (Ljava/util/Comparator;)V + public fun subList (II)Ljava/util/List; + public fun toArray ()[Ljava/lang/Object; + public fun toArray ([Ljava/lang/Object;)[Ljava/lang/Object; + public final fun withLock (Lkotlin/jvm/functions/Function0;)Ljava/lang/Object; +} + +public final class com/lagradost/cloudstream3/utils/AtomicMutableList : com/lagradost/cloudstream3/utils/AtomicList, java/util/List, kotlin/jvm/internal/markers/KMutableList { + public fun ()V + public fun (Ljava/util/List;)V + public synthetic fun (Ljava/util/List;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun add (ILjava/lang/Object;)V + public fun add (Ljava/lang/Object;)Z + public fun addAll (ILjava/util/Collection;)Z + public fun addAll (Ljava/util/Collection;)Z + public fun clear ()V + public fun iterator ()Ljava/util/Iterator; + public fun listIterator ()Ljava/util/ListIterator; + public fun listIterator (I)Ljava/util/ListIterator; + public final fun remove (I)Ljava/lang/Object; + public fun remove (Ljava/lang/Object;)Z + public fun removeAll (Ljava/util/Collection;)Z + public fun removeAt (I)Ljava/lang/Object; + public fun retainAll (Ljava/util/Collection;)Z + public fun set (ILjava/lang/Object;)Ljava/lang/Object; + public fun subList (II)Ljava/util/List; +} + +public final class com/lagradost/cloudstream3/utils/Coroutines { + public static final field INSTANCE Lcom/lagradost/cloudstream3/utils/Coroutines; + public final fun atomicListOf ([Ljava/lang/Object;)Lcom/lagradost/cloudstream3/utils/AtomicMutableList; + public final fun ioSafe (Ljava/lang/Object;Lkotlin/jvm/functions/Function3;)Lkotlinx/coroutines/Job; + public final fun ioWork (Ljava/lang/Object;Lkotlin/jvm/functions/Function3;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public final fun ioWorkSafe (Ljava/lang/Object;Lkotlin/jvm/functions/Function3;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public final fun main (Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/Job; + public final fun mainWork (Ljava/lang/Object;Lkotlin/jvm/functions/Function3;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public final fun runOnMainThread (Lkotlin/jvm/functions/Function0;)V + public final fun threadSafeListOf ([Ljava/lang/Object;)Ljava/util/List; +} + +public final class com/lagradost/cloudstream3/utils/Coroutines_jvmKt { + public static final fun runOnMainThreadNative (Lkotlin/jvm/functions/Function0;)V +} + +public class com/lagradost/cloudstream3/utils/DrmExtractorLink : com/lagradost/cloudstream3/utils/ExtractorLink { + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILcom/lagradost/cloudstream3/utils/ExtractorLinkType;Ljava/util/Map;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lkotlin/uuid/Uuid;Ljava/lang/String;Ljava/util/HashMap;Ljava/lang/String;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILcom/lagradost/cloudstream3/utils/ExtractorLinkType;Ljava/util/Map;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lkotlin/uuid/Uuid;Ljava/lang/String;Ljava/util/HashMap;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Lcom/lagradost/cloudstream3/utils/ExtractorLinkType;Ljava/util/Map;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lkotlin/uuid/Uuid;Ljava/lang/String;Ljava/util/HashMap;Ljava/lang/String;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Lcom/lagradost/cloudstream3/utils/ExtractorLinkType;Ljava/util/Map;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lkotlin/uuid/Uuid;Ljava/lang/String;Ljava/util/HashMap;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun getAudioTracks ()Ljava/util/List; + public fun getExtractorData ()Ljava/lang/String; + public fun getHeaders ()Ljava/util/Map; + public fun getKey ()Ljava/lang/String; + public fun getKeyRequestParameters ()Ljava/util/HashMap; + public fun getKid ()Ljava/lang/String; + public fun getKty ()Ljava/lang/String; + public fun getLicenseUrl ()Ljava/lang/String; + public fun getName ()Ljava/lang/String; + public fun getQuality ()I + public fun getReferer ()Ljava/lang/String; + public fun getSource ()Ljava/lang/String; + public fun getType ()Lcom/lagradost/cloudstream3/utils/ExtractorLinkType; + public fun getUrl ()Ljava/lang/String; + public final synthetic fun getUuid ()Ljava/util/UUID; + public fun getUuid ()Lkotlin/uuid/Uuid; + public fun setAudioTracks (Ljava/util/List;)V + public fun setExtractorData (Ljava/lang/String;)V + public fun setHeaders (Ljava/util/Map;)V + public fun setKey (Ljava/lang/String;)V + public fun setKeyRequestParameters (Ljava/util/HashMap;)V + public fun setKid (Ljava/lang/String;)V + public fun setKty (Ljava/lang/String;)V + public fun setLicenseUrl (Ljava/lang/String;)V + public fun setQuality (I)V + public fun setReferer (Ljava/lang/String;)V + public fun setType (Lcom/lagradost/cloudstream3/utils/ExtractorLinkType;)V + public final synthetic fun setUuid (Ljava/util/UUID;)V + public fun setUuid (Lkotlin/uuid/Uuid;)V +} + +public abstract class com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public fun getExtractorUrl (Ljava/lang/String;)Ljava/lang/String; + public abstract fun getMainUrl ()Ljava/lang/String; + public abstract fun getName ()Ljava/lang/String; + public abstract fun getRequiresReferer ()Z + public final fun getSafeUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static synthetic fun getSafeUrl$default (Lcom/lagradost/cloudstream3/utils/ExtractorApi;Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; + public final fun getSourcePlugin ()Ljava/lang/String; + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public fun getUrl (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static synthetic fun getUrl$default (Lcom/lagradost/cloudstream3/utils/ExtractorApi;Ljava/lang/String;Ljava/lang/String;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; + public static synthetic fun getUrl$default (Lcom/lagradost/cloudstream3/utils/ExtractorApi;Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; + public final fun setSourcePlugin (Ljava/lang/String;)V +} + +public final class com/lagradost/cloudstream3/utils/ExtractorApiKt { + public static final fun fixUrl (Lcom/lagradost/cloudstream3/utils/ExtractorApi;Ljava/lang/String;)Ljava/lang/String; + public static final fun getAndUnpack (Ljava/lang/String;)Ljava/lang/String; + public static final fun getCLEARKEY_UUID ()Ljava/util/UUID; + public static final fun getExtractorApiFromName (Ljava/lang/String;)Lcom/lagradost/cloudstream3/utils/ExtractorApi; + public static final fun getExtractorApis ()Lcom/lagradost/cloudstream3/utils/AtomicMutableList; + public static final fun getINFER_TYPE ()Lcom/lagradost/cloudstream3/utils/ExtractorLinkType; + public static final fun getPLAYREADY_UUID ()Ljava/util/UUID; + public static final fun getPacked (Ljava/lang/String;)Ljava/lang/String; + public static final fun getPostForm (Ljava/lang/String;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static final fun getQualityFromName (Ljava/lang/String;)I + public static final fun getSchemaStripRegex ()Lkotlin/text/Regex; + public static final fun getWIDEVINE_UUID ()Ljava/util/UUID; + public static final fun httpsify (Ljava/lang/String;)Ljava/lang/String; + public static final fun loadExtractor (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static final fun loadExtractor (Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static synthetic fun loadExtractor$default (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; + public static final fun newDrmExtractorLink (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/lagradost/cloudstream3/utils/ExtractorLinkType;Ljava/util/UUID;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static synthetic fun newDrmExtractorLink$default (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/lagradost/cloudstream3/utils/ExtractorLinkType;Ljava/util/UUID;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; + public static final fun newExtractorLink (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/lagradost/cloudstream3/utils/ExtractorLinkType;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static synthetic fun newExtractorLink$default (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/lagradost/cloudstream3/utils/ExtractorLinkType;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; + public static final fun requireReferer (Ljava/lang/String;)Z + public static final fun toUs (J)J + public static final fun unshortenLinkSafe (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +} + +public class com/lagradost/cloudstream3/utils/ExtractorLink : com/lagradost/cloudstream3/IDownloadableMinimum { + public static final field Companion Lcom/lagradost/cloudstream3/utils/ExtractorLink$Companion; + public synthetic fun (ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/util/Map;Ljava/lang/String;Lcom/lagradost/cloudstream3/utils/ExtractorLinkType;Ljava/util/List;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILcom/lagradost/cloudstream3/utils/ExtractorLinkType;Ljava/util/Map;Ljava/lang/String;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILcom/lagradost/cloudstream3/utils/ExtractorLinkType;Ljava/util/Map;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/util/Map;Ljava/lang/String;Lcom/lagradost/cloudstream3/utils/ExtractorLinkType;Ljava/util/List;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/util/Map;Ljava/lang/String;Lcom/lagradost/cloudstream3/utils/ExtractorLinkType;Ljava/util/List;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;IZLjava/util/Map;Ljava/lang/String;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;IZLjava/util/Map;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;IZLjava/util/Map;Ljava/lang/String;Z)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;IZLjava/util/Map;Ljava/lang/String;ZILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Lcom/lagradost/cloudstream3/utils/ExtractorLinkType;Ljava/util/Map;Ljava/lang/String;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Lcom/lagradost/cloudstream3/utils/ExtractorLinkType;Ljava/util/Map;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun getAllHeaders ()Ljava/util/Map; + public fun getAudioTracks ()Ljava/util/List; + public fun getExtractorData ()Ljava/lang/String; + public fun getHeaders ()Ljava/util/Map; + public fun getName ()Ljava/lang/String; + public fun getQuality ()I + public fun getReferer ()Ljava/lang/String; + public fun getSource ()Ljava/lang/String; + public fun getType ()Lcom/lagradost/cloudstream3/utils/ExtractorLinkType; + public fun getUrl ()Ljava/lang/String; + public final fun getVideoSize (JLkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static synthetic fun getVideoSize$default (Lcom/lagradost/cloudstream3/utils/ExtractorLink;JLkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; + public final fun isDash ()Z + public final fun isM3u8 ()Z + public fun setAudioTracks (Ljava/util/List;)V + public fun setExtractorData (Ljava/lang/String;)V + public fun setHeaders (Ljava/util/Map;)V + public fun setQuality (I)V + public fun setReferer (Ljava/lang/String;)V + public fun setType (Lcom/lagradost/cloudstream3/utils/ExtractorLinkType;)V + public fun toString ()Ljava/lang/String; + public static final synthetic fun write$Self (Lcom/lagradost/cloudstream3/utils/ExtractorLink;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final synthetic class com/lagradost/cloudstream3/utils/ExtractorLink$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lcom/lagradost/cloudstream3/utils/ExtractorLink$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lcom/lagradost/cloudstream3/utils/ExtractorLink; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lcom/lagradost/cloudstream3/utils/ExtractorLink;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class com/lagradost/cloudstream3/utils/ExtractorLink$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class com/lagradost/cloudstream3/utils/ExtractorLinkPlayList : com/lagradost/cloudstream3/utils/ExtractorLink { + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Ljava/lang/String;ILjava/util/Map;Ljava/lang/String;Lcom/lagradost/cloudstream3/utils/ExtractorLinkType;Ljava/util/List;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Ljava/lang/String;ILjava/util/Map;Ljava/lang/String;Lcom/lagradost/cloudstream3/utils/ExtractorLinkType;Ljava/util/List;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Ljava/lang/String;IZLjava/util/Map;Ljava/lang/String;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Ljava/lang/String;IZLjava/util/Map;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Ljava/util/List; + public final fun component4 ()Ljava/lang/String; + public final fun component5 ()I + public final fun component6 ()Ljava/util/Map; + public final fun component7 ()Ljava/lang/String; + public final fun component8 ()Lcom/lagradost/cloudstream3/utils/ExtractorLinkType; + public final fun component9 ()Ljava/util/List; + public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Ljava/lang/String;ILjava/util/Map;Ljava/lang/String;Lcom/lagradost/cloudstream3/utils/ExtractorLinkType;Ljava/util/List;)Lcom/lagradost/cloudstream3/utils/ExtractorLinkPlayList; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/utils/ExtractorLinkPlayList;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Ljava/lang/String;ILjava/util/Map;Ljava/lang/String;Lcom/lagradost/cloudstream3/utils/ExtractorLinkType;Ljava/util/List;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/utils/ExtractorLinkPlayList; + public fun equals (Ljava/lang/Object;)Z + public fun getAudioTracks ()Ljava/util/List; + public fun getExtractorData ()Ljava/lang/String; + public fun getHeaders ()Ljava/util/Map; + public fun getName ()Ljava/lang/String; + public final fun getPlaylist ()Ljava/util/List; + public fun getQuality ()I + public fun getReferer ()Ljava/lang/String; + public fun getSource ()Ljava/lang/String; + public fun getType ()Lcom/lagradost/cloudstream3/utils/ExtractorLinkType; + public fun hashCode ()I + public fun setAudioTracks (Ljava/util/List;)V + public fun setExtractorData (Ljava/lang/String;)V + public fun setHeaders (Ljava/util/Map;)V + public fun setQuality (I)V + public fun setReferer (Ljava/lang/String;)V + public fun setType (Lcom/lagradost/cloudstream3/utils/ExtractorLinkType;)V + public fun toString ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/utils/ExtractorLinkType : java/lang/Enum { + public static final field DASH Lcom/lagradost/cloudstream3/utils/ExtractorLinkType; + public static final field M3U8 Lcom/lagradost/cloudstream3/utils/ExtractorLinkType; + public static final field MAGNET Lcom/lagradost/cloudstream3/utils/ExtractorLinkType; + public static final field TORRENT Lcom/lagradost/cloudstream3/utils/ExtractorLinkType; + public static final field VIDEO Lcom/lagradost/cloudstream3/utils/ExtractorLinkType; + public static fun getEntries ()Lkotlin/enums/EnumEntries; + public final fun getMimeType ()Ljava/lang/String; + public static fun valueOf (Ljava/lang/String;)Lcom/lagradost/cloudstream3/utils/ExtractorLinkType; + public static fun values ()[Lcom/lagradost/cloudstream3/utils/ExtractorLinkType; +} + +public final class com/lagradost/cloudstream3/utils/HlsPlaylistParser { + public static final field INSTANCE Lcom/lagradost/cloudstream3/utils/HlsPlaylistParser; + public final fun parse (Ljava/lang/String;Ljava/lang/String;)Lcom/lagradost/cloudstream3/utils/HlsPlaylistParser$HlsMultivariantPlaylist; +} + +public final class com/lagradost/cloudstream3/utils/HlsPlaylistParser$C { + public static final field CENC_TYPE_cbc1 Ljava/lang/String; + public static final field CENC_TYPE_cbcs Ljava/lang/String; + public static final field CENC_TYPE_cenc Ljava/lang/String; + public static final field CENC_TYPE_cens Ljava/lang/String; + public static final field INSTANCE Lcom/lagradost/cloudstream3/utils/HlsPlaylistParser$C; + public static final field ROLE_FLAG_ALTERNATE I + public static final field ROLE_FLAG_CAPTION I + public static final field ROLE_FLAG_COMMENTARY I + public static final field ROLE_FLAG_DESCRIBES_MUSIC_AND_SOUND I + public static final field ROLE_FLAG_DESCRIBES_VIDEO I + public static final field ROLE_FLAG_DUB I + public static final field ROLE_FLAG_EASY_TO_READ I + public static final field ROLE_FLAG_EMERGENCY I + public static final field ROLE_FLAG_ENHANCED_DIALOG_INTELLIGIBILITY I + public static final field ROLE_FLAG_MAIN I + public static final field ROLE_FLAG_SIGN I + public static final field ROLE_FLAG_SUBTITLE I + public static final field ROLE_FLAG_SUPPLEMENTARY I + public static final field ROLE_FLAG_TRANSCRIBES_DIALOG I + public static final field ROLE_FLAG_TRICK_PLAY I + public static final field SELECTION_FLAG_AUTOSELECT I + public static final field SELECTION_FLAG_DEFAULT I + public static final field SELECTION_FLAG_FORCED I + public static final field TRACK_TYPE_AUDIO I + public static final field TRACK_TYPE_CAMERA_MOTION I + public static final field TRACK_TYPE_DEFAULT I + public static final field TRACK_TYPE_IMAGE I + public static final field TRACK_TYPE_METADATA I + public static final field TRACK_TYPE_NONE I + public static final field TRACK_TYPE_TEXT I + public static final field TRACK_TYPE_UNKNOWN I + public static final field TRACK_TYPE_VIDEO I + public final fun getCLEARKEY_UUID ()Ljava/util/UUID; + public final fun getPLAYREADY_UUID ()Ljava/util/UUID; + public final fun getWIDEVINE_UUID ()Ljava/util/UUID; +} + +public final class com/lagradost/cloudstream3/utils/HlsPlaylistParser$DrmInitData { + public fun (Ljava/lang/String;[Lcom/lagradost/cloudstream3/utils/HlsPlaylistParser$SchemeData;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()[Lcom/lagradost/cloudstream3/utils/HlsPlaylistParser$SchemeData; + public final fun copy (Ljava/lang/String;[Lcom/lagradost/cloudstream3/utils/HlsPlaylistParser$SchemeData;)Lcom/lagradost/cloudstream3/utils/HlsPlaylistParser$DrmInitData; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/utils/HlsPlaylistParser$DrmInitData;Ljava/lang/String;[Lcom/lagradost/cloudstream3/utils/HlsPlaylistParser$SchemeData;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/utils/HlsPlaylistParser$DrmInitData; + public fun equals (Ljava/lang/Object;)Z + public final fun getSchemeDatas ()[Lcom/lagradost/cloudstream3/utils/HlsPlaylistParser$SchemeData; + public final fun getSchemeType ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/utils/HlsPlaylistParser$Format { + public static final field Companion Lcom/lagradost/cloudstream3/utils/HlsPlaylistParser$Format$Companion; + public static final field NO_VALUE I + public fun ()V + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;IIIIILjava/lang/String;Ljava/lang/String;Ljava/lang/String;IIFIFII)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;IIIIILjava/lang/String;Ljava/lang/String;Ljava/lang/String;IIFIFIIILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component10 ()Ljava/lang/String; + public final fun component11 ()Ljava/lang/String; + public final fun component12 ()I + public final fun component13 ()I + public final fun component14 ()F + public final fun component15 ()I + public final fun component16 ()F + public final fun component17 ()I + public final fun component18 ()I + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Ljava/lang/String; + public final fun component4 ()I + public final fun component5 ()I + public final fun component6 ()I + public final fun component7 ()I + public final fun component8 ()I + public final fun component9 ()Ljava/lang/String; + public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;IIIIILjava/lang/String;Ljava/lang/String;Ljava/lang/String;IIFIFII)Lcom/lagradost/cloudstream3/utils/HlsPlaylistParser$Format; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/utils/HlsPlaylistParser$Format;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;IIIIILjava/lang/String;Ljava/lang/String;Ljava/lang/String;IIFIFIIILjava/lang/Object;)Lcom/lagradost/cloudstream3/utils/HlsPlaylistParser$Format; + public fun equals (Ljava/lang/Object;)Z + public final fun getAccessibilityChannel ()I + public final fun getAverageBitrate ()I + public final fun getBitrate ()I + public final fun getChannelCount ()I + public final fun getCodecs ()Ljava/lang/String; + public final fun getContainerMimeType ()Ljava/lang/String; + public final fun getFrameRate ()F + public final fun getHeight ()I + public final fun getId ()Ljava/lang/String; + public final fun getLabel ()Ljava/lang/String; + public final fun getLanguage ()Ljava/lang/String; + public final fun getPeakBitrate ()I + public final fun getPixelWidthHeightRatio ()F + public final fun getRoleFlags ()I + public final fun getRotationDegrees ()I + public final fun getSampleMimeType ()Ljava/lang/String; + public final fun getSelectionFlags ()I + public final fun getWidth ()I + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/utils/HlsPlaylistParser$Format$Companion { +} + +public final class com/lagradost/cloudstream3/utils/HlsPlaylistParser$HlsMultivariantPlaylist { + public fun (Ljava/lang/String;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Lcom/lagradost/cloudstream3/utils/HlsPlaylistParser$Format;Ljava/util/List;Ljava/util/Map;Ljava/util/List;Z)V + public synthetic fun (Ljava/lang/String;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Lcom/lagradost/cloudstream3/utils/HlsPlaylistParser$Format;Ljava/util/List;Ljava/util/Map;Ljava/util/List;ZILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component10 ()Ljava/util/Map; + public final fun component11 ()Ljava/util/List; + public final fun component12 ()Z + public final fun component2 ()Ljava/util/List; + public final fun component3 ()Ljava/util/List; + public final fun component4 ()Ljava/util/List; + public final fun component5 ()Ljava/util/List; + public final fun component6 ()Ljava/util/List; + public final fun component7 ()Ljava/util/List; + public final fun component8 ()Lcom/lagradost/cloudstream3/utils/HlsPlaylistParser$Format; + public final fun component9 ()Ljava/util/List; + public final fun copy (Ljava/lang/String;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Lcom/lagradost/cloudstream3/utils/HlsPlaylistParser$Format;Ljava/util/List;Ljava/util/Map;Ljava/util/List;Z)Lcom/lagradost/cloudstream3/utils/HlsPlaylistParser$HlsMultivariantPlaylist; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/utils/HlsPlaylistParser$HlsMultivariantPlaylist;Ljava/lang/String;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Lcom/lagradost/cloudstream3/utils/HlsPlaylistParser$Format;Ljava/util/List;Ljava/util/Map;Ljava/util/List;ZILjava/lang/Object;)Lcom/lagradost/cloudstream3/utils/HlsPlaylistParser$HlsMultivariantPlaylist; + public fun equals (Ljava/lang/Object;)Z + public final fun getAudios ()Ljava/util/List; + public final fun getBaseUri ()Ljava/lang/String; + public final fun getClosedCaptions ()Ljava/util/List; + public final fun getHasIndependentSegments ()Z + public final fun getMuxedAudioFormat ()Lcom/lagradost/cloudstream3/utils/HlsPlaylistParser$Format; + public final fun getMuxedCaptionFormats ()Ljava/util/List; + public final fun getSessionKeyDrmInitData ()Ljava/util/List; + public final fun getSubtitles ()Ljava/util/List; + public final fun getTags ()Ljava/util/List; + public final fun getVariableDefinitions ()Ljava/util/Map; + public final fun getVariants ()Ljava/util/List; + public final fun getVideos ()Ljava/util/List; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/utils/HlsPlaylistParser$MimeTypes { + public static final field APPLICATION_AIT Ljava/lang/String; + public static final field APPLICATION_CAMERA_MOTION Ljava/lang/String; + public static final field APPLICATION_CEA608 Ljava/lang/String; + public static final field APPLICATION_CEA708 Ljava/lang/String; + public static final field APPLICATION_DEPTH_METADATA Ljava/lang/String; + public static final field APPLICATION_DVBSUBS Ljava/lang/String; + public static final field APPLICATION_EMSG Ljava/lang/String; + public static final field APPLICATION_EXIF Ljava/lang/String; + public static final field APPLICATION_EXTERNALLY_LOADED_IMAGE Ljava/lang/String; + public static final field APPLICATION_ICY Ljava/lang/String; + public static final field APPLICATION_ID3 Ljava/lang/String; + public static final field APPLICATION_M3U8 Ljava/lang/String; + public static final field APPLICATION_MATROSKA Ljava/lang/String; + public static final field APPLICATION_MEDIA3_CUES Ljava/lang/String; + public static final field APPLICATION_MP4 Ljava/lang/String; + public static final field APPLICATION_MP4CEA608 Ljava/lang/String; + public static final field APPLICATION_MP4VTT Ljava/lang/String; + public static final field APPLICATION_MPD Ljava/lang/String; + public static final field APPLICATION_PGS Ljava/lang/String; + public static final field APPLICATION_RTSP Ljava/lang/String; + public static final field APPLICATION_SCTE35 Ljava/lang/String; + public static final field APPLICATION_SDP Ljava/lang/String; + public static final field APPLICATION_SS Ljava/lang/String; + public static final field APPLICATION_SUBRIP Ljava/lang/String; + public static final field APPLICATION_TTML Ljava/lang/String; + public static final field APPLICATION_TX3G Ljava/lang/String; + public static final field APPLICATION_VOBSUB Ljava/lang/String; + public static final field APPLICATION_WEBM Ljava/lang/String; + public static final field AUDIO_AAC Ljava/lang/String; + public static final field AUDIO_AC3 Ljava/lang/String; + public static final field AUDIO_AC4 Ljava/lang/String; + public static final field AUDIO_ALAC Ljava/lang/String; + public static final field AUDIO_ALAW Ljava/lang/String; + public static final field AUDIO_AMR Ljava/lang/String; + public static final field AUDIO_AMR_NB Ljava/lang/String; + public static final field AUDIO_AMR_WB Ljava/lang/String; + public static final field AUDIO_DTS Ljava/lang/String; + public static final field AUDIO_DTS_EXPRESS Ljava/lang/String; + public static final field AUDIO_DTS_HD Ljava/lang/String; + public static final field AUDIO_DTS_X Ljava/lang/String; + public static final field AUDIO_EXOPLAYER_MIDI Ljava/lang/String; + public static final field AUDIO_E_AC3 Ljava/lang/String; + public static final field AUDIO_E_AC3_JOC Ljava/lang/String; + public static final field AUDIO_FLAC Ljava/lang/String; + public static final field AUDIO_IAMF Ljava/lang/String; + public static final field AUDIO_MATROSKA Ljava/lang/String; + public static final field AUDIO_MIDI Ljava/lang/String; + public static final field AUDIO_MLAW Ljava/lang/String; + public static final field AUDIO_MP4 Ljava/lang/String; + public static final field AUDIO_MPEG Ljava/lang/String; + public static final field AUDIO_MPEGH_MHA1 Ljava/lang/String; + public static final field AUDIO_MPEGH_MHM1 Ljava/lang/String; + public static final field AUDIO_MPEG_L1 Ljava/lang/String; + public static final field AUDIO_MPEG_L2 Ljava/lang/String; + public static final field AUDIO_MSGSM Ljava/lang/String; + public static final field AUDIO_OGG Ljava/lang/String; + public static final field AUDIO_OPUS Ljava/lang/String; + public static final field AUDIO_RAW Ljava/lang/String; + public static final field AUDIO_TRUEHD Ljava/lang/String; + public static final field AUDIO_UNKNOWN Ljava/lang/String; + public static final field AUDIO_VORBIS Ljava/lang/String; + public static final field AUDIO_WAV Ljava/lang/String; + public static final field AUDIO_WEBM Ljava/lang/String; + public static final field BASE_TYPE_APPLICATION Ljava/lang/String; + public static final field BASE_TYPE_AUDIO Ljava/lang/String; + public static final field BASE_TYPE_IMAGE Ljava/lang/String; + public static final field BASE_TYPE_TEXT Ljava/lang/String; + public static final field BASE_TYPE_VIDEO Ljava/lang/String; + public static final field CODEC_E_AC3_JOC Ljava/lang/String; + public static final field IMAGE_AVIF Ljava/lang/String; + public static final field IMAGE_BMP Ljava/lang/String; + public static final field IMAGE_HEIC Ljava/lang/String; + public static final field IMAGE_HEIF Ljava/lang/String; + public static final field IMAGE_JPEG Ljava/lang/String; + public static final field IMAGE_JPEG_R Ljava/lang/String; + public static final field IMAGE_PNG Ljava/lang/String; + public static final field IMAGE_RAW Ljava/lang/String; + public static final field IMAGE_WEBP Ljava/lang/String; + public static final field INSTANCE Lcom/lagradost/cloudstream3/utils/HlsPlaylistParser$MimeTypes; + public static final field TEXT_SSA Ljava/lang/String; + public static final field TEXT_UNKNOWN Ljava/lang/String; + public static final field TEXT_VTT Ljava/lang/String; + public static final field VIDEO_APV Ljava/lang/String; + public static final field VIDEO_AV1 Ljava/lang/String; + public static final field VIDEO_AVI Ljava/lang/String; + public static final field VIDEO_DIVX Ljava/lang/String; + public static final field VIDEO_DOLBY_VISION Ljava/lang/String; + public static final field VIDEO_FLV Ljava/lang/String; + public static final field VIDEO_H263 Ljava/lang/String; + public static final field VIDEO_H264 Ljava/lang/String; + public static final field VIDEO_H265 Ljava/lang/String; + public static final field VIDEO_MATROSKA Ljava/lang/String; + public static final field VIDEO_MJPEG Ljava/lang/String; + public static final field VIDEO_MP2T Ljava/lang/String; + public static final field VIDEO_MP4 Ljava/lang/String; + public static final field VIDEO_MP42 Ljava/lang/String; + public static final field VIDEO_MP43 Ljava/lang/String; + public static final field VIDEO_MP4V Ljava/lang/String; + public static final field VIDEO_MPEG Ljava/lang/String; + public static final field VIDEO_MPEG2 Ljava/lang/String; + public static final field VIDEO_MV_HEVC Ljava/lang/String; + public static final field VIDEO_OGG Ljava/lang/String; + public static final field VIDEO_PS Ljava/lang/String; + public static final field VIDEO_RAW Ljava/lang/String; + public static final field VIDEO_UNKNOWN Ljava/lang/String; + public static final field VIDEO_VC1 Ljava/lang/String; + public static final field VIDEO_VP8 Ljava/lang/String; + public static final field VIDEO_VP9 Ljava/lang/String; + public static final field VIDEO_WEBM Ljava/lang/String; + public final fun getMediaMimeType (Ljava/lang/String;)Ljava/lang/String; + public final fun getMimeTypeFromMp4ObjectType (I)Ljava/lang/String; + public final fun getObjectTypeFromMp4aRFC6381CodecString (Ljava/lang/String;)Lcom/lagradost/cloudstream3/utils/HlsPlaylistParser$MimeTypes$Mp4aObjectType; + public final fun getTrackType (Ljava/lang/String;)I + public final fun getTrackTypeOfCodec (Ljava/lang/String;)I + public final fun isAudio (Ljava/lang/String;)Z + public final fun isDolbyVisionCodec (Ljava/lang/String;Ljava/lang/String;)Z + public final fun isImage (Ljava/lang/String;)Z + public final fun isText (Ljava/lang/String;)Z + public final fun isVideo (Ljava/lang/String;)Z +} + +public final class com/lagradost/cloudstream3/utils/HlsPlaylistParser$MimeTypes$Mp4aObjectType { + public fun (II)V + public final fun component1 ()I + public final fun component2 ()I + public final fun copy (II)Lcom/lagradost/cloudstream3/utils/HlsPlaylistParser$MimeTypes$Mp4aObjectType; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/utils/HlsPlaylistParser$MimeTypes$Mp4aObjectType;IIILjava/lang/Object;)Lcom/lagradost/cloudstream3/utils/HlsPlaylistParser$MimeTypes$Mp4aObjectType; + public fun equals (Ljava/lang/Object;)Z + public final fun getAudioObjectTypeIndication ()I + public final fun getObjectTypeIndication ()I + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/utils/HlsPlaylistParser$Mp4Box { + public static final field FULL_HEADER_SIZE I + public static final field INSTANCE Lcom/lagradost/cloudstream3/utils/HlsPlaylistParser$Mp4Box; + public static final field TYPE_pssh I +} + +public final class com/lagradost/cloudstream3/utils/HlsPlaylistParser$ParserException : java/io/IOException { + public static final field Companion Lcom/lagradost/cloudstream3/utils/HlsPlaylistParser$ParserException$Companion; + public static final field DATA_TYPE_MANIFEST I + public fun (Ljava/lang/String;Ljava/lang/Throwable;ZI)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/Throwable; + public final fun component3 ()Z + public final fun component4 ()I + public final fun copy (Ljava/lang/String;Ljava/lang/Throwable;ZI)Lcom/lagradost/cloudstream3/utils/HlsPlaylistParser$ParserException; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/utils/HlsPlaylistParser$ParserException;Ljava/lang/String;Ljava/lang/Throwable;ZIILjava/lang/Object;)Lcom/lagradost/cloudstream3/utils/HlsPlaylistParser$ParserException; + public fun equals (Ljava/lang/Object;)Z + public fun getCause ()Ljava/lang/Throwable; + public final fun getContentIsMalformed ()Z + public final fun getDataType ()I + public fun getMessage ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/utils/HlsPlaylistParser$ParserException$Companion { + public final fun createForMalformedManifest (Ljava/lang/String;Ljava/lang/Throwable;)Lcom/lagradost/cloudstream3/utils/HlsPlaylistParser$ParserException; +} + +public final class com/lagradost/cloudstream3/utils/HlsPlaylistParser$PsshAtomUtil { + public static final field INSTANCE Lcom/lagradost/cloudstream3/utils/HlsPlaylistParser$PsshAtomUtil; + public final fun buildPsshAtom (Ljava/util/UUID;[Ljava/util/UUID;[B)[B +} + +public final class com/lagradost/cloudstream3/utils/HlsPlaylistParser$Rendition { + public fun (Lio/ktor/http/Url;Lcom/lagradost/cloudstream3/utils/HlsPlaylistParser$Format;Ljava/lang/String;Ljava/lang/String;)V + public final fun component1 ()Lio/ktor/http/Url; + public final fun component2 ()Lcom/lagradost/cloudstream3/utils/HlsPlaylistParser$Format; + public final fun component3 ()Ljava/lang/String; + public final fun component4 ()Ljava/lang/String; + public final fun copy (Lio/ktor/http/Url;Lcom/lagradost/cloudstream3/utils/HlsPlaylistParser$Format;Ljava/lang/String;Ljava/lang/String;)Lcom/lagradost/cloudstream3/utils/HlsPlaylistParser$Rendition; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/utils/HlsPlaylistParser$Rendition;Lio/ktor/http/Url;Lcom/lagradost/cloudstream3/utils/HlsPlaylistParser$Format;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/utils/HlsPlaylistParser$Rendition; + public fun equals (Ljava/lang/Object;)Z + public final fun getFormat ()Lcom/lagradost/cloudstream3/utils/HlsPlaylistParser$Format; + public final fun getGroupId ()Ljava/lang/String; + public final fun getName ()Ljava/lang/String; + public final fun getUrl ()Lio/ktor/http/Url; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/utils/HlsPlaylistParser$SchemeData { + public fun (Ljava/util/UUID;Ljava/lang/String;Ljava/lang/String;[B)V + public synthetic fun (Ljava/util/UUID;Ljava/lang/String;Ljava/lang/String;[BILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/util/UUID; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Ljava/lang/String; + public final fun component4 ()[B + public final fun copy (Ljava/util/UUID;Ljava/lang/String;Ljava/lang/String;[B)Lcom/lagradost/cloudstream3/utils/HlsPlaylistParser$SchemeData; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/utils/HlsPlaylistParser$SchemeData;Ljava/util/UUID;Ljava/lang/String;Ljava/lang/String;[BILjava/lang/Object;)Lcom/lagradost/cloudstream3/utils/HlsPlaylistParser$SchemeData; + public fun equals (Ljava/lang/Object;)Z + public final fun getData ()[B + public final fun getLicenseServerUrl ()Ljava/lang/String; + public final fun getMimeType ()Ljava/lang/String; + public final fun getUuid ()Ljava/util/UUID; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/utils/HlsPlaylistParser$UrlUtil { + public static final field INSTANCE Lcom/lagradost/cloudstream3/utils/HlsPlaylistParser$UrlUtil; + public final fun resolveToUrl (Ljava/lang/String;Ljava/lang/String;)Lio/ktor/http/Url; +} + +public final class com/lagradost/cloudstream3/utils/HlsPlaylistParser$Util { + public static final field INSTANCE Lcom/lagradost/cloudstream3/utils/HlsPlaylistParser$Util; + public final fun getCodecsOfType (Ljava/lang/String;I)Ljava/lang/String; + public final fun getCodecsWithoutType (Ljava/lang/String;I)Ljava/lang/String; + public final fun split (Ljava/lang/String;Ljava/lang/String;)[Ljava/lang/String; + public final fun splitAtFirst (Ljava/lang/String;Ljava/lang/String;)[Ljava/lang/String; + public final fun splitCodecs (Ljava/lang/String;)[Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/utils/HlsPlaylistParser$Variant { + public fun (Lio/ktor/http/Url;Lcom/lagradost/cloudstream3/utils/HlsPlaylistParser$Format;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V + public final fun component1 ()Lio/ktor/http/Url; + public final fun component2 ()Lcom/lagradost/cloudstream3/utils/HlsPlaylistParser$Format; + public final fun component3 ()Ljava/lang/String; + public final fun component4 ()Ljava/lang/String; + public final fun component5 ()Ljava/lang/String; + public final fun component6 ()Ljava/lang/String; + public final fun copy (Lio/ktor/http/Url;Lcom/lagradost/cloudstream3/utils/HlsPlaylistParser$Format;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lcom/lagradost/cloudstream3/utils/HlsPlaylistParser$Variant; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/utils/HlsPlaylistParser$Variant;Lio/ktor/http/Url;Lcom/lagradost/cloudstream3/utils/HlsPlaylistParser$Format;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/utils/HlsPlaylistParser$Variant; + public fun equals (Ljava/lang/Object;)Z + public final fun getAudioGroupId ()Ljava/lang/String; + public final fun getCaptionGroupId ()Ljava/lang/String; + public final fun getFormat ()Lcom/lagradost/cloudstream3/utils/HlsPlaylistParser$Format; + public final fun getSubtitleGroupId ()Ljava/lang/String; + public final fun getUrl ()Lio/ktor/http/Url; + public final fun getVideoGroupId ()Ljava/lang/String; + public fun hashCode ()I + public final fun isPlayableStandalone (Lcom/lagradost/cloudstream3/utils/HlsPlaylistParser$HlsMultivariantPlaylist;)Z + public final fun isTrickPlay ()Z + public final fun mustContainAudio (Lcom/lagradost/cloudstream3/utils/HlsPlaylistParser$HlsMultivariantPlaylist;)Z + public fun toString ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/utils/HlsPlaylistParser$VariantInfo { + public fun (IILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V + public synthetic fun (IILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()I + public final fun component2 ()I + public final fun component3 ()Ljava/lang/String; + public final fun component4 ()Ljava/lang/String; + public final fun component5 ()Ljava/lang/String; + public final fun component6 ()Ljava/lang/String; + public final fun copy (IILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lcom/lagradost/cloudstream3/utils/HlsPlaylistParser$VariantInfo; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/utils/HlsPlaylistParser$VariantInfo;IILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/utils/HlsPlaylistParser$VariantInfo; + public fun equals (Ljava/lang/Object;)Z + public final fun getAudioGroupId ()Ljava/lang/String; + public final fun getAverageBitrate ()I + public final fun getCaptionGroupId ()Ljava/lang/String; + public final fun getPeakBitrate ()I + public final fun getSubtitleGroupId ()Ljava/lang/String; + public final fun getVideoGroupId ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/utils/JsContext { + public synthetic fun (JJLkotlinx/coroutines/CoroutineScope;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun eval (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public final fun get (Ljava/lang/String;)Ljava/lang/Object; + public final fun getMaxExecutionTime-UwyO8pc ()J + public final fun getMaxInstructions ()J + public final fun set (Ljava/lang/String;Ljava/lang/Object;)V + public final fun setMaxExecutionTime-LRDsOJo (J)V + public final fun setMaxInstructions (J)V +} + +public final class com/lagradost/cloudstream3/utils/JsHunter { + public fun (Ljava/lang/String;)V + public final fun dehunt ()Ljava/lang/String; + public final fun detect ()Z +} + +public final class com/lagradost/cloudstream3/utils/JsInterpreterKt { + public static final fun evalJs-1Y68eR8 (Ljava/lang/String;Ljava/lang/String;JJLkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static synthetic fun evalJs-1Y68eR8$default (Ljava/lang/String;Ljava/lang/String;JJLkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; + public static final fun jsValueToString (Ljava/lang/Object;)Ljava/lang/String; + public static final fun newJsContext (Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static synthetic fun newJsContext$default (Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; +} + +public final class com/lagradost/cloudstream3/utils/JsUnpacker { + public static final field Companion Lcom/lagradost/cloudstream3/utils/JsUnpacker$Companion; + public fun (Ljava/lang/String;)V + public final fun detect ()Z + public final fun unpack ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/utils/JsUnpacker$Companion { + public final fun getC ()Ljava/util/List; + public final fun getZ ()Ljava/util/List; + public final fun load (Ljava/lang/String;)Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/utils/Levenshtein { + public static final field INSTANCE Lcom/lagradost/cloudstream3/utils/Levenshtein; + public final fun partialRatio (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)I + public static synthetic fun partialRatio$default (Lcom/lagradost/cloudstream3/utils/Levenshtein;Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)I + public final fun ratio (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)I + public static synthetic fun ratio$default (Lcom/lagradost/cloudstream3/utils/Levenshtein;Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)I +} + +public final class com/lagradost/cloudstream3/utils/M3u8Helper { + public static final field Companion Lcom/lagradost/cloudstream3/utils/M3u8Helper$Companion; + public fun ()V + public final fun m3u8Generation (Lcom/lagradost/cloudstream3/utils/M3u8Helper$M3u8Stream;Ljava/lang/Boolean;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static synthetic fun m3u8Generation$default (Lcom/lagradost/cloudstream3/utils/M3u8Helper;Lcom/lagradost/cloudstream3/utils/M3u8Helper$M3u8Stream;Ljava/lang/Boolean;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; +} + +public final class com/lagradost/cloudstream3/utils/M3u8Helper$Companion { + public final fun generateM3u8 (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Ljava/util/Map;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static synthetic fun generateM3u8$default (Lcom/lagradost/cloudstream3/utils/M3u8Helper$Companion;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Ljava/util/Map;Ljava/lang/String;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; +} + +public final class com/lagradost/cloudstream3/utils/M3u8Helper$M3u8Stream { + public fun (Ljava/lang/String;Ljava/lang/Integer;Ljava/util/Map;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/Integer;Ljava/util/Map;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/Integer; + public final fun component3 ()Ljava/util/Map; + public final fun copy (Ljava/lang/String;Ljava/lang/Integer;Ljava/util/Map;)Lcom/lagradost/cloudstream3/utils/M3u8Helper$M3u8Stream; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/utils/M3u8Helper$M3u8Stream;Ljava/lang/String;Ljava/lang/Integer;Ljava/util/Map;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/utils/M3u8Helper$M3u8Stream; + public fun equals (Ljava/lang/Object;)Z + public final fun getHeaders ()Ljava/util/Map; + public final fun getQuality ()Ljava/lang/Integer; + public final fun getStreamUrl ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/utils/M3u8Helper2 { + public static final field INSTANCE Lcom/lagradost/cloudstream3/utils/M3u8Helper2; + public final fun generateM3u8 (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Ljava/util/Map;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static synthetic fun generateM3u8$default (Lcom/lagradost/cloudstream3/utils/M3u8Helper2;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Ljava/util/Map;Ljava/lang/String;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; + public final fun getDecrypted ([B[B[BI)[B + public static synthetic fun getDecrypted$default (Lcom/lagradost/cloudstream3/utils/M3u8Helper2;[B[B[BIILjava/lang/Object;)[B + public final fun hslLazy (Lcom/lagradost/cloudstream3/utils/M3u8Helper$M3u8Stream;ZZILkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static synthetic fun hslLazy$default (Lcom/lagradost/cloudstream3/utils/M3u8Helper2;Lcom/lagradost/cloudstream3/utils/M3u8Helper$M3u8Stream;ZZILkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; + public final fun m3u8Generation (Lcom/lagradost/cloudstream3/utils/M3u8Helper$M3u8Stream;ZLkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static synthetic fun m3u8Generation$default (Lcom/lagradost/cloudstream3/utils/M3u8Helper2;Lcom/lagradost/cloudstream3/utils/M3u8Helper$M3u8Stream;ZLkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; +} + +public final class com/lagradost/cloudstream3/utils/M3u8Helper2$LazyHlsDownloadData { + public fun ([B[BZLjava/util/List;Ljava/lang/String;Ljava/util/Map;)V + public final fun component3 ()Z + public final fun component4 ()Ljava/util/List; + public final fun component5 ()Ljava/lang/String; + public final fun component6 ()Ljava/util/Map; + public final fun copy ([B[BZLjava/util/List;Ljava/lang/String;Ljava/util/Map;)Lcom/lagradost/cloudstream3/utils/M3u8Helper2$LazyHlsDownloadData; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/utils/M3u8Helper2$LazyHlsDownloadData;[B[BZLjava/util/List;Ljava/lang/String;Ljava/util/Map;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/utils/M3u8Helper2$LazyHlsDownloadData; + public fun equals (Ljava/lang/Object;)Z + public final fun getAllTsLinks ()Ljava/util/List; + public final fun getHeaders ()Ljava/util/Map; + public final fun getRelativeUrl ()Ljava/lang/String; + public final fun getSize ()I + public fun hashCode ()I + public final fun isEncrypted ()Z + public final fun resolveLink (ILkotlin/coroutines/Continuation;)Ljava/lang/Object; + public final fun resolveLinkSafe (IIJLkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static synthetic fun resolveLinkSafe$default (Lcom/lagradost/cloudstream3/utils/M3u8Helper2$LazyHlsDownloadData;IIJLkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; + public final fun resolveLinkWhileSafe (IIJLkotlin/jvm/functions/Function0;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static synthetic fun resolveLinkWhileSafe$default (Lcom/lagradost/cloudstream3/utils/M3u8Helper2$LazyHlsDownloadData;IIJLkotlin/jvm/functions/Function0;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; + public fun toString ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/utils/M3u8Helper2$TsLink { + public fun (Ljava/lang/String;Ljava/lang/Double;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/Double; + public final fun copy (Ljava/lang/String;Ljava/lang/Double;)Lcom/lagradost/cloudstream3/utils/M3u8Helper2$TsLink; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/utils/M3u8Helper2$TsLink;Ljava/lang/String;Ljava/lang/Double;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/utils/M3u8Helper2$TsLink; + public fun equals (Ljava/lang/Object;)Z + public final fun getTime ()Ljava/lang/Double; + public final fun getUrl ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/utils/PlayListItem { + public fun (Ljava/lang/String;J)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()J + public final fun copy (Ljava/lang/String;J)Lcom/lagradost/cloudstream3/utils/PlayListItem; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/utils/PlayListItem;Ljava/lang/String;JILjava/lang/Object;)Lcom/lagradost/cloudstream3/utils/PlayListItem; + public fun equals (Ljava/lang/Object;)Z + public final fun getDurationUs ()J + public final fun getUrl ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/utils/Qualities : java/lang/Enum { + public static final field Companion Lcom/lagradost/cloudstream3/utils/Qualities$Companion; + public static final field P1080 Lcom/lagradost/cloudstream3/utils/Qualities; + public static final field P144 Lcom/lagradost/cloudstream3/utils/Qualities; + public static final field P1440 Lcom/lagradost/cloudstream3/utils/Qualities; + public static final field P2160 Lcom/lagradost/cloudstream3/utils/Qualities; + public static final field P240 Lcom/lagradost/cloudstream3/utils/Qualities; + public static final field P360 Lcom/lagradost/cloudstream3/utils/Qualities; + public static final field P480 Lcom/lagradost/cloudstream3/utils/Qualities; + public static final field P720 Lcom/lagradost/cloudstream3/utils/Qualities; + public static final field Unknown Lcom/lagradost/cloudstream3/utils/Qualities; + public final fun getDefaultPriority ()I + public static fun getEntries ()Lkotlin/enums/EnumEntries; + public final fun getValue ()I + public final fun setValue (I)V + public static fun valueOf (Ljava/lang/String;)Lcom/lagradost/cloudstream3/utils/Qualities; + public static fun values ()[Lcom/lagradost/cloudstream3/utils/Qualities; +} + +public final class com/lagradost/cloudstream3/utils/Qualities$Companion { + public final fun getStringByInt (Ljava/lang/Integer;)Ljava/lang/String; + public final fun getStringByIntFull (I)Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/utils/ShortLink { + public static final field INSTANCE Lcom/lagradost/cloudstream3/utils/ShortLink; + public final fun isShortLink (Ljava/lang/String;)Z + public final fun unshorten (Ljava/lang/String;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static synthetic fun unshorten$default (Lcom/lagradost/cloudstream3/utils/ShortLink;Ljava/lang/String;Ljava/lang/String;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; + public final fun unshortenAdfly (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public final fun unshortenDavisonbarker (Ljava/lang/String;)Ljava/lang/String; + public final fun unshortenIsecure (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public final fun unshortenLinksafe (Ljava/lang/String;)Ljava/lang/String; + public final fun unshortenLinkup (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public final fun unshortenNuovoIndirizzo (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public final fun unshortenNuovoLink (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public final fun unshortenUprot (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +} + +public final class com/lagradost/cloudstream3/utils/ShortLink$ShortUrl { + public fun (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function2;)V + public fun (Lkotlin/text/Regex;Ljava/lang/String;Lkotlin/jvm/functions/Function2;)V + public final fun component1 ()Lkotlin/text/Regex; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Lkotlin/jvm/functions/Function2; + public final fun copy (Lkotlin/text/Regex;Ljava/lang/String;Lkotlin/jvm/functions/Function2;)Lcom/lagradost/cloudstream3/utils/ShortLink$ShortUrl; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/utils/ShortLink$ShortUrl;Lkotlin/text/Regex;Ljava/lang/String;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/utils/ShortLink$ShortUrl; + public fun equals (Ljava/lang/Object;)Z + public final fun getFunction ()Lkotlin/jvm/functions/Function2; + public final fun getRegex ()Lkotlin/text/Regex; + public final fun getType ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/utils/StringUtils { + public static final field INSTANCE Lcom/lagradost/cloudstream3/utils/StringUtils; + public final fun decodeUri (Ljava/lang/String;)Ljava/lang/String; + public final fun decodeUrl (Ljava/lang/String;)Ljava/lang/String; + public final fun encodeUri (Ljava/lang/String;)Ljava/lang/String; + public final fun encodeUrl (Ljava/lang/String;)Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/utils/SubtitleHelper { + public static final field INSTANCE Lcom/lagradost/cloudstream3/utils/SubtitleHelper; + public final fun fromCodeToLangTagIETF (Ljava/lang/String;)Ljava/lang/String; + public final fun fromCodeToOpenSubtitlesTag (Ljava/lang/String;)Ljava/lang/String; + public final fun fromLanguageToTagIETF (Ljava/lang/String;Ljava/lang/Boolean;)Ljava/lang/String; + public static synthetic fun fromLanguageToTagIETF$default (Lcom/lagradost/cloudstream3/utils/SubtitleHelper;Ljava/lang/String;Ljava/lang/Boolean;ILjava/lang/Object;)Ljava/lang/String; + public final fun fromLanguageToThreeLetters (Ljava/lang/String;)Ljava/lang/String; + public final fun fromLanguageToTwoLetters (Ljava/lang/String;Z)Ljava/lang/String; + public final fun fromTagToEnglishLanguageName (Ljava/lang/String;)Ljava/lang/String; + public final fun fromTagToLanguageName (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; + public static synthetic fun fromTagToLanguageName$default (Lcom/lagradost/cloudstream3/utils/SubtitleHelper;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Ljava/lang/String; + public final fun fromThreeLettersToLanguage (Ljava/lang/String;)Ljava/lang/String; + public final fun fromTwoLettersToLanguage (Ljava/lang/String;)Ljava/lang/String; + public final fun getFlagFromIso (Ljava/lang/String;)Ljava/lang/String; + public final fun getIndexMapIETF_tag ()Ljava/util/Map; + public final fun getIndexMapISO_639_1 ()Ljava/util/Map; + public final fun getIndexMapISO_639_2_B ()Ljava/util/Map; + public final fun getIndexMapISO_639_3 ()Ljava/util/Map; + public final fun getIndexMapLanguageName ()Ljava/util/Map; + public final fun getIndexMapNativeName ()Ljava/util/Map; + public final fun getIndexMapOpenSubtitles ()Ljava/util/Map; + public final fun getLanguages ()Ljava/util/List; + public final fun getNameNextToFlagEmoji (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; + public static synthetic fun getNameNextToFlagEmoji$default (Lcom/lagradost/cloudstream3/utils/SubtitleHelper;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Ljava/lang/String; + public final fun isWellFormedTagIETF (Ljava/lang/String;)Z +} + +public final class com/lagradost/cloudstream3/utils/SubtitleHelper$Language639 { + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Ljava/lang/String; + public final fun component4 ()Ljava/lang/String; + public final fun component5 ()Ljava/lang/String; + public final fun component6 ()Ljava/lang/String; + public final fun component7 ()Ljava/lang/String; + public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lcom/lagradost/cloudstream3/utils/SubtitleHelper$Language639; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/utils/SubtitleHelper$Language639;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/utils/SubtitleHelper$Language639; + public fun equals (Ljava/lang/Object;)Z + public final fun getISO_639_1 ()Ljava/lang/String; + public final fun getISO_639_2_B ()Ljava/lang/String; + public final fun getISO_639_2_T ()Ljava/lang/String; + public final fun getISO_639_3 ()Ljava/lang/String; + public final fun getISO_639_6 ()Ljava/lang/String; + public final fun getLanguageName ()Ljava/lang/String; + public final fun getNativeName ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/utils/SubtitleHelper$LanguageMetadata { + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Ljava/lang/String; + public final fun component4 ()Ljava/lang/String; + public final fun component5 ()Ljava/lang/String; + public final fun component6 ()Ljava/lang/String; + public final fun component7 ()Ljava/lang/String; + public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lcom/lagradost/cloudstream3/utils/SubtitleHelper$LanguageMetadata; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/utils/SubtitleHelper$LanguageMetadata;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/utils/SubtitleHelper$LanguageMetadata; + public fun equals (Ljava/lang/Object;)Z + public final fun getIETF_tag ()Ljava/lang/String; + public final fun getISO_639_1 ()Ljava/lang/String; + public final fun getISO_639_2_B ()Ljava/lang/String; + public final fun getISO_639_3 ()Ljava/lang/String; + public final fun getLanguageName ()Ljava/lang/String; + public final fun getNativeName ()Ljava/lang/String; + public final fun getOpenSubtitles ()Ljava/lang/String; + public fun hashCode ()I + public final fun localizedName (Ljava/lang/String;)Ljava/lang/String; + public static synthetic fun localizedName$default (Lcom/lagradost/cloudstream3/utils/SubtitleHelper$LanguageMetadata;Ljava/lang/String;ILjava/lang/Object;)Ljava/lang/String; + public final fun nameNextToFlagEmoji (Ljava/lang/String;)Ljava/lang/String; + public static synthetic fun nameNextToFlagEmoji$default (Lcom/lagradost/cloudstream3/utils/SubtitleHelper$LanguageMetadata;Ljava/lang/String;ILjava/lang/Object;)Ljava/lang/String; + public fun toString ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/utils/SubtitleHelperKt { + public static final fun getCurrentLocale ()Ljava/lang/String; +} + +public abstract class com/lagradost/cloudstream3/utils/serializers/NonEmptySerializer : kotlinx/serialization/json/JsonTransformingSerializer { + public fun (Lkotlinx/serialization/KSerializer;)V + protected fun transformSerialize (Lkotlinx/serialization/json/JsonElement;)Lkotlinx/serialization/json/JsonElement; +} + +public abstract class com/lagradost/cloudstream3/utils/serializers/WriteOnlySerializer : kotlinx/serialization/json/JsonTransformingSerializer { + public fun (Lkotlinx/serialization/KSerializer;Ljava/util/Set;)V + protected fun transformSerialize (Lkotlinx/serialization/json/JsonElement;)Lkotlinx/serialization/json/JsonElement; +} + diff --git a/library/build.gradle.kts b/library/build.gradle.kts index 979e09844..aa460164e 100644 --- a/library/build.gradle.kts +++ b/library/build.gradle.kts @@ -87,6 +87,18 @@ kotlin { androidMain { dependsOn(jvmCommonMain) } jvmMain { dependsOn(jvmCommonMain) } } + + @OptIn(org.jetbrains.kotlin.gradle.dsl.abi.ExperimentalAbiValidation::class) + // https://kotlinlang.org/docs/gradle-binary-compatibility-validation.html + abiValidation { + enabled.set(true) + this.filters { + exclude { + annotatedWith.add("com.lagradost.cloudstream3.Prerelease") + annotatedWith.add("com.lagradost.cloudstream3.InternalAPI") + } + } + } } tasks.withType { From 4a79ca1c9f90f7412bfaaa31f9ba34c276c242e8 Mon Sep 17 00:00:00 2001 From: Luna712 <142361265+Luna712@users.noreply.github.com> Date: Sat, 11 Jul 2026 13:21:11 -0600 Subject: [PATCH 33/38] Add missing types to getKey calls (#3056) --- .../main/java/com/lagradost/cloudstream3/MainActivity.kt | 4 ++-- .../com/lagradost/cloudstream3/actions/temp/VlcPackage.kt | 4 ++-- .../com/lagradost/cloudstream3/plugins/PluginManager.kt | 4 ++-- .../lagradost/cloudstream3/plugins/RepositoryManager.kt | 4 ++-- .../com/lagradost/cloudstream3/ui/player/CS3IPlayer.kt | 2 +- .../ui/player/source_priority/QualityDataHelper.kt | 6 +++--- .../lagradost/cloudstream3/ui/settings/SettingsGeneral.kt | 2 +- .../ui/subtitles/ChromecastSubtitlesFragment.kt | 2 +- .../cloudstream3/ui/subtitles/SubtitlesFragment.kt | 6 +++--- .../com/lagradost/cloudstream3/utils/DataStoreHelper.kt | 2 +- .../com/lagradost/cloudstream3/utils/TvChannelUtils.kt | 8 ++++---- 11 files changed, 22 insertions(+), 22 deletions(-) diff --git a/app/src/main/java/com/lagradost/cloudstream3/MainActivity.kt b/app/src/main/java/com/lagradost/cloudstream3/MainActivity.kt index 7db33284e..5d39f6554 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/MainActivity.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/MainActivity.kt @@ -1215,7 +1215,7 @@ class MainActivity : AppCompatActivity(), ColorPickerDialogListener, BiometricCa // backup when we update the app, I don't trust myself to not boot lock users, might want to make this a setting? safe { val appVer = BuildConfig.VERSION_NAME - val lastAppAutoBackup: String = getKey("VERSION_NAME") ?: "" + val lastAppAutoBackup: String = getKey("VERSION_NAME") ?: "" if (appVer != lastAppAutoBackup) { setKey("VERSION_NAME", BuildConfig.VERSION_NAME) if (lastAppAutoBackup.isEmpty()) return@safe @@ -2018,7 +2018,7 @@ class MainActivity : AppCompatActivity(), ColorPickerDialogListener, BiometricCa } try { - if (getKey(HAS_DONE_SETUP_KEY, false) != true) { + if (getKey(HAS_DONE_SETUP_KEY, false) != true) { navController.navigate(R.id.navigation_setup_language) // If no plugins bring up extensions screen } else if (PluginManager.getPluginsOnline().isEmpty() diff --git a/app/src/main/java/com/lagradost/cloudstream3/actions/temp/VlcPackage.kt b/app/src/main/java/com/lagradost/cloudstream3/actions/temp/VlcPackage.kt index 46b46a2c2..b6478b1d9 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/actions/temp/VlcPackage.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/actions/temp/VlcPackage.kt @@ -60,7 +60,7 @@ open class VlcPackage: OpenInAppAction( intent.putExtra("secure_uri", true) intent.putExtra("title", video.name) - val subsLang = getKey(SUBTITLE_AUTO_SELECT_KEY) ?: "en" + val subsLang = getKey(SUBTITLE_AUTO_SELECT_KEY) ?: "en" result.subs.firstOrNull { subsLang == it.languageCode }?.let { @@ -74,4 +74,4 @@ open class VlcPackage: OpenInAppAction( Log.d("VLC", "Position: $position, Duration: $duration") updateDurationAndPosition(position, duration) } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/lagradost/cloudstream3/plugins/PluginManager.kt b/app/src/main/java/com/lagradost/cloudstream3/plugins/PluginManager.kt index 829d871d2..6054bbfaf 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/plugins/PluginManager.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/plugins/PluginManager.kt @@ -176,11 +176,11 @@ object PluginManager { fun getPluginsOnline(): Array { - return getKey(PLUGINS_KEY) ?: emptyArray() + return getKey>(PLUGINS_KEY) ?: emptyArray() } fun getPluginsLocal(): Array { - return getKey(PLUGINS_KEY_LOCAL) ?: emptyArray() + return getKey>(PLUGINS_KEY_LOCAL) ?: emptyArray() } private val CLOUD_STREAM_FOLDER = diff --git a/app/src/main/java/com/lagradost/cloudstream3/plugins/RepositoryManager.kt b/app/src/main/java/com/lagradost/cloudstream3/plugins/RepositoryManager.kt index 7fec67637..3879ddca4 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/plugins/RepositoryManager.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/plugins/RepositoryManager.kt @@ -98,7 +98,7 @@ data class PluginWrapper( object RepositoryManager { const val ONLINE_PLUGINS_FOLDER = "Extensions" val PREBUILT_REPOSITORIES: Array by lazy { - getKey("PREBUILT_REPOSITORIES") ?: emptyArray() + getKey>("PREBUILT_REPOSITORIES") ?: emptyArray() } private val GH_REGEX = Regex("^https://raw.githubusercontent.com/([A-Za-z0-9-]+)/([A-Za-z0-9_.-]+)/(.*)$") @@ -240,7 +240,7 @@ object RepositoryManager { } fun getRepositories(): Array { - return getKey(REPOSITORIES_KEY) ?: emptyArray() + return getKey>(REPOSITORIES_KEY) ?: emptyArray() } // Don't want to read before we write in another thread diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/player/CS3IPlayer.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/player/CS3IPlayer.kt index d7e10c814..d316f28cd 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/player/CS3IPlayer.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/player/CS3IPlayer.kt @@ -719,7 +719,7 @@ class CS3IPlayer : IPlayer { **/ var preferredAudioTrackLanguage: String? = null get() { - return field ?: getKey( + return field ?: getKey( "$currentAccount/$PREFERRED_AUDIO_LANGUAGE_KEY", field )?.also { diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/player/source_priority/QualityDataHelper.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/player/source_priority/QualityDataHelper.kt index 02470484e..15d25148c 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/player/source_priority/QualityDataHelper.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/player/source_priority/QualityDataHelper.kt @@ -55,7 +55,7 @@ object QualityDataHelper { fun getSourcePriority(profile: Int, name: String?): Int { if (name == null) return DEFAULT_SOURCE_PRIORITY - return getKey( + return getKey( "$currentAccount/$VIDEO_SOURCE_PRIORITY/$profile", name, DEFAULT_SOURCE_PRIORITY @@ -94,7 +94,7 @@ object QualityDataHelper { } fun getQualityPriority(profile: Int, quality: Qualities): Int { - return getKey( + return getKey( "$currentAccount/$VIDEO_QUALITY_PRIORITY/$profile", quality.value.toString(), quality.defaultPriority @@ -223,4 +223,4 @@ object QualityDataHelper { if (target == null) return Qualities.Unknown return Qualities.entries.minBy { abs(it.value - target) } } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsGeneral.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsGeneral.kt index 840c6aede..354424978 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsGeneral.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsGeneral.kt @@ -359,7 +359,7 @@ class SettingsGeneral : BasePreferenceFragmentCompat() { } ?: emptyList() } - settingsManager.edit { putBoolean(getString(R.string.jsdelivr_proxy_key), getKey(getString(R.string.jsdelivr_proxy_key), false) ?: false) } + settingsManager.edit { putBoolean(getString(R.string.jsdelivr_proxy_key), getKey(getString(R.string.jsdelivr_proxy_key), false) ?: false) } getPref(R.string.jsdelivr_proxy_key)?.setOnPreferenceChangeListener { _, newValue -> setKey(getString(R.string.jsdelivr_proxy_key), newValue) return@setOnPreferenceChangeListener true diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/subtitles/ChromecastSubtitlesFragment.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/subtitles/ChromecastSubtitlesFragment.kt index 95ef264f8..ab64e9993 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/subtitles/ChromecastSubtitlesFragment.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/subtitles/ChromecastSubtitlesFragment.kt @@ -101,7 +101,7 @@ class ChromecastSubtitlesFragment : BaseFragment(CHROME_SUBTITLE_KEY) ?: defaultState } private val defaultState = SaveChromeCaptionStyle() diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/subtitles/SubtitlesFragment.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/subtitles/SubtitlesFragment.kt index 860cb4fcb..cf892424f 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/subtitles/SubtitlesFragment.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/subtitles/SubtitlesFragment.kt @@ -261,7 +261,7 @@ class SubtitlesFragment : BaseDialogFragment( } fun getCurrentSavedStyle(): SaveCaptionStyle { - return cachedSubtitleStyle ?: (getKey(SUBTITLE_KEY) ?: SaveCaptionStyle( + return cachedSubtitleStyle ?: (getKey(SUBTITLE_KEY) ?: SaveCaptionStyle( foregroundColor = getDefColor(0), backgroundColor = getDefColor(2), windowColor = getDefColor(3), @@ -293,11 +293,11 @@ class SubtitlesFragment : BaseDialogFragment( } fun getDownloadSubsLanguageTagIETF(): List { - return getKey(SUBTITLE_DOWNLOAD_KEY) ?: listOf("en") + return getKey>(SUBTITLE_DOWNLOAD_KEY) ?: listOf("en") } fun getAutoSelectLanguageTagIETF(): String { - return getKey(SUBTITLE_AUTO_SELECT_KEY) ?: "en" + return getKey(SUBTITLE_AUTO_SELECT_KEY) ?: "en" } } diff --git a/app/src/main/java/com/lagradost/cloudstream3/utils/DataStoreHelper.kt b/app/src/main/java/com/lagradost/cloudstream3/utils/DataStoreHelper.kt index ec896facb..340266f6c 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/utils/DataStoreHelper.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/utils/DataStoreHelper.kt @@ -185,7 +185,7 @@ object DataStoreHelper { * Setting this does not automatically reload the homepage. */ var currentHomePage: String? - get() = getKey("$currentAccount/$USER_SELECTED_HOMEPAGE_API") + get() = getKey("$currentAccount/$USER_SELECTED_HOMEPAGE_API") set(value) { val key = "$currentAccount/$USER_SELECTED_HOMEPAGE_API" if (value == null) { diff --git a/app/src/main/java/com/lagradost/cloudstream3/utils/TvChannelUtils.kt b/app/src/main/java/com/lagradost/cloudstream3/utils/TvChannelUtils.kt index feecbe312..4c0717b3f 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/utils/TvChannelUtils.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/utils/TvChannelUtils.kt @@ -23,15 +23,15 @@ const val PROGRAM_ID_LIST_KEY = "persistent_program_ids" object TvChannelUtils { fun Context.saveProgramId(programId: Long) { - val existing: List = getKey(PROGRAM_ID_LIST_KEY) ?: emptyList() + val existing: List = getKey>(PROGRAM_ID_LIST_KEY) ?: emptyList() val updated = (existing + programId).distinct() setKey(PROGRAM_ID_LIST_KEY, updated) } fun Context.getStoredProgramIds(): List { - return getKey(PROGRAM_ID_LIST_KEY) ?: emptyList() + return getKey>(PROGRAM_ID_LIST_KEY) ?: emptyList() } fun Context.removeProgramId(programId: Long) { - val existing: List = getKey(PROGRAM_ID_LIST_KEY) ?: emptyList() + val existing: List = getKey>(PROGRAM_ID_LIST_KEY) ?: emptyList() val updated = existing.filter { it != programId } setKey(PROGRAM_ID_LIST_KEY, updated) } @@ -161,4 +161,4 @@ object TvChannelUtils { } } -} \ No newline at end of file +} From 11792dd65c4f7fc534b1df7e17aa5fc645b0d17b Mon Sep 17 00:00:00 2001 From: Luna712 <142361265+Luna712@users.noreply.github.com> Date: Sat, 11 Jul 2026 13:21:42 -0600 Subject: [PATCH 34/38] Add type for tryParseJson (#3057) --- .../src/commonMain/kotlin/com/lagradost/cloudstream3/MainAPI.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/MainAPI.kt b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/MainAPI.kt index c29ef150f..289e96998 100644 --- a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/MainAPI.kt +++ b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/MainAPI.kt @@ -1823,7 +1823,7 @@ interface LoadResponse { /** Read the id string to get all other ids */ fun readIdFromString(idString: String?): Map { - return tryParseJson(idString) ?: return emptyMap() + return tryParseJson>(idString) ?: return emptyMap() } fun LoadResponse.isMovie(): Boolean { From 70469f55dbc6a8535ff2b5a57b0f83e79825aa23 Mon Sep 17 00:00:00 2001 From: firelight <147925818+fire-light42@users.noreply.github.com> Date: Sun, 12 Jul 2026 21:43:59 +0000 Subject: [PATCH 35/38] [skip ci] Migration guide (#3058) --- COMPOSE.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 COMPOSE.md diff --git a/COMPOSE.md b/COMPOSE.md new file mode 100644 index 000000000..8d83a50ae --- /dev/null +++ b/COMPOSE.md @@ -0,0 +1,21 @@ +# Migration guide to Compose + +### 1. MVI instead of MVVM + +The current design of CloudStream loosely uses the MVVM architecture. + +This means that the UI invokes the viewmodel with function calls, and it responds with LiveData fields that are observed. While this has worked, it generates a lot of boilerplate and has created some friction. + +To make it easier to work with Compose, the new architecture will be based on MVI. In short this means that the viewmodel exposes a singular immutable class that is observed, and receives all UI events with a singular event that is a sealed class. All the UI should be able to be recreated based on this singular state class, and all interactions should be able to be replayed using only the event callback. + +For a more detailed overview, see: https://www.youtube.com/watch?v=b2z1jvD4VMQ + +This is part of the effort to make CloudStream cross platform, as it allows us to decouple UI and logic. + +### 2. KMP-compatible libraries + +We plan to leverage Kotlin's KMP project to compile our code to different architectures. However, this requires us to only use KMP-compatible libraries, no Java. Therefore any pull requests must ensure that they use KMP-compatible libraries only. + +### 3. UI Changes + +While migrating to the new compose UI, you also have the opportunity to change the UI. However, this should only be to freshen up the UI, not completely redesign it. It is also important to stress that this process should not lose any features of the old UI, and be very conservative with adding new features. \ No newline at end of file From 505722c1b5c1a79d8295e984e55d3c72457b2e44 Mon Sep 17 00:00:00 2001 From: Luna712 <142361265+Luna712@users.noreply.github.com> Date: Sun, 12 Jul 2026 16:09:36 -0600 Subject: [PATCH 36/38] [skip ci] Torrent: migrate to kotlinx serialization (#2882) --- .../cloudstream3/ui/player/Torrent.kt | 163 +++++++----------- 1 file changed, 61 insertions(+), 102 deletions(-) diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/player/Torrent.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/player/Torrent.kt index 2e554f75e..7e5d04eb0 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/player/Torrent.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/player/Torrent.kt @@ -9,6 +9,8 @@ import com.lagradost.cloudstream3.mvvm.logError import com.lagradost.cloudstream3.utils.ExtractorLink import com.lagradost.cloudstream3.utils.ExtractorLinkType import com.lagradost.cloudstream3.utils.newExtractorLink +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable import torrServer.TorrServer import java.io.File import java.net.ConnectException @@ -32,14 +34,14 @@ object Torrent { /** Returns true if the server is up */ private suspend fun echo(): Boolean { - if(TORRENT_SERVER_URL.isEmpty()) { + if (TORRENT_SERVER_URL.isEmpty()) { return false } return try { app.get( "$TORRENT_SERVER_URL/echo", ).text.isNotEmpty() - } catch (e: ConnectException) { + } catch (_: ConnectException) { // `Failed to connect to /127.0.0.1:8090` if the server is down false } catch (t: Throwable) { @@ -52,7 +54,7 @@ object Torrent { /** Gracefully shutdown the server. * should not be used because I am unable to start it again, and the stopTorrentServer() crashes the app */ suspend fun shutdown(): Boolean { - if(TORRENT_SERVER_URL.isEmpty()) { + if (TORRENT_SERVER_URL.isEmpty()) { return false } return try { @@ -68,7 +70,7 @@ object Torrent { /** Lists all torrents by the server */ @Throws private suspend fun list(): Array { - if(TORRENT_SERVER_URL.isEmpty()) { + if (TORRENT_SERVER_URL.isEmpty()) { throw ErrorLoadingException("Not initialized") } return app.post( @@ -83,7 +85,7 @@ object Torrent { /** Drops a single torrent, (I think) this means closing the stream. Returns returns if it is successful */ private suspend fun drop(hash: String): Boolean { - if(TORRENT_SERVER_URL.isEmpty()) { + if (TORRENT_SERVER_URL.isEmpty()) { return false } return try { @@ -104,7 +106,7 @@ object Torrent { /** Removes a single torrent from the server registry */ private suspend fun rem(hash: String): Boolean { - if(TORRENT_SERVER_URL.isEmpty()) { + if (TORRENT_SERVER_URL.isEmpty()) { return false } return try { @@ -126,7 +128,7 @@ object Torrent { /** Removes all torrents from the server, and returns if it is successful */ suspend fun clearAll(): Boolean { - if(TORRENT_SERVER_URL.isEmpty()) { + if (TORRENT_SERVER_URL.isEmpty()) { return true } return try { @@ -164,10 +166,8 @@ object Torrent { /** Gets all the metadata of a torrent, will throw if that hash does not exists * https://github.com/Diegopyl1209/torrentserver-aniyomi/blob/c18f58e51b6738f053261bc863177078aa9c1c98/web/api/torrents.go#L126 */ @Throws - suspend fun get( - hash: String, - ): TorrentStatus { - if(TORRENT_SERVER_URL.isEmpty()) { + suspend fun get(hash: String): TorrentStatus { + if (TORRENT_SERVER_URL.isEmpty()) { throw ErrorLoadingException("Not initialized") } return app.post( @@ -184,7 +184,7 @@ object Torrent { /** Adds a torrent to the server, this is needed for us to get the hash for further modification, as well as start streaming it*/ @Throws private suspend fun add(url: String): TorrentStatus { - if(TORRENT_SERVER_URL.isEmpty()) { + if (TORRENT_SERVER_URL.isEmpty()) { throw ErrorLoadingException("Not initialized") } return app.post( @@ -204,7 +204,7 @@ object Torrent { return true } val port = TorrServer.startTorrentServer(dir, 0) - if(port < 0) { + if (port < 0) { return false } TORRENT_SERVER_URL = "http://127.0.0.1:$port" @@ -278,94 +278,55 @@ object Torrent { // https://github.com/Diegopyl1209/torrentserver-aniyomi/blob/c18f58e51b6738f053261bc863177078aa9c1c98/web/api/torrents.go#L18 // https://github.com/Diegopyl1209/torrentserver-aniyomi/blob/main/web/api/route.go#L7 + @Serializable data class TorrentRequest( - @JsonProperty("action") - val action: String, - @JsonProperty("hash") - val hash: String = "", - @JsonProperty("link") - val link: String = "", - @JsonProperty("title") - val title: String = "", - @JsonProperty("poster") - val poster: String = "", - @JsonProperty("data") - val data: String = "", - @JsonProperty("save_to_db") - val saveToDB: Boolean = false, + @JsonProperty("action") @SerialName("action") val action: String, + @JsonProperty("hash") @SerialName("hash") val hash: String = "", + @JsonProperty("link") @SerialName("link") val link: String = "", + @JsonProperty("title") @SerialName("title") val title: String = "", + @JsonProperty("poster") @SerialName("poster") val poster: String = "", + @JsonProperty("data") @SerialName("data") val data: String = "", + @JsonProperty("save_to_db") @SerialName("save_to_db") val saveToDB: Boolean = false, ) // https://github.com/Diegopyl1209/torrentserver-aniyomi/blob/c18f58e51b6738f053261bc863177078aa9c1c98/torr/state/state.go#L33 // omitempty = nullable + @Serializable data class TorrentStatus( - @JsonProperty("title") - var title: String, - @JsonProperty("poster") - var poster: String, - @JsonProperty("data") - var data: String?, - @JsonProperty("timestamp") - var timestamp: Long, - @JsonProperty("name") - var name: String?, - @JsonProperty("hash") - var hash: String?, - @JsonProperty("stat") - var stat: Int, - @JsonProperty("stat_string") - var statString: String, - @JsonProperty("loaded_size") - var loadedSize: Long?, - @JsonProperty("torrent_size") - var torrentSize: Long?, - @JsonProperty("preloaded_bytes") - var preloadedBytes: Long?, - @JsonProperty("preload_size") - var preloadSize: Long?, - @JsonProperty("download_speed") - var downloadSpeed: Double?, - @JsonProperty("upload_speed") - var uploadSpeed: Double?, - @JsonProperty("total_peers") - var totalPeers: Int?, - @JsonProperty("pending_peers") - var pendingPeers: Int?, - @JsonProperty("active_peers") - var activePeers: Int?, - @JsonProperty("connected_seeders") - var connectedSeeders: Int?, - @JsonProperty("half_open_peers") - var halfOpenPeers: Int?, - @JsonProperty("bytes_written") - var bytesWritten: Long?, - @JsonProperty("bytes_written_data") - var bytesWrittenData: Long?, - @JsonProperty("bytes_read") - var bytesRead: Long?, - @JsonProperty("bytes_read_data") - var bytesReadData: Long?, - @JsonProperty("bytes_read_useful_data") - var bytesReadUsefulData: Long?, - @JsonProperty("chunks_written") - var chunksWritten: Long?, - @JsonProperty("chunks_read") - var chunksRead: Long?, - @JsonProperty("chunks_read_useful") - var chunksReadUseful: Long?, - @JsonProperty("chunks_read_wasted") - var chunksReadWasted: Long?, - @JsonProperty("pieces_dirtied_good") - var piecesDirtiedGood: Long?, - @JsonProperty("pieces_dirtied_bad") - var piecesDirtiedBad: Long?, - @JsonProperty("duration_seconds") - var durationSeconds: Double?, - @JsonProperty("bit_rate") - var bitRate: String?, - @JsonProperty("file_stats") - var fileStats: List?, - @JsonProperty("trackers") - var trackers: List?, + @JsonProperty("title") @SerialName("title") var title: String, + @JsonProperty("poster") @SerialName("poster") var poster: String, + @JsonProperty("data") @SerialName("data") var data: String?, + @JsonProperty("timestamp") @SerialName("timestamp") var timestamp: Long, + @JsonProperty("name") @SerialName("name") var name: String?, + @JsonProperty("hash") @SerialName("hash") var hash: String?, + @JsonProperty("stat") @SerialName("stat") var stat: Int, + @JsonProperty("stat_string") @SerialName("stat_string") var statString: String, + @JsonProperty("loaded_size") @SerialName("loaded_size") var loadedSize: Long?, + @JsonProperty("torrent_size") @SerialName("torrent_size") var torrentSize: Long?, + @JsonProperty("preloaded_bytes") @SerialName("preloaded_bytes") var preloadedBytes: Long?, + @JsonProperty("preload_size") @SerialName("preload_size") var preloadSize: Long?, + @JsonProperty("download_speed") @SerialName("download_speed") var downloadSpeed: Double?, + @JsonProperty("upload_speed") @SerialName("upload_speed") var uploadSpeed: Double?, + @JsonProperty("total_peers") @SerialName("total_peers") var totalPeers: Int?, + @JsonProperty("pending_peers") @SerialName("pending_peers") var pendingPeers: Int?, + @JsonProperty("active_peers") @SerialName("active_peers") var activePeers: Int?, + @JsonProperty("connected_seeders") @SerialName("connected_seeders") var connectedSeeders: Int?, + @JsonProperty("half_open_peers") @SerialName("half_open_peers") var halfOpenPeers: Int?, + @JsonProperty("bytes_written") @SerialName("bytes_written") var bytesWritten: Long?, + @JsonProperty("bytes_written_data") @SerialName("bytes_written_data") var bytesWrittenData: Long?, + @JsonProperty("bytes_read") @SerialName("bytes_read") var bytesRead: Long?, + @JsonProperty("bytes_read_data") @SerialName("bytes_read_data") var bytesReadData: Long?, + @JsonProperty("bytes_read_useful_data") @SerialName("bytes_read_useful_data") var bytesReadUsefulData: Long?, + @JsonProperty("chunks_written") @SerialName("chunks_written") var chunksWritten: Long?, + @JsonProperty("chunks_read") @SerialName("chunks_read") var chunksRead: Long?, + @JsonProperty("chunks_read_useful") @SerialName("chunks_read_useful") var chunksReadUseful: Long?, + @JsonProperty("chunks_read_wasted") @SerialName("chunks_read_wasted") var chunksReadWasted: Long?, + @JsonProperty("pieces_dirtied_good") @SerialName("pieces_dirtied_good") var piecesDirtiedGood: Long?, + @JsonProperty("pieces_dirtied_bad") @SerialName("pieces_dirtied_bad") var piecesDirtiedBad: Long?, + @JsonProperty("duration_seconds") @SerialName("duration_seconds") var durationSeconds: Double?, + @JsonProperty("bit_rate") @SerialName("bit_rate") var bitRate: String?, + @JsonProperty("file_stats") @SerialName("file_stats") var fileStats: List?, + @JsonProperty("trackers") @SerialName("trackers") var trackers: List?, ) { fun streamUrl(url: String): String { val fileName = @@ -381,12 +342,10 @@ object Torrent { } } + @Serializable data class TorrentFileStat( - @JsonProperty("id") - val id: Int?, - @JsonProperty("path") - val path: String?, - @JsonProperty("length") - val length: Long?, + @JsonProperty("id") @SerialName("id") val id: Int?, + @JsonProperty("path") @SerialName("path") val path: String?, + @JsonProperty("length") @SerialName("length") val length: Long?, ) -} \ No newline at end of file +} From 15632b864ac60a1eac66be4cd23e810945437c58 Mon Sep 17 00:00:00 2001 From: Luna712 <142361265+Luna712@users.noreply.github.com> Date: Sun, 12 Jul 2026 16:18:22 -0600 Subject: [PATCH 37/38] [skip ci] TraktProvider: migrate to kotlinx serialization (#2872) --- library/api/jvm/library.api | 225 +++++++++++++- .../metaproviders/TraktProvider.kt | 276 ++++++++++-------- 2 files changed, 366 insertions(+), 135 deletions(-) diff --git a/library/api/jvm/library.api b/library/api/jvm/library.api index 025ebc391..cd2aaeea1 100644 --- a/library/api/jvm/library.api +++ b/library/api/jvm/library.api @@ -5831,6 +5831,7 @@ public class com/lagradost/cloudstream3/metaproviders/TraktProvider : com/lagrad } public final class com/lagradost/cloudstream3/metaproviders/TraktProvider$Airs { + public static final field Companion Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Airs$Companion; public fun ()V public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V @@ -5847,7 +5848,23 @@ public final class com/lagradost/cloudstream3/metaproviders/TraktProvider$Airs { public fun toString ()Ljava/lang/String; } +public final synthetic class com/lagradost/cloudstream3/metaproviders/TraktProvider$Airs$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Airs$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Airs; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Airs;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class com/lagradost/cloudstream3/metaproviders/TraktProvider$Airs$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + public final class com/lagradost/cloudstream3/metaproviders/TraktProvider$Cast { + public static final field Companion Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Cast$Companion; public fun ()V public fun (Ljava/lang/String;Ljava/util/List;Ljava/lang/Long;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Person;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Images;)V public synthetic fun (Ljava/lang/String;Ljava/util/List;Ljava/lang/Long;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Person;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Images;ILkotlin/jvm/internal/DefaultConstructorMarker;)V @@ -5868,7 +5885,23 @@ public final class com/lagradost/cloudstream3/metaproviders/TraktProvider$Cast { public fun toString ()Ljava/lang/String; } +public final synthetic class com/lagradost/cloudstream3/metaproviders/TraktProvider$Cast$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Cast$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Cast; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Cast;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class com/lagradost/cloudstream3/metaproviders/TraktProvider$Cast$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + public final class com/lagradost/cloudstream3/metaproviders/TraktProvider$Data { + public static final field Companion Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Data$Companion; public fun ()V public fun (Lcom/lagradost/cloudstream3/TvType;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$MediaDetails;)V public synthetic fun (Lcom/lagradost/cloudstream3/TvType;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$MediaDetails;ILkotlin/jvm/internal/DefaultConstructorMarker;)V @@ -5883,7 +5916,23 @@ public final class com/lagradost/cloudstream3/metaproviders/TraktProvider$Data { public fun toString ()Ljava/lang/String; } +public final synthetic class com/lagradost/cloudstream3/metaproviders/TraktProvider$Data$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Data$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Data; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Data;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class com/lagradost/cloudstream3/metaproviders/TraktProvider$Data$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + public final class com/lagradost/cloudstream3/metaproviders/TraktProvider$Ids { + public static final field Companion Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Ids$Companion; public fun ()V public fun (Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;)V public synthetic fun (Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V @@ -5906,7 +5955,23 @@ public final class com/lagradost/cloudstream3/metaproviders/TraktProvider$Ids { public fun toString ()Ljava/lang/String; } +public final synthetic class com/lagradost/cloudstream3/metaproviders/TraktProvider$Ids$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Ids$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Ids; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Ids;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class com/lagradost/cloudstream3/metaproviders/TraktProvider$Ids$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + public final class com/lagradost/cloudstream3/metaproviders/TraktProvider$Images { + public static final field Companion Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Images$Companion; public fun ()V public fun (Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;)V public synthetic fun (Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;ILkotlin/jvm/internal/DefaultConstructorMarker;)V @@ -5933,7 +5998,23 @@ public final class com/lagradost/cloudstream3/metaproviders/TraktProvider$Images public fun toString ()Ljava/lang/String; } +public final synthetic class com/lagradost/cloudstream3/metaproviders/TraktProvider$Images$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Images$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Images; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Images;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class com/lagradost/cloudstream3/metaproviders/TraktProvider$Images$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + public final class com/lagradost/cloudstream3/metaproviders/TraktProvider$LinkData { + public static final field Companion Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$LinkData$Companion; public fun ()V public fun (Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;ZLjava/lang/Integer;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZZZ)V public synthetic fun (Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;ZLjava/lang/Integer;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZZZILkotlin/jvm/internal/DefaultConstructorMarker;)V @@ -5994,10 +6075,26 @@ public final class com/lagradost/cloudstream3/metaproviders/TraktProvider$LinkDa public fun toString ()Ljava/lang/String; } +public final synthetic class com/lagradost/cloudstream3/metaproviders/TraktProvider$LinkData$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$LinkData$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$LinkData; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$LinkData;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class com/lagradost/cloudstream3/metaproviders/TraktProvider$LinkData$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + public final class com/lagradost/cloudstream3/metaproviders/TraktProvider$MediaDetails { + public static final field Companion Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$MediaDetails$Companion; public fun ()V - public fun (Ljava/lang/String;Ljava/lang/Integer;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Ids;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Double;Ljava/lang/Long;Ljava/lang/Long;Ljava/lang/String;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Airs;Ljava/lang/String;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Images;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$MediaDetails;)V - public synthetic fun (Ljava/lang/String;Ljava/lang/Integer;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Ids;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Double;Ljava/lang/Long;Ljava/lang/Long;Ljava/lang/String;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Airs;Ljava/lang/String;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Images;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$MediaDetails;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun (Ljava/lang/String;Ljava/lang/Integer;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Ids;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Double;Ljava/lang/Long;Ljava/lang/Long;Ljava/lang/String;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Airs;Ljava/lang/String;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Images;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$MediaSummary;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/Integer;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Ids;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Double;Ljava/lang/Long;Ljava/lang/Long;Ljava/lang/String;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Airs;Ljava/lang/String;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Images;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$MediaSummary;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun component1 ()Ljava/lang/String; public final fun component10 ()Ljava/lang/String; public final fun component11 ()Ljava/lang/String; @@ -6016,7 +6113,7 @@ public final class com/lagradost/cloudstream3/metaproviders/TraktProvider$MediaD public final fun component23 ()Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Airs; public final fun component24 ()Ljava/lang/String; public final fun component25 ()Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Images; - public final fun component26 ()Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$MediaDetails; + public final fun component26 ()Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$MediaSummary; public final fun component3 ()Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Ids; public final fun component4 ()Ljava/lang/String; public final fun component5 ()Ljava/lang/String; @@ -6024,8 +6121,8 @@ public final class com/lagradost/cloudstream3/metaproviders/TraktProvider$MediaD public final fun component7 ()Ljava/lang/Integer; public final fun component8 ()Ljava/lang/String; public final fun component9 ()Ljava/lang/String; - public final fun copy (Ljava/lang/String;Ljava/lang/Integer;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Ids;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Double;Ljava/lang/Long;Ljava/lang/Long;Ljava/lang/String;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Airs;Ljava/lang/String;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Images;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$MediaDetails;)Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$MediaDetails; - public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$MediaDetails;Ljava/lang/String;Ljava/lang/Integer;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Ids;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Double;Ljava/lang/Long;Ljava/lang/Long;Ljava/lang/String;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Airs;Ljava/lang/String;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Images;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$MediaDetails;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$MediaDetails; + public final fun copy (Ljava/lang/String;Ljava/lang/Integer;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Ids;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Double;Ljava/lang/Long;Ljava/lang/Long;Ljava/lang/String;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Airs;Ljava/lang/String;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Images;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$MediaSummary;)Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$MediaDetails; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$MediaDetails;Ljava/lang/String;Ljava/lang/Integer;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Ids;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Double;Ljava/lang/Long;Ljava/lang/Long;Ljava/lang/String;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Airs;Ljava/lang/String;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Images;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$MediaSummary;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$MediaDetails; public fun equals (Ljava/lang/Object;)Z public final fun getAiredEpisodes ()Ljava/lang/Integer; public final fun getAirs ()Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Airs; @@ -6040,7 +6137,7 @@ public final class com/lagradost/cloudstream3/metaproviders/TraktProvider$MediaD public final fun getImages ()Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Images; public final fun getLanguage ()Ljava/lang/String; public final fun getLanguages ()Ljava/util/List; - public final fun getMedia ()Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$MediaDetails; + public final fun getMedia ()Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$MediaSummary; public final fun getNetwork ()Ljava/lang/String; public final fun getOverview ()Ljava/lang/String; public final fun getRating ()Ljava/lang/Double; @@ -6057,7 +6154,60 @@ public final class com/lagradost/cloudstream3/metaproviders/TraktProvider$MediaD public fun toString ()Ljava/lang/String; } +public final synthetic class com/lagradost/cloudstream3/metaproviders/TraktProvider$MediaDetails$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$MediaDetails$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$MediaDetails; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$MediaDetails;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class com/lagradost/cloudstream3/metaproviders/TraktProvider$MediaDetails$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class com/lagradost/cloudstream3/metaproviders/TraktProvider$MediaSummary { + public static final field Companion Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$MediaSummary$Companion; + public fun ()V + public fun (Ljava/lang/String;Ljava/lang/Integer;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Ids;Ljava/lang/Double;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Images;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/Integer;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Ids;Ljava/lang/Double;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Images;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/Integer; + public final fun component3 ()Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Ids; + public final fun component4 ()Ljava/lang/Double; + public final fun component5 ()Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Images; + public final fun copy (Ljava/lang/String;Ljava/lang/Integer;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Ids;Ljava/lang/Double;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Images;)Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$MediaSummary; + public static synthetic fun copy$default (Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$MediaSummary;Ljava/lang/String;Ljava/lang/Integer;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Ids;Ljava/lang/Double;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Images;ILjava/lang/Object;)Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$MediaSummary; + public fun equals (Ljava/lang/Object;)Z + public final fun getIds ()Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Ids; + public final fun getImages ()Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Images; + public final fun getRating ()Ljava/lang/Double; + public final fun getTitle ()Ljava/lang/String; + public final fun getYear ()Ljava/lang/Integer; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class com/lagradost/cloudstream3/metaproviders/TraktProvider$MediaSummary$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$MediaSummary$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$MediaSummary; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$MediaSummary;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class com/lagradost/cloudstream3/metaproviders/TraktProvider$MediaSummary$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + public final class com/lagradost/cloudstream3/metaproviders/TraktProvider$People { + public static final field Companion Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$People$Companion; public fun ()V public fun (Ljava/util/List;)V public synthetic fun (Ljava/util/List;ILkotlin/jvm/internal/DefaultConstructorMarker;)V @@ -6070,7 +6220,23 @@ public final class com/lagradost/cloudstream3/metaproviders/TraktProvider$People public fun toString ()Ljava/lang/String; } +public final synthetic class com/lagradost/cloudstream3/metaproviders/TraktProvider$People$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$People$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$People; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$People;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class com/lagradost/cloudstream3/metaproviders/TraktProvider$People$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + public final class com/lagradost/cloudstream3/metaproviders/TraktProvider$Person { + public static final field Companion Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Person$Companion; public fun ()V public fun (Ljava/lang/String;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Ids;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Images;)V public synthetic fun (Ljava/lang/String;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Ids;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Images;ILkotlin/jvm/internal/DefaultConstructorMarker;)V @@ -6087,7 +6253,23 @@ public final class com/lagradost/cloudstream3/metaproviders/TraktProvider$Person public fun toString ()Ljava/lang/String; } +public final synthetic class com/lagradost/cloudstream3/metaproviders/TraktProvider$Person$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Person$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Person; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Person;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class com/lagradost/cloudstream3/metaproviders/TraktProvider$Person$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + public final class com/lagradost/cloudstream3/metaproviders/TraktProvider$Seasons { + public static final field Companion Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Seasons$Companion; public fun ()V public fun (Ljava/lang/Integer;Ljava/lang/Integer;Ljava/util/List;Ljava/lang/String;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Ids;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Images;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/Double;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;)V public synthetic fun (Ljava/lang/Integer;Ljava/lang/Integer;Ljava/util/List;Ljava/lang/String;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Ids;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Images;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/Double;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;ILkotlin/jvm/internal/DefaultConstructorMarker;)V @@ -6124,7 +6306,23 @@ public final class com/lagradost/cloudstream3/metaproviders/TraktProvider$Season public fun toString ()Ljava/lang/String; } +public final synthetic class com/lagradost/cloudstream3/metaproviders/TraktProvider$Seasons$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Seasons$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Seasons; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Seasons;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class com/lagradost/cloudstream3/metaproviders/TraktProvider$Seasons$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + public final class com/lagradost/cloudstream3/metaproviders/TraktProvider$TraktEpisode { + public static final field Companion Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$TraktEpisode$Companion; public fun ()V public fun (Ljava/util/List;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/String;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Ids;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Images;Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/Double;Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;)V public synthetic fun (Ljava/util/List;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/String;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Ids;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$Images;Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/Double;Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;ILkotlin/jvm/internal/DefaultConstructorMarker;)V @@ -6165,6 +6363,21 @@ public final class com/lagradost/cloudstream3/metaproviders/TraktProvider$TraktE public fun toString ()Ljava/lang/String; } +public final synthetic class com/lagradost/cloudstream3/metaproviders/TraktProvider$TraktEpisode$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$TraktEpisode$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$TraktEpisode; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lcom/lagradost/cloudstream3/metaproviders/TraktProvider$TraktEpisode;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class com/lagradost/cloudstream3/metaproviders/TraktProvider$TraktEpisode$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + public final class com/lagradost/cloudstream3/mvvm/ArchComponentExtKt { public static final field DEBUG_EXCEPTION Ljava/lang/String; public static final field DEBUG_PRINT Ljava/lang/String; diff --git a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/metaproviders/TraktProvider.kt b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/metaproviders/TraktProvider.kt index dafec4d97..6011e14ea 100644 --- a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/metaproviders/TraktProvider.kt +++ b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/metaproviders/TraktProvider.kt @@ -34,6 +34,10 @@ import com.lagradost.cloudstream3.newTvSeriesLoadResponse import com.lagradost.cloudstream3.newTvSeriesSearchResponse import com.lagradost.cloudstream3.utils.AppUtils.parseJson import com.lagradost.cloudstream3.utils.AppUtils.toJson +import kotlinx.serialization.ExperimentalSerializationApi +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import kotlinx.serialization.json.JsonNames open class TraktProvider : MainAPI() { override var name = "Trakt" @@ -46,7 +50,6 @@ open class TraktProvider : MainAPI() { ) private val traktApiUrl = "https://api.trakt.tv" - private val traktClientId: String = BuildConfig.TRAKT_CLIENT_ID override val mainPage = mainPageOf( @@ -58,16 +61,21 @@ open class TraktProvider : MainAPI() { override suspend fun getMainPage(page: Int, request: MainPageRequest): HomePageResponse { val apiResponse = getApi("${request.data}?extended=full,images&page=$page") - val results = parseJson>(apiResponse).map { element -> element.toSearchResponse() } + return newHomePageResponse(request.name, results) } private fun MediaDetails.toSearchResponse(): SearchResponse { - - val media = this.media ?: this + val media = this.media ?: MediaSummary( + title = this.title, + year = this.year, + ids = this.ids, + rating = this.rating, + images = this.images, + ) val mediaType = if (media.ids?.tvdb == null) TvType.Movie else TvType.TvSeries val poster = media.images?.poster?.firstOrNull() return if (mediaType == TvType.Movie) { @@ -75,7 +83,7 @@ open class TraktProvider : MainAPI() { name = media.title ?: "", url = Data( type = mediaType, - mediaDetails = media, + mediaDetails = this, ).toJson(), type = TvType.Movie, ) { @@ -87,7 +95,7 @@ open class TraktProvider : MainAPI() { name = media.title ?: "", url = Data( type = mediaType, - mediaDetails = media, + mediaDetails = this, ).toJson(), type = TvType.TvSeries, ) { @@ -98,9 +106,7 @@ open class TraktProvider : MainAPI() { } override suspend fun search(query: String, page: Int): SearchResponseList? { - val apiResponse = - getApi("$traktApiUrl/search/movie,show?extended=full,images&limit=20&page=$page&query=$query") - + val apiResponse = getApi("$traktApiUrl/search/movie,show?extended=full,images&limit=20&page=$page&query=$query") return newSearchResponseList(parseJson>(apiResponse).map { element -> element.toSearchResponse() }) @@ -115,9 +121,7 @@ open class TraktProvider : MainAPI() { val backDropUrl = fixPath(mediaDetails?.images?.fanart?.firstOrNull()) val logoUrl = fixPath(mediaDetails?.images?.logo?.firstOrNull()) - val resActor = - getApi("$traktApiUrl/$moviesOrShows/${mediaDetails?.ids?.trakt}/people?extended=full,images") - + val resActor = getApi("$traktApiUrl/$moviesOrShows/${mediaDetails?.ids?.trakt}/people?extended=full,images") val actors = parseJson(resActor).cast?.map { ActorData( Actor( @@ -128,9 +132,7 @@ open class TraktProvider : MainAPI() { ) } - val resRelated = - getApi("$traktApiUrl/$moviesOrShows/${mediaDetails?.ids?.trakt}/related?extended=full,images&limit=20") - + val resRelated = getApi("$traktApiUrl/$moviesOrShows/${mediaDetails?.ids?.trakt}/related?extended=full,images&limit=20") val relatedMedia = parseJson>(resRelated).map { it.toSearchResponse() } val isCartoon = @@ -142,7 +144,6 @@ open class TraktProvider : MainAPI() { val uniqueUrl = data.mediaDetails?.ids?.trakt?.toJson() ?: data.toJson() if (data.type == TvType.Movie) { - val linkData = LinkData( id = mediaDetails?.ids?.tmdb, traktId = mediaDetails?.ids?.trakt, @@ -156,7 +157,7 @@ open class TraktProvider : MainAPI() { year = mediaDetails?.year, orgTitle = mediaDetails?.title, isAnime = isAnime, - //jpTitle = later if needed as it requires another network request, + // jpTitle = later if needed as it requires another network request, airedDate = mediaDetails?.released ?: mediaDetails?.firstAired, isAsian = isAsian, @@ -190,7 +191,6 @@ open class TraktProvider : MainAPI() { addTMDbId(mediaDetails.ids?.tmdb.toString()) } } else { - val resSeasons = getApi("$traktApiUrl/shows/${mediaDetails?.ids?.trakt.toString()}/seasons?extended=full,images,episodes") val episodes = mutableListOf() @@ -198,9 +198,7 @@ open class TraktProvider : MainAPI() { var nextAir: NextAiring? = null seasons.forEach { season -> - season.episodes?.map { episode -> - val linkData = LinkData( id = mediaDetails?.ids?.tmdb, traktId = mediaDetails?.ids?.trakt, @@ -234,8 +232,7 @@ open class TraktProvider : MainAPI() { this.episode = episode.number this.description = episode.overview this.runTime = episode.runtime - this.posterUrl = fixPath( episode.images?.screenshot?.firstOrNull()) - //this.rating = episode.rating?.times(10)?.roundToInt() + this.posterUrl = fixPath(episode.images?.screenshot?.firstOrNull()) this.score = Score.from10(episode.rating) this.addDate(episode.firstAired, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX") @@ -307,143 +304,164 @@ open class TraktProvider : MainAPI() { return "https://$url" } + @Serializable data class Data( - val type: TvType? = null, - val mediaDetails: MediaDetails? = null, + @JsonProperty("type") @SerialName("type") val type: TvType? = null, + @JsonProperty("mediaDetails") @SerialName("mediaDetails") val mediaDetails: MediaDetails? = null, ) + @Serializable + data class MediaSummary( + @JsonProperty("title") @SerialName("title") val title: String? = null, + @JsonProperty("year") @SerialName("year") val year: Int? = null, + @JsonProperty("ids") @SerialName("ids") val ids: Ids? = null, + @JsonProperty("rating") @SerialName("rating") val rating: Double? = null, + @JsonProperty("images") @SerialName("images") val images: Images? = null, + ) + + @OptIn(ExperimentalSerializationApi::class) // JsonNames is an experimental annotation for now + @Serializable data class MediaDetails( - @JsonProperty("title") val title: String? = null, - @JsonProperty("year") val year: Int? = null, - @JsonProperty("ids") val ids: Ids? = null, - @JsonProperty("tagline") val tagline: String? = null, - @JsonProperty("overview") val overview: String? = null, - @JsonProperty("released") val released: String? = null, - @JsonProperty("runtime") val runtime: Int? = null, - @JsonProperty("country") val country: String? = null, - @JsonProperty("updatedAt") val updatedAt: String? = null, - @JsonProperty("trailer") val trailer: String? = null, - @JsonProperty("homepage") val homepage: String? = null, - @JsonProperty("status") val status: String? = null, - @JsonProperty("rating") val rating: Double? = null, - @JsonProperty("votes") val votes: Long? = null, - @JsonProperty("comment_count") val commentCount: Long? = null, - @JsonProperty("language") val language: String? = null, - @JsonProperty("languages") val languages: List? = null, - @JsonProperty("available_translations") val availableTranslations: List? = null, - @JsonProperty("genres") val genres: List? = null, - @JsonProperty("certification") val certification: String? = null, - @JsonProperty("aired_episodes") val airedEpisodes: Int? = null, - @JsonProperty("first_aired") val firstAired: String? = null, - @JsonProperty("airs") val airs: Airs? = null, - @JsonProperty("network") val network: String? = null, - @JsonProperty("images") val images: Images? = null, - @JsonProperty("movie") @JsonAlias("show") val media: MediaDetails? = null + @JsonProperty("title") @SerialName("title") val title: String? = null, + @JsonProperty("year") @SerialName("year") val year: Int? = null, + @JsonProperty("ids") @SerialName("ids") val ids: Ids? = null, + @JsonProperty("tagline") @SerialName("tagline") val tagline: String? = null, + @JsonProperty("overview") @SerialName("overview") val overview: String? = null, + @JsonProperty("released") @SerialName("released") val released: String? = null, + @JsonProperty("runtime") @SerialName("runtime") val runtime: Int? = null, + @JsonProperty("country") @SerialName("country") val country: String? = null, + @JsonProperty("updatedAt") @SerialName("updatedAt") val updatedAt: String? = null, + @JsonProperty("trailer") @SerialName("trailer") val trailer: String? = null, + @JsonProperty("homepage") @SerialName("homepage") val homepage: String? = null, + @JsonProperty("status") @SerialName("status") val status: String? = null, + @JsonProperty("rating") @SerialName("rating") val rating: Double? = null, + @JsonProperty("votes") @SerialName("votes") val votes: Long? = null, + @JsonProperty("comment_count") @SerialName("comment_count") val commentCount: Long? = null, + @JsonProperty("language") @SerialName("language") val language: String? = null, + @JsonProperty("languages") @SerialName("languages") val languages: List? = null, + @JsonProperty("available_translations") @SerialName("available_translations") val availableTranslations: List? = null, + @JsonProperty("genres") @SerialName("genres") val genres: List? = null, + @JsonProperty("certification") @SerialName("certification") val certification: String? = null, + @JsonProperty("aired_episodes") @SerialName("aired_episodes") val airedEpisodes: Int? = null, + @JsonProperty("first_aired") @SerialName("first_aired") val firstAired: String? = null, + @JsonProperty("airs") @SerialName("airs") val airs: Airs? = null, + @JsonProperty("network") @SerialName("network") val network: String? = null, + @JsonProperty("images") @SerialName("images") val images: Images? = null, + @JsonProperty("media") @JsonAlias("movie", "show") @SerialName("media") @JsonNames("movie", "show") val media: MediaSummary? = null, ) + @Serializable data class Airs( - @JsonProperty("day") val day: String? = null, - @JsonProperty("time") val time: String? = null, - @JsonProperty("timezone") val timezone: String? = null, + @JsonProperty("day") @SerialName("day") val day: String? = null, + @JsonProperty("time") @SerialName("time") val time: String? = null, + @JsonProperty("timezone") @SerialName("timezone") val timezone: String? = null, ) + @Serializable data class Ids( - @JsonProperty("trakt") val trakt: Int? = null, - @JsonProperty("slug") val slug: String? = null, - @JsonProperty("tvdb") val tvdb: Int? = null, - @JsonProperty("imdb") val imdb: String? = null, - @JsonProperty("tmdb") val tmdb: Int? = null, - @JsonProperty("tvrage") val tvrage: String? = null, + @JsonProperty("trakt") @SerialName("trakt") val trakt: Int? = null, + @JsonProperty("slug") @SerialName("slug") val slug: String? = null, + @JsonProperty("tvdb") @SerialName("tvdb") val tvdb: Int? = null, + @JsonProperty("imdb") @SerialName("imdb") val imdb: String? = null, + @JsonProperty("tmdb") @SerialName("tmdb") val tmdb: Int? = null, + @JsonProperty("tvrage") @SerialName("tvrage") val tvrage: String? = null, ) + @Serializable data class Images( - @JsonProperty("poster") val poster: List? = null, - @JsonProperty("fanart") val fanart: List? = null, - @JsonProperty("logo") val logo: List? = null, - @JsonProperty("clearart") val clearArt: List? = null, - @JsonProperty("banner") val banner: List? = null, - @JsonProperty("thumb") val thumb: List? = null, - @JsonProperty("screenshot") val screenshot: List? = null, - @JsonProperty("headshot") val headshot: List? = null, + @JsonProperty("poster") @SerialName("poster") val poster: List? = null, + @JsonProperty("fanart") @SerialName("fanart") val fanart: List? = null, + @JsonProperty("logo") @SerialName("logo") val logo: List? = null, + @JsonProperty("clearart") @SerialName("clearart") val clearArt: List? = null, + @JsonProperty("banner") @SerialName("banner") val banner: List? = null, + @JsonProperty("thumb") @SerialName("thumb") val thumb: List? = null, + @JsonProperty("screenshot") @SerialName("screenshot") val screenshot: List? = null, + @JsonProperty("headshot") @SerialName("headshot") val headshot: List? = null, ) + @Serializable data class People( - @JsonProperty("cast") val cast: List? = null, + @JsonProperty("cast") @SerialName("cast") val cast: List? = null, ) + @Serializable data class Cast( - @JsonProperty("character") val character: String? = null, - @JsonProperty("characters") val characters: List? = null, - @JsonProperty("episode_count") val episodeCount: Long? = null, - @JsonProperty("person") val person: Person? = null, - @JsonProperty("images") val images: Images? = null, + @JsonProperty("character") @SerialName("character") val character: String? = null, + @JsonProperty("characters") @SerialName("characters") val characters: List? = null, + @JsonProperty("episode_count") @SerialName("episode_count") val episodeCount: Long? = null, + @JsonProperty("person") @SerialName("person") val person: Person? = null, + @JsonProperty("images") @SerialName("images") val images: Images? = null, ) + @Serializable data class Person( - @JsonProperty("name") val name: String? = null, - @JsonProperty("ids") val ids: Ids? = null, - @JsonProperty("images") val images: Images? = null, + @JsonProperty("name") @SerialName("name") val name: String? = null, + @JsonProperty("ids") @SerialName("ids") val ids: Ids? = null, + @JsonProperty("images") @SerialName("images") val images: Images? = null, ) + @Serializable data class Seasons( - @JsonProperty("aired_episodes") val airedEpisodes: Int? = null, - @JsonProperty("episode_count") val episodeCount: Int? = null, - @JsonProperty("episodes") val episodes: List? = null, - @JsonProperty("first_aired") val firstAired: String? = null, - @JsonProperty("ids") val ids: Ids? = null, - @JsonProperty("images") val images: Images? = null, - @JsonProperty("network") val network: String? = null, - @JsonProperty("number") val number: Int? = null, - @JsonProperty("overview") val overview: String? = null, - @JsonProperty("rating") val rating: Double? = null, - @JsonProperty("title") val title: String? = null, - @JsonProperty("updated_at") val updatedAt: String? = null, - @JsonProperty("votes") val votes: Int? = null, + @JsonProperty("aired_episodes") @SerialName("aired_episodes") val airedEpisodes: Int? = null, + @JsonProperty("episode_count") @SerialName("episode_count") val episodeCount: Int? = null, + @JsonProperty("episodes") @SerialName("episodes") val episodes: List? = null, + @JsonProperty("first_aired") @SerialName("first_aired") val firstAired: String? = null, + @JsonProperty("ids") @SerialName("ids") val ids: Ids? = null, + @JsonProperty("images") @SerialName("images") val images: Images? = null, + @JsonProperty("network") @SerialName("network") val network: String? = null, + @JsonProperty("number") @SerialName("number") val number: Int? = null, + @JsonProperty("overview") @SerialName("overview") val overview: String? = null, + @JsonProperty("rating") @SerialName("rating") val rating: Double? = null, + @JsonProperty("title") @SerialName("title") val title: String? = null, + @JsonProperty("updated_at") @SerialName("updated_at") val updatedAt: String? = null, + @JsonProperty("votes") @SerialName("votes") val votes: Int? = null, ) + @Serializable data class TraktEpisode( - @JsonProperty("available_translations") val availableTranslations: List? = null, - @JsonProperty("comment_count") val commentCount: Int? = null, - @JsonProperty("episode_type") val episodeType: String? = null, - @JsonProperty("first_aired") val firstAired: String? = null, - @JsonProperty("ids") val ids: Ids? = null, - @JsonProperty("images") val images: Images? = null, - @JsonProperty("number") val number: Int? = null, - @JsonProperty("number_abs") val numberAbs: Int? = null, - @JsonProperty("overview") val overview: String? = null, - @JsonProperty("rating") val rating: Double? = null, - @JsonProperty("runtime") val runtime: Int? = null, - @JsonProperty("season") val season: Int? = null, - @JsonProperty("title") val title: String? = null, - @JsonProperty("updated_at") val updatedAt: String? = null, - @JsonProperty("votes") val votes: Int? = null, + @JsonProperty("available_translations") @SerialName("available_translations") val availableTranslations: List? = null, + @JsonProperty("comment_count") @SerialName("comment_count") val commentCount: Int? = null, + @JsonProperty("episode_type") @SerialName("episode_type") val episodeType: String? = null, + @JsonProperty("first_aired") @SerialName("first_aired") val firstAired: String? = null, + @JsonProperty("ids") @SerialName("ids") val ids: Ids? = null, + @JsonProperty("images") @SerialName("images") val images: Images? = null, + @JsonProperty("number") @SerialName("number") val number: Int? = null, + @JsonProperty("number_abs") @SerialName("number_abs") val numberAbs: Int? = null, + @JsonProperty("overview") @SerialName("overview") val overview: String? = null, + @JsonProperty("rating") @SerialName("rating") val rating: Double? = null, + @JsonProperty("runtime") @SerialName("runtime") val runtime: Int? = null, + @JsonProperty("season") @SerialName("season") val season: Int? = null, + @JsonProperty("title") @SerialName("title") val title: String? = null, + @JsonProperty("updated_at") @SerialName("updated_at") val updatedAt: String? = null, + @JsonProperty("votes") @SerialName("votes") val votes: Int? = null, ) + @Serializable data class LinkData( - @JsonProperty("id") val id: Int? = null, - @JsonProperty("trakt_id") val traktId: Int? = null, - @JsonProperty("trakt_slug") val traktSlug: String? = null, - @JsonProperty("tmdb_id") val tmdbId: Int? = null, - @JsonProperty("imdb_id") val imdbId: String? = null, - @JsonProperty("tvdb_id") val tvdbId: Int? = null, - @JsonProperty("tvrage_id") val tvrageId: String? = null, - @JsonProperty("type") val type: String? = null, - @JsonProperty("season") val season: Int? = null, - @JsonProperty("episode") val episode: Int? = null, - @JsonProperty("ani_id") val aniId: String? = null, - @JsonProperty("anime_id") val animeId: String? = null, - @JsonProperty("title") val title: String? = null, - @JsonProperty("year") val year: Int? = null, - @JsonProperty("org_title") val orgTitle: String? = null, - @JsonProperty("is_anime") val isAnime: Boolean = false, - @JsonProperty("aired_year") val airedYear: Int? = null, - @JsonProperty("last_season") val lastSeason: Int? = null, - @JsonProperty("eps_title") val epsTitle: String? = null, - @JsonProperty("jp_title") val jpTitle: String? = null, - @JsonProperty("date") val date: String? = null, - @JsonProperty("aired_date") val airedDate: String? = null, - @JsonProperty("is_asian") val isAsian: Boolean = false, - @JsonProperty("is_bollywood") val isBollywood: Boolean = false, - @JsonProperty("is_cartoon") val isCartoon: Boolean = false, + @JsonProperty("id") @SerialName("id") val id: Int? = null, + @JsonProperty("trakt_id") @SerialName("trakt_id") val traktId: Int? = null, + @JsonProperty("trakt_slug") @SerialName("trakt_slug") val traktSlug: String? = null, + @JsonProperty("tmdb_id") @SerialName("tmdb_id") val tmdbId: Int? = null, + @JsonProperty("imdb_id") @SerialName("imdb_id") val imdbId: String? = null, + @JsonProperty("tvdb_id") @SerialName("tvdb_id") val tvdbId: Int? = null, + @JsonProperty("tvrage_id") @SerialName("tvrage_id") val tvrageId: String? = null, + @JsonProperty("type") @SerialName("type") val type: String? = null, + @JsonProperty("season") @SerialName("season") val season: Int? = null, + @JsonProperty("episode") @SerialName("episode") val episode: Int? = null, + @JsonProperty("ani_id") @SerialName("ani_id") val aniId: String? = null, + @JsonProperty("anime_id") @SerialName("anime_id") val animeId: String? = null, + @JsonProperty("title") @SerialName("title") val title: String? = null, + @JsonProperty("year") @SerialName("year") val year: Int? = null, + @JsonProperty("org_title") @SerialName("org_title") val orgTitle: String? = null, + @JsonProperty("is_anime") @SerialName("is_anime") val isAnime: Boolean = false, + @JsonProperty("aired_year") @SerialName("aired_year") val airedYear: Int? = null, + @JsonProperty("last_season") @SerialName("last_season") val lastSeason: Int? = null, + @JsonProperty("eps_title") @SerialName("eps_title") val epsTitle: String? = null, + @JsonProperty("jp_title") @SerialName("jp_title") val jpTitle: String? = null, + @JsonProperty("date") @SerialName("date") val date: String? = null, + @JsonProperty("aired_date") @SerialName("aired_date") val airedDate: String? = null, + @JsonProperty("is_asian") @SerialName("is_asian") val isAsian: Boolean = false, + @JsonProperty("is_bollywood") @SerialName("is_bollywood") val isBollywood: Boolean = false, + @JsonProperty("is_cartoon") @SerialName("is_cartoon") val isCartoon: Boolean = false, ) } From 7b3c938ba72f11303ec38bdf3b12e5560285bca2 Mon Sep 17 00:00:00 2001 From: Luna712 <142361265+Luna712@users.noreply.github.com> Date: Sun, 12 Jul 2026 16:38:08 -0600 Subject: [PATCH 38/38] Add more custom serializers for kotlinx serialization (#2978) This adds numerous other serializers to replicate Jackson mapper configuration behavior, that some extensions will need. --- .../utils/serializers/SerializerTest.kt | 157 ----- .../utils/serializers/UriSerializerTest.kt | 41 ++ .../utils/serializers/FloatAsIntSerializer.kt | 42 ++ .../serializers/FloatAsLongSerializer.kt | 42 ++ .../serializers/JsonTransformSerializer.kt | 75 +++ .../utils/serializers/NonEmptySerializer.kt | 9 +- .../serializers/NullableStringSerializer.kt | 49 ++ .../utils/serializers/WriteOnlySerializer.kt | 6 +- .../utils/serializers/SerializersTest.kt | 602 ++++++++++++++++++ 9 files changed, 858 insertions(+), 165 deletions(-) delete mode 100644 app/src/androidTest/java/com/lagradost/cloudstream3/utils/serializers/SerializerTest.kt create mode 100644 app/src/androidTest/java/com/lagradost/cloudstream3/utils/serializers/UriSerializerTest.kt create mode 100644 library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/serializers/FloatAsIntSerializer.kt create mode 100644 library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/serializers/FloatAsLongSerializer.kt create mode 100644 library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/serializers/JsonTransformSerializer.kt create mode 100644 library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/serializers/NullableStringSerializer.kt create mode 100644 library/src/commonTest/kotlin/com/lagradost/cloudstream3/utils/serializers/SerializersTest.kt diff --git a/app/src/androidTest/java/com/lagradost/cloudstream3/utils/serializers/SerializerTest.kt b/app/src/androidTest/java/com/lagradost/cloudstream3/utils/serializers/SerializerTest.kt deleted file mode 100644 index 15ad532f8..000000000 --- a/app/src/androidTest/java/com/lagradost/cloudstream3/utils/serializers/SerializerTest.kt +++ /dev/null @@ -1,157 +0,0 @@ -package com.lagradost.cloudstream3.utils.serializers - -import android.net.Uri -import com.lagradost.cloudstream3.utils.AppUtils.parseJson -import com.lagradost.cloudstream3.utils.AppUtils.toJson -import kotlinx.serialization.ExperimentalSerializationApi -import kotlinx.serialization.KeepGeneratedSerializer -import kotlinx.serialization.Serializable -import org.junit.Assert.assertEquals -import org.junit.Assert.assertFalse -import org.junit.Assert.assertNull -import org.junit.Assert.assertTrue -import org.junit.Test - -@OptIn(ExperimentalSerializationApi::class) -@KeepGeneratedSerializer -@Serializable(with = NonEmptyData.Serializer::class) -data class NonEmptyData( - val title: String = "", - val tags: List = emptyList(), - val meta: Map = emptyMap(), - val name: String = "hello", -) { - object Serializer : NonEmptySerializer(NonEmptyData.generatedSerializer()) -} - -@OptIn(ExperimentalSerializationApi::class) -@KeepGeneratedSerializer -@Serializable(with = WriteOnlyData.Serializer::class) -data class WriteOnlyData( - val fieldA: String = "", - val fieldB: String = "", -) { - object Serializer : WriteOnlySerializer( - WriteOnlyData.generatedSerializer(), - setOf("fieldB"), - ) -} - -@OptIn(ExperimentalSerializationApi::class) -@KeepGeneratedSerializer -@Serializable(with = MultiWriteOnly.Serializer::class) -data class MultiWriteOnly( - val fieldA: String = "", - val fieldB: String = "", - val fieldC: String = "", -) { - object Serializer : WriteOnlySerializer( - MultiWriteOnly.generatedSerializer(), - setOf("fieldB", "fieldC"), - ) -} - -@Serializable -data class UriData( - @Serializable(with = UriSerializer::class) - val uri: Uri = Uri.EMPTY, -) - -class SerializerTest { - - @Test - fun nonEmptySerializerOmitsEmptyStrings() { - val data = NonEmptyData(title = "", name = "hello") - val result = data.toJson() - assertFalse(result.contains("title")) - assertTrue(result.contains("name")) - } - - @Test - fun nonEmptySerializerOmitsEmptyLists() { - val data = NonEmptyData(tags = emptyList(), name = "hello") - val result = data.toJson() - assertFalse(result.contains("tags")) - } - - @Test - fun nonEmptySerializerOmitsEmptyMaps() { - val data = NonEmptyData(meta = emptyMap(), name = "hello") - val result = data.toJson() - assertFalse(result.contains("meta")) - } - - @Test - fun nonEmptySerializerKeepsNonEmptyFields() { - val data = NonEmptyData(title = "hello", tags = listOf("a"), meta = mapOf("k" to "v")) - val result = data.toJson() - assertTrue(result.contains("title")) - assertTrue(result.contains("tags")) - assertTrue(result.contains("meta")) - } - - @Test - fun nonEmptySerializerDoesNotAffectDeserialization() { - val input = """{"title":"hello","tags":["a"],"meta":{"k":"v"},"name":"world"}""" - val result = parseJson(input) - assertEquals("hello", result.title) - assertEquals(listOf("a"), result.tags) - assertEquals(mapOf("k" to "v"), result.meta) - assertEquals("world", result.name) - } - - @Test - fun writeOnlySerializerOmitsFieldOnSerialize() { - val data = WriteOnlyData(fieldA = "hello", fieldB = "secret") - val result = data.toJson() - assertTrue(result.contains("fieldA")) - assertFalse(result.contains("fieldB")) - } - - @Test - fun writeOnlySerializerDeserializesNormally() { - val input = """{"fieldA":"hello","fieldB":"secret"}""" - val result = parseJson(input) - assertEquals("hello", result.fieldA) - assertEquals("secret", result.fieldB) - } - - @Test - fun writeOnlySerializerDeserializesMissingAsDefault() { - val input = """{"fieldA":"hello"}""" - val result = parseJson(input) - assertEquals("hello", result.fieldA) - assertEquals("", result.fieldB) - } - - @Test - fun writeOnlySerializerHandlesMultipleKeys() { - val data = MultiWriteOnly(fieldA = "hello", fieldB = "secret1", fieldC = "secret2") - val result = data.toJson() - assertTrue(result.contains("fieldA")) - assertFalse(result.contains("fieldB")) - assertFalse(result.contains("fieldC")) - } - - @Test - fun uriSerializerSerializesUriToString() { - val data = UriData(uri = Uri.parse("https://example.com/path?query=1")) - val result = data.toJson() - assertTrue(result.contains("https://example.com/path?query=1")) - } - - @Test - fun uriSerializerDeserializesStringToUri() { - val input = """{"uri":"https://example.com/path?query=1"}""" - val result = parseJson(input) - assertEquals(Uri.parse("https://example.com/path?query=1"), result.uri) - } - - @Test - fun uriSerializerRoundtripsCorrectly() { - val data = UriData(uri = Uri.parse("https://example.com/path?query=1")) - val encoded = data.toJson() - val decoded = parseJson(encoded) - assertEquals(data.uri, decoded.uri) - } -} diff --git a/app/src/androidTest/java/com/lagradost/cloudstream3/utils/serializers/UriSerializerTest.kt b/app/src/androidTest/java/com/lagradost/cloudstream3/utils/serializers/UriSerializerTest.kt new file mode 100644 index 000000000..3ffd37124 --- /dev/null +++ b/app/src/androidTest/java/com/lagradost/cloudstream3/utils/serializers/UriSerializerTest.kt @@ -0,0 +1,41 @@ +package com.lagradost.cloudstream3.utils.serializers + +import android.net.Uri +import com.lagradost.cloudstream3.utils.AppUtils.parseJson +import com.lagradost.cloudstream3.utils.AppUtils.toJson +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import org.junit.Assert.assertEquals +import org.junit.Assert.assertTrue +import org.junit.Test + +@Serializable +data class UriData( + @Serializable(with = UriSerializer::class) + @SerialName("uri") val uri: Uri = Uri.EMPTY, +) + +class UriSerializerTest { + + @Test + fun uriSerializerSerializesUriToString() { + val data = UriData(uri = Uri.parse("https://example.com/path?query=1")) + val result = data.toJson() + assertTrue(result.contains("https://example.com/path?query=1")) + } + + @Test + fun uriSerializerDeserializesStringToUri() { + val input = """{"uri":"https://example.com/path?query=1"}""" + val result = parseJson(input) + assertEquals(Uri.parse("https://example.com/path?query=1"), result.uri) + } + + @Test + fun uriSerializerRoundtripsCorrectly() { + val data = UriData(uri = Uri.parse("https://example.com/path?query=1")) + val encoded = data.toJson() + val decoded = parseJson(encoded) + assertEquals(data.uri, decoded.uri) + } +} diff --git a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/serializers/FloatAsIntSerializer.kt b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/serializers/FloatAsIntSerializer.kt new file mode 100644 index 000000000..12c8f6ed0 --- /dev/null +++ b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/serializers/FloatAsIntSerializer.kt @@ -0,0 +1,42 @@ +package com.lagradost.cloudstream3.utils.serializers + +import com.lagradost.cloudstream3.Prerelease +import kotlinx.serialization.KSerializer +import kotlinx.serialization.descriptors.PrimitiveKind +import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.encoding.Decoder +import kotlinx.serialization.encoding.Encoder +import kotlinx.serialization.json.JsonDecoder +import kotlinx.serialization.json.JsonPrimitive +import kotlinx.serialization.json.doubleOrNull +import kotlinx.serialization.json.intOrNull + +/** + * Replicates Jackson's ACCEPT_FLOAT_AS_INT behaviour for Int fields. + * A floating-point JSON number is truncated to Int by dropping the + * fractional part, exactly like Jackson's default truncation behaviour. + * + * Usage: + * + * @Serializable + * data class MyData( + * @Serializable(with = FloatAsIntSerializer::class) + * @SerialName("count") val count: Int = 0, + * ) + */ +@Prerelease +object FloatAsIntSerializer : KSerializer { + + override val descriptor: SerialDescriptor = + PrimitiveSerialDescriptor("FloatAsInt", PrimitiveKind.INT) + + override fun deserialize(decoder: Decoder): Int { + val jsonDecoder = decoder as? JsonDecoder ?: return decoder.decodeInt() + val element = jsonDecoder.decodeJsonElement() + if (element !is JsonPrimitive) return 0 + return element.intOrNull ?: element.doubleOrNull?.toInt() ?: 0 + } + + override fun serialize(encoder: Encoder, value: Int) = encoder.encodeInt(value) +} diff --git a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/serializers/FloatAsLongSerializer.kt b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/serializers/FloatAsLongSerializer.kt new file mode 100644 index 000000000..7fc394107 --- /dev/null +++ b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/serializers/FloatAsLongSerializer.kt @@ -0,0 +1,42 @@ +package com.lagradost.cloudstream3.utils.serializers + +import com.lagradost.cloudstream3.Prerelease +import kotlinx.serialization.KSerializer +import kotlinx.serialization.descriptors.PrimitiveKind +import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.encoding.Decoder +import kotlinx.serialization.encoding.Encoder +import kotlinx.serialization.json.JsonDecoder +import kotlinx.serialization.json.JsonPrimitive +import kotlinx.serialization.json.doubleOrNull +import kotlinx.serialization.json.longOrNull + +/** + * Replicates Jackson's ACCEPT_FLOAT_AS_INT behaviour for Long fields. + * A floating-point JSON number is truncated to Long by dropping the + * fractional part, exactly like Jackson's default truncation behaviour. + * + * Usage: + * + * @Serializable + * data class MyData( + * @Serializable(with = FloatAsLongSerializer::class) + * @SerialName("timestamp") val timestamp: Long = 0L, + * ) + */ +@Prerelease +object FloatAsLongSerializer : KSerializer { + + override val descriptor: SerialDescriptor = + PrimitiveSerialDescriptor("FloatAsLong", PrimitiveKind.LONG) + + override fun deserialize(decoder: Decoder): Long { + val jsonDecoder = decoder as? JsonDecoder ?: return decoder.decodeLong() + val element = jsonDecoder.decodeJsonElement() + if (element !is JsonPrimitive) return 0L + return element.longOrNull ?: element.doubleOrNull?.toLong() ?: 0L + } + + override fun serialize(encoder: Encoder, value: Long) = encoder.encodeLong(value) +} diff --git a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/serializers/JsonTransformSerializer.kt b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/serializers/JsonTransformSerializer.kt new file mode 100644 index 000000000..6b9c25b59 --- /dev/null +++ b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/serializers/JsonTransformSerializer.kt @@ -0,0 +1,75 @@ +package com.lagradost.cloudstream3.utils.serializers + +import com.lagradost.cloudstream3.Prerelease +import kotlinx.serialization.KSerializer +import kotlinx.serialization.json.JsonArray +import kotlinx.serialization.json.JsonElement +import kotlinx.serialization.json.JsonNull +import kotlinx.serialization.json.JsonObject +import kotlinx.serialization.json.JsonPrimitive +import kotlinx.serialization.json.JsonTransformingSerializer + +/** + * Composable deserialize transformer that applies multiple Jackson-equivalent + * behaviours to specific fields by key. Pass only the sets you need; all + * default to empty (no-op). + * + * Behaviours (applied in order per field): + * singleValueAsListKeys ACCEPT_SINGLE_VALUE_AS_ARRAY + * emptyStringAsNullKeys ACCEPT_EMPTY_STRING_AS_NULL_OBJECT + * emptyArrayAsNullKeys ACCEPT_EMPTY_ARRAY_AS_NULL_OBJECT + * + * Usage: + * + * @OptIn(ExperimentalSerializationApi::class) // KeepGeneratedSerializer is an experimental annotation for now + * @KeepGeneratedSerializer + * @Serializable(with = MyData.Serializer::class) + * data class MyData( + * @SerialName("title") val title: String? = null, + * @SerialName("tags") val tags: List? = null, + * @SerialName("meta") val meta: MyMeta? = null, + * ) { + * object Serializer : JsonTransformSerializer( + * MyData.generatedSerializer(), + * singleValueAsListKeys = setOf("tags"), + * emptyStringAsNullKeys = setOf("title", "tags"), + * emptyArrayAsNullKeys = setOf("tags", "meta"), + * ) + * } + */ +@Prerelease +abstract class JsonTransformSerializer( + tSerializer: KSerializer, + private val singleValueAsListKeys: Set = emptySet(), + private val emptyArrayAsNullKeys: Set = emptySet(), + private val emptyStringAsNullKeys: Set = emptySet(), +) : JsonTransformingSerializer(tSerializer) { + + override fun transformDeserialize(element: JsonElement): JsonElement { + if (element !is JsonObject) return element + return JsonObject(element.mapValues { (key, value) -> + var result = value + if (key in singleValueAsListKeys) { + result = when (result) { + is JsonArray -> result + JsonNull -> JsonArray(emptyList()) + else -> JsonArray(listOf(result)) + } + } + + if (key in emptyStringAsNullKeys) { + if (result is JsonPrimitive && result.isString && result.content.isEmpty()) { + result = JsonNull + } + } + + if (key in emptyArrayAsNullKeys) { + if (result is JsonArray && result.isEmpty()) { + result = JsonNull + } + } + + result + }) + } +} diff --git a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/serializers/NonEmptySerializer.kt b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/serializers/NonEmptySerializer.kt index 62b306e1f..8bc8f1734 100644 --- a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/serializers/NonEmptySerializer.kt +++ b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/serializers/NonEmptySerializer.kt @@ -17,13 +17,13 @@ import kotlinx.serialization.json.JsonTransformingSerializer * * Usage: * - * @OptIn(ExperimentalSerializationApi::class) + * @OptIn(ExperimentalSerializationApi::class) // KeepGeneratedSerializer is an experimental annotation for now * @KeepGeneratedSerializer * @Serializable(with = MyData.Serializer::class) * data class MyData( - * val tags: List = emptyList(), - * val title: String = "", - * val meta: Map = emptyMap(), + * @SerialName("tags") val tags: List = emptyList(), + * @SerialName("title") val title: String = "", + * @SerialName("meta") val meta: Map = emptyMap(), * ) { * object Serializer : NonEmptySerializer(MyData.generatedSerializer()) * } @@ -33,7 +33,6 @@ abstract class NonEmptySerializer(tSerializer: KSerializer) : override fun transformSerialize(element: JsonElement): JsonElement { if (element !is JsonObject) return element - return JsonObject(element.filterValues { value -> when (value) { is JsonPrimitive -> value.content.isNotEmpty() diff --git a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/serializers/NullableStringSerializer.kt b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/serializers/NullableStringSerializer.kt new file mode 100644 index 000000000..6755304a5 --- /dev/null +++ b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/serializers/NullableStringSerializer.kt @@ -0,0 +1,49 @@ +package com.lagradost.cloudstream3.utils.serializers + +import com.lagradost.cloudstream3.Prerelease +import kotlinx.serialization.ExperimentalSerializationApi +import kotlinx.serialization.KSerializer +import kotlinx.serialization.builtins.serializer +import kotlinx.serialization.descriptors.PrimitiveKind +import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.encoding.Decoder +import kotlinx.serialization.encoding.Encoder +import kotlinx.serialization.json.JsonDecoder +import kotlinx.serialization.json.JsonNull +import kotlinx.serialization.json.JsonPrimitive +import kotlinx.serialization.json.decodeFromJsonElement + +/** + * Convenience serializer for nullable String fields that combines + * ACCEPT_EMPTY_STRING_AS_NULL_OBJECT with null passthrough. + * An empty JSON string (`""`) or JSON null is decoded as null. + * + * Usage: + * + * @Serializable + * data class MyData( + * @Serializable(with = NullableStringSerializer::class) + * @SerialName("title") val title: String? = null, + * ) + */ +@Prerelease +object NullableStringSerializer : KSerializer { + + override val descriptor: SerialDescriptor = + PrimitiveSerialDescriptor("NullableString", PrimitiveKind.STRING) + + override fun deserialize(decoder: Decoder): String? { + val jsonDecoder = decoder as? JsonDecoder ?: return decoder.decodeString() + return when (val element = jsonDecoder.decodeJsonElement()) { + is JsonPrimitive -> element.content.ifEmpty { null } + JsonNull -> null + else -> jsonDecoder.json.decodeFromJsonElement(String.serializer(), element) + } + } + + override fun serialize(encoder: Encoder, value: String?) { + @OptIn(ExperimentalSerializationApi::class) // encodeNull is experimental for now + if (value == null) encoder.encodeNull() else encoder.encodeString(value) + } +} diff --git a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/serializers/WriteOnlySerializer.kt b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/serializers/WriteOnlySerializer.kt index 1d06b7fca..1b6ca9aee 100644 --- a/library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/serializers/WriteOnlySerializer.kt +++ b/library/src/commonMain/kotlin/com/lagradost/cloudstream3/utils/serializers/WriteOnlySerializer.kt @@ -12,12 +12,12 @@ import kotlinx.serialization.json.JsonTransformingSerializer * * Usage: * - * @OptIn(ExperimentalSerializationApi::class) + * @OptIn(ExperimentalSerializationApi::class) // KeepGeneratedSerializer is an experimental annotation for now * @KeepGeneratedSerializer * @Serializable(with = MyData.Serializer::class) * data class MyData( - * val fieldA: String = "", - * val fieldB: String = "", + * @SerialName("fieldA") val fieldA: String = "", + * @SerialName("fieldB") val fieldB: String = "", * ) { * object Serializer : WriteOnlySerializer( * MyData.generatedSerializer(), diff --git a/library/src/commonTest/kotlin/com/lagradost/cloudstream3/utils/serializers/SerializersTest.kt b/library/src/commonTest/kotlin/com/lagradost/cloudstream3/utils/serializers/SerializersTest.kt new file mode 100644 index 000000000..89c0fea81 --- /dev/null +++ b/library/src/commonTest/kotlin/com/lagradost/cloudstream3/utils/serializers/SerializersTest.kt @@ -0,0 +1,602 @@ +package com.lagradost.cloudstream3.utils.serializers + +import com.lagradost.cloudstream3.utils.AppUtils.parseJson +import com.lagradost.cloudstream3.utils.AppUtils.toJson +import kotlinx.serialization.ExperimentalSerializationApi +import kotlinx.serialization.KeepGeneratedSerializer +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import kotlin.test.Test +import kotlin.test.assertEquals +import kotlin.test.assertFalse +import kotlin.test.assertNull +import kotlin.test.assertTrue + +@OptIn(ExperimentalSerializationApi::class) // KeepGeneratedSerializer is an experimental annotation for now +@KeepGeneratedSerializer +@Serializable(with = NonEmptyData.Serializer::class) +data class NonEmptyData( + @SerialName("title") val title: String = "", + @SerialName("tags") val tags: List = emptyList(), + @SerialName("meta") val meta: Map = emptyMap(), + @SerialName("name") val name: String = "hello", +) { + object Serializer : NonEmptySerializer(NonEmptyData.generatedSerializer()) +} + +@OptIn(ExperimentalSerializationApi::class) // KeepGeneratedSerializer is an experimental annotation for now +@KeepGeneratedSerializer +@Serializable(with = WriteOnlyData.Serializer::class) +data class WriteOnlyData( + @SerialName("fieldA") val fieldA: String = "", + @SerialName("fieldB") val fieldB: String = "", +) { + object Serializer : WriteOnlySerializer( + WriteOnlyData.generatedSerializer(), + setOf("fieldB"), + ) +} + +@OptIn(ExperimentalSerializationApi::class) // KeepGeneratedSerializer is an experimental annotation for now +@KeepGeneratedSerializer +@Serializable(with = MultiWriteOnly.Serializer::class) +data class MultiWriteOnly( + @SerialName("fieldA") val fieldA: String = "", + @SerialName("fieldB") val fieldB: String = "", + @SerialName("fieldC") val fieldC: String = "", +) { + object Serializer : WriteOnlySerializer( + MultiWriteOnly.generatedSerializer(), + setOf("fieldB", "fieldC"), + ) +} + +@OptIn(ExperimentalSerializationApi::class) // KeepGeneratedSerializer is an experimental annotation for now +@KeepGeneratedSerializer +@Serializable(with = SingleValueData.Serializer::class) +data class SingleValueData( + @SerialName("tags") val tags: List = emptyList(), + @SerialName("nums") val nums: List = emptyList(), +) { + object Serializer : JsonTransformSerializer( + SingleValueData.generatedSerializer(), + singleValueAsListKeys = setOf("tags", "nums"), + ) +} + +@Serializable +data class NestedMeta( + @SerialName("key") val key: String = "", +) + +@OptIn(ExperimentalSerializationApi::class) // KeepGeneratedSerializer is an experimental annotation for now +@KeepGeneratedSerializer +@Serializable(with = EmptyArrayData.Serializer::class) +data class EmptyArrayData( + @SerialName("meta") val meta: NestedMeta? = null, + @SerialName("other") val other: String = "hello", +) { + object Serializer : JsonTransformSerializer( + EmptyArrayData.generatedSerializer(), + emptyArrayAsNullKeys = setOf("meta"), + ) +} + +@OptIn(ExperimentalSerializationApi::class) // KeepGeneratedSerializer is an experimental annotation for now +@KeepGeneratedSerializer +@Serializable(with = EmptyStringData.Serializer::class) +data class EmptyStringData( + @SerialName("title") val title: String? = null, + @SerialName("episode") val episode: NestedMeta? = null, + @SerialName("keep") val keep: String? = "hello", +) { + object Serializer : JsonTransformSerializer( + EmptyStringData.generatedSerializer(), + emptyStringAsNullKeys = setOf("title", "episode", "keep"), + ) +} + +@OptIn(ExperimentalSerializationApi::class) // KeepGeneratedSerializer is an experimental annotation for now +@KeepGeneratedSerializer +@Serializable(with = SingleValueOrNullData.Serializer::class) +data class SingleValueOrNullData( + @SerialName("tags") val tags: List? = null, + @SerialName("nums") val nums: List? = null, + @SerialName("other") val other: String = "hello", +) { + object Serializer : JsonTransformSerializer( + SingleValueOrNullData.generatedSerializer(), + singleValueAsListKeys = setOf("tags", "nums"), + emptyArrayAsNullKeys = setOf("tags", "nums"), + ) +} + +@OptIn(ExperimentalSerializationApi::class) // KeepGeneratedSerializer is an experimental annotation for now +@KeepGeneratedSerializer +@Serializable(with = NullableFieldsData.Serializer::class) +data class NullableFieldsData( + @SerialName("title") val title: String? = null, + @SerialName("meta") val meta: NestedMeta? = null, + @SerialName("other") val other: String = "hello", +) { + object Serializer : JsonTransformSerializer( + NullableFieldsData.generatedSerializer(), + emptyStringAsNullKeys = setOf("title"), + emptyArrayAsNullKeys = setOf("meta"), + ) +} + +@OptIn(ExperimentalSerializationApi::class) // KeepGeneratedSerializer is an experimental annotation for now +@KeepGeneratedSerializer +@Serializable(with = SingleValueOrEmptyStringData.Serializer::class) +data class SingleValueOrEmptyStringData( + @SerialName("tags") val tags: List = emptyList(), + @SerialName("title") val title: String? = null, +) { + object Serializer : JsonTransformSerializer( + SingleValueOrEmptyStringData.generatedSerializer(), + singleValueAsListKeys = setOf("tags"), + emptyStringAsNullKeys = setOf("title"), + ) +} + +@OptIn(ExperimentalSerializationApi::class) // KeepGeneratedSerializer is an experimental annotation for now +@KeepGeneratedSerializer +@Serializable(with = AllTransformsData.Serializer::class) +data class AllTransformsData( + @SerialName("tags") val tags: List? = null, + @SerialName("title") val title: String? = null, + @SerialName("meta") val meta: NestedMeta? = null, + @SerialName("other") val other: String = "hello", +) { + object Serializer : JsonTransformSerializer( + AllTransformsData.generatedSerializer(), + singleValueAsListKeys = setOf("tags"), + emptyArrayAsNullKeys = setOf("tags", "meta"), + emptyStringAsNullKeys = setOf("title", "tags"), + ) +} + +@Serializable +data class FloatIntData( + @Serializable(with = FloatAsIntSerializer::class) + @SerialName("count") val count: Int = 0, +) + +@Serializable +data class FloatLongData( + @Serializable(with = FloatAsLongSerializer::class) + @SerialName("timestamp") val timestamp: Long = 0L, +) + +@Serializable +data class NullableStringData( + @Serializable(with = NullableStringSerializer::class) + @SerialName("title") val title: String? = null, +) + +class SerializersTest { + + @Test + fun nonEmptySerializerOmitsEmptyStrings() { + val data = NonEmptyData(title = "", name = "hello") + val result = data.toJson() + assertFalse(result.contains("title")) + assertTrue(result.contains("name")) + } + + @Test + fun nonEmptySerializerOmitsEmptyLists() { + val data = NonEmptyData(tags = emptyList(), name = "hello") + val result = data.toJson() + assertFalse(result.contains("tags")) + } + + @Test + fun nonEmptySerializerOmitsEmptyMaps() { + val data = NonEmptyData(meta = emptyMap(), name = "hello") + val result = data.toJson() + assertFalse(result.contains("meta")) + } + + @Test + fun nonEmptySerializerKeepsNonEmptyFields() { + val data = NonEmptyData(title = "hello", tags = listOf("a"), meta = mapOf("k" to "v")) + val result = data.toJson() + assertTrue(result.contains("title")) + assertTrue(result.contains("tags")) + assertTrue(result.contains("meta")) + } + + @Test + fun nonEmptySerializerDoesNotAffectDeserialization() { + val input = """{"title":"hello","tags":["a"],"meta":{"k":"v"},"name":"world"}""" + val result = parseJson(input) + assertEquals("hello", result.title) + assertEquals(listOf("a"), result.tags) + assertEquals(mapOf("k" to "v"), result.meta) + assertEquals("world", result.name) + } + + @Test + fun writeOnlySerializerOmitsFieldOnSerialize() { + val data = WriteOnlyData(fieldA = "hello", fieldB = "secret") + val result = data.toJson() + assertTrue(result.contains("fieldA")) + assertFalse(result.contains("fieldB")) + } + + @Test + fun writeOnlySerializerDeserializesNormally() { + val input = """{"fieldA":"hello","fieldB":"secret"}""" + val result = parseJson(input) + assertEquals("hello", result.fieldA) + assertEquals("secret", result.fieldB) + } + + @Test + fun writeOnlySerializerDeserializesMissingAsDefault() { + val input = """{"fieldA":"hello"}""" + val result = parseJson(input) + assertEquals("hello", result.fieldA) + assertEquals("", result.fieldB) + } + + @Test + fun writeOnlySerializerHandlesMultipleKeys() { + val data = MultiWriteOnly(fieldA = "hello", fieldB = "secret1", fieldC = "secret2") + val result = data.toJson() + assertTrue(result.contains("fieldA")) + assertFalse(result.contains("fieldB")) + assertFalse(result.contains("fieldC")) + } + + @Test + fun singleValueAsListDecodesArrayNormally() { + val input = """{"tags":["a","b"],"nums":[1,2]}""" + val result = parseJson(input) + assertEquals(listOf("a", "b"), result.tags) + assertEquals(listOf(1, 2), result.nums) + } + + @Test + fun singleValueAsListWrapsBareStringInList() { + val input = """{"tags":"a","nums":[1]}""" + val result = parseJson(input) + assertEquals(listOf("a"), result.tags) + } + + @Test + fun singleValueAsListWrapsBareIntInList() { + val input = """{"tags":[],"nums":42}""" + val result = parseJson(input) + assertEquals(listOf(42), result.nums) + } + + @Test + fun singleValueAsListDecodesNullAsEmptyList() { + val input = """{"tags":null,"nums":[]}""" + val result = parseJson(input) + assertEquals(emptyList(), result.tags) + } + + @Test + fun singleValueAsListRoundtripsCorrectly() { + val data = SingleValueData(tags = listOf("x", "y"), nums = listOf(1, 2)) + val encoded = data.toJson() + val decoded = parseJson(encoded) + assertEquals(data, decoded) + } + + @Test + fun emptyArrayAsNullDecodesEmptyArrayAsNull() { + val input = """{"meta":[],"other":"hello"}""" + val result = parseJson(input) + assertNull(result.meta) + } + + @Test + fun emptyArrayAsNullDecodesNullAsNull() { + val input = """{"meta":null,"other":"hello"}""" + val result = parseJson(input) + assertNull(result.meta) + } + + @Test + fun emptyArrayAsNullDecodesObjectNormally() { + val input = """{"meta":{"key":"value"},"other":"hello"}""" + val result = parseJson(input) + assertEquals(NestedMeta("value"), result.meta) + } + + @Test + fun emptyArrayAsNullDoesNotAffectOtherFields() { + val input = """{"meta":[],"other":"world"}""" + val result = parseJson(input) + assertEquals("world", result.other) + } + + @Test + fun emptyArrayAsNullRoundtripsCorrectly() { + val data = EmptyArrayData(meta = NestedMeta("test"), other = "hello") + val encoded = data.toJson() + val decoded = parseJson(encoded) + assertEquals(data, decoded) + } + + @Test + fun emptyStringAsNullDecodesEmptyStringAsNull() { + val input = """{"title":"","episode":null,"keep":"hello"}""" + val result = parseJson(input) + assertNull(result.title) + } + + @Test + fun emptyStringAsNullDecodesNullAsNull() { + val input = """{"title":null,"episode":null,"keep":"hello"}""" + val result = parseJson(input) + assertNull(result.title) + } + + @Test + fun emptyStringAsNullKeepsNonEmptyString() { + val input = """{"title":"hello","episode":null,"keep":"world"}""" + val result = parseJson(input) + assertEquals("hello", result.title) + } + + @Test + fun emptyStringAsNullDecodesObjectNormally() { + val input = """{"title":null,"episode":{"key":"value"},"keep":"hello"}""" + val result = parseJson(input) + assertEquals(NestedMeta("value"), result.episode) + } + + @Test + fun emptyStringAsNullDoesNotAffectNonEmptyFields() { + val input = """{"title":"","episode":null,"keep":"world"}""" + val result = parseJson(input) + assertEquals("world", result.keep) + } + + @Test + fun emptyStringAsNullRoundtripsCorrectly() { + val data = EmptyStringData(title = "hello", episode = NestedMeta("x"), keep = "world") + val encoded = data.toJson() + val decoded = parseJson(encoded) + assertEquals(data, decoded) + } + + @Test + fun singleValueOrNullWrapsBareValueInList() { + val input = """{"tags":"a","nums":1,"other":"hello"}""" + val result = parseJson(input) + assertEquals(listOf("a"), result.tags) + assertEquals(listOf(1), result.nums) + } + + @Test + fun singleValueOrNullTreatsEmptyArrayAsNull() { + val input = """{"tags":[],"nums":[],"other":"hello"}""" + val result = parseJson(input) + assertNull(result.tags) + assertNull(result.nums) + } + + @Test + fun singleValueOrNullDecodesArrayNormally() { + val input = """{"tags":["a","b"],"nums":[1,2],"other":"hello"}""" + val result = parseJson(input) + assertEquals(listOf("a", "b"), result.tags) + assertEquals(listOf(1, 2), result.nums) + } + + @Test + fun singleValueOrNullDoesNotAffectOtherFields() { + val input = """{"tags":[],"nums":[],"other":"world"}""" + val result = parseJson(input) + assertEquals("world", result.other) + } + + @Test + fun nullableFieldsEmptyStringBecomesNull() { + val input = """{"title":"","meta":{"key":"value"},"other":"hello"}""" + val result = parseJson(input) + assertNull(result.title) + assertEquals(NestedMeta("value"), result.meta) + } + + @Test + fun nullableFieldsEmptyArrayBecomesNull() { + val input = """{"title":"hello","meta":[],"other":"hello"}""" + val result = parseJson(input) + assertEquals("hello", result.title) + assertNull(result.meta) + } + + @Test + fun nullableFieldsBothNullAtOnce() { + val input = """{"title":"","meta":[],"other":"hello"}""" + val result = parseJson(input) + assertNull(result.title) + assertNull(result.meta) + } + + @Test + fun nullableFieldsDoesNotAffectOtherFields() { + val input = """{"title":"","meta":[],"other":"world"}""" + val result = parseJson(input) + assertEquals("world", result.other) + } + + @Test + fun nullableFieldsRoundtripsCorrectly() { + val data = NullableFieldsData(title = "hello", meta = NestedMeta("x"), other = "world") + val encoded = data.toJson() + val decoded = parseJson(encoded) + assertEquals(data, decoded) + } + + @Test + fun singleValueOrEmptyStringWrapsBareString() { + val input = """{"tags":"a","title":"hello"}""" + val result = parseJson(input) + assertEquals(listOf("a"), result.tags) + assertEquals("hello", result.title) + } + + @Test + fun singleValueOrEmptyStringTurnsEmptyTitleToNull() { + val input = """{"tags":["a"],"title":""}""" + val result = parseJson(input) + assertEquals(listOf("a"), result.tags) + assertNull(result.title) + } + + @Test + fun singleValueOrEmptyStringRoundtripsCorrectly() { + val data = SingleValueOrEmptyStringData(tags = listOf("x"), title = "hello") + val encoded = data.toJson() + val decoded = parseJson(encoded) + assertEquals(data, decoded) + } + + @Test + fun allTransformsWrapsBareStringInList() { + val input = """{"tags":"a","title":"hello","meta":{"key":"value"},"other":"world"}""" + val result = parseJson(input) + assertEquals(listOf("a"), result.tags) + } + + @Test + fun allTransformsEmptyArrayTagsBecomesNull() { + val input = """{"tags":[],"title":"hello","meta":{"key":"value"},"other":"world"}""" + val result = parseJson(input) + assertNull(result.tags) + } + + @Test + fun allTransformsEmptyMetaBecomesNull() { + val input = """{"tags":["a"],"title":"hello","meta":[],"other":"world"}""" + val result = parseJson(input) + assertNull(result.meta) + } + + @Test + fun allTransformsEmptyTitleBecomesNull() { + val input = """{"tags":["a"],"title":"","meta":{"key":"value"},"other":"world"}""" + val result = parseJson(input) + assertNull(result.title) + } + + @Test + fun allTransformsAllNullAtOnce() { + val input = """{"tags":[],"title":"","meta":[],"other":"world"}""" + val result = parseJson(input) + assertNull(result.tags) + assertNull(result.title) + assertNull(result.meta) + } + + @Test + fun allTransformsDoesNotAffectOtherFields() { + val input = """{"tags":[],"title":"","meta":[],"other":"world"}""" + val result = parseJson(input) + assertEquals("world", result.other) + } + + @Test + fun allTransformsRoundtripsCorrectly() { + val data = AllTransformsData(tags = listOf("a"), title = "hello", meta = NestedMeta("x"), other = "world") + val encoded = data.toJson() + val decoded = parseJson(encoded) + assertEquals(data, decoded) + } + + @Test + fun floatAsIntTruncatesFloat() { + val input = """{"count":3.9}""" + val result = parseJson(input) + assertEquals(3, result.count) + } + + @Test + fun floatAsIntDecodesIntNormally() { + val input = """{"count":42}""" + val result = parseJson(input) + assertEquals(42, result.count) + } + + @Test + fun floatAsIntHandlesNegativeFloat() { + val input = """{"count":-2.7}""" + val result = parseJson(input) + assertEquals(-2, result.count) + } + + @Test + fun floatAsIntRoundtripsCorrectly() { + val data = FloatIntData(count = 7) + val encoded = data.toJson() + val decoded = parseJson(encoded) + assertEquals(data, decoded) + } + + @Test + fun floatAsLongTruncatesFloat() { + val input = """{"timestamp":1234567890.9}""" + val result = parseJson(input) + assertEquals(1234567890L, result.timestamp) + } + + @Test + fun floatAsLongDecodesLongNormally() { + val input = """{"timestamp":9999999999}""" + val result = parseJson(input) + assertEquals(9999999999L, result.timestamp) + } + + @Test + fun floatAsLongHandlesNegativeFloat() { + val input = """{"timestamp":-100.6}""" + val result = parseJson(input) + assertEquals(-100L, result.timestamp) + } + + @Test + fun floatAsLongRoundtripsCorrectly() { + val data = FloatLongData(timestamp = 1700000000L) + val encoded = data.toJson() + val decoded = parseJson(encoded) + assertEquals(data, decoded) + } + + @Test + fun nullableStringDecodesEmptyStringAsNull() { + val input = """{"title":""}""" + val result = parseJson(input) + assertNull(result.title) + } + + @Test + fun nullableStringDecodesNullAsNull() { + val input = """{"title":null}""" + val result = parseJson(input) + assertNull(result.title) + } + + @Test + fun nullableStringKeepsNonEmptyString() { + val input = """{"title":"hello"}""" + val result = parseJson(input) + assertEquals("hello", result.title) + } + + @Test + fun nullableStringRoundtripsCorrectly() { + val data = NullableStringData(title = "world") + val encoded = data.toJson() + val decoded = parseJson(encoded) + assertEquals(data, decoded) + } +}