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