Skip to content

Instantly share code, notes, and snippets.

@carelvwyk
Created November 2, 2013 12:02
Show Gist options
  • Select an option

  • Save carelvwyk/7278213 to your computer and use it in GitHub Desktop.

Select an option

Save carelvwyk/7278213 to your computer and use it in GitHub Desktop.

Revisions

  1. carelvwyk created this gist Nov 2, 2013.
    84 changes: 84 additions & 0 deletions album_export.py
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,84 @@
    OUT_DIR = './out'
    GROUP_KEY = 'playlistName' # playlistName -> Album Title

    # get list of plist files:
    import os
    import glob
    import shutil
    import biplist
    import mutagen
    from mutagen import mp4

    albums = dict() # Grouping files by album title

    for plist_file in glob.glob("*.plist"):
    plist_data = biplist.readPlist(plist_file)
    if not plist_data.has_key(GROUP_KEY):
    continue
    key = plist_data[GROUP_KEY]
    albums.setdefault(key, []).append(plist_data)

    # Create output directory
    if not os.path.exists(OUT_DIR):
    os.makedirs(OUT_DIR)

    def export_track(plist_data):
    # Relevant info:
    # - Files
    m4a_filename = plist_data['com.apple.iTunesStore.downloadInfo']['mediaAssetFilename']
    art_filename = plist_data['com.apple.iTunesStore.downloadInfo']['artworkAssetFilename']

    # - Tags
    release_date = plist_data['releaseDate']
    album_title = plist_data['playlistName']
    album_artist = plist_data['playlistArtistName']
    album_year = plist_data['year']
    copyright = plist_data.get('copyright','')
    track_title = plist_data['itemName']
    track_artist = plist_data['artistName']
    track_comment = plist_data.get('comments','')
    track_number = plist_data['trackNumber']
    track_count = plist_data['trackCount']
    track_genre = plist_data['genre']
    disc_number = plist_data['discNumber']
    disc_count = plist_data['discCount']

    # Copy the audio track to output directory
    album_directory = "%s/%s/%s (%s)" % (OUT_DIR, album_artist, album_title, album_year)
    if not os.path.exists(album_directory):
    os.makedirs(album_directory)
    new_file = album_directory+"/%02d - %s - %s.m4a" % (track_number, track_artist, track_title) # eg. 01 - Rammstein - Sonne
    shutil.copyfile(m4a_filename, new_file)

    # Add MP4 tags:
    audio_file = mp4.MP4(new_file)

    # Embed album art if it exists
    if os.path.isfile(art_filename):
    image_data = None
    with open(art_filename, 'rb') as f:
    image_data = f.read()
    if image_data != None:
    image_format = mp4.MP4Cover.FORMAT_PNG if art_filename.endswith('png') else mp4.MP4Cover.FORMAT_JPEG
    covr = [mp4.MP4Cover(image_data, image_format)] # Must be array, can have multiple elements
    audio_file.tags['covr'] = covr

    # Set other tags

    # track
    audio_file.tags['\xa9nam'] = track_title
    audio_file.tags['\xa9ART'] = track_artist
    audio_file.tags['\xa9alb'] = album_title
    audio_file.tags['aART'] = album_artist
    audio_file.tags['\xa9day'] = release_date
    audio_file.tags['\xa9cmt'] = track_comment
    audio_file.tags['\xa9gen'] = track_genre
    audio_file.tags['cprt'] = copyright
    audio_file.tags['trkn'] = [(track_number, track_count)]
    if disc_count > 1:
    audio_file.tags['disk'] = [(disc_number, disc_count)]
    audio_file.save()

    for album in albums.keys():
    for track in albums[album]:
    export_track(track)