From b2459d8f483d076fab60eccc874de5c98d78d721 Mon Sep 17 00:00:00 2001 From: Phantom <59059173+EurFelux@users.noreply.github.com> Date: Fri, 5 Sep 2025 09:19:34 +0800 Subject: [PATCH 1/5] fix: only allow auto-i18n running on branches in main repo (#9905) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * ci(workflow): 移除不必要的checkout参数 * ci(workflow): 更新自动i18n工作流的checkout步骤 添加pull request相关参数以确保正确检出代码 * ci(workflow): 在auto-i18n工作流中添加repository参数 * ci(workflow): 添加仓库条件限制以仅对cherry-studio运行 --- .github/workflows/auto-i18n.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/auto-i18n.yml b/.github/workflows/auto-i18n.yml index 5797675347..40e75660dd 100644 --- a/.github/workflows/auto-i18n.yml +++ b/.github/workflows/auto-i18n.yml @@ -13,6 +13,7 @@ on: jobs: auto-i18n: runs-on: ubuntu-latest + if: github.repository == 'CherryHQ/cherry-studio' name: Auto I18N permissions: contents: write From 2849cbf257f4c26d240d122176182f553d1be751 Mon Sep 17 00:00:00 2001 From: Phantom <59059173+EurFelux@users.noreply.github.com> Date: Fri, 5 Sep 2025 09:53:46 +0800 Subject: [PATCH 2/5] fix: wrong ci repo check (#9916) fix: wrong repo check --- .github/workflows/auto-i18n.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/auto-i18n.yml b/.github/workflows/auto-i18n.yml index 40e75660dd..4011698d79 100644 --- a/.github/workflows/auto-i18n.yml +++ b/.github/workflows/auto-i18n.yml @@ -13,7 +13,7 @@ on: jobs: auto-i18n: runs-on: ubuntu-latest - if: github.repository == 'CherryHQ/cherry-studio' + if: github.event.pull_request.base.repo.full_name == 'CherryHQ/cherry-studio' name: Auto I18N permissions: contents: write From fd0645fbb4235e368bbfcd461606350346371031 Mon Sep 17 00:00:00 2001 From: beyondkmp Date: Fri, 5 Sep 2025 09:57:51 +0800 Subject: [PATCH 3/5] chore(package): update dependencies and reorganize package.json (#9914) --- package.json | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index a651fe00de..753f5efaab 100644 --- a/package.json +++ b/package.json @@ -74,23 +74,16 @@ "@libsql/win32-x64-msvc": "^0.4.7", "@napi-rs/system-ocr": "patch:@napi-rs/system-ocr@npm%3A1.0.2#~/.yarn/patches/@napi-rs-system-ocr-npm-1.0.2-59e7a78e8b.patch", "@strongtz/win32-arm64-msvc": "^0.4.7", - "cheerio": "^1.1.2", "faiss-node": "^0.5.1", "graceful-fs": "^4.2.11", - "html-to-text": "^9.0.5", - "htmlparser2": "^10.0.0", "jsdom": "26.1.0", "node-stream-zip": "^1.15.0", "officeparser": "^4.2.0", "os-proxy-config": "^1.1.2", - "pdf-parse": "^1.1.1", - "react-player": "^3.3.1", - "react-youtube": "^10.1.0", "selection-hook": "^1.0.11", "sharp": "^0.34.3", "tesseract.js": "patch:tesseract.js@npm%3A6.0.1#~/.yarn/patches/tesseract.js-npm-6.0.1-2562a7e46d.patch", - "turndown": "7.2.0", - "youtubei.js": "^15.0.1" + "turndown": "7.2.0" }, "devDependencies": { "@agentic/exa": "^7.3.3", @@ -213,6 +206,7 @@ "axios": "^1.7.3", "browser-image-compression": "^2.0.2", "chardet": "^2.1.0", + "cheerio": "^1.1.2", "chokidar": "^4.0.3", "cli-progress": "^3.12.0", "code-inspector-plugin": "^0.20.14", @@ -249,6 +243,7 @@ "he": "^1.2.0", "html-tags": "^5.1.0", "html-to-image": "^1.11.13", + "html-to-text": "^9.0.5", "htmlparser2": "^10.0.0", "husky": "^9.1.7", "i18next": "^23.11.5", @@ -272,6 +267,7 @@ "openai": "patch:openai@npm%3A5.12.2#~/.yarn/patches/openai-npm-5.12.2-30b075401c.patch", "p-queue": "^8.1.0", "pdf-lib": "^1.17.1", + "pdf-parse": "^1.1.1", "playwright": "^1.52.0", "prettier": "^3.5.3", "prettier-plugin-sort-json": "^4.1.1", @@ -284,11 +280,13 @@ "react-infinite-scroll-component": "^6.1.0", "react-json-view": "^1.21.3", "react-markdown": "^10.1.0", + "react-player": "^3.3.1", "react-redux": "^9.1.2", "react-router": "6", "react-router-dom": "6", "react-spinners": "^0.14.1", "react-transition-group": "^4.4.5", + "react-youtube": "^10.1.0", "redux": "^5.0.1", "redux-persist": "^6.0.0", "reflect-metadata": "0.2.2", @@ -326,6 +324,7 @@ "word-extractor": "^1.0.4", "y-protocols": "^1.0.6", "yjs": "^13.6.27", + "youtubei.js": "^15.0.1", "zipread": "^1.3.3", "zod": "^3.25.74" }, From e9db53c9736ad1eb3bcddf89cc5919510f1f0345 Mon Sep 17 00:00:00 2001 From: Phantom <59059173+EurFelux@users.noreply.github.com> Date: Fri, 5 Sep 2025 10:35:58 +0800 Subject: [PATCH 4/5] fix: handle multiple content source when pasting to translate input (#9919) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(translate): 处理粘贴事件时增加处理中状态检查 * fix(translate): 修复粘贴文本时未阻止默认行为的问题 添加event.preventDefault()以防止粘贴文本时触发默认行为 同时优化粘贴逻辑,优先处理文本内容 --- src/renderer/src/pages/translate/TranslatePage.tsx | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/renderer/src/pages/translate/TranslatePage.tsx b/src/renderer/src/pages/translate/TranslatePage.tsx index 1c9bd94839..66fcb0d9a4 100644 --- a/src/renderer/src/pages/translate/TranslatePage.tsx +++ b/src/renderer/src/pages/translate/TranslatePage.tsx @@ -612,9 +612,14 @@ const TranslatePage: FC = () => { // 粘贴上传文件 const onPaste = useCallback( async (event: React.ClipboardEvent) => { + event.preventDefault() + if (isProcessing) return setIsProcessing(true) logger.debug('event', event) - if (event.clipboardData?.files && event.clipboardData.files.length > 0) { + const text = event.clipboardData.getData('text') + if (!isEmpty(text)) { + setText(text) + } else if (event.clipboardData.files && event.clipboardData.files.length > 0) { event.preventDefault() const files = event.clipboardData.files const file = getSingleFile(files) as File @@ -659,7 +664,7 @@ const TranslatePage: FC = () => { } setIsProcessing(false) }, - [getSingleFile, processFile, t] + [getSingleFile, isProcessing, processFile, t] ) return ( Date: Fri, 5 Sep 2025 11:15:26 +0800 Subject: [PATCH 5/5] fix: remove youtube render (#9920) --- package.json | 1 - src/main/knowledge/langchain/loader/index.ts | 3 +- .../src/pages/home/Messages/MessageVideo.tsx | 28 --------------- .../KnowledgeSearchItem/VideoItem.tsx | 35 ------------------- src/renderer/src/services/KnowledgeService.ts | 11 ------ 5 files changed, 1 insertion(+), 77 deletions(-) diff --git a/package.json b/package.json index 753f5efaab..64474b4b1f 100644 --- a/package.json +++ b/package.json @@ -286,7 +286,6 @@ "react-router-dom": "6", "react-spinners": "^0.14.1", "react-transition-group": "^4.4.5", - "react-youtube": "^10.1.0", "redux": "^5.0.1", "redux-persist": "^6.0.0", "reflect-metadata": "0.2.2", diff --git a/src/main/knowledge/langchain/loader/index.ts b/src/main/knowledge/langchain/loader/index.ts index f4718f71f8..dd89b5534c 100644 --- a/src/main/knowledge/langchain/loader/index.ts +++ b/src/main/knowledge/langchain/loader/index.ts @@ -153,8 +153,7 @@ export async function addWebLoader( case 'youtube': loaderInstance = YoutubeLoader.createFromUrl(url, { addVideoInfo: true, - transcriptFormat: 'srt', - language: 'zh' + transcriptFormat: 'srt' }) splitterType = 'srt' break diff --git a/src/renderer/src/pages/home/Messages/MessageVideo.tsx b/src/renderer/src/pages/home/Messages/MessageVideo.tsx index d0d9591372..979b50ab6e 100644 --- a/src/renderer/src/pages/home/Messages/MessageVideo.tsx +++ b/src/renderer/src/pages/home/Messages/MessageVideo.tsx @@ -3,7 +3,6 @@ import { VideoMessageBlock } from '@renderer/types/newMessage' import { FC, useRef } from 'react' import { useTranslation } from 'react-i18next' import ReactPlayer from 'react-player' -import YouTube, { YouTubeProps } from 'react-youtube' import styled from 'styled-components' const logger = loggerService.withContext('MessageVideo') @@ -21,30 +20,6 @@ const MessageVideo: FC = ({ block }) => { return null } - /** - * 渲染 YouTube 视频 - */ - const renderYoutube = () => { - if (!block.url) { - logger.warn('YouTube video was requested but block.url is missing.') - return
{t('message.video.error.youtube_url_missing')}
- } - - const onPlayerReady: YouTubeProps['onReady'] = (event) => { - event.target.pauseVideo() - } - - const opts: YouTubeProps['opts'] = { - height: '100%', - width: '100%', - playerVars: { - start: Math.floor(block.metadata?.startTime ?? 0) - } - } - - return - } - /** * 渲染本地视频文件 */ @@ -79,9 +54,6 @@ const MessageVideo: FC = ({ block }) => { const renderVideo = () => { switch (block.metadata?.type) { - case 'youtube': - return renderYoutube() - case 'video': return renderLocalVideo() diff --git a/src/renderer/src/pages/knowledge/components/KnowledgeSearchItem/VideoItem.tsx b/src/renderer/src/pages/knowledge/components/KnowledgeSearchItem/VideoItem.tsx index 0c33d148be..daef3d638a 100644 --- a/src/renderer/src/pages/knowledge/components/KnowledgeSearchItem/VideoItem.tsx +++ b/src/renderer/src/pages/knowledge/components/KnowledgeSearchItem/VideoItem.tsx @@ -2,7 +2,6 @@ import { FileMetadata, KnowledgeSearchResult } from '@renderer/types' import { Typography } from 'antd' import React, { FC, useRef } from 'react' import ReactPlayer from 'react-player' -import YouTube, { YouTubeProps } from 'react-youtube' import styled from 'styled-components' const { Paragraph } = Typography @@ -28,37 +27,6 @@ const VideoItem: FC = ({ item, searchKeyword }) => { const { highlightText } = useHighlightText() - /** - * 渲染 YouTube 视频 - */ - const renderYoutube = () => { - if (!item.metadata.source) { - logger.warn('YouTube video was requested but block.url is missing.') - return {t('knowledge.error.video.youtube_url_missing')} - } - - const onPlayerReady: YouTubeProps['onReady'] = (event) => { - event.target.pauseVideo() - } - - const opts: YouTubeProps['opts'] = { - height: '100%', - width: '100%', - playerVars: { - start: Math.floor(item.metadata?.startTime ?? 0) - } - } - - return ( - - ) - } - /** * 渲染本地视频文件 */ @@ -93,9 +61,6 @@ const VideoItem: FC = ({ item, searchKeyword }) => { const renderVideo = () => { switch (item.metadata?.type) { - case 'youtube': - return renderYoutube() - case 'video': return renderLocalVideo() diff --git a/src/renderer/src/services/KnowledgeService.ts b/src/renderer/src/services/KnowledgeService.ts index 7c7e95a361..a36a63ac9f 100644 --- a/src/renderer/src/services/KnowledgeService.ts +++ b/src/renderer/src/services/KnowledgeService.ts @@ -313,17 +313,6 @@ export function processKnowledgeReferences( } switch (metadata.type) { - case 'youtube': { - onChunkReceived({ - type: ChunkType.VIDEO_SEARCHED, - video: { - type: 'url', - content: metadata.source - }, - metadata - }) - break - } case 'video': { onChunkReceived({ type: ChunkType.VIDEO_SEARCHED,