feat(admin): 新增转码设置页面
This commit is contained in:
1 parent
723d056fc7
commit
218196ee9f
16 files changed
+1014
-3
No files matched your search
@@ -0,0 +1,98 @@
|
||||
// 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'))
|
||||
)
|
||||
}
|
||||
}
|
||||
]
|
||||
Reference in new issue
Block a user