Web UI: setup wizard, auth pages, library browsing, player, admin, streaming, cover art

This commit is contained in:
2026-08-22 23:42:09 -05:00
parent aa29f13846
commit e0bd8bc3cb
42 changed files with 3012 additions and 8 deletions
+30 -2
View File
@@ -15,9 +15,11 @@ import (
"sync"
"time"
"git.noroutes.net/NoRoutes/vibetunes/internal/coverart"
"git.noroutes.net/NoRoutes/vibetunes/internal/database"
"git.noroutes.net/NoRoutes/vibetunes/internal/library"
"git.noroutes.net/NoRoutes/vibetunes/internal/metadata"
"git.noroutes.net/NoRoutes/vibetunes/internal/streaming"
)
// recognizedExtensions are the file extensions VibeSonic attempts to
@@ -168,9 +170,11 @@ func (s *Scanner) indexOne(ctx context.Context, folderID, absPath, relPath strin
if err != nil {
return false, false, err
}
if _, err := library.IndexFile(s.DB, mf, tags); err != nil {
song, err := library.IndexFile(s.DB, mf, tags)
if err != nil {
return false, false, err
}
s.indexCoverArt(absPath, song, tags)
return false, true, nil
}
if err != database.ErrNotFound {
@@ -195,12 +199,36 @@ func (s *Scanner) indexOne(ctx context.Context, folderID, absPath, relPath strin
if err != nil {
return false, false, err
}
if _, err := library.IndexFile(s.DB, mf, tags); err != nil {
song, err := library.IndexFile(s.DB, mf, tags)
if err != nil {
return false, false, err
}
s.indexCoverArt(absPath, song, tags)
return true, false, nil
}
// indexCoverArt records where an album's cover art can be found: a
// folder image next to the file if one exists, otherwise the file's own
// embedded artwork (extracted lazily by the web layer on request, not
// here). Failures are non-fatal to the scan.
func (s *Scanner) indexCoverArt(absPath string, song *database.Song, tags *metadata.Tags) {
if !song.AlbumID.Valid {
return
}
dir := filepath.Dir(absPath)
if folderImage := coverart.FindFolderImage(dir); folderImage != "" {
hash, err := coverart.ContentHashOf(folderImage)
if err != nil {
return
}
_, _ = database.UpsertAlbumCoverArt(s.DB, song.AlbumID.String, "folder", folderImage, "", streaming.MimeType(folderImage), hash, 0, 0)
return
}
if tags.HasEmbeddedArt {
_, _ = database.UpsertAlbumCoverArt(s.DB, song.AlbumID.String, "embedded", "", song.MediaFileID, "image/jpeg", song.MediaFileID, 0, 0)
}
}
// fingerprint is a cheap, fast rename/change detector based on size and
// mtime rather than hashing file content (which would mean reading every
// byte of every file on every scan).