Mthrfkr commited on
Commit
39c3b8a
Β·
verified Β·
1 Parent(s): 06b1a06

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +37 -26
app.py CHANGED
@@ -9,7 +9,6 @@ CLIENT_ID = os.getenv("SPOTIFY_CLIENT_IDS", "").split(',')[0]
9
  CLIENT_SECRET = os.getenv("SPOTIFY_CLIENT_SECRETS", "").split(',')[0]
10
 
11
  def get_token():
12
- """Pide token con Client Credentials."""
13
  resp = requests.post(
14
  "https://accounts.spotify.com/api/token",
15
  data={"grant_type":"client_credentials"},
@@ -19,47 +18,59 @@ def get_token():
19
  return resp.json()["access_token"]
20
 
21
  def extract_pid(url):
22
- """Extrae el ID de playlist de la URL."""
23
  return url.strip().rstrip('/').split('/')[-1].split('?')[0]
24
 
25
  # β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”
26
- # FunciΓ³n POC
27
  # β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”
28
- def fetch_public_playlist(url):
29
  if not CLIENT_ID or not CLIENT_SECRET:
30
- return "❌ SPOTIFY_CLIENT_IDS o CLIENT_SECRETS faltantes"
31
  token = get_token()
32
  pid = extract_pid(url)
33
  if len(pid) != 22:
34
  return f"❌ ID invΓ‘lido: '{pid}'"
35
- # Metadata
36
- r = requests.get(
37
- f"https://api.spotify.com/v1/playlists/{pid}",
38
- headers={"Authorization": f"Bearer {token}"}
39
- )
40
- if r.status_code != 200:
41
- return f"❌ No pública o error {r.status_code}"
42
- info = r.json()
43
- name = info.get("name", "?")
44
- total = info.get("tracks", {}).get("total", "?")
45
- # Sample de tracks (limit 5)
46
- items = requests.get(
47
- f"https://api.spotify.com/v1/playlists/{pid}/tracks",
48
- headers={"Authorization": f"Bearer {token}"},
49
- params={"limit": 5}
50
- ).json().get("items", [])
51
- titles = [it["track"]["name"] for it in items if it.get("track")]
52
- return f"βœ… β€œ{name}”: {total} tracks\n🎡 Muestra: {titles}"
 
 
 
 
 
 
 
 
 
 
 
 
 
53
 
54
  # β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”
55
  # Interfaz Gradio
56
  # β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”
57
  iface = gr.Interface(
58
- fn=fetch_public_playlist,
59
  inputs=gr.Textbox(label="URL de playlist"),
60
  outputs="text",
61
- title="πŸ”Ž Checa playlist pΓΊblica",
62
- description="SΓ³lo playlists pΓΊblicas con Client Credentials"
63
  )
64
 
65
  if __name__ == "__main__":
 
9
  CLIENT_SECRET = os.getenv("SPOTIFY_CLIENT_SECRETS", "").split(',')[0]
10
 
11
  def get_token():
 
12
  resp = requests.post(
13
  "https://accounts.spotify.com/api/token",
14
  data={"grant_type":"client_credentials"},
 
18
  return resp.json()["access_token"]
19
 
20
  def extract_pid(url):
 
21
  return url.strip().rstrip('/').split('/')[-1].split('?')[0]
22
 
23
  # β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”
24
+ # FunciΓ³n full-fetch
25
  # β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”
26
+ def fetch_full_playlist(url):
27
  if not CLIENT_ID or not CLIENT_SECRET:
28
+ return "❌ Faltan credenciales SPOTIFY_CLIENT_IDS o SPOTIFY_CLIENT_SECRETS"
29
  token = get_token()
30
  pid = extract_pid(url)
31
  if len(pid) != 22:
32
  return f"❌ ID invΓ‘lido: '{pid}'"
33
+ headers = {"Authorization": f"Bearer {token}"}
34
+
35
+ # 1) Metadata bΓ‘sica
36
+ meta = requests.get(f"https://api.spotify.com/v1/playlists/{pid}", headers=headers)
37
+ if meta.status_code != 200:
38
+ return f"❌ Error {meta.status_code}: no es pública o no existe"
39
+ info = meta.json()
40
+ name = info.get("name", "–")
41
+ total = info.get("tracks", {}).get("total", 0)
42
+
43
+ # 2) Traer TODOS los tracks en batches de 100
44
+ nombres = []
45
+ limit = 100
46
+ offset = 0
47
+ while offset < total:
48
+ ruta = f"https://api.spotify.com/v1/playlists/{pid}/tracks"
49
+ params = {"limit": limit, "offset": offset}
50
+ r = requests.get(ruta, headers=headers, params=params)
51
+ r.raise_for_status()
52
+ items = r.json().get("items", [])
53
+ for it in items:
54
+ track = it.get("track")
55
+ if track and track.get("name"):
56
+ nombres.append(track["name"])
57
+ offset += limit
58
+
59
+ # 3) Formatear salida
60
+ # Si la lista es gigante, tal vez quieras cambiar salto de lΓ­nea por comas, o paginarla.
61
+ salida = [f"βœ… β€œ{name}”: {total} tracks"]
62
+ salida += [f"{i+1}. {t}" for i, t in enumerate(nombres)]
63
+ return "\n".join(salida)
64
 
65
  # β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”
66
  # Interfaz Gradio
67
  # β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”
68
  iface = gr.Interface(
69
+ fn=fetch_full_playlist,
70
  inputs=gr.Textbox(label="URL de playlist"),
71
  outputs="text",
72
+ title="πŸ”½ Baja toda la playlist",
73
+ description="Descarga el nombre y Β‘TODOS! los temas de una playlist pΓΊblica"
74
  )
75
 
76
  if __name__ == "__main__":