datei() fix

This commit is contained in:
mikka 2026-05-01 22:07:06 +02:00
parent dccbad1d1b
commit 666e79e8ce
2 changed files with 127 additions and 125 deletions

247
app.py
View file

@ -6,166 +6,167 @@ import json
import os import os
def wikiapi(id,field): def wikiapi(id,field):
if os.path.isdir("data"): if os.path.isdir("data"):
pass pass
else: else:
os.mkdir("data") os.mkdir("data")
name = f"data/{id}_{field}.json" name = f"data/{id}_{field}.json"
try: try:
with open(name, "r") as f: with open(name, "r") as f:
data = json.load(f) data = json.load(f)
except OSError: 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'}) 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() data = r.json()
with open(name, "x") as f: with open(name, "x") as f:
json.dump(data, f,indent=2,ensure_ascii=False) json.dump(data, f,indent=2,ensure_ascii=False)
return data[field] return data[field]
def wikisuche(text): def wikisuche(text):
mitp1344 = [] mitp1344 = []
ohnep1344 = [] 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'}) 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"]: for result in r.json()["results"]:
if getescedition(result["id"]): if getescedition(result["id"]):
mitp1344.append(result) mitp1344.append(result)
else: else:
ohnep1344.append(result) ohnep1344.append(result)
return mitp1344 + ohnep1344 return mitp1344 + ohnep1344
def getescedition(songId): def getescedition(songId):
statements = wikiapi(songId,"statements") statements = wikiapi(songId,"statements")
if "P1344" in statements: if "P1344" in statements:
for statement in statements["P1344"]: for statement in statements["P1344"]:
id = statement["value"]["content"] id = statement["value"]["content"]
escdata = wikiapi(id,"statements") escdata = wikiapi(id,"statements")
if escdata["P31"][0]["value"]["content"] == "Q110288240": if escdata["P31"][0]["value"]["content"] == "Q110288240":
return id,statement return id,statement
def datei(id): def datei(id):
file = glob("static/"+id+".*") file = glob("static/"+id+".*")
if file == []: if file == []:
subprocess.run(["yt-dlp",f"http://youtu.be/{id}","-x","-o",id],cwd="static") subprocess.run(["yt-dlp",f"http://youtu.be/{id}","-x","-o",id],cwd="static")
file = glob("static/"+id+".*") file = glob("static/"+id+".*")
audio = file[0].replace("static/", "") if file === []:
audio = file[0].replace("static/", "")
return audio return audio
def kartenGeneriren(song): def kartenGeneriren(song):
id = song["wikiid"] id = song["wikiid"]
statements = wikiapi(id,"statements") statements = wikiapi(id,"statements")
labels = wikiapi(id,"labels") labels = wikiapi(id,"labels")
song["titel"] = statements.get("P1476",[{"value": {"content":{"text":labels["en"]}}}])[0]["value"]["content"]["text"] 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"]) song["laenge"] = int(statements.get("P2047",[{"value": {"content":{"amount":"0"}}}])[0]["value"]["content"]["amount"])
escedition = getescedition(id) escedition = getescedition(id)
if escedition: if escedition:
(escedition,statement)=escedition (escedition,statement)=escedition
song["jahrgang"] = wikiapi(escedition,"labels")["en"] song["jahrgang"] = wikiapi(escedition,"labels")["en"]
qualifiers = statement["qualifiers"] qualifiers = statement["qualifiers"]
for qualifier in qualifiers: for qualifier in qualifiers:
if qualifier["property"]["id"] == "P1352": if qualifier["property"]["id"] == "P1352":
song["plazirung"] = str(int(qualifier["value"]["content"]["amount"]))+"." 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",[]))) 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: if "ytid" not in song and "P1651" in statements:
song["ytid"] = statements["P1651"][0]["value"]["content"] song["ytid"] = statements["P1651"][0]["value"]["content"]
if "ytid" in song: if "ytid" in song:
song["datei"] = datei(song["ytid"]) song["datei"] = datei(song["ytid"])
song["img"] = f"http://img.youtube.com/vi/{ song["ytid"] }/sddefault.jpg" song["img"] = f"http://img.youtube.com/vi/{ song["ytid"] }/sddefault.jpg"
if "P6218" in statements: if "P6218" in statements:
song["text"] = f"//genius.com/{statements["P6218"][0]["value"]["content"]}" song["text"] = f"//genius.com/{statements["P6218"][0]["value"]["content"]}"
if "P18" in statements: 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" 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: 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" 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 = Flask(__name__)
@app.template_filter('zeit') @app.template_filter('zeit')
def zeit(sekunden): def zeit(sekunden):
minuten = sekunden // 60 minuten = sekunden // 60
rest = sekunden - minuten * 60 rest = sekunden - minuten * 60
return f"{minuten}:{rest:02}" return f"{minuten}:{rest:02}"
@app.route("/") @app.route("/")
def hello_world(): def hello_world():
liste = request.args.get("liste") liste = request.args.get("liste")
if liste is None: if liste is None:
return redirect("/playlists") return redirect("/playlists")
with open(liste+".json","r") as f: with open(liste+".json","r") as f:
songs = json.load(f) songs = json.load(f)
for song in songs: for song in songs:
kartenGeneriren(song) kartenGeneriren(song)
gesamtLaenge = 0 gesamtLaenge = 0
for song in songs: for song in songs:
gesamtLaenge += song["laenge"] gesamtLaenge += song["laenge"]
return render_template('index.html', karten=songs,gesamtLaenge=gesamtLaenge,liste=liste ) return render_template('index.html', karten=songs,gesamtLaenge=gesamtLaenge,liste=liste )
@app.route("/playlists") @app.route("/playlists")
def playlists(): def playlists():
listen = glob("*.json") listen = glob("*.json")
listen = (liste.replace(".json","") for liste in listen) listen = (liste.replace(".json","") for liste in listen)
return render_template('playlists.html',lists=listen) return render_template('playlists.html',lists=listen)
@app.route("/neueliste") @app.route("/neueliste")
def neueliste(): def neueliste():
name = request.args.get("name") name = request.args.get("name")
if name is not None: if name is not None:
with open(name +".json", "x") as f: with open(name +".json", "x") as f:
json.dump([],f) json.dump([],f)
return redirect("/?liste="+name) return redirect("/?liste="+name)
print(liste) print(liste)
return render_template('neueliste.html',name=name) return render_template('neueliste.html',name=name)
@app.route("/suche") @app.route("/suche")
def suche(): def suche():
such = request.args.get("suche") such = request.args.get("suche")
liste = request.args.get("liste") liste = request.args.get("liste")
if such is not None: if such is not None:
ergebnisse = wikisuche(such) ergebnisse = wikisuche(such)
else: else:
ergebnisse = [] ergebnisse = []
return render_template('suche.html', ergebnisse=ergebnisse,anfrage=such,liste=liste) return render_template('suche.html', ergebnisse=ergebnisse,anfrage=such,liste=liste)
@app.route("/suche",methods=["POST"]) @app.route("/suche",methods=["POST"])
def suche_finden(): def suche_finden():
liste = request.args.get("liste") liste = request.args.get("liste")
with open(liste +".json","r") as f: with open(liste +".json","r") as f:
songs = json.load(f) songs = json.load(f)
song = {"wikiid":request.form.get("id")} song = {"wikiid":request.form.get("id")}
kartenGeneriren(song) kartenGeneriren(song)
songs.append(song) songs.append(song)
with open(liste+".json","w") as f: with open(liste+".json","w") as f:
json.dump(songs,f,indent=2,ensure_ascii=False) json.dump(songs,f,indent=2,ensure_ascii=False)
return redirect("/suche?liste="+liste,303) return redirect("/suche?liste="+liste,303)
@app.route("/remove") @app.route("/remove")
def admin(): def admin():
liste = request.args.get("liste") liste = request.args.get("liste")
if liste is None: if liste is None:
return redirect("/playlists") return redirect("/playlists")
with open(liste+".json","r") as f: with open(liste+".json","r") as f:
songs = json.load(f) songs = json.load(f)
for song in songs: for song in songs:
kartenGeneriren(song) kartenGeneriren(song)
gesamtLaenge = 0 gesamtLaenge = 0
for song in songs: for song in songs:
gesamtLaenge += song["laenge"] gesamtLaenge += song["laenge"]
return render_template('index.html', karten=songs,gesamtLaenge=gesamtLaenge,liste=liste,admin=True) return render_template('index.html', karten=songs,gesamtLaenge=gesamtLaenge,liste=liste,admin=True)
@app.route("/remove",methods=["POST"]) @app.route("/remove",methods=["POST"])
def loeschen(): def loeschen():
liste = request.args.get("liste") liste = request.args.get("liste")
song = int(request.form.get("index")) song = int(request.form.get("index"))
with open(liste+".json","r") as f: with open(liste+".json","r") as f:
print(liste+".json") print(liste+".json")
songs = json.load(f) songs = json.load(f)
print(songs) print(songs)
print(songs) print(songs)
del songs[song] del songs[song]
with open(liste+".json","w") as f: with open(liste+".json","w") as f:
json.dump(songs,f,indent=2,ensure_ascii=False) json.dump(songs,f,indent=2,ensure_ascii=False)
return redirect("/remove?liste="+liste,303) return redirect("/remove?liste="+liste,303)

View file

@ -7,6 +7,7 @@ playcolor = "#00ff3c"
loop = true loop = true
function onplay(id){ function onplay(id){
//What is id
id = parseInt(id) id = parseInt(id)
if(id>0){ if(id>0){
articles[id-1].style.filter = "grayscale("+(id+1)*20+"%)" articles[id-1].style.filter = "grayscale("+(id+1)*20+"%)"