Skip to content

Commit 8192c49

Browse files
committed
Add support for cloudflare streams
1 parent 08bb46a commit 8192c49

File tree

3 files changed

+65
-10
lines changed

3 files changed

+65
-10
lines changed
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package me.proxer.app.anime.resolver
2+
3+
import android.net.Uri
4+
import io.reactivex.Single
5+
import me.proxer.app.MainApplication
6+
import me.proxer.app.exception.StreamResolutionException
7+
import me.proxer.app.util.extension.buildSingle
8+
import me.proxer.app.util.extension.toBodySingle
9+
import me.proxer.app.util.extension.toPrefixedUrlOrNull
10+
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
11+
import okhttp3.Request
12+
13+
/**
14+
* @author Ruben Gees
15+
*/
16+
object ProxerStreamCFResolver : StreamResolver() {
17+
18+
private val regex = Regex("<stream.*?src=\"(.*?)\".*?>")
19+
20+
override val name = "Proxer-Stream (CF)"
21+
22+
override fun resolve(id: String): Single<StreamResolutionResult> {
23+
return api.anime.vastLink(id)
24+
.buildSingle()
25+
.flatMap { (link, adTag) ->
26+
client
27+
.newCall(
28+
Request.Builder()
29+
.get()
30+
.url(link.toPrefixedUrlOrNull() ?: throw StreamResolutionException())
31+
.header("User-Agent", MainApplication.USER_AGENT)
32+
.header("Connection", "close")
33+
.build()
34+
)
35+
.toBodySingle()
36+
.map {
37+
val regexResult = regex.find(it) ?: throw StreamResolutionException()
38+
39+
val streamId = regexResult.groupValues[1]
40+
val url = "https://videodelivery.net/$streamId/manifest/video.mpd".toHttpUrlOrNull()
41+
?: throw StreamResolutionException()
42+
43+
val adTagUri = if (adTag.isNotBlank()) Uri.parse(adTag) else null
44+
45+
StreamResolutionResult.Video(url, "application/dash+xml", adTag = adTagUri)
46+
}
47+
}
48+
}
49+
}

src/main/kotlin/me/proxer/app/anime/resolver/StreamResolverFactory.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ object StreamResolverFactory {
88
private val resolvers = arrayOf(
99
AmazonPrimeVideoStreamResolver, AnimeOnDemandStreamResolver, MessageStreamResolver, CrunchyrollStreamResolver,
1010
DailymotionStreamResolver, Mp4UploadStreamResolver, NetflixStreamResolver, ProsiebenMAXXStreamResolver,
11-
ProxerStreamResolver, SteamStreamResolver, StreamcloudStreamResolver, YourUploadStreamResolver,
12-
YouTubeStreamResolver
11+
ProxerStreamResolver, ProxerStreamCFResolver, SteamStreamResolver, StreamcloudStreamResolver,
12+
YourUploadStreamResolver, YouTubeStreamResolver
1313
)
1414

1515
fun resolverFor(name: String) = resolvers.find { it.supports(name) }

src/main/kotlin/me/proxer/app/anime/stream/StreamActivity.kt

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,10 @@ import timber.log.Timber
9999
@Suppress("DEPRECATION") // TODO: Wait for androidx fullscreen support library.
100100
class StreamActivity : BaseActivity() {
101101

102+
companion object {
103+
private const val PREVIEW_MIME_TYPE = "video/mp4"
104+
}
105+
102106
internal val id: String
103107
get() = intent.getSafeStringExtra(ID_EXTRA)
104108

@@ -286,14 +290,16 @@ class StreamActivity : BaseActivity() {
286290
.autoDisposable(this.scope())
287291
.subscribe { toggleOrientation() }
288292

289-
PreviewLoader
290-
.loadFrames(
291-
progress.loadRequests(),
292-
{ Size(preview.width, preview.height) },
293-
PreviewLoader.PreviewMetaData(uri, referer, isProxerStream)
294-
)
295-
.autoDisposable(this.scope())
296-
.subscribeAndLogErrors { preview.setImageBitmap(it) }
293+
if (mimeType == PREVIEW_MIME_TYPE) {
294+
PreviewLoader
295+
.loadFrames(
296+
progress.loadRequests(),
297+
{ Size(preview.width, preview.height) },
298+
PreviewLoader.PreviewMetaData(uri, referer, isProxerStream)
299+
)
300+
.autoDisposable(this.scope())
301+
.subscribeAndLogErrors { preview.setImageBitmap(it) }
302+
}
297303

298304
if (savedInstanceState == null) {
299305
toggleOrientation()

0 commit comments

Comments
 (0)