Skip to content

Commit

Permalink
Merge pull request metabrainz#2508 from phw/refactor-dataobj-into-item
Browse files Browse the repository at this point in the history
Refactor dataobj into item
  • Loading branch information
phw authored Jun 3, 2024
2 parents 0e93d92 + 2369431 commit 80254dd
Show file tree
Hide file tree
Showing 18 changed files with 139 additions and 181 deletions.
14 changes: 6 additions & 8 deletions picard/album.py
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,6 @@
from picard.collection import add_release_to_user_collections
from picard.config import get_config
from picard.const import VARIOUS_ARTISTS_ID
from picard.dataobj import DataObject
from picard.file import File
from picard.i18n import (
N_,
Expand Down Expand Up @@ -104,7 +103,7 @@ def _copy_artist_nodes(source, target_node):
credit['artist'] = artist_node


class AlbumArtist(DataObject):
class AlbumArtist(MetadataItem):
def __init__(self, album_artist_id):
super().__init__(album_artist_id)

Expand All @@ -122,11 +121,10 @@ class ParseResult(IntEnum):
MISSING_TRACK_RELS = 2


class Album(DataObject, MetadataItem):
class Album(MetadataItem):

def __init__(self, album_id, discid=None):
DataObject.__init__(self, album_id)
MetadataItem.__init__(self)
super().__init__(album_id)
self.tracks = []
self.loaded = False
self.load_task = None
Expand Down Expand Up @@ -512,7 +510,7 @@ def _finalize_loading_album(self):
for func, always in self._after_load_callbacks:
func()
self._after_load_callbacks = []
if self.item.isSelected():
if self.ui_item.isSelected():
self.tagger.window.refresh_metadatabox()
self.tagger.window.cover_art_box.update_metadata()

Expand Down Expand Up @@ -632,8 +630,8 @@ def stop_loading(self):
self.load_task = None

def update(self, update_tracks=True, update_selection=True):
if self.item:
self.item.update(update_tracks, update_selection=update_selection)
if self.ui_item:
self.ui_item.update(update_tracks, update_selection=update_selection)

def add_file(self, track, file, new_album=True):
self._files_count += 1
Expand Down
21 changes: 7 additions & 14 deletions picard/cluster.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,6 @@
from operator import attrgetter
import re

from PyQt6 import QtCore

from picard.config import get_config
from picard.file import File
from picard.i18n import (
Expand Down Expand Up @@ -77,19 +75,15 @@
}


class FileList(QtCore.QObject, FileListItem):
class FileList(FileListItem):

def __init__(self, files=None):
QtCore.QObject.__init__(self)
FileListItem.__init__(self, files)
super().__init__(files=files)
if self.files and self.can_show_coverart:
for file in self.files:
file.metadata_images_changed.connect(self.update_metadata_images)
self.update_metadata_images_from_children()

def iterfiles(self, save=False):
yield from self.files

def update(self, signal=True):
pass

Expand All @@ -102,7 +96,6 @@ class Cluster(FileList):

def __init__(self, name, artist="", special=False, related_album=None, hide_if_empty=False):
super().__init__()
self.item = None
self.metadata['album'] = name
self.metadata['albumartist'] = artist
self.metadata['totaltracks'] = 0
Expand Down Expand Up @@ -149,7 +142,7 @@ def add_files(self, files, new_album=True):
self.update(signal=False)
if self.can_show_coverart:
self.add_metadata_images_from_children(added_files)
self.item.add_files(added_files)
self.ui_item.add_files(added_files)
if new_album:
self._update_related_album(added_files=added_files)

Expand All @@ -161,7 +154,7 @@ def remove_file(self, file, new_album=True):
self.metadata.length -= file.metadata.length
self.files.remove(file)
self.update(signal=False)
self.item.remove_file(file)
self.ui_item.remove_file(file)
if self.can_show_coverart:
file.metadata_images_changed.disconnect(self.update_metadata_images)
self.remove_metadata_images_from_children([file])
Expand All @@ -173,8 +166,8 @@ def remove_file(self, file, new_album=True):

def update(self, signal=True):
self.metadata['~totalalbumtracks'] = self.metadata['totaltracks'] = len(self.files)
if signal and self.item:
self.item.update()
if signal and self.ui_item:
self.ui_item.update()

def get_num_files(self):
return len(self.files)
Expand Down Expand Up @@ -316,7 +309,7 @@ def cluster(files):
# If the file is attached to a track we should use the original
# metadata for clustering. This is often used by users when moving
# mismatched files back from the right pane to the left.
if isinstance(file.parent, Track):
if isinstance(file.parent_item, Track):
metadata = file.orig_metadata
else:
metadata = file.metadata
Expand Down
63 changes: 0 additions & 63 deletions picard/dataobj.py

This file was deleted.

51 changes: 24 additions & 27 deletions picard/file.py
Original file line number Diff line number Diff line change
Expand Up @@ -59,8 +59,6 @@

from mutagen._util import MutagenError

from PyQt6 import QtCore

from picard import (
PICARD_APP_NAME,
log,
Expand Down Expand Up @@ -135,7 +133,7 @@ class FileErrorType(Enum):
PARSER = auto()


class File(QtCore.QObject, MetadataItem):
class File(MetadataItem):

NAME = None

Expand Down Expand Up @@ -170,10 +168,9 @@ def __init__(self, filename):
self.error_type = FileErrorType.UNKNOWN

self.similarity = 1.0
self.parent = None
self.parent_item = None

self.lookup_task = None
self.item = None

self.acoustid_fingerprint = None
self.acoustid_length = 0
Expand Down Expand Up @@ -629,37 +626,37 @@ def _apply_additional_files_moves(self, moves):
log.error("Failed to move %r to %r: %s", old_file_path,
new_file_path, why)

def remove(self, from_parent=True):
if from_parent and self.parent:
log.debug("Removing %r from %r", self, self.parent)
self.parent.remove_file(self)
def remove(self, from_parent_item=True):
if from_parent_item and self.parent_item:
log.debug("Removing %r from %r", self, self.parent_item)
self.parent_item.remove_file(self)
self.tagger.acoustidmanager.remove(self)
self.state = File.REMOVED

def move(self, parent):
def move(self, to_parent_item):
# To be able to move a file the target must implement add_file(file)
if hasattr(parent, 'add_file') and parent != self.parent:
log.debug("Moving %r from %r to %r", self, self.parent, parent)
if hasattr(to_parent_item, 'add_file') and to_parent_item != self.parent_item:
log.debug("Moving %r from %r to %r", self, self.parent_item, to_parent_item)
self.clear_lookup_task()
self.tagger._acoustid.stop_analyze(self)
new_album = True
if self.parent:
new_album = self.parent.album != parent.album
if self.parent_item:
new_album = self.parent_item.album != to_parent_item.album
self.clear_pending()
self.parent.remove_file(self, new_album=new_album)
self.parent = parent
self.parent.add_file(self, new_album=new_album)
self.parent_item.remove_file(self, new_album=new_album)
self.parent_item = to_parent_item
self.parent_item.add_file(self, new_album=new_album)
self.acoustid_update()
return True
else:
return False

def _move(self, parent):
if parent != self.parent:
log.debug("Moving %r from %r to %r", self, self.parent, parent)
if self.parent:
self.parent.remove_file(self)
self.parent = parent
def _move(self, to_parent_item):
if to_parent_item != self.parent_item:
log.debug("Moving %r from %r to %r", self, self.parent_item, to_parent_item)
if self.parent_item:
self.parent_item.remove_file(self)
self.parent_item = to_parent_item
self.acoustid_update()

def set_acoustid_fingerprint(self, fingerprint, length=None):
Expand All @@ -678,8 +675,8 @@ def set_acoustid_fingerprint(self, fingerprint, length=None):

def acoustid_update(self):
recording_id = None
if self.parent and self.parent.can_link_fingerprint:
recording_id = self.parent.orig_metadata['musicbrainz_recordingid']
if self.parent_item and self.parent_item.can_link_fingerprint:
recording_id = self.parent_item.orig_metadata['musicbrainz_recordingid']
if not recording_id:
recording_id = self.metadata['musicbrainz_recordingid']
self.tagger.acoustidmanager.update(self, recording_id)
Expand Down Expand Up @@ -949,8 +946,8 @@ def clear_pending(self, signal=True):
self.update_item(update_selection=False)

def update_item(self, update_selection=True):
if self.item:
self.item.update(update_selection=update_selection)
if self.ui_item:
self.ui_item.update(update_selection=update_selection)

def iterfiles(self, save=False):
yield self
Expand Down
37 changes: 33 additions & 4 deletions picard/item.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,12 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.

from collections import Counter

from PyQt6 import QtCore

from picard import log
from picard.config import get_config
from picard.i18n import ngettext
from picard.metadata import Metadata
from picard.util import IgnoreUpdatesContext
Expand All @@ -36,6 +39,9 @@

class Item:

def __init__(self):
self.ui_item = None

@property
def can_save(self):
"""Return if this object can be saved."""
Expand Down Expand Up @@ -176,16 +182,18 @@ def process_images(self, src_obj_metadata):
self.first_obj = False


class MetadataItem(Item):
class MetadataItem(QtCore.QObject, Item):
metadata_images_changed = QtCore.pyqtSignal()

def __init__(self):
def __init__(self, obj_id=None):
super().__init__()
self.id = obj_id
self.metadata = Metadata()
self.orig_metadata = Metadata()
self.update_children_metadata_attrs = {}
self.iter_children_items_metadata_ignore_attrs = {}
self.suspend_metadata_images_update = IgnoreUpdatesContext()
self._genres = Counter()

@property
def tagger(self):
Expand Down Expand Up @@ -287,11 +295,32 @@ def update_metadata_images_from_children(self):

return changed

@property
def genres(self):
return self._genres

def add_genre(self, name, count):
if name:
self._genres[name] += count

@staticmethod
def set_genre_inc_params(inc, config=None):
require_authentication = False
config = config or get_config()
if config.setting['use_genres']:
use_folksonomy = config.setting['folksonomy_tags']
if config.setting['only_my_genres']:
require_authentication = True
inc |= {'user-tags'} if use_folksonomy else {'user-genres'}
else:
inc |= {'tags'} if use_folksonomy else {'genres'}
return require_authentication


class FileListItem(MetadataItem):

def __init__(self, files=None):
super().__init__()
def __init__(self, obj_id=None, files=None):
super().__init__(obj_id)
self.files = files or []
self.update_children_metadata_attrs = {'metadata', 'orig_metadata'}

Expand Down
Loading

0 comments on commit 80254dd

Please sign in to comment.