Merge branch 'master' into RepoUrlCopy

This commit is contained in:
KingLucius 2024-02-16 08:17:18 +02:00 committed by GitHub
commit 9b9c4fd607
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
11 changed files with 81 additions and 50 deletions

View file

@ -2,7 +2,6 @@ package com.lagradost.cloudstream3.extractors
import com.lagradost.cloudstream3.SubtitleFile import com.lagradost.cloudstream3.SubtitleFile
import com.lagradost.cloudstream3.app import com.lagradost.cloudstream3.app
import com.lagradost.cloudstream3.base64Decode
import com.lagradost.cloudstream3.utils.* import com.lagradost.cloudstream3.utils.*
open class Acefile : ExtractorApi() { open class Acefile : ExtractorApi() {
@ -16,22 +15,19 @@ open class Acefile : ExtractorApi() {
subtitleCallback: (SubtitleFile) -> Unit, subtitleCallback: (SubtitleFile) -> Unit,
callback: (ExtractorLink) -> Unit callback: (ExtractorLink) -> Unit
) { ) {
val script = getAndUnpack(app.get(url).text) val id = "/(?:d|download|player|f|file)/(\\w+)".toRegex().find(url)?.groupValues?.get(1)
val id = script.substringAfter("\"code\":\"").substringBefore("\",") val script = getAndUnpack(app.get("$mainUrl/player/${id ?: return}").text)
val doc = app.get("https://drive.google.com/uc?id=${base64Decode(id)}&export=download").document val service = """service\s*=\s*['"]([^'"]+)""".toRegex().find(script)?.groupValues?.get(1)
val form = doc.select("form#download-form").attr("action") val serverUrl = """['"](\S+check&id\S+?)['"]""".toRegex().find(script)?.groupValues?.get(1)
val uc = doc.select("input#uc-download-link").attr("value") ?.replace("\"+service+\"", service ?: return)
val video = app.post(
form, data = mapOf( val video = app.get(serverUrl ?: return, referer = "$mainUrl/").parsedSafe<Source>()?.data
"uc-download-link" to uc
)
).url
callback.invoke( callback.invoke(
ExtractorLink( ExtractorLink(
this.name, this.name,
this.name, this.name,
video, video ?: return,
"", "",
Qualities.Unknown.value, Qualities.Unknown.value,
INFER_TYPE INFER_TYPE
@ -40,4 +36,8 @@ open class Acefile : ExtractorApi() {
} }
data class Source(
val data: String? = null,
)
} }

View file

@ -49,8 +49,23 @@ open class Chillx : ExtractorApi() {
val decrypt = cryptoAESHandler(master ?: return, getKey().toByteArray(), false)?.replace("\\", "") ?: throw ErrorLoadingException("failed to decrypt") val decrypt = cryptoAESHandler(master ?: return, getKey().toByteArray(), false)?.replace("\\", "") ?: throw ErrorLoadingException("failed to decrypt")
val source = Regex(""""?file"?:\s*"([^"]+)""").find(decrypt)?.groupValues?.get(1) val source = Regex(""""?file"?:\s*"([^"]+)""").find(decrypt)?.groupValues?.get(1)
val tracks = Regex("""tracks:\s*\[(.+)]""").find(decrypt)?.groupValues?.get(1)
val subtitles = Regex("""subtitle"?:\s*"([^"]+)""").find(decrypt)?.groupValues?.get(1)
val subtitlePattern = """\[(.*?)\](https?://[^\s,]+)""".toRegex()
val matches = subtitlePattern.findAll(subtitles ?: "")
val languageUrlPairs = matches.map { matchResult ->
val (language, url) = matchResult.destructured
decodeUnicodeEscape(language) to url
}.toList()
languageUrlPairs.forEach{ (name, file) ->
subtitleCallback.invoke(
SubtitleFile(
name,
file
)
)
}
// required // required
val headers = mapOf( val headers = mapOf(
"Accept" to "*/*", "Accept" to "*/*",
@ -67,16 +82,13 @@ open class Chillx : ExtractorApi() {
"$mainUrl/", "$mainUrl/",
headers = headers headers = headers
).forEach(callback) ).forEach(callback)
}
AppUtils.tryParseJson<List<Tracks>>("[$tracks]") private fun decodeUnicodeEscape(input: String): String {
?.filter { it.kind == "captions" }?.map { track -> val regex = Regex("u([0-9a-fA-F]{4})")
subtitleCallback.invoke( return regex.replace(input) {
SubtitleFile( it.groupValues[1].toInt(16).toChar().toString()
track.label ?: "", }
track.file ?: return@map null
)
)
}
} }
suspend fun getKey() = key ?: fetchKey().also { key = it } suspend fun getKey() = key ?: fetchKey().also { key = it }

View file

@ -22,9 +22,9 @@ open class Gofile : ExtractorApi() {
val id = Regex("/(?:\\?c=|d/)([\\da-zA-Z-]+)").find(url)?.groupValues?.get(1) val id = Regex("/(?:\\?c=|d/)([\\da-zA-Z-]+)").find(url)?.groupValues?.get(1)
val token = app.get("$mainApi/createAccount").parsedSafe<Account>()?.data?.get("token") val token = app.get("$mainApi/createAccount").parsedSafe<Account>()?.data?.get("token")
val websiteToken = app.get("$mainUrl/dist/js/alljs.js").text.let { val websiteToken = app.get("$mainUrl/dist/js/alljs.js").text.let {
Regex("websiteToken\\s*=\\s*\"([^\"]+)").find(it)?.groupValues?.get(1) Regex("fetchData.wt\\s*=\\s*\"([^\"]+)").find(it)?.groupValues?.get(1)
} }
app.get("$mainApi/getContent?contentId=$id&token=$token&websiteToken=$websiteToken") app.get("$mainApi/getContent?contentId=$id&token=$token&wt=$websiteToken")
.parsedSafe<Source>()?.data?.contents?.forEach { .parsedSafe<Source>()?.data?.contents?.forEach {
callback.invoke( callback.invoke(
ExtractorLink( ExtractorLink(

View file

@ -11,3 +11,13 @@ class FourCX : ContentX() {
override var name = "FourCX" override var name = "FourCX"
override var mainUrl = "https://four.contentx.me" override var mainUrl = "https://four.contentx.me"
} }
class PlayRu : ContentX() {
override var name = "PlayRu"
override var mainUrl = "https://playru.net"
}
class FourPlayRu : ContentX() {
override var name = "FourPlayRu"
override var mainUrl = "https://four.playru.net"
}

View file

@ -47,7 +47,7 @@ open class Rabbitstream : ExtractorApi() {
val response = app.get( val response = app.get(
"$mainUrl/$embed/getSources?id=$id", "$mainUrl/$embed/getSources?id=$id",
referer = mainUrl, referer = url,
headers = mapOf("X-Requested-With" to "XMLHttpRequest") headers = mapOf("X-Requested-With" to "XMLHttpRequest")
) )
@ -72,7 +72,7 @@ open class Rabbitstream : ExtractorApi() {
).forEach(callback) ).forEach(callback)
} }
decryptedSources?.tracks?.map { track -> decryptedSources?.tracks?.filter { it?.kind == "captions" }?.map { track ->
subtitleCallback.invoke( subtitleCallback.invoke(
SubtitleFile( SubtitleFile(
track?.label ?: "", track?.label ?: "",

View file

@ -106,6 +106,8 @@ import com.lagradost.cloudstream3.extractors.ContentX
import com.lagradost.cloudstream3.extractors.EmturbovidExtractor import com.lagradost.cloudstream3.extractors.EmturbovidExtractor
import com.lagradost.cloudstream3.extractors.Hotlinger import com.lagradost.cloudstream3.extractors.Hotlinger
import com.lagradost.cloudstream3.extractors.FourCX import com.lagradost.cloudstream3.extractors.FourCX
import com.lagradost.cloudstream3.extractors.PlayRu
import com.lagradost.cloudstream3.extractors.FourPlayRu
import com.lagradost.cloudstream3.extractors.HDMomPlayer import com.lagradost.cloudstream3.extractors.HDMomPlayer
import com.lagradost.cloudstream3.extractors.HDPlayerSystem import com.lagradost.cloudstream3.extractors.HDPlayerSystem
import com.lagradost.cloudstream3.extractors.VideoSeyred import com.lagradost.cloudstream3.extractors.VideoSeyred
@ -704,6 +706,8 @@ val extractorApis: MutableList<ExtractorApi> = arrayListOf(
ContentX(), ContentX(),
Hotlinger(), Hotlinger(),
FourCX(), FourCX(),
PlayRu(),
FourPlayRu(),
HDMomPlayer(), HDMomPlayer(),
HDPlayerSystem(), HDPlayerSystem(),
VideoSeyred(), VideoSeyred(),

View file

@ -83,7 +83,7 @@
android:layout_height="25dp" android:layout_height="25dp"
android:layout_margin="5dp" android:layout_margin="5dp"
android:elevation="10dp" android:elevation="10dp"
android:tooltipText="@string/subscribe_tooltip"
android:background="?android:attr/selectableItemBackgroundBorderless" android:background="?android:attr/selectableItemBackgroundBorderless"
android:src="@drawable/baseline_notifications_none_24" android:src="@drawable/baseline_notifications_none_24"
android:layout_gravity="end|center_vertical" android:layout_gravity="end|center_vertical"
@ -100,7 +100,7 @@
android:layout_height="25dp" android:layout_height="25dp"
android:layout_margin="5dp" android:layout_margin="5dp"
android:elevation="10dp" android:elevation="10dp"
android:tooltipText="@string/action_add_to_favorites"
android:background="?android:attr/selectableItemBackgroundBorderless" android:background="?android:attr/selectableItemBackgroundBorderless"
android:src="@drawable/ic_baseline_favorite_border_24" android:src="@drawable/ic_baseline_favorite_border_24"
android:layout_gravity="end|center_vertical" android:layout_gravity="end|center_vertical"
@ -117,7 +117,7 @@
android:layout_height="25dp" android:layout_height="25dp"
android:layout_margin="5dp" android:layout_margin="5dp"
android:elevation="10dp" android:elevation="10dp"
android:tooltipText="@string/result_share"
android:background="?android:attr/selectableItemBackgroundBorderless" android:background="?android:attr/selectableItemBackgroundBorderless"
android:src="@drawable/ic_outline_share_24" android:src="@drawable/ic_outline_share_24"
android:layout_gravity="end|center_vertical" android:layout_gravity="end|center_vertical"
@ -135,7 +135,7 @@
android:layout_height="25dp" android:layout_height="25dp"
android:layout_margin="5dp" android:layout_margin="5dp"
android:elevation="10dp" android:elevation="10dp"
android:tooltipText="@string/result_open_in_browser"
android:background="?android:attr/selectableItemBackgroundBorderless" android:background="?android:attr/selectableItemBackgroundBorderless"
android:src="@drawable/ic_baseline_public_24" android:src="@drawable/ic_baseline_public_24"
android:layout_gravity="end|center_vertical" android:layout_gravity="end|center_vertical"
@ -153,7 +153,7 @@
android:layout_height="30dp" android:layout_height="30dp"
android:layout_margin="5dp" android:layout_margin="5dp"
android:elevation="10dp" android:elevation="10dp"
android:tooltipText="@string/result_search_tooltip"
android:background="?android:attr/selectableItemBackgroundBorderless" android:background="?android:attr/selectableItemBackgroundBorderless"
android:src="@drawable/search_icon" android:src="@drawable/search_icon"
android:layout_gravity="end|center_vertical" android:layout_gravity="end|center_vertical"
@ -171,7 +171,7 @@
android:layout_height="25dp" android:layout_height="25dp"
android:layout_margin="5dp" android:layout_margin="5dp"
android:elevation="10dp" android:elevation="10dp"
android:tooltipText="@string/recommendations_tooltip"
android:background="?android:attr/selectableItemBackgroundBorderless" android:background="?android:attr/selectableItemBackgroundBorderless"
android:src="@drawable/baseline_list_alt_24" android:src="@drawable/baseline_list_alt_24"
android:layout_gravity="end|center_vertical" android:layout_gravity="end|center_vertical"

View file

@ -399,6 +399,7 @@ https://developer.android.com/design/ui/tv/samples/jet-fit
android:id="@+id/result_meta_content_rating" android:id="@+id/result_meta_content_rating"
android:layout_gravity="center_vertical" android:layout_gravity="center_vertical"
style="@style/SmallWhiteButton" style="@style/SmallWhiteButton"
android:focusable="false"
tools:text="PG-13" /> tools:text="PG-13" />
<TextView <TextView

View file

@ -148,7 +148,7 @@
<string name="download_done">Download Done</string> <string name="download_done">Download Done</string>
<string name="download_format" translatable="false">%s - %s</string> <string name="download_format" translatable="false">%s - %s</string>
<string name="update_started">Update Started</string> <string name="update_started">Update Started</string>
<string name="stream">Stream</string> <string name="stream">Network stream</string>
<string name="error_loading_links_toast">Error Loading Links</string> <string name="error_loading_links_toast">Error Loading Links</string>
<string name="links_reloaded_toast">Links Reloaded</string> <string name="links_reloaded_toast">Links Reloaded</string>
<string name="download_storage_text">Internal Storage</string> <string name="download_storage_text">Internal Storage</string>
@ -175,6 +175,9 @@
<string name="sort_save">Save</string> <string name="sort_save">Save</string>
<string name="copyTitle">Title copied!</string> <string name="copyTitle">Title copied!</string>
<string name="copyRepoUrl">Repo URL copied!</string> <string name="copyRepoUrl">Repo URL copied!</string>
<string name="subscribe_tooltip">New episode notification</string>
<string name="result_search_tooltip">Search in other extensions</string>
<string name="recommendations_tooltip">Show recommendations</string>
<string name="player_speed">Player Speed</string> <string name="player_speed">Player Speed</string>
<string name="subtitles_settings">Subtitle Settings</string> <string name="subtitles_settings">Subtitle Settings</string>
<string name="subs_text_color">Text Color</string> <string name="subs_text_color">Text Color</string>
@ -214,8 +217,8 @@
<string name="player_subtitles_settings_des">Player subtitles settings</string> <string name="player_subtitles_settings_des">Player subtitles settings</string>
<string name="chromecast_subtitles_settings">Chromecast Subtitles</string> <string name="chromecast_subtitles_settings">Chromecast Subtitles</string>
<string name="chromecast_subtitles_settings_des">Chromecast subtitles settings</string> <string name="chromecast_subtitles_settings_des">Chromecast subtitles settings</string>
<string name="eigengraumode_settings">Eigengravy Mode</string> <string name="eigengraumode_settings">Playback speed</string>
<string name="eigengraumode_settings_des">Adds a speed option in the player</string> <string name="speed_setting_summary">Adds a speed option in the player</string>
<string name="swipe_to_seek_settings">Swipe to seek</string> <string name="swipe_to_seek_settings">Swipe to seek</string>
<string name="swipe_to_seek_settings_des">Swipe from side to side to control your position in a video</string> <string name="swipe_to_seek_settings_des">Swipe from side to side to control your position in a video</string>
<string name="swipe_to_change_settings">Swipe to change settings</string> <string name="swipe_to_change_settings">Swipe to change settings</string>
@ -392,9 +395,9 @@
<string name="video_disk_description">Causes problems if set too high on devices with low storage space, such as Android TV.</string> <string name="video_disk_description">Causes problems if set too high on devices with low storage space, such as Android TV.</string>
<string name="dns_pref">DNS over HTTPS</string> <string name="dns_pref">DNS over HTTPS</string>
<string name="dns_pref_summary">Useful for bypassing ISP blocks</string> <string name="dns_pref_summary">Useful for bypassing ISP blocks</string>
<string name="jsdelivr_proxy">raw.githubusercontent.com Proxy</string> <string name="jsdelivr_proxy">GitHub Proxy</string>
<string name="jsdelivr_enabled">Could not reach GitHub. Turning on jsDelivr proxy…</string> <string name="jsdelivr_enabled">Could not reach GitHub. Turning on jsDelivr proxy…</string>
<string name="jsdelivr_proxy_summary">Bypasses blocking of GitHub using jsDelivr. May cause updates to be delayed by few days.</string> <string name="jsdelivr_proxy_summary">Bypass blocking of raw github URLs using jsDelivr. May cause updates to be delayed by few days.</string>
<string name="add_site_pref">Clone site</string> <string name="add_site_pref">Clone site</string>
<string name="remove_site_pref">Remove site</string> <string name="remove_site_pref">Remove site</string>
<string name="add_site_summary">Add a clone of an existing site, with a different URL</string> <string name="add_site_summary">Add a clone of an existing site, with a different URL</string>
@ -440,13 +443,15 @@
<string name="category_general">General</string> <string name="category_general">General</string>
<string name="random_button_settings">Random Button</string> <string name="random_button_settings">Random Button</string>
<string name="random_button_settings_desc">Show random button on Homepage and Library</string> <string name="random_button_settings_desc">Show random button on Homepage and Library</string>
<string name="provider_lang_settings">Provider languages</string> <string name="provider_lang_settings">Extension languages</string>
<string name="app_layout">App Layout</string> <string name="app_layout">App Layout</string>
<string name="preferred_media_settings">Preferred media</string> <string name="preferred_media_settings">Preferred media</string>
<string name="enable_nsfw_on_providers">Enable NSFW on supported providers</string> <string name="enable_nsfw_on_providers">Enable NSFW on supported Extensions</string>
<string name="subtitles_encoding">Subtitle encoding</string> <string name="subtitles_encoding">Subtitle encoding</string>
<string name="category_providers">Providers</string> <string name="category_providers">Providers</string>
<string name="category_provider_test">Provider test</string> <string name="category_provider_test">Provider test</string>
<string name="test_extensions">Test all Extensions</string>
<string name="test_extensions_summary">This Test is meant for developers only and does not verifies or denies working of any extension.</string>
<string name="category_ui">Layout</string> <string name="category_ui">Layout</string>
<string name="automatic">Auto</string> <string name="automatic">Auto</string>
<string name="tv_layout">TV layout</string> <string name="tv_layout">TV layout</string>
@ -463,11 +468,11 @@
<string name="opensubtitles_key" translatable="false">opensubtitles_key</string> <string name="opensubtitles_key" translatable="false">opensubtitles_key</string>
<string name="nginx_key" translatable="false">nginx_key</string> <string name="nginx_key" translatable="false">nginx_key</string>
<string name="example_password">password123</string> <string name="example_password">password123</string>
<string name="example_username">MyCoolUsername</string> <string name="example_username">Username</string>
<string name="example_email">hello@world.com</string> <string name="example_email">hello@world.com</string>
<string name="example_ip">127.0.0.1</string> <string name="example_ip">127.0.0.1</string>
<string name="example_site_name">MyCoolSite</string> <string name="example_site_name">NewSiteName</string>
<string name="example_site_url">example.com</string> <string name="example_site_url">https://example.com</string>
<string name="example_lang_name">Language code (en)</string> <string name="example_lang_name">Language code (en)</string>
<!-- <!--
<string name="mal_account_settings" translatable="false">MAL</string> <string name="mal_account_settings" translatable="false">MAL</string>
@ -559,8 +564,8 @@
<string name="subtitles_filter_lang">Filter by preferred media language</string> <string name="subtitles_filter_lang">Filter by preferred media language</string>
<string name="extras">Extras</string> <string name="extras">Extras</string>
<string name="trailer">Trailer</string> <string name="trailer">Trailer</string>
<string name="network_adress_example">Link to stream</string> <string name="network_adress_example">https://example.com/example.mp4</string>
<string name="referer">Referer</string> <string name="referer">Referer (optional)</string>
<string name="next">Next</string> <string name="next">Next</string>
<string name="provider_languages_tip">Watch videos in these languages</string> <string name="provider_languages_tip">Watch videos in these languages</string>
<string name="previous">Previous</string> <string name="previous">Previous</string>
@ -595,8 +600,6 @@
<string name="plugins_updated" formatted="true">Updated %d plugins</string> <string name="plugins_updated" formatted="true">Updated %d plugins</string>
<string name="blank_repo_message">CloudStream has no sites installed by default. You need to install the sites from repositories. <string name="blank_repo_message">CloudStream has no sites installed by default. You need to install the sites from repositories.
\n \n
\nBecause of a brainless DMCA takedown by Sky UK Limited 🤮 we cannot link the repository site in app.
\n
\nJoin our Discord or search online.</string> \nJoin our Discord or search online.</string>
<string name="view_public_repositories_button">View community repositories</string> <string name="view_public_repositories_button">View community repositories</string>
<string name="view_public_repositories_button_short">Public list</string> <string name="view_public_repositories_button_short">Public list</string>

View file

@ -70,7 +70,7 @@
app:key="@string/player_resize_enabled_key" /> app:key="@string/player_resize_enabled_key" />
<SwitchPreference <SwitchPreference
android:icon="@drawable/ic_baseline_speed_24" android:icon="@drawable/ic_baseline_speed_24"
android:summary="@string/eigengraumode_settings_des" android:summary="@string/speed_setting_summary"
android:title="@string/eigengraumode_settings" android:title="@string/eigengraumode_settings"
app:defaultValue="false" app:defaultValue="false"
app:key="@string/playback_speed_enabled_key" /> app:key="@string/playback_speed_enabled_key" />

View file

@ -25,6 +25,7 @@
<Preference <Preference
android:icon="@drawable/baseline_network_ping_24" android:icon="@drawable/baseline_network_ping_24"
android:key="@string/test_providers_key" android:key="@string/test_providers_key"
android:title="Test all providers" /> android:title="@string/test_extensions"
android:summary="@string/test_extensions_summary"/>
</PreferenceScreen> </PreferenceScreen>