refactor(youtubedl): clean up formatting and use dataclasses
This commit is contained in:
parent
5281236e0f
commit
186eda4934
69
youtubedl.py
69
youtubedl.py
@ -1,5 +1,6 @@
|
|||||||
import asyncio
|
import asyncio
|
||||||
import collections
|
import collections
|
||||||
|
from dataclasses import dataclass
|
||||||
from typing import Any, Optional
|
from typing import Any, Optional
|
||||||
|
|
||||||
import disnake
|
import disnake
|
||||||
@ -50,10 +51,43 @@ class YTDLSource(disnake.PCMVolumeTransformer):
|
|||||||
return self.__repr__()
|
return self.__repr__()
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class QueuedSong:
|
||||||
|
player: YTDLSource
|
||||||
|
trigger_message: disnake.Message
|
||||||
|
|
||||||
|
def format(self, show_queuer=False, hide_preview=False, multiline=False) -> str:
|
||||||
|
if multiline:
|
||||||
|
return (
|
||||||
|
f"[`{self.player.title}`]({'<' if hide_preview else ''}{self.player.original_url}{'>' if hide_preview else ''})\n**duration:** {self.format_duration(self.player.duration) if self.player.duration else '[live]'}"
|
||||||
|
+ (
|
||||||
|
f", **queuer:** <@{self.trigger_message.author.id}>"
|
||||||
|
if show_queuer
|
||||||
|
else ""
|
||||||
|
)
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
return (
|
||||||
|
f"[`{self.player.title}`]({'<' if hide_preview else ''}{self.player.original_url}{'>' if hide_preview else ''}) [{self.format_duration(self.player.duration) if self.player.duration else 'live'}]"
|
||||||
|
+ (f" (<@{self.trigger_message.author.id}>)" if show_queuer else "")
|
||||||
|
)
|
||||||
|
|
||||||
|
def format_duration(self, duration: int) -> str:
|
||||||
|
hours, duration = divmod(duration, 3600)
|
||||||
|
minutes, duration = divmod(duration, 60)
|
||||||
|
segments = [hours, minutes, duration]
|
||||||
|
if len(segments) == 3 and segments[0] == 0:
|
||||||
|
del segments[0]
|
||||||
|
return f"{':'.join(f'{s:0>2}' for s in segments)}"
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return self.__repr__()
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
class QueuedPlayer:
|
class QueuedPlayer:
|
||||||
def __init__(self):
|
queue = collections.deque()
|
||||||
self.queue = collections.deque()
|
current: Optional[QueuedSong] = None
|
||||||
self.current = None
|
|
||||||
|
|
||||||
def queue_pop(self):
|
def queue_pop(self):
|
||||||
popped = self.queue.popleft()
|
popped = self.queue.popleft()
|
||||||
@ -66,35 +100,6 @@ class QueuedPlayer:
|
|||||||
def queue_add_front(self, item):
|
def queue_add_front(self, item):
|
||||||
self.queue.appendleft(item)
|
self.queue.appendleft(item)
|
||||||
|
|
||||||
def __repr__(self):
|
|
||||||
return f"<QueuedPlayer current={self.current} queue={self.queue}>"
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
return self.__repr__()
|
|
||||||
|
|
||||||
|
|
||||||
class QueuedSong:
|
|
||||||
def __init__(self, player, queuer):
|
|
||||||
self.player = player
|
|
||||||
self.queuer = queuer
|
|
||||||
|
|
||||||
def format(self, with_queuer=False, hide_preview=False) -> str:
|
|
||||||
return (
|
|
||||||
f"[`{self.player.title}`]({'<' if hide_preview else ''}{self.player.original_url}{'>' if hide_preview else ''}) [{self.format_duration(self.player.duration) if self.player.duration else 'live'}]"
|
|
||||||
+ (f" (<@{self.queuer}>)" if with_queuer else "")
|
|
||||||
)
|
|
||||||
|
|
||||||
def format_duration(self, duration: int) -> str:
|
|
||||||
hours, duration = divmod(duration, 3600)
|
|
||||||
minutes, duration = divmod(duration, 60)
|
|
||||||
segments = [hours, minutes, duration]
|
|
||||||
if len(segments) == 3 and segments[0] == 0:
|
|
||||||
del segments[0]
|
|
||||||
return f"{':'.join(f'{s:0>2}' for s in segments)}"
|
|
||||||
|
|
||||||
def __repr__(self):
|
|
||||||
return f"<QueuedSong player={self.player} queuer={self.queuer}>"
|
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return self.__repr__()
|
return self.__repr__()
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user