From e1aaa83fe94492a4148fd4889721027d3c4d0a4b Mon Sep 17 00:00:00 2001 From: luciano Date: Tue, 14 Jul 2026 16:14:55 +0200 Subject: [PATCH] beatport: fixture HTML + curl_cffi + script refresh generi --- requirements.txt | 1 + scripts/refresh_beatport_genres.py | 88 +++++ tests/fixtures/beatport_melodic_top100.html | 357 ++++++++++++++++++++ 3 files changed, 446 insertions(+) create mode 100644 scripts/refresh_beatport_genres.py create mode 100644 tests/fixtures/beatport_melodic_top100.html diff --git a/requirements.txt b/requirements.txt index 8f16531..2edd217 100644 --- a/requirements.txt +++ b/requirements.txt @@ -8,6 +8,7 @@ pyobjc-framework-WebKit>=10.0 ; sys_platform == "darwin" pyobjc-framework-AVFoundation>=10.0 ; sys_platform == "darwin" pythonnet==3.0.5 ; sys_platform == "win32" clr-loader==0.2.7.post0 ; sys_platform == "win32" +curl_cffi>=0.9.0 # --- dev only --- pytest>=8.0.0 diff --git a/scripts/refresh_beatport_genres.py b/scripts/refresh_beatport_genres.py new file mode 100644 index 0000000..69a0971 --- /dev/null +++ b/scripts/refresh_beatport_genres.py @@ -0,0 +1,88 @@ +"""Estrae lo slug + numeric id di tutti i generi Beatport. +Uso: python3 scripts/refresh_beatport_genres.py > /tmp/genres.txt +Poi copia manualmente in core/beatport.py::GENRES. + +Nota: la pagina /genres (task originale) restituisce 404 sull'attuale sito +Beatport. Aggreghiamo quindi la lista dei generi dalla pagina /charts, dove +ogni featured chart include un array `genres` completo di slug + id + name. +""" + +from __future__ import annotations + +import re +import json +import sys +from curl_cffi import requests + + +GENRES_URL = "https://www.beatport.com/genres" +CHARTS_URL = "https://www.beatport.com/charts" + + +def _fetch_next_data(url: str) -> dict: + resp = requests.get(url, impersonate="chrome131", timeout=15) + resp.raise_for_status() + m = re.search( + r'', resp.text, re.DOTALL + ) + if not m: + raise RuntimeError(f"__NEXT_DATA__ non trovato su {url}") + return json.loads(m.group(1)) + + +def _collect_genres(node, out: dict) -> None: + """Raccoglie ricorsivamente ogni dict con chiavi slug/id/name che appare + dentro un array chiamato "genres".""" + if isinstance(node, dict): + for k, v in node.items(): + if ( + k == "genres" + and isinstance(v, list) + and v + and all( + isinstance(x, dict) and "slug" in x and "id" in x and "name" in x + for x in v + ) + ): + for g in v: + out[g["id"]] = (g["slug"], g["name"]) + else: + _collect_genres(v, out) + elif isinstance(node, list): + for item in node: + _collect_genres(item, out) + + +def main() -> int: + # Prova /genres (URL originale). Se 404 o schema inatteso, cade su /charts. + try: + data = _fetch_next_data(GENRES_URL) + queries = data["props"]["pageProps"]["dehydratedState"]["queries"] + for q in queries: + d = q.get("state", {}).get("data", {}) + if ( + isinstance(d, dict) + and "results" in d + and isinstance(d["results"], list) + ): + for g in d["results"]: + if "slug" in g and "id" in g and "name" in g: + print(f' "{g["slug"]}": ({g["id"]}, "{g["name"]}"),') + return 0 + except Exception as e: + print(f"# /genres non disponibile ({e}), fallback su /charts", file=sys.stderr) + + data = _fetch_next_data(CHARTS_URL) + genres: dict = {} + _collect_genres(data, genres) + if not genres: + print("nessun genere trovato su /charts", file=sys.stderr) + return 1 + for gid in sorted(genres): + slug, name = genres[gid] + print(f' "{slug}": ({gid}, "{name}"),') + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/tests/fixtures/beatport_melodic_top100.html b/tests/fixtures/beatport_melodic_top100.html new file mode 100644 index 0000000..95687f8 --- /dev/null +++ b/tests/fixtures/beatport_melodic_top100.html @@ -0,0 +1,357 @@ +Melodic House & Techno - TOP 100 | Download & Stream Melodic House & Techno on Beatport
Add to queue
Add to playlist
Melodic House & Techno
 
Title / Artists
Label / Remixers
Subgenre / BPM & Key
Released
 
Toxic
1
Add to queue
Add to playlist
125 BPM - C Minor
2026-07-03
Smalltown BoyExclusive
2
Add to queue
Add to playlist
125 BPM - C Major
2026-07-03
Here In My Arms (Enjoy The Silence)
3
Add to queue
Add to playlist
132 BPM - C Minor
2026-07-10
Come To Life
4
Add to queue
Add to playlist
130 BPM - D Major
2026-07-10
Coming HomeExclusive
5
Add to queue
Add to playlist
126 BPM - F Minor
2026-07-10
I See U EP
6
Add to queue
Add to playlist
122 BPM - F Major
2026-06-12
Not Exactly (Rinzen Remix Extended)
7
Add to queue
Add to playlist
128 BPM - F Major
2026-06-19
Ghost Dance
8
Add to queue
Add to playlist
125 BPM - C Minor
2025-12-26
Hollow Sun
9
Add to queue
Add to playlist
127 BPM - F Major
2026-07-10
Hollow Sun
10
Add to queue
Add to playlist
127 BPM - A Minor
2026-07-10
No Seatbelt
11
Add to queue
Add to playlist
Melodic House
123 BPM - A Minor
2026-07-10
Toxic
12
Add to queue
Add to playlist
127 BPM - Bb Major
2026-07-03
Take You There
13
Add to queue
Add to playlist
127 BPM - C Major
2026-06-19
Attract
14
Add to queue
Add to playlist
123 BPM - D Minor
2026-06-19
Set You FreeExclusive
15
Add to queue
Add to playlist
131 BPM - F Minor
2026-07-03
The Rapture Pt.III
16
Add to queue
Add to playlist
120 BPM - E Minor
2023-06-09
Bad Choices - Extended
17
Add to queue
Add to playlist
130 BPM - Db Major
2026-06-19
Science Fiction
18
Add to queue
Add to playlist
127 BPM - D Minor
2026-03-06
Heart Spin EP
19
Add to queue
Add to playlist
Melodic House
120 BPM - B Major
2026-05-29
Blue (Extended Mix)Exclusive
20
Add to queue
Add to playlist
123 BPM - D Minor
2026-06-05
In The Night (Extended Mix)
21
Add to queue
Add to playlist
128 BPM - Gb Major
2026-06-26
Be The One
22
Add to queue
Add to playlist
123 BPM - F Minor
2026-04-24
Feel So Right
23
Add to queue
Add to playlist
124 BPM - Gb Minor
2026-04-10
SAME MAN (feat. True Motion)
24
Add to queue
Add to playlist
124 BPM - F Minor
2026-06-05
The Shift (Extended Mix)
25
Add to queue
Add to playlist
124 BPM - Gb Major
2026-07-03
How Will I Know?
26
Add to queue
Add to playlist
Melodic House
127 BPM - C Major
2026-07-07
Dream
27
Add to queue
Add to playlist
Melodic House
120 BPM - B Minor
2026-06-26
In the Moment (Adriatique Extended Remix)
28
Add to queue
Add to playlist
124 BPM - Bb Minor
2025-04-04
Horizon (Eelke Kleijn Remix)Exclusive
29
Add to queue
Add to playlist
Melodic House
127 BPM - C Minor
2026-07-10
The Present
30
Add to queue
Add to playlist
Melodic House
128 BPM - B Minor
2026-06-26
No Rules EP
31
Add to queue
Add to playlist
124 BPM - Ab Major
2026-05-01
Recall (Extended Mix)Exclusive
32
Add to queue
Add to playlist
122 BPM - E Major
2026-04-10
Hot Sauce (Extended)Exclusive
33
Add to queue
Add to playlist
129 BPM - Gb Major
2026-05-01
Red In The Desert (Joseph Capriati Remix)
34
Add to queue
Add to playlist
130 BPM - E Minor
2026-06-26
Heart Spin EP
35
Add to queue
Add to playlist
Melodic House
122 BPM - Bb Minor
2026-05-29
Western Dream Remixed (Extended)
36
Add to queue
Add to playlist
123 BPM - F Major
2026-07-03
Quantum Echoes Pt. I
37
Add to queue
Add to playlist
128 BPM - D Major
2025-09-19
Messy (Extended)
38
Add to queue
Add to playlist
Messy Extended
This media contains explicit material.
120 BPM - Gb Minor
2026-06-25
Voodoo Doll (Extended Mix)Exclusive
39
Add to queue
Add to playlist
124 BPM - Db Major
2026-07-03
NO SLEEP
41
Add to queue
Add to playlist
Melodic House
130 BPM - E Major
2026-06-19
Trippy Yeah
42
Add to queue
Add to playlist
123 BPM - A Major
2025-06-27
More Love  (Rampa &ME Remix)
43
Add to queue
Add to playlist
122 BPM - B Minor
2023-10-27
Secret Weapons Part 18
44
Add to queue
Add to playlist
122 BPM - Eb Minor
2026-05-22
Secret Weapons Part 18
45
Add to queue
Add to playlist
155 BPM - D Major
2026-05-22
Beg You
46
Add to queue
Add to playlist
128 BPM - D Minor
2026-06-26
Annihilation (Extended Mix)
47
Add to queue
Add to playlist
130 BPM - D Minor
2026-05-22
No MoreExclusive
49
Add to queue
Add to playlist
124 BPM - B Minor
2026-07-10
Saying Hey! (Extended Mix)
50
Add to queue
Add to playlist
125 BPM - Bb Minor
2026-06-05
Didn't Miss You
51
Add to queue
Add to playlist
Melodic House
122 BPM - F Minor
2026-05-01
UH HUH
52
Add to queue
Add to playlist
123 BPM - D Major
2026-02-06
We Are The People (ARTBAT Extended Remix)
53
Add to queue
Add to playlist
125 BPM - E Minor
2024-12-06
Blackout
54
Add to queue
Add to playlist
128 BPM - E Minor
2026-06-19
Waitin' (Extended Mix)
55
Add to queue
Add to playlist
122 BPM - Gb Major
2025-10-10
Aria
56
Add to queue
Add to playlist
122 BPM - C Major
2023-09-22
Rivers and Homes Retake
57
Add to queue
Add to playlist
127 BPM - Ab Major
2026-04-24
At Night - Anyma x Layton Giordani Extended Remix
58
Add to queue
Add to playlist
127 BPM - F Major
2025-06-27
Voices In My Head
59
Add to queue
Add to playlist
128 BPM - D Major
2025-02-14
The Only One
60
Add to queue
Add to playlist
Melodic House
122 BPM - D Minor
2026-05-15
EVERYTHING IN ITS RIGHT PLACE
61
Add to queue
Add to playlist
124 BPM - C Major
2026-01-30
DIGITAL ANIMAL
62
Add to queue
Add to playlist
128 BPM - F Major
2026-07-10
Touch Me
63
Add to queue
Add to playlist
124 BPM - D Major
2026-05-29
Lumen (Extended Mix)Exclusive
64
Add to queue
Add to playlist
120 BPM - C Minor
2026-07-03
Dark Matter Extended Remixes
65
Add to queue
Add to playlist
126 BPM - A Minor
2025-12-12
Yosemite (Extended)
66
Add to queue
Add to playlist
144 BPM - Ab Major
2024-12-13
Return to Oz (ARTBAT Remix)
67
Add to queue
Add to playlist
124 BPM - D Minor
2019-05-17
Exhale EP
68
Add to queue
Add to playlist
Melodic House
126 BPM - C Minor
2026-07-10
Feel Good (Extended Mix)Exclusive
69
Add to queue
Add to playlist
128 BPM - C Major
2026-07-03
Crazy For It
70
Add to queue
Add to playlist
120 BPM - Ab Minor
2025-05-30
Miracle - RÜFÜS DU SOL Remix
71
Add to queue
Add to playlist
123 BPM - C Major
2023-10-13
Ain't Changin
72
Add to queue
Add to playlist
122 BPM - B Minor
2026-07-10
Trainers OnExclusive
73
Add to queue
Add to playlist
125 BPM - Eb Major
2026-07-03
Heavenly (Extended Mix)Exclusive
74
Add to queue
Add to playlist
124 BPM - Ab Minor
2026-06-26
B4U & Tripidi
75
Add to queue
Add to playlist
120 BPM - Bb Minor
2026-06-26
Reflections (Oliver Koletzki Remix)
76
Add to queue
Add to playlist
127 BPM - F Major
2026-06-19
CloserExclusive
78
Add to queue
Add to playlist
125 BPM - C Major
2026-04-03
Tell Me Why - MEDUZA Remix
79
Add to queue
Add to playlist
126 BPM - B Major
2022-09-02
Hey Bro
80
Add to queue
Add to playlist
127 BPM - C Major
2026-06-26
MANTRA
81
Add to queue
Add to playlist
Melodic House
128 BPM - C Minor
2026-05-15
Pa Ca
82
Add to queue
Add to playlist
128 BPM - B Major
2026-05-01
Turn Up The Dose (Extended Mix)
83
Add to queue
Add to playlist
130 BPM - D Major
2026-04-10
Surrender (Extended Version)Exclusive
84
Add to queue
Add to playlist
125 BPM - A Minor
2026-07-09
I See U EP
85
Add to queue
Add to playlist
120 BPM - E Major
2026-06-12
1886
86
Add to queue
Add to playlist
122 BPM - E Major
2026-04-10
Rock Like This EP
87
Add to queue
Add to playlist
125 BPM - D Minor
2026-04-17
Does It Matter (Ajna Remix)
88
Add to queue
Add to playlist
120 BPM - G Minor
2023-05-19
Pjanoo
89
Add to queue
Add to playlist
126 BPM - G Minor
2008-08-29
Technicolor (Extended Mix)
90
Add to queue
Add to playlist
124 BPM - D Minor
2026-06-19
Late at Night (Extended Mix)
91
Add to queue
Add to playlist
129 BPM - D Major
2026-03-12
Come AliveExclusive
92
Add to queue
Add to playlist
125 BPM - Eb Major
2026-07-10
Sweat
93
Add to queue
Add to playlist
124 BPM - D Minor
2026-06-18
Ghosts (Extended Mix)
94
Add to queue
Add to playlist
130 BPM - E Major
2026-05-29
Cloudy Eyes (Dance Tonight)
95
Add to queue
Add to playlist
122 BPM - F Minor
2025-09-26
The Spot
96
Add to queue
Add to playlist
128 BPM - C Minor
2025-06-20
Feel The Same
97
Add to queue
Add to playlist
Melodic House
125 BPM - Gb Major
2026-07-03
Spotlight
98
Add to queue
Add to playlist
122 BPM - Eb Minor
2026-04-24
Lazer Beams Remixes
99
Add to queue
Add to playlist
127 BPM - E Major
2026-04-10
Giv Me Luv (Remixes 26)
100
Add to queue
Add to playlist
126 BPM - G Major
2026-02-27
\ No newline at end of file