kopia lustrzana https://github.com/jcs/id3-go
Merge branch 'feature/readonly' into develop
commit
90ffc5cacc
5
id3.go
5
id3.go
|
@ -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 {
|
||||
|
|
32
id3_test.go
32
id3_test.go
|
@ -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
|
||||
|
|
11
v1/id3v1.go
11
v1/id3v1.go
|
@ -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 {
|
||||
|
|
|
@ -443,6 +443,7 @@ func (f *UnsynchTextFrame) SetLanguage(language string) error {
|
|||
}
|
||||
|
||||
f.language = language
|
||||
f.changeSize(0)
|
||||
return nil
|
||||
}
|
||||
|
||||
|
|
|
@ -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 {
|
||||
|
|
Ładowanie…
Reference in New Issue