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