From a0a90f24280438e97e64865fcd3f392b11c22d42 Mon Sep 17 00:00:00 2001 From: alikia2x Date: Thu, 2 Jan 2025 00:26:50 +0800 Subject: [PATCH] ref: better import for utils fix: inappropriate ffmpeg path in `immediatelyExtractFrameFromVideo()` --- bun.lockb | Bin 383753 -> 388605 bytes package.json | 1 + src/electron/backend/encoding.ts | 4 ++-- src/electron/backend/init.ts | 2 +- src/electron/backend/screenshot.ts | 2 +- src/electron/createWindow.ts | 2 +- src/electron/index.ts | 4 ++-- src/electron/server/index.ts | 4 ++-- src/electron/utils/fs/index.ts | 9 +++++++++ src/electron/utils/index.ts | 1 + src/electron/utils/logging/index.ts | 10 ++++++++++ src/electron/utils/platform/index.ts | 21 ++++++++++++++------- src/electron/utils/video/index.ts | 2 +- 13 files changed, 45 insertions(+), 17 deletions(-) create mode 100644 src/electron/utils/logging/index.ts diff --git a/bun.lockb b/bun.lockb index c2529d1cc3094bc74628a3496de1f61ec7fd14a0..d1b0319dacd556b44ecfcf533b7cb78c78eacaf3 100755 GIT binary patch delta 64594 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 #x$1F=CthZ)0)%br0R2%NY^wKfy-QzHAg!{4W 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 V4u;le?&jj@T0Q;d?^>nX{|AJuSm^)& delta 62366 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 diff --git a/package.json b/package.json index 93023e0..286e904 100644 --- a/package.json +++ b/package.json @@ -41,6 +41,7 @@ "image-size": "^1.1.1", "jotai": "^2.11.0", "memory-cache": "^0.2.0", + "pino": "^9.6.0", "react": "^18.3.1", "react-dom": "^18.3.1", "react-i18next": "^15.1.2", diff --git a/src/electron/backend/encoding.ts b/src/electron/backend/encoding.ts index 22fdbb4..8bb5f30 100644 --- a/src/electron/backend/encoding.ts +++ b/src/electron/backend/encoding.ts @@ -4,8 +4,8 @@ import fs from "fs"; import path, { join } from "path"; import type { EncodingTask, Frame } from "./schema"; import sizeOf from "image-size"; -import { getEncodeCommand } from "../utils/video/index.js"; -import { getRecordingsDir, getEncodingTempDir, getScreenshotsDir } from "../utils/fs/index.js"; +import { getEncodeCommand } from "../utils/index.js"; +import { getRecordingsDir, getEncodingTempDir, getScreenshotsDir } from "../utils/index.js"; import cache from "memory-cache"; import { ENCODING_FRAME_INTERVAL, RECORD_FRAME_RATE as FRAME_RATE } from "./consts.js"; diff --git a/src/electron/backend/init.ts b/src/electron/backend/init.ts index 19242de..956a622 100644 --- a/src/electron/backend/init.ts +++ b/src/electron/backend/init.ts @@ -2,7 +2,7 @@ import * as path from "path"; import { Database } from "better-sqlite3"; import DB from "better-sqlite3"; import { __dirname } from "../dirname.js"; -import { getDatabaseDir } from "../utils/fs/index.js"; +import { getDatabaseDir } from "../utils/index.js"; import { migrate } from "./migrate/index.js"; function getLibSimpleExtensionPath() { diff --git a/src/electron/backend/screenshot.ts b/src/electron/backend/screenshot.ts index 78a8537..ce2a074 100644 --- a/src/electron/backend/screenshot.ts +++ b/src/electron/backend/screenshot.ts @@ -1,5 +1,5 @@ import screenshot from "screenshot-desktop"; -import { getScreenshotsDir } from "../utils/fs/index.js"; +import { getScreenshotsDir } from "../utils/index.js"; import { join } from "path"; import { Database } from "better-sqlite3"; import SqlString from "sqlstring"; diff --git a/src/electron/createWindow.ts b/src/electron/createWindow.ts index b78c875..0d45b5e 100644 --- a/src/electron/createWindow.ts +++ b/src/electron/createWindow.ts @@ -2,7 +2,7 @@ import { app, BrowserWindow, screen } from "electron"; import { join } from "path"; import { __dirname } from "./dirname.js"; import windowStateManager from "electron-window-state"; -import { hideDock, showDock } from "./utils/platform/index.js"; +import { hideDock, showDock } from "./utils/index.js"; function loadURL(window: BrowserWindow, path = "", vitePort: string) { const dev = !app.isPackaged; diff --git a/src/electron/index.ts b/src/electron/index.ts index b0bb404..066b22f 100644 --- a/src/electron/index.ts +++ b/src/electron/index.ts @@ -16,7 +16,7 @@ import { initDatabase } from "./backend/init.js"; import { Database } from "better-sqlite3"; import { startScreenshotLoop } from "./backend/screenshot.js"; import { __dirname } from "./dirname.js"; -import { hideDock } from "./utils/platform/index.js"; +import { hideDock } from "./utils/index.js"; import { checkFramesForEncoding, deleteUnnecessaryScreenshots, @@ -24,7 +24,7 @@ import { } from "./backend/encoding.js"; import honoApp from "./server/index.js"; import { serve } from "@hono/node-server"; -import { findAvailablePort } from "./utils/network/index.js"; +import { findAvailablePort } from "./utils/index.js"; import cache from "memory-cache"; import { generate as generateAPIKey } from "@alikia/random-key"; diff --git a/src/electron/server/index.ts b/src/electron/server/index.ts index 5cf793f..eec169b 100644 --- a/src/electron/server/index.ts +++ b/src/electron/server/index.ts @@ -10,8 +10,8 @@ import { getRecordingsDir, getScreenshotsDir, waitForFileExists -} from "../utils/fs/index.js"; -import { immediatelyExtractFrameFromVideo } from "../utils/video/index.js"; +} from "../utils/index.js"; +import { immediatelyExtractFrameFromVideo } from "../utils/index.js"; import { existsSync } from "fs"; const app = new Hono(); diff --git a/src/electron/utils/fs/index.ts b/src/electron/utils/fs/index.ts index aa25fa5..01a5d0f 100644 --- a/src/electron/utils/fs/index.ts +++ b/src/electron/utils/fs/index.ts @@ -59,6 +59,15 @@ export function getDecodingTempDir() { return decodingTempDir; } +export function getLogDir() { + const dataDir = createDataDir(); + const logDir = path.join(dataDir, "logs"); + if (!fs.existsSync(logDir)) { + fs.mkdirSync(logDir, { recursive: true }); + } + return logDir; +} + export async function waitForFileExists(filePath: string, timeout: number = 10000): Promise { return new Promise((resolve, reject) => { fs.access(filePath, fs.constants.F_OK, (err) => { diff --git a/src/electron/utils/index.ts b/src/electron/utils/index.ts index 75619e4..68f2c17 100644 --- a/src/electron/utils/index.ts +++ b/src/electron/utils/index.ts @@ -2,3 +2,4 @@ export * from "./fs/index.js"; export * from "./platform/index.js"; export * from "./video/index.js"; export * from "./network/index.js"; +export * from "./logging/index.js"; \ No newline at end of file diff --git a/src/electron/utils/logging/index.ts b/src/electron/utils/logging/index.ts new file mode 100644 index 0000000..20be53f --- /dev/null +++ b/src/electron/utils/logging/index.ts @@ -0,0 +1,10 @@ +import pino from "pino"; +import { join } from "path"; +import { getLogDir } from "../fs/index.js"; + +const logPath = join(getLogDir(), "log.json"); +const dest = pino.destination(logPath); + +const logger = pino(dest); + +export { logger }; \ No newline at end of file diff --git a/src/electron/utils/platform/index.ts b/src/electron/utils/platform/index.ts index b862dc7..cdf7a9b 100644 --- a/src/electron/utils/platform/index.ts +++ b/src/electron/utils/platform/index.ts @@ -1,14 +1,15 @@ -import path from "path"; +import { join } from "path"; import os from "os"; import { app } from "electron"; import { __dirname } from "../../dirname.js"; +import { logger } from "../index.js"; export function getUserDataDir() { switch (process.platform) { case "win32": - return path.join(process.env.APPDATA!, "OpenRewind", "Record Data"); + return join(process.env.APPDATA!, "OpenRewind", "Record Data"); case "darwin": - return path.join( + return join( os.homedir(), "Library", "Application Support", @@ -16,7 +17,7 @@ export function getUserDataDir() { "Record Data" ); case "linux": - return path.join(os.homedir(), ".config", "OpenRewind", "Record Data"); + return join(os.homedir(), ".config", "OpenRewind", "Record Data"); default: throw new Error("Unsupported platform"); } @@ -37,14 +38,20 @@ export function showDock() { } export function getFFmpegPath() { + let path = ""; switch (process.platform) { case "win32": - return path.join(__dirname, "bin", process.platform, "ffmpeg.exe"); + path = join(__dirname, "bin", process.platform, "ffmpeg.exe"); + break; case "darwin": - return path.join(__dirname, "bin", process.platform, "ffmpeg"); + path = join(__dirname, "bin", process.platform, "ffmpeg"); + break; case "linux": - return path.join(__dirname, "bin", process.platform, "ffmpeg"); + path = join(__dirname, "bin", process.platform, "ffmpeg"); + break; default: throw new Error("Unsupported platform"); } + logger.info("FFmpeg path: %s", path); + return path; } diff --git a/src/electron/utils/video/index.ts b/src/electron/utils/video/index.ts index c483d2e..8a74c19 100644 --- a/src/electron/utils/video/index.ts +++ b/src/electron/utils/video/index.ts @@ -44,7 +44,7 @@ export function immediatelyExtractFrameFromVideo( "1", `${outputPathArg}` ]; - const ffmpeg = spawn("ffmpeg", args); + const ffmpeg = spawn(getFFmpegPath(), args); ffmpeg.stdout.on("data", (data) => { console.log(data.toString()); });