Major advance + start adapting my webpic script for a graphic version

This commit is contained in:
Jérémi N ‘EndMove’ 2022-08-31 21:05:20 +02:00
parent 16794bf488
commit a93a88d344
Signed by: EndMove
GPG Key ID: 65C4A02E1F5371A4
4 changed files with 94 additions and 72 deletions

View File

@ -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

View File

@ -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

View File

@ -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:

View File

@ -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)