Add lib
This commit is contained in:
70
lib/ShazamIO/shazamio/utils.py
Normal file
70
lib/ShazamIO/shazamio/utils.py
Normal file
@@ -0,0 +1,70 @@
|
||||
import pathlib
|
||||
from enum import Enum
|
||||
from io import BytesIO
|
||||
from typing import Dict
|
||||
from typing import List
|
||||
from typing import Optional
|
||||
from typing import Union
|
||||
|
||||
import aiofiles
|
||||
import aiohttp
|
||||
from aiohttp import ContentTypeError
|
||||
from pydub import AudioSegment
|
||||
|
||||
from shazamio.exceptions import FailedDecodeJson
|
||||
from shazamio.schemas.artists import ArtistQuery
|
||||
|
||||
SongT = Union[str, pathlib.Path, bytes, bytearray]
|
||||
FileT = Union[str, pathlib.Path]
|
||||
|
||||
|
||||
async def validate_json(
|
||||
resp: aiohttp.ClientResponse, content_type: str = "application/json"
|
||||
) -> dict:
|
||||
try:
|
||||
return await resp.json(content_type=content_type)
|
||||
except ContentTypeError as e:
|
||||
bad_url = str(str(e).split(",")[2]).split("'")[1]
|
||||
raise FailedDecodeJson(f"Check args, URL is invalid\nURL- {bad_url}")
|
||||
|
||||
|
||||
async def get_file_bytes(file: FileT) -> bytes:
|
||||
async with aiofiles.open(file, mode="rb") as f:
|
||||
return await f.read()
|
||||
|
||||
|
||||
async def get_song(data: SongT) -> Union[AudioSegment]:
|
||||
if isinstance(data, (str, pathlib.Path)):
|
||||
song_bytes = await get_file_bytes(file=data)
|
||||
return AudioSegment.from_file(BytesIO(song_bytes))
|
||||
|
||||
if isinstance(data, (bytes, bytearray)):
|
||||
return AudioSegment.from_file(BytesIO(data))
|
||||
|
||||
if isinstance(data, AudioSegment):
|
||||
return data
|
||||
|
||||
|
||||
class QueryBuilder:
|
||||
def __init__(
|
||||
self,
|
||||
source: List[Union[str, Enum]],
|
||||
):
|
||||
self.source = source
|
||||
|
||||
def to_str(self) -> str:
|
||||
return ",".join(self.source)
|
||||
|
||||
|
||||
class ArtistQueryGenerator:
|
||||
def __init__(
|
||||
self,
|
||||
source: Optional[ArtistQuery] = None,
|
||||
):
|
||||
self.source = source
|
||||
|
||||
def params(self) -> Dict[str, str]:
|
||||
return {
|
||||
"extend": QueryBuilder(source=self.source.extend or []).to_str(),
|
||||
"views": QueryBuilder(source=self.source.views or []).to_str(),
|
||||
}
|
||||
Reference in New Issue
Block a user