JSON 交换格式

用于描述仓库元数据的 TOML 格式便于书写和阅读,但受到各语言实现的限制,解析可能存在一些问题。

本文定义了 JSON 格式的同义替代,以规范各实现对仓库元数据进行交换时的信息格式。

标识符

数据交换中通过以下两种标识符指代光盘和音轨。

// 专辑标识符
type AlbumIdentifier = string; // UUID

// 光盘标识符
interface DiscIdentifier {
  // 专辑 ID
  album_id: AlbumIdentifier;
  // 光盘 ID
  disc_id: number;
}

// 音轨标识符
type TrackIdentifier = DiscIdentifier & {
  // 音轨 ID
  track_id: number;
}

专辑信息

// 专辑信息
interface AlbumInfo {
  // 专辑 ID
  album_id: AlbumIdentifier;
  // 专辑名称
  title: string;
  // 专辑类型
  edition?: string;
  // 专辑品番
  catalog: string;
  // 专辑艺术家
  artist: string;
  // 专辑的发行日期
  date: string;
  // 音乐类型
  type: TrackType;
  // 光盘信息
  discs: DiscInfo[];
}

// 专辑详细信息
type AlbumDetail = AlbumInfo & {
  // 专辑详细艺术家
  artists?: Artists;
  // 专辑标签
  tags?: string[];
  // 光盘信息
  discs: DiscDetail[];
}

// 光盘信息
interface DiscInfo {
  // 光盘名称
  title?: string;
  // 光盘品番
  catalog: string;
  // 光盘艺术家
  artist?: string;
  // 音乐类型
  type?: TrackType;
  // 音轨信息
  tracks: TrackInfo[];
}

// 光盘详细信息
type DiscDetail = DiscInfo & {
  // 光盘详细艺术家
  artists?: Artists;
  // 光盘标签
  tags?: string[];
  // 音轨信息
  tracks: TrackDetail[];
}

// 音轨信息
interface TrackInfo {
  // 音轨标题
  title: string;
  // 音轨艺术家
  artist?: string;
  // 音乐类型
  type?: TrackType;
}

// 音轨详细信息
type TrackDetail = TrackInfo & {
  // 音轨详细艺术家
  artists?: Artists;
  // 音轨标签
  tags?: string[];
}

// 详细艺术家
type Artists = ExtendedArtists & Record<string, string>;

// 详细艺术家的预定义字段
interface ExtendedArtists {
  // 歌手
  vocal?: string;
  // 作曲
  composer?: string;
  // 作词
  lyricist?: string;
  // 编曲
  arranger?: string;
}

// 音乐类型
type TrackType = "normal" | "instrumental" | "absolute" | "drama" | "radio" | "vocal";

专辑标签

// 标签简介
interface TagInfo {
  // Tag 名称
  name: string;
  // Tag 类型
  type: TagType;
}

// 标签详细信息
type TagDetail = TagInfo & {
  // Tag 本地化名
  names?: Record<string, string>;
  // 父级 Tag
  included_by?: string[];
  // 子 Tag
  includes?: Record<TagType, string[]>;
}

// 标签类型
type TagType = "artist" | "group" | "animation" | "radio" | "series" | "project" | "game" | "organization" | "category" | "unknown";