Esc-Playlists/app.py

175 lines
7.7 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from flask import Flask, render_template, request, redirect
from glob import glob
import subprocess
import requests
import json
import os
def wikiapi(id,field):
if os.path.isdir("data"):
pass
else:
os.mkdir("data")
name = f"data/{id}_{field}.json"
try:
with open(name, "r") as f:
data = json.load(f)
except OSError:
r = requests.get("https://www.wikidata.org/w/rest.php/wikibase/v1/entities/items/"+id+"?_fields="+field, headers={"user-agent":'esc/0.0(mikka@kleinrot.net)','Authorization': 'Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiJhNDBhYmZjYzQxZTlkOTc2YzJiN2NmODZkYzIwMmQzZiIsImp0aSI6ImQ3ODQ4YmJhNjZlMWYzYzdhZGZmODU5NTdmZWE1YjMxODBhMzE2NTc4YWYyMWMzZGZhZGJiOTZlZmM3ZTgyMmJkMTE4YTQ4YWMzMDM2ZmQyIiwiaWF0IjoxNzc1OTE4OTc1LjkzMjQsIm5iZiI6MTc3NTkxODk3NS45MzI0MDEsImV4cCI6MzMzMzI4Mjc3NzUuOTI5NDA1LCJzdWIiOiIxMzEiLCJpc3MiOiJodHRwczovL21ldGEud2lraW1lZGlhLm9yZyIsInJhdGVsaW1pdCI6eyJyZXF1ZXN0c19wZXJfdW5pdCI6NTAwMCwidW5pdCI6IkhPVVIifSwic2NvcGVzIjpbImJhc2ljIl19.WLXRXxNjsZ1kIK2RX-Wds59W8Z1CWphbiV3UBEWvm5STWZ6uvpHZpx5d9lomK5-H56G3259_DavuTymdebQTmAwkeuCGh1gb60u9_4MzmGgspQHBPq3mWX879AUVW69uqsSz2x2zIz-ZUmt5TrZM7X3OBxE01nhVBoiDWnlW4Gt19FjwBQ9WjXzrFHsH9A7BtPzgbKROMXACRQBqh9XZXkN23PvnEV08sx63AGB0cZBkteIsnIfm49-Ht2_DTZKd4_MpEw9TZjOHSjY9odyImXidZOgy7NadT-LwAKQiVlSn6UZWTvgsG6xwP6sad_ctqU1ZupcOJLzd158DhrLAEMk_Qq9-piTQDYtLzWfLx44Jatjae6-0nilOgvrB0XQJC6cTihVk3-9Lyn6Y-e6yIDnEHIIIBj0J8PUv5IJjAojo-2uZ4w8omEzCWDEzf95_GSZmRwj_nRNCVs5jQpVhG9hFpOm2OrTrhqPgYet_dsl3QVEbvtGnlVzCw7j9sj_86axAC1hklQQso6AiAAzEmOiTfC6VyrP8sFjbnDlLBCEiTkYTvOTp5nuYRC8VdwJQm6NJIafjNn5ihp4T8OvJQyzsK1HDYlthvW54-co2gPoeIX-cBItvdrCBNDofoA9bIP3zzwGXdvy1b7lofx5WekWKAGytPCfsr7i2ZJB93xU'})
data = r.json()
with open(name, "x") as f:
json.dump(data, f,indent=2,ensure_ascii=False)
return data[field]
def wikisuche(text):
mitp1344 = []
ohnep1344 = []
r = requests.get("https://www.wikidata.org/w/rest.php/wikibase/v1/search/items?q="+text+"&language=en", headers={"user-agent":'esc/0.0(mikka@kleinrot.net)','Authorization': 'Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiJhNDBhYmZjYzQxZTlkOTc2YzJiN2NmODZkYzIwMmQzZiIsImp0aSI6ImQ3ODQ4YmJhNjZlMWYzYzdhZGZmODU5NTdmZWE1YjMxODBhMzE2NTc4YWYyMWMzZGZhZGJiOTZlZmM3ZTgyMmJkMTE4YTQ4YWMzMDM2ZmQyIiwiaWF0IjoxNzc1OTE4OTc1LjkzMjQsIm5iZiI6MTc3NTkxODk3NS45MzI0MDEsImV4cCI6MzMzMzI4Mjc3NzUuOTI5NDA1LCJzdWIiOiIxMzEiLCJpc3MiOiJodHRwczovL21ldGEud2lraW1lZGlhLm9yZyIsInJhdGVsaW1pdCI6eyJyZXF1ZXN0c19wZXJfdW5pdCI6NTAwMCwidW5pdCI6IkhPVVIifSwic2NvcGVzIjpbImJhc2ljIl19.WLXRXxNjsZ1kIK2RX-Wds59W8Z1CWphbiV3UBEWvm5STWZ6uvpHZpx5d9lomK5-H56G3259_DavuTymdebQTmAwkeuCGh1gb60u9_4MzmGgspQHBPq3mWX879AUVW69uqsSz2x2zIz-ZUmt5TrZM7X3OBxE01nhVBoiDWnlW4Gt19FjwBQ9WjXzrFHsH9A7BtPzgbKROMXACRQBqh9XZXkN23PvnEV08sx63AGB0cZBkteIsnIfm49-Ht2_DTZKd4_MpEw9TZjOHSjY9odyImXidZOgy7NadT-LwAKQiVlSn6UZWTvgsG6xwP6sad_ctqU1ZupcOJLzd158DhrLAEMk_Qq9-piTQDYtLzWfLx44Jatjae6-0nilOgvrB0XQJC6cTihVk3-9Lyn6Y-e6yIDnEHIIIBj0J8PUv5IJjAojo-2uZ4w8omEzCWDEzf95_GSZmRwj_nRNCVs5jQpVhG9hFpOm2OrTrhqPgYet_dsl3QVEbvtGnlVzCw7j9sj_86axAC1hklQQso6AiAAzEmOiTfC6VyrP8sFjbnDlLBCEiTkYTvOTp5nuYRC8VdwJQm6NJIafjNn5ihp4T8OvJQyzsK1HDYlthvW54-co2gPoeIX-cBItvdrCBNDofoA9bIP3zzwGXdvy1b7lofx5WekWKAGytPCfsr7i2ZJB93xU'})
for result in r.json()["results"]:
if getescedition(result["id"]):
mitp1344.append(result)
else:
ohnep1344.append(result)
return mitp1344 + ohnep1344
def getescedition(songId):
statements = wikiapi(songId,"statements")
if "P1344" in statements:
for statement in statements["P1344"]:
id = statement["value"]["content"]
escdata = wikiapi(id,"statements")
if escdata["P31"][0]["value"]["content"] == "Q110288240":
return id,statement
def datei(id):
file = glob("static/"+id+".*")
if file == []:
subprocess.run(["yt-dlp",f"http://youtu.be/{id}","-x","-o",id],cwd="static")
file = glob("static/"+id+".*")
if file != []:
audio = file[0].replace("static/", "")
else:
audio = None
print(audio)
return audio
def kartenGeneriren(song):
id = song["wikiid"]
print(id)
statements = wikiapi(id,"statements")
labels = wikiapi(id,"labels")
song["titel"] = statements.get("P1476",[{"value": {"content":{"text":labels["en"]}}}])[0]["value"]["content"]["text"]
song["laenge"] = int(statements.get("P2047",[{"value": {"content":{"amount":"0"}}}])[0]["value"]["content"]["amount"])
escedition = getescedition(id)
if escedition:
(escedition,statement)=escedition
song["jahrgang"] = wikiapi(escedition,"labels")["en"]
qualifiers = statement["qualifiers"]
for qualifier in qualifiers:
if qualifier["property"]["id"] == "P1352":
song["plazirung"] = str(int(qualifier["value"]["content"]["amount"]))+"."
song["interprete"] = " x ".join(set(wikiapi(statement["value"]["content"],"labels")["en"] for statement in statements.get("P175",[])))
if "ytid" not in song and "P1651" in statements:
song["ytid"] = statements["P1651"][0]["value"]["content"]
if "ytid" in song:
song["datei"] = datei(song["ytid"])
song["img"] = f"http://img.youtube.com/vi/{ song["ytid"] }/sddefault.jpg"
if "P6218" in statements:
song["text"] = f"//genius.com/{statements["P6218"][0]["value"]["content"]}"
if "P18" in statements:
song["img"] = f"https://commons.wikimedia.org/w/index.php?title=Special:Redirect/file/{statements["P18"][0]["value"]["content"]}&width=300"
if "img" not in song:
song["img"] = "https://commons.wikimedia.org/w/index.php?title=Special:Redirect/file/Eurovision_Song_Contest_heart_(20142025).svg&width=300"
app = Flask(__name__)
@app.template_filter('zeit')
def zeit(sekunden):
minuten = sekunden // 60
rest = sekunden - minuten * 60
return f"{minuten}:{rest:02}"
@app.route("/")
def hello_world():
liste = request.args.get("liste")
if liste is None:
return redirect("/playlists")
with open(liste+".json","r") as f:
songs = json.load(f)
for song in songs:
kartenGeneriren(song)
gesamtLaenge = 0
for song in songs:
gesamtLaenge += song["laenge"]
return render_template('index.html', karten=songs,gesamtLaenge=gesamtLaenge,liste=liste )
@app.route("/playlists")
def playlists():
listen = glob("*.json")
listen = (liste.replace(".json","") for liste in listen)
return render_template('playlists.html',lists=listen)
@app.route("/neueliste")
def neueliste():
name = request.args.get("name")
if name is not None:
with open(name +".json", "x") as f:
json.dump([],f)
return redirect("/?liste="+name)
print(liste)
return render_template('neueliste.html',name=name)
@app.route("/suche")
def suche():
such = request.args.get("suche")
liste = request.args.get("liste")
if such is not None:
ergebnisse = wikisuche(such)
else:
ergebnisse = []
return render_template('suche.html', ergebnisse=ergebnisse,anfrage=such,liste=liste)
@app.route("/suche",methods=["POST"])
def suche_finden():
liste = request.args.get("liste")
with open(liste +".json","r") as f:
songs = json.load(f)
song = {"wikiid":request.form.get("id")}
kartenGeneriren(song)
songs.append(song)
with open(liste+".json","w") as f:
json.dump(songs,f,indent=2,ensure_ascii=False)
return redirect("/suche?liste="+liste,303)
@app.route("/remove")
def admin():
liste = request.args.get("liste")
if liste is None:
return redirect("/playlists")
with open(liste+".json","r") as f:
songs = json.load(f)
for song in songs:
kartenGeneriren(song)
gesamtLaenge = 0
for song in songs:
gesamtLaenge += song["laenge"]
return render_template('index.html', karten=songs,gesamtLaenge=gesamtLaenge,liste=liste,admin=True)
@app.route("/remove",methods=["POST"])
def loeschen():
liste = request.args.get("liste")
song = int(request.form.get("index"))
with open(liste+".json","r") as f:
print(liste+".json")
songs = json.load(f)
print(songs)
print(songs)
del songs[song]
with open(liste+".json","w") as f:
json.dump(songs,f,indent=2,ensure_ascii=False)
return redirect("/remove?liste="+liste,303)