package audio import ( "fmt" "io" "os" "time" "github.com/dhowden/tag" "github.com/tcolgate/mp3" settings "physick.ru/culture_exam/Settings" ) type TrackMeta struct { Name string Author string Album string Location string Duration time.Duration } func GenerateMetadata(fileName string) (TrackMeta, error) { var fullPath = fmt.Sprintf("%s/%s", settings.Current.SongsLocation, fileName) var duration, error = GetSongDuration(fullPath) // If file doesn't exist that will be caught there if error != nil { return TrackMeta{}, error } var Artist, Title, Album, metaErr = GetInfo(fullPath) if metaErr != nil { return TrackMeta{}, metaErr } return TrackMeta { Name: Title, Author: Artist, Album: Album, Location: fullPath, Duration: duration, }, nil } func GetSongDuration(path string) (time.Duration, error) { var file, fopenErr = os.Open(path) if fopenErr != nil { return time.Duration(0), fopenErr } defer file.Close() var track = mp3.NewDecoder(file) var duration time.Duration var frame mp3.Frame var skipped = 0 for { var err = track.Decode(&frame, &skipped) if err != nil { if err == io.EOF { break } return time.Duration(0), err } duration += frame.Duration() } return duration, nil } // Author - name - album func GetInfo (filePath string) (string, string, string, error) { f, err := os.Open(filePath) if err != nil { return "", "", "", err } defer f.Close() m, err := tag.ReadFrom(f) if err != nil { return "", "", "", err } return m.Artist(), m.Title(), m.Album(), nil }