文件预览

validator.js

查看 550W视频去字幕 技能包中的文件内容。

文件内容

dist/validator.js

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.validateCredential = validateCredential;
exports.normalizePageParams = normalizePageParams;
exports.estimateCredits = estimateCredits;
exports.validate = validate;
const types_1 = require("./types");
function validationError(message) {
    return { code: types_1.ErrorCode.INVALID_PARAMS, message };
}
function getFileExtension(filename) {
    const lastDot = filename.lastIndexOf(".");
    if (lastDot === -1)
        return "";
    return filename.slice(lastDot).toLowerCase();
}
function validateCredential(userNo, apiKey) {
    if (userNo == null || userNo.trim().length === 0) {
        return validationError("userNo 不能为空");
    }
    if (userNo.trim().length > types_1.MAX_CREDENTIAL_LENGTH) {
        return validationError(`userNo 长度不能超过 ${types_1.MAX_CREDENTIAL_LENGTH} 个字符`);
    }
    if (apiKey == null || apiKey.trim().length === 0) {
        return validationError("apiKey 不能为空");
    }
    if (apiKey.trim().length > types_1.MAX_CREDENTIAL_LENGTH) {
        return validationError(`apiKey 长度不能超过 ${types_1.MAX_CREDENTIAL_LENGTH} 个字符`);
    }
    return null;
}
function validateFile(file) {
    if (!file)
        return validationError("文件不能为空");
    if (!file.name || file.name.trim().length === 0)
        return validationError("文件名不能为空");
    if (file.size > types_1.MAX_FILE_SIZE) {
        return validationError(`文件大小超限,最大支持 1GB,当前文件大小为 ${file.size} 字节`);
    }
    const ext = getFileExtension(file.name);
    if (!types_1.SUPPORTED_VIDEO_EXTENSIONS.includes(ext)) {
        return validationError(`不支持的视频格式 "${ext}",仅支持 mp4、mov 格式`);
    }
    return null;
}
function validateUrl(url) {
    if (url == null || url.trim().length === 0)
        return validationError("videoUrl 不能为空");
    if (!url.startsWith("http://") && !url.startsWith("https://")) {
        return validationError("videoUrl 必须以 http:// 或 https:// 开头");
    }
    if (url.length > types_1.MAX_URL_LENGTH) {
        return validationError(`videoUrl 长度不能超过 ${types_1.MAX_URL_LENGTH} 个字符`);
    }
    return null;
}
function validateResolution(width, height) {
    if (width * height > types_1.MAX_RESOLUTION) {
        return validationError(`视频分辨率超限,最大支持 ${types_1.MAX_RESOLUTION} 像素(当前 ${width}×${height}=${width * height} 像素)`);
    }
    return null;
}
function validateDuration(duration) {
    if (duration == null || typeof duration !== "number" || !Number.isFinite(duration)) {
        return validationError("duration 必须为有效数字");
    }
    if (duration < 1 || duration > types_1.MAX_DURATION) {
        return validationError(`视频时长超限,有效范围为 1~${types_1.MAX_DURATION} 秒(当前 ${duration} 秒)`);
    }
    return null;
}
function validateDimension(value, fieldName) {
    if (value == null || typeof value !== "number" || !Number.isFinite(value)) {
        return validationError(`${fieldName} 必须为有效数字`);
    }
    if (!Number.isInteger(value))
        return validationError(`${fieldName} 必须为整数`);
    if (value < 1 || value > types_1.MAX_DIMENSION) {
        return validationError(`${fieldName} 超出有效范围,有效范围为 1~${types_1.MAX_DIMENSION}(当前 ${value})`);
    }
    return null;
}
function validateCoordinates(x1, y1, x2, y2, width, height) {
    if (x1 === 0 && y1 === 0 && x2 === 0 && y2 === 0)
        return null;
    if (x2 <= x1)
        return validationError(`坐标范围错误:x2(${x2}) 必须大于 x1(${x1})`);
    if (y2 <= y1)
        return validationError(`坐标范围错误:y2(${y2}) 必须大于 y1(${y1})`);
    if (x2 > width)
        return validationError(`坐标范围错误:x2(${x2}) 不能超过视频宽度(${width})`);
    if (y2 > height)
        return validationError(`坐标范围错误:y2(${y2}) 不能超过视频高度(${height})`);
    return null;
}
function validateTaskId(taskId) {
    if (taskId == null || typeof taskId !== "string" || taskId.length === 0) {
        return validationError("taskId 不能为空");
    }
    if (taskId.length > types_1.MAX_TASK_ID_LENGTH) {
        return validationError(`taskId 长度不能超过 ${types_1.MAX_TASK_ID_LENGTH} 个字符`);
    }
    return null;
}
function normalizePageParams(params) {
    const page = params.page != null ? Math.max(0, Math.floor(params.page)) : 0;
    const size = params.size != null ? Math.min(100, Math.max(1, Math.floor(params.size))) : 20;
    return { page, size };
}
function estimateCredits(width, height, duration) {
    const pixels = width * height;
    const isAbove720p = pixels > types_1.RESOLUTION_720P_THRESHOLD;
    const rate = isAbove720p ? types_1.RATE_ABOVE_720P : types_1.RATE_720P_OR_BELOW;
    const estimatedCost = Math.ceil(duration * rate);
    return { estimatedCost, resolution: isAbove720p ? "above_720p" : "720p_or_below" };
}
function validateUploadVideo(params) {
    return validateFile(params.file);
}
function validateSubmitTask(params) {
    const urlError = validateUrl(params.videoUrl);
    if (urlError)
        return urlError;
    const widthError = validateDimension(params.width, "width");
    if (widthError)
        return widthError;
    const heightError = validateDimension(params.height, "height");
    if (heightError)
        return heightError;
    const durationError = validateDuration(params.duration);
    if (durationError)
        return durationError;
    const resolutionError = validateResolution(params.width, params.height);
    if (resolutionError)
        return resolutionError;
    const coordError = validateCoordinates(params.x1, params.y1, params.x2, params.y2, params.width, params.height);
    if (coordError)
        return coordError;
    return null;
}
function validateEstimateCredits(params) {
    const widthError = validateDimension(params.width, "width");
    if (widthError)
        return widthError;
    const heightError = validateDimension(params.height, "height");
    if (heightError)
        return heightError;
    const durationError = validateDuration(params.duration);
    if (durationError)
        return durationError;
    return null;
}
function validate(action, params) {
    switch (action) {
        case "uploadVideo": return validateUploadVideo(params);
        case "submitTask": return validateSubmitTask(params);
        case "taskDetail": return validateTaskId(params.taskId);
        case "taskList": return null;
        case "queryCredits": return null;
        case "estimateCredits": return validateEstimateCredits(params);
        case "workflow": {
            if (params.file)
                return validateFile(params.file);
            if (params.videoUrl)
                return validateSubmitTask(params);
            return validationError("workflow 模式需要提供 file 或 videoUrl 参数");
        }
        default: return validationError(`不支持的 action: ${action}`);
    }
}
//# sourceMappingURL=validator.js.map