parent
82eae126e3
commit
0a1cd70a45
|
@ -6,7 +6,7 @@ ext {
|
||||||
extName = 'BILIBILI'
|
extName = 'BILIBILI'
|
||||||
pkgNameSuffix = 'all.bilibili'
|
pkgNameSuffix = 'all.bilibili'
|
||||||
extClass = '.BilibiliFactory'
|
extClass = '.BilibiliFactory'
|
||||||
extVersionCode = 5
|
extVersionCode = 6
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
|
|
|
@ -29,6 +29,12 @@ abstract class BilibiliComics(lang: String) : Bilibili(
|
||||||
override val signedIn: Boolean
|
override val signedIn: Boolean
|
||||||
get() = accessTokenCookie != null
|
get() = accessTokenCookie != null
|
||||||
|
|
||||||
|
private val globalApiSubDomain: String
|
||||||
|
get() = GLOBAL_API_SUBDOMAINS[(accessTokenCookie?.area?.toIntOrNull() ?: 1) - 1]
|
||||||
|
|
||||||
|
private val globalApiBaseUrl: String
|
||||||
|
get() = "https://$globalApiSubDomain.bilibilicomics.com"
|
||||||
|
|
||||||
private var accessTokenCookie: BilibiliAccessTokenCookie? = null
|
private var accessTokenCookie: BilibiliAccessTokenCookie? = null
|
||||||
|
|
||||||
override fun chapterListParse(response: Response): List<SChapter> {
|
override fun chapterListParse(response: Response): List<SChapter> {
|
||||||
|
@ -64,7 +70,7 @@ abstract class BilibiliComics(lang: String) : Bilibili(
|
||||||
.set("Referer", baseUrl)
|
.set("Referer", baseUrl)
|
||||||
.build()
|
.build()
|
||||||
|
|
||||||
val apiUrl = "$GLOBAL_API_URL/$GLOBAL_BASE_API_COMIC_ENDPOINT/GetUserEpisodes".toHttpUrl()
|
val apiUrl = "$globalApiBaseUrl/$GLOBAL_BASE_API_COMIC_ENDPOINT/GetUserEpisodes".toHttpUrl()
|
||||||
.newBuilder()
|
.newBuilder()
|
||||||
.addCommonParameters()
|
.addCommonParameters()
|
||||||
.toString()
|
.toString()
|
||||||
|
@ -74,7 +80,7 @@ abstract class BilibiliComics(lang: String) : Bilibili(
|
||||||
|
|
||||||
private fun userEpisodesParse(response: Response): List<Int> {
|
private fun userEpisodesParse(response: Response): List<Int> {
|
||||||
if (!response.isSuccessful) {
|
if (!response.isSuccessful) {
|
||||||
throw Exception("HTTP error ${response.code}")
|
return emptyList()
|
||||||
}
|
}
|
||||||
|
|
||||||
val result = response.parseAs<BilibiliUserEpisodes>()
|
val result = response.parseAs<BilibiliUserEpisodes>()
|
||||||
|
@ -103,7 +109,7 @@ abstract class BilibiliComics(lang: String) : Bilibili(
|
||||||
.set("Referer", baseUrl + chapter.url)
|
.set("Referer", baseUrl + chapter.url)
|
||||||
.build()
|
.build()
|
||||||
|
|
||||||
val apiUrl = "$GLOBAL_API_URL/$GLOBAL_BASE_API_USER_ENDPOINT/GetCredential".toHttpUrl()
|
val apiUrl = "$globalApiBaseUrl/$GLOBAL_BASE_API_USER_ENDPOINT/GetCredential".toHttpUrl()
|
||||||
.newBuilder()
|
.newBuilder()
|
||||||
.addCommonParameters()
|
.addCommonParameters()
|
||||||
.toString()
|
.toString()
|
||||||
|
@ -117,7 +123,7 @@ abstract class BilibiliComics(lang: String) : Bilibili(
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!response.isSuccessful) {
|
if (!response.isSuccessful) {
|
||||||
throw Exception("HTTP error ${response.code}")
|
throw Exception(FAILED_TO_GET_CREDENTIAL)
|
||||||
}
|
}
|
||||||
|
|
||||||
val result = response.parseAs<BilibiliCredential>()
|
val result = response.parseAs<BilibiliCredential>()
|
||||||
|
@ -137,7 +143,7 @@ abstract class BilibiliComics(lang: String) : Bilibili(
|
||||||
var request = chain.request()
|
var request = chain.request()
|
||||||
val requestUrl = request.url.toString()
|
val requestUrl = request.url.toString()
|
||||||
|
|
||||||
if (!requestUrl.startsWith(baseUrl) && !requestUrl.startsWith(GLOBAL_API_URL)) {
|
if (!requestUrl.contains("bilibilicomics.com")) {
|
||||||
return chain.proceed(request)
|
return chain.proceed(request)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -170,7 +176,7 @@ abstract class BilibiliComics(lang: String) : Bilibili(
|
||||||
)
|
)
|
||||||
val refreshTokenResponse = chain.proceed(refreshTokenRequest)
|
val refreshTokenResponse = chain.proceed(refreshTokenRequest)
|
||||||
|
|
||||||
accessTokenCookie = refreshTokenParse(refreshTokenResponse) ?: accessTokenCookie
|
accessTokenCookie = refreshTokenParse(refreshTokenResponse)
|
||||||
|
|
||||||
request = request.newBuilder()
|
request = request.newBuilder()
|
||||||
.header("Authorization", "Bearer ${accessTokenCookie!!.accessToken}")
|
.header("Authorization", "Bearer ${accessTokenCookie!!.accessToken}")
|
||||||
|
@ -190,7 +196,7 @@ abstract class BilibiliComics(lang: String) : Bilibili(
|
||||||
.set("Referer", baseUrl)
|
.set("Referer", baseUrl)
|
||||||
.build()
|
.build()
|
||||||
|
|
||||||
val apiUrl = "$GLOBAL_API_URL/$GLOBAL_BASE_API_USER_ENDPOINT/RefreshToken".toHttpUrl()
|
val apiUrl = "$globalApiBaseUrl/$GLOBAL_BASE_API_USER_ENDPOINT/RefreshToken".toHttpUrl()
|
||||||
.newBuilder()
|
.newBuilder()
|
||||||
.addCommonParameters()
|
.addCommonParameters()
|
||||||
.toString()
|
.toString()
|
||||||
|
@ -198,7 +204,7 @@ abstract class BilibiliComics(lang: String) : Bilibili(
|
||||||
return POST(apiUrl, newHeaders, requestBody)
|
return POST(apiUrl, newHeaders, requestBody)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun refreshTokenParse(response: Response): BilibiliAccessTokenCookie? {
|
private fun refreshTokenParse(response: Response): BilibiliAccessTokenCookie {
|
||||||
if (!response.isSuccessful) {
|
if (!response.isSuccessful) {
|
||||||
throw IOException(FAILED_TO_REFRESH_TOKEN)
|
throw IOException(FAILED_TO_REFRESH_TOKEN)
|
||||||
}
|
}
|
||||||
|
@ -206,14 +212,15 @@ abstract class BilibiliComics(lang: String) : Bilibili(
|
||||||
val result = response.parseAs<BilibiliAccessToken>()
|
val result = response.parseAs<BilibiliAccessToken>()
|
||||||
|
|
||||||
if (result.code != 0) {
|
if (result.code != 0) {
|
||||||
return null
|
throw IOException(FAILED_TO_REFRESH_TOKEN)
|
||||||
}
|
}
|
||||||
|
|
||||||
val accessToken = result.data!!
|
val accessToken = result.data!!
|
||||||
|
|
||||||
return BilibiliAccessTokenCookie(
|
return BilibiliAccessTokenCookie(
|
||||||
accessToken.accessToken,
|
accessToken.accessToken,
|
||||||
accessToken.refreshToken
|
accessToken.refreshToken,
|
||||||
|
accessTokenCookie!!.area
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -229,11 +236,13 @@ abstract class BilibiliComics(lang: String) : Bilibili(
|
||||||
companion object {
|
companion object {
|
||||||
private const val ACCESS_TOKEN_COOKIE_NAME = "access_token"
|
private const val ACCESS_TOKEN_COOKIE_NAME = "access_token"
|
||||||
|
|
||||||
private const val GLOBAL_API_URL = "https://us-user.bilibilicomics.com"
|
private val GLOBAL_API_SUBDOMAINS = arrayOf("us-user", "sg-user")
|
||||||
private const val GLOBAL_BASE_API_USER_ENDPOINT = "twirp/global.v1.User"
|
private const val GLOBAL_BASE_API_USER_ENDPOINT = "twirp/global.v1.User"
|
||||||
private const val GLOBAL_BASE_API_COMIC_ENDPOINT = "twirp/comic.v1.User"
|
private const val GLOBAL_BASE_API_COMIC_ENDPOINT = "twirp/comic.v1.User"
|
||||||
|
|
||||||
private const val FAILED_TO_REFRESH_TOKEN =
|
private const val FAILED_TO_REFRESH_TOKEN =
|
||||||
"Failed to refresh the token. Open the WebView to fix this error."
|
"Failed to refresh the token. Open the WebView to fix this error."
|
||||||
|
private const val FAILED_TO_GET_CREDENTIAL =
|
||||||
|
"Failed to get the credential to read the chapter."
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -61,7 +61,8 @@ data class BilibiliPageDto(
|
||||||
@Serializable
|
@Serializable
|
||||||
data class BilibiliAccessTokenCookie(
|
data class BilibiliAccessTokenCookie(
|
||||||
val accessToken: String,
|
val accessToken: String,
|
||||||
val refreshToken: String
|
val refreshToken: String,
|
||||||
|
val area: String
|
||||||
)
|
)
|
||||||
|
|
||||||
@Serializable
|
@Serializable
|
||||||
|
|
Loading…
Reference in New Issue