diff --git a/id3.go b/id3.go index 99c80e6..dfa1541 100644 --- a/id3.go +++ b/id3.go @@ -30,6 +30,7 @@ type Tagger interface { AllFrames() []v2.Framer Frames(string) []v2.Framer Frame(string) v2.Framer + DeleteFrame(v2.Framer) []v2.Framer DeleteFrames(string) []v2.Framer AddFrames(...v2.Framer) Bytes() []byte diff --git a/v1/id3v1.go b/v1/id3v1.go index 16ace1c..7a37f24 100644 --- a/v1/id3v1.go +++ b/v1/id3v1.go @@ -140,9 +140,10 @@ func (t Tag) Version() string { } // Dummy methods to satisfy Tagger interface -func (t Tag) Padding() uint { return 0 } -func (t Tag) AllFrames() []v2.Framer { return []v2.Framer{} } -func (t Tag) Frame(id string) v2.Framer { return nil } -func (t Tag) Frames(id string) []v2.Framer { return []v2.Framer{} } -func (t Tag) DeleteFrames(id string) []v2.Framer { return []v2.Framer{} } -func (t Tag) AddFrames(f ...v2.Framer) {} +func (t Tag) Padding() uint { return 0 } +func (t Tag) AllFrames() []v2.Framer { return []v2.Framer{} } +func (t Tag) Frame(id string) v2.Framer { return nil } +func (t Tag) Frames(id string) []v2.Framer { return []v2.Framer{} } +func (t Tag) DeleteFrames(id string) []v2.Framer { return []v2.Framer{} } +func (t Tag) DeleteFrame(f v2.Framer) []v2.Framer { return []v2.Framer{} } +func (t Tag) AddFrames(f ...v2.Framer) {} diff --git a/v2/id3v2.go b/v2/id3v2.go index b7de2ff..52d74a7 100644 --- a/v2/id3v2.go +++ b/v2/id3v2.go @@ -189,6 +189,30 @@ func (t *Tag) DeleteFrames(id string) []Framer { return frames } +// Delete the specified frame +func (t *Tag) DeleteFrame(delFrame Framer) []Framer { + frames := t.AllFrames() + if frames == nil { + return nil + } + + diff := 0 + i := 0 + for i < len(t.frames) { + frame := t.frames[i] + if frame == delFrame { + frame.setOwner(nil) + diff += t.frameHeaderSize + int(frame.Size()) + t.frames = append(t.frames[:i], t.frames[i+1:]...) + } else { + i++ + } + } + t.changeSize(-diff) + + return frames +} + // Add frames func (t *Tag) AddFrames(frames ...Framer) { for _, frame := range frames {