Skip to content

Commit d6b2a3d

Browse files
authored
feat: 添加配置文件,可设置弹幕 (#65)
1 parent c21ab1e commit d6b2a3d

File tree

4 files changed

+143
-62
lines changed

4 files changed

+143
-62
lines changed

Media/PlayParse/Bilibili_Config.json

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
{
2+
// 填写账号 Cookie
3+
"cookie": "",
4+
"danmaku": {
5+
// 控制是否接收弹幕。按 Alt+H 可显示/隐藏弹幕
6+
"enable": true,
7+
"server": "https://subtitle.chen310.repl.co",
8+
// 字体
9+
"font": "微软雅黑",
10+
// 字号
11+
"fontSize": 30.0,
12+
// 弹幕不透明度,取值范围 0.0 ~ 1.0
13+
"opacity": 0.8,
14+
// 弹幕显示区域大小,取值范围 0.0 ~ 1.0
15+
"displayArea": 0.8,
16+
// 弹幕显示时间
17+
"stayTime": 15.0
18+
},
19+
// 播放单个视频时是否显示推荐的视频
20+
"showRecommendedVideos": true,
21+
"debug": false
22+
}

Media/PlayParse/MediaPlayParse - Bilibili.as

Lines changed: 119 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -22,26 +22,12 @@
2222
// bool PlaylistCheck(const string &in) -> check playlist
2323
// array<dictionary> PlaylistParse(const string &in) -> parse playlist
2424

25-
26-
bool debug = false;
27-
string cookie = "";
28-
int uid = 0;
29-
bool enable_subtitle = true;
30-
string subtitle_host = "https://subtitle.chen310.repl.co";
31-
string danmaku_url = subtitle_host + "/subtitle?font=" + HostUrlEncode("微软雅黑") + "&font_size=30.0&alpha=0.8&is_reduce_comments=false&cid=";
32-
string subtitle_url = subtitle_host + "/subtitle?url=";
33-
// 是否可选择画质
34-
bool enable_qualities = true;
35-
// 视频推荐
36-
bool enable_related = true;
25+
Config ConfigData;
3726

3827
void OnInitialize() {
3928
HostSetUrlHeaderHTTP("bilivideo.com", "Referer: https://www.bilibili.com\r\n");
4029
HostSetUrlHeaderHTTP("bilivideo.cn", "Referer: https://www.bilibili.com\r\n");
4130
HostSetUrlHeaderHTTP("bilibili.com", "Referer: https://www.bilibili.com\r\n");
42-
if (debug) {
43-
HostOpenConsole();
44-
}
4531
}
4632

4733
string host = "https://api.bilibili.com";
@@ -61,27 +47,33 @@ string GetDesc() {
6147

6248
string GetLoginTitle()
6349
{
64-
return "请输入Bilibili Cookie";
50+
return "请输入配置文件所在位置";
6551
}
6652

6753
string GetLoginDesc()
6854
{
69-
return "请输入Bilibili Cookie";
55+
return "请输入配置文件所在位置";
7056
}
7157

7258
string GetUserText()
7359
{
74-
return "这里放空";
60+
return "配置文件路径";
7561
}
7662

7763
string GetPasswordText()
7864
{
79-
return "Cookie:";
65+
return "";
8066
}
8167

8268
string ServerCheck(string User, string Pass) {
83-
if (Pass.empty()) {
84-
return "请输入Cookie";
69+
if (User.empty()) {
70+
return "未填写配置文件路径";
71+
}
72+
if (!isFileExists(User)) {
73+
return "配置文件不存在";
74+
}
75+
if (ConfigData.cookie.empty()) {
76+
return "未填写cookie";
8577
}
8678
string info = "";
8779
JsonReader reader;
@@ -104,12 +96,94 @@ string ServerCheck(string User, string Pass) {
10496

10597
string ServerLogin(string User, string Pass)
10698
{
107-
if (Pass.empty()) return "cookie 为空";
108-
handleCookie(Pass);
109-
if (cookie.empty()) {
110-
return "您输入的 cookie 不可用";
99+
if (User.empty()) {
100+
return "路径不可为空";
101+
}
102+
if (!isFileExists(User)) {
103+
return "配置文件不存在";
104+
}
105+
ConfigData = ReadConfigFile(User);
106+
if (ConfigData.debug) {
107+
HostOpenConsole();
108+
}
109+
110+
return "配置文件读取成功,修改完配置文件后需要重启 PotPlayer 才能生效";
111+
}
112+
113+
bool isFileExists(string path) {
114+
return HostFileOpen(path) > 0;
115+
}
116+
117+
class Config {
118+
string fullConfig;
119+
string cookie;
120+
int uid = 0;
121+
bool danmakuEnable = true;
122+
string danmakuServer;
123+
string danmakuFont;
124+
float danmakuFontSize = 30.0;
125+
float danmakuOpacity = 0.8;
126+
float danmakuDisplayArea = 0.8;
127+
float danmakuStayTime = 15.0;
128+
bool showRecommendedVideos = true;
129+
bool debug = false;
130+
131+
string danmakuUrl;
132+
string subtitleUrl;
133+
};
134+
135+
Config ReadConfigFile(string file) {
136+
Config config;
137+
config.fullConfig = HostFileRead(HostFileOpen(file), 10000);
138+
JsonReader reader;
139+
JsonValue root;
140+
if (reader.parse(config.fullConfig, root) && root.isObject()) {
141+
if (root["cookie"].isString() && !root["cookie"].asString().empty()) {
142+
config.cookie = root["cookie"].asString();
143+
array<string> cookies = config.cookie.split(";");
144+
for (uint i=0; i < cookies.length(); i++) {
145+
if (cookies[i].find("DedeUserID=") >= 0) {
146+
ConfigData.uid = parseInt(cookies[i].split("=")[1]);
147+
break;
148+
}
149+
}
150+
}
151+
if (root["danmaku"].isObject()) {
152+
JsonValue danmaku = root["danmaku"];
153+
if (danmaku["enable"].isBool()) {
154+
config.danmakuEnable = danmaku["enable"].asBool();
155+
}
156+
if (danmaku["server"].isString() && !danmaku["server"].asString().empty()) {
157+
config.danmakuServer = danmaku["server"].asString();
158+
}
159+
if (danmaku["font"].isString()) {
160+
config.danmakuFont = danmaku["font"].asString();
161+
}
162+
if (danmaku["fontSize"].isNumeric()) {
163+
config.danmakuFontSize = danmaku["fontSize"].asFloat();
164+
}
165+
if (danmaku["opacity"].isNumeric()) {
166+
config.danmakuOpacity = danmaku["opacity"].asFloat();
167+
}
168+
if (danmaku["displayArea"].isNumeric()) {
169+
config.danmakuDisplayArea = danmaku["displayArea"].asFloat();
170+
}
171+
if (danmaku["stayTime"].isNumeric()) {
172+
config.danmakuStayTime = danmaku["stayTime"].asFloat();
173+
}
174+
}
175+
if (root["showRecommendedVideos"].isBool()) {
176+
config.showRecommendedVideos = root["showRecommendedVideos"].asBool();
177+
}
178+
if (root["debug"].isBool()) {
179+
config.debug = root["debug"].asBool();
180+
}
181+
if (!config.danmakuServer.empty()) {
182+
config.danmakuUrl = config.danmakuServer + "/subtitle?font=" + HostUrlEncode(config.danmakuFont) + "&font_size=" + config.danmakuFontSize + "&alpha=" + config.danmakuOpacity + "&display_area=" + config.danmakuDisplayArea + "&duration_marquee=" + config.danmakuStayTime + "&duration_still=" + config.danmakuStayTime + "&cid=";
183+
config.subtitleUrl = config.danmakuServer + "/subtitle?url=";
184+
}
111185
}
112-
return "cookie 设置成功";
186+
return config;
113187
}
114188

115189
uint status = 0;
@@ -135,22 +209,8 @@ string GetStatus()
135209
return info;
136210
}
137211

138-
void handleCookie(string full_cookie) {
139-
array<string> cookies = full_cookie.split(";");
140-
for (uint i=0; i < cookies.length(); i++) {
141-
int pos = cookies[i].find("SESSDATA");
142-
if (pos >= 0) {
143-
// cookie = cookies[i].substr(pos);
144-
cookie = full_cookie;
145-
}
146-
if (cookies[i].find("DedeUserID=") >= 0) {
147-
uid = parseInt(cookies[i].split("=")[1]);
148-
}
149-
}
150-
}
151-
152212
void log(string item) {
153-
if (!debug) {
213+
if (!ConfigData.debug) {
154214
return;
155215
}
156216
HostPrintUTF8(item);
@@ -167,8 +227,8 @@ void log(string item, int info) {
167227
string post(string url, string data="") {
168228
string UserAgent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36";
169229
string Headers = "Referer: https://www.bilibili.com\r\n";
170-
if (!cookie.empty()) {
171-
Headers += "Cookie: " + cookie + "\r\n";
230+
if (!ConfigData.cookie.empty()) {
231+
Headers += "Cookie: " + ConfigData.cookie + "\r\n";
172232
}
173233
log("request", url);
174234
return HostUrlGetStringWithAPI(url, UserAgent, Headers, data, true);
@@ -270,7 +330,7 @@ array<dictionary> VideoPages(string id) {
270330
}
271331
}
272332
}
273-
if (videos.length() >= 2 || !enable_related) {
333+
if (videos.length() >= 2 || !ConfigData.showRecommendedVideos) {
274334
return videos;
275335
}
276336
res = apiPost("/x/web-interface/archive/related?bvid=" + bvid);
@@ -361,10 +421,10 @@ string Video(string bvid, const string &in path, dictionary &MetaData, array<dic
361421
ispgc = true;
362422
}
363423
MetaData["webUrl"] = makeWebUrl(webUrl);
364-
if (enable_subtitle) {
424+
if (ConfigData.danmakuEnable) {
365425
dictionary dic;
366426
dic["name"] = "【弹幕】" + title;
367-
dic["url"] = danmaku_url + cid;
427+
dic["url"] = ConfigData.danmakuUrl + cid;
368428
subtitle.insertLast(dic);
369429
}
370430
} else {
@@ -379,7 +439,7 @@ string Video(string bvid, const string &in path, dictionary &MetaData, array<dic
379439
if (reader.parse(res, root) && root.isObject()) {
380440
if (root["code"].asInt() == 0) {
381441
JsonValue data = root["data"];
382-
if (enable_subtitle) {
442+
if (ConfigData.danmakuEnable) {
383443
JsonValue subs;
384444
subs = root["data"]["subtitle"]["subtitles"];
385445
if (subs.isArray()) {
@@ -388,9 +448,9 @@ string Video(string bvid, const string &in path, dictionary &MetaData, array<dic
388448
dictionary dic;
389449
dic["name"] = "【字幕】" + sub["lan_doc"].asString();
390450
if (sub["subtitle_url"].asString().find("http") == 0) {
391-
dic["url"] = subtitle_url + sub["subtitle_url"].asString();
451+
dic["url"] = ConfigData.subtitleUrl + sub["subtitle_url"].asString();
392452
} else {
393-
dic["url"] = subtitle_url + "http:" + sub["subtitle_url"].asString();
453+
dic["url"] = ConfigData.subtitleUrl + "http:" + sub["subtitle_url"].asString();
394454
}
395455
subtitle.insertLast(dic);
396456
}
@@ -464,7 +524,7 @@ string Video(string bvid, const string &in path, dictionary &MetaData, array<dic
464524

465525
if (data["dash"].isObject()) {
466526
JsonValue videos = data["dash"]["video"];
467-
if (enable_qualities && @QualityList !is null) {
527+
if (@QualityList !is null) {
468528
for (int i = 0; i < videos.size(); i++) {
469529
int quality = videos[i]["id"].asInt();
470530
dictionary qualityitem;
@@ -490,7 +550,7 @@ string Video(string bvid, const string &in path, dictionary &MetaData, array<dic
490550
QualityList.insertLast(flacqualityitem);
491551
}
492552
JsonValue audios = data["dash"]["audio"];
493-
if (enable_qualities && @QualityList !is null) {
553+
if (@QualityList !is null) {
494554
for (int i = 0; i < audios.size(); i++) {
495555
string audioquality;
496556
audioquality = formatFloat(audios[i]["bandwidth"].asInt() / 1000.0, "", 0, 1) + "K";
@@ -510,7 +570,7 @@ string Video(string bvid, const string &in path, dictionary &MetaData, array<dic
510570
dictionary qualityitem;
511571
int codecid = data["video_codecid"].asInt();
512572
JsonValue qualities = data["accept_quality"];
513-
if (enable_qualities && @QualityList !is null) {
573+
if (@QualityList !is null) {
514574
for (uint i = 0; i < qualities.size(); i++) {
515575
int quality = qualities[i].asInt();
516576
dictionary qualityitem;
@@ -568,13 +628,12 @@ string Video(string bvid, const string &in path, dictionary &MetaData, array<dic
568628
}
569629
}
570630
if (!title.empty()) {
571-
log("标题", title);
631+
log("title", title);
572632
}
573-
log("AID", aid);
574-
log("BVID", bvid);
575-
log("CID", cid);
576-
log("URL", url);
577-
log("");
633+
log("aid", aid);
634+
log("bvid", bvid);
635+
log("cid", cid);
636+
log("url", url);
578637

579638
return url;
580639
}
@@ -881,7 +940,7 @@ array<dictionary> FavList(string path) {
881940
if (fid.empty()) {
882941
string mid = HostRegExpParse(path, "bilibili.com/([0-9]+)");
883942
if (mid.empty()) {
884-
mid = "" + uid;
943+
mid = "" + ConfigData.uid;
885944
}
886945
string res = apiPost("/x/v3/fav/folder/created/list-all?up_mid=" + mid);
887946
if (res.empty()) {
@@ -1542,7 +1601,7 @@ string Live(string id, const string &in path, dictionary &MetaData, array<dictio
15421601
if (data.isArray()) {
15431602
url = data[0]["url"].asString();
15441603
JsonValue qualities = Root["data"]["quality_description"];
1545-
if (enable_qualities && @QualityList !is null) {
1604+
if (@QualityList !is null) {
15461605
for (int i = 0; i < qualities.size(); i++) {
15471606
int quality = qualities[i]["qn"].asInt();
15481607
dictionary qualityitem;

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
[下载项目](https://github.com/chen310/BilibiliPotPlayer/archive/refs/heads/master.zip)
88

9-
将项目 `Media/PlayParse` 路径下的 `MediaPlayParse - Bilibili.as``MediaPlayParse - Bilibili.ico` 两个文件复制到 `{PotPlayer 安装路径}\Extension\Media\PlayParse` 文件夹下。
9+
将项目 `Media/PlayParse` 路径下的 `MediaPlayParse - Bilibili.as``MediaPlayParse - Bilibili.ico` `Bilibili_Config.json` 三个文件复制到 `{PotPlayer 安装路径}\Extension\Media\PlayParse` 文件夹下。
1010

1111
`MediaPlayParse - Bilibili.as` 提供了解析 `Bilibili` 链接的功能。
1212

@@ -18,7 +18,7 @@
1818

1919
## 登录
2020

21-
打开 PotPlayer,按 <kbd>F5</kbd> 打开选项,点击`扩展功能`下的`媒体播放列表/项目`,再点击 `Bilibili`,然后打开`账户设置``Cookie` 一栏粘贴你的 Bilibili Cookie
21+
找到刚刚复制过去的配置文件 `Bilibili_Config.json`,填写 Cookie 等设置内容。 打开 PotPlayer,按 <kbd>F5</kbd> 打开选项,点击`扩展功能`下的`媒体播放列表/项目`,再点击 `Bilibili`,然后打开`账户设置`填写配置文件路径,如 `D:\DAUM\PotPlayer\Extension\Media\PlayParse\Bilibili_Config.json`。每次修改完配置文件,可能都要重启 PotPlayer 才能生效
2222

2323
![Login](https://cdn.jsdelivr.net/gh/chen310/BilibiliPotPlayer/public/login.png)
2424

public/login.png

-6.71 KB
Loading

0 commit comments

Comments
 (0)