test
This commit is contained in:
		
							
								
								
									
										3
									
								
								README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								README.md
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,3 @@
 | 
			
		||||
API Server Rewrite
 | 
			
		||||
 | 
			
		||||
FastAPI - https://fastapi.tiangolo.com/
 | 
			
		||||
							
								
								
									
										110
									
								
								endpoints/LyricSearch.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										110
									
								
								endpoints/LyricSearch.py
									
									
									
									
									
										Normal file
									
								
							@@ -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", "<br>", " ".join(searchWorker['l'])),
 | 
			
		||||
            'from_cache': searchWorker['method'].strip().lower().startswith("local cache"),
 | 
			
		||||
            'src': searchWorker['method'] if addExtras else None,
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										69
									
								
								main.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										69
									
								
								main.py
									
									
									
									
									
										Normal file
									
								
							@@ -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}
 | 
			
		||||
							
								
								
									
										23
									
								
								util.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								util.py
									
									
									
									
									
										Normal file
									
								
							@@ -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)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user