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.collection import add_release_to_user_collections
from picard.config import get_config from picard.config import get_config
from picard.const import VARIOUS_ARTISTS_ID from picard.const import VARIOUS_ARTISTS_ID
from picard.dataobj import DataObject
from picard.file import File from picard.file import File
from picard.i18n import ( from picard.i18n import (
N_, N_,
@@ -104,7 +103,7 @@ def _copy_artist_nodes(source, target_node):
credit['artist'] = artist_node credit['artist'] = artist_node
class AlbumArtist(DataObject): class AlbumArtist(MetadataItem):
def __init__(self, album_artist_id): def __init__(self, album_artist_id):
super().__init__(album_artist_id) super().__init__(album_artist_id)
@@ -122,11 +121,10 @@ class ParseResult(IntEnum):
MISSING_TRACK_RELS = 2 MISSING_TRACK_RELS = 2
class Album(DataObject, MetadataItem): class Album(MetadataItem):
def __init__(self, album_id, discid=None): def __init__(self, album_id, discid=None):
DataObject.__init__(self, album_id) super().__init__(album_id)
MetadataItem.__init__(self)
self.tracks = [] self.tracks = []
self.loaded = False self.loaded = False
self.load_task = None self.load_task = None

View File

@@ -42,8 +42,6 @@ from collections import (
from operator import attrgetter from operator import attrgetter
import re import re
from PyQt6 import QtCore
from picard.config import get_config from picard.config import get_config
from picard.file import File from picard.file import File
from picard.i18n import ( from picard.i18n import (
@@ -77,11 +75,10 @@ CLUSTER_COMPARISON_WEIGHTS = {
} }
class FileList(QtCore.QObject, FileListItem): class FileList(FileListItem):
def __init__(self, files=None): def __init__(self, files=None):
QtCore.QObject.__init__(self) super().__init__(files=files)
FileListItem.__init__(self, files)
if self.files and self.can_show_coverart: if self.files and self.can_show_coverart:
for file in self.files: for file in self.files:
file.metadata_images_changed.connect(self.update_metadata_images) 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): def __init__(self, name, artist="", special=False, related_album=None, hide_if_empty=False):
super().__init__() super().__init__()
self.item = None
self.metadata['album'] = name self.metadata['album'] = name
self.metadata['albumartist'] = artist self.metadata['albumartist'] = artist
self.metadata['totaltracks'] = 0 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 mutagen._util import MutagenError
from PyQt6 import QtCore
from picard import ( from picard import (
PICARD_APP_NAME, PICARD_APP_NAME,
log, log,
@@ -135,7 +133,7 @@ class FileErrorType(Enum):
PARSER = auto() PARSER = auto()
class File(QtCore.QObject, MetadataItem): class File(MetadataItem):
NAME = None NAME = None
@@ -173,7 +171,6 @@ class File(QtCore.QObject, MetadataItem):
self.parent = None self.parent = None
self.lookup_task = None self.lookup_task = None
self.item = None
self.acoustid_fingerprint = None self.acoustid_fingerprint = None
self.acoustid_length = 0 self.acoustid_length = 0

View File

@@ -25,9 +25,12 @@
# along with this program; if not, write to the Free Software # along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
from collections import Counter
from PyQt6 import QtCore from PyQt6 import QtCore
from picard import log from picard import log
from picard.config import get_config
from picard.i18n import ngettext from picard.i18n import ngettext
from picard.metadata import Metadata from picard.metadata import Metadata
from picard.util import IgnoreUpdatesContext from picard.util import IgnoreUpdatesContext
@@ -176,16 +179,20 @@ class ImageListState:
self.first_obj = False self.first_obj = False
class MetadataItem(Item): class MetadataItem(QtCore.QObject, Item):
metadata_images_changed = QtCore.pyqtSignal() metadata_images_changed = QtCore.pyqtSignal()
def __init__(self): def __init__(self, obj_id=None):
super().__init__() super().__init__()
self.id = obj_id
# FIXME: Rename to ui_item
self.item = None
self.metadata = Metadata() self.metadata = Metadata()
self.orig_metadata = Metadata() self.orig_metadata = Metadata()
self.update_children_metadata_attrs = {} self.update_children_metadata_attrs = {}
self.iter_children_items_metadata_ignore_attrs = {} self.iter_children_items_metadata_ignore_attrs = {}
self.suspend_metadata_images_update = IgnoreUpdatesContext() self.suspend_metadata_images_update = IgnoreUpdatesContext()
self._genres = Counter()
@property @property
def tagger(self): def tagger(self):
@@ -287,11 +294,32 @@ class MetadataItem(Item):
return changed 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): class FileListItem(MetadataItem):
def __init__(self, files=None): def __init__(self, obj_id=None, files=None):
super().__init__() super().__init__(obj_id)
self.files = files or [] self.files = files or []
self.update_children_metadata_attrs = {'metadata', 'orig_metadata'} self.update_children_metadata_attrs = {'metadata', 'orig_metadata'}

View File

@@ -30,21 +30,18 @@ from functools import partial
from itertools import combinations from itertools import combinations
import traceback import traceback
from PyQt6 import QtCore
from picard import log from picard import log
from picard.dataobj import DataObject
from picard.i18n import ( from picard.i18n import (
N_, N_,
gettext as _, gettext as _,
pgettext_attributes, pgettext_attributes,
) )
from picard.item import MetadataItem
from picard.mbjson import ( from picard.mbjson import (
countries_from_node, countries_from_node,
label_info_from_node, label_info_from_node,
media_formats_from_node, media_formats_from_node,
) )
from picard.metadata import Metadata
from picard.util import ( from picard.util import (
countries_shortlist, countries_shortlist,
uniqify, uniqify,
@@ -106,12 +103,10 @@ def prepare_releases_for_versions(releases):
} }
class ReleaseGroup(DataObject): class ReleaseGroup(MetadataItem):
def __init__(self, rg_id): def __init__(self, rg_id):
super().__init__(rg_id) super().__init__(rg_id)
self.tagger = QtCore.QCoreApplication.instance()
self.metadata = Metadata()
self.loaded = False self.loaded = False
self.versions = [] self.versions = []
self.version_headings = " / ".join(_(VERSIONS_HEADINGS[k]) for k in VERSIONS_NAME_KEYS) 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_MACOS,
IS_WIN, IS_WIN,
) )
from picard.dataobj import DataObject
from picard.debug_opts import DebugOpt from picard.debug_opts import DebugOpt
from picard.disc import ( from picard.disc import (
Disc, Disc,
@@ -115,6 +114,7 @@ from picard.i18n import (
gettext as _, gettext as _,
setup_gettext, setup_gettext,
) )
from picard.item import MetadataItem
from picard.options import init_options from picard.options import init_options
from picard.pluginmanager import ( from picard.pluginmanager import (
PluginManager, PluginManager,
@@ -1020,8 +1020,8 @@ class Tagger(QtWidgets.QApplication):
"""Lookup the object's metadata on the MusicBrainz website.""" """Lookup the object's metadata on the MusicBrainz website."""
lookup = self.get_file_lookup() lookup = self.get_file_lookup()
metadata = item.metadata metadata = item.metadata
# Only lookup via MB IDs if matched to a DataObject; otherwise ignore and use metadata details # Only lookup via MB IDs if matched to a MetadataItem; otherwise ignore and use metadata details
if isinstance(item, DataObject): if isinstance(item, MetadataItem):
itemid = item.id itemid = item.id
if isinstance(item, Track): if isinstance(item, Track):
lookup.recording_lookup(itemid) lookup.recording_lookup(itemid)

View File

@@ -55,13 +55,15 @@ from picard.const import (
SILENCE_TRACK_TITLE, SILENCE_TRACK_TITLE,
VARIOUS_ARTISTS_ID, VARIOUS_ARTISTS_ID,
) )
from picard.dataobj import DataObject
from picard.file import ( from picard.file import (
run_file_post_addition_to_track_processors, run_file_post_addition_to_track_processors,
run_file_post_removal_from_track_processors, run_file_post_removal_from_track_processors,
) )
from picard.i18n import gettext as _ 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.mbjson import recording_to_metadata
from picard.metadata import ( from picard.metadata import (
Metadata, Metadata,
@@ -119,16 +121,15 @@ class TagGenreFilter:
yield fmt % {'lineno': lineno + 1, 'error': error} yield fmt % {'lineno': lineno + 1, 'error': error}
class TrackArtist(DataObject): class TrackArtist(MetadataItem):
def __init__(self, ta_id): def __init__(self, ta_id):
super().__init__(ta_id) super().__init__(ta_id)
class Track(DataObject, FileListItem): class Track(FileListItem):
def __init__(self, track_id, album=None): def __init__(self, track_id, album=None):
DataObject.__init__(self, track_id) super().__init__(track_id)
FileListItem.__init__(self)
self.album = album self.album = album
self.scripted_metadata = Metadata() self.scripted_metadata = Metadata()
self._track_artists = [] self._track_artists = []

View File

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

View File

@@ -25,14 +25,14 @@ from unittest.mock import Mock
from test.picardtestcase import PicardTestCase from test.picardtestcase import PicardTestCase
from picard import config from picard import config
from picard.dataobj import DataObject from picard.item import MetadataItem
class DataObjectTest(PicardTestCase): class MetadataItemTest(PicardTestCase):
def setUp(self): def setUp(self):
super().setUp() super().setUp()
self.obj = DataObject('id') self.obj = MetadataItem('id')
def test_set_genre_inc_params_no_genres(self): def test_set_genre_inc_params_no_genres(self):
inc = set() inc = set()