Add option to flattr an extensions and to show documentation

If an extension author adds an flattr url to the extensions metadata
gPodder shows the "Flattr this" menu entry in the popup menu for an
extension in the preference dialog.
Alternative the extension author can add an url to the extensions
metadata to link to the authors donation page (Support the author).

Also the extension author can add an url to the extensions metadata
to link to the extensions user documentation.
This commit is contained in:
Bernd Schlapsi 2013-03-24 21:13:27 +01:00 committed by Thomas Perl
parent 509cca2661
commit bbfcd58ba6
13 changed files with 92 additions and 10 deletions

View File

@ -20,6 +20,8 @@ _ = gpodder.gettext
__title__ = _('Convert audio files')
__description__ = _('Transcode audio files to mp3/ogg')
__authors__ = 'Bernd Schlapsi <brot@gmx.info>, Thomas Perl <thp@gpodder.org>'
__doc__ = 'http://wiki.gpodder.org/wiki/Extensions/AudioConverter'
__payment__ = 'https://flattr.com/submit/auto?user_id=BerndSch&url=http://wiki.gpodder.org/wiki/Extensions/AudioConverter'
__category__ = 'post-download'

View File

@ -15,7 +15,9 @@ _ = gpodder.gettext
__title__ = _('Enqueue in media players')
__description__ = _('Add a context menu item for enqueueing episodes in installed media players')
__author__ = 'Thomas Perl <thp@gpodder.org>, Bernd Schlapsi <brot@gmx.info>'
__authors__ = 'Thomas Perl <thp@gpodder.org>, Bernd Schlapsi <brot@gmx.info>'
__doc__ = 'http://wiki.gpodder.org/wiki/Extensions/EnqueueInMediaplayer'
__payment__ = 'https://flattr.com/submit/auto?user_id=BerndSch&url=http://wiki.gpodder.org/wiki/Extensions/EnqueueInMediaplayer'
__category__ = 'interface'
__only_for__ = 'gtk'

View File

@ -21,6 +21,8 @@ _ = gpodder.gettext
__title__ = _('Normalize audio with re-encoding')
__description__ = _('Normalize the volume of audio files with normalize-audio')
__authors__ = 'Bernd Schlapsi <brot@gmx.info>'
__doc__ = 'http://wiki.gpodder.org/wiki/Extensions/NormalizeAudio'
__payment__ = 'https://flattr.com/submit/auto?user_id=BerndSch&url=http://wiki.gpodder.org/wiki/Extensions/NormalizeAudio'
__category__ = 'post-download'

View File

@ -16,6 +16,8 @@ _ = gpodder.gettext
__title__ = _('Rename episodes after download')
__description__ = _('Rename episodes to "<Episode Title>.<ext>" on download')
__authors__ = 'Bernd Schlapsi <brot@gmx.info>, Thomas Perl <thp@gpodder.org>'
__doc__ = 'http://wiki.gpodder.org/wiki/Extensions/RenameAfterDownload'
__payment__ = 'https://flattr.com/submit/auto?user_id=BerndSch&url=http://wiki.gpodder.org/wiki/Extensions/RenameAfterDownload'
__category__ = 'post-download'

View File

@ -37,6 +37,8 @@ _ = gpodder.gettext
__title__ = _('Remove cover art from OGG files')
__description__ = _('removes coverart from all downloaded ogg files')
__authors__ = 'Bernd Schlapsi <brot@gmx.info>'
__doc__ = 'http://wiki.gpodder.org/wiki/Extensions/RemoveOGGCover'
__payment__ = 'https://flattr.com/submit/auto?user_id=BerndSch&url=http://wiki.gpodder.org/wiki/Extensions/RemoveOGGCover'
__category__ = 'post-download'

View File

@ -18,7 +18,7 @@ import requests
__title__ = _('Stream to Sonos')
__description__ = _('Stream podcasts to Sonos speakers')
__author__ = 'Stefan Kögl <stefan@skoegl.net>'
__authors__ = 'Stefan Kögl <stefan@skoegl.net>'
__category__ = 'interface'
__only_for__ = 'gtk'

View File

@ -38,6 +38,8 @@ _ = gpodder.gettext
__title__ = _('Tag downloaded files using Mutagen')
__description__ = _('Add episode and podcast titles to MP3/OGG tags')
__authors__ = 'Bernd Schlapsi <brot@gmx.info>'
__doc__ = 'http://wiki.gpodder.org/wiki/Extensions/Tagging'
__payment__ = 'https://flattr.com/submit/auto?user_id=BerndSch&url=http://wiki.gpodder.org/wiki/Extensions/Tagging'
__category__ = 'post-download'

View File

@ -14,6 +14,8 @@ _ = gpodder.gettext
__title__ = _('Search for new episodes on startup')
__description__ = _('Starts the search for new episodes on startup')
__authors__ = 'Bernd Schlapsi <brot@gmx.info>'
__doc__ = 'http://wiki.gpodder.org/wiki/Extensions/SearchEpisodeOnStartup'
__payment__ = 'https://flattr.com/submit/auto?user_id=BerndSch&url=http://wiki.gpodder.org/wiki/Extensions/SearchEpisodeOnStartup'
__category__ = 'interface'
__only_for__ = 'gtk'

View File

@ -22,6 +22,8 @@ _ = gpodder.gettext
__title__ = _('Convert video files')
__description__ = _('Transcode video files to avi/mp4/m4v')
__authors__ = 'Thomas Perl <thp@gpodder.org>, Bernd Schlapsi <brot@gmx.info>'
__doc__ = 'http://wiki.gpodder.org/wiki/Extensions/VideoConverter'
__payment__ = 'https://flattr.com/submit/auto?user_id=BerndSch&url=http://wiki.gpodder.org/wiki/Extensions/VideoConverter'
__category__ = 'post-download'
DefaultConfig = {

View File

@ -191,7 +191,8 @@
<property name="reorderable">False</property>
<property name="enable_search">True</property>
<property name="search_column">1</property>
<signal name="row-activated" handler="on_treeview_extensions_row_activated" swapped="no"/>
<signal name="popup-menu" handler="on_treeview_extension_show_context_menu" swapped="no"/>
<signal name="button-release-event" handler="on_treeview_extension_button_released" swapped="no"/>
</object>
</child>
</object>

View File

@ -98,12 +98,14 @@ class ExtensionMetadata(object):
# Default fallback metadata in case metadata fields are missing
DEFAULTS = {
'description': _('No description for this extension.'),
'doc': None,
'payment': None,
}
SORTKEYS = {
'title': 1,
'description': 2,
'category': 3,
'author': 4,
'authors': 4,
'only_for': 5,
'mandatory_in': 6,
'disable_in': 7,

View File

@ -226,3 +226,13 @@ class Flattr(object):
self._worker_thread = util.run_in_background(lambda: self._worker_proc(), True)
return (True, content.get('description', _('No description')))
def is_flattr_url(self, url):
if 'flattr.com' in url:
return True
return False
def is_flattrable(self, url):
if self._config.token and self.is_flattr_url(url):
return True
return False

View File

@ -34,6 +34,7 @@ from gpodder import util
from gpodder import youtube
from gpodder.gtkui.interface.common import BuilderWidget
from gpodder.gtkui.interface.common import TreeViewHelper
from gpodder.gtkui.interface.configeditor import gPodderConfigEditor
from gpodder.gtkui.desktopfile import PlayerListModel
@ -328,6 +329,55 @@ class gPodderPreferences(BuilderWidget):
self.treeviewExtensions.set_model(self.extensions_model)
self.treeviewExtensions.columns_autosize()
def on_treeview_extension_button_released(self, treeview, event):
if event.window != treeview.get_bin_window():
return False
if event.type == gtk.gdk.BUTTON_RELEASE and event.button == 3:
return self.on_treeview_extension_show_context_menu(treeview, event)
return False
def on_treeview_extension_show_context_menu(self, treeview, event=None):
selection = treeview.get_selection()
model, paths = selection.get_selected_rows()
container = model.get_value(model.get_iter(paths[0]), self.C_EXTENSION)
if not container:
return
menu = gtk.Menu()
if container.metadata.doc:
menu_item = gtk.MenuItem(_('Documentation'))
menu_item.connect('activate', self.open_weblink,
container.metadata.doc)
menu.append(menu_item)
menu_item = gtk.MenuItem(_('Extension info'))
menu_item.connect('activate', self.show_extension_info, model, container)
menu.append(menu_item)
if container.metadata.payment:
if self.flattr.is_flattrable(container.metadata.payment):
menu_item = gtk.MenuItem(_('Flattr this'))
menu_item.connect('activate', self.flattr_extension,
container.metadata.payment)
else:
menu_item = gtk.MenuItem(_('Support the author'))
menu_item.connect('activate', self.open_weblink,
container.metadata.payment)
menu.append(menu_item)
menu.show_all()
if event is None:
func = TreeViewHelper.make_popup_position_func(treeview)
menu.popup(None, None, func, 3, 0)
else:
menu.popup(None, None, None, 3, 0)
return True
def set_flattr_preferences(self, widget=None):
if not self._config.flattr.token:
self.label_flattr.set_text(_('Please sign in with Flattr and Support Publishers'))
@ -383,12 +433,7 @@ class gPodderPreferences(BuilderWidget):
_('Extension cannot be activated'), important=True)
model.set_value(it, self.C_TOGGLE, False)
def on_treeview_extensions_row_activated(self, treeview, path, column):
model = treeview.get_model()
container = model.get_value(model.get_iter(path), self.C_EXTENSION)
self.show_extension_info(model, container)
def show_extension_info(self, model, container):
def show_extension_info(self, w, model, container):
if not container or not model:
return
@ -400,6 +445,14 @@ class gPodderPreferences(BuilderWidget):
self.show_message(info, _('Extension module info'), important=True)
def open_weblink(self, w, url):
util.open_website(url)
def flattr_extension(self, w, flattr_url):
success, message = self.flattr.flattr_url(flattr_url)
self.show_message(message, title=_('Flattr status'),
important=not success)
def on_dialog_destroy(self, widget):
# Re-enable mygpo sync if the user has selected it
self._config.mygpo.enabled = self._enable_mygpo