Lots of code clean-ups, translation update, itunes image support :) (for full list, please see changelog...)

git-svn-id: svn://svn.berlios.de/gpodder@65 b0d088ad-0a06-0410-aad2-9ed5178a7e87
This commit is contained in:
Thomas Perl 2006-03-31 16:20:18 +00:00
parent 498fbb1a1b
commit 3b3d806d38
16 changed files with 607 additions and 1048 deletions

View File

@ -1,3 +1,13 @@
Fri, 31 Mar 2006 18:13:16 +0200 <thp@perli.net>
* Major code clean-up in gpodder.py and other modules
* Updated strings in all source code + gladefile (for i18n)
* Added support for itunes image ("Cover") in channel editor
* Removed orphaned (for a very long time) download status window
* User applications (from libplayers) only readed once now
* Fixed gPodder window icon when running with "make test"
* Updated gladefile (removed status, non-translatable strings)
* Updated data/messages.pot and updated german translation (de.po)
Thu, 30 Mar 2006 23:00:44 +0200 <thp@perli.net> Thu, 30 Mar 2006 23:00:44 +0200 <thp@perli.net>
* Modified makefile for i18n purposes * Modified makefile for i18n purposes
* Added data/po directory structure * Added data/po directory structure

View File

@ -62,7 +62,7 @@ $(GLADEGETTEXT): $(GLADEFILE)
intltool-extract --type=gettext/glade $(GLADEFILE) intltool-extract --type=gettext/glade $(GLADEFILE)
$(MESSAGESPOT): src/gpodder/*.py $(GLADEGETTEXT) $(BINFILE) $(MESSAGESPOT): src/gpodder/*.py $(GLADEGETTEXT) $(BINFILE)
xgettext -j -k_ -kN_ -o $(MESSAGESPOT) src/gpodder/*.py $(GLADEGETTEXT) $(BINFILE) xgettext -k_ -kN_ -o $(MESSAGESPOT) src/gpodder/*.py $(GLADEGETTEXT) $(BINFILE)
sed -e 's/SOME DESCRIPTIVE TITLE/gPodder translation template/g' -e 's/YEAR THE PACKAGE'"'"'S COPYRIGHT HOLDER/2006 Thomas Perl/g' -e 's/FIRST AUTHOR <EMAIL@ADDRESS>, YEAR/Thomas Perl <thp@perli.net>, 2006/g' -e 's/PACKAGE VERSION/gPodder '$(GPODDERVERSION)'/g' -e 's/PACKAGE/gPodder/g' $(MESSAGESPOT) > $(MESSAGESPOT).tmp sed -e 's/SOME DESCRIPTIVE TITLE/gPodder translation template/g' -e 's/YEAR THE PACKAGE'"'"'S COPYRIGHT HOLDER/2006 Thomas Perl/g' -e 's/FIRST AUTHOR <EMAIL@ADDRESS>, YEAR/Thomas Perl <thp@perli.net>, 2006/g' -e 's/PACKAGE VERSION/gPodder '$(GPODDERVERSION)'/g' -e 's/PACKAGE/gPodder/g' $(MESSAGESPOT) > $(MESSAGESPOT).tmp
mv $(MESSAGESPOT).tmp $(MESSAGESPOT) mv $(MESSAGESPOT).tmp $(MESSAGESPOT)

5
TODO
View File

@ -1,9 +1,8 @@
== 0.7 or afterwards == == 0.7 or afterwards ==
* i18n support (http://docs.python.org/lib/node333.html) * add i18n files to installed data
more help here: http://www.async.com.br/faq/pygtk/index.py?querytype=simple&query=gettext&req=search * do more translations (you can contribute here, of course :)
(might look into this soon ) -- thp <thp@perli.net>
* viewing pod info such as pubdate/description * viewing pod info such as pubdate/description
would've been nice.. It would give a better over view on your would've been nice.. It would give a better over view on your

View File

@ -36,29 +36,29 @@ def main(argv=None):
parser.add_option("-v", "--verbose", parser.add_option("-v", "--verbose",
action="store_true", dest="verbose", default=False, action="store_true", dest="verbose", default=False,
help=_("print extra information")) help=_("Be more verbose"))
parser.add_option("--debug", parser.add_option("--debug",
action="store_true", dest="debug", default=False, action="store_true", dest="debug", default=False,
help=_("run local version for debugging")) help=_("Run local version in current directory"))
parser.add_option("-l", "--list", parser.add_option("-l", "--list",
action="store_true", dest="list", default=False, action="store_true", dest="list", default=False,
help=_("list all channel subscriptions")) help=_("List all channel subscriptions"))
parser.add_option("-r", "--run", parser.add_option("-r", "--run",
action="store_true", dest="run", default=False, action="store_true", dest="run", default=False,
help=_("update channels and download new podcasts")) help=_("Update channel list, download new podcasts"))
parser.add_option("-u", "--update", parser.add_option("-u", "--update",
action="store_true", dest="update", default=False, action="store_true", dest="update", default=False,
help=_("update channels")) help=_("Update channel list and exit"))
parser.add_option("-a", "--add", dest="add", parser.add_option("-a", "--add", dest="add",
help=_("add FEEDURL to channel subscriptions"), metavar="FEEDURL") help=_("Subscribe to channel from FEEDURL"), metavar="FEEDURL")
parser.add_option("-d", "--delete", dest="delete", parser.add_option("-d", "--delete", dest="delete",
help=_("delete channel n"), metavar="n") help=_("Delete channel with ID n"), metavar="n")
(options, args) = parser.parse_args(argv) (options, args) = parser.parse_args(argv)
@ -76,10 +76,8 @@ def main(argv=None):
from gpodder import console from gpodder import console
which_wget = console.testForWget() which_wget = console.testForWget()
if which_wget == "": if which_wget == "":
print _("ERROR: You do not seem to have a usable \"wget\" binary in your path.") print _("Error: cannot find wget.")
return 20 return 20
else:
print _("Found wget: %s") % which_wget
# which_wget # which_wget
if options.list: if options.list:
@ -95,15 +93,15 @@ def main(argv=None):
if options.add != None and options.add != "" and (options.add[:4] == "http" or options.add[:3] == "ftp"): if options.add != None and options.add != "" and (options.add[:4] == "http" or options.add[:3] == "ftp"):
console.add_channel(options.add) console.add_channel(options.add)
else: else:
print _('unknown channel: %s') % options.add print _('Cannot add channel: %s') % options.add
elif options.delete: elif options.delete:
try: try:
chid = int(options.delete) chid = int(options.delete)
console.del_channel(chid) console.del_channel(chid)
print _("channel IDs may have changed, list before deleting again") print _("Channel IDs may have changed, list before deleting again.")
except ValueError: except ValueError:
print _('%s is not a valid id') %options.delete print _('Not a valid channel ID: %s') %options.delete
else: else:
#default run gui #default run gui

View File

@ -1024,288 +1024,6 @@
</child> </child>
</widget> </widget>
<widget class="GtkWindow" id="gPodderStatus">
<property name="visible">True</property>
<property name="title" translatable="yes">gPodder Download Status</property>
<property name="type">GTK_WINDOW_TOPLEVEL</property>
<property name="window_position">GTK_WIN_POS_CENTER</property>
<property name="modal">False</property>
<property name="resizable">True</property>
<property name="destroy_with_parent">False</property>
<property name="decorated">True</property>
<property name="skip_taskbar_hint">False</property>
<property name="skip_pager_hint">False</property>
<property name="type_hint">GDK_WINDOW_TYPE_HINT_NORMAL</property>
<property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
<property name="focus_on_map">True</property>
<property name="urgency_hint">False</property>
<signal name="destroy" handler="on_gPodderStatus_destroy" last_modification_time="Sun, 30 Oct 2005 14:04:51 GMT"/>
<child>
<widget class="GtkTable" id="waiterTable">
<property name="border_width">10</property>
<property name="visible">True</property>
<property name="n_rows">5</property>
<property name="n_columns">2</property>
<property name="homogeneous">False</property>
<property name="row_spacing">5</property>
<property name="column_spacing">5</property>
<child>
<widget class="GtkLabel" id="label7">
<property name="visible">True</property>
<property name="label" translatable="yes">Downloading from:</property>
<property name="use_underline">False</property>
<property name="use_markup">False</property>
<property name="justify">GTK_JUSTIFY_LEFT</property>
<property name="wrap">False</property>
<property name="selectable">False</property>
<property name="xalign">1</property>
<property name="yalign">0.5</property>
<property name="xpad">0</property>
<property name="ypad">0</property>
<property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
<property name="width_chars">-1</property>
<property name="single_line_mode">False</property>
<property name="angle">0</property>
</widget>
<packing>
<property name="left_attach">0</property>
<property name="right_attach">1</property>
<property name="top_attach">0</property>
<property name="bottom_attach">1</property>
<property name="x_options">fill</property>
<property name="y_options"></property>
</packing>
</child>
<child>
<widget class="GtkLabel" id="label8">
<property name="visible">True</property>
<property name="label" translatable="yes">Episode:</property>
<property name="use_underline">False</property>
<property name="use_markup">False</property>
<property name="justify">GTK_JUSTIFY_LEFT</property>
<property name="wrap">False</property>
<property name="selectable">False</property>
<property name="xalign">1</property>
<property name="yalign">0.5</property>
<property name="xpad">0</property>
<property name="ypad">0</property>
<property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
<property name="width_chars">-1</property>
<property name="single_line_mode">False</property>
<property name="angle">0</property>
</widget>
<packing>
<property name="left_attach">0</property>
<property name="right_attach">1</property>
<property name="top_attach">1</property>
<property name="bottom_attach">2</property>
<property name="x_options">fill</property>
<property name="y_options"></property>
</packing>
</child>
<child>
<widget class="GtkLabel" id="label9">
<property name="visible">True</property>
<property name="label" translatable="yes">Current speed:</property>
<property name="use_underline">False</property>
<property name="use_markup">False</property>
<property name="justify">GTK_JUSTIFY_LEFT</property>
<property name="wrap">False</property>
<property name="selectable">False</property>
<property name="xalign">1</property>
<property name="yalign">0.5</property>
<property name="xpad">0</property>
<property name="ypad">0</property>
<property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
<property name="width_chars">-1</property>
<property name="single_line_mode">False</property>
<property name="angle">0</property>
</widget>
<packing>
<property name="left_attach">0</property>
<property name="right_attach">1</property>
<property name="top_attach">2</property>
<property name="bottom_attach">3</property>
<property name="x_options">fill</property>
<property name="y_options"></property>
</packing>
</child>
<child>
<widget class="GtkHBox" id="hbox3">
<property name="visible">True</property>
<property name="homogeneous">False</property>
<property name="spacing">0</property>
<child>
<placeholder/>
</child>
<child>
<widget class="GtkButton" id="btnCancel">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="label">gtk-cancel</property>
<property name="use_stock">True</property>
<property name="relief">GTK_RELIEF_NORMAL</property>
<property name="focus_on_click">True</property>
<signal name="clicked" handler="on_btnCancel_clicked" last_modification_time="Sun, 30 Oct 2005 13:59:26 GMT"/>
</widget>
<packing>
<property name="padding">0</property>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="pack_type">GTK_PACK_END</property>
</packing>
</child>
</widget>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
<property name="top_attach">4</property>
<property name="bottom_attach">5</property>
<property name="y_options">fill</property>
</packing>
</child>
<child>
<widget class="GtkLabel" id="label10">
<property name="visible">True</property>
<property name="label" translatable="yes">Progress:</property>
<property name="use_underline">False</property>
<property name="use_markup">False</property>
<property name="justify">GTK_JUSTIFY_LEFT</property>
<property name="wrap">False</property>
<property name="selectable">False</property>
<property name="xalign">1</property>
<property name="yalign">0.5</property>
<property name="xpad">0</property>
<property name="ypad">0</property>
<property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
<property name="width_chars">-1</property>
<property name="single_line_mode">False</property>
<property name="angle">0</property>
</widget>
<packing>
<property name="left_attach">0</property>
<property name="right_attach">1</property>
<property name="top_attach">3</property>
<property name="bottom_attach">4</property>
<property name="x_options">fill</property>
<property name="y_options">expand</property>
</packing>
</child>
<child>
<widget class="GtkLabel" id="labelFrom">
<property name="visible">True</property>
<property name="label" translatable="yes">&lt;b&gt;labelFrom&lt;/b&gt;</property>
<property name="use_underline">False</property>
<property name="use_markup">True</property>
<property name="justify">GTK_JUSTIFY_LEFT</property>
<property name="wrap">False</property>
<property name="selectable">False</property>
<property name="xalign">0</property>
<property name="yalign">0.5</property>
<property name="xpad">0</property>
<property name="ypad">0</property>
<property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
<property name="width_chars">-1</property>
<property name="single_line_mode">False</property>
<property name="angle">0</property>
</widget>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
<property name="top_attach">0</property>
<property name="bottom_attach">1</property>
<property name="x_options">fill</property>
<property name="y_options"></property>
</packing>
</child>
<child>
<widget class="GtkLabel" id="labelFilename">
<property name="visible">True</property>
<property name="label" translatable="yes">&lt;b&gt;labelFilename&lt;/b&gt;</property>
<property name="use_underline">False</property>
<property name="use_markup">True</property>
<property name="justify">GTK_JUSTIFY_LEFT</property>
<property name="wrap">False</property>
<property name="selectable">False</property>
<property name="xalign">0</property>
<property name="yalign">0.5</property>
<property name="xpad">0</property>
<property name="ypad">0</property>
<property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
<property name="width_chars">-1</property>
<property name="single_line_mode">False</property>
<property name="angle">0</property>
</widget>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
<property name="top_attach">1</property>
<property name="bottom_attach">2</property>
<property name="x_options">fill</property>
<property name="y_options"></property>
</packing>
</child>
<child>
<widget class="GtkLabel" id="labelSpeed">
<property name="visible">True</property>
<property name="label" translatable="yes">labelSpeed</property>
<property name="use_underline">False</property>
<property name="use_markup">False</property>
<property name="justify">GTK_JUSTIFY_LEFT</property>
<property name="wrap">False</property>
<property name="selectable">False</property>
<property name="xalign">0</property>
<property name="yalign">0.5</property>
<property name="xpad">0</property>
<property name="ypad">0</property>
<property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
<property name="width_chars">-1</property>
<property name="single_line_mode">False</property>
<property name="angle">0</property>
</widget>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
<property name="top_attach">2</property>
<property name="bottom_attach">3</property>
<property name="x_options">fill</property>
<property name="y_options"></property>
</packing>
</child>
<child>
<widget class="GtkProgressBar" id="progressBar">
<property name="visible">True</property>
<property name="orientation">GTK_PROGRESS_LEFT_TO_RIGHT</property>
<property name="fraction">0</property>
<property name="pulse_step">0.10000000149</property>
<property name="text" translatable="yes"></property>
<property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
</widget>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
<property name="top_attach">3</property>
<property name="bottom_attach">4</property>
<property name="x_options">fill</property>
<property name="y_options">expand</property>
</packing>
</child>
</widget>
</child>
</widget>
<widget class="GtkWindow" id="gPodderChannel"> <widget class="GtkWindow" id="gPodderChannel">
<property name="border_width">10</property> <property name="border_width">10</property>
<property name="visible">True</property> <property name="visible">True</property>
@ -1558,7 +1276,7 @@
<widget class="GtkTable" id="table3"> <widget class="GtkTable" id="table3">
<property name="border_width">10</property> <property name="border_width">10</property>
<property name="visible">True</property> <property name="visible">True</property>
<property name="n_rows">2</property> <property name="n_rows">3</property>
<property name="n_columns">2</property> <property name="n_columns">2</property>
<property name="homogeneous">False</property> <property name="homogeneous">False</property>
<property name="row_spacing">5</property> <property name="row_spacing">5</property>
@ -1642,6 +1360,82 @@
<property name="type">tab</property> <property name="type">tab</property>
</packing> </packing>
</child> </child>
<child>
<widget class="GtkVBox" id="vbox1">
<property name="border_width">10</property>
<property name="visible">True</property>
<property name="homogeneous">False</property>
<property name="spacing">0</property>
<child>
<widget class="GtkImage" id="imgCover">
<property name="visible">True</property>
<property name="xalign">0.5</property>
<property name="yalign">0.5</property>
<property name="xpad">0</property>
<property name="ypad">0</property>
</widget>
<packing>
<property name="padding">0</property>
<property name="expand">True</property>
<property name="fill">True</property>
</packing>
</child>
<child>
<widget class="GtkLabel" id="labelCoverStatus">
<property name="visible">True</property>
<property name="label" translatable="yes">No cover available.</property>
<property name="use_underline">False</property>
<property name="use_markup">False</property>
<property name="justify">GTK_JUSTIFY_LEFT</property>
<property name="wrap">False</property>
<property name="selectable">False</property>
<property name="xalign">0.5</property>
<property name="yalign">0.5</property>
<property name="xpad">0</property>
<property name="ypad">4</property>
<property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
<property name="width_chars">-1</property>
<property name="single_line_mode">False</property>
<property name="angle">0</property>
</widget>
<packing>
<property name="padding">0</property>
<property name="expand">False</property>
<property name="fill">False</property>
</packing>
</child>
</widget>
<packing>
<property name="tab_expand">False</property>
<property name="tab_fill">True</property>
</packing>
</child>
<child>
<widget class="GtkLabel" id="label31">
<property name="visible">True</property>
<property name="label" translatable="yes">Cover</property>
<property name="use_underline">False</property>
<property name="use_markup">False</property>
<property name="justify">GTK_JUSTIFY_LEFT</property>
<property name="wrap">False</property>
<property name="selectable">False</property>
<property name="xalign">0.5</property>
<property name="yalign">0.5</property>
<property name="xpad">0</property>
<property name="ypad">0</property>
<property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
<property name="width_chars">-1</property>
<property name="single_line_mode">False</property>
<property name="angle">0</property>
</widget>
<packing>
<property name="type">tab</property>
</packing>
</child>
</widget> </widget>
<packing> <packing>
<property name="padding">0</property> <property name="padding">0</property>
@ -2145,7 +1939,7 @@ you can use the usual format of the environment variables:
<property name="editable">True</property> <property name="editable">True</property>
<property name="visibility">True</property> <property name="visibility">True</property>
<property name="max_length">0</property> <property name="max_length">0</property>
<property name="text" translatable="yes">~/.config/gpodder/downloads/</property> <property name="text">~/.config/gpodder/downloads/</property>
<property name="has_frame">True</property> <property name="has_frame">True</property>
<property name="invisible_char">*</property> <property name="invisible_char">*</property>
<property name="activates_default">False</property> <property name="activates_default">False</property>
@ -2279,7 +2073,7 @@ you can use the usual format of the environment variables:
<child> <child>
<widget class="GtkLabel" id="episode_title"> <widget class="GtkLabel" id="episode_title">
<property name="visible">True</property> <property name="visible">True</property>
<property name="label" translatable="yes">&lt;b&gt;&lt;big&gt;The gPodder Episode Title&lt;/big&gt;&lt;/b&gt;</property> <property name="label">&lt;b&gt;&lt;big&gt;The gPodder Episode Title&lt;/big&gt;&lt;/b&gt;</property>
<property name="use_underline">False</property> <property name="use_underline">False</property>
<property name="use_markup">True</property> <property name="use_markup">True</property>
<property name="justify">GTK_JUSTIFY_LEFT</property> <property name="justify">GTK_JUSTIFY_LEFT</property>
@ -2326,7 +2120,7 @@ you can use the usual format of the environment variables:
<property name="left_margin">5</property> <property name="left_margin">5</property>
<property name="right_margin">5</property> <property name="right_margin">5</property>
<property name="indent">0</property> <property name="indent">0</property>
<property name="text" translatable="yes">Description of the episode currently selected in gPodder</property> <property name="text">Description of the episode currently selected in gPodder</property>
</widget> </widget>
</child> </child>
</widget> </widget>

View File

@ -8,12 +8,12 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: gPodder 0.7-svn\n" "Project-Id-Version: gPodder 0.7-svn\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2006-03-30 23:18+0200\n" "POT-Creation-Date: 2006-03-31 18:11+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=iso-8859-1\n" "Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
#: src/gpodder/console.py:65 #: src/gpodder/console.py:65
@ -26,36 +26,40 @@ msgstr ""
msgid "%s is not a valid id" msgid "%s is not a valid id"
msgstr "" msgstr ""
#: src/gpodder/gpodder.py:110 src/gpodder/gpodder.py:125 #: src/gpodder/gpodder.py:54
#: src/gpodder/gpodder.py:131 msgid "Contributors / patch writers:"
msgstr ""
#: src/gpodder/gpodder.py:58
msgid "See the AUTHORS file for all contributors"
msgstr ""
#: src/gpodder/gpodder.py:113 src/gpodder/gpodder.py:128
#: src/gpodder/gpodder.py:134
msgid "Episode" msgid "Episode"
msgstr "" msgstr ""
#: src/gpodder/gpodder.py:115 #: src/gpodder/gpodder.py:118
msgid "Size" msgid "Size"
msgstr "" msgstr ""
#: src/gpodder/gpodder.py:134 #: src/gpodder/gpodder.py:137
msgid "Speed" msgid "Speed"
msgstr "" msgstr ""
#: src/gpodder/gpodder.py:137 #: src/gpodder/gpodder.py:140
msgid "Progress" msgid "Progress"
msgstr "" msgstr ""
#: src/gpodder/gpodder.py:166 #: src/gpodder/gpodder.py:164
msgid "Channel Info" msgid "Channel Info"
msgstr "" msgstr ""
#: src/gpodder/gpodder.py:186 #: src/gpodder/gpodder.py:199
msgid "probably no channels found" msgid "No downloaded podcasts found."
msgstr "" msgstr ""
#: src/gpodder/gpodder.py:201 #: src/gpodder/gpodder.py:209
msgid "no downloaded podcasts found.."
msgstr ""
#: src/gpodder/gpodder.py:211
msgid "" msgid ""
"<b>No channels found</b>\n" "<b>No channels found</b>\n"
"\n" "\n"
@ -63,52 +67,35 @@ msgid ""
"new channel." "new channel."
msgstr "" msgstr ""
#: src/gpodder/gpodder.py:212 #: src/gpodder/gpodder.py:211
msgid "probably no feeds or channels found"
msgstr ""
#: src/gpodder/gpodder.py:214
msgid "some unknown function"
msgstr ""
#: src/gpodder/gpodder.py:214
msgid "gPodder message" msgid "gPodder message"
msgstr "" msgstr ""
#: src/gpodder/gpodder.py:222 #: src/gpodder/gpodder.py:219
msgid "Do you really want to do this?" msgid "Do you really want to do this?"
msgstr "" msgstr ""
#: src/gpodder/gpodder.py:222 #: src/gpodder/gpodder.py:219
msgid "gPodder confirmation" msgid "gPodder confirmation"
msgstr "" msgstr ""
#: src/gpodder/gpodder.py:233 #: src/gpodder/gpodder.py:284
#, python-format msgid ""
msgid "I Asked: %s" "There has been an error adding the channel.\n"
"Maybe the URL is wrong?"
msgstr "" msgstr ""
#: src/gpodder/gpodder.py:234 #: src/gpodder/gpodder.py:290 src/gpodder/gpodder.py:377
#, python-format
msgid "User answered: %s"
msgstr ""
#: src/gpodder/gpodder.py:274
#, python-format
msgid "Adding channel: %s"
msgstr ""
#: src/gpodder/gpodder.py:275 src/gpodder/gpodder.py:345
#: src/gpodder/gpodder.py:388
msgid "Fetching channel index..." msgid "Fetching channel index..."
msgstr "" msgstr ""
#: src/gpodder/gpodder.py:293 #: src/gpodder/gpodder.py:303
#, python-format msgid ""
msgid "unkonwn link format: %s" "Could not add new channel.\n"
"Only <b>http://</b> and <b>ftp://</b> URLs supported at the moment."
msgstr "" msgstr ""
#: src/gpodder/gpodder.py:320 #: src/gpodder/gpodder.py:333
msgid "" msgid ""
"<big><b>Updating feed cache</b></big>\n" "<big><b>Updating feed cache</b></big>\n"
"\n" "\n"
@ -116,26 +103,14 @@ msgid ""
"updating the feed cache..." "updating the feed cache..."
msgstr "" msgstr ""
#: src/gpodder/gpodder.py:361 #: src/gpodder/gpodder.py:370
msgid ""
"There has been an error adding the channel.\n"
"Maybe the URL is wrong?"
msgstr ""
#: src/gpodder/gpodder.py:367
msgid ""
"Could not add new channel.\n"
"Only <b>http://</b> and <b>ftp://</b> URLs supported at the moment."
msgstr ""
#: src/gpodder/gpodder.py:381
msgid "" msgid ""
"Cannot edit this channel.\n" "Cannot edit this channel.\n"
"\n" "\n"
"No channel found." "No channel found."
msgstr "" msgstr ""
#: src/gpodder/gpodder.py:419 #: src/gpodder/gpodder.py:400
#, python-format #, python-format
msgid "" msgid ""
"Do you really want to remove this channel?\n" "Do you really want to remove this channel?\n"
@ -143,43 +118,31 @@ msgid ""
" %s" " %s"
msgstr "" msgstr ""
#: src/gpodder/gpodder.py:426 #: src/gpodder/gpodder.py:407
msgid "" msgid ""
"Could not delete channel.\n" "Could not delete channel.\n"
"Probably no channel is selected." "Probably no channel is selected."
msgstr "" msgstr ""
#: src/gpodder/gpodder.py:434 #: src/gpodder/gpodder.py:415
msgid "Your channel list is empty. Nothing to export."
msgstr ""
#: src/gpodder/gpodder.py:417
msgid "Export to OPML"
msgstr ""
#: src/gpodder/gpodder.py:485
msgid "You have not selected an episode to download."
msgstr ""
#: src/gpodder/gpodder.py:500
msgid "" msgid ""
"Your channel list is empty. Nothing to export.\n" "You have already downloaded this episode\n"
"\n" "or you are currently downloading it."
"Go add some fancy channels! :)"
msgstr ""
#: src/gpodder/gpodder.py:436
msgid "Export to OPML..."
msgstr ""
#: src/gpodder/gpodder.py:445
msgid "=> WILL WRITE OPML TO: "
msgstr ""
#: src/gpodder/gpodder.py:504
msgid ""
"You have not selected an episode to download.\n"
"\n"
"Please select one, and I'll download it for you."
msgstr "" msgstr ""
#: src/gpodder/gpodder.py:519 #: src/gpodder/gpodder.py:519
msgid ""
"<big><b>Already downloaded</b></big>\n"
"\n"
"You have already downloaded this episode.\n"
"Or you are currently downloading it."
msgstr ""
#: src/gpodder/gpodder.py:538
#, python-format #, python-format
msgid "" msgid ""
"Do you really want to cancel this download?\n" "Do you really want to cancel this download?\n"
@ -187,18 +150,11 @@ msgid ""
"%s" "%s"
msgstr "" msgstr ""
#: src/gpodder/gpodder.py:541 #: src/gpodder/gpodder.py:522 src/gpodder/gpodder.py:559
msgid "No episode selected - nothing cancelled." msgid "No episode selected."
msgstr "" msgstr ""
#: src/gpodder/gpodder.py:583 #: src/gpodder/gpodder.py:585
msgid ""
"Could not open this episode.\n"
"\n"
"Have you even selected one?"
msgstr ""
#: src/gpodder/gpodder.py:610
#, python-format #, python-format
msgid "" msgid ""
"Do you really want to remove this episode?\n" "Do you really want to remove this episode?\n"
@ -206,23 +162,30 @@ msgid ""
"%s" "%s"
msgstr "" msgstr ""
#: src/gpodder/gpodder.py:620 #: src/gpodder/gpodder.py:595
msgid "Could not delete downloaded podcast."
msgstr ""
#: src/gpodder/gpodder.py:631 src/gpodder/gpodder.py:632
#: data/gpodder.glade.h:1
msgid "(unknown)"
msgstr ""
#: src/gpodder/gpodder.py:829
msgid "" msgid ""
"Could not delete selected item.\n" "Please do not call gpodder.py directly. Instead, call the gpodder binary."
"Have you selected an episode to delete?"
msgstr "" msgstr ""
#: src/gpodder/gpodder.py:914 src/gpodder/gpodder.py:915 #: src/gpodder/libgpodder.py:64
msgid "please run the gpodder binary, not this file"
msgstr ""
#: src/gpodder/libgpodder.py:137 src/gpodder/libgpodder.py:146
#: src/gpodder/libgpodder.py:152
msgid "gPodder downloads" msgid "gPodder downloads"
msgstr "" msgstr ""
#: src/gpodder/libgpodder.py:167 #: src/gpodder/libgpodder.py:160
msgid "automatically generated, will be overwritten on next gpodder shutdown." msgid "Downloading channel cover..."
msgstr ""
#: src/gpodder/libgpodder.py:211
msgid "gPodder channel list"
msgstr "" msgstr ""
#: src/gpodder/liblocdbwriter.py:33 #: src/gpodder/liblocdbwriter.py:33
@ -233,24 +196,8 @@ msgstr ""
msgid "gPodder subscription list (exported)" msgid "gPodder subscription list (exported)"
msgstr "" msgstr ""
#: src/gpodder/libpodcasts.py:207 #: src/gpodder/libpodcasts.py:214
msgid "no local db found or local db error" msgid "No LocalDB found or error in existing LocalDB."
msgstr ""
#: src/gpodder/libpodcasts.py:242
msgid "GB"
msgstr ""
#: src/gpodder/libpodcasts.py:244
msgid "MB"
msgstr ""
#: src/gpodder/libpodcasts.py:246
msgid "KB"
msgstr ""
#: src/gpodder/libpodcasts.py:248
msgid "Bytes"
msgstr "" msgstr ""
#: src/gpodder/libwget.py:39 src/gpodder/libwget.py:57 #: src/gpodder/libwget.py:39 src/gpodder/libwget.py:57
@ -258,25 +205,13 @@ msgstr ""
msgid "unknown" msgid "unknown"
msgstr "" msgstr ""
#: src/gpodder/libwget.py:272
msgid "initializing download..."
msgstr ""
#: src/gpodder/libwget.py:298 #: src/gpodder/libwget.py:298
msgid "Download has been cancelled." msgid "Download has been cancelled."
msgstr "" msgstr ""
#: src/gpodder/libwget.py:300 #: src/gpodder/libwget.py:300
#, python-format #, python-format
msgid "wget exited with status: %s" msgid "Download error. Wget exit code was: %d"
msgstr ""
#: src/gpodder/libwget.py:301
msgid "*** THERE HAS BEEN AN ERROR WHILE DOWNLOADING **"
msgstr ""
#: data/gpodder.glade.h:1
msgid "(unknown)"
msgstr "" msgstr ""
#: data/gpodder.glade.h:2 #: data/gpodder.glade.h:2
@ -284,106 +219,82 @@ msgid "<b>(unknown)</b>"
msgstr "" msgstr ""
#: data/gpodder.glade.h:3 #: data/gpodder.glade.h:3
msgid "<b><big>The gPodder Episode Title</big></b>"
msgstr ""
#: data/gpodder.glade.h:4
msgid "<b>labelFilename</b>"
msgstr ""
#: data/gpodder.glade.h:5
msgid "<b>labelFrom</b>"
msgstr ""
#: data/gpodder.glade.h:6
msgid "Advanced" msgid "Advanced"
msgstr "" msgstr ""
#: data/gpodder.glade.h:7 #: data/gpodder.glade.h:4
msgid "Available Podcasts" msgid "Available Podcasts"
msgstr "" msgstr ""
#: data/gpodder.glade.h:8 #: data/gpodder.glade.h:5
msgid "Channel:" msgid "Channel:"
msgstr "" msgstr ""
#: data/gpodder.glade.h:9 #: data/gpodder.glade.h:6
msgid "Command:" msgid "Command:"
msgstr "" msgstr ""
#: data/gpodder.glade.h:10 #: data/gpodder.glade.h:7
msgid "Current speed:" msgid "Cover"
msgstr "" msgstr ""
#: data/gpodder.glade.h:11 #: data/gpodder.glade.h:8
msgid "Delete selected item" msgid "Delete selected item"
msgstr "" msgstr ""
#: data/gpodder.glade.h:12 #: data/gpodder.glade.h:9
msgid "Description of the episode currently selected in gPodder"
msgstr ""
#: data/gpodder.glade.h:13
msgid "Description:" msgid "Description:"
msgstr "" msgstr ""
#: data/gpodder.glade.h:14 #: data/gpodder.glade.h:10
msgid "Desktop:" msgid "Desktop:"
msgstr "" msgstr ""
#: data/gpodder.glade.h:15 #: data/gpodder.glade.h:11
msgid "Download Pod_cast" msgid "Download Pod_cast"
msgstr "" msgstr ""
#: data/gpodder.glade.h:16 #: data/gpodder.glade.h:12
msgid "Download Status" msgid "Download Status"
msgstr "" msgstr ""
#: data/gpodder.glade.h:17 #: data/gpodder.glade.h:13
msgid "Download to:" msgid "Download to:"
msgstr "" msgstr ""
#: data/gpodder.glade.h:18 #: data/gpodder.glade.h:14
msgid "Downloaded Podcasts" msgid "Downloaded Podcasts"
msgstr "" msgstr ""
#: data/gpodder.glade.h:19 #: data/gpodder.glade.h:15
msgid "Downloading from:"
msgstr ""
#: data/gpodder.glade.h:20
msgid "Downloads" msgid "Downloads"
msgstr "" msgstr ""
#: data/gpodder.glade.h:21 #: data/gpodder.glade.h:16
msgid "E_xport list..." msgid "E_xport list..."
msgstr "" msgstr ""
#: data/gpodder.glade.h:22 #: data/gpodder.glade.h:17
msgid "Episode Information" msgid "Episode Information"
msgstr "" msgstr ""
#: data/gpodder.glade.h:23 #: data/gpodder.glade.h:18
msgid "Episode:"
msgstr ""
#: data/gpodder.glade.h:24
msgid "FTP Proxy:" msgid "FTP Proxy:"
msgstr "" msgstr ""
#: data/gpodder.glade.h:25 #: data/gpodder.glade.h:19
msgid "Feed URL:" msgid "Feed URL:"
msgstr "" msgstr ""
#: data/gpodder.glade.h:26 #: data/gpodder.glade.h:20
msgid "General" msgid "General"
msgstr "" msgstr ""
#: data/gpodder.glade.h:27 #: data/gpodder.glade.h:21
msgid "HTTP Proxy:" msgid "HTTP Proxy:"
msgstr "" msgstr ""
#: data/gpodder.glade.h:28 #: data/gpodder.glade.h:22
msgid "" msgid ""
"If you have to use a HTTP or FTP proxy server,\n" "If you have to use a HTTP or FTP proxy server,\n"
"you can use the usual format of the environment variables:\n" "you can use the usual format of the environment variables:\n"
@ -391,135 +302,118 @@ msgid ""
"<b>http://username:password@proxy_host:proxy_port/</b>" "<b>http://username:password@proxy_host:proxy_port/</b>"
msgstr "" msgstr ""
#: data/gpodder.glade.h:32 #: data/gpodder.glade.h:26
msgid "No cover available."
msgstr ""
#: data/gpodder.glade.h:27
msgid "Play selected item" msgid "Play selected item"
msgstr "" msgstr ""
#: data/gpodder.glade.h:33 #: data/gpodder.glade.h:28
msgid "Player application:" msgid "Player application:"
msgstr "" msgstr ""
#: data/gpodder.glade.h:34 #: data/gpodder.glade.h:29
msgid "Progress:"
msgstr ""
#: data/gpodder.glade.h:35
msgid "Proxy" msgid "Proxy"
msgstr "" msgstr ""
#: data/gpodder.glade.h:36 #: data/gpodder.glade.h:30
msgid "Save downloads in:" msgid "Save downloads in:"
msgstr "" msgstr ""
#: data/gpodder.glade.h:37 #: data/gpodder.glade.h:31
msgid "Show \"gPodder downloads\" link" msgid "Show \"gPodder downloads\" link"
msgstr "" msgstr ""
#: data/gpodder.glade.h:38 #: data/gpodder.glade.h:32
msgid "Title:" msgid "Title:"
msgstr "" msgstr ""
#: data/gpodder.glade.h:39 #: data/gpodder.glade.h:33
msgid "_About gPodder..." msgid "_About gPodder..."
msgstr "" msgstr ""
#: data/gpodder.glade.h:40 #: data/gpodder.glade.h:34
msgid "_Add channel..." msgid "_Add channel..."
msgstr "" msgstr ""
#: data/gpodder.glade.h:41 #: data/gpodder.glade.h:35
msgid "_Channels" msgid "_Channels"
msgstr "" msgstr ""
#: data/gpodder.glade.h:42 #: data/gpodder.glade.h:36
msgid "_Check for Updates" msgid "_Check for Updates"
msgstr "" msgstr ""
#: data/gpodder.glade.h:43 #: data/gpodder.glade.h:37
msgid "_Close" msgid "_Close"
msgstr "" msgstr ""
#: data/gpodder.glade.h:44 #: data/gpodder.glade.h:38
msgid "_Edit channel..." msgid "_Edit channel..."
msgstr "" msgstr ""
#: data/gpodder.glade.h:45 #: data/gpodder.glade.h:39
msgid "_Help" msgid "_Help"
msgstr "" msgstr ""
#: data/gpodder.glade.h:46 #: data/gpodder.glade.h:40
msgid "_Podcasts" msgid "_Podcasts"
msgstr "" msgstr ""
#: data/gpodder.glade.h:47 #: data/gpodder.glade.h:41
msgid "_Preferences..." msgid "_Preferences..."
msgstr "" msgstr ""
#: data/gpodder.glade.h:48 #: data/gpodder.glade.h:42
msgid "_Remove channel" msgid "_Remove channel"
msgstr "" msgstr ""
#: data/gpodder.glade.h:49 #: data/gpodder.glade.h:43
msgid "gPodder - your podcast catcher." msgid "gPodder - your podcast catcher."
msgstr "" msgstr ""
#: data/gpodder.glade.h:50 #: data/gpodder.glade.h:44
msgid "gPodder Channel Editor" msgid "gPodder Channel Editor"
msgstr "" msgstr ""
#: data/gpodder.glade.h:51 #: data/gpodder.glade.h:45
msgid "gPodder Download Status"
msgstr ""
#: data/gpodder.glade.h:52
msgid "gPodder properties" msgid "gPodder properties"
msgstr "" msgstr ""
#: data/gpodder.glade.h:53
msgid "labelSpeed"
msgstr ""
#: data/gpodder.glade.h:54
msgid "~/.config/gpodder/downloads/"
msgstr ""
#: bin/gpodder:39 #: bin/gpodder:39
msgid "print extra information" msgid "Be more verbose"
msgstr "" msgstr ""
#: bin/gpodder:43 #: bin/gpodder:43
msgid "run local version for debugging" msgid "Run local version in current directory"
msgstr "" msgstr ""
#: bin/gpodder:47 #: bin/gpodder:47
msgid "list all channel subscriptions" msgid "List all channel subscriptions"
msgstr "" msgstr ""
#: bin/gpodder:51 #: bin/gpodder:51
msgid "update channels and download new podcasts" msgid "Update channel list, download new podcasts"
msgstr "" msgstr ""
#: bin/gpodder:55 #: bin/gpodder:55
msgid "update channels" msgid "Update channel list and exit"
msgstr "" msgstr ""
#: bin/gpodder:58 #: bin/gpodder:58
msgid "add FEEDURL to channel subscriptions" msgid "Subscribe to channel from FEEDURL"
msgstr "" msgstr ""
#: bin/gpodder:61 #: bin/gpodder:61
msgid "delete channel n" msgid "Delete channel with ID n"
msgstr "" msgstr ""
#: bin/gpodder:79 #: bin/gpodder:79
msgid "ERROR: You do not seem to have a usable \"wget\" binary in your path." msgid "Error: cannot find wget."
msgstr "" msgstr ""
#: bin/gpodder:82 #: bin/gpodder:102
#, c-format msgid "Channel IDs may have changed, list before deleting again."
msgid "Found wget: %s"
msgstr ""
#: bin/gpodder:104
msgid "channel IDs may have changed, list before deleting again"
msgstr "" msgstr ""

View File

@ -1,2 +1,4 @@
Put your translated *.po files here, then execute "make" to generate Put your translated *.po files here, then execute "make" to generate
machine-readable *.mo files in the locale directory. machine-readable *.mo files in the locale directory.
If you want to edit your *.po file with a GUI, try www.poedit.org.

View File

@ -3,228 +3,220 @@
# This file is distributed under the same license as the PACKAGE package. # This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
# #
#, fuzzy
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: gPodder 0.7-svn\n" "Project-Id-Version: gPodder 0.7-svn\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2006-03-30 23:05+0200\n" "POT-Creation-Date: 2006-03-31 18:11+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: 2006-03-31 18:04+0100\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: Thomas Perl <thp@perli.net>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: gPodder Team <thp@perli.net>\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=iso-8859-1\n" "Content-Type: text/plain; charset=iso-8859-1\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"X-Poedit-Language: German\n"
#: src/gpodder/console.py:65 #: src/gpodder/console.py:65
#, python-format #, python-format
msgid "delete channel: %s" msgid "delete channel: %s"
msgstr "channel entfernen: %s" msgstr "Channel entfernen: %s"
#: src/gpodder/console.py:68 #: src/gpodder/console.py:68
#, python-format #, python-format
msgid "%s is not a valid id" msgid "%s is not a valid id"
msgstr "%s is keine gültige ID" msgstr "%s is keine gültige ID"
#: src/gpodder/gpodder.py:110 src/gpodder/gpodder.py:125 #: src/gpodder/gpodder.py:54
#: src/gpodder/gpodder.py:131 msgid "Contributors / patch writers:"
msgstr "Helfer und Patchschreiber:"
#: src/gpodder/gpodder.py:58
msgid "See the AUTHORS file for all contributors"
msgstr "Eine Liste aller Helfer finden Sie in der AUTHORS-Datei"
#: src/gpodder/gpodder.py:113 src/gpodder/gpodder.py:128
#: src/gpodder/gpodder.py:134
msgid "Episode" msgid "Episode"
msgstr "Episode" msgstr "Episode"
#: src/gpodder/gpodder.py:115 #: src/gpodder/gpodder.py:118
msgid "Size" msgid "Size"
msgstr "Größe" msgstr "Größe"
#: src/gpodder/gpodder.py:134 #: src/gpodder/gpodder.py:137
msgid "Speed" msgid "Speed"
msgstr "Geschwindigkeit" msgstr "Geschwindigkeit"
#: src/gpodder/gpodder.py:137 #: src/gpodder/gpodder.py:140
msgid "Progress" msgid "Progress"
msgstr "Fortschritt" msgstr "Fortschritt"
#: src/gpodder/gpodder.py:166 #: src/gpodder/gpodder.py:164
msgid "Channel Info" msgid "Channel Info"
msgstr "Channel-Informationen" msgstr "Channel-Informationen"
#: src/gpodder/gpodder.py:186 #: src/gpodder/gpodder.py:199
msgid "probably no channels found" msgid "No downloaded podcasts found."
msgstr "wahrscheinlich keine channels gefunden" msgstr "Keine heruntergeladenen Podcasts gefunden."
#: src/gpodder/gpodder.py:201 #: src/gpodder/gpodder.py:209
msgid "no downloaded podcasts found.."
msgstr "keine heruntergeladenen podcasts gefunden.."
#: src/gpodder/gpodder.py:211
msgid "" msgid ""
"<b>No channels found</b>\n" "<b>No channels found</b>\n"
"\n" "\n"
"Click on <b><i>Channels</i></b> &gt; <b><i>Add channel..</i></b> to add a " "Click on <b><i>Channels</i></b> &gt; <b><i>Add channel..</i></b> to add a "
"new channel." "new channel."
msgstr "" msgstr ""
"<b>Keine Channels gefunden</b>\n"
"\n"
"Klicken Sie auf <b><i>Channels</i></b> &gt; <b><i>Abbonieren...</i></b>, um "
"einen neuen Channel zu abbonieren."
#: src/gpodder/gpodder.py:212 #: src/gpodder/gpodder.py:211
msgid "probably no feeds or channels found"
msgstr "wahrscheinlich keine feeds oder channels gefunden"
#: src/gpodder/gpodder.py:214
msgid "some unknown function"
msgstr "eine unbekannte Funktion"
#: src/gpodder/gpodder.py:214
msgid "gPodder message" msgid "gPodder message"
msgstr "gPodder Nachricht" msgstr "gPodder Nachricht"
#: src/gpodder/gpodder.py:222 #: src/gpodder/gpodder.py:219
msgid "Do you really want to do this?" msgid "Do you really want to do this?"
msgstr "Willst du das wirklich machen?" msgstr "Willst du das wirklich machen?"
#: src/gpodder/gpodder.py:222 #: src/gpodder/gpodder.py:219
msgid "gPodder confirmation" msgid "gPodder confirmation"
msgstr "gPodder Bestätigung" msgstr "gPodder Bestätigung"
#: src/gpodder/gpodder.py:233 #: src/gpodder/gpodder.py:284
#, python-format msgid ""
msgid "I Asked: %s" "There has been an error adding the channel.\n"
msgstr "Ich fragte: %s" "Maybe the URL is wrong?"
msgstr ""
"Ein Fehler trat beim Hinzufügen des Channels auf.\n"
"Vielleicht ist die URL falsch?"
#: src/gpodder/gpodder.py:234 #: src/gpodder/gpodder.py:290 src/gpodder/gpodder.py:377
#, python-format
msgid "User answered: %s"
msgstr "Benutzer antwortete mit: %s"
#: src/gpodder/gpodder.py:274
#, python-format
msgid "Adding channel: %s"
msgstr "Channel wird hinzugefügt: %s"
#: src/gpodder/gpodder.py:275 src/gpodder/gpodder.py:345
#: src/gpodder/gpodder.py:388
msgid "Fetching channel index..." msgid "Fetching channel index..."
msgstr "Channel-Index wird heruntergeladen..." msgstr "Channel-Index wird heruntergeladen..."
#: src/gpodder/gpodder.py:293 #: src/gpodder/gpodder.py:303
#, python-format msgid ""
msgid "unkonwn link format: %s" "Could not add new channel.\n"
msgstr "Unbekanntes Link-Format: %s" "Only <b>http://</b> and <b>ftp://</b> URLs supported at the moment."
msgstr ""
"Konnte neuen Channel nicht abbonieren.\n"
"Derzeit werden nur <b>http://</b> und <b>ftp://</b>-URLs unterstützt."
#: src/gpodder/gpodder.py:320 #: src/gpodder/gpodder.py:333
msgid "" msgid ""
"<big><b>Updating feed cache</b></big>\n" "<big><b>Updating feed cache</b></big>\n"
"\n" "\n"
"Please wait while gPodder is\n" "Please wait while gPodder is\n"
"updating the feed cache..." "updating the feed cache..."
msgstr "" msgstr ""
"<big><b>Abonnements werden geprüft</b></big>\n"
"\n"
"Bitte warten Sie, während gPodder Ihre\n"
"Channel-Abonnements aktualisiert..."
#: src/gpodder/gpodder.py:361 #: src/gpodder/gpodder.py:370
msgid ""
"There has been an error adding the channel.\n"
"Maybe the URL is wrong?"
msgstr ""
#: src/gpodder/gpodder.py:367
msgid ""
"Could not add new channel.\n"
"Only <b>http://</b> and <b>ftp://</b> URLs supported at the moment."
msgstr ""
#: src/gpodder/gpodder.py:381
msgid "" msgid ""
"Cannot edit this channel.\n" "Cannot edit this channel.\n"
"\n" "\n"
"No channel found." "No channel found."
msgstr "" msgstr ""
"Kann diesen Channel nicht editieren.\n"
"\n"
"Kein Channel gefunden."
#: src/gpodder/gpodder.py:419 #: src/gpodder/gpodder.py:400
#, python-format #, python-format
msgid "" msgid ""
"Do you really want to remove this channel?\n" "Do you really want to remove this channel?\n"
"\n" "\n"
" %s" " %s"
msgstr "" msgstr ""
"Wollen Sie diesen Channel wirklich entfernen?\n"
"\n"
"%s"
#: src/gpodder/gpodder.py:426 #: src/gpodder/gpodder.py:407
msgid "" msgid ""
"Could not delete channel.\n" "Could not delete channel.\n"
"Probably no channel is selected." "Probably no channel is selected."
msgstr "" msgstr ""
"Konnte Channel nicht entfernen.\n"
"Wahrscheinlich ist keiner ausgewählt."
#: src/gpodder/gpodder.py:434 #: src/gpodder/gpodder.py:415
msgid "Your channel list is empty. Nothing to export."
msgstr "Nichts zu exportieren: Sie haben keine Abonnements."
#: src/gpodder/gpodder.py:417
msgid "Export to OPML"
msgstr "Als OPML-Datei exportieren"
#: src/gpodder/gpodder.py:485
msgid "You have not selected an episode to download."
msgstr "Sie haben keine Episode für den Download ausgewählt."
#: src/gpodder/gpodder.py:500
msgid "" msgid ""
"Your channel list is empty. Nothing to export.\n" "You have already downloaded this episode\n"
"\n" "or you are currently downloading it."
"Go add some fancy channels! :)"
msgstr ""
#: src/gpodder/gpodder.py:436
msgid "Export to OPML..."
msgstr "Exportieren als OPML..."
#: src/gpodder/gpodder.py:445
msgid "=> WILL WRITE OPML TO: "
msgstr "=> WERDE OPML SCHREIBEN: "
#: src/gpodder/gpodder.py:504
msgid ""
"You have not selected an episode to download.\n"
"\n"
"Please select one, and I'll download it for you."
msgstr "" msgstr ""
"Sie haben diese Episode bereits heruntergeladen\n"
"oder Sie laden sie jetzt gerade herunter."
#: src/gpodder/gpodder.py:519 #: src/gpodder/gpodder.py:519
msgid ""
"<big><b>Already downloaded</b></big>\n"
"\n"
"You have already downloaded this episode.\n"
"Or you are currently downloading it."
msgstr ""
#: src/gpodder/gpodder.py:538
#, python-format #, python-format
msgid "" msgid ""
"Do you really want to cancel this download?\n" "Do you really want to cancel this download?\n"
"\n" "\n"
"%s" "%s"
msgstr "" msgstr ""
"Wollen Sie diesen Download wirklich abbrechen?\n"
#: src/gpodder/gpodder.py:541
msgid "No episode selected - nothing cancelled."
msgstr "Keine Episode ausgewählt - nichts abgebrochen."
#: src/gpodder/gpodder.py:583
msgid ""
"Could not open this episode.\n"
"\n" "\n"
"Have you even selected one?" "%s"
msgstr ""
#: src/gpodder/gpodder.py:610 #: src/gpodder/gpodder.py:522 src/gpodder/gpodder.py:559
msgid "No episode selected."
msgstr "Keine Episode ausgewählt."
#: src/gpodder/gpodder.py:585
#, python-format #, python-format
msgid "" msgid ""
"Do you really want to remove this episode?\n" "Do you really want to remove this episode?\n"
"\n" "\n"
"%s" "%s"
msgstr "" msgstr ""
"Wollen Sie diese Episode wirklich entfernen?\n"
"\n"
"%s"
#: src/gpodder/gpodder.py:620 #: src/gpodder/gpodder.py:595
msgid "Could not delete downloaded podcast."
msgstr "Konnte den ausgewählten Podcast nicht entfernen."
#: src/gpodder/gpodder.py:631 src/gpodder/gpodder.py:632
#: data/gpodder.glade.h:1
msgid "(unknown)"
msgstr "(unbekannt)"
#: src/gpodder/gpodder.py:829
msgid "" msgid ""
"Could not delete selected item.\n" "Please do not call gpodder.py directly. Instead, call the gpodder binary."
"Have you selected an episode to delete?"
msgstr "" msgstr ""
"Bitte starten Sie gPodder nie direkt über gpodder.py. Rufen Sie stattdessen "
"das \"gpodder\" Programm auf."
#: src/gpodder/gpodder.py:914 src/gpodder/gpodder.py:915 #: src/gpodder/libgpodder.py:64
msgid "please run the gpodder binary, not this file"
msgstr "Bitte starten Sie die gpodder-Applikation, nicht diese Datei"
#: src/gpodder/libgpodder.py:137 src/gpodder/libgpodder.py:146
#: src/gpodder/libgpodder.py:152
msgid "gPodder downloads" msgid "gPodder downloads"
msgstr "gPodder-Downloads" msgstr "gPodder Downloads"
#: src/gpodder/libgpodder.py:167 #: src/gpodder/libgpodder.py:160
msgid "automatically generated, will be overwritten on next gpodder shutdown." msgid "Downloading channel cover..."
msgstr "" msgstr "Bild wird heruntergeladen..."
"Automatisch generiert, wird beim nächsten Beenden von gPodder überschrieben."
#: src/gpodder/libgpodder.py:211
msgid "gPodder channel list"
msgstr "gPodder Channel-Editor"
#: src/gpodder/liblocdbwriter.py:33 #: src/gpodder/liblocdbwriter.py:33
msgid "local download database, generated by gPodder" msgid "local download database, generated by gPodder"
@ -234,296 +226,231 @@ msgstr "lokale Download-Datenbank, generiert von gPodder"
msgid "gPodder subscription list (exported)" msgid "gPodder subscription list (exported)"
msgstr "gPodder Abonnement-Liste (exportiert)" msgstr "gPodder Abonnement-Liste (exportiert)"
#: src/gpodder/libpodcasts.py:207 #: src/gpodder/libpodcasts.py:214
msgid "no local db found or local db error" msgid "No LocalDB found or error in existing LocalDB."
msgstr "keine local DB gefunden, oder Fehler in lokaler DB"
#: src/gpodder/libpodcasts.py:242
msgid "GB"
msgstr ""
#: src/gpodder/libpodcasts.py:244
msgid "MB"
msgstr ""
#: src/gpodder/libpodcasts.py:246
msgid "KB"
msgstr ""
#: src/gpodder/libpodcasts.py:248
msgid "Bytes"
msgstr "" msgstr ""
"Keine Lokale Datenbank gefunden (oder Fehler in existierender Datenbank)."
#: src/gpodder/libwget.py:39 src/gpodder/libwget.py:57 #: src/gpodder/libwget.py:39 src/gpodder/libwget.py:57
#: src/gpodder/libwget.py:66 #: src/gpodder/libwget.py:66
msgid "unknown" msgid "unknown"
msgstr "unbekannt" msgstr "unbekannt"
#: src/gpodder/libwget.py:272
msgid "initializing download..."
msgstr "initialisiere download..."
#: src/gpodder/libwget.py:298 #: src/gpodder/libwget.py:298
msgid "Download has been cancelled." msgid "Download has been cancelled."
msgstr "Der Download wurde abgebrochen." msgstr "Der Download wurde abgebrochen."
#: src/gpodder/libwget.py:300 #: src/gpodder/libwget.py:300
#, python-format #, python-format
msgid "wget exited with status: %s" msgid "Download error. Wget exit code was: %d"
msgstr "wget beendete mit status: %s" msgstr "Fehler beim Download. Wget's Exit-Status ist: %d"
#: src/gpodder/libwget.py:301
msgid "*** THERE HAS BEEN AN ERROR WHILE DOWNLOADING **"
msgstr "*** FEHLER IST WÄHREND DES DOWNLOADS AUFGETRETEN **"
#: data/gpodder.glade.h:1
msgid "(unknown)"
msgstr "(unbekannt)"
#: data/gpodder.glade.h:2 #: data/gpodder.glade.h:2
msgid "<b>(unknown)</b>" msgid "<b>(unknown)</b>"
msgstr "" msgstr "<b>(unbekannt)</b>"
#: data/gpodder.glade.h:3 #: data/gpodder.glade.h:3
msgid "<b><big>The gPodder Episode Title</big></b>"
msgstr ""
#: data/gpodder.glade.h:4
msgid "<b>labelFilename</b>"
msgstr ""
#: data/gpodder.glade.h:5
msgid "<b>labelFrom</b>"
msgstr ""
#: data/gpodder.glade.h:6
msgid "Advanced" msgid "Advanced"
msgstr "Erweitert" msgstr "Erweitert"
#: data/gpodder.glade.h:7 #: data/gpodder.glade.h:4
msgid "Available Podcasts" msgid "Available Podcasts"
msgstr "Verfügbare Podcasts" msgstr "Verfügbare Podcasts"
#: data/gpodder.glade.h:8 #: data/gpodder.glade.h:5
msgid "Channel:" msgid "Channel:"
msgstr "Channel:" msgstr "Channel:"
#: data/gpodder.glade.h:9 #: data/gpodder.glade.h:6
msgid "Command:" msgid "Command:"
msgstr "Befehl:" msgstr "Befehl:"
#: data/gpodder.glade.h:10 #: data/gpodder.glade.h:7
msgid "Current speed:" msgid "Cover"
msgstr "Derzeitige Geschwindigkeit:" msgstr "Bild"
#: data/gpodder.glade.h:11 #: data/gpodder.glade.h:8
msgid "Delete selected item" msgid "Delete selected item"
msgstr "Ausgewähltes Element löschen" msgstr "Ausgewähltes Element löschen"
#: data/gpodder.glade.h:12 #: data/gpodder.glade.h:9
msgid "Description of the episode currently selected in gPodder"
msgstr "Beschreibung der Episode, die momentan ausgewählt ist"
#: data/gpodder.glade.h:13
msgid "Description:" msgid "Description:"
msgstr "Beschreibung:" msgstr "Beschreibung:"
#: data/gpodder.glade.h:14 #: data/gpodder.glade.h:10
msgid "Desktop:" msgid "Desktop:"
msgstr "Desktop:" msgstr "Desktop:"
#: data/gpodder.glade.h:15 #: data/gpodder.glade.h:11
msgid "Download Pod_cast" msgid "Download Pod_cast"
msgstr "Pod_cast herunterladen" msgstr "Pod_cast herunterladen"
#: data/gpodder.glade.h:16 #: data/gpodder.glade.h:12
msgid "Download Status" msgid "Download Status"
msgstr "Download-Status" msgstr "Download-Status"
#: data/gpodder.glade.h:17 #: data/gpodder.glade.h:13
msgid "Download to:" msgid "Download to:"
msgstr "Herunterladen nach:" msgstr "Herunterladen nach:"
#: data/gpodder.glade.h:18 #: data/gpodder.glade.h:14
msgid "Downloaded Podcasts" msgid "Downloaded Podcasts"
msgstr "Heruntergeladene Podcasts" msgstr "Heruntergeladene Podcasts"
#: data/gpodder.glade.h:19 #: data/gpodder.glade.h:15
msgid "Downloading from:"
msgstr "Herunterladen von:"
#: data/gpodder.glade.h:20
msgid "Downloads" msgid "Downloads"
msgstr "Downloads" msgstr "Downloads"
#: data/gpodder.glade.h:21 #: data/gpodder.glade.h:16
msgid "E_xport list..." msgid "E_xport list..."
msgstr "Liste e_xportieren..." msgstr "Liste e_xportieren..."
#: data/gpodder.glade.h:22 #: data/gpodder.glade.h:17
msgid "Episode Information" msgid "Episode Information"
msgstr "Informationen zur Episode" msgstr "Informationen zur Episode"
#: data/gpodder.glade.h:23 #: data/gpodder.glade.h:18
msgid "Episode:"
msgstr "Episode:"
#: data/gpodder.glade.h:24
msgid "FTP Proxy:" msgid "FTP Proxy:"
msgstr "FTP-Proxy:" msgstr "FTP-Proxy:"
#: data/gpodder.glade.h:25 #: data/gpodder.glade.h:19
msgid "Feed URL:" msgid "Feed URL:"
msgstr "Feed-Adresse:" msgstr "Feed-Adresse:"
#: data/gpodder.glade.h:26 #: data/gpodder.glade.h:20
msgid "General" msgid "General"
msgstr "Allgemeines" msgstr "Allgemeines"
#: data/gpodder.glade.h:27 #: data/gpodder.glade.h:21
msgid "HTTP Proxy:" msgid "HTTP Proxy:"
msgstr "HTTP-Proxy:" msgstr "HTTP-Proxy:"
#: data/gpodder.glade.h:28 #: data/gpodder.glade.h:22
msgid "" msgid ""
"If you have to use a HTTP or FTP proxy server,\n" "If you have to use a HTTP or FTP proxy server,\n"
"you can use the usual format of the environment variables:\n" "you can use the usual format of the environment variables:\n"
"\n" "\n"
"<b>http://username:password@proxy_host:proxy_port/</b>" "<b>http://username:password@proxy_host:proxy_port/</b>"
msgstr "" msgstr ""
"Wenn Sie einen HTTP oder FTP Proxy Server nutzen,\n"
"benutzen Sie bitte das übliche Format der Umgebungsvariablen:\n"
"\n"
"<b>http://benutzer:passwort@proxy_host:proxy_port/</b>"
#: data/gpodder.glade.h:32 #: data/gpodder.glade.h:26
msgid "No cover available."
msgstr "Kein Cover verfügbar."
#: data/gpodder.glade.h:27
msgid "Play selected item" msgid "Play selected item"
msgstr "Ausgewähltes Element abspielen" msgstr "Ausgewähltes Element abspielen"
#: data/gpodder.glade.h:33 #: data/gpodder.glade.h:28
msgid "Player application:" msgid "Player application:"
msgstr "Abspielprogramm:" msgstr "Abspielprogramm:"
#: data/gpodder.glade.h:34 #: data/gpodder.glade.h:29
msgid "Progress:"
msgstr "Fortschritt:"
#: data/gpodder.glade.h:35
msgid "Proxy" msgid "Proxy"
msgstr "Proxy" msgstr "Proxy"
#: data/gpodder.glade.h:36 #: data/gpodder.glade.h:30
msgid "Save downloads in:" msgid "Save downloads in:"
msgstr "Downloads speichern in:" msgstr "Downloads speichern in:"
#: data/gpodder.glade.h:37 #: data/gpodder.glade.h:31
msgid "Show \"gPodder downloads\" link" msgid "Show \"gPodder downloads\" link"
msgstr "\"gPodder-Downloads\"-Verknüpfung anzeigen" msgstr "\"gPodder Downloads\"-Verknüpfung anzeigen"
#: data/gpodder.glade.h:38 #: data/gpodder.glade.h:32
msgid "Title:" msgid "Title:"
msgstr "Titel:" msgstr "Titel:"
#: data/gpodder.glade.h:39 #: data/gpodder.glade.h:33
msgid "_About gPodder..." msgid "_About gPodder..."
msgstr "Üb_er gPodder..." msgstr "Üb_er gPodder..."
#: data/gpodder.glade.h:40 #: data/gpodder.glade.h:34
msgid "_Add channel..." msgid "_Add channel..."
msgstr "Ch_annel hinzufügen..." msgstr "Ch_annel abbonieren..."
#: data/gpodder.glade.h:41 #: data/gpodder.glade.h:35
msgid "_Channels" msgid "_Channels"
msgstr "_Channels" msgstr "_Channels"
#: data/gpodder.glade.h:42 #: data/gpodder.glade.h:36
msgid "_Check for Updates" msgid "_Check for Updates"
msgstr "Na_ch Aktualisierungen suchen" msgstr "Na_ch Aktualisierungen suchen"
#: data/gpodder.glade.h:43 #: data/gpodder.glade.h:37
msgid "_Close" msgid "_Close"
msgstr "S_chließen" msgstr "S_chließen"
#: data/gpodder.glade.h:44 #: data/gpodder.glade.h:38
msgid "_Edit channel..." msgid "_Edit channel..."
msgstr "_Editiere Channel..." msgstr "_Editiere Channel..."
#: data/gpodder.glade.h:45 #: data/gpodder.glade.h:39
msgid "_Help" msgid "_Help"
msgstr "_Hilfe" msgstr "_Hilfe"
#: data/gpodder.glade.h:46 #: data/gpodder.glade.h:40
msgid "_Podcasts" msgid "_Podcasts"
msgstr "_Podcasts" msgstr "_Podcasts"
#: data/gpodder.glade.h:47 #: data/gpodder.glade.h:41
msgid "_Preferences..." msgid "_Preferences..."
msgstr "Ein_s_tellungen..." msgstr "Ein_s_tellungen..."
#: data/gpodder.glade.h:48 #: data/gpodder.glade.h:42
msgid "_Remove channel" msgid "_Remove channel"
msgstr "Entfe_rne Channel" msgstr "Entfe_rne Channel"
#: data/gpodder.glade.h:49 #: data/gpodder.glade.h:43
msgid "gPodder - your podcast catcher." msgid "gPodder - your podcast catcher."
msgstr "gPodder - dein podcast catcher." msgstr "gPodder - dein podcast catcher."
#: data/gpodder.glade.h:50 #: data/gpodder.glade.h:44
msgid "gPodder Channel Editor" msgid "gPodder Channel Editor"
msgstr "gPodder Channel-Editor" msgstr "gPodder Channel-Editor"
#: data/gpodder.glade.h:51 #: data/gpodder.glade.h:45
msgid "gPodder Download Status"
msgstr "gPodder Downloadstatus"
#: data/gpodder.glade.h:52
msgid "gPodder properties" msgid "gPodder properties"
msgstr "gPodder Einstellungen" msgstr "gPodder Einstellungen"
#: data/gpodder.glade.h:53
msgid "labelSpeed"
msgstr ""
#: data/gpodder.glade.h:54
msgid "~/.config/gpodder/downloads/"
msgstr ""
#: bin/gpodder:39 #: bin/gpodder:39
#, fuzzy msgid "Be more verbose"
msgid "print extra information" msgstr "Detailliertere Ausgabe"
msgstr "Informationen zur Episode"
#: bin/gpodder:43 #: bin/gpodder:43
msgid "run local version for debugging" msgid "Run local version in current directory"
msgstr "lokale Version zu Debugging-Zwecken starten" msgstr "Lokale Version im Arbeitsverzeichnis starten"
#: bin/gpodder:47 #: bin/gpodder:47
msgid "list all channel subscriptions" msgid "List all channel subscriptions"
msgstr "Alle Abonnements anzeigen" msgstr "Alle Channel-Abonnements anzeigen"
#: bin/gpodder:51 #: bin/gpodder:51
msgid "update channels and download new podcasts" msgid "Update channel list, download new podcasts"
msgstr "Channels aktualisieren und neue Podcasts herunterladen" msgstr "Channel-Liste aktualisieren und neue Podcasts herunterladen"
#: bin/gpodder:55 #: bin/gpodder:55
#, fuzzy msgid "Update channel list and exit"
msgid "update channels" msgstr "nur Channel-Liste aktualisieren"
msgstr "channel aktualisieren: %s"
#: bin/gpodder:58 #: bin/gpodder:58
msgid "add FEEDURL to channel subscriptions" msgid "Subscribe to channel from FEEDURL"
msgstr "füge FEEDURL zu den Channel-Abonnements hinzu" msgstr "Channel auf FEEDURL abonnieren"
#: bin/gpodder:61 #: bin/gpodder:61
#, fuzzy msgid "Delete channel with ID n"
msgid "delete channel n" msgstr "Channel mit der ID n entfernen"
msgstr "channel entfernen: %s"
#: bin/gpodder:79 #: bin/gpodder:79
msgid "ERROR: You do not seem to have a usable \"wget\" binary in your path." msgid "Error: cannot find wget."
msgstr "FEHLER: Sie haben anscheinend kein benutzbares \"wget\"-Programm in ihrem Pfad." msgstr "Fehler: kann wget nicht finden."
#: bin/gpodder:82 #: bin/gpodder:102
#, c-format msgid "Channel IDs may have changed, list before deleting again."
msgid "Found wget: %s" msgstr ""
msgstr "Wget gefunden: %s" "Channel IDs könnten sich verändert haben. Bitte vor dem nächsten Löschen "
"zuerst Channel-Liste anzeigen lassen."
#: bin/gpodder:104
msgid "channel IDs may have changed, list before deleting again"
msgstr "IDs könnten sich verändert haben. Bitte neue Liste anzeigen lassen vor dem nächsten Delete!!"

View File

@ -18,11 +18,10 @@
KNOWN BUGS: KNOWN BUGS:
*) installation of locale files when doing *) installation of locale files when doing
a "make install" not working a "make install" not working
*) should re-think the original strings in
source files, so this is likely to change in the future
*) has had only minimal testing - there might be bugs.. *) has had only minimal testing - there might be bugs..
-- thp <thp@perli.net>, Thu, 30 Mar 2006 23:16:20 +0200 -- thp <thp@perli.net>, Thu, 30 Mar 2006 23:16:20 +0200
Updated: Fri, 31 Mar 2006 18:11:41 +0200

View File

@ -15,22 +15,22 @@ show program's version number and exit
show this help message and exit show this help message and exit
.TP .TP
\fB\-v\fR, \fB\-\-verbose\fR \fB\-v\fR, \fB\-\-verbose\fR
print extra information Be more verbose
.TP .TP
\fB\-\-debug\fR \fB\-\-debug\fR
run local version for debugging Run local version in current directory
.TP .TP
\fB\-l\fR, \fB\-\-list\fR \fB\-l\fR, \fB\-\-list\fR
list all channel subscriptions List all channel subscriptions
.TP .TP
\fB\-r\fR, \fB\-\-run\fR \fB\-r\fR, \fB\-\-run\fR
update channels and download new podcasts Update channel list, download new podcasts
.TP .TP
\fB\-u\fR, \fB\-\-update\fR \fB\-u\fR, \fB\-\-update\fR
update channels Update channel list and exit
.TP .TP
\fB\-aFEEDURL\fR, \fB\-\-add\fR=\fIFEEDURL\fR \fB\-aFEEDURL\fR, \fB\-\-add\fR=\fIFEEDURL\fR
add FEEDURL to channel subscriptions Subscribe to channel from FEEDURL
.TP .TP
\fB\-dn\fR, \fB\-\-delete\fR=\fIn\fR \fB\-dn\fR, \fB\-\-delete\fR=\fIn\fR
delete channel n Delete channel with ID n

View File

@ -3,7 +3,7 @@
# Python module src/gpodder/gpodder.py # Python module src/gpodder/gpodder.py
# Autogenerated from gpodder.glade # Autogenerated from gpodder.glade
# Generated on Thu Mar 30 23:18:13 2006 # Generated on Fri Mar 31 18:11:13 2006
# Warning: Do not modify any context comment such as #-- # Warning: Do not modify any context comment such as #--
# They are required to keep user's code # They are required to keep user's code
@ -50,19 +50,19 @@ import libgpodder
app_name = "gpodder" app_name = "gpodder"
app_version = "unknown" # will be set in main() call app_version = "unknown" # will be set in main() call
app_authors = [ app_authors = [
"Thomas Perl <thp@perli.net>", 'Thomas Perl <thp@perli.net>', '',
"", "Contributors / patch writers:", _('Contributors / patch writers:'),
"Peter Hoffmann <tosh@cs.tu-berlin.de>", 'Peter Hoffmann <tosh@cs.tu-berlin.de>',
"Adrien Beaucreux <informancer@web.de>", 'Adrien Beaucreux <informancer@web.de>',
"Alain Tauch <contrib@maisondubonheur.com>", 'Alain Tauch <contrib@maisondubonheur.com>', '',
"", "For a complete list of contributors, see AUTHORS file" _('See the AUTHORS file for all contributors')
] ]
app_copyright = "Copyright (c) 2005-2006 Thomas Perl" app_copyright = 'Copyright (c) 2005-2006 Thomas Perl'
app_website = "http://perli.net/projekte/gpodder/" app_website = 'http://perli.net/projekte/gpodder/'
glade_dir = "/usr/share/gpodder/" glade_dir = '/usr/share/gpodder/'
icon_dir = "/usr/share/gpodder/images/gpodder.png" icon_dir = '/usr/share/gpodder/images/gpodder.png'
locale_dir = "/usr/share/locale/" locale_dir = '/usr/share/locale/'
class Gpodder(SimpleGladeApp): class Gpodder(SimpleGladeApp):
channels = [] channels = []
@ -81,6 +81,9 @@ class Gpodder(SimpleGladeApp):
# Local DB # Local DB
ldb = None ldb = None
# User Apps Reader
uar = None
def __init__(self, path="gpodder.glade", def __init__(self, path="gpodder.glade",
root="gPodder", root="gPodder",
domain=app_name, **kwargs): domain=app_name, **kwargs):
@ -143,12 +146,7 @@ class Gpodder(SimpleGladeApp):
self.download_status_manager = downloadStatusManager() self.download_status_manager = downloadStatusManager()
self.treeDownloads.set_model( self.download_status_manager.getModel()) self.treeDownloads.set_model( self.download_status_manager.getModel())
# xml test # read and display subscribed channels
#reader = rssReader()
#reader.parseXML( "http://www.perli.net", "test.xml")
#self.channels.append( reader.channel)
#reader.parseXML( "http://www.lugradio.org/episodes.rss", "episodes.rss")
#self.channels.append( reader.channel)
reader = gPodderChannelReader() reader = gPodderChannelReader()
self.channels = reader.read( False) self.channels = reader.read( False)
self.channels_loaded = True self.channels_loaded = True
@ -183,7 +181,7 @@ class Gpodder(SimpleGladeApp):
try: try:
self.comboAvailable.set_active( 0) self.comboAvailable.set_active( 0)
except: except:
print _("probably no channels found") pass
#self.updateTreeView() #self.updateTreeView()
def updateDownloadedComboBox( self): def updateDownloadedComboBox( self):
@ -198,7 +196,7 @@ class Gpodder(SimpleGladeApp):
except: except:
self.active_downloaded_channels = 0 self.active_downloaded_channels = 0
if libgpodder.isDebugging(): if libgpodder.isDebugging():
print _("no downloaded podcasts found..") print _('No downloaded podcasts found.')
# end of self.updateDownloadedComboBox() # end of self.updateDownloadedComboBox()
def updateTreeView( self): def updateTreeView( self):
@ -209,9 +207,8 @@ class Gpodder(SimpleGladeApp):
if self.items_model != None: if self.items_model != None:
self.items_model.clear() self.items_model.clear()
self.showMessage( _("<b>No channels found</b>\n\nClick on <b><i>Channels</i></b> &gt; <b><i>Add channel..</i></b> to add a new channel.")) self.showMessage( _("<b>No channels found</b>\n\nClick on <b><i>Channels</i></b> &gt; <b><i>Add channel..</i></b> to add a new channel."))
print _("probably no feeds or channels found")
def showMessage( self, message = _("some unknown function"), title = _("gPodder message")): def showMessage( self, message, title = _('gPodder message')):
dlg = gtk.MessageDialog( self.gPodder, gtk.DIALOG_MODAL, gtk.MESSAGE_INFO, gtk.BUTTONS_OK) dlg = gtk.MessageDialog( self.gPodder, gtk.DIALOG_MODAL, gtk.MESSAGE_INFO, gtk.BUTTONS_OK)
dlg.set_title( title) dlg.set_title( title)
dlg.set_markup( message) dlg.set_markup( message)
@ -219,7 +216,7 @@ class Gpodder(SimpleGladeApp):
dlg.run() dlg.run()
dlg.destroy() dlg.destroy()
def showConfirmation( self, message = _("Do you really want to do this?"), title = _("gPodder confirmation")): def showConfirmation( self, message = _('Do you really want to do this?'), title = _('gPodder confirmation')):
myresult = False myresult = False
dlg = gtk.MessageDialog( self.gPodder, gtk.DIALOG_MODAL, gtk.MESSAGE_QUESTION, gtk.BUTTONS_YES_NO) dlg = gtk.MessageDialog( self.gPodder, gtk.DIALOG_MODAL, gtk.MESSAGE_QUESTION, gtk.BUTTONS_YES_NO)
dlg.set_title( title) dlg.set_title( title)
@ -230,8 +227,8 @@ class Gpodder(SimpleGladeApp):
dlg.destroy() dlg.destroy()
if libgpodder.isDebugging(): if libgpodder.isDebugging():
print _("I Asked: %s") % message print "I Asked: %s" % message
print _("User answered: %s") % str(myresult) print "User answered: %s" % str(myresult)
return myresult return myresult
def set_icon(self): def set_icon(self):
@ -240,7 +237,7 @@ class Gpodder(SimpleGladeApp):
def get_icon(self, entry, size=24): def get_icon(self, entry, size=24):
#path = self.custom_handler.getIconPath(entry, size) #path = self.custom_handler.getIconPath(entry, size)
path = '/usr/share/gpodder/images/gpodder.png' path = icon_dir
if path == None: if path == None:
pb = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, True, 8, size, size) pb = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, True, 8, size, size)
pb.fill(0x00000000) pb.fill(0x00000000)
@ -268,30 +265,46 @@ class Gpodder(SimpleGladeApp):
self.updateDownloadedComboBox() self.updateDownloadedComboBox()
def drag_data_received(self, widget, context, x, y, sel, ttype, time): def drag_data_received(self, widget, context, x, y, sel, ttype, time):
#TODO following code is copied from on_itemAddChannel_activate refactor both to new method
result = sel.data result = sel.data
self.add_new_channel( result)
def refetch_channel_list( self):
channels_should_be = len( self.channels)
# fetch metadata for that channel
gPodderChannelWriter().write( self.channels)
self.channels = gPodderChannelReader().read( False)
# fetch feed for that channel
gPodderChannelWriter().write( self.channels)
self.channels = gPodderChannelReader().read( False)
# check if gPodderChannelReader has successfully added the channel
if channels_should_be > len( self.channels):
self.showMessage( _("There has been an error adding the channel.\nMaybe the URL is wrong?"))
def add_new_channel( self, result = None):
if result != None and result != "" and (result[:4] == "http" or result[:3] == "ftp"): if result != None and result != "" and (result[:4] == "http" or result[:3] == "ftp"):
print _("Adding channel: %s") % result if libgpodder.isDebugging():
print ("Will add channel :%s") % result
self.statusLabel.set_text( _("Fetching channel index...")) self.statusLabel.set_text( _("Fetching channel index..."))
channel_new = podcastChannel( result) channel_new = podcastChannel( result)
channel_new.shortname = "__unknown__" channel_new.shortname = "__unknown__"
self.channels.append( channel_new) self.channels.append( channel_new)
# fetch metadata for that channel # download changed channels
gPodderChannelWriter().write( self.channels) self.refetch_channel_list()
self.channels = gPodderChannelReader().read( False)
# try to update combo box
# fetch feed for that channel
gPodderChannelWriter().write( self.channels)
self.channels = gPodderChannelReader().read( False)
#TODO maybe change to new channel
self.updateComboBox() self.updateComboBox()
self.statusLabel.set_text( "") self.statusLabel.set_text( "")
else: else:
#TODO graphical reaction if result != None and result != "":
print _("unkonwn link format: %s") %result self.showMessage( _("Could not add new channel.\nOnly <b>http://</b> and <b>ftp://</b> URLs supported at the moment."))
def get_current_channel_downloaded( self):
iter = self.comboDownloaded.get_active_iter()
return self.comboDownloaded.get_model().get_value( iter, 0)
#-- Gpodder custom methods } #-- Gpodder custom methods }
#-- Gpodder.close_gpodder { #-- Gpodder.close_gpodder {
@ -329,7 +342,11 @@ class Gpodder(SimpleGladeApp):
def on_itemPreferences_activate(self, widget, *args): def on_itemPreferences_activate(self, widget, *args):
if libgpodder.isDebugging(): if libgpodder.isDebugging():
print "on_itemPreferences_activate called with self.%s" % widget.get_name() print "on_itemPreferences_activate called with self.%s" % widget.get_name()
if self.uar == None:
self.uar = UserAppsReader()
self.uar.read()
prop = Gpodderproperties() prop = Gpodderproperties()
prop.set_uar( self.uar)
#-- Gpodder.on_itemPreferences_activate } #-- Gpodder.on_itemPreferences_activate }
#-- Gpodder.on_itemAddChannel_activate { #-- Gpodder.on_itemAddChannel_activate {
@ -339,52 +356,24 @@ class Gpodder(SimpleGladeApp):
ch = Gpodderchannel() ch = Gpodderchannel()
ch.entryURL.set_text( "http://") ch.entryURL.set_text( "http://")
result = ch.requestURL() result = ch.requestURL()
if result != None and result != "" and (result[:4] == "http" or result[:3] == "ftp"): self.add_new_channel( result)
if libgpodder.isDebugging():
print ("Will add channel :%s") % result
self.statusLabel.set_text( _("Fetching channel index..."))
channel_new = podcastChannel( result)
channel_new.shortname = "__unknown__"
self.channels.append( channel_new)
channels_should_be = len( self.channels)
# fetch metadata for that channel
gPodderChannelWriter().write( self.channels)
self.channels = gPodderChannelReader().read( False)
# fetch feed for that channel
gPodderChannelWriter().write( self.channels)
self.channels = gPodderChannelReader().read( False)
# check if gPodderChannelReader has successfully added the channel
if channels_should_be > len( self.channels):
self.showMessage( _("There has been an error adding the channel.\nMaybe the URL is wrong?"))
self.updateComboBox()
self.statusLabel.set_text( "")
else:
if result != None and result != "":
self.showMessage( _("Could not add new channel.\nOnly <b>http://</b> and <b>ftp://</b> URLs supported at the moment."))
#-- Gpodder.on_itemAddChannel_activate } #-- Gpodder.on_itemAddChannel_activate }
#-- Gpodder.on_itemEditChannel_activate { #-- Gpodder.on_itemEditChannel_activate {
def on_itemEditChannel_activate(self, widget, *args): def on_itemEditChannel_activate(self, widget, *args):
if libgpodder.isDebugging(): if libgpodder.isDebugging():
print "on_itemEditChannel_activate called with self.%s" % widget.get_name() print "on_itemEditChannel_activate called with self.%s" % widget.get_name()
active = self.active_channel channel = None
try: try:
url_old = self.channels[active].url channel = self.channels[self.active_channel]
title_old = self.channels[active].title
desc_old = self.channels[active].description
downloaddir_old = self.channels[active].save_dir # FIXME: should be download dir, but save_dir is more descriptive for now
except: except:
self.showMessage( _("Cannot edit this channel.\n\nNo channel found.")) self.showMessage( _("Cannot edit this channel.\n\nNo channel found."))
return return
result = Gpodderchannel().requestURL( preset = url_old, title = title_old, description = desc_old, downloaddir = downloaddir_old) result = Gpodderchannel().requestURL( channel)
if result != None and result != "" and (result[:4] == "http" or result[:3] == "ftp"): if result != channel.url and result != None and result != "" and (result[:4] == "http" or result[:3] == "ftp"):
if libgpodder.isDebugging(): if libgpodder.isDebugging():
print "will EDIT ID " + str(active) + " FROM " + url_old + " TO " + result print 'Changing ID %d from "%s" to "%s"' % (active, channel.url, result)
self.statusLabel.set_text( _("Fetching channel index...")) self.statusLabel.set_text( _("Fetching channel index..."))
channel_new = podcastChannel( result) channel_new = podcastChannel( result)
channel_new.shortname = "__unknown__" channel_new.shortname = "__unknown__"
@ -392,18 +381,10 @@ class Gpodder(SimpleGladeApp):
new_channels.append( channel_new) new_channels.append( channel_new)
new_channels.extend( self.channels[active+1:]) new_channels.extend( self.channels[active+1:])
self.channels = new_channels self.channels = new_channels
# TODO: REFACTOR THE NEXT TWO CODEBLOCKS INTO # fetch new channels
# A SINGLE FUNCTION (SAME BLOCKS ARE USED IN "ADD FEED") self.refetch_channel_list()
# fetch metadata for that channel
gPodderChannelWriter().write( self.channels)
self.channels = gPodderChannelReader().read( False)
# fetch feed for that channel
gPodderChannelWriter().write( self.channels)
self.channels = gPodderChannelReader().read( False)
self.updateComboBox() self.updateComboBox()
self.statusLabel.set_text( "") self.statusLabel.set_text( "")
# end if result != None etc etc # end if result != None etc etc
@ -431,9 +412,9 @@ class Gpodder(SimpleGladeApp):
if libgpodder.isDebugging(): if libgpodder.isDebugging():
print "on_itemExportChannels_activate called with self.%s" % widget.get_name() print "on_itemExportChannels_activate called with self.%s" % widget.get_name()
if len( self.channels) == 0: if len( self.channels) == 0:
self.showMessage( _("Your channel list is empty. Nothing to export.\n\nGo add some fancy channels! :)")) self.showMessage( _("Your channel list is empty. Nothing to export."))
return return
dlg = gtk.FileChooserDialog( title=_("Export to OPML..."), parent = None, action = gtk.FILE_CHOOSER_ACTION_SAVE) dlg = gtk.FileChooserDialog( title=_("Export to OPML"), parent = None, action = gtk.FILE_CHOOSER_ACTION_SAVE)
dlg.add_button( gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL) dlg.add_button( gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL)
dlg.add_button( gtk.STOCK_SAVE, gtk.RESPONSE_OK) dlg.add_button( gtk.STOCK_SAVE, gtk.RESPONSE_OK)
response = dlg.run() response = dlg.run()
@ -442,7 +423,7 @@ class Gpodder(SimpleGladeApp):
if foutname[-5:] != ".opml" and foutname[-4:] != ".xml": if foutname[-5:] != ".opml" and foutname[-4:] != ".xml":
foutname = foutname + ".opml" foutname = foutname + ".opml"
if libgpodder.isDebugging(): if libgpodder.isDebugging():
print _("=> WILL WRITE OPML TO: ") + foutname print 'Exporting channels list to: %s' % foutname
w = opmlWriter( foutname) w = opmlWriter( foutname)
for ch in self.channels: for ch in self.channels:
w.addChannel( ch) w.addChannel( ch)
@ -501,7 +482,7 @@ class Gpodder(SimpleGladeApp):
selection_iter = selection_tuple[1] selection_iter = selection_tuple[1]
url = self.items_model.get_value( selection_iter, 0) url = self.items_model.get_value( selection_iter, 0)
except: except:
self.showMessage( _("You have not selected an episode to download.\n\nPlease select one, and I'll download it for you.")) self.showMessage( _("You have not selected an episode to download."))
return return
self.active_item = self.channels[self.active_channel].getActiveByUrl( url) self.active_item = self.channels[self.active_channel].getActiveByUrl( url)
@ -510,13 +491,13 @@ class Gpodder(SimpleGladeApp):
current_podcast = current_channel.items[self.active_item] current_podcast = current_channel.items[self.active_item]
filename = current_channel.getPodcastFilename( current_podcast.url) filename = current_channel.getPodcastFilename( current_podcast.url)
if widget.get_name() == "treeAvailable": if widget.get_name() == "treeAvailable":
Gpodderepisode().set_episode( current_podcast) Gpodderepisode().set_episode( current_podcast)
return return
if os.path.exists( filename) == False and self.download_status_manager.is_download_in_progress( current_podcast.url) == False: if os.path.exists( filename) == False and self.download_status_manager.is_download_in_progress( current_podcast.url) == False:
downloadThread( current_podcast.url, filename, None, self.download_status_manager, current_podcast.title, current_channel, current_podcast, self.ldb).download() downloadThread( current_podcast.url, filename, None, self.download_status_manager, current_podcast.title, current_channel, current_podcast, self.ldb).download()
else: else:
self.showMessage( _("<big><b>Already downloaded</b></big>\n\nYou have already downloaded this episode.\nOr you are currently downloading it.")) self.showMessage( _("You have already downloaded this episode\nor you are currently downloading it."))
#-- Gpodder.on_treeAvailable_row_activated } #-- Gpodder.on_treeAvailable_row_activated }
#-- Gpodder.on_btnDownload_clicked { #-- Gpodder.on_btnDownload_clicked {
@ -538,7 +519,7 @@ class Gpodder(SimpleGladeApp):
if self.showConfirmation( _("Do you really want to cancel this download?\n\n%s") % title): if self.showConfirmation( _("Do you really want to cancel this download?\n\n%s") % title):
self.download_status_manager.cancel_by_url( url) self.download_status_manager.cancel_by_url( url)
else: else:
self.showMessage( _("No episode selected - nothing cancelled.")) self.showMessage( _("No episode selected."))
#-- Gpodder.on_treeDownloads_row_activated } #-- Gpodder.on_treeDownloads_row_activated }
#-- Gpodder.on_btnCancelDownloadStatus_clicked { #-- Gpodder.on_btnCancelDownloadStatus_clicked {
@ -554,11 +535,8 @@ class Gpodder(SimpleGladeApp):
print "on_comboDownloaded_changed called with self.%s" % widget.get_name() print "on_comboDownloaded_changed called with self.%s" % widget.get_name()
self.active_downloaded_channels = self.comboDownloaded.get_active() self.active_downloaded_channels = self.comboDownloaded.get_active()
try: try:
selection_iter = self.comboDownloaded.get_active_iter() filename = self.get_current_channel_downloaded()
selected_value = self.comboDownloaded.get_model().get_value( selection_iter, 0) new_model = self.ldb.getDownloadedEpisodesModelByFilename( filename)
if libgpodder.isDebugging():
print "comboDownloaded_changed with: " + selected_value
new_model = self.ldb.getDownloadedEpisodesModelByFilename( selected_value)
self.treeDownloaded.set_model( new_model) self.treeDownloaded.set_model( new_model)
except: except:
# silently ignore the fact that we do not have any downloads # silently ignore the fact that we do not have any downloads
@ -569,18 +547,16 @@ class Gpodder(SimpleGladeApp):
def on_treeDownloaded_row_activated(self, widget, *args): def on_treeDownloaded_row_activated(self, widget, *args):
if libgpodder.isDebugging(): if libgpodder.isDebugging():
print "on_treeDownloaded_row_activated called with self.%s" % widget.get_name() print "on_treeDownloaded_row_activated called with self.%s" % widget.get_name()
# TODO: refactor with above "on_comboDownloaded_changed" into one method (next three lines)
try: try:
selection_iter = self.comboDownloaded.get_active_iter() channel_filename = self.get_current_channel_downloaded()
channel_filename = self.comboDownloaded.get_model().get_value( selection_iter, 0)
selection_tuple = self.treeDownloaded.get_selection().get_selected() selection_tuple = self.treeDownloaded.get_selection().get_selected()
selection_iter = selection_tuple[1] selection_iter = selection_tuple[1]
url = self.treeDownloaded.get_model().get_value( selection_iter, 0) url = self.treeDownloaded.get_model().get_value( selection_iter, 0)
filename_final = localDB().getLocalFilenameByPodcastURL( channel_filename, url) filename_final = self.ldb.getLocalFilenameByPodcastURL( channel_filename, url)
gPodderLib().openFilename( filename_final) gPodderLib().openFilename( filename_final)
except: except:
self.showMessage( _("Could not open this episode.\n\nHave you even selected one?")) self.showMessage( _("No episode selected."))
#-- Gpodder.on_treeDownloaded_row_activated } #-- Gpodder.on_treeDownloaded_row_activated }
#-- Gpodder.on_btnDownloadedExecute_clicked { #-- Gpodder.on_btnDownloadedExecute_clicked {
@ -595,17 +571,16 @@ class Gpodder(SimpleGladeApp):
if libgpodder.isDebugging(): if libgpodder.isDebugging():
print "on_btnDownloadedDelete_clicked called with self.%s" % widget.get_name() print "on_btnDownloadedDelete_clicked called with self.%s" % widget.get_name()
# Note: same code as in on_treeDownloaded_row_activated() # Note: same code as in on_treeDownloaded_row_activated() TODO: refactor!
try: try:
selection_iter = self.comboDownloaded.get_active_iter() channel_filename = self.get_current_channel_downloaded()
channel_filename = self.comboDownloaded.get_model().get_value( selection_iter, 0)
selection_tuple = self.treeDownloaded.get_selection().get_selected() selection_tuple = self.treeDownloaded.get_selection().get_selected()
selection_iter = selection_tuple[1] selection_iter = selection_tuple[1]
url = self.treeDownloaded.get_model().get_value( selection_iter, 0) url = self.treeDownloaded.get_model().get_value( selection_iter, 0)
title = self.treeDownloaded.get_model().get_value( selection_iter, 1) title = self.treeDownloaded.get_model().get_value( selection_iter, 1)
filename_final = localDB().getLocalFilenameByPodcastURL( channel_filename, url) filename_final = self.ldb.getLocalFilenameByPodcastURL( channel_filename, url)
current_channel = self.downloaded_channels[self.comboDownloaded.get_active()] current_channel = self.downloaded_channels[self.comboDownloaded.get_active()]
if self.showConfirmation( _("Do you really want to remove this episode?\n\n%s") % title) == False: if self.showConfirmation( _("Do you really want to remove this episode?\n\n%s") % title) == False:
return return
@ -617,78 +592,16 @@ class Gpodder(SimpleGladeApp):
self.updateComboBox() self.updateComboBox()
self.updateDownloadedComboBox() self.updateDownloadedComboBox()
except: except:
self.showMessage( _("Could not delete selected item.\nHave you selected an episode to delete?")) self.showMessage( _("Could not delete downloaded podcast."))
#-- Gpodder.on_btnDownloadedDelete_clicked } #-- Gpodder.on_btnDownloadedDelete_clicked }
class Gpodderstatus(SimpleGladeApp): class Gpodderchannel(SimpleGladeApp):
event = None event = None
channel = None channel = None
podcast = None podcast = None
thread = None thread = None
def __init__(self, path="gpodder.glade",
root="gPodderStatus",
domain=app_name, **kwargs):
path = os.path.join(glade_dir, path)
SimpleGladeApp.__init__(self, path, root, domain, **kwargs)
#-- Gpodderstatus.new {
def new(self, download_status_manager = None):
if libgpodder.isDebugging():
print "A new %s has been created" % self.__class__.__name__
#-- Gpodderstatus.new }
#-- Gpodderstatus custom methods {
# Write your own methods here
def setup( self, channel, podcast, download_status_manager):
self.channel = channel
self.podcast = podcast
self.labelFrom.set_markup( "<b>" + self.channel.title + "</b>")
self.labelFilename.set_markup( "<b>" + self.podcast.title + "</b>")
def download( self):
self.thread.download()
while self.event.isSet() == False:
self.event.wait( 0.1)
self.labelSpeed.set_text( self.thread.speed)
self.progressBar.set_fraction( float(self.thread.percentage))
while gtk.events_pending():
gtk.main_iteration( False)
self.gPodderStatus.destroy()
def cancel( self):
self.on_btnCancel_clicked( self.btnCancel, None)
#-- Gpodderstatus custom methods }
#-- Gpodderstatus.on_gPodderStatus_destroy {
def on_gPodderStatus_destroy(self, widget, *args):
if libgpodder.isDebugging():
print "on_gPodderStatus_destroy called with self.%s" % widget.get_name()
#-- Gpodderstatus.on_gPodderStatus_destroy }
#-- Gpodderstatus.on_btnCancel_clicked {
def on_btnCancel_clicked(self, widget, *args):
if libgpodder.isDebugging():
print "on_btnCancel_clicked called with self.%s" % widget.get_name()
if self.thread != None:
self.thread.cancel()
while self.event != None and self.event.isSet() == False:
None
self.gPodderStatus.destroy()
#-- Gpodderstatus.on_btnCancel_clicked }
class Gpodderchannel(SimpleGladeApp):
def __init__(self, path="gpodder.glade", def __init__(self, path="gpodder.glade",
root="gPodderChannel", root="gPodderChannel",
domain=app_name, **kwargs): domain=app_name, **kwargs):
@ -705,15 +618,19 @@ class Gpodderchannel(SimpleGladeApp):
#-- Gpodderchannel.new } #-- Gpodderchannel.new }
#-- Gpodderchannel custom methods { #-- Gpodderchannel custom methods {
# Write your own methods here def requestURL( self, channel = None):
def requestURL( self, preset = None, title = "(unknown)", description = "(unknown)", downloaddir = None): if channel != None:
if preset != None: self.entryURL.set_text( channel.url)
self.entryURL.set_text( preset) self.downloadTo.set_text( channel.save_dir)
self.channel_title.set_markup( "<b>%s</b>" % channel.title)
if downloaddir != None: description = channel.description
self.downloadTo.set_text( downloaddir) if channel.image != None:
# load image in background
self.channel_title.set_markup( "<b>%s</b>" % title) gPodderLib().get_image_from_url( channel.image, self.imgCover.set_from_pixbuf, self.labelCoverStatus.set_text, self.labelCoverStatus.hide, channel.cover_file)
else:
self.channel_title.set_markup( "<b>%s</b>" % _("(unknown)"))
description = _("(unknown)")
b = gtk.TextBuffer() b = gtk.TextBuffer()
b.set_text( description) b.set_text( description)
self.channel_description.set_buffer( b) self.channel_description.set_buffer( b)
@ -778,9 +695,6 @@ class Gpodderproperties(SimpleGladeApp):
self.openApp.set_text( gl.open_app) self.openApp.set_text( gl.open_app)
# if the symlink exists, set the checkbox active # if the symlink exists, set the checkbox active
self.cbDesktopSymlink.set_active( gPodderLib().getDesktopSymlink()) self.cbDesktopSymlink.set_active( gPodderLib().getDesktopSymlink())
# fill players box with values
uar = UserAppsReader()
uar.read()
# setup cell renderers # setup cell renderers
cellrenderer = gtk.CellRendererPixbuf() cellrenderer = gtk.CellRendererPixbuf()
self.comboPlayerApp.pack_start( cellrenderer, False) self.comboPlayerApp.pack_start( cellrenderer, False)
@ -789,14 +703,16 @@ class Gpodderproperties(SimpleGladeApp):
self.comboPlayerApp.pack_start( cellrenderer, True) self.comboPlayerApp.pack_start( cellrenderer, True)
self.comboPlayerApp.add_attribute( cellrenderer, 'markup', 0) self.comboPlayerApp.add_attribute( cellrenderer, 'markup', 0)
# end setup cell renderers # end setup cell renderers
#-- Gpodderproperties.new }
#-- Gpodderproperties custom methods {
def set_uar( self, uar):
self.comboPlayerApp.set_model( uar.get_applications_as_model()) self.comboPlayerApp.set_model( uar.get_applications_as_model())
# try to activate an item # try to activate an item
index = self.find_active() index = self.find_active()
self.comboPlayerApp.set_active( index) self.comboPlayerApp.set_active( index)
#-- Gpodderproperties.new } # end set_uar
#-- Gpodderproperties custom methods {
# Write your own methods here
def find_active( self): def find_active( self):
model = self.comboPlayerApp.get_model() model = self.comboPlayerApp.get_model()
iter = model.get_iter_first() iter = model.get_iter_first()
@ -821,8 +737,8 @@ class Gpodderproperties(SimpleGladeApp):
#-- Gpodderproperties.on_comboPlayerApp_changed { #-- Gpodderproperties.on_comboPlayerApp_changed {
def on_comboPlayerApp_changed(self, widget, *args): def on_comboPlayerApp_changed(self, widget, *args):
if libgpodder.isDebugging(): if libgpodder.isDebugging():
print "on_comboPlayerApp_changed called with self.%s" % widget.get_name() print "on_comboPlayerApp_changed called with self.%s" % widget.get_name()
# find out which one # find out which one
iter = self.comboPlayerApp.get_active_iter() iter = self.comboPlayerApp.get_active_iter()
model = self.comboPlayerApp.get_model() model = self.comboPlayerApp.get_model()
@ -864,7 +780,6 @@ class Gpodderproperties(SimpleGladeApp):
class Gpodderepisode(SimpleGladeApp): class Gpodderepisode(SimpleGladeApp):
def __init__(self, path="gpodder.glade", def __init__(self, path="gpodder.glade",
root="gPodderEpisode", root="gPodderEpisode",
domain=app_name, **kwargs): domain=app_name, **kwargs):
@ -872,7 +787,7 @@ class Gpodderepisode(SimpleGladeApp):
SimpleGladeApp.__init__(self, path, root, domain, **kwargs) SimpleGladeApp.__init__(self, path, root, domain, **kwargs)
#-- Gpodderepisode.new { #-- Gpodderepisode.new {
def new( self): def new(self):
if libgpodder.isDebugging(): if libgpodder.isDebugging():
print "A new %s has been created" % self.__class__.__name__ print "A new %s has been created" % self.__class__.__name__
#-- Gpodderepisode.new } #-- Gpodderepisode.new }
@ -903,7 +818,6 @@ def main( __version__ = None):
bindtextdomain( app_name, locale_dir) bindtextdomain( app_name, locale_dir)
app_version = __version__ app_version = __version__
g_podder = Gpodder() g_podder = Gpodder()
#g_podder_status = Gpodderstatus()
#g_podder_channel = Gpodderchannel() #g_podder_channel = Gpodderchannel()
#g_podder_properties = Gpodderproperties() #g_podder_properties = Gpodderproperties()
#g_podder_episode = Gpodderepisode() #g_podder_episode = Gpodderepisode()
@ -912,7 +826,7 @@ def main( __version__ = None):
g_podder.run() g_podder.run()
if __name__ == "__main__": if __name__ == "__main__":
print _("please run the gpodder binary, not this file") print _("Please do not call gpodder.py directly. Instead, call the gpodder binary.")
sys.exit( -1) sys.exit( -1)
#-- main } #-- main }

View File

@ -3,7 +3,7 @@
# Python module src/gpodder/gpodder.py # Python module src/gpodder/gpodder.py
# Autogenerated from gpodder.glade # Autogenerated from gpodder.glade
# Generated on Thu Mar 30 23:18:13 2006 # Generated on Fri Mar 31 18:11:13 2006
# Warning: Do not modify any context comment such as #-- # Warning: Do not modify any context comment such as #--
# They are required to keep user's code # They are required to keep user's code
@ -137,34 +137,6 @@ class Gpodder(SimpleGladeApp):
#-- Gpodder.on_btnDownloadedDelete_clicked } #-- Gpodder.on_btnDownloadedDelete_clicked }
class Gpodderstatus(SimpleGladeApp):
def __init__(self, path="gpodder.glade",
root="gPodderStatus",
domain=app_name, **kwargs):
path = os.path.join(glade_dir, path)
SimpleGladeApp.__init__(self, path, root, domain, **kwargs)
#-- Gpodderstatus.new {
def new(self):
print "A new %s has been created" % self.__class__.__name__
#-- Gpodderstatus.new }
#-- Gpodderstatus custom methods {
# Write your own methods here
#-- Gpodderstatus custom methods }
#-- Gpodderstatus.on_gPodderStatus_destroy {
def on_gPodderStatus_destroy(self, widget, *args):
print "on_gPodderStatus_destroy called with self.%s" % widget.get_name()
#-- Gpodderstatus.on_gPodderStatus_destroy }
#-- Gpodderstatus.on_btnCancel_clicked {
def on_btnCancel_clicked(self, widget, *args):
print "on_btnCancel_clicked called with self.%s" % widget.get_name()
#-- Gpodderstatus.on_btnCancel_clicked }
class Gpodderchannel(SimpleGladeApp): class Gpodderchannel(SimpleGladeApp):
def __init__(self, path="gpodder.glade", def __init__(self, path="gpodder.glade",
@ -263,7 +235,6 @@ class Gpodderepisode(SimpleGladeApp):
def main(): def main():
g_podder = Gpodder() g_podder = Gpodder()
g_podder_status = Gpodderstatus()
g_podder_channel = Gpodderchannel() g_podder_channel = Gpodderchannel()
g_podder_properties = Gpodderproperties() g_podder_properties = Gpodderproperties()
g_podder_episode = Gpodderepisode() g_podder_episode = Gpodderepisode()

View File

@ -14,6 +14,7 @@
import gtk import gtk
import thread import thread
import threading import threading
import urllib
from xml.sax.saxutils import DefaultHandler from xml.sax.saxutils import DefaultHandler
from xml.sax import make_parser from xml.sax import make_parser
@ -35,6 +36,8 @@ from stat import ST_MODE
from librssreader import rssReader from librssreader import rssReader
from libpodcasts import podcastChannel from libpodcasts import podcastChannel
from gtk.gdk import PixbufLoader
# global debugging variable, set to False on release # global debugging variable, set to False on release
# TODO: while developing a new version, set this to "True" # TODO: while developing a new version, set this to "True"
debugging = True debugging = True
@ -58,6 +61,7 @@ class gPodderLib( object):
http_proxy = "" http_proxy = ""
ftp_proxy = "" ftp_proxy = ""
open_app = "" open_app = ""
desktop_link = _("gPodder downloads")
def __init__( self): def __init__( self):
self.gpodderdir = expanduser( "~/.config/gpodder/") self.gpodderdir = expanduser( "~/.config/gpodder/")
@ -134,7 +138,7 @@ class gPodderLib( object):
system( self.open_app + " " + filename + " &") system( self.open_app + " " + filename + " &")
def getDesktopSymlink( self): def getDesktopSymlink( self):
symlink_path = expanduser( "~/Desktop/"+_("gPodder downloads")) symlink_path = expanduser( "~/Desktop/%s" % self.desktop_link)
return exists( symlink_path) return exists( symlink_path)
def createDesktopSymlink( self): def createDesktopSymlink( self):
@ -143,13 +147,53 @@ class gPodderLib( object):
if not self.getDesktopSymlink(): if not self.getDesktopSymlink():
downloads_path = expanduser( "~/Desktop/") downloads_path = expanduser( "~/Desktop/")
self.createIfNecessary( downloads_path) self.createIfNecessary( downloads_path)
symlink( self.downloaddir, downloads_path + _("gPodder downloads")) symlink( self.downloaddir, "%s%s" % (downloads_path, self.desktop_link))
def removeDesktopSymlink( self): def removeDesktopSymlink( self):
if isDebugging(): if isDebugging():
print "removeDesktopSymlink requested" print "removeDesktopSymlink requested"
if self.getDesktopSymlink(): if self.getDesktopSymlink():
unlink( expanduser( "~/Desktop/"+_("gPodder downloads"))) unlink( expanduser( "~/Desktop/%s" % self.desktop_link))
def image_download_thread( self, url, callback_pixbuf = None, callback_status = None, callback_finished = None, cover_file = None):
if callback_status != None:
callback_status( _('Downloading channel cover...'))
pixbuf = PixbufLoader()
if cover_file == None:
if isDebugging():
print "directly downloading %s" % url
pixbuf.write( urllib.urlopen(url).read())
if cover_file != None and not exists( cover_file):
if isDebugging():
print "downloading cover to %s" % cover_file
cachefile = open( cover_file, "w")
cachefile.write( urllib.urlopen(url).read())
cachefile.close()
if cover_file != None:
if isDebugging():
print "reading cover from %s" % cover_file
pixbuf.write( open( cover_file, "r").read())
try:
pixbuf.close()
except:
# data error, delete temp file
self.deleteFilename( cover_file)
if callback_pixbuf != None:
callback_pixbuf( pixbuf.get_pixbuf())
if callback_status != None:
callback_status( '')
if callback_finished != None:
callback_finished()
def get_image_from_url( self, url, callback_pixbuf = None, callback_status = None, callback_finished = None, cover_file = None):
args = ( url, callback_pixbuf, callback_status, callback_finished, cover_file )
thread = threading.Thread( target = self.image_download_thread, args = args)
thread.start()
def deleteFilename( self, filename): def deleteFilename( self, filename):
if isDebugging(): if isDebugging():
@ -164,12 +208,12 @@ class gPodderChannelWriter( object):
def write( self, channels): def write( self, channels):
filename = gPodderLib().getChannelsFilename() filename = gPodderLib().getChannelsFilename()
fd = open( filename, "w") fd = open( filename, "w")
print >> fd, '<!-- '+_('automatically generated, will be overwritten on next gpodder shutdown.')+' -->' print >> fd, '<!-- '+_('gPodder channel list')+' -->'
print >> fd, '<channels>' print >> fd, '<channels>'
for chan in channels: for chan in channels:
print >> fd, ' <channel name="%s">' %chan.filename print >> fd, ' <channel name="%s">' % chan.filename
print >> fd, ' <url>%s</url>' %chan.url print >> fd, ' <url>%s</url>' % chan.url
print >> fd, ' <download_dir>%s</download_dir>' %chan.save_dir print >> fd, ' <download_dir>%s</download_dir>' % chan.save_dir
print >> fd, ' </channel>' print >> fd, ' </channel>'
print >> fd, '</channels>' print >> fd, '</channels>'
fd.close() fd.close()

View File

@ -94,7 +94,7 @@ class localDB( object):
rdb.parseXML( filename) rdb.parseXML( filename)
self.localdbs[filename] = rdb self.localdbs[filename] = rdb
return rdb.channel.getItemsModel() return rdb.channel.getItemsModel( False)
def getLocalFilenameByPodcastURL( self, channel_filename, url): def getLocalFilenameByPodcastURL( self, channel_filename, url):
if channel_filename in self.localdbs: if channel_filename in self.localdbs:

View File

@ -76,7 +76,8 @@ class podcastChannel(object):
locdb_reader.parseXML( localdb) locdb_reader.parseXML( localdb)
self.downloaded = locdb_reader.channel self.downloaded = locdb_reader.channel
except: except:
print "no local db found or local db error: creating new.." if libgpodder.isDebugging():
print "no local db found or local db error: creating new.."
self.downloaded = podcastChannel( self.url, self.title, self.link, self.description) self.downloaded = podcastChannel( self.url, self.title, self.link, self.description)
self.downloaded.items.append( item) self.downloaded.items.append( item)
@ -91,13 +92,13 @@ class podcastChannel(object):
def isDownloaded( self, item): def isDownloaded( self, item):
return self.podcastFilenameExists( item.url) return self.podcastFilenameExists( item.url)
def getItemsModel( self): def getItemsModel( self, want_color = True):
new_model = gtk.ListStore( gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_BOOLEAN, gobject.TYPE_STRING) new_model = gtk.ListStore( gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_BOOLEAN, gobject.TYPE_STRING)
for item in self.items: for item in self.items:
# Skip items with no download url # Skip items with no download url
if item.url != "": if item.url != "":
if self.isDownloaded(item): if self.isDownloaded(item) and want_color:
background_color = "#eeeeee" background_color = "#eeeeee"
else: else:
background_color = "white" background_color = "white"
@ -173,6 +174,12 @@ class podcastChannel(object):
index_file = property(fget=get_index_file) index_file = property(fget=get_index_file)
def get_cover_file( self):
# gets cover filename for cover download cache
return self.save_dir + "cover"
cover_file = property(fget=get_cover_file)
def getPodcastFilename( self, url): def getPodcastFilename( self, url):
# strip question mark (and everything behind it), fix %20 errors # strip question mark (and everything behind it), fix %20 errors
filename = basename( url).replace( "%20", " ") filename = basename( url).replace( "%20", " ")
@ -204,7 +211,7 @@ class podcastChannel(object):
nr_items += 1 nr_items += 1
self.downloaded.items.remove(item) self.downloaded.items.remove(item)
except: except:
print _("no local db found or local db error") print _("No LocalDB found or error in existing LocalDB.")
if libgpodder.isDebugging(): if libgpodder.isDebugging():
print " found", nr_items, "matching item(s)" print " found", nr_items, "matching item(s)"
if nr_items > 0: if nr_items > 0:
@ -239,13 +246,14 @@ class podcastItem(object):
size = int( self.length) size = int( self.length)
if size > gigabyte: if size > gigabyte:
return str( size / gigabyte) + " " + _("GB") # Might be a bit big, but who cares...
return '%d GB' % str(size / gigabyte)
if size > megabyte: if size > megabyte:
return str( size / megabyte) + " " + _("MB") return '%d MB' % int(size / megabyte)
if size > kilobyte: if size > kilobyte:
return str( size / kilobyte) + " " + _("KB") return '%d KB' % int(size / kilobyte)
return str( size) + " "+_("Bytes") return '%d Bytes' % size
def channelsToModel( channels): def channelsToModel( channels):
new_model = gtk.ListStore( gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_OBJECT) new_model = gtk.ListStore( gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_OBJECT)

View File

@ -269,7 +269,7 @@ def downloadProcedure( url, filename, force_update):
url = url.replace( "%20", " ") url = url.replace( "%20", " ")
dlinfo_speed = _("initializing download...") dlinfo_speed = '...'
dlinfo_percentage = "0" dlinfo_percentage = "0"
dlinfo_result = -1 dlinfo_result = -1
@ -297,8 +297,7 @@ def downloadProcedure( url, filename, force_update):
if dlinfo_result == 9: if dlinfo_result == 9:
showMessage( _("Download has been cancelled.")) showMessage( _("Download has been cancelled."))
else: else:
showMessage( _("wget exited with status: %s") % str( dlinfo_result)) showMessage( _("Download error. Wget exit code was: %d") % dlinfo_result)
print _("*** THERE HAS BEEN AN ERROR WHILE DOWNLOADING **")
# end if # end if
# end if # end if