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

99 lines
2.9 KiB
TypeScript

// Author: fruit.com.cn
import type { FormItemRule, FormRules } from 'element-plus'
import type { MediaTranscodeProfile } from '@/api/admin/types'
import {
MAX_QUALITY_LENGTH,
MAX_SEGMENT_SECONDS,
MAX_SPRITE_COLUMNS,
MAX_SPRITE_INTERVAL,
MAX_THUMB_WIDTH,
MIN_SPRITE_COLUMNS,
MIN_SEGMENT_SECONDS,
MIN_SPRITE_INTERVAL,
MIN_THUMB_WIDTH
} from './transcodeProfileDefaults'
type Translate = (key: string, named?: Record<string, unknown>) => string
const rangeRule = (min: number, max: number, t: Translate): FormItemRule => ({
trigger: 'change',
validator: (_rule, value, callback) => {
const parsed = Number(value)
callback(
Number.isInteger(parsed) && parsed >= min && parsed <= max
? undefined
: new Error(t('transcodeSettings.validation.range', { min, max }))
)
}
})
export const positiveIntegerRule = (t: Translate): FormItemRule => ({
trigger: 'change',
validator: (_rule, value, callback) => {
const parsed = Number(value)
callback(
Number.isInteger(parsed) && parsed > 0
? undefined
: new Error(t('transcodeSettings.validation.positiveInteger'))
)
}
})
export const positiveEvenRule = (t: Translate): FormItemRule => ({
trigger: 'change',
validator: (_rule, value, callback) => {
const parsed = Number(value)
callback(
Number.isInteger(parsed) && parsed > 0 && parsed % 2 === 0
? undefined
: new Error(t('transcodeSettings.validation.positiveEven'))
)
}
})
export const createProfileRules = (t: Translate): FormRules => ({
segmentSeconds: [rangeRule(MIN_SEGMENT_SECONDS, MAX_SEGMENT_SECONDS, t)],
'sprite.intervalSeconds': [rangeRule(MIN_SPRITE_INTERVAL, MAX_SPRITE_INTERVAL, t)],
'sprite.columns': [rangeRule(MIN_SPRITE_COLUMNS, MAX_SPRITE_COLUMNS, t)],
'sprite.thumbWidth': [rangeRule(MIN_THUMB_WIDTH, MAX_THUMB_WIDTH, t)]
})
export const createQualityRules = (
form: MediaTranscodeProfile,
index: number,
t: Translate
): FormItemRule[] => [
{
trigger: 'blur',
validator: (_rule, value, callback) => {
const quality = String(value ?? '').trim()
if (!quality) {
callback(new Error(t('transcodeSettings.validation.required')))
return
}
if (quality.length > MAX_QUALITY_LENGTH) {
callback(new Error(t('transcodeSettings.validation.qualityTooLong')))
return
}
const duplicate = form.ladder.some(
(row, rowIndex) => rowIndex !== index && row.quality.trim() === quality
)
callback(duplicate ? new Error(t('transcodeSettings.validation.qualityUnique')) : undefined)
}
}
]
export const createEnabledRules = (form: MediaTranscodeProfile, t: Translate): FormItemRule[] => [
{
trigger: 'change',
validator: (_rule, _value, callback) => {
callback(
form.ladder.some((row) => row.enabled)
? undefined
: new Error(t('transcodeSettings.validation.atLeastOneEnabled'))
)
}
}
]