|
- package cdr
-
- import (
- "fmt"
- "log"
- "os"
- "regexp"
- "strings"
- "unicode"
-
- "github.com/dhowden/tag"
- "github.com/rainycape/unidecode"
- )
-
- var trackNameReg = regexp.MustCompile("^([0-9]{2}).+")
-
- func NewTrack(file string) (*Track, error) {
- f, err := os.Open(file)
- if err != nil {
- return nil, fmt.Errorf("error loading file: %v", err)
- }
- defer f.Close()
-
- m, err := tag.ReadFrom(f)
- if err != nil {
- return nil, fmt.Errorf("unable to read file: %v", err)
- }
-
- return &Track{
- Title: m.Title(),
- Artist: m.Artist(),
- Filename: f.Name(),
- }, nil
- }
-
- // RenameTrack takes a filename, opens it, reads the metadata, and returns both
- // the old and new filename.
- func RenameTrack(file string) string {
- t, err := NewTrack(file)
- if err != nil {
- return ""
- }
-
- // Extract playlist track number from filename
- fMatch := trackNameReg.FindStringSubmatch(t.Filename)
- if len(fMatch) < 2 {
- log.Fatal("Unexpect filename format")
- }
- trackNum := fMatch[1]
-
- ext := t.Filename[strings.LastIndex(t.Filename, "."):]
-
- return fmt.Sprintf("%s-%s-%s%s", trackNum, Sanitize(t.Artist), Sanitize(t.Title), ext)
- }
-
- // Sanitize takes a string and removes problematic characters from it.
- func Sanitize(s string) string {
- s = unidecode.Unidecode(s)
- s = strings.Map(func(r rune) rune {
- if r == '(' || r == ')' || r == '[' || r == ']' || r == '.' || r == ',' || r == '\'' || r == '"' || r == ';' {
- return -1
- }
- if unicode.IsSpace(r) {
- return '_'
- }
- return r
- }, s)
- return s
- }
|