openapi: 3.1.0
info:
  title: AniBT Open API
  version: '1'
  summary: AniBT 公开 RSS 与 JSON API
  description: |
    生产 Base URL 为 https://anibt.net。每个端点的参数、鉴权和响应以其定义为准。
    JSON 成功响应有 data、result 和无包装三种形态；不要在客户端统一假定 data。RSS/Torznab 返回 XML，公开 RSS 的错误正文通常为纯文本。
    资源 ID 使用对应 rel_* / orel_*；字幕组过滤通常使用 slug，但其他类 RSS 的 groupId 使用组织 ID。
  contact:
    email: support@anibt.net
servers:
  - url: https://anibt.net
    description: 生产
tags:
  - name: catalog
    x-displayName: 目录与身份
    description: 字幕组目录与当前 Key 身份。
  - name: query
    x-displayName: 查询
    description: 番剧搜索、季度表、匹配。
  - name: rss
    x-displayName: RSS
    description: 番剧、全站磁力、其他类与个人订阅。
  - name: publish
    x-displayName: 发布
    description: 番剧与其他类发布。
  - name: delete
    x-displayName: 删除
    description: 删除番剧发布与状态轮询。
  - name: torrent
    x-displayName: 种子
    description: 公开种子下载。
  - name: sync
    x-displayName: 外站同步
    description: 查询普通 release 在六个外站的同步状态。
security: []
paths:
  /api/subtitle-groups:
    get:
      tags:
        - catalog
      operationId: subtitle-groups
      summary: 字幕组目录
      description: |
        可见字幕组列表。启动时拉一次，缓存 name → slug。
        本接口只返回可见项。全量返回。速率限制默认 60 次 / 60 秒 / IP。
        支持 GET、HEAD、OPTIONS；条件请求仍可能消耗限流额度。
      responses:
        "200":
          description: 可见字幕组列表
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/SubtitleGroupListResponse"
              examples:
                groups:
                  summary: 结构示例（数组节选）
                  value:
                    ok: true
                    data:
                      - slug: alicia
                        name: 艾莉希婭
                        organizationId: org_qplE6hvOXjvT
                        status: ACTIVE
                        totalReleases: 4
                        totalAnimes: 5
                        createdAt: 1781416887567
                      - slug: ani
                        name: ANi
                        organizationId: org_JNcJ-H_h2qb_
                        status: ACTIVE
                        totalReleases: 1373
                        totalAnimes: 114
                        createdAt: 1777368261421
        "304":
          description: ETag 未变，响应体为空
        "400":
          description: 无效的 status
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ErrorEnvelope"
        "429":
          $ref: "#/components/responses/RateLimited"
      parameters:
        - name: status
          in: query
          schema:
            type: string
            enum:
              - ACTIVE
          description: 省略或 ACTIVE；其他值返回 400。

  /api/subtitle-groups/me:
    get:
      tags:
        - catalog
      operationId: me
      summary: 字幕组自身信息
      description: |
        返回当前 API Key 所属字幕组的 organizationId、name、slug、ACTIVE 状态、统计和 scopes。
        使用有效 Key 即可，不要求 releases:publish。创建 Key 的用户必须仍然存在且仍为该组成员，Key 未撤销且字幕组为 ACTIVE；离组后即使未撤销 Key 也返回 401。响应 private, no-store。apiKeySuffix 不能用于鉴权。
      security:
        - bearerAuth: []
        - apiKeyAuth: []
      responses:
        "200":
          description: 当前字幕组
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/SubtitleGroupMeResponse"
              examples:
                me-success:
                  summary: me-success
                  value:
                    ok: true
                    data:
                      organizationId: org_example
                      name: Example Group
                      slug: example
                      status: ACTIVE
                      createdAt: 1790294400000
                      stats:
                        totalReleases: 12
                        totalAnimes: 2
                        memberCount: 3
                      apiKeyId: sgak_example
                      apiKeySuffix: abcd1234
                      scopes:
                        - releases:sync:read
        "401":
          $ref: "#/components/responses/Unauthorized"
        "429":
          description: 未认证请求过于频繁
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ErrorEnvelope"

  /api/bgm/search:
    get:
      tags:
        - query
      operationId: bgm-search
      summary: Bangumi 搜索
      description: |
        把番剧名映射为 `bgmId`。站内未收录的作品搜不到。
        不保证第一条就是目标作品。结果按相关度排序。
        `limit` 默认 5，上限 25。速率限制默认 60 次 / 60 秒 / IP。
        q、limit 均只允许出现一次；无效查询返回 422。
        支持 GET、HEAD、OPTIONS；条件请求仍可能消耗限流额度。
      parameters:
        - name: q
          in: query
          required: true
          description: 中、英、日或罗马音关键词，也可传纯数字 Bangumi ID；去除首尾空白后 1–100 字符，禁止控制字符。
          schema:
            type: string
            minLength: 1
            maxLength: 100
        - name: limit
          in: query
          description: 条数，默认 5，上限 25
          schema:
            type: integer
            default: 5
            minimum: 1
            maximum: 25
      responses:
        "200":
          description: 搜索结果
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/BgmSearchResponse"
              examples:
                bgm:
                  summary: 结构示例（数组节选）
                  value:
                    ok: true
                    data:
                      - bgmId: 543360
                        name: 上伊那ぼたん、酔へる姿は百合の花
                        nameCn: 上伊那牡丹，酒醉身姿似百合花般
                        date: null
                        image: https://r2.anibt.net/anime_covers/nh73r0ernee7s0afv9s82f763983gcz7/cbbbd63dd8c9cff7da4b665651347ee5eae20c98567ea5572abbeccf40f8d87a/v4/w240.webp
                        rating: 7.1
                        totalEpisodes: 25
                        url: https://bgm.tv/subject/543360
                        premiere: null
                        seasonYear: null
                        season: null
        "304":
          description: ETag 未变，响应体为空
        "422":
          description: 查询参数未通过校验
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ErrorEnvelope"
        "429":
          $ref: "#/components/responses/RateLimited"
        "502":
          description: 搜索失败
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ErrorEnvelope"
        "503":
          description: 搜索暂不可用
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ErrorEnvelope"

  /api/seasons/anime:
    get:
      tags:
        - query
      operationId: seasons-anime
      summary: 季度番剧
      description: |
        季度浏览、全库标题搜索或精确 ID 查询。`bgmId` 优先于 `season`，不能与 `query` 同时使用。
        `scope.kind` 区分 season、query、bgmId；全库 query 的 `requestedSeason` 为 null，不代表首条结果的季度。
        季度浏览最多 200 条，超过时按人气档位、再按评分取前 200；query 最多 50 条。`total` 是本次返回数，`truncated` 表示仍有结果。完整翻页请用 /api/animes/search。
        已合并的旧 bgmId 返回合并后的番剧：`scope.bgmId` 保持请求值，条目的 `bgmId` 是合并后的 ID。管理员隐藏或 bgm.tv 标记为 NSFW 的番剧不出现在任何结果里。
        每部作品携带自己的年季与首播精度。季度分类不改变实际首播日期；未知值为 null。
        `weekday` 来自番剧的放送规则，依次取管理员设置、bangumi-data 放送区间、bgm.tv 分集播出日、精确到日的首播日；0=周日 … 6=周六，按北京时间。null 表示没有放送规则，归入「未排播」。
        `rating` 为 0–10，无有效来源评分时为 5.0，真实 0 保留。
        `availableSeasons` 是当前季前后各 4 季中有公开番剧的季度，总是包含当前季。
        速率限制默认 30 次 / 60 秒 / IP。支持 GET、HEAD、OPTIONS；条件请求仍可能消耗限流额度。
      parameters:
        - name: season
          in: query
          description: 季度。如 2026春 / 2026-SPRING。默认当前季
          schema:
            type: string
        - name: bgmId
          in: query
          description: 精确查一部；忽略 season
          schema:
            type: integer
        - name: query
          in: query
          description: 标题搜索，别名 q，最长 120 字符，最多 50 条
          schema:
            type: string
            maxLength: 120
        - name: q
          in: query
          description: query 的别名
          schema:
            type: string
            maxLength: 120
      responses:
        "200":
          description: 季度番剧
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/SeasonsAnimeResponse"
              examples:
                season:
                  summary: 结构示例（数组节选）
                  value:
                    ok: true
                    ts: 1790325031092
                    data:
                      currentSeason: 2026夏
                      requestedSeason: 2026夏
                      availableSeasons:
                        - 2025夏
                        - 2025秋
                      byWeekday:
                        - weekday: 1
                          weekdayLabel: 周一
                          animes:
                            - bgmId: 590786
                              animeId: nh728cxycpa1n1gga6d42zesbx892yj9
                              cover: https://r2.anibt.net/anime_covers/nh728cxycpa1n1gga6d42zesbx892yj9/a2e75d8f745cdb44bebb5e4ffd16b5b54f706f10736aa33308e6b70ab070d5c7.jpg
                              title:
                                primary: 『你们先走我断后』，于是10年后我成为了传说
                                chinese: 『你们先走我断后』，于是10年后我成为了传说
                                japanese: ここは俺に任せて先に行けと言ってから10年がたったら伝説になっていた。
                              format: TV
                              kind: TV
                              rating: 5.6
                              episodes: 12
                              airingAt: 1783339200
                              weekday: 1
                              weekdayLabel: 周一
                              scheduleStatus: scheduled
                              rssReleaseCount: 48
                              hasRelease: true
                              seasonYear: 2026
                              season: SUMMER
                              seasonLabel: 2026夏
                              premiereDate: null
                              premierePrecision: null
                            - bgmId: 579246
                              animeId: nh74sv4awtdv3h5xa4dbhe4z8h87zz6d
                              cover: https://r2.anibt.net/anime_covers/nh74sv4awtdv3h5xa4dbhe4z8h87zz6d/1125b713171e150bd38d6d6c7a93207c1b6fcbce684466fcfc864a7be2beda74.jpg
                              title:
                                primary: 暴怒千金发誓复仇。～凭借魔导书之力打垮祖国～
                                chinese: 暴怒千金发誓复仇。～凭借魔导书之力打垮祖国～
                                japanese: ブチ切れ令嬢は報復を誓いました。～魔導書の力で祖国を叩き潰します～
                              format: TV
                              kind: TV
                              rating: 4.6
                              episodes: 12
                              airingAt: 1783339200
                              weekday: 1
                              weekdayLabel: 周一
                              scheduleStatus: scheduled
                              rssReleaseCount: 47
                              hasRelease: true
                              seasonYear: 2026
                              season: SUMMER
                              seasonLabel: 2026夏
                              premiereDate: null
                              premierePrecision: null
                        - weekday: 2
                          weekdayLabel: 周二
                          animes:
                            - bgmId: 325767
                              animeId: nh7bcvpsfb780705p0g9gwe4g987zkkf
                              cover: https://r2.anibt.net/anime_covers/nh7bcvpsfb780705p0g9gwe4g987zkkf/0acede653971d620a59064fa68f960ae994f065cb8f8eb6972629bac1213f3fb.jpg
                              title:
                                primary: 感谢对战。 ～大小姐才不玩格斗游戏～
                                chinese: 感谢对战。 ～大小姐才不玩格斗游戏～
                                japanese: 対ありでした。 ～お嬢さまは格闘ゲームなんてしない～
                              format: TV
                              kind: TV
                              rating: 7.1
                              episodes: 12
                              airingAt: 1783425600
                              weekday: 2
                              weekdayLabel: 周二
                              scheduleStatus: scheduled
                              rssReleaseCount: 59
                              hasRelease: true
                              seasonYear: 2026
                              season: SUMMER
                              seasonLabel: 2026夏
                              premiereDate: null
                              premierePrecision: null
                            - bgmId: 496276
                              animeId: nh7ds1r0jzqbqsz0jjmsgz7j3s8939hz
                              cover: https://r2.anibt.net/anime_covers/nh7ds1r0jzqbqsz0jjmsgz7j3s8939hz/276cf753b7d027a11ef6fdd3106bd92b2d72c4a69217f072ba5430d126c63d24.jpg
                              title:
                                primary: 攻壳机动队 THE GHOST IN THE SHELL
                                chinese: 攻壳机动队 THE GHOST IN THE SHELL
                                japanese: 攻殻機動隊 THE GHOST IN THE SHELL
                              format: TV
                              kind: TV
                              rating: 7.4
                              episodes: 10
                              airingAt: 1783425600
                              weekday: 2
                              weekdayLabel: 周二
                              scheduleStatus: scheduled
                              rssReleaseCount: 61
                              hasRelease: true
                              seasonYear: 2026
                              season: SUMMER
                              seasonLabel: 2026夏
                              premiereDate: null
                              premierePrecision: null
                      scheduleSummary:
                        scheduled: 84
                        weekdayOnly: 0
                        missingSource: 7
                      total: 91
                      scope:
                        kind: season
                        season: 2026夏
                      limit: 200
                      truncated: false
                query:
                  summary: 全库搜索，不借用首条结果的季度
                  value:
                    ok: true
                    ts: 1790370000000
                    data:
                      currentSeason: 2026秋
                      requestedSeason: null
                      scope:
                        kind: query
                        query: jojo
                      availableSeasons:
                        - 2026春
                        - 2026秋
                      byWeekday: []
                      scheduleSummary:
                        scheduled: 0
                        weekdayOnly: 0
                        missingSource: 0
                      total: 0
                      limit: 50
                      truncated: false
        "304":
          description: ETag 未变，响应体为空
        "400":
          description: 无效查询，或同时指定 bgmId 与 query
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ErrorEnvelope"
        "429":
          $ref: "#/components/responses/RateLimited"

  /api/anime/groups:
    get:
      tags:
        - query
      operationId: anime-groups
      summary: 单番剧字幕组
      description: >
        按 bgmId 查询字幕组，每组返回最近 30 条资源，并提供 publishedEpisodes 和 totalReleases。

        magnet、size、episodeKey、resolution、format、subtitle、lastUpdatedAt 可为 null。subtitle 通常为 EXTERNAL / INTERNAL / EMBEDDED / NONE。

        已合并的旧 bgmId 返回合并后番剧的 animeId、标题和字幕组，data.bgmId 保持请求值。

        未找到番剧，或番剧被管理员隐藏、被 bgm.tv 标记为 NSFW 时返回 404；暂时无法提供完整结果时返回 503 SEARCH_UNAVAILABLE，并带 Retry-After。

        支持 GET、HEAD 和 If-None-Match；默认与季度番剧接口共用 30 次 / 60 秒 / IP 的限额。

        支持 GET、HEAD、OPTIONS；条件请求仍可能消耗限流额度。
      parameters:
        - name: bgmId
          in: query
          required: true
          description: Bangumi subject id
          schema:
            type: integer
            minimum: 1
            maximum: 10000000
      responses:
        "200":
          description: 字幕组与最近资源
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/AnimeGroupsResponse"
              examples:
                anime-groups:
                  summary: 结构示例（数组节选）
                  value:
                    ok: true
                    ts: 1790325498619
                    data:
                      bgmId: 543360
                      animeId: nh73r0ernee7s0afv9s82f763983gcz7
                      title:
                        primary: 上伊那牡丹，酒醉身姿似百合花般
                        chinese: 上伊那牡丹，酒醉身姿似百合花般
                        japanese: 上伊那ぼたん、酔へる姿は百合の花
                      groups:
                        - groupId: org_q0kdyFpr9SHP
                          slug: zzz123
                          name: Zzz睡不醒
                          status: ACTIVE
                          lastUpdatedAt: 1786863045049
                          totalReleases: 2
                          publishedEpisodes:
                            - 1
                            - 2
                          items:
                            - releaseId: rel_u0jICKZiy5M8
                              title: "[LinRip] Kamiina Botan, Yoeru Sugata wa Yuri no Hana [Vol.2][BDRemux 1080p AVC FLAC]"
                              size: 13671734121
                              magnet: magnet:?xt=urn:btih:e491c256a899e01cfd158a78dbaec212b428a240&dn=%5BLinRip%5D%20Kamiina%20Botan%2C%20Yoeru%20Sugata%20wa%20Yuri%20no%20Hana%20%5BVol.2%5D%5BBDRemux%201080p%20AVC%20FLAC%5D&xl=13671734121&tr=http%3A%2F%2Fipv4announce.sktorrent.eu%3A6969%2Fannounce&tr=http%3A%2F%2Fnyaa.tracker.wf%3A7777%2Fannounce&tr=https%3A%2F%2Ft.213891.xyz%3A443%2Fannounce&tr=https%3A%2F%2Ftracker.7471.top%3A443%2Fannounce&tr=https%3A%2F%2Ftracker.anibt.net%2Fannounce&tr=https%3A%2F%2Ftracker.foreverpirates.co%3A443%2Fannounce&tr=https%3A%2F%2Ftracker.leechshield.link%3A443%2Fannounce&tr=https%3A%2F%2Ftracker.nekomi.cn%3A443%2Fannounce&tr=https%3A%2F%2Ftracker.pmman.tech%3A443%2Fannounce&tr=https%3A%2F%2Ftracker.zhuqiy.com%3A443%2Fannounce&tr=http%3A%2F%2Ftracker.renfei.net%3A8080%2Fannounce&tr=http%3A%2F%2Fwegkxfcivgx.ydns.eu%3A80%2Fannounce&tr=udp%3A%2F%2Farchive.torrentonline.cc%3A42069%2Fannounce&tr=udp%3A%2F%2Fbittorrent-tracker.e-n-c-r-y-p-t.net%3A1337%2Fannounce&tr=udp%3A%2F%2Fevan.im%3A6969%2Fannounce&tr=udp%3A%2F%2Fobey.torrentonline.cc%3A42069%2Fannounce&tr=udp%3A%2F%2Fopen.demonii.com%3A1337%2Fannounce&tr=udp%3A%2F%2Fopen.ftorrent.com%3A443%2Fannounce&tr=udp%3A%2F%2Fopen.stealth.si%3A80%2Fannounce&tr=udp%3A%2F%2Ftorrentclub.online%3A1984%2Fannounce&tr=udp%3A%2F%2Ftracker.breizh.pm%3A6969%2Fannounce&tr=udp%3A%2F%2Ftracker.corpscorp.online%3A80%2Fannounce&tr=udp%3A%2F%2Ftracker.gmi.gd%3A6969%2Fannounce&tr=udp%3A%2F%2Ftracker.qu.ax%3A6969%2Fannounce&tr=udp%3A%2F%2Ftracker.teambelgium.net%3A6969%2Fannounce&tr=udp%3A%2F%2Ftracker.torrent.eu.org%3A451%2Fannounce&tr=udp%3A%2F%2Ftracker-udp.gbitt.info%3A80%2Fannounce&tr=udp%3A%2F%2Fwhybother.torrentonline.cc%3A42069%2Fannounce
                              episodeKey: 3-4
                              resolution: 1080p
                              format: MKV
                              language: []
                              subtitle: NONE
                              customTags:
                                - AVC
                                - BDRemux
                              version: v1
                              torrentStorageId: torrents/org_q0kdyFpr9SHP/Fg5TNIu4CD5yxqF92FZFS__LinRip__Kamiina_Botan__Yoeru_Sugata_wa_Yuri_no_Hana__Vol.2__BDRemux_1080p_AVC_FLAC_.torrent
                              publishedAt: 1786863045049
                            - releaseId: rel_RmwVrFUqRUAz
                              title: "[LinRip] Kamiina Botan, Yoeru Sugata wa Yuri no Hana [Vol.1][BDRemux 1080p AVC FLAC]"
                              size: 13671497994
                              magnet: magnet:?xt=urn:btih:a8f8b34deae89282e1c866ec794f413f71f262da&dn=%5BLinRip%5D%20Kamiina%20Botan%2C%20Yoeru%20Sugata%20wa%20Yuri%20no%20Hana%20%5BVol.1%5D%5BBDRemux%201080p%20AVC%20FLAC%5D&xl=13671497994&tr=https%3A%2F%2Ftracker.anibt.net%2Fannounce&tr=udp%3A%2F%2Fopen.stealth.si%3A80%2Fannounce&tr=udp%3A%2F%2Ftracker-udp.gbitt.info%3A80%2Fannounce&tr=http%3A%2F%2Fipv4announce.sktorrent.eu%3A6969%2Fannounce&tr=udp%3A%2F%2Ftracker.torrent.eu.org%3A451%2Fannounce&tr=udp%3A%2F%2Fopen.demonii.com%3A1337%2Fannounce&tr=udp%3A%2F%2Ftracker.qu.ax%3A6969%2Fannounce&tr=udp%3A%2F%2Fevan.im%3A6969%2Fannounce&tr=udp%3A%2F%2Fbittorrent-tracker.e-n-c-r-y-p-t.net%3A1337%2Fannounce&tr=https%3A%2F%2Ft.213891.xyz%3A443%2Fannounce&tr=udp%3A%2F%2Fns575949.ip-51-222-82.net%3A6969%2Fannounce&tr=udp%3A%2F%2Ftracker.corpscorp.online%3A80%2Fannounce&tr=https%3A%2F%2Ftracker.nekomi.cn%3A443%2Fannounce&tr=https%3A%2F%2F004430.xyz%3A443%2Fannounce&tr=https%3A%2F%2Ftracker.7471.top%3A443%2Fannounce&tr=udp%3A%2F%2Fanime-tracker.aruku.kro.kr%3A8081%2Fannounce&tr=https%3A%2F%2Ftracker.foreverpirates.co%3A443%2Fannounce&tr=udp%3A%2F%2Fmartin-gebhardt.eu%3A25%2Fannounce&tr=http%3A%2F%2Ftracker.waaa.moe%3A6969%2Fannounce&tr=https%3A%2F%2Ftracker.leechshield.link%3A443%2Fannounce&tr=udp%3A%2F%2Ftorrentclub.online%3A1984%2Fannounce&tr=udp%3A%2F%2Ftracker.nexusstream.eu%3A6969%2Fannounce&tr=http%3A%2F%2Ftracker.dhitechnical.com%3A6969%2Fannounce&tr=udp%3A%2F%2Ftracker.gmi.gd%3A6969%2Fannounce&tr=http%3A%2F%2Fbt2.archive.org%3A6969%2Fannounce&tr=udp%3A%2F%2Ftracker.aruku.ovh%3A8081%2Fannounce&tr=udp%3A%2F%2Ftracker.peerfect.org%3A6969%2Fannounce&tr=udp%3A%2F%2Fopen.ftorrent.com%3A443%2Fannounce&tr=udp%3A%2F%2Ftracker.ilibr.org%3A6969%2Fannounce&tr=udp%3A%2F%2Ftracker.dler.com%3A6969%2Fannounce&tr=http%3A%2F%2Fwegkxfcivgx.ydns.eu%3A80%2Fannounce&tr=udp%3A%2F%2Farchive.torrentonline.cc%3A42069%2Fannounce&tr=udp%3A%2F%2Ftracker.teambelgium.net%3A6969%2Fannounce&tr=http%3A%2F%2Fbt1.archive.org%3A6969%2Fannounce&tr=udp%3A%2F%2Fmail.segso.net%3A6969%2Fannounce&tr=udp%3A%2F%2Ftracker.opentrackr.com%3A6969%2Fannounce&tr=udp%3A%2F%2Fwhybother.torrentonline.cc%3A42069%2Fannounce&tr=udp%3A%2F%2Fobey.torrentonline.cc%3A42069%2Fannounce&tr=udp%3A%2F%2Ft.overflow.biz%3A6969%2Fannounce&tr=udp%3A%2F%2Ftracker.nyaa.vc%3A6969%2Fannounce&tr=http%3A%2F%2Ftracker.renfei.net%3A8080%2Fannounce&tr=https%3A%2F%2Ftracker.zhuqiy.com%3A443%2Fannounce&tr=https%3A%2F%2Fht.therarbg.to%3A443%2Fannounce&tr=http%3A%2F%2Ftracker.xn--djrq4gl4hvoi.top%3A80%2Fannounce&tr=udp%3A%2F%2Ftracker.opentrackr.org%3A1337%2Fannounce&tr=udp%3A%2F%2Fexodus.desync.com%3A6969%2Fannounce&tr=udp%3A%2F%2Ftracker.openbittorrent.com%3A6969%2Fannounce
                              episodeKey: 1-2
                              resolution: 1080p
                              format: MKV
                              language: []
                              subtitle: NONE
                              customTags:
                                - AVC
                                - BDRemux
                              version: v1
                              torrentStorageId: torrents/org_q0kdyFpr9SHP/XQM1bj6Zr2V_SmINf0K8x__LinRip__Kamiina_Botan__Yoeru_Sugata_wa_Yuri_no_Hana__Vol.1__BDRemux_1080p_AVC_FLAC_.torrent
                              publishedAt: 1785944242765
                        - groupId: org_aagmgM9i0ZyR
                          slug: kitauji-sub
                          name: 北宇治字幕组
                          status: ACTIVE
                          lastUpdatedAt: 1784573904863
                          totalReleases: 33
                          publishedEpisodes:
                            - 2
                            - 3
                          items:
                            - releaseId: rel_NmlRbreQ9kiE
                              title: "[北宇治字幕组] 上伊那牡丹，酒醉身姿似百合 / Kamiina Botan, Yoeru Sugata wa Yuri no Hana [12][WebRip][HEVC_AAC][简繁日内封]"
                              size: 567779714
                              magnet: magnet:?xt=urn:btih:e22cbf3b23a7e07a797064a45588375e785a31b3&dn=%5BKitaujiSub%5D%20Kamiina%20Botan%2C%20Yoeru%20Sugata%20wa%20Yuri%20no%20Hana%20%5B12%5D%5BWebRip%5D%5BHEVC_AAC%5D%5BCHS_JP%26CHT_JP%5D.mkv&xl=567779714&tr=http%3A%2F%2Fnyaa.tracker.wf%3A7777%2Fannounce&tr=http%3A%2F%2Fopen.acgtracker.com%3A1096%2Fannounce&tr=http%3A%2F%2Fsukebei.tracker.wf%3A8888%2Fannounce&tr=udp%3A%2F%2Ftracker.torrent.eu.org%3A451%2Fannounce&tr=udp%3A%2F%2Fopen.stealth.si%3A80%2Fannounce&tr=udp%3A%2F%2Ftracker.opentrackr.org%3A1337%2Fannounce&tr=http%3A%2F%2Ft.acg.rip%3A6699%2Fannounce&tr=http%3A%2F%2Fshare.hkg-fansub.info%3A80%2Fannounce.php&tr=http%3A%2F%2Ftracker.sbsub.com%3A2710%2Fannounce&tr=https%3A%2F%2Ftracker.anibt.net%2Fannounce
                              episodeKey: "12"
                              resolution: 1080p
                              format: MKV
                              language:
                                - CHS
                                - CHT
                              subtitle: INTERNAL
                              customTags:
                                - HEVC
                                - WEBRip
                              version: v1
                              torrentStorageId: torrents/org_aagmgM9i0ZyR/IVW6_cp5Z9AS7urtk0_n7_release.torrent
                              publishedAt: 1784573904863
                            - releaseId: rel_grFiHtIN8UId
                              title: "[北宇治字幕组] 上伊那牡丹，酒醉身姿似百合 / Kamiina Botan, Yoeru Sugata wa Yuri no Hana [12][WebRip][HEVC_AAC][繁日內嵌]"
                              size: 576702087
                              magnet: magnet:?xt=urn:btih:fe11206712883903d191d5316b7992dacdbb862c&dn=%5BKitaujiSub%5D%20Kamiina%20Botan%2C%20Yoeru%20Sugata%20wa%20Yuri%20no%20Hana%20%5B12%5D%5BWebRip%5D%5BHEVC_AAC%5D%5BCHT_JP%5D.mp4&xl=576702087&tr=https%3A%2F%2Ftracker.anibt.net%2Fannounce&tr=http%3A%2F%2Fnyaa.tracker.wf%3A7777%2Fannounce&tr=http%3A%2F%2Fopen.acgtracker.com%3A1096%2Fannounce&tr=http%3A%2F%2Fsukebei.tracker.wf%3A8888%2Fannounce&tr=udp%3A%2F%2Ftracker.torrent.eu.org%3A451%2Fannounce&tr=udp%3A%2F%2Fopen.stealth.si%3A80%2Fannounce&tr=udp%3A%2F%2Ftracker.opentrackr.org%3A1337%2Fannounce&tr=http%3A%2F%2Ft.acg.rip%3A6699%2Fannounce&tr=http%3A%2F%2Fshare.hkg-fansub.info%3A80%2Fannounce.php&tr=http%3A%2F%2Ftracker.sbsub.com%3A2710%2Fannounce
                              episodeKey: "12"
                              resolution: 1080p
                              format: MP4
                              language:
                                - CHT
                                - JP
                              subtitle: EMBEDDED
                              customTags:
                                - HEVC
                                - WEBRip
                              version: v1
                              torrentStorageId: torrents/org_aagmgM9i0ZyR/iT_kzianPY7NZ882xxmWl_release.torrent
                              publishedAt: 1783969090308
                      total: 8
        "304":
          description: ETag 未变，响应体为空
        "400":
          description: 缺少或无效的 bgmId
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ErrorEnvelope"
        "404":
          $ref: "#/components/responses/NotFound"
        "429":
          $ref: "#/components/responses/RateLimited"
        "503":
          $ref: "#/components/responses/Unavailable"

  /api/animes/torrent-match:
    post:
      tags:
        - query
      operationId: anime-torrent-match
      summary: 种子标题匹配番剧
      description: >
        解析发布标题与种子内部名，返回 auto / manual 等决定。

        传入 `groupId` 时必须登录且属于该组。GET 返回 `405 METHOD_NOT_ALLOWED`。

        公开路由 `diagnostics=true` 返回 `403`。请求体上限 32 KiB。不缓存。

        Matcher 只在本接口。不要把调用方伪造的匹配结果传给发布接口。

        发布接口必须带 `animeIdType` 与 `animeId`。

        `limit` 默认 10，上限 50。速率限制默认 180 次 / 60 秒 / IP。

        成功响应直接返回 version、content、decision、candidates 等字段，没有 ok 或 data 包装。

        未提供 infoHashHex 时 decisionToken 和 decisionTokenExpiresAt 为 null。只有 decision.kind=auto 时才可采用已列入 candidates 的决定；manual 必须由调用方确认。
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/TorrentMatchRequest"
      responses:
        "200":
          description: 匹配决定
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/TorrentMatchResponse"
              examples:
                match:
                  summary: 结构示例（数组节选）
                  value:
                    version: 3
                    content:
                      kind: anime_episode
                      confidence: high
                      reasonCodes:
                        - content.anime_episode
                    identityKey: example || sousou no frieren|s-|c-|p-|q-|f-
                    structure:
                      season: null
                      cour: null
                      part: null
                      sequence: null
                      format: null
                    decision:
                      kind: auto
                      reason: top_ranked_candidate
                      animeId: nh7a01k9tn1gew971x43xw4hgh7ys5aq
                      bgmId: 400602
                      confidence: high
                      vetoes: []
                    groupHistory: null
                    candidates:
                      - anime:
                          _id: nh7a01k9tn1gew971x43xw4hgh7ys5aq
                          _creationTime: 1767746048514
                          bgmId: 400602
                          title:
                            chinese: 葬送的芙莉莲
                            native: 葬送のフリーレン
                          titleRomaji: 葬送的芙莉莲
                          coverImage:
                            extraLarge: https://r2.anibt.net/anime_covers/nh7a01k9tn1gew971x43xw4hgh7ys5aq/7394961b8393ee7b02c54c53725d8fb6718c702d4c028f18db86dad8e8c080dd.jpg
                            large: https://r2.anibt.net/anime_covers/nh7a01k9tn1gew971x43xw4hgh7ys5aq/7394961b8393ee7b02c54c53725d8fb6718c702d4c028f18db86dad8e8c080dd.jpg
                          coverImageWebp:
                            sourceKey: anime_covers/nh7a01k9tn1gew971x43xw4hgh7ys5aq/7394961b8393ee7b02c54c53725d8fb6718c702d4c028f18db86dad8e8c080dd.jpg
                            version: 4
                            generatedAt: 1781195406072
                            variants:
                              - width: 240
                                key: anime_covers/nh7a01k9tn1gew971x43xw4hgh7ys5aq/7394961b8393ee7b02c54c53725d8fb6718c702d4c028f18db86dad8e8c080dd/v4/w240.webp
                                url: https://r2.anibt.net/anime_covers/nh7a01k9tn1gew971x43xw4hgh7ys5aq/7394961b8393ee7b02c54c53725d8fb6718c702d4c028f18db86dad8e8c080dd/v4/w240.webp
                              - width: 360
                                key: anime_covers/nh7a01k9tn1gew971x43xw4hgh7ys5aq/7394961b8393ee7b02c54c53725d8fb6718c702d4c028f18db86dad8e8c080dd/v4/w360.webp
                                url: https://r2.anibt.net/anime_covers/nh7a01k9tn1gew971x43xw4hgh7ys5aq/7394961b8393ee7b02c54c53725d8fb6718c702d4c028f18db86dad8e8c080dd/v4/w360.webp
                          officialSite: https://frieren-anime.jp/
                          format: TV
                          status: FINISHED
                          season: SUMMER
                          seasonYear: 2023
                          episodes: 36
                          averageScore: 85
                          genres:
                            - 治愈
                            - 公路片
                        animeId: nh7a01k9tn1gew971x43xw4hgh7ys5aq
                        bgmId: 400602
                        matchScore: 100
                        textMatch: 0
                        matchedHypothesisIds:
                          - release_title_hyp_2
                          - release_title_hyp_3
                        matchedInputs:
                          - release_title
                        retrieval:
                          - exact
                          - strict_recall
                        evidenceSummary:
                          source: anidb
                          kind: primary
                          rawAlias: Sousou no Frieren
                          strictKey: sousou no frieren
                          matchClass: exact
                          evidenceStrength: exact_alias
                          retrievalProvenance: exact_filter
                          sourceFamily: anidb
                          matchedQueryVariant: Sousou no Frieren
                      - anime:
                          _id: nh7azzmt97g74hxhj7s31nj91s7ysvza
                          _creationTime: 1767746084120
                          bgmId: 515759
                          title:
                            chinese: 葬送的芙莉莲 第二季
                            native: 葬送のフリーレン 第2期
                          titleRomaji: 葬送的芙莉莲 第二季
                          coverImage:
                            extraLarge: https://r2.anibt.net/anime_covers/nh7azzmt97g74hxhj7s31nj91s7ysvza/22f07b8002179f98592696e55ac9782a361d2cc3b8a5b4005a05ab136e7d4530.jpg
                            large: https://r2.anibt.net/anime_covers/nh7azzmt97g74hxhj7s31nj91s7ysvza/22f07b8002179f98592696e55ac9782a361d2cc3b8a5b4005a05ab136e7d4530.jpg
                            color: "#5dc9f1"
                          coverImageWebp:
                            sourceKey: anime_covers/nh7azzmt97g74hxhj7s31nj91s7ysvza/22f07b8002179f98592696e55ac9782a361d2cc3b8a5b4005a05ab136e7d4530.jpg
                            version: 4
                            generatedAt: 1781190254074
                            variants:
                              - width: 240
                                key: anime_covers/nh7azzmt97g74hxhj7s31nj91s7ysvza/22f07b8002179f98592696e55ac9782a361d2cc3b8a5b4005a05ab136e7d4530/v4/w240.webp
                                url: https://r2.anibt.net/anime_covers/nh7azzmt97g74hxhj7s31nj91s7ysvza/22f07b8002179f98592696e55ac9782a361d2cc3b8a5b4005a05ab136e7d4530/v4/w240.webp
                              - width: 360
                                key: anime_covers/nh7azzmt97g74hxhj7s31nj91s7ysvza/22f07b8002179f98592696e55ac9782a361d2cc3b8a5b4005a05ab136e7d4530/v4/w360.webp
                                url: https://r2.anibt.net/anime_covers/nh7azzmt97g74hxhj7s31nj91s7ysvza/22f07b8002179f98592696e55ac9782a361d2cc3b8a5b4005a05ab136e7d4530/v4/w360.webp
                          officialSite: https://frieren-anime.jp/
                          format: TV
                          status: FINISHED
                          season: WINTER
                          seasonYear: 2026
                          episodes: 10
                          averageScore: 75
                          genres:
                            - 奇幻
                            - MADHouse
                        animeId: nh7azzmt97g74hxhj7s31nj91s7ysvza
                        bgmId: 515759
                        matchScore: 80
                        textMatch: 0
                        matchedHypothesisIds:
                          - release_title_hyp_2
                          - release_title_hyp_3
                        matchedInputs:
                          - release_title
                        retrieval:
                          - exact
                          - strict_recall
                        evidenceSummary:
                          source: bgm_tv
                          kind: alternate
                          rawAlias: Sousou no Frieren 2nd Season
                          strictKey: sousou no frieren 2nd season
                          matchClass: base
                          evidenceStrength: exact_alias
                          retrievalProvenance: exact_filter
                          sourceFamily: bangumi_tv
                          seasonNumber: 2
                          matchedQueryVariant: Sousou no Frieren
                    search:
                      branchCount: 3
                      exactOverflow: false
                      recallOverflow: false
                      candidateOverflow: false
                      searchCutoff: false
                      exactVerificationFailed: false
                      versionMismatch: false
                      generationMismatch: false
                      projectionMismatch: false
                      candidateSetComplete: true
                      strictRecallUsed: true
                      fuzzyRecallUsed: true
                      generation: t15_20260909
                    diagnostics: null
                    decisionToken: null
                    decisionTokenExpiresAt: null
        "400":
          description: 无效 JSON 或请求体
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ErrorEnvelope"
        "403":
          $ref: "#/components/responses/Forbidden"
        "405":
          description: 方法不允许。本接口只接受 POST
        "413":
          description: 请求体超过 32 KiB
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ErrorEnvelope"
        "422":
          description: 字段校验失败
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ErrorEnvelope"
        "429":
          $ref: "#/components/responses/RateLimited"
        "503":
          description: 匹配暂不可用
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ErrorEnvelope"

  /rss/anime.xml:
    get:
      tags:
        - rss
      operationId: rss-anime
      summary: 番剧 RSS
      description: >
        主入口。`bgmId` 与 `groupSlug` 至少提供一个。兼容 Mikan 的 `bangumiId`、`subgroupid`。

        Tag 可重复或逗号分隔：`?resolution=1080p&resolution=720p` 与 `?resolution=1080p,720p` 等价。

        非法 `limit` 返回应用 `400`，生产边缘可能先 `403`。与默认值等价的写法会 `308` 到规范 URL。

        bgm.tv 合并过的旧 `bgmId` 会 `308` 到把 `bgmId` 换成新 ID 的同一 URL，`groupSlug` 等其他参数不变。恰好只有 `bgmId` 与 `groupSlug` 的订阅链接同样跳转，跟随即可，不必重新订阅。目标番剧暂时无法解析时返回 `503`（`Cache-Control: no-store`），不返回 `404`。

        每个 `<item>`：`<title>`、`<link>`（`/release/<id>`）、`<guid>`、`<pubDate>`（RFC 822，`+0800`）、`<enclosure>` 种子下载链接、`<torrent>` infoHash、已绑定时 `<anibt:bgmId>`。

        `limit` 默认 100，上限 100。速率限制默认 120 次 / 60 秒 / IP。

        浏览器直开返回原生 XML。搜索引擎不抓 `/rss/`。

        成功响应为 application/xml，enclosure 指向 .torrent 文件；错误正文通常为纯文本。GET 与 HEAD 支持 If-None-Match。
      parameters:
        - $ref: "#/components/parameters/BgmId"
        - name: bangumiId
          in: query
          description: bgmId 的 Mikan 兼容别名
          schema:
            type: integer
        - $ref: "#/components/parameters/GroupSlug"
        - name: subgroupSlug
          in: query
          description: groupSlug 别名
          schema:
            type: string
        - name: subgroupid
          in: query
          description: groupSlug 的 Mikan 兼容别名
          schema:
            type: string
        - $ref: "#/components/parameters/Resolution"
        - $ref: "#/components/parameters/Language"
        - $ref: "#/components/parameters/Format"
        - $ref: "#/components/parameters/Subtitle"
        - name: episode
          in: query
          description: 数字集数，精确匹配
          schema:
            type: integer
        - name: episodeKey
          in: query
          description: 显示集数键，如 01、BATCH
          schema:
            type: string
        - $ref: "#/components/parameters/RssLimit"
      responses:
        "200":
          description: RSS 2.0
          content:
            application/xml:
              schema:
                type: string
                description: RSS 2.0 XML；enclosure 为 application/x-bittorrent 下载 URL。
              examples:
                rss-anime:
                  summary: rss-anime
                  value: |
                    <?xml version="1.0" encoding="UTF-8"?>
                    <rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:anibt="https://anibt.net/xmlns/rss/1.0/">
                      <channel>
                        <title>上伊那牡丹，酒醉身姿似百合花般</title>
                        <link>https://anibt.net/anime/543360</link>
                        <description>AniBT RSS feed for bgmId 543360</description>
                        <atom:link href="https://anibt.net/rss/anime.xml?bgmId=543360&amp;limit=1" rel="self" type="application/rss+xml" />
                        <ttl>2</ttl>
                        <item>
                          <title>[LinRip] Kamiina Botan, Yoeru Sugata wa Yuri no Hana [Vol.2][BDRemux 1080p AVC FLAC]</title>
                          <link>https://anibt.net/release/rel_u0jICKZiy5M8</link>
                          <guid isPermaLink="false">rel_u0jICKZiy5M8</guid>
                          <pubDate>Sun, 16 Aug 2026 14:50:45 +0800</pubDate>
                          <anibt:type>anime</anibt:type>
                          <anibt:releaseId>rel_u0jICKZiy5M8</anibt:releaseId>
                          <anibt:releasePageUrl>https://anibt.net/release/rel_u0jICKZiy5M8</anibt:releasePageUrl>
                          <anibt:torrentUrl>https://anibt.net/api/torrent/rel_u0jICKZiy5M8.torrent</anibt:torrentUrl>
                          <anibt:bgmId>543360</anibt:bgmId>
                          <anibt:animeTitle>上伊那牡丹，酒醉身姿似百合花般</anibt:animeTitle>
                          <anibt:releaseTitle>[LinRip] Kamiina Botan, Yoeru Sugata wa Yuri no Hana [Vol.2][BDRemux 1080p AVC FLAC]</anibt:releaseTitle>
                          <anibt:episode>3</anibt:episode>
                          <anibt:episodeKey>3-4</anibt:episodeKey>
                          <anibt:version>v1</anibt:version>
                          <anibt:groupName>Zzz睡不醒</anibt:groupName>
                          <anibt:groupSlug>zzz123</anibt:groupSlug>
                          <anibt:resolution>1080p</anibt:resolution>
                          <anibt:subtitle>NONE</anibt:subtitle>
                          <anibt:format>MKV</anibt:format>
                          <anibt:fileSize>13671734121</anibt:fileSize>
                          <anibt:customTag>AVC</anibt:customTag>
                          <anibt:customTag>BDRemux</anibt:customTag>
                          <anibt:customTag>FLAC</anibt:customTag>
                          <description><![CDATA[<p><strong>上伊那牡丹，酒醉身姿似百合花般</strong> · 3-4 · v1</p>
                    <hr/>
                    ## 借物表
                    <br/>
                    | 项目 | 来源 |
                    | --- | --- |
                    | 原盘 | U2#65838 |
                    | 字幕 | 无 |
                    <br/>
                    <img src="https://image.tmdb.org/t/p/w500/wpUGWITiEBNrRxLg0DoXXOZiVMA.jpg" alt="上伊那牡丹，醉姿如百合" />
                    <br/>
                    ❁ Title:　上伊那牡丹，醉姿如百合
                    ❁ Original Title:　上伊那ぼたん、酔へる姿は百合の花
                    ❁ Genres:　动画 / 喜剧 / 剧情
                    ❁ Languages:　Japanese
                    ❁ First Air Date:　2026-04-11
                    ❁ Number of Episodes:　12
                    ❁ Number of Seasons:　1
                    ❁ Episode Runtime:　24 minutes
                    ❁ Production Countries:　Japan
                    ❁ Rating:　7.6 / 10 from 22 users
                    ❁ TMDB Link:　https://www.themoviedb.org/tv/283905/
                    ❁ IMDb Link:　https://www.imdb.com/title/tt38273912/
                    ❁ Producers:　田中瑛 / 橋本京佳 / 古川雄太 / 井东真一 / 大和田智之 / 三浦史 / 纪东辉
                    <br/>
                    ❁ Cast
                    铃代纱弓 as Botan Kamiina (voice)
                    青山吉能 as Ibuki Tonami (voice)
                    寿美菜子 as Kanade Gujō (voice)
                    天海由梨奈 as Akane Yusa (voice)
                    富田美忧 as Yaeka Kitamori (voice)
                    河濑茉希 as Chang Chin-Lan (voice)
                    <br/>
                    ❁ Introduction
                    上伊那牡丹以升入大学为契机，搬进了学生宿舍。她与宿舍的室友们一同前往秩父参加芝樱节，在长椅上发现宿舍长砺波伊吹正独自饮酒。看到伊吹喝高球酒时那副津津有味的样子，牡丹深受吸引，说道：“我也想尝尝那个”，于是品尝了人生中的第一口酒。由此领略到酒之美味的牡丹，开始与同住的宿舍同学们一起品尝烧酒、葡萄酒、威士忌等各式美酒，彼此之间的关系也日益加深。另一方面，因过去的苦涩经历而坚持“独自饮酒”的伊吹，在与那喝得开心又津津有味的牡丹相处的过程中，也逐渐萌生了想与她共饮的念头……
                    <br/>
                    ``<code>
                    General
                    Unique ID                                : 63796898537831721538890399507236189589 (0x2FFED5F217F2FFC0F343B454F0C6F595)
                    Complete name                            : [LinRip] Kamiina Botan, Yoeru Sugata wa Yuri no Hana - 03 [BDRemux 1080p AVC FLAC].mkv
                    Format                                   : Matroska
                    Format version                           : Version 4
                    File size                                : 6.35 GiB
                    Duration                                 : 23 min 41 s
                    Overall bit rate mode                    : Variable
                    Overall bit rate                         : 38.4 Mb/s
                    Frame rate                               : 23.976 FPS
                    Encoded date                             : 2026-08-16 04:30:37 UTC
                    Writing application                      : mkvmerge v92.0 ('Everglow') 64-bit
                    Writing library                          : libebml v1.4.5 + libmatroska v1.7.1
                    <br/>
                    Video
                    ID                                       : 1
                    Format                                   : AVC
                    Format/Info                              : Advanced Video Codec
                    Format profile                           : High@L4.1
                    Format settings                          : CABAC / 4 Ref Frames
                    Format settings, CABAC                   : Yes
                    Format settings, Reference frames        : 4 frames
                    Format settings, Slice count             : 4 slices per frame
                    Codec ID                                 : V_MPEG4/ISO/AVC
                    Duration                                 : 23 min 41 s
                    Bit rate mode                            : Variable
                    Bit rate                                 : 35.9 Mb/s
                    Maximum bit rate                         : 40.0 Mb/s
                    Width                                    : 1 920 pixels
                    Height                                   : 1 080 pixels
                    Display aspect ratio                     : 16:9
                    Frame rate mode                          : Constant
                    Frame rate                               : 23.976 (24000/1001) FPS
                    Color space                              : YUV
                    Chroma subsampling                       : 4:2:0
                    Bit depth                                : 8 bits
                    Scan type                                : Progressive
                    Bits/(Pixel*Frame)                       : 0.722
                    Time code of first frame                 : 01:00:00:00
                    Stream size                              : 5.94 GiB (93%)
                    Default                                  : Yes
                    Forced                                   : No
                    <br/>
                    Audio #1
                    ID                                       : 2
                    Format                                   : FLAC
                    Format/Info                              : Free Lossless Audio Codec
                    Codec ID                                 : A_FLAC
                    Duration                                 : 23 min 41 s
                    Bit rate mode                            : Variable
                    Bit rate                                 : 1 322 kb/s
                    Channel(s)                               : 2 channels
                    Channel layout                           : L R
                    Sampling rate                            : 48.0 kHz
                    Frame rate                               : 10.417 FPS (4608 SPF)
                    Bit depth                                : 24 bits
                    Compression mode                         : Lossless
                    Stream size                              : 224 MiB (3%)
                    Title                                    : 日本語
                    Writing library                          : Lavf61.7.100
                    Language                                 : Japanese
                    Default                                  : Yes
                    Forced                                   : No
                    MD5 of the unencoded content             : 33FF2E5AE99DCB9245C59A660862C02F
                    <br/>
                    Audio #2
                    ID                                       : 3
                    Format                                   : FLAC
                    Format/Info                              : Free Lossless Audio Codec
                    Codec ID                                 : A_FLAC
                    Duration                                 : 23 min 41 s
                    Bit rate mode                            : Variable
                    Bit rate                                 : 1 190 kb/s
                    Channel(s)                               : 2 channels
                    Channel layout                           : L R
                    Sampling rate                            : 48.0 kHz
                    Frame rate                               : 10.417 FPS (4608 SPF)
                    Bit depth                                : 24 bits
                    Compression mode                         : Lossless
                    Stream size                              : 202 MiB (3%)
                    Title                                    : オーディオコメンタリー
                    Writing library                          : Lavf61.7.100
                    Language                                 : Japanese
                    Default                                  : No
                    Forced                                   : No
                    MD5 of the unencoded content             : 0D92BDA37E2B64EE607CF6F83068C1A5
                    <br/>
                    Menu
                    00:00:00.000                             : ja:Chapter 01
                    00:01:27.004                             : ja:Chapter 02
                    00:02:57.052                             : ja:Chapter 03
                    00:13:51.039                             : ja:Chapter 04
                    00:21:04.054                             : ja:Chapter 05
                    00:22:34.103                             : ja:Chapter 06
                    </code>``
                    <hr/>
                    <p>🏷️ Zzz睡不醒 · 📺 1080p · 💬 NONE · 📁 MKV · 💾 12.73 GB</p>
                    <p>🔖 AVC, BDRemux, FLAC</p>
                    <hr/>
                    <p>⬇️ <a href="https://anibt.net/api/torrent/rel_u0jICKZiy5M8.torrent">下载种子</a></p>
                    <p>🔗 <a href="https://anibt.net/release/rel_u0jICKZiy5M8">查看详情</a></p>]]></description>
                          <torrent xmlns="https://anibt.moe/xmlns/0.1/">
                            <link>https://anibt.net/release/rel_u0jICKZiy5M8</link>
                            <contentLength>13671734121</contentLength>
                            <pubDate>2026-08-16T14:50:45+08:00</pubDate>
                            <infohash>e491c256a899e01cfd158a78dbaec212b428a240</infohash>
                            <filename>[LinRip] Kamiina Botan, Yoeru Sugata wa Yuri no Hana [Vol.2][BDRemux 1080p AVC FLAC]</filename>
                          </torrent>
                          <enclosure url="https://anibt.net/api/torrent/rel_u0jICKZiy5M8.torrent" length="13671734121" type="application/x-bittorrent" />
                        </item>
                      </channel>
                    </rss>
        "304":
          description: 内容未变，复用已保存的正文
        "308":
          description: 使用 Location 指向的规范 URL。
          headers:
            Location:
              schema:
                type: string
        "400":
          description: 无效参数
          content:
            text/plain:
              schema:
                type: string
        "404":
          description: 目标不存在
          content:
            text/plain:
              schema:
                type: string
        "429":
          description: 请求过于频繁
          content:
            text/plain:
              schema:
                type: string
          headers:
            Retry-After:
              description: 重试前等待秒数。
              schema:
                type: integer
                minimum: 1
        "503":
          description: 暂不可用；不保证提供 Retry-After
          content:
            text/plain:
              schema:
                type: string

  /rss/group/{slug}.xml:
    get:
      tags:
        - rss
      operationId: rss-group
      summary: 字幕组短链 RSS
      description: |
        字幕组最新番剧资源；只接受 limit，不接受标签过滤。其他类资源见 /rss/other/{category}.xml。
        未知 slug 返回 404；别名、默认参数及多余参数可能 308 到规范 URL。limit 默认及上限均为 100。
        成功响应为 application/xml，enclosure 指向 .torrent 文件；错误正文通常为纯文本。GET 与 HEAD 支持 If-None-Match。
      parameters:
        - name: slug
          in: path
          required: true
          description: 字幕组 slug
          schema:
            type: string
        - $ref: "#/components/parameters/RssLimit"
      responses:
        "200":
          description: RSS 2.0
          content:
            application/xml:
              schema:
                type: string
                description: RSS 2.0 XML；enclosure 为 application/x-bittorrent 下载 URL。
              examples:
                rss-group:
                  summary: rss-group
                  value: |
                    <?xml version="1.0" encoding="UTF-8"?>
                    <rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:anibt="https://anibt.net/xmlns/rss/1.0/">
                      <channel>
                        <title>Kirara Fantasia · AniBT</title>
                        <link>https://anibt.net/group/kirara-fantasia</link>
                        <description>Latest releases by Kirara Fantasia</description>
                        <atom:link href="https://anibt.net/rss/group/kirara-fantasia.xml?limit=1" rel="self" type="application/rss+xml" />
                        <ttl>2</ttl>
                        <item>
                          <title>[黒ネズミたち] 花織即使是轉生也想打架 / Hanaori - 11 (ABEMA 1920x1080 AVC AAC MKV)</title>
                          <link>https://anibt.net/release/rel_QAkPGYpD-Run</link>
                          <guid isPermaLink="false">rel_QAkPGYpD-Run</guid>
                          <pubDate>Fri, 25 Sep 2026 11:00:58 +0800</pubDate>
                          <anibt:type>anime</anibt:type>
                          <anibt:releaseId>rel_QAkPGYpD-Run</anibt:releaseId>
                          <anibt:releasePageUrl>https://anibt.net/release/rel_QAkPGYpD-Run</anibt:releasePageUrl>
                          <anibt:torrentUrl>https://anibt.net/api/torrent/rel_QAkPGYpD-Run.torrent</anibt:torrentUrl>
                          <anibt:bgmId>587109</anibt:bgmId>
                          <anibt:animeTitle>花织同学转生后还是想干架</anibt:animeTitle>
                          <anibt:releaseTitle>[黒ネズミたち] 花織即使是轉生也想打架 / Hanaori - 11 (ABEMA 1920x1080 AVC AAC MKV)</anibt:releaseTitle>
                          <anibt:episode>11</anibt:episode>
                          <anibt:episodeKey>11</anibt:episodeKey>
                          <anibt:version>v1</anibt:version>
                          <anibt:groupName>Kirara Fantasia</anibt:groupName>
                          <anibt:groupSlug>kirara-fantasia</anibt:groupSlug>
                          <anibt:resolution>1080p</anibt:resolution>
                          <anibt:subtitle>NONE</anibt:subtitle>
                          <anibt:format>MKV</anibt:format>
                          <anibt:fileSize>755453303</anibt:fileSize>
                          <anibt:customTag>AVC</anibt:customTag>
                          <anibt:customTag>AAC</anibt:customTag>
                          <anibt:customTag>ABEMA</anibt:customTag>
                          <description><![CDATA[<p><strong>花织同学转生后还是想干架</strong> · 11 · v1</p>
                    <hr/>
                    <img src="https://i0.wp.com/image.p-c2-x.abema-tv.com/image/programs/198-20_s1_p11/thumb006.png" alt="" />
                    <em> </em> *
                    ### <strong><em>Hanaori-san wa Tensei shitemo Kenka ga Shitai</em></strong> - EP 11
                    <strong><a href="https://anilist.co/anime/199066">AniList</a> | <a href="https://bgm.tv/subject/587109">bangumi.tv</a> | <a href="https://myanimelist.net/anime/62535">MAL</a> | <a href="https://www.themoviedb.org/tv/312266">TMDB</a></strong>
                    <br/>
                    <em> </em> *
                    <br/>
                    <strong>Information:</strong>
                    <br/>
                    <ul>
                    <li><strong>Overall Bitrate:</strong> 4 196 kb/s</li>
                    <li><strong>Subtitles:</strong> N/A</li>
                    <li><strong>Duration:</strong> 00:24:00.185</li>
                    <li><strong>CRC32:</strong> 77F102FE</li>
                    <li><strong><a href="https://rr1---nfo.ouo.si/%5BDynamis%20One%5D%20Hanaori%20-%2011%20%28ABEMA%201920x1080%20AVC%20AAC%20MKV%29%20%5B77F102FE%5D.mkv?v=pre-20260429">MediaInfo</a></strong></li>
                    </ul>
                    <br/>
                    <em> </em> *
                    <br/>
                    In case of any issues with the file, please let us know via the contact details below.
                    <strong>Xunlei has been banned by default.</strong>
                    <strong>Seeding after downloading is appreciated.</strong>
                    <br/>
                    <em> </em> *
                    <br/>
                    <strong>Contact:</strong>
                    <ul>
                    <li><strong>Rel: <a href="https://ouo.si/user/BraveSail">ouo.si</a> | <a href="https://mikanani.me/Home/PublishGroup/392">Mikan Project</a> | <a href="https://bangumi.moe/search/63e4b7585fa12c0007949b88">Bangumi Moe</a> | <a href="https://acg.rip/user/5570">ACG.RIP</a> | <a href="https://share.acgnx.se/user-529-1.html">Project AcgnX Torrent Asia</a> | <a href="https://anibt.net/group/kirara-fantasia">Anibt</a></strong></li>
                    <li>Join us on <a href="https://kirara-fantasia.moe/telegram">Telegram</a> | <a href="https://kirara-fantasia.moe/discord">Discord</a></li>
                    </ul>
                    <br/>
                    <img src="https://tgblf2f73yax8cc6.goatcounter.com/count?e=1&amp;p=anibt" alt="" />
                    <hr/>
                    <p>🏷️ Kirara Fantasia · 📺 1080p · 💬 NONE · 📁 MKV · 💾 720.46 MB</p>
                    <p>🔖 AVC, AAC, ABEMA</p>
                    <hr/>
                    <p>⬇️ <a href="https://anibt.net/api/torrent/rel_QAkPGYpD-Run.torrent">下载种子</a></p>
                    <p>🔗 <a href="https://anibt.net/release/rel_QAkPGYpD-Run">查看详情</a></p>]]></description>
                          <torrent xmlns="https://anibt.moe/xmlns/0.1/">
                            <link>https://anibt.net/release/rel_QAkPGYpD-Run</link>
                            <contentLength>755453303</contentLength>
                            <pubDate>2026-09-25T11:00:58+08:00</pubDate>
                            <infohash>817d7a9075cd509f61fe861a4d02b0e3eb2271e5</infohash>
                            <filename>[黒ネズミたち] 花織即使是轉生也想打架 / Hanaori - 11 (ABEMA 1920x1080 AVC AAC MKV)</filename>
                          </torrent>
                          <enclosure url="https://anibt.net/api/torrent/rel_QAkPGYpD-Run.torrent" length="755453303" type="application/x-bittorrent" />
                        </item>
                      </channel>
                    </rss>
        "304":
          description: 内容未变，复用已保存的正文
        "308":
          description: 使用 Location 指向的规范 URL。
          headers:
            Location:
              schema:
                type: string
        "400":
          description: 无效参数
          content:
            text/plain:
              schema:
                type: string
        "404":
          description: 目标不存在
          content:
            text/plain:
              schema:
                type: string
        "429":
          description: 请求过于频繁
          content:
            text/plain:
              schema:
                type: string
          headers:
            Retry-After:
              description: 重试前等待秒数。
              schema:
                type: integer
                minimum: 1
        "503":
          description: 暂不可用；不保证提供 Retry-After
          content:
            text/plain:
              schema:
                type: string

  /rss/magnets.xml:
    get:
      tags:
        - rss
      operationId: rss-magnets
      summary: 全站磁力 RSS
      description: |
        全站最近番剧资源；已绑定的条目带 anibt:bgmId。limit 默认及上限均为 100。
        q 与 search 只能提供一个值；规范化后最多 160 UTF-8 字节，不允许空值或控制字符。
        支持 resolution、language、format、sortField、sortOrder；不支持 cursor 或 page 分页，多余参数会被规范化重定向移除。
        成功响应为 application/xml，enclosure 指向 .torrent 文件；错误正文通常为纯文本。GET 与 HEAD 支持 If-None-Match。
      parameters:
        - $ref: "#/components/parameters/RssLimit"
        - $ref: "#/components/parameters/SearchQ"
        - name: search
          in: query
          description: q 的别名。与 q 只能提供一个值
          schema:
            type: string
        - $ref: "#/components/parameters/Resolution"
        - $ref: "#/components/parameters/Language"
        - $ref: "#/components/parameters/Format"
        - name: sortField
          in: query
          description: publishedAt / fileSize
          schema:
            type: string
            enum:
              - publishedAt
              - fileSize
            default: publishedAt
        - name: sortOrder
          in: query
          description: desc / asc
          schema:
            type: string
            enum:
              - desc
              - asc
            default: desc
      responses:
        "200":
          description: RSS 2.0
          content:
            application/xml:
              schema:
                type: string
                description: RSS 2.0 XML；enclosure 为 application/x-bittorrent 下载 URL。
              examples:
                rss-magnets:
                  summary: rss-magnets
                  value: |
                    <?xml version="1.0" encoding="UTF-8"?>
                    <rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:anibt="https://anibt.net/xmlns/rss/1.0/">
                      <channel>
                        <title>AniBT Anime Releases</title>
                        <link>https://anibt.net/magnets</link>
                        <description>Latest anime releases</description>
                        <atom:link href="https://anibt.net/rss/magnets.xml?limit=1" rel="self" type="application/rss+xml" />
                        <ttl>2</ttl>
                        <item>
                          <title>[绿茶字幕组] 无职转生 第三季 ～到了异世界就拿出真本事～ / Mushoku Tensei S3 [09][WebRip][1080p][简繁日内封]</title>
                          <link>https://anibt.net/release/rel_aM2SHvOtUlhx</link>
                          <guid isPermaLink="false">rel_aM2SHvOtUlhx</guid>
                          <pubDate>Fri, 25 Sep 2026 15:52:25 +0800</pubDate>
                          <anibt:type>anime</anibt:type>
                          <anibt:releaseId>rel_aM2SHvOtUlhx</anibt:releaseId>
                          <anibt:releasePageUrl>https://anibt.net/release/rel_aM2SHvOtUlhx</anibt:releasePageUrl>
                          <anibt:torrentUrl>https://anibt.net/api/torrent/rel_aM2SHvOtUlhx.torrent</anibt:torrentUrl>
                          <anibt:bgmId>501963</anibt:bgmId>
                          <anibt:animeTitle>无职转生Ⅲ ～到了异世界就拿出真本事～</anibt:animeTitle>
                          <anibt:releaseTitle>[绿茶字幕组] 无职转生 第三季 ～到了异世界就拿出真本事～ / Mushoku Tensei S3 [09][WebRip][1080p][简繁日内封]</anibt:releaseTitle>
                          <anibt:episode>9</anibt:episode>
                          <anibt:episodeKey>9</anibt:episodeKey>
                          <anibt:version>v1</anibt:version>
                          <anibt:groupName>绿茶字幕组</anibt:groupName>
                          <anibt:groupSlug>studio-greentea</anibt:groupSlug>
                          <anibt:resolution>1080p</anibt:resolution>
                          <anibt:language>CHS</anibt:language>
                          <anibt:language>CHT</anibt:language>
                          <anibt:language>JP</anibt:language>
                          <anibt:subtitle>INTERNAL</anibt:subtitle>
                          <anibt:format>MKV</anibt:format>
                          <anibt:fileSize>357873674</anibt:fileSize>
                          <anibt:customTag>WEBRip</anibt:customTag>
                          <anibt:customTag>HEVC</anibt:customTag>
                          <anibt:customTag>10bit</anibt:customTag>
                          <anibt:customTag>AAC</anibt:customTag>
                          <description><![CDATA[<p><strong>无职转生Ⅲ ～到了异世界就拿出真本事～</strong> · 9 · v1</p>
                    <hr/>
                    <img src="https://i.anibt.net/image-host/2026/07/13/mszfZyY/image-mszfZyY.webp" alt="作品海报图" />
                    <br/>
                    ### <strong>资源使用指引</strong>
                    下载建议：请勿使用迅雷、夸克、百度网盘等软件下载（易限速/失效），<strong>推荐使用<a href="https://www.qbittorrent.org/">qbittorrent</a>下载</strong>（利于种子存活）\
                    播放建议：为了能够顺利显示字幕效果，<strong>推荐使用</strong><a href="https://mpv.io/installation/">**MPV播放器**</a>或使用<a href="https://potplayer.tv/">Potplayer播放器</a>搭载<a href="https://github.com/Masaiki/xy-VSFilter">XySubFilter with libass字幕滤镜</a>观看内封字幕源。
                    <br/>
                    ----
                    <br/>
                    ### <strong>官方渠道</strong>
                    哔哩哔哩：<a href="https://space.bilibili.com/1007391147%20%22%E7%82%B9%E5%87%BB%E8%AE%BF%E9%97%AE%20%E5%93%94%E5%93%A9%E5%93%94%E5%93%A9%20%E4%B8%BB%E9%A1%B5%22">绿茶字幕组</a>\
                    微博：<a href="https://weibo.com/u/8424435796%20%22%E7%82%B9%E5%87%BB%E8%AE%BF%E9%97%AE%20%E5%BE%AE%E5%8D%9A%20%E4%B8%BB%E9%A1%B5%22">绿茶字幕组</a>\
                    GitHub字幕仓库：<a href="https://github.com/Studio-Green-Tea/Studio-GreenTea-Subtitle-Storage%20%22%E7%82%B9%E5%87%BB%E8%AE%BF%E9%97%AE%20%E7%BB%BF%E8%8C%B6%E5%AD%97%E5%B9%95%E7%BB%84%20%E5%AD%97%E5%B9%95%E5%AD%98%E5%82%A8%E4%BB%93%E5%BA%93%20%E4%B8%BB%E9%A1%B5%22">绿茶字幕组 字幕存储仓库</a>\
                    问题反馈邮箱：studio_greentea@163.com
                    <br/>
                    ----
                    <br/>
                    ### <strong>字幕转载声明</strong>
                    若非特别声明，本组字幕作品基于<strong>CCBY-NC-ND4.0协议</strong>共享，使用方须遵守以下默认规则：
                    <ul>
                    <li>禁止<strong>商用</strong>：不得用于商业目的或参与商业性质项目。</li>
                    <li>禁止<strong>修改</strong>：不得发布任何修改版（包括但不限于内嵌、压制、调整时间轴等）。</li>
                    <li>转载规范：可自由转载，但须<strong>保持内容完整并注明出处</strong>。</li>
                    </ul>
                    <br/>
                    <strong>关于组间合作：</strong>\
                    如有联合汉化、授权压制等合作意向，请先联系本组获取<strong>单独授权</strong>。\
                    上述行为属例外许可，不视作对原协议中“禁止演绎”条款的放弃或变更。\
                    联络邮箱：studio_greentea@163.com
                    <br/>
                    ----
                    <br/>
                    ### <strong>作品发布平台</strong>
                    本组作品首发于：<a href="https://anibt.net/group/studio-greentea">Anibt</a>\
                    同步发布于：<a href="https://mikanime.tv/Home/PublishGroup/1009">蜜柑计划</a>、<a href="https://share.dmhy.org/topics/list/team_id/867">动漫花园资源网</a>、<a href="https://acg.rip/team/212">ACG.RIP</a>、<a href="https://share.acgnx.se/team-144-1.html">末日动漫资源库</a>、<a href="https://bangumi.moe/search/693658525394e500070fbc95">萌番组</a>\
                    平台自动搬运：<a href="https://www.comicat.org/search.php?keyword=%E7%BB%BF%E8%8C%B6%E5%AD%97%E5%B9%95%E7%BB%84">漫猫动漫</a>、<a href="https://www.kisssub.org/search.php?keyword=%E7%BB%BF%E8%8C%B6%E5%AD%97%E5%B9%95%E7%BB%84">爱恋动漫</a>、<a href="https://www.miobt.com/search.php?keyword=%E7%BB%BF%E8%8C%B6%E5%AD%97%E5%B9%95%E7%BB%84">MioBT</a>
                    <br/>
                    <img src="https://picbed.291277.xyz/file/%E7%BB%BF%E8%8C%B6%E5%AD%97%E5%B9%95%E7%BB%84%E5%AE%A3%E4%BC%A0%E9%A1%B5-%E6%A8%AA%E6%9D%BFv2_%E5%B0%8F%E6%96%87%E4%BB%B6%E4%BD%93%E7%A7%AF%E7%89%88%E6%9C%AC.webp" alt="招募宣传图" />
                    <hr/>
                    <p>🏷️ 绿茶字幕组 · 📺 1080p · 🌐 CHS+CHT+JP · 💬 INTERNAL · 📁 MKV · 💾 341.29 MB</p>
                    <p>🔖 WEBRip, HEVC, 10bit, AAC</p>
                    <hr/>
                    <p>⬇️ <a href="https://anibt.net/api/torrent/rel_aM2SHvOtUlhx.torrent">下载种子</a></p>
                    <p>🔗 <a href="https://anibt.net/release/rel_aM2SHvOtUlhx">查看详情</a></p>]]></description>
                          <torrent xmlns="https://anibt.moe/xmlns/0.1/">
                            <link>https://anibt.net/release/rel_aM2SHvOtUlhx</link>
                            <contentLength>357873674</contentLength>
                            <pubDate>2026-09-25T15:52:25+08:00</pubDate>
                            <infohash>d536523c36c24a823c632015789bf60a2fcfe831</infohash>
                            <filename>[绿茶字幕组] 无职转生 第三季 ～到了异世界就拿出真本事～ / Mushoku Tensei S3 [09][WebRip][1080p][简繁日内封]</filename>
                          </torrent>
                          <enclosure url="https://anibt.net/api/torrent/rel_aM2SHvOtUlhx.torrent" length="357873674" type="application/x-bittorrent" />
                        </item>
                      </channel>
                    </rss>
        "304":
          description: 内容未变，复用已保存的正文
        "308":
          description: 使用 Location 指向的规范 URL。
          headers:
            Location:
              schema:
                type: string
        "400":
          description: 无效参数
          content:
            text/plain:
              schema:
                type: string
        "404":
          description: 目标不存在
          content:
            text/plain:
              schema:
                type: string
        "429":
          description: 请求过于频繁
          content:
            text/plain:
              schema:
                type: string
          headers:
            Retry-After:
              description: 重试前等待秒数。
              schema:
                type: integer
                minimum: 1
        "503":
          description: 暂不可用；不保证提供 Retry-After
          content:
            text/plain:
              schema:
                type: string

  /rss/other/{category}.xml:
    get:
      tags:
        - rss
      operationId: rss-other
      summary: 其他类 RSS
      description: |
        不混入番剧 RSS。空分类仍返回有效空 channel。无 `<anibt:bgmId>`。
        详情页路径：`/other-release/<id>`。
        `limit` 默认 100，上限 100。速率限制默认 120 次 / 60 秒 / IP。
        成功响应为 application/xml，enclosure 指向 .torrent 文件；错误正文通常为纯文本。GET 与 HEAD 支持 If-None-Match。
      parameters:
        - name: category
          in: path
          required: true
          description: manga / music / raw / stage / collection / movie / other
          schema:
            $ref: "#/components/schemas/OtherCategory"
        - $ref: "#/components/parameters/RssLimit"
        - $ref: "#/components/parameters/SearchQ"
        - name: search
          in: query
          description: q 的别名。与 q 只能提供一个值
          schema:
            type: string
        - name: groupId
          in: query
          description: 字幕组组织 ID
          schema:
            type: string
        - name: sortField
          in: query
          description: publishedAt / fileSize
          schema:
            type: string
            enum:
              - publishedAt
              - fileSize
            default: publishedAt
        - name: sortOrder
          in: query
          description: desc / asc
          schema:
            type: string
            enum:
              - desc
              - asc
            default: desc
      responses:
        "200":
          description: RSS 2.0
          content:
            application/xml:
              schema:
                type: string
                description: RSS 2.0 XML；enclosure 为 application/x-bittorrent 下载 URL。
              examples:
                rss-other:
                  summary: rss-other
                  value: >
                    <?xml version="1.0" encoding="UTF-8"?>

                    <rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:anibt="https://anibt.net/xmlns/rss/1.0/">
                      <channel>
                        <title>AniBT 音乐 Releases</title>
                        <link>https://anibt.net/magnets?kind=music</link>
                        <description>AniBT 音乐 releases</description>
                        <atom:link href="https://anibt.net/rss/other/music.xml?limit=1" rel="self" type="application/rss+xml" />
                        <ttl>2</ttl>
                        <item>
                          <title>[SFSub] [SFSub][260722] 椎名真昼(CV.石見舞菜香)、白河千歳(CV.白石晴香)、木戸彩香(CV.高野麻里佳)/日向萌 - TVアニメ『お隣の天使様にいつの間にか駄目人間にされていた件2』キャラクターソング&amp;スコアアルバム [FLAC+LOG+BK]</title>
                          <link>https://anibt.net/other-release/orel_9-Q9nz22YSQj</link>
                          <guid isPermaLink="false">orel_9-Q9nz22YSQj</guid>
                          <pubDate>Mon, 27 Jul 2026 15:22:00 +0800</pubDate>
                          <anibt:type>other</anibt:type>
                          <anibt:releaseId>orel_9-Q9nz22YSQj</anibt:releaseId>
                          <anibt:releasePageUrl>https://anibt.net/other-release/orel_9-Q9nz22YSQj</anibt:releasePageUrl>
                          <anibt:torrentUrl>https://anibt.net/api/other-torrent/orel_9-Q9nz22YSQj.torrent</anibt:torrentUrl>
                          <anibt:category>music</anibt:category>
                          <anibt:categoryLabel>音乐</anibt:categoryLabel>
                          <anibt:title>[SFSub][260722] 椎名真昼(CV.石見舞菜香)、白河千歳(CV.白石晴香)、木戸彩香(CV.高野麻里佳)/日向萌 - TVアニメ『お隣の天使様にいつの間にか駄目人間にされていた件2』キャラクターソング&amp;スコアアルバム [FLAC+LOG+BK]</anibt:title>
                          <anibt:groupName>SFSub</anibt:groupName>
                          <anibt:fileSize>819996918</anibt:fileSize>
                          <description><![CDATA[<p><strong>[SFSub][260722] 椎名真昼(CV.石見舞菜香)、白河千歳(CV.白石晴香)、木戸彩香(CV.高野麻里佳)/日向萌 - TVアニメ『お隣の天使様にいつの間にか駄目人間にされていた件2』キャラクターソング&amp;スコアアルバム [FLAC+LOG+BK]</strong> · 音乐</p>
                    <hr/>

                    <img src="https://files.seeusercontent.com/2026/07/27/zLm7/cover.jpg" alt="cover" />

                    <br/>

                    Purchased by SFSub

                    <hr/>

                    <p>🏷️ SFSub · 📚 音乐 · 💾 782.01 MB</p>

                    <hr/>

                    <p>⬇️ <a href="https://anibt.net/api/other-torrent/orel_9-Q9nz22YSQj.torrent">下载种子</a></p>

                    <p>🔗 <a href="https://anibt.net/other-release/orel_9-Q9nz22YSQj">查看详情</a></p>]]></description>
                          <torrent xmlns="https://anibt.moe/xmlns/0.1/">
                            <link>https://anibt.net/other-release/orel_9-Q9nz22YSQj</link>
                            <contentLength>819996918</contentLength>
                            <pubDate>2026-07-27T15:22:00+08:00</pubDate>
                            <infohash>7b55128336b9419b24eb42364d27296d2a6d7bc7</infohash>
                            <filename>[SFSub][260722] 椎名真昼(CV.石見舞菜香)、白河千歳(CV.白石晴香)、木戸彩香(CV.高野麻里佳)/日向萌 - TVアニメ『お隣の天使様にいつの間にか駄目人間にされていた件2』キャラクターソング&amp;スコアアルバム [FLAC+LOG+BK]</filename>
                          </torrent>
                          <enclosure url="https://anibt.net/api/other-torrent/orel_9-Q9nz22YSQj.torrent" length="819996918" type="application/x-bittorrent" />
                        </item>
                      </channel>
                    </rss>
        "304":
          description: 内容未变，复用已保存的正文
        "308":
          description: 使用 Location 指向的规范 URL。
          headers:
            Location:
              schema:
                type: string
        "400":
          description: 无效参数
          content:
            text/plain:
              schema:
                type: string
        "404":
          description: 目标不存在
          content:
            text/plain:
              schema:
                type: string
        "429":
          description: 请求过于频繁
          content:
            text/plain:
              schema:
                type: string
          headers:
            Retry-After:
              description: 重试前等待秒数。
              schema:
                type: integer
                minimum: 1
        "503":
          description: 暂不可用；不保证提供 Retry-After
          content:
            text/plain:
              schema:
                type: string

  /rss/subscriptions.xml:
    get:
      tags:
        - rss
      operationId: rss-subscriptions
      summary: 个人订阅 RSS
      description: |
        使用「我的订阅」生成的完整私人链接；key 是个人 RSS 令牌，不是字幕组 API Key。token 为兼容别名，同时提供时 key 优先。
        默认 limit=50，最多 200；数字超出范围会截到 1–200。只提供 GET，响应 private, no-store，不使用公开 ETag。
        缺少凭证返回 400；无效或已重置的凭证返回 401；连续无效请求可能返回 429。错误正文为纯文本。默认 30 次 / 60 秒 / IP。
        链接含身份凭证，不要写入 issue、截图或仓库。条目仅包含带种子的已订阅番剧资源。
      responses:
        "200":
          description: 私人 RSS
          headers:
            Cache-Control:
              schema:
                type: string
                example: private, no-store
          content:
            application/xml:
              schema:
                type: string
        "400":
          description: 缺少个人 RSS key
          content:
            text/plain:
              schema:
                type: string
        "401":
          description: 个人 RSS key 无效或已重置
          content:
            text/plain:
              schema:
                type: string
        "429":
          description: 请求过于频繁
          content:
            text/plain:
              schema:
                type: string
          headers:
            Retry-After:
              description: 重试前等待秒数。
              schema:
                type: integer
                minimum: 1
        "500":
          description: 无法读取订阅源
          content:
            text/plain:
              schema:
                type: string
      parameters:
        - name: key
          in: query
          schema:
            type: string
          description: 个人 RSS 令牌；与 token 至少提供一个。
        - name: token
          in: query
          schema:
            type: string
          description: key 的兼容别名。
        - name: limit
          in: query
          schema:
            type: integer
            minimum: 1
            maximum: 200
            default: 50

  /api/releases/publish:
    get:
      tags: [ publish ]
      operationId: releases-publish-whoami
      summary: 发布身份
      description: |
        不写库。不要求 `releases:publish`。批量发布前确认 `groupSlug` 与 `scopes`。
      security:
        - bearerAuth: []
        - apiKeyAuth: []
      responses:
        '200':
          description: 当前 Key 的发布身份
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/PublishWhoamiResponse"
              examples:
                whoami-anime:
                  summary: whoami-anime
                  value:
                    ok: true
                    result:
                      groupId: org_example
                      groupName: Example Group
                      groupSlug: example
                      apiKeyId: sgak_example
                      apiKeySuffix: abcd1234
                      scopes:
                        - releases:publish
                        - releases:delete
                        - releases:sync:read
                      kind: anime
        '401':
          $ref: '#/components/responses/Unauthorized'
    post:
      tags:
        - publish
      operationId: releases-publish
      summary: 发布番剧资源
      description: >
        番剧发布必须指定 animeIdType 与 animeId，不按标题匹配番剧。

        animeId 按来源规范化：接受全角数字、前导零和该来源站点的番剧链接（bgm.tv / bangumi.tv / chii.in、myanimelist.net、anidb.net、anilist.co）。已合并的旧 BGM ID 发布到合并后的番剧。发布只解析站内已收录的番剧，不会新收录。

        bgm 的 animeId 不是 ID 时返回 422；mal、anidb、anilist 的 animeId 不是 ID、站内没有，或只有被管理员隐藏、被 bgm.tv 标记为 NSFW 的番剧持有该 ID 时返回 404；同一个外部 ID 对应多部公开番剧时返回 422（Anime identifier is ambiguous），请改用 bgm ID。

        multipart 必须上传 torrent，title 省略时使用种子内部名；JSON 必须提供 title 和属于当前字幕组的 torrentStorageId。JSON 还必须提供 magnetBase64。

        成功发布返回 { ok: true, result: { releaseId, revision, torrentObjectId? } }。发布回执不包含 groupId、groupName、groupSlug、animeId 或 fileSize；发布前用 GET 同一路径核验身份。

        preview=true 返回顶层 previewUrl、previewToken、expiresAt 和 Key 身份信息，10 分钟后过期；不创建公开发布。

        未显式提供的集数、画质、语言、字幕、格式和版本先从标题、再从种子内部名推断；无法推断集数时需传 episode 或 episodeKey。

        notes 最多 50000 字符。JSON 请求上限默认 1 MiB，multipart 默认 8 MiB，单个 .torrent 文件最多 5 MiB。

        Nyaa 需要字幕组白名单和有效分类，种子必须包含 http://nyaa.tracker.wf:7777/announce。Nyaa 代发应使用 multipart，确保从上传种子提取 tracker。

        Nyaa 的结构化 sitePublish.nyaa 仅用于 JSON；multipart 使用 nyaa、nyaaCategory、nyaaComplete 等独立字段。

        200 表示本站发布已写入，不保证外站同步或下游读取已经完成。

        发布请求达到限额时返回 429 RATE_LIMIT_EXCEEDED；限流服务暂不可用时返回 503 SERVICE_UNAVAILABLE。两者均带 Retry-After（秒），按该时间等待后重试，请求不会进入发布流程。
      security:
        - bearerAuth: []
        - apiKeyAuth: []
      requestBody:
        required: true
        content:
          multipart/form-data:
            schema:
              $ref: "#/components/schemas/PublishAnimeMultipart"
          application/json:
            schema:
              $ref: "#/components/schemas/PublishAnimeJson"
      responses:
        "200":
          description: 主记录已写入
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/PublishAnimeResponse"
              examples:
                publish-anime:
                  summary: publish-anime
                  value:
                    ok: true
                    result:
                      releaseId: rel_example
                      revision: 1
                      torrentObjectId: obj_example
                publish-preview:
                  summary: publish-preview
                  value:
                    ok: true
                    preview: true
                    previewUrl: https://anibt.example/release/preview/example-preview-token
                    previewToken: example-preview-token
                    expiresAt: 1790295000000
                    groupId: org_example
                    groupName: Example Group
                    groupSlug: example
                    apiKeyId: sgak_example
                    apiKeySuffix: abcd1234
        "400":
          description: 无效 JSON 或请求体
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ErrorEnvelope"
        "401":
          $ref: "#/components/responses/Unauthorized"
        "403":
          $ref: "#/components/responses/Forbidden"
        "404":
          description: 关联番剧或种子不存在，或该 ID 只对应不公开的番剧（管理员隐藏、NSFW）
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ErrorEnvelope"
        "409":
          description: 资源或命令冲突
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ErrorEnvelope"
        "413":
          description: 上传或请求体过大
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ErrorEnvelope"
        "422":
          description: 字段、种子或发布规则校验失败；包括 bgm animeId 不是 ID、外部 ID 对应多部公开番剧
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ErrorEnvelope"
        "429":
          $ref: "#/components/responses/RateLimited"
        "500":
          description: 发布失败
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ErrorEnvelope"
        "503":
          description: 服务暂不可用；限流服务不可用时返回 SERVICE_UNAVAILABLE，并带 Retry-After（秒）
          headers:
            Retry-After:
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ErrorEnvelope"

  /api/other-releases/publish:
    get:
      tags: [ publish ]
      operationId: other-releases-publish-whoami
      summary: 其他类发布身份
      description: |
        `kind` 为 `other`。不写库。
      security:
        - bearerAuth: []
        - apiKeyAuth: []
      responses:
        '200':
          description: 当前 Key 的其他类发布身份
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/PublishWhoamiResponse"
              examples:
                whoami-other:
                  summary: whoami-other
                  value:
                    ok: true
                    result:
                      groupId: org_example
                      groupName: Example Group
                      groupSlug: example
                      apiKeyId: sgak_example
                      apiKeySuffix: abcd1234
                      scopes:
                        - releases:publish
                        - releases:delete
                        - releases:sync:read
                      kind: other
        '401':
          $ref: '#/components/responses/Unauthorized'
    post:
      tags:
        - publish
      operationId: other-releases-publish
      summary: 发布其他类资源
      description: >
        其他类发布必须指定 category，不关联番剧。

        multipart 必须上传 torrent，title 省略时使用种子内部名；JSON 必须提供 title 和属于当前字幕组的 torrentStorageId。

        成功发布返回 { ok: true, result: { releaseId, revision, torrentObjectId? } }。发布回执不包含 groupId、groupName、groupSlug、animeId 或 fileSize；发布前用 GET 同一路径核验身份。

        notes 最多 50000 字符。JSON 请求上限默认 1 MiB，multipart 默认 8 MiB，单个 .torrent 文件最多 5 MiB。

        Nyaa 需要字幕组白名单和有效分类，种子必须包含 http://nyaa.tracker.wf:7777/announce。Nyaa 代发应使用 multipart，确保从上传种子提取 tracker。

        Nyaa 的结构化 sitePublish.nyaa 仅用于 JSON；multipart 使用 nyaa、nyaaCategory、nyaaComplete 等独立字段。

        200 表示本站发布已写入，不保证外站同步或下游读取已经完成。

        发布请求达到限额时返回 429 RATE_LIMIT_EXCEEDED；限流服务暂不可用时返回 503 SERVICE_UNAVAILABLE。两者均带 Retry-After（秒），按该时间等待后重试，请求不会进入发布流程。
      security:
        - bearerAuth: []
        - apiKeyAuth: []
      requestBody:
        required: true
        content:
          multipart/form-data:
            schema:
              $ref: "#/components/schemas/PublishOtherMultipart"
          application/json:
            schema:
              $ref: "#/components/schemas/PublishOtherJson"
      responses:
        "200":
          description: 主记录已写入
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/PublishOtherResponse"
              examples:
                publish-other:
                  summary: publish-other
                  value:
                    ok: true
                    result:
                      releaseId: orel_example
                      revision: 1
                      torrentObjectId: obj_example
        "400":
          description: 无效 JSON 或请求体
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ErrorEnvelope"
        "401":
          $ref: "#/components/responses/Unauthorized"
        "403":
          $ref: "#/components/responses/Forbidden"
        "404":
          description: 关联番剧或种子不存在
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ErrorEnvelope"
        "409":
          description: 资源或命令冲突
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ErrorEnvelope"
        "413":
          description: 上传或请求体过大
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ErrorEnvelope"
        "422":
          description: 字段、种子或发布规则校验失败
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ErrorEnvelope"
        "429":
          $ref: "#/components/responses/RateLimited"
        "500":
          description: 发布失败
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ErrorEnvelope"
        "503":
          description: 服务暂不可用；限流服务不可用时返回 SERVICE_UNAVAILABLE，并带 Retry-After（秒）
          headers:
            Retry-After:
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ErrorEnvelope"

  /api/releases/{releaseId}:
    delete:
      tags:
        - delete
      operationId: releases-delete
      summary: 删除番剧发布
      description: >
        需要 releases:delete，只支持本组 rel_* 资源。无 query、无请求体。

        最多等待约 2 秒：completed 返回 200，pending 返回 202；清理失败返回 500 RELEASE_DELETION_FAILED，回执在 error.details。删除受理后重复 DELETE 可能返回 404；请通过 GET /api/releases/{releaseId}/deletion 查询已有回执，404 不作为完成证明。

        202 只表示已受理；只有 completed 才表示本站删除完成。不会撤回已同步到外站的资源。

        默认 30 次 / 60 秒 / API Key；pending 按 Retry-After 轮询状态。

        创建 Key 的普通成员只能删除自己的发布；owner/admin 可删除本组发布。
      security:
        - bearerAuth: []
        - apiKeyAuth: []
      parameters:
        - $ref: "#/components/parameters/AnimeReleaseId"
      responses:
        "200":
          description: 删除已完成
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/DeletionReceipt"
              examples:
                deletion-delete-completed:
                  summary: deletion-delete-completed
                  value:
                    ok: true
                    result:
                      operationId: rdel_example
                      releaseId: rel_example
                      state: completed
                      statusUrl: /api/releases/rel_example/deletion
                      acceptedAt: 1790294400000
                      updatedAt: 1790294410000
                      completedAt: 1790294410000
        "202":
          description: 已受理，按 Retry-After 轮询
          headers:
            Location:
              schema:
                type: string
            Retry-After:
              schema:
                type: string
            Cache-Control:
              schema:
                type: string
                example: private, no-store
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/DeletionReceipt"
              examples:
                deletion-delete-pending:
                  summary: deletion-delete-pending
                  value:
                    ok: true
                    result:
                      operationId: rdel_example
                      releaseId: rel_example
                      state: pending
                      statusUrl: /api/releases/rel_example/deletion
                      acceptedAt: 1790294400000
                      updatedAt: 1790294400000
                      retryAfterMs: 2000
        "400":
          description: 请求体不为空
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ErrorEnvelope"
        "401":
          $ref: "#/components/responses/Unauthorized"
        "403":
          $ref: "#/components/responses/Forbidden"
        "404":
          $ref: "#/components/responses/NotFound"
        "422":
          description: releaseId 或查询参数校验失败
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ErrorEnvelope"
        "429":
          $ref: "#/components/responses/RateLimited"
        "500":
          description: 删除清理失败；error.details 含 failed 回执
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ErrorEnvelope"

  /api/releases/{releaseId}/deletion:
    get:
      tags:
        - delete
      operationId: releases-deletion
      summary: 删除状态
      description: >
        需要 releases:delete。无 query，只查询本组已有删除回执。

        成功查询始终返回 200，result.state 为 pending、completed 或 failed。pending 按 Retry-After 继续轮询；failed 停止自动重试并记录 failure 与 X-Request-ID。

        未知或跨组资源、没有删除记录时返回 404。默认 120 次 / 60 秒 / API Key。
      security:
        - bearerAuth: []
        - apiKeyAuth: []
      parameters:
        - $ref: "#/components/parameters/AnimeReleaseId"
      responses:
        "200":
          description: 删除回执
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/DeletionReceipt"
              examples:
                deletion-status-pending:
                  summary: deletion-status-pending
                  value:
                    ok: true
                    result:
                      operationId: rdel_example
                      releaseId: rel_example
                      state: pending
                      statusUrl: /api/releases/rel_example/deletion
                      acceptedAt: 1790294400000
                      updatedAt: 1790294400000
                      retryAfterMs: 2000
                deletion-status-completed:
                  summary: deletion-status-completed
                  value:
                    ok: true
                    result:
                      operationId: rdel_example
                      releaseId: rel_example
                      state: completed
                      statusUrl: /api/releases/rel_example/deletion
                      acceptedAt: 1790294400000
                      updatedAt: 1790294410000
                      completedAt: 1790294410000
                deletion-status-failed:
                  summary: deletion-status-failed
                  value:
                    ok: true
                    result:
                      operationId: rdel_example
                      releaseId: rel_example
                      state: failed
                      statusUrl: /api/releases/rel_example/deletion
                      acceptedAt: 1790294400000
                      updatedAt: 1790294410000
                      failedAt: 1790294410000
                      failure:
                        code: RELEASE_DELETION_FAILED
                        message: Example cleanup failure
        "401":
          $ref: "#/components/responses/Unauthorized"
        "403":
          description: 缺少 releases:delete
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ErrorEnvelope"
        "404":
          $ref: "#/components/responses/NotFound"
        "422":
          description: releaseId 或查询参数校验失败
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ErrorEnvelope"
        "429":
          $ref: "#/components/responses/RateLimited"

  /api/releases/{releaseId}/sync-status:
    get:
      tags:
        - sync
      operationId: releases-sync-status
      summary: Release 外站同步状态
      description: >
        查询该 API Key 所属字幕组的普通 release 在六个外站的同步状态。

        请求只支持 `rel_...` 形式的 `releaseId`，且资源必须属于当前 Key 所属字幕组。

        不存在、已删除或跨组资源统一返回 `404 NOT_FOUND`。

        成功响应为 `{ ok: true, data: { releaseId, title, publishedAt, overall, sites } }`。

        `data.sites` 是数组，固定包含 `mikan`、`acgrip`、`bangumi`、`acgnx`、`dmhy`、`nyaa` 六个平台。遍历数组并用每项的 `site` 字段识别平台；不要读取 `data.mikan` 或 `data.nyaa`。

        每站提供当前状态、`externalId`、`externalUrl`、错误、`generation`、`attempt`、时间戳、最近 50 条 `history` 和该站的 `historyTruncated`。所有时间戳均为 Unix 毫秒。

        站点状态为 `not_started`、`pending`、`success`、`failed`、`ambiguous` 或 `deleted`。

        `data.overall` 是字符串：任一站为 `failed` 或 `ambiguous` 时为 `failed`；全部成功时为 `success`；全部未开始时为 `not_started`；其余情况有 `pending` 时为 `pending`，否则为 `partial`。

        接口不会返回外站原始响应正文或凭据，响应使用 `Cache-Control: no-store`。

        需要 `releases:sync:read`。

        不接受 query 或请求体。默认 120 次 / 60 秒 / API Key；超限按 Retry-After 退避。
      security:
        - bearerAuth: []
        - apiKeyAuth: []
      parameters:
        - $ref: "#/components/parameters/AnimeReleaseId"
      responses:
        "200":
          description: 六站同步状态
          headers:
            Cache-Control:
              schema:
                type: string
                example: no-store
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/SyncStatusResponse"
              examples:
                sync-not-started:
                  summary: sync-not-started
                  value:
                    ok: true
                    data:
                      releaseId: rel_example
                      title: Example Release
                      publishedAt: 1790294400000
                      overall: not_started
                      sites:
                        - site: mikan
                          status: not_started
                          externalId: null
                          externalUrl: null
                          error: null
                          generation: null
                          attempt: 0
                          createdAt: null
                          updatedAt: null
                          completedAt: null
                          history: []
                          historyTruncated: false
                        - site: acgrip
                          status: not_started
                          externalId: null
                          externalUrl: null
                          error: null
                          generation: null
                          attempt: 0
                          createdAt: null
                          updatedAt: null
                          completedAt: null
                          history: []
                          historyTruncated: false
                        - site: bangumi
                          status: not_started
                          externalId: null
                          externalUrl: null
                          error: null
                          generation: null
                          attempt: 0
                          createdAt: null
                          updatedAt: null
                          completedAt: null
                          history: []
                          historyTruncated: false
                        - site: acgnx
                          status: not_started
                          externalId: null
                          externalUrl: null
                          error: null
                          generation: null
                          attempt: 0
                          createdAt: null
                          updatedAt: null
                          completedAt: null
                          history: []
                          historyTruncated: false
                        - site: dmhy
                          status: not_started
                          externalId: null
                          externalUrl: null
                          error: null
                          generation: null
                          attempt: 0
                          createdAt: null
                          updatedAt: null
                          completedAt: null
                          history: []
                          historyTruncated: false
                        - site: nyaa
                          status: not_started
                          externalId: null
                          externalUrl: null
                          error: null
                          generation: null
                          attempt: 0
                          createdAt: null
                          updatedAt: null
                          completedAt: null
                          history: []
                          historyTruncated: false
        "400":
          description: releaseId、查询参数或请求体无效
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ErrorEnvelope"
        "401":
          $ref: "#/components/responses/Unauthorized"
        "403":
          $ref: "#/components/responses/Forbidden"
        "404":
          $ref: "#/components/responses/NotFound"
        "429":
          description: 请求过于频繁
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ErrorEnvelope"

  /api/torrent/{releaseId}.torrent:
    get:
      tags:
        - torrent
      operationId: torrent
      summary: 下载番剧种子
      description: >
        返回该发布的公开种子。没有种子或未知发布返回 `404`；公开对象暂不可用返回 `503`，并带 `Retry-After`。

        成功响应的关键头部是 `ETag`、`X-Torrent-Content-SHA256`、`X-Torrent-Info-Hash`、`Content-Type: application/x-bittorrent` 和 `Cache-Control`。

        公开种子已包含站点 tracker；旧的 `X-AniBT-Torrent-Source` 与 policy revision 头已退役。

        `releaseId` 为 `rel_*`。

        不接受 query。支持 GET、HEAD、OPTIONS；ETag 未变时返回 304。错误响应为 JSON envelope。
      parameters:
        - name: releaseId
          in: path
          required: true
          description: 番剧发布 ID，`rel_*`
          schema:
            type: string
            pattern: ^rel_[A-Za-z0-9_-]+$
      responses:
        "200":
          description: 种子文件
          headers:
            ETag:
              schema:
                type: string
            X-Torrent-Content-SHA256:
              schema:
                type: string
            X-Torrent-Info-Hash:
              schema:
                type: string
            Content-Type:
              schema:
                type: string
                example: application/x-bittorrent
          content:
            application/x-bittorrent:
              schema:
                type: string
                format: binary
        "304":
          description: 内容未变，响应体为空
        "400":
          description: 无效路径或存在查询参数
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ErrorEnvelope"
        "404":
          $ref: "#/components/responses/NotFound"
        "429":
          description: 请求过于频繁
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ErrorEnvelope"
          headers:
            Retry-After:
              description: 重试前等待秒数。
              schema:
                type: integer
                minimum: 1
        "503":
          $ref: "#/components/responses/Unavailable"

  /api/other-torrent/{releaseId}.torrent:
    get:
      tags:
        - torrent
      operationId: other-torrent
      summary: 下载其他类种子
      description: |
        返回其他类发布的公开种子。`releaseId` 为 `orel_*`。
        没有种子或未知发布返回 `404`；公开对象暂不可用返回 `503`，并带 `Retry-After`。
        不接受 query。支持 GET、HEAD、OPTIONS；ETag 未变时返回 304。错误响应为 JSON envelope。
      parameters:
        - name: releaseId
          in: path
          required: true
          description: 其他类发布 ID，`orel_*`
          schema:
            type: string
            pattern: ^orel_[A-Za-z0-9_-]+$
      responses:
        "200":
          description: 种子文件
          content:
            application/x-bittorrent:
              schema:
                type: string
                format: binary
        "304":
          description: 内容未变，响应体为空
        "400":
          description: 无效路径或存在查询参数
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ErrorEnvelope"
        "404":
          $ref: "#/components/responses/NotFound"
        "429":
          description: 请求过于频繁
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ErrorEnvelope"
          headers:
            Retry-After:
              description: 重试前等待秒数。
              schema:
                type: integer
                minimum: 1
        "503":
          $ref: "#/components/responses/Unavailable"
  /torznab/api:
    get:
      tags:
        - rss
      operationId: torznab-api
      summary: Torznab 协议
      description: >
        Sonarr、Radarr、Prowlarr 的匿名 Torznab 入口。客户端 URL 为 https://anibt.net/torznab，API Path 为 /api。

        不需要 API Key，apikey 参数会被忽略。支持 GET、HEAD；响应 no-store。

        t=caps 返回能力 XML；search、tvsearch、movie 返回 RSS XML。协议参数错误仍返回 HTTP 200 的 <error> XML，不能只按 HTTP 状态判断成功。

        不支持 TVDB/TMDB/IMDb/rid/tvmazeid 检索，提供这些 ID 会返回空列表。关键词最多 160 UTF-8 字节。search/tvsearch 的尾部 2–4 位数字可作为集数；尾部 1900–2099 按年份移除。movie 仅移除年份。

        limit 默认 100，上限 100；最新列表 offset + limit 最多 300，关键词搜索最多 100；超出窗口返回空列表。默认 60 次 / 60 秒 / IP。
      parameters:
        - name: t
          in: query
          required: true
          schema:
            type: string
            enum:
              - caps
              - search
              - tvsearch
              - movie
          description: 缺失返回 XML 错误 200；未知功能返回 202；music/book 返回 203。
        - name: q
          in: query
          schema:
            type: string
          description: 关键词，规范化后最多 160 UTF-8 字节。
        - name: cat
          in: query
          schema:
            type: string
          description: 逗号分隔分类；5000/5070 为番剧，2000/2020 为剧场版。
        - name: limit
          in: query
          schema:
            type: integer
            minimum: 0
            default: 100
          description: 超过 100 按 100 处理；0 返回空列表。
        - name: offset
          in: query
          schema:
            type: integer
            minimum: 0
            default: 0
      responses:
        "200":
          description: 能力、搜索结果或协议错误 XML；检查根元素及 error code。
          content:
            application/rss+xml:
              schema:
                type: string
              examples:
                torznab-caps:
                  summary: torznab-caps
                  value: |
                    <?xml version="1.0" encoding="UTF-8"?>
                    <caps>
                      <server title="AniBT" />
                      <limits max="100" default="100" />
                      <searching>
                        <search available="yes" supportedParams="q" />
                        <tv-search available="no" />
                        <movie-search available="yes" supportedParams="q" />
                        <audio-search available="no" />
                        <book-search available="no" />
                      </searching>
                      <categories>
                        <category id="5000" name="TV">
                          <subcat id="5070" name="Anime" />
                        </category>
                        <category id="2000" name="Movies">
                          <subcat id="2020" name="Movies/Other" />
                        </category>
                      </categories>
                    </caps>
                torznab-search:
                  summary: torznab-search
                  value: >
                    <?xml version="1.0" encoding="UTF-8"?>

                    <rss version="2.0" xmlns:torznab="http://torznab.com/schemas/2015/feed" xmlns:newznab="http://www.newznab.com/DTD/2010/feeds/attributes/">
                      <channel>
                        <title>AniBT</title>
                        <link>https://anibt.net/</link>
                        <description>AniBT anime releases (Torznab)</description>
                        <language>zh-cn</language>
                        <newznab:response offset="0" total="2" />
                        <item>
                          <title>[绿茶字幕组] 无职转生 第三季 ～到了异世界就拿出真本事～ / Mushoku Tensei S3 [09][WebRip][1080p][简繁日内封]</title>
                          <guid isPermaLink="false">rel_aM2SHvOtUlhx</guid>
                          <link>https://anibt.net/api/torrent/rel_aM2SHvOtUlhx.torrent</link>
                          <comments>https://anibt.net/release/rel_aM2SHvOtUlhx</comments>
                          <pubDate>Fri, 25 Sep 2026 15:52:25 +0800</pubDate>
                          <enclosure url="https://anibt.net/api/torrent/rel_aM2SHvOtUlhx.torrent" length="357873674" type="application/x-bittorrent" />
                          <torznab:attr name="size" value="357873674" />
                          <torznab:attr name="category" value="5000" />
                          <torznab:attr name="category" value="5070" />
                          <torznab:attr name="infohash" value="d536523c36c24a823c632015789bf60a2fcfe831" />
                          <torznab:attr name="seeders" value="40" />
                          <torznab:attr name="leechers" value="8" />
                          <torznab:attr name="peers" value="48" />
                          <torznab:attr name="grabs" value="44" />
                          <torznab:attr name="downloadvolumefactor" value="0" />
                          <torznab:attr name="uploadvolumefactor" value="1" />
                        </item>
                      </channel>
                    </rss>
                torznab-invalid:
                  summary: torznab-invalid
                  value: |
                    <?xml version="1.0" encoding="UTF-8"?>
                    <error code="200" description="Missing parameter" />
        "304":
          description: If-None-Match 匹配，正文为空。
        "429":
          description: 请求过于频繁。
          headers:
            Retry-After:
              schema:
                type: integer
                minimum: 1
          content:
            text/plain:
              schema:
                type: string
        "503":
          description: 搜索暂不可用，按 Retry-After 重试。
          headers:
            Retry-After:
              schema:
                type: integer
                minimum: 1
          content:
            text/plain:
              schema:
                type: string

components:
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: |
        字幕组 API Key。`Authorization: Bearer <KEY>`。与 `X-API-Key` 二选一，Bearer 优先。
        Key scope：`releases:publish`、`releases:delete`、`releases:sync:read`，至少选一个。
    apiKeyAuth:
      type: apiKey
      in: header
      name: X-API-Key
      description: 字幕组 API Key。Bearer 优先。
  parameters:
    BgmId:
      name: bgmId
      in: query
      description: Bangumi subject id
      schema:
        type: integer
    GroupSlug:
      name: groupSlug
      in: query
      description: 字幕组 slug
      schema:
        type: string
    RssLimit:
      name: limit
      in: query
      description: |
        1–100，单个无前导零整数。默认 100。省略即拉满。不要传 `limit=100`，否则可能 308。
      schema:
        type: integer
        minimum: 1
        maximum: 100
        default: 100
    Resolution:
      name: resolution
      in: query
      description: 可重复或逗号分隔。4K / 2160p / 1080p / 720p / 480p / 360p
      schema:
        type: array
        items:
          $ref: '#/components/schemas/Resolution'
      style: form
      explode: true
    Language:
      name: language
      in: query
      description: 可重复或逗号分隔
      schema:
        type: array
        items:
          $ref: '#/components/schemas/Language'
      style: form
      explode: true
    Format:
      name: format
      in: query
      description: 可重复或逗号分隔。MKV / MP4 / AVI / WEBM
      schema:
        type: array
        items:
          $ref: '#/components/schemas/ContainerFormat'
      style: form
      explode: true
    Subtitle:
      name: subtitle
      in: query
      description: 可重复或逗号分隔。EXTERNAL / INTERNAL / EMBEDDED / NONE
      schema:
        type: array
        items:
          $ref: '#/components/schemas/SubtitleMode'
      style: form
      explode: true
    SearchQ:
      name: q
      in: query
      description: 关键词。UTF-8 最多 160 bytes。不能空、不能含控制字符
      schema:
        type: string
    AnimeReleaseId:
      name: releaseId
      in: path
      required: true
      description: '`rel_*`，5–100 字符'
      schema:
        type: string
        pattern: '^rel_[A-Za-z0-9_-]+$'
        minLength: 5
        maxLength: 100
  responses:
    BadRequest:
      description: 参数或 JSON 有误
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
    Unauthorized:
      description: 认证未通过
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
    Forbidden:
      description: 无权限或缺少 scope
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
    NotFound:
      description: 资源不存在，或无权访问时与不存在相同
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
    RateLimited:
      description: 超限。按 Retry-After 退避。公开读取超限同样返回 429；Cloudflare 边缘限流可能是 HTML 429
      headers:
        Retry-After:
          schema:
            type: string
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
    Unavailable:
      description: 服务暂时不可用或部署中，按 Retry-After 重试
      headers:
        Retry-After:
          schema:
            type: string
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
  schemas:
    Resolution:
      type: string
      enum: [ 4K, 2160p, 1080p, 720p, 480p, 360p ]
    Language:
      type: string
      enum: [ CHS, CHT, JP, EN, KO, ES, PT, FR, DE, IT, RU, AR, HI, ID, MS, TH, VI, TL, TR, PL, UK ]
    ContainerFormat:
      type: string
      enum: [ MKV, MP4, AVI, WEBM ]
    SubtitleMode:
      type: string
      enum: [ EXTERNAL, INTERNAL, EMBEDDED, NONE ]
    OtherCategory:
      type: string
      enum: [ manga, music, raw, stage, collection, movie, other ]
    AnimeIdType:
      type: string
      enum: [ bgm, anilist, mal, anidb ]
    Scope:
      type: string
      enum: [ releases:publish, releases:delete, releases:sync:read ]
    NyaaCategory:
      type: string
      description: |
        Nyaa 分类代码。中文动画字幕常用 `1_3`。
        `1_1` Anime - AMV；`1_2` English-translated；`1_3` Non-English-translated；`1_4` Raw；
        `2_1` Audio Lossless；`2_2` Audio Lossy；
        `3_1` Literature English；`3_2` Literature Non-English；`3_3` Literature Raw；
        `4_1` Live Action English；`4_2` Idol/PV；`4_3` Live Action Non-English；`4_4` Live Action Raw；
        `5_1` Pictures Graphics；`5_2` Pictures Photos；
        `6_1` Software Applications；`6_2` Software Games。
      enum:
        - '1_1'
        - '1_2'
        - '1_3'
        - '1_4'
        - '2_1'
        - '2_2'
        - '3_1'
        - '3_2'
        - '3_3'
        - '4_1'
        - '4_2'
        - '4_3'
        - '4_4'
        - '5_1'
        - '5_2'
        - '6_1'
        - '6_2'
    ErrorEnvelope:
      type: object
      required:
        - ok
        - error
      properties:
        ok:
          type: boolean
          enum:
            - false
        error:
          type: object
          required:
            - code
            - message
            - requestId
          properties:
            code:
              type: string
              example: RATE_LIMIT_EXCEEDED
            message:
              type: string
            reason:
              type: string
              example: RATE_LIMITED
            retryable:
              type: boolean
            retryAfterMs:
              type: integer
            requestId:
              type: string
            details:
              description: 可选错误详情，结构取决于错误码。
            i18n:
              type: object
              required:
                - key
              properties:
                key:
                  type: string
                params:
                  type: object
                  additionalProperties: true
    SubtitleGroup:
      type: object
      required:
        - slug
        - name
        - organizationId
        - status
        - totalReleases
        - totalAnimes
        - createdAt
      properties:
        slug:
          type: string
          description: 稳定标识，用于 groupSlug
        name:
          type: string
          description: 展示名，可能调整
        organizationId:
          type: string
          description: 内部 ID，不要硬编码
        status:
          type: string
          enum:
            - ACTIVE
        totalReleases:
          type: number
          description: 总发布数
        totalAnimes:
          type: number
          description: 覆盖番剧数
        website:
          type: string
          description: 站外主页
        createdAt:
          type: number
          description: 入库时间，毫秒
    SubtitleGroupListResponse:
      type: object
      required: [ ok, data ]
      properties:
        ok:
          type: boolean
          enum: [ true ]
        data:
          type: array
          items:
            $ref: '#/components/schemas/SubtitleGroup'
    SubtitleGroupMeResponse:
      type: object
      required:
        - ok
        - data
      properties:
        ok:
          type: boolean
          enum:
            - true
        data:
          type: object
          required:
            - organizationId
            - name
            - slug
            - status
            - createdAt
            - stats
            - apiKeyId
            - apiKeySuffix
            - scopes
          properties:
            organizationId:
              type: string
              description: 当前 Key 所属字幕组的组织 ID。
            name:
              type: string
            slug:
              type: string
            status:
              type: string
              enum:
                - ACTIVE
            createdAt:
              type: number
            stats:
              type: object
              required:
                - totalReleases
                - totalAnimes
                - memberCount
              properties:
                totalReleases:
                  type: number
                totalAnimes:
                  type: number
                memberCount:
                  type: number
            apiKeyId:
              type: string
            apiKeySuffix:
              type: string
            scopes:
              type: array
              items:
                $ref: "#/components/schemas/Scope"
    BgmSearchItem:
      type: object
      required:
        - bgmId
        - name
        - nameCn
        - date
        - image
        - rating
        - totalEpisodes
        - url
        - premiere
        - seasonYear
        - season
      properties:
        bgmId:
          type: integer
        name:
          type: string
        nameCn:
          type:
            - string
            - "null"
        date:
          type:
            - string
            - "null"
          description: 仅首播精度为 day 时返回 YYYY-MM-DD；其他精度或未知为 null。
        image:
          type:
            - string
            - "null"
        rating:
          type: number
          minimum: 0
          maximum: 10
          description: 0–10。无有效评分时为 5.0，真实 0 保留。
          x-scale-maximum: 10
        totalEpisodes:
          type:
            - integer
            - "null"
        url:
          type: string
        premiere:
          anyOf:
            - $ref: "#/components/schemas/AnimePremiere"
            - type: "null"
        seasonYear:
          type:
            - integer
            - "null"
        season:
          type:
            - string
            - "null"
          enum:
            - WINTER
            - SPRING
            - SUMMER
            - FALL
            - null
    BgmSearchResponse:
      type: object
      required: [ ok, data ]
      properties:
        ok:
          type: boolean
          enum: [ true ]
        data:
          type: array
          items:
            $ref: '#/components/schemas/BgmSearchItem'
    SeasonsAnimeResponse:
      type: object
      required:
        - ok
        - ts
        - data
      properties:
        ok:
          type: boolean
          enum:
            - true
        ts:
          type: number
          description: 响应生成时间，Unix 毫秒。
        data:
          type: object
          required:
            - currentSeason
            - requestedSeason
            - availableSeasons
            - scheduleSummary
            - byWeekday
            - total
            - scope
            - limit
            - truncated
          properties:
            currentSeason:
              type: string
            requestedSeason:
              type:
                - string
                - "null"
              description: 全库关键词搜索为 null；按季查询返回指定季度，精确 ID 返回作品季度或 null。
            availableSeasons:
              type: array
              description: 当前季前后各 4 季中至少有一部公开番剧的季度，按时间升序，总是包含当前季。
              items:
                type: string
            scheduleSummary:
              type: object
              required:
                - scheduled
                - weekdayOnly
                - missingSource
              properties:
                scheduled:
                  type: number
                weekdayOnly:
                  type: number
                missingSource:
                  type: number
            byWeekday:
              type: array
              items:
                type: object
                required:
                  - weekday
                  - weekdayLabel
                  - animes
                properties:
                  weekday:
                    type:
                      - number
                      - "null"
                  weekdayLabel:
                    type: string
                  animes:
                    type: array
                    items:
                      $ref: "#/components/schemas/SeasonAnimeItem"
            total:
              type: integer
              description: 本次返回的条数，不是全部匹配数。
            scope:
              oneOf:
                - type: object
                  required:
                    - kind
                    - season
                  properties:
                    kind:
                      const: season
                    season:
                      type: string
                - type: object
                  required:
                    - kind
                    - query
                  properties:
                    kind:
                      const: query
                    query:
                      type: string
                    season:
                      type: string
                - type: object
                  required:
                    - kind
                    - bgmId
                  properties:
                    kind:
                      const: bgmId
                    bgmId:
                      type: integer
            limit:
              type: integer
              enum:
                - 1
                - 50
                - 200
            truncated:
              type: boolean
    AnimeGroupsResponse:
      type: object
      required:
        - ok
        - ts
        - data
      properties:
        ok:
          type: boolean
          enum:
            - true
        ts:
          type: number
        data:
          type: object
          required:
            - bgmId
            - animeId
            - title
            - groups
            - total
          properties:
            bgmId:
              type: number
            animeId:
              type: string
            title:
              $ref: "#/components/schemas/CatalogTitle"
            groups:
              type: array
              items:
                $ref: "#/components/schemas/AnimeGroup"
            total:
              type: number
    TorrentMatchRequest:
      type: object
      properties:
        rawTitle:
          type: string
          minLength: 1
          maxLength: 1000
        torrentName:
          type: string
          minLength: 1
          maxLength: 1000
        infoHashHex:
          type: string
          pattern: ^[0-9a-f]{40}$
          description: 40 位十六进制 v1 infohash；提供后返回与该种子绑定的匹配令牌。
        publishedAt:
          type: integer
          minimum: 0
          maximum: 9007199254740991
        groupId:
          type: string
          minLength: 1
          maxLength: 200
          description: 可选组织 ID；需要同源登录会话及该组成员身份，API Key 不替代会话。
        limit:
          default: 10
          type: integer
          minimum: 1
          maximum: 50
        diagnostics:
          type: boolean
          enum:
            - false
          default: false
          description: 公开接口只允许 false；true 返回 403。
      required:
        - rawTitle
    TorrentMatchResponse:
      type: object
      required:
        - version
        - content
        - identityKey
        - structure
        - decision
        - groupHistory
        - candidates
        - search
        - diagnostics
        - decisionToken
        - decisionTokenExpiresAt
      properties:
        version:
          type: integer
          enum:
            - 3
        content:
          type: object
          required:
            - kind
            - confidence
            - reasonCodes
          properties:
            kind:
              type: string
              enum:
                - anime_episode
                - anime_batch
                - anime_movie
                - anime_ova_oad
                - anime_special
                - multi_anime_bundle
                - multi_season_bundle
                - promo
                - mad_amv
                - game_video
                - music_audio
                - announcement
                - artwork_package
                - live_stage
                - auxiliary_package
                - unknown
            confidence:
              type: string
              enum:
                - high
                - medium
                - low
            reasonCodes:
              type: array
              items:
                type: string
        identityKey:
          type:
            - string
            - "null"
        structure:
          type: object
          required:
            - season
            - cour
            - part
            - sequence
            - format
          properties:
            season:
              type:
                - number
                - "null"
            cour:
              type:
                - number
                - "null"
            part:
              type:
                - number
                - "null"
            sequence:
              type:
                - number
                - "null"
            format:
              type:
                - string
                - "null"
        decision:
          type: object
          required:
            - kind
            - reason
            - animeId
            - bgmId
            - confidence
            - vetoes
          properties:
            kind:
              type: string
              enum:
                - auto
                - manual
                - none
                - non_anime
                - unsupported
                - unavailable
            reason:
              type: string
            animeId:
              type:
                - string
                - "null"
            bgmId:
              type:
                - number
                - "null"
            confidence:
              type: string
              enum:
                - high
                - medium
                - low
                - none
            vetoes:
              type: array
              items:
                type: string
        groupHistory:
          anyOf:
            - type: object
              required:
                - kind
                - animeId
                - animeIds
                - rows
              properties:
                kind:
                  type: string
                  enum:
                    - unique
                    - split
                animeId:
                  type:
                    - string
                    - "null"
                animeIds:
                  type: array
                  items:
                    type: string
                rows:
                  type: number
            - type: "null"
        candidates:
          type: array
          items:
            $ref: "#/components/schemas/TorrentMatchCandidate"
        search:
          type: object
          required:
            - branchCount
            - exactOverflow
            - recallOverflow
            - candidateOverflow
            - searchCutoff
            - exactVerificationFailed
            - versionMismatch
            - generationMismatch
            - projectionMismatch
            - candidateSetComplete
            - strictRecallUsed
            - fuzzyRecallUsed
            - generation
          properties:
            branchCount:
              type: number
            exactOverflow:
              type: boolean
            recallOverflow:
              type: boolean
            candidateOverflow:
              type: boolean
            searchCutoff:
              type: boolean
            exactVerificationFailed:
              type: boolean
            versionMismatch:
              type: boolean
            generationMismatch:
              type: boolean
            projectionMismatch:
              type: boolean
            candidateSetComplete:
              type: boolean
            strictRecallUsed:
              type: boolean
            fuzzyRecallUsed:
              type: boolean
            generation:
              type:
                - string
                - "null"
        diagnostics:
          type: "null"
          description: 公开接口不返回诊断数据。
        decisionToken:
          type:
            - string
            - "null"
        decisionTokenExpiresAt:
          type:
            - number
            - "null"
          description: 匹配令牌过期时间，Unix 毫秒；未提供 infoHashHex 时为 null。
    PublishWhoamiResponse:
      type: object
      required:
        - ok
        - result
      properties:
        ok:
          type: boolean
          enum:
            - true
        result:
          type: object
          required:
            - groupId
            - groupName
            - groupSlug
            - apiKeyId
            - apiKeySuffix
            - scopes
            - kind
          properties:
            groupId:
              type: string
            groupName:
              type: string
            groupSlug:
              type: string
            apiKeyId:
              type: string
            apiKeySuffix:
              type: string
            scopes:
              type: array
              items:
                $ref: "#/components/schemas/Scope"
            kind:
              type: string
              enum:
                - anime
                - other
    PublishAnimeMultipart:
      type: object
      properties:
        animeIdType:
          type: string
          enum:
            - bgm
            - anilist
            - mal
            - anidb
        animeId:
          type: string
          minLength: 1
          maxLength: 200
          description: animeIdType 对应的番剧 ID，或该站点的番剧链接；按来源规范化后解析。
        title:
          type: string
          minLength: 1
          maxLength: 500
          description: 省略时使用种子内部名称。
        magnetBase64:
          type: string
          minLength: 1
          description: 省略时从上传种子提取。
        notes:
          type: string
          maxLength: 50000
        trackers:
          type: string
          description: 单个表单字段，换行分隔或 JSON 数组字符串。
        episode:
          type: integer
          minimum: 0
          maximum: 9007199254740991
        episodeKey:
          type: string
          minLength: 1
          maxLength: 40
        version:
          type: string
          minLength: 1
          maxLength: 20
        resolution:
          type: string
          enum:
            - 4K
            - 2160p
            - 1080p
            - 720p
            - 480p
            - 360p
        language:
          type: string
          description: 单个表单字段，逗号分隔或 JSON 数组字符串，如 CHS,JP 或 ["CHS","JP"]。
        subtitle:
          type: string
          enum:
            - EXTERNAL
            - INTERNAL
            - EMBEDDED
            - NONE
        format:
          type: string
          enum:
            - MKV
            - MP4
            - AVI
            - WEBM
        fileSize:
          type: integer
          minimum: 0
          maximum: 9007199254740991
        publishedAt:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
        preview:
          type: boolean
        nyaa:
          type: boolean
        publishToNyaa:
          type: boolean
        nyaaCategory:
          $ref: "#/components/schemas/NyaaCategory"
        nyaaComplete:
          type: boolean
        nyaaRemake:
          type: boolean
        nyaaDescription:
          type: string
          maxLength: 20000
        nyaaInformation:
          type: string
          maxLength: 500
        torrent:
          type: string
          format: binary
          description: 必须上传 .torrent 文件；文件内容用于提取磁力、大小及默认标题。
      required:
        - animeIdType
        - animeId
        - torrent
      additionalProperties: false
    PublishAnimeJson:
      type: object
      properties:
        animeIdType:
          type: string
          enum:
            - bgm
            - anilist
            - mal
            - anidb
        animeId:
          type: string
          minLength: 1
          maxLength: 200
          description: animeIdType 对应的番剧 ID，或该站点的番剧链接；按来源规范化后解析。
        title:
          type: string
          minLength: 1
          maxLength: 500
        magnetBase64:
          type: string
          minLength: 1
          description: "原始 magnet: 链接或其 UTF-8 Base64；必须与存储种子的 infohash 一致。"
        notes:
          type: string
          maxLength: 50000
        trackers:
          maxItems: 50
          type: array
          items:
            type: string
            minLength: 1
            maxLength: 500
        sitePublish:
          type: object
          required: []
          properties:
            nyaa:
              $ref: "#/components/schemas/NyaaPublishOptions"
        episode:
          type: integer
          minimum: 0
          maximum: 9007199254740991
        episodeKey:
          type: string
          minLength: 1
          maxLength: 40
        version:
          type: string
          minLength: 1
          maxLength: 20
        resolution:
          type: string
          enum:
            - 4K
            - 2160p
            - 1080p
            - 720p
            - 480p
            - 360p
        language:
          minItems: 1
          type: array
          items:
            type: string
            enum:
              - CHS
              - CHT
              - JP
              - EN
              - KO
              - ES
              - PT
              - FR
              - DE
              - IT
              - RU
              - AR
              - HI
              - ID
              - MS
              - TH
              - VI
              - TL
              - TR
              - PL
              - UK
        subtitle:
          type: string
          enum:
            - EXTERNAL
            - INTERNAL
            - EMBEDDED
            - NONE
        format:
          type: string
          enum:
            - MKV
            - MP4
            - AVI
            - WEBM
        fileSize:
          type: integer
          minimum: 0
          maximum: 9007199254740991
        torrentStorageId:
          type: string
          minLength: 1
          description: 已为当前字幕组存储的种子对象 key。
        publishedAt:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
        preview:
          type: boolean
        nyaa:
          type: boolean
        publishToNyaa:
          type: boolean
        nyaaCategory:
          $ref: "#/components/schemas/NyaaCategory"
        nyaaComplete:
          type: boolean
        nyaaRemake:
          type: boolean
        nyaaDescription:
          type: string
          maxLength: 20000
        nyaaInformation:
          type: string
          maxLength: 500
      required:
        - animeIdType
        - animeId
        - title
        - magnetBase64
        - torrentStorageId
      additionalProperties: false
    PublishAnimeResponse:
      oneOf:
        - $ref: "#/components/schemas/PublishCommandResponse"
        - $ref: "#/components/schemas/PublishPreviewResponse"
    PublishOtherMultipart:
      type: object
      properties:
        category:
          type: string
          enum:
            - manga
            - music
            - raw
            - stage
            - collection
            - movie
            - other
        title:
          type: string
          minLength: 1
          maxLength: 500
          description: 省略时使用种子内部名称。
        magnetLink:
          type: string
          maxLength: 8192
        magnetBase64:
          type: string
          minLength: 1
          maxLength: 12000
        trackers:
          type: string
          description: 单个表单字段，换行分隔或 JSON 数组字符串；最多 50 项。
        fileSize:
          type: integer
          minimum: 0
          maximum: 9007199254740991
        notes:
          type: string
          maxLength: 50000
        descriptionMarkdown:
          type: string
          maxLength: 50000
        customTags:
          type: string
          description: 单个表单字段，逗号分隔或 JSON 数组字符串；最多 20 项，每项最多 80 字符。
        tags:
          type: string
          description: 单个表单字段，逗号分隔或 JSON 数组字符串；最多 20 项，每项最多 80 字符。
        magnet:
          type: string
          maxLength: 8192
          description: magnetLink 的别名。
        content:
          type: string
          maxLength: 50000
        description:
          type: string
          maxLength: 50000
        intro:
          type: string
          maxLength: 50000
        nyaa:
          type: boolean
        publishToNyaa:
          type: boolean
        nyaaCategory:
          $ref: "#/components/schemas/NyaaCategory"
        nyaaComplete:
          type: boolean
        nyaaRemake:
          type: boolean
        nyaaDescription:
          type: string
          maxLength: 20000
        nyaaInformation:
          type: string
          maxLength: 500
        torrent:
          type: string
          format: binary
      required:
        - category
        - torrent
    PublishOtherJson:
      type: object
      properties:
        category:
          type: string
          enum:
            - manga
            - music
            - raw
            - stage
            - collection
            - movie
            - other
        title:
          type: string
          minLength: 1
          maxLength: 500
        magnetLink:
          type: string
          maxLength: 8192
        magnetBase64:
          type: string
          minLength: 1
          maxLength: 12000
        trackers:
          maxItems: 50
          type: array
          items:
            type: string
            minLength: 1
            maxLength: 500
        fileSize:
          type: integer
          minimum: 0
          maximum: 9007199254740991
        torrentStorageId:
          type: string
          minLength: 1
          maxLength: 1024
        notes:
          type: string
          maxLength: 50000
        descriptionMarkdown:
          type: string
          maxLength: 50000
        customTags:
          maxItems: 20
          type: array
          items:
            type: string
            maxLength: 80
        tags:
          maxItems: 20
          type: array
          items:
            type: string
            maxLength: 80
        sitePublish:
          type: object
          required: []
          properties:
            nyaa:
              $ref: "#/components/schemas/NyaaPublishOptions"
        magnet:
          type: string
          maxLength: 8192
          description: magnetLink 的别名。
        content:
          type: string
          maxLength: 50000
        description:
          type: string
          maxLength: 50000
        intro:
          type: string
          maxLength: 50000
        nyaa:
          type: boolean
        publishToNyaa:
          type: boolean
        nyaaCategory:
          $ref: "#/components/schemas/NyaaCategory"
        nyaaComplete:
          type: boolean
        nyaaRemake:
          type: boolean
        nyaaDescription:
          type: string
          maxLength: 20000
        nyaaInformation:
          type: string
          maxLength: 500
      required:
        - category
        - title
        - torrentStorageId
    PublishOtherResponse:
      $ref: "#/components/schemas/PublishCommandResponse"
    DeletionReceipt:
      type: object
      required:
        - ok
        - result
      properties:
        ok:
          type: boolean
          enum:
            - true
        result:
          type: object
          properties:
            operationId:
              type: string
              minLength: 10
              maxLength: 100
              pattern: ^rdel_[A-Za-z0-9_-]+$
            releaseId:
              type: string
              minLength: 5
              maxLength: 100
              pattern: ^rel_[A-Za-z0-9_-]+$
            state:
              type: string
              enum:
                - pending
                - completed
                - failed
            statusUrl:
              type: string
              minLength: 1
              maxLength: 240
            acceptedAt:
              type: integer
              minimum: 0
              maximum: 9007199254740991
            updatedAt:
              type: integer
              minimum: 0
              maximum: 9007199254740991
            retryAfterMs:
              type: integer
              exclusiveMinimum: 0
              maximum: 9007199254740991
            completedAt:
              type: integer
              minimum: 0
              maximum: 9007199254740991
            failedAt:
              type: integer
              minimum: 0
              maximum: 9007199254740991
            failure:
              type: object
              properties:
                code:
                  type: string
                  const: RELEASE_DELETION_FAILED
                message:
                  type: string
                  minLength: 1
                  maxLength: 240
              required:
                - code
                - message
              additionalProperties: false
          required:
            - operationId
            - releaseId
            - state
            - statusUrl
            - acceptedAt
            - updatedAt
          additionalProperties: false
          allOf:
            - if:
                properties:
                  state:
                    const: pending
              then:
                required:
                  - retryAfterMs
                not:
                  anyOf:
                    - required:
                        - completedAt
                    - required:
                        - failedAt
                    - required:
                        - failure
            - if:
                properties:
                  state:
                    const: completed
              then:
                required:
                  - completedAt
                not:
                  anyOf:
                    - required:
                        - retryAfterMs
                    - required:
                        - failedAt
                    - required:
                        - failure
            - if:
                properties:
                  state:
                    const: failed
              then:
                required:
                  - failedAt
                  - failure
                not:
                  anyOf:
                    - required:
                        - retryAfterMs
                    - required:
                        - completedAt
    SyncPlatformStatus:
      type: object
      required: [ site, status, externalId, externalUrl, error, generation, attempt, createdAt, updatedAt, completedAt, history, historyTruncated ]
      properties:
        site:
          type: string
          enum: [ mikan, acgrip, bangumi, acgnx, dmhy, nyaa ]
        status:
          type: string
          enum: [ not_started, pending, success, failed, ambiguous, deleted ]
          description: 当前站点状态；无同步记录时为 not_started。
        externalId:
          type: [ 'string', 'null' ]
          description: 外站返回的标识或链接；未保存时为 null。
        externalUrl:
          type: [ 'string', 'null' ]
          description: externalId 为 HTTP 或 HTTPS 链接时返回该链接，否则为 null。
        error:
          type: [ 'string', 'null' ]
          description: 错误说明；无错误时为 null。
        generation:
          type: [ 'number', 'null' ]
          description: 当前同步代次；无同步记录时为 null。
        attempt:
          type: integer
          description: 当前尝试次数；无同步记录时为 0。
        createdAt:
          type: [ 'number', 'null' ]
          description: 当前同步记录的创建时间，Unix 毫秒；无记录时为 null。
        updatedAt:
          type: [ 'number', 'null' ]
          description: 当前同步记录的更新时间，Unix 毫秒；无记录时为 null。
        completedAt:
          type: [ 'number', 'null' ]
          description: 当前终态记录的更新时间，Unix 毫秒；未开始或 pending 时为 null。
        history:
          type: array
          maxItems: 50
          items:
            type: object
            required: [ status, occurredAt ]
            properties:
              status:
                type: string
                description: 该历史记录的状态。
              error:
                type: string
                description: 错误说明；无错误时省略。
              occurredAt:
                type: number
                description: 记录发生时间，Unix 毫秒。
              attempt:
                type: number
                description: 记录中的尝试次数；无有效值时省略。
          description: 该站最近 50 条历史记录；无历史时为空数组。
        historyTruncated:
          type: boolean
          description: 该站历史记录超过 50 条时为 true。
    SyncStatusResponse:
      type: object
      required: [ ok, data ]
      properties:
        ok:
          type: boolean
          enum: [ true ]
        data:
          type: object
          required: [ releaseId, title, publishedAt, overall, sites ]
          properties:
            releaseId:
              type: string
            title:
              type: string
            publishedAt:
              type: [ 'number', 'null' ]
              description: 资源发布时间，Unix 毫秒；无值时为 null。
            overall:
              type: string
              enum: [ not_started, pending, partial, success, failed ]
              description: 六站状态汇总；仅全部站点成功时为 success。
            sites:
              type: array
              minItems: 6
              maxItems: 6
              items:
                $ref: '#/components/schemas/SyncPlatformStatus'
              description: 六站状态数组，通过每项的 site 字段识别平台。
    CatalogTitle:
      type: object
      required:
        - primary
      properties:
        primary:
          type: string
        chinese:
          type: string
        chineseTraditional:
          type: string
        romaji:
          type: string
        english:
          type: string
        japanese:
          type: string
    SeasonAnimeItem:
      type: object
      required:
        - bgmId
        - animeId
        - cover
        - title
        - format
        - kind
        - rating
        - episodes
        - airingAt
        - weekday
        - weekdayLabel
        - scheduleStatus
        - rssReleaseCount
        - hasRelease
        - seasonYear
        - season
        - seasonLabel
        - premiereDate
        - premierePrecision
      properties:
        bgmId:
          type:
            - number
            - "null"
        animeId:
          type: string
        cover:
          type:
            - string
            - "null"
        title:
          $ref: "#/components/schemas/CatalogTitle"
        format:
          type:
            - string
            - "null"
        kind:
          type: string
          enum:
            - TV
            - MOVIE
            - OTHER
        rating:
          type: number
          minimum: 0
          maximum: 10
          description: 0–10。无有效评分时为 5.0，真实 0 保留。
          x-scale-maximum: 10
        episodes:
          type:
            - number
            - "null"
        airingAt:
          type:
            - number
            - "null"
          description: 放送时间线上请求时刻之后的下一次播出，没有则为最近一次；Unix 秒，与发布及回执的毫秒时间戳不同。只有带时刻、且与 weekday 同一北京星期和分钟的播出才有值。时间线覆盖上一季、当前季和下一季。
          x-unit: unix-seconds
        weekday:
          type:
            - number
            - "null"
          description: 放送规则的星期，0=周日 … 6=周六，按北京时间。日本时间 00:00–00:59 的深夜档落在北京时间前一天；只有日期的规则保留该日期本身的星期。null 表示没有放送规则。
        weekdayLabel:
          type:
            - string
            - "null"
        scheduleStatus:
          type: string
          description: scheduled 有 airingAt；weekday_only 有星期但给不出时刻（只有日期的规则，或时间线窗口内没有这次播出）；missing_source 没有放送规则。
          enum:
            - scheduled
            - weekday_only
            - missing_source
        rssReleaseCount:
          type: number
        hasRelease:
          type: boolean
        seasonYear:
          type:
            - integer
            - "null"
        season:
          type:
            - string
            - "null"
          enum:
            - WINTER
            - SPRING
            - SUMMER
            - FALL
            - null
        seasonLabel:
          type:
            - string
            - "null"
        premiereDate:
          type:
            - string
            - "null"
          format: date
        premierePrecision:
          type:
            - string
            - "null"
          enum:
            - day
            - month
            - season
            - year
            - null
    AnimeGroupRelease:
      type: object
      required:
        - releaseId
        - title
        - size
        - magnet
        - episodeKey
        - resolution
        - format
        - language
        - subtitle
        - publishedAt
      properties:
        releaseId:
          type: string
        title:
          type: string
        size:
          type:
            - number
            - "null"
          description: 字节。
        magnet:
          type:
            - string
            - "null"
        episodeKey:
          type:
            - string
            - "null"
        resolution:
          type:
            - string
            - "null"
        format:
          type:
            - string
            - "null"
        language:
          type: array
          items:
            type: string
        subtitle:
          type:
            - string
            - "null"
          description: 字幕类型；通常为 EXTERNAL、INTERNAL、EMBEDDED 或 NONE。
        customTags:
          type: array
          items:
            type: string
        version:
          type:
            - string
            - "null"
        torrentStorageId:
          type:
            - string
            - "null"
        publishedAt:
          type: number
    AnimeGroup:
      type: object
      required:
        - groupId
        - slug
        - name
        - status
        - lastUpdatedAt
        - publishedEpisodes
        - items
      properties:
        groupId:
          type: string
        slug:
          type: string
        name:
          type: string
        status:
          type: string
        lastUpdatedAt:
          type:
            - number
            - "null"
        totalReleases:
          type: number
        publishedEpisodes:
          type: array
          items:
            type: number
        items:
          type: array
          items:
            $ref: "#/components/schemas/AnimeGroupRelease"
    AnimePublic:
      type: object
      required:
        - _id
        - _creationTime
        - title
        - titleRomaji
        - coverImage
        - genres
      properties:
        _id:
          type: string
        _creationTime:
          type: number
        bgmId:
          type: number
        title:
          type: object
          required: []
          properties:
            romaji:
              type: string
            english:
              type: string
            native:
              type: string
            chinese:
              type: string
            chineseTraditional:
              type: string
        titleRomaji:
          type: string
        coverImage:
          type: object
          required: []
          properties:
            extraLarge:
              type: string
            large:
              type: string
            color:
              type: string
        coverImageWebp:
          type: object
          required:
            - variants
          properties:
            sourceKey:
              type: string
            version:
              type: number
            generatedAt:
              type: number
            variants:
              type: array
              items:
                type: object
                required:
                  - width
                  - url
                properties:
                  width:
                    type: number
                  key:
                    type: string
                  url:
                    type: string
                  size:
                    type: number
            lqip:
              type: string
            color:
              type: string
        officialSite:
          type: string
        format:
          type: string
        status:
          type: string
        season:
          type: string
        seasonYear:
          type: number
        episodes:
          type: number
        averageScore:
          type: number
          minimum: 0
          maximum: 100
          description: 0–100；缺有效来源评分时为 50。
        genres:
          type: array
          items:
            type: string
        description:
          type: string
        premiere:
          $ref: "#/components/schemas/AnimePremiere"
    MatchEvidence:
      type: object
      required:
        - source
        - kind
        - rawAlias
        - strictKey
        - matchClass
        - evidenceStrength
      properties:
        source:
          type: string
        kind:
          type: string
        rawAlias:
          type: string
        strictKey:
          type: string
        matchClass:
          type: string
          enum:
            - exact
            - structured_exact
            - compact
            - base
            - recall
        evidenceStrength:
          type: string
        originSource:
          type: string
        sourceFamily:
          type: string
        seasonNumber:
          type: number
        courNumber:
          type: number
        partNumber:
          type: number
        sequenceNumber:
          type: number
        formatMarker:
          type: string
        retrievalProvenance:
          type: string
        matchedQueryVariant:
          type: string
    TorrentMatchCandidate:
      type: object
      required:
        - anime
        - animeId
        - bgmId
        - matchScore
        - textMatch
        - matchedHypothesisIds
        - matchedInputs
        - retrieval
      properties:
        anime:
          $ref: "#/components/schemas/AnimePublic"
        animeId:
          type: string
        bgmId:
          type:
            - number
            - "null"
        matchScore:
          type: number
        textMatch:
          type: number
        matchedHypothesisIds:
          type: array
          items:
            type: string
        matchedInputs:
          type: array
          items:
            type: string
            enum:
              - release_title
              - torrent_name
        retrieval:
          type: array
          items:
            type: string
            enum:
              - exact
              - strict_recall
              - fuzzy_recall
              - family_completion
        evidenceSummary:
          $ref: "#/components/schemas/MatchEvidence"
    PublishCommandResponse:
      type: object
      required:
        - ok
        - result
      properties:
        ok:
          type: boolean
          enum:
            - true
        result:
          type: object
          required:
            - releaseId
            - revision
          properties:
            releaseId:
              type: string
            revision:
              type: integer
              minimum: 1
            torrentObjectId:
              type: string
              description: 本次命令登记的种子对象 ID；可能省略。
    PublishPreviewResponse:
      type: object
      required:
        - ok
        - preview
        - previewUrl
        - previewToken
        - expiresAt
        - groupId
        - groupName
        - groupSlug
        - apiKeyId
        - apiKeySuffix
      properties:
        ok:
          type: boolean
          enum:
            - true
        preview:
          type: boolean
          enum:
            - true
        previewUrl:
          type: string
        previewToken:
          type: string
        expiresAt:
          type: number
        groupId:
          type: string
        groupName:
          type: string
        groupSlug:
          type: string
        apiKeyId:
          type: string
        apiKeySuffix:
          type: string
    NyaaPublishOptions:
      type: object
      properties:
        enabled:
          type: boolean
        category:
          type: string
          enum:
            - 1_1
            - 1_2
            - 1_3
            - 1_4
            - 2_1
            - 2_2
            - 3_1
            - 3_2
            - 3_3
            - 4_1
            - 4_2
            - 4_3
            - 4_4
            - 5_1
            - 5_2
            - 6_1
            - 6_2
        complete:
          type: boolean
        remake:
          type: boolean
        description:
          type: string
          maxLength: 20000
        information:
          type: string
          maxLength: 500
      required:
        - enabled
        - category
    AnimePremiere:
      type: object
      required:
        - date
        - precision
      properties:
        date:
          type: string
          format: date
          description: 日历日期；粗精度使用对应周期首日，不代表精确首播日。
        precision:
          type: string
          enum:
            - day
            - month
            - season
            - year
