From 3f892331f699720c657007758dc8275516674fdc Mon Sep 17 00:00:00 2001 From: Jeremy Baxter Date: Mon, 5 Jan 2026 01:04:55 +1300 Subject: [PATCH] musicindex: cache tarballs by default overridable with the -r command line option --- main.go | 6 ++-- musicindex/index.go | 68 +++++++++++++++++++++------------------- musicindex/musicindex.go | 11 ++++--- 3 files changed, 46 insertions(+), 39 deletions(-) diff --git a/main.go b/main.go index 9634176..1a7d925 100644 --- a/main.go +++ b/main.go @@ -16,11 +16,13 @@ const version = "0-pre" var addr *string var port *uint16 +var regenerate *bool var showVersion *bool func main() { addr = getopt.String('a', "0.0.0.0") port = getopt.Uint16('p', 8000) + regenerate = getopt.Bool('r') showVersion = getopt.Bool('V') if err := getopt.Getopt(nil); err != nil { util.Die(err.Error()) @@ -33,7 +35,7 @@ func main() { args := getopt.Args() if len(args) != 1 { - fmt.Fprintf(os.Stderr, "usage: %s [-V] [-a address] [-p port] directory\n", os.Args[0]) + fmt.Fprintf(os.Stderr, "usage: %s [-rV] [-a address] [-p port] directory\n", os.Args[0]) os.Exit(1) } @@ -42,7 +44,7 @@ func main() { log.Printf("This is records %s\n", version) log.Println("https://git.baxters.nz/jeremy/records") - musicindex.Init(mediaDir) + musicindex.Init(mediaDir, *regenerate) var artistCount, albumCount, songCount int artistCount = len(musicindex.Artists()) diff --git a/musicindex/index.go b/musicindex/index.go index 76a983e..3c034c1 100644 --- a/musicindex/index.go +++ b/musicindex/index.go @@ -2,7 +2,6 @@ package musicindex import ( "errors" - "fmt" "io/fs" "log" "os" @@ -58,13 +57,26 @@ func indexArtists() { util.Die("%s", err.Error()) } - err = os.RemoveAll(TempDir) - if err != nil { - util.Die("cannot remove temporary directory %s: %s", TempDir, err.Error()) + if (regenerateTarballs) { + err = os.RemoveAll(TempDir) + if err != nil { + util.Die("cannot remove temporary directory %s: %s", TempDir, err.Error()) + } } - err = os.Mkdir(TempDir, 0711) + + f, err := os.Stat(TempDir) if err != nil { - util.Die("cannot make temporary directory %s: %s", TempDir, err.Error()) + err = os.Mkdir(TempDir, 0711) + if err != nil { + util.Die("cannot make temporary directory %s: %s", TempDir, + err.Error()) + } + log.Println("generating new tarball index") + } else { + if !f.IsDir() { + util.Die("cannot make temporary directory %s: %s", TempDir, + "not a directory") + } } artists = make(map[string]Artist) @@ -148,42 +160,32 @@ func indexAlbum(artist *Artist, albumName, albumDir string) (a Album, err error) slices.Sort(tracks) a.TrackFiles = tracks + generate := false hash := util.HashOf(a.Artist.Name + "::" + a.Name) - path := TempDir + "/" + hash + a.Tarball = TempDir + "/" + hash - if _, err = os.Stat(path); errors.Is(err, os.ErrNotExist) { - a.Tarball = path - } else if err == nil { - a.Tarball = "" - for i := range 9 { - if _, err = os.Stat(fmt.Sprintf("%s.%d", path, i)); err == nil { - continue - } else if errors.Is(err, os.ErrNotExist) { - a.Tarball = path - } else { - err = errors.New("cannot create tarball in filesystem: " + - err.Error()) - return - } + if _, err = os.Stat(a.Tarball); errors.Is(err, os.ErrNotExist) { + // if the file isn't there we definitely want to generate one + generate = true + } else { // if the file exists or if it's some other error + if regenerateTarballs { + // not sure why this is here since we deleted the whole + // directory beforehand but let's try overwrite it anyway + generate = true } - if len(a.Tarball) == 0 { - err = errors.New("cannot create tarball in filesystem; " + - "please clean out " + TempDir) - return - } - } else { - err = errors.New("cannot create tarball in filesystem: " + err.Error()) - return } - a.Tarball = path - err = targz.Compress(a.Directory(), a.Tarball) - if err != nil { - return + if generate { + err = targz.Compress(a.Directory(), a.Tarball) + if err != nil { + a.Tarball = "" + return + } } tarball, err := os.Stat(a.Tarball) if err != nil { + a.Tarball = "" return } a.TarballSize = tarball.Size() diff --git a/musicindex/musicindex.go b/musicindex/musicindex.go index c29406c..b70b0d3 100644 --- a/musicindex/musicindex.go +++ b/musicindex/musicindex.go @@ -34,20 +34,23 @@ var artists map[string]Artist var coverFileExtension string var defaultCoverFile string var mediaDir string +var regenerateTarballs bool var trackFileExtension string -func Init(path string) { - InitWith(path, ".flac", "cover.jpg", ".jpg") +func Init(path string, regenerate bool) { + InitWith(path, regenerate, ".flac", "cover.jpg", ".jpg") } -func InitWith(path, mediaExtension, coverFile, coverExtension string) { +func InitWith(path string, regenerate bool, + mediaExtension, coverFile, coverExtension string) { if initialised { return } mediaDir = path - trackFileExtension = mediaExtension defaultCoverFile = coverFile + regenerateTarballs = regenerate + trackFileExtension = mediaExtension coverFileExtension = coverExtension assertAccessTo(mediaDir)