diff --git a/src/main/kotlin/com/hiczp/bilibili/api/live/LiveAPI.kt b/src/main/kotlin/com/hiczp/bilibili/api/live/LiveAPI.kt index c9d951b..67bb3ec 100644 --- a/src/main/kotlin/com/hiczp/bilibili/api/live/LiveAPI.kt +++ b/src/main/kotlin/com/hiczp/bilibili/api/live/LiveAPI.kt @@ -46,10 +46,9 @@ interface LiveAPI { */ @GET("/room/v1/Danmu/getConf") fun getDanmakuConfig( - @Field("room_id") roomId: Long + @Query("room_id") roomId: Long ): Deferred - /** * 获取该房间的主播的头像和等级一类的信息 * @@ -84,8 +83,104 @@ interface LiveAPI { /** * 查询是否关注了当前主播 + * + * @param follow 所查询的主播的用户 ID */ @POST("/relation/v1/Feed/isFollowed") @FormUrlEncoded fun isFollowed(@Field("follow") follow: Long): Deferred + + /** + * 进入直播间的时候, 客户端会访问该接口来动态获取上方的 Tab. 包括 互动, 主播, 贡献榜 等 + * + * @param roomId 房间号 + */ + @Suppress("SpellCheckingInspection") + @GET("/room/v2/Room/mobileTab") + fun mobileTab(@Query("roomid") roomId: Long): Deferred + + /** + * 获取房间的历史弹幕(10条) + * + * @param roomId 房间号 + */ + @GET("/AppRoom/msg") + fun roomMessage(@Query("room_id") roomId: Long): Deferred + + /** + * 获取进房后右下角显示的那些东西, 通常是一些活动, 它们导向 H5 页面 + * + * @param roomId 房间号 + * @param roomUserId 主播的用户 ID + */ + @Suppress("SpellCheckingInspection") + @GET("/activity/v1/Common/mobileRoomBanner") + fun mobileRoomBanner( + @Query("area_v2_id") areaV2Id: Int, + @Query("area_v2_parent_id") areaV2ParentId: Int, + @Query("roomid") roomId: Long, + @Query("ruid") roomUserId: Long + ): Deferred + + /** + * 获取各种礼物的基本信息, 包括贴图地址, 描述, 价格等 + */ + @Suppress("SpellCheckingInspection") + @GET("/gift/v3/live/gift_config") + fun getGiftConfig( + @Query("area_v2_id") areaV2Id: Int, + @Query("area_v2_parent_id") areaV2ParentId: Int, + @Query("roomid") roomId: Long + ): Deferred + + /** + * 获取访问 小时总榜 的地址(H5) + */ + @Suppress("SpellCheckingInspection") + @GET("/rankdb/v1/Common/roomRank") + fun roomRank( + @Query("area_v2_id") areaV2Id: Int, + @Query("area_v2_parent_id") areaV2ParentId: Int, + @Query("roomid") roomId: Long, + @Query("ruid") roomUserId: Long + ): Deferred + + /** + * 直播站首页 + * 首页 -> 直播 + */ + @Suppress("SpellCheckingInspection") + @GET("/xlive/app-interface/v2/index/getAllList") + fun homePage( + @Query("quality") quality: Int = 0, + @Query("rec_page") recPage: Int = 2, + @Query("relation_page") relationPage: Int = 2, + @Query("scale") scale: String = "xxhdpi" + ): Deferred + + /** + * 获取某个直播分类下的全部子分类 + */ + @GET("/room/v1/Area/getList") + fun getAreaList(@Query("parent_id") parentId: Int): Deferred + + /** + * 根据某种维度来获取房间列表 + * area, parent, category 为 0 表示不筛选这些维度 + * sortType 为 null 表示不排序 + * + * 首页 -> 直播 -> 查看更多/全部直播 + * + * @param page 分页, 从 1 开始 + * @param sortType 排序维度, 已知的有 online(最热直播), live_time(最新开播) + */ + @GET("/room/v3/Area/getRoomList") + fun getRoomList( + @Query("area_id") areaId: Int = 0, + @Query("parent_area_id") parentAreaId: Int = 0, + @Query("cate_id") categoryId: Int = 0, + @Query("page") page: Int = 1, + @Query("page_size") pageSize: Int = 30, + @Query("sort_type") sortType: String? = null + ): Deferred } diff --git a/src/main/kotlin/com/hiczp/bilibili/api/live/model/AnchorInRoom.kt b/src/main/kotlin/com/hiczp/bilibili/api/live/model/AnchorInRoom.kt index 67fcefb..bec783f 100644 --- a/src/main/kotlin/com/hiczp/bilibili/api/live/model/AnchorInRoom.kt +++ b/src/main/kotlin/com/hiczp/bilibili/api/live/model/AnchorInRoom.kt @@ -26,7 +26,7 @@ data class AnchorInRoom( @SerializedName("gender") var gender: Int, // 0 @SerializedName("identification") - var identification: Int? = null, // 1 + var identification: Int?, // 1 @SerializedName("mobile_verify") var mobileVerify: Int, // 0 @SerializedName("official_verify") @@ -62,7 +62,7 @@ data class AnchorInRoom( @SerializedName("master_level") var masterLevel: MasterLevel, @SerializedName("rcost") - var rcost: Int, // 3668592 + var rcost: Long, // 3668592 @SerializedName("svip") var svip: Int, // 0 @SerializedName("svip_time") diff --git a/src/main/kotlin/com/hiczp/bilibili/api/live/model/AreaList.kt b/src/main/kotlin/com/hiczp/bilibili/api/live/model/AreaList.kt new file mode 100644 index 0000000..9c34a38 --- /dev/null +++ b/src/main/kotlin/com/hiczp/bilibili/api/live/model/AreaList.kt @@ -0,0 +1,39 @@ +package com.hiczp.bilibili.api.live.model + +import com.google.gson.annotations.SerializedName + +data class AreaList( + @SerializedName("code") + var code: Int, // 0 + @SerializedName("data") + var `data`: List, + @SerializedName("message") + var message: String, // success + @SerializedName("msg") + var msg: String // success +) { + data class Data( + @SerializedName("act_id") + var actId: String, // 0 + @SerializedName("area_type") + var areaType: Int, // 0 + @SerializedName("hot_status") + var hotStatus: Int, // 0 + @SerializedName("id") + var id: String, // 34 + @SerializedName("lock_status") + var lockStatus: String, // 0 + @SerializedName("name") + var name: String, // 音乐台 + @SerializedName("old_area_id") + var oldAreaId: String, // 7 + @SerializedName("parent_id") + var parentId: String, // 1 + @SerializedName("parent_name") + var parentName: String, // 娱乐 + @SerializedName("pic") + var pic: String, // https://i0.hdslb.com/bfs/vc/8537694f4fe68ab0798dd5d493d3ca5deb908088.png + @SerializedName("pk_status") + var pkStatus: String // 0 + ) +} diff --git a/src/main/kotlin/com/hiczp/bilibili/api/live/model/GiftConfig.kt b/src/main/kotlin/com/hiczp/bilibili/api/live/model/GiftConfig.kt new file mode 100644 index 0000000..c932c17 --- /dev/null +++ b/src/main/kotlin/com/hiczp/bilibili/api/live/model/GiftConfig.kt @@ -0,0 +1,88 @@ +package com.hiczp.bilibili.api.live.model + +import com.google.gson.annotations.SerializedName + +data class GiftConfig( + @SerializedName("code") + var code: Int, // 0 + @SerializedName("data") + var `data`: List, + @SerializedName("message") + var message: String, // success + @SerializedName("msg") + var msg: String // success +) { + data class Data( + @SerializedName("animation_frame_num") + var animationFrameNum: Int, // 12 + @SerializedName("bag_gift") + var bagGift: Int, // 0 + @SerializedName("broadcast") + var broadcast: Int, // 0 + @SerializedName("bullet_head") + var bulletHead: String, + @SerializedName("bullet_tail") + var bulletTail: String, + @SerializedName("coin_type") + var coinType: String, // gold + @SerializedName("corner_background") + var cornerBackground: String, + @SerializedName("corner_mark") + var cornerMark: String, // 祈愿 + @SerializedName("count_map") + var countMap: List, + @SerializedName("desc") + var desc: String, // 祥瑞御免,家宅平安。 + @SerializedName("draw") + var draw: Int, // 0 + @SerializedName("effect") + var effect: Int, // 0 + @SerializedName("frame_animation") + var frameAnimation: String, // https://i0.hdslb.com/bfs/live/4e19f947d0bd346d38fe4838d7ab431d003f9d7f.png + @SerializedName("full_sc_horizontal") + var fullScHorizontal: String, + @SerializedName("full_sc_horizontal_svga") + var fullScHorizontalSvga: String, + @SerializedName("full_sc_vertical") + var fullScVertical: String, + @SerializedName("full_sc_vertical_svga") + var fullScVerticalSvga: String, + @SerializedName("full_sc_web") + var fullScWeb: String, + @SerializedName("gif") + var gif: String, // https://i0.hdslb.com/bfs/live/a90ff57209661b309f121116682bdee1f3937a98.gif + @SerializedName("gift_type") + var giftType: Int, // 1 + @SerializedName("id") + var id: Int, // 30136 + @SerializedName("img_basic") + var imgBasic: String, // https://s1.hdslb.com/bfs/live/a7c750335ed42ae4dfeb70570804326d3ecaf61c.png + @SerializedName("img_dynamic") + var imgDynamic: String, // https://i0.hdslb.com/bfs/live/f6f314227e7ed8065c4f7266ada913289971f806.png + @SerializedName("limit_interval") + var limitInterval: Int, // 0 + @SerializedName("name") + var name: String, // 御守 + @SerializedName("price") + var price: Int, // 1000 + @SerializedName("privilege_required") + var privilegeRequired: Int, // 0 + @SerializedName("rights") + var rights: String, // 当前主播亲密度+10 经验值+1000 + @SerializedName("rule") + var rule: String, // 赠送御守即可参与“敬祈照准”活动。 + @SerializedName("stay_time") + var stayTime: Int, // 3 + @SerializedName("type") + var type: Int, // 0 + @SerializedName("webp") + var webp: String // https://i0.hdslb.com/bfs/live/6d8a7907cf89556d074b8ce220e7dd56ccaf5160.webp + ) { + data class CountMap( + @SerializedName("num") + var num: Int, // 2333 + @SerializedName("text") + var text: String + ) + } +} diff --git a/src/main/kotlin/com/hiczp/bilibili/api/live/model/HomePage.kt b/src/main/kotlin/com/hiczp/bilibili/api/live/model/HomePage.kt new file mode 100644 index 0000000..93d1afd --- /dev/null +++ b/src/main/kotlin/com/hiczp/bilibili/api/live/model/HomePage.kt @@ -0,0 +1,393 @@ +package com.hiczp.bilibili.api.live.model + +import com.google.gson.JsonElement +import com.google.gson.annotations.SerializedName + +data class HomePage( + @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("activity_card") + var activityCard: List, + @SerializedName("area_entrance") + var areaEntrance: List, + @SerializedName("area_entrance_v2") + var areaEntranceV2: List, + @SerializedName("banner") + var banner: List, + @SerializedName("hour_rank") + var hourRank: List, + @SerializedName("interval") + var interval: Int, // 10 + @SerializedName("is_sky_horse_gray") + var isSkyHorseGray: Int, // 0 + @SerializedName("my_idol") + var myIdol: List, + @SerializedName("my_tag") + var myTag: List, + @SerializedName("room_list") + var roomList: List, + @SerializedName("sea_patrol") + var seaPatrol: List + ) { + data class MyTag( + @SerializedName("extra_info") + var extraInfo: ExtraInfo, + @SerializedName("list") + var list: List, + @SerializedName("module_info") + var moduleInfo: ModuleInfo + ) { + data class X( + @SerializedName("area_v2_id") + var areaV2Id: Int, // 0 + @SerializedName("area_v2_name") + var areaV2Name: String, // 全部标签 + @SerializedName("area_v2_parent_id") + var areaV2ParentId: Int, // 0 + @SerializedName("area_v2_parent_name") + var areaV2ParentName: String, + @SerializedName("is_advice") + var isAdvice: Int, // 1 + @SerializedName("link") + var link: String, // http://live.bilibili.com/app/mytag/ + @SerializedName("pic") + var pic: String // http://i0.hdslb.com/bfs/vc/ff03528785fc8c91491d79e440398484811d6d87.png + ) + + data class ModuleInfo( + @SerializedName("count") + var count: Int, // 0 + @SerializedName("id") + var id: Int, // 28 + @SerializedName("link") + var link: String, + @SerializedName("pic") + var pic: String, + @SerializedName("sort") + var sort: Int, // 1 + @SerializedName("title") + var title: String, // 常用标签 + @SerializedName("type") + var type: Int // 12 + ) + + data class ExtraInfo( + @SerializedName("is_gray") + var isGray: Int, // 0 + @SerializedName("offline") + var offline: List + ) + } + + data class Room( + @SerializedName("list") + var list: List, + @SerializedName("module_info") + var moduleInfo: ModuleInfo + ) { + data class X( + @SerializedName("accept_quality") + var acceptQuality: List, + @SerializedName("area_v2_id") + var areaV2Id: Int, // 96 + @SerializedName("area_v2_name") + var areaV2Name: String, // 其他绘画 + @SerializedName("area_v2_parent_id") + var areaV2ParentId: Int, // 4 + @SerializedName("area_v2_parent_name") + var areaV2ParentName: String, // 绘画 + @SerializedName("broadcast_type") + var broadcastType: Int, // 0 + @SerializedName("click_callback") + var clickCallback: String, + @SerializedName("cover") + var cover: String, // http://i0.hdslb.com/bfs/live/room_cover/6ef5b522bdf4de9fe2535b6031ae9b32c405cea0.jpg + @SerializedName("current_quality") + var currentQuality: Int, // 4 + @SerializedName("face") + var face: String, // http://i0.hdslb.com/bfs/face/c165088330c1bd7f671b427b610379603aa002ae.jpg + @SerializedName("group_id") + var groupId: Int, // 0 + @SerializedName("link") + var link: String, + @SerializedName("online") + var online: Int, // 5584 + @SerializedName("pendent_ru") + var pendentRu: String, + @SerializedName("pendent_ru_color") + var pendentRuColor: String, + @SerializedName("pendent_ru_pic") + var pendentRuPic: String, + @SerializedName("pk_id") + var pkId: Int, // 0 + @SerializedName("play_url") + var playUrl: String, // http://ws.live-play.acgvideo.com/live-ws/403834/live_397298321_43558493.flv?wsSecret=9dc8725a77c8ef5c68545e436f53b917&wsTime=1552470101&trid=9179fec58e79438aab34a9bbe5087e33&sig=no + @SerializedName("play_url_h265") + var playUrlH265: String, + @SerializedName("rec_type") + var recType: Int, // 0 + @SerializedName("roomid") + var roomid: Long, // 21218600 + @SerializedName("session_id") + var sessionId: String, // 456BB3BF-16D6-4BD3-9B4E-4570C274CEE5 + @SerializedName("show_callback") + var showCallback: String, + @SerializedName("title") + var title: String, // 学员答疑13:00~21:00 + @SerializedName("uname") + var uname: String // 轻微课魔鬼绘画特训班 + ) + + data class ModuleInfo( + @SerializedName("count") + var count: Int, // 0 + @SerializedName("id") + var id: Int, // 8 + @SerializedName("link") + var link: String, // http://live.bilibili.com/app/area?parent_area_id=4&parent_area_name=绘画&area_id=&area_name= + @SerializedName("pic") + var pic: String, // http://i0.hdslb.com/bfs/live/7c54d7cc64e022845fccd63221de069b71eb6f67.png + @SerializedName("sort") + var sort: Int, // 25 + @SerializedName("title") + var title: String, // 绘画 + @SerializedName("type") + var type: Int // 9 + ) + } + + data class AreaEntrance( + @SerializedName("list") + var list: List, + @SerializedName("module_info") + var moduleInfo: ModuleInfo + ) { + data class ModuleInfo( + @SerializedName("count") + var count: Int, // 0 + @SerializedName("id") + var id: Int, // 2 + @SerializedName("link") + var link: String, + @SerializedName("pic") + var pic: String, + @SerializedName("sort") + var sort: Int, // 2 + @SerializedName("title") + var title: String, // 分区入口 + @SerializedName("type") + var type: Int // 2 + ) + + data class X( + @SerializedName("content") + var content: String, + @SerializedName("id") + var id: Int, // 45 + @SerializedName("link") + var link: String, // http://live.bilibili.com/app/area?parent_area_id=1&parent_area_name=娱乐&area_id=199&area_name=虚拟主播 + @SerializedName("pic") + var pic: String, // http://i0.hdslb.com/bfs/vc/7725a45469b776ee91f2d42afca1e5711f84ac51.png + @SerializedName("title") + var title: String // 虚拟主播 + ) + } + + data class Banner( + @SerializedName("list") + var list: List, + @SerializedName("module_info") + var moduleInfo: ModuleInfo + ) { + data class X( + @SerializedName("content") + var content: String, + @SerializedName("id") + var id: Int, // 1117 + @SerializedName("link") + var link: String, // https://www.bilibili.com/blackboard/live/activity-flower-girl2-h5.html + @SerializedName("pic") + var pic: String, // http://i0.hdslb.com/bfs/vc/523a719b51a647eeb969956865a20781d7e6d994.jpg + @SerializedName("title") + var title: String // 花之初少女 + ) + + data class ModuleInfo( + @SerializedName("count") + var count: Int, // 0 + @SerializedName("id") + var id: Int, // 1 + @SerializedName("link") + var link: String, + @SerializedName("pic") + var pic: String, + @SerializedName("sort") + var sort: Int, // 0 + @SerializedName("title") + var title: String, // banner位 + @SerializedName("type") + var type: Int // 1 + ) + } + + data class MyIdol( + @SerializedName("extra_info") + var extraInfo: ExtraInfo, + @SerializedName("list") + var list: List, + @SerializedName("module_info") + var moduleInfo: ModuleInfo + ) { + data class ExtraInfo( + @SerializedName("card_type") + var cardType: Int, // 1 + @SerializedName("relation_page") + var relationPage: Int, // 1 + @SerializedName("tags_desc") + var tagsDesc: String, + @SerializedName("time_desc") + var timeDesc: String, + @SerializedName("total_count") + var totalCount: Int, // 1 + @SerializedName("uname_desc") + var unameDesc: String + ) + + data class ModuleInfo( + @SerializedName("count") + var count: Int, // 0 + @SerializedName("id") + var id: Int, // 13 + @SerializedName("link") + var link: String, // http://live.bilibili.com/app/myfollow/ + @SerializedName("pic") + var pic: String, // http://i0.hdslb.com/bfs/live/484abcd8940ee43ec8b4409cbfe0c1e52f09a338.png + @SerializedName("sort") + var sort: Int, // 4 + @SerializedName("title") + var title: String, // 我的关注 + @SerializedName("type") + var type: Int // 8 + ) + + data class X( + @SerializedName("accept_quality") + var acceptQuality: List, + @SerializedName("area") + var area: Int, // 7 + @SerializedName("area_name") + var areaName: String, // 放映厅 + @SerializedName("area_v2_id") + var areaV2Id: Int, // 34 + @SerializedName("area_v2_name") + var areaV2Name: String, // 音乐台 + @SerializedName("area_v2_parent_id") + var areaV2ParentId: Int, // 1 + @SerializedName("area_v2_parent_name") + var areaV2ParentName: String, // 娱乐 + @SerializedName("broadcast_type") + var broadcastType: Int, // 0 + @SerializedName("cover") + var cover: String, // http://i0.hdslb.com/bfs/live/6029764557e3cbe91475faae26e6e244de8c1d3c.jpg + @SerializedName("current_quality") + var currentQuality: Int, // 4 + @SerializedName("face") + var face: String, // http://i0.hdslb.com/bfs/face/5d35da6e93fbfb1a77ad6d1f1004b08413913f9a.jpg + @SerializedName("link") + var link: String, // http://live.bilibili.com/23058?broadcast_type=0 + @SerializedName("live_tag_name") + var liveTagName: String, // 音乐台 + @SerializedName("live_time") + var liveTime: Int, // 1552406400 + @SerializedName("official_verify") + var officialVerify: Int, // 1 + @SerializedName("online") + var online: Int, // 9961 + @SerializedName("pendent_ru") + var pendentRu: String, + @SerializedName("pendent_ru_color") + var pendentRuColor: String, + @SerializedName("pendent_ru_pic") + var pendentRuPic: String, + @SerializedName("pk_id") + var pkId: Int, // 0 + @SerializedName("play_url") + var playUrl: String, // http://ws.live-play.acgvideo.com/live-ws/637609/live_11153765_9369560.flv?wsSecret=49e118106b827b5008e10b0c74fa1a5a&wsTime=1552470101&trid=fe3b3a0b017a439c86d792ab5dd6fcd5&sig=no + @SerializedName("play_url_h265") + var playUrlH265: String, + @SerializedName("roomid") + var roomid: Long, // 23058 + @SerializedName("special_attention") + var specialAttention: Int, // 0 + @SerializedName("title") + var title: String, // 哔哩哔哩音悦台 + @SerializedName("uid") + var uid: Long, // 11153765 + @SerializedName("uname") + var uname: String // 3号直播间 + ) + } + + data class HourRank( + @SerializedName("extra_info") + var extraInfo: ExtraInfo, + @SerializedName("list") + var list: List, + @SerializedName("module_info") + var moduleInfo: ModuleInfo + ) { + data class ModuleInfo( + @SerializedName("count") + var count: Int, // 0 + @SerializedName("id") + var id: Int, // 4 + @SerializedName("link") + var link: String, // https://live.bilibili.com/p/html/live-app-rank/index.html?is_live_webview=1&nav=hour + @SerializedName("pic") + var pic: String, // http://i0.hdslb.com/bfs/live/39cd413f6bc72fb9da8c10ff2686b537477294ab.png + @SerializedName("sort") + var sort: Int, // 11 + @SerializedName("title") + var title: String, // 小时榜 + @SerializedName("type") + var type: Int // 5 + ) + + data class X( + @SerializedName("area_v2_id") + var areaV2Id: Int, // 145 + @SerializedName("area_v2_name") + var areaV2Name: String, // 视频聊天 + @SerializedName("area_v2_parent_id") + var areaV2ParentId: Int, // 1 + @SerializedName("area_v2_parent_name") + var areaV2ParentName: String, // 娱乐 + @SerializedName("face") + var face: String, // http://i2.hdslb.com/bfs/face/cdc9866d09ed82e6fae610f5ba4b8706db509802.jpg + @SerializedName("live_status") + var liveStatus: Int, // 1 + @SerializedName("rank") + var rank: Int, // 3 + @SerializedName("roomid") + var roomid: Long, // 274926 + @SerializedName("uid") + var uid: Long, // 24601383 + @SerializedName("uname") + var uname: String // 蛋黄姬GAT-X105 + ) + + data class ExtraInfo( + @SerializedName("sub_title") + var subTitle: String // 15:00-16:00 总榜排名 + ) + } + } +} diff --git a/src/main/kotlin/com/hiczp/bilibili/api/live/model/MobileRoomBanner.kt b/src/main/kotlin/com/hiczp/bilibili/api/live/model/MobileRoomBanner.kt new file mode 100644 index 0000000..5627d59 --- /dev/null +++ b/src/main/kotlin/com/hiczp/bilibili/api/live/model/MobileRoomBanner.kt @@ -0,0 +1,74 @@ +package com.hiczp.bilibili.api.live.model + +import com.google.gson.JsonElement +import com.google.gson.annotations.SerializedName + +data class MobileRoomBanner( + @SerializedName("code") + var code: Int, // 0 + @SerializedName("data") + var `data`: Data, + @SerializedName("message") + var message: String, // OK + @SerializedName("msg") + var msg: String // OK +) { + data class Data( + @SerializedName("bottom") + var bottom: List, + @SerializedName("gift") + var gift: JsonElement?, // null + @SerializedName("gift_banner") + var giftBanner: JsonElement?, // null + @SerializedName("inputBanner") + var inputBanner: List, + @SerializedName("lol_activity") + var lolActivity: LolActivity, + @SerializedName("superBanner") + var superBanner: JsonElement?, // null + @SerializedName("top") + var top: List + ) { + data class Top( + @SerializedName("activity_title") + var activityTitle: String, // 周星 + @SerializedName("color") + var color: String, + @SerializedName("cover") + var cover: String, // https://i0.hdslb.com/bfs/vc/5cfb2a7dc2a25db580f130a55f475f74e2bd3202.png + @SerializedName("expire_hour") + var expireHour: Int, // 24 + @SerializedName("gift_img") + var giftImg: String, // https://s1.hdslb.com/bfs/vc/39aee4bf13b170f22f19ef1c278cebf3a6e40332.png + @SerializedName("id") + var id: Int, // 199 + @SerializedName("is_close") + var isClose: Int, // 0 + @SerializedName("jump_url") + var jumpUrl: String, // https://live.bilibili.com/p/html/live-app-weekstar/index.html?is_live_half_webview=1&hybrid_biz=live-app-weekStar&hybrid_rotate_d=1&hybrid_half_ui=1,3,100p,70p,300e51,0,30,100;2,2,375,100p,300e51,0,30,100;3,3,100p,70p,300e51,0,30,100;4,2,375,100p,300e51,0,30,100;5,3,100p,70p,300e51,0,30,100;6,3,100p,70p,300e51,0,30,100;7,3,100p,70p,300e51,0,30,100&room_id=29434 + @SerializedName("rank") + var rank: String, // 999+ + @SerializedName("rank_name") + var rankName: String, // 打榜 + @SerializedName("title") + var title: String, // 排名 + @SerializedName("type") + var type: Int, // 1 + @SerializedName("week_gift_color") + var weekGiftColor: String, // #ffffff + @SerializedName("week_rank_color") + var weekRankColor: String, // #ffffff + @SerializedName("week_text_color") + var weekTextColor: String // #ffffff + ) + + data class LolActivity( + @SerializedName("guess_cover") + var guessCover: String, // https://i0.hdslb.com/bfs/live/61d1c4bcce470080a5408d6c03b7b48e0a0fa8d7.png + @SerializedName("status") + var status: Int, // 0 + @SerializedName("vote_cover") + var voteCover: String // https://i0.hdslb.com/bfs/live/6030cb2847f4d197caacb12fbe12f2656b999bcf.png + ) + } +} diff --git a/src/main/kotlin/com/hiczp/bilibili/api/live/model/MobileTab.kt b/src/main/kotlin/com/hiczp/bilibili/api/live/model/MobileTab.kt index 5fea665..7970769 100644 --- a/src/main/kotlin/com/hiczp/bilibili/api/live/model/MobileTab.kt +++ b/src/main/kotlin/com/hiczp/bilibili/api/live/model/MobileTab.kt @@ -17,7 +17,7 @@ data class MobileTab( * 如果是非顶层 Tab 则 default 为 null */ @SerializedName("default") - var default: Int? = null, // 0 + var default: Int?, // 0 @SerializedName("default_sub_tab") var defaultSubTab: String, @SerializedName("desc") diff --git a/src/main/kotlin/com/hiczp/bilibili/api/live/model/RoomInfo.kt b/src/main/kotlin/com/hiczp/bilibili/api/live/model/RoomInfo.kt index b6873ad..a2311c9 100644 --- a/src/main/kotlin/com/hiczp/bilibili/api/live/model/RoomInfo.kt +++ b/src/main/kotlin/com/hiczp/bilibili/api/live/model/RoomInfo.kt @@ -18,6 +18,9 @@ data class RoomInfo( var allowChangeAreaTime: Int, // 0 @SerializedName("allow_upload_cover_time") var allowUploadCoverTime: Int, // 0 + /** + * 没有 old 前缀的表示 v2 版本, 例如 area_v2_id. 下同 + */ @SerializedName("area_id") var areaId: Int, // 107 @SerializedName("area_name") diff --git a/src/main/kotlin/com/hiczp/bilibili/api/live/model/RoomList.kt b/src/main/kotlin/com/hiczp/bilibili/api/live/model/RoomList.kt new file mode 100644 index 0000000..9dcca4b --- /dev/null +++ b/src/main/kotlin/com/hiczp/bilibili/api/live/model/RoomList.kt @@ -0,0 +1,136 @@ +package com.hiczp.bilibili.api.live.model + +import com.google.gson.JsonElement +import com.google.gson.annotations.SerializedName + +data class RoomList( + @SerializedName("code") + var code: Int, // 0 + @SerializedName("data") + var `data`: Data, + @SerializedName("message") + var message: String, // success + @SerializedName("msg") + var msg: String // success +) { + data class Data( + @SerializedName("banner") + var banner: List, + @SerializedName("count") + var count: Int, // 5116 + @SerializedName("list") + var list: List, + @SerializedName("tags") + var tags: List + ) { + data class Banner( + @SerializedName("id") + var id: String, // 1117 + @SerializedName("link") + var link: String, // https://www.bilibili.com/blackboard/live/activity-flower-girl2-h5.html + @SerializedName("pic") + var pic: String, // https://i0.hdslb.com/bfs/vc/523a719b51a647eeb969956865a20781d7e6d994.jpg + @SerializedName("position") + var position: String, // 5 + @SerializedName("sort_num") + var sortNum: String, // 1 + @SerializedName("title") + var title: String // 花之初少女 + ) + + data class X( + @SerializedName("accept_quality") + var acceptQuality: String, // 4 + @SerializedName("accept_quality_v2") + var acceptQualityV2: List, + @SerializedName("area_id") + var areaId: Int, // 107 + @SerializedName("area_name") + var areaName: String, // 其他游戏 + @SerializedName("area_v2_id") + var areaV2Id: Int, // 107 + @SerializedName("area_v2_name") + var areaV2Name: String, // 其他游戏 + @SerializedName("area_v2_parent_id") + var areaV2ParentId: Int, // 2 + @SerializedName("area_v2_parent_name") + var areaV2ParentName: String, // 网游 + @SerializedName("broadcast_type") + var broadcastType: Int, // 0 + @SerializedName("corner") + var corner: String, + @SerializedName("cover_size") + var coverSize: CoverSize, + @SerializedName("current_quality") + var currentQuality: Int, // 4 + @SerializedName("face") + var face: String, // https://i0.hdslb.com/bfs/face/9c9ad7d21784e70dfa57cdae40cfdca1b58424c4.jpg + @SerializedName("game_live_num") + var gameLiveNum: Int, // 30 + @SerializedName("group_id") + var groupId: Int, // 0 + @SerializedName("is_tv") + var isTv: Int, // 0 + @SerializedName("link") + var link: String, // /21142258 + @SerializedName("online") + var online: Int, // 0 + @SerializedName("parent_id") + var parentId: Int, // 2 + @SerializedName("parent_name") + var parentName: String, // 网游 + @SerializedName("pendent") + var pendent: String, + @SerializedName("pendent_ld") + var pendentLd: String, + @SerializedName("pendent_ld_color") + var pendentLdColor: String, + @SerializedName("pendent_ru") + var pendentRu: String, + @SerializedName("pendent_ru_color") + var pendentRuColor: String, + @SerializedName("pendent_ru_pic") + var pendentRuPic: String, + @SerializedName("pk_id") + var pkId: Int, // 0 + @SerializedName("play_url") + var playUrl: String, + @SerializedName("roomid") + var roomid: Long, // 21142258 + @SerializedName("session_id") + var sessionId: String, // E9168524-EA1A-9F86-7A88-E33B58B9C8A8 + @SerializedName("show_cover") + var showCover: String, + @SerializedName("system_cover") + var systemCover: String, // https://i0.hdslb.com/bfs/live/21142258.jpg?03131614 + @SerializedName("title") + var title: String, // DNF除了肝啥都没 + @SerializedName("uid") + var uid: Long, // 278287794 + @SerializedName("uname") + var uname: String, // wz85699909 + @SerializedName("user_cover") + var userCover: String, // https://i0.hdslb.com/bfs/live/room_cover/dbfd1bbb5f936620a7bccac4b5e51b54342284d1.jpg + @SerializedName("user_cover_flag") + var userCoverFlag: Int, // 1 + @SerializedName("web_pendent") + var webPendent: String + ) { + data class CoverSize( + @SerializedName("height") + var height: Int, // 180 + @SerializedName("width") + var width: Int // 320 + ) + } + + data class Tag( + @SerializedName("id") + var id: Int, // -2 + @SerializedName("name") + var name: String, // 最新 + @SerializedName("sort_type") + var sortType: String // live_time + ) + } +} diff --git a/src/main/kotlin/com/hiczp/bilibili/api/live/model/RoomMessage.kt b/src/main/kotlin/com/hiczp/bilibili/api/live/model/RoomMessage.kt new file mode 100644 index 0000000..5f42f4f --- /dev/null +++ b/src/main/kotlin/com/hiczp/bilibili/api/live/model/RoomMessage.kt @@ -0,0 +1,116 @@ +package com.hiczp.bilibili.api.live.model + +import com.google.gson.annotations.SerializedName + +data class RoomMessage( + @SerializedName("code") + var code: Int, // 0 + @SerializedName("data") + var `data`: Data, + @SerializedName("message") + var message: String, + @SerializedName("msg") + var msg: String +) { + data class Data( + @SerializedName("admin") + var admin: List, + @SerializedName("room") + var room: List + ) { + data class Message( + @SerializedName("bubble") + var bubble: Int, // 0 + @SerializedName("check_info") + var checkInfo: CheckInfo, + @SerializedName("guard_level") + var guardLevel: Int, // 0 + @SerializedName("isadmin") + var isadmin: Int, // 0 + @SerializedName("medal") + var medal: List, //[ 17, "毛菇","猫菇椰汁",923614,16752445,""] + @SerializedName("nickname") + var nickname: String, // 柠檬味狗凉゜ + @SerializedName("rank") + var rank: Int, // 10000 + @SerializedName("rnd") + var rnd: String, // 1552452731 + @SerializedName("svip") + var svip: Int, // 1 + @SerializedName("teamid") + var teamid: Int, // 0 + @SerializedName("text") + var text: String, // 当前有效总督房:14979272;146 + @SerializedName("timeline") + var timeline: String, // 2019-03-13 12:52:09 + @SerializedName("title") + var title: List, + @SerializedName("uid") + var uid: Int, // 1615204 + @SerializedName("uname_color") + var unameColor: String, + /** + * 有可能是 >50000 这样的东西, 下同 + */ + @SerializedName("user_level") + var userLevel: List, + @SerializedName("user_title") + var userTitle: String, + @SerializedName("vip") + var vip: Int // 1 + ) { + data class CheckInfo( + @SerializedName("ct") + var ct: String, // 4B9A2E41 + @SerializedName("ts") + var ts: Int // 1552452729 + ) + } + + data class Admin( + @SerializedName("bubble") + var bubble: Int, // 2 + @SerializedName("check_info") + var checkInfo: CheckInfo, + @SerializedName("guard_level") + var guardLevel: Int, // 2 + @SerializedName("isadmin") + var isadmin: Int, // 1 + @SerializedName("medal") + var medal: List, + @SerializedName("nickname") + var nickname: String, // 沧澜ベ + @SerializedName("rank") + var rank: Int, // 10000 + @SerializedName("rnd") + var rnd: String, // 350761541 + @SerializedName("svip") + var svip: Int, // 1 + @SerializedName("teamid") + var teamid: Int, // 0 + @SerializedName("text") + var text: String, // 下个号见 + @SerializedName("timeline") + var timeline: String, // 2019-03-13 12:54:42 + @SerializedName("title") + var title: List, + @SerializedName("uid") + var uid: Long, // 11626554 + @SerializedName("uname_color") + var unameColor: String, // #e91e63 + @SerializedName("user_level") + var userLevel: List, + @SerializedName("user_title") + var userTitle: String, // title-181-1 + @SerializedName("vip") + var vip: Int // 1 + ) { + data class CheckInfo( + @SerializedName("ct") + var ct: String, // D1012BA7 + @SerializedName("ts") + var ts: Long // 1552452882 + ) + } + } +} diff --git a/src/main/kotlin/com/hiczp/bilibili/api/live/model/RoomRank.kt b/src/main/kotlin/com/hiczp/bilibili/api/live/model/RoomRank.kt new file mode 100644 index 0000000..6c60c56 --- /dev/null +++ b/src/main/kotlin/com/hiczp/bilibili/api/live/model/RoomRank.kt @@ -0,0 +1,29 @@ +package com.hiczp.bilibili.api.live.model + +import com.google.gson.annotations.SerializedName + +data class RoomRank( + @SerializedName("code") + var code: Int, // 0 + @SerializedName("data") + var `data`: Data, + @SerializedName("message") + var message: String, // OK + @SerializedName("msg") + var msg: String // OK +) { + data class Data( + @SerializedName("color") + var color: String, // #FB7299 + @SerializedName("h5_url") + var h5Url: String, // https://live.bilibili.com/p/html/live-app-rankcurrent/index.html?is_live_half_webview=1&hybrid_half_ui=1,5,85p,70p,FFE293,0,30,100,10;2,2,320,100p,FFE293,0,30,100,0;4,2,320,100p,FFE293,0,30,100,0;6,5,65p,60p,FFE293,0,30,100,10;5,5,55p,60p,FFE293,0,30,100,10;3,5,85p,70p,FFE293,0,30,100,10;7,5,65p,60p,FFE293,0,30,100,10;&anchor_uid=2866663&rank_type=master_realtime_hour_room&area_hour=1&area_v2_id=145&area_v2_parent_id=1 + @SerializedName("rank_desc") + var rankDesc: String, // 小时总榜 + @SerializedName("roomid") + var roomid: Long, // 29434 + @SerializedName("timestamp") + var timestamp: Long, // 1552451099 + @SerializedName("web_url") + var webUrl: String // https://live.bilibili.com/blackboard/room-current-rank.html?rank_type=master_realtime_hour_room&area_hour=1&area_v2_id=145&area_v2_parent_id=1 + ) +} diff --git a/src/main/kotlin/com/hiczp/bilibili/api/live/model/UserInfoInRoom.kt b/src/main/kotlin/com/hiczp/bilibili/api/live/model/UserInfoInRoom.kt index e4af65b..9888a74 100644 --- a/src/main/kotlin/com/hiczp/bilibili/api/live/model/UserInfoInRoom.kt +++ b/src/main/kotlin/com/hiczp/bilibili/api/live/model/UserInfoInRoom.kt @@ -86,7 +86,7 @@ data class UserInfoInRoom( @SerializedName("master_level") var masterLevel: MasterLevel, @SerializedName("rcost") - var rcost: Int, // 2737665 + var rcost: Long, // 2737665 @SerializedName("svip") var svip: Int, // 0 @SerializedName("svip_time") diff --git a/src/main/kotlin/com/hiczp/bilibili/api/retrofit/ParamType.kt b/src/main/kotlin/com/hiczp/bilibili/api/retrofit/ParamType.kt deleted file mode 100644 index 034c2c5..0000000 --- a/src/main/kotlin/com/hiczp/bilibili/api/retrofit/ParamType.kt +++ /dev/null @@ -1,10 +0,0 @@ -package com.hiczp.bilibili.api.retrofit - -/** - * 用于指定参数类型 - * 例如指定公共参数加在 Query 里 - */ -enum class ParamType { - QUERY, - FORM_URL_ENCODED -} diff --git a/src/test/kotlin/com/hiczp/bilibili/api/test/EnterRoomTest.kt b/src/test/kotlin/com/hiczp/bilibili/api/test/EnterRoomTest.kt index 4ac7808..fd65eb9 100644 --- a/src/test/kotlin/com/hiczp/bilibili/api/test/EnterRoomTest.kt +++ b/src/test/kotlin/com/hiczp/bilibili/api/test/EnterRoomTest.kt @@ -7,9 +7,26 @@ class EnterRoomTest { @Test fun enterRoom() { runBlocking { - val roomId = bilibiliClient.liveAPI.mobileRoomInit(3).await().data.roomId - bilibiliClient.liveAPI.roomEntryAction(roomId).await() - bilibiliClient.liveAPI.getInfo(roomId).await() + with(bilibiliClient.liveAPI) { + //下面模拟一个客户端进房时会访问的接口 + val (roomId, uid) = mobileRoomInit(3).await().data.let { it.roomId to it.uid } + roomEntryAction(roomId).await() + val data = getInfo(roomId).await().data + isFollowed(uid).await() + getAnchorInRoom(roomId).await() + getUser().await() + getUserInfoInRoom(roomId).await() + getTitle().await() + mobileTab(roomId).await() + roomMessage(roomId).await().data.room.forEach { + println("${it.nickname}: ${it.text}") + } + val (areaId, parentAreaId) = data.let { it.areaId to it.parentAreaId } + mobileRoomBanner(areaId, parentAreaId, roomId, uid).await() + getGiftConfig(areaId, parentAreaId, roomId).await() + roomRank(areaId, parentAreaId, roomId, uid).await() + getDanmakuConfig(roomId).await() + } } } } diff --git a/src/test/kotlin/com/hiczp/bilibili/api/test/IsFollowedTest.kt b/src/test/kotlin/com/hiczp/bilibili/api/test/IsFollowedTest.kt deleted file mode 100644 index 173146c..0000000 --- a/src/test/kotlin/com/hiczp/bilibili/api/test/IsFollowedTest.kt +++ /dev/null @@ -1,13 +0,0 @@ -package com.hiczp.bilibili.api.test - -import kotlinx.coroutines.runBlocking -import org.junit.jupiter.api.Test - -class IsFollowedTest { - @Test - fun followLive() { - runBlocking { - bilibiliClient.liveAPI.isFollowed(20293030).await() - } - } -}