def update(self, metadata, media, lang): # Set title if needed. if media and metadata.title is None: metadata.title = media.title valid_posters = [] for track in media.tracks: for item in media.tracks[track].items: for part in item.parts: filename = helpers.unicodize(part.file) path = os.path.dirname(filename) (file_root, fext) = os.path.splitext(filename) path_files = {} for p in os.listdir(path): path_files[p.lower()] = p # Look for posters poster_files = config.POSTER_FILES + [ os.path.basename(file_root), helpers.splitPath(path)[-1] ] for ext in config.ART_EXTS: for name in poster_files: file = (name + '.' + ext).lower() if file in path_files.keys(): data = Core.storage.load( os.path.join(path, path_files[file])) poster_name = hashlib.md5(data).hexdigest() valid_posters.append(poster_name) if poster_name not in metadata.posters: metadata.posters[ poster_name] = Proxy.Media(data) Log('Local asset image added: ' + file + ', for file: ' + filename) else: Log('Skipping local poster since its already added' ) # If there is an appropriate AudioHelper, use it. audio_helper = audiohelpers.AudioHelpers(part.file) if audio_helper != None: valid_posters = valid_posters + audio_helper.process_metadata( metadata) metadata.posters.validate_keys(valid_posters)
def updateAlbum(metadata, media, lang, find_extras=False, artist_extras={}, extra_type_map=None): # Clear out the title to ensure stale data doesn't clobber other agents' contributions. metadata.title = None # clear out genres for this album so we will get genres for all tracks in audio_helper.process_metadata(metadata) metadata.genres.clear() valid_posters = [] valid_art = [] path = None for track in media.tracks: for item in media.tracks[track].items: for part in item.parts: filename = helpers.unicodize(part.file) path = os.path.dirname(filename) (file_root, fext) = os.path.splitext(filename) path_files = {} for p in os.listdir(path): path_files[p.lower()] = p # Look for posters poster_files = config.ALBUM_POSTER_FILES + [ os.path.basename(file_root), helpers.splitPath(path)[-1] ] for ext in config.ART_EXTS: for name in poster_files: file = (name + '.' + ext).lower() if file in path_files.keys(): data = Core.storage.load( os.path.join(path, path_files[file])) poster_name = hashlib.md5(data).hexdigest() valid_posters.append(poster_name) if poster_name not in metadata.posters: metadata.posters[poster_name] = Proxy.Media( data) Log('Local asset image added (poster): ' + file + ', for file: ' + filename) else: Log('Skipping local poster since its already added' ) for name in config.ART_FILES: file = (name + '.' + ext).lower() if file in path_files.keys(): data = Core.storage.load( os.path.join(path, path_files[file])) art_name = hashlib.md5(data).hexdigest() valid_art.append(art_name) if art_name not in metadata.art: metadata.art[art_name] = Proxy.Media(data) Log('Local asset image added (art): ' + file + ', for file: ' + filename) else: Log('Skipping local art since its already added' ) # If there is an appropriate AudioHelper, use it. audio_helper = audiohelpers.AudioHelpers(part.file) if audio_helper != None: try: valid_posters = valid_posters + audio_helper.process_metadata( metadata) # Album sort title. if hasattr(audio_helper, 'get_album_sort_title'): album_sort_title = audio_helper.get_album_sort_title( ) if album_sort_title and hasattr( metadata, 'title_sort'): metadata.title_sort = album_sort_title if hasattr(audio_helper, 'get_track_sort_title'): track_sort_title = audio_helper.get_track_sort_title( ) track_key = media.tracks[track].guid or track if track_sort_title and hasattr( metadata.tracks[track_key], 'title_sort'): metadata.tracks[ track_key].title_sort = track_sort_title except: pass # Look for a video extra for this track. if find_extras: track_video = findTrackExtra(helpers.unicodize(part.file), extra_type_map) if track_video is not None: track_key = media.tracks[track].guid or track metadata.tracks[track_key].extras.add(track_video) metadata.posters.validate_keys(valid_posters) metadata.art.validate_keys(valid_art)
def update(self, metadata, media, lang): # Clear out the title to ensure stale data doesn't clobber other agents' contributions. metadata.title = None if shouldFindExtras(): extra_type_map = getExtraTypeMap() artist_file_dirs = [] artist_extras = {} metadata.genres.clear() album_genres = [] # First look for track extras. checked_tag = False for album in media.children: for track in album.children: part = helpers.unicodize(track.items[0].parts[0].file) findTrackExtra(part, extra_type_map, artist_extras) artist_file_dirs.append(os.path.dirname(part)) audio_helper = audiohelpers.AudioHelpers(part) if media.title.lower() not in GENERIC_ARTIST_NAMES: if audio_helper and hasattr(audio_helper, 'get_track_genres'): genres = audio_helper.get_track_genres() for genre in genres: if genre not in album_genres: album_genres.append(genre) # Look for artist sort field from first track. # TODO maybe analyse all tracks and only add title_sort if they are the same. if checked_tag == False: checked_tag = True if audio_helper and hasattr(audio_helper, 'get_artist_sort_title'): artist_sort_title = audio_helper.get_artist_sort_title( ) if artist_sort_title and hasattr( metadata, 'title_sort'): metadata.title_sort = artist_sort_title for genre in album_genres: metadata.genres.add(genre) # Now go through this artist's directories looking for additional extras and local art. checked_artist_path = False for artist_file_dir in set(artist_file_dirs): path = helpers.unicodize(artist_file_dir) findArtistExtras(path, extra_type_map, artist_extras, media.title) parentdir = os.path.split(os.path.abspath(path[:-1]))[0] name_parentdir = os.path.basename(parentdir) artist_has_own_dir = False path_to_use = path if normalizeArtist(name_parentdir) == normalizeArtist( media.title): artist_has_own_dir = True path_to_use = parentdir if checked_artist_path is False: checked_artist_path = True path_files = {} for p in os.listdir(path_to_use): path_files[p.lower()] = p # Look for posters and art valid_posters = [] valid_art = [] valid_file_names = getValidFileNamesForArt( config.ARTIST_POSTER_FILES, config.ARTIST_PREFIX, artist_has_own_dir) for file in valid_file_names: if file in path_files.keys(): data = Core.storage.load( os.path.join(path_to_use, path_files[file])) poster_name = hashlib.md5(data).hexdigest() valid_posters.append(poster_name) if poster_name not in metadata.posters: metadata.posters[poster_name] = Proxy.Media( data) valid_file_names = getValidFileNamesForArt( config.ART_FILES, config.ARTIST_PREFIX, artist_has_own_dir) for file in valid_file_names: if file in path_files.keys(): data = Core.storage.load( os.path.join(path_to_use, path_files[file])) art_name = hashlib.md5(data).hexdigest() valid_art.append(art_name) if art_name not in metadata.art: metadata.art[art_name] = Proxy.Media(data) metadata.art.validate_keys(valid_art) metadata.posters.validate_keys(valid_posters) for extra in sorted(artist_extras.values(), key=lambda v: (getExtraSortOrder()[type(v)], v.title)): metadata.extras.add(extra)
def updateAlbum(metadata, media, lang, find_extras=False, artist_extras={}, extra_type_map=None): # Clear out the title to ensure stale data doesn't clobber other agents' contributions. metadata.title = None # clear out genres for this album so we will get genres for all tracks in audio_helper.process_metadata(metadata) metadata.genres.clear() valid_posters = [] valid_art = [] valid_keys = defaultdict(list) path = None for index, track in enumerate(media.children): track_key = track.guid or index for item in track.items: for part in item.parts: filename = helpers.unicodize(part.file) path = os.path.dirname(filename) (file_root, fext) = os.path.splitext(filename) path_files = {} for p in os.listdir(path): path_files[p.lower()] = p # Look for posters poster_files = config.ALBUM_POSTER_FILES + [ os.path.basename(file_root), helpers.splitPath(path)[-1] ] path_file_keys = path_files.keys() while len(path_file_keys) > 0: data_file = path_file_keys.pop(0) if data_file in config.ALBUM_POSTER_DIRS and os.path.isdir( os.path.join(path, path_files[data_file])): for p in os.listdir( os.path.join(path, path_files[data_file])): p = os.path.join(path_files[data_file], p) path_files[p.lower()] = p path_file_keys.append(p.lower()) continue poster_match = False art_match = False (art_base, art_ext) = os.path.splitext(data_file) if not art_ext[1:] in config.ART_EXTS: continue if os.path.dirname(data_file) in config.ALBUM_POSTER_DIRS: poster_match = True if not poster_match: for name in poster_files: if art_base.startswith(name): poster_match = True break if not poster_match: for name in config.ART_FILES: if art_base.startswith(name): art_match = True break if poster_match or art_match: data = Core.storage.load( os.path.join(path, path_files[data_file])) digest = hashlib.md5(data).hexdigest() (valid_posters if poster_match else valid_art).append(digest) addAlbumImage( metadata.posters if poster_match else metadata.art, 'poster' if poster_match else 'art', data_file, filename, data, digest) # If there is an appropriate AudioHelper, use it. audio_helper = audiohelpers.AudioHelpers(part.file) if audio_helper != None: try: valid_posters = valid_posters + audio_helper.process_metadata( metadata) # Album sort title. if hasattr(audio_helper, 'get_album_sort_title'): album_sort_title = audio_helper.get_album_sort_title( ) if album_sort_title and hasattr( metadata, 'title_sort'): metadata.title_sort = album_sort_title if hasattr(audio_helper, 'get_track_sort_title'): track_sort_title = audio_helper.get_track_sort_title( ) if track_sort_title and hasattr( metadata.tracks[track_key], 'title_sort'): metadata.tracks[ track_key].title_sort = track_sort_title except: pass # Look for a video extra for this track. if find_extras: track_video = findTrackExtra(media, track, helpers.unicodize(part.file), extra_type_map) if track_video is not None: metadata.tracks[track_key].extras.add(track_video) # Look for lyrics. LYRIC_EXTS = ['txt', 'lrc'] for ext in LYRIC_EXTS: file = (file_root + '.' + ext) if os.path.exists(file): metadata.tracks[track_key].lyrics[ file] = Proxy.LocalFile(file, format=ext) valid_keys[track_key].append(file) for key in metadata.tracks: metadata.tracks[key].lyrics.validate_keys(valid_keys[key]) metadata.posters.validate_keys(valid_posters) metadata.art.validate_keys(valid_art)
def updateAlbum(metadata, media, lang, find_extras=False, artist_extras={}, extra_type_map=None, prefs={}): # clear out genres for this album so we will get genres for all tracks in audio_helper.process_metadata(metadata) metadata.genres.clear() valid_posters = [] valid_art = [] valid_keys = defaultdict(list) valid_track_keys = [] path = None for index, track in enumerate(media.children): track_key = track.id or index valid_track_keys.append(track_key) for item in track.items: for part in item.parts: filename = helpers.unicodize(part.file) path = os.path.dirname(filename) (file_root, fext) = os.path.splitext(filename) path_files = {} if len(path) > 0: for p in os.listdir(path): path_files[p.lower()] = p # Look for posters poster_files = config.ALBUM_POSTER_FILES + [ os.path.basename(file_root), helpers.splitPath(path)[-1] ] path_file_keys = path_files.keys() order = 1 while len(path_file_keys) > 0: data_file = path_file_keys.pop(0) if data_file in config.ALBUM_POSTER_DIRS and os.path.isdir( os.path.join(path, path_files[data_file])): Log('Searching art subdir %s for file %s', os.path.join(path, path_files[data_file]), filename) for p in os.listdir( os.path.join(path, path_files[data_file])): p = os.path.join(path_files[data_file], p) path_files[p.lower()] = p path_file_keys.append(p.lower()) continue poster_match = False art_match = False (art_base, art_ext) = os.path.splitext(data_file) if not art_ext[1:] in config.ART_EXTS: continue if os.path.dirname(data_file) in config.ALBUM_POSTER_DIRS: poster_match = True if not poster_match: for name in poster_files: if art_base.startswith(name): poster_match = True break if not poster_match: for name in config.ART_FILES: if art_base.startswith(name): art_match = True break # If we only want posters from the cloud, ignore anything we find. if prefs['albumPosters'] == 2: poster_match = False if poster_match or art_match: data = Core.storage.load( os.path.join(path, path_files[data_file])) digest = hashlib.md5(data).hexdigest() (valid_posters if poster_match else valid_art).append(digest) addAlbumImage( metadata.posters if poster_match else metadata.art, 'poster' if poster_match else 'art', data_file, filename, data, digest, order) order = order + 1 # If there is an appropriate AudioHelper, use it. audio_helper = audiohelpers.AudioHelpers(part.file) if audio_helper != None: try: valid_posters = valid_posters + audio_helper.process_metadata( metadata, prefs) # Album title (making sure not to blank it out). if hasattr(audio_helper, 'get_album_title'): album_title = audio_helper.get_album_title() if album_title: album_title = CleanString(album_title) if len(album_title) > 0: metadata.title = album_title # Album sort title. if hasattr(audio_helper, 'get_album_sort_title'): metadata.title_sort = '' album_sort_title = audio_helper.get_album_sort_title( ) if album_sort_title and hasattr( metadata, 'title_sort'): metadata.title_sort = CleanString( album_sort_title) # Album summary if hasattr(audio_helper, 'get_album_summary'): metadata.summary = '' album_summary = audio_helper.get_album_summary() if album_summary: metadata.summary = CleanString(album_summary) if hasattr(audio_helper, 'get_track_sort_title'): track_sort_title = audio_helper.get_track_sort_title( ) metadata.tracks[track_key].title_sort = '' if track_sort_title and hasattr( metadata.tracks[track_key], 'title_sort'): metadata.tracks[ track_key].title_sort = CleanString( track_sort_title) # Track title if hasattr(audio_helper, 'get_track_title'): track_title = audio_helper.get_track_title() metadata.tracks[track_key].title = '' if track_title is not None: metadata.tracks[track_key].title = CleanString( track_title) else: metadata.tracks[ track_key].title = CleanFilename(part.file) # Track index. if hasattr(audio_helper, 'get_track_index'): track_index = audio_helper.get_track_index() if track_index is not None: metadata.tracks[ track_key].track_index = track_index # Track parent index. if hasattr(audio_helper, 'get_track_parent_index'): track_parent_index = audio_helper.get_track_parent_index( ) if track_parent_index is not None: metadata.tracks[ track_key].disc_index = track_parent_index # Track artist. if hasattr(audio_helper, 'get_track_artist'): track_artist = audio_helper.get_track_artist() metadata.tracks[ track_key].original_title = BLANK_FIELD if track_artist is not None: metadata.tracks[ track_key].original_title = StringOrBlank( track_artist) except: Log('Exception reading tags') # Look for a video extra for this track. if find_extras: track_video = findTrackExtra(media, track, helpers.unicodize(part.file), extra_type_map) if track_video is not None: metadata.tracks[track_key].extras.add(track_video) # Look for lyrics. LYRIC_EXTS = ['txt', 'lrc'] for ext in LYRIC_EXTS: file = (file_root + '.' + ext) if os.path.exists(file): Log('Found a lyric in %s', file) metadata.tracks[track_key].lyrics[ file] = Proxy.LocalFile(file, format=ext) valid_keys[track_key].append(file) for key in metadata.tracks: metadata.tracks[key].lyrics.validate_keys(valid_keys[key]) metadata.tracks.validate_keys(valid_track_keys) metadata.posters.validate_keys(valid_posters) metadata.art.validate_keys(valid_art)