def download_cover(imgs, cover_path): if utils.exist_check(cover_path): pass else: logger_bugs.info("Downloading cover artwork.") cover_url = imgs[config.prefs['cover_size']] r = requests.get(cover_url) r.raise_for_status() with open(cover_path, 'wb') as f: f.write(r.content)
def download_cover(cover_url, path): """ :param cover_url: Direct url to the cover artwork :param path: Path to download the cover to """ path = os.path.join(path, prefs['cover_name']) if not utils.exist_check(path): r = client.session.get(cover_url) with open(path, 'wb') as f: f.write(r.content)
def album_rip(album_id): """ :param id: String (Album ID) """ meta = client.get_meta(type="album", id=int(album_id)) # Check for multiple artists. if meta['list'][0]['album_info']['result']['multi_artist_yn'] == "Y": # Label V.A. if amount of artists > 2 if meta['list'][0]['album_info']['result']['artist_disp_nm'].count(",") > 2: meta['list'][0]['album_info']['result']['artist_disp_nm'] = "Various Artists" album_directory_name = "{} - {} [{}]".format(meta['list'][0]['album_info']['result']['artist_disp_nm'], meta['list'][0]['album_info']['result']['title'].strip(), utils.get_date(meta['list'][0]['album_info']['result']['release_ymd'])) # Check for availability. if meta['list'][0]['album_info']['result']['is_album_str_noright']: logger_bugs.warning('No streaming rights for {}.'.format(album_directory_name)) else: logger_bugs.info("Album: {}.".format(album_directory_name)) if config.prefs['artist_folders']: album_path = utils.sanitize(os.path.join(config.prefs['downloads_directory'], meta['list'][0]['album_info']['result']['artist_disp_nm'], album_directory_name)) else: album_path = utils.sanitize(os.path.join(config.prefs['downloads_directory'], album_directory_name)) utils.make_dir(album_path) cover_path = os.path.join(album_path, config.prefs['cover_name']) try: download_cover(meta['list'][0]['album_info']['result']['img_urls'], cover_path) # If we're unable to request from the url we'll set the cover_path to False except requests.exceptions.HTTPError: cover_path = False for track in meta['list'][0]['album_info']['result']['tracks']: # Check for availability. if not track['track_str_rights']: logger_bugs.warning('No streaming rights for #{} - {}.'.format(track['track_no'], track['track_title'])) else: track_quality = utils.determine_quality(track=track) pre_path = os.path.join(album_path, "{}. .BugsPy".format(track['track_no'])) post_path = utils.sanitize(os.path.join(album_path, "{}. {}.{}".format(track['track_no'], track['track_title'], track_quality))) if utils.exist_check(post_path): logger_bugs.info("{} already exists.".format(post_path)) else: download_track(pre_path=pre_path, track_id=track['track_id'], track_title=track['track_title'], track_number=track['track_no']) os.rename(pre_path, post_path) try: tag(album=meta, track=track, file_path=post_path, cover_path=cover_path) # TODO: Come back to this exception and implement a better solution on f_file.save() within tag() except error: logger_bugs.warning("_writeblock error, falling back to a smaller cover artwork.") config.prefs['cover_size'] = "500" cover_path = os.path.join(album_path, "fallback_cover.jpg") download_cover(meta['list'][0]['album_info']['result']['img_urls'], cover_path) tag(album=meta, track=track, file_path=post_path, cover_path=cover_path)
def track_rip(track_id): meta = client.get_meta(type="track", id=int(track_id)) track = meta['list'][0]['track_detail']['result']['track'] logger_bugs.info("Artist: {} | Track: {}".format(track['artist_nm'], track['track_title'])) track_quality = utils.determine_quality(track=track) album_path = os.path.join(config.prefs['downloads_directory']) pre_path = os.path.join(album_path, "{}. .BugsPy".format(track['track_no'])) post_path = os.path.join( album_path, utils.sanitize("{}. {}.{}".format(track['track_no'], track['track_title'], track_quality))) if utils.exist_check(post_path): logger_bugs.info("{} already exists.".format(post_path)) else: download_track(pre_path=pre_path, track_id=track['track_id'], track_title=track['track_title'], track_number=track['track_no']) os.rename(pre_path, post_path) # Fetch the album meta of the track, this is required for proper tagging. meta = client.get_meta(type="album", id=int(track['album_id'])) # Download album artwork cover_path = os.path.join(album_path, config.prefs['cover_name']) try: download_cover(meta['list'][0]['album_info']['result']['img_urls'], cover_path) # If we're unable to request from the url we'll set the cover_path to False except requests.exceptions.HTTPError: cover_path = False try: tag(album=meta, track=track, file_path=post_path, cover_path=cover_path) # TODO: Come back to this exception and implement a better solution on f_file.save() within tag() except error: logger_bugs.warning( "_writeblock error, falling back to a smaller cover artwork.") config.prefs['cover_size'] = "500" cover_path = os.path.join(album_path, "fallback_cover.jpg") download_cover(meta['list'][0]['album_info']['result']['img_urls'], cover_path) tag(album=meta, track=track, file_path=post_path, cover_path=cover_path)
def main(): """ Main function which will control the flow of our script when called. """ total = len(args.u) for n, url in enumerate(args.u, 1): logger_genie.info("Album {} of {}".format(n, total)) album_id = utils.check_url(url) if not album_id: return meta = client.get_meta(album_id) album_fol = "{} - {}".format( parse.unquote(meta['DATA0']['DATA'][0]['ARTIST_NAME']), parse.unquote(meta['DATA0']['DATA'][0]['ALBUM_NAME'])) if prefs['artist_folders']: album_fol_abs = os.path.join( os.path.dirname(__file__), prefs['download_directory'], parse.unquote( utils.sanitize(meta['DATA0']['DATA'][0]['ARTIST_NAME'])), utils.sanitize(album_fol)) else: album_fol_abs = os.path.join(os.path.dirname(__file__), prefs['download_directory'], utils.sanitize(album_fol)) logger_genie.info("Album found: " + album_fol) utils.make_dir(album_fol_abs) cover_url = parse.unquote( meta['DATA0']['DATA'][0]['ALBUM_IMG_PATH_600']) download_cover(cover_url, album_fol_abs) f_meta = { "track_total": len(meta['DATA1']['DATA']), "album_artist": parse.unquote(meta['DATA0']['DATA'][0]['ARTIST_NAME']), "release_date": meta['DATA0']['DATA'][0]['ALBUM_RELEASE_DT'], "planning": parse.unquote(meta['DATA0']['DATA'][0]['ALBUM_PLANNER']) } f_meta['disc_total'] = meta['DATA1']['DATA'][f_meta['track_total'] - 1]['ALBUM_CD_NO'] for track in meta['DATA1']['DATA']: try: s_meta = client.get_stream_meta(track['SONG_ID'], args.f) except HTTPError: logger_genie.warning("Could not get stream info for {}".format( track['SONG_ID'])) continue except exceptions.StreamMetadataError: continue cur = track['ROWNUM'] track_title = parse.unquote(track['SONG_NAME']) f_meta['track_artist'] = parse.unquote(track['ARTIST_NAME']) ext = utils.get_ext(s_meta['FILE_EXT']) post_abs = os.path.join( album_fol_abs, "{}. {}.{}".format(cur.zfill(2), utils.sanitize(track_title), ext)) if utils.exist_check(post_abs): continue if not utils.allowed_check(s_meta['STREAMING_LICENSE_YN']): continue pre_abs = os.path.join(album_fol_abs, cur + ".genie-dl") specs = utils.parse_specs(s_meta['FILE_EXT'], s_meta['FILE_BIT']) download_track(s_meta['STREAMING_MP3_URL'], track_title, pre_abs, cur, f_meta['track_total'], specs) try: fix_tags(pre_abs, ext, f_meta) logger_genie.debug("Tags updated: {}".format(f_meta)) except Exception as e: raise e try: os.rename(pre_abs, post_abs) logger_genie.debug("{} has been renamed".format(post_abs)) except OSError: raise exceptions.TrackRenameError( "Could not rename {}".format(pre_abs))