pyogg, pyvorbis and massively tagging your ogg files
UPDATE: I've since found tagpy which is snappy fast, and reads/writes tags for a whole bunch of formats. Be careful, it can cause some confusion with the namespace ogg.vorbis, however, you can use it with the tagpy.ogg.vorbis namespace.
I was looking for a simple way to massively tag some .ogg files using my favourite scripting language.
At first, it wasn't obvious which things could be used to just add some track artists, albums and title informations, so here are my findings:
To open an ogg vorbis file, and get it's comments, run:
>>> import ogg.vorbis >>> vf = ogg.vorbis.VorbisFile('/tmp/test.ogg') >>> vc = vf.comments()
You'll then have the VorbisComment object in the vc variable.
Because vorbis files can handle more than one value for each tag (each key of a simili-dict), all tags return a list. You can see what happens with:
>>> vc.as_dict() {'VENDOR': ['Xiph.Org libVorbis I 20070622'], 'ARTIST': ['test artist'], 'ALBUM': ['test album'], 'TITLE': ['test title']}
See the v-comment specs at xiph.org for a list of useful tags.
Now, if you need to modify tags, you'll need to create a new VorbisComment() object and copy the existing comments/tags taken from the original file:
>>> nc = ogg.vorbis.VorbisComment() >>> for x in vc.items() ... if x[0] in ['ARTIST', 'ALBUM', 'TITLE', 'VENDOR']: ... nc.add_tag(x[0], x[1].encode('utf-8')) ... >>> nc.add_tag('CUSTOM_TAG', 'mega-comment')
You can pose any condition in there to match the tag x[0] you need to copy or hold.
Note that you should call .add_tag() with a 'str' as second parameter, as giving it a 'unicode' object encodes as doubled UTF-8 or crashes, not sure why.
Once you're ready, write your new comments to file, with either .append_to() -- which will (not so) obviously append the comments to the file -- or .write_to(), as in the example:
>>> nc.write_to('/tmp/test.ogg')
Now the output of vorbiscomment -l /tmp/test.ogg will read:
$ vorbiscomment -l /tmp/test.ogg VENDOR=Xiph.Org libVorbis I 20070622 ARTIST=test artist ALBUM=test album TITLE=test title
and mplayer will say:
[...] Ogg file format detected. Clip info: Artist: test artist Album: test album Name: test title [...]
Not very pythonic, but still works.
