diff --git a/wobuzz/library/library.py b/wobuzz/library/library.py index 6e4eb1d..cae70dd 100644 --- a/wobuzz/library/library.py +++ b/wobuzz/library/library.py @@ -2,9 +2,10 @@ import os from PyQt6.QtWidgets import QTabWidget, QAbstractItemView + from ..player.playlist import Playlist -from ..ui.library import LibraryWidget -from ..ui.playlist import PlaylistView +from ..ui.library.library import LibraryWidget +from ..ui.playlist_view import PlaylistView class Library: @@ -18,9 +19,13 @@ class Library: self.main_library_widget = LibraryWidget(self) self.library_widgets = [self.main_library_widget] + self.loaded_tracks = {} # dict of {track path: track} + self.playlists = [] self.temporary_playlist = None + self.artist_playlists = [] + def load(self): self.load_playlists() @@ -77,6 +82,8 @@ class Library: if self.app.player.current_playlist is not None: self.app.settings.latest_playlist = self.app.player.current_playlist.path + print(self.loaded_tracks) + def new_playlist(self): playlist = Playlist(self.app, self.app.utils.unique_name("New Playlist")) playlist.loaded = True @@ -121,3 +128,11 @@ class Library: def import_playlist(self, playlist_path: str): self.open_playlist(playlist_path) + def loaded_track(self, track_path: str): + """ + Returns either a loaded track with the given path or None if there is none. + """ + + if track_path in self.loaded_tracks: + return self.loaded_tracks[track_path] + diff --git a/wobuzz/player/track.py b/wobuzz/player/track.py index 66bd26a..09d497d 100644 --- a/wobuzz/player/track.py +++ b/wobuzz/player/track.py @@ -46,6 +46,9 @@ class Track: self.app = app self.path = path + # add self to loaded tracks to make sure that no other track object is created for this track + app.library.loaded_tracks[self.path] = self + if metadata is None: # load metadata from audio file tags = TinyTag.get(path, ignore_errors=True, duration=False) @@ -66,6 +69,18 @@ class Track: if cache: self.cache() + def __new__(cls, app, path: str, cache: bool=False, metadata: TrackMetadata=None): + loaded_track = app.library.loaded_track(path) + + if loaded_track is not None: + if cache: + loaded_track.cache() + + return loaded_track + + else: + return super().__new__(cls) + def set_occurrences(self): # set track item for every occurrence of track in a playlist diff --git a/wobuzz/ui/library/__init__.py b/wobuzz/ui/library/__init__.py new file mode 100644 index 0000000..a93a4bf --- /dev/null +++ b/wobuzz/ui/library/__init__.py @@ -0,0 +1 @@ +#!/usr/bin/python3 diff --git a/wobuzz/ui/library/artist_view.py b/wobuzz/ui/library/artist_view.py new file mode 100644 index 0000000..a444491 --- /dev/null +++ b/wobuzz/ui/library/artist_view.py @@ -0,0 +1,42 @@ +#!/usr/bin/python3 + +from PyQt6.QtWidgets import QTreeWidget, QAbstractItemView + +from ..playlist_view import PlaylistView + + +class ArtistView(PlaylistView): + def __init__(self, playlist, library_widget, parent=None): + QTreeWidget.__init__(self, parent) + + self.playlist = playlist + self.library_widget = library_widget + + self.app = playlist.app + + self.header = self.header() + self.header.setSectionsClickable(True) + self.header.setSortIndicatorShown(True) + + playlist.views[id(self.library_widget)] = self # let the playlist know that this view exists + + self.setSelectionMode(QAbstractItemView.SelectionMode.ExtendedSelection) + + self.setColumnCount(3) + + headers = [ + "#", + "Title", + "Artist", + "Album", + ] + + self.setHeaderLabels(headers) + + self.itemActivated.connect(self.on_track_activation) + self.header.sectionClicked.connect(self.on_header_click) + self.sort_signal.connect(self.sortItems) + + def setDragDropMode(self, behavior): + pass # user should not be able to sort the playlist manually + diff --git a/wobuzz/ui/library.py b/wobuzz/ui/library/library.py similarity index 94% rename from wobuzz/ui/library.py rename to wobuzz/ui/library/library.py index c85bfaf..302ac77 100644 --- a/wobuzz/ui/library.py +++ b/wobuzz/ui/library/library.py @@ -2,7 +2,7 @@ from PyQt6.QtGui import QIcon from PyQt6.QtWidgets import QToolBox, QLabel, QToolButton -from .playlist_tabs import PlaylistTabs +from wobuzz.ui.playlist_tabs import PlaylistTabs class LibraryWidget(QToolBox): diff --git a/wobuzz/ui/library_dock.py b/wobuzz/ui/library/library_dock.py similarity index 88% rename from wobuzz/ui/library_dock.py rename to wobuzz/ui/library/library_dock.py index c66f35d..f1362de 100644 --- a/wobuzz/ui/library_dock.py +++ b/wobuzz/ui/library/library_dock.py @@ -1,7 +1,7 @@ #!/usr/bin/python3 from PyQt6.QtWidgets import QDockWidget -from .library import LibraryWidget +from wobuzz.ui.library import LibraryWidget class LibraryDock(QDockWidget): diff --git a/wobuzz/ui/playlist.py b/wobuzz/ui/playlist_view.py similarity index 100% rename from wobuzz/ui/playlist.py rename to wobuzz/ui/playlist_view.py