diff --git a/command.py b/command.py
index 2fd317b..92581cf 100644
--- a/command.py
+++ b/command.py
@@ -311,6 +311,8 @@ def cmd_play_playlist(bot, user, text, command, parameter):
var.playlist.extend(items)
for music in items:
log.info("cmd: add to playlist: " + util.format_debug_song_string(music))
+ else:
+ bot.send_msg(constants.strings("playlist_fetching_failed"), text)
def cmd_play_radio(bot, user, text, command, parameter):
diff --git a/configuration.default.ini b/configuration.default.ini
index 5db47fd..669e574 100644
--- a/configuration.default.ini
+++ b/configuration.default.ini
@@ -210,6 +210,7 @@ yt_result = Youtube query result: {result_table} Use !ytplay {{index}} to
!ytquery -n for the next page.
yt_no_more = No more results!
yt_query_error = Unable to query youtube!
+playlist_fetching_failed = Unable to fetch the playlist!
help =
Commands
Control
diff --git a/media/playlist.py b/media/playlist.py
index b8d1be4..576485a 100644
--- a/media/playlist.py
+++ b/media/playlist.py
@@ -114,6 +114,11 @@ class PlayList(list):
def current_item(self):
return self[self.current_index]
+ def current_item_downloading(self):
+ if self[self.current_index]['type'] == 'url' and self[self.current_index]['ready'] == 'downloading':
+ return True
+ return False
+
def next_index(self):
if len(self) == 0:
return False
diff --git a/mumbleBot.py b/mumbleBot.py
index 8ce8fa7..827272a 100644
--- a/mumbleBot.py
+++ b/mumbleBot.py
@@ -45,7 +45,7 @@ type : url
artist
thumbnail
user
- ready (validation, no, downloading, yes)
+ ready (validation, no, downloading, yes, failed)
from_playlist (yes,no)
playlist_title
playlist_url
@@ -340,15 +340,19 @@ class MumbleBot:
# Check if the music is ready to be played
if music["ready"] == "downloading":
- return
+ self.log.info("bot: current music isn't ready, downloading in progress.")
+ while var.playlist.current_item_downloading():
+ time.sleep(0.5)
+ music = var.playlist.current_item()
+
elif music["ready"] != "yes" or not os.path.exists(music['path']):
- self.log.info("bot: current music isn't ready, downloading...")
- downloaded_music = self.download_music()
- if not downloaded_music:
- self.log.info("bot: removing music from the playlist: %s" % util.format_debug_song_string(music))
- var.playlist.remove(index)
- return
- music = downloaded_music
+ self.log.info("bot: current music isn't ready, start to download.")
+ music = self.download_music()
+
+ if music['ready'] == 'failed':
+ self.log.info("bot: removing music from the playlist: %s" % util.format_debug_song_string(music))
+ var.playlist.remove(index)
+ return
uri = music['path']
elif music["type"] == "file":
@@ -468,7 +472,6 @@ class MumbleBot:
self.log.info("bot: download attempts %d / %d" % (i+1, attempts))
try:
ydl.extract_info(url)
- music['ready'] = "yes"
download_succeed = True
break
except:
@@ -476,17 +479,20 @@ class MumbleBot:
error = error_traceback.rstrip().split("\n")[-1]
self.log.error("bot: download failed with error:\n %s" % error)
- if not download_succeed:
+ if download_succeed:
+ music['ready'] = "yes"
+ self.log.info(
+ "bot: finished downloading url (%s) %s, saved to %s." % (music['title'], url, music['path']))
+ else:
for f in [mp3, path.replace(".%(ext)s", ".jpg"), path.replace(".%(ext)s", ".m4a")]:
if os.path.exists(f):
os.remove(f)
self.send_msg(constants.strings('unable_download'))
- return False
+ music['ready'] = "failed"
else:
self.log.info("bot: music file existed, skip downloading " + mp3)
music['ready'] = "yes"
- self.log.info("bot: finished downloading url (%s) %s, saved to %s." % (music['title'], url, music['path']))
music = util.get_music_tag_info(music)
var.playlist.update(music, index)
@@ -574,9 +580,10 @@ class MumbleBot:
if self.thread is None or not raw_music:
# Not music into the buffet
- if not self.is_pause and var.playlist.next():
- self.launch_music()
- self.async_download_next()
+ if not self.is_pause:
+ if len(var.playlist) > 0 and var.playlist.next():
+ self.launch_music()
+ self.async_download_next()
while self.mumble.sound_output.get_buffer_size() > 0:
# Empty the buffer before exit