class TagsOptionsPage(OptionsPage): NAME = "tags" TITLE = N_("Tags") PARENT = None SORT_ORDER = 30 ACTIVE = True HELP_URL = '/config/options_tags.html' options = [ BoolOption("setting", "dont_write_tags", False), BoolOption("setting", "preserve_timestamps", False), BoolOption("setting", "clear_existing_tags", False), BoolOption("setting", "preserve_images", False), BoolOption("setting", "remove_id3_from_flac", False), BoolOption("setting", "remove_ape_from_mp3", False), ListOption("setting", "preserved_tags", []), ] def __init__(self, parent=None): super().__init__(parent) self.ui = Ui_TagsOptionsPage() self.ui.setupUi(self) def load(self): config = get_config() self.ui.write_tags.setChecked(not config.setting["dont_write_tags"]) self.ui.preserve_timestamps.setChecked( config.setting["preserve_timestamps"]) self.ui.clear_existing_tags.setChecked( config.setting["clear_existing_tags"]) self.ui.preserve_images.setChecked(config.setting["preserve_images"]) self.ui.remove_ape_from_mp3.setChecked( config.setting["remove_ape_from_mp3"]) self.ui.remove_id3_from_flac.setChecked( config.setting["remove_id3_from_flac"]) self.ui.preserved_tags.update(config.setting["preserved_tags"]) self.ui.preserved_tags.set_user_sortable(False) def save(self): config = get_config() config.setting["dont_write_tags"] = not self.ui.write_tags.isChecked() config.setting[ "preserve_timestamps"] = self.ui.preserve_timestamps.isChecked() clear_existing_tags = self.ui.clear_existing_tags.isChecked() if clear_existing_tags != config.setting["clear_existing_tags"]: config.setting["clear_existing_tags"] = clear_existing_tags self.tagger.window.metadata_box.update() config.setting["preserve_images"] = self.ui.preserve_images.isChecked() config.setting[ "remove_ape_from_mp3"] = self.ui.remove_ape_from_mp3.isChecked() config.setting[ "remove_id3_from_flac"] = self.ui.remove_id3_from_flac.isChecked() config.setting["preserved_tags"] = list(self.ui.preserved_tags.tags) self.tagger.window.enable_tag_saving_action.setChecked( not config.setting["dont_write_tags"])
class TagsOptionsPage(OptionsPage): NAME = "tags" TITLE = N_("Tags") PARENT = None SORT_ORDER = 30 ACTIVE = True options = [ config.BoolOption("setting", "clear_existing_tags", False), config.TextOption("setting", "preserved_tags", ""), config.BoolOption("setting", "write_id3v1", True), config.BoolOption("setting", "write_id3v23", True), config.TextOption("setting", "id3v2_encoding", "utf-16"), config.TextOption("setting", "id3v23_join_with", "/"), config.BoolOption("setting", "remove_id3_from_flac", False), config.BoolOption("setting", "remove_ape_from_mp3", False), config.BoolOption("setting", "tpe2_albumartist", False), config.BoolOption("setting", "dont_write_tags", False), config.BoolOption("setting", "preserve_timestamps", False), ] def __init__(self, parent=None): super(TagsOptionsPage, self).__init__(parent) self.ui = Ui_TagsOptionsPage() self.ui.setupUi(self) self.ui.write_id3v23.clicked.connect(self.update_encodings) self.ui.write_id3v24.clicked.connect(self.update_encodings) self.completer = QtWidgets.QCompleter(sorted(TAG_NAMES.keys()), self) self.completer.setCaseSensitivity(QtCore.Qt.CaseInsensitive) self.completer.setWidget(self.ui.preserved_tags) self.ui.preserved_tags.textEdited.connect(self.preserved_tags_edited) self.completer.activated.connect(self.completer_activated) def load(self): self.ui.write_tags.setChecked(not config.setting["dont_write_tags"]) self.ui.preserve_timestamps.setChecked( config.setting["preserve_timestamps"]) self.ui.clear_existing_tags.setChecked( config.setting["clear_existing_tags"]) self.ui.write_id3v1.setChecked(config.setting["write_id3v1"]) if config.setting["write_id3v23"]: self.ui.write_id3v23.setChecked(True) else: self.ui.write_id3v24.setChecked(True) if config.setting["id3v2_encoding"] == "iso-8859-1": self.ui.enc_iso88591.setChecked(True) elif config.setting["id3v2_encoding"] == "utf-16": self.ui.enc_utf16.setChecked(True) else: self.ui.enc_utf8.setChecked(True) self.ui.id3v23_join_with.setEditText( config.setting["id3v23_join_with"]) self.ui.remove_ape_from_mp3.setChecked( config.setting["remove_ape_from_mp3"]) self.ui.remove_id3_from_flac.setChecked( config.setting["remove_id3_from_flac"]) self.ui.preserved_tags.setText(config.setting["preserved_tags"]) self.update_encodings() def save(self): config.setting["dont_write_tags"] = not self.ui.write_tags.isChecked() config.setting[ "preserve_timestamps"] = self.ui.preserve_timestamps.isChecked() clear_existing_tags = self.ui.clear_existing_tags.isChecked() if clear_existing_tags != config.setting["clear_existing_tags"]: config.setting["clear_existing_tags"] = clear_existing_tags self.tagger.window.metadata_box.update() config.setting["write_id3v1"] = self.ui.write_id3v1.isChecked() config.setting["write_id3v23"] = self.ui.write_id3v23.isChecked() config.setting[ "id3v23_join_with"] = self.ui.id3v23_join_with.currentText() if self.ui.enc_iso88591.isChecked(): config.setting["id3v2_encoding"] = "iso-8859-1" elif self.ui.enc_utf16.isChecked(): config.setting["id3v2_encoding"] = "utf-16" else: config.setting["id3v2_encoding"] = "utf-8" config.setting[ "remove_ape_from_mp3"] = self.ui.remove_ape_from_mp3.isChecked() config.setting[ "remove_id3_from_flac"] = self.ui.remove_id3_from_flac.isChecked() config.setting["preserved_tags"] = self.ui.preserved_tags.text() self.tagger.window.enable_tag_saving_action.setChecked( not config.setting["dont_write_tags"]) def update_encodings(self): if self.ui.write_id3v23.isChecked(): if self.ui.enc_utf8.isChecked(): self.ui.enc_utf16.setChecked(True) self.ui.enc_utf8.setEnabled(False) self.ui.label_id3v23_join_with.setEnabled(True) self.ui.id3v23_join_with.setEnabled(True) else: self.ui.enc_utf8.setEnabled(True) self.ui.enc_utf8.setChecked(True) self.ui.label_id3v23_join_with.setEnabled(False) self.ui.id3v23_join_with.setEnabled(False) def preserved_tags_edited(self, text): prefix = text[:self.ui.preserved_tags.cursorPosition()].split(",")[-1] self.completer.setCompletionPrefix(prefix) if prefix: self.completer.complete() else: self.completer.popup().hide() def completer_activated(self, text): input = self.ui.preserved_tags current = input.text() i = input.cursorPosition() p = len(self.completer.completionPrefix()) input.setText("%s%s %s" % (current[:i - p], text, current[i:])) input.setCursorPosition(i - p + len(text) + 1)
class TagsOptionsPage(OptionsPage): NAME = "tags" TITLE = N_("Tags") PARENT = None SORT_ORDER = 30 ACTIVE = True options = [ config.BoolOption("setting", "clear_existing_tags", False), config.TextOption("setting", "preserved_tags", ""), config.BoolOption("setting", "write_id3v1", True), config.BoolOption("setting", "write_id3v23", True), config.TextOption("setting", "id3v2_encoding", "utf-16"), config.TextOption("setting", "id3v23_join_with", "/"), config.BoolOption("setting", "remove_id3_from_flac", False), config.BoolOption("setting", "remove_ape_from_mp3", False), config.BoolOption("setting", "tpe2_albumartist", False), config.BoolOption("setting", "dont_write_tags", False), config.BoolOption("setting", "preserve_timestamps", False), ] def __init__(self, parent=None): super(TagsOptionsPage, self).__init__(parent) self.ui = Ui_TagsOptionsPage() self.ui.setupUi(self) self.ui.write_id3v23.clicked.connect(self.update_encodings) self.ui.write_id3v24.clicked.connect(partial(self.update_encodings, force_utf8=True)) self.completer = QtWidgets.QCompleter(sorted(TAG_NAMES.keys()), self) self.completer.setCaseSensitivity(QtCore.Qt.CaseInsensitive) self.completer.setWidget(self.ui.preserved_tags) self.ui.preserved_tags.textEdited.connect(self.preserved_tags_edited) self.completer.activated.connect(self.completer_activated) def load(self): self.ui.write_tags.setChecked(not config.setting["dont_write_tags"]) self.ui.preserve_timestamps.setChecked(config.setting["preserve_timestamps"]) self.ui.clear_existing_tags.setChecked(config.setting["clear_existing_tags"]) self.ui.write_id3v1.setChecked(config.setting["write_id3v1"]) if config.setting["write_id3v23"]: self.ui.write_id3v23.setChecked(True) else: self.ui.write_id3v24.setChecked(True) if config.setting["id3v2_encoding"] == "iso-8859-1": self.ui.enc_iso88591.setChecked(True) elif config.setting["id3v2_encoding"] == "utf-16": self.ui.enc_utf16.setChecked(True) else: self.ui.enc_utf8.setChecked(True) self.ui.id3v23_join_with.setEditText(config.setting["id3v23_join_with"]) self.ui.remove_ape_from_mp3.setChecked(config.setting["remove_ape_from_mp3"]) self.ui.remove_id3_from_flac.setChecked(config.setting["remove_id3_from_flac"]) self.ui.preserved_tags.setText(config.setting["preserved_tags"]) self.update_encodings() def save(self): config.setting["dont_write_tags"] = not self.ui.write_tags.isChecked() config.setting["preserve_timestamps"] = self.ui.preserve_timestamps.isChecked() clear_existing_tags = self.ui.clear_existing_tags.isChecked() if clear_existing_tags != config.setting["clear_existing_tags"]: config.setting["clear_existing_tags"] = clear_existing_tags self.tagger.window.metadata_box.update() config.setting["write_id3v1"] = self.ui.write_id3v1.isChecked() config.setting["write_id3v23"] = self.ui.write_id3v23.isChecked() config.setting["id3v23_join_with"] = self.ui.id3v23_join_with.currentText() if self.ui.enc_iso88591.isChecked(): config.setting["id3v2_encoding"] = "iso-8859-1" elif self.ui.enc_utf16.isChecked(): config.setting["id3v2_encoding"] = "utf-16" else: config.setting["id3v2_encoding"] = "utf-8" config.setting["remove_ape_from_mp3"] = self.ui.remove_ape_from_mp3.isChecked() config.setting["remove_id3_from_flac"] = self.ui.remove_id3_from_flac.isChecked() config.setting["preserved_tags"] = self.ui.preserved_tags.text() self.tagger.window.enable_tag_saving_action.setChecked(not config.setting["dont_write_tags"]) def update_encodings(self, force_utf8=False): if self.ui.write_id3v23.isChecked(): if self.ui.enc_utf8.isChecked(): self.ui.enc_utf16.setChecked(True) self.ui.enc_utf8.setEnabled(False) self.ui.label_id3v23_join_with.setEnabled(True) self.ui.id3v23_join_with.setEnabled(True) else: self.ui.enc_utf8.setEnabled(True) if force_utf8: self.ui.enc_utf8.setChecked(True) self.ui.label_id3v23_join_with.setEnabled(False) self.ui.id3v23_join_with.setEnabled(False) def preserved_tags_edited(self, text): prefix = text[:self.ui.preserved_tags.cursorPosition()].split(",")[-1] self.completer.setCompletionPrefix(prefix) if prefix: self.completer.complete() else: self.completer.popup().hide() def completer_activated(self, text): input_field = self.ui.preserved_tags current = input_field.text() i = input_field.cursorPosition() p = len(self.completer.completionPrefix()) input_field.setText("%s%s %s" % (current[:i - p], text, current[i:])) input_field.setCursorPosition(i - p + len(text) + 1)
class TagsOptionsPage(OptionsPage): NAME = "tags" TITLE = N_("Tags") PARENT = None SORT_ORDER = 30 ACTIVE = True options = [ config.BoolOption("setting", "dont_write_tags", False), config.BoolOption("setting", "preserve_timestamps", False), config.BoolOption("setting", "clear_existing_tags", False), config.BoolOption("setting", "remove_id3_from_flac", False), config.BoolOption("setting", "remove_ape_from_mp3", False), config.TextOption("setting", "preserved_tags", ""), ] def __init__(self, parent=None): super().__init__(parent) self.ui = Ui_TagsOptionsPage() self.ui.setupUi(self) self.completer = QtWidgets.QCompleter(sorted(TAG_NAMES.keys()), self) self.completer.setCaseSensitivity(QtCore.Qt.CaseInsensitive) self.completer.setWidget(self.ui.preserved_tags) self.ui.preserved_tags.textEdited.connect(self.preserved_tags_edited) self.completer.activated.connect(self.completer_activated) def load(self): self.ui.write_tags.setChecked(not config.setting["dont_write_tags"]) self.ui.preserve_timestamps.setChecked( config.setting["preserve_timestamps"]) self.ui.clear_existing_tags.setChecked( config.setting["clear_existing_tags"]) self.ui.remove_ape_from_mp3.setChecked( config.setting["remove_ape_from_mp3"]) self.ui.remove_id3_from_flac.setChecked( config.setting["remove_id3_from_flac"]) self.ui.preserved_tags.setText(config.setting["preserved_tags"]) def save(self): config.setting["dont_write_tags"] = not self.ui.write_tags.isChecked() config.setting[ "preserve_timestamps"] = self.ui.preserve_timestamps.isChecked() clear_existing_tags = self.ui.clear_existing_tags.isChecked() if clear_existing_tags != config.setting["clear_existing_tags"]: config.setting["clear_existing_tags"] = clear_existing_tags self.tagger.window.metadata_box.update() config.setting[ "remove_ape_from_mp3"] = self.ui.remove_ape_from_mp3.isChecked() config.setting[ "remove_id3_from_flac"] = self.ui.remove_id3_from_flac.isChecked() config.setting["preserved_tags"] = re.sub( r"[,\s]+$", "", self.ui.preserved_tags.text()) self.tagger.window.enable_tag_saving_action.setChecked( not config.setting["dont_write_tags"]) def preserved_tags_edited(self, text): prefix = text[:self.ui.preserved_tags.cursorPosition()].split(",")[-1] self.completer.setCompletionPrefix(prefix.strip()) if prefix: self.completer.complete() else: self.completer.popup().hide() def completer_activated(self, text): input_field = self.ui.preserved_tags current = input_field.text() cursor_pos = input_field.cursorPosition() prefix_len = len(self.completer.completionPrefix()) leading_text = current[:cursor_pos - prefix_len].rstrip() trailing_text = current[cursor_pos:].lstrip() # Replace the autocompletion prefix with the autocompleted text, # append a comma so the user can easily enter the next entry replacement = ("%s %s, " % (leading_text, text)).lstrip() input_field.setText(replacement + trailing_text) # Set cursor position to end of autocompleted input input_field.setCursorPosition(len(replacement))
class TagsOptionsPage(OptionsPage): NAME = "tags" TITLE = N_("Tags") PARENT = None SORT_ORDER = 30 ACTIVE = True options = [ BoolOption("setting", "clear_existing_tags", False), BoolOption("setting", "write_id3v1", True), BoolOption("setting", "write_id3v23", True), TextOption("setting", "id3v2_encoding", "utf-16"), BoolOption("setting", "remove_id3_from_flac", False), BoolOption("setting", "remove_ape_from_mp3", False), BoolOption("setting", "tpe2_albumartist", False), BoolOption("setting", "dont_write_tags", False), ] def __init__(self, parent=None): super(TagsOptionsPage, self).__init__(parent) self.ui = Ui_TagsOptionsPage() self.ui.setupUi(self) self.connect(self.ui.write_id3v23, QtCore.SIGNAL("clicked()"), self.update_encodings) self.connect(self.ui.write_id3v24, QtCore.SIGNAL("clicked()"), self.update_encodings) def load(self): self.ui.write_tags.setChecked(not self.config.setting["dont_write_tags"]) self.ui.clear_existing_tags.setChecked(self.config.setting["clear_existing_tags"]) self.ui.write_id3v1.setChecked(self.config.setting["write_id3v1"]) self.ui.write_id3v23.setChecked(self.config.setting["write_id3v23"]) if self.config.setting["id3v2_encoding"] == "iso-8859-1": self.ui.enc_iso88591.setChecked(True) elif self.config.setting["id3v2_encoding"] == "utf-16": self.ui.enc_utf16.setChecked(True) else: self.ui.enc_utf8.setChecked(True) self.ui.remove_ape_from_mp3.setChecked(self.config.setting["remove_ape_from_mp3"]) self.ui.remove_id3_from_flac.setChecked(self.config.setting["remove_id3_from_flac"]) self.update_encodings() def save(self): self.config.setting["dont_write_tags"] = not self.ui.write_tags.isChecked() self.config.setting["clear_existing_tags"] = self.ui.clear_existing_tags.isChecked() self.config.setting["write_id3v1"] = self.ui.write_id3v1.isChecked() self.config.setting["write_id3v23"] = self.ui.write_id3v23.isChecked() if self.ui.enc_iso88591.isChecked(): self.config.setting["id3v2_encoding"] = "iso-8859-1" elif self.ui.enc_utf16.isChecked(): self.config.setting["id3v2_encoding"] = "utf-16" else: self.config.setting["id3v2_encoding"] = "utf-8" self.config.setting["remove_ape_from_mp3"] = self.ui.remove_ape_from_mp3.isChecked() self.config.setting["remove_id3_from_flac"] = self.ui.remove_id3_from_flac.isChecked() self.tagger.window.enable_tag_saving_action.setChecked(not self.config.setting["dont_write_tags"]) def update_encodings(self): if self.ui.write_id3v23.isChecked(): if self.ui.enc_utf8.isChecked(): self.ui.enc_utf16.setChecked(True) self.ui.enc_utf8.setEnabled(False) else: self.ui.enc_utf8.setEnabled(True)
class TagsOptionsPage(OptionsPage): NAME = "tags" TITLE = N_("Tags") PARENT = None SORT_ORDER = 30 ACTIVE = True options = [ config.BoolOption("setting", "clear_existing_tags", False), config.TextOption("setting", "preserved_tags", ""), config.BoolOption("setting", "write_id3v1", True), config.BoolOption("setting", "write_id3v23", True), config.TextOption("setting", "id3v2_encoding", "utf-16"), config.TextOption("setting", "id3v23_join_with", "/"), config.BoolOption("setting", "remove_id3_from_flac", False), config.BoolOption("setting", "remove_ape_from_mp3", False), config.BoolOption("setting", "tpe2_albumartist", False), config.BoolOption("setting", "itunes_compatible_grouping", False), config.BoolOption("setting", "dont_write_tags", False), config.BoolOption("setting", "preserve_timestamps", False), config.BoolOption("setting", "aac_save_ape", True), config.BoolOption("setting", "remove_ape_from_aac", False), ] def __init__(self, parent=None): super().__init__(parent) self.ui = Ui_TagsOptionsPage() self.ui.setupUi(self) self.ui.write_id3v23.clicked.connect(self.update_encodings) self.ui.write_id3v24.clicked.connect( partial(self.update_encodings, force_utf8=True)) self.completer = QtWidgets.QCompleter(sorted(TAG_NAMES.keys()), self) self.completer.setCaseSensitivity(QtCore.Qt.CaseInsensitive) self.completer.setWidget(self.ui.preserved_tags) self.ui.preserved_tags.textEdited.connect(self.preserved_tags_edited) self.completer.activated.connect(self.completer_activated) self.ui.aac_no_tags.toggled.connect( self.ui.remove_ape_from_aac.setEnabled) def load(self): self.ui.write_tags.setChecked(not config.setting["dont_write_tags"]) self.ui.preserve_timestamps.setChecked( config.setting["preserve_timestamps"]) self.ui.clear_existing_tags.setChecked( config.setting["clear_existing_tags"]) self.ui.write_id3v1.setChecked(config.setting["write_id3v1"]) if config.setting["write_id3v23"]: self.ui.write_id3v23.setChecked(True) else: self.ui.write_id3v24.setChecked(True) if config.setting["id3v2_encoding"] == "iso-8859-1": self.ui.enc_iso88591.setChecked(True) elif config.setting["id3v2_encoding"] == "utf-16": self.ui.enc_utf16.setChecked(True) else: self.ui.enc_utf8.setChecked(True) self.ui.id3v23_join_with.setEditText( config.setting["id3v23_join_with"]) self.ui.remove_ape_from_mp3.setChecked( config.setting["remove_ape_from_mp3"]) self.ui.remove_id3_from_flac.setChecked( config.setting["remove_id3_from_flac"]) self.ui.itunes_compatible_grouping.setChecked( config.setting["itunes_compatible_grouping"]) self.ui.preserved_tags.setText(config.setting["preserved_tags"]) if config.setting["aac_save_ape"]: self.ui.aac_save_ape.setChecked(True) else: self.ui.aac_no_tags.setChecked(True) self.ui.remove_ape_from_aac.setChecked( config.setting["remove_ape_from_aac"]) self.ui.remove_ape_from_aac.setEnabled( not config.setting["aac_save_ape"]) self.update_encodings() def save(self): config.setting["dont_write_tags"] = not self.ui.write_tags.isChecked() config.setting[ "preserve_timestamps"] = self.ui.preserve_timestamps.isChecked() clear_existing_tags = self.ui.clear_existing_tags.isChecked() if clear_existing_tags != config.setting["clear_existing_tags"]: config.setting["clear_existing_tags"] = clear_existing_tags self.tagger.window.metadata_box.update() config.setting["write_id3v1"] = self.ui.write_id3v1.isChecked() config.setting["write_id3v23"] = self.ui.write_id3v23.isChecked() config.setting[ "id3v23_join_with"] = self.ui.id3v23_join_with.currentText() if self.ui.enc_iso88591.isChecked(): config.setting["id3v2_encoding"] = "iso-8859-1" elif self.ui.enc_utf16.isChecked(): config.setting["id3v2_encoding"] = "utf-16" else: config.setting["id3v2_encoding"] = "utf-8" config.setting[ "remove_ape_from_mp3"] = self.ui.remove_ape_from_mp3.isChecked() config.setting[ "remove_id3_from_flac"] = self.ui.remove_id3_from_flac.isChecked() config.setting[ "itunes_compatible_grouping"] = self.ui.itunes_compatible_grouping.isChecked( ) config.setting["preserved_tags"] = re.sub( r"[,\s]+$", "", self.ui.preserved_tags.text()) config.setting["aac_save_ape"] = self.ui.aac_save_ape.isChecked() config.setting[ "remove_ape_from_aac"] = self.ui.remove_ape_from_aac.isChecked() self.tagger.window.enable_tag_saving_action.setChecked( not config.setting["dont_write_tags"]) def update_encodings(self, force_utf8=False): if self.ui.write_id3v23.isChecked(): if self.ui.enc_utf8.isChecked(): self.ui.enc_utf16.setChecked(True) self.ui.enc_utf8.setEnabled(False) self.ui.label_id3v23_join_with.setEnabled(True) self.ui.id3v23_join_with.setEnabled(True) else: self.ui.enc_utf8.setEnabled(True) if force_utf8: self.ui.enc_utf8.setChecked(True) self.ui.label_id3v23_join_with.setEnabled(False) self.ui.id3v23_join_with.setEnabled(False) def preserved_tags_edited(self, text): prefix = text[:self.ui.preserved_tags.cursorPosition()].split(",")[-1] self.completer.setCompletionPrefix(prefix.strip()) if prefix: self.completer.complete() else: self.completer.popup().hide() def completer_activated(self, text): input_field = self.ui.preserved_tags current = input_field.text() cursor_pos = input_field.cursorPosition() prefix_len = len(self.completer.completionPrefix()) leading_text = current[:cursor_pos - prefix_len].rstrip() trailing_text = current[cursor_pos:].lstrip() # Replace the autocompletion prefix with the autocompleted text, # append a comma so the user can easily enter the next entry replacement = ("%s %s, " % (leading_text, text)).lstrip() input_field.setText(replacement + trailing_text) # Set cursor position to end of autocompleted input input_field.setCursorPosition(len(replacement))