简易 Bilibili 播放器修正脚本

非常简单, 有任何问题请提交 "[简易修正器] " 开头的控制台日志或信息框内容。您可以通过按下 Ctrl + C 进行复制。

// ==UserScript==
// @name         简易 Bilibili 播放器修正脚本
// @namespace    org.jixun.bilibili.fixer
// @version      1.0
// @description  非常简单, 有任何问题请提交 "[简易修正器] " 开头的控制台日志或信息框内容。您可以通过按下 Ctrl + C 进行复制。
// @author       Jixun
// @include      http://bilibili.tv/video/av*
// @include      http://www.bilibili.tv/video/av*

// @include      http://bilibili.com/video/av*
// @include      http://www.bilibili.com/video/av*

// @example      http://www.bilibili.com/video/av2082259/

// @grant        none
// @run-at       document-start
// ==/UserScript==

addEventListener('DOMContentLoaded', function () {
  console.info ('[简易修正器] 准备就绪, 作用于页面 %s', location.href);

  var elFixer = document.createElement('div');
  elFixer.textContent = '修正';
  elFixer.className = 'fav_btn_top';
  elFixer.style.backgroundPosition = '5px -743px';
  elFixer.addEventListener('click', clickFixer, false);
  document.querySelector('.viewbox>.info').appendChild(elFixer);

  setTimeout(function () {
	if (-1 !== getPlayer().textContent.indexOf('由于版权相关问题')) {
	  console.info ('[简易修正器] 检测到 Bilibili 正版源的地域检测. 如果修正后的播放器无法播放, 请尝试将 %chttp://interface.bilibili.com/playurl*%c 加入您的大陆代理规则.', 'color: red', 'color: initial');
	  clickFixer ();
	}
  }, 3000);

  function clickFixer (e) {
	e && e.preventDefault();

	// fadeOut(elFixer);
	beginFixer(getPlayer());
  }

  function getPlayer () {
	return document.getElementById('bofqi');
  }

  function beginFixer (domPlayer) {
	if (!domPlayer)
	  return alert('[简易修正器] 找不到播放器');

	var cids = domPlayer.innerHTML.match(/cid=(\d+)/);
	var aids = location.pathname.match(/av(\d+)(?:_(\d+))?/);

	var cid, aid, pg;
	if (cids) cid = cids[1];
	if (aids) {
	  aid = aids[1];
	  pg  = Number(aids[2]) || 1;
	}

	if (cid && aid) {
	  doReplacePlayer();
	} else if (aid) {
	  console.info ('[简易修正器] 缺失 cid 参数, 尝试抓取');
	  $.get('/widget/getPageList?aid=' + aid).done(function (str) {
		try {
		  cid = JSON.parse(str)[pg - 1].cid;
		  if (!cid)
			throw new Error('Invalid cid param');

		  doReplacePlayer();
		} catch (err) {
		  alert('[简易修正器] 抓取 cid 错误!');
		}
	  });
	} else {
	  alert ('[简易修正器] 数据缺失!');
	}

	function doReplacePlayer () {
	  domPlayer.innerHTML = [
		'<iframe height="482" width="950" class="player" src="https://secure.bilibili.com/secure,cid=',
		cid, '&aid=', aid,
		'" scrolling="no" border="0" frameborder="no" framespacing="0"></iframe>'
	  ].join('');
	}
  }

  function fadeOut (el) {
	var currentOpacity  = 1,
		currentPosition = 0;

	var nTimer = setInterval(procFade, 20);
	procFade();
	return nTimer;

	function procFade () {
	  currentPosition += 0.05;
	  el.style.opacity = currentOpacity = 1 - currentPosition * currentPosition * currentPosition;

	  if (currentPosition >= 1)
		clearInterval(nTimer);
	}
  }
}, false);