flip-cohen/albums.go
2022-05-02 16:30:13 +02:00

153 lines
2.5 KiB
Go

package main
import (
"encoding/json"
"fmt"
"io"
"io/ioutil"
"log"
"os"
"path"
"strings"
)
type Song struct {
Title string
Lyrics []string
Path string
NR string
}
type Album struct {
Name string
Release string
Path string
Songs []Song
Links map[string]string
}
const ALBUM_DIR = "./data/albums/"
var albums []*Album
func parseAlbumName(fName string) (string, string) {
s := strings.Split(fName, ".")
s = strings.Split(s[0], "_")
return s[0], strings.Join(s[1:], " ")
}
func ParseSong(s os.FileInfo, basePath string) Song {
nr, title := parseAlbumName(s.Name())
f, err := os.Open(path.Join(basePath, s.Name()))
defer f.Close()
if err != nil {
log.Fatal(err)
}
content, err := ioutil.ReadAll(f)
if err != nil {
log.Fatal(err)
}
lyrics := strings.Split(string(content), "\n\n")
song := Song{
Title: title,
Lyrics: lyrics,
Path: strings.ToLower(strings.Replace(title, " ", "-", -1)),
NR: nr,
}
return song
}
func getSong(album *Album, title string) (Song, error) {
for _, song := range album.Songs {
if song.Path == strings.ToLower(title) {
return song, nil
}
}
return Song{}, io.EOF
}
func ParseAlbum(f os.FileInfo) *Album {
year, name := parseAlbumName(f.Name())
filen := path.Join(ROOT_DIR, ALBUM_DIR, f.Name())
files, err := ioutil.ReadDir(filen)
if err != nil {
fmt.Printf("Error read songs: %s", err)
log.Fatal(err)
}
album := Album{
Name: name,
Path: strings.ToLower(strings.Replace(name, " ", "-", -1)),
Release: year,
}
for _, f := range files {
if !strings.HasSuffix(f.Name(), ".lyric") {
continue
}
album.Songs = append(album.Songs, ParseSong(f, filen))
}
fd, err := os.Open(path.Join(filen, "info.json"))
defer fd.Close()
if err != nil {
fmt.Printf("Error info.json: %s", err)
log.Fatal(err)
}
content, _ := ioutil.ReadAll(fd)
json.Unmarshal(content, &album)
return &album
}
func getAlbum(albums []*Album, title string) (*Album, error) {
for _, album := range albums {
if album.Path == strings.ToLower(title) {
return album, nil
}
}
return nil, io.EOF
}
func getAlbums() []*Album {
if albums != nil {
return albums
}
files, err := ioutil.ReadDir(path.Join(ROOT_DIR, ALBUM_DIR))
if err != nil {
log.Fatal(err)
}
for _, f := range files {
if strings.HasPrefix(f.Name(), ".") {
continue
}
albums = append(albums, ParseAlbum(f))
}
for i := len(albums)/2 - 1; i >= 0; i-- {
opp := len(albums) - 1 - i
albums[i], albums[opp] = albums[opp], albums[i]
}
return albums
}