On Sat, 17 Apr 2010 11:57:28 -0400 Damon Timm <damont...@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 target_file.write(album_data.format(type)) 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 Denis ________________________________ vit esse estrany ☣ spir.wikidot.com _______________________________________________ Tutor maillist - Tutor@python.org To unsubscribe or change subscription options: http://mail.python.org/mailman/listinfo/tutor