// 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) } })