mirror of
https://github.com/RYGhub/royalnet.git
synced 2024-11-23 19:44:20 +00:00
Commit things
This commit is contained in:
parent
82a662bd03
commit
7bbf7f334b
9 changed files with 123 additions and 10 deletions
|
@ -6,6 +6,7 @@ Welcome to the documentation of Royalnet!
|
|||
.. toctree::
|
||||
:maxdepth: 5
|
||||
|
||||
randomdiscoveries
|
||||
apireference
|
||||
|
||||
|
||||
|
|
13
docs_source/randomdiscoveries.rst
Normal file
13
docs_source/randomdiscoveries.rst
Normal file
|
@ -0,0 +1,13 @@
|
|||
Random discoveries
|
||||
==================
|
||||
|
||||
Here are some things that were found out while developing the bot.
|
||||
|
||||
Discord websocket undocumented error codes
|
||||
------------------------------------------
|
||||
|
||||
====== ===================
|
||||
Code Reason
|
||||
====== ===================
|
||||
1006 Heartbeat stopped
|
||||
====== ===================
|
|
@ -1,7 +1,16 @@
|
|||
from .ytdlinfo import YtdlInfo
|
||||
from .ytdlfile import YtdlFile
|
||||
from .ytdlmp3 import YtdlMp3
|
||||
from .ytdldiscord import YtdlDiscord
|
||||
from .errors import *
|
||||
from .discordbard import DiscordBard
|
||||
from . import implementations
|
||||
|
||||
try:
|
||||
from .fileaudiosource import FileAudioSource
|
||||
except ImportError:
|
||||
FileAudioSource = None
|
||||
|
||||
|
||||
__all__ = [
|
||||
"YtdlInfo",
|
||||
|
@ -11,4 +20,7 @@ __all__ = [
|
|||
"YtdlError",
|
||||
"NotFoundError",
|
||||
"MultipleFilesError",
|
||||
"FileAudioSource",
|
||||
"implementations",
|
||||
"DiscordBard",
|
||||
]
|
||||
|
|
|
@ -18,10 +18,10 @@ class DiscordBard:
|
|||
"""The :class:`YtdlDiscord` that's currently being played."""
|
||||
|
||||
self.generator: \
|
||||
AsyncGenerator[FileAudioSource, Tuple[Tuple[Any, ...], Dict[str, Any]]] = self._generate_generator()
|
||||
AsyncGenerator[FileAudioSource, Tuple[Tuple[Any, ...], Dict[str, Any]]] = self._generator()
|
||||
"""The AsyncGenerator responsible for deciding the next song that should be played."""
|
||||
|
||||
async def _generate_generator(self) -> AsyncGenerator[FileAudioSource, Tuple[Tuple[Any, ...], Dict[str, Any]]]:
|
||||
async def _generator(self) -> AsyncGenerator[Optional[FileAudioSource], Tuple[Tuple[Any, ...], Dict[str, Any]]]:
|
||||
"""Create an async generator that returns the next source to be played;
|
||||
it can take a args+kwargs tuple in input to optionally select a different source.
|
||||
|
||||
|
@ -46,7 +46,7 @@ class DiscordBard:
|
|||
self.now_playing = fas
|
||||
return fas
|
||||
|
||||
async def add(self, ytd: YtdlDiscord):
|
||||
async def add(self, ytd: YtdlDiscord) -> None:
|
||||
"""Add a new :class:`YtdlDiscord` to the :class:`DiscordBard`, if possible.
|
||||
|
||||
Raises:
|
||||
|
@ -62,7 +62,7 @@ class DiscordBard:
|
|||
"""
|
||||
raise UnsupportedError()
|
||||
|
||||
async def remove(self, ytd: YtdlDiscord):
|
||||
async def remove(self, ytd: YtdlDiscord) -> None:
|
||||
"""Remove a :class:`YtdlDiscord` from the :class:`DiscordBard`, if possible.
|
||||
|
||||
Raises:
|
||||
|
@ -70,7 +70,14 @@ class DiscordBard:
|
|||
"""
|
||||
raise UnsupportedError()
|
||||
|
||||
async def cleanup(self):
|
||||
async def cleanup(self) -> None:
|
||||
"""Enqueue the deletion of all :class:`YtdlDiscord` contained in the :class:`DiscordBard`, and return only once
|
||||
all deletions are complete."""
|
||||
raise NotImplementedError()
|
||||
|
||||
async def length(self) -> int:
|
||||
"""Return the length of the :class:`DiscordBard`.
|
||||
|
||||
Raises:
|
||||
UnsupportedError: If :meth:`.peek` is unsupported."""
|
||||
return len(await self.peek())
|
||||
|
|
7
royalnet/bard/implementations/__init__.py
Normal file
7
royalnet/bard/implementations/__init__.py
Normal file
|
@ -0,0 +1,7 @@
|
|||
from .dbstack import DBStack
|
||||
from .dbqueue import DBQueue
|
||||
|
||||
__all__ = [
|
||||
"DBStack",
|
||||
"DBQueue",
|
||||
]
|
37
royalnet/bard/implementations/dbqueue.py
Normal file
37
royalnet/bard/implementations/dbqueue.py
Normal file
|
@ -0,0 +1,37 @@
|
|||
from ..fileaudiosource import FileAudioSource
|
||||
from ..discordbard import DiscordBard
|
||||
from ..ytdldiscord import YtdlDiscord
|
||||
from typing import List, AsyncGenerator, Tuple, Any, Dict, Optional
|
||||
|
||||
|
||||
class DBQueue(DiscordBard):
|
||||
"""A First-In-First-Out music queue.
|
||||
|
||||
It is what was once called a ``playlist``."""
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
self.list: List[YtdlDiscord] = []
|
||||
|
||||
async def _generator(self) -> AsyncGenerator[Optional[FileAudioSource], Tuple[Tuple[Any, ...], Dict[str, Any]]]:
|
||||
yield
|
||||
while True:
|
||||
try:
|
||||
ytd = self.list.pop(0)
|
||||
except IndexError:
|
||||
yield None
|
||||
else:
|
||||
async with ytd.spawn_audiosource() as fas:
|
||||
yield fas
|
||||
|
||||
async def add(self, ytd: YtdlDiscord):
|
||||
self.list.append(ytd)
|
||||
|
||||
async def peek(self) -> List[YtdlDiscord]:
|
||||
return self.list
|
||||
|
||||
async def remove(self, ytd: YtdlDiscord):
|
||||
self.list.remove(ytd)
|
||||
|
||||
async def cleanup(self) -> None:
|
||||
for ytd in self.list:
|
||||
await ytd.delete_asap()
|
37
royalnet/bard/implementations/dbstack.py
Normal file
37
royalnet/bard/implementations/dbstack.py
Normal file
|
@ -0,0 +1,37 @@
|
|||
from ..fileaudiosource import FileAudioSource
|
||||
from ..discordbard import DiscordBard
|
||||
from ..ytdldiscord import YtdlDiscord
|
||||
from typing import List, AsyncGenerator, Tuple, Any, Dict, Optional
|
||||
|
||||
|
||||
class DBStack(DiscordBard):
|
||||
"""A First-In-Last-Out music queue.
|
||||
|
||||
Not really sure if it is going to be useful..."""
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
self.list: List[YtdlDiscord] = []
|
||||
|
||||
async def _generator(self) -> AsyncGenerator[Optional[FileAudioSource], Tuple[Tuple[Any, ...], Dict[str, Any]]]:
|
||||
yield
|
||||
while True:
|
||||
try:
|
||||
ytd = self.list.pop()
|
||||
except IndexError:
|
||||
yield None
|
||||
else:
|
||||
async with ytd.spawn_audiosource() as fas:
|
||||
yield fas
|
||||
|
||||
async def add(self, ytd: YtdlDiscord):
|
||||
self.list.append(ytd)
|
||||
|
||||
async def peek(self) -> List[YtdlDiscord]:
|
||||
return self.list
|
||||
|
||||
async def remove(self, ytd: YtdlDiscord):
|
||||
self.list.remove(ytd)
|
||||
|
||||
async def cleanup(self) -> None:
|
||||
for ytd in self.list:
|
||||
await ytd.delete_asap()
|
|
@ -7,10 +7,9 @@ from .ytdlinfo import YtdlInfo
|
|||
from .ytdlfile import YtdlFile
|
||||
|
||||
try:
|
||||
import discord
|
||||
from royalnet.serf.discord import FileAudioSource
|
||||
from royalnet.bard.fileaudiosource import FileAudioSource
|
||||
except ImportError:
|
||||
discord = None
|
||||
FileAudioSource = None
|
||||
|
||||
try:
|
||||
import ffmpeg
|
||||
|
@ -71,7 +70,7 @@ class YtdlDiscord:
|
|||
|
||||
@asynccontextmanager
|
||||
async def spawn_audiosource(self):
|
||||
if discord is None:
|
||||
if FileAudioSource is None:
|
||||
raise ImportError("'discord' extra is not installed")
|
||||
await self.convert_to_pcm()
|
||||
with open(self.pcm_filename, "rb") as stream:
|
||||
|
|
Loading…
Reference in a new issue