aboutsummaryrefslogtreecommitdiffstats
path: root/src/model/youload_app.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/model/youload_app.py')
-rw-r--r--src/model/youload_app.py122
1 files changed, 122 insertions, 0 deletions
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()
+