Read danmaku settings from player

This commit is contained in:
the1812 2019-01-24 13:06:16 +08:00
parent e2d8cc80b2
commit 683c8cd53f
8 changed files with 91 additions and 25 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -746,6 +746,12 @@
event.initEvent(eventName, true, true);
element.dispatchEvent(event);
}
async function loadLazyPanel(selector)
{
await SpinQuery.unsafeJquery();
const panel = await SpinQuery.any(() => unsafeWindow.$(selector));
panel.mouseover().mouseout();
}
function contentLoaded(callback)
{
if (/complete|interactive|loaded/.test(document.readyState))

View File

@ -746,6 +746,12 @@
event.initEvent(eventName, true, true);
element.dispatchEvent(event);
}
async function loadLazyPanel(selector)
{
await SpinQuery.unsafeJquery();
const panel = await SpinQuery.any(() => unsafeWindow.$(selector));
panel.mouseover().mouseout();
}
function contentLoaded(callback)
{
if (/complete|interactive|loaded/.test(document.readyState))

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
(()=>{return(n,t)=>{const{DanmakuInfo:e}=t.import("videoInfo");const{DanmakuConverter:o}=t.import("danmakuConverter");async function a(n,t){const a=document.title.replace("_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili","").replace("_番剧_bilibili_哔哩哔哩","");const i=new e((unsafeWindow||window).cid);await i.fetchInfo();const r=(()=>{if(t===true){const n=new o({title:a,font:"Microsoft YaHei UI",alpha:.6,duration(n){switch(n.type){case 4:case 5:return 4;default:return 6}},blockTypes:[],resolution:{x:1920,y:1080},bottomMarginPercent:.15});const t=n.convertToAssDocument(i.rawXML);return new Blob([t.generateAss()],{type:"text/plain"})}else{return new Blob([i.rawXML],{type:"text/plain"})}})();const c=URL.createObjectURL(r);const s=$("#danmaku-link");const u=s.attr("href");if(u){URL.revokeObjectURL(u)}clearTimeout(n);document.querySelector("#download-danmaku>span").innerHTML="下载弹幕";s.attr("download",`${a}.${t?"ass":"xml"}`).attr("href",c).get(0).click()}return{widget:{content:`\n <button\n class="gui-settings-flat-button"\n id="download-danmaku">\n <i class="icon-danmaku"></i>\n <span>下载弹幕</span>\n <a id="danmaku-link" style="display:none"></a>\n </button>`,condition:async()=>{let n=await SpinQuery.condition(()=>(unsafeWindow||window).cid,n=>n!==undefined);return n!==undefined},success:()=>{const n=document.querySelector("#danmaku-link");$("#download-danmaku").on("click",t=>{if(t.target!==n){const n=setTimeout(()=>document.querySelector("#download-danmaku>span").innerHTML="请稍侯...",200);try{a(n,t.shiftKey)}catch(n){logError(n)}}})}}}}})();
(()=>{return(t,e)=>{const{DanmakuInfo:n}=e.import("videoInfo");const{DanmakuConverter:i}=e.import("danmakuConverter");async function o(t,e){const o=document.title.replace("_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili","").replace("_番剧_bilibili_哔哩哔哩","");const a=new n((unsafeWindow||window).cid);await a.fetchInfo();const l=await(async()=>{if(e===true){await loadLazyPanel(".bilibili-player-video-danmaku-setting");const t=t=>{const e=parseFloat(document.querySelector(t).style.transform.replace(/translateX\(([\d\.]+)/,"$1"));const n={0:0,44:1,94:2,144:3,188:4}[e];return n};const e=document.querySelector(".bilibili-player-video-danmaku-setting-right-font .bui-select-result").innerText;const n=parseFloat(document.querySelector(".bilibili-player-setting-opacity .bui-bar").style.transform.replace(/scaleX\(([\d\.]+)\)/,"$1"));const l=(()=>{const e=[10,8,6,4,2][t(".bilibili-player-setting-speedplus .bui-thumb")];return t=>{switch(t.type){case 4:case 5:return 4;default:return e}}})();const r=(()=>{let t=[];const e={".bilibili-player-block-filter-type[ftype=scroll]":[1,2,3],".bilibili-player-block-filter-type[ftype=top]":[5],".bilibili-player-block-filter-type[ftype=bottom]":[4],".bilibili-player-block-filter-type[ftype=color]":["color"],".bilibili-player-block-filter-type[ftype=special]":[7,8]};for(const[n,i]in Object.entries(e)){if(document.querySelector(n).classList.contains("disabled")){t=t.concat(i)}}return t})();const c=[2,1.5,1,.75,.5][t(".bilibili-player-setting-fontsize .bui-thumb")];const s=[.75,.5,.25,.15,.15][t(".bilibili-player-setting-area .bui-thumb")];const u=new i({title:o,font:e,alpha:n,duration:l,blockTypes:r,resolution:{x:1920*c,y:1080*c},bottomMarginPercent:s});const d=u.convertToAssDocument(a.rawXML);return new Blob([d.generateAss()],{type:"text/plain"})}else{return new Blob([a.rawXML],{type:"text/plain"})}})();const r=URL.createObjectURL(l);const c=$("#danmaku-link");const s=c.attr("href");if(s){URL.revokeObjectURL(s)}clearTimeout(t);document.querySelector("#download-danmaku>span").innerHTML="下载弹幕";c.attr("download",`${o}.${e?"ass":"xml"}`).attr("href",r).get(0).click()}return{widget:{content:`\n <button\n class="gui-settings-flat-button"\n id="download-danmaku">\n <i class="icon-danmaku"></i>\n <span>下载弹幕</span>\n <a id="danmaku-link" style="display:none"></a>\n </button>`,condition:async()=>{let t=await SpinQuery.condition(()=>(unsafeWindow||window).cid,t=>t!==undefined);return t!==undefined},success:()=>{const t=document.querySelector("#danmaku-link");$("#download-danmaku").on("click",e=>{if(e.target!==t){const t=setTimeout(()=>document.querySelector("#download-danmaku>span").innerHTML="请稍侯...",200);try{o(t,e.shiftKey)}catch(t){logError(t)}}})}}}}})();

View File

@ -277,6 +277,7 @@ Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text
this.duration = duration;
this.blockTypes = blockTypes;
this.resolution = resolution;
this.white = 16777215; // Dec color of white danmaku
this.danmakuStack = new DanmakuStack(font, resolution, duration, bottomMarginPercent);
}
get fontStyles()
@ -293,7 +294,8 @@ Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text
for (const xmlDanmaku of xmlDanmakuDocument.danmakus.sort((a, b) => a.time - b.time))
{
// 跳过设置为屏蔽的弹幕类型
if (this.blockTypes.indexOf(xmlDanmaku.type) !== -1)
if (this.blockTypes.indexOf(xmlDanmaku.type) !== -1 ||
this.blockTypes.indexOf("color") !== -1 && xmlDanmaku.color !== this.white)
{
continue;
}
@ -340,8 +342,7 @@ Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text
}
convertColor(decColor)
{
const white = 16777215;
if (decColor === white)
if (decColor === this.white)
{
return "";
}

View File

@ -11,32 +11,73 @@
.replace("_番剧_bilibili_哔哩哔哩", "");
const danmaku = new DanmakuInfo((unsafeWindow || window).cid);
await danmaku.fetchInfo();
const blob = (() =>
const blob = await (async () =>
{
if (ass === true)
{
// TODO: 从播放器里获取弹幕偏好
const converter = new DanmakuConverter({
title,
font: "Microsoft YaHei UI",
alpha: 0.6,
duration(danmaku)
await loadLazyPanel(".bilibili-player-video-danmaku-setting");
const getSliderIndex = (selector) =>
{
const transform = parseFloat(document.querySelector(selector).style.transform.replace(/translateX\(([\d\.]+)/, "$1"));
const index = {
0: 0,
44: 1,
94: 2,
144: 3,
188: 4,
}[transform];
return index;
};
const font = document.querySelector(".bilibili-player-video-danmaku-setting-right-font .bui-select-result").innerText;
const alpha = parseFloat(document.querySelector(".bilibili-player-setting-opacity .bui-bar").style.transform.replace(/scaleX\(([\d\.]+)\)/, "$1"));
const duration = (() =>
{
const scrollDuration = [10, 8, 6, 4, 2][getSliderIndex(".bilibili-player-setting-speedplus .bui-thumb")];
return danmaku =>
{
switch (danmaku.type)
{
case 4:
case 5:
return 4;
return 4; // stickyDuration
default:
return 6;
return scrollDuration;
}
},
blockTypes: [],
};
})();
const blockTypes = (() =>
{
let result = [];
const blockValues = {
".bilibili-player-block-filter-type[ftype=scroll]": [1, 2, 3],
".bilibili-player-block-filter-type[ftype=top]": [5],
".bilibili-player-block-filter-type[ftype=bottom]": [4],
".bilibili-player-block-filter-type[ftype=color]": ["color"],
".bilibili-player-block-filter-type[ftype=special]": [7, 8],
};
for (const [type, value] in Object.entries(blockValues))
{
if (document.querySelector(type).classList.contains("disabled"))
{
result = result.concat(value);
}
}
return result;
})();
const resolutionFactor = [2, 1.5, 1, 0.75, 0.5][getSliderIndex(".bilibili-player-setting-fontsize .bui-thumb")]; // 改变分辨率来调整字体大小
const bottomMarginPercent = [0.75, 0.5, 0.25, 0.15, 0.15][getSliderIndex(".bilibili-player-setting-area .bui-thumb")];
const converter = new DanmakuConverter({
title,
font,
alpha,
duration,
blockTypes,
resolution: {
x: 1920,
y: 1080,
x: 1920 * resolutionFactor,
y: 1080 * resolutionFactor,
},
bottomMarginPercent: 0.15,
bottomMarginPercent,
});
const assDocument = converter.convertToAssDocument(danmaku.rawXML);
return new Blob([assDocument.generateAss()], {