Skip to content

Commit e2a54d2

Browse files
committed
feat: 从发布地址解析URL
1 parent 7a5d3f8 commit e2a54d2

2 files changed

Lines changed: 108 additions & 9 deletions

File tree

app/src/main/java/com/muedsa/tvbox/agetv/service/AgeUrlService.kt

Lines changed: 53 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,21 @@
11
package com.muedsa.tvbox.agetv.service
22

3+
import com.muedsa.tvbox.tool.checkSuccess
34
import com.muedsa.tvbox.tool.decodeBase64ToStr
45
import com.muedsa.tvbox.tool.encodeBase64
56
import com.muedsa.tvbox.tool.feignChrome
67
import com.muedsa.tvbox.tool.get
8+
import com.muedsa.tvbox.tool.parseHtml
9+
import com.muedsa.tvbox.tool.stringBody
710
import com.muedsa.tvbox.tool.toRequestBuild
11+
import okhttp3.HttpUrl.Companion.toHttpUrl
812
import okhttp3.OkHttpClient
913

1014
class AgeUrlService(
1115
private val okHttpClient: OkHttpClient,
1216
) {
1317

14-
private val redirectHost: String? by lazy {
15-
AGE_TV_URL.toRequestBuild()
16-
.feignChrome()
17-
.get(okHttpClient = okHttpClient)
18-
.request
19-
.url
20-
.host
21-
}
18+
private val redirectHost: String? by lazy { tryGetUrl() }
2219

2320
val mobileUrl: String by lazy {
2421
redirectHost?.replace("www", "m")?.let { "https://$it/" } ?: AGE_MOBILE_URL
@@ -32,8 +29,55 @@ class AgeUrlService(
3229
mobileUrl.toByteArray(Charsets.UTF_8).encodeBase64()
3330
}
3431

32+
fun tryGetUrl(): String {
33+
var url = parseUrlFormPublicPage(AGE_URL_PUBLIC_PAGE_1)
34+
if (url.isBlank()) {
35+
url = parseUrlFormPublicPage(AGE_URL_PUBLIC_PAGE_2)
36+
}
37+
if (url.isBlank()) {
38+
url = parseUrlFormGithubReadme(AGE_URL_PUBLIC_GITHUB_1)
39+
}
40+
if (url.isBlank()) {
41+
url = parseUrlFormGithubReadme(AGE_URL_PUBLIC_GITHUB_2)
42+
}
43+
if (url.isBlank()) {
44+
url = parseUrlFormGithubReadme(AGE_URL_PUBLIC_GITHUB_3)
45+
}
46+
check(url.isNotBlank()) { "获取AGETV地址失败" }
47+
return url.toHttpUrl().host
48+
}
49+
50+
fun parseUrlFormPublicPage(url: String): String {
51+
return try {
52+
val body = url.toRequestBuild()
53+
.feignChrome()
54+
.get(okHttpClient = okHttpClient)
55+
.checkSuccess()
56+
.parseHtml()
57+
.body()
58+
val linkEl = body.selectFirst("blockquote p > a")
59+
linkEl?.text()?.trim() ?: ""
60+
} catch (_: Throwable) { "" }
61+
}
62+
63+
fun parseUrlFormGithubReadme(url: String): String {
64+
return try {
65+
val content = url.toRequestBuild()
66+
.feignChrome()
67+
.get(okHttpClient = okHttpClient)
68+
.checkSuccess()
69+
.stringBody()
70+
GITHUB_README_URL_REGEX.find(content)?.groups?.get(1)?.value ?: ""
71+
} catch (_: Throwable) { "" }
72+
}
73+
3574
companion object {
36-
const val AGE_TV_URL = "https://age.tv/"
75+
const val AGE_URL_PUBLIC_PAGE_1 = "https://rentry.org/agefans"
76+
const val AGE_URL_PUBLIC_PAGE_2 = "https://rentry.la/agefans"
77+
const val AGE_URL_PUBLIC_GITHUB_1 = "https://ghfast.top/https://raw.githubusercontent.com/agefanscom/website/refs/heads/main/README.md"
78+
const val AGE_URL_PUBLIC_GITHUB_2 = "https://gh-proxy.com/raw.githubusercontent.com/agefanscom/website/refs/heads/main/README.md"
79+
const val AGE_URL_PUBLIC_GITHUB_3 = "https://raw.githubusercontent.com/agefanscom/website/refs/heads/main/README.md"
80+
val GITHUB_README_URL_REGEX = "> 最新域名:\\[(.*?)\\]\\(".toRegex()
3781
const val AGE_MOBILE_URL_BASE64 = "aHR0cHM6Ly9tLmFnZWZhbnMubGEv"
3882
val AGE_MOBILE_URL = AGE_MOBILE_URL_BASE64.decodeBase64ToStr()
3983
const val AGE_MOBILE_API_URL_BASE64 = "aHR0cHM6Ly9hcGkuYWdlZmFucy5sYS8="
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package com.muedsa.tvbox.agetv.service
2+
3+
import com.muedsa.tvbox.tool.createOkHttpClient
4+
import org.junit.Test
5+
6+
class AgeUrlServiceTest {
7+
private val service = AgeUrlService(createOkHttpClient())
8+
9+
@Test
10+
fun tryGetUrl_test() {
11+
val url = service.tryGetUrl()
12+
check(url.isNotBlank())
13+
}
14+
15+
@Test
16+
fun parseUrlFormPublicPage_page1_test() {
17+
val pageUrl = AgeUrlService.AGE_URL_PUBLIC_PAGE_1
18+
val url = service.parseUrlFormPublicPage(pageUrl)
19+
println("url: $url from page $pageUrl")
20+
check(url.isNotBlank())
21+
}
22+
23+
@Test
24+
fun parseUrlFormPublicPage_page2_test() {
25+
val pageUrl = AgeUrlService.AGE_URL_PUBLIC_PAGE_2
26+
val url = service.parseUrlFormPublicPage(pageUrl)
27+
println("url: $url from page $pageUrl")
28+
check(url.isNotBlank())
29+
}
30+
31+
@Test
32+
fun parseUrlFormGithubReadme_page1_test() {
33+
val pageUrl = AgeUrlService.AGE_URL_PUBLIC_GITHUB_1
34+
val url = service.parseUrlFormGithubReadme(pageUrl)
35+
println("url: $url from page $pageUrl")
36+
check(url.isNotBlank())
37+
}
38+
39+
@Test
40+
fun parseUrlFormGithubReadme_page2_test() {
41+
val pageUrl = AgeUrlService.AGE_URL_PUBLIC_GITHUB_2
42+
val url = service.parseUrlFormGithubReadme(pageUrl)
43+
println("url: $url from page $pageUrl")
44+
println("url: $url from page $pageUrl")
45+
check(url.isNotBlank())
46+
}
47+
48+
@Test
49+
fun parseUrlFormGithubReadme_page3_test() {
50+
val pageUrl = AgeUrlService.AGE_URL_PUBLIC_GITHUB_3
51+
val url = service.parseUrlFormGithubReadme(pageUrl)
52+
println("url: $url from page $pageUrl")
53+
check(url.isNotBlank())
54+
}
55+
}

0 commit comments

Comments
 (0)