Add bvid convert

This commit is contained in:
the1812 2020-03-23 19:57:34 +08:00
parent 4621ac0a24
commit 64c97402ac
17 changed files with 210 additions and 35 deletions

View File

@ -165,6 +165,7 @@ declare global {
interface Window { interface Window {
aid: string | undefined aid: string | undefined
cid: string | undefined cid: string | undefined
bvid: string | undefined
pageno: string | number | undefined pageno: string | number | undefined
$: JQueryStatic $: JQueryStatic
[key: string]: any [key: string]: any
@ -442,6 +443,7 @@ declare global {
recordLiveDanmaku: boolean, recordLiveDanmaku: boolean,
foregroundColorMode: '自动' | '白色' | '黑色' foregroundColorMode: '自动' | '白色' | '黑色'
preserveEventBanner: boolean preserveEventBanner: boolean
bvidConvert: boolean
latestVersionLink: string, latestVersionLink: string,
currentVersion: string, currentVersion: string,
} }

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -18,6 +18,8 @@
"blackboard.vue.min.js": "84A30D5A6F322A3C083FC1100E9FF51233ECD08AFBD89A6449AD2388ACCC8522", "blackboard.vue.min.js": "84A30D5A6F322A3C083FC1100E9FF51233ECD08AFBD89A6449AD2388ACCC8522",
"blur-video-control.min.css": "B72FA7AD198ED1C9A9620A83881441F96F9FF3083ED12203A324B9753A7CCFFD", "blur-video-control.min.css": "B72FA7AD198ED1C9A9620A83881441F96F9FF3083ED12203A324B9753A7CCFFD",
"blur-video-control.min.js": "00A2AC837FC455DF2AED7D0C350265C7438CC6F5C203F085E19639DDB86D0E11", "blur-video-control.min.js": "00A2AC837FC455DF2AED7D0C350265C7438CC6F5C203F085E19639DDB86D0E11",
"bvid-convert.min.css": "DC588791A7A191BCBAFD3C166523413101FA992EDEB24B81892D06B9868D67E1",
"bvid-convert.min.js": "0D7F799AD10FCD94C0C451264E03FAFF786F0BB9919E9AE6E10D13FD3957B849",
"category-regions.min.js": "59666AFFFA63B942AC05B05C95E22BF6D655E3BA7DE3E46D8F86CEC79D0CA904", "category-regions.min.js": "59666AFFFA63B942AC05B05C95E22BF6D655E3BA7DE3E46D8F86CEC79D0CA904",
"clear-cache.min.js": "9AB1536D8278DA681831A589AD1414425BF206B36AE109FB4EC1E8A685BB2A9F", "clear-cache.min.js": "9AB1536D8278DA681831A589AD1414425BF206B36AE109FB4EC1E8A685BB2A9F",
"collapse-live-side-bar.min.css": "22348786547D2D8DB659A306AF2E9C1F2050D66488778C71545AAEF785FD57E6", "collapse-live-side-bar.min.css": "22348786547D2D8DB659A306AF2E9C1F2050D66488778C71545AAEF785FD57E6",
@ -30,7 +32,7 @@
"compact-layout.min.js": "B20609A7CBBDB1845FA0156FB5BE6B1E1A1B8B069EA85F65D16241DD2C12D738", "compact-layout.min.js": "B20609A7CBBDB1845FA0156FB5BE6B1E1A1B8B069EA85F65D16241DD2C12D738",
"custom-control-background.min.css": "1981FD2BF3B17ECF33F98D5DEDAF0D32ACBE9532A51FDB70822286991AB98EF3", "custom-control-background.min.css": "1981FD2BF3B17ECF33F98D5DEDAF0D32ACBE9532A51FDB70822286991AB98EF3",
"custom-control-background.min.js": "2A439B045A51D24F5115DD25995ED37E3D0371A074199FE6C727F2235F39C4D9", "custom-control-background.min.js": "2A439B045A51D24F5115DD25995ED37E3D0371A074199FE6C727F2235F39C4D9",
"custom-navbar.min.css": "72654016093F6ABE22631C4605AF3C46EB31BF998C6863AC2F651FBE49D38EE6", "custom-navbar.min.css": "F17DB373E033CCBACAB332A24868FED6A010B2E5CA43396C36648D1A7093A01F",
"custom-navbar.min.html": "FA6ACF1CA1DB6D3BD2BE310646B89B028756A36BF434BEBABE2BF00789581A09", "custom-navbar.min.html": "FA6ACF1CA1DB6D3BD2BE310646B89B028756A36BF434BEBABE2BF00789581A09",
"custom-navbar.min.js": "8AB481710497558D4A152A6D7E0226FDA78675729A3EFC6AA6AC5B0AA5404D17", "custom-navbar.min.js": "8AB481710497558D4A152A6D7E0226FDA78675729A3EFC6AA6AC5B0AA5404D17",
"custom-navbar-activities.min.js": "DEC76A6C7527330CAA0B89B400C071E155B64D602A6A118A96BCAC451ED6FDBF", "custom-navbar-activities.min.js": "DEC76A6C7527330CAA0B89B400C071E155B64D602A6A118A96BCAC451ED6FDBF",
@ -42,7 +44,7 @@
"custom-navbar-iframe.min.js": "DBE5844C2AA36057DBD33BBC5724D7D7F881AB15EC45A80228961942CD810A32", "custom-navbar-iframe.min.js": "DBE5844C2AA36057DBD33BBC5724D7D7F881AB15EC45A80228961942CD810A32",
"custom-navbar-logo.min.js": "236CCC887A3917A6D4840889B7380B648197765B8CDA27CB233F3F1E3215F7BB", "custom-navbar-logo.min.js": "236CCC887A3917A6D4840889B7380B648197765B8CDA27CB233F3F1E3215F7BB",
"custom-navbar-messages.min.js": "D7B315A4D8FD9E2EF9C1E40C1F3CA7EC18C5A87AC7A9410049061A0D851868DE", "custom-navbar-messages.min.js": "D7B315A4D8FD9E2EF9C1E40C1F3CA7EC18C5A87AC7A9410049061A0D851868DE",
"custom-navbar-search-box.min.js": "3543FE8F7F87E8C8C96CB799A7CBCDA4BE5DB863BD97BC1CF37C2657DCF3AE72", "custom-navbar-search-box.min.js": "36C9187C51A0715BACC9D9E82D6B0733D6C818453D1150F235E9C649E5529E2C",
"custom-navbar-settings.min.js": "474924B0C90EE6B3DF924D73DFD02DFC2BCF5BAD1F6A4E539A6263D3A751506C", "custom-navbar-settings.min.js": "474924B0C90EE6B3DF924D73DFD02DFC2BCF5BAD1F6A4E539A6263D3A751506C",
"custom-navbar-simple-link.min.js": "0960197FB525733551435B07D7B024272C21BDD2D8B4F47027046FCE7B3468C5", "custom-navbar-simple-link.min.js": "0960197FB525733551435B07D7B024272C21BDD2D8B4F47027046FCE7B3468C5",
"custom-navbar-subscriptions.min.js": "8664608EA96BA5E3CC0202F3ED095823B8D2A3DFCDC6D87C192FEA652D0DD554", "custom-navbar-subscriptions.min.js": "8664608EA96BA5E3CC0202F3ED095823B8D2A3DFCDC6D87C192FEA652D0DD554",

Binary file not shown.

1
min/bvid-convert.min.css vendored Normal file
View File

@ -0,0 +1 @@
.bvid-convert{border:2px solid #8882;border-radius:8px;padding:6px 8px;margin:4px 0;order:-1;width:100%;box-sizing:border-box}.bvid-convert-item{font-size:14px}

1
min/bvid-convert.min.js vendored Normal file
View File

@ -0,0 +1 @@
(()=>{return(i,n)=>{return{widget:{content:`<div class="bvid-convert"></div>`,condition:async()=>{if(["https://www.bilibili.com/video/","https://www.bilibili.com/bangumi/"].some(i=>document.URL.startsWith(i))){return Boolean(await SpinQuery.select(()=>unsafeWindow.aid||unsafeWindow.bvid))}else{return false}},success:()=>{n.applyStyle("bvidConvertStyle");const i=dq(".bvid-convert");i.innerHTML=`\n<div class="bvid-convert-item">av${unsafeWindow.aid}</div>\n<div class="bvid-convert-item">${unsafeWindow.bvid}</div>\n`}}}}})();

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -850,5 +850,12 @@ Resource.manifest = {
downloadLiveRecords: '下载直播录像', downloadLiveRecords: '下载直播录像',
}, },
}, },
bvidConvert: {
path: 'bvid-convert.min.js',
style: true,
displayNames: {
bvidConvert: 'BV号转换',
},
},
} }
export const resourceManifest = Resource.manifest export const resourceManifest = Resource.manifest

View File

@ -218,6 +218,7 @@ export const settings = {
foregroundColorMode: '自动', foregroundColorMode: '自动',
preserveEventBanner: false, preserveEventBanner: false,
about: true, about: true,
bvidConvert: true,
cache: {}, cache: {},
} }
const fixedSettings = { const fixedSettings = {

View File

@ -844,6 +844,22 @@ li.nav-item[report-id="playpage_dynamic"] .i-frame,
color: var(--theme-color); color: var(--theme-color);
font-style: normal; font-style: normal;
} }
.copy-tip {
position: absolute;
top: calc(100% + 4px);
left: 50%;
pointer-events: none;
opacity: 0;
transform: translateX(-50%) translateY(-8px);
border-radius: 4px;
background-color: #000a;
color: #fff;
padding: 6px 8px;
&.show {
transform: translateX(-50%) translateY(0);
opacity: 1;
}
}
.search-list-item { .search-list-item {
white-space: nowrap; white-space: nowrap;
text-overflow: ellipsis; text-overflow: ellipsis;

View File

@ -46,6 +46,35 @@ const originalHistory = new class {
} }
} }
} }
const getIdJump = (text: string) => {
const avMatch = text.match(/^av([\d]+)$/i)
if (avMatch) {
return {
success: true,
text,
link: `https://www.bilibili.com/av${avMatch[1]}`,
aid: avMatch[1],
bvid: ''
}
}
const bvidMatch = text.match(/^bv[\da-zA-Z]+$/i)
if (bvidMatch) {
return {
success: true,
text,
link: `https://www.bilibili.com/${text.replace(/^bv/i, 'BV')}`,
aid: '',
bvid: text.replace(/^bv/i, 'BV'),
}
}
return {
success: false,
text,
link: '',
aid: '',
bvid: '',
}
}
export class SearchBox extends NavbarComponent { export class SearchBox extends NavbarComponent {
constructor() { constructor() {
super() super()
@ -95,6 +124,9 @@ export class SearchBox extends NavbarComponent {
<i class="mdi mdi-18px mdi-delete-sweep"></i> <i class="mdi mdi-18px mdi-delete-sweep"></i>
</div> </div>
<div class="copy-tip" :class="{show: showCopyTip}">
</div>
</div> </div>
` `
this.init() this.init()
@ -110,22 +142,12 @@ export class SearchBox extends NavbarComponent {
e.preventDefault() e.preventDefault()
return false return false
} }
if (/^av[\d]+$/i.test(keywordInput.value)) { const idJump = getIdJump(keywordInput.value)
window.open(`https://www.bilibili.com/${keywordInput.value.toLowerCase()}`, '_blank') if (idJump.success) {
window.open(idJump.link, '_blank')
e.preventDefault() e.preventDefault()
return false return false
} }
if (/^bv[\da-zA-Z]+$/i.test(keywordInput.value)) {
window.open(`https://www.bilibili.com/${keywordInput.value.replace(/^bv/i, 'BV')}`, '_blank')
e.preventDefault()
return false
}
// const now = Number(new Date())
// if (keywordInput.value === '拜年祭' && Number(new Date('2020-01-17')) < now && now < Number(new Date('2020-02-01'))) {
// window.open(`https://www.bilibili.com/blackboard/xianxing2020bnj.html`)
// e.preventDefault()
// return false
// }
const historyItem = settings.searchHistory.find(item => item.keyword === keywordInput.value) const historyItem = settings.searchHistory.find(item => item.keyword === keywordInput.value)
if (historyItem) { if (historyItem) {
historyItem.count++ historyItem.count++
@ -168,14 +190,25 @@ export class SearchBox extends NavbarComponent {
data: { data: {
items: [] as SuggestItem[], items: [] as SuggestItem[],
isHistory: true, isHistory: true,
showCopyTip: false,
}, },
methods: { methods: {
closeCopyTip: _.debounce(function () { this.showCopyTip = false }, 2000),
copy(value: string) {
GM.setClipboard(value, 'text')
this.showCopyTip = true
this.closeCopyTip()
},
submit(value: string) { submit(value: string) {
if (getIdJump(value).success) {
this.copy(value)
} else {
keywordInput.value = value keywordInput.value = value
form.submit() form.submit()
// submit method will not trigger submit event // submit method will not trigger submit event
// see https://developer.mozilla.org/en-US/docs/Web/API/HTMLFormElement/submit // see https://developer.mozilla.org/en-US/docs/Web/API/HTMLFormElement/submit
raiseEvent(form, 'submit') raiseEvent(form, 'submit')
}
}, },
nextItem(index: number) { nextItem(index: number) {
const item = dq(`.custom-navbar .search-list-item:nth-child(${index + 2})`) as HTMLElement const item = dq(`.custom-navbar .search-list-item:nth-child(${index + 2})`) as HTMLElement
@ -193,6 +226,9 @@ export class SearchBox extends NavbarComponent {
} }
}, },
deleteItem(item: SuggestItem, index: number) { deleteItem(item: SuggestItem, index: number) {
if (keywordInput.value !== '') {
return
}
const historyIndex = settings.searchHistory.findIndex(it => it.keyword === item.value) const historyIndex = settings.searchHistory.findIndex(it => it.keyword === item.value)
const [historyItem] = settings.searchHistory.splice(historyIndex, 1) const [historyItem] = settings.searchHistory.splice(historyIndex, 1)
// originalHistory.remove(historyItem) // originalHistory.remove(historyItem)
@ -210,6 +246,7 @@ export class SearchBox extends NavbarComponent {
const updateSuggest = async () => { const updateSuggest = async () => {
const text = keywordInput.value const text = keywordInput.value
searchList.isHistory = text === '' searchList.isHistory = text === ''
const idJump = getIdJump(text)
if (searchList.isHistory) { if (searchList.isHistory) {
// searchList.items = originalHistory.merge(settings.searchHistory) // searchList.items = originalHistory.merge(settings.searchHistory)
searchList.items = settings.searchHistory searchList.items = settings.searchHistory
@ -224,6 +261,39 @@ export class SearchBox extends NavbarComponent {
html: item.keyword, html: item.keyword,
} }
}).slice(0, 10) }).slice(0, 10)
} else if (idJump.success) {
searchList.items = []
const url = idJump.aid ? `https://api.bilibili.com/x/web-interface/view?aid=${idJump.aid}` : `https://api.bilibili.com/x/web-interface/view?bvid=${idJump.bvid}`
const json = await Ajax.getJson(url)
if (idJump.aid) {
const bvid = _.get(json, 'data.bvid', null)
if (bvid !== null) {
searchList.items = [
{
value: bvid,
html: `复制BV号: ${bvid}`,
},
// {
// value: `https://www.bilibili.com/${bvid}`,
// html: `复制BV号链接: https://.../${bvid}`,
// }
]
}
} else if (idJump.bvid) {
const aid = _.get(json, 'data.aid', null)
if (aid !== null) {
searchList.items = [
{
value: 'av' + aid,
html: `复制AV号: av${aid}`,
},
// {
// value: `https://www.bilibili.com/av${aid}`,
// html: `复制AV号链接: https://.../av${aid}`,
// }
]
}
}
} else { } else {
const url = `https://s.search.bilibili.com/main/suggest?func=suggest&suggest_type=accurate&sub_type=tag&main_ver=v1&highlight=&userid=${getUID()}&bangumi_acc_num=1&special_acc_num=1&topic_acc_num=1&upuser_acc_num=3&tag_num=10&special_num=10&bangumi_num=10&upuser_num=3&term=${text}` const url = `https://s.search.bilibili.com/main/suggest?func=suggest&suggest_type=accurate&sub_type=tag&main_ver=v1&highlight=&userid=${getUID()}&bangumi_acc_num=1&special_acc_num=1&topic_acc_num=1&upuser_acc_num=3&tag_num=10&special_num=10&bangumi_num=10&upuser_num=3&term=${text}`
lastQueuedRequest = url lastQueuedRequest = url

View File

@ -0,0 +1,12 @@
.bvid-convert {
border: 2px solid #8882;
border-radius: 8px;
padding: 6px 8px;
margin: 4px 0;
order: -1;
width: 100%;
box-sizing: border-box;
&-item {
font-size: 14px;
}
}

View File

@ -0,0 +1,23 @@
export default {
widget: {
content: /*html*/`<div class="bvid-convert"></div>`,
condition: async () => {
if ([
'https://www.bilibili.com/video/',
'https://www.bilibili.com/bangumi/',
].some(it => document.URL.startsWith(it))) {
return Boolean(await SpinQuery.select(() => unsafeWindow.aid || unsafeWindow.bvid))
} else {
return false
}
},
success: () => {
resources.applyStyle('bvidConvertStyle')
const label = dq('.bvid-convert') as HTMLDivElement
label.innerHTML = /*html*/`
<div class="bvid-convert-item">av${unsafeWindow.aid}</div>
<div class="bvid-convert-item">${unsafeWindow.bvid}</div>
`
}
}
}