From 4a785df532c878962aa17553f96e053e46dbb595 Mon Sep 17 00:00:00 2001 From: FrederikBaerentsen Date: Fri, 24 Jan 2025 17:08:56 +0100 Subject: [PATCH] Moved from code around --- bricktracker/instructions.py | 29 ++++++++++++++++++++++++++--- bricktracker/views/instructions.py | 23 +---------------------- 2 files changed, 27 insertions(+), 25 deletions(-) diff --git a/bricktracker/instructions.py b/bricktracker/instructions.py index 9813501..1c4f753 100644 --- a/bricktracker/instructions.py +++ b/bricktracker/instructions.py @@ -9,6 +9,7 @@ from werkzeug.datastructures import FileStorage from werkzeug.utils import secure_filename import requests +from bs4 import BeautifulSoup from .exceptions import ErrorException if TYPE_CHECKING: @@ -115,11 +116,34 @@ class BrickInstructions(object): file=self.filename )) + def find_instructions(self, set_id: str, /) -> None: + + url = f"https://rebrickable.com/instructions/{set_id}" + print(url) + + headers = { + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36' + } + response = requests.get(url, headers=headers) + if response.status_code != 200: + raise ErrorException('Failed to load page. Status code: {response.status_code}') + + # Parse the HTML content + soup = BeautifulSoup(response.content, 'html.parser') + + # Collect all tags with "LEGO Building Instructions" in the alt attribute + found_tags = [] + for a_tag in soup.find_all('a', href=True): + img_tag = a_tag.find('img', alt=True) + if img_tag and "LEGO Building Instructions" in img_tag['alt']: + found_tags.append((img_tag['alt'].replace('LEGO Building Instructions for ', ''), a_tag['href'])) # Save alt and href + return found_tags + def download(self, href: str, /) -> None: target = self.path(secure_filename(self.filename)) if os.path.isfile(target): - raise ErrorException('Cannot upload {target} as it already exists'.format( # noqa: E501 + raise ErrorException('Cannot download {target} as it already exists'.format( # noqa: E501 target=self.filename )) @@ -130,9 +154,8 @@ class BrickInstructions(object): # Save the file with open(target, 'wb') as file: file.write(response.content) - print(f"Downloaded {self.filename} to {target}") else: - print(f"Failed to download {self.filename}. Status code: {response.status_code}", 'danger') + raise ErrorException(f"Failed to download {self.filename}. Status code: {response.status_code}") # Info diff --git a/bricktracker/views/instructions.py b/bricktracker/views/instructions.py index db3491a..c11a407 100644 --- a/bricktracker/views/instructions.py +++ b/bricktracker/views/instructions.py @@ -16,9 +16,6 @@ from ..instructions import BrickInstructions from ..instructions_list import BrickInstructionsList from .upload import upload_helper -import requests -from bs4 import BeautifulSoup - instructions_page = Blueprint( 'instructions', __name__, @@ -150,25 +147,7 @@ def download() -> str: def do_download() -> Response: set_id: str = request.form.get('add-set', '') - url = f"https://rebrickable.com/instructions/{set_id}" - - headers = { - 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36' - } - response = requests.get(url, headers=headers) - if response.status_code != 200: - flash(f"Failed to load page. Status code: {response.status_code}", 'danger') - return redirect(url_for('instructions.download')) - - # Parse the HTML content - soup = BeautifulSoup(response.content, 'html.parser') - - # Collect all tags with "LEGO Building Instructions" in the alt attribute - found_tags = [] - for a_tag in soup.find_all('a', href=True): - img_tag = a_tag.find('img', alt=True) - if img_tag and "LEGO Building Instructions" in img_tag['alt']: - found_tags.append((img_tag['alt'].replace('LEGO Building Instructions for ', ''), a_tag['href'])) # Save alt and href + found_tags = BrickInstructions(set_id).find_instructions(set_id) return render_template('instructions.html', download=True, found_tags=found_tags)