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

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

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

【2026-09-23 变更摘要】用户反馈补齐关单 / 追评回流

  • 新增 closeMyMlsFeedback:用户关闭本人工单(status=closed,写 close_time,清未读;可选 remark;不可重开)。
  • appendMlsFeedbackMessage:若当前为 replied,追评后自动回到 processing,便于后台重新跟进。

【2026-09-22 变更摘要】用户反馈 / 工单(C 端)

新增接口(路径均为 POST /mls/tool/...,须登录;uin 以网关注入的 parentUin / uin / userInfo.uin 为准,不信任前端伪造):

接口 用途
getMlsFeedbackCategoryTree 启用中的一二级分类树,供提交页选择
submitMlsFeedback 提交反馈;状态=pending;附件只传 URL 数组(≤10)
appendMlsFeedbackMessage 关单前追评(可多次;replied 追评后回 processing)
getMyMlsFeedbackList 我的反馈列表(含 userUnread)
getMyMlsFeedbackDetail 我的反馈详情(仅用户可见消息;打开后清未读)
closeMyMlsFeedback 用户关闭工单(不可重开)

submitMlsFeedback 主要入参:

字段 必填 说明
title 是 ≤200 字
content 是 ≤2000 字
feedbackSource 是 反馈来源(前端原样提交,如 h5/web)
categoryId 是 一级分类 ID
subCategoryId 否 二级分类 ID(须属于该一级)
images 否 string[] 截图 URL,最多 10
pageUrl / clientVersion / deviceInfo 否 环境信息
relatedType / relatedId 否 关联业务

closeMyMlsFeedback 入参: id(必填)、remark(可选,≤512)

状态: pending 待受理 → processing 处理中 → replied 已回复 → closed 已关闭(不可重开)。后台处理见 Admin 菜单「用户反馈」。

表结构:sql/mls_feedback.sql;菜单:sql/mls_feedback_manage_menu.sql。

【2026-09-22 变更摘要】OpenTool getUserMlsTaskList 下发 job_param 移除 sceneCode 字段

  • OpenTool getUserMlsTaskList 下发的 job_param 中不再包含 sceneCode 字段;服务端仍会读取该字段用于内部逻辑(如查询翻译提示词),但不再透传给 AI。
  • 前端无需改动;AI 侧若依赖 sceneCode,需改用其他方式获取场景信息。

【2026-09-22 变更摘要】新增翻译场景查询接口

  • 新增 getMlsTranslationSceneList(§1.3)返回启用的翻译场景列表(mls_translation_scene 表),供前端创建任务时选择场景。
  • 创建任务时可在 job_param 中传入 sceneCode 字段(如 "sceneCode": "news"),用于指定翻译场景。
  • 服务端在拉取任务时会读取该字段,查询对应的翻译提示词并注入到 job_param.stages.subtitle_translate.prompt 中。

【2026-09-14 变更摘要】P1~P3 项目摘要 / 资源按需接口(新增,不影响旧接口缺省)

新增接口(路径均为 POST /mls/tool/...,需 token;parentUin 与网关一致):

接口 用途
getProjectList 项目(集)列表摘要卡:capabilities / 聚合 status / languages[] 等;无 jobResource / 全量 tasks
getProjectTasks 项目下任务摘要(默认可排除内部任务)
getProjectDetail 项目详情摘要 + latestResources 最新指针(无版本历史)
getProjectResources 扁平资源分页(可选 fileType/language/latest_only)
getRenderHistory 成片版本历史分页(默认 fileType=video)
getManuscript 字幕稿:返回原/目标语 latest 字幕指针;sentences 暂空由前端解析文件
getSubtitleStyle 字幕样式 / param/job_param 小接口
getProjectStatus 批量轻量状态(按 drama_video_id 或 task_ids 轮询)
getProjectResourceGroups / getProjectResourceGroupFiles 分组资源别名(同 §5.4/§5.5);Files 支持可选 page/pageSize

旧列表接口的 exclude_internal / brief 仍可用,见上一节。前端可灰度切换到新接口,旧调用不受影响。

【2026-09-14 变更摘要】列表/详情可选瘦身(向后兼容)

  • 问题:getMlsEpisodeList 等接口按集挂载全量 tasks[],且每条 task 内嵌同一份含 versions[] 的项目级 jobResource,内部任务(如 TTS 抽卡)堆积时响应可达数十 MB。
  • 策略:现有接口加可选参数,缺省行为不变;推荐工作台/项目列表传 exclude_internal=1 + brief=1。
  • 入参(getUserMlsList / getMlsDetail / getMlsDramaDetail / getMlsEpisodeList / getMlsEpisodeDetail):
    • exclude_internal:1 时排除 mls_mode_type.is_internal=1 的任务(迁移见 sql/mls_mode_type_is_internal.sql;未标注时兜底 tts_candidate_generate / tts_candidate_apply)。
    • brief:1 时不回 jobResource / results(及 param / job_param / stages 置空),只保留标识与状态等摘要字段;强制等价于 with_resources=0。
    • with_resources:0 时仅不回 jobResource(仍回 results/param 等);不传默认回全量资源(兼容旧客户端)。
  • P0 建议:列表请求 { "exclude_internal": 1, "brief": 1 },可将 26MB 级响应降到约 1MB 量级。
  • 任务类型:mls_mode_type.is_internal;getMlsModeTypeList 返回 is_internal;管理后台可编辑。

【2026-09-08 变更摘要】候选分组资源独立表

  • 表:分组候选资源迁至 mls_resource_file_candidate;mls_resource_file 仅存扁平资源。
  • 接口不变:saveMlsCandidateFiles / getMlsResourceGroups / getMlsResourceGroupFiles 入参出参不变,仅存储表切换。
  • 软删 / 到期 / ResourceCleanWorker:任务删除时双表软删;物理清理扫描扁平表 + 候选表(按表名+id 回写状态,避免 id 冲突)。
  • 迁移:同一文件 sql/mls_resource_file_candidate.sql 分三段复制执行——【Step A】建表 → 发代码 →【Step C】迁数据 → 验证后【Step D】删旧表分组列。

【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 / isLatest;data.count 为条数;不嵌套 versions[]。
  • 成功响应 data.files[] 仍含 startMs / fileName / uptime(不含 url),并增返 id / version / versionSeq。

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

  • 术语(文案/文档;JSON 字段名不变):episodeId = 任务ID;drama_video_id = 项目ID(原「集ID」);job_id = JOB_ID;mls_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[].jobResource 与 tasks[].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 回调。
  • 涉及接口:updateMlsResult、updateMlsJobStatus、saveMlsResourceFile、saveMlsCandidateFiles、getMlsJobResource。
  • 建议加索引: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_seq、version_label、is_latest。迁移:sql/mls_resource_file_version.sql。同键原为 (uin, episodeId, language, fileType);【2026-09-04】已改为 (uin, drama_video_id, language, fileType),见文首变更摘要。默认版本号 v{seq}-{YYYYMMDD}。
  • jobResource(getUserMlsList / getMlsDetail / 集详情):每项含 version、versionSeq、isLatest 及 versions[] 历史列表(仅 fileStatus=1);有项目时按 项目 聚合。
  • OpenTool getMlsJobResource:仅返回各键 latest 一条;id / url / source / uptime 与改版前一致,可额外带 version / versionSeq / isLatest,不含 versions 数组。
  • saveMlsTaskResource:上传/编辑均 插入新版本(旧版保留,is_latest 转移);返回 id、version、versionSeq。
  • 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。本文档不包含 Tag、parentUin、userId 等由网关注入的字段说明。

请求约定:所有 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 模板。实扣看回调 executedStages(status=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_CHECK 仅 legacy 无 stages 任务仍加 1×计费秒。
  • 存储:max(duration,30)×storage 单价×本次新增成片条数。成片 = results 里某语种首次 status=2 且 url 非空(审核降为 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)返回阶段单价,供控制台展示。getMlsModeTypeList 的 base_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。
  • addMlsDramaVideo、addMlsTask(自动建集时)可选入参 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,不传则按 episodeId 查 mls_list 回填。
  • OpenTool getMlsJobResource:资源按集查。drama_video_id 与 episodeId 不能同时为空;有 drama_video_id 直接查,无则用 episodeId 解析出集 ID 再查。job_id 已忽略。

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

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

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

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

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

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

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

  • sourceFrom=ady:渠道用户(写 platform_code / platform_user_key);checkToolAccess 用 aodianyun.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。
  • subToken 以 apaas 开头时:调用控制台 checkToolAccess(subType=mls)换取用户;若 mls_user 不存在则按渠道补全 mls_user / mls_user_dms / 积分账户,并签发 MLS 登录态。
  • 非 apaas 前缀:仍从 Redis 校验已有会话(与原先一致)。

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

  • mls_mode_type 新增 execution_mode(legacy|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_url、origin_ready=1(无需预处理),OpenTool 可直接拉取。
  • checkMlsAmount:不需原片的类型在 duration 未传或为 0 时可传 resources 按同上规则推算时长。

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

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

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

  • 任务支持多种处理类型(mode_type),配置来自表 mls_mode_type,接口 getMlsModeTypeList 拉取(含单价、是否需选语种)。
  • 创建任务新增入参 mode_type(默认 full_pipeline);是否必填 languages 由类型的 requires_language 决定。
  • 任务新增字段:mode_type、job_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_type、mls_list 新增 mode_type_index:同一索引可对应多种 mode_type,用于前端分类 Tab / 分组列表查询。
  • getMlsModeTypeList 返回 mode_type_index;addMlsTask 创建时按所选 mode_type 自动写入对应索引,无需客户端传参。
  • getUserMlsList 新增入参 mode_type_index(分组查询,不传返回全部);可与 mode_type(精确类型)组合使用。

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

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

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

  • 超规格源视频(分辨率 / 格式 / 帧率 / 码率任一超限)在入库或创建任务时异步预处理:转码产出 B → 网络上传 PULL → 最终源地址 C,并删除用户首次上传的 A。
  • mls_list 新增 origin_ready:0 源片预处理中,1 可被 AI 处理节点拉取。OpenTool getUserMlsTaskList 仅返回 origin_ready=1 且 resStatus=0 的任务。
  • mls_drama_video 新增 origin_ready、preprocess_status、preprocess_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决定(与getUserConf中config.languages一致):

  • basic(默认):仅id <= 12且满足enable条件的语言。
  • all:enable条件下全部语言,不再限制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.3 /mls/tool/getMlsTranslationSceneList - 获取翻译场景列表

获取启用的翻译场景列表(读 mls_translation_scene 表,服务端 Redis 缓存约 1 小时)。创建任务前先调此接口,用于渲染场景下拉。

缓存说明:场景列表有 Redis 缓存(TTL 1 小时),管理后台修改场景数据后最多 1 小时生效。如需立即生效,可调用管理后台接口清除缓存。

入参

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

出参

字段 类型 说明
flag int 100 成功
flagString string 提示信息
data array 场景列表,按 scene_code 升序
data[].id int 场景 ID
data[].scene_code string 场景编码,创建任务时在 job_param.sceneCode 中传入
data[].scene_name string 场景名称
data[].enable int 是否启用(1=启用,0=停用)
data[].remark string 备注

使用场景

  • 前端创建任务时,可调用此接口获取可选的翻译场景列表。
  • 用户选择场景后,将 scene_code 作为 job_param.sceneCode 传入创建任务接口。
  • 服务端在拉取任务时会读取该字段,查询对应的翻译提示词并注入到 job_param.stages.subtitle_translate.prompt 中。

示例响应

{
  "flag": 100,
  "flagString": "success",
  "data": [
    {
      "id": 1,
      "scene_code": "news",
      "scene_name": "新闻",
      "enable": 1,
      "remark": "新闻类内容翻译"
    },
    {
      "id": 2,
      "scene_code": "entertainment",
      "scene_name": "娱乐",
      "enable": 1,
      "remark": "娱乐类内容翻译"
    }
  ]
}

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

读 mls_stage(Redis 缓存约 1 小时),供控制台展示单价。不参与鉴权以外的业务写入。虚拟阶段 storage、source_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_type、job_id、jobResource(中间资源产物,结构同 OpenTool getMlsJobResource.data)。

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

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

【2026-07-07 变更】每条任务额外返回 origin_ready(int):0 源视频预处理中,AI 暂不可拉取;1 源片就绪。预处理失败时任务可能为 resStatus=4 且 origin_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),合法值见 getMlsModeTypeList 的 mode_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 结束时间戳(秒级)
exclude_internal int 否 1 排除内部任务(mls_mode_type.is_internal=1);默认 0 不过滤
brief int 否 1 摘要模式:不回 jobResource/results,param/job_param/stages 置空;默认 0
with_resources int 否 0 不回 jobResource;不传默认回全量(含 versions[]);brief=1 时强制为 0

出参

字段 类型 说明
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(如 subtitle、voice、audioRaw、asrSubtitle、cloneVoice 等)。
  • 应用端每项含原有四字段 + 版本扩展字段,并含 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=0 且 origin_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_type、job_id、jobResource,含义与 §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入参
brief int 否 同 §2:1 摘要模式;默认 0
with_resources int 否 同 §2:0 不回 jobResource;默认回全量

出参

字段 类型 说明
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;需选语种时 results 按 languages 初始化为待处理,否则 results 为 []。

【2026-06-17 变更】服务端会根据所选 mode_type 从 mls_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);可包含 sceneCode 字段指定翻译场景
stages array 否 可选。不传用套餐模板;传了非空则自由拼装(项 {stageId, policy},policy 为 complete|recompute)。不可含 storage/source_upload
resources array 条件 前端上传素材列表;无源片时建议必传字幕等可解析时长资源

resources[] 单项:

字段 类型 必填 说明
language string 是 语种,如 original、en
fileType string 是 资源类型,如 subtitle、voice
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):更新任务级环境变量;不传则保持原值,传 {} 表示清空为无附加变量。规则见 附录 C。resStatus=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_file,source=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 是 语种,如 english、original
fileType string 是 资源类型,如 ttsCandidate
page int 否 页码;与 pageSize 同时传才分页
pageSize / num int 否 每页条数;不传则返回全部分组(兼容旧客户端)

出参

字段 类型 说明
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_id 或 episodeId(至少其一)。

【2026-09-07】平铺返回该分组下全部版本(含历史,按 fileName ASC、versionSeq DESC);每条含 version / versionSeq / isLatest;data.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
page int 否 页码;与 pageSize 同时传才分页
pageSize / num int 否 每页条数;不传返回全量(兼容)

出参

字段 类型 说明
data.groupKey string 分组字段名
data.groupValue string 分组字段值
data.count int 符合条件总条数(分页时为总数,非本页条数)
data.page / data.pageSize 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 - 批量保存分组候选文件

处理节点按字幕目录上传候选音频后调用。写入 mls_resource_file_candidate(分组行:group_key / group_value / file_name)。与扁平表 mls_resource_file 分离。

【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_seq;uptime 相对旧 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 / versionSeq。uptime 为正整数秒级时间戳,同一版本键再次写入时严格递增。处理节点按 (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 PULL(retry_mode=pull)
转码阶段失败或无 B 从源地址 A 重新 dvrSubmitTranscoding(retry_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_video 或 task
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-upload、private-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\"}"
  }
}

错误示例:service非material-upload或private-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.location或response.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时视为成功;最后一片成功响应中的location或data.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_amount、reserved、available、invite_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。可选 stages、include_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 否 任务级环境变量;仅 无 stages 时 CONSOLE_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}_gw;platform_user_key={code}_gw_{extId}。未配置则 ady 换票失败

分支说明

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

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

B. apaas 换票(apaas 前缀)

  1. 调用 checkToolAccess(subType=mls):
    • sourceFrom=ady → http://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,仅按 uin 查 mls_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_code 以 MLS_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 读会话;checkToken 用 subToken 校验或完成 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后直接调用sendSmsCode传captchaId,无需调用本接口。本接口为传统图形码,后续可能下线。

入参

参数 类型 必填 说明
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 是 头像地址,需为http或https链接,最大长度 255

返回示例

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

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

【更新时间:2026-04-07】 已登录用户更新资料字段:仅处理请求体里出现的键,未传的字段不修改。至少传下列之一:username、realname、company、email。成功后刷新当前 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_code、locale_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。

登录:须传 token;uin 由网关在校验 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_username、invitee_avatar、invitee_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=basic、batch_review=false、duration_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_code、platform_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 getPayEntryConfig;useExternalPay === 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_base或snsapi_userinfo,默认snsapi_userinfo
afterLoginUrl string 否 登录成功后跳转地址;若传,回调接口会 302 并追加subToken
inviteUin int 否 邀请人 uin,会写入 state,供回调自动注册发奖使用

说明:

  • redirectUri与afterLoginUrl都会做域名校验:host 须属于DOMAIN或其子域,或属于环境变量MLS_ALLOWED_REDIRECT_DOMAINS(逗号分隔根域白名单,同样允许子域名)。多前端域名(如weapp.yaomuai.com、mls.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_base或snsapi_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.php 中 NO_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.php 对 shareMlsWorks 的特殊处理
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
getMlsTranslationPrompt /mls/tool/getMlsTranslationPrompt 附录 E 免登录端点,按 promptId 返回翻译提示词正文

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


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

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

作用

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

请求体(JSON)

参数 类型 必填 说明
job_id string 是 任务实例 ID(兼容 jobId),按此定位任务
episodeId int 否 集 ID(drama_video_id),不参与任务定位
results array 或 string 是 各语种结果列表;可为 JSON 字符串。每项含language、status、uptime、url等
executedStages array 或 string 否 有此键即走阶段计费(可空数组)。项建议含 stageId、status、executionId、可选 language。status=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_conf中batch_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.com、mls.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.com、api.weixin.qq.com)并在项目内做了轻量封装。

支付宝

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

变量名 说明
MLS_ALIPAY_APP_ID 支付宝应用 AppID
MLS_ALIPAY_PRIVATE_KEY 应用私钥 PEM 内容或文件路径(开发助手本地生成,支付宝不保存;与证书成对)
MLS_ALIPAY_CERT_DIR 可选。不配时默认使用项目内library/common/pay/alipayCert(需含appCertPublicKey_*.crt、alipayCertPublicKey_RSA2.crt、alipayRootCert.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

成功走证书模式时,下单返回里signMode为cert;form_html中会带app_cert_sn、alipay_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 商品数组,每项含goodsId、goodsName、amount(元)、points、price、isPreset、enable等

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扫码(需当面付/订单码)

出参

返回为 订单信息 + 支付数据 合并:payDataId、outTradeNo、amount、payType、goodsName、points、existingOrder(若有),以及按支付方式:

  • 微信 PC:code_url→ 用二维码库生成二维码,用户微信扫码支付
  • 微信内 JSAPI:appId、timeStamp、nonceStr、package、signType、paySign→ 调微信 JSSDK 调起支付
  • 支付宝 PC(默认 page):form_html→ 见下文「支付宝电脑网站支付:前端对接」;另回显returnUrl、alipayScene、signMode(cert/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=2;alipayScene可省略(默认page);自定义商品才传amount;returnUrl建议传充值页(须落在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应为cert;form_html内应含app_cert_sn。
  • 改密钥/证书后须重新下单拿新form_html,旧表单会验签失败。

15. /mls/tool/createMlsOrder - 下单

仅创建支付记录(mls_pay_data,含points)。同账户同商品 2 小时内未支付则复用该支付单。返回payDataId、outTradeNo等,用于后续调 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 否 默认page→form_html;scan→qr_code

出参

按支付方式返回:

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

支付完成回调(免登录)

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

  • 微信异步通知: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. handlePaySuccess:status=0→1乐观锁防并发重复加积分,写流水(trade_type=1存入)、DMS、财务收款

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

  1. 更新mls_pay_data(status=1、orderId=支付宝trade_no、payTime)
  2. 增加mls_user_amount并写入mls_user_amount_run(trade_type=1,说明「积分充值」)
  3. DMS 推送messages/mls_pay_success_{uin}
  4. 同步mls_finance_receipt(source=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、视频上传、批量提交接口。
  • 创建剧集仅需 name;mode_types / languages 在首次提交任务时传入并持久化到剧集。
  • mode_types 支持逗号分隔多类型(full_pipeline 不可与其他类型共存)。
  • 再次提交:以剧集已存 mode_types、languages 为准做增量;若请求中传入与库不一致的类型/语种则拒绝。
  • submitMlsDramaTasks 事务内全成功或全失败;删除视频(deleteMlsDramaVideo)时会级联软删该集下全部任务,存在处理中(resStatus=1)任务时拒绝删除。

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

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

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

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

返回 data.dramaId;mode_types、languages 初始为空。

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_count、source_type、remark)、data.count。

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

参数 类型 必填 说明
dramaId int 是 剧集 ID
exclude_internal int 否 同 §2:1 排除内部任务;默认 0
brief int 否 同 §2:1 摘要(不下发 jobResource/results 等);默认 0
with_resources int 否 同 §2:0 不回 jobResource;默认回全量

返回剧集信息及 videos 列表(每条含 tasks、task_count)。exclude_internal=1 时 task_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 各语种输出结果,每项含 language、status(0~4)、url、uptime 等;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
exclude_internal int 否 同 §2:1 排除内部任务;默认 0。工作台/项目页建议传 1
brief int 否 同 §2:1 摘要模式(不回 jobResource/results 等);默认 0。工作台/项目页建议传 1
with_resources int 否 同 §2:0 不回 jobResource;默认回全量

返回 data.list(含 tasks、task_count、drama_name、list_type)、data.count。tasks[] 字段见 §18.4 tasks[] 任务字段。

18.4.2 /mls/tool/getMlsEpisodeDetail - 集详情

参数 类型 必填 说明
drama_video_id int 是 集 ID(mls_drama_video.id)
exclude_internal int 否 同 §2:1 排除内部任务;默认 0
brief int 否 同 §2:1 摘要模式;默认 0
with_resources int 否 同 §2:0 不回 jobResource;默认回全量

返回集信息(含 list_type)及 tasks[](字段见 §18.4 tasks[] 任务字段)。下载/预览/编辑若仍依赖 jobResource,勿传 brief=1,或按需走资源接口。

18.4.2a 项目摘要 / 按需资源接口(P1~P3,新增)

Project = drama_video(集/项目)。以下接口新增,旧接口缺省行为不变。工作台/项目页建议切 getProjectList;编辑页切 getProjectDetail + 资源分页。

getProjectList

参数 类型 必填 说明
page int 否 默认 1
pageSize / num int 否 默认 12,最大 100
keyword / title string 否 标题模糊
list_type string 否 精确过滤
source_type string 否 batch/single/all,默认 all
dramaId int 否 剧过滤

返回 data.list[] 摘要卡字段:drama_video_id、title、thumbnail、status(聚合)、capabilities[]={type,status,episodeId}、languages[]、failedLanguages[]、doneLanguages[]、task_count、material_count、erase_mode/adaptive/timestamp_check、create_time 等。不含 jobResource / 全量 tasks。

getProjectTasks

参数 类型 必填 说明
drama_video_id int 是 项目 ID
exclude_internal int 否 默认 1 排除内部任务;0 含内部

返回 data.list[]:episodeId、mode_type、resStatus、languages、title、create_time、is_internal 等(无 jobResource/results/param)。

getProjectDetail

参数 类型 必填 说明
drama_video_id int 是 项目 ID

在摘要卡基础上额外返回:latestResources(language→fileType→latest 对象)、origin/clean/final 指针。不含版本历史。

getProjectResources

参数 类型 必填 说明
drama_video_id int 是 项目 ID
fileType string 否 过滤
language string 否 过滤
latest_only int 否 1 仅 latest
page / pageSize int 否 默认 page=1、pageSize=20

返回扁平资源列表(含 version/versionSeq/isLatest/url)。

getRenderHistory

同 getProjectResources,默认 fileType=video;列表项字段为 final_version / is_latest / created_at / url。

getManuscript

参数 类型 必填 说明
drama_video_id int 是
language string 是 目标语种

返回 sourceSubtitle / targetSubtitle(latest 指针);sentences 暂为空数组(由前端拉字幕文件合并)。

getSubtitleStyle

参数 类型 必填 说明
drama_video_id int 条件 与 episodeId 二选一
episodeId int 条件 优先

返回该任务(或项目下最近一条任务)的 param / job_param。

getProjectStatus

参数 类型 必填 说明
drama_video_id int 条件 按项目返回聚合 status + tasks[]
task_ids / episodeIds int[] 条件 批量任务状态

每项仅 id/episodeId/resStatus/mode_type/uptime。

getProjectResourceGroups / getProjectResourceGroupFiles

行为同 §5.4 / §5.5;getProjectResourceGroupFiles 与 getMlsResourceGroupFiles 均支持可选 page/pageSize(不传=全量,兼容旧客户端)。

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=0、preprocess_status=1 并异步启动流水线;不需预处理时 origin_ready=1。预处理提交失败返回 flag=110 且 preprocess_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=4、origin_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);重试时沿用创建时写入的值

值类型

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

键名规则

  • 须符合环境变量命名:以字母或下划线开头,仅含字母、数字、下划线
  • 不符合规则的键:服务端静默丢弃(不报错)
  • 以下保留键会被静默丢弃(由处理节点按负载注入):DEMUCS_URL、LEMAS_TTS_URL、CHATTRBOX_TTS、TTS_URL_01、TTS_URL_02、AVPS_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 环境变量(与 附录 C 的 param 分离)。

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

【2026-09-22】 job_param 中的 sceneCode 字段已从 OpenTool getUserMlsTaskList 下发中移除;服务端仍会读取该字段用于内部逻辑(如查询翻译提示词),但不再透传给 AI。

  • 创建任务时可在 job_param 中传入 sceneCode 字段(如 "sceneCode": "news"),用于指定翻译场景。
  • 可用场景列表通过 getMlsTranslationSceneList(§1.3)接口获取。
  • 服务端在拉取任务时会读取该字段,查询对应的翻译提示词并注入到 job_param.stages.subtitle_translate.prompt 中。
  • AI 处理节点不再接收 sceneCode 字段,而是通过 prompt 字段获取提示词 URL。
  • 如需修改场景,应在创建任务时通过 job_param 传入新的 sceneCode。

字段定义

属性 说明
字段名 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 对象,透传给交互阶段';

附录 E:翻译提示词查询接口

1. /mls/tool/getMlsTranslationPrompt - 获取翻译提示词内容

免登录接口。根据 promptId 查询并返回翻译提示词正文(纯文本)。

入参

参数 类型 必填 说明
promptId int 是 提示词 ID(mls_translation_prompt.id)

出参

  • 成功时返回纯文本内容(Content-Type: text/plain; charset=utf-8),带5 分钟缓存。
  • 失败时返回 JSON错误:
    • {"code": 400, "msg": "promptId 参数无效"}(promptId ≤ 0)
    • {"code": 404, "msg": "提示词不存在或已停用"}(ID 不存在或 enable=0)

使用场景

  • AI处理节点拉取翻译提示词内容(URL 由 OpenTool getUserMlsTaskList 在 job_param.stages.subtitle_translate.prompt 中下发)。
  • 前端可直接通过 URL 加载提示词内容(纯文本)。

数据库表

apaas.mls_translation_prompt(提示词配置表)

字段 类型 说明
id int 主键
language_code varchar 语种代码(如 zh、en)
scene_code varchar 场景代码(如 news、entertainment)
content text 提示词正文
enable tinyint 是否启用(1=启用,0=停用)

外部平台打通

上线前执行:

  • 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_code、platform_user_key(渠道用户非空)、hasPassword(是否已设密码;旧会话可能无此字段)
  • 对账单:每渠道每月一条,按天汇总刷新;仅统计 payType=3 成功单
最后编辑: 广电云技术部  文档更新时间: 2026-09-23 17:07   作者:广电云技术部