Static site generator for making web mixtapes in 2020.
Non puoi selezionare più di 25 argomenti Gli argomenti devono iniziare con una lettera o un numero, possono includere trattini ('-') e possono essere lunghi fino a 35 caratteri.

68 righe
1.3 KiB

  1. package cdr
  2. import (
  3. "fmt"
  4. "log"
  5. "os"
  6. "regexp"
  7. "strings"
  8. "unicode"
  9. "github.com/dhowden/tag"
  10. )
  11. var trackNameReg = regexp.MustCompile("^([0-9]{2}).+")
  12. func NewTrack(file string) (*Track, error) {
  13. f, err := os.Open(file)
  14. if err != nil {
  15. return nil, fmt.Errorf("error loading file: %v", err)
  16. }
  17. defer f.Close()
  18. m, err := tag.ReadFrom(f)
  19. if err != nil {
  20. return nil, fmt.Errorf("unable to read file: %v", err)
  21. }
  22. return &Track{
  23. Title: m.Title(),
  24. Artist: m.Artist(),
  25. Filename: f.Name(),
  26. }
  27. }
  28. // RenameTrack takes a filename, opens it, reads the metadata, and returns both
  29. // the old and new filename.
  30. func RenameTrack(file string) string {
  31. t, err := NewTrack(file)
  32. if err != nil {
  33. return ""
  34. }
  35. // Extract playlist track number from filename
  36. fMatch := trackNameReg.FindStringSubmatch(t.Filename)
  37. if len(fMatch) < 2 {
  38. log.Fatal("Unexpect filename format")
  39. }
  40. trackNum := fMatch[1]
  41. ext := t.Filename[strings.LastIndex(t.Filename, "."):]
  42. return fmt.Sprintf("%s-%s-%s%s", trackNum, Sanitize(t.Artist), Sanitize(t.Title), ext)
  43. }
  44. // Sanitize takes a string and removes problematic characters from it.
  45. func Sanitize(s string) string {
  46. s = strings.Map(func(r rune) rune {
  47. if r == '(' || r == ')' || r == '[' || r == ']' || r == '.' {
  48. return -1
  49. }
  50. if unicode.IsSpace(r) {
  51. return '_'
  52. }
  53. return r
  54. }, s)
  55. return s
  56. }