/
music_folder_rename.go
141 lines (106 loc) · 2.53 KB
/
music_folder_rename.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
package music_folder_rename
import (
"fmt"
"flag"
"os"
"log"
"errors"
"strconv"
"path/filepath"
tag "github.com/dhowden/tag"
color "github.com/fatih/color"
)
// Open a folder
func openFolder (folder string) *os.File {
d, err := os.Open(folder)
if err != nil {
fmt.Println(err)
os.Exit(1)
}
return d
}
// Get the folder files
func getFolderFiles (d *os.File) []os.FileInfo {
files, err := d.Readdir(-1)
if err != nil {
fmt.Println(err)
os.Exit(1)
}
return files
}
// Test if the current file is a MP3
func isMP3File (file os.FileInfo) bool {
return file.Mode().IsRegular() && filepath.Ext(file.Name()) == ".mp3"
}
// Open a file
func openFile (folder string, file os.FileInfo) *os.File {
f, err := os.Open(folder + "/" + file.Name())
if err != nil {
fmt.Println(err)
os.Exit(1)
}
return f
}
// Get the metadatas of a file
func getMetadatas (f *os.File) tag.Metadata {
m, err := tag.ReadFrom(f)
if err != nil {
log.Fatal(err)
}
return m
}
// Get the new folder name
func getNewFolderName (m tag.Metadata) (string, error) {
artist := m.AlbumArtist()
if artist == "" {
artist = m.Artist()
}
year := strconv.Itoa(m.Year())
album := m.Album()
if (len(artist) == 0) {
return "", errors.New("Artist not found")
}
if (year == "0") {
return "", errors.New("Year not found")
}
if (len(album) == 0) {
return "", errors.New("Album not found")
}
folder := artist + " - " + year + " - " + album
return folder, nil
}
func main () {
// Flags
dryRun := flag.Bool("dry-run", false, "Do a preview of what will be renamed")
flag.Parse()
// Get the folders passed as arguments
folders := flag.Args()
green := color.New(color.FgGreen).SprintFunc()
red := color.New(color.FgRed).SprintFunc()
if (*dryRun == true) {
fmt.Println("Running in dry run mode, no renaming will be executed.")
}
for _,folder := range folders {
d := openFolder(folder)
defer d.Close()
files := getFolderFiles(d)
for _, file := range files {
if isMP3File(file) {
f := openFile(folder, file)
defer f.Close()
m := getMetadatas(f)
newFolderName, err := getNewFolderName(m)
fmt.Printf("Renaming \"" + folder + "\" ")
if err != nil {
fmt.Printf("%s\n", red("Error: " + err.Error()))
} else {
if (*dryRun == false) {
os.Rename(folder, newFolderName)
}
fmt.Printf("%s\n", green("Success ✔"))
}
break
}
}
}
}