class Config(object): _config = PluginConfig(__name__) elapsed_color = ConfProp(_config, "elapsed_color", "") hover_color = ConfProp(_config, "hover_color", "") remaining_color = ConfProp(_config, "remaining_color", "") max_data_points = IntConfProp(_config, "max_data_points", 3000)
class Config: _config = PluginConfig("autoupdatetagsinfiles") update_strategy = IntConfProp(_config, "update_strategy", UpdateStrategy.AFTER_PLAY_NOT_SKIP.value) ensure_play_counts_above_zero = BoolConfProp( # useful for searching _config, "ensure_play_counts_above_zero", False)
class Config: plugin_config = PluginConfig(DownloadCoverArt.PLUGIN_ID.replace(" ", "_")) preview_size = IntConfProp(plugin_config, "preview_size", 500) save_pattern = ConfProp(plugin_config, "save_pattern", "folder.%(ext)") over_scale = BoolConfProp(plugin_config, "preview_over_scale", True) re_encode = BoolConfProp(plugin_config, "re_encode", False) jpg_quality = IntConfProp(plugin_config, "jpeg_quality", 95)
def get_config(): pc = PluginConfig("brainz") defaults = pc.defaults defaults.set("client_id", "") defaults.set("client_secret", "") return pc
class Config(object): _config = PluginConfig(__name__) elapsed_color = ConfProp(_config, "elapsed_color", "") hover_color = ConfProp(_config, "hover_color", "") remaining_color = ConfProp(_config, "remaining_color", "") show_current_pos = BoolConfProp(_config, "show_current_pos", False) max_data_points = IntConfProp(_config, "max_data_points", 3000)
class LyricsWindowConfig(object): plugin_conf = PluginConfig(prefix) alternate_search_url = ConfProp(plugin_conf, "alternate_search_url", DEFAULT_ALTERNATE_SEARCH_URL) alternate_search_enabled = BoolConfProp(plugin_conf, "alternate_search_enabled", True) zoom_level = FloatConfProp(plugin_conf, "zoom_level", 1.4)
class Config(object): _config = PluginConfig(__name__) elapsed_color = ConfProp(_config, "elapsed_color", "") hover_color = ConfProp(_config, "hover_color", "") remaining_color = ConfProp(_config, "remaining_color", "") show_current_pos = BoolConfProp(_config, "show_current_pos", False) seek_amount = IntConfProp(_config, "seek_amount", 5000) max_data_points = IntConfProp(_config, "max_data_points", 3000) show_time_labels = BoolConfProp(_config, "show_time_labels", True)
def get_config(): pc = PluginConfig("brainz") defaults = pc.defaults defaults.set("year_only", False) defaults.set("albumartist", True) defaults.set("artist_sort", False) defaults.set("standard", True) return pc
def _get_plugin_config(): # migrate option if config.has_option('plugins', 'trayicon_window_hide'): value = config.getboolean('plugins', 'trayicon_window_hide') config.remove_option('plugins', 'trayicon_window_hide') config.set('plugins', 'icon_window_hide', value) pconfig = PluginConfig("icon") pconfig.defaults.set("window_hide", True) pconfig.defaults.set("tooltip", DEFAULT_PATTERN) pconfig.defaults.set("modifier_swap", False) return pconfig
class LyricsWindowConfig(object): plugin_conf = PluginConfig(prefix) alternate_search_url = ConfProp(plugin_conf, "alternate_search_url", DEFAULT_ALTERNATE_SEARCH_URL) alternate_search_enabled = BoolConfProp(plugin_conf, "alternate_search_enabled", True) zoom_level = FloatConfProp(plugin_conf, "zoom_level", 1.4) width = IntConfProp(plugin_conf, "width", 500) height = IntConfProp(plugin_conf, "height", 500) x = IntConfProp(plugin_conf, "x", 0) y = IntConfProp(plugin_conf, "y", 0)
class Config(object): _config = PluginConfig(__name__) high_res = BoolConfProp(_config, "high_res", True) elapsed_color = ConfProp(_config, "elapsed_color", "") max_data_points = IntConfProp(_config, "max_data_points", 3000) @property def line_width(self): return 1 if self.high_res else 2 @property def data_size(self): return self.max_data_points / self.line_width
class AnimOsdConfig(object): plugin_conf = PluginConfig(prefix) font = ConfProp(plugin_conf, "font", "Sans 22") string = ConfProp(plugin_conf, "string", DEFAULT_PATTERN) pos_y = FloatConfProp(plugin_conf, "pos_y", 0.0) corners = IntConfProp(plugin_conf, "corners", 1) delay = IntConfProp(plugin_conf, "delay", 2500) monitor = IntConfProp(plugin_conf, "monitor", 0) align = IntConfProp(plugin_conf, "align", 1) coversize = IntConfProp(plugin_conf, "coversize", 120) text = ColorConfProp(plugin_conf, "text", (0.9, 0.9, 0.9, 0.0)) outline = ColorConfProp(plugin_conf, "outline", (-1.0, 0.0, 0.0, 0.2)) shadow = ColorConfProp(plugin_conf, "shadow", (-1.0, 0.0, 0.0, 0.1)) fill = ColorConfProp(plugin_conf, "fill", (0.25, 0.25, 0.25, 0.5))
class Config: _config = PluginConfig(_PLUGIN_ID) need_user_check_if_number_of_albums_differs = BoolConfProp( # _config, "need_user_check_if_number_of_albums_differs", True) need_user_check_if_number_of_tracks_differs = BoolConfProp( # _config, "need_user_check_if_number_of_tracks_differs", True) max_track_similarity_to_need_user_check = FloatConfProp( # _config, "max_track_similarity_to_need_user_check", 0.76) max_album_similarity_to_need_user_check = FloatConfProp( # _config, "max_album_similarity_to_need_user_check", 0.80) delete_exports_after_importing = BoolConfProp( # _config, "delete_exports_after_importing", True) pretty_print_json = BoolConfProp(_config, "pretty_print_json", False)
from quodlibet.plugins import PluginConfig from quodlibet.qltk.entry import ValidatingEntry, UndoEntry from quodlibet.qltk.msg import Message from quodlibet.qltk import Icons from quodlibet.util.dprint import print_d from quodlibet.util.picklehelper import pickle_load, pickle_dump, PickleError import csv from io import StringIO from . import listenbrainz DEFAULT_TITLEPAT = '<title><version| (<version>)>' DEFAULT_ARTISTPAT = '<artist|<artist>|<composer|<composer>|<performer>>>' plugin_config = PluginConfig("listenbrainz") defaults = plugin_config.defaults #defaults.set("endpoint", "https://api.listenbrainz.org") defaults.set("user_token", "") defaults.set("titlepat", "") defaults.set("artistpat", "") defaults.set("exclude", "") defaults.set("offline", False) defaults.set("tags", "") def config_get_title_pattern(): return plugin_config.get('titlepat') or DEFAULT_TITLEPAT
# 2017 Christoph Reiter # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. from gi.repository import Gtk from quodlibet import _, print_d from quodlibet.order import OrderInOrder from quodlibet.plugins import PluginConfig from quodlibet.plugins.playorder import ShufflePlugin from quodlibet.qltk import Icons pconfig = PluginConfig("skip_songs") pconfig.defaults.set("threshold", 0.0) class SkipZeros(ShufflePlugin, OrderInOrder): PLUGIN_ID = "skip_songs" PLUGIN_NAME = _("Skip Songs") PLUGIN_ICON = Icons.GO_JUMP PLUGIN_DESC = _("Playback skips over songs with a rating equal or below a " "given threshold.") @classmethod def PluginPreferences(self, window): vb = Gtk.VBox(spacing=10) vb.set_border_width(0)
class Config: _config = PluginConfig(__name__) DEFAULT_PATTERN = "<artist~title>" default_pattern = ConfProp(_config, "default_pattern", DEFAULT_PATTERN)
def test_defaults(self): c = PluginConfig("some") c.defaults.set("hm", "mh") self.assertEqual(c.get("hm"), "mh")
def test_mapping(self): c = PluginConfig("some") c.set("foo", "bar") self.assertEqual(config.get("plugins", "some_foo"), "bar")
class DiscordStatusConfig: _config = PluginConfig(__name__) rp_line1 = ConfProp(_config, "rp_line1", CONFIG_DEFAULT_RP_LINE1) rp_line2 = ConfProp(_config, "rp_line2", CONFIG_DEFAULT_RP_LINE2)
class ProjectM(EventPlugin): """Launch external visualisations, e.g. via projectM Try this first (Ubuntu/Debian): sudo apt-get install projectm-pulseaudio """ _config = PluginConfig(__name__) PLUGIN_ID = "visualisations" PLUGIN_NAME = _("Launch Visualisations") PLUGIN_ICON = Icons.IMAGE_X_GENERIC PLUGIN_DESC = _("Launch external visualisations.") DEFAULT_EXEC = 'projectM-pulseaudio' def __init__(self): self._pid = None def enabled(self): from gi.repository import GLib print_d("Starting %s" % self.PLUGIN_NAME) try: self._pid, fdin, fdout, fderr = GLib.spawn_async( argv=self.executable.split(), flags=GLib.SpawnFlags.SEARCH_PATH, standard_output=True, standard_input=True) except GLib.Error as e: msg = ((_("Couldn't run visualisations using '%s'") + " (%s)") % (escape(self.executable), escape(e.message))) ErrorMessage(title=_("Error"), description=msg, parent=app.window).run() else: # self._stdin = os.fdopen(fdin, mode='w') print_d("Launched with PID: %s" % self._pid) def disabled(self): if not self._pid: return print_d("Shutting down %s" % self.PLUGIN_NAME) try: os.kill(self._pid, signal.SIGTERM) os.kill(self._pid, signal.SIGKILL) except Exception as e: print_w("Couldn't shut down cleanly (%s)" % e) def PluginPreferences(self, *args): vbox = Gtk.VBox(spacing=12) label = Gtk.Label(label=_("Visualiser executable:")) def edited(widget): self.executable = widget.get_text() entry = UndoEntry() entry.connect('changed', edited) entry.set_text(self.executable) hbox = Gtk.HBox(spacing=6) hbox.pack_start(label, False, False, 0) hbox.pack_start(entry, True, True, 0) vbox.pack_start(hbox, True, True, 0) def refresh_clicked(widget): self.disabled() self.enabled() refresh_button = Button(_("Reload"), Icons.VIEW_REFRESH) refresh_button.connect('clicked', refresh_clicked) vbox.pack_start(refresh_button, False, False, 0) return vbox @property def executable(self): return self._config.get('executable', self.DEFAULT_EXEC) @executable.setter def executable(self, value): self._config.set('executable', value)
class Config: plugin_config = PluginConfig(DownloadCoverArt.PLUGIN_ID) preview_size = IntConfProp(plugin_config, "preview_size", 300) save_pattern = ConfProp(plugin_config, "save_pattern", "folder.jpg") over_scale = BoolConfProp(plugin_config, "preview_over_scale", True) re_encode = BoolConfProp(plugin_config, "re_encode", False)
class Config(object): _config = PluginConfig(__name__) elapsed_color = ConfProp(_config, "elapsed_color", "") preview_color = ConfProp(_config, "preview_color", "") remaining_color = ConfProp(_config, "remaining_color", "")
import random from gi.repository import Gtk, GLib from quodlibet import _ from quodlibet import app from quodlibet.order import OrderInOrder from quodlibet.order import OrderRemembered from quodlibet.order.reorder import Reorder from quodlibet.plugins import PluginConfig from quodlibet.plugins.playorder import ShufflePlugin from quodlibet.qltk import Icons from quodlibet.qltk.notif import Task pconfig = PluginConfig("shufflebygrouping") pconfig.defaults.set("grouping", "~grouping~album~albumartist") pconfig.defaults.set("grouping_filter", "grouping") pconfig.defaults.set("delay", 0) class ShuffleByGrouping(ShufflePlugin, OrderRemembered): PLUGIN_ID = "Shuffle by Grouping" PLUGIN_NAME = _("Shuffle by Grouping") PLUGIN_DESC = _("Shuffles by a grouping of songs defined by a common tag " "instead of by track, similar to album shuffle. This is " "useful for shuffling multi-movement classical works " "while making sure all movements play in order before " "shuffling to the next piece.") PLUGIN_ICON = Icons.MEDIA_PLAYLIST_SHUFFLE display_name = _("Shuffle by grouping")
from gi.repository import Gtk, GObject, GLib, Gio from senf import fsn2uri from quodlibet import _ from quodlibet import qltk, app from quodlibet.plugins.events import EventPlugin from quodlibet.plugins import PluginConfig from quodlibet.pattern import XMLFromPattern from quodlibet.qltk.textedit import TextView, TextBuffer from quodlibet.qltk.entry import UndoEntry from quodlibet.qltk.msg import ErrorMessage from quodlibet.qltk import Icons from quodlibet.util import unescape, print_w pconfig = PluginConfig("notify") pconfig.defaults.set("timeout", 4000) pconfig.defaults.set("show_notifications", "all") pconfig.defaults.set("show_only_when_unfocused", True) pconfig.defaults.set("show_next_button", True) pconfig.defaults.set("titlepattern", "<artist|<artist> - ><title>") pconfig.defaults.set( "bodypattern", """<~length> <album|<album><discsubtitle| - <discsubtitle>> ><~year|<~year>>""") class PreferencesWidget(Gtk.VBox): def __init__(self, parent, plugin_instance): GObject.GObject.__init__(self, spacing=12) self.plugin_instance = plugin_instance
import musicbrainzngs except ImportError: raise plugins.MissingModulePluginException("musicbrainzngs") from gi.repository import Gtk from quodlibet import _ from quodlibet.plugins import PluginConfig from quodlibet.plugins.events import EventPlugin ATTR_BRAINZ = 'musicbrainz_trackid' ATTR_RATING = '~#rating' BRAINZ_APP = "quodlibetMusicBrainzSync" VERSION = "0.1" plugin_config = PluginConfig("musicbrainz-sync") defaults = plugin_config.defaults defaults.set("username", "") defaults.set("password", "") class MusicBrainzSyncPlugin(EventPlugin): PLUGIN_ID = "musicbrainzsync" VERSION = VERSION PLUGIN_NAME = _("MusicBrainz Sync") PLUGIN_DESC = _("Syncs the rating of a song with MusicBrainz.") def __init__(self): super().__init__() musicbrainzngs.set_rate_limit() musicbrainzngs.set_useragent(BRAINZ_APP, VERSION,
from quodlibet.qltk import Icons from quodlibet.util.dprint import print_d from quodlibet.util.picklehelper import pickle_load, pickle_dump, PickleError from quodlibet.util.urllib import urlopen, UrllibError from quodlibet.errorreport import errorhook SERVICES = { 'Last.fm': 'http://post.audioscrobbler.com/', 'Libre.fm': 'http://turtle.libre.fm/' } DEFAULT_SERVICE = 'Last.fm' DEFAULT_TITLEPAT = '<title><version| (<version>)>' DEFAULT_ARTISTPAT = '<artist|<artist>|<composer|<composer>|<performer>>>' plugin_config = PluginConfig("scrobbler") defaults = plugin_config.defaults defaults.set("service", DEFAULT_SERVICE) defaults.set("titlepat", "") defaults.set("artistpat", "") defaults.set("url", "") defaults.set("username", "") defaults.set("password", "") defaults.set("exclude", "") defaults.set("offline", False) def config_get_url(): """Gets the URL for the currently configured service. This logic was used often enough to be split out from generic config """
class Config(object): _config = PluginConfig(__name__) lcd_dev = ConfProp(_config, "lcd_dev", "/dev/serial/matrix_orbital") lcd_width = ConfProp(_config, "lcd_width", 20) lcd_interval = ConfProp(_config, "lcd_interval", 150)