Compare commits

...

2 commits

Author SHA1 Message Date
3f892331f6 musicindex: cache tarballs by default
overridable with the -r command line option
2026-01-05 01:04:55 +13:00
a392a5fc4c add .gitignore 2026-01-05 01:04:10 +13:00
4 changed files with 47 additions and 39 deletions

1
.gitignore vendored Normal file
View file

@ -0,0 +1 @@
records

View file

@ -16,11 +16,13 @@ const version = "0-pre"
var addr *string var addr *string
var port *uint16 var port *uint16
var regenerate *bool
var showVersion *bool var showVersion *bool
func main() { func main() {
addr = getopt.String('a', "0.0.0.0") addr = getopt.String('a', "0.0.0.0")
port = getopt.Uint16('p', 8000) port = getopt.Uint16('p', 8000)
regenerate = getopt.Bool('r')
showVersion = getopt.Bool('V') showVersion = getopt.Bool('V')
if err := getopt.Getopt(nil); err != nil { if err := getopt.Getopt(nil); err != nil {
util.Die(err.Error()) util.Die(err.Error())
@ -33,7 +35,7 @@ func main() {
args := getopt.Args() args := getopt.Args()
if len(args) != 1 { 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) os.Exit(1)
} }
@ -42,7 +44,7 @@ func main() {
log.Printf("This is records %s\n", version) log.Printf("This is records %s\n", version)
log.Println("https://git.baxters.nz/jeremy/records") log.Println("https://git.baxters.nz/jeremy/records")
musicindex.Init(mediaDir) musicindex.Init(mediaDir, *regenerate)
var artistCount, albumCount, songCount int var artistCount, albumCount, songCount int
artistCount = len(musicindex.Artists()) artistCount = len(musicindex.Artists())

View file

@ -2,7 +2,6 @@ package musicindex
import ( import (
"errors" "errors"
"fmt"
"io/fs" "io/fs"
"log" "log"
"os" "os"
@ -58,13 +57,26 @@ func indexArtists() {
util.Die("%s", err.Error()) util.Die("%s", err.Error())
} }
if (regenerateTarballs) {
err = os.RemoveAll(TempDir) err = os.RemoveAll(TempDir)
if err != nil { if err != nil {
util.Die("cannot remove temporary directory %s: %s", TempDir, err.Error()) util.Die("cannot remove temporary directory %s: %s", TempDir, err.Error())
} }
}
f, err := os.Stat(TempDir)
if err != nil {
err = os.Mkdir(TempDir, 0711) err = os.Mkdir(TempDir, 0711)
if err != nil { if err != nil {
util.Die("cannot make temporary directory %s: %s", TempDir, err.Error()) 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) artists = make(map[string]Artist)
@ -148,42 +160,32 @@ func indexAlbum(artist *Artist, albumName, albumDir string) (a Album, err error)
slices.Sort(tracks) slices.Sort(tracks)
a.TrackFiles = tracks a.TrackFiles = tracks
generate := false
hash := util.HashOf(a.Artist.Name + "::" + a.Name) 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) { if _, err = os.Stat(a.Tarball); errors.Is(err, os.ErrNotExist) {
a.Tarball = path // if the file isn't there we definitely want to generate one
} else if err == nil { generate = true
a.Tarball = "" } else { // if the file exists or if it's some other error
for i := range 9 { if regenerateTarballs {
if _, err = os.Stat(fmt.Sprintf("%s.%d", path, i)); err == nil { // not sure why this is here since we deleted the whole
continue // directory beforehand but let's try overwrite it anyway
} else if errors.Is(err, os.ErrNotExist) { generate = true
a.Tarball = path
} else {
err = errors.New("cannot create tarball in filesystem: " +
err.Error())
return
} }
} }
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 if generate {
err = targz.Compress(a.Directory(), a.Tarball) err = targz.Compress(a.Directory(), a.Tarball)
if err != nil { if err != nil {
a.Tarball = ""
return return
} }
}
tarball, err := os.Stat(a.Tarball) tarball, err := os.Stat(a.Tarball)
if err != nil { if err != nil {
a.Tarball = ""
return return
} }
a.TarballSize = tarball.Size() a.TarballSize = tarball.Size()

View file

@ -34,20 +34,23 @@ var artists map[string]Artist
var coverFileExtension string var coverFileExtension string
var defaultCoverFile string var defaultCoverFile string
var mediaDir string var mediaDir string
var regenerateTarballs bool
var trackFileExtension string var trackFileExtension string
func Init(path string) { func Init(path string, regenerate bool) {
InitWith(path, ".flac", "cover.jpg", ".jpg") 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 { if initialised {
return return
} }
mediaDir = path mediaDir = path
trackFileExtension = mediaExtension
defaultCoverFile = coverFile defaultCoverFile = coverFile
regenerateTarballs = regenerate
trackFileExtension = mediaExtension
coverFileExtension = coverExtension coverFileExtension = coverExtension
assertAccessTo(mediaDir) assertAccessTo(mediaDir)