mirror of
https://github.com/recloudstream/cloudstream.git
synced 2024-08-15 01:53:11 +00:00
fixed android TV auto, no download support & VLC on A11+
This commit is contained in:
parent
cf2de2d331
commit
eea424c1e8
7 changed files with 146 additions and 81 deletions
|
@ -1,20 +1,25 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools" package="com.lagradost.cloudstream3">
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
package="com.lagradost.cloudstream3">
|
||||
|
||||
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
|
||||
<uses-permission android:name="android.permission.INTERNET"/>
|
||||
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
|
||||
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
|
||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
|
||||
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
|
||||
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>
|
||||
<uses-permission android:name="com.android.providers.tv.permission.WRITE_EPG_DATA" />
|
||||
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <!-- I dont remember, probs has to do with downloads -->
|
||||
<uses-permission android:name="android.permission.INTERNET" />
|
||||
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <!-- Downloads -->
|
||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- Downloads on low api devices-->
|
||||
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <!-- some dependency needs this -->
|
||||
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> <!-- Used for player vertical slide-->
|
||||
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" /> <!--Used for app update-->
|
||||
<!--<uses-permission android:name="com.android.providers.tv.permission.WRITE_EPG_DATA" /> not used atm, but code exist that requires it that are not run-->
|
||||
<permission android:name="android.permission.QUERY_ALL_PACKAGES" /> <!-- Used for getting if vlc is installed -->
|
||||
|
||||
<uses-feature android:name="android.hardware.touchscreen"
|
||||
android:required="false"/>
|
||||
<uses-feature android:name="android.software.leanback"
|
||||
android:required="false"/>
|
||||
<!-- Fixes android tv fuckery -->
|
||||
<uses-feature
|
||||
android:name="android.hardware.touchscreen"
|
||||
android:required="false" />
|
||||
<uses-feature
|
||||
android:name="android.software.leanback"
|
||||
android:required="false" />
|
||||
|
||||
<!--TODO https://stackoverflow.com/questions/41799732/chromecast-button-not-visible-in-android-->
|
||||
<application
|
||||
|
@ -32,19 +37,21 @@
|
|||
tools:targetApi="o">
|
||||
<meta-data
|
||||
android:name="com.google.android.gms.cast.framework.OPTIONS_PROVIDER_CLASS_NAME"
|
||||
android:value="com.lagradost.cloudstream3.utils.CastOptionsProvider"/>
|
||||
android:value="com.lagradost.cloudstream3.utils.CastOptionsProvider" />
|
||||
|
||||
<activity android:name=".ui.player.DownloadedPlayerActivity"
|
||||
<activity
|
||||
android:name=".ui.player.DownloadedPlayerActivity"
|
||||
android:screenOrientation="userLandscape"
|
||||
android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout|keyboard|keyboardHidden|navigation"
|
||||
android:resizeableActivity="true"
|
||||
android:supportsPictureInPicture="true"
|
||||
android:exported="true">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.VIEW"/>
|
||||
<category android:name="android.intent.category.DEFAULT"/>
|
||||
<data android:scheme="content"/>
|
||||
<data android:mimeType="video/*"/>
|
||||
<action android:name="android.intent.action.VIEW" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
|
||||
<data android:scheme="content" />
|
||||
<data android:mimeType="video/*" />
|
||||
</intent-filter>
|
||||
</activity>
|
||||
|
||||
|
@ -55,22 +62,62 @@
|
|||
android:label="@string/app_name"
|
||||
android:resizeableActivity="true"
|
||||
android:supportsPictureInPicture="true">
|
||||
<intent-filter
|
||||
android:exported="true">
|
||||
<action android:name="android.intent.action.MAIN"/>
|
||||
<category android:name="android.intent.category.LAUNCHER"/>
|
||||
<category android:name="android.intent.category.LEANBACK_LAUNCHER"/>
|
||||
<intent-filter android:exported="true">
|
||||
<action android:name="android.intent.action.MAIN" />
|
||||
|
||||
<category android:name="android.intent.category.LAUNCHER" />
|
||||
<category android:name="android.intent.category.LEANBACK_LAUNCHER" />
|
||||
</intent-filter>
|
||||
<intent-filter
|
||||
android:exported="true">
|
||||
<action android:name="android.intent.action.VIEW"/>
|
||||
|
||||
<category android:name="android.intent.category.BROWSABLE"/>
|
||||
<category android:name="android.intent.category.DEFAULT"/>
|
||||
<intent-filter android:exported="true">
|
||||
<action android:name="android.intent.action.VIEW" />
|
||||
|
||||
<category android:name="android.intent.category.BROWSABLE" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<data android:scheme="https" android:host="pelisplus.icu" android:pathPrefix="/"/>
|
||||
<data android:scheme="https" android:host="pelisplushd.net" android:pathPrefix="/"/>
|
||||
<data android:scheme="https" android:host="pelismart.com" android:pathPrefix="/"/>
|
||||
<data android:scheme="https" android:host="melomovie.com" android:pathPrefix="/"/>
|
||||
<data android:scheme="https" android:host="doramasyt.com" android:pathPrefix="/"/>
|
||||
<data android:scheme="https" android:host="cinecalidad.lol" android:pathPrefix="/"/>
|
||||
<data android:scheme="https" android:host="cuevana3.me" android:pathPrefix="/"/>
|
||||
<data android:scheme="https" android:host="entrepeliculasyseries.nu" android:pathPrefix="/"/>
|
||||
<data android:scheme="https" android:host="pelisflix.li" android:pathPrefix="/"/>
|
||||
<data android:scheme="https" android:host="seriesflix.video" android:pathPrefix="/"/>
|
||||
<data android:scheme="https" android:host="ihavenotv.com" android:pathPrefix="/"/>
|
||||
<data android:scheme="https" android:host="lookmovie.io" android:pathPrefix="/"/>
|
||||
<data android:scheme="https" android:host="www.vmovee.watch" android:pathPrefix="/"/>
|
||||
<data android:scheme="https" android:host="allmoviesforyou.net" android:pathPrefix="/"/>
|
||||
<data android:scheme="https" android:host="vidembed.cc" android:pathPrefix="/"/>
|
||||
<data android:scheme="https" android:host="vf-film.me" android:pathPrefix="/"/>
|
||||
<data android:scheme="https" android:host="vf-serie.org" android:pathPrefix="/"/>
|
||||
<data android:scheme="https" android:host="french-stream.re" android:pathPrefix="/"/>
|
||||
<data android:scheme="https" android:host="asianembed.io" android:pathPrefix="/"/>
|
||||
<data android:scheme="https" android:host="asiaflix.app" android:pathPrefix="/"/>
|
||||
<data android:scheme="https" android:host="bflix.ru" android:pathPrefix="/"/>
|
||||
<data android:scheme="https" android:host="fmovies.to" android:pathPrefix="/"/>
|
||||
<data android:scheme="https" android:host="sflix.pro" android:pathPrefix="/"/>
|
||||
<data android:scheme="https" android:host="filman.cc" android:pathPrefix="/"/>
|
||||
<data android:scheme="https" android:host="sflix.to" android:pathPrefix="/"/>
|
||||
<data android:scheme="https" android:host="dopebox.to" android:pathPrefix="/"/>
|
||||
<data android:scheme="https" android:host="solarmovie.pe" android:pathPrefix="/"/>
|
||||
<data android:scheme="https" android:host="pinoymoviepedia.ru" android:pathPrefix="/"/>
|
||||
<data android:scheme="https" android:host="www.pinoy-hd.xyz" android:pathPrefix="/"/>
|
||||
<data android:scheme="https" android:host="pinoymovies.es" android:pathPrefix="/"/>
|
||||
<data android:scheme="https" android:host="trailers.to" android:pathPrefix="/"/>
|
||||
<data android:scheme="https" android:host="www.2embed.ru" android:pathPrefix="/"/>
|
||||
<data android:scheme="https" android:host="dramasee.net" android:pathPrefix="/"/>
|
||||
<data android:scheme="https" android:host="watchasian.sh" android:pathPrefix="/"/>
|
||||
<data android:scheme="https" android:host="kdramahood.com" android:pathPrefix="/"/>
|
||||
<data android:scheme="https" android:host="akwam.to" android:pathPrefix="/"/>
|
||||
<data android:scheme="https" android:host="mycima.tv" android:pathPrefix="/"/>
|
||||
<data android:scheme="https" android:host="www.egy.best" android:pathPrefix="/"/>
|
||||
<data android:scheme="https" android:host="secretlink.xyz" android:pathPrefix="/"/>
|
||||
<data android:scheme="https" android:host="hdm.to" android:pathPrefix="/"/>
|
||||
<data android:scheme="https" android:host="theflix.to" android:pathPrefix="/"/>
|
||||
<data android:scheme="https" android:host="streamingcommunity.top" android:pathPrefix="/"/>
|
||||
<data android:scheme="https" android:host="www.tantifilm.rodeo" android:pathPrefix="/"/>
|
||||
<data android:scheme="https" android:host="v2.apimdb.net" android:pathPrefix="/"/>
|
||||
<data android:scheme="https" android:host="www.wcostream.com" android:pathPrefix="/"/>
|
||||
<data android:scheme="https" android:host="gogoanime.film" android:pathPrefix="/"/>
|
||||
<data android:scheme="https" android:host="allanime.site" android:pathPrefix="/"/>
|
||||
<data android:scheme="https" android:host="animekisa.in" android:pathPrefix="/"/>
|
||||
|
@ -78,45 +125,22 @@
|
|||
<data android:scheme="https" android:host="www3.animeflv.net" android:pathPrefix="/"/>
|
||||
<data android:scheme="https" android:host="tenshi.moe" android:pathPrefix="/"/>
|
||||
<data android:scheme="https" android:host="wcostream.cc" android:pathPrefix="/"/>
|
||||
<data android:scheme="https" android:host="bestdubbedanime.com" android:pathPrefix="/"/>
|
||||
<data android:scheme="https" android:host="doramasyt.com" android:pathPrefix="/"/>
|
||||
<data android:scheme="https" android:host="cinecalidad.lol" android:pathPrefix="/"/>
|
||||
<data android:scheme="https" android:host="cuevana3.io" android:pathPrefix="/"/>
|
||||
<data android:scheme="https" android:host="entrepeliculasyseries.nu" android:pathPrefix="/"/>
|
||||
<data android:scheme="https" android:host="pelisflix.li" android:pathPrefix="/"/>
|
||||
<data android:scheme="https" android:host="seriesflix.video" android:pathPrefix="/"/>
|
||||
<data android:scheme="https" android:host="ihavenotv.com" android:pathPrefix="/"/>
|
||||
<data android:scheme="https" android:host="www.vmovee.watch" android:pathPrefix="/"/>
|
||||
<data android:scheme="https" android:host="www.wcostream.com" android:pathPrefix="/"/>
|
||||
<data android:scheme="https" android:host="allmoviesforyou.net" android:pathPrefix="/"/>
|
||||
<data android:scheme="https" android:host="monoschinos2.com" android:pathPrefix="/"/>
|
||||
<data android:scheme="https" android:host="vidembed.cc" android:pathPrefix="/"/>
|
||||
<data android:scheme="https" android:host="vf-film.me" android:pathPrefix="/"/>
|
||||
<data android:scheme="https" android:host="vf-serie.org" android:pathPrefix="/"/>
|
||||
<data android:scheme="https" android:host="french-stream.re" android:pathPrefix="/"/>
|
||||
<data android:scheme="https" android:host="asianembed.io" android:pathPrefix="/"/>
|
||||
<data android:scheme="https" android:host="bflix.ru" android:pathPrefix="/"/>
|
||||
<data android:scheme="https" android:host="fmovies.to" android:pathPrefix="/"/>
|
||||
<data android:scheme="https" android:host="sflix.pro" android:pathPrefix="/"/>
|
||||
<data android:scheme="https" android:host="filman.cc" android:pathPrefix="/"/>
|
||||
<data android:scheme="https" android:host="zoro.to" android:pathPrefix="/"/>
|
||||
<data android:scheme="https" android:host="pinoymoviepedia.ru" android:pathPrefix="/"/>
|
||||
<data android:scheme="https" android:host="www.pinoy-hd.xyz" android:pathPrefix="/"/>
|
||||
<data android:scheme="https" android:host="pinoymovies.es" android:pathPrefix="/"/>
|
||||
<data android:scheme="https" android:host="trailers.to" android:pathPrefix="/"/>
|
||||
<data android:scheme="https" android:host="dramasee.net" android:pathPrefix="/"/>
|
||||
<data android:scheme="https" android:host="watchasian.sh" android:pathPrefix="/"/>
|
||||
<data android:scheme="https" android:host="kdramahood.com" android:pathPrefix="/"/>
|
||||
<data android:scheme="https" android:host="akwam.io" android:pathPrefix="/"/>
|
||||
<data android:scheme="https" android:host="animepahe.com" android:pathPrefix="/"/>
|
||||
<data android:scheme="https" android:host="9anime.center" android:pathPrefix="/"/>
|
||||
<data android:scheme="https" android:host="asiaflix.app" android:pathPrefix="/"/>
|
||||
<data android:scheme="https" android:host="dreamsub.me" android:pathPrefix="/"/>
|
||||
<data android:scheme="https" android:host="9anime.id" android:pathPrefix="/"/>
|
||||
<data android:scheme="https" android:host="www.animeworld.tv" android:pathPrefix="/"/>
|
||||
<data android:scheme="https" android:host="zoro.to" android:pathPrefix="/"/>
|
||||
<data android:scheme="https" android:host="bestdubbedanime.com" android:pathPrefix="/"/>
|
||||
<data android:scheme="https" android:host="monoschinos2.com" android:pathPrefix="/"/>
|
||||
<data android:scheme="https" android:host="kawaiifu.com" android:pathPrefix="/"/>
|
||||
</intent-filter>
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.VIEW"/>
|
||||
<category android:name="android.intent.category.DEFAULT"/>
|
||||
<category android:name="android.intent.category.BROWSABLE"/>
|
||||
<data android:scheme="cloudstreamapp"/>
|
||||
<action android:name="android.intent.action.VIEW" />
|
||||
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<category android:name="android.intent.category.BROWSABLE" />
|
||||
|
||||
<data android:scheme="cloudstreamapp" />
|
||||
</intent-filter>
|
||||
</activity>
|
||||
|
||||
|
@ -125,19 +149,17 @@
|
|||
android:enabled="false"
|
||||
android:exported="true">
|
||||
<intent-filter android:exported="true">
|
||||
<action android:name="restart_service"/>
|
||||
<action android:name="restart_service" />
|
||||
</intent-filter>
|
||||
</receiver>
|
||||
<service
|
||||
android:name=".services.VideoDownloadService"
|
||||
android:enabled="true"
|
||||
android:exported="false">
|
||||
</service>
|
||||
android:exported="false"></service>
|
||||
|
||||
<activity
|
||||
android:exported="false"
|
||||
android:name=".ui.ControllerActivity">
|
||||
</activity>
|
||||
android:name=".ui.ControllerActivity"></activity>
|
||||
|
||||
<provider
|
||||
android:name="androidx.core.content.FileProvider"
|
||||
|
@ -147,7 +169,7 @@
|
|||
android:grantUriPermissions="true">
|
||||
<meta-data
|
||||
android:name="android.support.FILE_PROVIDER_PATHS"
|
||||
android:resource="@xml/provider_paths"/>
|
||||
android:resource="@xml/provider_paths" />
|
||||
</provider>
|
||||
</application>
|
||||
</manifest>
|
|
@ -160,12 +160,55 @@ class EgyBestProvider : MainAPI() {
|
|||
@JsonProperty("quality") val quality: Int?,
|
||||
@JsonProperty("link") val link: String
|
||||
)
|
||||
|
||||
|
||||
override suspend fun loadLinks(
|
||||
data: String,
|
||||
isCasting: Boolean,
|
||||
subtitleCallback: (SubtitleFile) -> Unit,
|
||||
callback: (ExtractorLink) -> Unit
|
||||
): Boolean {
|
||||
/*val baseURL = data.split("/")[0] + "//" + data.split("/")[2]
|
||||
val episodeSoup = app.get(data).document
|
||||
|
||||
val vidstreamURL = fixUrlNull(episodeSoup.selectFirst("iframe.auto-size")?.attr("src") ) ?: throw ErrorLoadingException("No iframe")
|
||||
val videoSoup = app.get(vidstreamURL).document
|
||||
fixUrlNull( videoSoup.select("source").firstOrNull { it.hasAttr("src") }?.attr("src"))?.let {
|
||||
callback.invoke(ExtractorLink(this.name,this.name,it,"",Qualities.Unknown.value,it.contains(".m3u8")))
|
||||
} ?: run {
|
||||
var jsCode = videoSoup.select("script")[1].data()
|
||||
|
||||
val verificationToken = Regex("{'[0-9a-zA-Z_]*':'ok'}").findAll(jsCode)[0][2:-7]
|
||||
val encodedAdLinkVar = Regex("([0-9a-zA-Z_]{2,12}\[Math").findAll(jsCode)[0][1:-5]
|
||||
val encodingArraysRegEx = Regex(",[0-9a-zA-Z_]{2,12}=\[\]").findAll(jsCode)
|
||||
val firstEncodingArray = encodingArraysRegEx[1][1:-3]
|
||||
val secondEncodingArray = encodingArraysRegEx[2][1:-3]
|
||||
|
||||
jsCode = Regex("^<script type=\"text/javascript\">", "", jsCode)
|
||||
jsCode = Regex("[;,]\$\('\*'\)(.*)$", ";", jsCode)
|
||||
jsCode = Regex(",ismob=(.*)\(navigator\[(.*)\]\)[,;]", ";", jsCode)
|
||||
jsCode = Regex("var a0b=function\(\)(.*)a0a\(\);",).findAll( jsCode)
|
||||
jsCode += "var link = ''; for (var i = 0; i <= $secondEncodingArray['length']; i++) { link += $firstEncodingArray[$secondEncodingArray[i]] || ''; } return [link, $encodedAdLinkVar[0]] }"
|
||||
|
||||
val jsCodeReturn = executeJS(jsCode)()
|
||||
val verificationPath = jsCodeReturn[0]
|
||||
val encodedAdPath = jsCodeReturn[1]
|
||||
|
||||
val adLink = baseURL + "/" + str(decode(encodedAdPath + "=" * (-len(encodedAdPath) % 4)), "utf-8")
|
||||
val session.get(adLink)
|
||||
|
||||
val verificationLink = baseURL + "/tvc.php?verify=" + verificationPath
|
||||
val session.post(verificationLink, data={verificationToken: "ok"})
|
||||
|
||||
val vidstreamResponseText = session.get(vidstreamURL).text
|
||||
val videoSoup = BeautifulSoup(vidstreamResponseText, features="html.parser")
|
||||
|
||||
val qualityLinksFileURL = baseURL + videoSoup.body.find("source").get("src")
|
||||
}
|
||||
|
||||
|
||||
return true*/
|
||||
|
||||
val requestJSON = app.get("https://api.zr5.repl.co/egybest?url=$data").text
|
||||
val jsonArray = parseJson<List<Sources>>(requestJSON)
|
||||
for (i in jsonArray) {
|
||||
|
|
|
@ -208,8 +208,8 @@ class EpisodeAdapter(
|
|||
return@setOnLongClickListener true
|
||||
}
|
||||
|
||||
episodeDownloadImage.visibility = if (hasDownloadSupport) View.VISIBLE else View.GONE
|
||||
episodeDownloadBar.visibility = if (hasDownloadSupport) View.VISIBLE else View.GONE
|
||||
episodeDownloadImage.isVisible = hasDownloadSupport
|
||||
episodeDownloadBar.isVisible = hasDownloadSupport
|
||||
}
|
||||
|
||||
override fun reattachDownloadButton() {
|
||||
|
|
|
@ -1845,8 +1845,7 @@ class ResultFragment : Fragment(), PanelsChildGestureRegionObserver.GestureRegio
|
|||
// handleAction(EpisodeClickEvent(ACTION_SHOW_OPTIONS, card))
|
||||
// }
|
||||
|
||||
result_download_movie?.visibility =
|
||||
if (hasDownloadSupport) VISIBLE else GONE
|
||||
result_movie_progress_downloaded_holder?.isVisible = hasDownloadSupport
|
||||
if (hasDownloadSupport) {
|
||||
val localId = d.getId()
|
||||
val file =
|
||||
|
|
|
@ -97,7 +97,8 @@ class SettingsFragment : PreferenceFragmentCompat() {
|
|||
|
||||
private fun Context.isAutoTv(): Boolean {
|
||||
val uiModeManager = getSystemService(Context.UI_MODE_SERVICE) as UiModeManager?
|
||||
return uiModeManager?.currentModeType == Configuration.UI_MODE_TYPE_TELEVISION
|
||||
// AFT = Fire TV
|
||||
return uiModeManager?.currentModeType == Configuration.UI_MODE_TYPE_TELEVISION || Build.MODEL.contains("AFT")
|
||||
}
|
||||
|
||||
const val accountEnabled = true
|
||||
|
|
|
@ -484,14 +484,13 @@ object AppUtils {
|
|||
|
||||
fun Context.isAppInstalled(uri: String): Boolean {
|
||||
val pm = Wrappers.packageManager(this)
|
||||
var appInstalled = false
|
||||
appInstalled = try {
|
||||
pm.getPackageInfo(uri, PackageManager.GET_ACTIVITIES)
|
||||
|
||||
return try {
|
||||
pm.getPackageInfo(uri, 0) // PackageManager.GET_ACTIVITIES
|
||||
true
|
||||
} catch (e: PackageManager.NameNotFoundException) {
|
||||
false
|
||||
}
|
||||
return appInstalled
|
||||
}
|
||||
|
||||
fun getFocusRequest(): AudioFocusRequest? {
|
||||
|
|
|
@ -541,6 +541,7 @@
|
|||
android:layout_width="match_parent" />-->
|
||||
|
||||
<FrameLayout
|
||||
android:id="@+id/result_movie_progress_downloaded_holder"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
|
|
Loading…
Reference in a new issue