This commit is contained in:
truewhile
2026-09-14 12:33:59 +08:00
parent fd54d42db7
commit 5c85478883
23 changed files with 492 additions and 103 deletions
+49
View File
@@ -43,6 +43,7 @@ type MediaQueryFilter struct {
IncludeNSFW bool
AllowedLibraryIDs []string
HiddenLibraryIDs []string
SeriesID string
}
func applyMediaQueryFilter(q *gorm.DB, filter MediaQueryFilter) *gorm.DB {
@@ -55,6 +56,9 @@ func applyMediaQueryFilter(q *gorm.DB, filter MediaQueryFilter) *gorm.DB {
if len(filter.AllowedLibraryIDs) > 0 {
q = q.Where("library_id IN ?", filter.AllowedLibraryIDs)
}
if seriesID := strings.TrimSpace(filter.SeriesID); seriesID != "" {
q = q.Where("series_id = ?", seriesID)
}
return q
}
@@ -120,6 +124,47 @@ func (r *MediaRepository) ListAllByLibrariesFilteredNoCount(ctx context.Context,
return items, err
}
// ListVersionCandidates loads a bounded candidate set for version grouping
// using the strongest identity stored on the row. Returning ok=false keeps the
// caller's full-library fallback for rows without external IDs or SeriesID.
func (r *MediaRepository) ListVersionCandidates(ctx context.Context, libraryIDs []string, media model.Media, limit int) ([]model.Media, bool, error) {
items := make([]model.Media, 0)
if len(libraryIDs) == 0 {
return items, false, nil
}
if limit <= 0 {
limit = 5000
}
q := r.db.WithContext(ctx).Model(&model.Media{})
if len(libraryIDs) == 1 {
q = q.Where("library_id = ?", libraryIDs[0])
} else {
q = q.Where("library_id IN ?", libraryIDs)
}
found := true
switch {
case strings.TrimSpace(media.SeriesID) != "":
q = q.Where("series_id = ?", strings.TrimSpace(media.SeriesID))
case media.TMDbID > 0:
q = q.Where("tm_db_id = ?", media.TMDbID)
case media.BangumiID > 0:
q = q.Where("bangumi_id = ?", media.BangumiID)
case strings.TrimSpace(media.DoubanID) != "":
q = q.Where("douban_id = ?", strings.TrimSpace(media.DoubanID))
case strings.TrimSpace(media.TheTVDBID) != "":
q = q.Where("thetvdb_id = ?", strings.TrimSpace(media.TheTVDBID))
default:
found = false
}
if !found {
return items, false, nil
}
err := q.Order("release_date DESC, year DESC, updated_at DESC, created_at DESC, id DESC").
Limit(limit).
Find(&items).Error
return items, true, err
}
func (r *MediaRepository) listByLibrariesFiltered(ctx context.Context, libraryIDs []string, offset, limit int, filter MediaQueryFilter, withCount bool) ([]model.Media, int64, error) {
var items []model.Media
var total int64
@@ -216,6 +261,10 @@ func mediaQueryFilterSQL(filter MediaQueryFilter) (string, []interface{}) {
parts = append(parts, "library_id IN ?")
args = append(args, filter.AllowedLibraryIDs)
}
if seriesID := strings.TrimSpace(filter.SeriesID); seriesID != "" {
parts = append(parts, "series_id = ?")
args = append(args, seriesID)
}
return strings.Join(parts, " AND "), args
}
@@ -146,6 +146,9 @@ func applyQualifiedMediaQueryFilter(q *gorm.DB, filter MediaQueryFilter) *gorm.D
if len(filter.AllowedLibraryIDs) > 0 {
q = q.Where("media.library_id IN ?", filter.AllowedLibraryIDs)
}
if seriesID := strings.TrimSpace(filter.SeriesID); seriesID != "" {
q = q.Where("media.series_id = ?", seriesID)
}
return q
}