def _update_cache(self): """ Since we call the same url for both info and artwork, we'll update both at the same time """ myDB = db.DBConnection() if self.id_type == 'artist': try: data = Artist.get(id=self.id) except Exception as e: dbartist = myDB.action( 'SELECT ArtistName, Type FROM artists WHERE ArtistID=?', [self.id]).fetchone()[0] if dbartist: logger.debug('Fanart.tv artist lookup error for %s: %s', dbartist, e) logger.debug('Stored id for %s is: %s', dbartist, self.id) else: logger.debug('Fanart.tv artist lookup error for %s: %s', self.id, e) return artist_url = None thumb_url = None image_url = None if data.thumbs: for thumbs in data.thumbs[0:1]: artist_url = str(thumbs.url) if artist_url: thumb_url = artist_url.replace('fanart/', 'preview/') image_url = thumb_url logger.debug('Fanart.tv artist image url: %s', thumb_url) else: logger.debug('Fanart.tv no artist image found for: %s', self.id) data = lastfm.request_lastfm("artist.getinfo", mbid=self.id, api_key=LASTFM_API_KEY) # Try with name if not found if not data: dbartist = myDB.action( 'SELECT ArtistName, Type FROM artists WHERE ArtistID=?', [self.id]).fetchone()[0] if dbartist: data = lastfm.request_lastfm( "artist.getinfo", artist=helpers.clean_musicbrainz_name( dbartist['ArtistName']), api_key=LASTFM_API_KEY) if not data: logger.debug('Last.fm connection cannot be made') try: self.info_summary = data['artist']['bio']['summary'] except KeyError: logger.debug('No artist bio summary found') self.info_summary = None try: self.info_content = data['artist']['bio']['content'] except KeyError: logger.debug('No artist bio found') self.info_content = None else: # get ArtistID from AlbumID lookup - ArtistID not passed into this function otherwise myDB = db.DBConnection() ArtistID = myDB.action( 'SELECT ArtistID FROM albums WHERE ReleaseID=?', [self.id]).fetchone()[0] try: data = Artist.get(id=ArtistID) except Exception as e: dbartist = myDB.action( 'SELECT ArtistName, Type FROM artists WHERE ArtistID=?', [ArtistID]).fetchone()[0] if dbartist: logger.debug('Fanart.tv artist lookup error for %s: %s', dbartist, e) logger.debug('Stored id for %s is: %s', dbartist, ArtistID) else: logger.debug('Fanart.tv artist lookup error for %s: %s', ArtistID, e) return album_url = None thumb_url = None image_url = None if data.albums: for x in data.albums: if x.mbid == self.id: album_url = str(x.covers[0]) if album_url: thumb_url = album_url.replace('fanart/', 'preview/') image_url = thumb_url logger.debug('Fanart.tv album url: %s', thumb_url) else: logger.debug('Fanart.tv no album image found for: %s', self.id) # Save the image URL to the database if image_url: if self.id_type == 'artist': myDB.action('UPDATE artists SET ArtworkURL=? WHERE ArtistID=?', [image_url, self.id]) else: myDB.action('UPDATE albums SET ArtworkURL=? WHERE AlbumID=?', [image_url, self.id]) # Save the thumb URL to the database if thumb_url: if self.id_type == 'artist': myDB.action('UPDATE artists SET ThumbURL=? WHERE ArtistID=?', [thumb_url, self.id]) else: myDB.action('UPDATE albums SET ThumbURL=? WHERE AlbumID=?', [thumb_url, self.id]) # Should we grab the artwork here if we're just grabbing thumbs or # info? Probably not since the files can be quite big # With fanart.tv only one url is used for both thumb_url and image_url - so only making one request # If seperate ones are desired in the future, the artwork vars below will need to be uncommented if image_url is not None: artwork = request.request_content(image_url, timeout=20) if image_url and self.query_type == 'artwork': # artwork = request.request_content(image_url, timeout=20) if artwork: # Make sure the artwork dir exists: if not os.path.isdir(self.path_to_art_cache): try: os.makedirs(self.path_to_art_cache) os.chmod(self.path_to_art_cache, int(headphones.CONFIG.FOLDER_PERMISSIONS, 8)) except OSError as e: logger.error( 'Unable to create artwork cache dir. Error: %s', e) self.artwork_errors = True self.artwork_url = image_url # Delete the old stuff for artwork_file in self.artwork_files: try: os.remove(artwork_file) except: logger.error('Error deleting file from the cache: %s', artwork_file) ext = os.path.splitext(image_url)[1] artwork_path = os.path.join( self.path_to_art_cache, self.id + '.' + helpers.today() + ext) try: with open(artwork_path, 'wb') as f: f.write(artwork) os.chmod(artwork_path, int(headphones.CONFIG.FILE_PERMISSIONS, 8)) except (OSError, IOError) as e: logger.error('Unable to write to the cache dir: %s', e) self.artwork_errors = True self.artwork_url = image_url # Grab the thumbnail as well if we're getting the full artwork (as long # as it's missing/outdated. if thumb_url and self.query_type in [ 'thumb', 'artwork' ] and not (self.thumb_files and self._is_current(self.thumb_files[0])): # artwork = request.request_content(thumb_url, timeout=20) if artwork: # Make sure the artwork dir exists: if not os.path.isdir(self.path_to_art_cache): try: os.makedirs(self.path_to_art_cache) os.chmod(self.path_to_art_cache, int(headphones.CONFIG.FOLDER_PERMISSIONS, 8)) except OSError as e: logger.error( 'Unable to create artwork cache dir. Error: %s' + e) self.thumb_errors = True self.thumb_url = thumb_url # Delete the old stuff for thumb_file in self.thumb_files: try: os.remove(thumb_file) except OSError as e: logger.error('Error deleting file from the cache: %s', thumb_file) ext = os.path.splitext(image_url)[1] thumb_path = os.path.join( self.path_to_art_cache, 'T_' + self.id + '.' + helpers.today() + ext) try: with open(thumb_path, 'wb') as f: f.write(artwork) os.chmod(thumb_path, int(headphones.CONFIG.FILE_PERMISSIONS, 8)) except (OSError, IOError) as e: logger.error('Unable to write to the cache dir: %s', e) self.thumb_errors = True self.thumb_url = image_url dbalbum = myDB.action( 'SELECT ArtistName, AlbumTitle, ReleaseID, Type FROM albums WHERE AlbumID=?', [self.id]).fetchone() if dbalbum: if dbalbum['ReleaseID'] != self.id: data = lastfm.request_lastfm("album.getinfo", mbid=dbalbum['ReleaseID'], api_key=LASTFM_API_KEY) if not data: data = lastfm.request_lastfm( "album.getinfo", artist=helpers.clean_musicbrainz_name( dbalbum['ArtistName']), album=helpers.clean_musicbrainz_name( dbalbum['AlbumTitle']), api_key=LASTFM_API_KEY) else: if dbalbum['Type'] != "part of": data = lastfm.request_lastfm( "album.getinfo", artist=helpers.clean_musicbrainz_name( dbalbum['ArtistName']), album=helpers.clean_musicbrainz_name( dbalbum['AlbumTitle']), api_key=LASTFM_API_KEY) else: # Series, use actual artist for the release-group artist = mb.getArtistForReleaseGroup(self.id) if artist: data = lastfm.request_lastfm( "album.getinfo", artist=helpers.clean_musicbrainz_name(artist), album=helpers.clean_musicbrainz_name( dbalbum['AlbumTitle']), api_key=LASTFM_API_KEY) if not data: logger.debug('Last.fm connection cannot be made') try: self.info_summary = data['album']['wiki']['summary'] except KeyError: logger.debug('No album summary found') self.info_summary = None try: self.info_content = data['album']['wiki']['content'] except KeyError: logger.debug('No album infomation found') self.info_content = None # Save the content & summary to the database no matter what if we've # opened up the url if self.id_type == 'artist': controlValueDict = {"ArtistID": self.id} else: controlValueDict = {"ReleaseGroupID": self.id} newValueDict = { "Summary": self.info_summary, "Content": self.info_content, "LastUpdated": helpers.today() } myDB.upsert("descriptions", newValueDict, controlValueDict)
def _update_cache(self): """ Since we call the same url for both info and artwork, we'll update both at the same time """ myDB = db.DBConnection() # Since lastfm uses release ids rather than release group ids for albums, we have to do a artist + album search for albums # Exception is when adding albums manually, then we should use release id if self.id_type == 'artist': data = lastfm.request_lastfm("artist.getinfo", mbid=self.id, api_key=LASTFM_API_KEY) # Try with name if not found if not data: dbartist = myDB.action('SELECT ArtistName, Type FROM artists WHERE ArtistID=?', [self.id]).fetchone() if dbartist: data = lastfm.request_lastfm("artist.getinfo", artist=helpers.clean_musicbrainz_name(dbartist['ArtistName']), api_key=LASTFM_API_KEY) if not data: return try: self.info_summary = data['artist']['bio']['summary'] except KeyError: logger.debug('No artist bio summary found') self.info_summary = None try: self.info_content = data['artist']['bio']['content'] except KeyError: logger.debug('No artist bio found') self.info_content = None try: image_url = data['artist']['image'][-1]['#text'] except KeyError: logger.debug('No artist image found') image_url = None thumb_url = self._get_thumb_url(data) if not thumb_url: logger.debug('No artist thumbnail image found') else: dbalbum = myDB.action( 'SELECT ArtistName, AlbumTitle, ReleaseID, Type FROM albums WHERE AlbumID=?', [self.id]).fetchone() if dbalbum['ReleaseID'] != self.id: data = lastfm.request_lastfm("album.getinfo", mbid=dbalbum['ReleaseID'], api_key=LASTFM_API_KEY) if not data: data = lastfm.request_lastfm("album.getinfo", artist=helpers.clean_musicbrainz_name(dbalbum['ArtistName']), album=helpers.clean_musicbrainz_name(dbalbum['AlbumTitle']), api_key=LASTFM_API_KEY) else: if dbalbum['Type'] != "part of": data = lastfm.request_lastfm("album.getinfo", artist=helpers.clean_musicbrainz_name(dbalbum['ArtistName']), album=helpers.clean_musicbrainz_name(dbalbum['AlbumTitle']), api_key=LASTFM_API_KEY) else: # Series, use actual artist for the release-group artist = mb.getArtistForReleaseGroup(self.id) if artist: data = lastfm.request_lastfm("album.getinfo", artist=helpers.clean_musicbrainz_name(artist), album=helpers.clean_musicbrainz_name(dbalbum['AlbumTitle']), api_key=LASTFM_API_KEY) if not data: return try: self.info_summary = data['album']['wiki']['summary'] except KeyError: logger.debug('No album summary found') self.info_summary = None try: self.info_content = data['album']['wiki']['content'] except KeyError: logger.debug('No album infomation found') self.info_content = None try: image_url = data['album']['image'][-1]['#text'] except KeyError: logger.debug('No album image link found') image_url = None thumb_url = self._get_thumb_url(data) if not thumb_url: logger.debug('No album thumbnail image found') # Save the content & summary to the database no matter what if we've # opened up the url if self.id_type == 'artist': controlValueDict = {"ArtistID": self.id} else: controlValueDict = {"ReleaseGroupID": self.id} newValueDict = {"Summary": self.info_summary, "Content": self.info_content, "LastUpdated": helpers.today()} myDB.upsert("descriptions", newValueDict, controlValueDict) # Save the image URL to the database if image_url: if self.id_type == 'artist': myDB.action('UPDATE artists SET ArtworkURL=? WHERE ArtistID=?', [image_url, self.id]) else: myDB.action('UPDATE albums SET ArtworkURL=? WHERE AlbumID=?', [image_url, self.id]) # Save the thumb URL to the database if thumb_url: if self.id_type == 'artist': myDB.action('UPDATE artists SET ThumbURL=? WHERE ArtistID=?', [thumb_url, self.id]) else: myDB.action('UPDATE albums SET ThumbURL=? WHERE AlbumID=?', [thumb_url, self.id]) # Should we grab the artwork here if we're just grabbing thumbs or # info? Probably not since the files can be quite big if image_url and self.query_type == 'artwork': artwork = request.request_content(image_url, timeout=20) if artwork: # Make sure the artwork dir exists: if not os.path.isdir(self.path_to_art_cache): try: os.makedirs(self.path_to_art_cache) os.chmod(self.path_to_art_cache, int(headphones.CONFIG.FOLDER_PERMISSIONS, 8)) except OSError as e: logger.error('Unable to create artwork cache dir. Error: %s', e) self.artwork_errors = True self.artwork_url = image_url # Delete the old stuff for artwork_file in self.artwork_files: try: os.remove(artwork_file) except: logger.error('Error deleting file from the cache: %s', artwork_file) ext = os.path.splitext(image_url)[1] artwork_path = os.path.join(self.path_to_art_cache, self.id + '.' + helpers.today() + ext) try: with open(artwork_path, 'wb') as f: f.write(artwork) os.chmod(artwork_path, int(headphones.CONFIG.FILE_PERMISSIONS, 8)) except (OSError, IOError) as e: logger.error('Unable to write to the cache dir: %s', e) self.artwork_errors = True self.artwork_url = image_url # Grab the thumbnail as well if we're getting the full artwork (as long # as it's missing/outdated. if thumb_url and self.query_type in ['thumb', 'artwork'] and not ( self.thumb_files and self._is_current(self.thumb_files[0])): artwork = request.request_content(thumb_url, timeout=20) if artwork: # Make sure the artwork dir exists: if not os.path.isdir(self.path_to_art_cache): try: os.makedirs(self.path_to_art_cache) os.chmod(self.path_to_art_cache, int(headphones.CONFIG.FOLDER_PERMISSIONS, 8)) except OSError as e: logger.error('Unable to create artwork cache dir. Error: %s' + e) self.thumb_errors = True self.thumb_url = thumb_url # Delete the old stuff for thumb_file in self.thumb_files: try: os.remove(thumb_file) except OSError as e: logger.error('Error deleting file from the cache: %s', thumb_file) ext = os.path.splitext(image_url)[1] thumb_path = os.path.join(self.path_to_art_cache, 'T_' + self.id + '.' + helpers.today() + ext) try: with open(thumb_path, 'wb') as f: f.write(artwork) os.chmod(thumb_path, int(headphones.CONFIG.FILE_PERMISSIONS, 8)) except (OSError, IOError) as e: logger.error('Unable to write to the cache dir: %s', e) self.thumb_errors = True self.thumb_url = image_url
def _update_cache(self): """ Since we call the same url for both info and artwork, we'll update both at the same time """ myDB = db.DBConnection() fanart = False # Since lastfm uses release ids rather than release group ids for albums, we have to do a artist + album search for albums # Exception is when adding albums manually, then we should use release id if self.id_type == 'artist': data = lastfm.request_lastfm("artist.getinfo", mbid=self.id, api_key=LASTFM_API_KEY) # Try with name if not found if not data: dbartist = myDB.action( 'SELECT ArtistName, Type FROM artists WHERE ArtistID=?', [self.id]).fetchone() if dbartist: data = lastfm.request_lastfm( "artist.getinfo", artist=helpers.clean_musicbrainz_name( dbartist['ArtistName']), api_key=LASTFM_API_KEY) if not data: return try: self.info_summary = data['artist']['bio']['summary'] except KeyError: logger.debug('No artist bio summary found') self.info_summary = None try: self.info_content = data['artist']['bio']['content'] except KeyError: logger.debug('No artist bio found') self.info_content = None # 2019 last.fm no longer allows access to artist images, try fanart.tv instead image_url = None thumb_url = None data = request.request_json(FANART_URL + self.id, whitelist_status_code=404, headers={ 'api-key': FANART_PROJECT_KEY, 'client-key': FANART_CLIENT_KEY }) if data.get('artistthumb'): image_url = data['artistthumb'][0]['url'] elif data.get('artistbackground'): image_url = data['artistbackground'][0]['url'] # elif data.get('hdmusiclogo'): # image_url = data['hdmusiclogo'][0]['url'] # fallback to 1st album cover if none of the above elif 'albums' in data: for mbid, art in data.get('albums', dict()).items(): if 'albumcover' in art: image_url = art['albumcover'][0]['url'] break # finally, use 1st album cover from last.fm if image_url: fanart = True thumb_url = image_url else: dbalbum = myDB.action( 'SELECT ArtworkURL, ThumbURL FROM albums WHERE ArtworkURL IS NOT NULL AND ArtistID=?', [self.id]).fetchone() if dbalbum: fanart = True image_url = dbalbum['ArtworkURL'] thumb_url = dbalbum['ThumbURL'] if not image_url: logger.debug( 'No artist image found on fanart.tv for Artist Id: %s', self.id) else: dbalbum = myDB.action( 'SELECT ArtistName, AlbumTitle, ReleaseID, Type FROM albums WHERE AlbumID=?', [self.id]).fetchone() if dbalbum['ReleaseID'] != self.id: data = lastfm.request_lastfm("album.getinfo", mbid=dbalbum['ReleaseID'], api_key=LASTFM_API_KEY) if not data: data = lastfm.request_lastfm( "album.getinfo", artist=helpers.clean_musicbrainz_name( dbalbum['ArtistName']), album=helpers.clean_musicbrainz_name( dbalbum['AlbumTitle']), api_key=LASTFM_API_KEY) else: if dbalbum['Type'] != "part of": data = lastfm.request_lastfm( "album.getinfo", artist=helpers.clean_musicbrainz_name( dbalbum['ArtistName']), album=helpers.clean_musicbrainz_name( dbalbum['AlbumTitle']), api_key=LASTFM_API_KEY) else: # Series, use actual artist for the release-group artist = mb.getArtistForReleaseGroup(self.id) if artist: data = lastfm.request_lastfm( "album.getinfo", artist=helpers.clean_musicbrainz_name(artist), album=helpers.clean_musicbrainz_name( dbalbum['AlbumTitle']), api_key=LASTFM_API_KEY) if not data: return try: self.info_summary = data['album']['wiki']['summary'] except KeyError: logger.debug('No album summary found') self.info_summary = None try: self.info_content = data['album']['wiki']['content'] except KeyError: logger.debug('No album infomation found') self.info_content = None try: image_url = data['album']['image'][-1]['#text'] except KeyError: logger.debug('No album image link found') image_url = None thumb_url = self._get_thumb_url(data) if not thumb_url: logger.debug('No album thumbnail image found') # Save the content & summary to the database no matter what if we've # opened up the url if self.id_type == 'artist': controlValueDict = {"ArtistID": self.id} else: controlValueDict = {"ReleaseGroupID": self.id} newValueDict = { "Summary": self.info_summary, "Content": self.info_content, "LastUpdated": helpers.today() } myDB.upsert("descriptions", newValueDict, controlValueDict) # Save the image URL to the database if image_url: if self.id_type == 'artist': myDB.action('UPDATE artists SET ArtworkURL=? WHERE ArtistID=?', [image_url, self.id]) else: myDB.action('UPDATE albums SET ArtworkURL=? WHERE AlbumID=?', [image_url, self.id]) # Save the thumb URL to the database if thumb_url: if self.id_type == 'artist': myDB.action('UPDATE artists SET ThumbURL=? WHERE ArtistID=?', [thumb_url, self.id]) else: myDB.action('UPDATE albums SET ThumbURL=? WHERE AlbumID=?', [thumb_url, self.id]) # Should we grab the artwork here if we're just grabbing thumbs or # info? Probably not since the files can be quite big if image_url and self.query_type == 'artwork': artwork = request.request_content(image_url, timeout=20) if artwork: # Make sure the artwork dir exists: if not os.path.isdir(self.path_to_art_cache): try: os.makedirs(self.path_to_art_cache) os.chmod(self.path_to_art_cache, int(headphones.CONFIG.FOLDER_PERMISSIONS, 8)) except OSError as e: logger.error( 'Unable to create artwork cache dir. Error: %s', e) self.artwork_errors = True self.artwork_url = image_url # Delete the old stuff for artwork_file in self.artwork_files: try: os.remove(artwork_file) except: logger.error('Error deleting file from the cache: %s', artwork_file) ext = os.path.splitext(image_url)[1] if fanart: artwork_path = os.path.join( self.path_to_art_cache, self.id + '_fanart_' + '.' + helpers.today() + ext) else: artwork_path = os.path.join( self.path_to_art_cache, self.id + '.' + helpers.today() + ext) try: with open(artwork_path, 'wb') as f: f.write(artwork) os.chmod(artwork_path, int(headphones.CONFIG.FILE_PERMISSIONS, 8)) except (OSError, IOError) as e: logger.error('Unable to write to the cache dir: %s', e) self.artwork_errors = True self.artwork_url = image_url # Grab the thumbnail as well if we're getting the full artwork (as long # as it's missing/outdated. if thumb_url and self.query_type in [ 'thumb', 'artwork' ] and not (self.thumb_files and self._is_current(self.thumb_files[0])): if not (self.query_type == 'artwork' and 'fanart' in thumb_url and artwork): artwork = request.request_content(thumb_url, timeout=20) if artwork: # Make sure the artwork dir exists: if not os.path.isdir(self.path_to_art_cache): try: os.makedirs(self.path_to_art_cache) os.chmod(self.path_to_art_cache, int(headphones.CONFIG.FOLDER_PERMISSIONS, 8)) except OSError as e: logger.error( 'Unable to create artwork cache dir. Error: %s' + e) self.thumb_errors = True self.thumb_url = thumb_url # Delete the old stuff for thumb_file in self.thumb_files: try: os.remove(thumb_file) except OSError as e: logger.error('Error deleting file from the cache: %s', thumb_file) ext = os.path.splitext(image_url)[1] if fanart: thumb_path = os.path.join( self.path_to_art_cache, 'T_' + self.id + '_fanart_' + '.' + helpers.today() + ext) else: thumb_path = os.path.join( self.path_to_art_cache, 'T_' + self.id + '.' + helpers.today() + ext) try: if self.id_type != 'artist': with open(thumb_path, 'wb') as f: f.write(artwork) else: # 2019 last.fm no longer allows access to artist images, use the fanart.tv image to create a thumb artwork_thumb = None if 'fanart' in thumb_url: # Create thumb using image resizing service artwork_path = '{0}?{1}'.format( 'http://images.weserv.nl/', urlencode({ 'url': thumb_url.replace('http://', ''), 'w': 300, })) artwork_thumb = request.request_content( artwork_path, timeout=20, whitelist_status_code=404) if artwork_thumb: with open(thumb_path, 'wb') as f: f.write(artwork_thumb) else: with open(thumb_path, 'wb') as f: f.write(artwork) os.chmod(thumb_path, int(headphones.CONFIG.FILE_PERMISSIONS, 8)) except (OSError, IOError) as e: logger.error('Unable to write to the cache dir: %s', e) self.thumb_errors = True self.thumb_url = image_url
def _update_cache(self): """ Since we call the same url for both info and artwork, we'll update both at the same time """ myDB = db.DBConnection() # Since lastfm uses release ids rather than release group ids for albums, we have to do a artist + album search for albums # Exception is when adding albums manually, then we should use release id if self.id_type == 'artist': data = lastfm.request_lastfm("artist.getinfo", mbid=self.id, api_key=LASTFM_API_KEY) # Try with name if not found if not data: dbartist = myDB.action( 'SELECT ArtistName, Type FROM artists WHERE ArtistID=?', [self.id]).fetchone() if dbartist: data = lastfm.request_lastfm( "artist.getinfo", artist=helpers.clean_musicbrainz_name( dbartist['ArtistName']), api_key=LASTFM_API_KEY) if not data: return try: self.info_summary = data['artist']['bio']['summary'] except KeyError: logger.debug('No artist bio summary found') self.info_summary = None try: self.info_content = data['artist']['bio']['content'] except KeyError: logger.debug('No artist bio found') self.info_content = None try: image_url = data['artist']['image'][-1]['#text'] except KeyError: logger.debug('No artist image found') image_url = None thumb_url = self._get_thumb_url(data) if not thumb_url: logger.debug('No artist thumbnail image found') else: dbalbum = myDB.action( 'SELECT ArtistName, AlbumTitle, ReleaseID, Type FROM albums WHERE AlbumID=?', [self.id]).fetchone() if dbalbum['ReleaseID'] != self.id: data = lastfm.request_lastfm("album.getinfo", mbid=dbalbum['ReleaseID'], api_key=LASTFM_API_KEY) if not data: data = lastfm.request_lastfm( "album.getinfo", artist=helpers.clean_musicbrainz_name( dbalbum['ArtistName']), album=helpers.clean_musicbrainz_name( dbalbum['AlbumTitle']), api_key=LASTFM_API_KEY) else: if dbalbum['Type'] != "part of": data = lastfm.request_lastfm( "album.getinfo", artist=helpers.clean_musicbrainz_name( dbalbum['ArtistName']), album=helpers.clean_musicbrainz_name( dbalbum['AlbumTitle']), api_key=LASTFM_API_KEY) else: # Series, use actual artist for the release-group artist = mb.getArtistForReleaseGroup(self.id) if artist: data = lastfm.request_lastfm( "album.getinfo", artist=helpers.clean_musicbrainz_name(artist), album=helpers.clean_musicbrainz_name( dbalbum['AlbumTitle']), api_key=LASTFM_API_KEY) if not data: return try: self.info_summary = data['album']['wiki']['summary'] except KeyError: logger.debug('No album summary found') self.info_summary = None try: self.info_content = data['album']['wiki']['content'] except KeyError: logger.debug('No album infomation found') self.info_content = None try: image_url = data['album']['image'][-1]['#text'] except KeyError: logger.debug('No album image link found') image_url = None thumb_url = self._get_thumb_url(data) if not thumb_url: logger.debug('No album thumbnail image found') # Save the content & summary to the database no matter what if we've # opened up the url if self.id_type == 'artist': controlValueDict = {"ArtistID": self.id} else: controlValueDict = {"ReleaseGroupID": self.id} newValueDict = { "Summary": self.info_summary, "Content": self.info_content, "LastUpdated": helpers.today() } myDB.upsert("descriptions", newValueDict, controlValueDict) # Save the image URL to the database if image_url: if self.id_type == 'artist': myDB.action('UPDATE artists SET ArtworkURL=? WHERE ArtistID=?', [image_url, self.id]) else: myDB.action('UPDATE albums SET ArtworkURL=? WHERE AlbumID=?', [image_url, self.id]) # Save the thumb URL to the database if thumb_url: if self.id_type == 'artist': myDB.action('UPDATE artists SET ThumbURL=? WHERE ArtistID=?', [thumb_url, self.id]) else: myDB.action('UPDATE albums SET ThumbURL=? WHERE AlbumID=?', [thumb_url, self.id]) # Should we grab the artwork here if we're just grabbing thumbs or # info? Probably not since the files can be quite big if image_url and self.query_type == 'artwork': artwork = request.request_content(image_url, timeout=20) if artwork: # Make sure the artwork dir exists: if not os.path.isdir(self.path_to_art_cache): try: os.makedirs(self.path_to_art_cache) os.chmod(self.path_to_art_cache, int(headphones.CONFIG.FOLDER_PERMISSIONS, 8)) except OSError as e: logger.error( 'Unable to create artwork cache dir. Error: %s', e) self.artwork_errors = True self.artwork_url = image_url # Delete the old stuff for artwork_file in self.artwork_files: try: os.remove(artwork_file) except: logger.error('Error deleting file from the cache: %s', artwork_file) ext = os.path.splitext(image_url)[1] artwork_path = os.path.join( self.path_to_art_cache, self.id + '.' + helpers.today() + ext) try: with open(artwork_path, 'wb') as f: f.write(artwork) os.chmod(artwork_path, int(headphones.CONFIG.FILE_PERMISSIONS, 8)) except (OSError, IOError) as e: logger.error('Unable to write to the cache dir: %s', e) self.artwork_errors = True self.artwork_url = image_url # Grab the thumbnail as well if we're getting the full artwork (as long # as it's missing/outdated. if thumb_url and self.query_type in [ 'thumb', 'artwork' ] and not (self.thumb_files and self._is_current(self.thumb_files[0])): artwork = request.request_content(thumb_url, timeout=20) if artwork: # Make sure the artwork dir exists: if not os.path.isdir(self.path_to_art_cache): try: os.makedirs(self.path_to_art_cache) os.chmod(self.path_to_art_cache, int(headphones.CONFIG.FOLDER_PERMISSIONS, 8)) except OSError as e: logger.error( 'Unable to create artwork cache dir. Error: %s' + e) self.thumb_errors = True self.thumb_url = thumb_url # Delete the old stuff for thumb_file in self.thumb_files: try: os.remove(thumb_file) except OSError as e: logger.error('Error deleting file from the cache: %s', thumb_file) ext = os.path.splitext(image_url)[1] thumb_path = os.path.join( self.path_to_art_cache, 'T_' + self.id + '.' + helpers.today() + ext) try: with open(thumb_path, 'wb') as f: f.write(artwork) os.chmod(thumb_path, int(headphones.CONFIG.FILE_PERMISSIONS, 8)) except (OSError, IOError) as e: logger.error('Unable to write to the cache dir: %s', e) self.thumb_errors = True self.thumb_url = image_url