1.5.1版本,体验性修复、打包fpk、docker镜像、windows包
This commit is contained in:
1 parent
813407de30
commit
a6e45e0cb1
17 files changed
+3451
-15
No files matched your search
@@ -117,6 +117,9 @@ export async function handleFileList(
|
||||
transcodeProgress: stored.transcodeProgress ?? 0,
|
||||
...(stored.transcodeError ? { transcodeError: stored.transcodeError } : {}),
|
||||
...(stored.transcodePreset ? { transcodePreset: stored.transcodePreset } : {}),
|
||||
...(stored.transcodeStartedAt
|
||||
? { transcodeStartedAt: stored.transcodeStartedAt }
|
||||
: {}),
|
||||
...(stored.sourceDeleted ? { sourceDeleted: true } : {}),
|
||||
...(stored.thumbKey
|
||||
? { thumbUrl: resolveImageUrl(event, stored.thumbKey, stored.backendId) }
|
||||
|
||||
@@ -12,6 +12,17 @@ export default defineEventHandler(async (event) => {
|
||||
const currentVersion = resolveRuntimeAppVersion(
|
||||
String(config.appVersion ?? '')
|
||||
)
|
||||
|
||||
// 桌面版保持完全离线,不主动请求远端版本信息。
|
||||
if (process.env.PIC_HOST_DESKTOP === '1') {
|
||||
return {
|
||||
currentVersion,
|
||||
latestVersion: null,
|
||||
updateAvailable: false,
|
||||
releaseUrl: null
|
||||
}
|
||||
}
|
||||
|
||||
const query = getQuery(event)
|
||||
const force = query.refresh === '1' || query.refresh === 'true'
|
||||
const latest = await fetchLatestGitHubRelease(force)
|
||||
|
||||
@@ -47,6 +47,7 @@ export interface ImageIndexRow {
|
||||
source_deleted: number
|
||||
transcode_preset: string | null
|
||||
transcode_error: string | null
|
||||
transcode_started_at: string | null
|
||||
}
|
||||
|
||||
function keyToFilePath(key: string): string {
|
||||
@@ -80,6 +81,7 @@ function rowToStoredImage(row: ImageIndexRow): StoredImage {
|
||||
sourceDeleted: Number(row.source_deleted ?? 0) === 1,
|
||||
transcodePreset: row.transcode_preset ?? null,
|
||||
transcodeError: row.transcode_error ?? null,
|
||||
transcodeStartedAt: row.transcode_started_at ?? null,
|
||||
mtimeMs: Number.isFinite(uploadedMs) ? uploadedMs : Date.now()
|
||||
}
|
||||
}
|
||||
@@ -234,7 +236,7 @@ export async function purgeOrphanImageIndexRows(): Promise<number> {
|
||||
export function getImageIndexRow(key: string): ImageIndexRow | null {
|
||||
ensureStorageSchema()
|
||||
const row = getDb().prepare(`
|
||||
SELECT key, backend_id, user_id, folder, media_type, original_name, content_type, size, uploaded_at, hls_key, transcode_status, transcode_progress, thumb_key, source_deleted, transcode_preset, transcode_error
|
||||
SELECT key, backend_id, user_id, folder, media_type, original_name, content_type, size, uploaded_at, hls_key, transcode_status, transcode_progress, thumb_key, source_deleted, transcode_preset, transcode_started_at, transcode_error
|
||||
FROM images
|
||||
WHERE key = ?
|
||||
`).get(key) as ImageIndexRow | undefined
|
||||
@@ -427,7 +429,7 @@ export function getImageTotals(): { count: number, bytes: number } {
|
||||
export function listAllImageIndexRows(): ImageIndexRow[] {
|
||||
ensureStorageSchema()
|
||||
return getDb().prepare(`
|
||||
SELECT key, backend_id, user_id, folder, media_type, original_name, content_type, size, uploaded_at, hls_key, transcode_status, transcode_progress, thumb_key, source_deleted, transcode_preset, transcode_error
|
||||
SELECT key, backend_id, user_id, folder, media_type, original_name, content_type, size, uploaded_at, hls_key, transcode_status, transcode_progress, thumb_key, source_deleted, transcode_preset, transcode_started_at, transcode_error
|
||||
FROM images
|
||||
ORDER BY key ASC
|
||||
`).all() as unknown as ImageIndexRow[]
|
||||
@@ -439,7 +441,7 @@ export function listImageIndexRowsAfter(
|
||||
): ImageIndexRow[] {
|
||||
ensureStorageSchema()
|
||||
return getDb().prepare(`
|
||||
SELECT key, backend_id, user_id, folder, media_type, original_name, content_type, size, uploaded_at, hls_key, transcode_status, transcode_progress, thumb_key, source_deleted, transcode_preset, transcode_error
|
||||
SELECT key, backend_id, user_id, folder, media_type, original_name, content_type, size, uploaded_at, hls_key, transcode_status, transcode_progress, thumb_key, source_deleted, transcode_preset, transcode_started_at, transcode_error
|
||||
FROM images
|
||||
WHERE key > ?
|
||||
ORDER BY key ASC
|
||||
@@ -450,7 +452,7 @@ export function listImageIndexRowsAfter(
|
||||
export function listImageIndexRowsForUser(userId: number): ImageIndexRow[] {
|
||||
ensureStorageSchema()
|
||||
return getDb().prepare(`
|
||||
SELECT key, backend_id, user_id, folder, media_type, original_name, content_type, size, uploaded_at, hls_key, transcode_status, transcode_progress, thumb_key, source_deleted, transcode_preset, transcode_error
|
||||
SELECT key, backend_id, user_id, folder, media_type, original_name, content_type, size, uploaded_at, hls_key, transcode_status, transcode_progress, thumb_key, source_deleted, transcode_preset, transcode_started_at, transcode_error
|
||||
FROM images
|
||||
WHERE user_id = ?
|
||||
ORDER BY key ASC
|
||||
@@ -460,7 +462,7 @@ export function listImageIndexRowsForUser(userId: number): ImageIndexRow[] {
|
||||
export function listImageIndexRowsByBackend(backendId: string): ImageIndexRow[] {
|
||||
ensureStorageSchema()
|
||||
return getDb().prepare(`
|
||||
SELECT key, backend_id, user_id, folder, media_type, original_name, content_type, size, uploaded_at, hls_key, transcode_status, transcode_progress, thumb_key, source_deleted, transcode_preset, transcode_error
|
||||
SELECT key, backend_id, user_id, folder, media_type, original_name, content_type, size, uploaded_at, hls_key, transcode_status, transcode_progress, thumb_key, source_deleted, transcode_preset, transcode_started_at, transcode_error
|
||||
FROM images
|
||||
WHERE backend_id = ?
|
||||
ORDER BY key ASC
|
||||
@@ -485,6 +487,7 @@ export function updateImageTranscode(
|
||||
size?: number
|
||||
preset?: string | null
|
||||
error?: string | null
|
||||
startedAt?: string | null
|
||||
}
|
||||
): void {
|
||||
ensureStorageSchema()
|
||||
@@ -496,7 +499,8 @@ export function updateImageTranscode(
|
||||
source_deleted = COALESCE(?, source_deleted),
|
||||
size = COALESCE(?, size),
|
||||
transcode_preset = COALESCE(?, transcode_preset),
|
||||
transcode_error = ?
|
||||
transcode_error = ?,
|
||||
transcode_started_at = COALESCE(?, transcode_started_at)
|
||||
WHERE key = ?
|
||||
`).run(
|
||||
input.status,
|
||||
@@ -506,6 +510,7 @@ export function updateImageTranscode(
|
||||
input.size ?? null,
|
||||
input.preset ?? null,
|
||||
input.error ?? null,
|
||||
input.startedAt ?? null,
|
||||
key
|
||||
)
|
||||
}
|
||||
@@ -703,7 +708,7 @@ export async function listImages(options: {
|
||||
const backendSql = buildBackendFilterSql(options.backendId, params)
|
||||
const tagSql = buildTagFilterSql(options.tagFilter, params)
|
||||
const rows = getDb().prepare(`
|
||||
SELECT key, backend_id, user_id, folder, media_type, original_name, content_type, size, uploaded_at, hls_key, transcode_status, transcode_progress, thumb_key, source_deleted, transcode_preset, transcode_error
|
||||
SELECT key, backend_id, user_id, folder, media_type, original_name, content_type, size, uploaded_at, hls_key, transcode_status, transcode_progress, thumb_key, source_deleted, transcode_preset, transcode_started_at, transcode_error
|
||||
FROM images
|
||||
WHERE ${clauses.join(' AND ')}${userSql}${backendSql}${tagSql}
|
||||
ORDER BY uploaded_at DESC, key DESC
|
||||
@@ -749,7 +754,7 @@ export async function searchImages(options: {
|
||||
const backendSql = buildBackendFilterSql(options.backendId, params)
|
||||
const tagSql = buildTagFilterSql(options.tagFilter, params)
|
||||
const rows = getDb().prepare(`
|
||||
SELECT key, backend_id, user_id, folder, media_type, original_name, content_type, size, uploaded_at, hls_key, transcode_status, transcode_progress, thumb_key, source_deleted, transcode_preset, transcode_error
|
||||
SELECT key, backend_id, user_id, folder, media_type, original_name, content_type, size, uploaded_at, hls_key, transcode_status, transcode_progress, thumb_key, source_deleted, transcode_preset, transcode_started_at, transcode_error
|
||||
FROM images
|
||||
WHERE ${clauses.join(' AND ')}${userSql}${backendSql}${tagSql}
|
||||
ORDER BY uploaded_at DESC, key DESC
|
||||
@@ -883,7 +888,7 @@ export async function getUserScopedStorageStats(
|
||||
export async function listImageKeysForAutoDelete(): Promise<StoredImage[]> {
|
||||
ensureStorageSchema()
|
||||
const rows = getDb().prepare(`
|
||||
SELECT key, backend_id, user_id, folder, media_type, original_name, content_type, size, uploaded_at, hls_key, transcode_status, transcode_progress, thumb_key, source_deleted, transcode_preset, transcode_error
|
||||
SELECT key, backend_id, user_id, folder, media_type, original_name, content_type, size, uploaded_at, hls_key, transcode_status, transcode_progress, thumb_key, source_deleted, transcode_preset, transcode_started_at, transcode_error
|
||||
FROM images
|
||||
WHERE media_type = 'image'
|
||||
ORDER BY uploaded_at ASC
|
||||
|
||||
@@ -19,7 +19,8 @@ const row: ImageIndexRow = {
|
||||
thumb_key: 'videos/2026/10/example.webp',
|
||||
source_deleted: 0,
|
||||
transcode_preset: 'veryfast',
|
||||
transcode_error: null
|
||||
transcode_error: null,
|
||||
transcode_started_at: null
|
||||
}
|
||||
|
||||
async function createBackend() {
|
||||
|
||||
@@ -95,6 +95,7 @@ const STORAGE_SCHEMA_THUMB_KEY = 'storage_schema_thumb'
|
||||
const STORAGE_SCHEMA_SOURCE_DELETED_KEY = 'storage_schema_source_deleted'
|
||||
const STORAGE_SCHEMA_TRANSCODE_PRESET_KEY = 'storage_schema_transcode_preset'
|
||||
const STORAGE_SCHEMA_TRANSCODE_ERROR_KEY = 'storage_schema_transcode_error'
|
||||
const STORAGE_SCHEMA_TRANSCODE_STARTED_KEY = 'storage_schema_transcode_started'
|
||||
|
||||
/** images 表新增 media_type 列(区分图床图片与文件床文件) */
|
||||
function migrateImagesMediaType(database: DatabaseSync): void {
|
||||
@@ -254,6 +255,27 @@ function migrateImagesTranscodeError(database: DatabaseSync): void {
|
||||
`).run(STORAGE_SCHEMA_TRANSCODE_ERROR_KEY, new Date().toISOString())
|
||||
}
|
||||
|
||||
/** images 表新增「转码开始时间」列 */
|
||||
function migrateImagesTranscodeStarted(database: DatabaseSync): void {
|
||||
const migrated = database.prepare(`
|
||||
SELECT value FROM settings WHERE key = ?
|
||||
`).get(STORAGE_SCHEMA_TRANSCODE_STARTED_KEY) as { value?: string } | undefined
|
||||
|
||||
if (migrated?.value === '1') return
|
||||
|
||||
const columns = database.prepare('PRAGMA table_info(images)').all() as Array<{
|
||||
name: string
|
||||
}>
|
||||
if (!columns.some(column => column.name === 'transcode_started_at')) {
|
||||
database.exec('ALTER TABLE images ADD COLUMN transcode_started_at TEXT')
|
||||
}
|
||||
|
||||
database.prepare(`
|
||||
INSERT OR REPLACE INTO settings (key, value, updated_at)
|
||||
VALUES (?, '1', ?)
|
||||
`).run(STORAGE_SCHEMA_TRANSCODE_STARTED_KEY, new Date().toISOString())
|
||||
}
|
||||
|
||||
function migrateStorageTables(database: DatabaseSync): void {
|
||||
database.exec(`
|
||||
CREATE TABLE IF NOT EXISTS storage_backends (
|
||||
@@ -286,6 +308,7 @@ function migrateStorageTables(database: DatabaseSync): void {
|
||||
source_deleted INTEGER NOT NULL DEFAULT 0,
|
||||
transcode_preset TEXT,
|
||||
transcode_error TEXT,
|
||||
transcode_started_at TEXT,
|
||||
FOREIGN KEY (backend_id) REFERENCES storage_backends(id)
|
||||
);
|
||||
CREATE INDEX IF NOT EXISTS idx_images_uploaded_at ON images(uploaded_at DESC);
|
||||
@@ -308,6 +331,7 @@ function migrateStorageTables(database: DatabaseSync): void {
|
||||
migrateImagesSourceDeleted(database)
|
||||
migrateImagesTranscodePreset(database)
|
||||
migrateImagesTranscodeError(database)
|
||||
migrateImagesTranscodeStarted(database)
|
||||
database.exec(`
|
||||
CREATE INDEX IF NOT EXISTS idx_images_media_type ON images(media_type);
|
||||
`)
|
||||
|
||||
@@ -25,6 +25,8 @@ export interface StoredImage extends StoredImageMeta {
|
||||
transcodeProgress?: number
|
||||
/** 本视频使用的转码档位 */
|
||||
transcodePreset?: string | null
|
||||
/** 转码开始时间(ISO) */
|
||||
transcodeStartedAt?: string | null
|
||||
/** 转码失败原因 */
|
||||
transcodeError?: string | null
|
||||
/** 视频封面缩略图 key */
|
||||
|
||||
@@ -705,7 +705,10 @@ let activeCount = 0
|
||||
|
||||
async function processOne(job: QueuedTranscode): Promise<void> {
|
||||
const { videoKey } = job
|
||||
updateImageTranscode(videoKey, { status: 'running' })
|
||||
updateImageTranscode(videoKey, {
|
||||
status: 'running',
|
||||
startedAt: new Date().toISOString()
|
||||
})
|
||||
|
||||
try {
|
||||
const { playlistKey, totalBytes } = await transcodeVideoToHls(videoKey, job)
|
||||
|
||||
Reference in new issue
Block a user