From 321637b6d652ef2ecfcef3dae1d7af15e153fc3f Mon Sep 17 00:00:00 2001 From: Philipp Wolfer Date: Mon, 3 Jun 2024 07:59:02 +0200 Subject: [PATCH] Merged DataObj class with MetadataItem class --- picard/album.py | 8 ++-- picard/cluster.py | 8 +--- picard/dataobj.py | 63 -------------------------- picard/file.py | 5 +- picard/item.py | 36 +++++++++++++-- picard/releasegroup.py | 9 +--- picard/tagger.py | 6 +-- picard/track.py | 13 +++--- test/test_file.py | 2 +- test/{test_dataobj.py => test_item.py} | 6 +-- 10 files changed, 54 insertions(+), 102 deletions(-) delete mode 100644 picard/dataobj.py rename test/{test_dataobj.py => test_item.py} (96%) diff --git a/picard/album.py b/picard/album.py index e1966f00b..f828a36df 100644 --- a/picard/album.py +++ b/picard/album.py @@ -54,7 +54,6 @@ from picard.cluster import Cluster 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_, @@ -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) @@ -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 diff --git a/picard/cluster.py b/picard/cluster.py index f6e1b0323..cce736cc4 100644 --- a/picard/cluster.py +++ b/picard/cluster.py @@ -42,8 +42,6 @@ from collections import ( 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 ( @@ -77,11 +75,10 @@ CLUSTER_COMPARISON_WEIGHTS = { } -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) @@ -99,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 diff --git a/picard/dataobj.py b/picard/dataobj.py deleted file mode 100644 index 184cd0a00..000000000 --- a/picard/dataobj.py +++ /dev/null @@ -1,63 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Picard, the next-generation MusicBrainz tagger -# -# Copyright (C) 2004 Robert Kaye -# Copyright (C) 2006-2008 Lukáš Lalinský -# Copyright (C) 2011-2012 Michael Wiencek -# Copyright (C) 2013, 2020-2021, 2023 Laurent Monin -# Copyright (C) 2017 Sambhav Kothari -# Copyright (C) 2017 Sophist-UK -# Copyright (C) 2018 Vishal Choudhary -# Copyright (C) 2018, 2021 Philipp Wolfer -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# 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.config import get_config - - -class DataObject(QtCore.QObject): - - def __init__(self, obj_id): - super().__init__() - self.id = obj_id - self.item = None - self._genres = Counter() - - @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 diff --git a/picard/file.py b/picard/file.py index 4f75cac97..3c0b95bfd 100644 --- a/picard/file.py +++ b/picard/file.py @@ -59,8 +59,6 @@ import time from mutagen._util import MutagenError -from PyQt6 import QtCore - from picard import ( PICARD_APP_NAME, log, @@ -135,7 +133,7 @@ class FileErrorType(Enum): PARSER = auto() -class File(QtCore.QObject, MetadataItem): +class File(MetadataItem): NAME = None @@ -173,7 +171,6 @@ class File(QtCore.QObject, MetadataItem): self.parent = None self.lookup_task = None - self.item = None self.acoustid_fingerprint = None self.acoustid_length = 0 diff --git a/picard/item.py b/picard/item.py index 50b881ab8..8c91ec006 100644 --- a/picard/item.py +++ b/picard/item.py @@ -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 @@ -176,16 +179,20 @@ class ImageListState: 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 + # FIXME: Rename to ui_item + self.item = None 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): @@ -287,11 +294,32 @@ class MetadataItem(Item): 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'} diff --git a/picard/releasegroup.py b/picard/releasegroup.py index a688e2066..cf4bef23f 100644 --- a/picard/releasegroup.py +++ b/picard/releasegroup.py @@ -30,21 +30,18 @@ from functools import partial from itertools import combinations import traceback -from PyQt6 import QtCore - from picard import log -from picard.dataobj import DataObject from picard.i18n import ( N_, gettext as _, pgettext_attributes, ) +from picard.item import MetadataItem from picard.mbjson import ( countries_from_node, label_info_from_node, media_formats_from_node, ) -from picard.metadata import Metadata from picard.util import ( countries_shortlist, uniqify, @@ -106,12 +103,10 @@ def prepare_releases_for_versions(releases): } -class ReleaseGroup(DataObject): +class ReleaseGroup(MetadataItem): def __init__(self, rg_id): super().__init__(rg_id) - self.tagger = QtCore.QCoreApplication.instance() - self.metadata = Metadata() self.loaded = False self.versions = [] self.version_headings = " / ".join(_(VERSIONS_HEADINGS[k]) for k in VERSIONS_NAME_KEYS) diff --git a/picard/tagger.py b/picard/tagger.py index 75244e640..81913a804 100644 --- a/picard/tagger.py +++ b/picard/tagger.py @@ -100,7 +100,6 @@ from picard.const.sys import ( IS_MACOS, IS_WIN, ) -from picard.dataobj import DataObject from picard.debug_opts import DebugOpt from picard.disc import ( Disc, @@ -115,6 +114,7 @@ from picard.i18n import ( gettext as _, setup_gettext, ) +from picard.item import MetadataItem from picard.options import init_options from picard.pluginmanager import ( PluginManager, @@ -1020,8 +1020,8 @@ class Tagger(QtWidgets.QApplication): """Lookup the object's metadata on the MusicBrainz website.""" lookup = self.get_file_lookup() metadata = item.metadata - # Only lookup via MB IDs if matched to a DataObject; otherwise ignore and use metadata details - if isinstance(item, DataObject): + # Only lookup via MB IDs if matched to a MetadataItem; otherwise ignore and use metadata details + if isinstance(item, MetadataItem): itemid = item.id if isinstance(item, Track): lookup.recording_lookup(itemid) diff --git a/picard/track.py b/picard/track.py index a25be46f1..606ae9669 100644 --- a/picard/track.py +++ b/picard/track.py @@ -55,13 +55,15 @@ from picard.const import ( SILENCE_TRACK_TITLE, VARIOUS_ARTISTS_ID, ) -from picard.dataobj import DataObject from picard.file import ( run_file_post_addition_to_track_processors, run_file_post_removal_from_track_processors, ) from picard.i18n import gettext as _ -from picard.item import FileListItem +from picard.item import ( + FileListItem, + MetadataItem, +) from picard.mbjson import recording_to_metadata from picard.metadata import ( Metadata, @@ -119,16 +121,15 @@ class TagGenreFilter: yield fmt % {'lineno': lineno + 1, 'error': error} -class TrackArtist(DataObject): +class TrackArtist(MetadataItem): def __init__(self, ta_id): super().__init__(ta_id) -class Track(DataObject, FileListItem): +class Track(FileListItem): def __init__(self, track_id, album=None): - DataObject.__init__(self, track_id) - FileListItem.__init__(self) + super().__init__(track_id) self.album = album self.scripted_metadata = Metadata() self._track_artists = [] diff --git a/test/test_file.py b/test/test_file.py index 2b0f41abe..8722216cb 100644 --- a/test/test_file.py +++ b/test/test_file.py @@ -44,7 +44,7 @@ from picard.util.tags import ( ) -class DataObjectTest(PicardTestCase): +class FileTest(PicardTestCase): def setUp(self): super().setUp() diff --git a/test/test_dataobj.py b/test/test_item.py similarity index 96% rename from test/test_dataobj.py rename to test/test_item.py index 9a8ad236a..95858a30b 100644 --- a/test/test_dataobj.py +++ b/test/test_item.py @@ -25,14 +25,14 @@ from unittest.mock import Mock from test.picardtestcase import PicardTestCase from picard import config -from picard.dataobj import DataObject +from picard.item import MetadataItem -class DataObjectTest(PicardTestCase): +class MetadataItemTest(PicardTestCase): def setUp(self): super().setUp() - self.obj = DataObject('id') + self.obj = MetadataItem('id') def test_set_genre_inc_params_no_genres(self): inc = set()