feat: 简单实现弹幕功能

This commit is contained in:
guozhigq
2023-08-29 23:10:22 +08:00
parent 5f730af347
commit dfbe3b1f6c
23 changed files with 646 additions and 241 deletions

View File

@ -292,4 +292,6 @@ class Api {
// 多少人在看
// https://api.bilibili.com/x/player/online/total?aid=913663681&cid=1203559746&bvid=BV1MM4y1s7NZ&ts=56427838
static const String onlineTotal = '/x/player/online/total';
static const String webDanmaku = '/x/v2/dm/web/seg.so';
}

33
lib/http/danmaku.dart Normal file
View File

@ -0,0 +1,33 @@
import 'package:dio/dio.dart';
import 'package:flutter/foundation.dart';
import 'package:pilipala/http/index.dart';
import 'package:pilipala/models/danmaku/dm.pb.dart';
import 'constants.dart';
class DanmakaHttp {
// 获取视频弹幕
static Future queryDanmaku({
required int cid,
required int segmentIndex,
}) async {
// 构建参数对象
Map<String, int> params = {
'type': 1,
'oid': cid,
'segment_index': segmentIndex,
};
// 计算函数
Future<DmSegMobileReply> computeTask(Map<String, int> params) async {
var response = await Request().get(
Api.webDanmaku,
data: params,
extra: {'resType': ResponseType.bytes},
);
return DmSegMobileReply.fromBuffer(response.data);
}
return await compute(computeTask, params);
}
}

View File

@ -41,6 +41,7 @@ class Request {
log("setCookie, ${e.toString()}");
}
}
setOptionsHeaders(userInfo);
}
if (cookie.isEmpty) {
@ -69,6 +70,15 @@ class Request {
return token;
}
static setOptionsHeaders(userInfo) {
dio.options.headers['x-bili-mid'] = userInfo.mid.toString();
dio.options.headers['env'] = 'prod';
dio.options.headers['app-key'] = 'android64';
dio.options.headers['x-bili-aurora-eid'] = 'UlMFQVcABlAH';
dio.options.headers['x-bili-aurora-zone'] = 'sh001';
dio.options.headers['referer'] = 'https://www.bilibili.com/';
}
/*
* config it and create
*/
@ -87,17 +97,6 @@ class Request {
},
);
Box userInfoCache = GStrorage.userInfo;
var userInfo = userInfoCache.get('userInfoCache');
if (userInfo != null && userInfo.mid != null) {
options.headers['x-bili-mid'] = userInfo.mid.toString();
options.headers['env'] = 'prod';
options.headers['app-key'] = 'android64';
options.headers['x-bili-aurora-eid'] = 'UlMFQVcABlAH';
options.headers['x-bili-aurora-zone'] = 'sh001';
options.headers['referer'] = 'https://www.bilibili.com/';
}
dio = Dio(options)
..httpClientAdapter = Http2Adapter(
ConnectionManager(

View File

@ -17,8 +17,6 @@ class ApiInterceptor extends Interceptor {
handler.next(options);
}
Box localCache = GStrorage.localCache;
@override
void onResponse(Response response, ResponseInterceptorHandler handler) {
try {
@ -29,8 +27,11 @@ class ApiInterceptor extends Interceptor {
final uri = Uri.parse(locations.first);
final accessKey = uri.queryParameters['access_key'];
final mid = uri.queryParameters['mid'];
localCache
.put(LocalCacheKey.accessKey, {'mid': mid, 'value': accessKey});
try {
Box localCache = GStrorage.localCache;
localCache.put(
LocalCacheKey.accessKey, {'mid': mid, 'value': accessKey});
} catch (_) {}
}
}
}