From d20bb5f9f7f460cf0db3674d6cc2a279d1ee3499 Mon Sep 17 00:00:00 2001 From: nathansmithsmith Date: Thu, 9 Nov 2023 09:02:08 -0700 Subject: Started file chooser --- src/main.py | 3 +- src/model/youload_app.py | 122 ++++++++++++++++++++++++++++++++++++++ src/model/youload_file_chooser.py | 30 ++++++++++ src/youload_app.py | 106 --------------------------------- src/youload_cli.py | 1 + 5 files changed, 155 insertions(+), 107 deletions(-) create mode 100644 src/model/youload_app.py create mode 100644 src/model/youload_file_chooser.py delete mode 100644 src/youload_app.py diff --git a/src/main.py b/src/main.py index ab747b0..b3a5503 100644 --- a/src/main.py +++ b/src/main.py @@ -1,6 +1,7 @@ -from youload_app import YouloadApp +from model.youload_app import YouloadApp if __name__ == "__main__": app = YouloadApp() run = app.run() print(run) + diff --git a/src/model/youload_app.py b/src/model/youload_app.py new file mode 100644 index 0000000..9e4d757 --- /dev/null +++ b/src/model/youload_app.py @@ -0,0 +1,122 @@ +#! /usr/bin/python3 + +from kivy.app import App +from kivy.uix.boxlayout import BoxLayout +from kivy.uix.button import Button +from kivy.uix.floatlayout import FloatLayout +from kivy.uix.gridlayout import GridLayout +from kivy.uix.textinput import TextInput +from kivy.uix.label import Label +from kivy.uix.filechooser import FileChooser + +import threading + +import pytube + +from youload_playlist import YouLoadPlayList +from model.youload_file_chooser import YouloadFileChooser + +class YouloadApp(App): + def build(self): + layout = BoxLayout(orientation='vertical') + + # Data members + self.url = "https://youtube.com/playlist?list=PLuZUmvZz4WI78uqT5S71yBHNBMJ97HzhY&si=SI2qN9MgxmmK2rbf" + self.is_downloading = False + self.should_stop_download = False + + # Url input. + url_input = TextInput(text=self.url, multiline=False, size_hint=(0.8, 1.0)) + url_input.bind(text=self.uid_url_input) + + # Submit button. + self.submit = Button(text="Download", size_hint=(0.2, 1.0)) + self.submit.bind(on_press=self.submit_cb) + + # Url and submit layout. + url_and_submit = BoxLayout(size_hint=(1.0, 0.1)) + url_and_submit.add_widget(url_input) + url_and_submit.add_widget(self.submit) + + # Download status. + self.download_status = Label(text="Nothing downloading", size_hint=(0.8, 1.0)) + + # choose folder button. + self.choose_folder_button = Button(text="Choose folder", size_hint=(0.2, 1.0)) + self.choose_folder_button.bind(on_press=self.choose_folder_cb) + + # Info line. + info_line = BoxLayout(size_hint=(1.0, 0.1)) + info_line.add_widget(self.download_status) + info_line.add_widget(self.choose_folder_button) + + # Info display. + self.downloads_display = Label(text="", size_hint=(1.0, 0.8)) + + # Everything else (: + layout.add_widget(url_and_submit) + layout.add_widget(info_line) + layout.add_widget(self.downloads_display) + + # File chooser. + self.file_chooser = YouloadFileChooser() + + # Screen layout. + self.screen_layout = FloatLayout() + self.screen_layout.add_widget(layout) + + return self.screen_layout + + def uid_url_input(self, instance, value): + self.url = value + + # Download the videos in a different thread so the ui still works. + def download_playlist_thread(self): + self.download_status.text = "Fetching playlist" + self.submit.text = "Stop" + self.is_downloading = True + + # Get playlist. + try: + playlist = YouLoadPlayList(self.url) + except KeyError: + self.download_status.text = "Error getting playlist" + return + + playlist.prepare_for_download() + self.downloads_display.text = f"Downloading {self.url}\n" + + # Download each video + for i in range(playlist.video_count): + # Stop this mother fucker + if self.should_stop_download: + break + + self.download_status.text = f"Downloading {i+1}/{playlist.video_count}" + self.downloads_display.text += playlist.download_video(i) + "\n" + + self.submit.text = "Download" + self.download_status.text = "Download complete" + self.is_downloading = False + + def stop_download(self): + self.should_stop_download = True + + def submit_cb(self, instance): + # Is already downloading something. + if self.is_downloading: + self.download_status.text = "Stopping download" + self.stop_download() + return + + # Start download thread. + download_thread = threading.Thread(target=self.download_playlist_thread) + self.should_stop_download = False + download_thread.start() + + def choose_folder_cb(self, instance): + self.screen_layout.add_widget(self.file_chooser) + + def on_stop(self): + self.stop_download() + diff --git a/src/model/youload_file_chooser.py b/src/model/youload_file_chooser.py new file mode 100644 index 0000000..80bded2 --- /dev/null +++ b/src/model/youload_file_chooser.py @@ -0,0 +1,30 @@ +from kivy.uix.popup import Popup +from kivy.uix.button import Button +from kivy.uix.boxlayout import BoxLayout +from kivy.uix.filechooser import FileChooserListView +from pathlib import Path + +class YouloadFileChooser(Popup): + + def __init__(self, **kwargs): + super(YouloadFileChooser, self).__init__(**kwargs) + + layout = BoxLayout(orientation='vertical') + + self.title = "Find folder" + + # Close button. + close_button = Button(text="Close", size_hint=(1.0, 0.1)) + close_button.bind(on_press=self.close_button_cb) + + # File chooser. + self.file_chooser = FileChooserListView(size_hint=(1.0, 0.8)) + self.file_chooser.rootpath = str(Path.home()) + + layout.add_widget(close_button) + layout.add_widget(self.file_chooser) + self.add_widget(layout) + + def close_button_cb(self, instance): + self.parent.remove_widget(self) + diff --git a/src/youload_app.py b/src/youload_app.py deleted file mode 100644 index e284116..0000000 --- a/src/youload_app.py +++ /dev/null @@ -1,106 +0,0 @@ -#! /usr/bin/python3 - -from kivy.app import App -from kivy.uix.boxlayout import BoxLayout -from kivy.uix.button import Button -from kivy.uix.floatlayout import FloatLayout -from kivy.uix.gridlayout import GridLayout -from kivy.uix.textinput import TextInput -from kivy.uix.label import Label -from kivy.uix.filechooser import FileChooser - -import threading - -import pytube - -from youload_playlist import YouLoadPlayList - -class YouloadApp(App): - def build(self): - layout = BoxLayout(orientation='vertical') - - # Data members - self.url = "https://youtube.com/playlist?list=PLuZUmvZz4WI78uqT5S71yBHNBMJ97HzhY&si=SI2qN9MgxmmK2rbf" - self.is_downloading = False - self.should_stop_download = False - - # Url input. - url_input = TextInput(text=self.url, multiline=False, size_hint=(0.75, 1.0)) - url_input.bind(text=self.uid_url_input) - - # Submit button. - self.submit = Button(text="Download", size_hint=(0.25, 1.0)) - self.submit.bind(on_press=self.submit_cb) - - # Url and submit layout. - url_and_submit = BoxLayout(size_hint=(1.0, 0.1)) - url_and_submit.add_widget(url_input) - url_and_submit.add_widget(self.submit) - - # Download status. - self.download_status = Label(text="Nothing downloading") - - # Info line. - info_line = BoxLayout(size_hint=(1.0, 0.1)) - info_line.add_widget(self.download_status) - - # Info display. - self.downloads_display = Label(text="", size_hint=(1.0, 0.8)) - - # Everything else (: - layout.add_widget(url_and_submit) - layout.add_widget(info_line) - layout.add_widget(self.downloads_display) - - return layout - - def uid_url_input(self, instance, value): - self.url = value - - # Download the videos in a different thread so the ui still works. - def download_playlist_thread(self): - self.download_status.text = "Fetching playlist" - self.submit.text = "Stop" - self.is_downloading = True - - # Get playlist. - try: - playlist = YouLoadPlayList(self.url) - except KeyError: - self.download_status.text = "Error getting playlist" - return - - playlist.prepare_for_download() - self.downloads_display.text = f"Downloading {self.url}\n" - - # Download each video - for i in range(playlist.video_count): - # Stop this mother fucker - if self.should_stop_download: - break - - self.download_status.text = f"Downloading {i+1}/{playlist.video_count}" - self.downloads_display.text += playlist.download_video(i) + "\n" - - self.submit.text = "Download" - self.download_status.text = "Download complete" - self.is_downloading = False - - def stop_download(self): - self.should_stop_download = True - - def submit_cb(self, instance): - # Is already downloading something. - if self.is_downloading: - self.download_status.text = "Stopping download" - self.stop_download() - return - - # Start download thread. - download_thread = threading.Thread(target=self.download_playlist_thread) - self.should_stop_download = False - download_thread.start() - - def on_stop(self): - self.stop_download() - diff --git a/src/youload_cli.py b/src/youload_cli.py index 7429b48..da14dc8 100644 --- a/src/youload_cli.py +++ b/src/youload_cli.py @@ -25,3 +25,4 @@ def main() -> None: if __name__ == "__main__": main() + -- cgit v1.2.3