mirror of
https://github.com/RafaelSolVargas/Vulkan.git
synced 2025-10-29 16:57:23 +00:00
Adding more stability to Searcher
This commit is contained in:
parent
4c66c64041
commit
f09568bd69
@ -2,7 +2,7 @@ from discord.ext.commands import Context
|
|||||||
from discord import Client
|
from discord import Client
|
||||||
from Controllers.AbstractController import AbstractController
|
from Controllers.AbstractController import AbstractController
|
||||||
from Controllers.ControllerResponse import ControllerResponse
|
from Controllers.ControllerResponse import ControllerResponse
|
||||||
from Utils.Utils import format_time
|
from Utils.Utils import Utils
|
||||||
|
|
||||||
|
|
||||||
class HistoryController(AbstractController):
|
class HistoryController(AbstractController):
|
||||||
@ -18,7 +18,7 @@ class HistoryController(AbstractController):
|
|||||||
else:
|
else:
|
||||||
text = f'\n📜 History Length: {len(history)} | Max: {self.config.MAX_SONGS_HISTORY}\n'
|
text = f'\n📜 History Length: {len(history)} | Max: {self.config.MAX_SONGS_HISTORY}\n'
|
||||||
for pos, song in enumerate(history, start=1):
|
for pos, song in enumerate(history, start=1):
|
||||||
text += f"**`{pos}` - ** {song.title} - `{format_time(song.duration)}`\n"
|
text += f"**`{pos}` - ** {song.title} - `{Utils.format_time(song.duration)}`\n"
|
||||||
|
|
||||||
embed = self.embeds.HISTORY(text)
|
embed = self.embeds.HISTORY(text)
|
||||||
return ControllerResponse(self.ctx, embed)
|
return ControllerResponse(self.ctx, embed)
|
||||||
|
|||||||
@ -3,7 +3,7 @@ from discord import Client
|
|||||||
from Controllers.AbstractController import AbstractController
|
from Controllers.AbstractController import AbstractController
|
||||||
from Controllers.ControllerResponse import ControllerResponse
|
from Controllers.ControllerResponse import ControllerResponse
|
||||||
from Music.Downloader import Downloader
|
from Music.Downloader import Downloader
|
||||||
from Utils.Utils import format_time
|
from Utils.Utils import Utils
|
||||||
|
|
||||||
|
|
||||||
class QueueController(AbstractController):
|
class QueueController(AbstractController):
|
||||||
@ -29,7 +29,7 @@ class QueueController(AbstractController):
|
|||||||
else:
|
else:
|
||||||
title = self.config.QUEUE_TITLE
|
title = self.config.QUEUE_TITLE
|
||||||
|
|
||||||
total_time = format_time(sum([int(song.duration if song.duration else 0)
|
total_time = Utils.format_time(sum([int(song.duration if song.duration else 0)
|
||||||
for song in songs_preload]))
|
for song in songs_preload]))
|
||||||
total_songs = len(self.player.playlist)
|
total_songs = len(self.player.playlist)
|
||||||
|
|
||||||
@ -37,7 +37,7 @@ class QueueController(AbstractController):
|
|||||||
|
|
||||||
for pos, song in enumerate(songs_preload, start=1):
|
for pos, song in enumerate(songs_preload, start=1):
|
||||||
song_name = song.title if song.title else self.config.SONG_DOWNLOADING
|
song_name = song.title if song.title else self.config.SONG_DOWNLOADING
|
||||||
text += f"**`{pos}` - ** {song_name} - `{format_time(song.duration)}`\n"
|
text += f"**`{pos}` - ** {song_name} - `{Utils.format_time(song.duration)}`\n"
|
||||||
|
|
||||||
embed = self.embeds.QUEUE(title, text)
|
embed = self.embeds.QUEUE(title, text)
|
||||||
return ControllerResponse(self.ctx, embed)
|
return ControllerResponse(self.ctx, embed)
|
||||||
|
|||||||
@ -29,6 +29,11 @@ class MusicUnavailable(Error):
|
|||||||
super().__init__(message, title, *args)
|
super().__init__(message, title, *args)
|
||||||
|
|
||||||
|
|
||||||
|
class YoutubeError(Error):
|
||||||
|
def __init__(self, message='', title='', *args: object) -> None:
|
||||||
|
super().__init__(message, title, *args)
|
||||||
|
|
||||||
|
|
||||||
class BadCommandUsage(Error):
|
class BadCommandUsage(Error):
|
||||||
def __init__(self, message='', title='', *args: object) -> None:
|
def __init__(self, message='', title='', *args: object) -> None:
|
||||||
super().__init__(message, title, *args)
|
super().__init__(message, title, *args)
|
||||||
|
|||||||
@ -1,12 +1,10 @@
|
|||||||
import asyncio
|
import asyncio
|
||||||
from typing import List
|
from typing import List
|
||||||
|
|
||||||
from numpy import extract
|
|
||||||
from Config.Config import Configs
|
from Config.Config import Configs
|
||||||
from yt_dlp import YoutubeDL
|
from yt_dlp import YoutubeDL
|
||||||
from concurrent.futures import ThreadPoolExecutor
|
from concurrent.futures import ThreadPoolExecutor
|
||||||
from Music.Song import Song
|
from Music.Song import Song
|
||||||
from Utils.Utils import is_url, run_async
|
from Utils.Utils import Utils, run_async
|
||||||
|
|
||||||
|
|
||||||
class Downloader():
|
class Downloader():
|
||||||
@ -39,10 +37,10 @@ class Downloader():
|
|||||||
self.__playlist_keys = ['entries']
|
self.__playlist_keys = ['entries']
|
||||||
|
|
||||||
def finish_one_song(self, song: Song) -> Song:
|
def finish_one_song(self, song: Song) -> Song:
|
||||||
if song.identifier == None:
|
if song.identifier is None:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
if is_url(song.identifier):
|
if Utils.is_url(song.identifier):
|
||||||
song_info = self.__download_url(song.identifier)
|
song_info = self.__download_url(song.identifier)
|
||||||
else:
|
else:
|
||||||
song_info = self.__download_title(song.identifier)
|
song_info = self.__download_title(song.identifier)
|
||||||
@ -56,7 +54,7 @@ class Downloader():
|
|||||||
|
|
||||||
@run_async
|
@run_async
|
||||||
def extract_info(self, url: str) -> List[dict]:
|
def extract_info(self, url: str) -> List[dict]:
|
||||||
if is_url(url): # If Url
|
if Utils.is_url(url): # If Url
|
||||||
options = Downloader.__YDL_OPTIONS_EXTRACT
|
options = Downloader.__YDL_OPTIONS_EXTRACT
|
||||||
with YoutubeDL(options) as ydl:
|
with YoutubeDL(options) as ydl:
|
||||||
try:
|
try:
|
||||||
@ -78,7 +76,7 @@ class Downloader():
|
|||||||
return []
|
return []
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f'DEVELOPER NOTE -> Error Extracting Music: {e}')
|
print(f'DEVELOPER NOTE -> Error Extracting Music: {e}')
|
||||||
raise
|
raise e
|
||||||
else:
|
else:
|
||||||
return []
|
return []
|
||||||
|
|
||||||
@ -109,10 +107,11 @@ class Downloader():
|
|||||||
return None
|
return None
|
||||||
|
|
||||||
def __download_func(song: Song) -> None:
|
def __download_func(song: Song) -> None:
|
||||||
if is_url(song.identifier):
|
if Utils.is_url(song.identifier):
|
||||||
song_info = self.__download_url(song.identifier)
|
song_info = self.__download_url(song.identifier)
|
||||||
else:
|
else:
|
||||||
song_info = self.__download_title(song.identifier)
|
song_info = self.__download_title(song.identifier)
|
||||||
|
|
||||||
song.finish_down(song_info)
|
song.finish_down(song_info)
|
||||||
|
|
||||||
# Creating a loop task to download each song
|
# Creating a loop task to download each song
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
from Exceptions.Exceptions import InvalidInput, SpotifyError
|
from Exceptions.Exceptions import InvalidInput, SpotifyError, YoutubeError
|
||||||
from Music.Downloader import Downloader
|
from Music.Downloader import Downloader
|
||||||
from Music.Types import Provider
|
from Music.Types import Provider
|
||||||
from Music.Spotify import SpotifySearch
|
from Music.Spotify import SpotifySearch
|
||||||
@ -18,8 +18,11 @@ class Searcher():
|
|||||||
raise InvalidInput(self.__messages.UNKNOWN_INPUT, self.__messages.UNKNOWN_INPUT_TITLE)
|
raise InvalidInput(self.__messages.UNKNOWN_INPUT, self.__messages.UNKNOWN_INPUT_TITLE)
|
||||||
|
|
||||||
elif provider == Provider.YouTube:
|
elif provider == Provider.YouTube:
|
||||||
|
try:
|
||||||
musics = await self.__down.extract_info(track)
|
musics = await self.__down.extract_info(track)
|
||||||
return musics
|
return musics
|
||||||
|
except:
|
||||||
|
raise YoutubeError(self.__messages.YOUTUBE_ERROR, self.__messages.GENERIC_TITLE)
|
||||||
|
|
||||||
elif provider == Provider.Spotify:
|
elif provider == Provider.Spotify:
|
||||||
try:
|
try:
|
||||||
|
|||||||
@ -10,6 +10,10 @@ class Song(ISong):
|
|||||||
self.__playlist: IPlaylist = playlist
|
self.__playlist: IPlaylist = playlist
|
||||||
|
|
||||||
def finish_down(self, info: dict) -> None:
|
def finish_down(self, info: dict) -> None:
|
||||||
|
if info is None:
|
||||||
|
self.destroy()
|
||||||
|
return None
|
||||||
|
|
||||||
self.__usefull_keys = ['duration',
|
self.__usefull_keys = ['duration',
|
||||||
'title', 'webpage_url',
|
'title', 'webpage_url',
|
||||||
'channel', 'id', 'uploader',
|
'channel', 'id', 'uploader',
|
||||||
|
|||||||
@ -32,44 +32,6 @@ class Utils:
|
|||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
def is_connected(ctx):
|
|
||||||
try:
|
|
||||||
voice_channel = ctx.guild.voice_client.channel
|
|
||||||
|
|
||||||
if not ctx.guild.voice_client.is_connected():
|
|
||||||
return None
|
|
||||||
else:
|
|
||||||
return voice_channel
|
|
||||||
except:
|
|
||||||
return None
|
|
||||||
|
|
||||||
|
|
||||||
def format_time(duration) -> str:
|
|
||||||
if not duration:
|
|
||||||
return "00:00"
|
|
||||||
|
|
||||||
hours = duration // 60 // 60
|
|
||||||
minutes = duration // 60 % 60
|
|
||||||
seconds = duration % 60
|
|
||||||
|
|
||||||
return "{}{}{:02d}:{:02d}".format(
|
|
||||||
hours if hours else "",
|
|
||||||
":" if hours else "",
|
|
||||||
minutes,
|
|
||||||
seconds
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
def is_url(string) -> bool:
|
|
||||||
regex = re.compile(
|
|
||||||
"http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+")
|
|
||||||
|
|
||||||
if re.search(regex, string):
|
|
||||||
return True
|
|
||||||
else:
|
|
||||||
return False
|
|
||||||
|
|
||||||
|
|
||||||
class Timer:
|
class Timer:
|
||||||
def __init__(self, callback):
|
def __init__(self, callback):
|
||||||
self.__callback = callback
|
self.__callback = callback
|
||||||
|
|||||||
@ -79,3 +79,4 @@ class SearchMessages(Singleton):
|
|||||||
self.UNKNOWN_INPUT_TITLE = 'Nothing Found'
|
self.UNKNOWN_INPUT_TITLE = 'Nothing Found'
|
||||||
self.SPOTIFY_ERROR = 'Spotify could not process any songs with this input, verify your link or try again later.'
|
self.SPOTIFY_ERROR = 'Spotify could not process any songs with this input, verify your link or try again later.'
|
||||||
self.GENERIC_TITLE = 'Input could not be processed'
|
self.GENERIC_TITLE = 'Input could not be processed'
|
||||||
|
self.YOUTUBE_ERROR = 'Youtube could not process any songs with this input, verify your link or try again later.'
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user