// ==UserScript==
// @name bili_fix_player
// @namespace bili
// @description 修复B站播放器,黑科技,列表页、搜索页弹窗,破乐视限制,提供高清、低清晰源下载,弹幕下载
// @include /^.*\.bilibili\.(tv|com|cn)\/(video\/|search)?.*$/
// @include /^.*bilibili\.kankanews\.com\/(video\/|search)?.*$/
// @version 3.8
// @require http://static.hdslb.com/js/jquery.min.js
// @grant GM_xmlhttpRequest
// @grant GM_getValue
// @grant GM_setValue
// @grant GM_addStyle
// @grant unsafeWindow
// @author 绯色
// @downloadURL none
// ==/UserScript==
/**
出现无法播放情况先关闭自动修复
2014-10-31 自动宽屏功能会自动强制替换视频,而且无论何种B站播放器都有效;重写了视频下载功能,因为原来的模糊视频接口坏了,此次修改成更加直观的下载
2014-09-27移除记录弹窗播放器垂直位置功能(因为部分chrome用户老是反应播放器不知所踪),重构弹窗函数,修复弹窗函数多次运行导致分P列表重叠无法选择,博主采用了新的元素点击事件函数,从而使每个弹窗元素只有唯一一个点击事件,并修复了在火狐下视频播放页替换播放器后的网页全屏(chrome下无解,等待大神帮助),重新处理监听ajax产生的新数据,使用了贴吧大花猫的监听函数,因此可以无须点击左下角的【重新渲染按钮】,但是在部分机器可能有卡顿,如果觉得卡顿可以自行删除307行的代码即可,增加按需替换播放器选项【以前是一律强制替换】,自动宽屏在弹窗和视频页大型播放器下并且强制替换选项开启有效,按需替换则部分有效[因为是替换后的视频才有效]
2014-09-15修复专题页导致按钮失效,在左侧下角增加一个【重新渲染弹窗按钮】,当部分地方没有弹窗按钮的时候,可以点击一下,然后应该有弹窗按钮了,新功能【视频页自动定位到播放器位置】,新功能【播放器自动宽屏[包括弹窗和视频页的播放器(大型)]】
2014-09-06由于B站可以自由切换新版旧版的首页,增加对其支持(增加重新渲染弹窗按钮,如果发现部分列表无弹窗按钮则点击),同时恢复记录弹窗播放器垂直位置,为保证播放器不会不知所踪,设置垂直位置有极限值,超过此值域会被自动初始化;
2014-09-04B站UI升级导致脚本失效,修复为临时版本,因为B站部分列表变成AJAX,脚本给ajax后的内容添加支持比较麻烦,等博主搬砖活干完,谢谢支持
2014-08-15增加专题弹窗,移除对所有播放器都采用打开菜单时将视频移开的功能,需要360浏览器用户自己设置打开此功能
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('version') == undefined) GM_setValue('version', 1); //版本号
if (GM_getValue('auto') == undefined) GM_setValue('auto', 1);
if (GM_getValue('fix_type') == undefined) GM_setValue('fix_type', 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('init360') == undefined) GM_setValue('init360', 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);
//自动定位播放器--来自火狐吧友
if (GM_getValue('auto_locate') == undefined) GM_setValue('auto_locate', 1);
//自动宽屏-来自牙刷科技冻猫
if (GM_getValue('auto_wide') == undefined) GM_setValue('auto_wide', 0);
//欢迎屏幕
var version = '3.8';
var local_version = GM_getValue('version');
if (version != local_version) {
alert('\n\
1:感谢使用Bili Fix Player版本号3.8[20141031],阅读以下说明将有助于你更好地使用脚本ーー(^U^)ノーーYO\n\
2:我重写了视频下载功能,因为原来的模糊视频接口坏了,此次修改成更加直观的下载\n\
3:现在,自动宽屏功能会自动强制替换视频,而且无论何种B站播放器都有效\n\
4:本脚本使用了B站的接口,有时候接口大姨妈会导致很久才出现甚至不出现,这不是本博问题,谢谢体谅\n\
5:如果你发现BUG,可以随时提交给我。谢谢。http://bilili.ml/361.html\n\
6:感谢您的支持,我们下一版本再见!23333,我会告诉乃们最近博主没事跑去给B站BGM填歌词(⊙_⊙)?哈哈哈博主才不会告诉乃们博主ID是绯色起源23333');
GM_setValue('version', version);
}
/**
-------------------------------用户界面GUI View-------------------------------------
*/
//函数,插入可视化操作视图
function insert_html(type) {
var auto = GM_getValue('auto') ? '已打开' : '已关闭';
var fix_type = GM_getValue('fix_type') ? '当前按需修复[自动宽屏部分视频有效]' : '当前强制修复[全部B站播放器自动宽屏有效]';
var player_size = GM_getValue('player_size') ? '大型' : '小型';
var display = GM_getValue('pagebox_display') ? '悬浮' : '默认';
var harm = GM_getValue('pagebox_harm') ? '和谐娘打酱油中' : '默认[和谐娘和谐中]';
var init360 = GM_getValue('init360') ? '已打开' : '已关闭';
var auto_locate = GM_getValue('auto_locate') ? '已打开' : '已关闭';
var auto_wide = GM_getValue('auto_wide') ? '已打开' : '已关闭';
//var container=GM_getValue('player_container')?'iframe[无滚动条bug]':'embed[无拖放bug]';
var div = '
';
$('li.m-i:nth-child(1) > a:nth-child(1)').prop('outerHTML', div);
//$('li.m-i:nth-child(1) > a: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);
//360火星
var bfpbtn = document.querySelector("#init360");
bfpbtn.addEventListener("click", init_the_special, false);
//自动定位播放器
var bfpbtn = document.querySelector("#auto-locate");
bfpbtn.addEventListener("click", action_auto_locate, false);
//自动宽屏
var bfpbtn = document.querySelector("#auto-wide");
bfpbtn.addEventListener("click", action_auto_wide, false);
//修复模式
var bfpbtn = document.querySelector("#fix-type");
bfpbtn.addEventListener("click", action_fix_type, false);
//下载高清
var bfpbtn = document.querySelector("#hd_av_download");
bfpbtn.addEventListener("click", function (){download_bili_av('HD')}, false);
//下载渣画质
var bfpbtn = document.querySelector("#ld_av_download");
bfpbtn.addEventListener("click", function (){download_bili_av('LD')}, false);
}
//下载
function download_bili_av(type){
if($('#av_source').attr('cid')==''){
alert('错误,请再试一次,多次错误请报修');
}else{
var cid=$('#av_source').attr('cid');
if(type=='HD'){
var url = 'http://interface.bilibili.com/playurl?appkey=0a99fa1d87fdd38c&platform=android&quality=2&cid='+cid+'&otype=json&platform=android';
}else{
var url = 'http://interface.bilibili.com/playurl?platform=android&cid='+cid+'&quality=1&otype=json&appkey=0a99fa1d87fdd38c&type=mp4';
}
GM_xmlhttpRequest({
method: 'GET',
url: url,
synchronous: false,
onload: function(responseDetails) {
if (responseDetails.status == 200) {
var content=responseDetails.responseText;
var c= eval('(' + content + ')');
var durl=(c.durl)[0]['url'];
if(durl!=undefined){
window.location.href=durl;}else{
alert('错误,请再试一次,多次错误请报修');
}
//console.log(content,c);
//console.log(durl);
}
}
});
}
}
//函数,插入下载按钮 20141031 接口更换成json
/* function insert_download_button(url, count) {
$('#av_source').append('分段【' + count + '】');
} */
//设置参数
//修复按钮事件
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('已更改,刷新生效_(:3」∠)_');
}
//播放器大小按钮事件
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('已更改,刷新生效_(:3」∠)_');
}
//函数 评论分页功能显示切换(悬浮、原来位置)
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('已更改,刷新生效_(:3」∠)_');
}
//函数 评论和谐娘功能切换
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('已更改,刷新生效_(:3」∠)_');
}
//函数 360兼容
function init_the_special() {
GM_getValue('init360') ? GM_setValue('init360', 0) : GM_setValue('init360', 1);
var s = GM_getValue('init360') ? '已打开,请刷新' : '已关闭,请刷新';
document.getElementById('init360').innerHTML = s;
$("#init360").toggleClass("active");
$('#bili_set_status').html('已更改,刷新生效_(:3」∠)_');
}
//函数 自动定位播放器
function action_auto_locate() {
GM_getValue('auto_locate') ? GM_setValue('auto_locate', 0) : GM_setValue('auto_locate', 1);
var s = GM_getValue('auto_locate') ? '已打开,请刷新' : '已关闭,请刷新';
document.getElementById('auto-locate').innerHTML = s;
$("#auto-locate").toggleClass("active");
$('#bili_set_status').html('已更改,刷新生效_(:3」∠)_');
}
//函数 自动宽屏
function action_auto_wide() {
GM_getValue('auto_wide') ? GM_setValue('auto_wide', 0) : GM_setValue('auto_wide', 1);
var s = GM_getValue('auto_wide') ? '已打开,且自动开启强制修复模式,请刷新' : '已关闭,请按自己需要是否关闭强制修复模式,请刷新';
if(GM_getValue('auto_wide')){
GM_setValue('fix_type', 0);
}
document.getElementById('auto-wide').innerHTML = s;
$("#auto-wide").toggleClass("active");
$('#bili_set_status').html('已更改,刷新生效_(:3」∠)_');
}
//函数 修复模式
function action_fix_type() {
GM_getValue('fix_type') ? GM_setValue('fix_type', 0) : GM_setValue('fix_type', 1);
var s = GM_getValue('fix_type') ? '当前按需修复[自动宽屏部分视频有效],请刷新' : '当前强制修复[即使是B站播放器,自动宽屏有效],请刷新';
document.getElementById('fix-type').innerHTML = s;
$("#fix-type").toggleClass("active");
$('#bili_set_status').html('已更改,刷新生效_(:3」∠)_');
}
/**
-------------------------------函数 Model-------------------------------------
*/
//函数,替换播放器
function Replace_player(aid, cid) {
if (GM_getValue('auto') == '1') {
var wide = '';
if (GM_getValue('auto_wide') == 1) var wide = '&as_wide=1';
if (GM_getValue('player_size') == '1') {
//document.getElementById('bofqi').innerHTML = '