diff --git a/base.requirements.txt b/base.requirements.txt index 44825ce..6b6598c 100644 --- a/base.requirements.txt +++ b/base.requirements.txt @@ -1,3 +1,4 @@ aiohttp>=3.7.4,<4 discord.py[voice]~=2.1.0 youtube_dl~=2021.12.17 +yt-dlp~=2022.11.11 diff --git a/v6d3music/api.py b/v6d3music/api.py index 7696c44..495b4c7 100644 --- a/v6d3music/api.py +++ b/v6d3music/api.py @@ -13,16 +13,20 @@ ResponseType: TypeAlias = list | dict | float | str | None class Api: class MisusedApi(KeyError): - def json(self) -> ResponseType: + def json(self) -> dict: return {'error': list(map(str, self.args)), 'errormessage': str(self)} class UnknownApi(MisusedApi): - pass + def json(self) -> dict: + return super().json() | {'unknownapi': None} class ExplicitFailure(MisusedApi): def __init__(self, explicit: Explicit) -> None: super().__init__(*explicit.args) + def json(self) -> dict: + return super().json() | {'explicit': None} + def __init__(self, client: discord.Client, roles: dict[str, str]) -> None: self.client = client self.roles = roles @@ -36,7 +40,8 @@ class Api: class UserApi: class UnknownMember(Api.MisusedApi): - pass + def json(self) -> dict: + return super().json() | {'unknownmember': None} def __init__(self, api: Api, request: dict, user_id: int) -> None: self.pi = api @@ -118,7 +123,8 @@ class UserApi: class GuildApi(UserApi): class VoiceNotConnected(Api.MisusedApi): - pass + def json(self) -> dict: + return super().json() | {'notconnected': None} def __init__(self, api: UserApi, member: discord.Member) -> None: super().__init__(api.pi, api.request, member.id) @@ -199,6 +205,8 @@ class MainApi(VoiceApi): return self.main.volume case {'type': 'playing'}: return self.vc.is_playing() + case {'type': 'paused'}: + return self.vc.is_paused() case {'type': 'queueformat'}: return await self.main.queue.format() case {'type': 'queuejson'}: diff --git a/v6d3music/utils/aextract.py b/v6d3music/utils/aextract.py index 6a17283..c73c94d 100644 --- a/v6d3music/utils/aextract.py +++ b/v6d3music/utils/aextract.py @@ -1,13 +1,11 @@ import asyncio -from concurrent.futures import ProcessPoolExecutor - -from v6d2ctx.context import Benchmark +from concurrent.futures import ThreadPoolExecutor from v6d3music.utils.extract import extract async def aextract(params: dict, url: str, **kwargs): - with ProcessPoolExecutor() as pool: + with ThreadPoolExecutor() as pool: return await asyncio.get_running_loop().run_in_executor( pool, extract, diff --git a/v6d3music/utils/entries_for_url.py b/v6d3music/utils/entries_for_url.py index 10770a1..d4d09dd 100644 --- a/v6d3music/utils/entries_for_url.py +++ b/v6d3music/utils/entries_for_url.py @@ -14,7 +14,6 @@ async def entries_for_url(url: str, tor: bool) -> AsyncIterable[ ef = tor_extract info = await ef( { - 'playlistend': 128, 'logtostderr': True }, url, diff --git a/v6d3music/utils/extract.py b/v6d3music/utils/extract.py index b3dbd01..1b89abe 100644 --- a/v6d3music/utils/extract.py +++ b/v6d3music/utils/extract.py @@ -1,10 +1,12 @@ import discord.utils -import youtube_dl +import yt_dlp def extract(params: dict, url: str, kwargs: dict): try: - extracted = youtube_dl.YoutubeDL(params=params).extract_info(url, **kwargs) + extracted = yt_dlp.YoutubeDL(params=params).extract_info(url, **kwargs) + if not isinstance(extracted, dict): + raise TypeError if 'entries' in extracted: extracted['entries'] = list(extracted['entries']) return extracted