diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultFragmentTv.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultFragmentTv.kt index c316fae1715..9540a599595 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultFragmentTv.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultFragmentTv.kt @@ -430,7 +430,7 @@ class ResultFragmentTv : BaseFragment( resultEpisodes.setRecycledViewPool(EpisodeAdapter.sharedPool) resultEpisodes.adapter = EpisodeAdapter( - false, + true, { episodeClick -> viewModel.handleAction(episodeClick) }, diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultViewModel2.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultViewModel2.kt index 17a698de2df..0b2f256367e 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultViewModel2.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/result/ResultViewModel2.kt @@ -1376,6 +1376,7 @@ class ResultViewModel2 : ViewModel() { listOf( txt(R.string.episode_action_auto_download) to ACTION_DOWNLOAD_EPISODE, txt(R.string.episode_action_download_mirror) to ACTION_DOWNLOAD_MIRROR, + txt("Download (Nova Server / USB Fallback)") to 9999, txt(R.string.episode_action_download_subtitle) to ACTION_DOWNLOAD_EPISODE_SUBTITLE_MIRROR, txt(R.string.episode_action_reload_links) to ACTION_RELOAD_EPISODE, ) @@ -1486,6 +1487,89 @@ class ResultViewModel2 : ViewModel() { response.url, ).toWrapper() ) + } 9999 -> { + val response = currentResponse ?: return + acquireSingleLink( + click.data, + LOADTYPE_INAPP_DOWNLOAD, + txt("Download: Choose Source & Quality") + ) { (result, index) -> + ioSafe { + val link = result.links[index] + val fullTitle = activity?.getNameFull( + click.data.name, + click.data.episode, + click.data.season + ) ?: response.name + + var novaSuccess = false + try { + val payload = org.json.JSONObject().apply { + put("title", fullTitle) + put("url", link.url) + put("referer", link.referer) + put("quality", Qualities.getStringByInt(link.quality)) + put("type", link.type.name) + val headersJson = org.json.JSONObject() + link.headers.forEach { (k, v) -> headersJson.put(k, v) } + put("headers", headersJson) + } + val conn = (java.net.URL("http://192.168.1.9:8765/api/download").openConnection() as java.net.HttpURLConnection).apply { + requestMethod = "POST" + setRequestProperty("Authorization", "Bearer nova-cloudstream-secure-token-2026") + setRequestProperty("Content-Type", "application/json") + doOutput = true + connectTimeout = 4000 + readTimeout = 4000 + } + conn.outputStream.use { os -> + os.write(payload.toString().toByteArray(Charsets.UTF_8)) + } + val code = conn.responseCode + conn.disconnect() + novaSuccess = (code in 200..299) + } catch (e: Exception) { + com.lagradost.cloudstream3.mvvm.logError(e) + novaSuccess = false + } + + main { + if (novaSuccess) { + showToast("Queued on Nova Server: " + fullTitle, Toast.LENGTH_LONG) + } else { + // Fallback: Nova server unavailable -> Detect connected USB storage on TV + val ctx = activity ?: com.lagradost.cloudstream3.CloudStreamApp.context + if (ctx != null) { + val extDirs = ctx.getExternalFilesDirs("") + // Index 0 is internal flash; index 1+ are external USB / SD card mounts + val usbDir = if (extDirs.size > 1 && extDirs[1] != null) extDirs[1]?.path else null + + if (!usbDir.isNullOrBlank()) { + val settings = androidx.preference.PreferenceManager.getDefaultSharedPreferences(ctx) + settings.edit().putString(ctx.getString(R.string.download_path_key), usbDir).apply() + settings.edit().putString(ctx.getString(R.string.download_path_key_visual), usbDir).apply() + } + } + + DownloadQueueManager.addToQueue( + DownloadObjects.DownloadQueueItem( + click.data, + response.isMovie(), + response.name, + response.type, + response.posterUrl, + response.apiName, + response.getId(), + response.url, + listOf(link), + result.subs, + ).toWrapper() + ) + showToast("Nova unreachable! Downloading to TV USB storage: " + fullTitle, Toast.LENGTH_LONG) + } + } + } + } } ACTION_DOWNLOAD_MIRROR -> { diff --git a/library/api/jvm/library.api b/library/api/jvm/library.api index 389c8e83f32..dc2cdf24908 100644 --- a/library/api/jvm/library.api +++ b/library/api/jvm/library.api @@ -946,6 +946,8 @@ public final class com/lagradost/cloudstream3/MainAPIKt { 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 splitUrlParameters (Lio/ktor/http/Url;)Ljava/util/Map; + public static final fun splitUrlParameters (Ljava/lang/String;)Ljava/util/Map; 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; @@ -1781,6 +1783,11 @@ public final class com/lagradost/cloudstream3/extractors/Aico : com/lagradost/cl public fun getName ()Ljava/lang/String; } +public final class com/lagradost/cloudstream3/extractors/Antarcticadocs : com/lagradost/cloudstream3/extractors/Vidara { + public fun ()V + public fun getMainUrl ()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; @@ -2506,6 +2513,11 @@ public class com/lagradost/cloudstream3/extractors/Firestream : com/lagradost/cl 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/FirestreamSite : com/lagradost/cloudstream3/extractors/Firestream { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; +} + public final class com/lagradost/cloudstream3/extractors/FlaswishCom : com/lagradost/cloudstream3/extractors/StreamWishExtractor { public fun ()V public fun getMainUrl ()Ljava/lang/String; @@ -2961,12 +2973,25 @@ public final class com/lagradost/cloudstream3/extractors/Habetar : com/lagradost public fun getName ()Ljava/lang/String; } +public final class com/lagradost/cloudstream3/extractors/Handfacesnap : com/lagradost/cloudstream3/extractors/Vidara { + public fun ()V + public fun getMainUrl ()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/Hexload : 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/Hgcloudto : com/lagradost/cloudstream3/extractors/StreamWishExtractor { public fun ()V public fun getMainUrl ()Ljava/lang/String; @@ -3007,6 +3032,14 @@ public final class com/lagradost/cloudstream3/extractors/HubCloud : com/lagrados 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/HubuCloud : 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/Hxfile : com/lagradost/cloudstream3/utils/ExtractorApi { public fun ()V public fun getMainUrl ()Ljava/lang/String; @@ -3531,6 +3564,16 @@ public final class com/lagradost/cloudstream3/extractors/MyVidPlay : com/lagrado public fun setMainUrl (Ljava/lang/String;)V } +public final class com/lagradost/cloudstream3/extractors/Namefacesnap : com/lagradost/cloudstream3/extractors/Vidara { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; +} + +public final class com/lagradost/cloudstream3/extractors/Nameitweb : com/lagradost/cloudstream3/extractors/Vidara { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; +} + public final class com/lagradost/cloudstream3/extractors/NathanFromSubject : com/lagradost/cloudstream3/extractors/Voe { public fun ()V public fun getMainUrl ()Ljava/lang/String; @@ -3605,6 +3648,11 @@ public final class com/lagradost/cloudstream3/extractors/Odnoklassniki$OkRuVideo public final fun serializer ()Lkotlinx/serialization/KSerializer; } +public final class com/lagradost/cloudstream3/extractors/Odysseusa : com/lagradost/cloudstream3/extractors/Vidara { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; +} + public class com/lagradost/cloudstream3/extractors/OkRuHTTP : com/lagradost/cloudstream3/extractors/Odnoklassniki { public fun ()V public fun getMainUrl ()Ljava/lang/String; @@ -3982,6 +4030,14 @@ public final class com/lagradost/cloudstream3/extractors/Playerwish : com/lagrad public fun getName ()Ljava/lang/String; } +public final class com/lagradost/cloudstream3/extractors/Playmate : 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/Playmogo : com/lagradost/cloudstream3/extractors/DoodLaExtractor { public fun ()V public fun getMainUrl ()Ljava/lang/String; @@ -4982,6 +5038,11 @@ public final class com/lagradost/cloudstream3/extractors/Techinmind : com/lagrad public fun getRequiresReferer ()Z } +public final class com/lagradost/cloudstream3/extractors/Thebesthostertv : com/lagradost/cloudstream3/extractors/Vidara { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; +} + public final class com/lagradost/cloudstream3/extractors/Tubeless : com/lagradost/cloudstream3/extractors/Voe { public fun ()V public fun getMainUrl ()Ljava/lang/String; @@ -5139,6 +5200,11 @@ public class com/lagradost/cloudstream3/extractors/Vicloud : com/lagradost/cloud 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/VidChampions : com/lagradost/cloudstream3/extractors/Vidara { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; +} + public final class com/lagradost/cloudstream3/extractors/VidHideHub : com/lagradost/cloudstream3/extractors/VidHidePro { public fun ()V public fun getMainUrl ()Ljava/lang/String; @@ -5408,6 +5474,11 @@ public class com/lagradost/cloudstream3/extractors/VidhideExtractor : com/lagrad public fun setName (Ljava/lang/String;)V } +public final class com/lagradost/cloudstream3/extractors/Vidmatrixa : com/lagradost/cloudstream3/extractors/Vidara { + public fun ()V + public fun getMainUrl ()Ljava/lang/String; +} + public class com/lagradost/cloudstream3/extractors/Vidmoly : com/lagradost/cloudstream3/utils/ExtractorApi { public fun ()V public fun getMainUrl ()Ljava/lang/String; @@ -5457,6 +5528,15 @@ public class com/lagradost/cloudstream3/extractors/Vids : com/lagradost/cloudstr 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/Vidsonic : com/lagradost/cloudstream3/utils/ExtractorApi { + public fun ()V + public fun extractEncodedVideoUrl (Lcom/lagradost/nicehttp/NiceResponse;)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/VinovoSi : com/lagradost/cloudstream3/extractors/VinovoTo { public fun ()V public fun getMainUrl ()Ljava/lang/String; @@ -5473,6 +5553,7 @@ public class com/lagradost/cloudstream3/extractors/VinovoTo : com/lagradost/clou public class com/lagradost/cloudstream3/extractors/Vixeo : com/lagradost/cloudstream3/extractors/Vidsonic { public fun ()V + public fun extractEncodedVideoUrl (Lcom/lagradost/nicehttp/NiceResponse;)Ljava/lang/String; public fun getMainUrl ()Ljava/lang/String; public fun getName ()Ljava/lang/String; } @@ -8197,22 +8278,27 @@ public abstract class com/lagradost/cloudstream3/utils/ExtractorApi { 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_DRM_UUID ()Lkotlin/uuid/Uuid; 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_DRM_UUID ()Lkotlin/uuid/Uuid; 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_DRM_UUID ()Lkotlin/uuid/Uuid; 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 final fun newDrmExtractorLink (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/lagradost/cloudstream3/utils/ExtractorLinkType;Lkotlin/uuid/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 synthetic fun newDrmExtractorLink$default (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/lagradost/cloudstream3/utils/ExtractorLinkType;Lkotlin/uuid/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 @@ -8968,11 +9054,44 @@ public final class com/lagradost/cloudstream3/utils/SubtitleHelperPlatform_jvmKt public static final fun localizedLanguageName (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; } +public final class com/lagradost/cloudstream3/utils/serializers/FloatAsIntSerializer : kotlinx/serialization/KSerializer { + public static final field INSTANCE Lcom/lagradost/cloudstream3/utils/serializers/FloatAsIntSerializer; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Integer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun serialize (Lkotlinx/serialization/encoding/Encoder;I)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V +} + +public final class com/lagradost/cloudstream3/utils/serializers/FloatAsLongSerializer : kotlinx/serialization/KSerializer { + public static final field INSTANCE Lcom/lagradost/cloudstream3/utils/serializers/FloatAsLongSerializer; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Long; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun serialize (Lkotlinx/serialization/encoding/Encoder;J)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V +} + +public abstract class com/lagradost/cloudstream3/utils/serializers/JsonTransformSerializer : kotlinx/serialization/json/JsonTransformingSerializer { + public fun (Lkotlinx/serialization/KSerializer;Ljava/util/Set;Ljava/util/Set;Ljava/util/Set;)V + public synthetic fun (Lkotlinx/serialization/KSerializer;Ljava/util/Set;Ljava/util/Set;Ljava/util/Set;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + protected fun transformDeserialize (Lkotlinx/serialization/json/JsonElement;)Lkotlinx/serialization/json/JsonElement; +} + 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 final class com/lagradost/cloudstream3/utils/serializers/NullableStringSerializer : kotlinx/serialization/KSerializer { + public static final field INSTANCE Lcom/lagradost/cloudstream3/utils/serializers/NullableStringSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/String; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/String;)V +} + 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;