From a45e54663ef9fd842c6a7538db4efcf5b6d8b24a Mon Sep 17 00:00:00 2001 From: Rafael Vargas Date: Thu, 30 Dec 2021 14:37:50 -0400 Subject: [PATCH] Refactoring Song completly, now uses one identifier --- vulkanbot/music/Song.py | 107 +++++++++++++++++++++++++--------------- 1 file changed, 66 insertions(+), 41 deletions(-) diff --git a/vulkanbot/music/Song.py b/vulkanbot/music/Song.py index 355c69a..9ddc478 100644 --- a/vulkanbot/music/Song.py +++ b/vulkanbot/music/Song.py @@ -1,64 +1,89 @@ -from discord.embeds import Embed +from discord import Embed +import datetime +from vulkanbot.music.Interfaces import ISong, IPlaylist +from config import config -class Song(): +class Song(ISong): """Store the usefull information about a Song""" - def __init__(self, url: str, title: str) -> None: + def __init__(self, identifier: str, playlist: IPlaylist) -> None: """Create a song with only the URL to the youtube song""" - self.__url = url - self.__title = title + self.__identifier = identifier self.__info = {} + self.__playlist: IPlaylist = playlist def finish_down(self, info: dict) -> None: - """Get and store the full information of the song""" + """Get and store the full information of the song""" self.__usefull_keys = ['url', 'duration', - 'description', 'webpage_url', + 'title', 'webpage_url', 'channel', 'id', 'uploader', - 'thumbnail'] - self.__extract_info(info) - - def __extract_info(self, info) -> None: - """Extract the usefull information returned by the Downloader""" + 'thumbnail', 'original_url'] + for key in self.__usefull_keys: try: self.__info[key] = info[key] except Exception as e: print(e) - raise e - - def embed(self) -> Embed: - """Configure and return the info to create the embed for this song""" - info = { - 'title': self.__title, - 'url': self.__url, - 'uploader': self.__info['uploader'] - } - - if 'thumbnail' in self.__info.keys(): - info['thumbnail'] = self.__info['thumbnail'] - - if 'duration' in self.__info.keys(): - info['duration'] = self.__info['duration'] - - return info - - @property - def info(self) -> dict: - """Return the compiled info of this song""" - if self.__info: - return self.__info - - @property - def title(self) -> str: - return self.__title + raise e @property def source(self) -> str: """Return the Song Source URL to play""" if 'url' in self.__info.keys(): return self.__info['url'] + else: + return None @property - def url(self) -> str: - return self.__url + def title(self) -> str: + """Return the Song Title""" + if 'title' in self.__info.keys(): + return self.__info['title'] + else: + return None + + @property + def duration(self) -> str: + """Return the Song Title""" + if 'duration' in self.__info.keys(): + return self.__info['duration'] + else: + return 0.0 + + @property + def identifier(self) -> str: + return self.__identifier + + def destroy(self) -> None: + """Destroy the song from the playlist due to any type of error""" + self.__playlist.destroy_song(self) + del self + + def embed(self, title: str) -> Embed: + """Configure the embed to show the song information""" + + embedvc = Embed( + title=title, + description=f"[{self.__info['title']}]({self.__info['original_url']})", + color=config.COLOURS['blue'] + ) + + embedvc.add_field(name=config.SONGINFO_UPLOADER, + value=self.__info['uploader'], + inline=False) + + if 'thumbnail' in self.__info.keys(): + embedvc.set_thumbnail(url=self.__info['thumbnail']) + + if 'duration' in self.__info.keys(): + duration = str(datetime.timedelta(seconds=self.__info['duration'])) + embedvc.add_field(name=config.SONGINFO_DURATION, + value=f"{duration}", + inline=False) + else: + embedvc.add_field(name=config.SONGINFO_DURATION, + value=config.SONGINFO_UNKNOWN_DURATION, + inline=False) + + return embedvc