def __init__(self): self.pastvisitedsubreddits = [] self.loadpastsubreddits() #defines self.visitedsubreddits : list : self.selectedsubreddit = None self.submissioncategory = None self.directory = None self.downloadcount = 0 self.enablescroller = True self.root = tkinter.Tk() self.root.title('Reddit Image Downloader') self.startwindow = StartPage(self,self.root) self.scroller = None
class App: def __init__(self): self.pastvisitedsubreddits = [] self.loadpastsubreddits() #defines self.visitedsubreddits : list : self.selectedsubreddit = None self.submissioncategory = None self.directory = None self.downloadcount = 0 self.enablescroller = True self.root = tkinter.Tk() self.root.title('Reddit Image Downloader') self.startwindow = StartPage(self,self.root) self.scroller = None def popupmessage(self,title,msg): tkinter.messagebox.showinfo(title,msg) def loadpastsubreddits(self): #laod from text file try: data = open('SubredditHistory.json') jsondata = json.load(data) data.close() self.pastvisitedsubreddits = jsondata['VisitedSubreddits'] except (IOError, ValueError): pass def savesubreddit(self): #save subreddit to list of visited subreddits file=open('SubredditHistory.json','w') if self.selectedsubreddit not in self.pastvisitedsubreddits: self.pastvisitedsubreddits.append(self.selectedsubreddit) jsondict = {'VisitedSubreddits':self.pastvisitedsubreddits} json.dump(jsondict,file) file.close() def setsubreddit(self,subreddit): self.selectedsubreddit = subreddit def setsubmissioncategory(self,category): self.submissioncategory = category def run(self): self.root.mainloop() def loadscroller(self): self.startwindow.destroy() self.scroller = WallpaperScroller(self.root, self.directory) def create_directory(self): """Directory created to save downloaded images. """ dir_name = '%s_wallpapers/temp'%self.selectedsubreddit.lower() full_dir_path_name = os.path.join(os.path.realpath(__file__), dir_name) os.makedirs(dir_name,exist_ok=True) full_dir_path_name = os.path.join(os.path.dirname(os.path.realpath(__file__)), dir_name) self.directory = (full_dir_path_name) if self.enablescroller else os.path.dirname(full_dir_path_name) @normalize_url def download_image(self,URL,save_name): """Download image at URL as SAVE_NAME. """ print('Downloading image...') #try: res=requests.get(URL) res.raise_for_status() with open(save_name, 'wb') as f: for chunk in res.iter_content(100000): f.write(chunk) print('Image < %s > successfully downloaded'%save_name) self.downloadcount+=1 #except Exception: # print('Problem downloading image located at: %s' % URL) def download_reddit_images(self): """ Downloads top 10 images of subreddit to temp dir. """ try: reddit=praw.Reddit(user_agent='anderMak_IM_DLer') except Exception: print('Problem connecting to Reddit. Aborting...') sys.exit(1) #TODO: make this a popup if self.submissioncategory == 'Hot': subs=(sub for sub in reddit.get_subreddit(self.selectedsubreddit).get_hot(limit=10) if not sub.stickied) elif self.submissioncategory == 'Top': subs=(sub for sub in reddit.get_subreddit(self.selectedsubreddit).get_top(limit=10) if not sub.stickied) elif self.submissioncategory == 'New': subs=(sub for sub in reddit.get_subreddit(self.selectedsubreddit).get_new(limit=10) if not sub.stickied) #TODO: GUI option to select number of images, eg 5,10,15,25 self.create_directory() self.savesubreddit() for sub in subs: temp_file_name = '{}/{}_{}_{}.jpg'.format(self.directory,'temp',self.selectedsubreddit,sub.id) #If downloaded, image will have this name. perm_file_name='{}/{}_{}.jpg'.format(self.directory,self.selectedsubreddit,sub.id) if not file_already_downloaded(temp_file_name) and not file_already_downloaded(perm_file_name): if self.enablescroller: self.download_image(sub.url, temp_file_name) else: self.download_image(sub.url,perm_file_name) if self.downloadcount: self.popupmessage('Info','Downloading Complete. {} images were downloaded to {}'.format(self.downloadcount,self.directory)) #only if images were downloaded (count>0) else: self.popupmessage('Info','No new images found in {} {} posts.'.format(self.submissioncategory,self.selectedsubreddit)) #TODO: popup window with 'Yes' and 'Exit' self.startwindow.progressbar.stop() if self.enablescroller: self.loadscroller() else: sys.exit(0) def startdownloadthread(self): self.startwindow.downloadbutton.unbind('<Button-1>') self.startwindow.progressbar.start() self.downloadthread = threading.Thread(target = self.download_reddit_images,daemon=True) self.downloadthread.start() self.root.after(100,self.checkdownloadprogress) def checkdownloadprogress(self): if self.downloadthread.is_alive(): self.root.after(100,self.checkdownloadprogress)