diff --git a/pinterest-downloader.py b/pinterest-downloader.py index 9af016b..1fc8bf9 100644 --- a/pinterest-downloader.py +++ b/pinterest-downloader.py @@ -38,6 +38,18 @@ try: import readline #to make input() edit-able by LEFT key except ModuleNotFoundError: pass + +try: + x_tag = 'βœ–' + done_tag = 'βœ”' + plus_tag = 'βž•' + pinterest_logo = 'πŸ…ΏοΈ' +except UnicodeEncodeError: + x_tag = 'x' + done_tag = 'DONE' + plus_tag = '+' + pinterest_logo = 'P' + import argparse import time from datetime import datetime, timedelta @@ -206,7 +218,7 @@ def get_pin_info(pin_id, arg_timestamp_log, arg_force_update, arg_dir, arg_cut, print('[i] Download Pin id: ' + str(images['id']) + ' in directory: ' + arg_dir) printProgressBar(0, 1, prefix='[...] Downloading:', suffix='Complete', length=50) download_img(images, arg_dir, arg_force_update, IMG_SESSION, V_SESSION, arg_cut, fs_f_max) - printProgressBar(1, 1, prefix='[βœ”] Downloaded:', suffix='Complete ', length=50) + printProgressBar(1, 1, prefix='[' + done_tag + '] Downloaded:', suffix='Complete ', length=50) except KeyError: return quit(traceback.format_exc()) print() @@ -309,10 +321,10 @@ def fetch_boards(uname): boards.extend(data['resource_response']['data']) bookmark = data['resource']['options']['bookmarks'][0] except TypeError: # Normal if invalid username - cprint(''.join([ HIGHER_RED, '%s' % ('\n[βœ–] Possible invalid username.\n\n') ]), end='' ) + cprint(''.join([ HIGHER_RED, '%s' % ('\n[' + x_tag + '] Possible invalid username.\n\n') ]), end='' ) break b_len = len(boards) - print('[βž•] Found {} Board{}.'.format(b_len, 's' if b_len > 1 else '')) + print('[' + plus_tag + '] Found {} Board{}.'.format(b_len, 's' if b_len > 1 else '')) return boards @@ -425,7 +437,7 @@ def download_img(image, save_dir, arg_force_update, IMG_SESSION, V_SESSION, arg_ # But for my code assume folder already there, so can use this trick pass except OSError: # e.g. File name too long - cprint(''.join([ HIGHER_RED, '%s %s %s %s%s' % ('\n[βœ–] Download this image at' + cprint(''.join([ HIGHER_RED, '%s %s %s %s%s' % ('\n[' + x_tag + '] Download this image at' , file_path, 'failed :', url, '\n') ]), end='' ) cprint(''.join([ HIGHER_RED, '%s' % ('\nYou may want to use -c \n\n') ]), end='' ) return quit(traceback.format_exc()) @@ -446,13 +458,13 @@ def download_img(image, save_dir, arg_force_update, IMG_SESSION, V_SESSION, arg_ f.write(chunk) except OSError: # e.g. File name too long - cprint(''.join([ HIGHER_RED, '%s %s %s %s%s' % ('\n[βœ–] Download this image at' + cprint(''.join([ HIGHER_RED, '%s %s %s %s%s' % ('\n[' + x_tag + '] Download this image at' , file_path, 'failed :', url, '\n') ]), end='' ) cprint(''.join([ HIGHER_RED, '%s' % ('\nYou may want to use -c \n\n') ]), end='' ) return quit(traceback.format_exc()) else: - #cprint(''.join([ HIGHER_RED, '%s %s %s %s%s' % ('\n[βœ–] Download this image at' + #cprint(''.join([ HIGHER_RED, '%s %s %s %s%s' % ('\n[' + x_tag + '] Download this image at' #, file_path, 'failed :', url, '\n') ]), end='' ) imgDimens = [] imgDimensD = {} @@ -477,17 +489,17 @@ def download_img(image, save_dir, arg_force_update, IMG_SESSION, V_SESSION, arg_ for chunk in r: f.write(chunk) except OSError: # e.g. File name too long - cprint(''.join([ HIGHER_RED, '%s %s %s %s%s' % ('\n[βœ–] Retried this image at' + cprint(''.join([ HIGHER_RED, '%s %s %s %s%s' % ('\n[' + x_tag + '] Retried this image at' , file_path, 'failed :', url, '\n') ]), end='' ) cprint(''.join([ HIGHER_RED, '%s' % ('\nYou may want to use -c \n\n') ]), end='' ) return quit(traceback.format_exc()) - #print('\n\n[βž•] ', end='') # konsole has issue if BOLD_ONLY with cprint with βž• + #print('\n\n[' + plus_tag + '] ', end='') # konsole has issue if BOLD_ONLY with cprint with plus_tag # Got case replace /originals/(detected is .png by imghdr)->covert to .png replace 736x bigger size than orig's png (but compare quality is not trivial), better use orig as first choice # e.g. https://www.pinterest.com/antonellomiglio/computer/ 's https://i.pinimg.com/736x/3d/f0/88/3df088200b94f0b6b8325ae0a118b401--apple-computer-next-computer.jpg #cprint('\nRetried with second best quality url success :D {} saved to {}\n'.format(url, file_path), attrs=BOLD_ONLY) else: - cprint(''.join([ HIGHER_RED, '%s %s %s %s%s' % ('\n[βœ–] Retried this image at' + cprint(''.join([ HIGHER_RED, '%s %s %s %s%s' % ('\n[' + x_tag + '] Retried this image at' , file_path, 'failed :', url, '\n') ]), end='' ) else: pass #cprint('\nFile at {} already exist.\n'.format(file_path), attrs=BOLD_ONLY) @@ -527,13 +539,13 @@ def download_img(image, save_dir, arg_force_update, IMG_SESSION, V_SESSION, arg_ for chunk in r: f.write(chunk) except OSError: # e.g. File name still too long - cprint(''.join([ HIGHER_RED, '%s %s %s %s%s' % ('\n[βœ–] Download this video at' + cprint(''.join([ HIGHER_RED, '%s %s %s %s%s' % ('\n[' + x_tag + '] Download this video at' , save_dir, 'failed :', vurl, '\n') ]), end='' ) cprint(''.join([ HIGHER_RED, '%s' % ('\nYou may want to use -c \n\n') ]), end='' ) return quit(traceback.format_exc()) else: - cprint(''.join([ HIGHER_RED, '%s %s %s %s%s' % ('\n[βœ–] Download this video at' + cprint(''.join([ HIGHER_RED, '%s %s %s %s%s' % ('\n[' + x_tag + '] Download this video at' , save_dir, 'failed :', vurl, '\n') ]), end='' ) except: # Need catch inside job, or else it doesn't throws @@ -654,11 +666,11 @@ def fetch_imgs(board, uname, board_name, section, arg_timestamp, arg_timestamp_l section_folder = board['section']['title'] section_id = board['section']['id'] else: - return quit('{}'.format('\n[βœ–] No item found.\n\ + return quit('{}'.format('\n[' + x_tag + '] No item found.\n\ Please ensure your username/boardname or link has media item.\n') ) except (KeyError, TypeError): url = '/'.join((uname, board_name)) - cprint(''.join([ HIGHER_RED, '%s %s %s' % ('\n[βœ–] Failed. URL:', url, '\n\n') ]), end='' ) + cprint(''.join([ HIGHER_RED, '%s %s %s' % ('\n[' + x_tag + '] Failed. URL:', url, '\n\n') ]), end='' ) return quit(traceback.format_exc() + '\n[!] Something wrong with Pinterest URL. Please report this issue at https://github.com/limkokhole/pinterest-downloader/issues , thanks.') if section: @@ -759,7 +771,7 @@ Please ensure your username/boardname or link has media item.\n') ) if got_img: # From what I observed, always got extra index is not media, so better -1 # And no point to loop above and detect early, overkill - print(' [βž•] Found estimated {} images'.format(len(images) - 1)) + print(' [' + plus_tag + '] Found estimated {} images'.format(len(images) - 1)) else: # empty section print('\n[i] No item found.') return @@ -782,7 +794,7 @@ Please ensure your username/boardname or link has media item.\n') ) # Need suffix with extra 3 spaces to replace previos longer ... + Downloading->ed line # ... to avoid see wrong word "Complete" - printProgressBar(len(images), len(images), prefix='[βœ”] Downloaded:' + printProgressBar(len(images), len(images), prefix='[' + done_tag + '] Downloaded:' , suffix='Complete ', length=50) print() @@ -792,7 +804,7 @@ def main(): start_time = int(time.time()) - arg_parser = argparse.ArgumentParser(description='Download ALL board/section from πŸ…ΏοΈinterest by username, username/boardname, username/boardname/section or link. Support image and video.\n\ + arg_parser = argparse.ArgumentParser(description='Download ALL board/section from ' + pinterest_logo + 'interest by username, username/boardname, username/boardname/section or link. Support image and video.\n\ Filename compose of PinId_Title_Description_Date.Ext. PinId always there while the rest is optional.\n\ If filename too long will endswith ... and you can check details in log-pinterest-downloader.log file.') arg_parser.add_argument('path', nargs='?', help='Pinterest username, or username/boardname, or link( /pin/ may include created time )') @@ -834,7 +846,7 @@ def main(): if '://' in url_path: url_path = '/'.join(url_path.split('://')[1:][0].split('/')[1:]) if not url_path: - return quit('{} {} {}'.format('\n[βœ–] Neither username/boardname nor valid link: ', args.path, '\n') ) + return quit('{} {} {}'.format('\n[' + x_tag + '] Neither username/boardname nor valid link: ', args.path, '\n') ) if url_path.startswith('/'): url_path = url_path[1:] slash_path = url_path.split('/') @@ -884,7 +896,7 @@ def main(): print('[i] Job is download single board by username/boardname/section: {}'.format(u_url)) # Will err if try to create section by naming 'more_ideas' if ( slash_path[-3] in ('search', 'categories', 'topics') ) or ( slash_path[-1] in ['more_ideas'] ): - return quit('{}'.format('\n[βœ–] Search, Categories, Topics, more_ideas are not supported.\n') ) + return quit('{}'.format('\n[' + x_tag + '] Search, Categories, Topics, more_ideas are not supported.\n') ) board = get_board_info(u_url, False, slash_path[-1]) # need_get_section's True/False not used try: IMGS_SESSION = get_session(2) @@ -900,7 +912,7 @@ def main(): u_url = '/'.join(slash_path) print('[i] Job is download single board by username/boardname: {}'.format(u_url)) if slash_path[-2] in ('search', 'categories', 'topics'): - return quit('{}'.format('\n[βœ–] Search, Categories and Topics not supported.\n') ) + return quit('{}'.format('\n[' + x_tag + '] Search, Categories and Topics not supported.\n') ) board, sections = get_board_info(u_url, args.exclude_section, None) try: IMGS_SESSION = get_session(2) @@ -924,7 +936,7 @@ def main(): elif len(slash_path) == 1: print('[i] Job is download all boards Job is download all boards by username: {}'.format(slash_path[-1])) if slash_path[-1] in ('search', 'categories', 'topics'): - return quit('{}'.format('\n[βœ–] Search, Categories and Topics not supported.\n') ) + return quit('{}'.format('\n[' + x_tag + '] Search, Categories and Topics not supported.\n') ) #boards = get_user_boards( slash_path[-1] ) try: boards = fetch_boards( slash_path[-1] ) @@ -972,10 +984,10 @@ if __name__ == '__main__': try: main() except requests.exceptions.ReadTimeout: - cprint(''.join([ HIGHER_RED, '{}'.format('\n[βœ–] Suddenly not able to connect. Please check your network.\n') ]), end='' ) + cprint(''.join([ HIGHER_RED, '{}'.format('\n[' + x_tag + '] Suddenly not able to connect. Please check your network.\n') ]), end='' ) quit('') except requests.exceptions.ConnectionError: - cprint(''.join([ HIGHER_RED, '{}'.format('\n[βœ–] Not able to connect. Please check your network.\n') ]), end='' ) + cprint(''.join([ HIGHER_RED, '{}'.format('\n[' + x_tag + '] Not able to connect. Please check your network.\n') ]), end='' ) quit('') except: quit(traceback.format_exc())