mirror of
https://github.com/the1812/Bilibili-Evolved.git
synced 2025-11-04 21:22:45 +08:00
Read danmaku settings from player
This commit is contained in:
parent
e2d8cc80b2
commit
683c8cd53f
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -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))
|
||||
|
||||
@ -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))
|
||||
|
||||
2
min/danmaku-converter.min.js
vendored
2
min/danmaku-converter.min.js
vendored
File diff suppressed because one or more lines are too long
2
min/download-danmaku.min.js
vendored
2
min/download-danmaku.min.js
vendored
@ -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)}}})}}}}})();
|
||||
@ -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 "";
|
||||
}
|
||||
|
||||
@ -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()], {
|
||||
|
||||
Loading…
Reference in New Issue
Block a user