initial commit
This commit is contained in:
commit
32a57cc050
12 changed files with 1169 additions and 0 deletions
118
musicindex/musicindex.go
Normal file
118
musicindex/musicindex.go
Normal file
|
|
@ -0,0 +1,118 @@
|
|||
// musicindex.go
|
||||
// Copyright (c) 2025 Jeremy Baxter.
|
||||
|
||||
// Ephemeral music (artist, album, cover & track) index
|
||||
|
||||
package musicindex
|
||||
|
||||
import (
|
||||
"cmp"
|
||||
"slices"
|
||||
|
||||
"git.baxters.nz/jeremy/records/util"
|
||||
)
|
||||
|
||||
type Artist struct {
|
||||
Name string
|
||||
Albums map[string]Album
|
||||
Songs int
|
||||
Valid bool
|
||||
}
|
||||
|
||||
type Album struct {
|
||||
Artist *Artist
|
||||
Name string
|
||||
HasCover bool
|
||||
CoverFile string
|
||||
TrackFiles []string
|
||||
Tarball string
|
||||
TarballSize int64
|
||||
}
|
||||
|
||||
var initialised = false
|
||||
var artists map[string]Artist
|
||||
var coverFileExtension string
|
||||
var defaultCoverFile string
|
||||
var mediaDir string
|
||||
var trackFileExtension string
|
||||
|
||||
func Init(path string) {
|
||||
InitWith(path, ".flac", "cover.jpg", ".jpg")
|
||||
}
|
||||
|
||||
func InitWith(path, mediaExtension, coverFile, coverExtension string) {
|
||||
if initialised {
|
||||
return
|
||||
}
|
||||
|
||||
mediaDir = path
|
||||
trackFileExtension = mediaExtension
|
||||
defaultCoverFile = coverFile
|
||||
coverFileExtension = coverExtension
|
||||
|
||||
assertAccessTo(mediaDir)
|
||||
indexArtists()
|
||||
initialised = true
|
||||
}
|
||||
|
||||
func MediaDirectory() string {
|
||||
return mediaDir
|
||||
}
|
||||
|
||||
func Artists() (l []string) {
|
||||
for k, v := range artists {
|
||||
util.Assert(k == v.Name)
|
||||
l = append(l, k)
|
||||
}
|
||||
|
||||
slices.Sort(l)
|
||||
return
|
||||
}
|
||||
|
||||
func ArtistExists(name string) bool {
|
||||
_, ok := artists[name]
|
||||
return ok
|
||||
}
|
||||
|
||||
func FindArtist(name string) (a Artist) {
|
||||
if ArtistExists(name) {
|
||||
return artists[name]
|
||||
}
|
||||
|
||||
a.Name = "Invalid artist"
|
||||
a.Valid = false
|
||||
return
|
||||
}
|
||||
|
||||
func ArtistDirectory(name string) string {
|
||||
return mediaDir + "/" + name
|
||||
}
|
||||
|
||||
func (a Album) RelativeDirectory() string {
|
||||
return a.Artist.Name + "/" + a.Name
|
||||
}
|
||||
|
||||
func (a Album) Directory() string {
|
||||
return mediaDir + "/" + a.RelativeDirectory()
|
||||
}
|
||||
|
||||
func (a Album) RelativeCoverPath() string {
|
||||
return a.RelativeDirectory() + "/" + a.CoverFile
|
||||
}
|
||||
|
||||
func (a Album) CoverPath() string {
|
||||
return mediaDir + "/" + a.RelativeCoverPath()
|
||||
}
|
||||
|
||||
func Albums() (albums []Album) {
|
||||
for _, artist := range Artists() {
|
||||
for _, album := range FindArtist(artist).Albums {
|
||||
albums = append(albums, album)
|
||||
}
|
||||
}
|
||||
|
||||
slices.SortFunc(albums, func(a, b Album) int {
|
||||
return cmp.Compare(a.Name, b.Name)
|
||||
})
|
||||
return
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue