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)