From a2cb955ed8c44a187f606ee0cefce2730331d0df Mon Sep 17 00:00:00 2001 From: Terry Geng Date: Thu, 12 Mar 2020 18:18:12 +0800 Subject: [PATCH] fix: refresh video metatdata after validation --- command.py | 2 +- media/cache.py | 9 --------- media/playlist.py | 28 ++++++++++++++++++++++++---- mumbleBot.py | 5 +++-- 4 files changed, 28 insertions(+), 16 deletions(-) diff --git a/command.py b/command.py index 2c04f0c..5022088 100644 --- a/command.py +++ b/command.py @@ -134,7 +134,7 @@ def cmd_url_ban(bot, user, text, command, parameter): var.cache.free_and_delete(id) var.playlist.remove_by_id(id) else: - if var.playlist.current_item().type == 'url': + if var.playlist.current_item() and var.playlist.current_item().type == 'url': item = var.playlist.current_item().item() bot.mumble.users[text.actor].send_text_message(util.url_ban(util.get_url_from_input(item.url))) var.cache.free_and_delete(item.id) diff --git a/media/cache.py b/media/cache.py index 72261eb..eef1688 100644 --- a/media/cache.py +++ b/media/cache.py @@ -177,15 +177,6 @@ class CachedItemWrapper: self.lib.save(self.id) return ret - def async_prepare(self): - th = threading.Thread( - target=self.prepare, name="Prepare-" + self.id[:7]) - self.log.info( - "%s: start preparing item in thread: " % self.item().type + self.format_debug_string()) - th.daemon = True - th.start() - return th - def uri(self): return self.item().uri() diff --git a/media/playlist.py b/media/playlist.py index d078fa3..55dca33 100644 --- a/media/playlist.py +++ b/media/playlist.py @@ -58,7 +58,7 @@ class BasePlaylist(list): self.version += 1 super().append(item) self.pending_items.append(item) - self.start_async_validating() + self.async_validate() return item @@ -74,7 +74,7 @@ class BasePlaylist(list): self.current_index += 1 self.pending_items.append(item) - self.start_async_validating() + self.async_validate() return item @@ -82,7 +82,7 @@ class BasePlaylist(list): self.version += 1 super().extend(items) self.pending_items.extend(items) - self.start_async_validating() + self.async_validate() return items def next(self): @@ -210,7 +210,7 @@ class BasePlaylist(list): print("%d %s" % (index, item_wrapper.format_debug_string())) print("===== End =====") - def start_async_validating(self): + def async_validate(self): if not self.validating_thread_lock.locked(): time.sleep(0.1) # Just avoid validation finishes too fast and delete songs while something is reading it. th = threading.Thread(target=self._check_valid, name="Validating") @@ -223,14 +223,34 @@ class BasePlaylist(list): while len(self.pending_items) > 0: item = self.pending_items.pop() self.log.debug("playlist: validating %s" % item.format_debug_string()) + ver = item.version if not item.validate() or item.is_failed(): self.log.debug("playlist: validating failed.") var.cache.free_and_delete(item.id) self.remove_by_id(item.id) + continue + if item.version > ver: + self.version += 1 self.log.debug("playlist: validating finished.") self.validating_thread_lock.release() + def async_prepare(self, index): + th = threading.Thread( + target=self._prepare, name="Prepare-" + self[index].id[:7], args=(index,)) + self.log.info( + "%s: start preparing item in thread: " % self[index].item().type + self[index].format_debug_string()) + th.daemon = True + th.start() + return th + + def _prepare(self, index): + item = self[index] + ver = item.version + item.prepare() + if item.version > ver: + self.version += 1 + class OneshotPlaylist(BasePlaylist): def __init__(self): diff --git a/mumbleBot.py b/mumbleBot.py index dd39c8b..23e1d41 100644 --- a/mumbleBot.py +++ b/mumbleBot.py @@ -355,7 +355,7 @@ class MumbleBot: next = var.playlist.next_item() if next.validate(): if not next.is_ready(): - next.async_prepare() + var.playlist.async_prepare(var.playlist.next_index()) break else: var.playlist.remove_by_id(next.id) @@ -427,7 +427,7 @@ class MumbleBot: else: self.log.info("bot: current music isn't ready, start downloading.") self.wait_for_downloading = True - current.async_prepare() + var.playlist.async_prepare(var.playlist.current_index) self.send_msg(constants.strings('download_in_progress', item=current.format_short_string())) else: var.playlist.remove_by_id(current.id) @@ -439,6 +439,7 @@ class MumbleBot: if current: if current.is_ready(): self.wait_for_downloading = False + var.playlist.version += 1 self.launch_music() self.async_download_next() elif current.is_failed():