Files
xiaoxia-saas/apps/web/src/pages/generate/utils/calculateResolution.ts
T
xiaoxia ebb664668b
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 1m4s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 1m5s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 1m30s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 1m50s
AI Code Review / AI Code Review (pull_request) Successful in 1m57s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Successful in 1m19s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 3m5s
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 2m30s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 3m44s
CI/CD Pipeline / PR Build Web Image (pull_request) Successful in 4m9s
CI/CD Pipeline / Validate - Code Quality (pull_request) Successful in 5m37s
CI/CD Pipeline / CI Gate (pull_request) Successful in 15s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Successful in 1m3s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 1m31s
CI/CD Pipeline / Production Browser E2E (pull_request) Failing after 534h16m29s
CI/CD Pipeline / Canary Release to Production (pull_request) Failing after 534h16m30s
CI/CD Pipeline / Integration Tests (pull_request) Failing after 534h16m32s
CI/CD Pipeline / Deploy Production (pull_request) Failing after 534h16m30s
CI/CD Pipeline / Build Production Worker Image (pull_request) Failing after 534h16m31s
CI/CD Pipeline / Build Production Web Image (pull_request) Failing after 534h16m32s
CI/CD Pipeline / PR Build Worker Image (pull_request) Failing after 534h20m20s
CI/CD Pipeline / Unit Tests (pull_request) Failing after 534h21m7s
CI/CD Pipeline / ACR Image Cleanup (pull_request) Failing after 534h22m3s
CI/CD Pipeline / Staging E2E Tests (pull_request) Failing after 534h22m5s
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Failing after 534h22m7s
CI/CD Pipeline / Build Staging Web Image (pull_request) Failing after 534h22m11s
CI/CD Pipeline / Build Staging API Image (pull_request) Failing after 534h22m11s
CI/CD Pipeline / Build Production API Image (pull_request) Failing after 534h50m26s
CI/CD Pipeline / PR Build API Image (pull_request) Failing after 534h54m59s
CI/CD Pipeline / Staging API Integration Tests (pull_request) Failing after 534h55m59s
CI/CD Pipeline / Build Staging Worker Image (pull_request) Failing after 534h56m5s
fix: 预览请求补传 output_width/output_height,匹配 video_ratio
- 新增 calculateResolution 共享工具函数,预览和生成共用同一份分辨率计算
- CreatePreviewRequest 类型新增 output_width/output_height 字段
- buildPreviewRequest 传入计算后的分辨率(9:16 → 1080×1920)
- useGenerateVideo 改用共享函数,去除重复的内联计算
2026-08-25 09:03:34 +08:00

47 lines
1.3 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* 根据视频比例计算输出分辨率
*
* 规则:
* - 长边固定 1920
* - 短边按 1920 × (短/长) 计算,对齐到偶数
* - 9:16 → 1080×1920(竖屏)
* - 16:9 → 1920×1080(横屏)
* - 1:1 → 1920×1920
* - 无法解析时 fallback 到 1080×1920
*/
export interface Resolution {
width: number
height: number
}
export function calculateResolution(ratio: string): Resolution {
if (!ratio) return { width: 1080, height: 1920 }
if (ratio.includes(":")) {
const [rw, rh] = ratio.split(":").map(Number)
if (rw > 0 && rh > 0) {
const [longSide, shortSide] = rw < rh ? [rh, rw] : [rw, rh]
const baseLong = 1920
const baseShort = Math.round((baseLong * shortSide) / longSide)
const evenShort = baseShort - (baseShort % 2)
if (rw < rh) {
// 竖屏:短边是宽,长边是高
return { width: evenShort, height: baseLong }
} else {
// 横屏:长边是宽,短边是高
return { width: baseLong, height: evenShort }
}
}
return { width: 1080, height: 1920 }
}
if (ratio.includes("x")) {
const [wStr, hStr] = ratio.split("x")
const w = parseInt(wStr, 10) || 1080
const h = parseInt(hStr, 10) || 1920
return { width: w, height: h }
}
return { width: 1080, height: 1920 }
}