Merge branch 'feature/readonly' into develop

develop
Michael Yang 2014-07-04 19:35:55 -04:00
commit 90ffc5cacc
5 zmienionych plików z 58 dodań i 0 usunięć

5
id3.go
Wyświetl plik

@ -29,6 +29,7 @@ type Tagger interface {
DeleteFrames(string) []v2.Framer
AddFrames(...v2.Framer)
Bytes() []byte
Dirty() bool
Padding() uint
Size() int
Version() string
@ -66,6 +67,10 @@ func Open(name string) (*File, error) {
func (f *File) Close() error {
defer f.file.Close()
if !f.Dirty() {
return nil
}
switch f.Tagger.(type) {
case (*v1.Tag):
if _, err := f.file.Seek(-v1.TagSize, os.SEEK_END); err != nil {

Wyświetl plik

@ -74,6 +74,38 @@ func TestClose(t *testing.T) {
}
}
func TestReadonly(t *testing.T) {
before, err := ioutil.ReadFile(testFile)
if err != nil {
t.Errorf("test file error")
}
file, err := Open(testFile)
if err != nil {
t.Errorf("Readonly: unable to open file")
}
file.Title()
file.Artist()
file.Album()
file.Year()
file.Genre()
file.Comments()
if err := file.Close(); err != nil {
t.Errorf("Readonly: unable to close file")
}
after, err := ioutil.ReadFile(testFile)
if err != nil {
t.Errorf("Readonly: unable to reopen file")
}
if !bytes.Equal(before, after) {
t.Errorf("Readonly: tag data modified without set")
}
}
func TestUnsynchTextFrame_RoundTrip(t *testing.T) {
var (
err error

Wyświetl plik

@ -42,6 +42,7 @@ var (
type Tag struct {
title, artist, album, year, comment string
genre byte
dirty bool
}
func ParseTag(readSeeker io.ReadSeeker) *Tag {
@ -60,9 +61,14 @@ func ParseTag(readSeeker io.ReadSeeker) *Tag {
year: string(data[93:97]),
comment: string(data[97:127]),
genre: data[127],
dirty: false,
}
}
func (t Tag) Dirty() bool {
return t.dirty
}
func (t Tag) Title() string { return t.title }
func (t Tag) Artist() string { return t.artist }
func (t Tag) Album() string { return t.album }
@ -82,18 +88,22 @@ func (t Tag) Comments() []string {
func (t *Tag) SetTitle(text string) {
t.title = text
t.dirty = true
}
func (t *Tag) SetArtist(text string) {
t.artist = text
t.dirty = true
}
func (t *Tag) SetAlbum(text string) {
t.album = text
t.dirty = true
}
func (t *Tag) SetYear(text string) {
t.year = text
t.dirty = true
}
func (t *Tag) SetGenre(text string) {
@ -104,6 +114,7 @@ func (t *Tag) SetGenre(text string) {
break
}
}
t.dirty = true
}
func (t Tag) Bytes() []byte {

Wyświetl plik

@ -443,6 +443,7 @@ func (f *UnsynchTextFrame) SetLanguage(language string) error {
}
f.language = language
f.changeSize(0)
return nil
}

Wyświetl plik

@ -23,6 +23,7 @@ type Tag struct {
frameHeaderSize int
frameConstructor func(io.Reader) Framer
frameBytesConstructor func(Framer) []byte
dirty bool
}
// Creates a new tag
@ -32,6 +33,7 @@ func NewTag(version byte) *Tag {
t := &Tag{
Header: header,
frames: make(map[string][]Framer),
dirty: false,
}
switch t.version {
@ -103,6 +105,13 @@ func (t *Tag) changeSize(diff int) {
} else {
t.padding = uint(d)
}
t.dirty = true
}
// Modified status of the tag
func (t Tag) Dirty() bool {
return t.dirty
}
func (t Tag) Bytes() []byte {