Remove old refresh code
This commit is contained in:
@@ -3,18 +3,12 @@ package persistence
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"sort"
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
. "github.com/Masterminds/squirrel"
|
||||
"github.com/beego/beego/v2/client/orm"
|
||||
"github.com/deluan/rest"
|
||||
"github.com/navidrome/navidrome/conf"
|
||||
"github.com/navidrome/navidrome/consts"
|
||||
"github.com/navidrome/navidrome/log"
|
||||
"github.com/navidrome/navidrome/model"
|
||||
"github.com/navidrome/navidrome/utils"
|
||||
@@ -151,7 +145,7 @@ func (r *albumRepository) GetAllWithoutGenres(options ...model.QueryOptions) (mo
|
||||
func (r *albumRepository) Refresh(ids ...string) error {
|
||||
chunks := utils.BreakUpStringSlice(ids, 100)
|
||||
for _, chunk := range chunks {
|
||||
err := r.refresh2(chunk...)
|
||||
err := r.refresh(chunk...)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -159,7 +153,7 @@ func (r *albumRepository) Refresh(ids ...string) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (r *albumRepository) refresh2(ids ...string) error {
|
||||
func (r *albumRepository) refresh(ids ...string) error {
|
||||
mfRepo := NewMediaFileRepository(r.ctx, r.ormer)
|
||||
mfs, err := mfRepo.GetAll(model.QueryOptions{Filters: Eq{"album_id": ids}})
|
||||
if err != nil {
|
||||
@@ -176,199 +170,10 @@ func (r *albumRepository) refresh2(ids ...string) error {
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
type refreshAlbum struct {
|
||||
model.Album
|
||||
CurrentId string
|
||||
SongArtists string
|
||||
SongArtistIds string
|
||||
AlbumArtistIds string
|
||||
GenreIds string
|
||||
Years string
|
||||
DiscSubtitles string
|
||||
Comments string
|
||||
Path string
|
||||
MaxUpdatedAt string
|
||||
MaxCreatedAt string
|
||||
}
|
||||
|
||||
func (r *albumRepository) refresh(ids ...string) error {
|
||||
stringListIds := "('" + strings.Join(ids, "','") + "')"
|
||||
var albums []refreshAlbum
|
||||
sel := Select(`f.album_id as id, f.album as name, f.artist, f.album_artist, f.artist_id, f.album_artist_id,
|
||||
f.sort_album_name, f.sort_artist_name, f.sort_album_artist_name, f.order_album_name, f.order_album_artist_name,
|
||||
f.path, f.mbz_album_artist_id, f.mbz_album_type, f.mbz_album_comment, f.catalog_num, f.compilation, f.genre,
|
||||
count(f.id) as song_count,
|
||||
sum(f.duration) as duration,
|
||||
sum(f.size) as size,
|
||||
max(f.year) as max_year,
|
||||
max(f.updated_at) as max_updated_at,
|
||||
max(f.created_at) as max_created_at,
|
||||
a.id as current_id,
|
||||
group_concat(f.comment, "`+consts.Zwsp+`") as comments,
|
||||
group_concat(f.mbz_album_id, ' ') as mbz_album_id,
|
||||
group_concat(f.disc_subtitle, ' ') as disc_subtitles,
|
||||
group_concat(f.artist, ' ') as song_artists,
|
||||
group_concat(f.artist_id, ' ') as song_artist_ids,
|
||||
group_concat(f.album_artist_id, ' ') as album_artist_ids,
|
||||
group_concat(f.year, ' ') as years`,
|
||||
"cf.cover_art_id", "cf.cover_art_path",
|
||||
"mfg.genre_ids").
|
||||
From("media_file f").
|
||||
LeftJoin("album a on f.album_id = a.id").
|
||||
LeftJoin(`(select album_id, id as cover_art_id, path as cover_art_path from media_file
|
||||
where has_cover_art = true and album_id in ` + stringListIds + ` group by album_id) cf
|
||||
on cf.album_id = f.album_id`).
|
||||
LeftJoin(`(select mf.album_id, group_concat(genre_id, ' ') as genre_ids from media_file_genres
|
||||
left join media_file mf on mf.id = media_file_id where mf.album_id in ` +
|
||||
stringListIds + ` group by mf.album_id) mfg on mfg.album_id = f.album_id`).
|
||||
Where(Eq{"f.album_id": ids}).GroupBy("f.album_id")
|
||||
err := r.queryAll(sel, &albums)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
toInsert := 0
|
||||
toUpdate := 0
|
||||
for _, al := range albums {
|
||||
if al.CoverArtPath == "" || !strings.HasPrefix(conf.Server.CoverArtPriority, "embedded") {
|
||||
if path := getCoverFromPath(al.Path, al.CoverArtPath); path != "" {
|
||||
al.CoverArtId = "al-" + al.ID
|
||||
al.CoverArtPath = path
|
||||
}
|
||||
}
|
||||
|
||||
if al.CoverArtId != "" {
|
||||
log.Trace(r.ctx, "Found album art", "id", al.ID, "name", al.Name, "coverArtPath", al.CoverArtPath, "coverArtId", al.CoverArtId)
|
||||
} else {
|
||||
log.Trace(r.ctx, "Could not find album art", "id", al.ID, "name", al.Name)
|
||||
}
|
||||
|
||||
// Somehow, beego cannot parse the datetimes for the query above
|
||||
if al.UpdatedAt, err = time.Parse(time.RFC3339Nano, al.MaxUpdatedAt); err != nil {
|
||||
al.UpdatedAt = time.Now()
|
||||
}
|
||||
if al.CreatedAt, err = time.Parse(time.RFC3339Nano, al.MaxCreatedAt); err != nil {
|
||||
al.CreatedAt = al.UpdatedAt
|
||||
}
|
||||
|
||||
al.AlbumArtistID, al.AlbumArtist = getAlbumArtist(al)
|
||||
al.MinYear = getMinYear(al.Years)
|
||||
al.MbzAlbumID = getMostFrequentMbzID(r.ctx, al.MbzAlbumID, r.tableName, al.Name)
|
||||
al.Comment = getComment(al.Comments, consts.Zwsp)
|
||||
if al.CurrentId != "" {
|
||||
toUpdate++
|
||||
} else {
|
||||
toInsert++
|
||||
}
|
||||
al.AllArtistIDs = utils.SanitizeStrings(al.SongArtistIds, al.AlbumArtistID, al.ArtistID)
|
||||
al.FullText = getFullText(al.Name, al.Artist, al.AlbumArtist, al.SongArtists,
|
||||
al.SortAlbumName, al.SortArtistName, al.SortAlbumArtistName, al.DiscSubtitles)
|
||||
al.Genres = getGenres(al.GenreIds)
|
||||
err := r.Put(&al.Album)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
if toInsert > 0 {
|
||||
log.Debug(r.ctx, "Inserted new albums", "totalInserted", toInsert)
|
||||
}
|
||||
if toUpdate > 0 {
|
||||
log.Debug(r.ctx, "Updated albums", "totalUpdated", toUpdate)
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
func getAlbumArtist(al refreshAlbum) (id, name string) {
|
||||
if !al.Compilation {
|
||||
if al.AlbumArtist != "" {
|
||||
return al.AlbumArtistID, al.AlbumArtist
|
||||
}
|
||||
return al.ArtistID, al.Artist
|
||||
}
|
||||
|
||||
ids := strings.Split(al.AlbumArtistIds, " ")
|
||||
allSame := true
|
||||
previous := al.AlbumArtistID
|
||||
for _, id := range ids {
|
||||
if id == previous {
|
||||
continue
|
||||
}
|
||||
allSame = false
|
||||
break
|
||||
}
|
||||
if allSame {
|
||||
return al.AlbumArtistID, al.AlbumArtist
|
||||
}
|
||||
return consts.VariousArtistsID, consts.VariousArtists
|
||||
}
|
||||
|
||||
func getComment(comments string, separator string) string {
|
||||
cs := strings.Split(comments, separator)
|
||||
if len(cs) == 0 {
|
||||
return ""
|
||||
}
|
||||
first := cs[0]
|
||||
for _, c := range cs[1:] {
|
||||
if first != c {
|
||||
return ""
|
||||
}
|
||||
}
|
||||
return first
|
||||
}
|
||||
|
||||
func getMinYear(years string) int {
|
||||
ys := strings.Fields(years)
|
||||
sort.Strings(ys)
|
||||
for _, y := range ys {
|
||||
if y != "0" {
|
||||
r, _ := strconv.Atoi(y)
|
||||
return r
|
||||
}
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
// GetCoverFromPath accepts a path to a file, and returns a path to an eligible cover image from the
|
||||
// file's directory (as configured with CoverArtPriority). If no cover file is found, among
|
||||
// available choices, or an error occurs, an empty string is returned. If HasEmbeddedCover is true,
|
||||
// and 'embedded' is matched among eligible choices, GetCoverFromPath will return early with an
|
||||
// empty path.
|
||||
func getCoverFromPath(mediaPath string, embeddedPath string) string {
|
||||
n, err := os.Open(filepath.Dir(mediaPath))
|
||||
if err != nil {
|
||||
return ""
|
||||
}
|
||||
|
||||
defer n.Close()
|
||||
names, err := n.Readdirnames(-1)
|
||||
if err != nil {
|
||||
return ""
|
||||
}
|
||||
|
||||
for _, p := range strings.Split(conf.Server.CoverArtPriority, ",") {
|
||||
pat := strings.ToLower(strings.TrimSpace(p))
|
||||
if pat == "embedded" {
|
||||
if embeddedPath != "" {
|
||||
return ""
|
||||
}
|
||||
continue
|
||||
}
|
||||
|
||||
for _, name := range names {
|
||||
match, _ := filepath.Match(pat, strings.ToLower(name))
|
||||
if match && utils.IsImageFile(name) {
|
||||
return filepath.Join(filepath.Dir(mediaPath), name)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return ""
|
||||
}
|
||||
|
||||
func (r *albumRepository) purgeEmpty() error {
|
||||
del := Delete(r.tableName).Where("id not in (select distinct(album_id) from media_file)")
|
||||
c, err := r.executeSQL(del)
|
||||
|
||||
Reference in New Issue
Block a user