1
0
Fork 0

Store path and check update time to speed up start.

master
Icedream 2021-02-28 21:06:40 +01:00
parent e2e7dae7c3
commit b041fcca48
Signed by: icedream
GPG Key ID: 1573F6D8EFE4D0CF
1 changed files with 35 additions and 8 deletions

View File

@ -51,6 +51,7 @@ type track struct {
Publisher string
CoverFile *file `gorm:"ForeignKey:CoverFileID;"`
CoverFileID *uint
Path string `gorm:"index:idx_path"`
}
type file struct {
@ -117,7 +118,12 @@ func getPublisherFromTags(tags tag.Metadata) string {
return ""
}
func (m *manager) UpdateFileFromFilesystem(f *os.File) (err error) {
func (m *manager) UpdateFileFromFilesystem(filePath string) (err error) {
f, err := os.Open(filePath)
if err == nil {
return
}
tags, err := tag.ReadFrom(f)
if err != nil {
return
@ -133,6 +139,7 @@ func (m *manager) UpdateFileFromFilesystem(f *os.File) (err error) {
trackObj.Artist = tags.Artist()
trackObj.Title = tags.Title()
trackObj.Path = filePath
// Cover
if tags.Picture() != nil {
@ -172,6 +179,19 @@ func (m *manager) WriteTrack(track *track) (err error) {
return
}
func (m *manager) GetTrackByPath(path string, withCoverFile bool) (result *track, err error) {
result = new(track)
db := m.database
if withCoverFile {
db = db.Preload("CoverFile")
}
err = db.
Where("path = @path",
sql.Named("path", path)).
Find(result).Error
return
}
func (m *manager) GetTrackByArtistAndTitle(artist, title string, withCoverFile bool) (result *track, err error) {
result = new(track)
db := m.database
@ -352,10 +372,7 @@ func main() {
// log.Println("event:", event)
if event.Op&fsnotify.Write == fsnotify.Write {
log.Println("modified file:", event.Name)
f, err := os.Open(event.Name)
if err == nil {
err = m.UpdateFileFromFilesystem(f)
}
err = m.UpdateFileFromFilesystem(event.Name)
if err != nil {
log.Printf("Failed to update tags from file system for %s: %s", event.Name, err)
}
@ -406,11 +423,21 @@ func main() {
switch strings.ToLower(filepath.Ext(filePath)) {
case ".ogg", ".mp3", ".m4a", ".aac", ".flac", ".wav", ".wma", ".wv":
log.Println("scanning:", filePath)
f, err := os.Open(filePath)
// check if we already have an entry in the database that is up to date
entry, err := m.GetTrackByPath(filePath, false)
if err == nil {
err = m.UpdateFileFromFilesystem(f)
stat, err := d.Info()
if err == nil {
// entry.UpdatedAt same or newer than file mod time, skip
if entry.UpdatedAt.Sub(stat.ModTime()) >= 0 {
log.Println("skipping:", filePath)
return nil
}
}
}
log.Println("updating:", filePath)
err = m.UpdateFileFromFilesystem(filePath)
if err != nil {
log.Printf("Failed to update tags from file system for %s: %s", filePath, err)
}