33# Picard, the next-generation MusicBrainz tagger
44#
55# Copyright (C) 2006-2007 Lukáš Lalinský
6- # Copyright (C) 2009, 2018-2023 Philipp Wolfer
6+ # Copyright (C) 2009, 2018-2023, 2025 Philipp Wolfer
77# Copyright (C) 2011-2013 Michael Wiencek
88# Copyright (C) 2012 Chad Wilson
99# Copyright (C) 2013-2014, 2018, 2020-2021, 2023-2024 Laurent Monin
2525# along with this program; if not, write to the Free Software
2626# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
2727
28+ from html import escape
2829
2930from PyQt6 import (
3031 QtCore ,
4142from picard .mbjson import (
4243 artist_credit_from_node ,
4344 label_info_from_node ,
45+ media_formats_from_node ,
4446 release_dates_and_countries_from_node ,
4547)
4648from picard .util import (
5355 Column ,
5456 Columns ,
5557)
58+ from picard .ui .formattedtextdelegate import FormattedTextDelegate
5659from picard .ui .forms .ui_cdlookup import Ui_CDLookupDialog
5760
5861
6467 Column (N_ ("Labels" ), 'labels' ),
6568 Column (N_ ("Catalog #s" ), 'catnos' ),
6669 Column (N_ ("Barcode" ), 'barcode' ),
70+ Column (N_ ("Format" ), 'format' ),
6771 Column (N_ ("Disambiguation" ), 'disambiguation' ),
6872))
6973
7074_DATA_COLUMN = _COLUMNS .pos ('album' )
75+ _FORMAT_COLUMN = _COLUMNS .pos ('format' )
7176
7277
7378class CDLookupDialog (PicardDialog ):
@@ -86,6 +91,8 @@ def __init__(self, releases, disc, parent=None):
8691 release_list .setAlternatingRowColors (True )
8792 labels = [_ (c .title ) for c in _COLUMNS ]
8893 release_list .setHeaderLabels (labels )
94+ delegate = FormattedTextDelegate (release_list )
95+ release_list .setItemDelegateForColumn (_FORMAT_COLUMN , delegate )
8996 self .ui .submit_button .setIcon (QtGui .QIcon (":/images/cdrom.png" ))
9097 if self .releases :
9198 def myjoin (values ):
@@ -108,6 +115,7 @@ def myjoin(values):
108115 'labels' : myjoin (labels ),
109116 'catnos' : myjoin (catalog_numbers ),
110117 'barcode' : barcode ,
118+ 'format' : self ._get_format (release ),
111119 'disambiguation' : release .get ('disambiguation' , '' ),
112120 }
113121 for i , column in enumerate (_COLUMNS ):
@@ -163,3 +171,16 @@ def save_header_state(self):
163171 config = get_config ()
164172 config .persist [self .dialog_header_state ] = state
165173 log .debug ("save_state: %s" , self .dialog_header_state )
174+
175+ def _get_format (self , release ):
176+ format = escape (media_formats_from_node (release .get ('media' , [])))
177+ selected_medium = self ._get_selected_medium (release )
178+ if selected_medium :
179+ selected_format = escape (selected_medium .get ('format' , format ))
180+ format = format .replace (selected_format , f"<b>{ selected_format } </b>" )
181+ return format
182+
183+ def _get_selected_medium (self , release ):
184+ for medium in release .get ('media' , []):
185+ if any (disc .get ('id' ) == self .disc .id for disc in medium .get ('discs' , [])):
186+ return medium
0 commit comments