From 2623dfdf1a9e05c4cdbb212c69d9b8328380f93a Mon Sep 17 00:00:00 2001 From: mikka Date: Thu, 14 May 2026 23:29:06 +0200 Subject: [PATCH] Logo und andere kleinen Dinge --- app.py | 330 ++++++++++-------- ...ong_Contest_Wikidata_heart_(2014–2025).png | Bin 0 -> 4247 bytes ...ong_Contest_heart_Wikidata_(2014–2025).svg | 48 +++ static/script.js | 152 ++++---- templates/index.html | 66 ++-- templates/karte.html | 50 ++- templates/neueliste.html | 13 +- templates/playlists.html | 9 +- templates/suche.html | 9 +- 9 files changed, 422 insertions(+), 255 deletions(-) create mode 100644 static/Eurovision_Song_Contest_Wikidata_heart_(2014–2025).png create mode 100644 static/Eurovision_Song_Contest_heart_Wikidata_(2014–2025).svg diff --git a/app.py b/app.py index defbf85..fafa5ea 100644 --- a/app.py +++ b/app.py @@ -1,175 +1,231 @@ -from flask import Flask, render_template, request, redirect -from glob import glob -import subprocess -import requests import json import os +import subprocess +from glob import glob + +import requests +from flask import Flask, redirect, render_template, request + + +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 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 + mitpartsin = [] + ohnepartsin = [] + 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"]): + mitpartsin.append(result) + else: + ohnepartsin.append(result) + return mitpartsin + ohnepartsin + 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 - + statements = wikiapi(songId, "statements") + if "partsin" in statements: + for statement in statements["partsin"]: + 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+".*") + 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 - 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_(2014–2025).svg&width=300" + 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 "land" not in song and "P495" in statements: + song["land"] = wikiapi(statements["P495"][0]["value"]["content"], "labels")[ + "de" + ] + 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_(2014–2025).svg&width=300" + ) app = Flask(__name__) -@app.template_filter('zeit') + +@app.template_filter("zeit") def zeit(sekunden): - minuten = sekunden // 60 - rest = sekunden - minuten * 60 - return f"{minuten}:{rest:02}" + 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 ) + 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) + 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) + name = request.args.get("name") + if name is not None: + with open(name + ".json", "x") as f: + json.dump([], f) + return redirect("/?liste=" + name) + 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) + 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"]) + +@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) + 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) + 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"]) + +@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) + 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) diff --git a/static/Eurovision_Song_Contest_Wikidata_heart_(2014–2025).png b/static/Eurovision_Song_Contest_Wikidata_heart_(2014–2025).png new file mode 100644 index 0000000000000000000000000000000000000000..7496f99eb0e6053f56c0b7be439d8ebd368ceea4 GIT binary patch literal 4247 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 + diff --git a/static/script.js b/static/script.js index e97cb97..0141b0b 100644 --- a/static/script.js +++ b/static/script.js @@ -1,102 +1,98 @@ -const audios = document.querySelectorAll("audio") -const articles = document.querySelectorAll("article") -const kartenContainer = document.getElementById("flex-container") -outindex = 0 -playing = false -playcolor = "#00ff3c" -loop = true +const audios = document.querySelectorAll("audio"); +const articles = document.querySelectorAll("article"); +const kartenContainer = document.getElementById("flex-container"); +outindex = 0; +playing = false; +playcolor = "#00ff3c"; +loop = true; -function onplay(id){ - //What is id - id = parseInt(id) - if(id>0){ - articles[id-1].style.filter = "grayscale("+(id+1)*20+"%)" - articles[id-1].style.boxShadow = "0 0 0px 0px "+playcolor +function onplay(id) { + id = parseInt(id); + if (id > 0) { + articles[id - 1].style.filter = "grayscale(" + (id + 1) * 20 + "%)"; + articles[id - 1].style.boxShadow = "0 0 0px 0px " + playcolor; } - if(articles[id].offsetWidth * id == window.innerWidth/2){ - console.log(articles[id].offsetWidth) - kartenContainer.scrollWidth += articles[id].offsetWidth + if (articles[id].offsetWidth * id == window.innerWidth / 2) { + console.log(articles[id].offsetWidth); + kartenContainer.scrollWidth += articles[id].offsetWidth; } - articles[id].style.filter = "grayscale(0%)" - articles[id].style.margin = "8px" - articles[id].style.boxShadow = "0 0 6px 1px "+playcolor + articles[id].style.filter = "grayscale(0%)"; + articles[id].style.margin = "8px"; + articles[id].style.boxShadow = "0 0 6px 1px " + playcolor; } -function nächste(id){ - audios[id].pause() - id = parseInt(id) + 1 - audios[id].play() - onplay(id) +function nächste(id) { + audios[id].pause(); + id = parseInt(id) + 1; + audios[id].play(); + onplay(id); } -function vorherige(id){ - audios[id].pause() - audios[id-1].play() - onplay(id-1) +function vorherige(id) { + audios[id].pause(); + audios[id - 1].play(); + onplay(id - 1); } -function looptrue(){ - if(loop){ - loop = false - document.querySelector("#loop").innerHTML = "Kein Loop" - document.querySelector("#loop").style.beckground - } - else{ - loop = true - document.querySelector("#loop").innerHTML = "Loop" +function looptrue() { + if (loop) { + loop = false; + document.querySelector("#loop").innerHTML = "Kein Loop"; + document.querySelector("#loop").style.beckground; + } else { + loop = true; + document.querySelector("#loop").innerHTML = "Loop"; } } -function abspielendiese(id){ - if(playing){ +function abspielendiese(id) { + if (playing) { //ON PAUSE - audios[id].pause() - playing = false - articles[id].style.margin = "0px" - articles[id].style.boxShadow = "0 0 0px 0px "+playcolor - } - else{ + audios[id].pause(); + playing = false; + articles[id].style.margin = "0px"; + articles[id].style.boxShadow = "0 0 0px 0px " + playcolor; + } else { //ON PLAY - audios[id].play() - playing = true - onplay(id) + audios[id].play(); + playing = true; + onplay(id); } } -function abspielen(){ - if(playing){ +function abspielen() { + if (playing) { //ON PAUSE - audios[outindex].pause() - playing = false - articles[outindex].style.margin = "0px" - articles[outindex].style.boxShadow = "0 0 0px 0px "+playcolor - document.querySelector("#play").innerHTML = "Abspielen" - } - else{ + audios[outindex].pause(); + playing = false; + articles[outindex].style.margin = "0px"; + articles[outindex].style.boxShadow = "0 0 0px 0px " + playcolor; + document.querySelector("#play").innerHTML = "Abspielen"; + } else { //ON PLAY - audios[outindex].play() - playing = true - document.querySelector("#play").innerHTML = "Pausieren" - onplay(outindex) + audios[outindex].play(); + playing = true; + document.querySelector("#play").innerHTML = "Pausieren"; + onplay(outindex); } } -for (const [index,audio] of audios.entries()){ - audio.addEventListener("ended", (event) => { - if (index != audios.length -1){ - outindex = index +1 - audios[outindex].play() - onplay(index+1) - } - else{ - //Last song ON END - articles[index].style.filter = "grayscale(80%)" - articles[index].style.boxShadow = "0 0 0px 0px "+playcolor - articles[index].style.margin = "8px" - articles[index].style.boxShadow = "0 0 6px 1px "+playcolor - if(loop){ - audios[0].play() +for (const [index, audio] of audios.entries()) { + audio.addEventListener("ended", (event) => { + if (index != audios.length - 1) { + outindex = index + 1; + audios[outindex].play(); + onplay(index + 1); + } else { + //Last song ON END + articles[index].style.filter = "grayscale(80%)"; + articles[index].style.boxShadow = "0 0 0px 0px " + playcolor; + articles[index].style.margin = "8px"; + articles[index].style.boxShadow = "0 0 6px 1px " + playcolor; + if (loop) { + audios[0].play(); + } } - } - }) + }); } +//Audio visualising diff --git a/templates/index.html b/templates/index.html index 39d5eae..c8561b0 100644 --- a/templates/index.html +++ b/templates/index.html @@ -1,21 +1,23 @@ +

ESC Playlist

-

2026

-Du willst ein weiteres Lied in der Playlist? -

Die Playlist {{liste}} ist insgesamt {{ gesamtLaenge | zeit }} lang und enthält {{ karten|length }} Lieder

-

-
- {% for karte in karten %} - {% set karte_loop = loop %} - {% include "karte.html" %} - {% endfor %} +Du willst ein weiteres Lied in der Playlist? +

+ Die Playlist {{liste}} ist insgesamt {{ gesamtLaenge | zeit }} lang und + enthält {{ karten|length }} Lieder +

+

+ +

+
+ {% for karte in karten %} {% set karte_loop = loop %} {% include + "karte.html" %} {% endfor %}
- \ No newline at end of file + diff --git a/templates/karte.html b/templates/karte.html index b491d08..0f38853 100644 --- a/templates/karte.html +++ b/templates/karte.html @@ -1,24 +1,42 @@
- + {% if karte.ytid %} -

- +

+ +

+ {% endif %} +

{{ karte.titel}}

-

Übersetzter Titel:{{ karte.uetitel}}

-

Interpreten:{{ karte.interprete}}

- {% if karte.jahrgang %} -

Jahrgang: {{ karte.jahrgang }}

- {% endif %} - {% if karte.plazirung%} -

Plazirung: {{ karte.plazirung }}

- {% endif %} -

Länge: {{karte.laenge|zeit}}

-

Q-id: {{karte.wikiid}}

- {% if karte.text %} - Original Text + + {% if karte.jahrgang %} +

Jahrgang: {{ karte.jahrgang }}

+ {% endif %} {% if karte.plazirung%} +

Plazirung: {{ karte.plazirung }}

+ {% endif %} {% if karte.land %} +

Antretent für: {{karte.land}}

{% endif %} + +

Interpret(en): {{ karte.interprete}}

+ +

Länge: {{karte.laenge|zeit}}

+

+ {% if karte.text %} + Original Text + {% endif %} + Q-id:{{karte.wikiid}} +

{% if admin %} -
+
+ +
{% endif %}
diff --git a/templates/neueliste.html b/templates/neueliste.html index 43dcb4a..3911769 100644 --- a/templates/neueliste.html +++ b/templates/neueliste.html @@ -1,8 +1,19 @@ -
\ No newline at end of file + +
diff --git a/templates/playlists.html b/templates/playlists.html index 76d06c1..b83645d 100644 --- a/templates/playlists.html +++ b/templates/playlists.html @@ -11,8 +11,15 @@ text-align: center; font-size: smaller; } + #logo{ + object-fit: scale-down; + } + #logocontaner{ + margin: 3px; + } + {% for list in lists %} {{list}} {% endfor %} -Lust auf was neues? \ No newline at end of file +Lust auf was neues? diff --git a/templates/suche.html b/templates/suche.html index abab342..38cf154 100644 --- a/templates/suche.html +++ b/templates/suche.html @@ -4,7 +4,14 @@ text-align: center; color: black; } + #logo{ + object-fit: scale-down; + } + #logocontaner{ + margin: 3px; + } + {% if liste == empty %}

Du musst etwas in die Playlist Screiben

{% endif %} @@ -19,4 +26,4 @@

Leider gibt es den Eintrag {{anfrage}} nicht!

{%endif%} -Doch nicht? \ No newline at end of file +Doch nicht?