From 1b187bf2564a4e0ba2c9b98ae992ba91b8b8ac65 Mon Sep 17 00:00:00 2001 From: the1812 Date: Sun, 15 Sep 2024 10:20:12 +0800 Subject: [PATCH 01/40] Update changelog --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index eda46a55ee..a715106137 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,9 +2,12 @@ # 更新日志 ## v2.9.3-preview +`2024-09-15` + 主要是各种修复, 见 [v2.9.3](https://github.com/the1812/Bilibili-Evolved/releases/tag/v2.9.3). ## v2.9.3 +`2024-09-15`
正式版用户将获得 v2.9.1-preview ~ v2.9.2-preview 的所有改动, 点击展开查看 From 00723a9845e59ba58d75daff6c334c373718c6ba Mon Sep 17 00:00:00 2001 From: gouzi <530971494@qq.com> Date: Tue, 17 Sep 2024 10:07:50 +0800 Subject: [PATCH 02/40] feat: add del self feeds --- .../lib/components/feeds/del-feeds/Widget.vue | 42 ++++++ .../feeds/del-feeds/check-in-item.ts | 134 ++++++++++++++++++ .../lib/components/feeds/del-feeds/index.md | 1 + .../lib/components/feeds/del-feeds/index.ts | 16 +++ src/components/feeds/api/manager/v2.ts | 1 + src/components/feeds/api/types.ts | 2 + 6 files changed, 196 insertions(+) create mode 100644 registry/lib/components/feeds/del-feeds/Widget.vue create mode 100644 registry/lib/components/feeds/del-feeds/check-in-item.ts create mode 100644 registry/lib/components/feeds/del-feeds/index.md create mode 100644 registry/lib/components/feeds/del-feeds/index.ts diff --git a/registry/lib/components/feeds/del-feeds/Widget.vue b/registry/lib/components/feeds/del-feeds/Widget.vue new file mode 100644 index 0000000000..12321d57c8 --- /dev/null +++ b/registry/lib/components/feeds/del-feeds/Widget.vue @@ -0,0 +1,42 @@ + + + diff --git a/registry/lib/components/feeds/del-feeds/check-in-item.ts b/registry/lib/components/feeds/del-feeds/check-in-item.ts new file mode 100644 index 0000000000..aa06777df0 --- /dev/null +++ b/registry/lib/components/feeds/del-feeds/check-in-item.ts @@ -0,0 +1,134 @@ +import { getJsonWithCredentials, postJsonWithCredentials } from '@/core/ajax' +import { Toast } from '@/core/toast' +import { getUID, getCsrf } from '@/core/utils' +import { registerAndGetData } from '@/plugins/data' + +export interface CheckInItem { + name: string + displayName: string + icon: string + action: (button: HTMLDivElement, event: MouseEvent) => Promise + disabled?: boolean +} +const builtInItems: CheckInItem[] = [ + { + name: 'del-all-feeds', + displayName: '删除所有动态', + icon: 'mdi-delete', + action: async () => { + const { forEachFeedsCard } = await import('@/components/feeds/api') + Toast.info('如果想删除所有动态, 可以一直下拉页面到没有动态为止', '删除动态', 3000) + + // 只能删除本页 + await forEachFeedsCard({ + added: async card => { + // 检查是否是转发动态 + const post_del_dynamic_data = { + dyn_id_str: card.id, + dyn_type: card.type.id, + rid_str: card.id, + } + // 删除动态 + const del_dynamic_resp = JSON.parse( + await postJsonWithCredentials( + `https://api.bilibili.com/x/dynamic/feed/operate/remove?platform=web&csrf=${getCsrf()}`, + post_del_dynamic_data, + ), + ) as { + code: number + message: string + ttl: number + data: null + } + + if (del_dynamic_resp.code === 0) { + console.info('删除动态成功: ', card.id) + } else { + console.info('删除动态失败: ', card.id, del_dynamic_resp) + } + }, + }) + Toast.success(`打开控制台查看删除动态结果`, '删除动态', 3000) + }, + }, + { + name: 'del-feeds', + displayName: '删除转发抽奖动态', + icon: 'mdi-delete', + action: async () => { + const { forEachFeedsCard } = await import('@/components/feeds/api') + Toast.info('如果想删除所有动态, 可以一直下拉页面到没有动态为止', '删除动态', 3000) + await forEachFeedsCard({ + added: async card => { + const { isRepostType } = await import('@/components/feeds/api') + + // 判断是否是转发动态 + if (isRepostType(card)) { + const uid = getUID() + + const dynamic_info = (await getJsonWithCredentials( + `https://api.vc.bilibili.com/lottery_svr/v2/lottery_svr/lottery_notice?dynamic_id=${card.repostId}`, + )) as { + code: number + data: { + lottery_time: number + lottery_result: { + first_prize_result: { + uid: number + }[] + } + } + } + + // 检查抽奖时间 + if ( + dynamic_info.data.lottery_time && + dynamic_info.data.lottery_time > Date.now() / 1000 + ) { + // 抽奖未开始, 不能删除 + return + } + + if (dynamic_info.code === 0) { + // 检查是否中奖 + for (let i = 0; i < dynamic_info.data.lottery_result.first_prize_result.length; i++) { + if (dynamic_info.data.lottery_result.first_prize_result[i].uid === Number(uid)) { + Toast.info(`居然中奖了, 不能接受😭😭😭, 动态ID: ${card.id}`, '删除动态', 10000) + return + } + } + + const post_del_dynamic_data = { + dyn_id_str: card.id, + dyn_type: card.type.id, + rid_str: card.id, + } + // 删除动态 + const del_dynamic_resp = JSON.parse( + await postJsonWithCredentials( + `https://api.bilibili.com/x/dynamic/feed/operate/remove?platform=web&csrf=${getCsrf()}`, + post_del_dynamic_data, + ), + ) as { + code: number + message: string + ttl: number + data: null + } + + if (del_dynamic_resp.code === 0) { + console.info('删除动态成功: ', card.id) + } else { + console.info('删除动态失败: ', card.id, del_dynamic_resp) + } + } + } + }, + }) + + Toast.success(`打开控制台查看删除动态结果`, '删除动态', 3000) + }, + }, +] + +export const [checkInItems] = registerAndGetData('checkInCenter.items', builtInItems) diff --git a/registry/lib/components/feeds/del-feeds/index.md b/registry/lib/components/feeds/del-feeds/index.md new file mode 100644 index 0000000000..59fb2a8534 --- /dev/null +++ b/registry/lib/components/feeds/del-feeds/index.md @@ -0,0 +1 @@ +删除动态, 可选转发抽奖, 和全部删除. diff --git a/registry/lib/components/feeds/del-feeds/index.ts b/registry/lib/components/feeds/del-feeds/index.ts new file mode 100644 index 0000000000..c271ccc814 --- /dev/null +++ b/registry/lib/components/feeds/del-feeds/index.ts @@ -0,0 +1,16 @@ +import { defineComponentMetadata } from '@/components/define' +import { getUID } from '@/core/utils' + +export const component = defineComponentMetadata({ + name: 'delFeeds', + displayName: '删除动态', + tags: [componentsTags.feeds], + description: { + 'zh-CN': `删除动态, 可选转发抽奖(不会删除自己中奖的动态), 和全部删除.`, + }, + entry: none, + urlInclude: [`https://space.bilibili.com/${getUID()}/dynamic`], + widget: { + component: () => import('./Widget.vue').then(m => m.default), + }, +}) diff --git a/src/components/feeds/api/manager/v2.ts b/src/components/feeds/api/manager/v2.ts index 06c45e1307..1c523847d2 100644 --- a/src/components/feeds/api/manager/v2.ts +++ b/src/components/feeds/api/manager/v2.ts @@ -124,6 +124,7 @@ const parseCard = async (element: HTMLElement): Promise => { } card.getText = async () => combineText(getText(modules.module_dynamic, cardType), getText(repostDynamicModule, cardType)) + card.repostId = vueData.data.orig.id_str } card.text = await card.getText() card.element.setAttribute('data-did', card.id) diff --git a/src/components/feeds/api/types.ts b/src/components/feeds/api/types.ts index 5280bfdc40..e7f0d5cb3b 100644 --- a/src/components/feeds/api/types.ts +++ b/src/components/feeds/api/types.ts @@ -121,6 +121,8 @@ export interface RepostFeedsCard extends FeedsCard { repostUsername: string /** 被转发动态的内容 */ repostText: string + /** 被转发动态的卡片 */ + repostId: string type: RepostFeedsCardType } /** From a29af2e27b85169bf0e30cc3dbfad4a26a2dea58 Mon Sep 17 00:00:00 2001 From: the1812 Date: Wed, 18 Sep 2024 23:07:05 +0800 Subject: [PATCH 03/40] Fix SRI on streamsaver (fix #4913) --- webpack/cdn/jsdelivr.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/webpack/cdn/jsdelivr.ts b/webpack/cdn/jsdelivr.ts index 219c8ec276..2322248102 100644 --- a/webpack/cdn/jsdelivr.ts +++ b/webpack/cdn/jsdelivr.ts @@ -26,8 +26,8 @@ export const jsDelivr: CdnConfig = { sha256: '0ea5a6fbfbf5434b606878533cb7a66bcf700f0f08afe908335d0978fb63ad94', }, streamsaver: { - url: `https://${host}/npm/streamsaver@2.0.6/StreamSaver.min.js`, - sha256: '64f465e51e5992be894c5d42330b781544eda5462069fe6be4c7421f02d28c92', + url: `https://${host}/npm/streamsaver@2.0.6/StreamSaver.js`, + sha256: 'a110f78e0b092481dc372901c4d57ae50681d773bc9d55e62356f9a22f17e24b', }, ffmpeg: { worker: { From 3519f5b4620fd7330b041bfa735a94df65f0ecb0 Mon Sep 17 00:00:00 2001 From: gouzi <530971494@qq.com> Date: Thu, 19 Sep 2024 22:43:44 +0800 Subject: [PATCH 04/40] rename --- registry/lib/components/feeds/del-feeds/index.ts | 2 +- src/components/feeds/api/types.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/registry/lib/components/feeds/del-feeds/index.ts b/registry/lib/components/feeds/del-feeds/index.ts index c271ccc814..d9d9e9eb90 100644 --- a/registry/lib/components/feeds/del-feeds/index.ts +++ b/registry/lib/components/feeds/del-feeds/index.ts @@ -2,7 +2,7 @@ import { defineComponentMetadata } from '@/components/define' import { getUID } from '@/core/utils' export const component = defineComponentMetadata({ - name: 'delFeeds', + name: 'deleteFeeds', displayName: '删除动态', tags: [componentsTags.feeds], description: { diff --git a/src/components/feeds/api/types.ts b/src/components/feeds/api/types.ts index e7f0d5cb3b..0baa82e923 100644 --- a/src/components/feeds/api/types.ts +++ b/src/components/feeds/api/types.ts @@ -121,7 +121,7 @@ export interface RepostFeedsCard extends FeedsCard { repostUsername: string /** 被转发动态的内容 */ repostText: string - /** 被转发动态的卡片 */ + /** 被转发动态的 ID */ repostId: string type: RepostFeedsCardType } From 3635d74ef85981c666de8a27ed762814c0caf800 Mon Sep 17 00:00:00 2001 From: the1812 Date: Thu, 19 Sep 2024 23:57:58 +0800 Subject: [PATCH 05/40] Update links --- README.md | 2 +- doc/donate.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 7bc8aad691..620b7151c0 100644 --- a/README.md +++ b/README.md @@ -177,7 +177,7 @@ > 之前的支付宝付款码有点问题, 现已弃用 (不必担心, 转账均已收到), 在爱发电中仍然可以选择支付宝作为付款方式. - + 爱发电 diff --git a/doc/donate.md b/doc/donate.md index 37b7baac80..f02d940e27 100644 --- a/doc/donate.md +++ b/doc/donate.md @@ -18,7 +18,7 @@ ## 爱发电 -https://afdian.net/@the1812?tab=sponsor +https://afdian.com/a/the1812?tab=sponsor ## 微信/支付宝收款 From a4ac1e3b97482b840193482b563460ebe7a66ff8 Mon Sep 17 00:00:00 2001 From: snowrain Date: Sun, 22 Sep 2024 12:05:49 +0800 Subject: [PATCH 06/40] fix(black-list): remove login check --- registry/lib/components/utils/black-list/Settings.vue | 4 ---- 1 file changed, 4 deletions(-) diff --git a/registry/lib/components/utils/black-list/Settings.vue b/registry/lib/components/utils/black-list/Settings.vue index 0a16365bd4..8ac50959db 100644 --- a/registry/lib/components/utils/black-list/Settings.vue +++ b/registry/lib/components/utils/black-list/Settings.vue @@ -2,7 +2,6 @@
+ diff --git a/registry/lib/components/utils/comments/content-replace/settings/ExtraOptions.vue b/registry/lib/components/utils/comments/content-replace/settings/ExtraOptions.vue new file mode 100644 index 0000000000..ca4f483d7e --- /dev/null +++ b/registry/lib/components/utils/comments/content-replace/settings/ExtraOptions.vue @@ -0,0 +1,90 @@ + + + diff --git a/registry/lib/components/utils/comments/content-replace/settings/row.ts b/registry/lib/components/utils/comments/content-replace/settings/row.ts new file mode 100644 index 0000000000..40dd2057b5 --- /dev/null +++ b/registry/lib/components/utils/comments/content-replace/settings/row.ts @@ -0,0 +1,6 @@ +import { getRandomId } from '@/core/utils' + +export class CommentContentReplaceRow { + key = getRandomId() + constructor(public from = '', public to = '') {} +} diff --git a/registry/lib/components/utils/comments/content-replace/utils.ts b/registry/lib/components/utils/comments/content-replace/utils.ts new file mode 100644 index 0000000000..b914c4250a --- /dev/null +++ b/registry/lib/components/utils/comments/content-replace/utils.ts @@ -0,0 +1,9 @@ +export const createEmotionImage = (src: string, alt: string) => { + const element = document.createElement('img') + element.src = src + element.alt = alt + element.loading = 'lazy' + element.style.width = '50px' + element.style.height = '50px' + return element +} From ecb93e149e81fe195523265a0193d4912c81d10a Mon Sep 17 00:00:00 2001 From: the1812 Date: Sun, 20 Oct 2024 10:45:21 +0800 Subject: [PATCH 25/40] Refactor files --- .../handlers/emoticon-to-emoticon.ts | 18 +++ .../handlers/emoticon-to-text.ts | 17 +++ .../content-replace/handlers/index.ts | 36 +++++- .../handlers/node-content-replacer.ts | 4 + .../content-replace/handlers/recursive.ts | 10 ++ .../content-replace/handlers/text-replace.ts | 122 ------------------ .../handlers/text-to-emoticon.ts | 22 ++++ .../content-replace/handlers/text-to-text.ts | 20 +++ .../utils/comments/content-replace/utils.ts | 9 ++ 9 files changed, 134 insertions(+), 124 deletions(-) create mode 100644 registry/lib/components/utils/comments/content-replace/handlers/emoticon-to-emoticon.ts create mode 100644 registry/lib/components/utils/comments/content-replace/handlers/emoticon-to-text.ts create mode 100644 registry/lib/components/utils/comments/content-replace/handlers/node-content-replacer.ts create mode 100644 registry/lib/components/utils/comments/content-replace/handlers/recursive.ts delete mode 100644 registry/lib/components/utils/comments/content-replace/handlers/text-replace.ts create mode 100644 registry/lib/components/utils/comments/content-replace/handlers/text-to-emoticon.ts create mode 100644 registry/lib/components/utils/comments/content-replace/handlers/text-to-text.ts diff --git a/registry/lib/components/utils/comments/content-replace/handlers/emoticon-to-emoticon.ts b/registry/lib/components/utils/comments/content-replace/handlers/emoticon-to-emoticon.ts new file mode 100644 index 0000000000..bc2586407b --- /dev/null +++ b/registry/lib/components/utils/comments/content-replace/handlers/emoticon-to-emoticon.ts @@ -0,0 +1,18 @@ +import { isUrl } from '../utils' +import { NodeContentReplacer } from './node-content-replacer' + +export class EmoticonToEmoticonReplacer extends NodeContentReplacer { + isKeywordMatch(node: Node, keyword: string, target: string) { + if (node instanceof HTMLImageElement) { + return node.alt === keyword && isUrl(target) + } + return false + } + replaceContent(node: Node, keyword: string, target: string): Node[] { + if (!(node instanceof HTMLImageElement)) { + return [] + } + node.src = target + return [] + } +} diff --git a/registry/lib/components/utils/comments/content-replace/handlers/emoticon-to-text.ts b/registry/lib/components/utils/comments/content-replace/handlers/emoticon-to-text.ts new file mode 100644 index 0000000000..4c6b1a4dc6 --- /dev/null +++ b/registry/lib/components/utils/comments/content-replace/handlers/emoticon-to-text.ts @@ -0,0 +1,17 @@ +import { NodeContentReplacer } from './node-content-replacer' + +export class EmoticonToTextReplacer extends NodeContentReplacer { + isKeywordMatch(node: Node, keyword: string) { + if (node instanceof HTMLImageElement) { + return node.alt === keyword + } + return false + } + replaceContent(node: Node, keyword: string, target: string): Node[] { + if (!(node instanceof HTMLImageElement)) { + return [] + } + node.replaceWith(new Text(target)) + return [] + } +} diff --git a/registry/lib/components/utils/comments/content-replace/handlers/index.ts b/registry/lib/components/utils/comments/content-replace/handlers/index.ts index 6c39a8e19f..685b47214d 100644 --- a/registry/lib/components/utils/comments/content-replace/handlers/index.ts +++ b/registry/lib/components/utils/comments/content-replace/handlers/index.ts @@ -1,5 +1,37 @@ import { registerData } from '@/plugins/data' -import { textReplace } from './text-replace' +import { getComponentSettings } from '@/core/settings' +import { CommentContentReplaceHandler } from './types' +import { CommentContentReplaceOptions } from '../options' +import { NodeContentReplacer } from './node-content-replacer' +import { EmoticonToEmoticonReplacer } from './emoticon-to-emoticon' +import { EmoticonToTextReplacer } from './emoticon-to-text' +import { RecursiveReplacer } from './recursive' +import { TextToEmoticonReplacer } from './text-to-emoticon' +import { TextToTextReplacer } from './text-to-text' + +const { options } = getComponentSettings('commentContentReplace') + +const contentReplacers: NodeContentReplacer[] = [ + new TextToEmoticonReplacer(), + new EmoticonToEmoticonReplacer(), + new TextToTextReplacer(), + new EmoticonToTextReplacer(), + new RecursiveReplacer(), +] + +export const defaultHandler: CommentContentReplaceHandler = content => { + const { replaceMap } = options + content.forEach(node => { + Object.entries(replaceMap).forEach(([from, to]) => { + const replacer = contentReplacers.find(r => r.isKeywordMatch(node, from, to)) + if (!replacer) { + return + } + const restParts = replacer.replaceContent(node, from, to) + defaultHandler(restParts) + }) + }) +} export const CommentContentReplaceHandlers = 'commentContentReplace.handlers' -export const handlers = registerData(CommentContentReplaceHandlers, [textReplace]) +export const handlers = registerData(CommentContentReplaceHandlers, [defaultHandler]) diff --git a/registry/lib/components/utils/comments/content-replace/handlers/node-content-replacer.ts b/registry/lib/components/utils/comments/content-replace/handlers/node-content-replacer.ts new file mode 100644 index 0000000000..819f1ced7c --- /dev/null +++ b/registry/lib/components/utils/comments/content-replace/handlers/node-content-replacer.ts @@ -0,0 +1,4 @@ +export abstract class NodeContentReplacer { + abstract isKeywordMatch(node: Node, keyword: string, target: string): boolean + abstract replaceContent(node: Node, keyword: string, target: string): Node[] +} diff --git a/registry/lib/components/utils/comments/content-replace/handlers/recursive.ts b/registry/lib/components/utils/comments/content-replace/handlers/recursive.ts new file mode 100644 index 0000000000..fa0a17e0e2 --- /dev/null +++ b/registry/lib/components/utils/comments/content-replace/handlers/recursive.ts @@ -0,0 +1,10 @@ +import { NodeContentReplacer } from './node-content-replacer' + +export class RecursiveReplacer extends NodeContentReplacer { + isKeywordMatch() { + return true + } + replaceContent(node: Node): Node[] { + return Array.from(node.childNodes) + } +} diff --git a/registry/lib/components/utils/comments/content-replace/handlers/text-replace.ts b/registry/lib/components/utils/comments/content-replace/handlers/text-replace.ts deleted file mode 100644 index bd0246275b..0000000000 --- a/registry/lib/components/utils/comments/content-replace/handlers/text-replace.ts +++ /dev/null @@ -1,122 +0,0 @@ -import { getComponentSettings } from '@/core/settings' -import { createEmotionImage } from '../utils' -import { CommentContentReplaceHandler } from './types' -import { CommentContentReplaceOptions } from '../options' - -const { options } = getComponentSettings('commentContentReplace') - -const isUrl = (text: string) => { - try { - const url = new URL(text) - return Boolean(url) - } catch (error) { - return false - } -} - -abstract class NodeContentReplacer { - abstract isKeywordMatch(node: Node, keyword: string, target: string): boolean - abstract replaceContent(node: Node, keyword: string, target: string): Node[] -} - -class TextToTextReplacer extends NodeContentReplacer { - isKeywordMatch(node: Node, keyword: string) { - if (node instanceof Text) { - return node.textContent.includes(keyword) - } - return false - } - replaceContent(node: Node, keyword: string, target: string): Node[] { - const index = node.textContent.indexOf(keyword) - if (index === -1) { - return [] - } - const leftPart = node.textContent.substring(0, index) - const rightPart = node.textContent.substring(index + keyword.length) - node.textContent = `${leftPart}${target}${rightPart}` - return [] - } -} - -class TextToEmotionReplacer extends NodeContentReplacer { - isKeywordMatch(node: Node, keyword: string, target: string) { - if (node instanceof Text) { - return node.textContent.includes(keyword) && isUrl(target) - } - return false - } - replaceContent(node: Node, keyword: string, target: string): Node[] { - const index = node.textContent.indexOf(keyword) - if (index === -1 || !(node instanceof Text)) { - return [] - } - const leftPart = new Text(node.textContent.substring(0, index)) - const imageElement = createEmotionImage(target, keyword) - const rightPart = new Text(node.textContent.substring(index + keyword.length)) - node.replaceWith(leftPart, imageElement, rightPart) - return [rightPart] - } -} - -class EmotionToTextReplacer extends NodeContentReplacer { - isKeywordMatch(node: Node, keyword: string) { - if (node instanceof HTMLImageElement) { - return node.alt === keyword - } - return false - } - replaceContent(node: Node, keyword: string, target: string): Node[] { - if (!(node instanceof HTMLImageElement)) { - return [] - } - node.replaceWith(new Text(target)) - return [] - } -} - -class EmotionToEmotionReplacer extends NodeContentReplacer { - isKeywordMatch(node: Node, keyword: string, target: string) { - if (node instanceof HTMLImageElement) { - return node.alt === keyword && isUrl(target) - } - return false - } - replaceContent(node: Node, keyword: string, target: string): Node[] { - if (!(node instanceof HTMLImageElement)) { - return [] - } - node.src = target - return [] - } -} - -class RecursiveReplacer extends NodeContentReplacer { - isKeywordMatch() { - return true - } - replaceContent(node: Node): Node[] { - return Array.from(node.childNodes) - } -} - -const contentReplacers: NodeContentReplacer[] = [ - new TextToEmotionReplacer(), - new EmotionToEmotionReplacer(), - new TextToTextReplacer(), - new EmotionToTextReplacer(), - new RecursiveReplacer(), -] - -export const textReplace: CommentContentReplaceHandler = content => { - const { replaceMap } = options - content.forEach(node => { - Object.entries(replaceMap).forEach(([from, to]) => { - const replacer = contentReplacers.find(r => r.isKeywordMatch(node, from, to)) - if (!replacer) { - return - } - const restParts = replacer.replaceContent(node, from, to) - textReplace(restParts) - }) - }) -} diff --git a/registry/lib/components/utils/comments/content-replace/handlers/text-to-emoticon.ts b/registry/lib/components/utils/comments/content-replace/handlers/text-to-emoticon.ts new file mode 100644 index 0000000000..2d06f9ffba --- /dev/null +++ b/registry/lib/components/utils/comments/content-replace/handlers/text-to-emoticon.ts @@ -0,0 +1,22 @@ +import { createEmotionImage, isUrl } from '../utils' +import { NodeContentReplacer } from './node-content-replacer' + +export class TextToEmoticonReplacer extends NodeContentReplacer { + isKeywordMatch(node: Node, keyword: string, target: string) { + if (node instanceof Text) { + return node.textContent.includes(keyword) && isUrl(target) + } + return false + } + replaceContent(node: Node, keyword: string, target: string): Node[] { + const index = node.textContent.indexOf(keyword) + if (index === -1 || !(node instanceof Text)) { + return [] + } + const leftPart = new Text(node.textContent.substring(0, index)) + const imageElement = createEmotionImage(target, keyword) + const rightPart = new Text(node.textContent.substring(index + keyword.length)) + node.replaceWith(leftPart, imageElement, rightPart) + return [rightPart] + } +} diff --git a/registry/lib/components/utils/comments/content-replace/handlers/text-to-text.ts b/registry/lib/components/utils/comments/content-replace/handlers/text-to-text.ts new file mode 100644 index 0000000000..0f8a634ee1 --- /dev/null +++ b/registry/lib/components/utils/comments/content-replace/handlers/text-to-text.ts @@ -0,0 +1,20 @@ +import { NodeContentReplacer } from './node-content-replacer' + +export class TextToTextReplacer extends NodeContentReplacer { + isKeywordMatch(node: Node, keyword: string) { + if (node instanceof Text) { + return node.textContent.includes(keyword) + } + return false + } + replaceContent(node: Node, keyword: string, target: string): Node[] { + const index = node.textContent.indexOf(keyword) + if (index === -1) { + return [] + } + const leftPart = node.textContent.substring(0, index) + const rightPart = node.textContent.substring(index + keyword.length) + node.textContent = `${leftPart}${target}${rightPart}` + return [] + } +} diff --git a/registry/lib/components/utils/comments/content-replace/utils.ts b/registry/lib/components/utils/comments/content-replace/utils.ts index b914c4250a..8c096334eb 100644 --- a/registry/lib/components/utils/comments/content-replace/utils.ts +++ b/registry/lib/components/utils/comments/content-replace/utils.ts @@ -7,3 +7,12 @@ export const createEmotionImage = (src: string, alt: string) => { element.style.height = '50px' return element } + +export const isUrl = (text: string) => { + try { + const url = new URL(text) + return Boolean(url) + } catch (error) { + return false + } +} From 710e6bec56cf21e4f0bfc6298f9412bb60c98b56 Mon Sep 17 00:00:00 2001 From: the1812 Date: Sun, 20 Oct 2024 10:45:29 +0800 Subject: [PATCH 26/40] Fix Vue typing --- src/global.d.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/global.d.ts b/src/global.d.ts index fc8a7e90c6..4c903adc40 100644 --- a/src/global.d.ts +++ b/src/global.d.ts @@ -8,6 +8,7 @@ declare global { const lodash: LoDashStatic const Vue: typeof import('vue/types/umd') + type Vue = import('vue/types/umd') type EnumEventTarget = EventTarget & { addEventListener( From 83f70e949b808691f297f9ef4d1c9bd74314cadd Mon Sep 17 00:00:00 2001 From: the1812 Date: Sun, 20 Oct 2024 11:15:14 +0800 Subject: [PATCH 27/40] Allow remove emoticon --- .../comments/content-replace/handlers/emoticon-to-text.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/registry/lib/components/utils/comments/content-replace/handlers/emoticon-to-text.ts b/registry/lib/components/utils/comments/content-replace/handlers/emoticon-to-text.ts index 4c6b1a4dc6..7c70bf8748 100644 --- a/registry/lib/components/utils/comments/content-replace/handlers/emoticon-to-text.ts +++ b/registry/lib/components/utils/comments/content-replace/handlers/emoticon-to-text.ts @@ -11,7 +11,11 @@ export class EmoticonToTextReplacer extends NodeContentReplacer { if (!(node instanceof HTMLImageElement)) { return [] } - node.replaceWith(new Text(target)) + if (target === '') { + node.remove() + } else { + node.replaceWith(new Text(target)) + } return [] } } From 437b7ad2a28ef12be562b23d9e3bdbf8028b77d0 Mon Sep 17 00:00:00 2001 From: the1812 Date: Sun, 20 Oct 2024 11:15:31 +0800 Subject: [PATCH 28/40] Add CommentContentReplaceMap plugin data --- .../utils/comments/content-replace/handlers/index.ts | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/registry/lib/components/utils/comments/content-replace/handlers/index.ts b/registry/lib/components/utils/comments/content-replace/handlers/index.ts index 685b47214d..cd67b0a0e3 100644 --- a/registry/lib/components/utils/comments/content-replace/handlers/index.ts +++ b/registry/lib/components/utils/comments/content-replace/handlers/index.ts @@ -1,4 +1,4 @@ -import { registerData } from '@/plugins/data' +import { registerAndGetData } from '@/plugins/data' import { getComponentSettings } from '@/core/settings' import { CommentContentReplaceHandler } from './types' import { CommentContentReplaceOptions } from '../options' @@ -19,10 +19,12 @@ const contentReplacers: NodeContentReplacer[] = [ new RecursiveReplacer(), ] -export const defaultHandler: CommentContentReplaceHandler = content => { +export const CommentContentReplaceMap = 'commentContentReplace.map' +const defaultHandler: CommentContentReplaceHandler = content => { const { replaceMap } = options + const [finalReplaceMap] = registerAndGetData(CommentContentReplaceMap, replaceMap) content.forEach(node => { - Object.entries(replaceMap).forEach(([from, to]) => { + Object.entries(finalReplaceMap).forEach(([from, to]) => { const replacer = contentReplacers.find(r => r.isKeywordMatch(node, from, to)) if (!replacer) { return @@ -34,4 +36,4 @@ export const defaultHandler: CommentContentReplaceHandler = content => { } export const CommentContentReplaceHandlers = 'commentContentReplace.handlers' -export const handlers = registerData(CommentContentReplaceHandlers, [defaultHandler]) +export const handlers = registerAndGetData(CommentContentReplaceHandlers, [defaultHandler]) From bb4914d1d1326402e88a8f2621c3f30daf7d1ffa Mon Sep 17 00:00:00 2001 From: the1812 Date: Sun, 20 Oct 2024 11:17:45 +0800 Subject: [PATCH 29/40] Update descriptions --- .../utils/comments/content-replace/index.md | 2 +- .../content-replace/settings/ContentReplaceRow.vue | 14 ++++++++++++-- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/registry/lib/components/utils/comments/content-replace/index.md b/registry/lib/components/utils/comments/content-replace/index.md index 8162bc810c..6d980e9c7e 100644 --- a/registry/lib/components/utils/comments/content-replace/index.md +++ b/registry/lib/components/utils/comments/content-replace/index.md @@ -1,3 +1,3 @@ 替换评论中的内容. -可以添加多个替换配置, 每项配置可将一个关键词替换为其他文本. 若替换的目标是一个链接, 则视作替换为表情. +可以添加多个替换配置, 每项配置可将一个关键词替换为其他文本. 若替换的目标是一个链接, 则视作替换为表情, 留空则会移除命中的关键词. diff --git a/registry/lib/components/utils/comments/content-replace/settings/ContentReplaceRow.vue b/registry/lib/components/utils/comments/content-replace/settings/ContentReplaceRow.vue index f0f69fb2b1..6b89b14465 100644 --- a/registry/lib/components/utils/comments/content-replace/settings/ContentReplaceRow.vue +++ b/registry/lib/components/utils/comments/content-replace/settings/ContentReplaceRow.vue @@ -1,7 +1,12 @@ From 13d8e870855932dad26ee2369ba51c2658d7fbd9 Mon Sep 17 00:00:00 2001 From: the1812 Date: Sun, 20 Oct 2024 11:20:57 +0800 Subject: [PATCH 30/40] Ignore invalid keyword --- .../utils/comments/content-replace/handlers/index.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/registry/lib/components/utils/comments/content-replace/handlers/index.ts b/registry/lib/components/utils/comments/content-replace/handlers/index.ts index cd67b0a0e3..3062a90aa9 100644 --- a/registry/lib/components/utils/comments/content-replace/handlers/index.ts +++ b/registry/lib/components/utils/comments/content-replace/handlers/index.ts @@ -25,6 +25,9 @@ const defaultHandler: CommentContentReplaceHandler = content => { const [finalReplaceMap] = registerAndGetData(CommentContentReplaceMap, replaceMap) content.forEach(node => { Object.entries(finalReplaceMap).forEach(([from, to]) => { + if (from === to || from === '') { + return + } const replacer = contentReplacers.find(r => r.isKeywordMatch(node, from, to)) if (!replacer) { return From 315826f038e12c3945a0c93facec058ad9714eef Mon Sep 17 00:00:00 2001 From: the1812 Date: Sun, 20 Oct 2024 11:40:58 +0800 Subject: [PATCH 31/40] Add CommentContentReplaceContext, improve namings --- .../content-replace/handlers/index.ts | 37 +++++++++++-------- .../handlers/text-to-emoticon.ts | 4 +- .../content-replace/handlers/types.ts | 10 ++++- .../utils/comments/content-replace/index.ts | 2 +- .../utils/comments/content-replace/utils.ts | 2 +- 5 files changed, 35 insertions(+), 20 deletions(-) diff --git a/registry/lib/components/utils/comments/content-replace/handlers/index.ts b/registry/lib/components/utils/comments/content-replace/handlers/index.ts index 3062a90aa9..514fdc828a 100644 --- a/registry/lib/components/utils/comments/content-replace/handlers/index.ts +++ b/registry/lib/components/utils/comments/content-replace/handlers/index.ts @@ -19,23 +19,30 @@ const contentReplacers: NodeContentReplacer[] = [ new RecursiveReplacer(), ] -export const CommentContentReplaceMap = 'commentContentReplace.map' -const defaultHandler: CommentContentReplaceHandler = content => { +export const CommentContentReplaceDefaultHandlerReplaceMap = + 'commentContentReplace.defaultHandler.replaceMap' +const defaultHandler: CommentContentReplaceHandler = ({ content }) => { const { replaceMap } = options - const [finalReplaceMap] = registerAndGetData(CommentContentReplaceMap, replaceMap) - content.forEach(node => { - Object.entries(finalReplaceMap).forEach(([from, to]) => { - if (from === to || from === '') { - return - } - const replacer = contentReplacers.find(r => r.isKeywordMatch(node, from, to)) - if (!replacer) { - return - } - const restParts = replacer.replaceContent(node, from, to) - defaultHandler(restParts) + const [finalReplaceMap] = registerAndGetData( + CommentContentReplaceDefaultHandlerReplaceMap, + replaceMap, + ) + const replaceNodes = (nodes: Node[]) => { + nodes.forEach(node => { + Object.entries(finalReplaceMap).forEach(([from, to]) => { + if (from === to || from === '') { + return + } + const replacer = contentReplacers.find(r => r.isKeywordMatch(node, from, to)) + if (!replacer) { + return + } + const restParts = replacer.replaceContent(node, from, to) + replaceNodes(restParts) + }) }) - }) + } + replaceNodes(content) } export const CommentContentReplaceHandlers = 'commentContentReplace.handlers' diff --git a/registry/lib/components/utils/comments/content-replace/handlers/text-to-emoticon.ts b/registry/lib/components/utils/comments/content-replace/handlers/text-to-emoticon.ts index 2d06f9ffba..dd71991bd2 100644 --- a/registry/lib/components/utils/comments/content-replace/handlers/text-to-emoticon.ts +++ b/registry/lib/components/utils/comments/content-replace/handlers/text-to-emoticon.ts @@ -1,4 +1,4 @@ -import { createEmotionImage, isUrl } from '../utils' +import { createEmoticonImage, isUrl } from '../utils' import { NodeContentReplacer } from './node-content-replacer' export class TextToEmoticonReplacer extends NodeContentReplacer { @@ -14,7 +14,7 @@ export class TextToEmoticonReplacer extends NodeContentReplacer { return [] } const leftPart = new Text(node.textContent.substring(0, index)) - const imageElement = createEmotionImage(target, keyword) + const imageElement = createEmoticonImage(target, keyword) const rightPart = new Text(node.textContent.substring(index + keyword.length)) node.replaceWith(leftPart, imageElement, rightPart) return [rightPart] diff --git a/registry/lib/components/utils/comments/content-replace/handlers/types.ts b/registry/lib/components/utils/comments/content-replace/handlers/types.ts index a62cdbd24f..493f99df7a 100644 --- a/registry/lib/components/utils/comments/content-replace/handlers/types.ts +++ b/registry/lib/components/utils/comments/content-replace/handlers/types.ts @@ -1 +1,9 @@ -export type CommentContentReplaceHandler = (content: Node[]) => void | Promise +import type { CommentItem } from '@/components/utils/comment-apis' + +export interface CommentContentReplaceContext { + commentItem: CommentItem + content: Node[] +} +export type CommentContentReplaceHandler = ( + context: CommentContentReplaceContext, +) => void | Promise diff --git a/registry/lib/components/utils/comments/content-replace/index.ts b/registry/lib/components/utils/comments/content-replace/index.ts index b1a7cc798d..a383c06be9 100644 --- a/registry/lib/components/utils/comments/content-replace/index.ts +++ b/registry/lib/components/utils/comments/content-replace/index.ts @@ -28,7 +28,7 @@ export const component = defineComponentMetadata({ const [handlers] = getData(CommentContentReplaceHandlers) as [ CommentContentReplaceHandler[], ] - handlers.forEach(h => h(Array.from(content.childNodes))) + handlers.forEach(h => h({ commentItem, content: Array.from(content.childNodes) })) }, }) }, diff --git a/registry/lib/components/utils/comments/content-replace/utils.ts b/registry/lib/components/utils/comments/content-replace/utils.ts index 8c096334eb..8df970e63a 100644 --- a/registry/lib/components/utils/comments/content-replace/utils.ts +++ b/registry/lib/components/utils/comments/content-replace/utils.ts @@ -1,4 +1,4 @@ -export const createEmotionImage = (src: string, alt: string) => { +export const createEmoticonImage = (src: string, alt: string) => { const element = document.createElement('img') element.src = src element.alt = alt From c856bf9cce2eb541aac078a1230a9c2f09779a20 Mon Sep 17 00:00:00 2001 From: oxygenkun Date: Sun, 20 Oct 2024 14:46:27 +0800 Subject: [PATCH 32/40] =?UTF-8?q?[feat]=20=E7=9B=B4=E6=92=AD=E5=88=97?= =?UTF-8?q?=E8=A1=A8=E7=94=A8=E6=96=B0=E7=9A=84url=EF=BC=8C=E7=AE=80?= =?UTF-8?q?=E5=8C=96=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/feeds/extend-live/LiveList.vue | 71 +++++-------------- 1 file changed, 16 insertions(+), 55 deletions(-) diff --git a/registry/lib/components/feeds/extend-live/LiveList.vue b/registry/lib/components/feeds/extend-live/LiveList.vue index f73827ca2d..3a4412ecce 100644 --- a/registry/lib/components/feeds/extend-live/LiveList.vue +++ b/registry/lib/components/feeds/extend-live/LiveList.vue @@ -50,7 +50,7 @@ From 7668bd0f05f4a084d634932d674f2604ecf670a0 Mon Sep 17 00:00:00 2001 From: the1812 Date: Mon, 21 Oct 2024 21:53:40 +0800 Subject: [PATCH 33/40] Fix pendent styles --- .../style/hide/user-pendent/user-pendent-shadow.scss | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/registry/lib/components/style/hide/user-pendent/user-pendent-shadow.scss b/registry/lib/components/style/hide/user-pendent/user-pendent-shadow.scss index 88e0cef20c..ffba4a2fb0 100644 --- a/registry/lib/components/style/hide/user-pendent/user-pendent-shadow.scss +++ b/registry/lib/components/style/hide/user-pendent/user-pendent-shadow.scss @@ -3,11 +3,13 @@ container-name: avatar; // .layers:first-child, .layer:not(:first-child), - .layer:not(:has(picture)) { + .layer:not(:has(picture), :has([style*="/face/"])) { display: none; } - .layer:has(picture) { + .layer:is(:has(picture), :has([style*="/face/"])) { min-width: 100cqw; min-height: 100cqh; + max-width: 100cqw; + max-height: 100cqh; } } From 5eaffeefa3460bf6716cbc9a840fa30bae19e832 Mon Sep 17 00:00:00 2001 From: the1812 Date: Sun, 20 Oct 2024 10:45:29 +0800 Subject: [PATCH 34/40] Fix Vue typing --- src/global.d.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/global.d.ts b/src/global.d.ts index fc8a7e90c6..4c903adc40 100644 --- a/src/global.d.ts +++ b/src/global.d.ts @@ -8,6 +8,7 @@ declare global { const lodash: LoDashStatic const Vue: typeof import('vue/types/umd') + type Vue = import('vue/types/umd') type EnumEventTarget = EventTarget & { addEventListener( From 4e1572f7e2ae75a7517890cbb804486186df2029 Mon Sep 17 00:00:00 2001 From: the1812 Date: Tue, 22 Oct 2024 07:52:06 +0800 Subject: [PATCH 35/40] Remove redundant title (fix #4962) --- .../lib/components/style/custom-navbar/history/NavbarHistory.vue | 1 - 1 file changed, 1 deletion(-) diff --git a/registry/lib/components/style/custom-navbar/history/NavbarHistory.vue b/registry/lib/components/style/custom-navbar/history/NavbarHistory.vue index 4b50725dee..4e25c4ecc6 100644 --- a/registry/lib/components/style/custom-navbar/history/NavbarHistory.vue +++ b/registry/lib/components/style/custom-navbar/history/NavbarHistory.vue @@ -26,7 +26,6 @@
Date: Mon, 14 Oct 2024 23:10:47 +0800 Subject: [PATCH 36/40] Fix danmaku settings not read (#4824) --- .../components/video/danmaku/download/utils.ts | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/registry/lib/components/video/danmaku/download/utils.ts b/registry/lib/components/video/danmaku/download/utils.ts index b480fc5650..18d2fd1ffe 100644 --- a/registry/lib/components/video/danmaku/download/utils.ts +++ b/registry/lib/components/video/danmaku/download/utils.ts @@ -117,17 +117,17 @@ export const getUserDanmakuConfig = async () => { })() // 加粗 - config.bold = playerAgent.getPlayerConfig('bold', false) + config.bold = playerAgent.getPlayerConfig('dmSetting.bold', false) // 透明度 config.alpha = lodash.clamp( - 1 - parseFloat(playerAgent.getPlayerConfig('opacity', '0.4')), + 1 - parseFloat(playerAgent.getPlayerConfig('dmSetting.opacity', '0.4')), 0, 1, ) // 分辨率 - const resolutionFactor = 1.4 - 0.4 * playerAgent.getPlayerConfig('fontsize', 1) + const resolutionFactor = 1.4 - 0.4 * playerAgent.getPlayerConfig('dmSetting.fontsize', 1) config.resolution = { x: Math.round(1920 * resolutionFactor), y: Math.round(1080 * resolutionFactor), @@ -135,7 +135,7 @@ export const getUserDanmakuConfig = async () => { // 弹幕持续时长 config.duration = (() => { - const scrollDuration = 18 - 3 * playerAgent.getPlayerConfig('speedplus', 0) + const scrollDuration = 18 - 3 * playerAgent.getPlayerConfig('dmSetting.speedplus', 0) return (danmaku: { type: number }) => { switch (danmaku.type) { case 4: @@ -148,10 +148,13 @@ export const getUserDanmakuConfig = async () => { })() // 底部间距 - const bottomMargin = playerAgent.getPlayerConfig('danmakuArea', 0) + const bottomMargin = playerAgent.getPlayerConfig('dmSetting.danmakuArea', 0) config.bottomMarginPercent = bottomMargin >= 100 ? 0 : bottomMargin / 100 // 无显示区域限制时要检查是否开启防挡字幕 - if (config.bottomMarginPercent === 0 && playerAgent.getPlayerConfig('preventshade', false)) { + if ( + config.bottomMarginPercent === 0 && + playerAgent.getPlayerConfig('dmSetting.preventshade', false) + ) { config.bottomMarginPercent = 0.15 } From 2c1b900d2dd1590c4b9d11818c30ff48093e4378 Mon Sep 17 00:00:00 2001 From: the1812 Date: Tue, 22 Oct 2024 08:10:29 +0800 Subject: [PATCH 37/40] Update changelog --- CHANGELOG.md | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a715106137..11045244d2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,51 @@ # 更新日志 +## v2.9.4-preview +`2024-10-22` + +包含 [v2.9.4](https://github.com/the1812/Bilibili-Evolved/releases/tag/v2.9.4) 的所有更新内容. + +✨新增 +- 新增组件 `隐藏头像框`. +> 隐藏页面中用户的头像框 (包括角标), 目前支持动态和视频页面. + +- 新增组件 `隐藏直播马赛克`. (#4634) +> 移除直播画面中的马赛克区域. + +- 优化了搜索框的搜索建议精准度. (#4833) +- 新增组件 `删除动态`. (PR #4915 by [gouzil](https://github.com/gouzil)) +> 删除动态, 可选转发抽奖, 和全部删除. + +- `保存视频元数据` 增加 FFMETADATA 字段选项. (PR #4943 by [WakelessSloth56](https://github.com/WakelessSloth56)) +- 新增组件 `评论内容替换`. (#4072) +> 替换评论中的内容. +> 可以添加多个替换配置, 每项配置可将一个关键词替换为其他文本. 若替换的目标是一个链接, 则视作替换为表情. +> + +- `直播信息扩充` 更换新的 API 接口. (PR #4964 by [Oxygenくん](https://github.com/oxygenkun)) + +## v2.9.4 +`2024-10-22` + +✨新增 +- `屏蔽黑名单up主` 去除了登录校验. (#4917, PR #4926 by [snowraincloud](https://github.com/snowraincloud)) +- `图片批量导出` 适配新型的图片动态. (#4830) +- 更新评论区的 `夜间模式`. (#4931) + +🐛修复 +- 修复 StreamSaver 和 ffmpeg WASM 的 SRI 校验问题. (#4913, #4864) +- 修复下载合集时 BV 号命名重复. (#4818) +- 修复 `删除广告` 去除首页广告时没有遵循 `占位文本` 选项. (#4836) +- 修复 `自定义顶栏` 历史面板中的多余 title 提示. (#4962) +- 修复下载弹幕时播放器设置没有正确读取. (#4824) + +🗑️废弃 +- `自定义顶栏` 删除 `相簿` 入口. + +☕开发者相关 +- 修复 DevClient 无法重载 Shadow DOM 样式. + ## v2.9.3-preview `2024-09-15` From b3872e179bfaa5bafc8d9993f3ddd213571b6dd4 Mon Sep 17 00:00:00 2001 From: the1812 Date: Tue, 22 Oct 2024 08:10:42 +0800 Subject: [PATCH 38/40] Update version number --- src/client/common.meta.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/client/common.meta.json b/src/client/common.meta.json index f5a6c2d70f..45aff1fb4e 100644 --- a/src/client/common.meta.json +++ b/src/client/common.meta.json @@ -1,5 +1,5 @@ { - "version": "2.9.3", + "version": "2.9.4", "author": "Grant Howard, Coulomb-G", "copyright": "[year], Grant Howard (https://github.com/the1812) & Coulomb-G (https://github.com/Coulomb-G)", "license": "MIT", From 46c301f23016c45ac32945b213ae45109a09cd20 Mon Sep 17 00:00:00 2001 From: the1812 Date: Tue, 22 Oct 2024 08:16:10 +0800 Subject: [PATCH 39/40] Update donate history --- doc/donate.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/doc/donate.md b/doc/donate.md index f02d940e27..1b804b50b5 100644 --- a/doc/donate.md +++ b/doc/donate.md @@ -30,6 +30,11 @@ https://afdian.com/a/the1812?tab=sponsor | 时间 | 用户名 | 单号后4位 | 金额 | | ------------------- | --------------------- | --------- | ------- | +| 2024.10.11 11:19:52 | 匿名 | 8738 | ¥100.00 | +| 2024.09.28 22:43:29 | 匿名 | 7519 | ¥20.00 | +| 2024.09.28 17:45:29 | *天 | 7998 | ¥20.00 | +| 2024.09.23 14:19:17 | 匿名 | 1799 | ¥2.33 | +| 2024.09.10 00:19:41 | 匿名 | 1484 | ¥20.00 | | 2024.09.06 16:05:23 | 匿名 | 0752 | ¥5.00 | | 2024.09.03 23:08:43 | *根 | 3956 | ¥20.00 | | 2024.08.25 16:55:07 | 匿名 | 6595 | ¥10.00 | From 32b64401eab57c82c79c9628cff2bc40e8b68204 Mon Sep 17 00:00:00 2001 From: the1812 Date: Tue, 22 Oct 2024 08:21:17 +0800 Subject: [PATCH 40/40] Update docs --- doc/features/features.json | 32 ++++++++++++++++++++++++++++++++ doc/features/features.md | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+) diff --git a/doc/features/features.json b/doc/features/features.json index 176fc61fe9..f5dfb806e1 100644 --- a/doc/features/features.json +++ b/doc/features/features.json @@ -7,6 +7,14 @@ "fullRelativePath": "../../registry/dist/components/feeds/copy-link.js", "fullAbsolutePath": "registry/dist/components/feeds/copy-link.js" }, + { + "type": "component", + "name": "deleteFeeds", + "displayName": "删除动态", + "description": "删除动态, 可选转发抽奖, 和全部删除.\r\n", + "fullRelativePath": "../../registry/dist/components/feeds/del-feeds.js", + "fullAbsolutePath": "registry/dist/components/feeds/del-feeds.js" + }, { "type": "component", "name": "disableFeedsDetails", @@ -135,6 +143,14 @@ "fullRelativePath": "../../registry/dist/components/live/hide-gift-fullscreen.js", "fullAbsolutePath": "registry/dist/components/live/hide-gift-fullscreen.js" }, + { + "type": "component", + "name": "hideLivePlayerBlur", + "displayName": "隐藏直播马赛克", + "description": "移除直播画面中的马赛克区域.\r\n", + "fullRelativePath": "../../registry/dist/components/live/hide-player-blur.js", + "fullAbsolutePath": "registry/dist/components/live/hide-player-blur.js" + }, { "type": "component", "name": "liveHomeMute", @@ -295,6 +311,14 @@ "fullRelativePath": "../../registry/dist/components/style/hide/user-card.js", "fullAbsolutePath": "registry/dist/components/style/hide/user-card.js" }, + { + "type": "component", + "name": "hideUserPendent", + "displayName": "隐藏头像框", + "description": "隐藏页面中用户的头像框 (包括角标), 目前支持动态和视频页面.\r\n", + "fullRelativePath": "../../registry/dist/components/style/hide/user-pendent.js", + "fullAbsolutePath": "registry/dist/components/style/hide/user-pendent.js" + }, { "type": "component", "name": "hideVideoNotes", @@ -527,6 +551,14 @@ "fullRelativePath": "../../registry/dist/components/utils/column-unlock.js", "fullAbsolutePath": "registry/dist/components/utils/column-unlock.js" }, + { + "type": "component", + "name": "commentContentReplace", + "displayName": "评论内容替换", + "description": "替换评论中的内容.\r\n\r\n可以添加多个替换配置, 每项配置可将一个关键词替换为其他文本. 若替换的目标是一个链接, 则视作替换为表情, 留空则会移除命中的关键词.\r\n", + "fullRelativePath": "../../registry/dist/components/utils/comments/content-replace.js", + "fullAbsolutePath": "registry/dist/components/utils/comments/content-replace.js" + }, { "type": "component", "name": "copyCommentsLink", diff --git a/doc/features/features.md b/doc/features/features.md index 570495dddf..7a2126e1e3 100644 --- a/doc/features/features.md +++ b/doc/features/features.md @@ -11,6 +11,15 @@ 开启后, 可在每条动态的菜单中选择复制链接. +### [删除动态](../../registry/dist/components/feeds/del-feeds.js) +`deleteFeeds` + +**jsDelivr:** [`Stable`](https://cdn.jsdelivr.net/gh/the1812/Bilibili-Evolved@master/registry/dist/components/feeds/del-feeds.js) / [`Preview`](https://cdn.jsdelivr.net/gh/the1812/Bilibili-Evolved@preview/registry/dist/components/feeds/del-feeds.js) + +**GitHub:** [`Stable`](https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/registry/dist/components/feeds/del-feeds.js) / [`Preview`](https://raw.githubusercontent.com/the1812/Bilibili-Evolved/preview/registry/dist/components/feeds/del-feeds.js) + +删除动态, 可选转发抽奖, 和全部删除. + ### [禁止跳转动态详情](../../registry/dist/components/feeds/disable-details.js) `disableFeedsDetails` @@ -170,6 +179,15 @@ by [@TimmyOVO](https://github.com/TimmyOVO) 移除全屏观看直播时的底部礼物栏 +### [隐藏直播马赛克](../../registry/dist/components/live/hide-player-blur.js) +`hideLivePlayerBlur` + +**jsDelivr:** [`Stable`](https://cdn.jsdelivr.net/gh/the1812/Bilibili-Evolved@master/registry/dist/components/live/hide-player-blur.js) / [`Preview`](https://cdn.jsdelivr.net/gh/the1812/Bilibili-Evolved@preview/registry/dist/components/live/hide-player-blur.js) + +**GitHub:** [`Stable`](https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/registry/dist/components/live/hide-player-blur.js) / [`Preview`](https://raw.githubusercontent.com/the1812/Bilibili-Evolved/preview/registry/dist/components/live/hide-player-blur.js) + +移除直播画面中的马赛克区域. + ### [直播首页静音](../../registry/dist/components/live/home-mute.js) `liveHomeMute` @@ -389,6 +407,15 @@ by [@WakelessSloth56](https://github.com/WakelessSloth56) 隐藏鼠标指向用户名或用户头像时弹出的浮动用户信息卡片 +### [隐藏头像框](../../registry/dist/components/style/hide/user-pendent.js) +`hideUserPendent` + +**jsDelivr:** [`Stable`](https://cdn.jsdelivr.net/gh/the1812/Bilibili-Evolved@master/registry/dist/components/style/hide/user-pendent.js) / [`Preview`](https://cdn.jsdelivr.net/gh/the1812/Bilibili-Evolved@preview/registry/dist/components/style/hide/user-pendent.js) + +**GitHub:** [`Stable`](https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/registry/dist/components/style/hide/user-pendent.js) / [`Preview`](https://raw.githubusercontent.com/the1812/Bilibili-Evolved/preview/registry/dist/components/style/hide/user-pendent.js) + +隐藏页面中用户的头像框 (包括角标), 目前支持动态和视频页面. + ### [隐藏记笔记](../../registry/dist/components/style/hide/video/notes.js) `hideVideoNotes` @@ -695,6 +722,17 @@ by [@snowraincloud](https://github.com/snowraincloud) 避免专栏的文字复制后在最后带上出处信息, 更贴近原生的复制行为. +### [评论内容替换](../../registry/dist/components/utils/comments/content-replace.js) +`commentContentReplace` + +**jsDelivr:** [`Stable`](https://cdn.jsdelivr.net/gh/the1812/Bilibili-Evolved@master/registry/dist/components/utils/comments/content-replace.js) / [`Preview`](https://cdn.jsdelivr.net/gh/the1812/Bilibili-Evolved@preview/registry/dist/components/utils/comments/content-replace.js) + +**GitHub:** [`Stable`](https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/registry/dist/components/utils/comments/content-replace.js) / [`Preview`](https://raw.githubusercontent.com/the1812/Bilibili-Evolved/preview/registry/dist/components/utils/comments/content-replace.js) + +替换评论中的内容. + +可以添加多个替换配置, 每项配置可将一个关键词替换为其他文本. 若替换的目标是一个链接, 则视作替换为表情, 留空则会移除命中的关键词. + ### [复制评论链接](../../registry/dist/components/utils/comments/copy-link.js) `copyCommentsLink`