跳到主要内容

包结构

本文描述 AMMDS 备份包的目录布局、清单(manifest)结构、元数据 JSON 字段约定及导入规则。字段均与实体类 MovieEntityActorEntityFileInfoExpand 一一对应。

zip 目录布局

备份文件为 zip 压缩包(兼容性上也可接受单个 data.json 文件),用于影视 / 演员元数据的导出与导入:

backup.zip
├── manifest.json # 清单:格式标识、版本、类型、生成时间、条目数、图片映射
├── data.json # 元数据数组(JSON),图片字段为原始引用(http 链接或 data 本地路径)
└── images/ # 可选:仅当导出时勾选「同时导出图像文件」才存在
  • manifest.jsondata.json 位于压缩包根目录,二者均为必需文件。
  • images/ 目录可选。未勾选「同时导出图像文件」时,导出包中不包含该目录,manifest.jsonincludeImagesfalseimageFiles 为空数组。
  • 仅当 typemovie / actor 之一时包结构才合法;其它类型或缺少必需文件一律拒绝导入(见 导入规则)。

manifest.json 字段表

字段类型必填说明
formatstring格式标识,固定为 "ammds-backup"
formatVersionint格式版本号,当前为 1(见 版本约定
typestring备份数据类型:"movie"(影视)或 "actor"(演员)
generatedAtstring生成时间,ISO-8601 格式,如 2026-08-12T10:30:00+08:00
appVersionstring生成该备份的 AMMDS 应用版本号
includeImagesboolean是否包含图片文件(images/ 目录是否存在)
countintdata.json 中的元数据条目数
imageFilesarray图片映射列表,元素为对象,结构见下表;includeImages=false 时为空数组

imageFiles 数组元素字段:

字段类型说明
refstring原始图片引用,即元数据中的 data 本地路径(如 data/images/media/2026/08/xxx.jpg
pathstring图片在压缩包内的相对路径(如 images/xxx.jpg
sha256string图片文件的 SHA-256 摘要,用于导入时完整性校验

data.json 影视条目(movie)

data.json 为 JSON 数组,每个元素对应一条影视记录。字段与 MovieEntity(含父类 FileInfoExpand)一致,命名采用 Java 字段名的驼峰形式。

文件信息字段(继承自 FileInfoExpand)

字段类型说明
mediaDirstring媒体目录
filePathstring[]文件路径列表
originalFilePathstring原始文件地址
arrangeFilePathstring整理(重命名)后的文件地址
fileNamestring文件名(可能为空)
audioCodecstring音频编码
videoCodecstring视频编码
resolutionWidthint帧宽度(分辨率宽)
resolutionHeightint帧高度(分辨率高)
fileSizeBytelong文件大小(单位:字节)

影视元数据字段

字段类型说明
originalTitlestring标题(原始)
titleCnstring标题(中文)
plotstring简介
plotCnstring简介(中文)
taglinestring标语(如"首映日期:2026-08-01")
outlinestring大纲
ratingnumber评分,10 分制
premieredstring首映日期,yyyy-MM-dd 字符串(见 日期与枚举约定
posterstring[]封面图(列表显示),元素为图片原始引用
fanartstring[]背景图(详情背景),元素为图片原始引用
thumbstring[]缩略图(播放显示),元素为图片原始引用
extrafanartstring[]剧照(扩展显示),元素为图片原始引用
genrestring[]类型列表
tagstring[]标签列表
uniqueidstring[]识别码(番号)列表,导入匹配依据(见 导入规则
studiostring[]制作公司列表
issueStudiostring[]发行公司列表
runtimeint时长(单位:分钟)
mpaastringMPAA 评级(默认 R18+
languagestring语言
countrystring国家
mosaicstring马赛克标记(有码 / 无码
setsobject[]系列列表,结构见 sets
directorstring[]导演列表
actorsobject[]演员列表,结构见 actors
sourceLinksobject[]影视源(平台 / 链接映射),结构见 sourceLinks
extendobject[]扩展信息(用户自定义 key-value),结构见 extend
platformobject[]平台信息,结构见 platform
dataSourcestring数据源枚举 code(见 日期与枚举约定
sharedboolean共享状态
pHashstring[]PHash 指纹列表
osHashstring[]OsHash 指纹列表
magnetobject[]磁力信息列表,结构见 magnet
subtitleobject[]外挂字幕列表,结构见 subtitle
trailerstring预告片地址

嵌套对象结构

sets(系列)

字段类型说明
namestring系列名称
overviewstring系列描述(可能为 null)

actors(演员)

字段类型说明
namestring演员名称
rolestring角色(男优 / 女优,缺省时默认"女优")

sourceLinks(影视源)

字段类型说明
platformstring平台名称
linkstring平台链接

extend(扩展信息)

字段类型说明
extendKeystring扩展键(如 mosaic
extendValuestring扩展值

platform(平台信息)

字段类型说明
platformstring平台名称(如数据源 Provider)
linkstring平台链接(主页地址)

magnet(磁力信息)

字段类型说明
namestring磁力名称
linkstring磁力链接(magnet: 协议)
sizelong磁力大小(单位:字节,默认 0)
hashstring磁力 Hash
datestring分享日期,yyyy-MM-dd 字符串

subtitle(外挂字幕)

字段类型说明
sidstring字幕文件 ID
namestring字幕文件名称
linkstring字幕文件链接
languagestring字幕语言
extensionstring字幕文件扩展名
durationlong字幕时长(单位:毫秒)
pathstring字幕本地文件地址(下载后落盘路径,可能为空)

data.json 演员条目(actor)

每个元素对应一条演员记录,字段与 ActorEntity 一致。

字段类型说明
namestring姓名(艺名),必填,导入匹配依据(见 导入规则
aliasesstring[]曾用名 / 别名列表
genderstring性别枚举 code:male / female / shemale
heightCmnumber身高(单位:厘米)
weightKgnumber体重(单位:公斤)
birthDatestring出生日期,yyyy-MM-dd 字符串
ageint年龄(根据出生日期自动计算,可能为 null)
nationalitystring国籍
bloodTypestring血型枚举 code:A / B / AB / O / RH+ / RH-
bustChestCmnumber胸围(单位:厘米)
waistCmnumber腰围(单位:厘米)
hipsCmnumber臀围(单位:厘米)
cupSizestring罩杯大小(A-J,单个字符)
penisCmnumber阴茎长度(单位:厘米)
debutDatestring出道日期,yyyy-MM-dd 字符串
agencystring[]经纪公司列表
tagstring[]标签列表
stylestring[]风格列表
specialFeaturesstring[]特征列表
scorenumber评分,10 分制
socialLinksobject[]社交平台列表,结构见 socialLinks
retiredboolean是否退役
deceasedboolean是否亡故
posterstring大头照,图片原始引用(单值字符串)
thumbstring[]海报列表,元素为图片原始引用
biostring简介(人物简介)
extendobject[]扩展信息,结构同 extend(extendKey / extendValue)
platformobject[]平台信息,结构同 platform(platform / link)
dataSourcestring数据源枚举 code
sharedboolean共享状态

socialLinks(社交平台)

字段类型说明
platformstring平台名称
linkstring平台链接

注:影视与演员条目均含公共基类字段 idcreatedTimeupdatedTimeversionAbstractBaseEntity)。导出时 id 用于去重参考,导入时以匹配规则为准重新生成 / 复用,不直接沿用包内 id

日期与枚举约定

  • 日期:统一使用 yyyy-MM-dd 字符串表示(如 2026-08-01),对应实体中的 Date 字段(premieredbirthDatedebutDatemagnet.date 等)。
  • 枚举:一律存枚举的 code 值,不存中文名或枚举名:
    • dataSource(数据源):official / metatube / theporndb / stashbox / fanza_dmm / r18dev / thejavdb / plugin / user / local
    • gender(性别):male / female / shemale
    • bloodType(血型):A / B / AB / O / RH+ / RH-
  • 导入时对无法识别的枚举 code 应做容错处理(置空或忽略),不因单个字段异常导致整条记录失败。

图片映射规则

图片两种存储方式

备份包中图片字段保持「原始引用」形式,按字符串前缀分为两种:

方式值形式判定
http 外链http / https 开头的完整 URLvalue.startsWith("http")
data 本地路径data 开头的本地相对路径value.startsWith("data")

两种方式可在同一字段列表中共存。data 路径基于应用数据挂载目录 /ammds/data,例如 data/images/media/2026/08/xxx.jpg 实际对应 /ammds/data/images/media/2026/08/xxx.jpg

导出(打包)

  • 仅收录值为 data 本地路径且文件真实存在的图片进包;http / https 外链引用一律不进包
  • 收集范围:影视的 poster / fanart / thumb / extrafanart 四个列表字段;演员的 poster(单值)与 thumb(列表)字段。
  • 每个进包文件在 manifest.json.imageFiles 中登记一条 {ref, path, sha256}(三个字段含义如下):
    • ref 为元数据中的原始 data 路径;
    • path 为包内相对路径(images/ 目录下,建议保留原文件名或按索引重命名);
    • sha256 为文件内容摘要。
  • 同一文件被多个字段引用时,只打包一次,imageFiles 中可登记多条映射(ref 不同、path 相同)。

导入(落盘)

  • 若备份包含图片(includeImages=true),将包内文件写入 data/images/media(影视)或 data/images/actor(演员)目录。
  • 写入时按文件内容 SHA-512 去重:相同内容的文件只落盘一份,以摘要命名。
  • 落盘后,把元数据中对应的图片字段引用(原 ref回写为新的 data 路径,保证新路径下文件真实存在。
  • 若导入时不导入图片(未勾选 / 包内无图片),则图片字段保留原引用http 外链或原 data 路径原样保存)。

http 引用始终原样保留:无论是否勾选导入图片,http / https 外链在导出、导入全程不被改写。

导入规则

数据匹配

类型匹配依据说明
影视(movie)uniqueid 交集已有记录中任一 uniqueid 与导入条目 uniqueid 存在交集,即视为同一条记录
演员(actor)name已有记录 name 与导入条目 name 完全一致,即视为同一条记录

冲突策略

策略行为
skip跳过已存在的记录(不写入、不更新),仅导入新记录
overwrite对已存在记录执行覆盖更新,不存在则新建

非法文件校验

出现以下任一情形,整个导入直接拒绝且不产生任何数据变更(事务性回滚):

  • format 不是 ammds-backup(格式不符);
  • formatVersion 不被当前版本支持(高于当前支持的版本);
  • 缺少必要文件(缺少 manifest.jsondata.json,或单文件模式缺少必需字段);
  • 包内存在路径穿越条目(如 ../、绝对路径等试图逃逸解压目录的文件项)。

校验通过后,按上述匹配规则与冲突策略逐条执行写入。

版本约定

  • 当前格式版本:formatVersion = 1
  • 后续升级必须兼容旧版本:新增字段以可选方式引入(缺省时有默认值),不允许破坏既有字段语义;导入端需支持读取所有历史版本的 data.json,导出端默认产出当前版本。
  • manifest.json.formatVersion 用于导入端判断是否支持该备份;遇到高于当前支持范围的版本时拒绝导入并给出明确提示。