73 lines
2.2 KiB
Python
73 lines
2.2 KiB
Python
# plex_helpers.py
|
|
import requests
|
|
from config import PLEX_URL, PLEX_TOKEN
|
|
from lastfm_helpers import get_top_tracks, lf_request
|
|
|
|
HEADERS = {
|
|
"X-Plex-Token": PLEX_TOKEN
|
|
}
|
|
|
|
def get_artist_name_from_mbid(mbid):
|
|
js = lf_request("artist.getInfo", mbid=mbid)
|
|
if js and "artist" in js:
|
|
return js["artist"]["name"]
|
|
return None
|
|
|
|
def search_track(artist, track):
|
|
query = f"{artist} {track}"
|
|
params = {
|
|
"type": "10", # track
|
|
"query": query
|
|
}
|
|
res = requests.get(f"{PLEX_URL}/search", params=params, headers=HEADERS)
|
|
res.raise_for_status()
|
|
return res.json()
|
|
|
|
def get_top_tracks_keys(artist_names, top_n=3, already_added=None):
|
|
if already_added is None:
|
|
already_added = []
|
|
|
|
keys = []
|
|
for artist in artist_names:
|
|
top_tracks = get_top_tracks(artist, limit=top_n)
|
|
for track in top_tracks:
|
|
try:
|
|
result = search_track(artist, track)
|
|
items = result.get("MediaContainer", {}).get("Metadata", [])
|
|
for item in items:
|
|
key = item.get("ratingKey")
|
|
if key and key not in already_added:
|
|
keys.append(key)
|
|
except Exception:
|
|
continue
|
|
return keys
|
|
|
|
def create_or_update_playlist(name, mbid_list, top_n=3, already_added=None):
|
|
artist_names = []
|
|
for mbid in mbid_list:
|
|
name = get_artist_name_from_mbid(mbid)
|
|
if name:
|
|
artist_names.append(name)
|
|
|
|
track_keys = get_top_tracks_keys(artist_names, top_n=top_n, already_added=already_added)
|
|
|
|
if not track_keys:
|
|
print("[PLEX] Inga nya spår hittades för de angivna artisterna.")
|
|
return False, []
|
|
|
|
keys_csv = ",".join(track_keys)
|
|
url = f"{PLEX_URL}/playlists"
|
|
payload = {
|
|
"type": "audio",
|
|
"title": name,
|
|
"smart": "0",
|
|
"uri": f"server://{PLEX_TOKEN}/com.plexapp.plugins.library/library/metadata/{keys_csv}"
|
|
}
|
|
r = requests.post(url, headers=HEADERS, params=payload)
|
|
if r.status_code == 201:
|
|
print(f"[PLEX] ✅ Spellistan '{name}' skapades med {len(track_keys)} spår.")
|
|
return True, track_keys
|
|
else:
|
|
print(f"[PLEX] ❌ Misslyckades med att skapa spellista: {r.text}")
|
|
return False, []
|
|
|