99 lines
2.9 KiB
TypeScript
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'))
|
|
)
|
|
}
|
|
}
|
|
]
|