diff --git a/freetar/backend.py b/freetar/backend.py index b5f995e..9f87512 100644 --- a/freetar/backend.py +++ b/freetar/backend.py @@ -3,7 +3,7 @@ from flask import Flask, render_template, request from flask_minify import Minify -from freetar.ug import ug_search, ug_tab +from freetar.ug import Search, ug_tab from freetar.utils import get_version, FreetarError @@ -28,14 +28,20 @@ def index(): @app.route("/search") def search(): search_term = request.args.get("search_term") + page = request.args.get("page") or 1 if search_term: - search_results = ug_search(search_term) + search = Search(search_term, page) + search_results = search.results + total_pages = search.total_pages + current_page = search.current_page else: search_results = [] return render_template("index.html", search_term=search_term, title=f"Freetar - Search: {search_term}", - search_results=search_results,) + search_results=search_results, + total_pages=total_pages, + current_page=current_page) @app.route("/tab//") diff --git a/freetar/templates/index.html b/freetar/templates/index.html index 7672fb5..768918d 100644 --- a/freetar/templates/index.html +++ b/freetar/templates/index.html @@ -30,6 +30,23 @@ +
+ page: + + + + {% for page in range(total_pages) %} + + {% endfor %} + + +
{{ page + 1 }}
+
+ {% if favs %}
Advanced Export favorties diff --git a/freetar/ug.py b/freetar/ug.py index 1e411f8..d8655ed 100644 --- a/freetar/ug.py +++ b/freetar/ug.py @@ -44,7 +44,7 @@ def __repr__(self): @dataclass -class SongDetail(): +class SongDetail: tab: str artist_name: str song_name: str @@ -105,19 +105,30 @@ def parse_chord(self, chord): bass = '/%s' % chord.group('bass')[1:] return '%s' % (root + quality + bass) - -def ug_search(value: str): - try: - resp = requests.get(f"https://www.ultimate-guitar.com/search.php?search_type=title&value={quote(value)}", - headers={'User-Agent': USER_AGENT}, - proxies=PROXIES) - resp.raise_for_status() - bs = BeautifulSoup(resp.text, 'html.parser') - # data can be None - data = bs.find("div", {"class": "js-store"}) - # KeyError - data = data.attrs['data-content'] - data = json.loads(data) +@dataclass +class Search: + results: dict + total_pages: int + current_page: int + + def __init__(self, value: str, page: int): + try: + resp = requests.get(f"https://www.ultimate-guitar.com/search.php?page={page}&search_type=title&value={quote(value)}", + headers={'User-Agent': USER_AGENT}, + proxies=PROXIES) + resp.raise_for_status() + bs = BeautifulSoup(resp.text, 'html.parser') # data can be None + data = bs.find("div", {"class": "js-store"}) # KeyError + data = json.loads(data.attrs['data-content']) + self.results = self.get_results(data) + self.total_pages = data['store']['page']['data']['pagination']['total'] + self.current_page = data['store']['page']['data']['pagination']['current'] + #print(json.dumps(data, indent=4)) + + except (KeyError, ValueError, AttributeError, requests.exceptions.RequestException) as e: + raise FreetarError(f"Could not search for chords: {e}") from e + + def get_results(self, data: object): results = data['store']['page']['data']['results'] ug_results = [] for result in results: @@ -125,11 +136,7 @@ def ug_search(value: str): if _type and _type != "Pro": s = SearchResult(result) ug_results.append(s) - #print(s) - #print(json.dumps(data, indent=4)) return ug_results - except (KeyError, ValueError, AttributeError, requests.exceptions.RequestException) as e: - raise FreetarError(f"Could not search for chords: {e}") from e def get_chords(s: SongDetail) -> SongDetail: