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
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)
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))
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)