// ==UserScript== // @name Bilibili上下弹幕变字幕 // @namespace https://space.bilibili.com/68391#!/ // @version 1.1 // @description 用于突出显示B站的顶部弹幕与底部弹幕,使其呈现Youtube字幕的效果。适用于一些有字幕弹幕的生肉视频。 // @author 剧情帝 // @match https://www.bilibili.com/video/av* // @match http://www.bilibili.com/video/av* // @match https://www.bilibili.com/watchlater* // @match http://www.bilibili.com/watchlater* // @run-at document-end // @create 2017-11-16 // @lastmodified 2017-04-12 // @note 2017.11.24-V0.2 新增识别弹幕颜色,深色弹幕增加白色文字边框的功能 // @note 2017.11.27-V1.0 新增字幕样式设置,可更改字幕的大小、颜色,以及是否显示文字的黑色背景 // @note 2-18.-4.12-V1.1 修复插件 // @downloadURL none // ==/UserScript== (function() { 'use strict'; var $style = $(''); $('head').append($style); var sheet = $style[0].sheet; var $style2 = $(''); $('head').append($style2); $style2[0].sheet.insertRule('.bilibili-player-color-picker-container .bilibili-player-color-picker-panel .color-span:hover {z-index:10; border-color:#fff}'); //色盘格子的hover样式 function rgb2hex(rgb) { rgb = rgb.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/); function hex(x) { return ("0" + parseInt(x).toString(16)).slice(-2); } return "" + hex(rgb[1]) + hex(rgb[2]) + hex(rgb[3]); //#号不要了 } function setCookie (name, value) { var newCookie = name + '=' + value + '; path=/; domain=.bilibili.com; expires='; var date = new Date(); if(value != null) date.setTime( date.getTime() + 90 * 24 * 3600 * 1000); else date.setTime( date.getTime() - 1 * 24 * 3600 * 1000); newCookie += date.toGMTString(); document.cookie = newCookie; } function getCookie (cname) { var name = cname + "="; var ca = document.cookie.split(';'); for(var i=0; i 0){ for (var i = record.addedNodes.length - 1; i >= 0; i--) { $currentDanmu = $(record.addedNodes[i]); if($currentDanmu.css('transform') == 'none'){ //不移动的弹幕,也就是顶端和底端弹幕 if(calLight($currentDanmu.css('color')) < 0.5) $currentDanmu.css('text-shadow', 'rgb(255, 255, 255) 1px 0px 1px, rgb(255, 255, 255) 0px 1px 1px, rgb(255, 255, 255) 0px -1px 1px, rgb(255, 255, 255) -1px 0px 1px'); } } } }); }); //等待弹幕图层的加载 var damunContainerWaiter = new MutationObserver(function(records){ $damunContainer = $('#bofqi .bilibili-player-video-danmaku'); if($damunContainer.length > 0){ //弹幕图层加载完毕 damunContainerWaiter.disconnect(); observer.observe($damunContainer[0], {'childList':true}); createSettings(); } }); damunContainerWaiter.observe($("#bofqi")[0], {'childList':true, 'subtree':true}); function createSettings(){ var $player = $("#bofqi #bilibiliPlayer"); var $playerSetting = $(".bilibili-player-setting-btn", $player); var $playerRight = $(".bilibili-player-auxiliary-area", $player); var $settingBtn = $('
'); var settingPanelHtml = ''; settingPanelHtml += '
\n'; settingPanelHtml += '
\n'; settingPanelHtml += '
\n'; settingPanelHtml += '
\n'; settingPanelHtml += '
\n'; settingPanelHtml += '
字幕设置\n'; settingPanelHtml += '(对所有顶端与底端弹幕生效)\n'; settingPanelHtml += '\n'; settingPanelHtml += '
\n'; settingPanelHtml += '
\n'; settingPanelHtml += '
\n'; settingPanelHtml += '\n'; settingPanelHtml += '\n'; settingPanelHtml += '
\n'; settingPanelHtml += '
\n'; settingPanelHtml += '
\n'; settingPanelHtml += '\n'; settingPanelHtml += '\n'; settingPanelHtml += '
\n'; settingPanelHtml += '
\n'; settingPanelHtml += '
\n'; settingPanelHtml += '\n'; settingPanelHtml += '\n'; settingPanelHtml += '
\n'; settingPanelHtml += '
\n'; settingPanelHtml += '
\n'; settingPanelHtml += '
\n'; settingPanelHtml += '
\n'; settingPanelHtml += '
\n'; settingPanelHtml += '
\n'; var $settingPanel = $(settingPanelHtml); var $colorPicker = $('.bilibili-player-area .bilibili-player-color-picker-container', $player).clone(); $('.bilibili-player-color-picker-mask', $colorPicker).remove(); $colorPicker.css({ 'position': 'unset', 'margin-top': '25px', 'border-left': '1px solid #e2e2e2', 'width': '263px' }); $('.bilibili-player-color-picker-panel .color-spans .color-span.active', $colorPicker).removeClass('active').prop('data-active', null); $('.bilibili-player-panel-area .color-setting', $settingPanel).append( $colorPicker); $settingBtn.click(function(){ $settingPanel.show(); }); $(".icon-close", $settingPanel).click(function(){ $settingPanel.hide(); }); //设置字体大小选择框的功能 var size = getCookie('subtitle-size'); if(size == null){ setCookie('subtitle-size', 'big'); size = 'big'; } $(".size-setting select", $settingPanel).val( size).change(function(){ setCookie('subtitle-size', $(this).val()); setCss(); }); //设置底板选项框的功能 var bg = getCookie('subtitle-bg'); if(bg == null){ setCookie('subtitle-bg', true); bg = true; } else if(bg == 'true') bg = true; else if(bg == 'false') bg = false; $(".back-setting input", $settingPanel).prop('checked', bg).change(function(){ setCookie('subtitle-bg', $(this).prop('checked')); setCss(); }); //设置颜色选项功能 var color = getCookie('subtitle-color'); if(color == null){ setCookie('subtitle-color', 'original'); color = 'original'; } if(color != 'original'){ $colorPicker.addClass('active'); $(".bilibili-player-color-picker-color-current", $colorPicker).css('background-color', '#'+color); $(".bilibili-player-color-picker-color-code", $colorPicker).val( color); } $(".color-setting select", $settingPanel).val( (color == 'original') ? 'original' : 'selected').change(function(){ if($(this).val() == 'original'){ setCookie('subtitle-color', 'original'); $colorPicker.removeClass('active'); } else if($(this).val() == 'selected'){ setCookie('subtitle-color', 'ffffff'); $(".bilibili-player-color-picker-color-current", $colorPicker).css('background-color', '#ffffff'); $(".bilibili-player-color-picker-color-code", $colorPicker).val( 'ffffff'); $colorPicker.addClass('active'); } setCss(); }); //设置色盘功能 $(".bilibili-player-color-picker-panel", $colorPicker).click(function(e){ color = rgb2hex( $(e.target).css('background-color')); $(".bilibili-player-color-picker-color-current", $colorPicker).css('background-color', '#'+color); $(".bilibili-player-color-picker-color-code", $colorPicker).val( color); setCookie('subtitle-color', color); setCss(); }); $settingBtn.insertBefore( $playerSetting); $settingPanel.appendTo($playerRight); setCss(); } //读取Cookie,设置字幕的样式 function setCss(){ if(sheet.cssRules.length > 0) sheet.deleteRule(0); var cssRule = '#bofqi .bilibili-player-video-danmaku .bilibili-danmaku:not([style*="transition"]) {'; if(getCookie('subtitle-bg') == 'true'){ cssRule += 'background-color:rgba(0,0,0,0.75);'; cssRule += ' padding:4px 10px;'; cssRule += ' border-radius:3px;'; cssRule += ' line-height:1 !important;'; } switch( getCookie('subtitle-size')){ case 'big': cssRule += ' font-size:36px !important;'; break; case 'medium': cssRule += ' font-size:25px !important;'; break; case 'small': cssRule += ' font-size:18px !important;'; } if(getCookie('subtitle-color') != 'original') cssRule += ' color:#' + getCookie('subtitle-color') + ' !important;'; cssRule += ' opacity:1 !important; }'; sheet.insertRule( cssRule); } })();