Example #1
0
    def item_candidates(self, item):
        last_data = match(item.path)
        if not last_data:
            return ()

        # Have a MusicBrainz track ID?
        if last_data['track_mbid']:
            log.debug('Have a track ID from last.fm: %s' %
                      last_data['track_mbid'])
            id_track = mb.track_for_id(last_data['track_mbid'])
            if id_track:
                log.debug('Matched by track ID.')
                return (id_track,)

        # Do a full search.
        criteria = {
            'artist': last_data['artist'],
            'track': last_data['title'],
        }
        if last_data['artist_mbid']:
            criteria['artistid'] = last_data['artist_mbid']
        cands = list(mb.find_tracks(criteria))

        log.debug('Matched last track candidates: %s' %
                  ', '.join([cand['title'] for cand in cands]))
        return cands
Example #2
0
def track_for_mbid(recording_id):
    """Get a TrackInfo object for a MusicBrainz recording ID. Return None
    if the ID is not found.
    """
    try:
        return mb.track_for_id(recording_id)
    except mb.MusicBrainzAPIError as exc:
        exc.log(log)
Example #3
0
def track_for_mbid(recording_id):
    """Get a TrackInfo object for a MusicBrainz recording ID. Return None
    if the ID is not found.
    """
    try:
        track = mb.track_for_id(recording_id)
        if track:
            plugins.send('trackinfo_received', info=track)
        return track
    except mb.MusicBrainzAPIError as exc:
        exc.log(log)
Example #4
0
def track_for_mbid(recording_id):
    """Get a TrackInfo object for a MusicBrainz recording ID. Return None
    if the ID is not found.
    """
    try:
        track = mb.track_for_id(recording_id)
        if track:
            plugins.send(u'trackinfo_received', info=track)
        return track
    except mb.MusicBrainzAPIError as exc:
        exc.log(log)
Example #5
0
def tag_item(item, timid=False, search_artist=None, search_title=None,
             search_id=None):
    """Attempts to find metadata for a single track. Returns a
    `(candidates, recommendation)` pair where `candidates` is a list
    of `(distance, track_info)` pairs. `search_artist` and 
    `search_title` may be used to override the current metadata for
    the purposes of the MusicBrainz title; likewise `search_id`.
    """
    candidates = []

    # First, try matching by MusicBrainz ID.
    trackid = search_id or item.mb_trackid
    if trackid:
        log.debug('Searching for track ID: ' + trackid)
        track_info = mb.track_for_id(trackid)
        if track_info:
            dist = track_distance(item, track_info, incl_artist=True)
            candidates.append((dist, track_info))
            # If this is a good match, then don't keep searching.
            rec = recommendation(candidates)
            if rec == RECOMMEND_STRONG and not timid:
                log.debug('Track ID match.')
                return candidates, rec

    # If we're searching by ID, don't proceed.
    if search_id is not None:
        if candidates:
            return candidates, rec
        else:
            return [], RECOMMEND_NONE
    
    # Search terms.
    if not (search_artist and search_title):
        search_artist, search_title = item.artist, item.title
    log.debug(u'Item search terms: %s - %s' % (search_artist, search_title))

    # Candidate metadata from search.
    for track_info in mb.match_track(search_artist, search_title):
        dist = track_distance(item, track_info, incl_artist=True)
        candidates.append((dist, track_info))

    # Add candidates from plugins.
    for track_info in plugins.item_candidates(item):
        dist = track_distance(item, track_info, incl_artist=True)
        candidates.append((dist, track_info))

    # Sort by distance and return with recommendation.
    log.debug('Found %i candidates.' % len(candidates))
    candidates.sort()
    rec = recommendation(candidates)
    return candidates, rec
Example #6
0
def _track_for_id(track_id):
    """Get an item for a recording ID."""
    candidates = []

    # From MusicBrainz.
    try:
        candidates.append(mb.track_for_id(track_id))
    except mb.MusicBrainzAPIError as exc:
        exc.log(log)

    # From plugins.
    candidates.extend(plugins.track_for_id(track_id))

    return filter(None, candidates)
Example #7
0
def _track_for_id(track_id):
    """Get an item for a recording ID."""
    candidates = []

    # From MusicBrainz.
    try:
        candidates.append(mb.track_for_id(track_id))
    except mb.MusicBrainzAPIError as exc:
        exc.log(log)

    # From plugins.
    candidates.extend(plugins.track_for_id(track_id))

    return filter(None, candidates)
Example #8
0
    def item_candidates(self, item):
        last_data = match(item.path)
        if not last_data:
            return ()

        # Have a MusicBrainz track ID?
        if last_data["track_mbid"]:
            log.debug("Have a track ID from last.fm: %s" % last_data["track_mbid"])
            id_track = mb.track_for_id(last_data["track_mbid"])
            if id_track:
                log.debug("Matched by track ID.")
                return (id_track,)

        # Do a full search.
        criteria = {"artist": last_data["artist"], "track": last_data["title"]}
        if last_data["artist_mbid"]:
            criteria["artistid"] = last_data["artist_mbid"]
        cands = list(mb.find_tracks(criteria))

        log.debug("Matched last track candidates: %s" % ", ".join([cand["title"] for cand in cands]))
        return cands
Example #9
0
def _track_for_id(track_id):
    """Get an item for a recording MBID."""
    try:
        return mb.track_for_id(track_id)
    except mb.MusicBrainzAPIError as exc:
        exc.log(log)
Example #10
0
def _track_for_id(track_id):
    """Get an item for a recording MBID."""
    return mb.track_for_id(track_id)
Example #11
0
def _track_for_id(track_id):
    """Get an item for a recording MBID."""
    return mb.track_for_id(track_id)