@@ -3,9 +3,16 @@ import { format, parseISO } from "date-fns";
33import { defineField , defineType } from "sanity" ;
44
55import contentType from "../partials/content" ;
6+ import {
7+ socialPreviewFields ,
8+ socialPreviewGroup ,
9+ } from "../partials/socialPreview" ;
610import podcastType from "./podcastType" ;
711import guestType from "./guest" ;
812import authorType from "./author" ;
13+ import podcastSeriesType from "./podcastSeries" ;
14+ import shortType from "./short" ;
15+ import postType from "./post" ;
916
1017export default defineType ( {
1118 ...contentType ,
@@ -15,13 +22,16 @@ export default defineType({
1522 type : "document" ,
1623 groups : [
1724 ...( contentType . groups || [ ] ) ,
25+ socialPreviewGroup ,
1826 {
1927 name : "podcast" ,
2028 title : "Podcast Details" ,
2129 } ,
2230 ] ,
2331 fields : [
2432 ...contentType . fields ,
33+ ...socialPreviewFields ,
34+ // --- Existing podcast-specific fields ---
2535 defineField ( {
2636 name : "podcastType" ,
2737 title : "Podcast Type" ,
@@ -125,6 +135,153 @@ export default defineType({
125135 type : "podcastRssEpisode" ,
126136 // validation: (rule) => [rule.required()],
127137 } ) ,
138+ // --- New fields ---
139+ defineField ( {
140+ name : "thumbnail" ,
141+ title : "Thumbnail" ,
142+ type : "image" ,
143+ options : {
144+ hotspot : true ,
145+ } ,
146+ group : "podcast" ,
147+ description :
148+ "YouTube-optimized thumbnail (1280×720). Falls back to coverImage." ,
149+ } ) ,
150+ defineField ( {
151+ name : "duration" ,
152+ title : "Duration" ,
153+ type : "number" ,
154+ group : "podcast" ,
155+ description : "Episode duration in seconds" ,
156+ } ) ,
157+ defineField ( {
158+ name : "chapters" ,
159+ title : "Chapters" ,
160+ type : "array" ,
161+ group : "podcast" ,
162+ of : [
163+ {
164+ type : "object" ,
165+ fields : [
166+ defineField ( {
167+ name : "title" ,
168+ title : "Title" ,
169+ type : "string" ,
170+ validation : ( rule ) => rule . required ( ) ,
171+ } ) ,
172+ defineField ( {
173+ name : "timestamp" ,
174+ title : "Timestamp" ,
175+ type : "string" ,
176+ validation : ( rule ) => rule . required ( ) ,
177+ description : "Display format e.g. 02:34" ,
178+ } ) ,
179+ defineField ( {
180+ name : "seconds" ,
181+ title : "Seconds" ,
182+ type : "number" ,
183+ validation : ( rule ) => rule . required ( ) ,
184+ description : "Timestamp in seconds for seeking" ,
185+ } ) ,
186+ ] ,
187+ preview : {
188+ select : {
189+ title : "title" ,
190+ subtitle : "timestamp" ,
191+ } ,
192+ } ,
193+ } ,
194+ ] ,
195+ } ) ,
196+ defineField ( {
197+ name : "series" ,
198+ title : "Series" ,
199+ type : "reference" ,
200+ to : [ { type : podcastSeriesType . name } ] ,
201+ group : "podcast" ,
202+ } ) ,
203+ defineField ( {
204+ name : "seriesOrder" ,
205+ title : "Series Order" ,
206+ type : "number" ,
207+ group : "podcast" ,
208+ description : "Position within the series" ,
209+ } ) ,
210+ defineField ( {
211+ name : "listenLinks" ,
212+ title : "Listen Links" ,
213+ type : "object" ,
214+ group : "podcast" ,
215+ description : "Multi-platform listen links" ,
216+ fields : [
217+ defineField ( {
218+ name : "youtube" ,
219+ title : "YouTube" ,
220+ type : "string" ,
221+ } ) ,
222+ defineField ( {
223+ name : "spotify" ,
224+ title : "Spotify" ,
225+ type : "string" ,
226+ } ) ,
227+ defineField ( {
228+ name : "apple" ,
229+ title : "Apple Podcasts" ,
230+ type : "string" ,
231+ } ) ,
232+ defineField ( {
233+ name : "overcast" ,
234+ title : "Overcast" ,
235+ type : "string" ,
236+ } ) ,
237+ defineField ( {
238+ name : "pocketCasts" ,
239+ title : "Pocket Casts" ,
240+ type : "string" ,
241+ } ) ,
242+ defineField ( {
243+ name : "rss" ,
244+ title : "RSS" ,
245+ type : "string" ,
246+ } ) ,
247+ ] ,
248+ } ) ,
249+ defineField ( {
250+ name : "transcript" ,
251+ title : "Transcript" ,
252+ type : "text" ,
253+ group : "podcast" ,
254+ description : "Full episode transcript" ,
255+ } ) ,
256+ defineField ( {
257+ name : "contentType" ,
258+ title : "Content Type" ,
259+ type : "string" ,
260+ group : "podcast" ,
261+ description : "Episode format" ,
262+ options : {
263+ list : [ "interview" , "solo" , "tutorial" , "news" , "review" ] ,
264+ } ,
265+ } ) ,
266+ defineField ( {
267+ name : "relatedShorts" ,
268+ title : "Related Shorts" ,
269+ type : "array" ,
270+ group : "podcast" ,
271+ of : [
272+ {
273+ type : "reference" ,
274+ to : [ { type : shortType . name } ] ,
275+ } ,
276+ ] ,
277+ } ) ,
278+ defineField ( {
279+ name : "relatedBlogPost" ,
280+ title : "Related Blog Post" ,
281+ type : "reference" ,
282+ group : "podcast" ,
283+ to : [ { type : postType . name } ] ,
284+ } ) ,
128285 ] ,
129286 orderings : [
130287 {
0 commit comments