Exemple #1
0
    def update(self, metadata, media, lang):

        posters = []

        Log('Updating album: ' + media.title)
        Log('With guid: ' + media.guid)

        # Even if this album itself is not a Gracenote album, we may have some tracks that came from one, or we may be post multi-disc merge.
        # Look through all the tracks for their parent GNIDs. Later, we'll load each one so we can update track data for everything.
        #
        album_gnids = set([
            track.guid.split('/')[-2] for track in media.children
            if 'com.plexapp.agents.plexmusic://gracenote' in track.guid
        ])

        # Try to get last.fm information for most popular tracks.
        most_popular_tracks = {}
        try:
            # Look up the artist.
            lastfm_artist = find_lastfm_artist(media.parentTitle,
                                               [media.title], lang)

            # Get top tracks.
            top_tracks = find_lastfm_top_tracks(lastfm_artist, lang)
            for track in top_tracks:
                most_popular_tracks[track['name']] = int(track['playcount'])
        except:
            pass

        if len(album_gnids) == 0:
            if Prefs['popular']:
                Log('Didn\'t find any tracks from Gracenote albums, finish by searching for most popular tracks only'
                    )
                for track in media.children:
                    # See if it's the top tracks.
                    title = track.title
                    guid = track.guid
                    metadata_track = metadata.tracks[guid]
                    for popular_track in most_popular_tracks.keys():
                        if popular_track and title and LevenshteinRatio(
                                popular_track, title) > 0.95:
                            metadata_track.rating_count = most_popular_tracks[
                                popular_track]
            else:
                Log('Didn\'t find any tracks from Gracenote albums, aborting')
            return

        try:
            res = XML.ElementFromURL(
                'http://127.0.0.1:32400/services/gracenote/update?guid=' +
                String.URLEncode(media.guid),
                timeout=60)
        except Exception, e:
            Log('Error issuing album update request: ' + str(e))
            return
Exemple #2
0
  def update(self, metadata, media, lang):

    Log('Updating: %s (GUID: %s)' % (media.title, media.guid))

    posters = []
    arts = []

    # FIXME, not sure why metadata title isn't set when used as secondary agent.
    the_title = metadata.title or media.title

    # Special art for VA.
    if the_title == 'Various Artists':
      add_posters(['http://music.plex.tv/pixogs/various_artists_poster.jpg'], metadata)
      add_art([['http://music.plex.tv/pixogs/various_artists_art.jpg', 'http://music.plex.tv/pixogs/various_artists_art.jpg']], metadata)
      return

    # Do nothing for unknown.
    elif the_title == '[Unknown Artist]':
      return

    gracenote_poster = None
    gracenote_guids = [c.guid for c in media.children if c.guid.startswith('com.plexapp.agents.plexmusic://gracenote/')]
    if len(gracenote_guids) > 0:
  
      # Fetch an album (use the given child_guid if we have it) and use the artist data from that.
      res = XML.ElementFromURL('http://127.0.0.1:32400/services/gracenote/update?guid=' + String.URLEncode(gracenote_guids[0]))

      # Artist name.
      if metadata.title is None and not media.title:
        metadata.title = res.xpath('//Directory[@type="album"]')[0].get('parentTitle')
      else:
        metadata.title = media.title
      the_title = metadata.title

      # Artist bio.
      metadata.summary = res.xpath('//Directory[@type="album"]')[0].get('parentSummary')

      # Artist country.
      metadata.countries.clear()
      metadata.countries.add(res.xpath('//Directory[@type="album"]')[0].get('parentCountry'))

      # Artist poster.
      gracenote_poster = res.xpath('//Directory[@type="album"]')[0].get('parentThumb')
      
      # Genres.
      add_genres(res, metadata)

    else:
      # We still need to make sure the title is set.
      metadata.title = media.title

    # Find artist posters and art from other sources.
    album_titles = [a.title for a in media.children]
    lastfm_artist = find_lastfm_artist(the_title, album_titles, lang)
    artist_mbid = artist_mbid_lookup(the_title, lastfm_artist)
    fanart_artist = find_fanart_artist(the_title, artist_mbid)

    metadata.similar.clear()
    metadata.concerts.clear()
    
    find_artist_posters(posters, the_title, lastfm_artist, fanart_artist)

    if lastfm_artist is not None:
      find_artist_art(arts, the_title, lastfm_artist, fanart_artist, artist_mbid)
    
      # Find similar artists.
      similar_artists = find_lastfm_similar_artists(lastfm_artist, lang)
      
      if similar_artists is not None:
        for artist in similar_artists:
          metadata.similar.add(artist['name'])
      
      # Find events
      if Prefs['concerts']:
        events = find_lastfm_events(lastfm_artist, lang)
        if events:
          for event in events:
            try:
              concert = metadata.concerts.new()
              concert.title = event['title']
              concert.venue = event['venue']['name']
              concert.city = event['venue']['location']['city']
              concert.country = event['venue']['location']['country']
              concert.date = Datetime.ParseDate(event['startDate'], '%Y-%m-%d %H:%M:00')
              concert.url = lastfm_artist['url'] + '/+events'
            except:
              pass

    # If we had a Gracenote poster, add it last.
    if gracenote_poster is not None and len(gracenote_poster) > 0:
      posters.append(gracenote_poster)
      
    # If we didn't get an artist summary, try to get one from Last.FM.
    if lastfm_artist is not None and (metadata.summary is None or len(metadata.summary) == 0):
      metadata.summary = String.DecodeHTMLEntities(String.StripTags(lastfm_artist['bio']['content'][:lastfm_artist['bio']['content'].find('\n\n')]).strip())

    # Add posters.
    add_posters(posters, metadata)

    # Add art.
    add_art(arts, metadata)
Exemple #3
0
class GracenoteAlbumAgent(Agent.Album):

    name = 'Plex Premium Music'
    languages = [
        Locale.Language.English, Locale.Language.Arabic,
        Locale.Language.Bulgarian, Locale.Language.Chinese,
        Locale.Language.Croatian, Locale.Language.Czech,
        Locale.Language.Danish, Locale.Language.Dutch, Locale.Language.Finnish,
        Locale.Language.French, Locale.Language.German, Locale.Language.Greek,
        Locale.Language.Hungarian, Locale.Language.Indonesian,
        Locale.Language.Italian, Locale.Language.Japanese,
        Locale.Language.Korean, Locale.Language.NorwegianNynorsk,
        Locale.Language.Polish, Locale.Language.Portuguese,
        Locale.Language.Romanian, Locale.Language.Russian,
        Locale.Language.Serbian, Locale.Language.Slovak,
        Locale.Language.Spanish, Locale.Language.Swedish, Locale.Language.Thai,
        Locale.Language.Turkish, Locale.Language.Vietnamese
    ]
    contributes_to = ['com.plexapp.agents.localmedia']

    def search(self,
               results,
               media,
               lang,
               manual=False,
               tree=None,
               primary=False):

        # Good match when being used as a secondary agent.
        if not primary:
            results.add(SearchResult(id=tree.id, score=100))
            return

        # Don't do automatic matching for this agent.
        if not manual:
            return

        album_results = []
        for fingerprint in ['0', '1']:
            album_search(tree,
                         media,
                         lang,
                         album_results,
                         fingerprint=fingerprint)

        seen = []
        Log(str(seen))
        for album_result in sorted(album_results,
                                   key=lambda a: a.score,
                                   reverse=True):
            if not (album_result.parentName, album_result.name) in seen:
                results.add(album_result)
                seen.append((album_result.parentName, album_result.name))

    def update(self, metadata, media, lang):

        Log('Updating album: ' + media.title)
        Log('With guid: ' + media.guid)

        # Even if this album itself is not a Gracenote album, we may have some tracks that came from one, or we may be post multi-disc merge.
        # Look through all the tracks for their parent GNIDs. Later, we'll load each one so we can update track data for everything.
        #
        album_gnids = set([
            track.guid.split('/')[-2] for track in media.children
            if 'com.plexapp.agents.plexmusic://gracenote' in track.guid
        ])

        if len(album_gnids) == 0:
            Log('Didn\'t find any tracks from Gracenote albums, aborting')
            return

        try:
            res = XML.ElementFromURL(
                'http://127.0.0.1:32400/services/gracenote/update?guid=' +
                String.URLEncode(media.guid),
                timeout=60)
        except Exception, e:
            Log('Error issuing album update request: ' + str(e))
            return

        # Carry over the media title. This should always be set by the Premium Music scanner.
        if media.title is not None and len(media.title) > 0:
            metadata.title = media.title

        if Prefs['album_reviews']:
            metadata.summary = res.xpath('//Directory[@type="album"]')[0].get(
                'summary')

        metadata.studio = res.xpath('//Directory[@type="album"]')[0].get(
            'studio')

        if res.xpath('//Directory[@type="album"]')[0].get('year') is not None:
            metadata.originally_available_at = Datetime.ParseDate(
                res.xpath('//Directory[@type="album"]')[0].get('year') +
                '-01-01')

        # Try to get last.fm information.
        most_popular_tracks = {}
        try:
            # Look up the artist.
            lastfm_artist = find_lastfm_artist(media.parentTitle,
                                               [media.title], lang)

            # Get top tracks.
            top_tracks = find_lastfm_top_tracks(lastfm_artist, lang)
            for track in top_tracks:
                most_popular_tracks[track['name']] = int(track['playcount'])

            # Get the album.
            album = find_lastfm_album(
                lastfm_artist, metadata.title,
                res.xpath('//Directory[@type="album"]')[0].get('year'), lang)
            if album and album['releasedate']:
                metadata.originally_available_at = Datetime.ParseDate(
                    album['releasedate'].split(',')[0].strip())
        except:
            pass

        # Posters.
        try:
            poster_url = res.xpath('//Directory[@type="album"]')[0].get(
                'thumb')
            if len(poster_url) > 0:
                metadata.posters[0] = Proxy.Media(HTTP.Request(poster_url))
        except Exception, e:
            Log('Couldn\'t add album art: ' + str(e))
Exemple #4
0
    def update(self, metadata, media, lang):

        Log('Updating: %s (GUID: %s)' % (media.title, media.guid))

        posters = []
        arts = []

        # FIXME, not sure why metadata title isn't set when used as secondary agent.
        the_title = metadata.title or media.title

        # Special art for VA.
        if the_title == 'Various Artists':
            add_posters(
                ['http://music.plex.tv/pixogs/various_artists_poster.jpg'],
                metadata)
            add_art([[
                'http://music.plex.tv/pixogs/various_artists_art.jpg',
                'http://music.plex.tv/pixogs/various_artists_art.jpg'
            ]], metadata)
            return

        # Do nothing for unknown.
        elif the_title == '[Unknown Artist]':
            return

        gracenote_poster = None
        gracenote_guids = [
            c.guid for c in media.children
            if c.guid.startswith('com.plexapp.agents.plexmusic://gracenote/')
        ]
        if len(gracenote_guids) > 0:

            # Fetch an album (use the given child_guid if we have it) and use the artist data from that.
            res = XML.ElementFromURL(
                'http://127.0.0.1:32400/services/gracenote/update?guid=' +
                String.URLEncode(gracenote_guids[0]))

            # Artist name.
            if metadata.title is None and not media.title:
                metadata.title = res.xpath(
                    '//Directory[@type="album"]')[0].get('parentTitle')
            else:
                metadata.title = media.title
            the_title = metadata.title

            # Artist bio.
            metadata.summary = res.xpath('//Directory[@type="album"]')[0].get(
                'parentSummary')

            # Artist country.
            metadata.countries.clear()
            metadata.countries.add(
                res.xpath('//Directory[@type="album"]')[0].get(
                    'parentCountry'))

            # Artist poster.
            gracenote_poster = res.xpath('//Directory[@type="album"]')[0].get(
                'parentThumb')

            # Genres.
            add_genres(res, metadata)

        else:
            # We still need to make sure the title is set.
            metadata.title = media.title

        # Find artist posters and art from other sources.
        album_titles = [a.title for a in media.children]
        lastfm_artist = find_lastfm_artist(the_title, album_titles, lang)
        artist_mbid = artist_mbid_lookup(the_title, lastfm_artist)
        fanart_artist = find_fanart_artist(the_title, artist_mbid)

        metadata.similar.clear()
        metadata.concerts.clear()

        find_artist_posters(posters, the_title, lastfm_artist, fanart_artist)

        if lastfm_artist is not None:
            find_artist_art(arts, the_title, lastfm_artist, fanart_artist,
                            artist_mbid)

            # Find similar artists.
            similar_artists = find_lastfm_similar_artists(lastfm_artist, lang)

            if similar_artists is not None:
                for artist in similar_artists:
                    metadata.similar.add(artist['name'])

            # Find events
            if Prefs['concerts']:
                events = find_lastfm_events(lastfm_artist, lang)
                if events:
                    for event in events:
                        try:
                            concert = metadata.concerts.new()
                            concert.title = event['title']
                            concert.venue = event['venue']['name']
                            concert.city = event['venue']['location']['city']
                            concert.country = event['venue']['location'][
                                'country']
                            concert.date = Datetime.ParseDate(
                                event['startDate'], '%Y-%m-%d %H:%M:00')
                            concert.url = lastfm_artist['url'] + '/+events'
                        except:
                            pass

        # If we had a Gracenote poster, add it last.
        if gracenote_poster is not None and len(gracenote_poster) > 0:
            posters.append(gracenote_poster)

        # If we didn't get an artist summary, try to get one from Last.FM.
        if lastfm_artist is not None and (metadata.summary is None
                                          or len(metadata.summary) == 0):
            metadata.summary = String.DecodeHTMLEntities(
                String.StripTags(
                    lastfm_artist['bio']['content']
                    [:lastfm_artist['bio']['content'].find('\n\n')]).strip())

        # Add posters.
        add_posters(posters, metadata)

        # Add art.
        add_art(arts, metadata)