Major advance + start adapting my webpic script for a graphic version
This commit is contained in:
parent
16794bf488
commit
a93a88d344
@ -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
|
||||
|
6
main.py
6
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
|
||||
|
@ -11,30 +11,33 @@ class WebPicDownloader():
|
||||
find and download all pictures on a webpage.
|
||||
|
||||
@author EndMove <contact@endmove.eu>
|
||||
@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:
|
||||
|
@ -25,28 +25,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
|
||||
controller.set_view(self)
|
||||
@ -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)
|
||||
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 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
|
||||
|
||||
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)
|
||||
|
Reference in New Issue
Block a user