Refactoring Song completly, now uses one identifier

This commit is contained in:
Rafael Vargas 2021-12-30 14:37:50 -04:00
parent de535eccbc
commit a45e54663e

View File

@ -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