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 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())

View file

@ -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()

View file

@ -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)