mirror of
https://github.com/fergalmoran/picard.git
synced 2025-12-26 11:18:20 +00:00
Merged DataObj class with MetadataItem class
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
|
||||||
@@ -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
|
||||||
|
|||||||
@@ -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'}
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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 = []
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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()
|
||||||
Reference in New Issue
Block a user