commit db73abf647e80bc02a6959c533a8e5654ff54c3f Author: codey Date: Sat Aug 10 22:49:00 2024 -0400 test diff --git a/README.md b/README.md new file mode 100644 index 0000000..f853c9d --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +API Server Rewrite + +FastAPI - https://fastapi.tiangolo.com/ \ No newline at end of file diff --git a/endpoints/LyricSearch.py b/endpoints/LyricSearch.py new file mode 100644 index 0000000..00f6a5f --- /dev/null +++ b/endpoints/LyricSearch.py @@ -0,0 +1,110 @@ +#!/usr/bin/env python3.12 + +import importlib +import urllib.parse +import regex +import logging + +from typing import Any, Annotated +from fastapi import FastAPI, Form, HTTPException +from pydantic import BaseModel + + +class ValidRequest(BaseModel): + a: str | None = None + s: str | None = None + t: str | None = None + sub: str | None = None + extra: bool | None = False + src: str | None = None + + +class LyricSearch(FastAPI): + def __init__(self, app: FastAPI, util, constants): + self.app = app + self.util = util + self.constants = constants + self.lyrics_engine = importlib.import_module("lyrics_engine").LyricsEngine() + + self.endpoint_name = "/search/" + self.search_method_order = [ + 666, + 1, + 8, + 2, + 3 + ] + self.acceptable_request_sources = [ + "WEB", + "IRC-MS", + "IRC-FS", + "IRC-KALI", + "DISC-ACES", + "DISC-HAVOC", + "LIMNORIA-SHARED" + ] + + app.add_api_route(self.endpoint_name, self.search_handler, methods=["POST"]) + + async def search_handler(self, data: ValidRequest): + print(f"HI, DATA:\n{data}") + src = data.src.upper() + if not(src in self.acceptable_request_sources): + raise HTTPException(detail="Invalid request source", status_code=403) + + + searchArtist = data.a + searchSong = data.s + searchText = data.t + addExtras = data.extra + subSearch = data.sub + searchObject = None + + random_song_requested = (searchArtist == "!" and searchSong == "!") + query_valid = ( + not(searchArtist is None) and + not(searchSong is None) and + len(searchArtist) >= 1 and + len(searchSong) >= 1 and + len(searchArtist) + len(searchSong) >= 3 + ) + + if not(random_song_requested) and not(query_valid): + logging.debug(f"DEBUG!\nsearchSong: {searchSong}\nsearchArtist: {searchArtist}") + return { + "err": True, + "errorText": "Invalid parameters" + } + + if searchArtist and searchSong: + searchArtist = self.constants.DOUBLE_SPACE_REGEX.sub(" ", searchArtist.strip()) + searchSong = self.constants.DOUBLE_SPACE_REGEX.sub(" ", searchSong.strip()) + searchArtist = urllib.parse.unquote(searchArtist) + searchSong = urllib.parse.unquote(searchSong) + + if searchText is None: + searchObject = self.lyrics_engine.create_query_object("%s : %s" % (searchArtist, searchSong)) + if subSearch: + searchObject = self.lyrics_engine.create_query_object("%s : %s : %s" % (searchArtist, searchSong, subSearch)) + + searchWorker = await self.lyrics_engine.lyrics_worker(searching=searchObject, + method_order=self.search_method_order, + recipient='anyone') + + if not(searchWorker) or not('l') in searchWorker.keys(): + return { + 'err': True, + 'errorText': 'Sources exhausted, lyrics not located.' + } + + return { + 'err': False, + 'artist': searchWorker['artist'], + 'song': searchWorker['song'], + 'combo_lev': f'{searchWorker['combo_lev']:.2f}', + 'lyrics': regex.sub(r"\s/\s", "
", " ".join(searchWorker['l'])), + 'from_cache': searchWorker['method'].strip().lower().startswith("local cache"), + 'src': searchWorker['method'] if addExtras else None, + } + + diff --git a/main.py b/main.py new file mode 100644 index 0000000..c3c7d71 --- /dev/null +++ b/main.py @@ -0,0 +1,69 @@ +#!/usr/bin/env python3.12 + +import importlib +import logging + +from typing import Union, Any +from fastapi import FastAPI, HTTPException, Response, Form +from fastapi.middleware.cors import CORSMiddleware + +logger = logging.getLogger() +logger.setLevel(logging.DEBUG) + +app = FastAPI() +util = importlib.import_module("util").Utilities() +constants = importlib.import_module("constants").Constants() + + +origins = [ + "https://codey.lol", +] + +app.add_middleware(CORSMiddleware, +allow_origins=origins, +allow_credentials=True, +allow_methods=["POST"], +allow_headers=["*"]) + +""" +Blacklisted routes +""" + +@app.get("/") +def disallow_get(): + return util.get_blocked_response() + +@app.get("/favicon.ico") +def disallow_get(): + return util.get_blocked_response() + +@app.get("/{any}") +def disallow_get(any: Any): + return util.get_blocked_response() + +@app.post("/") +def disallow_base_post(): + return util.get_blocked_response() + + +""" +End Blacklisted Routes +""" + + +""" +Actionable Routes +""" + +lyric_search_endpoint = importlib.import_module("endpoints.LyricSearch").LyricSearch(app, util, constants) + + +""" +End Actionable Routes +""" + + + +# @app.get("/items/{item_id}") +# def read_item(item_id: int, q: Union[str, None] = None): +# return {"item_id": item_id, "q": q} diff --git a/util.py b/util.py new file mode 100644 index 0000000..50b1b58 --- /dev/null +++ b/util.py @@ -0,0 +1,23 @@ +#!/usr/bin/env python3.12 + +import logging + +from fastapi import Response + +class Utilities: + def __init__(self): + self.blocked_response_status = 422 + self.blocked_response_content = None + pass + + def get_blocked_response(self, path: str | None = None): + logging.error("Rejected request: Blocked") + return Response(content=self.blocked_response_content, + status_code=self.blocked_response_status) + + def get_no_endpoint_found(self, path: str | None = None): + logging.error("Rejected request: No such endpoint") + raise HTTPException(detail="Unknown endpoint", status_code=404) + + +