Skip to content

Commit

Permalink
iterable metadata, closes #18
Browse files Browse the repository at this point in the history
  • Loading branch information
vokimon committed Mar 7, 2016
1 parent 28673ec commit 3973909
Show file tree
Hide file tree
Showing 2 changed files with 64 additions and 24 deletions.
51 changes: 44 additions & 7 deletions test/wavefileTest.py
Original file line number Diff line number Diff line change
Expand Up @@ -190,7 +190,7 @@ def test_metadata_default(self) :
self.assertEqual(None, r.metadata.album)
self.assertEqual(None, r.metadata.license)
self.assertEqual(None, r.metadata.tracknumber)
# self.assertEqual(None, r.metadata.genre)
self.assertEqual(None, r.metadata.genre)
r.close()

def test_metadata_illegalAttribute(self) :
Expand All @@ -216,8 +216,6 @@ def write3Channels(self) :
wavefile.save("file.wav", self.input, 44100)

def test_metadata_set(self) :
# TODO: why do the commented out lines fail?

self.toRemove("file.ogg")
w = wavefile.WaveWriter("file.ogg",
format=wavefile.Format.OGG|wavefile.Format.VORBIS)
Expand All @@ -230,19 +228,58 @@ def test_metadata_set(self) :
w.metadata.album = 'myalbum'
w.metadata.license = 'mylicense'
w.metadata.tracknumber = '77'
# w.metadata.genre = 'mygenre'
w.metadata.genre = 'mygenre'
w.close()
r = wavefile.WaveReader("file.ogg")
self.assertEqual("mytitle", r.metadata.title)
self.assertEqual("mycopyright", r.metadata.copyright)
self.assertEqual("mysoftware (libsndfile-1.0.25)", r.metadata.software)
self.assertEqual("mysoftware ({})".format(
wavefile._lib.sf_version_string()
), r.metadata.software)
self.assertEqual("myartist", r.metadata.artist)
self.assertEqual("mycomment", r.metadata.comment)
self.assertEqual("mydate", r.metadata.date)
self.assertEqual("myalbum", r.metadata.album)
self.assertEqual("mylicense", r.metadata.license)
# self.assertEqual("77", r.metadata.tracknumber)
# self.assertEqual("mygenre", r.metadata.genre)
if wavefile._lib.sf_version_string() != 'libsndfile-1.0.25':
self.assertEqual("77", r.metadata.tracknumber)
self.assertEqual("mygenre", r.metadata.genre)
r.close()

def test_metadata_iter(self) :
self.toRemove("file.ogg")
w = wavefile.WaveWriter("file.ogg",
format=wavefile.Format.OGG|wavefile.Format.VORBIS)
w.metadata.title = 'mytitle'
w.metadata.copyright = 'mycopyright'
w.metadata.software = 'mysoftware'
w.metadata.artist = 'myartist'
w.metadata.comment = 'mycomment'
w.metadata.date = 'mydate'
w.metadata.album = 'myalbum'
w.metadata.license = 'mylicense'
w.metadata.tracknumber = '77'
w.metadata.genre = 'mygenre'
w.close()
r = wavefile.WaveReader("file.ogg")
strings = dict(r.metadata)
expected = dict(
title = 'mytitle',
copyright = 'mycopyright',
software = 'mysoftware ({})'.format(
wavefile._lib.sf_version_string()),
artist = 'myartist',
comment = 'mycomment',
date = 'mydate',
album = 'myalbum',
license = 'mylicense',
)
if wavefile._lib.sf_version_string() != 'libsndfile-1.0.25':
expected.update(
tracknumber='77',
genre='mygenre',
)
self.assertEqual(strings, expected)
r.close()

def writeWav(self, filename, data) :
Expand Down
37 changes: 20 additions & 17 deletions wavefile/wavefile.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@

from .libsndfile import _lib

from .libsndfile import OPEN_MODES, SEEK_MODES, SF_INFO
from .libsndfile import OPEN_MODES, SEEK_MODES, SF_INFO, FILE_STRINGS

# Vorbis and Flac use utf8.
# WAV/AIFF use ascii, but if chars beyond 127 are found,
Expand Down Expand Up @@ -132,32 +132,29 @@ class Seek() :


class WaveMetadata(object) :
strings = [
'title',
'copyright',
'software',
'artist',
'comment',
'date',
'album',
'license',
'tracknumber',
'genre',
]
__slots__ = strings + [
strings = dict((
(
k[len('SF_STR_'):].lower(),
getattr(FILE_STRINGS,k)
)
for k in dir(FILE_STRINGS)
if k.startswith('SF_STR_')
))
print strings
__slots__ = list(strings.keys()) + [
'_sndfile',
]

def __init__(self, sndfile) :
self._sndfile = sndfile

def __dir__(self) :
return self.strings
return [s for s in self.strings if s]

def __getattr__(self, name) :
if name not in self.strings :
raise AttributeError(name)
stringid = self.strings.index(name)+1
stringid = self.strings[name]
value = _lib.sf_get_string(self._sndfile, stringid)
if value is None: return None
return value.decode(_tagencoding)
Expand All @@ -166,12 +163,18 @@ def __setattr__(self, name, value) :
if name not in self.strings :
return object.__setattr__(self, name, value)

stringid = self.strings.index(name)+1
stringid = self.strings[name]
error = _lib.sf_set_string(self._sndfile, stringid, value.encode(_tagencoding))
if error : print(ValueError(
name,
error, _sferrormessage(error)))

def __iter__(self):
for k, i in self.strings.items():
value = _lib.sf_get_string(self._sndfile, i)
if value is None: continue
yield k, value.decode(_tagencoding)

class WaveWriter(object) :
def __init__(self,
filename,
Expand Down

0 comments on commit 3973909

Please sign in to comment.