mirror of
				https://github.com/advplyr/audiobookshelf.git
				synced 2025-10-27 11:18:14 +01:00 
			
		
		
		
	Update RSS feed to exclude empty tags, format duration, use CDATA
This commit is contained in:
		
							parent
							
								
									f13283b950
								
							
						
					
					
						commit
						54a4b09592
					
				| @ -561,7 +561,42 @@ class Feed extends Model { | ||||
|    * @param {string} hostPrefix | ||||
|    */ | ||||
|   buildXml(hostPrefix) { | ||||
|     const blockTags = [{ 'itunes:block': 'yes' }, { 'googleplay:block': 'yes' }] | ||||
|     const customElements = [ | ||||
|       { language: this.language || 'en' }, | ||||
|       { author: this.author || 'advplyr' }, | ||||
|       { 'itunes:author': this.author || 'advplyr' }, | ||||
|       { 'itunes:type': this.podcastType || 'serial' }, | ||||
|       { | ||||
|         'itunes:image': { | ||||
|           _attr: { | ||||
|             href: `${hostPrefix}${this.imageURL}` | ||||
|           } | ||||
|         } | ||||
|       }, | ||||
|       { 'itunes:explicit': !!this.explicit } | ||||
|     ] | ||||
| 
 | ||||
|     if (this.description) { | ||||
|       customElements.push({ 'itunes:summary': { _cdata: this.description } }) | ||||
|     } | ||||
| 
 | ||||
|     const itunesOwnersData = [] | ||||
|     if (this.ownerName || this.author) { | ||||
|       itunesOwnersData.push({ 'itunes:name': this.ownerName || this.author }) | ||||
|     } | ||||
|     if (this.ownerEmail) { | ||||
|       itunesOwnersData.push({ 'itunes:email': this.ownerEmail }) | ||||
|     } | ||||
|     if (itunesOwnersData.length) { | ||||
|       customElements.push({ | ||||
|         'itunes:owner': itunesOwnersData | ||||
|       }) | ||||
|     } | ||||
| 
 | ||||
|     if (this.preventIndexing) { | ||||
|       customElements.push({ 'itunes:block': 'yes' }, { 'googleplay:block': 'yes' }) | ||||
|     } | ||||
| 
 | ||||
|     const rssData = { | ||||
|       title: this.title, | ||||
|       description: this.description || '', | ||||
| @ -571,29 +606,10 @@ class Feed extends Model { | ||||
|       image_url: `${hostPrefix}${this.imageURL}`, | ||||
|       custom_namespaces: { | ||||
|         itunes: 'http://www.itunes.com/dtds/podcast-1.0.dtd', | ||||
|         psc: 'http://podlove.org/simple-chapters', | ||||
|         podcast: 'https://podcastindex.org/namespace/1.0', | ||||
|         googleplay: 'http://www.google.com/schemas/play-podcasts/1.0' | ||||
|       }, | ||||
|       custom_elements: [ | ||||
|         { language: this.language || 'en' }, | ||||
|         { author: this.author || 'advplyr' }, | ||||
|         { 'itunes:author': this.author || 'advplyr' }, | ||||
|         { 'itunes:summary': this.description || '' }, | ||||
|         { 'itunes:type': this.podcastType }, | ||||
|         { | ||||
|           'itunes:image': { | ||||
|             _attr: { | ||||
|               href: `${hostPrefix}${this.imageURL}` | ||||
|             } | ||||
|           } | ||||
|         }, | ||||
|         { | ||||
|           'itunes:owner': [{ 'itunes:name': this.ownerName || this.author || '' }, { 'itunes:email': this.ownerEmail || '' }] | ||||
|         }, | ||||
|         { 'itunes:explicit': !!this.explicit }, | ||||
|         ...(this.preventIndexing ? blockTags : []) | ||||
|       ] | ||||
|       custom_elements: customElements | ||||
|     } | ||||
| 
 | ||||
|     const rssfeed = new RSS(rssData) | ||||
|  | ||||
| @ -305,6 +305,21 @@ class FeedEpisode extends Model { | ||||
|    * @param {string} hostPrefix | ||||
|    */ | ||||
|   getRSSData(hostPrefix) { | ||||
|     const customElements = [ | ||||
|       { 'itunes:author': this.author || null }, | ||||
|       { 'itunes:duration': Math.round(Number(this.duration)) }, | ||||
|       { 'itunes:summary': this.description || null }, | ||||
|       { | ||||
|         'itunes:explicit': !!this.explicit | ||||
|       }, | ||||
|       { 'itunes:episodeType': this.episodeType || null }, | ||||
|       { 'itunes:season': this.season || null }, | ||||
|       { 'itunes:episode': this.episode || null } | ||||
|     ].filter((element) => { | ||||
|       // Remove empty custom elements
 | ||||
|       return Object.values(element)[0] !== null | ||||
|     }) | ||||
| 
 | ||||
|     return { | ||||
|       title: this.title, | ||||
|       description: this.description || '', | ||||
| @ -317,17 +332,7 @@ class FeedEpisode extends Model { | ||||
|         type: this.enclosureType, | ||||
|         size: this.enclosureSize | ||||
|       }, | ||||
|       custom_elements: [ | ||||
|         { 'itunes:author': this.author }, | ||||
|         { 'itunes:duration': secondsToTimestamp(this.duration) }, | ||||
|         { 'itunes:summary': this.description || '' }, | ||||
|         { | ||||
|           'itunes:explicit': !!this.explicit | ||||
|         }, | ||||
|         { 'itunes:episodeType': this.episodeType }, | ||||
|         { 'itunes:season': this.season }, | ||||
|         { 'itunes:episode': this.episode } | ||||
|       ] | ||||
|       custom_elements: customElements | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
| @ -112,7 +112,7 @@ function secondsToTimestamp(seconds, includeMs = false, alwaysIncludeHours = fal | ||||
|   var ms = _seconds - Math.floor(seconds) | ||||
|   _seconds = Math.floor(_seconds) | ||||
| 
 | ||||
|   var msString = '.' + (includeMs ? ms.toFixed(3) : '0.0').split('.')[1] | ||||
|   const msString = includeMs ? '.' + ms.toFixed(3).split('.')[1] : '' | ||||
|   if (alwaysIncludeHours) { | ||||
|     return `${_hours.toString().padStart(2, '0')}:${_minutes.toString().padStart(2, '0')}:${_seconds.toString().padStart(2, '0')}${msString}` | ||||
|   } | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user