diff --git a/changelog.d/audio/3332.bugfix.1.rst b/changelog.d/audio/3332.bugfix.1.rst new file mode 100644 index 000000000..b6a1818c4 --- /dev/null +++ b/changelog.d/audio/3332.bugfix.1.rst @@ -0,0 +1 @@ +Fixed symbolic link folders not showing for local tracks. \ No newline at end of file diff --git a/redbot/cogs/audio/audio_dataclasses.py b/redbot/cogs/audio/audio_dataclasses.py index d31cbbc9b..a0b8c92d4 100644 --- a/redbot/cogs/audio/audio_dataclasses.py +++ b/redbot/cogs/audio/audio_dataclasses.py @@ -1,3 +1,4 @@ +import contextlib import ntpath import os import posixpath @@ -167,29 +168,51 @@ class LocalPath: modified.path = modified.path.joinpath(*args) return modified - def multiglob(self, *patterns): + def rglob(self, pattern, folder=False): + return list(glob.glob(f"{self.path}{os.sep}**{os.sep}{pattern}", recursive=True)) + + def glob(self, pattern, folder=False): + if folder: + return list(glob.glob(f"{self.path}{os.sep}*{os.sep}", recursive=False)) + else: + return list(glob.glob(f"{self.path}{os.sep}*{pattern}", recursive=False)) + + def multiglob(self, *patterns, folder=False): paths = [] for p in patterns: - paths.extend(list(self.path.glob(p))) - for p in self._filtered(paths): - yield p + paths.extend(self.glob(p, folder=folder)) + if not folder: + for p in self._filtered(paths): + yield p + else: + for p in paths: + p = LocalPath(p) if not isinstance(p, LocalPath) else p + yield p - def multirglob(self, *patterns): + def multirglob(self, *patterns, folder=False): paths = [] for p in patterns: - paths.extend(list(self.path.rglob(p))) - - for p in self._filtered(paths): - yield p + paths.extend(self.rglob(p, folder=folder)) + if not folder: + for p in self._filtered(paths): + yield p + else: + for p in paths: + p = LocalPath(p) if not isinstance(p, LocalPath) else p + yield p def _filtered(self, paths: List[Path]): for p in paths: + p = LocalPath(p) if not isinstance(p, LocalPath) else p if p.suffix in self._all_music_ext: yield p def __str__(self): return self.to_string() + def __repr__(self): + return str(self) + def to_string(self): try: return str(self.path.absolute()) @@ -213,11 +236,11 @@ class LocalPath: tracks = [] for track in self.multirglob(*[f"*{ext}" for ext in self._all_music_ext]): if track.exists() and track.is_file() and track.parent != self.localtrack_folder: - tracks.append(Query.process_input(LocalPath(str(track.absolute())))) + tracks.append(LocalPath(str(track.absolute()))) return sorted(tracks, key=lambda x: x.to_string_user().lower()) def subfolders_in_tree(self): - files = list(self.multirglob(*[f"*{ext}" for ext in self._all_music_ext])) + files = list(self.multirglob(*[f"*{ext}" for ext in self._all_music_ext], folder=True)) folders = [] for f in files: if f.exists() and f.parent not in folders and f.parent != self.localtrack_folder: @@ -230,17 +253,19 @@ class LocalPath: def tracks_in_folder(self): tracks = [] - for track in self.multiglob(*[f"*{ext}" for ext in self._all_music_ext]): - if track.exists() and track.is_file() and track.parent != self.localtrack_folder: - tracks.append(Query.process_input(LocalPath(str(track.absolute())))) + for track in self.multiglob(*[f"{ext}" for ext in self._all_music_ext]): + with contextlib.suppress(ValueError): + if track.exists() and track.is_file() and track.parent != self.localtrack_folder and track.path.relative_to(self.path): + tracks.append(LocalPath(str(track.absolute()))) return sorted(tracks, key=lambda x: x.to_string_user().lower()) def subfolders(self): - files = list(self.multiglob(*[f"*{ext}" for ext in self._all_music_ext])) + files = list(self.multiglob(f"{os.sep}*", folder=True)) folders = [] for f in files: - if f.exists() and f.parent not in folders and f.parent != self.localtrack_folder: - folders.append(f.parent) + with contextlib.suppress(ValueError): + if f.exists() and f.parent not in folders and f.parent != self.localtrack_folder and f.path.relative_to(self.path): + folders.append(f.parent) return_folders = [] for folder in folders: if folder.exists() and folder.is_dir():