@@ -106,16 +106,45 @@ export function buildProgramsXml(data: GridApiResponse): string {
106
106
xml += ` <desc>${ escapeXml ( event . program . shortDesc ) } </desc>\n` ;
107
107
}
108
108
109
+ // Date logic: releaseYear first, else current date from startTime (America/New_York)
110
+ if ( event . program . releaseYear ) {
111
+ xml += ` <date>${ escapeXml ( event . program . releaseYear ) } </date>
112
+ ` ;
113
+ } else {
114
+ const nyFormatter = new Intl . DateTimeFormat ( "en-US" , {
115
+ timeZone : "America/New_York" ,
116
+ year : "numeric" ,
117
+ month : "2-digit" ,
118
+ day : "2-digit"
119
+ } ) ;
120
+ const parts = nyFormatter . formatToParts ( new Date ( event . startTime ) ) ;
121
+ const year = parseInt ( parts . find ( p => p . type === "year" ) ?. value || "1970" , 10 ) ;
122
+ const mm = parts . find ( p => p . type === "month" ) ?. value || "01" ;
123
+ const dd = parts . find ( p => p . type === "day" ) ?. value || "01" ;
124
+ xml += ` <date>${ year } ${ mm } ${ dd } </date>
125
+ ` ;
126
+ }
127
+
128
+
109
129
const genreSet = new Set ( event . program . genres ?. map ( g => g . toLowerCase ( ) ) || [ ] ) ;
110
130
111
131
if ( event . program . genres && event . program . genres . length > 0 ) {
112
132
const sortedGenres = [ ...event . program . genres ] . sort ( ( a , b ) => a . localeCompare ( b ) ) ;
113
133
for ( const genre of sortedGenres ) {
114
134
const capitalizedGenre = genre . charAt ( 0 ) . toUpperCase ( ) + genre . slice ( 1 ) ;
115
- xml += ` <category lang="en">${ escapeXml ( capitalizedGenre ) } </category>\n` ;
135
+ xml += ` <category lang="en">${ escapeXml ( capitalizedGenre ) } </category>
136
+ ` ;
137
+
116
138
}
117
139
}
118
140
141
+ // add <length> after categories
142
+ if ( event . duration ) {
143
+ xml += ` <length units="minutes">${ escapeXml ( event . duration ) } </length>
144
+ ` ;
145
+ }
146
+
147
+
119
148
if ( event . rating ) {
120
149
xml += ` <rating system="MPAA"><value>${ escapeXml (
121
150
event . rating ,
@@ -184,8 +213,6 @@ export function buildProgramsXml(data: GridApiResponse): string {
184
213
} ) ;
185
214
const parts = nyFormatter . formatToParts ( new Date ( event . startTime ) ) ;
186
215
const year = parseInt ( parts . find ( p => p . type === "year" ) ?. value || "1970" , 10 ) ;
187
- const mm = parts . find ( p => p . type === "month" ) ?. value || "01" ;
188
- const dd = parts . find ( p => p . type === "day" ) ?. value || "01" ;
189
216
const episodeIdx = parseInt ( event . program . episode , 10 ) ;
190
217
if ( ! isNaN ( episodeIdx ) ) {
191
218
const xmltvNsTag = ` <episode-num system="xmltv_ns">${ year - 1 } .${ episodeIdx - 1 } .0/1</episode-num>\n` ;
@@ -195,8 +222,7 @@ export function buildProgramsXml(data: GridApiResponse): string {
195
222
episodeNumTags . push ( xmltvNsTag ) ;
196
223
}
197
224
}
198
- const dateStr = `${ year } ${ mm } ${ dd } ` ;
199
- xml += ` <date>${ dateStr } </date>\n` ;
225
+
200
226
} else if ( ! event . program . episode && event . program . id ) {
201
227
const match = event . program . id . match ( / ^ ( ..\d { 8 } ) ( \d { 4 } ) / ) ;
202
228
if ( match ) {
@@ -214,8 +240,6 @@ export function buildProgramsXml(data: GridApiResponse): string {
214
240
const year = parseInt ( parts . find ( p => p . type === "year" ) ?. value || "1970" , 10 ) ;
215
241
const mm = parts . find ( p => p . type === "month" ) ?. value || "01" ;
216
242
const dd = parts . find ( p => p . type === "day" ) ?. value || "01" ;
217
- const dateStr = `${ year } ${ mm } ${ dd } ` ;
218
- xml += ` <date>${ dateStr } </date>\n` ;
219
243
220
244
if ( ! skipXmltvNs ) {
221
245
const mmddNum = parseInt ( `${ mm } ${ dd } ` , 10 ) ;
@@ -234,8 +258,7 @@ export function buildProgramsXml(data: GridApiResponse): string {
234
258
if ( event . program . originalAirDate || event . program . episodeAirDate ) {
235
259
const airDate = new Date ( event . program . episodeAirDate || event . program . originalAirDate || '' ) ;
236
260
if ( ! isNaN ( airDate . getTime ( ) ) ) {
237
- const dateStr = airDate . toISOString ( ) . slice ( 0 , 10 ) . replace ( / - / g, "" ) ;
238
- xml += ` <date>${ dateStr } </date>\n` ;
261
+
239
262
xml += ` <episode-num system="original-air-date">${ airDate . toISOString ( ) . replace ( "T" , " " ) . split ( "." ) [ 0 ] } </episode-num>\n` ;
240
263
}
241
264
}
0 commit comments