diff --git a/beetsplug/smartplaylist.py b/beetsplug/smartplaylist.py index 3a9f630ed..82739a995 100644 --- a/beetsplug/smartplaylist.py +++ b/beetsplug/smartplaylist.py @@ -57,8 +57,8 @@ class SmartPlaylistPlugin(BeetsPlugin): ) self.config["prefix"].redact = True # May contain username/password. - self._matched_playlists = None - self._unmatched_playlists = None + self._matched_playlists: set[tuple[Any, Any, Any]] = set() + self._unmatched_playlists: set[tuple[Any, Any, Any]] = set() if self.config["auto"]: self.register_listener("database_change", self.db_change) @@ -129,15 +129,15 @@ class SmartPlaylistPlugin(BeetsPlugin): def update_cmd(self, lib: Any, opts: Any, args: list[str]) -> None: self.build_queries() if args: - args = set(args) - for a in list(args): + args_set = set(args) + for a in list(args_set): if not a.endswith(".m3u"): - args.add(f"{a}.m3u") + args_set.add(f"{a}.m3u") playlists = { (name, q, a_q) for name, q, a_q in self._unmatched_playlists - if name in args + if name in args_set } if not playlists: unmatched = [name for name, _, _ in self._unmatched_playlists] @@ -185,6 +185,7 @@ class SmartPlaylistPlugin(BeetsPlugin): try: for key, model_cls in (("query", Item), ("album_query", Album)): qs = playlist.get(key) + query_and_sort: tuple[Any, Any] if qs is None: query_and_sort = None, None elif isinstance(qs, str): @@ -353,7 +354,7 @@ class SmartPlaylistPlugin(BeetsPlugin): ) f.write(comment.encode("utf-8") + entry.uri + b"\n") # Send an event when playlists were updated. - send_event("smartplaylist_update") + send_event("smartplaylist_update") # type: ignore if pretend: self._log.info( diff --git a/test/plugins/test_smartplaylist.py b/test/plugins/test_smartplaylist.py index ad9f056cc..8ec2c74ce 100644 --- a/test/plugins/test_smartplaylist.py +++ b/test/plugins/test_smartplaylist.py @@ -33,8 +33,8 @@ from beetsplug.smartplaylist import SmartPlaylistPlugin class SmartPlaylistTest(BeetsTestCase): def test_build_queries(self): spl = SmartPlaylistPlugin() - assert spl._matched_playlists is None - assert spl._unmatched_playlists is None + assert spl._matched_playlists == set() + assert spl._unmatched_playlists == set() config["smartplaylist"]["playlists"].set([]) spl.build_queries() @@ -182,7 +182,7 @@ class SmartPlaylistTest(BeetsTestCase): q = Mock() a_q = Mock() pl = b"$title-my.m3u", (q, None), (a_q, None) - spl._matched_playlists = [pl] + spl._matched_playlists = {pl} dir = mkdtemp() config["smartplaylist"]["relative_to"] = False @@ -224,7 +224,7 @@ class SmartPlaylistTest(BeetsTestCase): q = Mock() a_q = Mock() pl = b"$title-my.m3u", (q, None), (a_q, None) - spl._matched_playlists = [pl] + spl._matched_playlists = {pl} dir = mkdtemp() config["smartplaylist"]["output"] = "extm3u" @@ -274,7 +274,7 @@ class SmartPlaylistTest(BeetsTestCase): q = Mock() a_q = Mock() pl = b"$title-my.m3u", (q, None), (a_q, None) - spl._matched_playlists = [pl] + spl._matched_playlists = {pl} dir = mkdtemp() config["smartplaylist"]["output"] = "extm3u" @@ -319,7 +319,7 @@ class SmartPlaylistTest(BeetsTestCase): q = Mock() a_q = Mock() pl = b"$title-my.m3u", (q, None), (a_q, None) - spl._matched_playlists = [pl] + spl._matched_playlists = {pl} dir = mkdtemp() tpl = "http://beets:8337/item/$id/file" @@ -380,7 +380,7 @@ class SmartPlaylistTest(BeetsTestCase): # Create playlist with multiple queries (stored as tuple) queries_and_sorts = ((q1, None), (q2, None), (q3, None)) pl = "ordered.m3u", (queries_and_sorts, None), (None, None) - spl._matched_playlists = [pl] + spl._matched_playlists = {pl} dir = mkdtemp() config["smartplaylist"]["relative_to"] = False @@ -435,7 +435,7 @@ class SmartPlaylistTest(BeetsTestCase): # Create playlist with multiple queries (stored as tuple) queries_and_sorts = ((q1, None), (q2, None)) pl = "dedup.m3u", (queries_and_sorts, None), (None, None) - spl._matched_playlists = [pl] + spl._matched_playlists = {pl} dir = mkdtemp() config["smartplaylist"]["relative_to"] = False