From d91c4f4cf2c57104dfd03367243f51fa5edb6aea Mon Sep 17 00:00:00 2001 From: Manuel Cortez Date: Wed, 4 Dec 2019 12:45:47 -0600 Subject: [PATCH] Multiupload attempt #1 --- src/controller/buffers.py | 32 +++++++++++++++++++++++++++++++- src/controller/mainController.py | 4 ++++ src/sessionmanager/utils.py | 4 ++++ src/wxUI/menus.py | 2 +- src/wxUI/tabs/home.py | 13 +++++++++++-- 5 files changed, 51 insertions(+), 4 deletions(-) diff --git a/src/controller/buffers.py b/src/controller/buffers.py index 0ff2055..1830e46 100644 --- a/src/controller/buffers.py +++ b/src/controller/buffers.py @@ -815,7 +815,6 @@ class audioBuffer(feedBuffer): else: output.speak(_("{0} errors occurred while attempting to add {1} audios to your playlist.").format(errors_detected, len(selected))) - def get_menu(self): p = self.get_post() if p == None: @@ -824,6 +823,7 @@ class audioBuffer(feedBuffer): widgetUtils.connect_event(m, widgetUtils.MENU, self.open_post, menuitem=m.open) widgetUtils.connect_event(m, widgetUtils.MENU, self.play_audio, menuitem=m.play) widgetUtils.connect_event(m, widgetUtils.MENU, self.move_to_album, menuitem=m.move) + widgetUtils.connect_event(m, widgetUtils.MENU, self.download, menuitem=m.download) # if owner_id is the current user, the audio is added to the user's audios. if p["owner_id"] == self.session.user_id: m.library.SetItemLabel(_("&Remove")) @@ -831,6 +831,7 @@ class audioBuffer(feedBuffer): else: widgetUtils.connect_event(m, widgetUtils.MENU, self.add_to_library, menuitem=m.library) return m + def post(self, *args, **kwargs): """ Uploads an audio to the current user's library from the computer. """ file = self.tab.get_file_to_upload() @@ -865,6 +866,35 @@ class audioBuffer(feedBuffer): def __del__(self): pub.unsubscribe(self.change_label, "playback-changed") + def download(self, *args, **kwargs): + selected = self.tab.list.get_multiple_selection() + if len(selected) < 1: + return + audios = [self.session.db[self.name]["items"][audio] for audio in selected] + if len(audios) == 0: + return + elif len(audios) == 1: + multiple = False + filename = utils.safe_filename("{0} - {1}.mp3".format(audios[0]["title"], audios[0]["artist"])) + else: + multiple = True + filename = "" # No default filename for multiple files. + path = self.tab.get_download_path(filename=filename, multiple=multiple) + call_threaded(self.download_threaded, path, multiple, audios) + + def download_threaded(self, path, multiple, audios): + if multiple == False: + url = audios[0]["url"] + pub.sendMessage("download-file", url=url, filename=filename) + return + else: + downloads = [] + for i in audios: + filename = utils.safe_filename("{0} - {1}.mp3".format(i["title"], i["artist"])) + filepath = os.path.join(path, filename) + downloads.append((utils.transform_audio_url(i["url"]), filepath)) + pub.sendMessage("download-files", downloads) + class audioAlbum(audioBuffer): """ this buffer was supposed to be used with audio albums but is deprecated as VK removed its audio support for third party apps.""" diff --git a/src/controller/mainController.py b/src/controller/mainController.py index 115d1b5..47a106c 100644 --- a/src/controller/mainController.py +++ b/src/controller/mainController.py @@ -307,6 +307,7 @@ class Controller(object): pub.subscribe(self.in_post, "posted") pub.subscribe(self.post_failed, "postFailed") pub.subscribe(self.download, "download-file") + pub.subscribe(self.download_files, "download-files") pub.subscribe(self.view_post, "open-post") pub.subscribe(self.update_status_bar, "update-status-bar") pub.subscribe(self.chat_from_id, "new-chat") @@ -403,6 +404,9 @@ class Controller(object): log.debug("downloading %s URL to %s filename" % (url, filename,)) call_threaded(utils.download_file, url, filename, self.window) + def download_files(self, downloads): + call_threaded(utils.download_files, downloads, self.window) + def view_post(self, post_object, controller_, vars=dict()): """ Display the passed post in the passed post presenter. @ post_object dict: A post representation returned by the VK api. The fields present in this dict are different depending on the presenter used to render it. diff --git a/src/sessionmanager/utils.py b/src/sessionmanager/utils.py index d0fc7a7..a7172d9 100644 --- a/src/sessionmanager/utils.py +++ b/src/sessionmanager/utils.py @@ -58,6 +58,10 @@ def download_file(url, local_filename, window): window.change_status(_("Ready")) return local_filename +def download_files(downloads, window): + for download in downloads: + download_file(download[0], download[1], window) + def detect_users(text): """ Detect all users and communities mentionned in any text posted in VK.""" # This regexp gets group and users mentionned in topic comments. diff --git a/src/wxUI/menus.py b/src/wxUI/menus.py index 2fe492b..b36b119 100644 --- a/src/wxUI/menus.py +++ b/src/wxUI/menus.py @@ -31,7 +31,7 @@ class audioMenu(wx.Menu): self.play = self.Append(wx.NewId(), _("&Play")) self.library = self.Append(wx.NewId(), _("&Add to library")) self.move = self.Append(wx.NewId(), _("Move to album")) -# self.open_in_browser = self.Append(wx.NewId(), _("Open in vk.com")) + self.download = self.Append(wx.NewId(), _("Download")) class peopleMenu(wx.Menu): def __init__(self, is_request=False, is_subscriber=False, not_friend=False, *args, **kwargs): diff --git a/src/wxUI/tabs/home.py b/src/wxUI/tabs/home.py index af22458..4ee8d03 100644 --- a/src/wxUI/tabs/home.py +++ b/src/wxUI/tabs/home.py @@ -8,7 +8,7 @@ class homeTab(wx.Panel): def create_list(self): self.lbl = wx.StaticText(self, wx.NewId(), _("Po&sts")) - self.list = widgetUtils.list(self, *[_("User"), _("Text"), _("Date")], style=wx.LC_REPORT) + self.list = widgetUtils.list(self, *[_("User"), _("Text"), _("Date")], style=wx.LC_REPORT, name=_("Posts")) self.list.set_windows_size(0, 200) self.list.set_windows_size(1, 300) self.list.set_windows_size(2, 250) @@ -64,7 +64,7 @@ class communityTab(feedTab): class audioTab(homeTab): def create_list(self): self.lbl = wx.StaticText(self, wx.NewId(), _("Mu&sic")) - self.list = widgetUtils.multiselectionList(self, *[_("Title"), _("Artist"), _("Duration")], style=wx.LC_REPORT) + self.list = widgetUtils.multiselectionList(self, *[_("Title"), _("Artist"), _("Duration")], style=wx.LC_REPORT, name=_("Music")) self.list.set_windows_size(0, 160) self.list.set_windows_size(1, 380) self.list.set_windows_size(2, 80) @@ -87,6 +87,15 @@ class audioTab(homeTab): return None return openFileDialog.GetPath() + def get_download_path(self, filename="", multiple=False): + if multiple == False: + d = wx.FileDialog(self, _("Save this file"), "", filename, _("Audio Files(*.mp3)|*.mp3"), wx.FD_SAVE | wx.FD_OVERWRITE_PROMPT) + else: + d = wx.DirDialog(None, _("Select a folder to save all files")) + if d.ShowModal() == wx.ID_OK: + return d.GetPath() + d.Destroy() + class audioAlbumTab(audioTab): def create_post_buttons(self):