first commit

This commit is contained in:
2024-04-25 09:43:18 +02:00
commit bbd78faf09
4 changed files with 119 additions and 0 deletions
+4
View File
@@ -0,0 +1,4 @@
__pycache__
.venv
service_account.json
db.sqlite
+92
View File
@@ -0,0 +1,92 @@
from fastapi import FastAPI, HTTPException
from models import Genre, Song, GoogleFile
import gspread
from types import MethodType
from typing import Any
import pandas as pd
import numpy as np
import sqlalchemy
app = FastAPI()
dbEngine = sqlalchemy.create_engine('sqlite:///db.sqlite')
gc = gspread.service_account(filename="service_account.json") # type: ignore
google_files: dict[str, GoogleFile] = {}
spreadsheets: dict[str, gspread.Spreadsheet] = {} # type: ignore
selected_worksheets: dict[tuple[str, int], bool] = {}
def fetch_files():
if not(google_files):
for s in gc.http_client.request("get", gspread.http_client.DRIVE_FILES_API_V3_URL).json()["files"]: # type: ignore
google_files[s["id"]] = GoogleFile(file_id = s["id"], file_name = s["name"])
def load_spreadsheet(file_id):
if file_id not in spreadsheets:
spreadsheets[file_id] = gc.open_by_key(file_id)
@app.get("/")
def root():
return {"message": "Hello World"}
# Route to get google files (sheets)
@app.get("/admin/files")
def get_files() -> dict[str, GoogleFile]:
fetch_files()
return google_files
@app.get("/admin/files/{file_id}")
def get_worksheets(file_id: str) -> dict[int, str]:
fetch_files()
if file_id not in google_files:
raise HTTPException(status_code=404, detail="Spreadsheet not found.")
load_spreadsheet(file_id)
return {ws.id : ws.title for ws in spreadsheets[file_id].worksheets()} # type: ignore
@app.get("/admin/selected_worksheets")
def list_selected_worksheet() -> dict[tuple[str, int], bool]:
return selected_worksheets
@app.post("/admin/selected_worksheets")
def select_worksheet(file_id: str, worksheet_id: int, ignore_arrangement: bool = False):
selected_worksheets[(file_id, worksheet_id)] = ignore_arrangement
@app.delete("/admin/selected_worksheets")
def deselect_worksheet(file_id: str, worksheet_id: int):
del selected_worksheets[(file_id, worksheet_id)]
@app.post("/admin/process_worksheets")
def process_worksheets():
fetch_files()
song_list = []
for (file_id, worksheet_id), ignore_arrangement in selected_worksheets.items():
load_spreadsheet(file_id)
worksheet = spreadsheets[file_id].get_worksheet_by_id(worksheet_id)
worksheet_df = pd.DataFrame(worksheet.get_all_records())
last_column = np.where(worksheet_df.columns == "Kommentare")[0][0]
worksheet_df = worksheet_df.iloc[:, 0:last_column+1]
worksheet_df["Ignore Arrangement"] = ignore_arrangement
song_list.append(worksheet_df)
song_list = pd.concat(song_list)
song_list.to_sql(name = 'songs', con = dbEngine, index = False, if_exists = 'append')
# song_list.to_csv("song-list.csv")
# 1PMy17eraogNUz436w3aZKxyij39G1didaN02Ka_-45Q
# 71046222
+17
View File
@@ -0,0 +1,17 @@
from typing import Optional, List
import gspread
from pydantic import BaseModel
class GoogleFile(BaseModel):
file_id: str
file_name: str
class Genre(BaseModel):
genre_id: Optional[int]
genre_name: str
class Song(BaseModel):
song_id: Optional[int]
song_title: str
url: str
genres: List[Genre]
+6
View File
@@ -0,0 +1,6 @@
fastapi
uvicorn
gspread
pandas
numpy
sqlalchemy