forked from NightlyFantasy/Bili_Fix_Player
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbili_fix_player.user.js
708 lines (669 loc) · 34.5 KB
/
bili_fix_player.user.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
// ==UserScript==
// @name bili_fix_player
// @namespace bili
// @description 修复B站播放器,黑科技,列表页、搜索页弹窗,破乐视限制,提供高清、低清晰源下载,弹幕下载
// @include http://www.bilibili.com/video/*
// @include http://www.bilibili.com/search/*
// @include http://www.bilibili.com/sp/*
// @note jiayiming 自用修改
// @note 2014.08.05 添加专题番剧弹窗的支持,同时支持翻页。
// @version 3.6.5
// @require http://static.hdslb.com/js/jquery.min.js
// @grant GM_xmlhttpRequest
// @grant GM_getValue
// @grant GM_setValue
// @grant GM_addStyle
// @grant unsafeWindow
// @author 绯色
// ==/UserScript==
/**
出现无法播放情况先关闭自动修复
2014-08-01弹窗网页全屏在田生大神帮助下完美解决(chrome无解),同时博主修复视频播放页面的网页全屏
2014-07-26弹窗因为本人技术问题无法完美解决,使用embed标签替换,可以网页全屏,但是关闭弹窗后会导致鼠标滚轮无效使用iframe标签无滚轮bug,但是因为跨域了,导致无法网页全屏
2014-07-23修复多数BUG
2014-07-20修复小BUG,增加评论区移除和谐娘功能 当出现[此楼层已被用户隐藏 点击查看]时,自动展开,需要到脚本设置页面设置
2014-07-13你造吗?您可以使用一个海外的代理并将http://interface.bilibili.com/playurl?*作为代理规则加入到代理列表中j即可弹窗播放爱奇艺视频(来自田生大神)
修复弹窗播放时,点击B站FLASH播放器后,若直接点击关闭弹窗,会造成鼠标滚轮无效的问题
修复360浏览器在脚本设置的时候,被视频君挡住无法设置的问题,方案是(设置的时候先让视频君去火星,设置后再放回来)
2014-06-30按照田生大神建议,增加与其脚本匹配id,在弹窗标题增加打开播放页面的按钮,补充,发现BUG,在弹窗播放时,点击B站FLASH播放器后,若直接点击关闭弹窗,会造成鼠标滚轮无效的问题,这BUG作者暂时无修复方法
并且使用了田生大神分支里面的弹窗播放器支持网页全屏功能,感谢
2014-06-21修复搜索页面因为作者正则匹配错误(B站把域名换成com但在a标签还是tv域名,坑爹)的问题
2014-06-18修复B站更换域名的BUG,在田生大神的建议下,将所有api域名换成com,弹窗播放器增加收藏按钮
2014-06-08修复小部分bug(样式冲突、弹窗冲突)
2014-06-03增强弹窗播放器,[拖动窗口标题可移动播放器,拖动右下角可改变播放器大小,设置后自动保存宽高和位置]
2014-05-25感谢吧友lzgptdgj提供BUG,在小型播放器下,屏蔽规则会无效的问题,已经修复
2014-05-14增加首页弹窗播放,基本实现全站可弹窗(首页新番专题列表除外等)
2014-05-13增加搜索页面的弹窗播放,并且支持多P和显示当前P,增加模糊画质下载按钮
2014-05-11还是基佬要求,增加弹窗播放器分P效果,增加弹幕下载功能,在吧友大神田生的建议下,正则表达式加强匹配
2014-05-10收益于自己的B站追番计划(http://v.myacg.ga或者http://weiyun.jd-app.com),代码逻辑重构(不再区分视频源再解析视频),并重写UI
2014-05-10受诸多基佬要求,增加除首页外其他分类页面的弹窗播放(初衷是为了弹窗乐视源)
2014-03-28增加下载视频按钮
2014-01-23替换优酷、爱奇艺、搜狐为B站播放器
2013-12-14修复B站播放器无法在火狐魔镜弹窗播放
------------以下信息提供给开发者-----------
//https://static-s.bilibili.tv/play.swf---新版播放器
//http://static.hdslb.com/play.swf---旧版播放器
//https://static-s.bilibili.tv/play_old.swf---考古级别播放器
//使用https连接的播放器可以获得屏蔽列表
-------------------------------------------
*/
(function() {
//初始化 init
if (GM_getValue('auto') == undefined) GM_setValue('auto', 1);
if (GM_getValue('player_size') == undefined) GM_setValue('player_size', 1);
if (GM_getValue('pagebox_display')== undefined) GM_setValue('pagebox_display', 0);
if (GM_getValue('pagebox_harm')== undefined) GM_setValue('pagebox_harm', 0);
//if (GM_getValue('player_container')== undefined) GM_setValue('player_container', 1);//弹窗播放器的标签容器(iframe/embed)已经完美解决
//初始化播放器宽高
if (GM_getValue('player_width') == undefined) GM_setValue('player_width', 950);
if (GM_getValue('player_height') == undefined) GM_setValue('player_height', 482);
//初始化播放器外框位置
//if (GM_getValue('div_top') == undefined) GM_setValue('div_top', 100);//设置垂直位置的时候,如果是长页而且是浮动播放器时候记录位置,会导致播放器不知所踪
if (GM_getValue('div_left') == undefined) GM_setValue('div_left', 100);
//初始化jquery支持
//var $ = unsafeWindow.$;
/**
-------------------------------用户界面GUI View-------------------------------------
*/
//函数,插入可视化操作视图
function insert_html(type) {
var auto = GM_getValue('auto') ? '已打开' : '已关闭';
var player_size = GM_getValue('player_size') ? '大型' : '小型';
var display=GM_getValue('pagebox_display') ? '悬浮' : '默认';
var harm=GM_getValue('pagebox_harm') ? '和谐娘打酱油中' : '默认[和谐娘和谐中]';
//var container=GM_getValue('player_container')?'iframe[无滚动条bug]':'embed[无拖放bug]';
var div = '<a style="color:red" id="bili-fix-player-installed">脚本(`・ω・´)</a>\
<ul class="i_num" id="bili_fix_script">\
<li><a class="font">遇到播放错误请关闭自动修复后刷新页面</a><a target="_blank" href="http://bilili.ml/361.html">BUG反馈</a></li>\
<li><a>本页视频源:<b style="color:#F489AD">' + type + '</b></a></li>\
<li><a class="font">高清视频下载HD(右键复制以下视频分段下载链接,然后在新标签粘贴打开即可不被403)</a><div class="m_num" id="av_source">\
</div></li>\
<li><a class="font" target="_blank" id="aid_down_av">模糊画质视频下载(单文件)</a></li>\
<li><a id="down_cid_xml" target="_blank">弹幕下载</a></li>\
<li><a>自动修复(修改后请刷新页面):<a id="bili_fix" class="bfpbtn">' + auto + '</a></a></li>\
<li><a class="font">播放器大小(小型在火狐弹窗无BUG):<a id="player_size" class="bfpbtn">' + player_size + '</a></a></li>\
<li><a>评论区分页导航:<a id="pagebox-display" class="bfpbtn">' + display + '</a></a></li>\
<li><a>评论区和谐娘:<a id="pagebox-harm" class="bfpbtn">' + harm + '</a></a></li>\
<li><a id="bili_set_status">就绪中→_→</a></li>\
</ul>\
<span class="addnew_5">+10086</span>';
$('div.num:nth-child(4) > ul:nth-child(1) > li:nth-child(1)').html(div);
//监听修复按钮
var bfpbtn = document.querySelector("#bili_fix");
bfpbtn.addEventListener("click", set_auto, false);
//监听播放器大小按钮
var bfpbtn = document.querySelector("#player_size");
bfpbtn.addEventListener("click", set_player, false);
//监听评论分页功能显示切换
var bfpbtn = document.querySelector("#pagebox-display");
bfpbtn.addEventListener("click", change_pagebox_display, false);
//监听评论和谐娘功能切换
var bfpbtn = document.querySelector("#pagebox-harm");
bfpbtn.addEventListener("click", change_pagebox_harm, false);
}
//函数,插入下载按钮
function insert_download_button(url, count) {
$('#av_source').append('<a href="' + url + '" target="blank">分段【' + count + '】</a>');
}
//设置参数
//修复按钮事件
function set_auto() {
GM_getValue('auto') ? GM_setValue('auto', 0) : GM_setValue('auto', 1);
var s = GM_getValue('auto') ? '已打开' : '已关闭';
document.getElementById('bili_fix').innerHTML = s;
$("#bili_fix").toggleClass("active");
$('#bili_set_status').html('<a class="bfpbtn notice font">已更改,刷新生效_(:3」∠)_</a>');
}
//播放器大小按钮事件
function set_player() {
GM_getValue('player_size') ? GM_setValue('player_size', 0) : GM_setValue('player_size', 1);
var s = GM_getValue('player_size') ? '大型' : '小型';
document.getElementById('player_size').innerHTML = s;
$("#player_size").toggleClass("active");
$('#bili_set_status').html('<a class="bfpbtn active font">已更改,刷新生效_(:3」∠)_</a>');
}
//函数 评论分页功能显示切换(悬浮、原来位置)
function change_pagebox_display(){
GM_getValue('pagebox_display') ? GM_setValue('pagebox_display', 0) : GM_setValue('pagebox_display', 1);
var s = GM_getValue('pagebox_display') ? '悬浮' : '默认';
document.getElementById('pagebox-display').innerHTML = s;
$("#pagebox-display").toggleClass("active");
$('#bili_set_status').html('<a class="bfpbtn notice font">已更改,刷新生效_(:3」∠)_</a>');
}
//函数 评论和谐娘功能切换
function change_pagebox_harm(){
GM_getValue('pagebox_harm') ? GM_setValue('pagebox_harm', 0) : GM_setValue('pagebox_harm', 1);
var s = GM_getValue('pagebox_harm') ? '和谐娘打酱油中' : '默认[和谐娘和谐中]';
document.getElementById('pagebox-harm').innerHTML = s;
$("#pagebox-harm").toggleClass("active");
$('#bili_set_status').html('<a class="bfpbtn notice font">已更改,刷新生效_(:3」∠)_</a>');
}
/**
-------------------------------函数 Model-------------------------------------
*/
//函数,替换播放器
function Replace_player(aid, cid) {
if (GM_getValue('auto') == '1') {
if (GM_getValue('player_size') == '1') {
document.getElementById('bofqi').innerHTML = '<embed id="bofqi_embed" class="player" allowfullscreeninteractive="true" pluginspage="http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash" allowscriptaccess="always" rel="noreferrer" flashvars="cid=' + cid + '&aid=' + aid + '" src="https://static-s.bilibili.com/play.swf" type="application/x-shockwave-flash" allowfullscreen="true" quality="high" wmode="window">';
//document.getElementById('bofqi').innerHTML = '<iframe class="player" src="https://secure.bilibili.com/secure,cid=' + cid + '&aid=' + aid + '" scrolling="no" border="0" framespacing="0" onload="window.securePlayerFrameLoaded=true" frameborder="no" height="482" width="950"></iframe><img src="https://secure.bilibili.com/images/grey.gif" id="img_ErrCheck" style="display:none"><script type="text/javascript" src="http://static.hdslb.com/js/page.player_error.js"></script> ';
} else {
document.getElementById('bofqi').innerHTML = '<embed id="bofqi_embed" class="player" allowfullscreeninteractive="true" pluginspage="http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash" allowscriptaccess="always" rel="noreferrer" flashvars="cid=' + cid + '&aid=' + aid + '" src="https://static-s.bilibili.com/play.swf" type="application/x-shockwave-flash" allowfullscreen="true" quality="high" wmode="window" style="width:100%;height:100%">';
$('#bofqi').css({width:"960px",height:"520px"});
}
}
}
//api获取cid
function api_get_cid(aid, page) {
var url = 'http://api.bilibili.com/view?type=json&appkey=0a99fa1d87fdd38c&batch=1&id=' + aid;
GM_xmlhttpRequest({
method: 'GET',
url: url,
synchronous: false,
onload: function(responseDetails) {
if (responseDetails.status == 200) {
var Content = eval('(' + responseDetails.responseText + ')');
var list = Content.list;
var p = page - 1;
if (list != undefined) {
var lp = (list[p] == undefined) ? list[0] : list[p]; //针对某些aid只有一个cid但是有分P的情况
//console.log(lp);
var cid = lp.cid;
var type = lp.type;
insert_html(type); //UI
//修复360浏览器flash霸占脚本设置区域
$("#bili_fix_script,#bili-fix-player-installed").mouseover(function(){
$("#bofqi,#bofqi_embed").addClass("hide");
});
$("#bili_fix_script,#bili-fix-player-installed").mouseout(function(){
$("#bofqi,#bofqi_embed").removeClass("hide");
});
var cid_xml_url = 'http://comment.bilibili.com/' + cid + '.xml';
$('#down_cid_xml').attr('href', cid_xml_url); //弹幕下载
Replace_player(aid, cid); //替换播放器
cid_get_videodown_hd(cid); //获取高清下载链接
aid_down_av(aid, page); //av画质下载(单文件)
} else {
window_player_init(); //执行弹窗函数
}
}
}
});
}
//播放器支持页面全屏 来自田生
function fix_player_fullwin() {
setTimeout(function () {
// 代码来自 http://static.hdslb.com/js/page.arc.js 为了兼容性目的添加了 .tv 相关域名
location.href = ['javascript: void(function () {var c;',
'window.postMessage?(c=function(a){"https://secure.bilibili.com"!=a.origin',
'&&"https://secure.bilibili.tv"!=a.origin&&"https://ssl.bilibili.com"!=a.origin',
'&&"https://ssl.bilibili.tv"!=a.origin||"secJS:"!=a.data.substr(0,6)',
'||eval(a.data.substr(6));',
'"undefined"!=typeof console&&console.log(a.origin+": "+a.data)},',
'window.addEventListener?window.addEventListener("message",c,!1):',
'window.attachEvent&&window.attachEvent("onmessage",c)):',
'setInterval(function(){if(evalCode=__GetCookie("__secureJS"))',
'{__SetCookie("__secureJS",""),eval(evalCode)}},1000);',
'}());'].join('');
}, 0);
setTimeout(function () {
location.href = 'javascript:void(' + function () {
player_fullwin = function (is_full) {
$('#window-player,#bofqi,#bofqi_embed').css({
'position': is_full ? 'fixed' : 'static'
});
$('.z, .header, .z_top, .footer').css({
'display': is_full ? 'none' : 'block'
});
}
} + '());';
}, 0);
};
//在新番页面,通过弹窗,获取aid,cid然后进行播放
function aid_build_player(aid) {
var url = 'http://api.bilibili.com/view?type=json&appkey=0a99fa1d87fdd38c&batch=1&id=' + aid;
GM_xmlhttpRequest({
method: 'GET',
url: url,
synchronous: false,
onload: function(responseDetails) {
if (responseDetails.status == 200) {
var Content = eval('(' + responseDetails.responseText + ')');
var list = Content.list;
//默认播放第一个分P-------------------
var p = 0;
var lp = (list[p] == undefined) ? list[0] : list[p];
//console.log(lp);
var cid = lp.cid;
$('#player_content').html(window_player(aid, cid));
//分P列表和播放器------------------------------
for (var i in list) {
//console.log(list[i]);
var cid = list[i].cid;
var p = parseInt(i) + 1;
$('#window_play_list').append('<li class="single_play_list" data-field="aid=' + aid + '&cid=' + cid + '"><a href="javascript:void(0);" style="color:#00A6D8;" >' + p + 'P</a></li>');
}
if (!unsafeWindow.player_fullwin) setTimeout(fix_player_fullwin, 0);
//弹窗的分P播放
$('.single_play_list').click(
function() {
$('#window_play_info').html('正在播放第<span style="color:#F0CF1D">' + $(this).find('a').html() + '</span>');
var info = $(this).attr('data-field');
var pattern = /aid=(\d+)&cid=(\d+)/ig;
var val = pattern.exec(info);
var aid = val === null ? '' : val[1];
var cid = val === null ? '' : val[2];
// console.log(aid,cid);
setTimeout(function() {
$('#player_content').html(window_player(aid, cid));
},0);
});
}
}
});
}
//弹窗播放器
function window_player(aid, cid) {
var width = GM_getValue('player_width');
var height = GM_getValue('player_height');
return '<iframe id="window-player" class="player" src="https://secure.bilibili.com/secure,cid=' + cid + '&aid=' + aid + '" scrolling="no" border="0" framespacing="0" onload="window.securePlayerFrameLoaded=true" frameborder="no" height="' + height + '" width="' + width + '"></iframe> ';//
}
//cid获取高清视频链接
function cid_get_videodown_hd(cid) {
var url = 'http://interface.bilibili.com/playurl?appkey=0a99fa1d87fdd38c&platform=android&quality=2&cid=' + cid;
GM_xmlhttpRequest({
method: 'GET',
url: url,
synchronous: false,
onload: function(responseDetails) {
if (responseDetails.status == 200) {
var pattern = /<\/(?:(?:chunk)?size|length)>[\s\n]*?<url><\!\[CDATA\[(.*?)\]\]><\/url>/ig;
var c = 1;
while (content = pattern.exec(responseDetails.responseText)) {
var url = content ? (content[1]) : 'http://interface.bilibili.cn/playurl?appkey=0a99fa1d87fdd38c&platform=android&quality=2&cid=' + cid;
insert_download_button(url, c);
c++;
}
}
}
});
}
//低画质视频下载(单文件)
function aid_down_av(aid, page) {
var url = 'http://www.bilibili.com/m/html5?aid=' + aid + '&page=' + page;
GM_xmlhttpRequest({
method: 'GET',
url: url,
synchronous: false,
onload: function(responseDetails) {
if (responseDetails.status == 200) {
var Content = eval('(' + responseDetails.responseText + ')');
var downlink = Content.src;
$('#aid_down_av').attr('href', downlink);
}
}
});
}
/**
-------------------------------控制 Control-------------------------------------
*/
function window_player_init() {
//弹窗------------------------------
//新番列表弹窗UI
$('.vd_list .title').each(
function() {
var href = $(this).attr('href');
var pattern = /\/video\/av(\d+)\//ig;
var content = pattern.exec(href);
var aid = content ? (content[1]) : '';
$(this).prepend('<a class="single_player" href="javascript:void(0);" style="color:red;" data-field="' + aid + '">弹▶</a>');
});
//搜索列表弹窗UI
$('.result li .r a').each(
function() {
var href = $(this).attr('href');
var pattern = /\/video\/av(\d+)\//ig;
var content = pattern.exec(href);
var aid = content ? (content[1]) : '';
if (aid != '') {
$(this).find('.t').prepend('<a class="single_player" href="javascript:void(0);" style="color:red;" data-field="' + aid + '">弹▶</a>');
}
});
//带缩略图弹窗UI、和侧栏新投稿弹窗UI、首页的推荐栏弹窗、侧栏列表弹窗UI
$('.video li a,.z-r.new li a,#suggest li a,.rlist li a').each(
function() {
var href = $(this).attr('href');
var pattern = /\/video\/av(\d+)\//ig;
var content = pattern.exec(href);
var aid = content ? (content[1]) : '';
$(this).find('.t').prepend('<a class="single_player" href="javascript:void(0);" style="color:red;" data-field="' + aid + '">弹▶</a>');
});
//弹窗默认的第一P,建立弹窗播放器并建立分P列表===click事件应该在each事件之后执行
function single_player_ini() {
$('.single_player').click(
function() {
//$('.dialogcontainter').remove();//防止同时播放两个视频
$('#player-list').remove(); //移除播放列表
var a = '<p id="window_play_title">脚本(`・ω・´)正在加载中</p><div id="player_content">脚本(`・ω・´)播放器正在努力加载中....</div>';
var list_html = '<div id="player-list"><div class="sort"><i>分P列表</i></div><ul id="window_play_list"></ul></div>';
var title = $(this).parent('.t').html() === null ? $(this).parent('.title').html() : $(this).parent('.t').html();
var aid = $(this).attr('data-field');
var title_html = '<a class="mark_my_video" href="javascript:void(0);" style="color:#006766;" data-field="' + aid + '">收藏★</a> <a href="http://www.bilibili.com/video/av' + aid + '/" style="color:#D54851" target="_blank">打开播放页</a> <span style="color:#8C8983">' + title.replace('弹▶', '') + '</span> ▶<span id="window_play_info"></span>';
setTimeout(function() {
creat(title_html, a); //创建可视化窗口
$('.dialogcontainter').after(list_html);
$('#window_play_info').html('正在播放第<span style="color:#F0CF1D">1P</span>');
$('#window_play_title').html('<p><a id="div_positon_button" class="button-small button-flat-action" style="background: none repeat scroll 0% 0% #E54C7E;">固定播放器</a><a id="list_control_button" class="button-small button-flat-action" style="background: none repeat scroll 0% 0% #0CB3EE;">收缩分P列表[在左边]</a>[拖动标题可移动播放器,拖动右下角可改变播放器大小,设置后自动保存宽高和位置]</p>');
//切换分P按钮
$('#list_control_button').click(function() {
var flag = $("#player-list").css("display");
if (flag == "none") {
$("#player-list").show();
$('#list_control_button').html('收缩分P列表');
$('#list_control_button').css('background', 'none repeat scroll 0% 0% #0CB3EE');
} else {
$("#player-list").hide();
$('#list_control_button').html('显示分P列表');
$('#list_control_button').css('background', 'none repeat scroll 0% 0% #FF2C14');
}
});
//固定播放器按钮
$('#div_positon_button').click(function() {
var p = $('.dialogcontainter').css('position');
if (p == "fixed") {
$('.dialogcontainter').css('position', 'absolute');
$('#player-list').css('position', 'absolute');
$('#div_positon_button').html('浮动播放器');
$('#div_positon_button').css('background', 'none repeat scroll 0% 0% #FECD3E');
} else {
$('.dialogcontainter').css('position', 'fixed');
$('#player-list').css('position', 'fixed');
$('#div_positon_button').html('固定播放器');
$('#div_positon_button').css('background', 'none repeat scroll 0% 0% #E54C7E');
}
});
//弹窗播放器收藏功能
$('.mark_my_video').click(function() {
var aid = $(this).attr('data-field');
$.ajax({
type: 'POST',
url: 'http://www.bilibili.com/m/stow',
data: 'dopost=save&aid=' + aid + '&stow_target=stow&ajax=1',
success: function(r) {
//$('#edit_status_bar').html(r);
alert('收藏成功');
},
error: function(r) {
alert('出错,请重试!');
},
dataType: 'text'
});
});
}, 0);
setTimeout(function() {
aid_build_player(aid);
}, 0);
});
}
single_player_ini();
//专题列表弹窗UI
function sp_check(doc) {
$('.bgm_list li a').each(
function() {
var href = $(this).attr('href');
var pattern = /\/video\/av(\d+)\//ig;
var content = pattern.exec(href);
var aid = content ? (content[1]) : '';
var ref = $(this).find('.t');
if (aid != '' && ref.children("a").length == 0) {
ref.prepend('<a class="single_player" href="javascript:void(0);" style="color:red;" data-field="' + aid + '">弹▶</a>');
}
});
single_player_ini();
}
//初始化专题列表
sp_check();
//添加页面XHR局部刷新的支持
function addMutationObserver(selector, callback) {
var watch = document.querySelector(selector);
if (!watch) return;
var observer = new MutationObserver(function(mutations){
var nodeAdded = mutations.some(function(x){ console.log(x.addedNodes.length); return x.addedNodes.length > 3; });
if (nodeAdded) {
callback();
}
});
observer.observe(watch, {childList: true, subtree: true });
}
//监视SP专题番剧列表
addMutationObserver('.bgm_list', function(){
console.log('元素被添加')
sp_check();
});
}
//END弹窗------------------------------
//替换播放器----------------------------
//取出aid和分P
var url = document.location.href;
var aid_reg = /\/av(\d+)\/(?:index_(\d+)\.html)?/ig;
var aid_array = aid_reg.exec(url);
var aid = aid_array === null ? '' : aid_array[1]; //aid
var page = aid_array === null ? '1' : typeof(aid_array[2]) == 'undefined' ? '1' : aid_array[2]; //分p
//播放器的html
var content; //本脚本使用了很多content变量,其中cid_get_videodown函数的while循环content变量全局,如果此处未定义content,火狐会报权限问题
api_get_cid(aid, page); //按照aid和分p获取cid并且替换播放器
//当设置悬浮评论分页栏时,增加css
if (GM_getValue('pagebox_display') == 1) {
if(url.indexOf('video/av')>-1){
var css='.pagelistbox{position:fixed;top:150px; right:0px;background-image:url("http://nightlyfantasy.github.io/Bili_Fix_Player/bg.png");}';
GM_addStyle(css);}
}
//当设置评论移除和谐娘时,增加css
if (GM_getValue('pagebox_harm') == 1) {
if(url.indexOf('video/av')>-1){
var css='.quote{display:block!important;}span.content a,.content>a[href="javascript:;"]{display:none!important;}';
GM_addStyle(css);}
}
//css插入
var css = '.bfpbtn{font-size:12px;height:25.6px;line-height:25.6px;padding:0px 2px;transition-property:#000,color;transition-duration:0.3s;box-shadow:none;color:#FFF;text-shadow:none;border:medium none;background:none repeat scroll 0% 0% #00A1CB!important;}.bfpbtn.active{background:none repeat scroll 0% 0% #F489AD!important;}.bfpbtn.notice{background-color:#A300C0!important;}.font{font-size:11px!important;}#window_play_list li{float:left;position:relative;width:5em;border:1px solid #B0C4DE;font:80% Verdana,Geneva,Arial,Helvetica,sans-serif;}.ui.corner.label{height:0px;border-width:0px 3em 3em 0px;border-style:solid;border-top:0px solid transparent;border-bottom:3em solid transparent;border-left:0px solid transparent;border-right-color:rgb(217,92,92)!important;transition:border-color 0.2s ease 0s;position:absolute;content:"";right:0px;top:0px;z-index:-1;width:0px;}.ui.corner.label i{display:inline-block;margin:3px 0.25em 0px 17px;width:1.23em;height:1em;font-weight:800!important;}.dialogcontainter{height:400px;width:400px;border:1px solid #14495f;position:fixed;font-size:13px;}.dialogtitle{height:26px;width:auto;background-color:#C6C6C6;}.dialogtitleinfo{float:left;height:20px;margin-top:2px;margin-left:10px;line-height:20px;vertical-align:middle;color:#FFFFFF;font-weight:bold;}.dialogtitleico{float:right;height:20px;width:21px;margin-top:2px;margin-right:5px;text-align:center;line-height:20px;vertical-align:middle;background-image:url("http://nightlyfantasy.github.io/Bili_Fix_Player/bg.gif");background-position:-21px 0px}.dialogbody{padding:10px;width:auto;background-color:#FFFFFF;background-image:url("http://nightlyfantasy.github.io/Bili_Fix_Player/bg.png");}.dialogbottom{bottom:1px;right:1px;cursor:nw-resize;position:absolute;background-image:url("http://nightlyfantasy.github.io/Bili_Fix_Player/bg.gif");background-position:-42px -10px;width:10px;height:10px;font-size:0;}.button-small{font-size:12px;height:25.6px;line-height:25.6px;padding:0px 5px;}.button-flat-action{transition-duration:0.3s;box-shadow:none;background:none repeat scroll 0% 0% #7DB500;color:#FFF!important;text-shadow:none;border:medium none;border-radius:3px;}#player-list{position:fixed;z-index:1000;left:10px;top:50px;width:400px!important;background-image:url("http://nightlyfantasy.github.io/Bili_Fix_Player/bg.png");min-height:200px!Important;}#player_content{position:absolute;top:60px;left:10px;right:10px;bottom:10px;}#window-player{bottom:0;height:100%;left:0;right:0;top:0;width:100%;}a.single_player{display:none;}a:hover .single_player{display:inline;}#bofqi_embed.hide,#bofqi.hide,#player_content.hide{margin-left:3000px!important;transition:0.5s;-moz-transition:0.5s;-webkit-transition:0.5s;-o-transition:0.5s;}#bofqi_embed,#bofqi,#player_content{transition:0.5s;-moz-transition:0.5s;-webkit-transition:0.5s;-o-transition:0.5s;}';
GM_addStyle(css);
//高大上的拖动DIV和改变DIV大小功能,来自互联网脚本之家www.jb51.net
var z = 1,i = 1,left = 10;
var isIE = (document.all) ? true : false;
var Extend = function(destination, source) {
for (var property in source) {
destination[property] = source[property];
}
}
var Bind = function(object, fun, args) {
return function() {
return fun.apply(object, args || []);
}
}
var BindAsEventListener = function(object, fun) {
var args = Array.prototype.slice.call(arguments).slice(2);
return function(event) {
return fun.apply(object, [event || window.event].concat(args));
}
}
var CurrentStyle = function(element) {
return element.currentStyle || document.defaultView.getComputedStyle(element, null);
}
function create(elm, parent, fn) {
var element = document.createElement(elm);
fn && fn(element);
parent && parent.appendChild(element);
return element
};
function addListener(element, e, fn) {
element.addEventListener ? element.addEventListener(e, fn, false) : element.attachEvent("on" + e, fn)
};
function removeListener(element, e, fn) {
element.removeEventListener ? element.removeEventListener(e, fn, false) : element.detachEvent("on" + e, fn)
};
var Class = function(properties) {
var _class = function() {
return (arguments[0] !== null && this.initialize && typeof(this.initialize) == 'function') ? this.initialize.apply(this, arguments) : this;
};
_class.prototype = properties;
return _class;
};
var Dialog = new Class({
options: {
Width: 400,
Height: 400,
Left: 100,
Top: 10,
Titleheight: 26,
Minwidth: 200,
Minheight: 200,
CancelIco: true,
ResizeIco: true,
Info: "标题",
Content: "无内容",
Zindex: 2
},
initialize: function(options) {
this._dragobj = null;
this._resize = null;
this._cancel = null;
this._body = null;
this._x = 0;
this._y = 0;
this._fM = BindAsEventListener(this, this.Move);
this._fS = Bind(this, this.Stop);
this._isdrag = null;
this._Css = null;
////////////////////////////////////////////////////////////////////////////////
this.Width = this.options.Width;
this.Height = this.options.Height;
this.Left = this.options.Left;
this.Top = this.options.Top;
this.CancelIco = this.options.CancelIco;
this.Info = this.options.Info;
this.Content = this.options.Content;
this.Minwidth = this.options.Minwidth;
this.Minheight = this.options.Minheight;
this.Titleheight = this.options.Titleheight;
this.Zindex = this.options.Zindex;
Extend(this, options);
Dialog.Zindex = this.Zindex
//////////////////////////////////////////////////////////////////////////////// 构造dialog
var obj = ['dialogcontainter', 'dialogtitle', 'dialogtitleinfo', 'dialogtitleico', 'dialogbody', 'dialogbottom'];
for (var i = 0; i < obj.length; i++) {
obj[i] = create('div', null, function(elm) {
elm.className = obj[i];
});
}
obj[2].innerHTML = this.Info;
obj[4].innerHTML = this.Content;
obj[1].appendChild(obj[2]);
obj[1].appendChild(obj[3]);
obj[0].appendChild(obj[1]);
obj[0].appendChild(obj[4]);
obj[0].appendChild(obj[5]);
document.body.appendChild(obj[0]);
this._dragobj = obj[0];
this._resize = obj[5];
this._cancel = obj[3];
this._body = obj[4];
////////////////////////////////////////////////////////////////////////////////o,x1,x2
////设置Dialog的长 宽 ,left ,top
with(this._dragobj.style) {
height = this.Height + "px";
top = this.Top + "px";
width = this.Width + "px";
left = this.Left + "px";
zIndex = this.Zindex;
}
this._body.style.height = this.Height - this.Titleheight - parseInt(CurrentStyle(this._body).paddingLeft) * 2 + 'px';
/////////////////////////////////////////////////////////////////////////////// 添加事件
addListener(this._dragobj, 'mousedown', BindAsEventListener(this, this.Start, true));
addListener(this._cancel, 'mouseover', Bind(this, this.Changebg, [this._cancel, '0px 0px', '-21px 0px']));
addListener(this._cancel, 'mouseout', Bind(this, this.Changebg, [this._cancel, '0px 0px', '-21px 0px']));
addListener(this._cancel, 'mousedown', BindAsEventListener(this, this.Disappear));
addListener(this._body, 'mousedown', BindAsEventListener(this, this.Cancelbubble));
addListener(this._resize, 'mousedown', BindAsEventListener(this, this.Start, false));
},
Disappear: function(e) {
this.Cancelbubble(e);
document.body.removeChild(this._dragobj);
$('#player-list').remove();
},
Cancelbubble: function(e) {
this._dragobj.style.zIndex = ++Dialog.Zindex;
document.all ? (e.cancelBubble = true) : (e.stopPropagation())
},
Changebg: function(o, x1, x2) {
o.style.backgroundPosition = (o.style.backgroundPosition == x1) ? x2 : x1;
},
Start: function(e, isdrag) {
if (!isdrag) {
this.Cancelbubble(e);
}
this._Css = isdrag ? {
x: "left",
y: "top"
} : {
x: "width",
y: "height"
}
this._dragobj.style.zIndex = ++Dialog.Zindex;
this._isdrag = isdrag;
this._x = isdrag ? (e.clientX - this._dragobj.offsetLeft || 0) : (this._dragobj.offsetLeft || 0);
this._y = isdrag ? (e.clientY - this._dragobj.offsetTop || 0) : (this._dragobj.offsetTop || 0);
if (isIE) {
addListener(this._dragobj, "losecapture", this._fS);
this._dragobj.setCapture();
} else {
e.preventDefault();
addListener(window, "blur", this._fS);
}
addListener(document, 'mousemove', this._fM);
addListener(document, 'mouseup', this._fS);
$("#player_content").addClass("hide");
},
Move: function(e) {
window.getSelection ? window.getSelection().removeAllRanges() : document.selection.empty();
var i_x = e.clientX - this._x,
i_y = e.clientY - this._y;
this._dragobj.style[this._Css.x] = (this._isdrag ? Math.max(i_x, 0) : Math.max(i_x, this.Minwidth)) + 'px';
this._dragobj.style[this._Css.y] = (this._isdrag ? Math.max(i_y, 0) : Math.max(i_y, this.Minheight)) + 'px'
if (!this._isdrag)
this._body.style.height = Math.max(i_y - this.Titleheight, this.Minheight - this.Titleheight) - 2 * parseInt(CurrentStyle(this._body).paddingLeft) + 'px';
},
Stop: function() {
$("#player_content").removeClass("hide");
removeListener(document, 'mousemove', this._fM);
removeListener(document, 'mouseup', this._fS);
//实时改变播放器大小,保存播放器大小
$('#window-player').width($('.dialogcontainter').width() - 20);
GM_setValue('player_width', ($('.dialogcontainter').width() - 20));
$('#window-player').height($('.dialogcontainter').height() - 70);
GM_setValue('player_height', ($('.dialogcontainter').height() - 70));
//保存位置
//GM_setValue('div_top', ($('.dialogcontainter').offset().top));//设置垂直位置的时候,如果是长页而且是浮动播放器时候记录位置,会导致播放器不知所踪
GM_setValue('div_left', ($('.dialogcontainter').offset().left));
if (isIE) {
removeListener(this._dragobj, "losecapture", this._fS);
this._dragobj.releaseCapture();
} else {
removeListener(window, "blur", this._fS);
};
}
})
function creat(title, content) {
$('.dialogcontainter').remove();
new Dialog({
Info: title = title,
Left: GM_getValue('div_left'),
Top: 50,
Width: (GM_getValue('player_width') + 20),
Height: (GM_getValue('player_height') + 70),
Content: content,
Zindex: (2000)
});
i++;
left += 10;
}
})();