mirror of
https://github.com/RafaelSolVargas/Vulkan.git
synced 2025-10-29 16:57:23 +00:00
Fixing error 34
This commit is contained in:
parent
2ffbab86eb
commit
f4e9e46d6d
@ -56,8 +56,8 @@ class Downloader:
|
|||||||
song.finish_down(song_info)
|
song.finish_down(song_info)
|
||||||
return song
|
return song
|
||||||
# Convert yt_dlp error to my own error
|
# Convert yt_dlp error to my own error
|
||||||
except DownloadError:
|
except DownloadError as e:
|
||||||
raise DownloadingError()
|
raise DownloadingError(e.msg)
|
||||||
|
|
||||||
@run_async
|
@run_async
|
||||||
def extract_info(self, url: str) -> List[dict]:
|
def extract_info(self, url: str) -> List[dict]:
|
||||||
|
|||||||
@ -106,6 +106,10 @@ class Playlist:
|
|||||||
self.__queue.append(song)
|
self.__queue.append(song)
|
||||||
return song
|
return song
|
||||||
|
|
||||||
|
def add_song_start(self, song: Song) -> Song:
|
||||||
|
self.__queue.insert(0, song)
|
||||||
|
return song
|
||||||
|
|
||||||
def shuffle(self) -> None:
|
def shuffle(self) -> None:
|
||||||
random.shuffle(self.__queue)
|
random.shuffle(self.__queue)
|
||||||
|
|
||||||
|
|||||||
@ -1,15 +1,20 @@
|
|||||||
|
from time import time
|
||||||
|
|
||||||
|
|
||||||
class Song:
|
class Song:
|
||||||
def __init__(self, identifier: str, playlist, requester: str) -> None:
|
def __init__(self, identifier: str, playlist, requester: str) -> None:
|
||||||
self.__identifier = identifier
|
self.__identifier = identifier
|
||||||
self.__info = {'requester': requester}
|
self.__info = {'requester': requester}
|
||||||
self.__problematic = False
|
self.__problematic = False
|
||||||
self.__playlist = playlist
|
self.__playlist = playlist
|
||||||
|
self.__downloadTime: int = time()
|
||||||
|
|
||||||
def finish_down(self, info: dict) -> None:
|
def finish_down(self, info: dict) -> None:
|
||||||
if info is None or info == {}:
|
if info is None or info == {}:
|
||||||
self.destroy()
|
self.destroy()
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
self.__downloadTime = time()
|
||||||
self.__useful_keys = ['duration',
|
self.__useful_keys = ['duration',
|
||||||
'title', 'webpage_url',
|
'title', 'webpage_url',
|
||||||
'channel', 'id', 'uploader',
|
'channel', 'id', 'uploader',
|
||||||
@ -35,6 +40,10 @@ class Song:
|
|||||||
self.__info['title'] = ''.join(char if char.isalnum() or char ==
|
self.__info['title'] = ''.join(char if char.isalnum() or char ==
|
||||||
' ' else ' ' for char in self.__info['title'])
|
' ' else ' ' for char in self.__info['title'])
|
||||||
|
|
||||||
|
@property
|
||||||
|
def downloadTime(self) -> int:
|
||||||
|
return self.__downloadTime
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def source(self) -> str:
|
def source(self) -> str:
|
||||||
if 'url' in self.__info.keys():
|
if 'url' in self.__info.keys():
|
||||||
@ -42,6 +51,10 @@ class Song:
|
|||||||
else:
|
else:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
@source.setter
|
||||||
|
def source(self, value) -> None:
|
||||||
|
self.__info['url'] = value
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def title(self) -> str:
|
def title(self) -> str:
|
||||||
if 'title' in self.__info.keys():
|
if 'title' in self.__info.keys():
|
||||||
@ -53,13 +66,17 @@ class Song:
|
|||||||
def duration(self) -> str:
|
def duration(self) -> str:
|
||||||
if 'duration' in self.__info.keys():
|
if 'duration' in self.__info.keys():
|
||||||
return self.__info['duration']
|
return self.__info['duration']
|
||||||
else:
|
else: # Default minimum duration
|
||||||
return 0.0
|
return 5.0
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def identifier(self) -> str:
|
def identifier(self) -> str:
|
||||||
return self.__identifier
|
return self.__identifier
|
||||||
|
|
||||||
|
@identifier.setter
|
||||||
|
def identifier(self, value) -> None:
|
||||||
|
self.__identifier = value
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def problematic(self) -> bool:
|
def problematic(self) -> bool:
|
||||||
return self.__problematic
|
return self.__problematic
|
||||||
|
|||||||
@ -1,4 +1,6 @@
|
|||||||
import asyncio
|
import asyncio
|
||||||
|
from time import time
|
||||||
|
from urllib.parse import parse_qs, urlparse
|
||||||
from Music.VulkanInitializer import VulkanInitializer
|
from Music.VulkanInitializer import VulkanInitializer
|
||||||
from discord import User, Member, Message, VoiceClient
|
from discord import User, Member, Message, VoiceClient
|
||||||
from asyncio import AbstractEventLoop, Semaphore, Queue
|
from asyncio import AbstractEventLoop, Semaphore, Queue
|
||||||
@ -11,6 +13,7 @@ from Music.Song import Song
|
|||||||
from Config.Configs import VConfigs
|
from Config.Configs import VConfigs
|
||||||
from Config.Messages import Messages
|
from Config.Messages import Messages
|
||||||
from Music.VulkanBot import VulkanBot
|
from Music.VulkanBot import VulkanBot
|
||||||
|
from Music.Downloader import Downloader
|
||||||
from Config.Embeds import VEmbeds
|
from Config.Embeds import VEmbeds
|
||||||
from Parallelism.Commands import VCommands, VCommandsType
|
from Parallelism.Commands import VCommands, VCommandsType
|
||||||
|
|
||||||
@ -78,6 +81,7 @@ class PlayerProcess(Process):
|
|||||||
self.__configs = VConfigs()
|
self.__configs = VConfigs()
|
||||||
self.__messages = Messages()
|
self.__messages = Messages()
|
||||||
self.__embeds = VEmbeds()
|
self.__embeds = VEmbeds()
|
||||||
|
self.__downloader = Downloader()
|
||||||
|
|
||||||
self.__semStopPlaying = Semaphore(0)
|
self.__semStopPlaying = Semaphore(0)
|
||||||
self.__loop.run_until_complete(self._run())
|
self.__loop.run_until_complete(self._run())
|
||||||
@ -147,11 +151,17 @@ class PlayerProcess(Process):
|
|||||||
if not self.__voiceClient.is_connected():
|
if not self.__voiceClient.is_connected():
|
||||||
print('[VOICE CHANNEL NOT NULL BUT DISCONNECTED, CONNECTING AGAIN]')
|
print('[VOICE CHANNEL NOT NULL BUT DISCONNECTED, CONNECTING AGAIN]')
|
||||||
await self.__connectToVoiceChannel()
|
await self.__connectToVoiceChannel()
|
||||||
# If the player is connected and playing
|
# If the player is connected and playing return the song to the playlist
|
||||||
elif self.__voiceClient.is_playing():
|
elif self.__voiceClient.is_playing():
|
||||||
print('[SONG ALREADY PLAYING, RETURNING]')
|
print('[SONG ALREADY PLAYING, RETURNING]')
|
||||||
|
self.__playlist.add_song_start(song)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
songStillAvailable = self.__verifyIfSongAvailable(song)
|
||||||
|
if not songStillAvailable:
|
||||||
|
print('[SONG NOT AVAILABLE ANYMORE, DOWNLOADING AGAIN]')
|
||||||
|
song = self.__downloadSongAgain(song)
|
||||||
|
|
||||||
self.__playing = True
|
self.__playing = True
|
||||||
self.__songPlaying = song
|
self.__songPlaying = song
|
||||||
|
|
||||||
@ -192,6 +202,30 @@ class PlayerProcess(Process):
|
|||||||
# Release the semaphore to finish the process
|
# Release the semaphore to finish the process
|
||||||
self.__semStopPlaying.release()
|
self.__semStopPlaying.release()
|
||||||
|
|
||||||
|
def __verifyIfSongAvailable(self, song: Song) -> bool:
|
||||||
|
"""Verify the song source to see if it's already expired"""
|
||||||
|
try:
|
||||||
|
parsedUrl = urlparse(song.source)
|
||||||
|
|
||||||
|
if 'expire' not in parsedUrl.query:
|
||||||
|
# If already passed 5 hours since the download
|
||||||
|
if song.downloadTime + 18000 < int(time()):
|
||||||
|
return False
|
||||||
|
return True
|
||||||
|
|
||||||
|
# If the current time plus the song duration plus 10min exceeds the expirationValue
|
||||||
|
expireValue = parse_qs(parsedUrl.query)['expire'][0]
|
||||||
|
if int(time()) + song.duration + 600 > int(str(expireValue)):
|
||||||
|
return False
|
||||||
|
return True
|
||||||
|
except Exception as e:
|
||||||
|
print(f'[ERROR VERIFYING SONG AVAILABILITY] -> {e}')
|
||||||
|
return False
|
||||||
|
|
||||||
|
def __downloadSongAgain(self, song: Song) -> Song:
|
||||||
|
"""Force a download to be executed again, one use case is when the song.source expired and needs to refresh"""
|
||||||
|
return self.__downloader.finish_one_song(song)
|
||||||
|
|
||||||
async def __playPrev(self, voiceChannelID: int) -> None:
|
async def __playPrev(self, voiceChannelID: int) -> None:
|
||||||
with self.__playlistLock:
|
with self.__playlistLock:
|
||||||
song = self.__playlist.prev_song()
|
song = self.__playlist.prev_song()
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user