[Tutor] How to map different keys together ?

spir ☣ denis.spir at gmail.com
Sun Apr 18 20:03:52 CEST 2010

On Sat, 17 Apr 2010 11:57:28 -0400
Damon Timm <damontimm at gmail.com> wrote:

> Hello - I am writing a script that converts an entire music library
> into a single desired output format.  The source music library has a
> variety of music filetypes (flac, mp3, m4a, ogg, etc) and I am
> attempting to use mutagen (a music file tagging module,
> http://code.google.com/p/mutagen/) in order to handle the tagging.
> I am struggling, on a theoretical level, on how to map the various
> filetype's tag/key naming conventions.  I have already created my own
> MusicFile objects to handle each filetype (with functions for
> encoding/decoding) but I can't wrap my head around how to map the
> tags.
> Here is a relevant (I think) example from mutagen for three different
> filetypes all with the same tags (but different keys identifying
> them).
> >>> flac.keys()
> ['album', 'disctotal', 'artist', 'title', 'tracktotal', 'genre',
> 'composer', 'date', 'tracknumber', 'discnumber']
> >>> mp3.keys()
> ['TPOS', u'APIC:', 'TDRC', 'TIT2', 'TPE2', 'TPE1', 'TALB', 'TCON', 'TCOM']
> >>> mp4.keys()
> ['\xa9alb', 'tmpo', '\xa9ART', '\xa9cmt', '\xa9too', 'cpil',
> '----:com.apple.iTunes:iTunSMPB', '\xa9wrt', '\xa9nam', 'pgap',
> '\xa9gen', 'covr', 'disk', '----:com.apple.iTunes:Encoding Params',
> '----:com.apple.iTunes:iTunNORM']

Without the issue below with mp3, you could just do a triple (!) dict lookup. Using at best constants like TITLE to identify in a type-independant manner the field accessed, this could give:
   key = keys_per_type[FLAC][TITLE]
   title = album_data[key]
or in one go
   title = album_data[keys_per_type[FLAC][TITLE]]

> And here is what I would need to do to find the song's TITLE text:
> >>> flac['title']
> [u'Christmas Waltz']
> >>> mp3['TIT2'].text  #notice this one takes another additional step, as well, by specifying text !

Yo, annoying!...

> [u'Christmas Waltz']
> >>> mp4['\xa9nam']
> [u"Christmas Waltz"]

... so maybe the best method is to write an access method per field, taking the type as param. Or a super access method taking both the type and field.

> In the end, after "the mapping", I would like to be able to do
> something along these approaches:
> [1] >>> target_file.tags = src_file.tags
> [2] >>> target_file.set_tags(src_file.get_tags())

I would make an intermediate AlbumData type to handle the per-type mess, abstracting it for you as user.

album_data = AlbumData(src_file.tags)	# maybe type needed here
album_data.write(target_file)		# ditto?
or something like that.

> However, none of the keys match, so I need to somehow map them to a
> central common source first ... and I am not sure about how to
> approach this.  I know I could manually assign each key to a class
> property (using the @property tag) ... but this seems tedious:

Not so sure it's more tedious. At least it's clear in serving code. (Just make sure there it is also clear on client code side.)

> Any insight on where I can start with mapping all these together?

> Thanks,
> Damon


vit esse estrany ☣


More information about the Tutor mailing list