diff options
| author | Bobby <[email protected]> | 2022-12-02 17:01:06 -0500 |
|---|---|---|
| committer | Bobby <[email protected]> | 2022-12-02 17:01:06 -0500 |
| commit | 592176202e1159d9d85b21f50ddf17460ebede97 (patch) | |
| tree | 327819303a94662dfcfd921864d2e1134fffd93e /src/windows/data_fetcher.py | |
| parent | 2ebec8debf34a69126d1032de55a49c804f79d6c (diff) | |
| download | RedditEngagementPrediction-592176202e1159d9d85b21f50ddf17460ebede97.tar.xz RedditEngagementPrediction-592176202e1159d9d85b21f50ddf17460ebede97.zip | |
Tkinter Application
Diffstat (limited to 'src/windows/data_fetcher.py')
| -rw-r--r-- | src/windows/data_fetcher.py | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/src/windows/data_fetcher.py b/src/windows/data_fetcher.py new file mode 100644 index 0000000..57763a1 --- /dev/null +++ b/src/windows/data_fetcher.py @@ -0,0 +1,88 @@ +import time +import tkinter +import tkinter.messagebox +from tkinter import ttk + +import customtkinter +import requests + +from helpers.subreddits import SUBREDDITS + + +class DataDownloader: + posts = [] + after = None + downloaded = 0 + start_time = time.time() + + def __init__(self): + self.root = tkinter.Tk() + self.root.title('Downloading Data - 0%') + + # center the window + posx = int(self.root.winfo_screenwidth() / 2 - 250) + posy = int(self.root.winfo_screenheight() / 2 - 50) + self.root.geometry(f'500x100+{posx}+{posy}') + + self.root.resizable(False, False) + self.root.protocol('WM_DELETE_WINDOW', self.on_closing) + self.subreddits = SUBREDDITS + self.posts_per_subreddit = 100 + + self.progress = ttk.Progressbar(self.root, orient='horizontal', length=500, mode='determinate') + self.progress['value'] = 0 + self.progress['maximum'] = 100 + + self.download_label = tkinter.Label(self.root, text='Downloading: 0 / {} Posts'.format(len(SUBREDDITS) * self.posts_per_subreddit)) + + self.download_label.pack(fill='x', padx=10, pady=10, side= tkinter.TOP, anchor='w') + self.progress.pack(fill='x', padx=10, pady=10) + + self.root.bind('<<DownloadComplete>>', lambda e: self.on_closing()) + client_id = 'dog1LGxsD9M3bXtglOzKsQ' + client_secret = 'nc-HHPBGtz51-_r4vNLGcuCHmT39Lw' + username = 'NoSeason1949' + password = 'Password@1234' + auth = requests.auth.HTTPBasicAuth(client_id, client_secret) + data = { + 'grant_type': 'password', + 'username': username, + 'password': password, + } + headers = {'User-Agent': 'RedditTest/0.1 by {}'.format(username)} + res = requests.post('https://www.reddit.com/api/v1/access_token', + auth=auth, data=data, headers=headers) + self.token = res.json()['access_token'] + self.headers = {**headers, **{'Authorization': f"bearer {self.token}"}} + + def on_closing(self): + self.root.destroy() + + def download(self): + for subreddit in self.subreddits: + subreddit_download = 0 + while subreddit_download < self.posts_per_subreddit: + url = f"https://oauth.reddit.com/r/{subreddit}/hot?limit=100" + if self.after: + url += f"&after={self.after}" + res = requests.get(url, headers=self.headers) + if res.status_code == 200: + data = res.json() + self.after = data['data']['after'] + for post in data['data']['children']: + self.posts.append(post['data']) + subreddit_download += 1 + self.downloaded += 1 + dwval = (self.downloaded / (self.posts_per_subreddit * len(self.subreddits))) * 100 + self.progress['value'] = float(dwval) if dwval < 100 else 100 + self.root.title(f'Downloading Data - {int(self.progress["value"])}%') + time_remaining = (time.time() - self.start_time) / (self.downloaded / (self.posts_per_subreddit * len(self.subreddits))) - (time.time() - self.start_time) + time_remaining = time.strftime('%H:%M:%S', time.gmtime(time_remaining)) + self.download_label['text'] = f'Downloading: {self.downloaded} / {self.posts_per_subreddit * len(self.subreddits)} Posts - {time_remaining} Remaining' if self.downloaded < self.posts_per_subreddit * len(self.subreddits) else 'Download Complete' + self.root.update() + + self.root.event_generate('<<DownloadComplete>>', when='tail') + + def start(self): + self.root.after(0, self.download) + self.root.mainloop() |
