live.voxport.podcast.series
Schema Diff
+19 -0
Compatibility Analysis
Breaking Changes Detected
1 breaking change, 4 non-breaking changes.
Breaking Changes (1)
- RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "live.voxport.podcast.series#seriesRef", src: "live.voxport.podcast.series#seriesRef", tgt: "live.voxport.podcast.series#seriesRef.uri", kind: "prop", name: Some("uri") }
Non-Breaking Changes (4)
- AddedVertex AddedVertex { vertex_id: "live.voxport.podcast.series#seriesRef" }
- AddedVertex AddedVertex { vertex_id: "live.voxport.podcast.series#seriesRef.cid" }
- AddedVertex AddedVertex { vertex_id: "live.voxport.podcast.series#seriesRef.uri" }
- AddedEdge AddedEdge { src: "live.voxport.podcast.series#seriesRef", tgt: "live.voxport.podcast.series#seriesRef.cid", kind: "prop", name: Some("cid") }
Migration Guidance
Added Elements
AddedVertex { vertex_id: "live.voxport.podcast.series#seriesRef" }AddedVertex { vertex_id: "live.voxport.podcast.series#seriesRef.cid" }AddedVertex { vertex_id: "live.voxport.podcast.series#seriesRef.uri" }
Additional Notes
- Breaking: RequiredEdgeAdded { vertex_id: "live.voxport.podcast.series#seriesRef", src: "live.voxport.podcast.series#seriesRef", tgt: "live.voxport.podcast.series#seriesRef.uri", kind: "prop", name: Some("uri") }
- Non-breaking: AddedEdge { src: "live.voxport.podcast.series#seriesRef", tgt: "live.voxport.podcast.series#seriesRef.cid", kind: "prop", name: Some("cid") }
1
1
{
2
2
"id": "live.voxport.podcast.series",
3
3
"defs": {
4
4
"main": {
5
5
"key": "tid",
6
6
"type": "record",
7
7
"record": {
8
8
"type": "object",
9
9
"required": [
10
10
"handle",
11
11
"title",
12
12
"createdAt"
13
13
],
14
14
"properties": {
15
15
"cover": {
16
16
"type": "blob",
17
17
"accept": [
18
18
"image/png",
19
19
"image/jpeg"
20
20
],
21
21
"maxSize": 2097152,
22
22
"description": "Cover art image"
23
23
},
24
24
"email": {
25
25
"type": "string",
26
26
"pattern": "^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$",
27
27
"maxLength": 254,
28
28
"description": "Contact email for podcast"
29
29
},
30
30
"title": {
31
31
"type": "string",
32
32
"maxLength": 256,
33
33
"description": "Display name of the podcast"
34
34
},
35
35
"author": {
36
36
"type": "string",
37
37
"maxLength": 256,
38
38
"description": "Author/creator name (if different from DID owner)"
39
39
},
40
40
"handle": {
41
41
"type": "string",
42
42
"pattern": "^[a-zA-Z0-9_-]+$",
43
43
"maxLength": 64,
44
44
"description": "Unique handle for this series"
45
45
},
46
46
"persons": {
47
47
"type": "array",
48
48
"items": {
49
49
"ref": "live.voxport.podcast.episode#person",
50
50
"type": "ref"
51
51
},
52
52
"maxLength": 50,
53
53
"description": "People associated with this series — show hosts (Podcasting 2.0 podcast:person at channel level)"
54
54
},
55
55
"explicit": {
56
56
"type": "boolean",
57
57
"default": false,
58
58
"description": "Whether content is explicit"
59
59
},
60
60
"language": {
61
61
"type": "string",
62
62
"format": "language",
63
63
"maxLength": 5,
64
64
"description": "Primary language (ISO 639-1)"
65
65
},
66
66
"createdAt": {
67
67
"type": "string",
68
68
"format": "datetime"
69
69
},
70
70
"updatedAt": {
71
71
"type": "string",
72
72
"format": "datetime"
73
73
},
74
74
"categories": {
75
75
"type": "array",
76
76
"items": {
77
77
"type": "string",
78
78
"maxLength": 64
79
79
},
80
80
"maxLength": 5,
81
81
"description": "Podcast categories (Apple Podcasts format)"
82
82
},
83
83
"rssFeedUrl": {
84
84
"type": "string",
85
85
"format": "uri",
86
86
"description": "Original RSS feed URL (for imported series)"
87
87
},
88
88
"websiteUrl": {
89
89
"type": "string",
90
90
"format": "uri",
91
91
"maxLength": 2048,
92
92
"description": "External website URL"
93
93
},
94
94
"description": {
95
95
"type": "string",
96
96
"maxLength": 4000,
97
97
"description": "Podcast description/summary"
98
98
},
99
99
"podcastGuid": {
100
100
"type": "string",
101
101
"pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$",
102
102
"maxLength": 64,
103
103
"description": "Podcasting 2.0 channel-level permanent identity (podcast:guid). A UUIDv5 derived from the feed URL that survives host moves."
104
104
},
105
105
"rssImported": {
106
106
"type": "boolean",
107
107
"default": false,
108
108
"description": "Whether this series was imported from an external RSS feed"
109
109
}
110
110
}
111
111
},
112
112
"description": "A podcast series/channel owned by a creator on VoxPort"
113
+
},
114
+
"seriesRef": {
115
+
"type": "object",
116
+
"required": [
117
+
"uri"
118
+
],
119
+
"properties": {
120
+
"cid": {
121
+
"type": "string",
122
+
"format": "cid",
123
+
"description": "CID of the referenced series record, for a versioned (strong) reference. Optional."
124
+
},
125
+
"uri": {
126
+
"type": "string",
127
+
"format": "at-uri",
128
+
"description": "AT-URI of the referenced series record"
129
+
}
130
+
},
131
+
"description": "A reference to a live.voxport.podcast.series record. Use this (not a ref to the record def itself) when linking to a series from another record. cid is optional so a reference can be stored before the series CID is known."
113
132
}
114
133
},
115
134
"$type": "com.atproto.lexicon.schema",
116
135
"lexicon": 1,
117
136
"description": "A podcast series/channel owned by a creator on VoxPort"
118
137
}