mirror of
				https://github.com/advplyr/audiobookshelf.git
				synced 2025-10-27 11:18:14 +01:00 
			
		
		
		
	Update:Podcast episodes look for new episodes after this date add input to set the max # of episodes to download
This commit is contained in:
		
							parent
							
								
									c17612a233
								
							
						
					
					
						commit
						3dc848a106
					
				| @ -2,8 +2,15 @@ | |||||||
|   <div class="w-full h-full overflow-y-auto overflow-x-hidden px-4 py-6"> |   <div class="w-full h-full overflow-y-auto overflow-x-hidden px-4 py-6"> | ||||||
|     <div class="w-full mb-4"> |     <div class="w-full mb-4"> | ||||||
|       <div v-if="userIsAdminOrUp" class="flex items-end justify-end mb-4"> |       <div v-if="userIsAdminOrUp" class="flex items-end justify-end mb-4"> | ||||||
|         <!-- <p v-if="autoDownloadEpisodes">Last new episode check {{ $formatDate(lastEpisodeCheck) }}</p> --> |  | ||||||
|         <ui-text-input-with-label ref="lastCheckInput" v-model="lastEpisodeCheckInput" :disabled="checkingNewEpisodes" type="datetime-local" label="Look for new episodes after this date" class="max-w-xs mr-2" /> |         <ui-text-input-with-label ref="lastCheckInput" v-model="lastEpisodeCheckInput" :disabled="checkingNewEpisodes" type="datetime-local" label="Look for new episodes after this date" class="max-w-xs mr-2" /> | ||||||
|  |         <ui-text-input-with-label ref="maxEpisodesInput" v-model="maxEpisodesToDownload" :disabled="checkingNewEpisodes" type="number" label="Max episodes" class="w-16 mr-2" input-class="h-10"> | ||||||
|  |           <div class="flex -mb-0.5"> | ||||||
|  |             <p class="px-1 text-sm font-semibold" :class="{ 'text-gray-400': checkingNewEpisodes }">Limit</p> | ||||||
|  |             <ui-tooltip direction="top" text="Max # of episodes to download. Use 0 for unlimited."> | ||||||
|  |               <span class="material-icons text-base">info_outlined</span> | ||||||
|  |             </ui-tooltip> | ||||||
|  |           </div> | ||||||
|  |         </ui-text-input-with-label> | ||||||
|         <ui-btn :loading="checkingNewEpisodes" @click="checkForNewEpisodes">Check & Download New Episodes</ui-btn> |         <ui-btn :loading="checkingNewEpisodes" @click="checkForNewEpisodes">Check & Download New Episodes</ui-btn> | ||||||
|       </div> |       </div> | ||||||
| 
 | 
 | ||||||
| @ -52,7 +59,8 @@ export default { | |||||||
|   data() { |   data() { | ||||||
|     return { |     return { | ||||||
|       checkingNewEpisodes: false, |       checkingNewEpisodes: false, | ||||||
|       lastEpisodeCheckInput: null |       lastEpisodeCheckInput: null, | ||||||
|  |       maxEpisodesToDownload: 3 | ||||||
|     } |     } | ||||||
|   }, |   }, | ||||||
|   watch: { |   watch: { | ||||||
| @ -89,6 +97,16 @@ export default { | |||||||
|       if (this.$refs.lastCheckInput) { |       if (this.$refs.lastCheckInput) { | ||||||
|         this.$refs.lastCheckInput.blur() |         this.$refs.lastCheckInput.blur() | ||||||
|       } |       } | ||||||
|  |       if (this.$refs.maxEpisodesInput) { | ||||||
|  |         this.$refs.maxEpisodesInput.blur() | ||||||
|  |       } | ||||||
|  | 
 | ||||||
|  |       if (this.maxEpisodesToDownload < 0) { | ||||||
|  |         this.maxEpisodesToDownload = 3 | ||||||
|  |         this.$toast.error('Invalid max episodes to download') | ||||||
|  |         return | ||||||
|  |       } | ||||||
|  | 
 | ||||||
|       this.checkingNewEpisodes = true |       this.checkingNewEpisodes = true | ||||||
|       const lastEpisodeCheck = new Date(this.lastEpisodeCheckInput).valueOf() |       const lastEpisodeCheck = new Date(this.lastEpisodeCheckInput).valueOf() | ||||||
| 
 | 
 | ||||||
| @ -102,7 +120,7 @@ export default { | |||||||
|       } |       } | ||||||
| 
 | 
 | ||||||
|       this.$axios |       this.$axios | ||||||
|         .$get(`/api/podcasts/${this.libraryItemId}/checknew`) |         .$get(`/api/podcasts/${this.libraryItemId}/checknew?limit=${this.maxEpisodesToDownload}`) | ||||||
|         .then((response) => { |         .then((response) => { | ||||||
|           if (response.episodes && response.episodes.length) { |           if (response.episodes && response.episodes.length) { | ||||||
|             console.log('New episodes', response.episodes.length) |             console.log('New episodes', response.episodes.length) | ||||||
|  | |||||||
| @ -5,7 +5,7 @@ | |||||||
|         {{ label }}<em v-if="note" class="font-normal text-xs pl-2">{{ note }}</em> |         {{ label }}<em v-if="note" class="font-normal text-xs pl-2">{{ note }}</em> | ||||||
|       </p> |       </p> | ||||||
|     </slot> |     </slot> | ||||||
|     <ui-text-input ref="input" v-model="inputValue" :disabled="disabled" :readonly="readonly" :type="type" class="w-full" @blur="inputBlurred" /> |     <ui-text-input ref="input" v-model="inputValue" :disabled="disabled" :readonly="readonly" :type="type" class="w-full" :class="inputClass" @blur="inputBlurred" /> | ||||||
|   </div> |   </div> | ||||||
| </template> | </template> | ||||||
| 
 | 
 | ||||||
| @ -20,7 +20,8 @@ export default { | |||||||
|       default: 'text' |       default: 'text' | ||||||
|     }, |     }, | ||||||
|     readonly: Boolean, |     readonly: Boolean, | ||||||
|     disabled: Boolean |     disabled: Boolean, | ||||||
|  |     inputClass: String | ||||||
|   }, |   }, | ||||||
|   data() { |   data() { | ||||||
|     return {} |     return {} | ||||||
|  | |||||||
| @ -140,7 +140,9 @@ class PodcastController { | |||||||
|       return res.status(500).send('Podcast has no rss feed url') |       return res.status(500).send('Podcast has no rss feed url') | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     var newEpisodes = await this.podcastManager.checkAndDownloadNewEpisodes(libraryItem) |     const maxEpisodesToDownload = !isNaN(req.query.limit) ? Number(req.query.limit) : 3 | ||||||
|  | 
 | ||||||
|  |     var newEpisodes = await this.podcastManager.checkAndDownloadNewEpisodes(libraryItem, maxEpisodesToDownload) | ||||||
|     res.json({ |     res.json({ | ||||||
|       episodes: newEpisodes || [] |       episodes: newEpisodes || [] | ||||||
|     }) |     }) | ||||||
|  | |||||||
| @ -221,7 +221,7 @@ class PodcastManager { | |||||||
|     return libraryItem.media.autoDownloadEpisodes |     return libraryItem.media.autoDownloadEpisodes | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   async checkPodcastForNewEpisodes(podcastLibraryItem, dateToCheckForEpisodesAfter) { |   async checkPodcastForNewEpisodes(podcastLibraryItem, dateToCheckForEpisodesAfter, maxNewEpisodes = 3) { | ||||||
|     if (!podcastLibraryItem.media.metadata.feedUrl) { |     if (!podcastLibraryItem.media.metadata.feedUrl) { | ||||||
|       Logger.error(`[PodcastManager] checkPodcastForNewEpisodes no feed url for ${podcastLibraryItem.media.metadata.title} (ID: ${podcastLibraryItem.id})`) |       Logger.error(`[PodcastManager] checkPodcastForNewEpisodes no feed url for ${podcastLibraryItem.media.metadata.title} (ID: ${podcastLibraryItem.id})`) | ||||||
|       return false |       return false | ||||||
| @ -234,15 +234,18 @@ class PodcastManager { | |||||||
| 
 | 
 | ||||||
|     // Filter new and not already has
 |     // Filter new and not already has
 | ||||||
|     var newEpisodes = feed.episodes.filter(ep => ep.publishedAt > dateToCheckForEpisodesAfter && !podcastLibraryItem.media.checkHasEpisodeByFeedUrl(ep.enclosure.url)) |     var newEpisodes = feed.episodes.filter(ep => ep.publishedAt > dateToCheckForEpisodesAfter && !podcastLibraryItem.media.checkHasEpisodeByFeedUrl(ep.enclosure.url)) | ||||||
|     // Max new episodes for safety = 3
 | 
 | ||||||
|     newEpisodes = newEpisodes.slice(0, 3) |     if (maxNewEpisodes > 0) { | ||||||
|  |       newEpisodes = newEpisodes.slice(0, maxNewEpisodes) | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     return newEpisodes |     return newEpisodes | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   async checkAndDownloadNewEpisodes(libraryItem) { |   async checkAndDownloadNewEpisodes(libraryItem, maxEpisodesToDownload) { | ||||||
|     const lastEpisodeCheckDate = new Date(libraryItem.media.lastEpisodeCheck || 0) |     const lastEpisodeCheckDate = new Date(libraryItem.media.lastEpisodeCheck || 0) | ||||||
|     Logger.info(`[PodcastManager] checkAndDownloadNewEpisodes for "${libraryItem.media.metadata.title}" - Last episode check: ${lastEpisodeCheckDate}`) |     Logger.info(`[PodcastManager] checkAndDownloadNewEpisodes for "${libraryItem.media.metadata.title}" - Last episode check: ${lastEpisodeCheckDate}`) | ||||||
|     var newEpisodes = await this.checkPodcastForNewEpisodes(libraryItem, libraryItem.media.lastEpisodeCheck) |     var newEpisodes = await this.checkPodcastForNewEpisodes(libraryItem, libraryItem.media.lastEpisodeCheck, maxEpisodesToDownload) | ||||||
|     if (newEpisodes.length) { |     if (newEpisodes.length) { | ||||||
|       Logger.info(`[PodcastManager] Found ${newEpisodes.length} new episodes for podcast "${libraryItem.media.metadata.title}" - starting download`) |       Logger.info(`[PodcastManager] Found ${newEpisodes.length} new episodes for podcast "${libraryItem.media.metadata.title}" - starting download`) | ||||||
|       this.downloadPodcastEpisodes(libraryItem, newEpisodes, false) |       this.downloadPodcastEpisodes(libraryItem, newEpisodes, false) | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user