Files
ReelShortWeb/src/views/systemManagement/composables/transcodeProfileModel.ts
T

50 lines
1.7 KiB
TypeScript

// Author: fruit.com.cn
import type { MediaTranscodeProfile } from '@/api/admin/types'
import { defaultProfile, defaultRung, defaultSprite } from './transcodeProfileDefaults'
/** 用服务端响应回填表单,同时保持字段名与后端完全一致。 */
export const applyProfileToForm = (
form: MediaTranscodeProfile,
profile?: MediaTranscodeProfile | null
): void => {
const source = profile || defaultProfile()
form.enabled = Boolean(source.enabled)
form.segmentSeconds = Number(source.segmentSeconds)
form.sprite = { ...defaultSprite(), ...(source.sprite || {}) }
const ladder =
Array.isArray(source.ladder) && source.ladder.length ? source.ladder : [defaultRung()]
form.ladder.splice(
0,
form.ladder.length,
...ladder.map((row) => ({
quality: row.quality || '',
width: Number(row.width),
height: Number(row.height),
videoBitrateKbps: Number(row.videoBitrateKbps),
audioBitrateKbps: Number(row.audioBitrateKbps),
enabled: Boolean(row.enabled)
}))
)
}
/** 生成只包含后端约定字段的 PUT 请求体。 */
export const buildProfilePayload = (form: MediaTranscodeProfile): MediaTranscodeProfile => ({
enabled: form.enabled,
segmentSeconds: Number(form.segmentSeconds),
ladder: form.ladder.map((row) => ({
quality: row.quality.trim(),
width: Number(row.width),
height: Number(row.height),
videoBitrateKbps: Number(row.videoBitrateKbps),
audioBitrateKbps: Number(row.audioBitrateKbps),
enabled: Boolean(row.enabled)
})),
sprite: {
enabled: Boolean(form.sprite.enabled),
intervalSeconds: Number(form.sprite.intervalSeconds),
columns: Number(form.sprite.columns),
thumbWidth: Number(form.sprite.thumbWidth)
}
})