Distinguish between M4{A,B,P} formats.

Note: Removes tag.AAC.
This commit is contained in:
David Howden
2016-02-22 21:01:12 +11:00
parent 5b94194b29
commit a35ac09042
3 changed files with 37 additions and 17 deletions
+19 -13
View File
@@ -57,12 +57,18 @@ func (f atomNames) Name(n string) []string {
}
// metadataMP4 is the implementation of Metadata for MP4 tag (atom) data.
type metadataMP4 map[string]interface{}
type metadataMP4 struct {
fileType FileType
data map[string]interface{}
}
// ReadAtoms reads MP4 metadata atoms from the io.ReadSeeker into a Metadata, returning
// non-nil error if there was a problem.
func ReadAtoms(r io.ReadSeeker) (Metadata, error) {
m := make(metadataMP4)
m := metadataMP4{
data: make(map[string]interface{}),
fileType: UnknownFileType,
}
err := m.readAtoms(r)
return m, err
}
@@ -137,8 +143,8 @@ func (m metadataMP4) readAtomData(r io.ReadSeeker, name string, size uint32) err
b = b[8:]
if name == "trkn" || name == "disk" {
m[name] = int(b[3])
m[name+"_count"] = int(b[5])
m.data[name] = int(b[3])
m.data[name+"_count"] = int(b[5])
return nil
}
@@ -157,7 +163,7 @@ func (m metadataMP4) readAtomData(r io.ReadSeeker, name string, size uint32) err
Data: b,
}
}
m[name] = data
m.data[name] = data
return nil
}
@@ -220,13 +226,13 @@ func readCustomAtom(r io.ReadSeeker, size uint32) (string, uint32, error) {
}
func (metadataMP4) Format() Format { return MP4 }
func (metadataMP4) FileType() FileType { return AAC }
func (m metadataMP4) FileType() FileType { return m.fileType }
func (m metadataMP4) Raw() map[string]interface{} { return m }
func (m metadataMP4) Raw() map[string]interface{} { return m.data }
func (m metadataMP4) getString(n []string) string {
for _, k := range n {
if x, ok := m[k]; ok {
if x, ok := m.data[k]; ok {
return x.(string)
}
}
@@ -235,7 +241,7 @@ func (m metadataMP4) getString(n []string) string {
func (m metadataMP4) getInt(n []string) int {
for _, k := range n {
if x, ok := m[k]; ok {
if x, ok := m.data[k]; ok {
return x.(int)
}
}
@@ -277,7 +283,7 @@ func (m metadataMP4) Year() int {
func (m metadataMP4) Track() (int, int) {
x := m.getInt([]string{"trkn"})
if n, ok := m["trkn_count"]; ok {
if n, ok := m.data["trkn_count"]; ok {
return x, n.(int)
}
return x, 0
@@ -285,14 +291,14 @@ func (m metadataMP4) Track() (int, int) {
func (m metadataMP4) Disc() (int, int) {
x := m.getInt([]string{"disk"})
if n, ok := m["disk_count"]; ok {
if n, ok := m.data["disk_count"]; ok {
return x, n.(int)
}
return x, 0
}
func (m metadataMP4) Lyrics() string {
t, ok := m["\xa9lyr"]
t, ok := m.data["\xa9lyr"]
if !ok {
return ""
}
@@ -300,7 +306,7 @@ func (m metadataMP4) Lyrics() string {
}
func (m metadataMP4) Picture() *Picture {
v, ok := m["covr"]
v, ok := m.data["covr"]
if !ok {
return nil
}