org.atpodcasting.episode
Schema Diff
+133 -22
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
}