This commit is contained in:
matthias@matsewe.de
2024-05-21 12:20:25 +02:00
parent df764bd85d
commit 9401e0727b
15 changed files with 425 additions and 84 deletions

View File

@@ -5,6 +5,7 @@ from fastapi.responses import HTMLResponse
from fastapi.templating import Jinja2Templates
from app.dependencies import engine
from app.sql_models import Base
from app.routers.songs import get_songs
Base.metadata.create_all(engine)
@@ -25,6 +26,24 @@ async def root(request: Request, session_id : str = ""):
request=request, name="landing.html"
)
else:
songs = await get_songs(session_id)
songs_by_category = {}
all_categories = set()
for song in songs:
if song.main_category not in songs_by_category:
songs_by_category[song.main_category] = []
songs_by_category[song.main_category].append(song)
all_categories.update(song.categories.keys())
return templates.TemplateResponse(
request=request, name="voting.html"
)
request=request, name="voting.html", context={
"songs_by_category": songs_by_category,
"all_categories": {c: i+1 for i, c in enumerate(all_categories)},
"session_id": session_id
}
)
#@app.get("/vote", response_class=HTMLResponse)
#async def vote(request: Request, session_id : str = ""):
# return templates.TemplateResponse(
# request=request, name="voting-old.html"
# )

View File

@@ -13,8 +13,10 @@ class Song(BaseModel):
id: int
og_artist: Optional[str]
aca_artist: Optional[str]
title: str
yt_url: Optional[str]
title: Optional[str]
url: Optional[str]
yt_id: Optional[str]
spfy_id: Optional[str]
thumbnail: Optional[str]
is_aca: bool
arng_url: Optional[str]

View File

@@ -1,11 +1,17 @@
from fastapi import APIRouter, Security
from app.sql_models import SqlSong
from app.dependencies import session
from app.dependencies import engine
from app.routers.user import get_current_user
import pandas as pd
import numpy as np
import re
import requests
import os
from app.sql_models import Base
router = APIRouter(
prefix="/admin",
@@ -22,7 +28,10 @@ def get_main_category(categories) -> int:
else:
return np.argmax(categories != None, axis=0)
def youtube_url_validation(url):
def get_youtube_id(url):
if url is None:
return None
youtube_regex = (
r'(https?://)?(www\.)?'
'(youtube|youtu|youtube-nocookie)\.(com|be)/'
@@ -30,23 +39,38 @@ def youtube_url_validation(url):
youtube_regex_match = re.match(youtube_regex, url)
if youtube_regex_match:
return youtube_regex_match
return youtube_regex_match.group(6)
return False
return None
def get_thumbnail(url):
m = youtube_url_validation(url)
if url is None:
return "/static/cover.jpg"
m = get_youtube_id(url)
if m:
thumbnail_url = "https://img.youtube.com/vi/" + m.group(6) + "/mqdefault.jpg"
thumbnail_url = "https://img.youtube.com/vi/" + m + "/mqdefault.jpg"
return thumbnail_url
elif "spotify" in url:
return re.findall(r'(https?://i.scdn.co/image[^"]+)', requests.get(url).text)[0]
else:
return "/static/cover.jpg"
@router.post("/process_file")
async def create_upload_file(link_share: str):
song_list = pd.read_excel(link_share)
def get_spotify_id(url):
if url is None:
return None
if "spotify" in url:
return url.split("/track/")[1]
else:
return None
@router.post("/load_list")
async def create_upload_file():
Base.metadata.drop_all(engine)
Base.metadata.create_all(engine)
song_list = pd.read_excel(os.environ['LIST_URL'])
song_list = song_list.replace({np.nan: None})
song_list = song_list.replace({"n/a": None})
@@ -55,15 +79,25 @@ async def create_upload_file(link_share: str):
for row in song_list[1:].iterrows():
row = np.array(row[1])
yt_id = get_youtube_id(row[3])
spfy_id = get_spotify_id(row[3])
categories = {n: v for n, v in zip(
category_names, row[6:19] != None)}
if not np.any(list(categories.values())):
continue
s = SqlSong(og_artist=row[0],
aca_artist=row[1],
title=row[2],
yt_url=row[3],
url=row[3],
yt_id=yt_id,
spfy_id=spfy_id,
thumbnail=get_thumbnail(row[3]),
is_aca=row[4] == "ja",
arng_url=row[5],
categories={n: v for n, v in zip(
category_names, row[6:19] != None)},
categories=categories,
main_category=category_names[get_main_category(row[6:19])],
singable=row[19] != "nein"
)

View File

@@ -9,13 +9,24 @@ router = APIRouter(
responses={404: {"description": "Not found"}},
)
async def songify(s, votes):
return Song(**s.__dict__, vote=votes.get(s.id, None))
@router.get("/")
async def get_songs(user_id : str = "") -> list[Song]:
sqlsongs = session.query(SqlSong).filter(SqlSong.singable == True).all()
votes = session.query(SqlVote).filter(SqlVote.user_id == user_id).all()
votes = {v.song_id : v.vote for v in votes}
return [Song(**s.__dict__, vote=votes.get(s.id, None)) for s in sqlsongs] # type: ignore
songs = []
for s in sqlsongs:
try:
songs.append(Song(**s.__dict__, vote=votes.get(s.id, None)))
except:
print(s.__dict__)
pass
return songs
#return [Song(**s.__dict__, vote=votes.get(s.id, None)) for s in sqlsongs] # type: ignore
@router.post("/{song_id}/vote")
async def vote(song_id : str, user_id : str, vote : int):

View File

@@ -6,13 +6,26 @@ from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm, Se
from jose import JWTError, jwt
from passlib.context import CryptContext
from pydantic import BaseModel, ValidationError
import os
from app.secrets import SECRET_KEY, fake_users_db
#from app.secrets import SECRET_KEY, fake_users_db
# to get a string like this run:
# openssl rand -hex 32
ALGORITHM = "HS256"
ACCESS_TOKEN_EXPIRE_MINUTES = 60 * 24 * 31
SECRET_KEY = os.environ['SECRET_KEY']
fake_users_db = {
"admin": {
"username": "admin",
"email": "admin@example.com",
"hashed_password": os.environ["ADMIN_PWD"],
"disabled": False,
"scopes" : ["admin", "public"]
}
}
class Token(BaseModel):
@@ -28,7 +41,7 @@ class TokenData(BaseModel):
class User(BaseModel):
username: str
email: str | None = None
full_name: str | None = None
#full_name: str | None = None
disabled: bool | None = None
@@ -53,6 +66,7 @@ router = APIRouter(
def verify_password(plain_password, hashed_password):
print(get_password_hash(plain_password))
return pwd_context.verify(plain_password, hashed_password)

View File

@@ -9,7 +9,9 @@ class SqlSong(Base):
og_artist = Column(String)
aca_artist = Column(String)
title = Column(String)
yt_url = Column(String)
url = Column(String)
yt_id = Column(String)
spfy_id = Column(String)
thumbnail = Column(String)
is_aca = Column(Boolean)
arng_url = Column(String)