mirror of
https://github.com/fergalmoran/picard.git
synced 2026-01-06 16:44:06 +00:00
Use sets instead of lists in conditionals
This commit is contained in:
@@ -123,7 +123,7 @@ def code_to_language(language_code):
|
||||
|
||||
def escape_string(text):
|
||||
for escape, char in ESCAPE_CHARS.items():
|
||||
if char in ("'", "`"): # No need to escape quotes other than ""
|
||||
if char in {"'", "`"}: # No need to escape quotes other than ""
|
||||
continue
|
||||
text = text.replace(char, escape)
|
||||
return text
|
||||
|
||||
@@ -233,7 +233,7 @@ class Cluster(FileList):
|
||||
def column(self, column):
|
||||
if column == 'title':
|
||||
return '%s (%d)' % (self.metadata['album'], len(self.files))
|
||||
elif self.special and (column in ['~length', 'album', 'covercount']):
|
||||
elif self.special and column in {'~length', 'album', 'covercount'}:
|
||||
return ''
|
||||
elif column == '~length':
|
||||
return format_time(self.metadata.length)
|
||||
|
||||
@@ -168,7 +168,7 @@ class APEv2File(File):
|
||||
if len(disc) > 1:
|
||||
metadata["totaldiscs"] = disc[1]
|
||||
value = disc[0]
|
||||
elif name in ('performer', 'comment'):
|
||||
elif name in {'performer', 'comment'}:
|
||||
if value.endswith(')'):
|
||||
start = value.rfind(' (')
|
||||
if start > 0:
|
||||
@@ -213,7 +213,7 @@ class APEv2File(File):
|
||||
elif name == 'discnumber':
|
||||
if 'totaldiscs' in metadata:
|
||||
value = '%s/%s' % (value, metadata['totaldiscs'])
|
||||
elif name in ('totaltracks', 'totaldiscs'):
|
||||
elif name in {'totaltracks', 'totaldiscs'}:
|
||||
continue
|
||||
# "performer:Piano=Joe Barr" => "Performer=Joe Barr (Piano)"
|
||||
elif name.startswith('performer:') or name.startswith('comment:'):
|
||||
@@ -239,7 +239,7 @@ class APEv2File(File):
|
||||
"""Remove the tags from the file that were deleted in the UI"""
|
||||
for tag in metadata.deleted_tags:
|
||||
real_name = self._get_tag_name(tag)
|
||||
if real_name in ('Lyrics', 'Comment', 'Performer'):
|
||||
if real_name in {'Lyrics', 'Comment', 'Performer'}:
|
||||
parts = tag.split(':', 1)
|
||||
if len(parts) == 2:
|
||||
tag_type_regex = re.compile(r"\(%s\)$" % re.escape(parts[1]))
|
||||
@@ -250,7 +250,7 @@ class APEv2File(File):
|
||||
if re.search(tag_type_regex, item):
|
||||
existing_tags.remove(item)
|
||||
tags[real_name] = existing_tags
|
||||
elif tag in ('totaltracks', 'totaldiscs'):
|
||||
elif tag in {'totaltracks', 'totaldiscs'}:
|
||||
tagstr = real_name.lower() + 'number'
|
||||
if tagstr in metadata:
|
||||
tags[real_name] = metadata[tagstr]
|
||||
@@ -265,9 +265,9 @@ class APEv2File(File):
|
||||
return 'Lyrics'
|
||||
elif name == 'date':
|
||||
return 'Year'
|
||||
elif name in ('tracknumber', 'totaltracks'):
|
||||
elif name in {'tracknumber', 'totaltracks'}:
|
||||
return 'Track'
|
||||
elif name in ('discnumber', 'totaldiscs'):
|
||||
elif name in {'discnumber', 'totaldiscs'}:
|
||||
return 'Disc'
|
||||
elif name.startswith('performer:') or name.startswith('comment:'):
|
||||
return name.split(':', 1)[0].title()
|
||||
|
||||
@@ -310,7 +310,7 @@ class ASFFile(File):
|
||||
def supports_tag(cls, name):
|
||||
return (name in cls.__TRANS
|
||||
or name in cls.__TRANS_CI
|
||||
or name in ('~rating', 'totaldiscs')
|
||||
or name in {'~rating', 'totaldiscs'}
|
||||
or name.startswith('lyrics:'))
|
||||
|
||||
def _get_tag_name(self, name):
|
||||
|
||||
@@ -259,7 +259,7 @@ class ID3File(File):
|
||||
frameid = frame.FrameID
|
||||
if frameid in self.__translate:
|
||||
name = self.__translate[frameid]
|
||||
if frameid.startswith('T') or frameid in ["GRP1", "MVNM"]:
|
||||
if frameid.startswith('T') or frameid in {"GRP1", "MVNM"}:
|
||||
for text in frame.text:
|
||||
if text:
|
||||
metadata.add(name, text)
|
||||
|
||||
@@ -216,8 +216,7 @@ class MP4File(File):
|
||||
log.debug('disk is invalid, ignoring')
|
||||
elif name == "covr":
|
||||
for value in values:
|
||||
if value.imageformat not in (value.FORMAT_JPEG,
|
||||
value.FORMAT_PNG):
|
||||
if value.imageformat not in {value.FORMAT_JPEG, value.FORMAT_PNG}:
|
||||
continue
|
||||
try:
|
||||
coverartimage = TagCoverArtImage(
|
||||
@@ -337,7 +336,7 @@ class MP4File(File):
|
||||
for tag in metadata.deleted_tags:
|
||||
real_name = self._get_tag_name(tag)
|
||||
if real_name and real_name in tags:
|
||||
if tag not in ("totaltracks", "totaldiscs"):
|
||||
if tag not in {"totaltracks", "totaldiscs"}:
|
||||
del tags[real_name]
|
||||
|
||||
@classmethod
|
||||
@@ -364,9 +363,9 @@ class MP4File(File):
|
||||
return self.__r_freeform_tags_ci[name]
|
||||
elif name == "musicip_fingerprint":
|
||||
return "----:com.apple.iTunes:fingerprint"
|
||||
elif name in ("tracknumber", "totaltracks"):
|
||||
elif name in {"tracknumber", "totaltracks"}:
|
||||
return "trkn"
|
||||
elif name in ("discnumber", "totaldiscs"):
|
||||
elif name in {"discnumber", "totaldiscs"}:
|
||||
return "disk"
|
||||
elif self.supports_tag(name) and name not in self.__other_supported_tags:
|
||||
name = self.__casemap.get(name, name)
|
||||
|
||||
@@ -73,7 +73,7 @@ def update_to_v23(tags):
|
||||
# leave TSOP, TSOA and TSOT even though they are officially defined
|
||||
# only in ID3v2.4, because most applications use them also in ID3v2.3
|
||||
frames = []
|
||||
for key in ["TSOP", "TSOA", "TSOT", "TSST"]:
|
||||
for key in {"TSOP", "TSOA", "TSOT", "TSST"}:
|
||||
frames.extend(tags.getall(key))
|
||||
ID3.update_to_v23(tags)
|
||||
for frame in frames:
|
||||
|
||||
@@ -323,7 +323,7 @@ class VCommentFile(File):
|
||||
for tag in metadata.deleted_tags:
|
||||
real_name = self._get_tag_name(tag)
|
||||
if is_valid_key(real_name) and real_name in tags:
|
||||
if real_name in ('performer', 'comment'):
|
||||
if real_name in {'performer', 'comment'}:
|
||||
parts = tag.split(':', 1)
|
||||
if len(parts) == 2:
|
||||
tag_type_regex = re.compile(r"\(%s\)$" % re.escape(parts[1]))
|
||||
@@ -335,7 +335,7 @@ class VCommentFile(File):
|
||||
existing_tags.remove(item)
|
||||
tags[real_name] = existing_tags
|
||||
else:
|
||||
if tag in ('totaldiscs', 'totaltracks') and tag in tags:
|
||||
if tag in {'totaldiscs', 'totaltracks'} and tag in tags:
|
||||
# both tag and real_name are to be deleted in this case
|
||||
del tags[tag]
|
||||
del tags[real_name]
|
||||
|
||||
@@ -155,7 +155,7 @@ def _relations_to_metadata(relations, m):
|
||||
attribs = []
|
||||
if 'attributes' in relation:
|
||||
attribs = [a for a in relation['attributes']]
|
||||
if reltype in ('vocal', 'instrument', 'performer'):
|
||||
if reltype in {'vocal', 'instrument', 'performer'}:
|
||||
if use_instrument_credits:
|
||||
attr_credits = relation.get('attribute-credits', {})
|
||||
else:
|
||||
@@ -424,9 +424,9 @@ def recording_to_metadata(node, m, track=None):
|
||||
add_genres_from_node(artist, artist_obj)
|
||||
elif key == 'relations':
|
||||
_relations_to_metadata(value, m)
|
||||
elif key in ('genres', 'tags') and track:
|
||||
elif track and key in {'genres', 'tags'}:
|
||||
add_genres(value, track)
|
||||
elif key in ('user-genres', 'user-tags') and track:
|
||||
elif track and key in {'user-genres', 'user-tags'}:
|
||||
add_user_genres(value, track)
|
||||
elif key == 'isrcs':
|
||||
add_isrcs_to_metadata(value, m)
|
||||
|
||||
@@ -214,7 +214,7 @@ class Metadata(MutableMapping):
|
||||
a = self[name]
|
||||
b = other[name]
|
||||
if a and b:
|
||||
if name in ('tracknumber', 'totaltracks', 'discnumber', 'totaldiscs'):
|
||||
if name in {'tracknumber', 'totaltracks', 'discnumber', 'totaldiscs'}:
|
||||
try:
|
||||
ia = int(a)
|
||||
ib = int(b)
|
||||
@@ -568,7 +568,7 @@ class MultiMetadataProxy:
|
||||
return attribute
|
||||
|
||||
def __setattr__(self, name, value):
|
||||
if name in ('metadata', 'combined_metadata'):
|
||||
if name in {'metadata', 'combined_metadata'}:
|
||||
super().__setattr__(name, value)
|
||||
else:
|
||||
self.metadata.__setattr__(name, value)
|
||||
|
||||
@@ -404,7 +404,7 @@ For example `$unset(performer:*)` would unset all performer tags."""
|
||||
def func_unset(parser, name):
|
||||
name = normalize_tagname(name)
|
||||
# Allow wild-card unset for certain keys
|
||||
if name in ('performer:*', 'comment:*', 'lyrics:*'):
|
||||
if name in {'performer:*', 'comment:*', 'lyrics:*'}:
|
||||
name = name[:-1]
|
||||
for key in list(parser.context.keys()):
|
||||
if key.startswith(name):
|
||||
|
||||
@@ -92,7 +92,7 @@ class TagGenreFilter:
|
||||
self.match_regexes = defaultdict(list)
|
||||
for lineno, line in enumerate(filters.splitlines()):
|
||||
line = line.strip()
|
||||
if line and line[0] in ('+', '-'):
|
||||
if line and line[0] in {'+', '-'}:
|
||||
_list = line[0]
|
||||
remain = line[1:].strip()
|
||||
if not remain:
|
||||
|
||||
@@ -114,7 +114,7 @@ class CoverArtThumbnail(ActiveLabel):
|
||||
|
||||
if not accepted:
|
||||
for url in mime_data.urls():
|
||||
if url.scheme() in ('https', 'http', 'file'):
|
||||
if url.scheme() in {'https', 'http', 'file'}:
|
||||
accepted = True
|
||||
log.debug("Dropped %s url (with %d bytes of data)",
|
||||
url.toString(), len(dropped_data or ''))
|
||||
@@ -398,7 +398,7 @@ class CoverArtBox(QtWidgets.QGroupBox):
|
||||
if fallback_data:
|
||||
self.load_remote_image(url, fallback_data)
|
||||
|
||||
if url.scheme() in ('http', 'https'):
|
||||
if url.scheme() in {'http', 'https'}:
|
||||
path = url.path()
|
||||
if url.hasQuery():
|
||||
query = QtCore.QUrlQuery(url.query())
|
||||
@@ -434,7 +434,7 @@ class CoverArtBox(QtWidgets.QGroupBox):
|
||||
url_query = QtCore.QUrlQuery(url.query())
|
||||
log.debug('Fetched remote image with MIME-Type %s from %s', mime, url.toString())
|
||||
# If mime indicates only binary data we can try to guess the real mime type
|
||||
if (mime in ('application/octet-stream', 'binary/data') or mime.startswith('image/')
|
||||
if (mime in {'application/octet-stream', 'binary/data'} or mime.startswith('image/')
|
||||
or imageinfo.supports_mime_type(mime)):
|
||||
try:
|
||||
self._try_load_remote_image(url, data)
|
||||
|
||||
@@ -57,14 +57,14 @@ class TagEditorDelegate(QtWidgets.QItemDelegate):
|
||||
if not index.isValid():
|
||||
return None
|
||||
tag = self.get_tag_name(index)
|
||||
if tag.partition(':')[0] in ('comment', 'lyrics'):
|
||||
if tag.partition(':')[0] in {'comment', 'lyrics'}:
|
||||
editor = QtWidgets.QPlainTextEdit(parent)
|
||||
editor.setFrameStyle(editor.style().styleHint(QtWidgets.QStyle.SH_ItemView_DrawDelegateFrame, None, editor))
|
||||
editor.setMinimumSize(QtCore.QSize(0, 80))
|
||||
else:
|
||||
editor = super().createEditor(parent, option, index)
|
||||
completer = None
|
||||
if tag in ('date', 'originaldate'):
|
||||
if tag in {'date', 'originaldate'}:
|
||||
editor.setPlaceholderText(_('YYYY-MM-DD'))
|
||||
elif tag == 'originalyear':
|
||||
editor.setPlaceholderText(_('YYYY'))
|
||||
@@ -120,7 +120,7 @@ class EditTagDialog(PicardDialog):
|
||||
self.value_selection_changed()
|
||||
|
||||
def keyPressEvent(self, event):
|
||||
if event.modifiers() == QtCore.Qt.NoModifier and event.key() in (QtCore.Qt.Key_Enter, QtCore.Qt.Key_Return):
|
||||
if event.modifiers() == QtCore.Qt.NoModifier and event.key() in {QtCore.Qt.Key_Enter, QtCore.Qt.Key_Return}:
|
||||
self.add_or_edit_value()
|
||||
event.accept()
|
||||
elif event.matches(QtGui.QKeySequence.Delete):
|
||||
|
||||
@@ -746,7 +746,7 @@ class BaseTreeView(QtWidgets.QTreeWidget):
|
||||
files.append(file)
|
||||
else:
|
||||
new_paths.append(filename)
|
||||
elif url.scheme() in ("http", "https"):
|
||||
elif url.scheme() in {"http", "https"}:
|
||||
file_lookup = tagger.get_file_lookup()
|
||||
file_lookup.mbid_lookup(url.path(), browser_fallback=False)
|
||||
if files:
|
||||
@@ -809,7 +809,7 @@ class BaseTreeView(QtWidgets.QTreeWidget):
|
||||
cluster_item.add_files(cluster.files)
|
||||
|
||||
def moveCursor(self, action, modifiers):
|
||||
if action in (QtWidgets.QAbstractItemView.MoveUp, QtWidgets.QAbstractItemView.MoveDown):
|
||||
if action in {QtWidgets.QAbstractItemView.MoveUp, QtWidgets.QAbstractItemView.MoveDown}:
|
||||
item = self.currentItem()
|
||||
if item and not item.isSelected():
|
||||
self.setCurrentItem(item)
|
||||
|
||||
@@ -285,9 +285,9 @@ class MetadataBox(QtWidgets.QTableWidget):
|
||||
return False
|
||||
item = self.itemFromIndex(index)
|
||||
if item.flags() & QtCore.Qt.ItemIsEditable and \
|
||||
trigger in (QtWidgets.QAbstractItemView.DoubleClicked,
|
||||
trigger in {QtWidgets.QAbstractItemView.DoubleClicked,
|
||||
QtWidgets.QAbstractItemView.EditKeyPressed,
|
||||
QtWidgets.QAbstractItemView.AnyKeyPressed):
|
||||
QtWidgets.QAbstractItemView.AnyKeyPressed}:
|
||||
tag = self.tag_diff.tag_names[item.row()]
|
||||
values = self.tag_diff.new[tag]
|
||||
if len(values) > 1:
|
||||
|
||||
@@ -212,7 +212,7 @@ class EditableListModel(QtCore.QAbstractListModel):
|
||||
return len(self._items)
|
||||
|
||||
def data(self, index, role=QtCore.Qt.DisplayRole):
|
||||
if not index.isValid() or role not in (QtCore.Qt.DisplayRole, QtCore.Qt.EditRole):
|
||||
if not index.isValid() or role not in {QtCore.Qt.DisplayRole, QtCore.Qt.EditRole}:
|
||||
return None
|
||||
field = 1 if role == QtCore.Qt.DisplayRole else 0
|
||||
try:
|
||||
@@ -221,7 +221,7 @@ class EditableListModel(QtCore.QAbstractListModel):
|
||||
return None
|
||||
|
||||
def setData(self, index, value, role=QtCore.Qt.EditRole):
|
||||
if not index.isValid() or role not in (QtCore.Qt.DisplayRole, QtCore.Qt.EditRole):
|
||||
if not index.isValid() or role not in {QtCore.Qt.DisplayRole, QtCore.Qt.EditRole}:
|
||||
return False
|
||||
i = index.row()
|
||||
try:
|
||||
|
||||
@@ -455,7 +455,7 @@ class ScriptTextEdit(QTextEdit):
|
||||
tc.select(QTextCursor.WordUnderCursor)
|
||||
selected_text = tc.selectedText()
|
||||
# Check for start of function or end of variable
|
||||
if current_position > 0 and selected_text and selected_text[0] in ('(', '%'):
|
||||
if current_position > 0 and selected_text and selected_text[0] in {'(', '%'}:
|
||||
current_position -= 1
|
||||
tc.setPosition(current_position)
|
||||
tc.select(QTextCursor.WordUnderCursor)
|
||||
@@ -484,7 +484,7 @@ class ScriptTextEdit(QTextEdit):
|
||||
|
||||
def keyPressEvent(self, event):
|
||||
if self.completer.popup().isVisible():
|
||||
if event.key() in (Qt.Key_Tab, Qt.Key_Return, Qt.Key_Enter):
|
||||
if event.key() in {Qt.Key_Tab, Qt.Key_Return, Qt.Key_Enter}:
|
||||
self.completer.activated.emit(self.completer.get_selected())
|
||||
return
|
||||
|
||||
@@ -497,14 +497,14 @@ class ScriptTextEdit(QTextEdit):
|
||||
modifier = QtCore.Qt.MetaModifier if IS_MACOS else QtCore.Qt.ControlModifier
|
||||
force_completion_popup = event.key() == QtCore.Qt.Key_Space and event.modifiers() & modifier
|
||||
if not (force_completion_popup
|
||||
or event.key() in (Qt.Key_Backspace, Qt.Key_Delete)
|
||||
or event.key() in {Qt.Key_Backspace, Qt.Key_Delete}
|
||||
or self.autocomplete_trigger_chars.match(event.text())):
|
||||
self.popup_hide()
|
||||
return
|
||||
|
||||
tc = self.cursor_select_word(full_word=False)
|
||||
selected_text = tc.selectedText()
|
||||
if force_completion_popup or (selected_text and selected_text[0] in ('$', '%')):
|
||||
if force_completion_popup or (selected_text and selected_text[0] in {'$', '%'}):
|
||||
self.completer.setCompletionPrefix(selected_text)
|
||||
popup = self.completer.popup()
|
||||
popup.setCurrentIndex(self.completer.currentIndex())
|
||||
|
||||
@@ -839,7 +839,7 @@ def wildcards_to_regex_pattern(pattern):
|
||||
for c in pattern:
|
||||
if group is not None:
|
||||
if escape:
|
||||
if c in ('\\', '[', ']'):
|
||||
if c in {'\\', '[', ']'}:
|
||||
c = '\\' + c
|
||||
else:
|
||||
group.append('\\\\')
|
||||
@@ -855,7 +855,7 @@ def wildcards_to_regex_pattern(pattern):
|
||||
group.append(c)
|
||||
continue
|
||||
elif escape:
|
||||
if c in ('*', '?', '\\', '[', ']'):
|
||||
if c in {'*', '?', '\\', '[', ']'}:
|
||||
part = '\\' + c
|
||||
else:
|
||||
part = re.escape('\\' + c)
|
||||
|
||||
@@ -42,7 +42,7 @@ else:
|
||||
_current_theme = None
|
||||
if 'XDG_CURRENT_DESKTOP' in os.environ:
|
||||
desktop = os.environ['XDG_CURRENT_DESKTOP'].lower()
|
||||
if desktop in ('gnome', 'unity'):
|
||||
if desktop in {'gnome', 'unity'}:
|
||||
_current_theme = (os.popen('gsettings get org.gnome.desktop.interface icon-theme').read().strip()[1:-1]
|
||||
or None)
|
||||
elif os.environ.get('KDE_FULL_SESSION'):
|
||||
|
||||
@@ -128,7 +128,7 @@ class IdentifyGIF(IdentifyImageType):
|
||||
|
||||
def match(self):
|
||||
# http://en.wikipedia.org/wiki/Graphics_Interchange_Format
|
||||
return self.data[:6] in (b'GIF87a', b'GIF89a')
|
||||
return self.data[:6] in {b'GIF87a', b'GIF89a'}
|
||||
|
||||
def _read(self):
|
||||
self.w, self.h = struct.unpack('<HH', self.data[6:10])
|
||||
|
||||
@@ -78,7 +78,7 @@ class Version(namedtuple('VersionBase', 'major minor patch identifier revision')
|
||||
return set(cls._identifiers.keys())
|
||||
|
||||
def to_string(self, short=False):
|
||||
if short and self.identifier in ('alpha', 'beta'):
|
||||
if short and self.identifier in {'alpha', 'beta'}:
|
||||
version = self._replace(identifier=self.identifier[0])
|
||||
else:
|
||||
version = self
|
||||
@@ -87,7 +87,7 @@ class Version(namedtuple('VersionBase', 'major minor patch identifier revision')
|
||||
version_str = '%d.%d' % version[:2]
|
||||
else:
|
||||
version_str = '%d.%d.%d' % version[:3]
|
||||
elif short and version.identifier in ('a', 'b', 'rc'):
|
||||
elif short and version.identifier in {'a', 'b', 'rc'}:
|
||||
version_str = '%d.%d.%d%s%d' % version
|
||||
else:
|
||||
version_str = '%d.%d.%d.%s%d' % version
|
||||
|
||||
@@ -271,7 +271,7 @@ def main():
|
||||
for path in paths:
|
||||
if os.path.isfile(path):
|
||||
name, ext = os.path.splitext(path)
|
||||
if args.extension in ('', ext):
|
||||
if args.extension in {'', ext}:
|
||||
files.add(path)
|
||||
else:
|
||||
if args.recursive:
|
||||
|
||||
4
setup.py
4
setup.py
@@ -292,7 +292,7 @@ class picard_build(build):
|
||||
'publisher': os.environ.get('PICARD_APPX_PUBLISHER', default_publisher),
|
||||
'version': '.'.join([str(v) for v in store_version]),
|
||||
})
|
||||
elif sys.platform not in ['darwin', 'haiku1', 'win32']:
|
||||
elif sys.platform not in {'darwin', 'haiku1', 'win32'}:
|
||||
self.run_command('build_appdata')
|
||||
build.run(self)
|
||||
|
||||
@@ -823,7 +823,7 @@ def find_file_in_path(filename):
|
||||
return file_path
|
||||
|
||||
|
||||
if sys.platform not in ['darwin', 'haiku1', 'win32']:
|
||||
if sys.platform not in {'darwin', 'haiku1', 'win32'}:
|
||||
args['data_files'].append(('share/applications', [PICARD_DESKTOP_NAME]))
|
||||
args['data_files'].append(('share/icons/hicolor/scalable/apps', ['resources/%s.svg' % PICARD_APP_ID]))
|
||||
for size in (16, 24, 32, 48, 128, 256):
|
||||
|
||||
@@ -402,7 +402,7 @@ class CommonTests:
|
||||
new_metadata = save_and_load_metadata(self.filename, metadata)
|
||||
|
||||
self.assertIn('totaldiscs', original_metadata)
|
||||
if self.testfile_ext in ('.m4a', '.m4v'):
|
||||
if self.testfile_ext in {'.m4a', '.m4v'}:
|
||||
self.assertEqual('0', new_metadata['totaldiscs'])
|
||||
else:
|
||||
self.assertNotIn('totaldiscs', new_metadata)
|
||||
|
||||
Reference in New Issue
Block a user