22
22
// bool PlaylistCheck(const string &in) -> check playlist
23
23
// array<dictionary> PlaylistParse(const string &in) -> parse playlist
24
24
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 ;
37
26
38
27
void OnInitialize() {
39
28
HostSetUrlHeaderHTTP(" bilivideo.com" , " Referer: https://www.bilibili.com\r\n " );
40
29
HostSetUrlHeaderHTTP(" bilivideo.cn" , " Referer: https://www.bilibili.com\r\n " );
41
30
HostSetUrlHeaderHTTP(" bilibili.com" , " Referer: https://www.bilibili.com\r\n " );
42
- if (debug) {
43
- HostOpenConsole();
44
- }
45
31
}
46
32
47
33
string host = " https://api.bilibili.com" ;
@@ -61,27 +47,33 @@ string GetDesc() {
61
47
62
48
string GetLoginTitle()
63
49
{
64
- return " 请输入Bilibili Cookie " ;
50
+ return " 请输入配置文件所在位置 " ;
65
51
}
66
52
67
53
string GetLoginDesc()
68
54
{
69
- return " 请输入Bilibili Cookie " ;
55
+ return " 请输入配置文件所在位置 " ;
70
56
}
71
57
72
58
string GetUserText()
73
59
{
74
- return " 这里放空 " ;
60
+ return " 配置文件路径 " ;
75
61
}
76
62
77
63
string GetPasswordText()
78
64
{
79
- return " Cookie: " ;
65
+ return " " ;
80
66
}
81
67
82
68
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" ;
85
77
}
86
78
string info = " " ;
87
79
JsonReader reader ;
@@ -104,12 +96,94 @@ string ServerCheck(string User, string Pass) {
104
96
105
97
string ServerLogin(string User, string Pass)
106
98
{
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
+ }
111
185
}
112
- return " cookie 设置成功 " ;
186
+ return config ;
113
187
}
114
188
115
189
uint status = 0 ;
@@ -135,22 +209,8 @@ string GetStatus()
135
209
return info ;
136
210
}
137
211
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
-
152
212
void log(string item) {
153
- if (! debug) {
213
+ if (! ConfigData . debug ) {
154
214
return ;
155
215
}
156
216
HostPrintUTF8(item);
@@ -167,8 +227,8 @@ void log(string item, int info) {
167
227
string post(string url, string data = " " ) {
168
228
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" ;
169
229
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 " ;
172
232
}
173
233
log(" request" , url);
174
234
return HostUrlGetStringWithAPI(url, UserAgent, Headers, data, true );
@@ -270,7 +330,7 @@ array<dictionary> VideoPages(string id) {
270
330
}
271
331
}
272
332
}
273
- if (videos.length() > = 2 || ! enable_related ) {
333
+ if (videos.length() > = 2 || ! ConfigData .showRecommendedVideos ) {
274
334
return videos ;
275
335
}
276
336
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
361
421
ispgc = true ;
362
422
}
363
423
MetaData[" webUrl" ] = makeWebUrl(webUrl);
364
- if (enable_subtitle ) {
424
+ if (ConfigData .danmakuEnable ) {
365
425
dictionary dic ;
366
426
dic[" name" ] = " 【弹幕】" + title;
367
- dic[" url" ] = danmaku_url + cid;
427
+ dic[" url" ] = ConfigData .danmakuUrl + cid;
368
428
subtitle.insertLast(dic);
369
429
}
370
430
} else {
@@ -379,7 +439,7 @@ string Video(string bvid, const string &in path, dictionary &MetaData, array<dic
379
439
if (reader.parse(res, root) && root.isObject()) {
380
440
if (root[" code" ].asInt() == 0 ) {
381
441
JsonValue data = root[" data" ];
382
- if (enable_subtitle ) {
442
+ if (ConfigData .danmakuEnable ) {
383
443
JsonValue subs ;
384
444
subs = root[" data" ][" subtitle" ][" subtitles" ];
385
445
if (subs.isArray()) {
@@ -388,9 +448,9 @@ string Video(string bvid, const string &in path, dictionary &MetaData, array<dic
388
448
dictionary dic ;
389
449
dic[" name" ] = " 【字幕】" + sub[" lan_doc" ].asString();
390
450
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();
392
452
} else {
393
- dic[" url" ] = subtitle_url + " http:" + sub[" subtitle_url" ].asString();
453
+ dic[" url" ] = ConfigData .subtitleUrl + " http:" + sub[" subtitle_url" ].asString();
394
454
}
395
455
subtitle.insertLast(dic);
396
456
}
@@ -464,7 +524,7 @@ string Video(string bvid, const string &in path, dictionary &MetaData, array<dic
464
524
465
525
if (data[" dash" ].isObject()) {
466
526
JsonValue videos = data[" dash" ][" video" ];
467
- if (enable_qualities && @ QualityList ! is null ) {
527
+ if (@ QualityList ! is null ) {
468
528
for (int i = 0 ; i < videos.size(); i++ ) {
469
529
int quality = videos[i][" id" ].asInt();
470
530
dictionary qualityitem ;
@@ -490,7 +550,7 @@ string Video(string bvid, const string &in path, dictionary &MetaData, array<dic
490
550
QualityList.insertLast(flacqualityitem);
491
551
}
492
552
JsonValue audios = data[" dash" ][" audio" ];
493
- if (enable_qualities && @ QualityList ! is null ) {
553
+ if (@ QualityList ! is null ) {
494
554
for (int i = 0 ; i < audios.size(); i++ ) {
495
555
string audioquality ;
496
556
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
510
570
dictionary qualityitem ;
511
571
int codecid = data[" video_codecid" ].asInt();
512
572
JsonValue qualities = data[" accept_quality" ];
513
- if (enable_qualities && @ QualityList ! is null ) {
573
+ if (@ QualityList ! is null ) {
514
574
for (uint i = 0 ; i < qualities.size(); i++ ) {
515
575
int quality = qualities[i].asInt();
516
576
dictionary qualityitem ;
@@ -568,13 +628,12 @@ string Video(string bvid, const string &in path, dictionary &MetaData, array<dic
568
628
}
569
629
}
570
630
if (! title.empty()) {
571
- log(" 标题 " , title);
631
+ log(" title " , title);
572
632
}
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);
578
637
579
638
return url ;
580
639
}
@@ -881,7 +940,7 @@ array<dictionary> FavList(string path) {
881
940
if (fid.empty()) {
882
941
string mid = HostRegExpParse(path, " bilibili.com/([0-9]+)" );
883
942
if (mid.empty()) {
884
- mid = " " + uid;
943
+ mid = " " + ConfigData . uid ;
885
944
}
886
945
string res = apiPost(" /x/v3/fav/folder/created/list-all?up_mid=" + mid);
887
946
if (res.empty()) {
@@ -1542,7 +1601,7 @@ string Live(string id, const string &in path, dictionary &MetaData, array<dictio
1542
1601
if (data.isArray()) {
1543
1602
url = data[0 ][" url" ].asString();
1544
1603
JsonValue qualities = Root[" data" ][" quality_description" ];
1545
- if (enable_qualities && @ QualityList ! is null ) {
1604
+ if (@ QualityList ! is null ) {
1546
1605
for (int i = 0 ; i < qualities.size(); i++ ) {
1547
1606
int quality = qualities[i][" qn" ].asInt();
1548
1607
dictionary qualityitem ;
0 commit comments