Web UI: setup wizard, auth pages, library browsing, player, admin, streaming, cover art
This commit is contained in:
@@ -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).
|
||||
|
||||
Reference in New Issue
Block a user