11package com.muedsa.tvbox.agetv.service
22
3+ import com.muedsa.tvbox.tool.checkSuccess
34import com.muedsa.tvbox.tool.decodeBase64ToStr
45import com.muedsa.tvbox.tool.encodeBase64
56import com.muedsa.tvbox.tool.feignChrome
67import com.muedsa.tvbox.tool.get
8+ import com.muedsa.tvbox.tool.parseHtml
9+ import com.muedsa.tvbox.tool.stringBody
710import com.muedsa.tvbox.tool.toRequestBuild
11+ import okhttp3.HttpUrl.Companion.toHttpUrl
812import okhttp3.OkHttpClient
913
1014class 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="
0 commit comments