Example #1
0
    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)
Example #2
0
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)
Example #3
0
    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)
Example #4
0
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)
Example #5
0
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)