diff --git a/src/main/kotlin/com/hiczp/bilibili/api/BilibiliClient.kt b/src/main/kotlin/com/hiczp/bilibili/api/BilibiliClient.kt index 8a43e22..fb599c3 100644 --- a/src/main/kotlin/com/hiczp/bilibili/api/BilibiliClient.kt +++ b/src/main/kotlin/com/hiczp/bilibili/api/BilibiliClient.kt @@ -6,6 +6,8 @@ import com.hiczp.bilibili.api.member.MemberAPI import com.hiczp.bilibili.api.message.MessageAPI import com.hiczp.bilibili.api.passport.PassportAPI import com.hiczp.bilibili.api.passport.model.LoginResponse +import com.hiczp.bilibili.api.player.PlayerAPI +import com.hiczp.bilibili.api.player.PlayerInterceptor import com.hiczp.bilibili.api.retrofit.Param import com.hiczp.bilibili.api.retrofit.ParamType import com.hiczp.bilibili.api.retrofit.exception.BilibiliApiException @@ -86,7 +88,6 @@ class BilibiliClient( ) private val defaultCommonQueryParamInterceptor = CommonParamInterceptor(ParamType.QUERY, *defaultCommonParamArray) - private val defaultSortAndSignInterceptor = SortAndSignInterceptor(billingClientProperties.appSecret) /** * 用户鉴权相关的接口 @@ -102,8 +103,7 @@ class BilibiliClient( "mobi_app" to { billingClientProperties.platform }, "platform" to { billingClientProperties.platform }, "ts" to { Instant.now().epochSecond.toString() } - ), - defaultSortAndSignInterceptor + ) ) } @@ -117,8 +117,7 @@ class BilibiliClient( CommonParamInterceptor(ParamType.QUERY, *defaultCommonParamArray, "actionKey" to { "appkey" }, "has_up" to { "1" } - ), - defaultSortAndSignInterceptor + ) ) } @@ -129,8 +128,7 @@ class BilibiliClient( val appAPI by lazy { createAPI(BaseUrl.app, defaultCommonHeaderInterceptor, - defaultCommonQueryParamInterceptor, - defaultSortAndSignInterceptor + defaultCommonQueryParamInterceptor ) } @@ -147,8 +145,7 @@ class BilibiliClient( "User-Agent" to { "Mozilla/5.0 BiliDroid/5.37.0 (bbcallen@gmail.com)" }, "Device-ID" to { billingClientProperties.hardwareId } ), - defaultCommonQueryParamInterceptor, - defaultSortAndSignInterceptor + defaultCommonQueryParamInterceptor ) } @@ -166,8 +163,7 @@ class BilibiliClient( "trace_id" to { generateTraceId() }, "uid" to { userId?.toString() }, "version" to { billingClientProperties.version } - ), - defaultSortAndSignInterceptor + ) ) } @@ -177,11 +173,31 @@ class BilibiliClient( val memberAPI by lazy { createAPI(BaseUrl.member, defaultCommonHeaderInterceptor, - defaultCommonQueryParamInterceptor, - defaultSortAndSignInterceptor + defaultCommonQueryParamInterceptor ) } + /** + * 播放器所需的 API, 用于获取视频播放地址 + */ + val playerAPI: PlayerAPI by lazy { + Retrofit.Builder() + .baseUrl("https://bilibili.com") //这里的 baseUrl 是没用的 + .addConverterFactory(gsonConverterFactory) + .addCallAdapterFactory(coroutineCallAdapterFactory) + .client(OkHttpClient.Builder().apply { + //TODO functional + addInterceptor(PlayerInterceptor(billingClientProperties, loginResponse)) + addInterceptor(FailureResponseInterceptor) + //log + if (logLevel != HttpLoggingInterceptor.Level.NONE) { + addNetworkInterceptor(HttpLoggingInterceptor().setLevel(logLevel)) + } + }.build()) + .build() + .create(PlayerAPI::class.java) + } + /** * 登陆 * v3 登陆接口会同时返回 cookies 和 token @@ -237,6 +253,7 @@ class BilibiliClient( loginResponse = null } + private val sortAndSignInterceptor = SortAndSignInterceptor(billingClientProperties.appSecret) private inline fun createAPI( baseUrl: String, vararg interceptors: Interceptor @@ -248,6 +265,7 @@ class BilibiliClient( interceptors.forEach { addInterceptor(it) } + addInterceptor(sortAndSignInterceptor) addInterceptor(FailureResponseInterceptor) //log if (logLevel != HttpLoggingInterceptor.Level.NONE) { diff --git a/src/main/kotlin/com/hiczp/bilibili/api/app/AppAPI.kt b/src/main/kotlin/com/hiczp/bilibili/api/app/AppAPI.kt index d5c2aa7..52a29de 100644 --- a/src/main/kotlin/com/hiczp/bilibili/api/app/AppAPI.kt +++ b/src/main/kotlin/com/hiczp/bilibili/api/app/AppAPI.kt @@ -99,30 +99,4 @@ interface AppAPI { @Query("qn") qn: Int = 32, @Query("trackid") trackId: String? = null //all_10.shylf-ai-recsys-120.1550674524909.237 ): Deferred - -// //TODO 这里的 appkey 变为 iVGUTjsxvpLeuDCf -// /** -// * 获得视频的播放地址 -// * -// * @param expire 默认为下个月的这一天的时间戳 -// * @param mid 当前用户 ID -// * @param cid 在 view() 接口的返回值里 -// * @param aid 视频的唯一标识 -// */ -// @Suppress("SpellCheckingInspection") -// @GET("/x/playurl") -// fun playUrl( -// @Query("device") device: String = "android", -// @Query("expire") expire: Long = Calendar.getInstance().apply { add(Calendar.MONTH, 1) }.toInstant().epochSecond, -// @Query("force_host") forceHost: Int = 0, -// @Query("mid") mid: Long? = null, -// @Query("fnval") fnVal: Int = 16, -// @Query("qn") qn: Int = 32, -// @Query("npcybs") npcybs: Int = 0, -// @Query("cid") cid: Long? = null, -// @Query("otype") otype: String = "json", -// @Query("fnver") fnVer: Int = 0, -// @Query("buvid") buildVersionId: String? = null, -// @Query("aid") aid: Long -// ): Deferred } diff --git a/src/main/kotlin/com/hiczp/bilibili/api/app/model/PlayUrl.kt b/src/main/kotlin/com/hiczp/bilibili/api/app/model/PlayUrl.kt deleted file mode 100644 index 605d88c..0000000 --- a/src/main/kotlin/com/hiczp/bilibili/api/app/model/PlayUrl.kt +++ /dev/null @@ -1,78 +0,0 @@ -package com.hiczp.bilibili.api.app.model - -//data class PlayUrl( -// @SerializedName("code") -// var code: Int, // 0 -// @SerializedName("data") -// var `data`: Data, -// @SerializedName("message") -// var message: String, // 0 -// @SerializedName("ttl") -// var ttl: Int // 1 -//) { -// data class Data( -// @SerializedName("accept_description") -// var acceptDescription: List, -// @SerializedName("accept_format") -// var acceptFormat: String, // flv720,flv480,flv360 -// @SerializedName("accept_quality") -// var acceptQuality: List, -// @SerializedName("dash") -// var dash: Dash, -// @SerializedName("fnval") -// var fnval: Int, // 16 -// @SerializedName("fnver") -// var fnver: Int, // 0 -// @SerializedName("format") -// var format: String, // flv480 -// @SerializedName("from") -// var from: String, // local -// @SerializedName("quality") -// var quality: Int, // 32 -// @SerializedName("result") -// var result: String, // suee -// @SerializedName("seek_param") -// var seekParam: String, // start -// @SerializedName("seek_type") -// var seekType: String, // offset -// @SerializedName("timelength") -// var timelength: Int, // 443737 -// @SerializedName("video_codecid") -// var videoCodecid: Int, // 7 -// @SerializedName("video_project") -// var videoProject: Boolean // true -// ) { -// data class Dash( -// @SerializedName("audio") -// var audio: List