正在从 S3 下载源文件...
准备下载...
@@ -89,7 +111,12 @@diff --git a/.env.example b/.env.example index ace6996..d33d5d8 100644 --- a/.env.example +++ b/.env.example @@ -11,3 +11,7 @@ S3_FORCE_PATH_STYLE=true # Application Title APP_TITLE=S3 Media Transcoder + +# Session Cache (Valkey / Redis) +VALKEY_URL=redis://localhost:6379 +VALKEY_DB=0 diff --git a/ecosystem.config.js b/ecosystem.config.js index 834cb8d..80a679e 100644 --- a/ecosystem.config.js +++ b/ecosystem.config.js @@ -17,7 +17,9 @@ module.exports = { S3_BUCKET_ADDRESS: 'https://s3.example.com/your_bucket_name', S3_ENDPOINT: 'http://127.0.0.1:9000', S3_FORCE_PATH_STYLE: 'true', - APP_TITLE: 'S3 Media Transcoder' + APP_TITLE: 'S3 Media Transcoder', + VALKEY_URL: 'redis://localhost:6379', + VALKEY_DB: 0 } } ] diff --git a/package.json b/package.json index 3ffb383..b16f8bf 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,7 @@ "dotenv": "^16.4.5", "express": "^4.19.2", "fluent-ffmpeg": "^2.1.3", + "ioredis": "^5.3.0", "ws": "^8.13.0" } -} +} \ No newline at end of file diff --git a/public/css/style.css b/public/css/style.css index a6e8646..b52f419 100644 --- a/public/css/style.css +++ b/public/css/style.css @@ -10,6 +10,17 @@ --font-main: 'Inter', sans-serif; } +:root[data-theme="dark"] { + --bg-dark: #0f172a; + --panel-bg: rgba(30, 41, 59, 0.85); + --panel-border: rgba(148, 163, 184, 0.15); + --text-primary: #f8fafc; + --text-secondary: #94a3b8; + --accent: #3b82f6; + --accent-hover: #60a5fa; + --accent-glow: rgba(59, 130, 246, 0.35); +} + * { margin: 0; padding: 0; @@ -109,7 +120,7 @@ header p { align-items: flex-start; } -.dashboard > * { +.dashboard>* { min-width: 0; } @@ -247,10 +258,37 @@ header p { margin-bottom: 1.5rem; color: var(--text-primary); font-size: 1.25rem; - font-weight: 700; display: flex; align-items: center; - justify-content: flex-start; + justify-content: space-between; +} + +.banner-title { + font-weight: 700; +} + +.user-controls { + display: flex; + align-items: center; + gap: 1.5rem; + font-size: 0.95rem; + font-weight: 500; +} + +.user-info { + display: flex; + align-items: center; + gap: 0.75rem; +} + +#theme-selector { + background: var(--panel-bg); + color: var(--text-primary); + border: 1px solid var(--panel-border); + padding: 0.35rem 0.5rem; + border-radius: 6px; + font-size: 0.9rem; + outline: none; } .top-banner.hidden { @@ -699,8 +737,15 @@ header p { } @keyframes statusPulse { - 0%, 100% { box-shadow: 0 0 0 0 rgba(34, 197, 94, 0.35); } - 50% { box-shadow: 0 0 0 10px rgba(34, 197, 94, 0); } + + 0%, + 100% { + box-shadow: 0 0 0 0 rgba(34, 197, 94, 0.35); + } + + 50% { + box-shadow: 0 0 0 10px rgba(34, 197, 94, 0); + } } .control-btn { @@ -907,8 +952,15 @@ header p { } @keyframes phaseIn { - from { opacity: 0; transform: translateY(12px); } - to { opacity: 1; transform: translateY(0); } + from { + opacity: 0; + transform: translateY(12px); + } + + to { + opacity: 1; + transform: translateY(0); + } } .phase-container h3 { @@ -940,8 +992,15 @@ header p { } @keyframes pulse-download { - 0%, 100% { box-shadow: 0 0 0 0 rgba(6, 182, 212, 0.3); } - 50% { box-shadow: 0 0 0 12px rgba(6, 182, 212, 0); } + + 0%, + 100% { + box-shadow: 0 0 0 0 rgba(6, 182, 212, 0.3); + } + + 50% { + box-shadow: 0 0 0 12px rgba(6, 182, 212, 0); + } } .phase-icon.transcode-icon { @@ -951,8 +1010,15 @@ header p { } @keyframes pulse-transcode { - 0%, 100% { box-shadow: 0 0 0 0 rgba(139, 92, 246, 0.3); } - 50% { box-shadow: 0 0 0 12px rgba(139, 92, 246, 0); } + + 0%, + 100% { + box-shadow: 0 0 0 0 rgba(139, 92, 246, 0.3); + } + + 50% { + box-shadow: 0 0 0 12px rgba(139, 92, 246, 0); + } } /* Transcode stats */ @@ -1089,4 +1155,4 @@ header p { .control-seek { min-width: 220px; } -} +} \ No newline at end of file diff --git a/public/index.html b/public/index.html index e452647..82de861 100644 --- a/public/index.html +++ b/public/index.html @@ -1,5 +1,6 @@ +
@@ -10,6 +11,7 @@ +