diff --git a/packages/backend/scripts/index.ts b/packages/backend/scripts/index.ts index 8546473f..9e07f233 100644 --- a/packages/backend/scripts/index.ts +++ b/packages/backend/scripts/index.ts @@ -64,12 +64,12 @@ async function startNodemon() { consola.log(data.toString()); }); - // 监听 stderr 数据事件 + // Listen for stderr data events nodemon.stderr?.on("data", (data) => { consola.error(`stderr: ${data.toString()}`); }); - // 监听子进程的关闭事件 + // Listens for closing events of the child process nodemon.on("close", (code) => { consola.log(`子进程退出,退出码 ${code}`); }); @@ -80,7 +80,7 @@ async function buildTask() { await esbuild.build(buildOptions()); } -// 开发环境 +// Development environment export const dev = gulp.series(clean, copy, watchTask, startNodemon); -// 构建打包 +// Build packaging export const build = gulp.series(buildClean, copy, buildTask); diff --git a/packages/backend/src/app.ts b/packages/backend/src/app.ts index 03fb7084..9fe2f15d 100644 --- a/packages/backend/src/app.ts +++ b/packages/backend/src/app.ts @@ -47,7 +47,7 @@ export default class ElectronApp extends Koa { .use(this.router.allowedMethods()); this.use(serve(STATIC_DIR)); - // 处理静态文件和前端路由的中间件 + // Middleware that handles static files and front-end routing this.use(async (ctx, next) => { if (!ctx.path.startsWith("/api")) { try { @@ -70,9 +70,9 @@ export default class ElectronApp extends Koa { }); } - // 如果重启后还有正在下载的视频,就将状态改成下载失败 + // If there are still videos being downloaded after the restart, change the status to download failed async resetDownloadStatus(): Promise { - // 重启后如果还有 downloading 状态的数据, 全部重置为失败 + // If data in the downloading state still fails after the restart, all downloads fail const videos = await this.videoRepository.findWattingAndDownloadingVideos(); const videoIds = videos.map((video) => video.id); await this.videoRepository.changeVideoStatus( diff --git a/packages/backend/src/controller/DownloadController.ts b/packages/backend/src/controller/DownloadController.ts index 301bf5d9..ff3c3a58 100644 --- a/packages/backend/src/controller/DownloadController.ts +++ b/packages/backend/src/controller/DownloadController.ts @@ -71,9 +71,9 @@ export default class DownloadController implements Controller { @post("download-items-now") async downloadItemsNow(ctx: Context) { const videos = ctx.request.body as Omit[]; - // 添加下载项 + // Add download const items = await this.downloaderService.addDownloadItems(videos); - // 开始下载 + // Start downloading items.forEach((item) => this.downloaderService.startDownload(item.id)); return items; } diff --git a/packages/backend/src/helper/index.ts b/packages/backend/src/helper/index.ts index bfc60ecb..334848c5 100644 --- a/packages/backend/src/helper/index.ts +++ b/packages/backend/src/helper/index.ts @@ -4,12 +4,12 @@ export function getLocalIP() { const interfaces = os.networkInterfaces(); let localIP = ""; - // 遍历网络接口 + // Traverse the network interface for (const key in interfaces) { const iface = interfaces[key]; if (!iface) continue; - // 过滤出 IPv4 地址且非回环地址 + // IPv4 addresses that are not loopback addresses are filtered out const filteredIface = iface.filter( (details) => details.family === "IPv4" && !details.internal, ); diff --git a/packages/backend/src/main.d.ts b/packages/backend/src/main.d.ts index 3d003a2b..e56a2d30 100644 --- a/packages/backend/src/main.d.ts +++ b/packages/backend/src/main.d.ts @@ -23,40 +23,40 @@ declare interface WebSource { } declare interface AppStore { - // 本地存储地址 + // Local storage address local: string; - // 下载完成提示音 + // Download completion tone promptTone: boolean; - // 代理地址 + // Proxy address proxy: string; - // 是否开启代理 + // Whether to enable agent useProxy: boolean; - // 下载完成后删除原始文件 + // Delete the original file after downloading deleteSegments: boolean; - // 新窗口打开浏览器 + // A new window opens the browser openInNewWindow: boolean; mainBounds?: Rectangle; browserBounds?: Rectangle; blockAds: boolean; - // 主题 + // theme theme: AppTheme; - // 使用浏览器插件 + // Using browser plugins useExtension: boolean; - // 是否使用手机UA + // Whether to use mobile UA isMobile: boolean; - // 最大同时下载数 + // Maximum number of simultaneous downloads maxRunner: number; - // 语言 + // Language language: AppLanguage; - // 是否显示终端 + // Show terminal or not showTerminal: boolean; - // 隐私模式 + // Privacy mode privacy: boolean; - // 机器id + // Machine id machineId: string; - // 下载代理设置 + // Download proxy Settings downloadProxySwitch: boolean; - // 自动更新 + // Automatic update autoUpgrade: boolean; } diff --git a/packages/backend/src/repository/VideoRepository.ts b/packages/backend/src/repository/VideoRepository.ts index 0659b874..cccd5337 100644 --- a/packages/backend/src/repository/VideoRepository.ts +++ b/packages/backend/src/repository/VideoRepository.ts @@ -19,7 +19,7 @@ export default class VideoRepository { ) {} async addVideo(video: Omit) { - // 先判断有没有同名的视频 + // Let's see if there's a video with the same name const exist = await this.findVideoByName(video.name); if (exist) { throw new Error(i18n.t("videoExistsPleaseChangeName")); @@ -34,7 +34,7 @@ export default class VideoRepository { } async addVideos(videos: Omit[]) { - // 检查是否有同名的视频 + // Check for videos with the same name const names = videos.map((item) => item.name); const existItems = await this.db.appDataSource .getRepository(Video) @@ -61,7 +61,7 @@ export default class VideoRepository { return await this.db.manager.save(items); } - // 编辑视频 + // Edit video async editVideo(video: DownloadItem) { const item = await this.db.appDataSource .getRepository(Video) @@ -76,7 +76,7 @@ export default class VideoRepository { return await this.db.manager.save(item); } - // 查找所有视频 + // Find all Videos async findAllVideos() { return await this.db.appDataSource.getRepository(Video).find({ order: { diff --git a/packages/backend/src/services/DownloadService.ts b/packages/backend/src/services/DownloadService.ts index ac902e5e..a4551000 100644 --- a/packages/backend/src/services/DownloadService.ts +++ b/packages/backend/src/services/DownloadService.ts @@ -21,13 +21,13 @@ import ConfigService from "./ConfigService.ts"; import path from "path"; interface DownloadContext { - // 是否为直播 + // Whether it is live isLive: boolean; - // 下载进度 + // Download progress percent: string; - // 下载速度 + // Download speed speed: string; - // 是否已经 ready + // Ready ready: boolean; } @@ -52,7 +52,7 @@ interface Schema { type: string; } -// FIXME: 多语言正则表达式 +// FIXME: Multilingual regular expressions const processList: Schema[] = [ { type: "m3u8", @@ -201,7 +201,7 @@ export default class DownloadService extends EventEmitter { } catch (err: any) { if (err.message === "AbortError") { this.logger.info(`taskId: ${task.id} stopped`); - // 下载暂停 + // Download pause await this.videoRepository.changeVideoStatus( task.id, DownloadStatus.Stopped, @@ -209,7 +209,7 @@ export default class DownloadService extends EventEmitter { this.emit("download-stop", task.id); } else { this.logger.error(`taskId: ${task.id} failed`, err); - // 下载失败 + // Download failure await this.videoRepository.changeVideoStatus( task.id, DownloadStatus.Failed, @@ -219,7 +219,7 @@ export default class DownloadService extends EventEmitter { } finally { this.removeTask(task.id); - // 传输完成 + // Transmission complete if (this.queue.length === 0 && this.active.length === 0) { // this.emit("download-finish"); } @@ -227,10 +227,10 @@ export default class DownloadService extends EventEmitter { } removeTask(id: number) { - // 处理当前正在活动的任务 + // Process the currently active task const doneId = this.active.findIndex((i) => i.id === id); this.active.splice(doneId, 1); - // 处理完成的任务 + // Process completed tasks if (this.active.length < this.limit) { this.runTask(); } @@ -356,16 +356,16 @@ export default class DownloadService extends EventEmitter { const percentReg = RegExp(consoleReg.percent, "g"); const onMessage = (ctx: DownloadContext, message: string) => { - // 解析是否为直播资源 + // Resolve whether it is a live resource if (isLiveReg.test(message)) { ctx.isLive = true; } - // 解析下载进度 + // Parse download progress const [, percent] = percentReg.exec(message) || []; if (percent && Number(ctx.percent || 0) < Number(percent)) { ctx.percent = percent; } - // 解析下载速度 + // Parsing download speed const [, speed] = speedReg.exec(message) || []; if (speed) { ctx.speed = speed; diff --git a/packages/backend/src/services/DownloaderService.ts b/packages/backend/src/services/DownloaderService.ts index e3d2795d..6e0c0342 100644 --- a/packages/backend/src/services/DownloaderService.ts +++ b/packages/backend/src/services/DownloaderService.ts @@ -17,7 +17,7 @@ export default class DownloaderService { ) {} async startDownload(vid: number) { - // 查找将要下载的视频 + // Find the video you want to download const video = await this.videoRepository.findVideo(vid); const { name, url, headers, type, folder } = video; const { local, deleteSegments } = await this.store.getConfig(); @@ -39,9 +39,9 @@ export default class DownloaderService { } async downloadNow(video: Omit) { - // 添加下载项 + // Add download const item = await this.addDownloadItem(video); - // 开始下载 + // Start downloading await this.startDownload(item.id); return item; } diff --git a/packages/backend/src/vendor/SocketIO.ts b/packages/backend/src/vendor/SocketIO.ts index 780ceae5..6d9f7453 100644 --- a/packages/backend/src/vendor/SocketIO.ts +++ b/packages/backend/src/vendor/SocketIO.ts @@ -82,7 +82,7 @@ export default class SocketIO implements Vendor { }; receiveMessage = async (id: number, message: string) => { - // 将日志写入数据库中 + // Write the log to the database await this.videoRepository.appendDownloadLog(id, message); }; } diff --git a/packages/main/scripts/index.ts b/packages/main/scripts/index.ts index c2072d09..e328ba56 100644 --- a/packages/main/scripts/index.ts +++ b/packages/main/scripts/index.ts @@ -51,7 +51,7 @@ async function copyBin() { } async function chmodBin() { - // 遍历文件夹下的所有文件,将文件的权限设置为 777 + // Go through all the files in the folder and set the permissions on the files to 777 if (isWin) return; const files = globSync(mainResolve("app/bin/*")); @@ -115,9 +115,9 @@ async function pack() { await builder.build({ config }); } -// 开发环境 +// Development environment export const dev = gulp.series(devCopy, chmodBin, watchTask); -// 构建打包 +// Build packaging export const build = gulp.series(clean, buildCopy, chmodBin, buildTask); // release export const release = gulp.series(pack); diff --git a/packages/main/src/app.ts b/packages/main/src/app.ts index 5af6fead..e9bd6209 100644 --- a/packages/main/src/app.ts +++ b/packages/main/src/app.ts @@ -105,9 +105,9 @@ export default class ElectronApp { tray.setContextMenu(contextMenu); } - // 如果重启后还有正在下载的视频,就将状态改成下载失败 + // If there are still videos being downloaded after the restart, change the status to download failed async resetDownloadStatus(): Promise { - // 重启后如果还有 downloading 状态的数据, 全部重置为失败 + // If data in the downloading state still fails after the restart, all downloads fail const videos = await this.videoRepository.findWattingAndDownloadingVideos(); const videoIds = videos.map((video) => video.id); await this.videoRepository.changeVideoStatus( diff --git a/packages/main/src/controller/DownloadController.ts b/packages/main/src/controller/DownloadController.ts index 41644c1e..eb4cd431 100644 --- a/packages/main/src/controller/DownloadController.ts +++ b/packages/main/src/controller/DownloadController.ts @@ -47,7 +47,7 @@ export default class DownloadController implements Controller { @handle("add-download-item") async addDownloadItem(e: IpcMainEvent, video: Omit) { const item = await this.videoRepository.addVideo(video); - // 这里向页面发送消息,通知页面更新 + // This sends a message to the page notifying it of the update this.mainWindow.send("download-item-notifier", item); return item; } @@ -55,7 +55,7 @@ export default class DownloadController implements Controller { @handle("add-download-items") async addDownloadItems(e: IpcMainEvent, videos: Omit[]) { const items = await this.videoRepository.addVideos(videos); - // 这里向页面发送消息,通知页面更新 + // This sends a message to the page notifying it of the update this.mainWindow.send("download-item-notifier", items); return items; } @@ -75,18 +75,18 @@ export default class DownloadController implements Controller { @handle("download-now") async downloadNow(e: IpcMainEvent, video: Omit) { - // 添加下载项 + // Add download const item = await this.addDownloadItem(e, video); - // 开始下载 + // Start downloading await this.startDownload(e, item.id); return item; } @handle("download-items-now") async downloadItemsNow(e: IpcMainEvent, videos: Omit[]) { - // 添加下载项 + // Add download const items = await this.addDownloadItems(e, videos); - // 开始下载 + // Start downloading items.forEach((item) => this.startDownload(e, item.id)); return items; } @@ -120,12 +120,12 @@ export default class DownloadController implements Controller { @handle("start-download") async startDownload(e: IpcMainEvent, vid: number) { - // 查找将要下载的视频 + // Find the video you want to download const video = await this.videoRepository.findVideo(vid); const { name, url, headers, type, folder } = video; const local = this.store.get("local"); - // 从配置中添加参数 + // Add parameters from the configuration const deleteSegments = this.store.get("deleteSegments"); const task: Task = { diff --git a/packages/main/src/controller/HomeController.ts b/packages/main/src/controller/HomeController.ts index a52aa688..7582de67 100644 --- a/packages/main/src/controller/HomeController.ts +++ b/packages/main/src/controller/HomeController.ts @@ -286,9 +286,9 @@ export default class HomeController implements Controller { @handle("combine-to-home-page") async combineToHomePage() { - // 关闭浏览器窗口 + // Close browser window this.browserWindow.hideWindow(); - // 修改设置中的属性 + // Modify the properties in the Settings this.store.set("openInNewWindow", false); } diff --git a/packages/main/src/core/protocol.ts b/packages/main/src/core/protocol.ts index c0a47dd4..e86ee7ba 100644 --- a/packages/main/src/core/protocol.ts +++ b/packages/main/src/core/protocol.ts @@ -17,7 +17,7 @@ export default class ProtocolService { let filePath = join(__dirname, "../renderer", pathName); const fileExist = await pathExists(filePath); if (!fileExist) { - // 如果没有找到文件,直接返回 index.html , react history 模式 + // If the file is not found, return index.html directly, react history mode filePath = join(__dirname, "../renderer/index.html"); } const mimeType = mime.lookup(filePath); diff --git a/packages/main/src/core/window.ts b/packages/main/src/core/window.ts index 3b17e0b9..32c8f98d 100644 --- a/packages/main/src/core/window.ts +++ b/packages/main/src/core/window.ts @@ -34,7 +34,7 @@ export default class Window { windowClose = () => { if (!this.window) return; - // 销毁窗口 + // Destruction window this.window = null; }; } diff --git a/packages/main/src/helper/index.ts b/packages/main/src/helper/index.ts index 2d1779ee..87e45d9a 100644 --- a/packages/main/src/helper/index.ts +++ b/packages/main/src/helper/index.ts @@ -6,12 +6,12 @@ export function getLocalIP() { const interfaces = os.networkInterfaces(); let localIP = ""; - // 遍历网络接口 + // Traverse the network interface for (const key in interfaces) { const iface = interfaces[key]; if (!iface) continue; - // 过滤出 IPv4 地址且非回环地址 + // IPv4 addresses that are not loopback addresses are filtered out const filteredIface = iface.filter( (details) => details.family === "IPv4" && !details.internal, ); diff --git a/packages/main/src/helper/utils.ts b/packages/main/src/helper/utils.ts index d418f648..3af2f48c 100644 --- a/packages/main/src/helper/utils.ts +++ b/packages/main/src/helper/utils.ts @@ -36,7 +36,7 @@ export function error(message = "fail"): IpcResponse { }; } -// 判断是否为 deeplink 的函数 +// Determine whether it is a function of deeplink export function isDeeplink(url: string): boolean { try { const parsedUrl = new URL(url); diff --git a/packages/main/src/main.d.ts b/packages/main/src/main.d.ts index ee7b8632..606e7580 100644 --- a/packages/main/src/main.d.ts +++ b/packages/main/src/main.d.ts @@ -23,46 +23,46 @@ declare interface WebSource { } declare interface AppStore { - // 本地存储地址 + // Local storage address local: string; - // 下载完成提示音 + // Download completion tone promptTone: boolean; - // 代理地址 + // Proxy address proxy: string; - // 是否开启代理 + // Whether to enable agent useProxy: boolean; - // 下载完成后删除原始文件 + // Delete the original file after downloading deleteSegments: boolean; - // 新窗口打开浏览器 + // A new window opens the browser openInNewWindow: boolean; mainBounds?: Rectangle; browserBounds?: Rectangle; blockAds: boolean; - // 主题 + // theme theme: AppTheme; - // 使用浏览器插件 + // Using browser plugins useExtension: boolean; - // 是否使用手机UA + // Whether to use mobile UA isMobile: boolean; - // 最大同时下载数 + // Maximum number of simultaneous downloads maxRunner: number; - // 语言 + // Language language: AppLanguage; - // 是否显示终端 + // Show terminal or not showTerminal: boolean; - // 隐私模式 + // Privacy mode privacy: boolean; - // 机器id + // Machine id machineId: string; - // 下载代理设置 + // Download proxy Settings downloadProxySwitch: boolean; - // 自动更新 + // Automatic update autoUpgrade: boolean; - // 允许使用beta版本 + // beta versions are allowed allowBeta: boolean; - // 关闭主窗口 + // Close the main window closeMainWindow: boolean; - // 浏览器中是否播放声音,默认静音 + // Whether to play sounds in the browser. The default value is mute audioMuted: boolean; } diff --git a/packages/main/src/repository/VideoRepository.ts b/packages/main/src/repository/VideoRepository.ts index cd87deeb..21594769 100644 --- a/packages/main/src/repository/VideoRepository.ts +++ b/packages/main/src/repository/VideoRepository.ts @@ -19,7 +19,7 @@ export default class VideoRepository { ) {} async addVideo(video: Omit) { - // 先判断有没有同名的视频 + // Let's see if there's a video with the same name const exist = await this.findVideoByName(video.name); if (exist) { throw new Error(i18n.t("videoExistsPleaseChangeName")); @@ -34,7 +34,7 @@ export default class VideoRepository { } async addVideos(videos: Omit[]) { - // 检查是否有同名的视频 + // Check for videos with the same name const names = videos.map((item) => item.name); const existItems = await this.db.appDataSource .getRepository(Video) @@ -61,7 +61,7 @@ export default class VideoRepository { return await this.db.manager.save(items); } - // 编辑视频 + // Edit video async editVideo(video: DownloadItem) { const item = await this.db.appDataSource .getRepository(Video) @@ -76,7 +76,7 @@ export default class VideoRepository { return await this.db.manager.save(item); } - // 查找所有视频 + // Find all Videos async findAllVideos() { return await this.db.appDataSource.getRepository(Video).find({ order: { diff --git a/packages/main/src/services/DownloadService.ts b/packages/main/src/services/DownloadService.ts index bfce6800..af7b3c6f 100644 --- a/packages/main/src/services/DownloadService.ts +++ b/packages/main/src/services/DownloadService.ts @@ -21,13 +21,13 @@ import i18n from "../i18n/index.ts"; import path from "path"; interface DownloadContext { - // 是否为直播 + // Whether it is live isLive: boolean; - // 下载进度 + // Download progress percent: string; - // 下载速度 + // Download speed speed: string; - // 是否已经 ready + // Ready ready: boolean; } @@ -52,7 +52,7 @@ interface Schema { type: string; } -// FIXME: 多语言正则表达式 +// FIXME: Multilingual regular expressions const processList: Schema[] = [ { type: "m3u8", @@ -203,7 +203,7 @@ export default class DownloadService extends EventEmitter { } catch (err: any) { if (err.message === "AbortError") { this.logger.info(`taskId: ${task.id} stopped`); - // 下载暂停 + // Download pause await this.videoRepository.changeVideoStatus( task.id, DownloadStatus.Stopped, @@ -211,7 +211,7 @@ export default class DownloadService extends EventEmitter { this.emit("download-stop", task.id); } else { this.logger.info(`taskId: ${task.id} failed`); - // 下载失败 + // Download failure await this.videoRepository.changeVideoStatus( task.id, DownloadStatus.Failed, @@ -221,7 +221,7 @@ export default class DownloadService extends EventEmitter { } finally { this.removeTask(task.id); - // 传输完成 + // Transmission complete if (this.queue.length === 0 && this.active.length === 0) { // this.emit("download-finish"); } @@ -229,10 +229,10 @@ export default class DownloadService extends EventEmitter { } removeTask(id: number) { - // 处理当前正在活动的任务 + // Process the currently active task const doneId = this.active.findIndex((i) => i.id === id); this.active.splice(doneId, 1); - // 处理完成的任务 + // Process completed tasks if (this.active.length < this.limit) { this.runTask(); } @@ -358,16 +358,16 @@ export default class DownloadService extends EventEmitter { const percentReg = RegExp(consoleReg.percent, "g"); const onMessage = (ctx: DownloadContext, message: string) => { - // 解析是否为直播资源 + // Resolve whether it is a live resource if (isLiveReg.test(message)) { ctx.isLive = true; } - // 解析下载进度 + // Parse download progress const [, percent] = percentReg.exec(message) || []; if (percent && Number(ctx.percent || 0) < Number(percent)) { ctx.percent = percent; } - // 解析下载速度 + // Parsing download speed const [, speed] = speedReg.exec(message) || []; if (speed) { ctx.speed = speed; diff --git a/packages/main/src/services/SniffingHelperService.ts b/packages/main/src/services/SniffingHelperService.ts index 63768f36..5ed61bfd 100644 --- a/packages/main/src/services/SniffingHelperService.ts +++ b/packages/main/src/services/SniffingHelperService.ts @@ -37,7 +37,7 @@ const filterList: SourceFilter[] = [ type: DownloadType.m3u8, }, { - // TODO: 合集、列表、收藏夹 + // TODO: Collections, lists, favorites hosts: [/^https?:\/\/(www\.)?bilibili.com\/video/], type: DownloadType.bilibili, schema: { @@ -67,7 +67,7 @@ export class SniffingHelper extends EventEmitter { } checkPageInfo() { - // 发送 page 相关的信息 + // Send page related information const sendPageInfo = () => { listLoop: for (const filter of filterList) { if (filter.hosts) { diff --git a/packages/main/src/services/VideoService.ts b/packages/main/src/services/VideoService.ts index dbf9efcd..62c6fb76 100644 --- a/packages/main/src/services/VideoService.ts +++ b/packages/main/src/services/VideoService.ts @@ -27,7 +27,7 @@ export class VideoService { this.localIp = getLocalIP(); } - // 使用glob搜索视频文件 + // Use glob to search video files getVideoFiles = async () => { const files = await glob(this.videoDir + "/*.*"); const videos = files @@ -61,14 +61,14 @@ export class VideoService { app.use(express.static(mobileDir)); - // 使用serve-handler处理静态文件请求的中间件 + // Middleware that uses serve-handler to handle static file requests app.use(async (req, res) => { return serveHandler(req, res, { public: this.videoDir, }); }); - // 直接使用Koa的listen方法启动服务器 + // Start the server directly using Koa's listen method app .listen(this.port, "0.0.0.0", () => { this.logger.info("Server is running on http://localhost:3222"); diff --git a/packages/main/src/services/WebviewService.ts b/packages/main/src/services/WebviewService.ts index 8f4f1778..71404cd9 100644 --- a/packages/main/src/services/WebviewService.ts +++ b/packages/main/src/services/WebviewService.ts @@ -43,7 +43,7 @@ export default class WebviewService { @inject(TYPES.SniffingHelper) private readonly sniffingHelper: SniffingHelper, ) { - // 初始化 blocker + // Initialize the blocker this.initBlocker(); const { useProxy, proxy, privacy } = this.store.store; @@ -129,7 +129,7 @@ export default class WebviewService { onSource = async (item: SourceParams) => { if (!this.view) return; - // 这里需要判断是否使用浏览器插件 + // Here you need to determine whether to use a browser plug-in const useExtension = this.store.get("useExtension"); if (useExtension) { // this.view.webContents.send("webview-link-message", item); @@ -142,7 +142,7 @@ export default class WebviewService { const res = await this.videoRepository.addVideo(item); const mainWebContents = this.mainWindow.window?.webContents; if (!mainWebContents) return; - // 这里向页面发送消息,通知页面更新 + // This sends a message to the page notifying it of the update mainWebContents.send("download-item-notifier", res); } }; @@ -187,16 +187,16 @@ export default class WebviewService { } loadURL(url: string) { - // 开始加载 url + // Start loading url if (!this.view) { this.init(); } if (!this.view) return; - // 1. 停止当前导航 + // 1. Stop current navigation this.view.webContents.stop(); - // 2. 加载新的 url + // 2. Load a new url this.view.webContents.loadURL(url); } @@ -246,7 +246,7 @@ export default class WebviewService { return; } - // 处理 proxy 地址的合法性 + // Process the validity of the proxy address if (!/https?:\/\//.test(proxy)) { proxy = `http://${proxy}`; } @@ -306,7 +306,7 @@ export default class WebviewService { setAudioMuted(audioMuted?: boolean) { if (!this.view) return; - this.view.webContents.setAudioMuted(audioMuted? true: false); + this.view.webContents.setAudioMuted(audioMuted ? true : false); this.logger.info(`Play audio: ${!audioMuted}`); } @@ -339,7 +339,7 @@ export default class WebviewService { this.view.webContents.close(); this.window.contentView.removeChildView(this.view); } - // FIXME: 为了避免内存泄漏,这里需要销毁 view + // FIXME: To avoid memory leaks, the view needs to be destroyed here this.view = null; } diff --git a/packages/main/src/vendor/ElectronDevtools.ts b/packages/main/src/vendor/ElectronDevtools.ts index 3998b9a7..610f5c7b 100644 --- a/packages/main/src/vendor/ElectronDevtools.ts +++ b/packages/main/src/vendor/ElectronDevtools.ts @@ -19,7 +19,7 @@ export default class DevToolsService implements Vendor { if (!isDev) { return; } - // 开发环境中可以通过设置环境变量来控制是否加载开发者工具 + // In the development environment, you can set environment variables to control whether developer tools are loaded if (!process.env.LOAD_DEVTOOLS) { return; } diff --git a/packages/main/src/windows/BrowserWindow.ts b/packages/main/src/windows/BrowserWindow.ts index 27bd6eda..26be84c1 100644 --- a/packages/main/src/windows/BrowserWindow.ts +++ b/packages/main/src/windows/BrowserWindow.ts @@ -39,7 +39,7 @@ export default class BrowserWindow extends Window { handleNewWindowsVal = (newValue: unknown) => { if (!this.window) return; - // 向所有窗口发送通知 + // Send notifications to all Windows if (newValue === false) { if (this.window && !this.window.isDestroyed()) { this.window.close(); diff --git a/packages/main/src/windows/MainWindow.ts b/packages/main/src/windows/MainWindow.ts index a32e795a..cf2a0fd3 100644 --- a/packages/main/src/windows/MainWindow.ts +++ b/packages/main/src/windows/MainWindow.ts @@ -64,7 +64,7 @@ export default class MainWindow extends Window { init(): void { if (this.window) { - // 如果窗口已经存在,则直接显示 + // If the window already exists, it is displayed directly this.window.show(); return; } @@ -78,7 +78,7 @@ export default class MainWindow extends Window { this.window.setBounds(mainBounds); } - // 处理当前窗口改变大小 + // Handle current window resize this.window.on("resized", this.handleResize); this.window.on("close", this.closeMainWindow); } @@ -91,7 +91,7 @@ export default class MainWindow extends Window { }; storeChange = (store: unknown) => { - // 向所有窗口发送通知 + // Send notifications to all Windows this.send("store-change", store); }; @@ -138,7 +138,7 @@ export default class MainWindow extends Window { }; receiveMessage = async (id: number, message: string) => { - // 将日志写入数据库中 + // Write the log to the database await this.videoRepository.appendDownloadLog(id, message); const showTerminal = this.store.get("showTerminal"); if (showTerminal) { diff --git a/packages/main/src/windows/PlayerWindow.ts b/packages/main/src/windows/PlayerWindow.ts index 839733f5..1a980c56 100644 --- a/packages/main/src/windows/PlayerWindow.ts +++ b/packages/main/src/windows/PlayerWindow.ts @@ -37,7 +37,7 @@ export default class BrowserWindow extends Window { handleNewWindowsVal = (newValue: unknown) => { if (!this.window) return; - // 向所有窗口发送通知 + // Send notifications to all Windows if (newValue === false) { if (this.window && !this.window.isDestroyed()) { this.window.close(); diff --git a/packages/plugin/src/components/FloatButton.ts b/packages/plugin/src/components/FloatButton.ts index 45aa63b9..ce693553 100644 --- a/packages/plugin/src/components/FloatButton.ts +++ b/packages/plugin/src/components/FloatButton.ts @@ -138,11 +138,11 @@ export class FloatButton extends LitElement { ): { left: number; top: number } => { if (!this.button) return { left: 0, top: 0 }; - // 获取滚动条的宽度 + // Gets the width of the scroll bar const scrollbarWidth = window.innerWidth - document.documentElement.clientWidth; - // 获取窗口的宽度和高度 + // Gets the width and height of the window const windowWidth = window.innerWidth || document.documentElement.clientWidth || @@ -152,7 +152,7 @@ export class FloatButton extends LitElement { document.documentElement.clientHeight || document.body.clientHeight; - // 确保按钮不会被拖出屏幕 + // Make sure the buttons don't get dragged off the screen if (newLeft < 0) { newLeft = 0; } else if ( @@ -180,7 +180,7 @@ export class FloatButton extends LitElement { const newLeft = event.clientX - this.offsetX; const newTop = event.clientY - this.offsetY; - // 使用 requestAnimationFrame 来优化性能 + // Use requestAnimationFrame to optimize performance requestAnimationFrame(() => { if (!this.button) return; @@ -215,7 +215,7 @@ function init() { floatButton.style.zIndex = "9999999999999"; document.body.appendChild(floatButton); - // 向主进程发送插件准备好的消息 + // Sends the plug-in prepared message to the main process pluginReady(); } diff --git a/packages/plugin/src/helper/index.ts b/packages/plugin/src/helper/index.ts index ef6d3455..7d478295 100644 --- a/packages/plugin/src/helper/index.ts +++ b/packages/plugin/src/helper/index.ts @@ -34,7 +34,7 @@ export function showDownloadDialog(item: Omit[]) { window.electron.showDownloadDialog(item); } -// 通知主进程插件已经就绪 +// Notifies the main process that the plug-in is ready export function pluginReady() { window.electron.pluginReady(); } diff --git a/packages/renderer/src/components/EpisodeNumber.tsx b/packages/renderer/src/components/EpisodeNumber.tsx index cde6dd73..ed47e5c6 100644 --- a/packages/renderer/src/components/EpisodeNumber.tsx +++ b/packages/renderer/src/components/EpisodeNumber.tsx @@ -39,14 +39,14 @@ export const EpisodeNumber: FC = ({ ); /** - * 初始化 - * 三个地方会使用到这个组件 - * 1. 新建下载: value 为空 - * 2. 编辑下载: value 有值,编辑模式, 可以使用 canChangeType 判断是否为编辑模式 - * 3. 视频嗅探: value 有值,但是不是编辑模式 + * initialize + * This component is used in three places + * 1. Create a new download: value is empty + * 2. Edit download: value There is a value, edit mode, yes以使用 canChangeType 判断是否为编辑模式 + * 3. Video sniffing: value Has a value, but is not in edit mode式 */ useEffect(() => { - // 如果没有,使用上次的值 + // If not, use the last value if (!value) { const name = lastVideoName || ""; const number = lastVideoNumber || 1; @@ -65,7 +65,7 @@ export const EpisodeNumber: FC = ({ return; } - // 解析名称 + // Resolve name const parseName = (value: string = "") => { const res = { name: "", diff --git a/packages/renderer/src/components/WebView.tsx b/packages/renderer/src/components/WebView.tsx index 23054c40..cd832d3b 100644 --- a/packages/renderer/src/components/WebView.tsx +++ b/packages/renderer/src/components/WebView.tsx @@ -31,7 +31,7 @@ const WebView: FC = ({ className }) => { useEffect(() => { if (webviewRef.current != null) { - // 监控 webview 元素的大小 + // Monitor the size of webview elements resizeObserver.current = new ResizeObserver((entries) => { const rect = computeRect(webviewRef.current?.getBoundingClientRect()); const entry = entries[0]; diff --git a/packages/renderer/src/layout/AppSideBar.tsx b/packages/renderer/src/layout/AppSideBar.tsx index 101cabd6..c9cc30e4 100644 --- a/packages/renderer/src/layout/AppSideBar.tsx +++ b/packages/renderer/src/layout/AppSideBar.tsx @@ -98,7 +98,7 @@ export function AppSideBar({ className }: Props) { if (location.pathname === "/source") { navigate("/"); } - // FIXME: 有可能 webview 还没有完全隐藏 + // FIXME: It is possible that the webview is not completely hidden yet await ipcSetAppStore("openInNewWindow", true); await showBrowserWindow(); }; diff --git a/packages/renderer/src/pages/Converter/index.tsx b/packages/renderer/src/pages/Converter/index.tsx index a47cab09..7cf92781 100644 --- a/packages/renderer/src/pages/Converter/index.tsx +++ b/packages/renderer/src/pages/Converter/index.tsx @@ -63,7 +63,7 @@ const Converter = () => { }); const renderActionButtons = (dom: ReactNode, item: Conversion): ReactNode => { - // 下载成功 + // Download successfully return [
{ return ( = ({ filter = DownloadFilter.list }) => { useEffect(() => { const search = new URLSearchParams(location.search); - // 新增 + // new if (search.has("n")) { const type = search.get("type"); const item: DownloadFormType = { @@ -94,8 +94,8 @@ const HomePage: FC = ({ filter = DownloadFilter.list }) => { const { batch, batchList = "", name, headers, type, url, folder } = values; if (batch) { /** - * 这里需要解析 batchList - * batchList 格式 + * Here you need to parse the batchList + * The format is batchList * url1 name1\n * url2 name2\n * url3 diff --git a/packages/renderer/src/pages/SourceExtract/components/BrowserView.tsx b/packages/renderer/src/pages/SourceExtract/components/BrowserView.tsx index f0abbf95..9854063a 100644 --- a/packages/renderer/src/pages/SourceExtract/components/BrowserView.tsx +++ b/packages/renderer/src/pages/SourceExtract/components/BrowserView.tsx @@ -128,7 +128,7 @@ export function BrowserView() { }); const renderContent = () => { - // 加载状态 + // Loaded state if (store.status === BrowserStatus.Loading) { return (
@@ -137,12 +137,12 @@ export function BrowserView() { ); } - // 模态框 + // Modal box if (placeHolder) { return ; } - // 加载失败 + // Load failure if (store.status === BrowserStatus.Failed) { return (
@@ -158,7 +158,7 @@ export function BrowserView() { ); } - // 加载成功 + // Load successfully if (store.status === BrowserStatus.Loaded) { return ; } diff --git a/packages/renderer/src/pages/SourceExtract/components/ToolBar.tsx b/packages/renderer/src/pages/SourceExtract/components/ToolBar.tsx index a18f038a..6810f346 100644 --- a/packages/renderer/src/pages/SourceExtract/components/ToolBar.tsx +++ b/packages/renderer/src/pages/SourceExtract/components/ToolBar.tsx @@ -56,7 +56,7 @@ export function ToolBar({ page }: Props) { const disabled = store.status !== BrowserStatus.Loaded || store.mode !== PageMode.Browser; - // 设置默认UA + // Set default UA const onSetDefaultUA = () => { const nextMode = !appStore.isMobile; setUserAgent(nextMode); @@ -85,7 +85,7 @@ export function ToolBar({ page }: Props) { const onClickGoBack = async () => { const back = await webviewGoBack(); if (!back) { - // TODO: 重置标题 + // TODO: Reset title // document.title = originTitle.current; dispatch(setBrowserStore({ url: "", title: "", mode: PageMode.Default })); } @@ -140,7 +140,7 @@ export function ToolBar({ page }: Props) { refresh(); }; - // 合并到主页 + // Merge to home page const onCombineToHome = () => { combineToHomePage(store); }; diff --git a/packages/renderer/src/renderer.d.ts b/packages/renderer/src/renderer.d.ts index 9f6fe1ff..56ca2213 100644 --- a/packages/renderer/src/renderer.d.ts +++ b/packages/renderer/src/renderer.d.ts @@ -49,41 +49,41 @@ declare interface UrlDetail { } declare interface AppStore { - // 本地存储地址 + // Local storage address local: string; - // 下载完成提示音 + // Download completion tone promptTone: boolean; - // 代理地址 + // Proxy address proxy?: string; - // 是否开启代理 + // Whether to enable agent useProxy?: boolean; - // 下载完成后删除原始文件 + // Delete the original file after downloading deleteSegments?: boolean; - // 新窗口打开浏览器 + // A new window opens the browser openInNewWindow?: boolean; - // 是否阻止广告 + // Whether to block ads blockAds?: boolean; - // 主题 + // theme theme?: AppTheme; - // 是否使用扩展 + // Whether to use extensions useExtension?: boolean; - // 默认使用移动端UA + // The mobile UA is used by default isMobile?: boolean; - // 最大同时下载数 + // Maximum number of simultaneous downloads maxRunner?: number; - // 语言 + // Language language?: AppLanguage; - // 是否显示终端 + // Show terminal or not showTerminal?: boolean; - // 隐私模式 + // Privacy mode privacy?: boolean; - // 机器id + // Machine id machineId?: string; - // 下载代理设置 + // Download proxy Settings downloadProxySwitch?: boolean; - // 自动更新 + // Automatic update autoUpgrade?: boolean; - // 浏览器中是否播放声音,默认静音 + // Whether to play sounds in the browser. The default value is mute audioMuted?: boolean; } diff --git a/packages/renderer/src/store/browserSlice.ts b/packages/renderer/src/store/browserSlice.ts index ef2268d0..29bd1e9c 100644 --- a/packages/renderer/src/store/browserSlice.ts +++ b/packages/renderer/src/store/browserSlice.ts @@ -50,7 +50,7 @@ export const browserSlice = createSlice({ state[key] = payload[key] as never; } }); - // FIXME: 异步函数 + // FIXME: Asynchronous function setSharedState(convertPlainObject(state)); }, setSources(state: BrowserStore, action: PayloadAction) { diff --git a/packages/renderer/src/store/config.ts b/packages/renderer/src/store/config.ts index 2d476dc7..512eab43 100644 --- a/packages/renderer/src/store/config.ts +++ b/packages/renderer/src/store/config.ts @@ -5,11 +5,11 @@ import { persist, createJSONStorage } from "zustand/middleware"; import localforage from "localforage"; type State = { - // 上次下载类型 + // Last download type lastIsBatch: boolean; lastDownloadTypes: DownloadType; - // 上次选择的视频类型(只有 m3u8 可以缓存) + // Video type selected last time (only m3u8 can be cached) lastVideoType: string; lastVideoName: string; lastVideoNumber: number; diff --git a/packages/renderer/src/utils/http.ts b/packages/renderer/src/utils/http.ts index 028d57fd..2ae70f6b 100644 --- a/packages/renderer/src/utils/http.ts +++ b/packages/renderer/src/utils/http.ts @@ -1,6 +1,6 @@ import axios from "axios"; -// 创建 axios 实例 +// Create an axios instance const http = axios.create({}); export { http };