多语言短剧 MLS 接口文档(tool/mls)

文档更新时间:2026-09-07

线上文档基址:https://doc.guangdianyun.tv/docs/b-ym(本文以该页为基准同步至仓库;代码块使用 json 语法高亮。线上原文末尾错误的「### 17. submitMlsPay」段落已剔除。)

【2026-09-07 变更摘要】分组候选资源改为同键升版本

  • §5.6 saveMlsCandidateFiles不再 upsert 覆盖;与普通资源一样插入新版本并转移 is_latest
  • 分组版本键比扁平更深:(uin, drama_video_id, language, fileType, group_key, group_value, file_name)(无项目时回退 episodeId)。普通资源版本键止于 fileType
  • 同键再次写入:旧 latest 仅 is_latest=0 保留历史;新行 version_seq 递增;uptime 相对旧 latest 严格递增
  • §5.4 分组摘要 fileCount 仍只统计 is_latest=1(避免历史版本撑大数量)。
  • §5.5 getMlsResourceGroupFiles:平铺返回该分组下全部版本(含历史),每条含 version / versionSeq / isLatestdata.count 为条数;嵌套 versions[]
  • 成功响应 data.files[] 仍含 startMs / fileName / uptime(不含 url),并增返 id / version / versionSeq

【2026-09-04 变更摘要】资源版本键改到项目(集)级

  • 术语(文案/文档;JSON 字段名不变)episodeId = 任务IDdrama_video_id = 项目ID(原「集ID」);job_id = JOB_IDmls_drama = (原「剧集」)。
  • 扁平资源版本键:由 (uin, episodeId, language, fileType) 改为 (uin, drama_video_id, language, fileType)episodeId 仅记录来源任务。drama_video_id=0 的孤立任务回退按 episodeId
  • 同项目下不同任务写入相同 language+fileType 一律升新版本并转移 is_latest
  • 迁移回填:sql/mls_resource_file_version_by_drama_video.sql(重排 version_seq,每键仅一条 is_latest=1)。
  • OpenTool getMlsJobResource:仍按项目 + is_latest=1 返回(写入修正后 latest 唯一)。
  • §5.4 / §5.5:分组资源按项目查;入参仍传任务 episodeId(用于解析所属项目)。
  • §5.6 saveMlsCandidateFiles:分组版本键为 (uin, drama_video_id, language, fileType, group_key, group_value, file_name)【2026-09-07】已改为同键升版本插入,不再 upsert,见文首变更摘要。
  • 应用端videos[].jobResourcetasks[].jobResource 均为 最新对象 + versions[](外层可直接读 id/url;versions 含全部历史,按 version_seq 降序)。数据按项目聚合。getUserMlsList / getMlsDetail 同结构。

【2026-09-03 变更摘要】OpenTool episodeId / job_id 语义对齐

  • 字段语义:库内 episodeId = 任务主键(任务ID);drama_video_id = 项目ID;job_id = JOB_ID(更新/重试会变)。
  • getUserMlsTaskList:对外下发的 episodeId = drama_video_id(项目ID);任务实例用 job_id
  • AI 回调:一律用 job_id(兼容 jobId)定位任务;入参 episodeId 表示项目ID,不参与任务定位;不接收 drama_video_id 入参
  • 不兼容旧 AI:旧链路若只传任务主键 episodeId、或仍把列表里的 episodeId 当任务主键,会找不到任务;须 AI 同步改为按 job_id 回调。
  • 涉及接口:updateMlsResultupdateMlsJobStatussaveMlsResourceFilesaveMlsCandidateFilesgetMlsJobResource
  • 建议加索引:mls_list(job_id),见 sql/mls_list_job_id_index.sql

【2026-08-28 变更摘要】job_param 透传 + TTS 候选分组资源

  • mls_list.job_param:结构化业务参数 JSON(与 param 环境变量分离),入参/出参字段名统一为 job_param;创建/更新透传、不做业务字段校验。详见 附录 D§4 / §5 / §18.7。迁移:sql/mls_list_job_param.sql
  • mls_resource_file 新增 group_key / group_value / file_name:普通资源三者为空;候选等分组资源非空。迁移:sql/mls_resource_file_group.sql
  • OpenTool saveMlsCandidateFiles§5.6):按 startMs 分组写入;同 (group, fileName) 升版本插入(见【2026-09-07】);成功返回 data.files[]startMs/fileName/uptime,不含 url)。
  • getMlsJobResource / jobResource:默认不返回分组资源;按需用 §5.4 getMlsResourceGroups§5.5 getMlsResourceGroupFiles(仅 tool / 应用端)。
  • 管理后台任务列表同样只带扁平资源 + groupedResources 摘要;分组明细走懒加载接口。

【2026-08-27 变更摘要】任务调度优先级 + 资源多版本 + 应用端隐藏类型单价

  • mls_mode_type.priority:AI 调度优先级(0–999,越大越先被拉取);创建任务时快照写入 mls_list.priority。迁移:sql/mls_mode_type_priority.sql。管理后台任务类型设置可配置。
  • getUserMlsTaskList 已按 priority DESC, episodeId ASC 排序;此前任务默认 priority=0,配置类型后即可生效。
  • getMlsModeTypeList(应用端):不再返回 price_per_second / base_price_per_second / lang_price_per_second;新增 billing_mode: "stage"。计费展示请用 getMlsStageList / checkMlsAmount.required
  • mls_resource_file 多版本:新增 version_seqversion_labelis_latest。迁移:sql/mls_resource_file_version.sql。同键原为 (uin, episodeId, language, fileType)【2026-09-04】已改为 (uin, drama_video_id, language, fileType),见文首变更摘要。默认版本号 v{seq}-{YYYYMMDD}
  • jobResourcegetUserMlsList / getMlsDetail / 集详情):每项含 versionversionSeqisLatestversions[] 历史列表(仅 fileStatus=1);有项目时按 项目 聚合。
  • OpenTool getMlsJobResource:仅返回各键 latest 一条;id / url / source / uptime 与改版前一致,可额外带 version / versionSeq / isLatest,不含 versions 数组。
  • saveMlsTaskResource:上传/编辑均 插入新版本(旧版保留,is_latest 转移);返回 idversionversionSeq
  • deleteMlsTaskResource不可删除 latest(方案 A);仅可删历史版本。
  • 新增 copyMlsTaskResourceVersion:从历史版本 sourceId 复制内容升为新 latest(版本号后缀 -copy)。
  • 资源清理:仍随任务/集删除批量 is_del=1,由既有 ResourceCleanWorker 物理清理;无单独历史版本 TTL

免登录接口的完整列表以网关 code/apaasTool/mls/index.php 中常量 NO_TOKEN_CMDS 为准;与下表「附录 B」交叉核对。

调用路径:/mls/tool/xxx/mls/mlsUser/xxx(由 server 参数 tool/命令mlsUser/命令 决定)。除下文附录 B所列及另有说明外,一般需传 token。本文档不包含 TagparentUinuserId 等由网关注入的字段说明。

请求约定:所有 POST 类型接口均使用Content-Type: application/json提交请求体(除 8.1 分片上传直传服务使用multipart/form-data外)。

密码约定(2026-03-23 更新):所有密码字段均由前端加密后传输。后端不再对入参密码做二次加密处理;其中注册入库使用PASSWORD('...')写入数据库。

通用出参结构:

字段 类型 说明
flag int 状态码,100 表示成功
flagString string 提示信息
data object/array 成功时返回数据(部分接口无)
total int 部分列表接口返回总条数

【2026-08-18 变更摘要】按 stage 计费(价目表 + executedStages)

  • 新增表 mls_stage(阶段单价)与 mls_stage_charge(扣费幂等)。迁移脚本:sql/mls_stage_billing.sql。价目 Redis 缓存键 mls_stage_map,TTL 3600 秒。
  • mode_type 不再当计费公式:仍用于列表/Tab、是否需语种/原片、套餐 stages 模板。实扣看回调 executedStagesstatus=success 才扣,executionId 去重;未知 stageId 跳过、不影响回调结果)。reusedStages / requestedStages、任务最终成败不参与 stage 计费。
  • 计费秒:billable_seconds = max(duration, 30);单次 = billable_seconds × 当时价目单价(回调读当前价目,不在创建时快照)。
  • 擦除只认 subtitle_erase / subtitle_erase_fullscreen,不再用 mode_type 打包价。时间戳校对改为跑了 subtitle_calibration 就扣;param.CONSOLE_SUBTITLE_TIMESTAMP_CHECKlegacy 无 stages 任务仍加 1×计费秒
  • 存储max(duration,30)×storage 单价×本次新增成片条数。成片 = results 里某语种首次 status=2url 非空(审核降为 4 也算已产出)。幂等键 storage:{episodeId}:{lang}updateMlsJobStatus 仅翻译无 url → 存储 0。
  • 源视频:有 origin_url 的集入库成功后扣一次 max(duration,30)×source_upload 单价。无源片占位不扣;预处理重试/任务重试/后补语种不扣。幂等键 source_upload:{dramaVideoId}。挂在 addMlsDramaVideo / addMlsTask 自动建集
  • 预估/预占:有 stages 快照或套餐模板 → Σ once 单价×billable + Σ per_language 单价×billable×语种数;含 compose 再加存储×语种数;预占 = max(0, 预估 − 该 episode 已扣 mls_stage_charge.amount)。仅 resStatus∈{0,1}is_pay=0。无 stages 且套餐模板也空 → 回退旧 base/lang 公式(在途 legacy)。
  • 创建/下发:传了非空 stages → 写入快照,拉任务 mode_type=custom + stages,不要求和模板一致。没传则用套餐模板。source_upload / storage 不得下发给 AI。
  • 回调切流:请求带 executedStages(哪怕空数组)走新逻辑;未带该键 → 旧 calcMlsCallbackChargeParts,避免老 AI 双计/0 扣。
  • 新增 getMlsStageList(§1.2)返回阶段单价,供控制台展示。getMlsModeTypeListbase_price_per_second / lang_price_per_second 仍返回,仅作 legacy 兼容展示,不要用来算 stages 任务预估;预估以 checkMlsAmount.required 为准。
  • 用户侧前端可不改:不传 stages 即可;getMlsAmount / checkMlsAmount / addMlsTask 入参出参字段兼容。源视频扣费默认不计入 checkMlsAmount,需一并校验时传 include_source_upload=1

【2026-08-12 变更摘要】集 list_type 检索类型

  • mls_drama_video 新增 list_type(默认 custom),用于集列表按类型检索;迁移脚本:sql/mls_drama_video_list_type.sql,历史回填:scripts/mls_drama_video_list_type_backfill.sql
  • addMlsDramaVideoaddMlsTask(自动建集时)可选入参 list_type;不传默认 custom
  • getMlsEpisodeList 可选入参 list_type(精确匹配,不传返回全部)。
  • 剧集详情 / 集列表 / 集详情返回集字段 list_type

【2026-08-12 变更摘要】资源文件 drama_video_id

  • mls_resource_file 新增 drama_video_id(所属集 ID);迁移脚本:sql/mls_resource_file_drama_video_id.sql,历史回填:scripts/mls_resource_file_drama_video_id_backfill.sql
  • saveMlsResourceFile(OpenTool)/ saveMlsTaskResource / addMlsTask(resources 入库)写入时带上该字段;入参可传 drama_video_id,不传则按 episodeIdmls_list 回填。
  • OpenTool getMlsJobResource:资源按集查。drama_video_idepisodeId 不能同时为空;有 drama_video_id 直接查,无则用 episodeId 解析出集 ID 再查。job_id 已忽略。

【2026-07-28 变更摘要】注册/登录自动注册支持来源 source

  • registerlogin(短信验证码未注册自动建号)新增可选入参 source,写入 mls_user.source;不传或空串时默认 H5
  • apaas 换票(非 ady)仍固定写 source=apaas;渠道用户写 platform_code

【2026-07-24 变更摘要】登录会话增加 hasPassword

  • 各渠道登录 / 换票签发会话时统一写入 hasPasswordboolean):password 非空为 true,空/NULLfalse
  • 本变更上线前已登录的旧会话没有该字段;前端须按「字段存在且值为 false」判断未设置密码,字段缺失不要当成未设密码
  • 已登录用户通过 changePassword 首次设置密码成功后,会刷新当前 Redis 会话,补齐 hasPassword=true

【2026-07-23 变更摘要】登录会话渠道字段 + 查渠道基础信息

  • 登录态(getUserInfo / Redis 会话)明确包含 platform_codeplatform_user_key(渠道用户非空)。
  • 新增 getChannelPlatformInfo:按 platform_code 查渠道名称、充值跳转地址等,供前端判断是否跳转外部充值。

【2026-07-23 变更摘要】checkToken:仅 ady 为渠道用户

  • sourceFrom=ady:渠道用户(写 platform_code / platform_user_key);checkToolAccessaodianyun.com;按 key 查不到则新建 uin。
  • 非 ady:普通用户,只按 uin 补全必要信息,不写渠道标识。
  • 渠道标识环境变量:MLS_ADY_PLATFORM_CODE(仅 ady 分支使用)。

【2026-07-21 变更摘要】checkToken 支持 sourceFrom=ady

  • sourceFrom(可选,固定值 ady):为 ady 时,checkToolAccess 请求域名使用 aodianyun.com;仅按 platform_user_key 查用户,不存在则 createMlsUserWithIpaas 重新生成 uin
  • 渠道标识改为环境变量 MLS_ADY_PLATFORM_CODE

【2026-07-20 变更摘要】checkToken 支持 apaas 换票

  • 新增文档章节 §12.0 /mls/tool/checkToken
  • subTokenapaas 开头时:调用控制台 checkToolAccesssubType=mls)换取用户;若 mls_user 不存在则按渠道补全 mls_user / mls_user_dms / 积分账户,并签发 MLS 登录态。
  • apaas 前缀:仍从 Redis 校验已有会话(与原先一致)。

【2026-07-29 变更摘要】任务类型执行形态(legacy / stages)与 custom 下发

  • mls_mode_type 新增 execution_modelegacy|stages,默认 legacy)与 stages(JSON 阶段模板)。迁移脚本:sql/mls_mode_type_stages.sql
  • mls_list 新增 stages 任务级执行快照(创建/重试写入;空则下发时回退套餐模板)。
  • 双层模型:库内 / 用户侧仍存、展示业务 mode_type(计费套餐);AI 侧对 execution_mode=stages 的任务,OpenTool getUserMlsTaskList 下发 mode_type=custom + stages,并附带 biz_mode_type(业务编码,AI 可忽略)。
  • legacy:行为不变,原样下发业务 mode_type,不带 stages
  • stages:管理后台配置非空 stages;创建任务主路径只传业务 mode_type 即可。可选传 stages 自由拼装(stageId+policy),不再要求与模板集合一致;传了非空 stages 则下发 custom
  • 禁止 将字面量 custom 配置为业务套餐编码(custom 仅为 AI 执行态)。
  • 计费(已被 2026-08-18 覆盖):有 stages 时按阶段价目 + executedStages 实扣;无 stages 的在途 legacy 仍用 base/lang。详见文首 【2026-08-18 变更摘要】
  • retryMlsTask:stages 类型会按最新套餐模板刷新任务 stages 快照;可传 stages 自由覆盖。

【2026-07-24 变更摘要】任务类型「是否需传原片」与无源片计费时长

  • mls_mode_type 新增 requires_origin(默认 1 需原片,兼容存量)。迁移脚本:sql/mls_mode_type_requires_origin.sql
  • getMlsModeTypeList 返回 requires_origin;管理后台任务类型设置可配置。
  • addMlsTask:当类型 requires_origin=false 且未传 origin_url / drama_video_id 时,按 resources 顺序取第一个能解析出时长的资源 作为任务 duration(避免多文件全量查询):字幕(srt/vtt)下载解析结束时间;音视频走媒资 getUserUploadDvr。解析失败可回退入参 duration
  • 无源片任务写入空 origin_urlorigin_ready=1(无需预处理),OpenTool 可直接拉取。
  • checkMlsAmount:不需原片的类型在 duration 未传或为 0 时可传 resources 按同上规则推算时长。

【2026-07-17 变更摘要】任务素材来源(前端上传 / 后端生成)

  • mls_resource_file 新增 sourceupload 前端上传,backend 后端生成(历史数据默认 backend)。迁移脚本:sql/mls_resource_file_source.sql
  • addMlsTask 支持可选入参 resources(数组):创建任务时一并写入前端上传素材(language / fileType / fileUrl)。
  • 新增 saveMlsTaskResource(新增/编辑素材)、deleteMlsTaskResource(软删素材);编辑时软删原记录再插入新记录。resStatus=1 处理中不允许改素材。
  • jobResource 每项额外返回 idsource
  • OpenTool saveMlsResourceFilesource 固定为 backend;同键已有记录时改为软删原记录再插入(不再原地 UPDATE)。

【2026-06-11 变更摘要】任务类型(mode_type)与非全流程

  • 任务支持多种处理类型mode_type),配置来自表 mls_mode_type,接口 getMlsModeTypeList 拉取(含单价、是否需选语种)。
  • 创建任务新增入参 mode_type(默认 full_pipeline);是否必填 languages 由类型的 requires_language 决定。
  • 任务新增字段:mode_typejob_id(新任务为 32 位 hex;老数据默认 001)。priority 为保留字段,前端不可传。
  • getUserMlsList / getMlsDetail 额外返回 jobResource(中间产物,结构见下文)。
  • 计费(2026-08-18 更新):有 stages 时按 mls_stage 单价 × 计费秒(once / 按语种)+ 成片存储 + 源视频上传;无 stages 回退旧公式 max(时长,30)×(base+lang×N+(timestamp_check?1:0))。详见文首 【2026-08-18 变更摘要】
  • updateMlsTask:不需选语种的类型不允许修改 languages
  • retryMlsTask:每次重试生成新 job_id 并返回;不需选语种的类型仅重置任务状态;已扣前置/时间戳校对不重扣,仅对新成功语种扣叠加费。

【2026-06-17 变更摘要】任务类型索引(mode_type_index)

  • mls_mode_typemls_list 新增 mode_type_index:同一索引可对应多种 mode_type,用于前端分类 Tab / 分组列表查询。
  • getMlsModeTypeList 返回 mode_type_indexaddMlsTask 创建时按所选 mode_type 自动写入对应索引,无需客户端传参。
  • getUserMlsList 新增入参 mode_type_index(分组查询,不传返回全部);可与 mode_type(精确类型)组合使用。

【2026-06-30 变更摘要】任务级环境变量 param

  • mls_list 新增字段 param(TEXT,默认 '{}'):任务级环境变量 JSON 对象,供处理节点 Docker 阶段 -e KEY=VALUE 使用。
  • addMlsTasksubmitMlsDramaTasksupdateMlsTask 支持可选入参 param(object);不传表示不修改(更新接口)或视为 {}(创建接口)。
  • getUserMlsListgetMlsDetail 返回 param(JSON 对象,非字符串)。
  • retryMlsTask 不需传 param,重试沿用创建时入库的值。
  • 键名须符合环境变量规则;非法键名与系统保留键由服务端静默丢弃。完整说明见 附录 C

【2026-07-07 变更摘要】视频预处理(转码 + 网络上传)

  • 超规格源视频(分辨率 / 格式 / 帧率 / 码率任一超限)在入库或创建任务时异步预处理:转码产出 B → 网络上传 PULL → 最终源地址 C,并删除用户首次上传的 A。
  • mls_list 新增 origin_ready0 源片预处理中,1 可被 AI 处理节点拉取。OpenTool getUserMlsTaskList 仅返回 origin_ready=1resStatus=0 的任务。
  • mls_drama_video 新增 origin_readypreprocess_statuspreprocess_fail_msg;剧集详情 videos 列表返回上述字段。
  • addMlsDramaVideo:上传后若需预处理则自动启动;addMlsTask:单条任务创建时同理。
  • submitMlsDramaTasks:允许预处理未完成时先创建任务(origin_ready=0);预处理完成后自动更新关联任务的 origin_url 并置 origin_ready=1;若某视频 preprocess_status=3(预处理失败)则整批拒绝并提示重试预处理。
  • 新增 retryMlsVideoPreprocess§6.1):预处理失败重试;有转码产出 B 时仅重跑 PULL,否则从 A 重新转码。
  • retryMlsTask§6):若 origin_ready=0 或关联视频预处理失败,会先自动预处理重试,再重置 AI 任务状态;响应可含 preprocess_retry
  • 预处理流水线、字段与触发规则详见 §19;底层 DVR/DMS 回调见 code/apaasTool/api/tool/底层服务接口文档.md

1. /mls/tool/getSupportLanguageList - 获取支持语言列表

获取多语言支持的语言配置列表。返回范围由当前登录用户在mls_user_conf.config.languages决定(与getUserConfconfig.languages一致):

  • basic(默认):仅id <= 12且满足enable条件的语言。
  • allenable条件下全部语言,不再限制id

无有效uin或库中无配置行时,按apiBase默认languages=basic处理。不再按parentUin白名单区分。

入参

参数 类型 必填 说明
token string 登录后获得的 token
enable string 是否启用:1启用(默认),0禁用

出参

字段 类型 说明
flag int 100 成功,110 参数错误
flagString string 提示信息
data object 成功时包含
data.list array 语言列表,每项为 mls_languages 表字段

请求示例

{
  "token": "xxx",
  "enable": "1"
}

返回示例

{
  "flag": 100,
  "flagString": "success",
  "data": {
    "list": []
  }
}

1-a. /mls/tool/getMlsTimbreList - 获取音色列表

管理后台维护的音色库查询接口,供 App 选用音色。默认仅返回 enable=1 的记录。

入参

参数 类型 必填 说明
token string 登录 token(与其它 tool 接口一致)
enable int 启用状态;不传默认只查启用
name string 名称模糊搜索
page int 页码,与 num 同时 >0 时分页
num int 每页条数

出参 data

字段 类型 说明
list array 音色列表
list[].id int ID
list[].name string 名称
list[].fileUrl string 音频 URL
list[].fileExt string 扩展名
list[].fileSize int 字节数
list[].enable int 1 启用 / 0 停用
list[].createTime int 上传时间 Unix 秒
list[].updateTime int 更新时间
count int 符合条件总数

1.1 /mls/tool/getMlsModeTypeList - 获取任务类型列表

获取 MLS 可创建的任务类型(读 mls_mode_type 表,服务端 Redis 缓存约 1 小时)。创建任务前先调此接口,用于渲染类型下拉、控制是否展示语种选择。

入参

参数 类型 必填 说明
token string 登录后获得的 token

出参

字段 类型 说明
flag int 100 成功
flagString string 提示信息
data array 类型列表,按 sort 升序
data[].mode_type string 类型编码,创建任务时传 mode_type
data[].mode_name string 展示名称
data[].mode_type_index string 类型索引编码,用于分类分组;多种 mode_type 可共用同一索引
data[].billing_mode string 固定 stage;计费以阶段价目为准,见 getMlsStageList
data[].requires_language bool 创建时是否必须选择输出语种
data[].requires_origin bool 创建时是否必须传源视频(原片);false 时可仅传 resources 并由字幕等推算时长
data[].execution_mode string 执行形态:legacy 原样下发 AI;stages 下发时转为 custom + stages
data[].stages array 阶段模板;execution_mode=stages 时非空,项为 {stageId, policy}legacy 时为 []
data[].remark string 备注说明

当前默认类型(以库配置为准)

mode_type mode_name mode_type_index base lang requires_language requires_origin execution_mode
full_pipeline 全流程 full_pipeline 产品配置(建议去存储后 6) 产品配置(建议 3) legacy
subtitle_erase_dialog 字幕擦除-对话 subtitle_erase 3 0 legacy
subtitle_erase_dialog_art 字幕擦除-对话+艺术字 subtitle_erase 6 0 legacy

上表仅为示例。stages 类型的真实单价以 mls_stage / getMlsStageList 为准,不要用 base/lang 在前端自行估算。execution_mode=stages 时填写 stages 模板即可,无需 AI 再增加 mode_type。

请求示例

{
  "token": "xxx"
}

返回示例

{
  "flag": 100,
  "flagString": "success",
  "data": [
    {
      "mode_type": "full_pipeline",
      "mode_name": "全流程",
      "mode_type_index": "full_pipeline",
      "billing_mode": "stage",
      "requires_language": true,
      "requires_origin": true,
      "execution_mode": "legacy",
      "stages": [],
      "remark": "多语言全流程输出:前置+语种叠加"
    },
    {
      "mode_type": "subtitle_erase_dialog",
      "mode_name": "字幕擦除-对话",
      "mode_type_index": "subtitle_erase",
      "billing_mode": "stage",
      "requires_language": false,
      "requires_origin": true,
      "execution_mode": "legacy",
      "stages": [],
      "remark": "不需选语种"
    },
    {
      "mode_type": "demo_stages_pipeline",
      "mode_name": "示例阶段流水线",
      "mode_type_index": "demo_stages",
      "billing_mode": "stage",
      "requires_language": true,
      "requires_origin": true,
      "execution_mode": "stages",
      "stages": [
        {"stageId": "subtitle_translate", "policy": "complete"},
        {"stageId": "tts", "policy": "complete"},
        {"stageId": "compose", "policy": "complete"}
      ],
      "remark": "下发 AI 时转为 mode_type=custom + stages"
    }
  ]
}

1.2 /mls/tool/getMlsStageList - 获取阶段计费价目

mls_stage(Redis 缓存约 1 小时),供控制台展示单价。不参与鉴权以外的业务写入。虚拟阶段 storagesource_upload 会出现在列表中,但不会下发给 AI。

入参

参数 类型 必填 说明
token string 登录后获得的 token

出参

字段 类型 说明
data[].stage_id string 阶段编码,与 AI stageId 对齐
data[].stage_name string 展示名称
data[].price_per_second int 单价:积分/秒
data[].bill_scope string once 一条视频一次;per_language 按语种;source 源视频上传;storage 成片存储
data[].sort int 排序,越小越前
data[].remark string 备注

默认价目(以库配置为准)

stage_id 名称 单价 bill_scope
frames_extract 帧提取 0 once
audio_separate 音频分离 1 once
subtitle_calibration ASR/时间戳校对 1 once
subtitle_extract OCR 1 once
subtitle_extract_fullscreen OCR 全屏 1 once
subtitle_erase 擦除仅对话 3 once
subtitle_erase_fullscreen 擦除对话+艺术字 6 once
cleared_video_merge 去字合并 0 once
cleared_video_transcode 去字转码 0 once
subtitle_translate 翻译 1 per_language
tts 配音 1 per_language
compose 混合成片 1 per_language
storage 存储流量 1 storage
source_upload 源视频上传 1 source

单价为 0 的阶段成功执行仍写幂等记录(金额 0)。

返回示例

{
  "flag": 100,
  "flagString": "success",
  "data": [
    {
      "stage_id": "audio_separate",
      "stage_name": "音频分离",
      "price_per_second": 1,
      "bill_scope": "once",
      "sort": 20,
      "remark": "一条视频一次,多语种不重复"
    }
  ]
}

2. /mls/tool/getUserMlsList - 获取多语言任务列表

分页查询当前用户的多语言输出任务列表(仅未删除)。支持按 create_time 创建时间范围、按 mode_type 精确类型、按 mode_type_index 分类分组、按 source_type 来源过滤、按 drama_video_id 所属集 ID 过滤(均可选)。

【2026-07-08 变更】三级结构:入参新增可选 drama_video_id(按集过滤);返回每条任务额外包含 drama_video_id(所属集 ID,未关联时为 0)。

【2026-06-11 变更】每条任务额外返回 mode_typejob_idjobResource(中间资源产物,结构同 OpenTool getMlsJobResource.data)。

【2026-06-17 变更】新增入参 mode_typemode_type_index:不传则返回全部;mode_type 精确匹配单类型,mode_type_index 按分类索引分组查询(可返回该索引下多种 mode_type 的任务)。合法值见 getMlsModeTypeList

【2026-06-24 变更】新增入参 source_type 来源过滤;每条任务返回 source_typebatch 批量剧集提交创建,single 单任务创建。不传或传 all 返回全部来源。

【2026-07-07 变更】每条任务额外返回 origin_ready(int):0 源视频预处理中,AI 暂不可拉取;1 源片就绪。预处理失败时任务可能为 resStatus=4origin_ready=0,需先 §6.1 retryMlsVideoPreprocess§6 retryMlsTask(会自动连带预处理重试)。

入参

参数 类型 必填 说明
token string 登录后获得的 token
page int 页码,默认 1
num int 每页条数,默认 15,最大 100
title string 标题关键词,模糊匹配
resStatus int 状态:-1全部,0待处理,1处理中,2部分完成,3全部完成,4全部失败
mode_type string 任务类型精确匹配,不传或传空返回全部;合法值见 getMlsModeTypeList
mode_type_index string 任务类型索引分组查询,不传或传空返回全部;传值返回该分类下所有任务(可含多种 mode_type),合法值见 getMlsModeTypeListmode_type_index
source_type string 来源过滤:batch 批量剧集、single 单任务;不传或传 all 返回全部
drama_video_id int 所属集 ID(mls_drama_video.id)过滤;不传返回全部
createTimeStart int create_time 起始时间戳(秒级)
createTimeEnd int create_time 结束时间戳(秒级)

出参

字段 类型 说明
flag int 100 成功,110 参数错误
flagString string 提示信息
data array 当前页任务列表,每项为 mls_list 表一条记录
data[].mode_type string 任务类型
data[].source_type string 来源:batch 批量剧集,single 单任务
data[].drama_video_id int 所属集 ID(mls_drama_video.id),未关联为 0
data[].mode_type_index string 任务类型索引编码(创建时由 mode_type 自动写入)
data[].job_id string 任务实例 id;新任务为 32 位 hex,老数据可能为 001
data[].param object 任务级环境变量;无配置时为 {}
data[].job_param object 结构化业务参数;无配置时为 {}(见 附录 D
data[].stages array 任务执行 stages 快照;legacy 或未配置时为 [];项为 {stageId, policy}
data[].origin_ready int 源片是否就绪:0 预处理中,1 可拉取(默认 1
data[].jobResource object 中间资源产物,按语种分组,见下方结构说明
total int 符合条件的总条数

jobResource 结构说明(仅 fileStatus=1 的成功资源;不含分组资源如 ttsCandidate,分组请用 §5.4 / §5.5):

  • 应用端列表/详情:每项含 versions[] 全量历史(按 versionSeq 降序);顶层字段与当前 latest 一致。
  • OpenTool getMlsJobResource:不含 versions;每项 id / url / source / uptime 不变,可增 version / versionSeq / isLatest
{
  "original": {
    "subtitle": {
      "id": 14,
      "url": "https://xxx/chat.srt",
      "version": "v2-20260827",
      "versionSeq": 2,
      "isLatest": true,
      "source": "upload",
      "uptime": 1798732799,
      "versions": [
        { "id": 14, "url": "https://xxx/chat.srt", "version": "v2-20260827", "versionSeq": 2, "isLatest": true, "source": "upload", "uptime": 1798732799 },
        { "id": 12, "url": "https://xxx/old.srt", "version": "v1-20260820", "versionSeq": 1, "isLatest": false, "source": "upload", "uptime": 1798640000 }
      ]
    }
  }
}
  • 外层 key 为语种(原文字幕等为 original)。
  • 内层 key 为资源类型 fileType(如 subtitlevoiceaudioRawasrSubtitlecloneVoice 等)。
  • 应用端每项含原有四字段 + 版本扩展字段,并含 versions 数组。
  • OpenTool getMlsJobResource 每项含原有四字段 + 可选版本扩展字段, versions

请求示例

{
  "token": "xxx",
  "page": 1,
  "num": 15,
  "title": "短剧",
  "mode_type_index": "subtitle_erase",
  "createTimeStart": 1704067200,
  "createTimeEnd": 1704153600
}

返回示例

{
  "flag": 100,
  "flagString": "success",
  "data": [
    {
      "episodeId": 1,
      "dramaId": 0,
      "drama_video_id": 0,
      "uin": 12345,
      "parentId": "01",
      "userId": 1000,
      "title": "任务标题",
      "origin_url": "http://xxx/source.mp4",
      "languages": "zh,en",
      "mode_type": "full_pipeline",
      "source_type": "single",
      "mode_type_index": "full_pipeline",
      "job_id": "e8457f8f008a241deb9934929518561d",
      "param": {},
      "job_param": {},
      "origin_ready": 1,
      "duration": 0,
      "resStatus": 0,
      "results": "[{\"language\":\"zh\",\"status\":0,\"uptime\":0,\"url\":\"\"}]",
      "thumbnail": "https://1.jpg",
      "jobResource": {
        "original": {
          "subtitle": { "url": "https://xxx/chat.srt", "uptime": 1798732799 }
        }
      },
      "is_del": 0,
      "create_time": 1770447600,
      "uptime": 1770447600
    }
  ],
  "total": 10
}

非全流程且不需选语种的类型:languages 可能为空字符串,results 可能为 []jobResource 仍可能有中间产物。

resStatus 枚举:0 待处理,1 处理中,2 部分完成,3 全部完成,4 全部失败。

与预处理的关系resStatus=0origin_ready=0 表示任务已创建但源片仍在预处理,OpenTool 不会拉取;预处理成功后服务端会将 origin_ready 置为 1 并更新 origin_url(及 duration / thumbnail 如有)。

results 单条status(与mls_list.results JSON 一致):0 待处理,1 处理中,2 成功,3 失败,4 待审核(用户开启成片审核时,管道回调成功可先入库为待审核,见下文附录 A)。


3. /mls/tool/getMlsDetail - 获取多语言任务详情

根据任务 episodeId 查询单条任务详情。

【2026-06-11 变更】data 额外包含 mode_typejob_idjobResource,含义与 §2 getUserMlsList 一致。

【2026-06-24 变更】data 额外包含 source_type,含义与 §2 getUserMlsList 一致。

【2026-06-30 变更】data 额外包含 param(JSON 对象,非字符串),无配置时为 {}

【2026-08-28 变更】data 额外包含 job_param(JSON 对象,非字符串),无配置时为 {}。规则见 附录 D

【2026-07-07 变更】data 额外包含 origin_ready,含义与 §2 getUserMlsList 一致。

【2026-07-08 变更】data 额外包含 drama_video_id(所属集 ID,未关联为 0),含义与 §2 getUserMlsList 一致。

入参

参数 类型 必填 说明
token string 登录后获得的 token
episodeId int 任务 ID(表字段 episodeId),兼容历史id入参

出参

字段 类型 说明
flag int 100 成功,110 参数错误/记录不存在
flagString string 提示信息
data object 成功时为 mls_list 表一条完整记录

请求示例

{
  "token": "xxx",
  "episodeId": 1
}

返回示例

{
  "flag": 100,
  "flagString": "success",
  "data": {
    "episodeId": 1,
    "dramaId": 0,
    "drama_video_id": 0,
    "uin": 12345,
    "parentId": "01",
    "userId": 1000,
    "title": "任务标题",
    "origin_url": "http://xxx/source.mp4",
    "languages": "zh,en",
    "mode_type": "full_pipeline",
    "job_id": "e8457f8f008a241deb9934929518561d",
    "param": {},
    "job_param": {},
    "duration": 0,
    "resStatus": 0,
    "results": "[{\"language\":\"zh\",\"status\":0,\"uptime\":0,\"url\":\"\"}]",
    "jobResource": {
      "original": {
        "subtitle": { "url": "https://xxx/chat.srt", "uptime": 1798732799 }
      }
    },
    "is_del": 0,
    "create_time": 1770447600,
    "uptime": 1770447600
  }
}

4. /mls/tool/addMlsTask - 新增多语言任务

创建一条多语言输出任务。mode_type 决定计费规则及是否必选 languages;需选语种时 resultslanguages 初始化为待处理,否则 results[]

【2026-06-17 变更】服务端会根据所选 mode_typemls_mode_type 读取并写入 mode_type_index,客户端无需传该字段。

【2026-06-30 变更】新增可选入参 param(object):任务级环境变量;不传或 {} 表示无附加变量。规则见 附录 C

【2026-08-28 变更】新增可选入参 job_param(object):结构化业务参数,原样入库透传,不做业务字段校验;不传或 {} 表示无。规则见 附录 D

【2026-07-07 变更】若源视频需预处理(见 §19),创建成功后任务 origin_ready=0,后台异步转码 + 网络上传;完成后自动置 origin_ready=1 并更新源地址。预处理启动失败返回 flag=110

【2026-07-08 变更】三级结构:创建任务时会自动创建集(mls_drama_video)并在集层做预处理;也可传 drama_video_id 在已有集下创建任务(复用集源片,不再走任务级转码)。

【2026-07-17 变更】新增可选入参 resources:创建任务时一并写入前端上传素材,见下方说明。

【2026-07-24 变更】当任务类型 requires_origin=false 时,可不传 origin_url / drama_video_id;须传 resources(字幕或音视频)或显式 duration。服务端按 resources 顺序取第一个可解析时长的资源写入任务时长并走既有计费预占。

【2026-08-18 变更】可选入参 stages:传了非空数组则自由拼装写入快照并下发 custom(不要求和套餐模板一致);不传则用套餐模板。legacy 类型也可传 stages。计费见文首 【2026-08-18 变更摘要】。有源片自动建集时会先扣 源视频上传(与任务预占分开)。

【2026-08-12 变更】新增可选入参 list_type:自动创建集时写入集表;不传默认 custom。传已有 drama_video_id 时不改集的 list_type

入参

参数 类型 必填 说明
token string 登录后获得的 token
title string 任务标题(传 drama_video_id 时可省略,默认用集标题)
origin_url string 条件 视频源地址;requires_origin=true 时必填(传 drama_video_id 时可省略);requires_origin=false 时可省略
drama_video_id int 集 ID;传入则在已有集下创建任务
dramaId int 剧集 ID;不传且未传集 ID 时自动创建 single 剧集
mode_type string 任务类型,默认 full_pipeline;合法值见 getMlsModeTypeList(不可传 custom
languages string 条件必填 输出语种逗号分隔,如zh,en;当类型 requires_language=true 时必填
duration int 视频时长(秒);有源片时以源视频解析为准;无源片时可由 resources 解析,亦可作解析失败时的回退
list_type string 集列表类型,默认 custom;仅自动建集时写入;^[a-zA-Z0-9_]+$,最长 32
param object 任务级环境变量 JSON 对象;省略或 {} 表示无附加变量(规则见 附录 C
job_param object 结构化业务参数 JSON 对象;省略或 {} 表示无(规则见 附录 D
stages array 可选。不传用套餐模板;传了非空则自由拼装(项 {stageId, policy}policycomplete|recompute)。不可含 storage/source_upload
resources array 条件 前端上传素材列表;无源片时建议必传字幕等可解析时长资源

resources[] 单项

字段 类型 必填 说明
language string 语种,如 originalen
fileType string 资源类型,如 subtitlevoice
fileUrl string 资源地址(≤255)

同一请求内 language+fileType 不可重复。

出参

字段 类型 说明
flag int 100 成功,110 参数错误/额度不足/数据库失败
flagString string 提示信息
data object 成功时包含
data.episodeId int 新建任务 ID(mls_list.episodeId
data.drama_video_id int 所属集 ID
data.dramaId int 所属剧集 ID
data.job_id string 本次任务实例 id(32 位 hex,重试后会变更)
data.mode_type string 实际写入的任务类型
data.mode_type_index string 实际写入的任务类型索引

请求示例(全流程)

{
  "token": "xxx",
  "title": "我的短剧任务",
  "origin_url": "http://xxx/source.mp4",
  "mode_type": "full_pipeline",
  "languages": "zh,en"
}

请求示例(带前端上传素材)

{
  "token": "xxx",
  "title": "我的短剧任务",
  "origin_url": "http://xxx/source.mp4",
  "mode_type": "full_pipeline",
  "languages": "zh,en",
  "resources": [
    { "language": "original", "fileType": "subtitle", "fileUrl": "https://xxx/chat.srt" },
    { "language": "original", "fileType": "voice", "fileUrl": "https://xxx/voice.wav" }
  ]
}

请求示例(带 param / job_param)

{
  "token": "xxx",
  "title": "我的短剧任务",
  "origin_url": "http://xxx/source.mp4",
  "mode_type": "full_pipeline",
  "languages": "zh,en",
  "param": {
    "CONSOLE_ADAPTIVE_TIME_LEN": false,
    "CONSOLE_XXX": "1"
  },
  "job_param": {
    "subtitleIDs": {"12": "12"},
    "candidateCount": 4
  }
}

请求示例(非全流程,不需选语种)

{
  "token": "xxx",
  "title": "字幕擦除任务",
  "origin_url": "http://xxx/source.mp4",
  "mode_type": "subtitle_erase_dialog"
}

返回示例

{
  "flag": 100,
  "flagString": "success",
  "data": {
    "episodeId": 1,
    "job_id": "e8457f8f008a241deb9934929518561d",
    "mode_type": "full_pipeline",
    "mode_type_index": "full_pipeline"
  }
}

5. /mls/tool/updateMlsTask - 更新多语言任务

修改任务标题;可选传languages,传入时会将新增的输出语言在 results 中补全为待处理(status=0),并把任务整体状态置为待处理(resStatus=0)。resStatus=1(处理中)时不允许修改。

【2026-06-11 变更】若任务类型 requires_language=false(不需选语种),传 languages 将返回错误「当前任务类型不允许修改语种」。

【2026-06-30 变更】新增可选入参 param(object):更新任务级环境变量;不传则保持原值,传 {} 表示清空为无附加变量。规则见 附录 CresStatus=1(处理中)时不允许修改。

【2026-08-28 变更】新增可选入参 job_param(object):不传则不改,传 {} 清空。规则见 附录 D

入参

参数 类型 必填 说明
token string 登录后获得的 token
episodeId int 任务 ID(表字段 episodeId),兼容历史id入参
title string 新标题
languages string 输出语种逗号分隔;仅 requires_language=true 的类型可传
param object 任务级环境变量;不传则不改;传 {} 清空;规则见 附录 C
job_param object 结构化业务参数;不传则不改;传 {} 清空;规则见 附录 D

出参

字段 类型 说明
flag int 100 成功,110 参数错误/记录不存在或无权限/处理中不允许修改/当前任务类型不允许修改语种/更新失败
flagString string 提示信息
data -

请求示例

{
  "token": "xxx",
  "episodeId": 1,
  "title": "新标题",
  "languages": "zh,en,ja"
}

请求示例(仅更新 param)

{
  "token": "xxx",
  "episodeId": 1,
  "title": "新标题",
  "param": {
    "CONSOLE_XXX": "1"
  }
}

返回示例

{
  "flag": 100,
  "flagString": "success"
}

5.1 /mls/tool/saveMlsTaskResource - 新增/编辑任务素材

在已有任务上新增或编辑前端上传素材(写入 mls_resource_filesource=upload)。

  • 新增/编辑:均 插入新版本;同键旧 latest 仅降 is_latest,历史版本保留。
  • resStatus=1(处理中)不允许操作。
  • 入库时自动写入 drama_video_id(从任务 mls_list 读取)。

入参

参数 类型 必填 说明
token string 登录 token
episodeId int 任务 ID
language string 语种
fileType string 资源类型
fileUrl string 资源地址
id int 兼容字段,可忽略;编辑请直接传新 fileUrl

出参

字段 类型 说明
flag int 100 成功
data.id int 新素材主键
data.version string 新版本号,如 v3-20260827
data.versionSeq int 同键递增序号

请求示例(新增)

{
  "token": "xxx",
  "episodeId": 1,
  "language": "original",
  "fileType": "subtitle",
  "fileUrl": "https://xxx/new.srt"
}

请求示例(编辑/覆盖)

{
  "token": "xxx",
  "episodeId": 1,
  "language": "original",
  "fileType": "subtitle",
  "fileUrl": "https://xxx/replaced.srt"
}

5.2 /mls/tool/deleteMlsTaskResource - 删除任务素材

软删指定历史素材(is_del=1)。当前 latest 不可删除;请用上传或 copyMlsTaskResourceVersion 覆盖。resStatus=1 处理中不允许删除。

入参

参数 类型 必填 说明
token string 登录 token
episodeId int 任务 ID
id int 素材主键(须为非 latest 的历史版本)

出参

字段 类型 说明
data.deletedId int 已软删的记录 id

请求示例

{
  "token": "xxx",
  "episodeId": 1,
  "id": 12
}

5.3 /mls/tool/copyMlsTaskResourceVersion - 从历史版本创建副本

基于选中历史版本的内容(fileUrl 等)生成新版本并设为 latest;版本号形如 v3-20260827-copy

入参

参数 类型 必填 说明
token string 登录 token
episodeId int 任务 ID
sourceId int 源版本素材 id(来自 jobResource.*.*.versions[].id

出参

字段 类型 说明
data.id int 新版本主键
data.version string 新版本号
data.versionSeq int 序号
data.url string 资源地址(与源版本相同)
data.sourceId int 源版本 id

请求示例

{
  "token": "xxx",
  "episodeId": 1,
  "sourceId": 10
}

5.4 /mls/tool/getMlsResourceGroups - 分组资源:分组列表

按语种 + fileType 查询分组摘要(不含文件明细)。用于 TTS 候选等「一类型多文件、按 ID 分组」的资源;jobResource / OpenTool getMlsJobResource 默认不返回这类数据。

【2026-09-04】按 项目(drama_video_id 聚合查询。可传 drama_video_id(项目ID) 直接按集查;或传 episodeId(任务ID) 由服务端解析所属项目。二者至少传一;都传时以 drama_video_id 为准。无项目的孤立任务回退按任务查。

【2026-09-07】fileCount / 列表仅统计 is_latest=1 的分组文件(历史版本不计入)。

应用端路径:POST /mls/tool/getMlsResourceGroups(需 token)。不再提供 OpenTool 路径

入参

参数 类型 必填 说明
token string 登录 token
episodeId int 条件 任务ID;与 drama_video_id 至少传一
drama_video_id int 条件 项目ID(集/视频 ID);与 episodeId 至少传一;可与 dramaVideoId 同义
language string 语种,如 englishoriginal
fileType string 资源类型,如 ttsCandidate

出参

字段 类型 说明
data.list array 分组列表
data.list[].groupKey string 分组字段名,如 subtitleID
data.list[].groupValue string 分组字段值,如 12
data.list[].fileCount int 该分组下文件数
data.list[].uptime int 分组内最新 uptime

请求示例

{
  "token": "xxx",
  "episodeId": 1,
  "language": "english",
  "fileType": "ttsCandidate"
}

返回示例

{
  "flag": 100,
  "flagString": "success",
  "data": {
    "list": [
      { "groupKey": "subtitleID", "groupValue": "12", "fileCount": 2, "uptime": 1798732800 },
      { "groupKey": "subtitleID", "groupValue": "18", "fileCount": 4, "uptime": 1798732810 }
    ]
  }
}

5.5 /mls/tool/getMlsResourceGroupFiles - 分组资源:某分组文件列表

查询指定分组下的文件明细。

【2026-09-04】与 §5.4 相同:按项目聚合;可传 drama_video_idepisodeId(至少其一)。

【2026-09-07】平铺返回该分组下全部版本(含历史,按 fileName ASC、versionSeq DESC);每条含 version / versionSeq / isLatestdata.count 为总条数;嵌套 versions[]

应用端路径:POST /mls/tool/getMlsResourceGroupFiles(需 token)。不再提供 OpenTool 路径

入参

参数 类型 必填 说明
token string 登录 token
episodeId int 条件 任务ID;与 drama_video_id 至少传一
drama_video_id int 条件 项目ID;与 episodeId 至少传一
language string 语种
fileType string 资源类型
groupKey string 分组字段名,如 subtitleID
groupValue string 分组字段值,如 12

出参

字段 类型 说明
data.groupKey string 分组字段名
data.groupValue string 分组字段值
data.count int 返回条数(含历史版本)
data.list array 文件平铺列表
data.list[].id int 资源主键
data.list[].fileName string 文件名
data.list[].url string 可下载地址
data.list[].source string upload / backend
data.list[].uptime int 更新时间
data.list[].version string 版本号
data.list[].versionSeq int 版本序号
data.list[].isLatest bool 是否当前最新
data.list[].episodeId int 来源任务ID
data.list[].drama_video_id int 项目ID

请求示例

{
  "token": "xxx",
  "episodeId": 1,
  "language": "english",
  "fileType": "ttsCandidate",
  "groupKey": "subtitleID",
  "groupValue": "12"
}

返回示例

{
  "flag": 100,
  "flagString": "success",
  "data": {
    "groupKey": "startMs",
    "groupValue": "0",
    "count": 6,
    "list": [
      {
        "id": 12585,
        "fileName": "final_omnivoice_1.wav",
        "url": "https://cdn.example/v2.wav",
        "source": "backend",
        "uptime": 1788771486,
        "version": "v2-20260907",
        "versionSeq": 2,
        "isLatest": true,
        "episodeId": 1703,
        "drama_video_id": 1760
      },
      {
        "id": 12582,
        "fileName": "final_omnivoice_1.wav",
        "url": "https://cdn.example/v1.wav",
        "source": "backend",
        "uptime": 1788771486,
        "version": "v1-20260907",
        "versionSeq": 1,
        "isLatest": false,
        "episodeId": 1702,
        "drama_video_id": 1760
      }
    ]
  }
}

5.6 OpenTool /openApi/mls/saveMlsCandidateFiles - 批量保存分组候选文件

处理节点按字幕目录上传候选音频后调用。与 saveMlsResourceFile 同类资源表,但写入分组行group_key / group_value / file_name 非空)。

【2026-09-07】同键升版本插入,不再覆盖:版本键 (uin, drama_video_id, language, fileType, group_key, group_value, file_name)(无项目时回退 episodeId);仍写入来源任务 episodeId。行为对齐普通资源(普通资源版本键止于 fileType),分组资源再深到 group_key / group_value / file_name。同键再次保存时:旧 latest 仅降 is_latest,插入新行并递增 version_sequptime 相对旧 latest 严格递增。

同一次请求的 files 必须属于同一 startMs,可含多个 fileName;同请求内 fileName 不可重复。

入参

参数 类型 必填 说明
episodeId int 任务 ID
uin int 用户 UIN
parentId string 任务 parentId
language string 目标语种
jobId string 当前候选生成任务 ID
fileType string 固定为 ttsCandidate
files array 同一 startMs 下的候选文件列表

files[] 单项

字段 类型 必填 说明
startMs int 字幕起始毫秒,对应磁盘目录名;写入 group_key=startMs / group_value
fileName string 文件名(不重命名)
url string 上传后可下载 URL

请求示例

{
  "episodeId": 1,
  "uin": 12345,
  "parentId": "01",
  "language": "english",
  "jobId": "candidate-001",
  "fileType": "ttsCandidate",
  "files": [
    { "startMs": 20533, "fileName": "candidate-a.mp3", "url": "https://cdn.example/a.mp3" },
    { "startMs": 20533, "fileName": "candidate-b.wav", "url": "https://cdn.example/b.wav" }
  ]
}

返回示例

{
  "flag": 100,
  "flagString": "success",
  "data": {
    "files": [
      {
        "startMs": 20533,
        "fileName": "candidate-a.mp3",
        "uptime": 1788427288,
        "id": 101,
        "version": "v2-20260907",
        "versionSeq": 2
      },
      {
        "startMs": 20533,
        "fileName": "candidate-b.wav",
        "uptime": 1788427289,
        "id": 102,
        "version": "v1-20260907",
        "versionSeq": 1
      }
    ]
  }
}

data.files[] 每项返回本次请求对应资源的 startMs / fileName / uptime,不返回 url;并返回新版本 id / version / versionSequptime 为正整数秒级时间戳,同一版本键再次写入时严格递增。处理节点按 (startMs, fileName) 匹配响应并写入候选索引。

上线前需执行 sql/mls_resource_file_group.sql


6. /mls/tool/retryMlsTask - 失败重试

对失败或未完成的 AI 多语言任务重试。每次重试均生成新的 job_id 并在响应中返回。

  • 需选语种requires_language=true,含全流程):逻辑与原先一致——不传 languages 时重置所有非成功语种;传入时仅重置指定语种。resStatus 置为 0。
  • 不需选语种:仅将 resStatus 置为 0 并更新 job_id,不修改 results

【2026-06-30 变更】无需传 param,重试沿用创建任务时写入库中的环境变量。

【2026-07-07 变更】若任务 origin_ready=0,或关联剧集视频 preprocess_status=3(预处理失败),会先自动调用 §6.1 retryMlsVideoPreprocess 逻辑重新提交预处理,再重置 AI 任务状态。预处理重试信息在响应 data.preprocess_retry 中返回。

【2026-08-18 变更】传了 stages 则写入快照;execution_mode=stages 且未传则刷新套餐模板。重试不重复扣源视频。

任务已完成(resStatus=3)时不可重试。

注意:纯 AI 管道失败(源片已就绪、origin_ready=1)时仅重置任务状态,不会重复转码。

入参

参数 类型 必填 说明
token string 登录后获得的 token
episodeId int 任务 ID(表字段 episodeId)
languages string 要重试的语种,逗号分隔;仅 requires_language=true 时有效
stages array 可选;规则同 addMlsTask

出参

字段 类型 说明
flag int 100 成功,110 参数错误/记录不存在或无权限/任务已完成无需重试/重试失败/所选语言已完成/预处理重试失败
flagString string 提示信息
data object 成功时包含
data.job_id string 重试后的新任务实例 id
data.preprocess_retry object 可选;本次触发了预处理重试时返回
data.preprocess_retry.job_no string 新建的预处理任务号
data.preprocess_retry.retry_mode string transcode 从转码重试;pull 仅网络上传;processing 已有预处理进行中

请求示例

{
  "token": "xxx",
  "episodeId": 1,
  "languages": "zh,en"
}

返回示例(含预处理重试)

{
  "flag": 100,
  "flagString": "success",
  "data": {
    "job_id": "a1b2c3d4e5f6789012345678abcdef01",
    "preprocess_retry": {
      "job_no": "8810bb51c848eceac22889c9dd20c58a",
      "retry_mode": "transcode"
    }
  }
}

返回示例(仅 AI 任务重试)

{
  "flag": 100,
  "flagString": "success",
  "data": {
    "job_id": "a1b2c3d4e5f6789012345678abcdef01"
  }
}

6.1 /mls/tool/retryMlsVideoPreprocess - 视频预处理失败重试

转码 / 网络上传 预处理流水线失败后的重试。每次重试会新建一条 mls_video_preprocess 记录。

重试策略

条件 行为
已有进行中的预处理(status < 4 直接返回 retry_mode=processing,不重复提交
上次失败且已有转码产出 B(transcode_output_url 仅重新 submitJobs PULLretry_mode=pull
转码阶段失败或无 B 从源地址 A 重新 dvrSubmitTranscodingretry_mode=transcode

成功后仍走 DMS 回调收尾:写入最终源地址 C、更新关联 mls_drama_video / mls_list、删除源片 A。详见 §19

入参

三选一(优先级:job_no > videoId/id > episodeId):

参数 类型 必填 说明
token string 登录 token
videoId int 条件 剧集视频 ID(mls_drama_video.id);与 id 等价
id int 条件 videoId
episodeId int 条件 任务 ID;若任务有关联 drama_video_id 则重试视频级预处理,否则重试任务级预处理
job_no string 条件 失败的预处理任务号(mls_video_preprocess.job_no

出参

字段 类型 说明
flag int 100 成功,110 参数错误/无权限/无需重试/预处理重试失败
flagString string 提示信息
data.job_no string 预处理任务号(新建或进行中的)
data.retry_mode string transcode / pull / processing
data.ref_type string drama_videotask
data.ref_id int 关联业务 ID
data.message string 人类可读说明

请求示例(剧集视频)

{
  "token": "xxx",
  "videoId": 657
}

请求示例(按任务 episodeId)

{
  "token": "xxx",
  "episodeId": 1001
}

返回示例

{
  "flag": 100,
  "flagString": "success",
  "data": {
    "job_no": "8810bb51c848eceac22889c9dd20c58a",
    "retry_mode": "pull",
    "ref_type": "drama_video",
    "ref_id": 657,
    "message": "预处理已重新提交(仅网络上传)"
  }
}

7. /mls/tool/deleteMlsTask - 删除多语言任务(软删)

将任务标记为已删除(is_del=1),不物理删除。

【2026-07-08 变更】三级结构下,删除任务仅软删该任务本身,不会连带删除其所属集(mls_drama_video)或剧集(mls_drama)。如需删除整集,请用 §18.6 deleteMlsDramaVideo;删除整剧请用 §18.8 deleteMlsDrama

【2026-07-28 变更】resStatus=1(处理中)的任务禁止删除,返回 flag=110「任务处理中,禁止删除」。

入参

参数 类型 必填 说明
token string 登录后获得的 token
episodeId int 任务 ID(表字段 episodeId),兼容历史id入参

出参

字段 类型 说明
flag int 100 成功,110 参数错误/处理中禁止删除/删除失败
flagString string 提示信息
data -

请求示例

{
  "token": "xxx",
  "episodeId": 1
}

返回示例

{
  "flag": 100,
  "flagString": "success"
}

处理中禁止删除:

{
  "flag": 110,
  "flagString": "任务处理中,禁止删除"
}

8. /mls/tool/getMaterialAccess - 获取素材上传签名参数

获取素材上传所需的签名等信息,用于直传或上传接口。

入参

参数 类型 必填 说明
token string 登录后获得的 token
classify string 分类
parentId string 分组 ID,默认01
service string 服务类型:material-uploadprivate-upload(默认)
subService string 子服务,默认mls
subType string 默认mls
toolService string 工具服务标识
subDiyParam string 额外自定义参数,须为合法 JSON 字符串,会与内置 diyParam 合并

出参

字段 类型 说明
flag int 100 成功,102/110 参数或用户/服务错误
flagString string 提示信息
data object 成功时包含签名及上传参数
data.signatureNonce string 签名随机数
data.accessId string 访问 ID
data.expireTime int 签名过期时间戳
data.signature string 签名值
data.filePrefix string 文件前缀,如mls-1011-1000-
data.diyParam string JSON 字符串,上传时携带的自定义参数

请求示例

{
  "token": "xxx",
  "classify": "video",
  "parentId": "01",
  "service": "private-upload",
  "subService": "mls"
}

返回示例

{
  "flag": 100,
  "flagString": "success",
  "data": {
    "signatureNonce": "12345",
    "accessId": "xxx",
    "expireTime": 1770534000,
    "signature": "14224ad83a75b14b349300868161d726",
    "filePrefix": "material-1011-1000-",
    "diyParam": "{\"platform\":\"apaas\",\"service\":\"material-upload\",\"groupID\":\"01\",\"subUser\":\"1000\",\"subCode\":\"subId\",\"subService\":\"material\"}"
  }
}

错误示例:servicematerial-uploadprivate-upload时返回「素材所属服务错误」;用户不存在返回「用户不存在」。

8.1 视频/文件分片上传(直传上传服务)

在调用本上传接口前,需先通过 8. getMaterialAccess 获取上传签名参数(accessId、expireTime、signature、signatureNonce、filePrefix、diyParam),再向直传上传服务发起分片上传。

  • 视频文件(后缀.mp4.mkv,不区分大小写):使用 DVR.FormUpload。
  • 非视频文件:使用 MFS.APAAS.FormUpload。

当文件大小超过 10MB 时,需按 10MB 一片进行分片,按顺序逐片上传;小于等于 10MB 时视为 1 片。

接口地址

文件类型 路径
视频 {UPLOAD_URL}/v2/DVR.FormUpload
非视频 {UPLOAD_URL}/v2/MFS.APAAS.FormUpload

UPLOAD_URL为前端/环境配置的上传域名(upload-dvr.{DOMAIN},如:https://upload-dvr.jstest.aodianyun.cn/v2/DVR.FormUpload),请求时需带上与站点一致的协议(如https:)。

请求方式

  • Method:POST
  • Content-Type:multipart/form-data

请求参数(Form 表单字段)

参数 类型 必填 说明
file File (Binary) 当前分片内容(Blob/File.slice 得到)
access_id string getMaterialAccess 返回的 accessId
expires string getMaterialAccess 返回的 expireTime(转成字符串)
signature string getMaterialAccess 返回的 signature
signature_nonce string getMaterialAccess 返回的 signatureNonce(转成字符串)
file_prefix string getMaterialAccess 返回的 filePrefix
diy_param string getMaterialAccess 返回的 diyParam
chunk string 当前分片索引,从 0 开始
chunks string 总分片数(1 或 Math.ceil(fileSize / 10MB))
name string 原始文件名(含后缀,如video.mp4

响应结构(JSON)

字段 类型 说明
Flag int 100 表示成功
FlagString string 提示信息,失败时为错误说明
location string 成功时可选,文件访问地址
data object 成功时可选,若存在则 data.location 为文件访问地址

成功时,文件最终 URL 以response.data.locationresponse.data.data?.location为准(二者有一即可)。

分片与顺序

  • 分片大小固定为 10MB(10 × 1024 × 1024 字节)。
  • 最后一片可为不足 10MB 的剩余部分。
  • 分片必须按chunk从 0 到chunks-1顺序上传;全部片上传成功后,最后一片的响应中返回文件 URL。

前端实现要点(参考)

  1. 先请求getMaterialAccess,拿到materialAccess(accessId、expireTime、signature、signatureNonce、filePrefix、diyParam)。
  2. 根据文件名后缀判断是否为视频(如.mp4.mkv),选择 DVR.FormUpload 或 MFS.APAAS.FormUpload。
  3. 使用File.slice(start, end)切分 10MB 一片,循环上传;每片 FormData 带上表中所列签名参数及 chunk、chunks、name。
  4. 仅当Flag === 100时视为成功;最后一片成功响应中的locationdata.location即为上传结果 URL。

9. /mls/tool/getMlsAmount - 获取当前额度(积分)

获取当前用户 MLS 额度;若尚无额度记录,按规则自动创建(首次赠送 6000 积分)。可用额度会扣除待处理/处理中未完结任务(resStatus 0/1 且 is_pay=0)的预占额度

【2026-08-18 变更】预占与 checkMlsAmount 共用 sumMlsUinReservedCost:任务有 stages 快照或套餐模板时为「阶段预估 − 该 episode 已扣 mls_stage_charge」;否则回退旧 base/lang(含未成功语种)。前端入参/出参字段不变。

【2026-06-11 变更】预占按每条待处理任务计算(公式已被 2026-08-18 覆盖)。

入参

参数 类型 必填 说明
token string 登录后获得的 token

出参

字段 类型 说明
flag int 100 成功,110 参数/获取失败
flagString string 提示信息
data object 成功时包含
data.last_amount int 当前剩余额度(账面),整数
data.reserved int 处理中未计费任务占用的预估额度,整数
data.available int 可用额度 = last_amount - reserved,整数
data.invite_reward_total int 邀请累计奖励积分

【变更】 当前版本data包含last_amountreservedavailableinvite_reward_total,不再返回month字段。

请求示例

{
  "token": "xxx"
}

返回示例

{
  "flag": 100,
  "flagString": "success",
  "data": {
    "last_amount": 3000,
    "reserved": 0,
    "available": 3000,
    "invite_reward_total": 24000
  }
}

10. /mls/tool/getMlsAmountRunList - 额度(积分)使用记录

分页查询当前用户的 MLS 额度流水(mls_user_amount_run),按 id 倒序;每条记录可带关联任务标题 task_title(通过 episodeId 关联 mls_list)。支持按uptime时间范围和trade_type类型过滤(可选)。

入参

参数 类型 必填 说明
token string 登录后获得的 token
page int 页码,默认 1
num int 每页条数,默认 15,最大 100
uptimeStart int uptime 起始时间戳(秒级),不传则不限制
uptimeEnd int uptime 结束时间戳(秒级),不传则不限制
tradeType int 类型:1 存入,2 支出;不传则不过滤

出参

字段 类型 说明
flag int 100 成功,110 参数错误
flagString string 提示信息
data array 当前页流水列表
data[].id int 流水主键
data[].uin int 用户 uin
data[].trade_amount float 交易额度(正为存入,负为支出时取绝对值)
data[].last_amount float 交易后剩余额度
data[].trade_type int 1 存入,2 支出
data[].trade_desc string 备注(阶段扣费为人读短句,如 《0818》116秒扣580:时间戳校对116,英语翻译116…,最长 255)
data[].episodeId int 关联任务 id,扣费时有值
data[].uptime int 交易时间(秒级时间戳)
data[].task_title string 关联任务标题(来自 mls_list,可能为空)
total int 符合条件的总条数

请求示例

{
  "token": "xxx",
  "page": 1,
  "num": 15,
  "uptimeStart": 1704067200,
  "uptimeEnd": 1704153600,
  "tradeType": 2
}

返回示例

{
  "flag": 100,
  "flagString": "success",
  "data": [
    {
      "id": 1,
      "uin": 12345,
      "trade_amount": "10.40",
      "last_amount": "41.60",
      "trade_type": 2,
      "trade_desc": "《示例短剧》120秒扣240:英语翻译120,英语成片存储120",
      "episodeId": 5,
      "uptime": 1704067200,
      "task_title": "示例短剧"
    }
  ],
  "total": 1
}

11. /mls/tool/checkMlsAmount - 判断额度(积分)是否充足

若无额度记录会先走分配逻辑(同 getMlsAmount)。

【2026-08-18 变更】有 stages(入参或套餐模板)时 required 按阶段价目预估(含 compose 则加存储×语种数);无 stages 回退旧 base/lang + 时间戳校对。reserved 同 getMlsAmount。可选 stagesinclude_source_upload

【2026-06-11 变更】计费规则按 mode_type 区分(配置见 getMlsModeTypeList);stages 任务请以本接口 required 为准,不要用返回的 base_price_per_second/lang_price_per_second 自行相乘。

legacy 公式(无 stages):required = max(duration, 30) × (base_price_per_second + lang_price_per_second × N + (timestamp_check ? 1 : 0))

stages 公式once 单价×billable + per_language 单价×billable×语种数;含 compose 再加 storage 单价×billable×语种数。计费秒 billable = max(duration, 30)

不足 30 秒按 30 秒计。

入参

参数 类型 必填 说明
token string 登录后获得的 token
duration int 是* 视频时长,单位秒;不需原片的类型可改传 resources 由服务端解析
mode_type string 任务类型,默认 full_pipeline
languages string 二选一 输出语种逗号分隔;requires_language=true 时必填其一
languageCount int 二选一 输出语言数量
resources array 不需原片且未传有效 duration 时,用于从字幕等资源推算时长
param object 任务级环境变量;仅 无 stagesCONSOLE_SUBTITLE_TIMESTAMP_CHECK 计入加价
stages array 可选;不传则用套餐模板。规则同 addMlsTask
include_source_upload int/bool 为真时把源视频上传费用算进 required(默认不含;实际上传仍会在建集时扣)

出参

字段 类型 说明
flag int 100 成功,110 参数/额度异常(含 mode_type 无效)
flagString string 提示信息
data object 成功时包含
data.sufficient bool 可用额度是否 ≥ 本次所需
data.required int 本次所需额度(整数)
data.last_amount int 当前剩余额度(账面),整数
data.reserved int 处理中未计费任务占用额度,整数
data.available int 可用额度,整数
data.billable_seconds int 计费秒数 = max(duration, 30)
data.language_count int 语种数(不需选语种时可能为 0)
data.mode_type string 本次校验使用的任务类型
data.base_price_per_second int 套餐前置单价(展示用;stages 任务勿用来反推 required)
data.lang_price_per_second int 套餐语种叠加单价(同上)
data.timestamp_check bool 仅无 stages 时是否计入时间戳校对加价

请求示例(全流程)

{
  "token": "xxx",
  "duration": 120,
  "mode_type": "full_pipeline",
  "languages": "zh,en"
}

请求示例(非全流程)

{
  "token": "xxx",
  "duration": 120,
  "mode_type": "subtitle_erase_dialog"
}

返回示例

{
  "flag": 100,
  "flagString": "success",
  "data": {
    "sufficient": true,
    "required": 2400,
    "last_amount": 3000,
    "reserved": 0,
    "available": 3000,
    "billable_seconds": 240,
    "language_count": 2,
    "mode_type": "full_pipeline"
  }
}

说明:扣费在 OpenTool 回调中与状态更新同一事务触发(SELECT … FOR UPDATE 锁任务行 + 锁额度行)。

  • 新路径(回调带 executedStages,哪怕空数组):按成功阶段扣费 + 首次成片存储;bill_base_paid / bill_addon_ts_paid 保持原值。未知 stage 跳过。
  • 旧路径(未带该键):全流程 updateMlsResult / 需语种非全流程 updateMlsJobStatus:首次成功扣前置(及时间戳校对加价),每个新成功语种扣叠加费;不需语种任务成功时扣前置(及时间戳)。已扣标记不重扣。
  • 后付费无退费。若用户开启成片审核,成功结果可能以 status=4 入库;存储按「首次成功且 url 非空」计,与是否降为 4 无关。deductMlsAmount 为内部逻辑,不单独对外暴露。
  • 源视频扣费发生在建集,不在回调里。

12.0 /mls/tool/checkToken - 校验 / 换取登录态

【更新,更新时间:2026-07-23】免登录接口。根据 subToken 形态走两条路径:

  1. 普通 MLS 会话subToken 不以 apaas 开头 → 从 Redis 读取会话;存在则返回用户信息,不存在返回未登录。
  2. apaas 控制台换票subToken apaas 开头 → 请求控制台 checkToolAccess;必要时补全 MLS 账号后签发新的 MLS subToken

入参

参数 类型 必填 说明
subToken string 待校验的 token;apaas 跳入时以 apaas 开头
sourceFrom string 固定值 ady:渠道用户;不传/非 ady:普通用户(无渠道标识)

环境变量

变量 说明
MLS_ADY_PLATFORM_CODE sourceFrom=ady 使用。渠道标识基础值,实际写入为 {code}_gwplatform_user_key={code}_gw_{extId}。未配置则 ady 换票失败

分支说明

A. 普通会话校验(非 apaas 前缀)

  • Redis 命中 → flag=100;未命中 → flag=200「您还未登录」;subToken 空 → flag=110

B. apaas 换票(apaas 前缀)

  1. 调用 checkToolAccesssubType=mls):
    • sourceFrom=adyhttp://apaas-api.aodianyun.com/...
    • 否则 → http://apaas-api.{DOMAIN}/...
  2. extId:优先 parentUin,否则 userId
B1. sourceFrom=ady(渠道用户)
  1. 仅按 platform_user_key 查用户。
  2. 查不到 → createMlsUserWithIpaas 新建 uin,写入 platform_code / platform_user_key / source(渠道来源)。
  3. 签发登录态。渠道用户创建任务等不强制绑手机。
B2. 非 ady(普通用户)
  1. uin = extId,仅按 uinmls_user
  2. 不存在则补全必要信息(复用 apaas uin):source=apaas不写 platform_code / platform_user_key;初始化 DMS、积分账户。
  3. 签发登录态。

出参

字段 类型 说明
flag int 100 成功;200 未登录;102 apaas 校验失败;110 其它失败
flagString string 提示信息
data object 成功时用户会话
data.uin int mls uin(ady 新注册为新生成值)
data.Token / data.subToken string 换票成功后的 MLS token
data.platform_code string 仅渠道用户有值;普通用户为空
data.platform_user_key string 仅渠道用户有值

请求示例

普通会话校验:

{
  "subToken": "a1b2c3d4e5f6..."
}

apaas 控制台换票(原逻辑):

{
  "subToken": "apaascc3809defc8c71847da70b225029aa23"
}

ADY 换票(sourceFrom=ady):

{
  "subToken": "apaascc3809defc8c71847da70b225029aa23",
  "sourceFrom": "ady"
}

返回示例(普通会话成功)

{
  "flag": 100,
  "flagString": "success",
  "data": {
    "uin": 12345,
    "phone": "13800138000",
    "username": "用户xxx",
    "avatar": "",
    "parentId": "01",
    "parentUin": 12345,
    "locale_code": "zh-cn",
    "Token": "a1b2c3d4e5f6...",
    "userId": 12345
  }
}

返回示例(apaas 换票成功 · 渠道 ady)

{
  "flag": 100,
  "flagString": "success",
  "data": {
    "uin": 10001111,
    "phone": null,
    "username": "用户10001111",
    "realname": "用户10001111",
    "parentId": "01",
    "parentUin": 10001111,
    "source": "partner_ady_gw",
    "platform_code": "partner_ady_gw",
    "platform_user_key": "partner_ady_gw_2088",
    "Token": "新签发的mls_token",
    "subToken": "新签发的mls_token",
    "userId": 10001111
  }
}

返回示例(apaas 换票成功 · 普通用户)

{
  "flag": 100,
  "flagString": "success",
  "data": {
    "uin": 2088,
    "phone": null,
    "username": "用户2088",
    "source": "apaas",
    "platform_code": "",
    "platform_user_key": null,
    "Token": "新签发的mls_token",
    "subToken": "新签发的mls_token",
    "userId": 2088
  }
}

说明:渠道示例中 platform_codeMLS_ADY_PLATFORM_CODE + _gw 为准;普通用户无渠道字段。

返回示例(未登录 / 参数错误)

{
  "flag": 200,
  "flagString": "您还未登录"
}
{
  "flag": 110,
  "flagString": "服务token不能为空"
}

前端对接提示

  • 从 apaas 控制台带 apaas… 进入曜幕时:先调本接口换票,拿到 data.subToken(或 data.Token)后,再作为后续接口的 token
  • 来自 ADY(aodianyun.com)入口时传 sourceFrom=ady
  • 本接口在网关 NO_TOKEN_CMDS 中,不要再传业务 token 字段做网关鉴权。
  • §12.6.1 getUserInfo 区别:getUserInfo 用已登录的 token 读会话;checkTokensubToken 校验或完成 apaas→MLS 换票。

12. /mls/tool/login - 登录

【更新,更新时间:2026-07-28】 当前实现支持 3 种登录方式:

  • 手机号 + 密码
  • uin + 密码
  • 手机号 + 短信验证码

其中“手机号 + 短信验证码”模式下,若手机号未注册会自动创建账号后登录;可传可选入参 source 写入注册来源。

登录成功后返回subToken(后端在 Redis 中保存用户会话信息)。本接口为免登录接口,无需传 token。

入参

参数 类型 必填 说明
username string 登录账号:可传手机号(11位)或 uin(纯数字)
userPassword string 条件必填 密码登录时必填(前端加密后传输)
smsCode string 条件必填 短信验证码登录时必填
inviteUin int 邀请人 uin(固定参数名)。仅在“手机号+短信验证码且未注册自动注册”场景生效
source string 注册来源,写入 mls_user.source在短信验证码未注册自动建号时生效;不传或空串默认 H5,最长 50

账号判定规则

smsCode为空时:

  • username为纯数字且不符合手机号格式时,按uin + 密码登录
  • 否则按手机号 + 密码登录

出参

字段 类型 说明
flag int 100 成功,1004 参数错误,110 登录失败
flagString string 提示信息
data object 成功时包含
data.subToken string 登录会话 token,后续接口鉴权用(即业务侧常说的 token

说明:登录成功后用户完整资料(含 platform_code / platform_user_key / hasPassword)写入 Redis;请用 §12.6.1 getUserInfo(或换票接口返回的会话)读取。渠道用户(platform_code 非空)可用 §12.6.2 getChannelPlatformInfo 查充值跳转地址。hasPassword 的前端判断约定见 §12.6.1

请求示例

{
  "username": "13800138000",
  "userPassword": "front_encrypted_password"
}

手机号 + 短信验证码:

{
  "username": "13800138000",
  "smsCode": "123456",
  "source": "H5"
}

uin + 密码:

{
  "username": "10001111",
  "userPassword": "front_encrypted_password"
}

返回示例

{
  "flag": 100,
  "flagString": "登录成功",
  "data": {
    "subToken": "md5_token_string"
  }
}

12.1 /mls/mlsUser/generateCaptcha - 生成图形验证码

【新增,更新时间:2026-03-23】 生成图片验证码。验证码内容与check_key拼接后存 Redis(5 分钟有效)。

说明:滑块/行为验证码由前端按平台文档接入,拿到captchaId后直接调用sendSmsCodecaptchaId,无需调用本接口。本接口为传统图形码,后续可能下线。

入参

参数 类型 必填 说明
check_key string 前端随机字符串,用于区分验证码会话

出参

返回 JPEG 图片流(content-type: image/jpeg),非 JSON。


12.2 /mls/mlsUser/sendSmsCode - 发送短信验证码

【更新时间:2026-04-07】 先发码前人机校验,支持两种方式(二选一):

  1. 滑块/行为验证码:传captchaId(前端完成验证后获得的唯一 id)。服务端请求MLS_CAPTCHA_VERIFY_BASE+/v1/message/Captcha/query?captcha_id=...做二次校验,参见 广电云平台验证码·服务端校验
  2. 传统图形验证码:传check_key+captcha(与generateCaptcha配套),Redis 一次性校验(逐步废弃)。

入参

参数 类型 必填 说明
phone string 手机号
module string 场景:register/login/password
captchaId string 滑块等行为验证码 id;与下方图形码二选一,同时传时优先按captchaId走远程校验
check_key string 图形验证码随机字符串(未传captchaId时必填,与 generateCaptcha 一致)
captcha string 图形验证码字符(未传captchaId时必填)

业务规则

  • module=register:手机号必须未注册
  • module=login:允许未注册手机号(用于短信登录自动注册)
  • module=password:手机号必须已注册
  • 使用图形码时:校验通过后 Redis 中对应 key 即删除(一次性)
  • 使用captchaId时:须在运行环境配置MLS_CAPTCHA_VERIFY_BASE(验证码服务根地址,无末尾斜杠,例如https://message.guangdianyun.tv

返回示例

{
  "flag": 100,
  "flagString": "发送成功"
}

12.3 /mls/mlsUser/register - 注册

【更新,更新时间:2026-07-28】 手机号注册,需短信验证码校验通过。支持传入注册来源 source

入参

参数 类型 必填 说明
phone string 手机号
password string 前端加密后的密码
confirmPassword string 与 password 一致
smsCode string 短信验证码(module=register)
inviteUin int 邀请人 uin(固定参数名,用于邀请奖励)
username string 为空时自动生成为138****1234形式
source string 注册来源,写入 mls_user.source;不传或空串时默认 H5,最长 50
wxUnionId string 微信 unionId
wxMpOpenId string 微信公众号 openId
wxMiniOpenId string 小程序 openId
avatar string 头像 URL
company string 单位
email string 邮箱
realname string 真实姓名

说明

  • 注册时会先调用外部账户服务创建底层账号并获取uin
  • mls_user.password入库使用PASSWORD('{$password}')
  • source 写入 mls_user.source(如 H5 / apaas / 渠道 code 等)

12.4 /mls/mlsUser/changePassword - 已登录修改密码

【更新,更新时间:2026-07-24】 已登录用户修改密码(当前版本不要求旧密码)。

入参

参数 类型 必填 说明
token string 登录 token
uin int 用户 uin
newPassword string 前端加密后的新密码
confirmPassword string 与 newPassword 一致

说明

  • 若用户原先未设置密码mls_user.password 为空/NULL),设置成功后会刷新当前 token 对应的 Redis 会话,将 hasPassword 补为 true,无需重新登录即可从 getUserInfo 读到最新值。
  • 若原先已有密码,仅更新密码哈希,不额外改写会话中的 hasPassword(已为 true)。

12.5 /mls/mlsUser/resetPassword - 忘记密码重置

【新增,更新时间:2026-03-23】 未登录场景,通过手机号 + 短信验证码重置密码。

入参

参数 类型 必填 说明
phone string 手机号
password string 前端加密后的新密码
confirmPassword string 与 password 一致
smsCode string 短信验证码(module=password)

说明

  • 本接口为免登录接口
  • 校验短信验证码后更新密码(当前实现为直接写入前端加密值)

12.5.1 /mls/mlsUser/bindPhone - 绑定手机号(微信未绑定用户)

【新增,更新时间:2026-03-24】 适用于微信登录后账号未绑定手机号的场景。已被其他账号注册的手机号不允许绑定。

入参

参数 类型 必填 说明
token string 登录 token
phone string 待绑定手机号(11位)
smsCode string 短信验证码(module=login)

业务规则

  • 仅允许当前账号phone为空时绑定
  • 手机号格式必须符合^1\\d{10}$
  • 目标手机号必须未注册

返回示例

{
  "flag": 100,
  "flagString": "绑定成功"
}

12.5.2 /mls/mlsUser/changePhone - 修改手机号(已绑定用户)

【新增,更新时间:2026-03-24】 已登录且已有手机号的用户修改手机号。新手机号若已注册则不允许修改。

入参

参数 类型 必填 说明
token string 登录 token
newPhone string 新手机号(11位)
smsCode string 短信验证码(module=login)

业务规则

  • 当前账号必须已绑定手机号
  • 新手机号不能与当前手机号相同
  • 手机号格式必须符合^1\\d{10}$
  • 新手机号必须未注册

返回示例

{
  "flag": 100,
  "flagString": "修改成功"
}

12.5.2.1 /mls/mlsUser/updateAvatar - 修改头像

【新增,更新时间:2026-04-07】 已登录用户更新mls_user.avatar。成功后刷新当前 token 对应的 Redis 会话,避免getUserInfo读到旧头像。

入参

参数 类型 必填 说明
token string 登录 token
avatar string 头像地址,需为httphttps链接,最大长度 255

返回示例

{
  "flag": 100,
  "flagString": "修改成功"
}

12.5.2.2 /mls/mlsUser/updateProfile - 修改基础资料

【更新时间:2026-04-07】 已登录用户更新资料字段:仅处理请求体里出现的键,未传的字段不修改。至少传下列之一:usernamerealnamecompanyemail。成功后刷新当前 token 的 Redis 会话。

说明:mls_user表中无nickname列,昵称使用username字段;本接口只接收参数名username

入参

参数 类型 必填 说明
token string 登录 token
username string 用户昵称,对应库字段username(最大 255)
realname string 真实姓名,最大 255
company string 单位,最大 255
email string 邮箱,最大 20(与表字段长度一致)

返回示例

{
  "flag": 100,
  "flagString": "修改成功"
}

12.5.2.3 /mls/mlsUser/getMlsI18nLocaleList - 获取 App 界面语言列表

【新增,更新时间:2026-05-09】从 apaas.mls_admin_ui_locale 读取界面国际化可选语言(语言名称 + 语言码),供 App 语言切换展示。与 1 getSupportLanguageList(任务翻译语种、mls_languages + mls_user_conf)数据源与用途不同。

登录:本命令不在网关 NO_TOKEN_CMDS 中,须传有效 token(与其它需登录的 mlsUser 接口一致)。

查询条件:enable = 1。排序:sort_order 升序NULL 会排在 MySQL 默认顺序中,配置时请填具体序号)。

入参

参数 类型 必填 说明
token string 登录 token

出参

字段 类型 说明
flag int 100 成功
flagString string 提示信息
data array 语言行列表;无数据时为 []。每项仅含表字段:locale_codelocale_name

请求示例

{
  "token": "xxx"
}

返回示例

{
  "flag": 100,
  "flagString": "success",
  "data": [
    {
      "locale_code": "zh-CN",
      "locale_name": "简体中文"
    },
    {
      "locale_code": "en-US",
      "locale_name": "English"
    }
  ]
}

12.5.2.4 /mls/mlsUser/updateUserLocale - 更新用户界面语言码

【新增,更新时间:2026-05-09】已登录用户更新 apaas.mls_user.locale_code。入参语言码须在 mls_admin_ui_locale 中存在且 enable = 1。成功后调用 refreshMlsUserRedisSession,刷新当前 token 对应 Redis 会话,保证 getUserInfo 读到最新 locale_code

登录:须传 tokenuin 由网关在校验 token 后注入,客户端一般无需在 body 重复传 uin

入参

参数 类型 必填 说明
token string 登录 token
locale_code string getMlsI18nLocaleList 返回的某条 locale_code 一致

出参

flag 说明
100 flagString 一般为「更新成功」
110 参数错误(uin 无效或 locale_code 为空)、语言不支持(不在启用配置中)、或数据库更新失败

请求示例

{
  "token": "xxx",
  "locale_code": "zh-CN"
}

返回示例

{
  "flag": 100,
  "flagString": "更新成功"
}

12.5.3 /mls/mlsUser/getInviteRecordList - 邀请记录列表

【更新时间:2026-04-07】 分页查询当前用户邀请记录;列表项连表返回被邀请人基础信息;支持按状态、被邀请人、创建时间筛选。

说明:/mls/index网关在校验 token 后会自动把当前登录用户的uin写入请求参数,业务侧按邀请人 uin 过滤;客户端一般只需传token及下方筛选参数。

入参

参数 类型 必填 说明
token string 登录 token
page int 页码,默认 1
num int 每页条数,默认 15,最大 100
status int 发奖状态:0 待发奖,1 已发奖;不传或 -1 查全部
inviteeUin int 被邀请人 uin;大于 0 时仅查该被邀请人记录
createTimeStart int 创建时间下限(Unix 秒),大于 0 时生效
createTimeEnd int 创建时间上限(Unix 秒),大于 0 时生效;与 createTimeStart 同时传时,开始不能大于结束

排序规则:create_time倒序,id倒序(同一时间戳下分页稳定)。

返回示例

{
  "flag": 100,
  "flagString": "success",
  "data": [
    {
      "id": 1,
      "inviter_uin": 1001,
      "invitee_uin": 2001,
      "reward_points": 2000,
      "status": 1,
      "create_time": 1710000000,
      "update_time": 1710000000
      "invitee_username": "昵称或用户名",
      "invitee_avatar": "https://...",
      "invitee_company": ""
    }
  ],
  "total": 1
}

说明:invitee_usernameinvitee_avatarinvitee_company来自mls_user左连接;未返回手机号等敏感字段。若用户无对应行则上述字段为null


邀请功能 SQL 变更

邀请功能数据库变更脚本已提供在:

  • code/apaasTool/api/tool/mls_invite_schema.sql

包含:

  • mls_user_amount新增invite_reward_total
  • 新建mls_user_invite_record(含invitee_uin唯一索引,防止重复发奖)

12.5.4 /mls/mlsUser/getUserConf - 获取用户配置

【新增,更新时间:2026-04-08】 获取用户配置。返回结构统一:始终返回config(默认配置与用户配置合并结果)。

存储设计:mls_user_conf表每个uin一条记录,config字段为 JSON。接口返回为“默认配置 + 用户配置”的合并结果。用户配置的写入由管理后台维护,本服务仅提供读取。

入参

参数 类型 必填 说明
token string 登录后获得的 token;网关校验通过后注入当前用户 uin
type string 配置类型:languages/batch_review/duration_limit/all;默认all

出参(统一结构)

{
  "flag": 100,
  "flagString": "success",
  "data": {
    "uin": 1001,
    "type": "all",
    "config": {
      "languages": "basic",
      "batch_review": false,
      "duration_limit": 5
    }
  }
}

说明:

  • 不论type是否传入,data都统一返回config字段
  • type=all(或不传)时,data.type返回all
  • type传单项(如duration_limit)时,data.type返回该单项,但config仍返回全量配置
  • 默认值:languages=basicbatch_review=falseduration_limit=5
  • type传不支持值时返回参数错误
  • batch_review:为true时,管道回调在成片成功时会先以 待审核(results.status=4) 写入任务(详见附录 A);管理后台审核通过后再变为成功(2)并重算任务resStatus

12.6 /mls/tool/logout - 退出登录

【新增,更新时间:2026-03-23】 退出登录并删除 Redis 中 token 对应会话数据。

说明:路径为 /mls/mlsUser/... 且本章已列出的接口由 mlsUser.php 实现;12.6 logout 等为 mls.php,路径为 /mls/tool/...

入参

参数 类型 必填 说明
token string 当前登录 token

返回示例

{
  "flag": 100,
  "flagString": "退出成功"
}

12.6.1 /mls/tool/getUserInfo - 获取当前登录用户信息

【更新,更新时间:2026-07-24】从 Redis 读取当前token对应的用户会话信息并返回。

会话内容来自 mls_user 行(登录 / 换票 / 微信等签发时写入),已包含渠道归属字段 platform_codeplatform_user_key(普通用户一般为空),以及是否已设置密码字段 hasPassword

入参

参数 类型 必填 说明
token string 登录后获得的 token(即 subToken)

出参(data 主要字段)

字段 类型 说明
uin int 用户 uin
phone string|null 手机号;渠道/微信未绑定时可为空
username / realname / avatar / … string 资料字段
locale_code string 界面语言码
source string 注册来源,如 H5 / apaas / 渠道 code
platform_code string 渠道标识;非渠道用户为空字符串。非空表示渠道用户(创建任务等不强制绑手机)
platform_user_key string|null 渠道用户唯一键;须带 {platform_code}_ 前缀;非渠道用户为 null 或空
hasPassword boolean 是否已设置登录密码true 已设置,false 未设置。见下方兼容说明
Token string 当前会话 token
userId int 会话内与 uin 对齐

hasPassword 兼容说明(前端必读)

  • 本字段上线后新签发的登录态(手机号/验证码/密码、微信、渠道 SSO、apaas 换票等)都会带上 hasPassword
  • 上线前已登录、尚未重新登录的旧会话没有该字段undefined / 不存在)。
  • 前端判断「未设置密码」的约定:仅当 hasPassword 字段存在且值为 false 时,才视为未设置密码;字段缺失时不要引导设密,可等待用户重新登录或走会刷新会话的接口后再读。
  • 用户通过 §12.4 changePassword 首次设密成功后,当前会话会刷新为 hasPassword=true

伪代码示例:

const needSetPassword = Object.prototype.hasOwnProperty.call(userInfo, 'hasPassword')
  && userInfo.hasPassword === false;

未登录或 token 无效:

  • flag=200
  • flagString="您还未登录"

返回示例(成功 · 含渠道字段)

{
  "flag": 100,
  "flagString": "success",
  "data": {
    "uin": 12345,
    "phone": "13800138000",
    "wxUnionId": "xxxx",
    "wxMpOpenId": "xxxx",
    "wxMiniOpenId": "xxxx",
    "avatar": "https://xxx/avatar.jpg",
    "company": "xxx",
    "email": "xxx",
    "parentId": "01",
    "parentUin": 12345,
    "realname": "xxx",
    "username": "xxxx",
    "createTime": 1700000000,
    "locale_code": "zh-cn",
    "source": "partner_ady_gw",
    "platform_code": "partner_ady_gw",
    "platform_user_key": "partner_ady_gw_2088",
    "hasPassword": false,
    "Token": "当前 token",
    "userId": 12345
  }
}

前端若 platform_code 非空,可再调 §12.6.3 getPayEntryConfig(当前用户充值入口)或 §12.6.2 getChannelPlatformInfo(按 code 查渠道信息)判断是否跳转外部充值页。

返回示例(未登录)

{
  "flag": 200,
  "flagString": "您还未登录"
}

12.6.2 /mls/tool/getChannelPlatformInfo - 按 platform_code 查渠道基础信息

【新增,更新时间:2026-07-23】需登录。按渠道标识查询 mls_external_platform 基础信息(不含 app_secret),供前端判断是否跳转外部充值地址。结果走 Redis 缓存(命中约 300s;不存在约 60s 负缓存)。

§12.6.3 getPayEntryConfig 区别:本接口按入参 platform_code 查任意渠道配置;getPayEntryConfig 固定取当前登录用户归属渠道(内部同样走该缓存)。

入参

参数 类型 必填 说明
token string 登录 token
platform_code string 条件 渠道标识;也支持驼峰 platformCode。都不传时回退当前登录用户会话里的 platform_code

出参

字段 类型 说明
flag int 100 成功;110 参数错误 / 渠道不存在
data.platformCode string 渠道标识
data.platformName string 渠道名称
data.payRedirectUrl string 外部充值跳转地址;渠道停用时强制为空
data.status int 1 启用,0 停用
data.useExternalPay bool payRedirectUrl 非空则为 true,前端可据此跳转外部充值

请求示例

{
  "token": "xxx",
  "platform_code": "partner_ady_gw"
}

仅用登录用户归属(会话已有 platform_code):

{
  "token": "xxx"
}

返回示例

{
  "flag": 100,
  "flagString": "success",
  "data": {
    "platformCode": "partner_ady_gw",
    "platformName": "奥点云官网",
    "payRedirectUrl": "https://pay.example.com/recharge",
    "status": 1,
    "useExternalPay": true
  }
}

无外部充值(走本地):

{
  "flag": 100,
  "flagString": "success",
  "data": {
    "platformCode": "partner_a",
    "platformName": "渠道A",
    "payRedirectUrl": "",
    "status": 1,
    "useExternalPay": false
  }
}

前端建议

  1. getUserInfo / 换票结果取出 platform_code
  2. 非空则可调本接口或 §12.6.3 getPayEntryConfiguseExternalPay === true 时跳转 payRedirectUrl,否则走本地充值

12.6.3 /mls/tool/getPayEntryConfig - 当前用户充值入口配置

【补充文档,更新时间:2026-07-23】需登录。按当前登录用户mls_user 上的 platform_code 查询渠道充值入口:有外部跳转地址则走渠道充值,否则走本地充值。

渠道配置查询走与 §12.6.2 相同的 Redis 缓存(约 300s)。本接口不需要前端再传 platform_code

入参

参数 类型 必填 说明
token string 登录 token(网关校验后注入用户信息)

出参

字段 类型 说明
flag int 100 成功;110 未登录等
data.platformCode string 当前用户渠道标识;非渠道用户为空字符串
data.platformUserKey string 当前用户渠道用户键;无则为空
data.payRedirectUrl string 外部充值跳转地址;无渠道 / 渠道停用 / 未配置跳转时为空
data.useExternalPay bool payRedirectUrl 非空为 true,前端应跳转外部充值;否则走本地下单

请求示例

{
  "token": "xxx"
}

返回示例(外部充值)

{
  "flag": 100,
  "flagString": "success",
  "data": {
    "platformCode": "partner_ady_gw",
    "platformUserKey": "partner_ady_gw_2088",
    "payRedirectUrl": "https://pay.example.com/recharge",
    "useExternalPay": true
  }
}

返回示例(本地充值)

{
  "flag": 100,
  "flagString": "success",
  "data": {
    "platformCode": "",
    "platformUserKey": "",
    "payRedirectUrl": "",
    "useExternalPay": false
  }
}

与 getChannelPlatformInfo 怎么选

场景 建议接口
已登录,只关心「我该跳哪充值」 getPayEntryConfig(本接口)
已知某个 platform_code,要名称 / status 等基础信息 getChannelPlatformInfo

说明:本地下单不扣渠道积分;仅外部渠道充值回调(payType=3)扣渠道积分并进月对账单。


12.7 /mls/mlsUser/getWechatMpAuthUrl - 获取微信公众号授权链接

用于移动端 H5 进入微信 OAuth2 授权页。

入参

参数 类型 必填 说明
redirectUri string 微信授权回调地址;不传默认用环境变量MLS_WECHAT_MP_CALLBACK_URL
scope string snsapi_basesnsapi_userinfo,默认snsapi_userinfo
afterLoginUrl string 登录成功后跳转地址;若传,回调接口会 302 并追加subToken
inviteUin int 邀请人 uin,会写入 state,供回调自动注册发奖使用

说明:

  • redirectUriafterLoginUrl都会做域名校验:host 须属于DOMAIN或其子域,属于环境变量MLS_ALLOWED_REDIRECT_DOMAINS(逗号分隔根域白名单,同样允许子域名)。多前端域名(如weapp.yaomuai.commls.yaomuai.com)请配置例如MLS_ALLOWED_REDIRECT_DOMAINS=yaomuai.com

返回示例

{
  "flag": 100,
  "flagString": "success",
  "data": {
    "authUrl": "https://open.weixin.qq.com/connect/oauth2/authorize?...",
    "scope": "snsapi_userinfo"
  }
}

12.7.1 /mls/mlsUser/getWechatJsSdkConfig - 微信 JS-SDK 签名(分享等)

前端在微信内置浏览器内引入jssdk,调用wx.config前需向后端索取签名。本接口使用公众号 cgi-bin 的access_token换取jsapi_ticket并做 SHA1 签名(与网页 OAuth 的 access_token 不是同一类)。

入参

参数 类型 必填 说明
url string 当前页面完整 URL(不含#及哈希段;查询串需保留)。须与调用wx.config时所在页面 URL 一致,建议前端传location.href.split('#')[0]

域名校验:与getWechatMpAuthUrl相同——DOMAIN或其子域,或MLS_ALLOWED_REDIRECT_DOMAINS白名单根域(含子域)。

返回示例

{
  "flag": 100,
  "flagString": "success",
  "data": {
    "appId": "wx...",
    "timestamp": 1710000000,
    "nonceStr": "abc123...",
    "signature": "sha1_hex..."
  }
}

前端示例:wx.config({ appId, timestamp, nonceStr, signature, jsApiList: ['updateAppMessageShareData', 'updateTimelineShareData'] })(具体 API 以微信文档为准)。

说明:服务端会缓存jsapi_ticket(Redis),避免频繁请求微信接口。


12.8 /mls/mlsUser/wechatMpLoginByCode - 微信 code 登录

前端已拿到微信code后,直接调用本接口换取subToken。逻辑:微信已注册 => 直接登录;未注册 => 自动补全账号并登录(phone为空,不再生成虚拟手机号)。

入参

参数 类型 必填 说明
code string 微信 OAuth2 返回的 code
scope string snsapi_basesnsapi_userinfo,默认snsapi_userinfo
strictRegister int 1时仅允许已注册微信登录(未注册报错);默认0自动注册
inviteUin int 邀请人 uin(仅新用户自动注册时生效)

返回示例

{
  "flag": 100,
  "flagString": "登录成功",
  "data": {
    "subToken": "md5_token_string"
  }
}

表结构说明:若要支持微信用户不填手机号,建议将mls_user.phone调整为可空,并按业务需要调整唯一索引(避免空值约束冲突)。


12.9 /mls/mlsUser/wechatMpAuthCallback - 微信授权回调

微信公众号后台 OAuth 回调地址。可直接返回 JSON;若 state 中携带了afterLoginUrl,会自动 302 跳转并附带subToken

入参

参数 类型 必填 说明
code string 微信回调 code
state string getWechatMpAuthUrl 返回的 state
scope string 默认snsapi_userinfo

附录 B:NO_TOKEN_CMDS 免登录接口与本文档对照

以下与网关 code/apaasTool/mls/index.phpNO_TOKEN_CMDS 逐项对齐。说明:

  • 免登录指网关不强制校验 token;部分接口仍可根据业务在请求体传 token(如 shareMlsWorks 带 token 可记录分享用户)。
Tag(server 第二段) 典型路径 文档位置 备注
getToken /mls/tool/getToken 未成章 当前仓库 tool/mls.php 未见 getToken 方法,若线上仍配置则可能返回「接口不存在」
checkToken /mls/tool/checkToken §12.0 校验 MLS 会话;apaas 前缀换票;sourceFrom=ady 走 ADY 域名与新 uin 注册
login /mls/tool/login 12
wechatPayNotify /mls/tool/wechatPayNotify 支付完成回调 微信服务器回调,免登录
alipayPayNotify /mls/tool/alipayPayNotify 支付完成回调 支付宝异步通知,免登录
generateCaptcha /mls/mlsUser/generateCaptcha 12.1
sendSmsCode /mls/mlsUser/sendSmsCode 12.2
register /mls/mlsUser/register 12.3
resetPassword /mls/mlsUser/resetPassword 12.5
getWechatMpAuthUrl /mls/mlsUser/getWechatMpAuthUrl 12.7
getWechatJsSdkConfig /mls/mlsUser/getWechatJsSdkConfig 12.7.1
wechatMpLoginByCode /mls/mlsUser/wechatMpLoginByCode 12.8
wechatMpAuthCallback /mls/mlsUser/wechatMpAuthCallback 12.9
getWorksFeed /mls/tool/getWorksFeed 未成章 首页公开作品流;可选带 token 以返回 isLiked
shareMlsWorks /mls/tool/shareMlsWorks 未成章 分享统计;可不传 token(游客 userId=0),见 index.phpshareMlsWorks 的特殊处理
reportMlsWorksStat /mls/tool/reportMlsWorksStat 未成章 作品统计上报;可不传 token
dmsNotifyUploadDvr /mls/tool/dmsNotifyUploadDvr §19.5 DMS 回调,免登录
dmsNotifyMtsJobs /mls/tool/dmsNotifyMtsJobs §19.5 DMS 转码进度回调
dmsNotifyMtsUploadJobs /mls/tool/dmsNotifyMtsUploadJobs §19.5 DMS 转码上传进度回调
dmsNotifyMssPull /mls/tool/dmsNotifyMssPull §19.5 DMS 网络上传 PULL 回调
adminRetryMlsVideoPreprocess /mls/tool/adminRetryMlsVideoPreprocess §19.6 管理后台重试预处理;网关免 token,业务层校验 internal_key
runMlsVideoPreprocessCompensation /mls/tool/runMlsVideoPreprocessCompensation §19.6 补偿 worker;网关免 token,业务层校验 internal_key
adminRetryMlsTask /mls/tool/adminRetryMlsTask §6 管理后台 AI 任务重试;网关免 token,业务层校验 internal_key

已下线(2026-06-12,临时 MLS 管理页)getMlsTaskListapproveMlsResultReviewgetMlsUserConfsetMlsUserConfgetMlsAccessForUin。对应能力改由管理后台或其它服务提供;网关 NO_TOKEN_CMDS 与业务实现均已移除。


附录 A:OpenTool mls/updateMlsResult(管道结果回调,签名校验)

本接口走openTool网关(请求头X-AccessIdX-TimeStampX-SignatureX-SignatureNonce等,与项目内其他 openTool 接口一致),不是/mls/index.php的免登录路由。本文档不展开 openTool 鉴权细节;以下为业务字段与状态约定。

作用

多语言处理服务向业务侧回写某任务的各语种处理结果,合并写入apaas.mls_list.results,并可能触发积分扣费。

请求体(JSON)

参数 类型 必填 说明
job_id string 任务实例 ID(兼容 jobId),按此定位任务
episodeId int 集 IDdrama_video_id),不参与任务定位
results array 或 string 各语种结果列表;可为 JSON 字符串。每项含languagestatusuptimeurl
executedStages array 或 string 有此键即走阶段计费(可空数组)。项建议含 stageIdstatusexecutionId、可选 languagestatus=success 才扣;未知 stageId 跳过。未传该键走旧套餐扣费

管道上报的status语义:0 待处理,1 处理中,2 成功,3 失败。

executedStages 单项:

字段 类型 说明
stageId string 阶段编码,对应 mls_stage.stage_id
status string success 计费;大小写不敏感
executionId string 幂等键,必填才记账
language string 按语种阶段可选;写入流水便于对账

非全流程回调见 OpenTool updateMlsJobStatus(字段同样支持 executedStages)。

存储侧扩展:status = 4(待审核)

当任务所属用户的mls_user_confbatch_review为 true(读取结果带 Redis 缓存,约 5 分钟;管理后台修改配置并保存后会清除该缓存)时:

  • 对本次回调中「新成功」的语种(该语种合并前在库中状态不是 2):入库时status记为 4(待审核),而不是 2。
  • 积分:带 executedStages 时按阶段 + 成片存储扣;未带该键时仍按管道上报成功(2) 且「此前非成功」的旧套餐公式统计,与是否写入 4 无关。
  • 若本请求中发生了上述 2→4 降级,则本次更新不修改mls_list.resStatus(保持回调前任务总状态);其余情况按合并后的results重算resStatus
  • resStatus与单条status的汇总规则中,4 视为未结案(不视为已完成),直至该语种被置为 2(例如管理后台审核通过)。

返回示例

{
  "flag": 100,
  "flagString": "success",
  "data": {
    "resStatus": 1,
    "deduct": true
  }
}
字段 说明
data.resStatus 写入后的任务总状态(若本次仅做待审核降级则可能仍为原值)
data.deduct 本次是否成功完成扣费流水

支付相关(商品 / 订单 / 微信与支付宝)

支付能力依赖系统环境变量配置,部署时在 Web 服务器或 PHP 环境中设置以下变量。

环境变量说明

  • 微信支付:使用 Pay SDK(pay-php-sdk)V2 接口(unifiedorder)。
  • 支付宝:默认电脑网站支付(alipay.trade.page.pay,返回form_html);显式alipayScene=scan时用当面付 precreate(EasySDK)。异步通知验签用 EasySDK。默认走正式网关openapi.alipay.com;仅当MLS_ALIPAY_SANDBOX=1时才用沙箱。

微信支付

变量名 说明
MLS_WECHAT_APPID 公众号 AppID(JSAPI 与 NATIVE 共用)
MLS_WECHAT_MCH_ID 微信商户号
MLS_WECHAT_MCH_KEY 商户 API 密钥(32 位,在微信商户平台「API 安全」中设置)

微信公众号授权登录(H5)

变量名 说明
MLS_WECHAT_MP_APPID 公众号 AppID(未配置时回退使用MLS_WECHAT_APPID
MLS_WECHAT_MP_SECRET 公众号 AppSecret(未配置时回退使用MLS_WECHAT_APPSECRET
MLS_WECHAT_MP_CALLBACK_URL OAuth2 回调地址(可选,不传则默认/mls/mlsUser/wechatMpAuthCallback
MLS_ALLOWED_REDIRECT_DOMAINS 前端跳转/JS-SDK 签名域名白名单,逗号分隔根域。例:yaomuai.com(允许weapp.yaomuai.commls.yaomuai.com

短信前置验证码(sendSmsCode 使用 captchaId 时)

变量名 说明
MLS_CAPTCHA_VERIFY_BASE 验证码服务端根地址(无末尾斜杠),例如https://message.guangdianyun.tv。代码仅读取$_SERVER['MLS_CAPTCHA_VERIFY_BASE'];与 服务端校验GET /v1/message/Captcha/query所在域名一致;仅走图形码时可不配

说明:当前代码未引入专门“微信登录 SDK”,采用微信官方 OAuth2 接口(open.weixin.qq.comapi.weixin.qq.com)并在项目内做了轻量封装。

支付宝

优先支持开放平台 公钥证书模式(与其它业务共用同一应用时推荐);未配证书时回退密钥模式。

变量名 说明
MLS_ALIPAY_APP_ID 支付宝应用 AppID
MLS_ALIPAY_PRIVATE_KEY 应用私钥 PEM 内容或文件路径(开发助手本地生成,支付宝不保存;与证书成对)
MLS_ALIPAY_CERT_DIR 可选。不配时默认使用项目内library/common/pay/alipayCert(需含appCertPublicKey_*.crtalipayCertPublicKey_RSA2.crtalipayRootCert.crt
MLS_ALIPAY_APP_CERT_PATH 可选,应用公钥证书完整路径(覆盖目录自动发现)
MLS_ALIPAY_PUBLIC_CERT_PATH 可选,支付宝公钥证书完整路径
MLS_ALIPAY_ROOT_CERT_PATH 可选,支付宝根证书完整路径
MLS_ALIPAY_PUBLIC_KEY 仅密钥模式需要:支付宝公钥字符串;证书模式下可不配
MLS_ALIPAY_RETURN_URL 可选,电脑网站支付默认同步回跳地址(入参returnUrl优先)
MLS_ALIPAY_SANDBOX 可选,仅1/true时走沙箱;默认正式
MLS_ALIPAY_DEBUG_LOG 可选,非空时打印支付宝异常到 error_log

证书模式最小配置示例(三件套已放在library/common/pay/alipayCert时):

MLS_ALIPAY_APP_ID=2021001159681017
MLS_ALIPAY_PRIVATE_KEY=/path/to/应用私钥RSA2048.txt
# 证书目录可不配,默认读 library/common/pay/alipayCert

成功走证书模式时,下单返回里signModecertform_html中会带app_cert_snalipay_root_cert_sn

支付宝报invalid-signature时:

  1. 确认开放平台是「公钥证书」且代码已配证书三件套 + 同一把应用私钥。
  2. 应用私钥必须与appCertPublicKey_*.crt成对(用开发助手生成的那把,不要用错环境/错应用的私钥)。
  3. 证书模式下不要再依赖MLS_ALIPAY_PUBLIC_KEY冒充验签。
  4. 商品名称(subject)中不要含反斜杠\、双引号;代码已过滤。

数据库

  • 支付表mls_pay_data需有字段points(购买积分,下单时写入,回调时从该字段读积分更新到mls_user_amount)。若尚未添加可执行:
ALTER TABLE mls_pay_data ADD COLUMN points int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '购买积分' AFTER amount;
  • 下单与支付仅使用mls_pay_data,不再依赖mls_order表;若业务无需独立订单表,可不再使用或删除mls_order

13. /mls/tool/getMlsGoodsList - 获取商品列表

获取已启用的 MLS 商品列表(用于下单前展示)。

入参

需登录,可无额外参数(传token即可)。

出参

字段 类型 说明
data.list array 商品数组,每项含goodsIdgoodsNameamount(元)、pointspriceisPresetenable

14. /mls/tool/createMlsOrderAndPay - 下单并获取支付凭证(推荐)

一个接口完成下单 + 获取支付二维码/链接,前端只需请求一次即可拿到订单信息与支付数据。

入参

参数 类型 必填 说明
token string 登录 token
goodsId int 商品 ID(来自 getMlsGoodsList)
payType int 1 微信,2 支付宝
amount int 自定义商品必填 金额(元,1–3000 整数)
clientType string pc默认;微信内传wechat走 JSAPI
openid string JSAPI 必填 用户 openid
returnUrl string 支付宝支付完成同步回跳;不传则用环境变量MLS_ALIPAY_RETURN_URL(仅 page 有效)
alipayScene string 支付宝 PC:默认page返回form_html网页跳转;传scan返回qr_code扫码(需当面付/订单码)

出参

返回为 订单信息 + 支付数据 合并:payDataIdoutTradeNoamountpayTypegoodsNamepointsexistingOrder(若有),以及按支付方式:

  • 微信 PC:code_url→ 用二维码库生成二维码,用户微信扫码支付
  • 微信内 JSAPI:appIdtimeStampnonceStrpackagesignTypepaySign→ 调微信 JSSDK 调起支付
  • 支付宝 PC(默认 page):form_html→ 见下文「支付宝电脑网站支付:前端对接」;另回显returnUrlalipayScenesignModecert/key
  • 支付宝扫码:传alipayScene=scan时返回qr_code(需当面付/订单码产品)

支付宝电脑网站支付:前端对接(推荐)

当前 PC 充值页应对齐「电脑网站支付」:用户选支付宝后跳转支付宝收银台(不是页内二维码;页内码需当面付/订单码)。

推荐流程

  1. 拉商品:POST /mls/tool/getMlsGoodsList(需登录)
  2. 用户选商品 + 选支付宝
  3. POST /mls/tool/createMlsOrderAndPay
{
  "Tag": "createMlsOrderAndPay",
  "token": "<登录token>",
  "goodsId": 6,
  "payType": 2,
  "amount": 1,
  "returnUrl": "https://你的前端域名/#/recharge?from=alipay"
}

说明:payType=2alipayScene可省略(默认page);自定义商品才传amountreturnUrl建议传充值页(须落在DOMAIN/MLS_ALLOWED_REDIRECT_DOMAINS)。

  1. flag===100 时取data.form_html,在浏览器中提交跳转:
// axios/fetch 已 JSON 解析后的对象,直接用字符串,不要二次 stringify
function goAlipayPagePay(formHtml) {
  if (!formHtml) throw new Error('缺少 form_html');
  // 方式 A:当前页跳转(简单)
  const div = document.createElement('div');
  div.style.display = 'none';
  div.innerHTML = formHtml;
  document.body.appendChild(div);
  const form = div.querySelector('#alipaysubmit') || div.querySelector('form');
  if (!form) throw new Error('form_html 无效');
  form.submit();

  // 方式 B:新窗口(注意弹窗拦截,需在用户点击事件里同步打开)
  // const w = window.open('', '_blank');
  // w.document.write(formHtml);
  // w.document.close();
}
  1. 支付结果展示(重要):
    • 入账只认异步回调/mls/tool/alipayPayNotify,不要用returnUrl同步回跳参数当作已支付。
    • 用户从支付宝回到returnUrl后:订阅 DMS messages/mls_pay_success_{uin},或轮询getMlsAmount刷新余额;可提示「支付处理中」。
    • 成功后关闭支付中态、刷新积分展示。

UI 建议(相对微信扫码)

微信 支付宝(电脑网站支付)
右栏展示二维码 右栏「去支付宝支付」按钮,点击后跳转
扫码后等 DMS 回站后等 DMS / 刷余额

不要对支付宝默认走画qr_code(除非已开通当面付/订单码且传alipayScene=scan)。

联调注意

  • 接口返回的form_html是 HTML 字符串;从网络面板复制时若带\",须先JSON.parse还原(可用项目内mls/alipaytest.html粘贴整段 JSON 自动还原)。
  • 成功配置证书时data.signMode应为certform_html内应含app_cert_sn
  • 改密钥/证书后须重新下单拿新form_html,旧表单会验签失败。

15. /mls/tool/createMlsOrder - 下单

仅创建支付记录(mls_pay_data,含points)。同账户同商品 2 小时内未支付则复用该支付单。返回payDataIdoutTradeNo等,用于后续调 submitMlsPay。

入参

参数 类型 必填 说明
token string 登录 token
goodsId int 商品 ID(来自 getMlsGoodsList)
payType int 1 微信,2 支付宝
amount int 自定义商品必填 金额(元,1–3000 整数)

出参

字段 类型 说明
data.payDataId int 支付单主键,提交支付时传此值或 outTradeNo
data.outTradeNo string 商户订单号
data.amount int 金额(分)
data.payType int 1 微信,2 支付宝
data.goodsName string 商品名称
data.points int 购买积分

16. /mls/tool/submitMlsPay - 提交支付

根据下单结果调起支付:PC 端微信返回code_url;支付宝默认返回form_html(电脑网站支付);传alipayScene=scan时返回qr_code

入参

参数 类型 必填 说明
token string 登录 token
outTradeNo string 与 payDataId 二选一 商户订单号(createMlsOrder 返回)
payDataId int 与 outTradeNo 二选一 支付单主键(createMlsOrder 返回)
payType int 1 微信,2 支付宝
clientType string pc默认;微信内请传wechat走 JSAPI
openid string JSAPI 必填 用户 openid(微信内授权获得)
returnUrl string 支付宝网页支付完成回跳;不传则用MLS_ALIPAY_RETURN_URL
alipayScene string 默认pageform_htmlscanqr_code

出参

按支付方式返回:

  • 微信 NATIVE(PC):data.code_url→ 生成二维码,用户微信扫码
  • 微信 JSAPI(微信内):dataappIdtimeStampnonceStrpackagesignTypepaySign,用于前端调起微信支付
  • 支付宝网页(默认):data.form_html→ 新窗口写入并提交
  • 支付宝扫码:传alipayScene=scan时返回data.qr_code

支付完成回调(免登录)

由微信/支付宝服务器 POST 调用,无需 token。网关已将wechatPayNotifyalipayPayNotify列入免登录。

  • 微信异步通知:POST /mls/tool/wechatPayNotify
  • 支付宝异步通知:POST /mls/tool/alipayPayNotify(下单时写入的notify_url

支付宝回调处理要点(服务端已实现)

  1. EasySDKverifyNotify验签(证书模式从支付宝公钥证书取公钥)
  2. TRADE_SUCCESS / TRADE_FINISHED入账;其它状态回success避免无效重试
  3. 校验total_amount与本地mls_pay_data.amount(分)一致
  4. 已支付订单幂等回success;验签/金额失败回fail(支付宝会重试)
  5. handlePaySuccessstatus=0→1乐观锁防并发重复加积分,写流水(trade_type=1存入)、DMS、财务收款

验签通过且支付成功时系统会:

  1. 更新mls_pay_datastatus=1orderId=支付宝trade_nopayTime
  2. 增加mls_user_amount并写入mls_user_amount_runtrade_type=1,说明「积分充值」)
  3. DMS 推送messages/mls_pay_success_{uin}
  4. 同步mls_finance_receiptsource=alipay

前端接入域名:wss://mqttdms.{DOMAIN}:8300/mqtt,如:wss://mqttdms.jstest.aodianyun.cn:8300/mqtt

DMS 推送内容

项目 说明
接口 messages/mls_pay_success_{uin}(uin 为支付用户)
请求体 body JSON 字符串,内容为:
{
  "uin": 123,
  "points": 1000,
  "tradeDesc": "积分充值",
  "payType": 2,
  "payDataId": 456,
  "status": 1,
  "message": "success"
}
字段 类型 说明
uin int 用户 uin
points int 本次到账积分
tradeDesc string 交易说明,如「积分充值」
payType int 1 微信,2 支付宝
payDataId int 支付单主键
status int 1 成功
message string success

17. /mls/tool/collectOperationLog - 上报操作日志

已登录用户上报前端操作行为;网关 mls/index.php 在校验 token 后转发。成功后将异步 POST 至 OPERATION_HOST 下的采集服务(见 code/apaasTool/mls/operation_log.inc.php)。

入参

参数 类型 必填 说明
token string 登录 token
moduleName string 模块名
actionName string 操作名
requestData string 请求详情,建议为 JSON 字符串(由前端自定义结构)
apiPath string 接口路径;不传时网关默认 /api/mls/ + 当前路由

出参

字段 类型 说明
flag int 100 成功,110 参数错误
flagString string 提示信息

请求示例

{
  "token": "xxx",
  "moduleName": "任务管理",
  "actionName": "下载",
  "requestData": "{\\"type\\":\\"原片\\"}"
}

返回示例

{
  "flag": 100,
  "flagString": "success"
}

18. 剧集管理(drama)

剧集用于批量管理多集视频:创建时不选任务类型,在首次 submitMlsDramaTasks 时选择并写入剧集;后续新增视频再提交时自动使用剧集已存的 mode_types(前端可根据 mode_types 是否为空 / mode_types_configured 控制是否只读)。

【2026-06-24 变更摘要】

  • 新增剧集 CRUD、视频上传、批量提交接口。
  • 创建剧集仅需 namemode_types / languages首次提交任务时传入并持久化到剧集。
  • mode_types 支持逗号分隔多类型(full_pipeline 不可与其他类型共存)。
  • 再次提交:以剧集已存 mode_typeslanguages 为准做增量;若请求中传入与库不一致的类型/语种则拒绝。
  • submitMlsDramaTasks 事务内全成功或全失败;删除视频(deleteMlsDramaVideo)时会级联软删该集下全部任务,存在处理中(resStatus=1)任务时拒绝删除。

【2026-07-07 变更摘要】视频预处理

  • addMlsDramaVideo 上传后若源片超规格则自动启动预处理(见 §19)。
  • videos 列表返回 origin_readypreprocess_statuspreprocess_fail_msg
  • 批量提交时允许预处理中的视频先创建任务(origin_ready=0);预处理完成后自动同步源地址。
  • 某视频 preprocess_status=3submitMlsDramaTasks 拒绝并提示调用 §6.1 retryMlsVideoPreprocess

18.1 /mls/tool/addMlsDrama - 创建剧集

参数 类型 必填 说明
token string 登录 token
name string 剧集名称
remark string 备注,最长 500 字

返回 data.dramaIdmode_typeslanguages 初始为空。

18.2 /mls/tool/updateMlsDrama - 更新剧集

参数 类型 必填 说明
dramaId int 剧集 ID
name string 剧集名称
remark string 备注,最长 500 字;不传则保持原值

支持修改名称与备注;任务类型请在 submitMlsDramaTasks 首次提交时确定。

18.3 /mls/tool/getMlsDramaList - 剧集列表

参数 类型 必填 说明
page int 页码,默认 1
num int 每页条数,默认 15
name string 名称模糊搜索
dramaId int 剧集 ID
source_type string 来源过滤:batch(默认,仅批量剧集)、single(单任务自动创建)、all(全部)

返回 data.list(含 video_countsource_typeremark)、data.count

18.4 /mls/tool/getMlsDramaDetail - 剧集详情

参数 类型 必填 说明
dramaId int 剧集 ID

返回剧集信息及 videos 列表(每条含 taskstask_count)。

字段 说明
mode_types 首次提交成功后写入;空表示尚未选择任务类型
mode_types_configured mode_types 非空时为 true,前端可据此禁用类型编辑
mode_type_list mode_types 解析后的数组
languages full_pipeline 时首次提交写入的输出语种
source_type batch 批量剧集;single 单任务 addMlsTask 自动创建的剧集容器
remark 备注

videos[] 单条视频字段补充

字段 类型 说明
origin_ready int 0 预处理中,1 源片可用
preprocess_status int 0 无预处理;1 处理中;2 成功;3 失败
preprocess_fail_msg string 预处理失败原因;成功或未触发时为空
source_type string batch 批量上传;single 单任务自动创建
list_type string 列表类型,默认 custom;常见值如 custom / custom_workflow / full_pipeline
task_count int 下属任务数
tasks array 下属任务完整列表
jobResource object 项目级扁平资源;最新对象 + versions[](与 tasks[].jobResource 相同)

tasks[] 任务字段getMlsDramaDetail / getMlsEpisodeList / getMlsEpisodeDetail 均返回):

字段 类型 说明
episodeId int 任务ID(mls_list.episodeId
dramaId int 所属剧 ID
drama_video_id int 所属项目ID
uin int 所属用户 UIN
title string 任务标题
origin_url string 源片地址(已转 https)
thumbnail string 缩略图(已转 https)
duration int 时长(秒)
languages string 输出语种,逗号分隔
resStatus int 任务状态:0待处理 1处理中 2部分完成 3全部完成 4全部失败
origin_ready int 源片是否就绪:0否 1是
is_pay int 是否已结算扣费:0否 1是
mode_type string 任务类型
mode_type_index string 任务类型索引
job_id string JOB_ID(32 位 hex,重试后会变更)
source_type string batch / single
param object 任务级环境变量(见附录 C)
job_param object 结构化业务参数(见附录 D)
results array 各语种输出结果,每项含 languagestatus(0~4)、urluptime 等;url 已转 https
jobResource object 最新对象 + versions[]:外层可直接读 id/url;versions 含全部历史(按 version_seq 降序);数据按项目聚合
create_time int 创建时间
uptime int 更新时间

18.4.1 /mls/tool/getMlsEpisodeList - 集(视频)列表

参数 类型 必填 说明
page int 页码,默认 1
num int 每页条数,默认 15
title string 集标题模糊搜索
dramaId int 剧集 ID
drama_video_id int 集 ID
source_type string batch / single / all(默认 all
list_type string 集列表类型精确过滤;不传返回全部;常见值如 custom / custom_workflow / full_pipeline

返回 data.list(含 taskstask_countdrama_namelist_type)、data.counttasks[] 字段见 §18.4 tasks[] 任务字段

18.4.2 /mls/tool/getMlsEpisodeDetail - 集详情

参数 类型 必填 说明
drama_video_id int 集 ID(mls_drama_video.id

返回集信息(含 list_type)及完整 tasks[](字段见 §18.4 tasks[] 任务字段)。

18.4.3 /mls/tool/updateMlsEpisode - 更新集名称

参数 类型 必填 说明
drama_video_id int 集 ID
title string 新标题

18.5 /mls/tool/addMlsDramaVideo - 上传视频到剧集

参数 类型 必填 说明
dramaId int 剧集 ID
title string 集标题
origin_url string 上传完成后的源视频地址
sort int 排序,默认 0
list_type string 列表类型,默认 custom^[a-zA-Z0-9_]+$,最长 32

服务端会查询媒资信息并判定是否需预处理(§19)。需预处理时写入 origin_ready=0preprocess_status=1 并异步启动流水线;不需预处理时 origin_ready=1。预处理提交失败返回 flag=110preprocess_status=3。成功返回集信息(含 list_type)。

【2026-08-18 变更】有 origin_url 入库成功后按 source_upload 扣一次(max(duration,30)×单价,幂等键按集 ID)。额度不足返回 flag=110额度不足,不允许上传源视频)。无源片占位不扣。

18.6 /mls/tool/deleteMlsDramaVideo - 删除集(视频)

参数 类型 必填 说明
id int 集 ID(mls_drama_video.id

规则:若存在 处理中resStatus=1)任务,返回 110;否则级联软删该集下全部任务后删除集。

18.7 /mls/tool/submitMlsDramaTasks - 批量提交任务

参数 类型 必填 说明
dramaId int 剧集 ID
mode_types string 条件 首次提交必填,逗号分隔;再次提交可不传(以剧集已存为准),传入且与库不一致则拒绝
languages string 条件 首次提交且含 full_pipeline 时必填;再次提交以库为准
param object 本批创建的任务共用同一套环境变量;省略或 {} 表示无附加变量(规则见 附录 C
job_param object 本批创建的任务共用同一套业务参数;省略或 {} 表示无(规则见 附录 D
stages array 可选;本批各任务共用。规则同 addMlsTask

首次提交(剧集 mode_types 为空):使用入参 mode_types / languages 创建任务,成功后写入剧集。

再次提交(剧集 mode_types 非空):使用剧集已存配置,对尚未提交的视频 × 各类型做增量;请求体中的类型/语种若与库不一致返回 110。

若任一下属视频 preprocess_status=3,整批返回 110:视频「xxx」预处理失败,请重试预处理或删除后重新上传

额度不足或任一步失败则整批回滚。

请求示例(带 param):

{
  "token": "xxx",
  "dramaId": 1001,
  "mode_types": "audio_separate,subtitle_erase_dialog",
  "param": {
    "CONSOLE_XXX": "1"
  }
}

返回示例:

{
  "flag": 100,
  "flagString": "success",
  "data": {
    "created": [
      {"videoId": 1, "videoTitle": "第1集", "mode_type": "audio_separate", "episodeId": 101, "job_id": "..."}
    ],
    "created_count": 1,
    "mode_types": "audio_separate,subtitle_erase_dialog",
    "languages": "",
    "first_submit": true
  }
}

18.8 /mls/tool/deleteMlsDrama - 删除剧集

软删剧集及下属视频;若存在活跃关联任务则拒绝。


19. 视频预处理(转码 + 网络上传)

用户上传的源视频地址记为 A。若不符合 AI 处理规格,后台异步执行:

A(用户上传)→ 转码产出 B → submitJobs PULL → 入库完成 C → 删除 A

B 为中间转码文件,C 为写入业务表的最终 origin_url;B 由媒资侧随 A 一并清理。

19.1 触发条件(满足任一即预处理)

规则 说明
分辨率超 1080P (width > 1920 || height > 1920) || (width > 1080 && height > 1080)
格式不在白名单 mp4,mov,mkv,avi,webm,flv,m4v(小写,从 URL 扩展名解析)
帧率 > 30 videoAvgFrameRate 可解析且 > 30;缺失则跳过
码率 > 10Mbps 优先 bitrate 字段;否则用 size×8/duration 估算

判定依赖 MSS getUserUploadDvr 返回的媒资信息。

19.2 启动时机

场景 接口 说明
剧集批量 addMlsDramaVideo 视频入库后立即启动(推荐)
单条任务 addMlsTask 创建任务时若需预处理则启动
批量提交 submitMlsDramaTasks 不启动预处理;可提前提交任务,origin_ready=0 等待

同一视频(drama_video)只挂一条活跃预处理 job;单任务无剧集视频时 ref 为 task + episodeId

19.3 状态字段

mls_list.origin_ready

含义
0 源片预处理中,OpenTool 不拉取
1 源片就绪,可进入 AI 管道

mls_drama_video

字段 含义
origin_ready 0/1 同任务层
preprocess_status 0 未触发预处理
preprocess_status 1 预处理中
preprocess_status 2 预处理成功
preprocess_status 3 预处理失败
preprocess_fail_msg string 失败原因

mls_video_preprocess.status(内部任务表,运维排查用)

含义
0 待转码
1 转码中
2 转码完成,待/进行中 PULL
3 PULL 上传中
4 完成
5 失败

19.4 失败与重试

  • 预处理失败:关联任务 resStatus=4origin_ready=0;剧集视频 preprocess_status=3
  • 重试接口:§6.1 retryMlsVideoPreprocess;或在 §6 retryMlsTask 时自动连带。
  • AI 管道失败(源片已就绪)仅用 retryMlsTask,不会重复转码。

19.5 DMS 回调(运维)

用户注册时初始化 DMS 并注册以下免登录回调(网关 NO_TOKEN_CMDS):

topic 接口 Tag
sys/notify/upload_dvr dmsNotifyUploadDvr
sys/notify/mts_jobs dmsNotifyMtsJobs
sys/notify/mts_upload_jobs dmsNotifyMtsUploadJobs
sys/notify/mss_pull dmsNotifyMssPull

老用户需执行 initMlsUserDmsBatch(内网/运维,MLS_ALLOW_DMS_BATCH_INIT 环境变量控制)。详见 code/apaasTool/scripts/mls_init_user_dms.md

数据库迁移脚本:code/apaasTool/sql/mls_video_preprocess.sql

19.6 涉及接口一览

接口 说明
addMlsDramaVideo 上传后自动启动预处理
addMlsTask 单任务创建时启动预处理
submitMlsDramaTasks 兼容预处理中提交;拦截 preprocess_status=3
getMlsDramaDetail 返回视频预处理状态
getUserMlsList / getMlsDetail 返回 origin_ready
retryMlsVideoPreprocess 预处理失败重试
retryMlsTask 可连带预处理重试
adminRetryMlsVideoPreprocess 管理后台重试(需 internal_key + MLS_INTERNAL_API_KEY
runMlsVideoPreprocessCompensation 补偿 worker:轮询卡住 PULL / 补 submit(内网 key)

管理后台 Go 服务通过 HTTP 调用上述两个内网接口;补偿也可由 cron 定时 POST /mls/tool/runMlsVideoPreprocessCompensation


附录 C:任务级环境变量 param

param任务级环境变量:创建任务时由前端传入,持久化在 mls_list.param;处理节点通过 OpenTool getUserMlsTaskList 拉取待处理任务时拿到该对象,并作为各阶段 Docker 容器的 -e KEY=VALUE 环境变量。无特殊配置时不传或传 {} 即可(与老任务兼容)。

【2026-08-18】CONSOLE_SUBTITLE_TIMESTAMP_CHECK 仅对 无 stages 的 legacy 任务 计入加价;stages 任务改为执行 subtitle_calibration 时按价目扣费。该键仍可下发给 AI。

字段定义

属性 说明
字段名 param
类型 JSON 对象(键值对),接口返回时亦为 object,不是 JSON 字符串
必填
默认值 {}
作用域 单条任务(episodeId);重试时沿用创建时写入的值

值类型

  • 支持:stringnumberboolean、嵌套 object / array
  • 嵌套值按 JSON 原样入库与返回;处理节点注入 Docker -e KEY=VALUE 时需将非标量值再序列化为 JSON 字符串

键名规则

  • 须符合环境变量命名:以字母或下划线开头,仅含字母、数字、下划线
  • 不符合规则的键:服务端静默丢弃(不报错)
  • 以下保留键会被静默丢弃(由处理节点按负载注入):DEMUCS_URLLEMAS_TTS_URLCHATTRBOX_TTSTTS_URL_01TTS_URL_02AVPS_CACHE_PATH

涉及接口

接口 说明
addMlsTask 可选入参 param;省略或 {} 表示无附加变量
updateMlsTask 可选入参 param不传则不改,传 {} 清空
submitMlsDramaTasks 可选入参 param;本批创建的所有任务共用同一套值
getUserMlsList / getMlsDetail 返回 param 对象
retryMlsTask 不需传 param;预处理失败时可连带 retryMlsVideoPreprocess
retryMlsVideoPreprocess 预处理专用重试,见 §6.1

示例

{
  "CONSOLE_ADAPTIVE_TIME_LEN": false,
  "CONSOLE_XXX": "1",
  "CONSOLE_TAGS": ["a", "b"],
  "CONSOLE_META": { "k": 1 }
}

错误码

flag 场景
110 param 不是对象

数据库变更

上线前需在 mls_list 执行迁移脚本 code/apaasTool/sql/mls_list_param.sql(MySQL 5.7 下 TEXT 不能写 DEFAULT,脚本已分步处理):

ALTER TABLE `mls_list`
  ADD COLUMN `param` text NULL COMMENT '任务级环境变量 JSON 对象' AFTER `job_id`;

UPDATE `mls_list` SET `param` = '{}' WHERE `param` IS NULL OR TRIM(`param`) = '';

ALTER TABLE `mls_list`
  MODIFY COLUMN `param` text NOT NULL COMMENT '任务级环境变量 JSON 对象';

附录 D:结构化业务参数 job_param

job_param结构化业务参数:创建任务时由前端传入,持久化在 mls_list.job_param;处理节点通过 OpenTool getUserMlsTaskList 拉取任务时原样返回,交给交互阶段使用。不转换为 Docker 环境变量(与 附录 Cparam 分离)。

服务端仅校验为 JSON 对象,不对内部字段(如 eraseSourcesubtitleIDs)做业务校验;结构由前端与 AI 约定。

字段定义

属性 说明
字段名 job_param(仅此一名,无 camelCase 别名)
类型 JSON 对象;接口返回时亦为 object,不是 JSON 字符串
必填
默认值 {}
作用域 单条任务;重试沿用创建时写入的值

涉及接口

接口 说明
addMlsTask 可选入参 job_param;省略或 {} 表示无
updateMlsTask 可选入参 job_param不传则不改,传 {} 清空
submitMlsDramaTasks 可选入参 job_param;本批任务共用
getUserMlsList / getMlsDetail 返回 job_param 对象
OpenTool getUserMlsTaskList 下发 job_param 对象
retryMlsTask 不需传;沿用库内值

示例(TTS 候选生成)

{
  "subtitleIDs": {"12": "12", "18": "25"},
  "candidateCount": 4,
  "models": ["model-a", "model-b"]
}

错误码

flag 场景
110 job_param 不是 JSON 对象(或为纯数组)

数据库变更

上线前执行 code/apaasTool/sql/mls_list_job_param.sql

ALTER TABLE `mls_list`
  ADD COLUMN `job_param` text NULL COMMENT '结构化业务参数 JSON 对象,透传给交互阶段' AFTER `param`;

UPDATE `mls_list` SET `job_param` = '{}' WHERE `job_param` IS NULL OR TRIM(`job_param`) = '';

ALTER TABLE `mls_list`
  MODIFY COLUMN `job_param` text NOT NULL COMMENT '结构化业务参数 JSON 对象,透传给交互阶段';

外部平台打通

上线前执行:

  • sql/mls_external_platform.sql(首次)
  • sql/mls_channel_points_alter.sql(渠道积分账户 / 月对账单增量)
  • sql/mls_user_password_nullable.sql(password 允许为空,渠道/微信注册不再写默认密码)

给外部渠道的对接文档(可直接外发): mls_channel_open_api.md

内部摘要

  • SSO:POST /mls/mlsUser/ssoLogin(可不传手机号;不生成默认密码)
  • 充值回调:POST /mls/tool/externalPointsRecharge(只传积分;金额按渠道 settle_price 换算;不对外返回单价)
  • 可用积分:POST /mls/tool/getChannelAvailablePoints
  • 租户信息:POST /mls/tool/getChannelTenantInfo(按 platform_user_key 查用户基础信息与积分)
  • 手机号:platform_code 非空的渠道用户,创建任务/上传等不强制绑手机;微信/官网等仍强制
  • C 端入口:
    • POST /mls/tool/getPayEntryConfig§12.6.3,需登录,取当前用户归属渠道充值入口)
    • POST /mls/tool/getChannelPlatformInfo§12.6.2,需登录,按 platform_code 查渠道基础信息)
  • 本地下单不扣渠道积分,仅 payType=3 扣渠道积分并进月对账单
  • 登录会话:getUserInfo 等返回 platform_codeplatform_user_key(渠道用户非空)、hasPassword(是否已设密码;旧会话可能无此字段)
  • 对账单:每渠道每月一条,按天汇总刷新;仅统计 payType=3 成功单
最后编辑: 广电云技术部  文档更新时间: 2026-09-07 18:11   作者:广电云技术部