From 49bb08c8a3d0ecc6c9a80911dd8ed4e443b1189c Mon Sep 17 00:00:00 2001 From: MarkusHackspacher Date: Tue, 8 May 2018 10:43:56 +0200 Subject: [PATCH] fix E502 the backslash is redundant between brackets --- share/gpodder/examples/gpodder_mark_played.py | 2 +- src/gpodder/dbusproxy.py | 10 +- src/gpodder/download.py | 2 +- src/gpodder/gtkui/config.py | 2 +- src/gpodder/gtkui/desktop/preferences.py | 8 +- src/gpodder/gtkui/download.py | 18 +- src/gpodder/gtkui/interface/common.py | 6 +- src/gpodder/gtkui/interface/progress.py | 4 +- src/gpodder/gtkui/main.py | 182 +++++++++--------- src/gpodder/gtkui/model.py | 74 +++---- src/gpodder/model.py | 18 +- src/gpodder/my.py | 24 +-- src/gpodder/player.py | 16 +- 13 files changed, 183 insertions(+), 183 deletions(-) diff --git a/share/gpodder/examples/gpodder_mark_played.py b/share/gpodder/examples/gpodder_mark_played.py index b69d3d74..cc7ded52 100644 --- a/share/gpodder/examples/gpodder_mark_played.py +++ b/share/gpodder/examples/gpodder_mark_played.py @@ -27,7 +27,7 @@ import dbus import gpodder session_bus = dbus.SessionBus() -proxy = session_bus.get_object(gpodder.dbus_bus_name, \ +proxy = session_bus.get_object(gpodder.dbus_bus_name, gpodder.dbus_gui_object_path) interface = dbus.Interface(proxy, gpodder.dbus_interface) diff --git a/src/gpodder/dbusproxy.py b/src/gpodder/dbusproxy.py index 83c0435b..d12b10dd 100644 --- a/src/gpodder/dbusproxy.py +++ b/src/gpodder/dbusproxy.py @@ -55,17 +55,17 @@ class DBusPodcastsProxy(dbus.service.Object): """ #DBusPodcastsProxy(lambda: self.channels, self.on_itemUpdate_activate(), self.playback_episodes, self.download_episode_list, bus_name) - def __init__(self, get_podcast_list, \ - check_for_updates, playback_episodes, \ - download_episodes, episode_from_uri, \ + def __init__(self, get_podcast_list, + check_for_updates, playback_episodes, + download_episodes, episode_from_uri, bus_name): self._get_podcasts = get_podcast_list self._on_check_for_updates = check_for_updates self._playback_episodes = playback_episodes self._download_episodes = download_episodes self._episode_from_uri = episode_from_uri - dbus.service.Object.__init__(self, \ - object_path=gpodder.dbus_podcasts_object_path, \ + dbus.service.Object.__init__(self, + object_path=gpodder.dbus_podcasts_object_path, bus_name=bus_name) def _get_episode_refs(self, urls): diff --git a/src/gpodder/download.py b/src/gpodder/download.py index 4d26f5fb..712fc1b1 100644 --- a/src/gpodder/download.py +++ b/src/gpodder/download.py @@ -816,7 +816,7 @@ class DownloadTask(object): if disposition_filename is not None and disposition_filename != '': # The server specifies a download filename - try to use it disposition_filename = os.path.basename(disposition_filename) - self.filename = self.__episode.local_filename(create=True, \ + self.filename = self.__episode.local_filename(create=True, force_update=True, template=disposition_filename) new_mimetype, encoding = mimetypes.guess_type(self.filename) if new_mimetype is not None: diff --git a/src/gpodder/gtkui/config.py b/src/gpodder/gtkui/config.py index ab0b4497..b5e86eba 100644 --- a/src/gpodder/gtkui/config.py +++ b/src/gpodder/gtkui/config.py @@ -86,7 +86,7 @@ class ConfigModel(Gtk.ListStore): #else: # style = Pango.Style.ITALIC new_value_text = config.config_value_to_string(new_value) - self.set(row.iter, \ + self.set(row.iter, self.C_VALUE_TEXT, new_value_text, self.C_BOOLEAN_VALUE, bool(new_value), self.C_FONT_STYLE, style) diff --git a/src/gpodder/gtkui/desktop/preferences.py b/src/gpodder/gtkui/desktop/preferences.py index 20060c07..5e1308d4 100644 --- a/src/gpodder/gtkui/desktop/preferences.py +++ b/src/gpodder/gtkui/desktop/preferences.py @@ -478,8 +478,8 @@ class gPodderPreferences(BuilderWidget): self.preferred_vimeo_format_model.set_index(index) def on_button_audio_player_clicked(self, widget): - result = self.show_text_edit_dialog(_('Configure audio player'), \ - _('Command:'), \ + result = self.show_text_edit_dialog(_('Configure audio player'), + _('Command:'), self._config.player) if result: @@ -488,8 +488,8 @@ class gPodderPreferences(BuilderWidget): self.combo_audio_player_app.set_active(index) def on_button_video_player_clicked(self, widget): - result = self.show_text_edit_dialog(_('Configure video player'), \ - _('Command:'), \ + result = self.show_text_edit_dialog(_('Configure video player'), + _('Command:'), self._config.videoplayer) if result: diff --git a/src/gpodder/gtkui/download.py b/src/gpodder/gtkui/download.py index ec47dd79..9b677eae 100644 --- a/src/gpodder/gtkui/download.py +++ b/src/gpodder/gtkui/download.py @@ -72,13 +72,13 @@ class DownloadStatusModel(Gtk.ListStore): self.C_URL, task.url) if task.status == task.FAILED: - status_message = '%s: %s' % (\ - task.STATUS_MESSAGE[task.status], \ + status_message = '%s: %s' % ( + task.STATUS_MESSAGE[task.status], task.error_message) elif task.status == task.DOWNLOADING: - status_message = '%s (%.0f%%, %s/s)' % (\ - task.STATUS_MESSAGE[task.status], \ - task.progress * 100, \ + status_message = '%s (%.0f%%, %s/s)' % ( + task.STATUS_MESSAGE[task.status], + task.progress * 100, util.format_filesize(task.speed)) else: status_message = task.STATUS_MESSAGE[task.status] @@ -96,7 +96,7 @@ class DownloadStatusModel(Gtk.ListStore): progress_message = ' / '.join((current, total)) elif task.total_size > 0: - progress_message = util.format_filesize(task.total_size, \ + progress_message = util.format_filesize(task.total_size, digits=1) else: progress_message = ('unknown size') @@ -104,8 +104,8 @@ class DownloadStatusModel(Gtk.ListStore): self.set(iter, self.C_NAME, self._format_message(task.episode.title, status_message, task.episode.channel.title), - self.C_PROGRESS, 100. * task.progress, \ - self.C_PROGRESS_TEXT, progress_message, \ + self.C_PROGRESS, 100. * task.progress, + self.C_PROGRESS_TEXT, progress_message, self.C_ICON_NAME, self._status_ids[task.status]) def __add_new_task(self, task): @@ -135,7 +135,7 @@ class DownloadStatusModel(Gtk.ListStore): for row in self: task = row[DownloadStatusModel.C_TASK] if task is not None and \ - task.status in (task.DOWNLOADING, \ + task.status in (task.DOWNLOADING, task.QUEUED): return True diff --git a/src/gpodder/gtkui/interface/common.py b/src/gpodder/gtkui/interface/common.py index 939c17dd..e12393fc 100644 --- a/src/gpodder/gtkui/interface/common.py +++ b/src/gpodder/gtkui/interface/common.py @@ -40,7 +40,7 @@ class BuilderWidget(GtkBuilderWidget): # Enable support for tracking iconified state if hasattr(self, 'on_iconify') and hasattr(self, 'on_uniconify'): - self.main_window.connect('window-state-event', \ + self.main_window.connect('window-state-event', self._on_window_state_event_iconified) def _on_window_state_event_iconified(self, widget, event): @@ -89,9 +89,9 @@ class BuilderWidget(GtkBuilderWidget): dlg.destroy() return response == Gtk.ResponseType.YES - def show_text_edit_dialog(self, title, prompt, text=None, empty=False, \ + def show_text_edit_dialog(self, title, prompt, text=None, empty=False, is_url=False, affirmative_text=Gtk.STOCK_OK): - dialog = Gtk.Dialog(title, self.get_dialog_parent(), \ + dialog = Gtk.Dialog(title, self.get_dialog_parent(), Gtk.DialogFlags.MODAL | Gtk.DialogFlags.DESTROY_WITH_PARENT) dialog.add_button(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL) diff --git a/src/gpodder/gtkui/interface/progress.py b/src/gpodder/gtkui/interface/progress.py index a7fa089b..37f9bb07 100644 --- a/src/gpodder/gtkui/interface/progress.py +++ b/src/gpodder/gtkui/interface/progress.py @@ -54,7 +54,7 @@ class ProgressIndicator(object): return True def _create_progress(self): - self.dialog = Gtk.MessageDialog(self.parent, \ + self.dialog = Gtk.MessageDialog(self.parent, 0, 0, Gtk.ButtonsType.CANCEL, self.subtitle or self.title) self.dialog.set_modal(True) self.dialog.connect('delete-event', self._on_delete_event) @@ -67,7 +67,7 @@ class ProgressIndicator(object): if isinstance(label, Gtk.Label): label.set_selectable(False) - self.dialog.set_response_sensitive(Gtk.ResponseType.CANCEL, \ + self.dialog.set_response_sensitive(Gtk.ResponseType.CANCEL, self.cancellable) self.progressbar = Gtk.ProgressBar() diff --git a/src/gpodder/gtkui/main.py b/src/gpodder/gtkui/main.py index d5e83557..6e2fe132 100644 --- a/src/gpodder/gtkui/main.py +++ b/src/gpodder/gtkui/main.py @@ -589,14 +589,14 @@ class gPodder(BuilderWidget, dbus.service.Object): def ask(): # We're abusing the Episode Selector again ;) -- thp - gPodderEpisodeSelector(self.main_window, \ - title=_('Confirm changes from gpodder.net'), \ - instructions=_('Select the actions you want to carry out.'), \ - episodes=changes, \ - columns=columns, \ - size_attribute=None, \ - stock_ok_button=Gtk.STOCK_APPLY, \ - callback=execute_podcast_actions, \ + gPodderEpisodeSelector(self.main_window, + title=_('Confirm changes from gpodder.net'), + instructions=_('Select the actions you want to carry out.'), + episodes=changes, + columns=columns, + size_attribute=None, + stock_ok_button=Gtk.STOCK_APPLY, + callback=execute_podcast_actions, _config=self.config) # There are some actions that need the user's attention @@ -631,8 +631,8 @@ class gPodder(BuilderWidget, dbus.service.Object): def on_send_full_subscriptions(self): # Send the full subscription list to the gpodder.net client # (this will overwrite the subscription list on the server) - indicator = ProgressIndicator(_('Uploading subscriptions'), \ - _('Your subscriptions are being uploaded to the server.'), \ + indicator = ProgressIndicator(_('Uploading subscriptions'), + _('Your subscriptions are being uploaded to the server.'), False, self.get_dialog_parent()) try: @@ -643,8 +643,8 @@ class gPodder(BuilderWidget, dbus.service.Object): message = str(e) if not message: message = e.__class__.__name__ - self.show_message(message, \ - _('Error while uploading'), \ + self.show_message(message, + _('Error while uploading'), important=True) util.idle_add(show_error, e) @@ -659,10 +659,10 @@ class gPodder(BuilderWidget, dbus.service.Object): def for_each_episode_set_task_status(self, episodes, status): episode_urls = set(episode.url for episode in episodes) model = self.treeDownloads.get_model() - selected_tasks = [(Gtk.TreeRowReference.new(model, row.path), \ - model.get_value(row.iter, \ - DownloadStatusModel.C_TASK)) for row in model \ - if model.get_value(row.iter, DownloadStatusModel.C_TASK).url \ + selected_tasks = [(Gtk.TreeRowReference.new(model, row.path), + model.get_value(row.iter, + DownloadStatusModel.C_TASK)) for row in model + if model.get_value(row.iter, DownloadStatusModel.C_TASK).url in episode_urls] self._for_each_task_set_status(selected_tasks, status) @@ -1012,12 +1012,12 @@ class gPodder(BuilderWidget, dbus.service.Object): self.treeAvailable.connect('popup-menu', self.treeview_available_show_context_menu) - self.treeAvailable.enable_model_drag_source(Gdk.ModifierType.BUTTON1_MASK, \ + self.treeAvailable.enable_model_drag_source(Gdk.ModifierType.BUTTON1_MASK, (('text/uri-list', 0, 0),), Gdk.DragAction.COPY) def drag_data_get(tree, context, selection_data, info, timestamp): - uris = ['file://' + e.local_filename(create=False) \ - for e in self.get_selected_episodes() \ + uris = ['file://' + e.local_filename(create=False) + for e in self.get_selected_episodes() if e.was_downloaded(and_exists=True)] uris.append('') # for the trailing '\r\n' selection_data.set(selection_data.target, 8, '\r\n'.join(uris)) @@ -1045,7 +1045,7 @@ class gPodder(BuilderWidget, dbus.service.Object): cell = Gtk.CellRendererPixbuf() cell.set_property('stock-size', Gtk.IconSize.BUTTON) column.pack_start(cell, False) - column.add_attribute(cell, 'icon-name', \ + column.add_attribute(cell, 'icon-name', DownloadStatusModel.C_ICON_NAME) cell = Gtk.CellRendererText() @@ -1061,7 +1061,7 @@ class gPodder(BuilderWidget, dbus.service.Object): cell.set_property('yalign', .5) cell.set_property('ypad', 6) column = Gtk.TreeViewColumn(_('Progress'), cell, - value=DownloadStatusModel.C_PROGRESS, \ + value=DownloadStatusModel.C_PROGRESS, text=DownloadStatusModel.C_PROGRESS_TEXT) column.set_sizing(Gtk.TreeViewColumnSizing.AUTOSIZE) column.set_expand(False) @@ -1387,13 +1387,13 @@ class gPodder(BuilderWidget, dbus.service.Object): selection = treeview.get_selection() model, paths = selection.get_selected_rows() - if path is None or (path not in paths and \ + if path is None or (path not in paths and event.button == 3): # We have right-clicked, but not into the selection, # assume we don't want to operate on the selection paths = [] - if path is not None and not paths and \ + if path is not None and not paths and event.button == 3: # No selection or clicked outside selection; # select the single item where we clicked @@ -1417,27 +1417,27 @@ class gPodder(BuilderWidget, dbus.service.Object): model, paths = selection.get_selected_rows() can_queue, can_cancel, can_pause, can_remove, can_force = (True,) * 5 - selected_tasks = [(Gtk.TreeRowReference.new(model, path), \ - model.get_value(model.get_iter(path), \ + selected_tasks = [(Gtk.TreeRowReference.new(model, path), + model.get_value(model.get_iter(path), DownloadStatusModel.C_TASK)) for path in paths] for row_reference, task in selected_tasks: if task.status != download.DownloadTask.QUEUED: can_force = False - if task.status not in (download.DownloadTask.PAUSED, \ - download.DownloadTask.FAILED, \ + if task.status not in (download.DownloadTask.PAUSED, + download.DownloadTask.FAILED, download.DownloadTask.CANCELLED): can_queue = False - if task.status not in (download.DownloadTask.PAUSED, \ - download.DownloadTask.QUEUED, \ - download.DownloadTask.DOWNLOADING, \ + if task.status not in (download.DownloadTask.PAUSED, + download.DownloadTask.QUEUED, + download.DownloadTask.DOWNLOADING, download.DownloadTask.FAILED): can_cancel = False - if task.status not in (download.DownloadTask.QUEUED, \ + if task.status not in (download.DownloadTask.QUEUED, download.DownloadTask.DOWNLOADING): can_pause = False - if task.status not in (download.DownloadTask.CANCELLED, \ - download.DownloadTask.FAILED, \ + if task.status not in (download.DownloadTask.CANCELLED, + download.DownloadTask.FAILED, download.DownloadTask.DONE): can_remove = False @@ -2050,7 +2050,7 @@ class gPodder(BuilderWidget, dbus.service.Object): logger.error('Exception in D-Bus call: %s', str(err)) # Fallback: use the command line client - for command in util.format_desktop_command('panucci', \ + for command in util.format_desktop_command('panucci', [filename]): logger.info('Executing: %s', repr(command)) subprocess.Popen(command) @@ -2058,7 +2058,7 @@ class gPodder(BuilderWidget, dbus.service.Object): on_error = lambda err: error_handler(filename, err) # This method only exists in Panucci > 0.9 ('new Panucci') - i.playback_from(filename, resume_position, \ + i.playback_from(filename, resume_position, reply_handler=on_reply, error_handler=on_error) continue # This file was handled by the D-Bus call @@ -2089,14 +2089,14 @@ class gPodder(BuilderWidget, dbus.service.Object): def playback_episodes(self, episodes): # We need to create a list, because we run through it more than once - episodes = list(Model.sort_episodes_by_pubdate(e for e in episodes if \ + episodes = list(Model.sort_episodes_by_pubdate(e for e in episodes if e.was_downloaded(and_exists=True) or self.streaming_possible())) try: self.playback_episodes_for_real(episodes) except Exception as e: logger.error('Error in playback!', exc_info=True) - self.show_message(_('Please check your media player settings in the preferences dialog.'), \ + self.show_message(_('Please check your media player settings in the preferences dialog.'), _('Error opening player')) self.episode_list_status_changed(episodes) @@ -2328,8 +2328,8 @@ class gPodder(BuilderWidget, dbus.service.Object): error_messages = {} redirections = {} - progress = ProgressIndicator(_('Adding podcasts'), \ - _('Please wait while episode information is downloaded.'), \ + progress = ProgressIndicator(_('Adding podcasts'), + _('Please wait while episode information is downloaded.'), parent=self.get_dialog_parent()) def on_after_update(): @@ -2373,7 +2373,7 @@ class gPodder(BuilderWidget, dbus.service.Object): if failed: title = _('Could not add some podcasts') message = _('Some podcasts could not be added to your list:') \ - + '\n\n' + '\n'.join(cgi.escape('%s: %s' % (url, \ + + '\n\n' + '\n'.join(cgi.escape('%s: %s' % (url, error_messages.get(url, _('Unknown')))) for url in failed) self.show_message(message, title, important=True) @@ -2409,9 +2409,9 @@ class gPodder(BuilderWidget, dbus.service.Object): episodes.extend(podcast.get_all_episodes()) if episodes: - episodes = list(Model.sort_episodes_by_pubdate(episodes, \ + episodes = list(Model.sort_episodes_by_pubdate(episodes, reverse=True)) - self.new_episodes_show(episodes, \ + self.new_episodes_show(episodes, selected=[e.check_is_new() for e in episodes]) @util.run_in_background @@ -2424,8 +2424,8 @@ class gPodder(BuilderWidget, dbus.service.Object): progress.on_message(title or url) try: # The URL is valid and does not exist already - subscribe! - channel = self.model.load_podcast(url=url, create=True, \ - authentication_tokens=auth_tokens.get(url, None), \ + channel = self.model.load_podcast(url=url, create=True, + authentication_tokens=auth_tokens.get(url, None), max_episodes=self.config.max_episodes_per_feed) try: @@ -2491,8 +2491,8 @@ class gPodder(BuilderWidget, dbus.service.Object): the server to the local database and update the status of the affected episodes as necessary. """ - indicator = ProgressIndicator(_('Merging episode actions'), \ - _('Episode actions from gpodder.net are merged.'), \ + indicator = ProgressIndicator(_('Merging episode actions'), + _('Episode actions from gpodder.net are merged.'), False, self.get_dialog_parent()) Gtk.main_iteration() @@ -2722,8 +2722,8 @@ class gPodder(BuilderWidget, dbus.service.Object): if confirm and not self.show_confirmation(message, title): return False - progress = ProgressIndicator(_('Deleting episodes'), \ - _('Please wait while episodes are deleted'), \ + progress = ProgressIndicator(_('Deleting episodes'), + _('Please wait while episodes are deleted'), parent=self.get_dialog_parent()) def finish_deletion(episode_urls, channel_urls): @@ -2799,9 +2799,9 @@ class gPodder(BuilderWidget, dbus.service.Object): selected = [not e.is_new or not e.file_exists() for e in episodes] - gPodderEpisodeSelector(self.main_window, title = _('Delete episodes'), instructions = instructions, \ - episodes = episodes, selected = selected, columns = columns, \ - stock_ok_button = 'edit-delete', callback = self.delete_episode_list, \ + gPodderEpisodeSelector(self.main_window, title = _('Delete episodes'), instructions = instructions, + episodes = episodes, selected = selected, columns = columns, + stock_ok_button = 'edit-delete', callback = self.delete_episode_list, selection_buttons = selection_buttons, _config=self.config) def on_selected_episodes_status_changed(self): @@ -2991,23 +2991,23 @@ class gPodder(BuilderWidget, dbus.service.Object): # Select all by default selected = [True] * len(episodes) - self.new_episodes_window = gPodderEpisodeSelector(self.main_window, \ - title=_('New episodes available'), \ - instructions=instructions, \ - episodes=episodes, \ - columns=columns, \ - selected=selected, \ - stock_ok_button = 'gpodder-download', \ - callback=download_episodes_callback, \ - remove_callback=lambda e: e.mark_old(), \ - remove_action=_('Mark as old'), \ - remove_finished=self.episode_new_status_changed, \ - _config=self.config, \ + self.new_episodes_window = gPodderEpisodeSelector(self.main_window, + title=_('New episodes available'), + instructions=instructions, + episodes=episodes, + columns=columns, + selected=selected, + stock_ok_button = 'gpodder-download', + callback=download_episodes_callback, + remove_callback=lambda e: e.mark_old(), + remove_action=_('Mark as old'), + remove_finished=self.episode_new_status_changed, + _config=self.config, show_notification=False) def on_itemDownloadAllNew_activate(self, action, param): if not self.offer_new_episodes(): - self.show_message(_('Please check for new episodes later.'), \ + self.show_message(_('Please check for new episodes later.'), _('No new episodes available')) def get_new_episodes(self, channels=None): @@ -3049,7 +3049,7 @@ class gPodder(BuilderWidget, dbus.service.Object): def on_download_subscriptions_from_mygpo(self, action=None): def after_login(): - title = _('Subscriptions on %(server)s') \ + title = _('Subscriptions on %(server)s') % {'server': self.config.mygpo.server} dir = gPodderPodcastDirectory(self.gPodder, _config=self.config, @@ -3081,7 +3081,7 @@ class gPodder(BuilderWidget, dbus.service.Object): util.idle_add(after_login) def on_itemAddChannel_activate(self, action=None, param=None): - self._add_podcast_dialog = gPodderAddPodcast(self.gPodder, \ + self._add_podcast_dialog = gPodderAddPodcast(self.gPodder, add_podcast_list=self.add_podcast_list) def on_itemEditChannel_activate(self, action, param=None): @@ -3106,14 +3106,14 @@ class gPodder(BuilderWidget, dbus.service.Object): # We're abusing the Episode Selector for selecting Podcasts here, # but it works and looks good, so why not? -- thp - gPodderEpisodeSelector(self.main_window, \ - title=_('Delete podcasts'), \ - instructions=_('Select the podcast you want to delete.'), \ - episodes=self.channels, \ - columns=columns, \ - size_attribute=None, \ - stock_ok_button=_('Delete'), \ - callback=self.remove_podcast_list, \ + gPodderEpisodeSelector(self.main_window, + title=_('Delete podcasts'), + instructions=_('Select the podcast you want to delete.'), + episodes=self.channels, + columns=columns, + size_attribute=None, + stock_ok_button=_('Delete'), + callback=self.remove_podcast_list, _config=self.config) def remove_podcast_list(self, channels, confirm=True): @@ -3215,8 +3215,8 @@ class gPodder(BuilderWidget, dbus.service.Object): dlg.destroy() if filename is not None: - dir = gPodderPodcastDirectory(self.gPodder, _config=self.config, \ - custom_title=_('Import podcasts from OPML file'), \ + dir = gPodderPodcastDirectory(self.gPodder, _config=self.config, + custom_title=_('Import podcasts from OPML file'), add_podcast_list=self.add_podcast_list, hide_url_entry=True) dir.download_opml_file(filename) @@ -3332,7 +3332,7 @@ class gPodder(BuilderWidget, dbus.service.Object): def get_podcast_urls_from_selected_episodes(self): """Get a set of podcast URLs based on the selected episodes""" - return set(episode.channel.url for episode in \ + return set(episode.channel.url for episode in self.get_selected_episodes()) def get_selected_episodes(self): @@ -3367,12 +3367,12 @@ class gPodder(BuilderWidget, dbus.service.Object): GObject.source_remove(self._auto_update_timer_source_id) self._auto_update_timer_source_id = None - if self.config.auto_update_feeds and \ + if self.config.auto_update_feeds and self.config.auto_update_frequency: interval = 60 * 1000 * self.config.auto_update_frequency logger.debug('Setting up auto update timer with interval %d.', self.config.auto_update_frequency) - self._auto_update_timer_source_id = GObject.timeout_add(\ + self._auto_update_timer_source_id = GObject.timeout_add( interval, self._on_auto_update_timer) def _on_auto_update_timer(self): @@ -3413,14 +3413,14 @@ class gPodder(BuilderWidget, dbus.service.Object): if self.wNotebook.get_current_page() == 0: selection = self.treeAvailable.get_selection() (model, paths) = selection.get_selected_rows() - urls = [model.get_value(model.get_iter(path), \ + urls = [model.get_value(model.get_iter(path), self.episode_list_model.C_URL) for path in paths] - selected_tasks = [task for task in self.download_tasks_seen \ + selected_tasks = [task for task in self.download_tasks_seen if task.url in urls] else: selection = self.treeDownloads.get_selection() (model, paths) = selection.get_selected_rows() - selected_tasks = [model.get_value(model.get_iter(path), \ + selected_tasks = [model.get_value(model.get_iter(path), self.download_status_model.C_TASK) for path in paths] self.cancel_task_list(selected_tasks) @@ -3665,7 +3665,7 @@ class gPodderApplication(Gtk.Application): self.bus_name = dbus.service.BusName(gpodder.dbus_bus_name, bus=gpodder.dbus_session_bus) except dbus.exceptions.DBusException as dbe: logger.warn('Cannot get "on the bus".', exc_info=True) - dlg = Gtk.MessageDialog(None, Gtk.DialogFlags.MODAL, Gtk.MessageType.ERROR, \ + dlg = Gtk.MessageDialog(None, Gtk.DialogFlags.MODAL, Gtk.MessageType.ERROR, Gtk.ButtonsType.CLOSE, _('Cannot start gPodder')) dlg.format_secondary_markup(_('D-Bus error: %s') % (str(dbe),)) dlg.set_title('gPodder') @@ -3689,7 +3689,7 @@ class gPodderApplication(Gtk.Application): self.window.gPodder.present() def on_about(self, action, param): - dlg = Gtk.Dialog(_('About gPodder'), self.window.gPodder, \ + dlg = Gtk.Dialog(_('About gPodder'), self.window.gPodder, Gtk.DialogFlags.MODAL) dlg.add_button(Gtk.STOCK_CLOSE, Gtk.ResponseType.OK).show() dlg.set_resizable(False) @@ -3735,13 +3735,13 @@ class gPodderApplication(Gtk.Application): util.open_website('https://gpodder.github.io/docs/') def on_itemPreferences_activate(self, action, param=None): - gPodderPreferences(self.window.gPodder, \ - _config=self.window.config, \ - user_apps_reader=self.window.user_apps_reader, \ - parent_window=self.window.main_window, \ - mygpo_client=self.window.mygpo_client, \ - on_send_full_subscriptions=self.window.on_send_full_subscriptions, \ - on_itemExportChannels_activate=self.window.on_itemExportChannels_activate, \ + gPodderPreferences(self.window.gPodder, + _config=self.window.config, + user_apps_reader=self.window.user_apps_reader, + parent_window=self.window.main_window, + mygpo_client=self.window.mygpo_client, + on_send_full_subscriptions=self.window.on_send_full_subscriptions, + on_itemExportChannels_activate=self.window.on_itemExportChannels_activate, on_extension_enabled=self.on_extension_enabled, on_extension_disabled=self.on_extension_disabled) diff --git a/src/gpodder/gtkui/model.py b/src/gpodder/gtkui/model.py index b4d1e458..0b0a902e 100644 --- a/src/gpodder/gtkui/model.py +++ b/src/gpodder/gtkui/model.py @@ -68,11 +68,11 @@ class GEpisode(model.PodcastEpisode): length_str = '%s; ' % util.format_filesize(self.file_size) else: length_str = '' - return ('%s\n%s' + _('released %s') + \ - '; ' + _('from %s') + '') % (\ - cgi.escape(re.sub('\s+', ' ', self.title)), \ - cgi.escape(length_str), \ - cgi.escape(self.pubdate_prop), \ + return ('%s\n%s' + _('released %s') + + '; ' + _('from %s') + '') % ( + cgi.escape(re.sub('\s+', ' ', self.title)), + cgi.escape(length_str), + cgi.escape(self.pubdate_prop), cgi.escape(re.sub('\s+', ' ', self.channel.title))) @property @@ -86,12 +86,12 @@ class GEpisode(model.PodcastEpisode): downloaded_string = self.get_age_string() if not downloaded_string: downloaded_string = _('today') - return ('%s\n%s; %s; ' + _('downloaded %s') + \ - '; ' + _('from %s') + '') % (\ - cgi.escape(self.title), \ - cgi.escape(util.format_filesize(self.file_size)), \ - cgi.escape(played_string), \ - cgi.escape(downloaded_string), \ + return ('%s\n%s; %s; ' + _('downloaded %s') + + '; ' + _('from %s') + '') % ( + cgi.escape(self.title), + cgi.escape(util.format_filesize(self.file_size)), + cgi.escape(played_string), + cgi.escape(downloaded_string), cgi.escape(self.channel.title)) @@ -148,11 +148,11 @@ class BackgroundUpdate(object): class EpisodeListModel(Gtk.ListStore): - C_URL, C_TITLE, C_FILESIZE_TEXT, C_EPISODE, C_STATUS_ICON, \ - C_PUBLISHED_TEXT, C_DESCRIPTION, C_TOOLTIP, \ - C_VIEW_SHOW_UNDELETED, C_VIEW_SHOW_DOWNLOADED, \ - C_VIEW_SHOW_UNPLAYED, C_FILESIZE, C_PUBLISHED, \ - C_TIME, C_TIME_VISIBLE, C_TOTAL_TIME, \ + C_URL, C_TITLE, C_FILESIZE_TEXT, C_EPISODE, C_STATUS_ICON, + C_PUBLISHED_TEXT, C_DESCRIPTION, C_TOOLTIP, + C_VIEW_SHOW_UNDELETED, C_VIEW_SHOW_DOWNLOADED, + C_VIEW_SHOW_UNPLAYED, C_FILESIZE, C_PUBLISHED, + C_TIME, C_TIME_VISIBLE, C_TOTAL_TIME, C_LOCKED = list(range(17)) VIEW_ALL, VIEW_UNDELETED, VIEW_DOWNLOADED, VIEW_UNPLAYED = list(range(4)) @@ -166,8 +166,8 @@ class EpisodeListModel(Gtk.ListStore): PROGRESS_STEPS = 20 def __init__(self, config, on_filter_changed=lambda has_episodes: None): - Gtk.ListStore.__init__(self, str, str, str, object, \ - str, str, str, str, bool, bool, bool, \ + Gtk.ListStore.__init__(self, str, str, str, object, + str, str, str, str, bool, bool, bool, GObject.TYPE_INT64, GObject.TYPE_INT64, str, bool, GObject.TYPE_INT64, bool) self._config = config @@ -514,10 +514,10 @@ class PodcastChannelProxy(object): class PodcastListModel(Gtk.ListStore): - C_URL, C_TITLE, C_DESCRIPTION, C_PILL, C_CHANNEL, \ - C_COVER, C_ERROR, C_PILL_VISIBLE, \ - C_VIEW_SHOW_UNDELETED, C_VIEW_SHOW_DOWNLOADED, \ - C_VIEW_SHOW_UNPLAYED, C_HAS_EPISODES, C_SEPARATOR, \ + C_URL, C_TITLE, C_DESCRIPTION, C_PILL, C_CHANNEL, + C_COVER, C_ERROR, C_PILL_VISIBLE, + C_VIEW_SHOW_UNDELETED, C_VIEW_SHOW_DOWNLOADED, + C_VIEW_SHOW_UNPLAYED, C_HAS_EPISODES, C_SEPARATOR, C_DOWNLOADS, C_COVER_VISIBLE, C_SECTION = list(range(16)) SEARCH_COLUMNS = (C_TITLE, C_DESCRIPTION, C_SECTION) @@ -527,8 +527,8 @@ class PodcastListModel(Gtk.ListStore): return model.get_value(iter, cls.C_SEPARATOR) def __init__(self, cover_downloader): - Gtk.ListStore.__init__(self, str, str, str, GdkPixbuf.Pixbuf, \ - object, GdkPixbuf.Pixbuf, str, bool, bool, bool, bool, \ + Gtk.ListStore.__init__(self, str, str, str, GdkPixbuf.Pixbuf, + object, GdkPixbuf.Pixbuf, str, bool, bool, bool, bool, bool, bool, int, bool, str) # Filter to allow hiding some episodes @@ -706,7 +706,7 @@ class PodcastListModel(Gtk.ListStore): else: return None - def _format_description(self, channel, total, deleted, \ + def _format_description(self, channel, total, deleted, new, downloaded, unplayed): title_markup = cgi.escape(channel.title) if not channel.pause_subscription: @@ -864,22 +864,22 @@ class PodcastListModel(Gtk.ListStore): return total, deleted, new, downloaded, unplayed = channel.get_statistics() - description = self._format_description(channel, total, deleted, new, \ + description = self._format_description(channel, total, deleted, new, downloaded, unplayed) pill_image = self._get_pill_image(channel, downloaded, unplayed) - self.set(iter, \ - self.C_TITLE, channel.title, \ - self.C_DESCRIPTION, description, \ - self.C_SECTION, channel.section, \ - self.C_ERROR, self._format_error(channel), \ - self.C_PILL, pill_image, \ - self.C_PILL_VISIBLE, pill_image is not None, \ - self.C_VIEW_SHOW_UNDELETED, total - deleted > 0, \ - self.C_VIEW_SHOW_DOWNLOADED, downloaded + new > 0, \ - self.C_VIEW_SHOW_UNPLAYED, unplayed + new > 0, \ - self.C_HAS_EPISODES, total > 0, \ + self.set(iter, + self.C_TITLE, channel.title, + self.C_DESCRIPTION, description, + self.C_SECTION, channel.section, + self.C_ERROR, self._format_error(channel), + self.C_PILL, pill_image, + self.C_PILL_VISIBLE, pill_image is not None, + self.C_VIEW_SHOW_UNDELETED, total - deleted > 0, + self.C_VIEW_SHOW_DOWNLOADED, downloaded + new > 0, + self.C_VIEW_SHOW_UNPLAYED, unplayed + new > 0, + self.C_HAS_EPISODES, total > 0, self.C_DOWNLOADS, downloaded) def clear_cover_cache(self, podcast_url): diff --git a/src/gpodder/model.py b/src/gpodder/model.py index 5b0a65d4..b16e054c 100644 --- a/src/gpodder/model.py +++ b/src/gpodder/model.py @@ -138,7 +138,7 @@ class PodcastEpisode(PodcastModelObject): is_locked = property(fget=_deprecated, fset=_deprecated) def has_website_link(self): - return bool(self.link) and (self.link != self.url or \ + return bool(self.link) and (self.link != self.url or youtube.is_video_link(self.link)) @classmethod @@ -336,7 +336,7 @@ class PodcastEpisode(PodcastModelObject): self.save() def age_in_days(self): - return util.file_age_in_days(self.local_filename(create=False, \ + return util.file_age_in_days(self.local_filename(create=False, check_only=True)) age_int_prop = property(fget=age_in_days) @@ -576,8 +576,8 @@ class PodcastEpisode(PodcastModelObject): value is the canonical representation of this episode in playlists (for example, M3U playlists). """ - return '%s - %s (%s)' % (self.channel.title, \ - self.title, \ + return '%s - %s (%s)' % (self.channel.title, + self.title, self.cute_pubdate()) def cute_pubdate(self): @@ -616,8 +616,8 @@ class PodcastEpisode(PodcastModelObject): current position is greater than 99 percent of the total time or inside the last 10 seconds of a track. """ - return self.current_position > 0 and self.total_time > 0 and \ - (self.current_position + 10 >= self.total_time or \ + return self.current_position > 0 and self.total_time > 0 and + (self.current_position + 10 >= self.total_time or self.current_position >= self.total_time * .99) def get_play_info_string(self, duration_only=False): @@ -752,8 +752,8 @@ class PodcastChannel(PodcastModelObject): known_files.add(filename) - existing_files = set(filename for filename in \ - glob.glob(os.path.join(self.save_dir, '*')) \ + existing_files = set(filename for filename in + glob.glob(os.path.join(self.save_dir, '*')) if not filename.endswith('.partial')) ignore_files = ['folder' + ext for ext in @@ -779,7 +779,7 @@ class PodcastChannel(PodcastModelObject): continue for episode in all_episodes: - wanted_filename = episode.local_filename(create=True, \ + wanted_filename = episode.local_filename(create=True, return_wanted_filename=True) if basename == wanted_filename: logger.info('Importing external download: %s', filename) diff --git a/src/gpodder/my.py b/src/gpodder/my.py index 5d7ecd83..31ee03ee 100644 --- a/src/gpodder/my.py +++ b/src/gpodder/my.py @@ -47,7 +47,7 @@ mygpoclient.user_agent += ' ' + gpodder.user_agent # 2013-02-08: We should update this to 1.7 once we use the new features MYGPOCLIENT_REQUIRED = '1.4' -if not hasattr(mygpoclient, 'require_version') or \ +if not hasattr(mygpoclient, 'require_version') or not mygpoclient.require_version(MYGPOCLIENT_REQUIRED): print(""" Please upgrade your mygpoclient library. @@ -474,17 +474,17 @@ class MygPoClient(object): def convert_to_api(action): dt = datetime.datetime.utcfromtimestamp(action.timestamp) action_ts = mygpoutil.datetime_to_iso8601(dt) - return api.EpisodeAction(action.podcast_url, \ - action.episode_url, action.action, \ - action.device_id, action_ts, \ + return api.EpisodeAction(action.podcast_url, + action.episode_url, action.action, + action.device_id, action_ts, action.started, action.position, action.total) def convert_from_api(action): dt = mygpoutil.iso8601_to_datetime(action.timestamp) action_ts = calendar.timegm(dt.timetuple()) - return ReceivedEpisodeAction(action.podcast, \ - action.episode, action.device, \ - action.action, action_ts, \ + return ReceivedEpisodeAction(action.podcast, + action.episode, action.device, + action.action, action_ts, action.started, action.position, action.total) try: @@ -547,8 +547,8 @@ class MygPoClient(object): logger.debug('Starting subscription sync.') try: # Load the "since" value from the database - since_o = self._store.get(SinceValue, host=self.host, \ - device_id=self.device_id, \ + since_o = self._store.get(SinceValue, host=self.host, + device_id=self.device_id, category=SinceValue.PODCASTS) # Use a default since object for the first-time case @@ -611,7 +611,7 @@ class MygPoClient(object): def update_device(self, action): try: logger.debug('Uploading device settings...') - self._client.update_device_settings(action.device_id, \ + self._client.update_device_settings(action.device_id, action.caption, action.device_type) logger.debug('Device settings uploaded.') return True @@ -646,8 +646,8 @@ class MygPoClient(object): def get_download_user_subscriptions_url(self): OPML_URL = self._client.locator.subscriptions_uri() - url = util.url_add_authentication(OPML_URL, \ - self._config.mygpo.username, \ + url = util.url_add_authentication(OPML_URL, + self._config.mygpo.username, self._config.mygpo.password) return url diff --git a/src/gpodder/player.py b/src/gpodder/player.py index 9043c69c..7e60f48e 100644 --- a/src/gpodder/player.py +++ b/src/gpodder/player.py @@ -66,15 +66,15 @@ class MediaPlayerDBusReceiver(object): self.on_play_event = on_play_event self.bus = gpodder.dbus_session_bus - self.bus.add_signal_receiver(self.on_playback_started, \ - self.SIGNAL_STARTED, \ - self.INTERFACE, \ - None, \ + self.bus.add_signal_receiver(self.on_playback_started, + self.SIGNAL_STARTED, + self.INTERFACE, + None, None) - self.bus.add_signal_receiver(self.on_playback_stopped, \ - self.SIGNAL_STOPPED, \ - self.INTERFACE, \ - None, \ + self.bus.add_signal_receiver(self.on_playback_stopped, + self.SIGNAL_STOPPED, + self.INTERFACE, + None, None) def on_playback_started(self, position, file_uri):