Files
seanime-docker/seanime-2.9.10/internal/database/db/chapter_downloader_queue.go
2025-09-20 14:08:38 +01:00

136 lines
4.0 KiB
Go

package db
import (
"errors"
"gorm.io/gorm"
"seanime/internal/database/models"
)
func (db *Database) GetChapterDownloadQueue() ([]*models.ChapterDownloadQueueItem, error) {
var res []*models.ChapterDownloadQueueItem
err := db.gormdb.Find(&res).Error
if err != nil {
db.Logger.Error().Err(err).Msg("db: Failed to get chapter download queue")
return nil, err
}
return res, nil
}
func (db *Database) GetNextChapterDownloadQueueItem() (*models.ChapterDownloadQueueItem, error) {
var res models.ChapterDownloadQueueItem
err := db.gormdb.Where("status = ?", "not_started").First(&res).Error
if err != nil {
if !errors.Is(err, gorm.ErrRecordNotFound) {
db.Logger.Error().Err(err).Msg("db: Failed to get next chapter download queue item")
}
return nil, nil
}
return &res, nil
}
func (db *Database) DequeueChapterDownloadQueueItem() (*models.ChapterDownloadQueueItem, error) {
// Pop the first item from the queue
var res models.ChapterDownloadQueueItem
err := db.gormdb.Where("status = ?", "downloading").First(&res).Error
if err != nil {
return nil, err
}
err = db.gormdb.Delete(&res).Error
if err != nil {
db.Logger.Error().Err(err).Msg("db: Failed to delete chapter download queue item")
return nil, err
}
return &res, nil
}
func (db *Database) InsertChapterDownloadQueueItem(item *models.ChapterDownloadQueueItem) error {
// Check if the item already exists
var existingItem models.ChapterDownloadQueueItem
err := db.gormdb.Where("provider = ? AND media_id = ? AND chapter_id = ?", item.Provider, item.MediaID, item.ChapterID).First(&existingItem).Error
if err == nil {
db.Logger.Debug().Msg("db: Chapter download queue item already exists")
return errors.New("chapter is already in the download queue")
}
if item.ChapterID == "" {
return errors.New("chapter ID is empty")
}
if item.Provider == "" {
return errors.New("provider is empty")
}
if item.MediaID == 0 {
return errors.New("media ID is empty")
}
if item.ChapterNumber == "" {
return errors.New("chapter number is empty")
}
err = db.gormdb.Create(item).Error
if err != nil {
db.Logger.Error().Err(err).Msg("db: Failed to insert chapter download queue item")
return err
}
return nil
}
func (db *Database) UpdateChapterDownloadQueueItemStatus(provider string, mId int, chapterId string, status string) error {
err := db.gormdb.Model(&models.ChapterDownloadQueueItem{}).
Where("provider = ? AND media_id = ? AND chapter_id = ?", provider, mId, chapterId).
Update("status", status).Error
if err != nil {
db.Logger.Error().Err(err).Msg("db: Failed to update chapter download queue item status")
return err
}
return nil
}
func (db *Database) GetMediaQueuedChapters(mediaId int) ([]*models.ChapterDownloadQueueItem, error) {
var res []*models.ChapterDownloadQueueItem
err := db.gormdb.Where("media_id = ?", mediaId).Find(&res).Error
if err != nil {
db.Logger.Error().Err(err).Msg("db: Failed to get media queued chapters")
return nil, err
}
return res, nil
}
func (db *Database) ClearAllChapterDownloadQueueItems() error {
err := db.gormdb.
Where("status = ? OR status = ? OR status = ?", "not_started", "downloading", "errored").
Delete(&models.ChapterDownloadQueueItem{}).
Error
if err != nil {
db.Logger.Error().Err(err).Msg("db: Failed to clear all chapter download queue items")
return err
}
return nil
}
func (db *Database) ResetErroredChapterDownloadQueueItems() error {
err := db.gormdb.Model(&models.ChapterDownloadQueueItem{}).
Where("status = ?", "errored").
Update("status", "not_started").Error
if err != nil {
db.Logger.Error().Err(err).Msg("db: Failed to reset errored chapter download queue items")
return err
}
return nil
}
func (db *Database) ResetDownloadingChapterDownloadQueueItems() error {
err := db.gormdb.Model(&models.ChapterDownloadQueueItem{}).
Where("status = ?", "downloading").
Update("status", "not_started").Error
if err != nil {
db.Logger.Error().Err(err).Msg("db: Failed to reset downloading chapter download queue items")
return err
}
return nil
}