125 lines
2.4 KiB
Go
125 lines
2.4 KiB
Go
|
|
package archive
|
||
|
|
|
||
|
|
import (
|
||
|
|
"fmt"
|
||
|
|
"strings"
|
||
|
|
"io/ioutil"
|
||
|
|
"path/filepath"
|
||
|
|
"hash/fnv"
|
||
|
|
"../config"
|
||
|
|
)
|
||
|
|
|
||
|
|
var pln = fmt.Println
|
||
|
|
|
||
|
|
var Archive_map map[uint32]config.Track_t
|
||
|
|
var Archive_map_keys []uint32
|
||
|
|
|
||
|
|
var built = false
|
||
|
|
|
||
|
|
func Build() error {
|
||
|
|
|
||
|
|
if built {
|
||
|
|
return nil
|
||
|
|
}
|
||
|
|
|
||
|
|
Archive_map = make(map[uint32]config.Track_t)
|
||
|
|
|
||
|
|
album_dirs, err := ioutil.ReadDir(config.Xcfg.Archive.PATH)
|
||
|
|
if err != nil {
|
||
|
|
return err
|
||
|
|
}
|
||
|
|
|
||
|
|
for _, dir := range album_dirs {
|
||
|
|
|
||
|
|
album := new(config.Album_t)
|
||
|
|
album.TRACKS = make(map[uint32]config.Track_t)
|
||
|
|
album.PATH = filepath.Join(config.Xcfg.Archive.PATH, dir.Name())
|
||
|
|
album.ID = hash(album.PATH)
|
||
|
|
|
||
|
|
album.MAKER, album.NAME = parse_album_name(dir.Name())
|
||
|
|
|
||
|
|
track_files, _ := filepath.Glob(album.PATH + "/*.mp3")
|
||
|
|
for _, file := range track_files {
|
||
|
|
track := new(config.Track_t)
|
||
|
|
track.NAME = parse_track_name(filepath.Base(file), album.MAKER, album.NAME)
|
||
|
|
track.MAKER = album.MAKER
|
||
|
|
track.ALBUM = album.NAME
|
||
|
|
track.PATH = file
|
||
|
|
track.ID = hash(track.PATH)
|
||
|
|
track.AID = album.ID
|
||
|
|
|
||
|
|
album.TRACKS[track.ID] = *track
|
||
|
|
|
||
|
|
Archive_map[track.ID] = *track
|
||
|
|
Archive_map_keys = append(Archive_map_keys, track.ID)
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
cover, _ := filepath.Glob(album.PATH + "/*.jpg")
|
||
|
|
if len(cover) > 0 {
|
||
|
|
album.COVER = filepath.Join(album.PATH, cover[0])
|
||
|
|
}
|
||
|
|
|
||
|
|
// print_album(album)
|
||
|
|
|
||
|
|
config.Xcfg.Archive.ALBUMS[album.ID] = *album
|
||
|
|
}
|
||
|
|
|
||
|
|
built = true
|
||
|
|
return nil
|
||
|
|
}
|
||
|
|
|
||
|
|
func parse_album_name(name string) (string, string) {
|
||
|
|
chunks := strings.Split(name, " - ")
|
||
|
|
if len(chunks) >= 2 {
|
||
|
|
return chunks[0], chunks[1]
|
||
|
|
}
|
||
|
|
return chunks[0], "n/a"
|
||
|
|
}
|
||
|
|
|
||
|
|
func print_album(a *config.Album_t) {
|
||
|
|
pln(a.MAKER)
|
||
|
|
pln(a.NAME)
|
||
|
|
pln(a.PATH)
|
||
|
|
pln(a.COVER)
|
||
|
|
pln(a.ID)
|
||
|
|
pln(len(a.TRACKS))
|
||
|
|
pln("-----")
|
||
|
|
for _, t := range a.TRACKS {
|
||
|
|
print_track(t)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// ex.: Electronic Works 1958-1995-002-Else Marie Pade-Faust Suite Faust & Mefisto.mp3
|
||
|
|
func parse_track_name(name string, maker string, album string) string {
|
||
|
|
|
||
|
|
chunks := []string{}
|
||
|
|
if strings.HasPrefix(name, album) { // bleep
|
||
|
|
chunks = strings.Split(name, "-" + maker + "-")
|
||
|
|
} else if strings.HasPrefix(name, maker) { // bandcamp
|
||
|
|
chunks = strings.Split(name, " - " + album + " - ")
|
||
|
|
}
|
||
|
|
|
||
|
|
if len(chunks) >= 2 {
|
||
|
|
return strings.Split(chunks[1], ".")[0]
|
||
|
|
}
|
||
|
|
return "n/a"
|
||
|
|
}
|
||
|
|
|
||
|
|
func print_track(t config.Track_t) {
|
||
|
|
|
||
|
|
pln(" " + t.NAME)
|
||
|
|
pln(" " + t.PATH)
|
||
|
|
pln(t.ID)
|
||
|
|
pln(t.AID)
|
||
|
|
pln("////////")
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
func hash(s string) uint32 {
|
||
|
|
h := fnv.New32a()
|
||
|
|
h.Write([]byte(s))
|
||
|
|
return h.Sum32()
|
||
|
|
}
|