Merged DataObj class with MetadataItem class

This commit is contained in:
Philipp Wolfer
2024-06-03 07:59:02 +02:00
parent d30c1c4753
commit 321637b6d6
10 changed files with 54 additions and 102 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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'}

View File

@@ -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)

View File

@@ -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)

View File

@@ -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 = []

View File

@@ -44,7 +44,7 @@ from picard.util.tags import (
)
class DataObjectTest(PicardTestCase):
class FileTest(PicardTestCase):
def setUp(self):
super().setUp()

View File

@@ -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()