def connect(self, password): """ Connect lastfm @param password as str/None """ if self._goa: t = Thread(target=self._connect, args=('', '', True)) t.daemon = True t.start() # Get username/password from GSettings/Secret elif Secret is not None and\ Gio.NetworkMonitor.get_default().get_network_available(): self._username = Lp().settings.get_value( 'lastfm-login').get_string() if password is None: schema = Secret.Schema.new("org.gnome.Lollypop", Secret.SchemaFlags.NONE, SecretSchema) Secret.password_lookup(schema, SecretAttributes, None, self._on_password_lookup) else: t = Thread(target=self._connect, args=(self._username, password, True)) t.daemon = True t.start()
def connect(self, password): """ Connect lastfm @param password as str/None """ if self.__goa is not None: t = Thread(target=self.__connect, args=('', '', True)) t.daemon = True t.start() # Get username/password from GSettings/Secret elif Secret is not None and\ get_network_available(): self.__username = Lp().settings.get_value( 'lastfm-login').get_string() if password is None: schema = Secret.Schema.new("org.gnome.Lollypop", Secret.SchemaFlags.NONE, SecretSchema) Secret.password_lookup(schema, SecretAttributes, None, self.__on_password_lookup) else: t = Thread(target=self.__connect, args=(self.__username, password, True)) t.daemon = True t.start()
def get_refresh_token(self, callback, user_data=None): def secret_callback(source_object, result, user_data): print("looked up in secret") self._token_cache = Secret.password_lookup_finish(result) print("lookup finish") callback(self._token_cache, user_data) Secret.password_lookup(self.SECRET_SCHEMA, {}, None, secret_callback, user_data) print("lookup in secret")
def testAsyncNotFound(self): loop = GLib.MainLoop(None) def on_result_ready(source, result, unused): loop.quit() password = Secret.password_lookup_finish(result) self.assertEquals(None, password) Secret.password_lookup (STORE_SCHEMA, { "number": "7", "string": "five" }, None, on_result_ready, None) loop.run()
def testAsynchronous(self): loop = GLib.MainLoop(None) def on_result_ready(source, result, unused): loop.quit() password = Secret.password_lookup_finish(result) self.assertEquals("222", password) Secret.password_lookup (STORE_SCHEMA, { "number": "2", "string": "two" }, None, on_result_ready, None) loop.run()
def testAsyncNotFound(self): loop = GLib.MainLoop(None, False) def on_result_ready(source, result, unused): loop.quit() password = Secret.password_lookup_finish(result) self.assertEquals(None, password) Secret.password_lookup (STORE_SCHEMA, { "number": "7", "string": "five" }, None, on_result_ready, None) loop.run()
def testAsynchronous(self): loop = GLib.MainLoop(None, False) def on_result_ready(source, result, unused): loop.quit() password = Secret.password_lookup_finish(result) self.assertEquals("222", password) Secret.password_lookup(STORE_SCHEMA, { "number": "2", "string": "two" }, None, on_result_ready, None) loop.run()
def start_smtp_password_lookup(server, username, callback): schema = Secret.get_schema(Secret.SchemaType.COMPAT_NETWORK) attrs = dict(user=username, server=server, protocol='smtp') def password_callback(source, result): password = Secret.password_lookup_finish(result) if password: log.debug("Found the SMTP password in the keyring.") else: log.debug("Did not find the SMTP password in the keyring.") callback(password or '') log.debug("Looking up the SMTP password for %s@%s in the keyring.", username, server) Secret.password_lookup(schema, attrs, cancellable=None, callback=password_callback)
def get_account_password(self, email, callback): def on_password_lookup_finish(source, result, data): try: password = Secret.password_lookup_finish(result) or '' except GLib.Error as e: password = '' logging.error('Failed to lookup password, Error: {}'.format(e)) callback(password) Secret.password_lookup( self._account_schema, {'email': email}, None, on_password_lookup_finish, None, )
def load_credentials(self): def loaded(source, result, data): password = Secret.password_lookup_finish(result) if password is None: # We fallback to session storage return super(SecretKeyring, self).load_credentials() else: self.password = password GLib.idle_add(self.emit, 'password-loaded') if self.has_credentials: GLib.idle_add(self.emit, 'password-loaded') else: attrs = {'app': 'trifle', 'user': self.username} Secret.password_lookup(SCHEMA, attrs, None, loaded, None)
def connect(self, password): """ Connect lastfm @param password as str/None """ if Secret is None or\ not Gio.NetworkMonitor.get_default().get_network_available(): return self._username = Lp.settings.get_value('lastfm-login').get_string() if password is None: schema = Secret.Schema.new("org.gnome.Lollypop", Secret.SchemaFlags.NONE, SecretSchema) Secret.password_lookup(schema, SecretAttributes, None, self._on_password_lookup) else: start_new_thread(self._connect, (self._username, password))
def get_account_password(self, email: str) -> Awaitable[str]: future = asyncio.Future() # type: asyncio.Future def on_password_lookup_finish(source, result, data): try: password = Secret.password_lookup_finish(result) or '' except GLib.Error as e: future.set_exception(e) else: future.set_result(password) Secret.password_lookup( self._account_schema, {'email': email}, None, on_password_lookup_finish, None, ) return future
def __init__(self): """ Init dialog """ self.__choosers = [] self.__cover_tid = None self.__mix_tid = None self.__popover = None cs_api_key = Lp().settings.get_value('cs-api-key').get_string() default_cs_api_key = Lp().settings.get_default_value( 'cs-api-key').get_string() if (not cs_api_key or cs_api_key == default_cs_api_key) and\ get_network_available() and\ Lp().notify is not None: Lp().notify.send( _("Google Web Services need a custom API key"), _("Lollypop needs this to search artwork and music.")) builder = Gtk.Builder() builder.add_from_resource('/org/gnome/Lollypop/SettingsDialog.ui') self.__progress = builder.get_object('progress') self.__infobar = builder.get_object('infobar') self.__reset_button = builder.get_object('reset_button') if Lp().lastfm is None or Lp().lastfm.is_goa: builder.get_object('lastfm_grid').hide() if Lp().scanner.is_locked(): builder.get_object('reset_button').set_sensitive(False) artists = Lp().artists.count() albums = Lp().albums.count() tracks = Lp().tracks.count() builder.get_object('artists').set_text( ngettext("%d artist", "%d artists", artists) % artists) builder.get_object('albums').set_text( ngettext("%d album", "%d albums", albums) % albums) builder.get_object('tracks').set_text( ngettext("%d track", "%d tracks", tracks) % tracks) self.__popover_content = builder.get_object('popover') duration = builder.get_object('duration') duration.set_range(1, 20) duration.set_value(Lp().settings.get_value('mix-duration').get_int32()) self.__settings_dialog = builder.get_object('settings_dialog') self.__settings_dialog.set_transient_for(Lp().window) if Lp().settings.get_value('disable-csd'): self.__settings_dialog.set_title(_("Preferences")) else: headerbar = builder.get_object('header_bar') headerbar.set_title(_("Preferences")) self.__settings_dialog.set_titlebar(headerbar) switch_scan = builder.get_object('switch_scan') switch_scan.set_state(Lp().settings.get_value('auto-update')) switch_view = builder.get_object('switch_dark') switch_view.set_state(Lp().settings.get_value('dark-ui')) switch_background = builder.get_object('switch_background') switch_background.set_state(Lp().settings.get_value('background-mode')) switch_state = builder.get_object('switch_state') switch_state.set_state(Lp().settings.get_value('save-state')) switch_mix = builder.get_object('switch_mix') switch_mix.set_state(Lp().settings.get_value('mix')) self.__helper = TouchHelper(switch_mix, None, None) self.__helper.set_long_func(self.__mix_long_func, switch_mix) self.__helper.set_short_func(self.__mix_short_func, switch_mix) switch_mix_party = builder.get_object('switch_mix_party') switch_mix_party.set_state(Lp().settings.get_value('party-mix')) switch_librefm = builder.get_object('switch_librefm') switch_librefm.set_state(Lp().settings.get_value('use-librefm')) switch_artwork_tags = builder.get_object('switch_artwork_tags') # Check portal for kid3-cli can_set_cover = False try: bus = Gio.bus_get_sync(Gio.BusType.SESSION, None) proxy = Gio.DBusProxy.new_sync(bus, Gio.DBusProxyFlags.NONE, None, 'org.gnome.Lollypop.Portal', '/org/gnome/LollypopPortal', 'org.gnome.Lollypop.Portal', None) can_set_cover = proxy.call_sync('CanSetCover', None, Gio.DBusCallFlags.NO_AUTO_START, 500, None)[0] except Exception as e: print("You are missing lollypop-portal: " "https://github.com/gnumdk/lollypop-portal", e) if not can_set_cover: grid = builder.get_object('grid_behaviour') h = grid.child_get_property(switch_artwork_tags, 'height') w = grid.child_get_property(switch_artwork_tags, 'width') l = grid.child_get_property(switch_artwork_tags, 'left-attach') t = grid.child_get_property(switch_artwork_tags, 'top-attach') switch_artwork_tags.destroy() label = Gtk.Label.new(_("You need to install kid3-cli")) label.get_style_context().add_class('dim-label') label.set_property('halign', Gtk.Align.END) label.show() grid.attach(label, l, t, w, h) else: switch_artwork_tags.set_state( Lp().settings.get_value('save-to-tags')) if GLib.find_program_in_path("youtube-dl") is None: builder.get_object('charts_grid').hide() else: switch_charts = builder.get_object('switch_charts') switch_charts.set_state(Lp().settings.get_value('show-charts')) switch_genres = builder.get_object('switch_genres') switch_genres.set_state(Lp().settings.get_value('show-genres')) switch_compilations = builder.get_object('switch_compilations') switch_compilations.set_state( Lp().settings.get_value('show-compilations')) switch_artwork = builder.get_object('switch_artwork') switch_artwork.set_state(Lp().settings.get_value('artist-artwork')) switch_spotify = builder.get_object('switch_spotify') switch_spotify.set_state(Lp().settings.get_value('search-spotify')) switch_itunes = builder.get_object('switch_itunes') switch_itunes.set_state(Lp().settings.get_value('search-itunes')) if GLib.find_program_in_path("youtube-dl") is None: builder.get_object('yt-dl').show() combo_orderby = builder.get_object('combo_orderby') combo_orderby.set_active(Lp().settings.get_enum(('orderby'))) combo_preview = builder.get_object('combo_preview') scale_coversize = builder.get_object('scale_coversize') scale_coversize.set_range(150, 300) scale_coversize.set_value( Lp().settings.get_value('cover-size').get_int32()) self.__settings_dialog.connect('destroy', self.__edit_settings_close) builder.connect_signals(self) main_chooser_box = builder.get_object('main_chooser_box') self.__chooser_box = builder.get_object('chooser_box') self.__set_outputs(combo_preview) # # Music tab # dirs = [] for directory in Lp().settings.get_value('music-uris'): dirs.append(directory) # Main chooser self.__main_chooser = ChooserWidget() image = Gtk.Image.new_from_icon_name("list-add-symbolic", Gtk.IconSize.MENU) self.__main_chooser.set_icon(image) self.__main_chooser.set_action(self.__add_chooser) main_chooser_box.pack_start(self.__main_chooser, False, True, 0) if len(dirs) > 0: uri = dirs.pop(0) else: filename = GLib.get_user_special_dir( GLib.UserDirectory.DIRECTORY_MUSIC) if filename: uri = GLib.filename_to_uri(filename) else: uri = "" self.__main_chooser.set_dir(uri) # Others choosers for directory in dirs: self.__add_chooser(directory) # # Google tab # builder.get_object('cs-entry').set_text( Lp().settings.get_value('cs-api-key').get_string()) # # Last.fm tab # if Lp().lastfm is not None and Secret is not None: self.__test_img = builder.get_object('test_img') self.__login = builder.get_object('login') self.__password = builder.get_object('password') schema = Secret.Schema.new("org.gnome.Lollypop", Secret.SchemaFlags.NONE, SecretSchema) Secret.password_lookup(schema, SecretAttributes, None, self.__on_password_lookup) builder.get_object('lastfm_grid').set_sensitive(True) builder.get_object('lastfm_error').hide() self.__login.set_text( Lp().settings.get_value('lastfm-login').get_string())
def __init__(self): """ Init dialog """ self._choosers = [] builder = Gtk.Builder() builder.add_from_resource('/org/gnome/Lollypop/SettingsDialog.ui') self._settings_dialog = builder.get_object('settings_dialog') self._settings_dialog.set_transient_for(Lp.window) if not Lp.settings.get_value('disable-csd'): self._settings_dialog.set_titlebar( builder.get_object('header_bar')) switch_scan = builder.get_object('switch_scan') switch_scan.set_state(Lp.settings.get_value('auto-update')) switch_view = builder.get_object('switch_dark') switch_view.set_state(Lp.settings.get_value('dark-ui')) switch_background = builder.get_object('switch_background') switch_background.set_state(Lp.settings.get_value('background-mode')) switch_state = builder.get_object('switch_state') switch_state.set_state(Lp.settings.get_value('save-state')) switch_autoplay = builder.get_object('switch_autoplay') switch_autoplay.set_state(Lp.settings.get_value('auto-play')) switch_genres = builder.get_object('switch_genres') switch_genres.set_state(Lp.settings.get_value('show-genres')) switch_compilations = builder.get_object('switch_compilations') switch_compilations.set_state( Lp.settings.get_value('show-compilations')) self._settings_dialog.connect('destroy', self._edit_settings_close) builder.connect_signals(self) main_chooser_box = builder.get_object('main_chooser_box') self._chooser_box = builder.get_object('chooser_box') party_grid = builder.get_object('party_grid') # # Music tab # dirs = [] for directory in Lp.settings.get_value('music-path'): dirs.append(directory) # Main chooser self._main_chooser = ChooserWidget() image = Gtk.Image.new_from_icon_name("list-add-symbolic", Gtk.IconSize.MENU) self._main_chooser.set_icon(image) self._main_chooser.set_action(self._add_chooser) main_chooser_box.pack_start(self._main_chooser, False, True, 0) if len(dirs) > 0: path = dirs.pop(0) else: path = GLib.get_user_special_dir( GLib.UserDirectory.DIRECTORY_MUSIC) self._main_chooser.set_dir(path) # Others choosers for directory in dirs: self._add_chooser(directory) # # Party mode tab # genres = Lp.genres.get() genres.insert(0, (Type.POPULARS, _("Populars"))) genres.insert(1, (Type.RECENTS, _("Recently added"))) ids = Lp.player.get_party_ids() i = 0 x = 0 for genre_id, genre in genres: label = Gtk.Label() label.set_property('margin-start', 10) label.set_property('halign', Gtk.Align.START) label.set_property('hexpand', True) label.set_ellipsize(Pango.EllipsizeMode.END) label.set_text(genre) label.set_tooltip_text(genre) label.show() switch = Gtk.Switch() if genre_id in ids: switch.set_state(True) switch.connect("state-set", self._party_switch_state, genre_id) switch.set_property('margin-end', 50) switch.show() party_grid.attach(label, x, i, 1, 1) party_grid.attach(switch, x+1, i, 1, 1) if x == 0: x += 2 else: i += 1 x = 0 # # Last.fm tab # if Lp.lastfm is not None and Secret is not None: self._test_img = builder.get_object('test_img') self._login = builder.get_object('login') self._password = builder.get_object('password') schema = Secret.Schema.new("org.gnome.Lollypop", Secret.SchemaFlags.NONE, SecretSchema) Secret.password_lookup(schema, SecretAttributes, None, self._on_password_lookup) builder.get_object('lastfm_grid').set_sensitive(True) builder.get_object('lastfm_error').hide() self._login.set_text( Lp.settings.get_value('lastfm-login').get_string())
def fetchUser(self, callback): Secret.password_lookup(self.SCHEMA, self.KEY, None, self._finishLookup, callback)
def __init__(self): """ Init dialog """ self.__choosers = [] self.__cover_tid = None self.__mix_tid = None self.__popover = None builder = Gtk.Builder() builder.add_from_resource("/org/gnome/Lollypop/SettingsDialog.ui") self.__progress = builder.get_object("progress") self.__infobar = builder.get_object("infobar") self.__reset_button = builder.get_object("reset_button") if Lp().lastfm is None or Lp().lastfm.is_goa: builder.get_object("lastfm_grid").hide() if Lp().scanner.is_locked(): builder.get_object("reset_button").set_sensitive(False) artists = Lp().artists.count() albums = Lp().albums.count() tracks = Lp().tracks.count() builder.get_object("artists").set_text( ngettext("%d artist", "%d artists", artists) % artists) builder.get_object("albums").set_text( ngettext("%d album", "%d albums", albums) % albums) builder.get_object("tracks").set_text( ngettext("%d track", "%d tracks", tracks) % tracks) self.__popover_content = builder.get_object("popover") duration = builder.get_object("duration") duration.set_range(1, 20) duration.set_value(Lp().settings.get_value("mix-duration").get_int32()) self.__settings_dialog = builder.get_object("settings_dialog") self.__settings_dialog.set_transient_for(Lp().window) if Lp().settings.get_value("disable-csd"): self.__settings_dialog.set_title(_("Preferences")) else: headerbar = builder.get_object("header_bar") headerbar.set_title(_("Preferences")) self.__settings_dialog.set_titlebar(headerbar) switch_scan = builder.get_object("switch_scan") switch_scan.set_state(Lp().settings.get_value("auto-update")) switch_view = builder.get_object("switch_dark") if Lp().gtk_application_prefer_dark_theme: switch_view.set_sensitive(False) else: switch_view.set_state(Lp().settings.get_value("dark-ui")) switch_background = builder.get_object("switch_background") switch_background.set_state(Lp().settings.get_value("background-mode")) switch_state = builder.get_object("switch_state") switch_state.set_state(Lp().settings.get_value("save-state")) switch_mix = builder.get_object("switch_mix") switch_mix.set_state(Lp().settings.get_value("mix")) self._switch_song_notifications = builder.get_object( "switch_song_notifications", ) self._switch_song_notifications.set_state( not Lp().settings.get_value("disable-song-notifications"), ) self._switch_song_notifications.set_sensitive( not Lp().settings.get_value("disable-notifications"), ) Lp().settings.connect( "changed::disable-notifications", self._on_notifications_setting_changed, ) self.__helper = TouchHelper(switch_mix, None, None) self.__helper.set_long_func(self.__mix_long_func, switch_mix) self.__helper.set_short_func(self.__mix_short_func, switch_mix) switch_mix_party = builder.get_object("switch_mix_party") switch_mix_party.set_state(Lp().settings.get_value("party-mix")) switch_librefm = builder.get_object("switch_librefm") switch_librefm.set_state(Lp().settings.get_value("use-librefm")) switch_artwork_tags = builder.get_object("switch_artwork_tags") grid_behaviour = builder.get_object("grid_behaviour") # Check portal for kid3-cli dbus_helper = DBusHelper() dbus_helper.call("CanSetCover", None, self.__on_can_set_cover, (switch_artwork_tags, grid_behaviour)) if GLib.find_program_in_path("youtube-dl") is None or\ not Lp().settings.get_value("network-access"): builder.get_object("charts_grid").hide() else: switch_charts = builder.get_object("switch_charts") switch_charts.set_state(Lp().settings.get_value("show-charts")) switch_genres = builder.get_object("switch_genres") switch_genres.set_state(Lp().settings.get_value("show-genres")) switch_compilations = builder.get_object("switch_compilations") switch_compilations.set_state( Lp().settings.get_value("show-compilations")) switch_artwork = builder.get_object("switch_artwork") switch_artwork.set_state(Lp().settings.get_value("artist-artwork")) switch_spotify = builder.get_object("switch_spotify") switch_spotify.set_state(Lp().settings.get_value("search-spotify")) switch_itunes = builder.get_object("switch_itunes") switch_itunes.set_state(Lp().settings.get_value("search-itunes")) if GLib.find_program_in_path("youtube-dl") is None: builder.get_object("yt-dl").show() combo_orderby = builder.get_object("combo_orderby") combo_orderby.set_active(Lp().settings.get_enum(("orderby"))) combo_preview = builder.get_object("combo_preview") scale_coversize = builder.get_object("scale_coversize") scale_coversize.set_range(150, 300) scale_coversize.set_value( Lp().settings.get_value("cover-size").get_int32()) self.__settings_dialog.connect("destroy", self.__edit_settings_close) builder.connect_signals(self) main_chooser_box = builder.get_object("main_chooser_box") self.__chooser_box = builder.get_object("chooser_box") self.__set_outputs(combo_preview) # # Music tab # dirs = [] for directory in Lp().settings.get_value("music-uris"): dirs.append(directory) # Main chooser self.__main_chooser = ChooserWidget() image = Gtk.Image.new_from_icon_name("list-add-symbolic", Gtk.IconSize.MENU) self.__main_chooser.set_icon(image) self.__main_chooser.set_action(self.__add_chooser) main_chooser_box.pack_start(self.__main_chooser, False, True, 0) if len(dirs) > 0: uri = dirs.pop(0) else: filename = GLib.get_user_special_dir( GLib.UserDirectory.DIRECTORY_MUSIC) if filename: uri = GLib.filename_to_uri(filename) else: uri = "" self.__main_chooser.set_dir(uri) # Others choosers for directory in dirs: self.__add_chooser(directory) # # Google tab # key = Lp().settings.get_value("cs-api-key").get_string() or\ Lp().settings.get_default_value("cs-api-key").get_string() builder.get_object("cs-entry").set_text(key) # # Last.fm tab # if Lp().lastfm is not None and Secret is not None: self.__test_img = builder.get_object("test_img") self.__login = builder.get_object("login") self.__password = builder.get_object("password") schema = Secret.Schema.new("org.gnome.Lollypop", Secret.SchemaFlags.NONE, SecretSchema) Secret.password_lookup(schema, SecretAttributes, None, self.__on_password_lookup) builder.get_object("lastfm_grid").set_sensitive(True) builder.get_object("lastfm_error").hide() self.__login.set_text( Lp().settings.get_value("lastfm-login").get_string())
def __init__(self): """ Init dialog """ self.__choosers = [] self.__cover_tid = None self.__mix_tid = None self.__popover = None builder = Gtk.Builder() builder.add_from_resource('/org/gnome/Lollypop/SettingsDialog.ui') if Lp().lastfm is None or Lp().lastfm.is_goa: builder.get_object('lastfm_grid').hide() if Lp().scanner.is_locked(): builder.get_object('button').set_sensitive(False) builder.get_object('button').connect('clicked', self.__on_reset_clicked, builder.get_object('progress')) artists = Lp().artists.count() albums = Lp().albums.count() tracks = Lp().tracks.count() builder.get_object('artists').set_text( ngettext("%d artist", "%d artists", artists) % artists) builder.get_object('albums').set_text( ngettext("%d album", "%d albums", albums) % albums) builder.get_object('tracks').set_text( ngettext("%d track", "%d tracks", tracks) % tracks) self.__popover_content = builder.get_object('popover') duration = builder.get_object('duration') duration.set_range(1, 20) duration.set_value(Lp().settings.get_value('mix-duration').get_int32()) self.__settings_dialog = builder.get_object('settings_dialog') self.__settings_dialog.set_transient_for(Lp().window) if Lp().settings.get_value('disable-csd'): self.__settings_dialog.set_title(_("Preferences")) else: headerbar = builder.get_object('header_bar') headerbar.set_title(_("Preferences")) self.__settings_dialog.set_titlebar(headerbar) switch_scan = builder.get_object('switch_scan') switch_scan.set_state(Lp().settings.get_value('auto-update')) switch_view = builder.get_object('switch_dark') switch_view.set_state(Lp().settings.get_value('dark-ui')) switch_background = builder.get_object('switch_background') switch_background.set_state(Lp().settings.get_value('background-mode')) switch_state = builder.get_object('switch_state') switch_state.set_state(Lp().settings.get_value('save-state')) switch_mix = builder.get_object('switch_mix') switch_mix.set_state(Lp().settings.get_value('mix')) switch_mix_party = builder.get_object('switch_mix_party') switch_mix_party.set_state(Lp().settings.get_value('party-mix')) switch_librefm = builder.get_object('switch_librefm') switch_librefm.set_state(Lp().settings.get_value('use-librefm')) switch_artwork_tags = builder.get_object('switch_artwork_tags') if GLib.find_program_in_path("kid3-cli") is None: grid = builder.get_object('grid_behaviour') h = grid.child_get_property(switch_artwork_tags, 'height') w = grid.child_get_property(switch_artwork_tags, 'width') l = grid.child_get_property(switch_artwork_tags, 'left-attach') t = grid.child_get_property(switch_artwork_tags, 'top-attach') switch_artwork_tags.destroy() label = Gtk.Label.new(_("You need to install kid3-cli")) label.get_style_context().add_class('dim-label') label.set_property('halign', Gtk.Align.END) label.show() grid.attach(label, l, t, w, h) else: switch_artwork_tags.set_state( Lp().settings.get_value('save-to-tags')) switch_genres = builder.get_object('switch_genres') switch_genres.set_state(Lp().settings.get_value('show-genres')) switch_compilations = builder.get_object('switch_compilations') switch_compilations.set_state( Lp().settings.get_value('show-compilations')) switch_artwork = builder.get_object('switch_artwork') switch_artwork.set_state(Lp().settings.get_value('artist-artwork')) switch_repeat = builder.get_object('switch_repeat') switch_repeat.set_state(not Lp().settings.get_value('repeat')) combo_orderby = builder.get_object('combo_orderby') combo_orderby.set_active(Lp().settings.get_enum(('orderby'))) combo_preview = builder.get_object('combo_preview') scale_coversize = builder.get_object('scale_coversize') scale_coversize.set_range(150, 300) scale_coversize.set_value( Lp().settings.get_value('cover-size').get_int32()) self.__settings_dialog.connect('destroy', self.__edit_settings_close) builder.connect_signals(self) main_chooser_box = builder.get_object('main_chooser_box') self.__chooser_box = builder.get_object('chooser_box') self.__set_outputs(combo_preview) # # Music tab # dirs = [] for directory in Lp().settings.get_value('music-uris'): dirs.append(directory) # Main chooser self.__main_chooser = ChooserWidget() image = Gtk.Image.new_from_icon_name("list-add-symbolic", Gtk.IconSize.MENU) self.__main_chooser.set_icon(image) self.__main_chooser.set_action(self.__add_chooser) main_chooser_box.pack_start(self.__main_chooser, False, True, 0) if len(dirs) > 0: uri = dirs.pop(0) else: filename = GLib.get_user_special_dir( GLib.UserDirectory.DIRECTORY_MUSIC) if filename: uri = GLib.filename_to_uri(filename) else: uri = "" self.__main_chooser.set_dir(uri) # Others choosers for directory in dirs: self.__add_chooser(directory) # # Google tab # builder.get_object('cs-entry').set_text( Lp().settings.get_value('cs-api-key').get_string()) # # Last.fm tab # if Lp().lastfm is not None and Secret is not None: self.__test_img = builder.get_object('test_img') self.__login = builder.get_object('login') self.__password = builder.get_object('password') schema = Secret.Schema.new("org.gnome.Lollypop", Secret.SchemaFlags.NONE, SecretSchema) Secret.password_lookup(schema, SecretAttributes, None, self.__on_password_lookup) builder.get_object('lastfm_grid').set_sensitive(True) builder.get_object('lastfm_error').hide() self.__login.set_text( Lp().settings.get_value('lastfm-login').get_string())
def __init__(self): """ Init dialog """ self.__choosers = [] self.__cover_tid = None self.__mix_tid = None self.__popover = None cs_api_key = Lp().settings.get_value('cs-api-key').get_string() default_cs_api_key = Lp().settings.get_default_value( 'cs-api-key').get_string() if (not cs_api_key or cs_api_key == default_cs_api_key) and\ get_network_available() and\ Lp().notify is not None: Lp().notify.send( _("Google Web Services need a custom API key"), _("Lollypop needs this to search artwork and music.")) builder = Gtk.Builder() builder.add_from_resource('/org/gnome/Lollypop/SettingsDialog.ui') self.__progress = builder.get_object('progress') self.__infobar = builder.get_object('infobar') self.__reset_button = builder.get_object('reset_button') if Lp().lastfm is None or Lp().lastfm.is_goa: builder.get_object('lastfm_grid').hide() if Lp().scanner.is_locked(): builder.get_object('reset_button').set_sensitive(False) artists = Lp().artists.count() albums = Lp().albums.count() tracks = Lp().tracks.count() builder.get_object('artists').set_text( ngettext("%d artist", "%d artists", artists) % artists) builder.get_object('albums').set_text( ngettext("%d album", "%d albums", albums) % albums) builder.get_object('tracks').set_text( ngettext("%d track", "%d tracks", tracks) % tracks) self.__popover_content = builder.get_object('popover') duration = builder.get_object('duration') duration.set_range(1, 20) duration.set_value(Lp().settings.get_value('mix-duration').get_int32()) self.__settings_dialog = builder.get_object('settings_dialog') self.__settings_dialog.set_transient_for(Lp().window) if Lp().settings.get_value('disable-csd'): self.__settings_dialog.set_title(_("Preferences")) else: headerbar = builder.get_object('header_bar') headerbar.set_title(_("Preferences")) self.__settings_dialog.set_titlebar(headerbar) switch_scan = builder.get_object('switch_scan') switch_scan.set_state(Lp().settings.get_value('auto-update')) switch_view = builder.get_object('switch_dark') if Lp().gtk_application_prefer_dark_theme: switch_view.set_sensitive(False) else: switch_view.set_state(Lp().settings.get_value('dark-ui')) switch_background = builder.get_object('switch_background') switch_background.set_state(Lp().settings.get_value('background-mode')) switch_state = builder.get_object('switch_state') switch_state.set_state(Lp().settings.get_value('save-state')) switch_mix = builder.get_object('switch_mix') switch_mix.set_state(Lp().settings.get_value('mix')) self.__helper = TouchHelper(switch_mix, None, None) self.__helper.set_long_func(self.__mix_long_func, switch_mix) self.__helper.set_short_func(self.__mix_short_func, switch_mix) switch_mix_party = builder.get_object('switch_mix_party') switch_mix_party.set_state(Lp().settings.get_value('party-mix')) switch_librefm = builder.get_object('switch_librefm') switch_librefm.set_state(Lp().settings.get_value('use-librefm')) switch_artwork_tags = builder.get_object('switch_artwork_tags') # Check portal for kid3-cli can_set_cover = False try: bus = Gio.bus_get_sync(Gio.BusType.SESSION, None) proxy = Gio.DBusProxy.new_sync(bus, Gio.DBusProxyFlags.NONE, None, 'org.gnome.Lollypop.Portal', '/org/gnome/LollypopPortal', 'org.gnome.Lollypop.Portal', None) can_set_cover = proxy.call_sync('CanSetCover', None, Gio.DBusCallFlags.NO_AUTO_START, 500, None)[0] except Exception as e: print( "You are missing lollypop-portal: " "https://github.com/gnumdk/lollypop-portal", e) if not can_set_cover: grid = builder.get_object('grid_behaviour') h = grid.child_get_property(switch_artwork_tags, 'height') w = grid.child_get_property(switch_artwork_tags, 'width') l = grid.child_get_property(switch_artwork_tags, 'left-attach') t = grid.child_get_property(switch_artwork_tags, 'top-attach') switch_artwork_tags.destroy() label = Gtk.Label.new(_("You need to install kid3-cli")) label.get_style_context().add_class('dim-label') label.set_property('halign', Gtk.Align.END) label.show() grid.attach(label, l, t, w, h) else: switch_artwork_tags.set_state( Lp().settings.get_value('save-to-tags')) if GLib.find_program_in_path("youtube-dl") is None: builder.get_object('charts_grid').hide() else: switch_charts = builder.get_object('switch_charts') switch_charts.set_state(Lp().settings.get_value('show-charts')) switch_genres = builder.get_object('switch_genres') switch_genres.set_state(Lp().settings.get_value('show-genres')) switch_compilations = builder.get_object('switch_compilations') switch_compilations.set_state( Lp().settings.get_value('show-compilations')) switch_artwork = builder.get_object('switch_artwork') switch_artwork.set_state(Lp().settings.get_value('artist-artwork')) switch_spotify = builder.get_object('switch_spotify') switch_spotify.set_state(Lp().settings.get_value('search-spotify')) switch_itunes = builder.get_object('switch_itunes') switch_itunes.set_state(Lp().settings.get_value('search-itunes')) if GLib.find_program_in_path("youtube-dl") is None: builder.get_object('yt-dl').show() combo_orderby = builder.get_object('combo_orderby') combo_orderby.set_active(Lp().settings.get_enum(('orderby'))) combo_preview = builder.get_object('combo_preview') scale_coversize = builder.get_object('scale_coversize') scale_coversize.set_range(150, 300) scale_coversize.set_value( Lp().settings.get_value('cover-size').get_int32()) self.__settings_dialog.connect('destroy', self.__edit_settings_close) builder.connect_signals(self) main_chooser_box = builder.get_object('main_chooser_box') self.__chooser_box = builder.get_object('chooser_box') self.__set_outputs(combo_preview) # # Music tab # dirs = [] for directory in Lp().settings.get_value('music-uris'): dirs.append(directory) # Main chooser self.__main_chooser = ChooserWidget() image = Gtk.Image.new_from_icon_name("list-add-symbolic", Gtk.IconSize.MENU) self.__main_chooser.set_icon(image) self.__main_chooser.set_action(self.__add_chooser) main_chooser_box.pack_start(self.__main_chooser, False, True, 0) if len(dirs) > 0: uri = dirs.pop(0) else: filename = GLib.get_user_special_dir( GLib.UserDirectory.DIRECTORY_MUSIC) if filename: uri = GLib.filename_to_uri(filename) else: uri = "" self.__main_chooser.set_dir(uri) # Others choosers for directory in dirs: self.__add_chooser(directory) # # Google tab # builder.get_object('cs-entry').set_text( Lp().settings.get_value('cs-api-key').get_string()) # # Last.fm tab # if Lp().lastfm is not None and Secret is not None: self.__test_img = builder.get_object('test_img') self.__login = builder.get_object('login') self.__password = builder.get_object('password') schema = Secret.Schema.new("org.gnome.Lollypop", Secret.SchemaFlags.NONE, SecretSchema) Secret.password_lookup(schema, SecretAttributes, None, self.__on_password_lookup) builder.get_object('lastfm_grid').set_sensitive(True) builder.get_object('lastfm_error').hide() self.__login.set_text( Lp().settings.get_value('lastfm-login').get_string())
def __init__(self): """ Init dialog """ self._choosers = [] self._cover_tid = None self._mix_tid = None self._popover = None builder = Gtk.Builder() builder.add_from_resource('/org/gnome/Lollypop/SettingsDialog.ui') if Lp().lastfm and not Lp().lastfm.is_goa: builder.get_object('lastfm_grid').show() self._popover_content = builder.get_object('popover') duration = builder.get_object('duration') duration.set_range(1, 20) duration.set_value(Lp().settings.get_value('mix-duration').get_int32()) self._settings_dialog = builder.get_object('settings_dialog') self._settings_dialog.set_transient_for(Lp().window) if Lp().settings.get_value('disable-csd'): self._settings_dialog.set_title(_("Preferences")) else: headerbar = builder.get_object('header_bar') headerbar.set_title(_("Preferences")) self._settings_dialog.set_titlebar(headerbar) switch_scan = builder.get_object('switch_scan') switch_scan.set_state(Lp().settings.get_value('auto-update')) switch_view = builder.get_object('switch_dark') switch_view.set_state(Lp().settings.get_value('dark-ui')) switch_background = builder.get_object('switch_background') switch_background.set_state(Lp().settings.get_value('background-mode')) switch_state = builder.get_object('switch_state') switch_state.set_state(Lp().settings.get_value('save-state')) switch_mix = builder.get_object('switch_mix') switch_mix.set_state(Lp().settings.get_value('mix')) switch_mix_party = builder.get_object('switch_mix_party') switch_mix_party.set_state(Lp().settings.get_value('party-mix')) switch_artwork_tags = builder.get_object('switch_artwork_tags') if which("kid3-cli") is None: switch_artwork_tags.set_sensitive(False) switch_artwork_tags.set_tooltip_text( _("You need to install kid3-cli")) else: switch_artwork_tags.set_state( Lp().settings.get_value('artwork-tags')) switch_genres = builder.get_object('switch_genres') switch_genres.set_state(Lp().settings.get_value('show-genres')) switch_compilations = builder.get_object('switch_compilations') switch_compilations.set_state( Lp().settings.get_value('show-compilations')) switch_artwork = builder.get_object('switch_artwork') switch_artwork.set_state(Lp().settings.get_value('artist-artwork')) switch_repeat = builder.get_object('switch_repeat') switch_repeat.set_state(not Lp().settings.get_value('repeat')) combo_orderby = builder.get_object('combo_orderby') combo_orderby.set_active(Lp().settings.get_enum(('orderby'))) combo_preview = builder.get_object('combo_preview') scale_coversize = builder.get_object('scale_coversize') scale_coversize.set_range(150, 300) scale_coversize.set_value( Lp().settings.get_value('cover-size').get_int32()) self._settings_dialog.connect('destroy', self._edit_settings_close) builder.connect_signals(self) main_chooser_box = builder.get_object('main_chooser_box') self._chooser_box = builder.get_object('chooser_box') self._set_outputs(combo_preview) # # Music tab # dirs = [] for directory in Lp().settings.get_value('music-path'): dirs.append(directory) # Main chooser self._main_chooser = ChooserWidget() image = Gtk.Image.new_from_icon_name("list-add-symbolic", Gtk.IconSize.MENU) self._main_chooser.set_icon(image) self._main_chooser.set_action(self._add_chooser) main_chooser_box.pack_start(self._main_chooser, False, True, 0) if len(dirs) > 0: path = dirs.pop(0) else: path = GLib.get_user_special_dir( GLib.UserDirectory.DIRECTORY_MUSIC) self._main_chooser.set_dir(path) # Others choosers for directory in dirs: self._add_chooser(directory) # # Last.fm tab # if Lp().lastfm is not None and Secret is not None: self._test_img = builder.get_object('test_img') self._login = builder.get_object('login') self._password = builder.get_object('password') schema = Secret.Schema.new("org.gnome.Lollypop", Secret.SchemaFlags.NONE, SecretSchema) Secret.password_lookup(schema, SecretAttributes, None, self._on_password_lookup) builder.get_object('lastfm_grid').set_sensitive(True) builder.get_object('lastfm_error').hide() self._login.set_text( Lp().settings.get_value('lastfm-login').get_string())