class GeneralOptionsPage(OptionsPage): NAME = "general" TITLE = N_("General") PARENT = None SORT_ORDER = 1 ACTIVE = True options = [ config.TextOption("setting", "server_host", MUSICBRAINZ_SERVERS[0]), config.IntOption("setting", "server_port", 80), config.TextOption("setting", "username", ""), config.PasswordOption("setting", "password", ""), config.BoolOption("setting", "analyze_new_files", False), config.BoolOption("setting", "ignore_file_mbids", False), ] def __init__(self, parent=None): super(GeneralOptionsPage, self).__init__(parent) self.ui = Ui_GeneralOptionsPage() self.ui.setupUi(self) self.ui.server_host.addItems(MUSICBRAINZ_SERVERS) def load(self): self.ui.server_host.setEditText(config.setting["server_host"]) self.ui.server_port.setValue(config.setting["server_port"]) self.ui.username.setText(config.setting["username"]) self.ui.password.setText(config.setting["password"]) self.ui.analyze_new_files.setChecked(config.setting["analyze_new_files"]) self.ui.ignore_file_mbids.setChecked(config.setting["ignore_file_mbids"]) def save(self): config.setting["server_host"] = unicode(self.ui.server_host.currentText()).strip() config.setting["server_port"] = self.ui.server_port.value() reload_collections = config.setting["username"] != unicode(self.ui.username.text()) \ or config.setting["password"] != unicode(self.ui.password.text()) config.setting["username"] = unicode(self.ui.username.text()) # trivially encode the password, just to not make it so apparent config.setting["password"] = rot13(unicode(self.ui.password.text())) if reload_collections: load_user_collections() config.setting["analyze_new_files"] = self.ui.analyze_new_files.isChecked() config.setting["ignore_file_mbids"] = self.ui.ignore_file_mbids.isChecked()
class GeneralOptionsPage(OptionsPage): NAME = "general" TITLE = N_("General") PARENT = None SORT_ORDER = 1 ACTIVE = True options = [ TextOption("setting", "server_host", "musicbrainz.org"), IntOption("setting", "server_port", 80), TextOption("setting", "username", ""), PasswordOption("setting", "password", ""), BoolOption("setting", "analyze_new_files", False), BoolOption("setting", "ignore_file_mbids", False), ] def __init__(self, parent=None): super(GeneralOptionsPage, self).__init__(parent) self.ui = Ui_GeneralOptionsPage() self.ui.setupUi(self) mirror_servers = [ "musicbrainz.org", ] self.ui.server_host.addItems(sorted(mirror_servers)) def load(self): self.ui.server_host.setEditText(self.config.setting["server_host"]) self.ui.server_port.setValue(self.config.setting["server_port"]) self.ui.username.setText(self.config.setting["username"]) self.ui.password.setText(self.config.setting["password"]) self.ui.analyze_new_files.setChecked(self.config.setting["analyze_new_files"]) self.ui.ignore_file_mbids.setChecked(self.config.setting["ignore_file_mbids"]) def save(self): self.config.setting["server_host"] = unicode(self.ui.server_host.currentText()).strip() self.config.setting["server_port"] = self.ui.server_port.value() self.config.setting["username"] = unicode(self.ui.username.text()) # trivially encode the password, just to not make it so apparent self.config.setting["password"] = rot13(unicode(self.ui.password.text())) self.config.setting["analyze_new_files"] = self.ui.analyze_new_files.isChecked() self.config.setting["ignore_file_mbids"] = self.ui.ignore_file_mbids.isChecked()
class GeneralOptionsPage(OptionsPage): NAME = "general" TITLE = N_("General") PARENT = None SORT_ORDER = 1 ACTIVE = True options = [ config.TextOption("setting", "server_host", MUSICBRAINZ_SERVERS[0]), config.IntOption("setting", "server_port", 443), config.TextOption("persist", "oauth_refresh_token", ""), config.BoolOption("setting", "analyze_new_files", False), config.BoolOption("setting", "ignore_file_mbids", False), config.TextOption("persist", "oauth_refresh_token", ""), config.TextOption("persist", "oauth_refresh_token_scopes", ""), config.TextOption("persist", "oauth_access_token", ""), config.IntOption("persist", "oauth_access_token_expires", 0), config.TextOption("persist", "oauth_username", ""), config.BoolOption("setting", "check_for_updates", True), config.IntOption("setting", "update_check_days", 7), config.IntOption("setting", "update_level", 0), config.IntOption("persist", "last_update_check", 0), ] def __init__(self, parent=None): super().__init__(parent) self.ui = Ui_GeneralOptionsPage() self.ui.setupUi(self) self.ui.server_host.addItems(MUSICBRAINZ_SERVERS) self.ui.login.clicked.connect(self.login) self.ui.logout.clicked.connect(self.logout) self.update_login_logout() def load(self): self.ui.server_host.setEditText(config.setting["server_host"]) self.ui.server_port.setValue(config.setting["server_port"]) self.ui.analyze_new_files.setChecked( config.setting["analyze_new_files"]) self.ui.ignore_file_mbids.setChecked( config.setting["ignore_file_mbids"]) if self.tagger.autoupdate_enabled: self.ui.check_for_updates.setChecked( config.setting["check_for_updates"]) self.ui.update_level.clear() for level, description in PROGRAM_UPDATE_LEVELS.items(): # TODO: Remove temporary workaround once https://github.com/python-babel/babel/issues/415 has been resolved. babel_415_workaround = description['title'] self.ui.update_level.addItem(_(babel_415_workaround), level) self.ui.update_level.setCurrentIndex( self.ui.update_level.findData(config.setting["update_level"])) self.ui.update_check_days.setValue( config.setting["update_check_days"]) else: self.ui.update_check_groupbox.hide() def save(self): config.setting["server_host"] = self.ui.server_host.currentText( ).strip() config.setting["server_port"] = self.ui.server_port.value() config.setting[ "analyze_new_files"] = self.ui.analyze_new_files.isChecked() config.setting[ "ignore_file_mbids"] = self.ui.ignore_file_mbids.isChecked() if self.tagger.autoupdate_enabled: config.setting[ "check_for_updates"] = self.ui.check_for_updates.isChecked() config.setting["update_level"] = self.ui.update_level.currentData( QtCore.Qt.UserRole) config.setting[ "update_check_days"] = self.ui.update_check_days.value() def update_login_logout(self): if self.tagger.webservice.oauth_manager.is_logged_in(): self.ui.logged_in.setText( _("Logged in as <b>%s</b>.") % config.persist["oauth_username"]) self.ui.logged_in.show() self.ui.login.hide() self.ui.logout.show() else: self.ui.logged_in.hide() self.ui.login.show() self.ui.logout.hide() def login(self): self.tagger.mb_login(self.on_login_finished, self) def restore_defaults(self): super().restore_defaults() self.logout() def on_login_finished(self, successful): self.update_login_logout() def logout(self): self.tagger.mb_logout() self.update_login_logout()
class GeneralOptionsPage(OptionsPage): NAME = "general" TITLE = N_("General") PARENT = None SORT_ORDER = 1 ACTIVE = True options = [ config.TextOption("setting", "server_host", MUSICBRAINZ_SERVERS[0]), config.IntOption("setting", "server_port", 443), config.TextOption("persist", "oauth_refresh_token", ""), config.BoolOption("setting", "analyze_new_files", False), config.BoolOption("setting", "ignore_file_mbids", False), config.TextOption("persist", "oauth_refresh_token", ""), config.TextOption("persist", "oauth_refresh_token_scopes", ""), config.TextOption("persist", "oauth_access_token", ""), config.IntOption("persist", "oauth_access_token_expires", 0), config.TextOption("persist", "oauth_username", ""), ] def __init__(self, parent=None): super(GeneralOptionsPage, self).__init__(parent) self.ui = Ui_GeneralOptionsPage() self.ui.setupUi(self) self.ui.server_host.addItems(MUSICBRAINZ_SERVERS) self.ui.login.clicked.connect(self.login) self.ui.logout.clicked.connect(self.logout) self.update_login_logout() def load(self): self.ui.server_host.setEditText(config.setting["server_host"]) self.ui.server_port.setValue(config.setting["server_port"]) self.ui.analyze_new_files.setChecked(config.setting["analyze_new_files"]) self.ui.ignore_file_mbids.setChecked(config.setting["ignore_file_mbids"]) def save(self): config.setting["server_host"] = self.ui.server_host.currentText().strip() config.setting["server_port"] = self.ui.server_port.value() config.setting["analyze_new_files"] = self.ui.analyze_new_files.isChecked() config.setting["ignore_file_mbids"] = self.ui.ignore_file_mbids.isChecked() def update_login_logout(self): if self.tagger.xmlws.oauth_manager.is_logged_in(): self.ui.logged_in.setText(_("Logged in as <b>%s</b>.") % config.persist["oauth_username"]) self.ui.logged_in.show() self.ui.login.hide() self.ui.logout.show() else: self.ui.logged_in.hide() self.ui.login.show() self.ui.logout.hide() def login(self): scopes = "profile tag rating collection submit_isrc submit_barcode" authorization_url = self.tagger.xmlws.oauth_manager.get_authorization_url(scopes) webbrowser2.open(authorization_url) authorization_code, ok = QInputDialog.getText(self, _("MusicBrainz Account"), _("Authorization code:")) if ok: self.tagger.xmlws.oauth_manager.exchange_authorization_code( authorization_code, scopes, self.on_authorization_finished) def restore_defaults(self): super(GeneralOptionsPage, self).restore_defaults() self.logout() def on_authorization_finished(self, successful): if successful: self.tagger.xmlws.oauth_manager.fetch_username( self.on_login_finished) def on_login_finished(self, successful): self.update_login_logout() if successful: load_user_collections() def logout(self): self.tagger.xmlws.oauth_manager.revoke_tokens() self.update_login_logout() load_user_collections()
class GeneralOptionsPage(OptionsPage): NAME = "general" TITLE = N_("General") PARENT = None SORT_ORDER = 1 ACTIVE = True HELP_URL = '/config/options_general.html' options = [ TextOption("setting", "server_host", MUSICBRAINZ_SERVERS[0]), IntOption("setting", "server_port", 443), BoolOption("setting", "use_server_for_submission", False), BoolOption("setting", "analyze_new_files", False), BoolOption("setting", "cluster_new_files", False), BoolOption("setting", "ignore_file_mbids", False), TextOption("persist", "oauth_refresh_token", ""), TextOption("persist", "oauth_refresh_token_scopes", ""), TextOption("persist", "oauth_access_token", ""), IntOption("persist", "oauth_access_token_expires", 0), TextOption("persist", "oauth_username", ""), BoolOption("setting", "check_for_updates", True), IntOption("setting", "update_check_days", 7), IntOption("setting", "update_level", 0), IntOption("persist", "last_update_check", 0), ] def __init__(self, parent=None): super().__init__(parent) self.ui = Ui_GeneralOptionsPage() self.ui.setupUi(self) self.ui.server_host.addItems(MUSICBRAINZ_SERVERS) self.ui.server_host.currentTextChanged.connect(self.update_server_host) self.ui.login.clicked.connect(self.login) self.ui.logout.clicked.connect(self.logout) self.ui.analyze_new_files.toggled.connect(self._update_cluster_new_files) self.ui.cluster_new_files.toggled.connect(self._update_analyze_new_files) self.ui.login_error.setStyleSheet(self.STYLESHEET_ERROR) self.ui.login_error.hide() self.update_login_logout() def load(self): config = get_config() self.ui.server_host.setEditText(config.setting["server_host"]) self.ui.server_port.setValue(config.setting["server_port"]) self.ui.use_server_for_submission.setChecked(config.setting["use_server_for_submission"]) self.update_server_host() self.ui.analyze_new_files.setChecked(config.setting["analyze_new_files"]) self.ui.cluster_new_files.setChecked(config.setting["cluster_new_files"]) self.ui.ignore_file_mbids.setChecked(config.setting["ignore_file_mbids"]) if self.tagger.autoupdate_enabled: self.ui.check_for_updates.setChecked(config.setting["check_for_updates"]) self.ui.update_level.clear() for level, description in PROGRAM_UPDATE_LEVELS.items(): # TODO: Remove temporary workaround once https://github.com/python-babel/babel/issues/415 has been resolved. babel_415_workaround = description['title'] self.ui.update_level.addItem(_(babel_415_workaround), level) self.ui.update_level.setCurrentIndex(self.ui.update_level.findData(config.setting["update_level"])) self.ui.update_check_days.setValue(config.setting["update_check_days"]) else: self.ui.update_check_groupbox.hide() def save(self): config = get_config() config.setting["server_host"] = self.ui.server_host.currentText().strip() config.setting["server_port"] = self.ui.server_port.value() config.setting["use_server_for_submission"] = self.ui.use_server_for_submission.isChecked() config.setting["analyze_new_files"] = self.ui.analyze_new_files.isChecked() config.setting["cluster_new_files"] = self.ui.cluster_new_files.isChecked() config.setting["ignore_file_mbids"] = self.ui.ignore_file_mbids.isChecked() if self.tagger.autoupdate_enabled: config.setting["check_for_updates"] = self.ui.check_for_updates.isChecked() config.setting["update_level"] = self.ui.update_level.currentData(QtCore.Qt.ItemDataRole.UserRole) config.setting["update_check_days"] = self.ui.update_check_days.value() def update_server_host(self): host = self.ui.server_host.currentText().strip() if host and is_official_server(host): self.ui.server_host_primary_warning.hide() else: self.ui.server_host_primary_warning.show() def update_login_logout(self, error_msg=None): if self.deleted: return if self.tagger.webservice.oauth_manager.is_logged_in(): config = get_config() self.ui.logged_in.setText(_("Logged in as <b>%s</b>.") % config.persist["oauth_username"]) self.ui.logged_in.show() self.ui.login_error.hide() self.ui.login.hide() self.ui.logout.show() elif error_msg: self.ui.logged_in.hide() self.ui.login_error.setText(_('Login failed: %s') % error_msg) self.ui.login_error.show() self.ui.login.show() self.ui.logout.hide() else: self.ui.logged_in.hide() self.ui.login_error.hide() self.ui.login.show() self.ui.logout.hide() def login(self): self.tagger.mb_login(self.on_login_finished, self) def restore_defaults(self): super().restore_defaults() self.logout() def on_login_finished(self, successful, error_msg=None): self.update_login_logout(error_msg) def logout(self): self.tagger.mb_logout() self.update_login_logout() def _update_analyze_new_files(self, cluster_new_files): if cluster_new_files: self.ui.analyze_new_files.setChecked(False) def _update_cluster_new_files(self, analyze_new_files): if analyze_new_files: self.ui.cluster_new_files.setChecked(False)
class GeneralOptionsPage(OptionsPage): NAME = "general" TITLE = N_("General") PARENT = None SORT_ORDER = 1 ACTIVE = True options = [ config.TextOption("setting", "server_host", MUSICBRAINZ_SERVERS[0]), config.IntOption("setting", "server_port", 80), config.TextOption("persist", "oauth_refresh_token", ""), config.BoolOption("setting", "analyze_new_files", False), config.BoolOption("setting", "ignore_file_mbids", False), config.TextOption("persist", "oauth_refresh_token", ""), config.TextOption("persist", "oauth_refresh_token_scopes", ""), config.TextOption("persist", "oauth_access_token", ""), config.IntOption("persist", "oauth_access_token_expires", 0), config.TextOption("persist", "oauth_username", ""), ] def __init__(self, parent=None): super(GeneralOptionsPage, self).__init__(parent) self.ui = Ui_GeneralOptionsPage() self.ui.setupUi(self) self.ui.server_host.addItems(MUSICBRAINZ_SERVERS) self.ui.login.clicked.connect(self.login) self.ui.logout.clicked.connect(self.logout) self.update_login_logout() def load(self): self.ui.server_host.setEditText(config.setting["server_host"]) self.ui.server_port.setValue(config.setting["server_port"]) self.ui.analyze_new_files.setChecked( config.setting["analyze_new_files"]) self.ui.ignore_file_mbids.setChecked( config.setting["ignore_file_mbids"]) def save(self): config.setting["server_host"] = unicode( self.ui.server_host.currentText()).strip() config.setting["server_port"] = self.ui.server_port.value() config.setting[ "analyze_new_files"] = self.ui.analyze_new_files.isChecked() config.setting[ "ignore_file_mbids"] = self.ui.ignore_file_mbids.isChecked() def update_login_logout(self): if self.tagger.xmlws.oauth_manager.is_logged_in(): self.ui.logged_in.setText( _("Logged in as <b>%s</b>.") % config.persist["oauth_username"]) self.ui.logged_in.show() self.ui.login.hide() self.ui.logout.show() else: self.ui.logged_in.hide() self.ui.login.show() self.ui.logout.hide() def login(self): scopes = "profile tag rating collection submit_isrc submit_barcode" authorization_url = self.tagger.xmlws.oauth_manager.get_authorization_url( scopes) webbrowser2.open(authorization_url) authorization_code, ok = QInputDialog.getText(self, _("MusicBrainz Account"), _("Authorization code:")) if ok: self.tagger.xmlws.oauth_manager.exchange_authorization_code( authorization_code, scopes, self.on_authorization_finished) def on_authorization_finished(self, successful): if successful: self.tagger.xmlws.oauth_manager.fetch_username( self.on_login_finished) def on_login_finished(self, successful): self.update_login_logout() if successful: load_user_collections() def logout(self): self.tagger.xmlws.oauth_manager.revoke_tokens() self.update_login_logout() load_user_collections()
class GeneralOptionsPage(OptionsPage): NAME = "general" TITLE = N_("General") PARENT = None SORT_ORDER = 1 ACTIVE = True options = [ config.TextOption("setting", "server_host", MUSICBRAINZ_SERVERS[0]), config.IntOption("setting", "server_port", 443), config.TextOption("persist", "oauth_refresh_token", ""), config.BoolOption("setting", "analyze_new_files", False), config.BoolOption("setting", "ignore_file_mbids", False), config.TextOption("persist", "oauth_refresh_token", ""), config.TextOption("persist", "oauth_refresh_token_scopes", ""), config.TextOption("persist", "oauth_access_token", ""), config.IntOption("persist", "oauth_access_token_expires", 0), config.TextOption("persist", "oauth_username", ""), config.BoolOption("setting", "check_for_updates", True), config.IntOption("setting", "update_check_days", 7), config.IntOption("setting", "update_level", 0), config.IntOption("persist", "last_update_check", 0), ] def __init__(self, parent=None): super().__init__(parent) self.ui = Ui_GeneralOptionsPage() self.ui.setupUi(self) self.ui.server_host.addItems(MUSICBRAINZ_SERVERS) self.ui.login.clicked.connect(self.login) self.ui.logout.clicked.connect(self.logout) self.update_login_logout() def load(self): self.ui.server_host.setEditText(config.setting["server_host"]) self.ui.server_port.setValue(config.setting["server_port"]) self.ui.analyze_new_files.setChecked(config.setting["analyze_new_files"]) self.ui.ignore_file_mbids.setChecked(config.setting["ignore_file_mbids"]) if self.tagger.autoupdate_enabled: self.ui.check_for_updates.setChecked(config.setting["check_for_updates"]) self.ui.update_level.clear() for level, description in PROGRAM_UPDATE_LEVELS.items(): # TODO: Remove temporary workaround once https://github.com/python-babel/babel/issues/415 has been resolved. babel_415_workaround = description['title'] self.ui.update_level.addItem(_(babel_415_workaround), level) self.ui.update_level.setCurrentIndex(self.ui.update_level.findData(config.setting["update_level"])) self.ui.update_check_days.setValue(config.setting["update_check_days"]) else: self.ui.update_check_groupbox.hide() def save(self): config.setting["server_host"] = self.ui.server_host.currentText().strip() config.setting["server_port"] = self.ui.server_port.value() config.setting["analyze_new_files"] = self.ui.analyze_new_files.isChecked() config.setting["ignore_file_mbids"] = self.ui.ignore_file_mbids.isChecked() if self.tagger.autoupdate_enabled: config.setting["check_for_updates"] = self.ui.check_for_updates.isChecked() config.setting["update_level"] = self.ui.update_level.currentData(QtCore.Qt.UserRole) config.setting["update_check_days"] = self.ui.update_check_days.value() def update_login_logout(self): if self.tagger.webservice.oauth_manager.is_logged_in(): self.ui.logged_in.setText(_("Logged in as <b>%s</b>.") % config.persist["oauth_username"]) self.ui.logged_in.show() self.ui.login.hide() self.ui.logout.show() else: self.ui.logged_in.hide() self.ui.login.show() self.ui.logout.hide() def login(self): self.tagger.mb_login(self.on_login_finished, self) def restore_defaults(self): super().restore_defaults() self.logout() def on_login_finished(self, successful): self.update_login_logout() def logout(self): self.tagger.mb_logout() self.update_login_logout()
class GeneralOptionsPage(OptionsPage): NAME = "general" TITLE = N_("General") PARENT = None SORT_ORDER = 1 ACTIVE = True options = [ config.TextOption("setting", "server_host", MUSICBRAINZ_SERVERS[0]), config.IntOption("setting", "server_port", 443), config.TextOption("persist", "oauth_refresh_token", ""), config.BoolOption("setting", "analyze_new_files", False), config.BoolOption("setting", "ignore_file_mbids", False), config.TextOption("persist", "oauth_refresh_token", ""), config.TextOption("persist", "oauth_refresh_token_scopes", ""), config.TextOption("persist", "oauth_access_token", ""), config.IntOption("persist", "oauth_access_token_expires", 0), config.TextOption("persist", "oauth_username", ""), config.BoolOption("setting", "check_for_updates", True), config.IntOption("setting", "update_check_days", 7), config.IntOption("setting", "update_level", 0), config.IntOption("persist", "last_update_check", 0), ] def __init__(self, parent=None): super().__init__(parent) self.ui = Ui_GeneralOptionsPage() self.ui.setupUi(self) self.ui.server_host.addItems(MUSICBRAINZ_SERVERS) self.ui.login.clicked.connect(self.login) self.ui.logout.clicked.connect(self.logout) self.update_login_logout() def load(self): self.ui.server_host.setEditText(config.setting["server_host"]) self.ui.server_port.setValue(config.setting["server_port"]) self.ui.analyze_new_files.setChecked( config.setting["analyze_new_files"]) self.ui.ignore_file_mbids.setChecked( config.setting["ignore_file_mbids"]) self.ui.check_for_updates.setChecked( config.setting["check_for_updates"]) self.ui.update_level.clear() for level, description in PROGRAM_UPDATE_LEVELS.items(): self.ui.update_level.addItem(_(description['title']), level) self.ui.update_level.setCurrentIndex( self.ui.update_level.findData(config.setting["update_level"])) self.ui.update_check_days.setValue(config.setting["update_check_days"]) def save(self): config.setting["server_host"] = self.ui.server_host.currentText( ).strip() config.setting["server_port"] = self.ui.server_port.value() config.setting[ "analyze_new_files"] = self.ui.analyze_new_files.isChecked() config.setting[ "ignore_file_mbids"] = self.ui.ignore_file_mbids.isChecked() config.setting[ "check_for_updates"] = self.ui.check_for_updates.isChecked() config.setting["update_level"] = self.ui.update_level.currentData( QtCore.Qt.UserRole) config.setting["update_check_days"] = self.ui.update_check_days.value() def update_login_logout(self): if self.tagger.webservice.oauth_manager.is_logged_in(): self.ui.logged_in.setText( _("Logged in as <b>%s</b>.") % config.persist["oauth_username"]) self.ui.logged_in.show() self.ui.login.hide() self.ui.logout.show() else: self.ui.logged_in.hide() self.ui.login.show() self.ui.logout.hide() def login(self): scopes = "profile tag rating collection submit_isrc submit_barcode" authorization_url = self.tagger.webservice.oauth_manager.get_authorization_url( scopes) webbrowser2.open(authorization_url) authorization_code, ok = QInputDialog.getText(self, _("MusicBrainz Account"), _("Authorization code:")) if ok: self.tagger.webservice.oauth_manager.exchange_authorization_code( authorization_code, scopes, self.on_authorization_finished) def restore_defaults(self): super().restore_defaults() self.logout() def on_authorization_finished(self, successful): if successful: self.tagger.webservice.oauth_manager.fetch_username( self.on_login_finished) def on_login_finished(self, successful): self.update_login_logout() if successful: load_user_collections() def logout(self): self.tagger.webservice.oauth_manager.revoke_tokens() self.update_login_logout() load_user_collections()