diff --git a/controller/HomeController.py b/controller/HomeController.py index d3e21a1..e27f45c 100644 --- a/controller/HomeController.py +++ b/controller/HomeController.py @@ -15,10 +15,12 @@ class HomeController: # Variables __main_controller = None __view = None + __webpic = None # Constructor - def __init__(self, controller: MainController) -> None: + def __init__(self, controller: MainController, webpic) -> None: self.__main_controller = controller + self.__webpic = webpic # START View methods def set_view(self, view) -> None: @@ -40,19 +42,18 @@ class HomeController: #self.__main_controller.change_frame(frame) self.__view.add_log("Salut comment vas tu ? 1") self.__view.add_log("Salut comment vas tu ? 2") - self.__view.add_log("Salut comment vas tu ? 3") - self.__view.add_log("Salut comment vas tu ? 4") - self.__view.add_log("Salut comment vas tu ? 5") - self.__view.add_log("Salut comment vas tu ? 6") - self.__view.add_log("Salut comment vas tu ? 7") - self.__view.add_log("Salut comment vas tu ? 8") + self.__view.show_success_message("Super tu as réussi la quête !") - def on_download_started(self, url: str, name: str) -> None: + def on_download_requested(self, url: str, name: str) -> None: """ [event function for view] :url: -> The url of the website to use for pic-download.\n :name: -> The name of the folder in which put pictures. """ - pass + if url.strip() and name.strip() : + # TODO use webpic here to download files + print(f"url : {url} -- name : {name}") + else: + self.__view.show_error_message("Opss, the url or folder name are not valid!") # END View events diff --git a/main.py b/main.py index 1ad10bb..32859c9 100644 --- a/main.py +++ b/main.py @@ -2,6 +2,7 @@ from controller.HomeController import HomeController from controller.InfoController import InfoController from controller.MainController import MainController from controller.Frames import Frames +from model.webpic import WebPicDownloader from view.HomeView import HomeView from view.InfoView import InfoView from view.MainWindow import MainWindow @@ -17,9 +18,12 @@ if __name__ == '__main__': @version 1.0.0 @since 2022-08-30 """ + # Create utli/model + webpic = WebPicDownloader() + # Create app controllers main_controller = MainController() - home_controller = HomeController(main_controller) + home_controller = HomeController(main_controller, webpic) info_controller = InfoController(main_controller) # Create app views diff --git a/model/webpic.py b/model/webpic.py index 774e1f4..a5e6d8d 100644 --- a/model/webpic.py +++ b/model/webpic.py @@ -11,30 +11,33 @@ class WebPicDownloader(): find and download all pictures on a webpage. @author EndMove - @version 1.0.0 + @version 1.1.0 """ # Variables - path: str - headers: dict = {'User-Agent': "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36"} + path: str = None + message_callback: function = None + headers: dict = None # Constructor def __init__(self, path: str = os.getcwd()) -> None: """Constructor""" self.path = path + self.message_callback = lambda message: print(message) + self.headers = {'User-Agent': "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36"} # Internal functions - def __getHtml(self, url: str) -> str: + def __get_html(self, url: str) -> str: """Allow to retrieve the HTML content of a website""" req = request.Request(url, headers=self.headers) response = request.urlopen(req) return response.read().decode('utf-8') - def __findAllImg(self, html: str) -> ResultSet: + def __find_all_img(self, html: str) -> ResultSet: """Allow to retrieve all images of an html page""" soup = BeautifulSoup(html, 'html.parser') return soup.find_all('img') - def __findImgLink(self, img: Tag) -> str: + def __find_img_link(self, img: Tag) -> str: """Allow to retrieve the link of a picture""" if img.get('src'): link = img.get('src') @@ -50,48 +53,56 @@ class WebPicDownloader(): raise ValueError("Bad image link") return link - def __findImageType(self, imgLink: str) -> str: + def __find_image_type(self, img_link: str) -> str: """Allow to retrieve the right image type""" - type = imgLink.split('.')[-1] + type = img_link.split('.')[-1] if '?' in type: type = type.split('?')[0] return type - def __downloadImg(self, url: str, filename: str) -> None: + def __download_img(self, url: str, filename: str) -> None: """Allow to download a picture from internet""" req = request.Request(url, headers=self.headers) - rawImg = request.urlopen(req).read() + raw_img = request.urlopen(req).read() with open(filename, 'wb') as img: - img.write(rawImg) + img.write(raw_img) - def __initializeFolder(self, folderPath: str) -> None: + def __initialize_folder(self, folder_path: str) -> None: """Init the folder on which put downloaded images""" - if not os.path.exists(folderPath): - os.mkdir(folderPath) + if not os.path.exists(folder_path): + os.mkdir(folder_path) else: raise ValueError("the folder already exists, it may already contain images") # Public functions - def download(self, url: str, folderName: str) -> None: + def set_message_callback(self, callback) -> None: + """ + Setter to define the callback function in case of new messages. + + :callback: -> the callback function to call when a message event is emited. + """ + self.message_callback = callback + + def download(self, url: str, folder_name: str) -> None: """ Start downloading all pictures of a website :url: -> The url of the website to annalyse.\n - :folderName: -> The name of the folder in which to upload the photos. + :folder_name: -> The name of the folder in which to upload the photos. """ try: count = 0 - folderPath = f"{self.path}/{folderName}/" - html = self.__getHtml(url) - images = self.__findAllImg(html) + folder_path = f"{self.path}/{folder_name}/" + html = self.__get_html(url) + images = self.__find_all_img(html) - self.__initializeFolder(folderPath) + self.__initialize_folder(folder_path) print(f"\nWebPicDownload found {len(images)} images on the website.") for i, img in enumerate(images): try: - imgLink = self.__findImgLink(img) - self.__downloadImg(imgLink, f"{folderPath}image-{i}.{self.__findImageType(imgLink)}") + img_link = self.__find_img_link(img) + self.__download_img(img_link, f"{folder_path}image-{i}.{self.__find_image_type(img_link)}") print(f"SUCCESS: File n°{i} successfuly downloaded.") count += 1 except ValueError as err: diff --git a/view/HomeView.py b/view/HomeView.py index ef73941..ae8dc88 100644 --- a/view/HomeView.py +++ b/view/HomeView.py @@ -24,28 +24,6 @@ class HomeView(ttk.Frame): # Init view self.__init_content() - - # create widgets - # label - # self.label = ttk.Label(self, text='Email:') - # self.label.grid(row=1, column=0) - - # email entry - # self.email_var = tk.StringVar() - # self.email_entry = ttk.Entry(self, textvariable=self.email_var, width=30) - # self.email_entry.grid(row=1, column=1, sticky=tk.NSEW) - - # save button - # self.save_button = ttk.Button(self, text='Save', command=self.event_btn) - # self.save_button.grid(row=1, column=3, padx=10) - - # message - # self.message_label = ttk.Label(self, text='coucou toi :D JE SUIS SUPER MAN héhéh', foreground='red') - # self.message_label.grid(row=2, column=1, sticky=tk.W) - - # place this frame - # self.grid(row=0, column=0, padx=5, pady=5) - # self.pack(fill='both', expand=True) # Save and setup main controller self.__controller = controller @@ -62,23 +40,32 @@ class HomeView(ttk.Frame): # Website link self.web_label = ttk.Label(self, text="Website URL:") - self.web_label.grid(column=0, row=0, sticky=tk.W, padx=5, pady=5) + self.web_label.grid(row=0, column=0, sticky=tk.W, padx=5, pady=5) self.web_entry = ttk.Entry(self, width=50) # show="-" - self.web_entry.grid(column=1, row=0, sticky=tk.E, padx=5, pady=5, ipadx=2, ipady=2) + self.web_entry.grid(row=0, column=1, sticky=tk.E, padx=5, pady=5, ipadx=2, ipady=2) # Download name self.name_label = ttk.Label(self, text="Download Name:") - self.name_label.grid(column=0, row=1, sticky=tk.W, padx=5, pady=5) + self.name_label.grid(row=1, column=0, sticky=tk.W, padx=5, pady=5) self.name_entry = ttk.Entry(self, width=50) - self.name_entry.grid(column=1, row=1, sticky=tk.E, padx=5, pady=5, ipadx=2, ipady=2) + self.name_entry.grid(row=1, column=1, sticky=tk.E, padx=5, pady=5, ipadx=2, ipady=2) # Logs area - self.log_area = st.ScrolledText(self, wrap=tk.WORD, state = tk.DISABLED, width=40, height=8)#, font=("Times New Roman", 15)) - self.log_area.grid(column=0, row=3, sticky=tk.EW, columnspan=2, pady=10, padx=10) + self.log_textarea = st.ScrolledText(self, wrap=tk.WORD, state=tk.DISABLED, width=40, height=8)#, font=("Times New Roman", 15)) + self.log_textarea.grid(row=3, column=0, columnspan=2, sticky=tk.EW, pady=10, padx=10) + + self.message_label = ttk.Label(self, text='message label') # Download button - self.download_button = ttk.Button(self, text="Start downloading", command=self.event_btn) - self.download_button.grid(column=1, row=4, sticky=tk.E, padx=5, pady=5, ipadx=5, ipady=2) + self.download_button = ttk.Button(self, text="Start downloading", command=self.__event_button_download) + self.download_button.grid(row=5, column=1, sticky=tk.E, padx=5, pady=5, ipadx=5, ipady=2) + + def __event_button_download(self) -> None: + """ + [internal function] + => Function called when a download is requested. + """ + self.__controller.on_download_requested(self.web_entry.get(), self.name_entry.get()) # END Internal function # START Controller methods @@ -87,20 +74,39 @@ class HomeView(ttk.Frame): [function for controller] TODO desc """ - print("ADD: ", line) - self.log_area.configure(state=tk.NORMAL) - self.log_area.insert(tk.END, f"{line}\n") - self.log_area.configure(state=tk.DISABLED) + self.log_textarea.configure(state=tk.NORMAL) + self.log_textarea.insert(tk.END, f"{line}\n") + self.log_textarea.configure(state=tk.DISABLED) def clear_log(self) -> None: """ [function for controller] TODO desc """ - self.log_area.delete(0, tk.END) - - # END Controller methods + self.log_textarea.delete(0, tk.END) + + def show_error_message(self, message) -> None: + """ + [function for controller] + TODO desc + """ + self.message_label.configure(text=message, foreground='red') + self.message_label.grid(row=4, column=0, columnspan=2, sticky=tk.NS, padx=2, pady=2) + self.message_label.after(30000, self.hide_message) - def event_btn(self) -> None:# TODO remove - print("you clicked ! And now you are on info page ... :D") - self.__controller.on_change_view(Frames.Info) + def show_success_message(self, message) -> None: + """ + [function for controller] + TODO desc + """ + self.message_label.configure(text=message, foreground='green') + self.message_label.grid(row=4, column=0, columnspan=2, sticky=tk.NS, padx=2, pady=2) + self.message_label.after(30000, self.hide_message) + + def hide_message(self) -> None: + """ + [function for controller] + TODO desc + """ + self.message_label.grid_forget() + # END Controller methods