Add setting for max downloaded episodes per podcast

pull/285/head
Jeremy Fisher 2 years ago
parent 44e2b1c207
commit 848b214561

@ -108,6 +108,10 @@
<span class="label-body">Limit the number of podcasts that can be downloaded simultaneously</span>
<input type="number" name="maxDownloadConcurrency" v-model.number="maxDownloadConcurrency" min="1">
</label>
<label for="maxDownloadKeep" style="display: inline-block;" >
<span class="label-body">Limit the number of podcast episodes that are kept (auto deletes older episodes beyond this number)</span>
<input type="number" name="maxDownloadKeep" v-model.number="maxDownloadKeep" min="1">
</label>
<label for="userAgent" style="display: inline-block;" >
<span class="label-body">The <code>User-Agent</code> header used when downloading podcasts</span>
<input type="text" class="u-full-width" name="userAgent" v-model="userAgent">
@ -190,6 +194,7 @@ var app = new Vue({
dontDownloadDeletedFromDisk:self.dontDownloadDeletedFromDisk,
baseUrl:self.baseUrl,
maxDownloadConcurrency:self.maxDownloadConcurrency,
maxDownloadKeep:self.maxDownloadKeep,
userAgent:self.userAgent,
})
.then(function(response){
@ -236,6 +241,7 @@ var app = new Vue({
dontDownloadDeletedFromDisk:{{ .setting.DontDownloadDeletedFromDisk }},
baseUrl: {{ .setting.BaseUrl }},
maxDownloadConcurrency:{{ .setting.MaxDownloadConcurrency }},
maxDownloadKeep:{{ .setting.MaxDownloadKeep }},
userAgent:{{ .setting.UserAgent}},
},

@ -32,6 +32,7 @@ type SettingModel struct {
DontDownloadDeletedFromDisk bool `form:"dontDownloadDeletedFromDisk" json:"dontDownloadDeletedFromDisk" query:"dontDownloadDeletedFromDisk"`
BaseUrl string `form:"baseUrl" json:"baseUrl" query:"baseUrl"`
MaxDownloadConcurrency int `form:"maxDownloadConcurrency" json:"maxDownloadConcurrency" query:"maxDownloadConcurrency"`
MaxDownloadKeep int `form:"maxDownloadKeep" json:"maxDownloadKeep" query:"maxDownloadKeep"`
UserAgent string `form:"userAgent" json:"userAgent" query:"userAgent"`
}

@ -629,7 +629,7 @@ func UpdateSetting(c *gin.Context) {
err = service.UpdateSettings(model.DownloadOnAdd, model.InitialDownloadCount,
model.AutoDownload, model.AppendDateToFileName, model.AppendEpisodeNumberToFileName,
model.DarkMode, model.DownloadEpisodeImages, model.GenerateNFOFile, model.DontDownloadDeletedFromDisk, model.BaseUrl,
model.MaxDownloadConcurrency, model.UserAgent,
model.MaxDownloadConcurrency, model.MaxDownloadKeep, model.UserAgent,
)
if err == nil {
c.JSON(200, gin.H{"message": "Success"})

@ -18,6 +18,10 @@ var migrations = []localMigration{
Name: "2020_11_03_04_42_SetDefaultDownloadStatus",
Query: "update podcast_items set download_status=2 where download_path!='' and download_status=0",
},
{
Name: "2023_10_17_AddMaxDownloadKeepColumn",
Query: "ALTER TABLE settings ADD max_download_keep INT default 5",
},
}
func RunMigrations() {

@ -89,6 +89,7 @@ type Setting struct {
BaseUrl string
MaxDownloadConcurrency int `gorm:"default:5"`
UserAgent string
MaxDownloadKeep int `gorm:"default:5"`
}
type Migration struct {
Base

@ -230,6 +230,7 @@ func intiCron() {
gocron.Every(uint64(checkFrequency) * 2).Minutes().Do(service.UnlockMissedJobs)
gocron.Every(uint64(checkFrequency) * 3).Minutes().Do(service.UpdateAllFileSizes)
gocron.Every(uint64(checkFrequency)).Minutes().Do(service.DownloadMissingImages)
gocron.Every(uint64(checkFrequency)).Minutes().Do(service.ClearEpisodeFiles)
gocron.Every(2).Days().Do(service.CreateBackup)
<-gocron.Start()
}

@ -566,6 +566,35 @@ func CheckMissingFiles() error {
return nil
}
func ClearEpisodeFiles() error {
fmt.Println("Clearning Episode Files")
var podcasts []db.Podcast
err := db.GetAllPodcasts(&podcasts, "")
setting := db.GetOrCreateSetting()
var maxDownloadKeep int = setting.MaxDownloadKeep
if err != nil {
return err
}
for _, pod := range podcasts {
var episodes []db.PodcastItem
err = db.GetAllPodcastItemsByPodcastId(pod.ID, &episodes)
if err != nil {
return err
}
downloadedCount := 0
for _, episode := range episodes {
if (downloadedCount >= maxDownloadKeep && episode.DownloadStatus == 2) {
DeleteEpisodeFile(episode.ID)
}
if (episode.DownloadStatus == 2) {
downloadedCount = downloadedCount + 1
}
}
}
return nil
}
func DeleteEpisodeFile(podcastItemId string) error {
var podcastItem db.PodcastItem
err := db.GetPodcastItemById(podcastItemId, &podcastItem)
@ -764,7 +793,7 @@ func GetSearchFromPodcastIndex(pod *podcastindex.Podcast) *model.CommonSearchRes
func UpdateSettings(downloadOnAdd bool, initialDownloadCount int, autoDownload bool,
appendDateToFileName bool, appendEpisodeNumberToFileName bool, darkMode bool, downloadEpisodeImages bool,
generateNFOFile bool, dontDownloadDeletedFromDisk bool, baseUrl string, maxDownloadConcurrency int, userAgent string) error {
generateNFOFile bool, dontDownloadDeletedFromDisk bool, baseUrl string, maxDownloadConcurrency int, maxDownloadKeep int, userAgent string) error {
setting := db.GetOrCreateSetting()
setting.AutoDownload = autoDownload
@ -778,6 +807,7 @@ func UpdateSettings(downloadOnAdd bool, initialDownloadCount int, autoDownload b
setting.DontDownloadDeletedFromDisk = dontDownloadDeletedFromDisk
setting.BaseUrl = baseUrl
setting.MaxDownloadConcurrency = maxDownloadConcurrency
setting.MaxDownloadKeep = maxDownloadKeep
setting.UserAgent = userAgent
return db.UpdateSettings(setting)

Loading…
Cancel
Save