依赖工具
[!alert-quote] 时间戳笔记依赖工具
- Media Extended
- Media Extended BiliBili Plugin
- Regex Pipeline
- Hover Editor
- QuickAdd
效果
设置
Media Extended
- 安装 Media Extended用于实现基础功能,并同时安装Media Extended BiliBili Plugin增加对B站的支持。
- 如果 Media Extended无法正常工作,可以尝试下载修改bug后的版本 media-extended_fix进行替换源文件。
格式
1.
[name](url#t=hh:mm:ss)
2.
[hh:mm:ss](url#t=hh:mm:ss)
3.
[hh:mm:ss](url)
4.
[name](url#t=s)
阅读模式下 Ctrl+鼠标左键打开。
Regex Pipeline & Regex Find/Replace
使用 Regex Pipeline
创建正则表达式替换规则。
正则表达式替换规则
"([0-9]{1,})\n([0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2})[,.]([0-9]{1,3}) --> ([0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2})[,.]([0-9]{1,3})"
->
"[$2,$3](Media-Extended#t=$4,$5)"
调用创建的正则表达式规则进行替换。Regex Pipeline
正则表达式用于快速将SRT格式文件快速标记为时间戳格式文档。
Regex Find/Replace
查找替换 Media-Extended 为视频链接,完成视频实时笔记。
Hover Editor
使视频显示可以缩放和自由移动。
QuickAdd
配合 bilibili.js
实现B站视频合集的快速导入。
const headers = {
'authority': 'www.bilibili.com',
'cache-control': 'max-age=0',
'sec-ch-ua': '" Not A;Brand";v="99", "Chromium";v="98", "Google Chrome";v="98"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-platform': '"Windows"',
'upgrade-insecure-requests': '1',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36',
'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
'sec-fetch-site': 'none',
'sec-fetch-mode': 'navigate',
'sec-fetch-user': '?1',
'sec-fetch-dest': 'document',
'accept-language': 'en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7'
}
async function bilibili(QuickAdd) {
const url = await QuickAdd.quickAddApi.inputPrompt(
"输入Bilibili视频网址:"
);
let urlTest = url?.match(/https?:\/\/(?:(?:www|m)\.bilibili\.com\/video\/\S*\??|b23\.tv\/\S*)/gm);
if (url.length == 0 || urlTest.length == 0) {
new Notice("网址格式错误");
throw new Error("网址格式错误");
}
let biliInfo = await getBiliInfo(url)
if (!biliInfo) {
new Notice("获取内容失败");
throw new Error("获取内容失败");
}
new Notice(biliInfo.title + "笔记已生成!", 500);
QuickAdd.variables = {
...biliInfo
};
}
async function getBiliInfo(url) {
let searchUrl = new URL(url);
const res = await request({
url: searchUrl.href,
method: "GET",
cache: "no-cache",
headers: headers
});
if (!res) {
return null;
}
let p = new DOMParser();
let doc = p.parseFromString(res, "text/html");
let $ = s => doc.querySelector(s);
let mainUrl = url.match(/^.+(\?|$)/g)[0];
let parts = "";
let videoTime = "";
if ($('h3')) {
let sectionData = JSON.parse(doc.querySelectorAll("script")[3].textContent.replace("window.__INITIAL_STATE__=", "").replace(";(function(){var s;(s=document.currentScript||document.scripts[document.scripts.length-1]).parentNode.removeChild(s);}());", ""));
let episodes = sectionData.videoData.pages;
var zero_time = new Date(0);
var video_time = new Date(sectionData.videoData.duration * 1000);
videoTime = `${(video_time.getHours() - zero_time.getHours()).toString().padStart(2, '0')}:${(video_time.getMinutes() - zero_time.getMinutes()).toString().padStart(2, '0')}:${(video_time.getSeconds() - zero_time.getSeconds()).toString().padStart(2, '0')}`;
episodes.forEach(episode => {
var parts_time = new Date(episode.duration * 1000);
parts += `[P${episode.page.toString().padStart(2, '0')}📺 ${(parts_time.getHours() - zero_time.getHours()).toString().padStart(2, '0')}:${(parts_time.getMinutes() - zero_time.getMinutes()).toString().padStart(2, '0')}:${(parts_time.getSeconds() - zero_time.getSeconds()).toString().padStart(2, '0')} ${episode.part}](https://www.bilibili.com/video/${sectionData.bvid}/?p=${episode.page})\n\n`;
});
}
if ($('a.first-line-title')) {
let sectionData = JSON.parse(doc.querySelectorAll("script")[3].textContent.replace("window.__INITIAL_STATE__=", "").replace(";(function(){var s;(s=document.currentScript||document.scripts[document.scripts.length-1]).parentNode.removeChild(s);}());", ""));
let episodes = sectionData.videoData.ugc_season.sections[0].episodes;
var zero_time = new Date(0);
var video_time = new Date(sectionData.videoData.duration * 1000);
videoTime = `${(video_time.getHours() - zero_time.getHours()).toString().padStart(2, '0')}:${(video_time.getMinutes() - zero_time.getMinutes()).toString().padStart(2, '0')}:${(video_time.getSeconds() - zero_time.getSeconds()).toString().padStart(2, '0')}`;
episodes.forEach((episode, index) => {
var parts_time = new Date(episode.duration * 1000);
parts += `[P${(index + 1).toString().padStart(2, '0')}📺 ${(parts_time.getHours() - zero_time.getHours()).toString().padStart(2, '0')}:${(parts_time.getMinutes() - zero_time.getMinutes()).toString().padStart(2, '0')}:${(parts_time.getSeconds() - zero_time.getSeconds()).toString().padStart(2, '0')} ${episode.title}](https://www.bilibili.com/video/${episode.bvid})\n\n`;
});
}
let biliInfo = {};
biliInfo.link = url.match(/^.+(?=\?)/g) || url;
biliInfo.date = $("meta[itemprop='datePublished']")?.content;
biliInfo.videoDate = biliInfo.date;
biliInfo.title = $("h1").textContent;
biliInfo.author = $(".up-name").innerText.replace(/(^\s*)|(\s*$)/g, "");
biliInfo.content = $("div#v_desc")?.textContent?.trim()?.replace(/收起$/, '');
biliInfo.intro = biliInfo.content;
biliInfo.cover = 'http:' + $("meta[property='og:image']")?.content?.replace(/@.*/, '');
biliInfo.parts = parts === '' ? biliInfo.link : parts;
biliInfo.videoTime = videoTime;
biliInfo.filename = biliInfo.title.replace(/[\\\/\:\*\?\"\<\>\|]/g, "_");
return biliInfo;
}
module.exports = bilibili;
bilibili.js
原作者为 荧光闪烁最大化我在此做了部分修改。
创建并添加一个模板文件 bilibili-video.md
,并设置模板文件和脚本。
---
title: "{{VALUE:title}}"
author: {{VALUE:author}}
publish_date: {{VALUE:videoDate}}
playback_duration: {{VALUE:videoTime}}
watch_date: {{DATE}}
link: {{VALUE:link}}
---

[{{VALUE:videoTime}} 🚩 {{VALUE:title}}]({{VALUE:link}})
{{VALUE:parts}}
## 简介
{{VALUE:intro}}
## 想法
## 记录