Пример #1
0
def register_cover_art_provider(provider):
    _cover_art_providers.register(provider.__module__, provider)
    if hasattr(provider, 'OPTIONS') and provider.OPTIONS:
        if not hasattr(provider.OPTIONS, 'NAME'):
            provider.OPTIONS.NAME = provider.name.lower().replace(' ', '_')
        if not hasattr(provider.OPTIONS, 'TITLE'):
            provider.OPTIONS.TITLE = provider.title
        register_options_page(provider.OPTIONS)
Пример #2
0
        args["translator-credits"] = _("translator-credits")
        if args["translator-credits"] != "translator-credits":
            # TR: Replace LANG with language you are translatig to.
            args["translator-credits"] = _(
                "<br/>Translated to LANG by %s"
            ) % args["translator-credits"].replace("\n", "<br/>")
        else:
            args["translator-credits"] = ""

        text = _(
            u"""<p align="center"><span style="font-size:15px;font-weight:bold;">MusicBrainz Picard</span><br/>
Version %(version)s</p>
<p align="center"><small>
PyQt %(pyqt-version)s<br/>
Mutagen %(mutagen-version)s<br/>
Discid %(discid-version)s
</small></p>
<p align="center"><strong>Supported formats</strong><br/>%(formats)s</p>
<p align="center"><strong>Please donate</strong><br/>
Thank you for using Picard. Picard relies on the MusicBrainz database, which is operated by the MetaBrainz Foundation with the help of thousands of volunteers. If you like this application please consider donating to the MetaBrainz Foundation to keep the service running.</p>
<p align="center"><a href="http://metabrainz.org/donate">Donate now!</a></p>
<p align="center"><strong>Credits</strong><br/>
<small>Copyright © 2004-2011 Robert Kaye, Lukáš Lalinský and others%(translator-credits)s</small></p>
<p align="center"><a href="http://musicbrainz.org/doc/MusicBrainz_Picard">http://musicbrainz.org/doc/MusicBrainz_Picard</a></p>
""") % args
        self.ui.label.setOpenExternalLinks(True)
        self.ui.label.setText(text)


register_options_page(AboutOptionsPage)
Пример #3
0
        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)


register_options_page(TagsOptionsPage)
Пример #4
0
        self.ui.cb_embed_front_only.setChecked(config.setting["embed_only_one_front_image"])
        self.ui.save_images_to_files.setChecked(config.setting["save_images_to_files"])
        self.ui.cover_image_filename.setText(config.setting["cover_image_filename"])
        self.ui.save_images_overwrite.setChecked(config.setting["save_images_overwrite"])
        self.ca_providers = config.setting["ca_providers"]
        self.load_cover_art_providers()
        self.update_all()

    def save(self):
        config.setting["save_images_to_tags"] = self.ui.save_images_to_tags.isChecked()
        config.setting["embed_only_one_front_image"] = self.ui.cb_embed_front_only.isChecked()
        config.setting["save_images_to_files"] = self.ui.save_images_to_files.isChecked()
        config.setting["cover_image_filename"] = self.ui.cover_image_filename.text()
        config.setting["save_images_overwrite"] = self.ui.save_images_overwrite.isChecked()
        config.setting["ca_providers"] = self.ca_providers

    def update_all(self):
        self.update_filename()
        self.update_save_images_to_tags()

    def update_filename(self):
        enabled = self.ui.save_images_to_files.isChecked()
        self.ui.cover_image_filename.setEnabled(enabled)
        self.ui.save_images_overwrite.setEnabled(enabled)

    def update_save_images_to_tags(self):
        enabled = self.ui.save_images_to_tags.isChecked()
        self.ui.cb_embed_front_only.setEnabled(enabled)

register_options_page(CoverOptionsPage)
Пример #5
0
        self.ui.track_ars.setChecked(config.setting["track_ars"])
        self.ui.folksonomy_tags.setChecked(config.setting["folksonomy_tags"])
        self.ui.va_name.setText(config.setting["va_name"])
        self.ui.nat_name.setText(config.setting["nat_name"])
        self.ui.standardize_artists.setChecked(config.setting["standardize_artists"])

    def save(self):
        config.setting["translate_artist_names"] = self.ui.translate_artist_names.isChecked()
        config.setting["artist_locale"] = self.ui.artist_locale.itemData(self.ui.artist_locale.currentIndex())
        config.setting["convert_punctuation"] = self.ui.convert_punctuation.isChecked()
        config.setting["release_ars"] = self.ui.release_ars.isChecked()
        config.setting["track_ars"] = self.ui.track_ars.isChecked()
        config.setting["folksonomy_tags"] = self.ui.folksonomy_tags.isChecked()
        config.setting["va_name"] = self.ui.va_name.text()
        nat_name = unicode(self.ui.nat_name.text())
        if nat_name != config.setting["nat_name"]:
            config.setting["nat_name"] = nat_name
            self.tagger.nats.update()
        config.setting["standardize_artists"] = self.ui.standardize_artists.isChecked()

    def set_va_name_default(self):
        self.ui.va_name.setText(self.options[0].default)
        self.ui.va_name.setCursorPosition(0)

    def set_nat_name_default(self):
        self.ui.nat_name.setText(self.options[1].default)
        self.ui.nat_name.setCursorPosition(0)


register_options_page(MetadataOptionsPage)
Пример #6
0
            "remove_ape_from_aac"] = self.ui.remove_ape_from_aac.isChecked()
        config.setting["ac3_save_ape"] = self.ui.ac3_save_ape.isChecked()
        config.setting[
            "remove_ape_from_ac3"] = self.ui.remove_ape_from_ac3.isChecked()
        config.setting[
            "write_wave_riff_info"] = self.ui.write_wave_riff_info.isChecked()
        config.setting[
            "remove_wave_riff_info"] = self.ui.remove_wave_riff_info.isChecked(
            )
        if self.ui.wave_riff_info_enc_utf8.isChecked():
            config.setting["wave_riff_info_encoding"] = "utf-8"
        else:
            config.setting["wave_riff_info_encoding"] = "windows-1252"

    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)


register_options_page(TagsCompatibilityOptionsPage)
Пример #7
0
        config.BoolOption("setting", "folksonomy_tags", False),
    ]

    def __init__(self, parent=None):
        super().__init__(parent)
        self.ui = Ui_GenresOptionsPage()
        self.ui.setupUi(self)

    def load(self):
        self.ui.use_genres.setChecked(config.setting["use_genres"])
        self.ui.max_genres.setValue(config.setting["max_genres"])
        self.ui.min_genre_usage.setValue(config.setting["min_genre_usage"])
        self.ui.join_genres.setEditText(config.setting["join_genres"])
        self.ui.ignore_genres.setText(config.setting["ignore_genres"])
        self.ui.only_my_genres.setChecked(config.setting["only_my_genres"])
        self.ui.artists_genres.setChecked(config.setting["artists_genres"])
        self.ui.folksonomy_tags.setChecked(config.setting["folksonomy_tags"])

    def save(self):
        config.setting["use_genres"] = self.ui.use_genres.isChecked()
        config.setting["max_genres"] = self.ui.max_genres.value()
        config.setting["min_genre_usage"] = self.ui.min_genre_usage.value()
        config.setting["join_genres"] = self.ui.join_genres.currentText()
        config.setting["ignore_genres"] = self.ui.ignore_genres.text()
        config.setting["only_my_genres"] = self.ui.only_my_genres.isChecked()
        config.setting["artists_genres"] = self.ui.artists_genres.isChecked()
        config.setting["folksonomy_tags"] = self.ui.folksonomy_tags.isChecked()


register_options_page(GenresOptionsPage)
Пример #8
0
    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()


register_options_page(GeneralOptionsPage)
Пример #9
0
        TextOption("setting", "fanarttv_client_key", ""),
        TextOption("setting", "fanarttv_use_cdart", OPTION_CDART_NOALBUMART),
    ]

    def __init__(self, parent=None):
        super(FanartTvOptionsPage, self).__init__(parent)
        self.ui = Ui_FanartTvOptionsPage()
        self.ui.setupUi(self)

    def load(self):
        self.ui.fanarttv_client_key.setText(config.setting["fanarttv_client_key"])
        if config.setting["fanarttv_use_cdart"] == OPTION_CDART_ALWAYS:
            self.ui.fanarttv_cdart_use_always.setChecked(True)
        elif config.setting["fanarttv_use_cdart"] == OPTION_CDART_NEVER:
            self.ui.fanarttv_cdart_use_never.setChecked(True)
        elif config.setting["fanarttv_use_cdart"] == OPTION_CDART_NOALBUMART:
            self.ui.fanarttv_cdart_use_if_no_albumcover.setChecked(True)

    def save(self):
        config.setting["fanarttv_client_key"] = unicode(self.ui.fanarttv_client_key.text())
        if self.ui.fanarttv_cdart_use_always.isChecked():
            config.setting["fanarttv_use_cdart"] = OPTION_CDART_ALWAYS
        elif self.ui.fanarttv_cdart_use_never.isChecked():
            config.setting["fanarttv_use_cdart"] = OPTION_CDART_NEVER
        elif self.ui.fanarttv_cdart_use_if_no_albumcover.isChecked():
            config.setting["fanarttv_use_cdart"] = OPTION_CDART_NOALBUMART


register_cover_art_provider(CoverArtProviderFanartTv)
register_options_page(FanartTvOptionsPage)
Пример #10
0
    options = [
        BoolOption("setting", "lastfm_use_track_tags", False),
        BoolOption("setting", "lastfm_use_artist_tags", False),
        IntOption("setting", "lastfm_min_tag_usage", 15),
        TextOption("setting", "lastfm_ignore_tags", "seen live,favorites"),
        TextOption("setting", "lastfm_join_tags", ""),
    ]

    def __init__(self, parent=None):
        super(LastfmOptionsPage, self).__init__(parent)
        self.ui = Ui_LastfmOptionsPage()
        self.ui.setupUi(self)

    def load(self):
        self.ui.use_track_tags.setChecked(self.config.setting["lastfm_use_track_tags"])
        self.ui.use_artist_tags.setChecked(self.config.setting["lastfm_use_artist_tags"])
        self.ui.min_tag_usage.setValue(self.config.setting["lastfm_min_tag_usage"])
        self.ui.ignore_tags.setText(self.config.setting["lastfm_ignore_tags"])
        self.ui.join_tags.setEditText(self.config.setting["lastfm_join_tags"])

    def save(self):
        self.config.setting["lastfm_use_track_tags"] = self.ui.use_track_tags.isChecked()
        self.config.setting["lastfm_use_artist_tags"] = self.ui.use_artist_tags.isChecked()
        self.config.setting["lastfm_min_tag_usage"] = self.ui.min_tag_usage.value()
        self.config.setting["lastfm_ignore_tags"] = unicode(self.ui.ignore_tags.text())
        self.config.setting["lastfm_join_tags"] = unicode(self.ui.join_tags.currentText())


register_track_metadata_processor(process_track)
register_options_page(LastfmOptionsPage)
Пример #11
0
        self.ui.setupUi(self)
        self.ui.code.textChanged.connect(self.check_code)

    def load(self):
        self.ui.code.setPlainText(self.config.setting["iprefersnakes_code"])

    def save(self):
        self.config.setting["iprefersnakes_code"] = self.ui.code.toPlainText()

    def check(self):
        code = self.ui.code.toPlainText()
        try:
            compile_code(code)
        except SyntaxError as e:
            raise OptionsCheckError("Compilation failure", e)

    def check_code(self):
        self.ui.code_error.setStyleSheet("")
        self.ui.code_error.setText("")
        code = self.ui.code.toPlainText()
        try:
            compile_code(code)
        except SyntaxError as e:
            # We add some lines at the top, substract them again
            e.lineno = e.lineno - 3
            self.ui.code_error.setStyleSheet(self.STYLESHEET_ERROR)
            self.ui.code_error.setText(e)


register_options_page(IPreferSnakesOptionsPage)
Пример #12
0
class MetaFlacReplayGainRemove(BaseAction):
    NAME = _("MetaFlac:: &Remove ReplayGain information from files...")
    def callback(self, objs):
        run_MetaFlac('--remove-replay-gain', get_files(objs), self.tagger)

class MetaFlacReplayGainOptionsPage(OptionsPage):
    NAME = "metaflac_rgscan"
    TITLE = "MetaFlac ReplayGain"
    PARENT = "plugins"

    options = [
        TextOption('setting', 'metaflac_rgscan_metaflac_path', get_metaflac_path()),
    ]

    def __init__(self, parent=None):
        super(MetaFlacReplayGainOptionsPage, self).__init__(parent)
        self.ui = Ui_MetaFlacReplayGainOptionsPage()
        self.ui.setupUi(self)

    def load(self):
        self.ui.metaflac_path.setText(self.config.setting['metaflac_rgscan_metaflac_path'])

    def save(self):
        self.config.setting['metaflac_rgscan_metaflac_path'] = unicode(self.ui.metaflac_path.text())

register_file_action(MetaFlacReplayGainScanTrack())
register_file_action(MetaFlacReplayGainRemove())
register_album_action(MetaFlacReplayGainScanAlbumByTags())
register_album_action(MetaFlacReplayGainRemove())
register_options_page(MetaFlacReplayGainOptionsPage)
Пример #13
0
    options = [
        BoolOption("setting", "use_proxy", False),
        TextOption("setting", "proxy_server_host", ""),
        IntOption("setting", "proxy_server_port", 80),
        TextOption("setting", "proxy_username", ""),
        TextOption("setting", "proxy_password", ""),
    ]

    def __init__(self, parent=None):
        super(ProxyOptionsPage, self).__init__(parent)
        self.ui = Ui_ProxyOptionsPage()
        self.ui.setupUi(self)

    def load(self):
        self.ui.web_proxy.setChecked(self.config.setting["use_proxy"])
        self.ui.server_host.setText(self.config.setting["proxy_server_host"])
        self.ui.server_port.setValue(self.config.setting["proxy_server_port"])
        self.ui.username.setText(self.config.setting["proxy_username"])
        self.ui.password.setText(self.config.setting["proxy_password"])

    def save(self):
        self.config.setting["use_proxy"] = self.ui.web_proxy.isChecked()
        self.config.setting["proxy_server_host"] = unicode(self.ui.server_host.text())
        self.config.setting["proxy_server_port"] = self.ui.server_port.value()
        self.config.setting["proxy_username"] = unicode(self.ui.username.text())
        self.config.setting["proxy_password"] = unicode(self.ui.password.text())
        self.tagger.xmlws.setup_proxy()


register_options_page(ProxyOptionsPage)
Пример #14
0
    SORT_ORDER = 20
    ACTIVE = True
    HELP_URL = '/config/options_ratings.html'

    options = [
        BoolOption("setting", "enable_ratings", False),
        TextOption("setting", "rating_user_email", "*****@*****.**"),
        BoolOption("setting", "submit_ratings", True),
        IntOption("setting", "rating_steps", 6),
    ]

    def __init__(self, parent=None):
        super().__init__(parent)
        self.ui = Ui_RatingsOptionsPage()
        self.ui.setupUi(self)

    def load(self):
        config = get_config()
        self.ui.enable_ratings.setChecked(config.setting["enable_ratings"])
        self.ui.rating_user_email.setText(config.setting["rating_user_email"])
        self.ui.submit_ratings.setChecked(config.setting["submit_ratings"])

    def save(self):
        config = get_config()
        config.setting["enable_ratings"] = self.ui.enable_ratings.isChecked()
        config.setting["rating_user_email"] = self.ui.rating_user_email.text()
        config.setting["submit_ratings"] = self.ui.submit_ratings.isChecked()


register_options_page(RatingsOptionsPage)
Пример #15
0
    options = [
        IntOption("setting", "bpm_slider_parameter", 1)
    ]

    def __init__(self, parent=None):
        super(BPMOptionsPage, self).__init__(parent)
        self.ui = Ui_BPMOptionsPage()
        self.ui.setupUi(self)
        self.ui.slider_parameter.valueChanged.connect(self.update_parameters)

    def load(self):
        cfg = self.config.setting
        self.ui.slider_parameter.setValue(cfg["bpm_slider_parameter"])

    def save(self):
        cfg = self.config.setting
        cfg["bpm_slider_parameter"] = self.ui.slider_parameter.value()

    def update_parameters(self):
        val = self.ui.slider_parameter.value()
        samplerate, buf_size, hop_size = [unicode(v) for v in
                                          bpm_slider_settings[val]]
        self.ui.samplerate_value.setText(samplerate)
        self.ui.win_s_value.setText(buf_size)
        self.ui.hop_s_value.setText(hop_size)


register_file_action(FileBPM())
register_options_page(BPMOptionsPage)
Пример #16
0
    def __init__(self, parent=None):
        super(CDLookupOptionsPage, self).__init__(parent)
        self.ui = Ui_CDLookupOptionsPage()
        self.ui.setupUi(self)
        if AUTO_DETECT_DRIVES:
            self.drives = get_cdrom_drives()
            self.ui.cd_lookup_device.addItems(self.drives)

    def load(self):
        if AUTO_DETECT_DRIVES:
            try:
                self.ui.cd_lookup_device.setCurrentIndex(
                    self.drives.index(config.setting["cd_lookup_device"]))
            except ValueError:
                pass
        else:
            self.ui.cd_lookup_device.setText(
                config.setting["cd_lookup_device"])

    def save(self):
        if AUTO_DETECT_DRIVES:
            config.setting["cd_lookup_device"] = unicode(
                self.ui.cd_lookup_device.currentText())
        else:
            config.setting["cd_lookup_device"] = unicode(
                self.ui.cd_lookup_device.text())


register_options_page(CDLookupOptionsPage)
Пример #17
0
        file.metadata['~primaryreleasetype'] = ['album']
        file.metadata['~secondaryreleasetype'] = ['compilation']
        file.metadata['releasestatus'] = 'official'
        file.metadata['releasecountry'] = 'US'
        file.metadata['compilation'] = '1'
        file.metadata['~extension'] = 'mp3'
        file.metadata['musicbrainz_albumid'] = 'bcc97e8a-2055-400b-a6ed-83288285c6fc'
        file.metadata['musicbrainz_albumartistid'] = '89ad4ac3-39f7-470e-963a-56509c546377'
        file.metadata['musicbrainz_artistid'] = '06704773-aafe-4aca-8833-b449e0a6467f'
        file.metadata['musicbrainz_recordingid'] = 'd92837ee-b1e4-4649-935f-e433c3e5e429'
        file.metadata['musicbrainz_releasetrackid'] = 'eac99807-93d4-3668-9714-fa0c1b487ccf'
        return file

    def move_files_to_browse(self):
        path = QtGui.QFileDialog.getExistingDirectory(self, "", self.ui.move_files_to.text())
        if path:
            path = os.path.normpath(unicode(path))
            self.ui.move_files_to.setText(path)

    def test(self):
        self.ui.renaming_error.setStyleSheet("")
        self.ui.renaming_error.setText("")
        try:
            self.check_format()
        except OptionsCheckError as e:
            self.ui.renaming_error.setStyleSheet(self.STYLESHEET_ERROR)
            self.ui.renaming_error.setText(e.info)
            return

register_options_page(RenamingOptionsPage)
Пример #18
0
                           source.items()]
        elif setting == "preferred_release_formats":
            source_list = [(c[0], ugettext_attr(c[1], u"medium_format")) for c
                           in source.items()]
        else:
            source_list = [(c[0], _(c[1])) for c in source.items()]
        source_list.sort(key=itemgetter(1), cmp=strcoll)
        saved_data = config.setting[setting]
        move = []
        for data, name in source_list:
            item = QtGui.QListWidgetItem(name)
            item.setData(QtCore.Qt.UserRole, data)
            try:
                i = saved_data.index(data)
                move.append((i, item))
            except:
                list1.addItem(item)
        move.sort(key=itemgetter(0))
        for i, item in move:
            list2.addItem(item)

    def _save_list_items(self, setting, list1):
        data = []
        for i in range(list1.count()):
            item = list1.item(i)
            data.append(unicode(item.data(QtCore.Qt.UserRole)))
        config.setting[setting] = data


register_options_page(ReleasesOptionsPage)
Пример #19
0
    options = [
        TextOption("setting", "cd_lookup_device", ""),
    ]

    def __init__(self, parent=None):
        super(CDLookupOptionsPage, self).__init__(parent)
        self.ui = Ui_CDLookupOptionsPage()
        self.ui.setupUi(self)
        if AUTO_DETECT_DRIVES:
            self.drives = get_cdrom_drives()
            self.ui.cd_lookup_device.addItems(self.drives)

    def load(self):
        if AUTO_DETECT_DRIVES:
            try:
                self.ui.cd_lookup_device.setCurrentIndex(self.drives.index(self.config.setting["cd_lookup_device"]))
            except ValueError:
                pass
        else:
            self.ui.cd_lookup_device.setText(self.config.setting["cd_lookup_device"])

    def save(self):
        if AUTO_DETECT_DRIVES:
            self.config.setting["cd_lookup_device"] = unicode(self.ui.cd_lookup_device.currentText())
        else:
            self.config.setting["cd_lookup_device"] = unicode(self.ui.cd_lookup_device.text())


register_options_page(CDLookupOptionsPage)
Пример #20
0
def register_cover_art_provider(provider):
    _cover_art_providers.register(provider.__module__, provider)
    if hasattr(provider, 'OPTIONS') and provider.OPTIONS:
        provider.OPTIONS.NAME = provider.name
        provider.OPTIONS.TITLE = provider.title
        register_options_page(provider.OPTIONS)
Пример #21
0
            button = ColorButton(color_value)
            button.color_changed.connect(partial(color_changed, color_key))
            hlayout.addWidget(button, 0, QtCore.Qt.AlignRight)

            widget.setLayout(hlayout)
            self.colors_list.addWidget(widget)

        spacerItem1 = QtWidgets.QSpacerItem(20, 40,
                                            QtWidgets.QSizePolicy.Minimum,
                                            QtWidgets.QSizePolicy.Expanding)
        self.colors_list.addItem(spacerItem1)

    def load(self):
        interface_colors.load_from_config()
        self.update_color_selectors()

    def save(self):
        if interface_colors.save_to_config():
            dialog = QtWidgets.QMessageBox(
                QtWidgets.QMessageBox.Information, _('Colors changed'),
                _('You have changed the interface colors. You may have to restart Picard in order for the changes to take effect.'
                  ), QtWidgets.QMessageBox.Ok, self)
            dialog.exec_()

    def restore_defaults(self):
        interface_colors.set_default_colors()
        self.update_color_selectors()


register_options_page(InterfaceColorsOptionsPage)
Пример #22
0
            self.config.setting["fingerprinting_system"] = "acoustid"
        else:
            self.config.setting["fingerprinting_system"] = ""
        self.config.setting["acoustid_fpcalc"] = unicode(self.ui.acoustid_fpcalc.text())
        self.config.setting["acoustid_apikey"] = unicode(self.ui.acoustid_apikey.text())

    def update_groupboxes(self):
        if self.ui.use_acoustid.isChecked():
            self.ui.acoustid_settings.setEnabled(True)
            if self.ui.acoustid_fpcalc.text().isEmpty():
                fpcalc_path = find_executable(*FPCALC_NAMES)
                if fpcalc_path:
                    self.ui.acoustid_fpcalc.setText(fpcalc_path)
        else:
            self.ui.acoustid_settings.setEnabled(False)

    def acoustid_fpcalc_browse(self):
        path = QtGui.QFileDialog.getOpenFileName(self, "", self.ui.acoustid_fpcalc.text())
        if path:
            path = os.path.normpath(unicode(path))
            self.ui.acoustid_fpcalc.setText(path)

    def acoustid_fpcalc_download(self):
        webbrowser2.open("http://acoustid.org/chromaprint#download")

    def acoustid_apikey_get(self):
        webbrowser2.open("http://acoustid.org/api-key")


register_options_page(FingerprintingOptionsPage)
Пример #23
0
                _("Error"),
                _("The location to move files to must not be empty."))

    def save(self):
        self.config.setting["move_files"] = self.ui.move_files.isChecked()
        self.config.setting["move_files_to"] = os.path.normpath(
            unicode(self.ui.move_files_to.text()))
        self.config.setting[
            "move_additional_files"] = self.ui.move_additional_files.isChecked(
            )
        self.config.setting["move_additional_files_pattern"] = unicode(
            self.ui.move_additional_files_pattern.text())
        self.config.setting[
            "delete_empty_dirs"] = self.ui.delete_empty_dirs.isChecked()
        self.tagger.window.enable_moving_action.setChecked(
            self.config.setting["move_files"])

    def move_files_to_browse(self):
        path = QtGui.QFileDialog.getExistingDirectory(
            self, "", self.ui.move_files_to.text())
        if path:
            path = os.path.normpath(unicode(path))
            self.ui.move_files_to.setText(path)

    def update_move_additional_files(self):
        self.ui.move_additional_files_pattern.setEnabled(
            self.ui.move_additional_files.isChecked())


register_options_page(MovingOptionsPage)
Пример #24
0
    def save(self):
        config.setting[
            "translate_artist_names"] = self.ui.translate_artist_names.isChecked(
            )
        config.setting["artist_locale"] = self.ui.artist_locale.itemData(
            self.ui.artist_locale.currentIndex())
        config.setting[
            "convert_punctuation"] = self.ui.convert_punctuation.isChecked()
        config.setting["release_ars"] = self.ui.release_ars.isChecked()
        config.setting["track_ars"] = self.ui.track_ars.isChecked()
        config.setting["folksonomy_tags"] = self.ui.folksonomy_tags.isChecked()
        config.setting["va_name"] = self.ui.va_name.text()
        nat_name = unicode(self.ui.nat_name.text())
        if nat_name != config.setting["nat_name"]:
            config.setting["nat_name"] = nat_name
            self.tagger.nats.update()
        config.setting[
            "standardize_artists"] = self.ui.standardize_artists.isChecked()

    def set_va_name_default(self):
        self.ui.va_name.setText(self.options[0].default)
        self.ui.va_name.setCursorPosition(0)

    def set_nat_name_default(self):
        self.ui.nat_name.setText(self.options[1].default)
        self.ui.nat_name.setCursorPosition(0)


register_options_page(MetadataOptionsPage)
Пример #25
0
        }
        instruments_example = self.build_example(instruments_credits, word_dict, settings)
        self.ui.example_instruments.setText(instruments_example)

        vocals_credits = {
            "additional solo lead vocals": ["Robert Plant"],
            "additional solo guest lead vocals": ["Sandy Denny"],
        }
        vocals_example = self.build_example(vocals_credits, word_dict, settings)
        self.ui.example_vocals.setText(vocals_example)

    @staticmethod
    def build_example(credits, word_dict, settings):
        prefix = "performer:"
        metadata = Metadata()
        for key, values in credits.items():
            rewrite_tag(prefix + key, values, metadata, word_dict, settings)

        examples = []
        for key, values in metadata.rawitems():
            credit = "%s: %s" % (key, ", ".join(values))
            if credit.startswith(prefix):
                credit = credit[len(prefix):]
            examples.append(credit)
        return "\n".join(examples)


# Register the plugin to run at a HIGH priority.
register_track_metadata_processor(format_performer_tags, priority=PluginPriority.HIGH)
register_options_page(FormatPerformerTagsOptionsPage)
Пример #26
0
    options = [
        BoolOption('setting', 'norelease_enable', False),
        TextOption('setting', 'norelease_strip_tags', 'asin,barcode,catalognumber,date,label,media,releasecountry,releasestatus'),
    ]

    def __init__(self, parent=None):
        super(NoReleaseOptionsPage, self).__init__(parent)
        self.ui = Ui_NoReleaseOptionsPage()
        self.ui.setupUi(self)

    def load(self):
        self.ui.norelease_strip_tags.setText(self.config.setting['norelease_strip_tags'])
        self.ui.norelease_enable.setChecked(self.config.setting['norelease_enable'])

    def save(self):
        self.config.setting['norelease_strip_tags'] = unicode(self.ui.norelease_strip_tags.text())
        self.config.setting['norelease_enable'] = self.ui.norelease_enable.isChecked()

def NoReleaseAlbumProcessor(tagger, metadata, release):
    if tagger.config.setting['norelease_enable']:
        strip_release_specific_metadata(tagger, metadata)

def NoReleaseTrackProcessor(tagger, metadata, track, release):
    if tagger.config.setting['norelease_enable']:
        strip_release_specific_metadata(tagger, metadata)

register_album_metadata_processor(NoReleaseAlbumProcessor)
register_track_metadata_processor(NoReleaseTrackProcessor)
register_album_action(NoReleaseAction())
register_options_page(NoReleaseOptionsPage)
Пример #27
0
    TITLE = N_("Matching")
    PARENT = "advanced"
    SORT_ORDER = 30
    ACTIVE = True

    options = [
        FloatOption("setting", "file_lookup_threshold", 0.7),
        FloatOption("setting", "cluster_lookup_threshold", 0.8),
        FloatOption("setting", "track_matching_threshold", 0.4),
    ]

    _release_type_sliders = {}

    def __init__(self, parent=None):
        super(MatchingOptionsPage, self).__init__(parent)
        self.ui = Ui_MatchingOptionsPage()
        self.ui.setupUi(self)

    def load(self):
        self.ui.file_lookup_threshold.setValue(int(self.config.setting["file_lookup_threshold"] * 100))
        self.ui.cluster_lookup_threshold.setValue(int(self.config.setting["cluster_lookup_threshold"] * 100))
        self.ui.track_matching_threshold.setValue(int(self.config.setting["track_matching_threshold"] * 100))

    def save(self):
        self.config.setting["file_lookup_threshold"] = float(self.ui.file_lookup_threshold.value()) / 100.0
        self.config.setting["cluster_lookup_threshold"] = float(self.ui.cluster_lookup_threshold.value()) / 100.0
        self.config.setting["track_matching_threshold"] = float(self.ui.track_matching_threshold.value()) / 100.0


register_options_page(MatchingOptionsPage)
Пример #28
0
class Foobar2000ReplayGainRemove(BaseAction):
    NAME = _("Foobar2000: &Remove ReplayGain information from files...")
    def callback(self, objs):
        run_foobar2000('remove', get_files(objs), self.tagger)

class Foobar2000ReplayGainOptionsPage(OptionsPage):
    NAME = "f2k_rgscan"
    TITLE = "Foobar2000 ReplayGain"
    PARENT = "plugins"

    options = [
        TextOption('setting', 'f2k_rgscan_foobar2000_path', get_foobar2000_path()),
    ]

    def __init__(self, parent=None):
        super(Foobar2000ReplayGainOptionsPage, self).__init__(parent)
        self.ui = Ui_Foobar2000ReplayGainOptionsPage()
        self.ui.setupUi(self)

    def load(self):
        self.ui.foobar2000_path.setText(self.config.setting['f2k_rgscan_foobar2000_path'])

    def save(self):
        self.config.setting['f2k_rgscan_foobar2000_path'] = unicode(self.ui.foobar2000_path.text())

register_file_action(Foobar2000ReplayGainScanTrack())
register_file_action(Foobar2000ReplayGainRemove())
register_album_action(Foobar2000ReplayGainScanAlbumByTags())
register_album_action(Foobar2000ReplayGainRemove())
register_options_page(Foobar2000ReplayGainOptionsPage)
Пример #29
0
        config.setting[
            "ignore_hidden_files"] = self.ui.ignore_hidden_files.isChecked()
        config.setting[
            "recursively_add_files"] = self.ui.recursively_add_files.isChecked(
            )
        config.setting[
            "ignore_track_duration_difference_under"] = self.ui.ignore_track_duration_difference_under.value(
            )
        config.setting[
            "completeness_ignore_videos"] = self.ui.completeness_ignore_videos.isChecked(
            )
        config.setting[
            "completeness_ignore_pregap"] = self.ui.completeness_ignore_pregap.isChecked(
            )
        config.setting[
            "completeness_ignore_data"] = self.ui.completeness_ignore_data.isChecked(
            )
        config.setting[
            "completeness_ignore_silence"] = self.ui.completeness_ignore_silence.isChecked(
            )
        tags = list(self.ui.compare_ignore_tags.tags)
        if tags != config.setting["compare_ignore_tags"]:
            config.setting["compare_ignore_tags"] = tags

    def restore_defaults(self):
        self.ui.compare_ignore_tags.clear()
        super().restore_defaults()


register_options_page(AdvancedOptionsPage)
Пример #30
0
        super(AddActionDialog, self).__init__(*args, **kwargs)

        layout = QtWidgets.QVBoxLayout(self)

        self.action_list = sorted([[_(self.parent().TOOLBAR_BUTTONS[action]['label']), action]
                                  for action in action_list])

        self.combo_box = QtWidgets.QComboBox(self)
        self.combo_box.addItems([label for label, action in self.action_list])
        layout.addWidget(self.combo_box)

        buttons = QtWidgets.QDialogButtonBox(
            QtWidgets.QDialogButtonBox.Ok | QtWidgets.QDialogButtonBox.Cancel,
            QtCore.Qt.Horizontal, self)
        buttons.accepted.connect(self.accept)
        buttons.rejected.connect(self.reject)
        layout.addWidget(buttons)

    def selected_action(self):
        return self.action_list[self.combo_box.currentIndex()][1]

    @staticmethod
    def get_selected_action(action_list, parent=None):
        dialog = AddActionDialog(action_list, parent)
        result = dialog.exec_()
        selected_action = dialog.selected_action()
        return (selected_action, result == QtWidgets.QDialog.Accepted)


register_options_page(InterfaceOptionsPage)
Пример #31
0
        TextOption("setting", "moodbar_wav_command", "moodbar"),
        TextOption("setting", "moodbar_wav_options", "-o")
    ]

    def __init__(self, parent=None):
        super(MoodbarOptionsPage, self).__init__(parent)
        self.ui = Ui_MoodbarOptionsPage()
        self.ui.setupUi(self)

    def load(self):
        self.ui.vorbis_command.setText(
            self.config.setting["moodbar_vorbis_command"])
        self.ui.mp3_command.setText(self.config.setting["moodbar_mp3_command"])
        self.ui.flac_command.setText(
            self.config.setting["moodbar_flac_command"])
        self.ui.wav_command.setText(self.config.setting["moodbar_wav_command"])

    def save(self):
        self.config.setting["moodbar_vorbis_command"] = unicode(
            self.ui.vorbis_command.text())
        self.config.setting["moodbar_mp3_command"] = unicode(
            self.ui.mp3_command.text())
        self.config.setting["moodbar_flac_command"] = unicode(
            self.ui.flac_command.text())
        self.config.setting["moodbar_wav_command"] = unicode(
            self.ui.wav_command.text())


register_file_action(MoodBar())
register_options_page(MoodbarOptionsPage)
Пример #32
0
        if extractor_path:
            version = ab_check_version(extractor_path)
            if version:
                if try_find:
                    # extractor path will not be saved to config file if it was auto-detected
                    self.ui.acousticbrainz_extractor.clear()
                    self.ui.acousticbrainz_extractor.setPlaceholderText(extractor_path)
                self._acousticbrainz_extractor_set_success(_("Extractor version: %s") % version)
                return
        self._acousticbrainz_extractor_set_error()

    def _acousticbrainz_extractor_set_success(self, version):
        self._extractor_valid = True
        self.ui.acousticbrainz_extractor_info.setStyleSheet("")
        self.ui.acousticbrainz_extractor_info.setText(version)

    def _acousticbrainz_extractor_set_error(self):
        self._extractor_valid = False
        self.ui.acousticbrainz_extractor_info.setStyleSheet(self.STYLESHEET_ERROR)
        self.ui.acousticbrainz_extractor_info.setText(_("Please select a valid extractor executable."))

    def check(self):
        if not self._extractor_valid:
            raise OptionsCheckError(_("Invalid extractor executable"), _("Please select a valid extractor executable."))

    def display_error(self, error):
        pass


register_options_page(AcousticBrainzOptionsPage)
Пример #33
0
            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)


register_options_page(TagsOptionsPage)
Пример #34
0
        config.IntOption("setting", "min_tag_usage", 90),
        config.TextOption("setting", "ignore_tags", "seen live,favorites,fixme,owned"),
        config.TextOption("setting", "join_tags", ""),
        config.BoolOption("setting", "only_my_tags", False),
        config.BoolOption("setting", "artists_tags", False),
    ]

    def __init__(self, parent=None):
        super(FolksonomyOptionsPage, self).__init__(parent)
        self.ui = Ui_FolksonomyOptionsPage()
        self.ui.setupUi(self)

    def load(self):
        self.ui.max_tags.setValue(config.setting["max_tags"])
        self.ui.min_tag_usage.setValue(config.setting["min_tag_usage"])
        self.ui.join_tags.setEditText(config.setting["join_tags"])
        self.ui.ignore_tags.setText(config.setting["ignore_tags"])
        self.ui.only_my_tags.setChecked(config.setting["only_my_tags"])
        self.ui.artists_tags.setChecked(config.setting["artists_tags"])

    def save(self):
        config.setting["max_tags"] = self.ui.max_tags.value()
        config.setting["min_tag_usage"] = self.ui.min_tag_usage.value()
        config.setting["join_tags"] = self.ui.join_tags.currentText()
        config.setting["ignore_tags"] = self.ui.ignore_tags.text()
        config.setting["only_my_tags"] = self.ui.only_my_tags.isChecked()
        config.setting["artists_tags"] = self.ui.artists_tags.isChecked()


register_options_page(FolksonomyOptionsPage)
Пример #35
0
            update=update,
            plugin_name=plugin.module_name,
            plugin_data=response,
        )

    @staticmethod
    def open_plugin_dir():
        if sys.platform == 'win32':
            url = 'file:///' + USER_PLUGIN_DIR
        else:
            url = 'file://' + USER_PLUGIN_DIR
        QtGui.QDesktopServices.openUrl(
            QtCore.QUrl(url, QtCore.QUrl.TolerantMode))

    def mimeTypes(self):
        return ["text/uri-list"]

    def dragEnterEvent(self, event):
        event.setDropAction(QtCore.Qt.CopyAction)
        event.accept()

    def dropEvent(self, event):
        for path in [
                os.path.normpath(u.toLocalFile())
                for u in event.mimeData().urls()
        ]:
            self.manager.install_plugin(path)


register_options_page(PluginsOptionsPage)
Пример #36
0
        babel_415_workaround_list = []
        for action in action_list:
            babel_415_workaround = self.parent(
            ).TOOLBAR_BUTTONS[action]['label']
            babel_415_workaround_list.append([_(babel_415_workaround), action])
        self.action_list = sorted(babel_415_workaround_list)

        self.combo_box = QtWidgets.QComboBox(self)
        self.combo_box.addItems([label for label, action in self.action_list])
        layout.addWidget(self.combo_box)

        buttons = QtWidgets.QDialogButtonBox(
            QtWidgets.QDialogButtonBox.Ok | QtWidgets.QDialogButtonBox.Cancel,
            QtCore.Qt.Horizontal, self)
        buttons.accepted.connect(self.accept)
        buttons.rejected.connect(self.reject)
        layout.addWidget(buttons)

    def selected_action(self):
        return self.action_list[self.combo_box.currentIndex()][1]

    @staticmethod
    def get_selected_action(action_list, parent=None):
        dialog = AddActionDialog(action_list, parent)
        result = dialog.exec_()
        selected_action = dialog.selected_action()
        return (selected_action, result == QtWidgets.QDialog.Accepted)


register_options_page(InterfaceOptionsPage)
Пример #37
0
        config.FloatOption("setting", "file_lookup_threshold", 0.7),
        config.FloatOption("setting", "cluster_lookup_threshold", 0.7),
        config.FloatOption("setting", "track_matching_threshold", 0.4),
    ]

    _release_type_sliders = {}

    def __init__(self, parent=None):
        super().__init__(parent)
        self.ui = Ui_MatchingOptionsPage()
        self.ui.setupUi(self)

    def load(self):
        self.ui.file_lookup_threshold.setValue(
            int(config.setting["file_lookup_threshold"] * 100))
        self.ui.cluster_lookup_threshold.setValue(
            int(config.setting["cluster_lookup_threshold"] * 100))
        self.ui.track_matching_threshold.setValue(
            int(config.setting["track_matching_threshold"] * 100))

    def save(self):
        config.setting["file_lookup_threshold"] = float(
            self.ui.file_lookup_threshold.value()) / 100.0
        config.setting["cluster_lookup_threshold"] = float(
            self.ui.cluster_lookup_threshold.value()) / 100.0
        config.setting["track_matching_threshold"] = float(
            self.ui.track_matching_threshold.value()) / 100.0


register_options_page(MatchingOptionsPage)
Пример #38
0
    options = [
        IntOption("setting", "max_tags", 5),
        IntOption("setting", "min_tag_usage", 90),
        TextOption("setting", "ignore_tags",
                   "seen live,favorites,fixme,owned"),
        TextOption("setting", "join_tags", ""),
        BoolOption("setting", "only_my_tags", False),
    ]

    def __init__(self, parent=None):
        super(FolksonomyOptionsPage, self).__init__(parent)
        self.ui = Ui_FolksonomyOptionsPage()
        self.ui.setupUi(self)

    def load(self):
        self.ui.max_tags.setValue(self.config.setting["max_tags"])
        self.ui.min_tag_usage.setValue(self.config.setting["min_tag_usage"])
        self.ui.join_tags.setEditText(self.config.setting["join_tags"])
        self.ui.ignore_tags.setText(self.config.setting["ignore_tags"])
        self.ui.only_my_tags.setChecked(self.config.setting["only_my_tags"])

    def save(self):
        self.config.setting["max_tags"] = self.ui.max_tags.value()
        self.config.setting["min_tag_usage"] = self.ui.min_tag_usage.value()
        self.config.setting["join_tags"] = self.ui.join_tags.currentText()
        self.config.setting["ignore_tags"] = self.ui.ignore_tags.text()
        self.config.setting["only_my_tags"] = self.ui.only_my_tags.isChecked()


register_options_page(FolksonomyOptionsPage)
Пример #39
0
    ]

    def __init__(self, parent=None):
        super(LastfmOptionsPage, self).__init__(parent)
        self.ui = Ui_LastfmOptionsPage()
        self.ui.setupUi(self)

    def load(self):
        setting = config.setting
        self.ui.use_track_tags.setChecked(setting["lastfm_use_track_tags"])
        self.ui.use_artist_tags.setChecked(setting["lastfm_use_artist_tags"])
        self.ui.min_tag_usage.setValue(setting["lastfm_min_tag_usage"])
        self.ui.ignore_tags.setText(setting["lastfm_ignore_tags"])
        self.ui.join_tags.setEditText(setting["lastfm_join_tags"])

    def save(self):
        global _cache
        setting = config.setting
        if setting["lastfm_min_tag_usage"] != self.ui.min_tag_usage.value() \
           or setting["lastfm_ignore_tags"] != str(self.ui.ignore_tags.text()):
            _cache = {}
        setting["lastfm_use_track_tags"] = self.ui.use_track_tags.isChecked()
        setting["lastfm_use_artist_tags"] = self.ui.use_artist_tags.isChecked()
        setting["lastfm_min_tag_usage"] = self.ui.min_tag_usage.value()
        setting["lastfm_ignore_tags"] = str(self.ui.ignore_tags.text())
        setting["lastfm_join_tags"] = str(self.ui.join_tags.currentText())


register_track_metadata_processor(process_track)
register_options_page(LastfmOptionsPage)
Пример #40
0
        self.ui = Ui_AdvancedOptionsPage()
        self.ui.setupUi(self)
        self.ui.ignore_regex.textChanged.connect(self.live_checker)

    def load(self):
        self.ui.ignore_regex.setText(config.setting["ignore_regex"])
        self.ui.ignore_hidden_files.setChecked(config.setting["ignore_hidden_files"])

    def save(self):
        config.setting["ignore_regex"] = unicode(self.ui.ignore_regex.text())
        config.setting["ignore_hidden_files"] = self.ui.ignore_hidden_files.isChecked()

    def live_checker(self, text):
        self.ui.regex_error.setStyleSheet("")
        self.ui.regex_error.setText("")
        try:
            self.check()
        except OptionsCheckError as e:
            self.ui.regex_error.setStyleSheet(self.STYLESHEET_ERROR)
            self.ui.regex_error.setText(e.info)
            return

    def check(self):
        try:
            re.compile(unicode(self.ui.ignore_regex.text()))
        except re.error as e:
            raise OptionsCheckError(_("Regex Error"), str(e))


register_options_page(AdvancedOptionsPage)
Пример #41
0
class EchoNestOptionsPage(OptionsPage):
    NAME = "echonest"
    TITLE = "echonest"
    PARENT = "plugins"

    options = [
        BoolOption("setting", "echonest_upload", False),
        BoolOption("setting", "echonest_artist_title_lookup", True),
        FloatOption("setting", "echonest_duration_diff", 5.0),
    ]

    def __init__(self, parent=None):
        super(EchoNestOptionsPage, self).__init__(parent)
        self.ui = Ui_EchoNestOptionsPage()
        self.ui.setupUi(self)

    def load(self):
        #self.ui.echonest_upload.setChecked(self.config.setting["echonest_upload"])
        self.ui.echonest_artist_title_lookup.setChecked(self.config.setting["echonest_artist_title_lookup"])
        #self.ui.echonest_duration_diff.setChecked(self.config.setting["echonest_duration_diff"])

    def save(self):
        #self.config.setting["echonest_upload"] = self.ui.echonest_upload.isChecked()
        self.config.setting["echonest_artist_title_lookup"] = self.ui.echonest_artist_title_lookup.isChecked()
        #self.config.setting["echonest_duration_diff"] = self.ui.echonest_duration_diff.value()

register_track_metadata_processor(process_track)
register_options_page(EchoNestOptionsPage)

# eof
Пример #42
0
    NAME = "ratings"
    TITLE = N_("Ratings")
    PARENT = "metadata"
    SORT_ORDER = 20
    ACTIVE = True

    options = [
        config.BoolOption("setting", "enable_ratings", False),
        config.TextOption("setting", "rating_user_email", "*****@*****.**"),
        config.BoolOption("setting", "submit_ratings", True),
        config.IntOption("setting", "rating_steps", 6),
    ]

    def __init__(self, parent=None):
        super().__init__(parent)
        self.ui = Ui_RatingsOptionsPage()
        self.ui.setupUi(self)

    def load(self):
        self.ui.enable_ratings.setChecked(config.setting["enable_ratings"])
        self.ui.rating_user_email.setText(config.setting["rating_user_email"])
        self.ui.submit_ratings.setChecked(config.setting["submit_ratings"])

    def save(self):
        config.setting["enable_ratings"] = self.ui.enable_ratings.isChecked()
        config.setting["rating_user_email"] = self.ui.rating_user_email.text()
        config.setting["submit_ratings"] = self.ui.submit_ratings.isChecked()


register_options_page(RatingsOptionsPage)
Пример #43
0
    options = [BoolOption(r'setting', r'purgeUnmapped', False)]

    def __init__(self, parent=None):
        super().__init__(parent)
        self.box = QtWidgets.QVBoxLayout(self)
        self.purgeUnmapped = QtWidgets.QCheckBox(self)
        self.purgeUnmapped.setCheckable(True)
        self.purgeUnmapped.setChecked(False)
        self.purgeUnmapped.setText(r'Purge non-standard tags left unmapped')
        self.box.addWidget(self.purgeUnmapped)
        self.spacer = QtWidgets.QSpacerItem(0, 0,
                                            QtWidgets.QSizePolicy.Minimum,
                                            QtWidgets.QSizePolicy.Expanding)
        self.box.addItem(self.spacer)

    def load(self):
        self.purgeUnmapped.setChecked(config.setting[r'purgeUnmapped'])

    def save(self):
        config.setting[r'purgeUnmapped'] = self.purgeUnmapped.isChecked()


register_file_post_addition_to_track_processor(AutoMapper().processFile,
                                               priority=PluginPriority.HIGH)
register_file_post_load_processor(AutoMapper().processFileOnLoad,
                                  priority=110)  # 110 > HIGH
register_file_post_save_processor(AutoMapper().processFileAfterSaving,
                                  priority=PluginPriority.HIGH)
# register_track_metadata_processor(AutoMapper().process)
register_options_page(AutoMapperOptionsPage)
Пример #44
0
    def save(self):
        if not self.ui.enable_cleanup.checkState() == QtCore.Qt.Checked:
            return
        to_remove = set(self.selected_options())
        if to_remove and QtWidgets.QMessageBox.question(
                self,
                _('Confirm Remove'),
                _("Are you sure you want to remove the selected option settings?"
                  ),
        ) == QtWidgets.QMessageBox.Yes:
            config = get_config()
            for item in to_remove:
                Option.add_if_missing('setting', item, None)
                log.warning("Removing option setting '%s' from the INI file.",
                            item)
                config.setting.remove(item)

    def make_setting_value_text(self, key):
        config = get_config()
        value = config.setting.raw_value(key)
        return repr(value)

    def enable_cleanup_changed(self):
        state = self.ui.enable_cleanup.checkState()
        self.ui.select_all.setEnabled(state)
        self.ui.tableWidget.setEnabled(state)


register_options_page(MaintenanceOptionsPage)
Пример #45
0
def register_cover_art_provider(provider):
    _cover_art_providers.register(provider.__module__, provider)
    if hasattr(provider, 'OPTIONS') and provider.OPTIONS:
        provider.OPTIONS.NAME = provider.name
        provider.OPTIONS.TITLE = provider.title
        register_options_page(provider.OPTIONS)
Пример #46
0
    def live_checker(self):
        self.ui.script_error.setStyleSheet("")
        self.ui.script_error.setText("")
        try:
            self.check()
        except OptionsCheckError as e:
            self.ui.script_error.setStyleSheet(self.STYLESHEET_ERROR)
            self.ui.script_error.setText(e.info)
            return

    def check(self):
        parser = ScriptParser()
        try:
            parser.eval(unicode(self.ui.tagger_script.toPlainText()))
        except Exception as e:
            raise OptionsCheckError(_("Script Error"), str(e))

    def load(self):
        self.ui.enable_tagger_script.setChecked(config.setting["enable_tagger_script"])
        self.ui.tagger_script.document().setPlainText(config.setting["tagger_script"])

    def save(self):
        config.setting["enable_tagger_script"] = self.ui.enable_tagger_script.isChecked()
        config.setting["tagger_script"] = self.ui.tagger_script.toPlainText()

    def display_error(self, error):
        pass


register_options_page(ScriptingOptionsPage)
Пример #47
0
        self.ui.browser_integration.setChecked(config.setting["browser_integration"])
        self.ui.browser_integration_port.setValue(config.setting["browser_integration_port"])
        self.ui.browser_integration_localhost_only.setChecked(config.setting["browser_integration_localhost_only"])
        QtCore.QObject.connect(
            self.ui.browser_integration_port, QtCore.SIGNAL("valueChanged(int)"), self.change_browser_integration_port
        )

    def save(self):
        config.setting["use_proxy"] = self.ui.web_proxy.isChecked()
        config.setting["proxy_server_host"] = unicode(self.ui.server_host.text())
        config.setting["proxy_server_port"] = self.ui.server_port.value()
        config.setting["proxy_username"] = unicode(self.ui.username.text())
        config.setting["proxy_password"] = unicode(self.ui.password.text())
        self.tagger.xmlws.setup_proxy()
        config.setting["browser_integration"] = self.ui.browser_integration.isChecked()
        config.setting["browser_integration_port"] = self.ui.browser_integration_port.value()
        config.setting["browser_integration_localhost_only"] = self.ui.browser_integration_localhost_only.isChecked()
        self.update_browser_integration()

    def update_browser_integration(self):
        if self.ui.browser_integration.isChecked():
            self.tagger.browser_integration.start()
        else:
            self.tagger.browser_integration.stop()

    def change_browser_integration_port(self, port):
        config.setting["browser_integration_port"] = self.ui.browser_integration_port.value()


register_options_page(NetworkOptionsPage)
Пример #48
0
            last_selected_script.setSelected(True)

        self.restore_state()

    def _all_scripts(self):
        for row in range(0, self.ui.script_list.count()):
            item = self.ui.script_list.item(row)
            yield item.get_all()

    @restore_method
    def restore_state(self):
        # Preserve previous splitter position
        self.ui.splitter.restoreState(config.persist["scripting_splitter"])

    def save(self):
        config.setting[
            "enable_tagger_scripts"] = self.ui.enable_tagger_scripts.isChecked(
            )
        config.setting["list_of_scripts"] = list(self._all_scripts())
        config.persist[
            "last_selected_script_pos"] = self.ui.script_list.currentRow()
        config.persist["scripting_splitter"] = self.ui.splitter.saveState()

    def display_error(self, error):
        # Ignore scripting errors, those are handled inline
        if not isinstance(error, ScriptCheckError):
            super().display_error(error)


register_options_page(ScriptingOptionsPage)
Пример #49
0
        config.setting["acoustid_fpcalc"] = unicode(
            self.ui.acoustid_fpcalc.text())
        config.setting["acoustid_apikey"] = unicode(
            self.ui.acoustid_apikey.text())

    def update_groupboxes(self):
        if self.ui.use_acoustid.isChecked():
            self.ui.acoustid_settings.setEnabled(True)
            if not self.ui.acoustid_fpcalc.text():
                fpcalc_path = find_executable(*FPCALC_NAMES)
                if fpcalc_path:
                    self.ui.acoustid_fpcalc.setText(fpcalc_path)
        else:
            self.ui.acoustid_settings.setEnabled(False)

    def acoustid_fpcalc_browse(self):
        path = QtGui.QFileDialog.getOpenFileName(
            self, "", self.ui.acoustid_fpcalc.text())
        if path:
            path = os.path.normpath(unicode(path))
            self.ui.acoustid_fpcalc.setText(path)

    def acoustid_fpcalc_download(self):
        webbrowser2.goto('chromaprint')

    def acoustid_apikey_get(self):
        webbrowser2.goto('acoustid_apikey')


register_options_page(FingerprintingOptionsPage)
Пример #50
0
        config.BoolOption("setting", "folksonomy_tags", False),
    ]

    def __init__(self, parent=None):
        super().__init__(parent)
        self.ui = Ui_GenresOptionsPage()
        self.ui.setupUi(self)

    def load(self):
        self.ui.use_genres.setChecked(config.setting["use_genres"])
        self.ui.max_genres.setValue(config.setting["max_genres"])
        self.ui.min_genre_usage.setValue(config.setting["min_genre_usage"])
        self.ui.join_genres.setEditText(config.setting["join_genres"])
        self.ui.ignore_genres.setText(config.setting["ignore_genres"])
        self.ui.only_my_genres.setChecked(config.setting["only_my_genres"])
        self.ui.artists_genres.setChecked(config.setting["artists_genres"])
        self.ui.folksonomy_tags.setChecked(config.setting["folksonomy_tags"])

    def save(self):
        config.setting["use_genres"] = self.ui.use_genres.isChecked()
        config.setting["max_genres"] = self.ui.max_genres.value()
        config.setting["min_genre_usage"] = self.ui.min_genre_usage.value()
        config.setting["join_genres"] = self.ui.join_genres.currentText()
        config.setting["ignore_genres"] = self.ui.ignore_genres.text()
        config.setting["only_my_genres"] = self.ui.only_my_genres.isChecked()
        config.setting["artists_genres"] = self.ui.artists_genres.isChecked()
        config.setting["folksonomy_tags"] = self.ui.folksonomy_tags.isChecked()


register_options_page(GenresOptionsPage)
Пример #51
0
            return

        self.manager.install_plugin(
            None,
            update=update,
            plugin_name=plugin.module_name,
            plugin_data=response,
        )

    @staticmethod
    def open_plugin_dir():
        if sys.platform == 'win32':
            url = 'file:///' + USER_PLUGIN_DIR
        else:
            url = 'file://' + USER_PLUGIN_DIR
        QtGui.QDesktopServices.openUrl(QtCore.QUrl(url, QtCore.QUrl.TolerantMode))

    def mimeTypes(self):
        return ["text/uri-list"]

    def dragEnterEvent(self, event):
        event.setDropAction(QtCore.Qt.CopyAction)
        event.accept()

    def dropEvent(self, event):
        for path in [os.path.normpath(u.toLocalFile()) for u in event.mimeData().urls()]:
            self.manager.install_plugin(path)


register_options_page(PluginsOptionsPage)
Пример #52
0
        TextOption("setting", "replaygain_vorbisgain_command", "vorbisgain"),
        TextOption("setting", "replaygain_vorbisgain_options", "-asf"),
        TextOption("setting", "replaygain_mp3gain_command", "mp3gain"),
        TextOption("setting", "replaygain_mp3gain_options", "-a -s i"),
        TextOption("setting", "replaygain_metaflac_command", "metaflac"),
        TextOption("setting", "replaygain_metaflac_options", "--add-replay-gain"),
        TextOption("setting", "replaygain_wvgain_command", "wvgain"),
        TextOption("setting", "replaygain_wvgain_options", "-a")
    ]

    def __init__(self, parent=None):
        super(ReplayGainOptionsPage, self).__init__(parent)
        self.ui = Ui_ReplayGainOptionsPage()
        self.ui.setupUi(self)

    def load(self):
        self.ui.vorbisgain_command.setText(self.config.setting["replaygain_vorbisgain_command"])
        self.ui.mp3gain_command.setText(self.config.setting["replaygain_mp3gain_command"])
        self.ui.metaflac_command.setText(self.config.setting["replaygain_metaflac_command"])
        self.ui.wvgain_command.setText(self.config.setting["replaygain_wvgain_command"])

    def save(self):
        self.config.setting["replaygain_vorbisgain_command"] = unicode(self.ui.vorbisgain_command.text())
        self.config.setting["replaygain_mp3gain_command"] = unicode(self.ui.mp3gain_command.text())
        self.config.setting["replaygain_metaflac_command"] = unicode(self.ui.metaflac_command.text())
        self.config.setting["replaygain_wvgain_command"] = unicode(self.ui.wvgain_command.text())

register_file_action(ReplayGain())
register_album_action(AlbumGain())
register_options_page(ReplayGainOptionsPage)
Пример #53
0
        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()


register_options_page(GeneralOptionsPage)
Пример #54
0
        else:
            source_list = [(c[0], _(c[1])) for c in source.items()]

        def fcmp(x):
            return strxfrm(x[1])

        source_list.sort(key=fcmp)
        saved_data = config.setting[setting]
        move = []
        for data, name in source_list:
            item = QtWidgets.QListWidgetItem(name)
            item.setData(QtCore.Qt.UserRole, data)
            try:
                i = saved_data.index(data)
                move.append((i, item))
            except BaseException:
                list1.addItem(item)
        move.sort(key=itemgetter(0))
        for i, item in move:
            list2.addItem(item)

    def _save_list_items(self, setting, list1):
        data = []
        for i in range(list1.count()):
            item = list1.item(i)
            data.append(item.data(QtCore.Qt.UserRole))
        config.setting[setting] = data


register_options_page(ReleasesOptionsPage)
Пример #55
0
        args["formats"] = ", ".join(formats)

        # TR: Replace this with your name to have it appear in the "About" dialog.
        args["translator-credits"] = _("translator-credits")
        if args["translator-credits"] != "translator-credits":
            # TR: Replace LANG with language you are translatig to.
            args["translator-credits"] = _("<br/>Translated to LANG by %s") % args["translator-credits"].replace("\n", "<br/>")
        else:
            args["translator-credits"] = ""

        text = _(u"""<p align="center"><span style="font-size:15px;font-weight:bold;">MusicBrainz Picard</span><br/>
Version %(version)s</p>
<p align="center"><small>
PyQt %(pyqt-version)s<br/>
Mutagen %(mutagen-version)s<br/>
Discid %(discid-version)s
</small></p>
<p align="center"><strong>Supported formats</strong><br/>%(formats)s</p>
<p align="center"><strong>Please donate</strong><br/>
Thank you for using Picard. Picard relies on the MusicBrainz database, which is operated by the MetaBrainz Foundation with the help of thousands of volunteers. If you like this application please consider donating to the MetaBrainz Foundation to keep the service running.</p>
<p align="center"><a href="http://metabrainz.org/donate">Donate now!</a></p>
<p align="center"><strong>Credits</strong><br/>
<small>Copyright © 2004-2011 Robert Kaye, Lukáš Lalinský and others%(translator-credits)s</small></p>
<p align="center"><a href="http://musicbrainz.org/doc/MusicBrainz_Picard">http://musicbrainz.org/doc/MusicBrainz_Picard</a></p>
""") % args
        self.ui.label.setOpenExternalLinks(True)
        self.ui.label.setText(text)


register_options_page(AboutOptionsPage)
Пример #56
0
        file.metadata[
            'musicbrainz_recordingid'] = u'b3c487cb-0e55-477d-8df3-01ec6590f099'
        file.metadata[
            'musicbrainz_releasetrackid'] = u'f8649a05-da39-39ba-957c-7abf8f9012be'
        file.metadata[
            'musicbrainz_albumartistid'] = u'89ad4ac3-39f7-470e-963a-56509c546377'
        file.metadata['musicbrainz_artistid'] = [
            u'7b593455-d207-482c-8c6f-19ce22c94679',
            u'9e082466-2390-40d1-891e-4803531f43fd'
        ]
        return file

    def move_files_to_browse(self):
        path = QtGui.QFileDialog.getExistingDirectory(
            self, "", self.ui.move_files_to.text())
        if path:
            path = os.path.normpath(unicode(path))
            self.ui.move_files_to.setText(path)

    def test(self):
        self.ui.renaming_error.setStyleSheet("")
        self.ui.renaming_error.setText("")
        try:
            self.check_format()
        except OptionsCheckError as e:
            self.ui.renaming_error.setStyleSheet(self.STYLESHEET_ERROR)
            self.ui.renaming_error.setText(e.info)
            return

register_options_page(RenamingOptionsPage)
Пример #57
0
def register_cover_art_provider(provider):
    _cover_art_providers.register(provider.__module__, provider)
    if hasattr(provider, "OPTIONS") and provider.OPTIONS:
        provider.OPTIONS.NAME = provider.NAME
        provider.OPTIONS.TITLE = provider.TITLE or provider.NAME
        register_options_page(provider.OPTIONS)