信息导出格式

Annil 提供了分享 Token 的创建功能,但这只是资源分享的基石。

对于音频分享而言,我们需要的不只是音频文件的集合,还需要包含顺序、元数据等在内的一系列信息。而这一切需求汇总到一起,信息导出格式便应运而生。

播放列表导出格式

type ExportedPlaylist = ExportedPlaylistInfo & ExportedPlaylistMetadata & ExportedPlaylistToken;

interface ExportedPlaylistInfo {
  // 播放列表名称
  name: string;
   // 播放列表简介
  description: string;
  // 播放列表封面
  cover: PlaylistCover;
  // 按顺序存放播放列表中的所有歌曲
  songs: ExportedTrackList[];
}

interface ExportedPlaylistMetadata {
  // 存放播放列表中的元数据
  // 使用 AlbumInfo,不含 artists 和 tags 信息
  metadata: Record<AlbumIdentifier, AlbumInfo>;
}

interface ExportedPlaylistToken {
  // 实际访问音频文件的 Token
  tokens: ExportedToken[];
}

interface ExportedTrackList extends DiscIdentifier {
  tracks: number[];
}

interface ExportedToken {
  server: string;
  token: string;
}

样例

{
  "name": "Example",
  "description": "Example description",
  "cover": {
    "album_id": "e54fdcc4-662e-4e10-b91a-73984ce8248e",
    "disc_id": 1
  },
  "songs": [
    {
      "album_id": "e54fdcc4-662e-4e10-b91a-73984ce8248e",
      "disc_id": 1,
      "tracks": [1, 2, 3]
    },
    {
      "album_id": "09174545-a173-44fe-b489-0d078a2023c2",
      "disc_id": 1,
      "tracks": [1]
    }
  ],
  "metadata": {
    "e54fdcc4-662e-4e10-b91a-73984ce8248e": {
      "album_id": "e54fdcc4-662e-4e10-b91a-73984ce8248e",
      "title": "僕は存在していなかった",
      "edition": null,
      "catalog": "SRCL-9520",
      "artist": "22/7",
      "date": "2017-09-20",
      "type": "normal",
      "discs": [
        {
          "title": "僕は存在していなかった",
          "artist": "22/7",
          "catalog": "SRCL-9520",
          "type": "normal",
          "tracks": [
            {
              "title": "僕は存在していなかった",
              "artist": "22/7",
              "type": "normal"
            },
            {
              "title": "地下鉄抵抗主義",
              "artist": "22/7",
              "type": "normal"
            },
            {
              "title": "11人が集まった理由",
              "artist": "22/7",
              "type": "normal"
            },
            {
              "title": "僕は存在していなかった -off vocal ver.-",
              "artist": "22/7",
              "type": "instrumental"
            },
            {
              "title": "地下鉄抵抗主義 -off vocal ver.-",
              "artist": "22/7",
              "type": "instrumental",
              "tags": []
            },
            {
              "title": "11人が集まった理由 -off vocal ver.-",
              "artist": "22/7",
              "type": "instrumental"
            }
          ]
        }
      ]
    },
    "09174545-a173-44fe-b489-0d078a2023c2": {
      "album_id": "09174545-a173-44fe-b489-0d078a2023c2",
      "title": "ハナノイロ",
      "edition": null,
      "catalog": "LACM-4796",
      "artist": "nano.RIPE",
      "date": "2011-04-20",
      "type": "normal",
      "discs": [
        {
          "title": "ハナノイロ",
          "artist": "nano.RIPE",
          "catalog": "LACM-4796",
          "type": "normal",
          "tracks": [
            {
              "title": "ハナノイロ",
              "artist": "nano.RIPE",
              "type": "normal"
            },
            {
              "title": "バーチャルボーイ",
              "artist": "nano.RIPE",
              "type": "normal"
            },
            {
              "title": "花残り月",
              "artist": "nano.RIPE",
              "type": "normal"
            }
          ]
        }
      ]
    }
  },
  "tokens": [
    {
      "server": "https://site-url",
      "token": "jwt token here"
    },
    {
      "server": "https://site2-url",
      "token": "xxx"
    }
  ]
}

注:客户端需要根据 JWT Body 中的 audios 为每个专辑选择可用的 Anni Library 服务器及 Token 。