fix error message

This commit is contained in:
AF 2023-10-06 02:37:15 +00:00
parent 86aa68845f
commit d48aebe715
10 changed files with 82 additions and 82 deletions

View File

@ -17,6 +17,16 @@ Root modules
Core modules Core modules
------------ ------------
.. automodule:: v6d3music.core.aservicing
:members:
:undoc-members:
:show-inheritance:
.. automodule:: v6d3music.core.audio
:members:
:undoc-members:
:show-inheritance:
.. automodule:: v6d3music.core.caching .. automodule:: v6d3music.core.caching
:members: :members:
:undoc-members: :undoc-members:
@ -57,16 +67,6 @@ Core modules
:undoc-members: :undoc-members:
:show-inheritance: :show-inheritance:
.. automodule:: v6d3music.core.ytaservicing
:members:
:undoc-members:
:show-inheritance:
.. automodule:: v6d3music.core.ytaudio
:members:
:undoc-members:
:show-inheritance:
v6d2ctx module v6d2ctx module
============== ==============

View File

@ -62,7 +62,7 @@ presets: {shlex.join(allowed_presets)}
if attachments: if attachments:
args = ["[[", *(attachment.url for attachment in attachments), "]]"] + args args = ["[[", *(attachment.url for attachment in attachments), "]]"] + args
added = 0 added = 0
async for audio in mainservice.yt_audios(ctx, args): async for audio in mainservice.audios(ctx, args):
queue.append(audio) queue.append(audio)
added += 1 added += 1
await ctx.reply(f"added track(s): {added}") await ctx.reply(f"added track(s): {added}")

View File

@ -1,8 +1,8 @@
from v6d3music.processing.abstractrunner import AbstractRunner from v6d3music.processing.abstractrunner import AbstractRunner
__all__ = ("YTAServicing",) __all__ = ("AServicing",)
class YTAServicing: class AServicing:
def __init__(self, runner: AbstractRunner) -> None: def __init__(self, runner: AbstractRunner) -> None:
self.runner = runner self.runner = runner

View File

@ -9,23 +9,23 @@ from typing import Optional
import discord import discord
from v6d2ctx.context import Explicit from v6d2ctx.context import Explicit
from v6d3music.core.aservicing import AServicing
from v6d3music.core.ffmpegnormalaudio import FFmpegNormalAudio from v6d3music.core.ffmpegnormalaudio import FFmpegNormalAudio
from v6d3music.core.real_url import real_url from v6d3music.core.real_url import real_url
from v6d3music.core.ytaservicing import YTAServicing
from v6d3music.processing.abstractrunner import CoroContext, CoroStatusChanged from v6d3music.processing.abstractrunner import CoroContext, CoroStatusChanged
from v6d3music.utils.fill import FILL from v6d3music.utils.fill import FILL
from v6d3music.utils.options_for_effects import options_for_effects from v6d3music.utils.options_for_effects import options_for_effects
from v6d3music.utils.sparq import sparq from v6d3music.utils.sparq import sparq
__all__ = ("YTAudio",) __all__ = ("Audio",)
class YTAudio(discord.AudioSource): class Audio(discord.AudioSource):
source: FFmpegNormalAudio source: FFmpegNormalAudio
def __init__( def __init__(
self, self,
servicing: YTAServicing, servicing: AServicing,
url: str, url: str,
origin: str, origin: str,
description: str, description: str,
@ -133,7 +133,7 @@ class YTAudio(discord.AudioSource):
await self._do_update_duration() await self._do_update_duration()
async def _update_duration_context(self, context: CoroContext): async def _update_duration_context(self, context: CoroContext):
context.events.send(CoroStatusChanged({"ytaudio": "duration"})) context.events.send(CoroStatusChanged({"audio": "duration"}))
await self._update_duration() await self._update_duration()
async def update_duration(self): async def update_duration(self):
@ -224,7 +224,7 @@ class YTAudio(discord.AudioSource):
} }
@classmethod @classmethod
async def respawn(cls, servicing: YTAServicing, guild: discord.Guild, respawn: dict) -> YTAudio: async def respawn(cls, servicing: AServicing, guild: discord.Guild, respawn: dict) -> Audio:
member_id: int | None = respawn["rby"] member_id: int | None = respawn["rby"]
if member_id is None: if member_id is None:
member = None member = None
@ -236,7 +236,7 @@ class YTAudio(discord.AudioSource):
guild._add_member(member) guild._add_member(member)
except discord.NotFound: except discord.NotFound:
member = None member = None
audio = YTAudio( audio = Audio(
servicing, servicing,
respawn["url"], respawn["url"],
respawn["origin"], respawn["origin"],
@ -269,8 +269,8 @@ class YTAudio(discord.AudioSource):
"canbeskipped": self.can_be_skipped_by(member), "canbeskipped": self.can_be_skipped_by(member),
} }
def copy(self) -> YTAudio: def copy(self) -> Audio:
return YTAudio( return Audio(
self.servicing, self.servicing,
self.url, self.url,
self.origin, self.origin,
@ -280,11 +280,11 @@ class YTAudio(discord.AudioSource):
0, 0,
) )
def branch(self) -> YTAudio: def branch(self) -> Audio:
if self.stop_at is not None: if self.stop_at is not None:
raise Explicit("already branched") raise Explicit("already branched")
self.stop_at = stop_at = self.already_read + 50 self.stop_at = stop_at = self.already_read + 50
audio = YTAudio( audio = Audio(
self.servicing, self.servicing,
self.url, self.url,
self.origin, self.origin,

View File

@ -0,0 +1,24 @@
from v6d2ctx.context import Context
from v6d3music.core.real_url import real_url
from v6d3music.core.aservicing import AServicing
from v6d3music.core.audio import Audio
from v6d3music.utils.argctx import BoundCtx, InfoCtx
__all__ = ("create_audio",)
async def _create_audio(servicing: AServicing, bound: BoundCtx) -> Audio:
return Audio(
servicing,
await real_url(bound.url, False),
bound.url,
bound.description,
bound.options,
bound.member,
bound.already_read,
)
async def create_audio(servicing: AServicing, ctx: Context, it: InfoCtx) -> Audio:
bound = it.bind(ctx)
return await _create_audio(servicing, bound)

View File

@ -1,24 +0,0 @@
from v6d2ctx.context import Context
from v6d3music.core.real_url import real_url
from v6d3music.core.ytaservicing import YTAServicing
from v6d3music.core.ytaudio import YTAudio
from v6d3music.utils.argctx import BoundCtx, InfoCtx
__all__ = ("create_ytaudio",)
async def _create_ytaudio(servicing: YTAServicing, bound: BoundCtx) -> YTAudio:
return YTAudio(
servicing,
await real_url(bound.url, False),
bound.url,
bound.description,
bound.options,
bound.member,
bound.already_read,
)
async def create_ytaudio(servicing: YTAServicing, ctx: Context, it: InfoCtx) -> YTAudio:
bound = it.bind(ctx)
return await _create_ytaudio(servicing, bound)

View File

@ -3,7 +3,7 @@ import discord
from ptvp35 import DbConnection from ptvp35 import DbConnection
from v6d2ctx.context import Explicit from v6d2ctx.context import Explicit
from v6d3music.core.queueaudio import QueueAudio from v6d3music.core.queueaudio import QueueAudio
from v6d3music.core.ytaservicing import YTAServicing from v6d3music.core.aservicing import AServicing
from v6d3music.utils.assert_admin import assert_admin from v6d3music.utils.assert_admin import assert_admin
__all__ = ("MainAudio",) __all__ = ("MainAudio",)
@ -29,6 +29,6 @@ class MainAudio(discord.PCMVolumeTransformer):
@classmethod @classmethod
async def create( async def create(
cls, servicing: YTAServicing, db: DbConnection, queues: DbConnection, guild: discord.Guild cls, servicing: AServicing, db: DbConnection, queues: DbConnection, guild: discord.Guild
) -> "MainAudio": ) -> "MainAudio":
return cls(db, await QueueAudio.create(servicing, queues, guild)) return cls(db, await QueueAudio.create(servicing, queues, guild))

View File

@ -20,8 +20,8 @@ from v6d3music.core.mainaudio import MainAudio
from v6d3music.core.monitoring import Monitoring, PersistentMonitoring from v6d3music.core.monitoring import Monitoring, PersistentMonitoring
from v6d3music.core.queueaudio import QueueAudio from v6d3music.core.queueaudio import QueueAudio
from v6d3music.core.ystate import YState from v6d3music.core.ystate import YState
from v6d3music.core.ytaservicing import YTAServicing from v6d3music.core.aservicing import AServicing
from v6d3music.core.ytaudio import YTAudio from v6d3music.core.audio import Audio
from v6d3music.processing.pool import Pool, PoolEvent from v6d3music.processing.pool import Pool, PoolEvent
from v6d3music.utils.argctx import ArgCtx from v6d3music.utils.argctx import ArgCtx
from v6d3music.utils.assert_admin import assert_admin from v6d3music.utils.assert_admin import assert_admin
@ -114,7 +114,7 @@ class MainService:
self.__volumes = await es.enter_async_context(DbFactory(myroot / "volume.db", kvfactory=KVJson())) self.__volumes = await es.enter_async_context(DbFactory(myroot / "volume.db", kvfactory=KVJson()))
self.__queues = await es.enter_async_context(DbFactory(myroot / "queue.db", kvfactory=KVJson())) self.__queues = await es.enter_async_context(DbFactory(myroot / "queue.db", kvfactory=KVJson()))
self.__pool = await es.enter_async_context(Pool(5, self.__pool_events)) self.__pool = await es.enter_async_context(Pool(5, self.__pool_events))
self.__servicing = YTAServicing(self.__pool) self.__servicing = AServicing(self.__pool)
self.__vcs_restored: asyncio.Future[None] = asyncio.Future() self.__vcs_restored: asyncio.Future[None] = asyncio.Future()
self.__save_task = asyncio.create_task(self.save_daemon()) self.__save_task = asyncio.create_task(self.save_daemon())
self.monitoring = await es.enter_async_context(Monitoring()) self.monitoring = await es.enter_async_context(Monitoring())
@ -224,7 +224,7 @@ class MainService:
if not self.__vcs_restored.done(): if not self.__vcs_restored.done():
await self.restore_vcs() await self.restore_vcs()
async def yt_audios(self, ctx: Context, args: list[str]) -> AsyncIterable[YTAudio]: async def audios(self, ctx: Context, args: list[str]) -> AsyncIterable[Audio]:
assert ctx.guild is not None assert ctx.guild is not None
argctx = ArgCtx(self.defaulteffects.get(ctx.guild.id), args) argctx = ArgCtx(self.defaulteffects.get(ctx.guild.id), args)
ystate = YState(self.__servicing, self.__pool, ctx, argctx.sources) ystate = YState(self.__servicing, self.__pool, ctx, argctx.sources)

View File

@ -11,8 +11,8 @@ import discord
from ptvp35 import DbConnection from ptvp35 import DbConnection
from v6d2ctx.context import Explicit from v6d2ctx.context import Explicit
from v6d3music.core.ytaservicing import YTAServicing from v6d3music.core.aservicing import AServicing
from v6d3music.core.ytaudio import YTAudio from v6d3music.core.audio import Audio
from v6d3music.utils.assert_admin import assert_admin from v6d3music.utils.assert_admin import assert_admin
from v6d3music.utils.fill import FILL from v6d3music.utils.fill import FILL
@ -23,9 +23,9 @@ PRE_SET_LENGTH = 6
class QueueAudio(discord.AudioSource): class QueueAudio(discord.AudioSource):
def __init__(self, db: DbConnection, guild: discord.Guild, respawned: list[YTAudio]): def __init__(self, db: DbConnection, guild: discord.Guild, respawned: list[Audio]):
self.db = db self.db = db
self.queue: deque[YTAudio] = deque() self.queue: deque[Audio] = deque()
for audio in respawned: for audio in respawned:
self.append(audio) self.append(audio)
self.guild = guild self.guild = guild
@ -40,12 +40,12 @@ class QueueAudio(discord.AudioSource):
return return
@staticmethod @staticmethod
async def respawned(servicing: YTAServicing, db: DbConnection, guild: discord.Guild) -> list[YTAudio]: async def respawned(servicing: AServicing, db: DbConnection, guild: discord.Guild) -> list[Audio]:
respawned = [] respawned = []
try: try:
for audio_respawn in db.get(guild.id, []): for audio_respawn in db.get(guild.id, []):
try: try:
respawned.append(await YTAudio.respawn(servicing, guild, audio_respawn)) respawned.append(await Audio.respawn(servicing, guild, audio_respawn))
except Exception as e: except Exception as e:
print("audio respawn failed", e) print("audio respawn failed", e)
raise raise
@ -55,7 +55,7 @@ class QueueAudio(discord.AudioSource):
return respawned return respawned
@classmethod @classmethod
async def create(cls, servicing: YTAServicing, db: DbConnection, guild: discord.Guild) -> QueueAudio: async def create(cls, servicing: AServicing, db: DbConnection, guild: discord.Guild) -> QueueAudio:
return cls(db, guild, await cls.respawned(servicing, db, guild)) return cls(db, guild, await cls.respawned(servicing, db, guild))
async def save(self, delay: bool) -> None: async def save(self, delay: bool) -> None:
@ -66,12 +66,12 @@ class QueueAudio(discord.AudioSource):
hybernated.append(audio.hybernate()) hybernated.append(audio.hybernate())
self.db.set_nowait(self.guild.id, hybernated) self.db.set_nowait(self.guild.id, hybernated)
def append(self, audio: YTAudio): def append(self, audio: Audio):
if len(self.queue) < PRE_SET_LENGTH: if len(self.queue) < PRE_SET_LENGTH:
audio.set_source_given_index(len(self.queue)) audio.set_source_given_index(len(self.queue))
self.queue.append(audio) self.queue.append(audio)
def _popleft(self, audio: YTAudio): def _popleft(self, audio: Audio):
if self.queue and self.queue[0] is audio: if self.queue and self.queue[0] is audio:
self.queue.popleft().cleanup() self.queue.popleft().cleanup()
self.update_sources() self.update_sources()
@ -104,7 +104,7 @@ class QueueAudio(discord.AudioSource):
if not self.skip_at(pos0, member): if not self.skip_at(pos0, member):
pos0 += 1 pos0 += 1
def skip_audio(self, audio: YTAudio, member: discord.Member) -> bool: def skip_audio(self, audio: Audio, member: discord.Member) -> bool:
if audio in self.queue: if audio in self.queue:
if audio.can_be_skipped_by(member): if audio.can_be_skipped_by(member):
self.queue.remove(audio) self.queue.remove(audio)
@ -208,21 +208,21 @@ class QueueAudio(discord.AudioSource):
self.queue.insert(1, audio) self.queue.insert(1, audio)
class ForwardView(MutableSequence[YTAudio]): class ForwardView(MutableSequence[Audio]):
def __init__(self, sequence: MutableSequence[YTAudio]) -> None: def __init__(self, sequence: MutableSequence[Audio]) -> None:
self.sequence = sequence self.sequence = sequence
def __len__(self) -> int: def __len__(self) -> int:
return max(0, self.sequence.__len__() - 1) return max(0, self.sequence.__len__() - 1)
def __setitem__(self, index: int, value: YTAudio) -> None: def __setitem__(self, index: int, value: Audio) -> None:
self.sequence.__setitem__(index + 1, value) self.sequence.__setitem__(index + 1, value)
def __getitem__(self, index: int) -> YTAudio: def __getitem__(self, index: int) -> Audio:
return self.sequence.__getitem__(index + 1) return self.sequence.__getitem__(index + 1)
def __delitem__(self, index: int | slice) -> None: def __delitem__(self, index: int | slice) -> None:
self.sequence.__delitem__(index) self.sequence.__delitem__(index)
def insert(self, index: int, value: YTAudio) -> None: def insert(self, index: int, value: Audio) -> None:
self.sequence.insert(index, value) self.sequence.insert(index, value)

View File

@ -5,9 +5,9 @@ from typing import Any, AsyncIterable, Callable, Coroutine, Iterable
from v6d2ctx.context import Context, Explicit from v6d2ctx.context import Context, Explicit
from v6d2ctx.integration.responsetype import ResponseType, cast_to_response from v6d2ctx.integration.responsetype import ResponseType, cast_to_response
from v6d3music.core.create_ytaudio import create_ytaudio from v6d3music.core.create_audio import create_audio
from v6d3music.core.ytaservicing import YTAServicing from v6d3music.core.aservicing import AServicing
from v6d3music.core.ytaudio import YTAudio from v6d3music.core.audio import Audio
from v6d3music.processing.pool import JobContext, JobStatusChanged, JobUnit, Pool from v6d3music.processing.pool import JobContext, JobStatusChanged, JobUnit, Pool
from v6d3music.utils.argctx import InfoCtx, UrlCtx from v6d3music.utils.argctx import InfoCtx, UrlCtx
@ -19,14 +19,14 @@ class _Stop:
class YState: class YState:
def __init__(self, servicing: YTAServicing, pool: Pool, ctx: Context, sources: Iterable[UrlCtx]) -> None: def __init__(self, servicing: AServicing, pool: Pool, ctx: Context, sources: Iterable[UrlCtx]) -> None:
self.servicing = servicing self.servicing = servicing
self.pool = pool self.pool = pool
self.ctx = ctx self.ctx = ctx
self.sources: deque[UrlCtx] = deque(sources) self.sources: deque[UrlCtx] = deque(sources)
self.playlists: deque[asyncio.Future[list[InfoCtx]]] = deque() self.playlists: deque[asyncio.Future[list[InfoCtx]]] = deque()
self.entries: deque[InfoCtx | BaseException] = deque() self.entries: deque[InfoCtx | BaseException] = deque()
self.results: asyncio.Queue[asyncio.Future[YTAudio | None] | _Stop] = asyncio.Queue() self.results: asyncio.Queue[asyncio.Future[Audio | None] | _Stop] = asyncio.Queue()
self.es = AsyncExitStack() self.es = AsyncExitStack()
self.descheduled: int = 0 self.descheduled: int = 0
@ -40,7 +40,7 @@ class YState:
for _ in range(self.pool.workers()): for _ in range(self.pool.workers()):
await self.es.enter_async_context(YStream(self).at(self.pool)) await self.es.enter_async_context(YStream(self).at(self.pool))
async def _next_audio(self) -> YTAudio | None | _Stop: async def _next_audio(self) -> Audio | None | _Stop:
future = await self.results.get() future = await self.results.get()
if isinstance(future, _Stop): if isinstance(future, _Stop):
return _Stop() return _Stop()
@ -48,12 +48,12 @@ class YState:
return await future return await future
except OSError as e: except OSError as e:
raise Explicit( raise Explicit(
"extraction error\nunknown ytdl error (probably due to video being unavailable, e.g. because of regional restrictions)\nnote: sea\u200Drch is still not supported" "extraction error\nunknown extraction error (probably due to video being unavailable, e.g. because of regional restrictions)\nnote: sea\u200Drch is still not supported"
) from e ) from e
finally: finally:
self.results.task_done() self.results.task_done()
async def _iterate_with_workers(self) -> AsyncIterable[YTAudio]: async def _iterate_with_workers(self) -> AsyncIterable[Audio]:
while not self.empty(): while not self.empty():
audio = await self._next_audio() audio = await self._next_audio()
if isinstance(audio, _Stop): if isinstance(audio, _Stop):
@ -61,12 +61,12 @@ class YState:
if audio is not None: if audio is not None:
yield audio yield audio
async def _iterate(self) -> AsyncIterable[YTAudio]: async def _iterate(self) -> AsyncIterable[Audio]:
await self._start_workers() await self._start_workers()
async for audio in self._iterate_with_workers(): async for audio in self._iterate_with_workers():
yield audio yield audio
async def iterate(self) -> AsyncIterable[YTAudio]: async def iterate(self) -> AsyncIterable[Audio]:
async with self.es: async with self.es:
async for audio in self._iterate(): async for audio in self._iterate():
yield audio yield audio
@ -74,9 +74,9 @@ class YState:
async def playlist(self, source: UrlCtx) -> list[InfoCtx]: async def playlist(self, source: UrlCtx) -> list[InfoCtx]:
return [info async for info in source.entries()] return [info async for info in source.entries()]
async def result(self, entry: InfoCtx) -> YTAudio | None: async def result(self, entry: InfoCtx) -> Audio | None:
try: try:
return await create_ytaudio(self.servicing, self.ctx, entry) return await create_audio(self.servicing, self.ctx, entry)
except Exception: except Exception:
if not entry.ignore: if not entry.ignore:
raise raise
@ -117,7 +117,7 @@ class YStream(JobUnit):
def _case_has_entries(self, context: JobContext, /) -> Callable[[], Coroutine[Any, Any, None]]: def _case_has_entries(self, context: JobContext, /) -> Callable[[], Coroutine[Any, Any, None]]:
entry = self.state.entries.popleft() entry = self.state.entries.popleft()
audiotask: asyncio.Future[YTAudio | None] audiotask: asyncio.Future[Audio | None]
if isinstance(entry, BaseException): if isinstance(entry, BaseException):
self._set_details(context, {"status": "breaking downstream audio creation"}) self._set_details(context, {"status": "breaking downstream audio creation"})
audiotask = asyncio.Future() audiotask = asyncio.Future()