def addAlbumArt(artwork, albumpath, release): logger.info('Adding album art to folder') try: year = release['ReleaseDate'][:4] except TypeError: year = '' values = { '$Artist': release['ArtistName'], '$Album': release['AlbumTitle'], '$Year': year, '$artist': release['ArtistName'].lower(), '$album': release['AlbumTitle'].lower(), '$year': year } album_art_name = helpers.replace_all(headphones.ALBUM_ART_FORMAT.strip(), values) + ".jpg" album_art_name = helpers.replace_illegal_chars(album_art_name).encode(headphones.SYS_ENCODING, 'replace') if headphones.FILE_UNDERSCORES: album_art_name = album_art_name.replace(' ', '_') if album_art_name.startswith('.'): album_art_name = album_art_name.replace(0, '_') try: file = open(os.path.join(albumpath, album_art_name), 'wb') file.write(artwork) file.close() except Exception, e: logger.error('Error saving album art: %s' % str(e)) return
def renameFiles(albumpath, downloaded_track_list, release): logger.info('Renaming files') try: year = release['ReleaseDate'][:4] except TypeError: year = '' # Until tagging works better I'm going to rely on the already provided metadata for downloaded_track in downloaded_track_list: try: f = MediaFile(downloaded_track) except: logger.info("MediaFile couldn't parse: %s", downloaded_track.decode(headphones.SYS_ENCODING, 'replace')) continue if not f.disc: discnumber = '' else: discnumber = '%d' % f.disc if not f.track: tracknumber = '' else: tracknumber = '%02d' % f.track if not f.title: basename = os.path.basename(downloaded_track.decode(headphones.SYS_ENCODING, 'replace')) title = os.path.splitext(basename)[0] ext = os.path.splitext(basename)[1] new_file_name = helpers.cleanTitle(title) + ext else: title = f.title if release['ArtistName'] == "Various Artists" and f.artist: artistname = f.artist else: artistname = release['ArtistName'] if artistname.startswith('The '): sortname = artistname[4:] + ", The" else: sortname = artistname values = { '$Disc': discnumber, '$Track': tracknumber, '$Title': title, '$Artist': artistname, '$SortArtist': sortname, '$Album': release['AlbumTitle'], '$Year': year, '$disc': discnumber, '$track': tracknumber, '$title': title.lower(), '$artist': artistname.lower(), '$sortartist': sortname.lower(), '$album': release['AlbumTitle'].lower(), '$year': year } ext = os.path.splitext(downloaded_track)[1] new_file_name = helpers.replace_all(headphones.FILE_FORMAT.strip(), values).replace('/','_') + ext new_file_name = helpers.replace_illegal_chars(new_file_name).encode(headphones.SYS_ENCODING, 'replace') if headphones.FILE_UNDERSCORES: new_file_name = new_file_name.replace(' ', '_') if new_file_name.startswith('.'): new_file_name = new_file_name.replace(0, '_') new_file = os.path.join(albumpath, new_file_name) if downloaded_track == new_file_name: logger.debug("Renaming for: " + downloaded_track.decode(headphones.SYS_ENCODING, 'replace') + " is not neccessary") continue logger.debug('Renaming %s ---> %s', downloaded_track.decode(headphones.SYS_ENCODING,'replace'), new_file_name.decode(headphones.SYS_ENCODING,'replace')) try: os.rename(downloaded_track, new_file) except Exception, e: logger.error('Error renaming file: %s. Error: %s', downloaded_track.decode(headphones.SYS_ENCODING, 'replace'), e) continue
def moveFiles(albumpath, release, tracks): try: year = release['ReleaseDate'][:4] except TypeError: year = '' artist = release['ArtistName'].replace('/', '_') album = release['AlbumTitle'].replace('/', '_') if headphones.FILE_UNDERSCORES: artist = artist.replace(' ', '_') album = album.replace(' ', '_') releasetype = release['Type'].replace('/', '_') if release['ArtistName'].startswith('The '): sortname = release['ArtistName'][4:] + ", The" else: sortname = release['ArtistName'] if sortname[0].isdigit(): firstchar = '0-9' else: firstchar = sortname[0] values = { '$Artist': artist, '$SortArtist': sortname, '$Album': album, '$Year': year, '$Type': releasetype, '$First': firstchar.upper(), '$artist': artist.lower(), '$sortartist': sortname.lower(), '$album': album.lower(), '$year': year, '$type': releasetype.lower(), '$first': firstchar.lower() } folder = helpers.replace_all(headphones.FOLDER_FORMAT.strip(), values) folder = helpers.replace_illegal_chars(folder, type="folder") folder = folder.replace('./', '_/').replace('/.','/_') if folder.endswith('.'): folder = folder[:-1] + '_' if folder.startswith('.'): folder = '_' + folder[1:] # Grab our list of files early on so we can determine if we need to create # the lossy_dest_dir, lossless_dest_dir, or both files_to_move = [] lossy_media = False lossless_media = False for r,d,f in os.walk(albumpath): for files in f: files_to_move.append(os.path.join(r, files)) if any(files.lower().endswith('.' + x.lower()) for x in headphones.LOSSY_MEDIA_FORMATS): lossy_media = True if any(files.lower().endswith('.' + x.lower()) for x in headphones.LOSSLESS_MEDIA_FORMATS): lossless_media = True # Do some sanity checking to see what directories we need to create: make_lossy_folder = False make_lossless_folder = False lossy_destination_path = os.path.normpath(os.path.join(headphones.DESTINATION_DIR, folder)).encode(headphones.SYS_ENCODING, 'replace') lossless_destination_path = os.path.normpath(os.path.join(headphones.LOSSLESS_DESTINATION_DIR, folder)).encode(headphones.SYS_ENCODING, 'replace') # If they set a destination dir for lossless media, only create the lossy folder if there is lossy media if headphones.LOSSLESS_DESTINATION_DIR: if lossy_media: make_lossy_folder = True if lossless_media: make_lossless_folder = True # If they haven't set a lossless dest_dir, just create the "lossy" folder else: make_lossy_folder = True last_folder = headphones.FOLDER_FORMAT.strip().split('/')[-1] if make_lossless_folder: # Only rename the folder if they use the album name, otherwise merge into existing folder if os.path.exists(lossless_destination_path) and 'album' in last_folder.lower(): create_duplicate_folder = False if headphones.REPLACE_EXISTING_FOLDERS: try: shutil.rmtree(lossless_destination_path) except Exception, e: logger.error("Error deleting existing folder: %s. Creating duplicate folder. Error: %s" % (lossless_destination_path.decode(headphones.SYS_ENCODING, 'replace'), e)) create_duplicate_folder = True if not headphones.REPLACE_EXISTING_FOLDERS or create_duplicate_folder: temp_folder = folder i = 1 while True: newfolder = temp_folder + '[%i]' % i lossless_destination_path = os.path.normpath(os.path.join(headphones.LOSSLESS_DESTINATION_DIR, newfolder)).encode(headphones.SYS_ENCODING, 'replace') if os.path.exists(lossless_destination_path): i += 1 else: temp_folder = newfolder break if not os.path.exists(lossless_destination_path): try: os.makedirs(lossless_destination_path) except Exception, e: logger.error('Could not create lossless folder for %s. (Error: %s)' % (release['AlbumTitle'], e)) if not make_lossy_folder: return [albumpath]