org.atpodcasting.episode

atpodcasting.org

Schema Diff

+133 -22

From

CID
bafyreig77lzhhlp...
Indexed At
2026-02-07 16:11 UTC
View this version

To

CID
bafyreib5bfxznap...
Indexed At
2026-02-14 04:54 UTC
View this version
1 1
{
2 2
  "id": "org.atpodcasting.episode",
3 3
  "defs": {
4 4
    "main": {
5 -
      "key": "tid",
5 +
      "key": "any",
6 6
      "type": "record",
7 7
      "record": {
8 8
        "type": "object",
9 9
        "required": [
10 10
          "podcast",
11 -
          "guid",
12 11
          "title",
13 12
          "media",
14 13
          "publishedAt",
15 -
          "duration"
14 +
          "duration",
15 +
          "feedItemGuid",
16 +
          "createdAt"
16 17
        ],
17 18
        "properties": {
18 -
          "guid": {
19 +
          "link": {
19 20
            "type": "string",
20 -
            "maxLength": 2000,
21 -
            "description": "Identifier matching the guid element in the RSS feed item."
21 +
            "format": "uri",
22 +
            "description": "URL of a companion webpage or show notes page for the episode."
22 23
          },
23 24
          "media": {
24 -
            "type": "blob",
25 -
            "accept": [
26 -
              "audio/*",
27 -
              "video/*"
28 -
            ],
29 -
            "description": "The media file for the episode (audio or video)."
25 +
            "ref": "#mediaRef",
26 +
            "type": "ref",
27 +
            "description": "The primary media file for the episode."
30 28
          },
31 29
          "title": {
32 30
            "type": "string",
33 31
            "maxLength": 500,
34 32
            "description": "The title of the episode."
35 33
          },
34 +
          "artwork": {
35 +
            "type": "blob",
36 +
            "accept": [
37 +
              "image/png",
38 +
              "image/jpeg"
39 +
            ],
40 +
            "maxSize": 5000000,
41 +
            "description": "Episode-specific artwork. Overrides the podcast artwork when set. Recommended: 1400x1400 to 3000x3000 pixels, square, no alpha channel."
42 +
          },
36 43
          "podcast": {
37 -
            "ref": "#podcastRef",
44 +
            "ref": "org.atpodcasting.defs#podcastRef",
38 45
            "type": "ref",
39 -
            "description": "Reference to the parent podcast."
46 +
            "description": "Identifies the parent podcast. Since episodes live in the same repository as their podcast, the AT URI is always derivable from the episode's DID and the podcastGuid."
47 +
          },
48 +
          "chapters": {
49 +
            "ref": "#chaptersRef",
50 +
            "type": "ref",
51 +
            "description": "Reference to an externally hosted chapters file."
40 52
          },
41 53
          "duration": {
42 54
            "type": "integer",
43 -
            "minimum": 0,
55 +
            "minimum": 1,
44 56
            "description": "Duration of the episode in seconds."
45 57
          },
58 +
          "explicit": {
59 +
            "type": "boolean",
60 +
            "description": "Whether the episode contains explicit content. Overrides the podcast-level setting when set."
61 +
          },
62 +
          "createdAt": {
63 +
            "type": "string",
64 +
            "format": "datetime",
65 +
            "description": "When the episode record was created."
66 +
          },
67 +
          "transcript": {
68 +
            "type": "array",
69 +
            "items": {
70 +
              "ref": "#transcriptRef",
71 +
              "type": "ref"
72 +
            },
73 +
            "maxLength": 10,
74 +
            "description": "References to externally hosted transcript files (e.g. VTT, SRT, JSON). Multiple entries allow providing transcripts in different formats."
75 +
          },
46 76
          "description": {
47 77
            "type": "string",
48 78
            "maxLength": 10000,
49 79
            "description": "A description or show notes for the episode."
50 80
          },
81 +
          "episodeType": {
82 +
            "type": "string",
83 +
            "description": "The type of episode. Defaults to full.",
84 +
            "knownValues": [
85 +
              "full",
86 +
              "trailer",
87 +
              "bonus"
88 +
            ]
89 +
          },
51 90
          "publishedAt": {
52 91
            "type": "string",
53 92
            "format": "datetime",
54 93
            "description": "When the episode was published."
94 +
          },
95 +
          "feedItemGuid": {
96 +
            "type": "string",
97 +
            "maxLength": 2000,
98 +
            "description": "The original feed item identifier. Must match the <guid> element of the corresponding RSS feed item. The record key (rkey) is derived from this value as uuid5(<podcast:guid>, feedItemGuid)."
99 +
          },
100 +
          "seasonNumber": {
101 +
            "type": "integer",
102 +
            "minimum": 1,
103 +
            "description": "Season number of the episode."
104 +
          },
105 +
          "episodeNumber": {
106 +
            "type": "integer",
107 +
            "minimum": 1,
108 +
            "description": "Episode number within its season or the overall series."
109 +
          },
110 +
          "alternateMedia": {
111 +
            "type": "array",
112 +
            "items": {
113 +
              "ref": "#mediaRef",
114 +
              "type": "ref"
115 +
            },
116 +
            "maxLength": 10,
117 +
            "description": "Alternate versions of the episode media (e.g. different formats or audio-only versions of video episodes)."
55 118
          }
56 119
        }
57 120
      },
58 -
      "description": "A podcast episode."
121 +
      "description": "A podcast episode. Record key is a UUIDv5 derived from the podcast GUID (as namespace) and the episode's feedItemGuid (as name), enabling deterministic lookup from RSS feed metadata."
59 122
    },
60 -
    "podcastRef": {
123 +
    "mediaRef": {
61 124
      "type": "object",
62 125
      "required": [
63 -
        "uri"
126 +
        "url",
127 +
        "mimeType"
64 128
      ],
65 129
      "properties": {
66 -
        "uri": {
130 +
        "url": {
67 131
          "type": "string",
68 -
          "format": "at-uri",
69 -
          "description": "AT URI of the podcast record."
132 +
          "format": "uri",
133 +
          "description": "URL of the media file."
134 +
        },
135 +
        "mimeType": {
136 +
          "type": "string",
137 +
          "description": "MIME type of the media file (e.g. audio/mpeg, video/mp4)."
70 138
        }
71 139
      },
72 -
      "description": "Weak reference to a podcast (no CID, allows mutation)."
140 +
      "description": "Reference to an externally hosted media file."
141 +
    },
142 +
    "chaptersRef": {
143 +
      "type": "object",
144 +
      "required": [
145 +
        "url",
146 +
        "mimeType"
147 +
      ],
148 +
      "properties": {
149 +
        "url": {
150 +
          "type": "string",
151 +
          "format": "uri",
152 +
          "description": "URL of the chapters file."
153 +
        },
154 +
        "mimeType": {
155 +
          "type": "string",
156 +
          "description": "MIME type of the chapters file (e.g. application/json+chapters)."
157 +
        }
158 +
      },
159 +
      "description": "Reference to an externally hosted chapters file."
160 +
    },
161 +
    "transcriptRef": {
162 +
      "type": "object",
163 +
      "required": [
164 +
        "url",
165 +
        "mimeType"
166 +
      ],
167 +
      "properties": {
168 +
        "url": {
169 +
          "type": "string",
170 +
          "format": "uri",
171 +
          "description": "URL of the transcript file."
172 +
        },
173 +
        "language": {
174 +
          "type": "string",
175 +
          "format": "language",
176 +
          "description": "Language of the transcript (ISO 639-1 two-letter code, e.g. 'en', 'es', 'pt')."
177 +
        },
178 +
        "mimeType": {
179 +
          "type": "string",
180 +
          "description": "MIME type of the transcript file (e.g. text/vtt, application/x-subrip, application/json)."
181 +
        }
182 +
      },
183 +
      "description": "Reference to an externally hosted transcript file."
73 184
    }
74 185
  },
75 186
  "$type": "com.atproto.lexicon.schema",
76 187
  "lexicon": 1
77 188
}

Compare Other Versions

Lexicon Garden

@