From 7c66f8080eb542d8cfa530ab89ecc859cf104532 Mon Sep 17 00:00:00 2001 From: Thomas Perl Date: Sun, 9 Apr 2006 16:18:47 +0000 Subject: [PATCH] D-BUSified iPodManager and lots of automagic coolness, Python 2.4, might break things, but hey: it's SVN after all =) git-svn-id: svn://svn.berlios.de/gpodder@95 b0d088ad-0a06-0410-aad2-9ed5178a7e87 --- ChangeLog | 12 +++ bin/gpodder | 6 +- data/messages.pot | 194 +++++++++++++++++++---------------- data/po/de.po | 204 ++++++++++++++++++++----------------- data/po/fr.po | 190 +++++++++++++++++++--------------- doc/man/gpodder.1 | 8 +- setup.py | 2 +- src/gpodder/gpodder.py | 53 ++++++++-- src/gpodder/libipodsync.py | 167 +++++++++++++++++++++++++++++- 9 files changed, 549 insertions(+), 287 deletions(-) diff --git a/ChangeLog b/ChangeLog index f1f7c094..fd00af26 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +Sun, 09 Apr 2006 18:10:54 +0200 + * Added iPodManager and iPod to libipodsync (D-BUSified) + * Automatically detect connected iPod, ask if user wants to sync + * Automatically eject iPod device on sync finish (should be opt.) + * Python 2.4 is now used instead of Python 2.3 (for D-BUS) + * Lots of D-BUS magic, still VERY experimental.. + * gPodder SVN will now feature very experimental D-BUS stuff in + the near future, related to iPod, but it should keep working + if you either haven't installed "gpod" or "dbus" for Python2.4 + * Send your RANTS about svn not working to thp@perli.net.. hehe + * Updated German translation + Sun, 09 Apr 2006 14:10:28 +0200 * Enabled podcast flag setting (works with libgpod cvs) * Fixed a brainfart of mine -- new localDB could not be created diff --git a/bin/gpodder b/bin/gpodder index 25b9f506..7ba93de8 100755 --- a/bin/gpodder +++ b/bin/gpodder @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python2.4 # -*- coding: utf-8 -*- # @@ -26,8 +26,8 @@ # PLEASE DO NOT CHANGE FORMAT OF __version__ LINE (setup.py reads this) __author__ = "Thomas Perl " -__version__ = "0.7+svn20060408" -__date__ = "2006-04-08" +__version__ = "0.7+svn20060409" +__date__ = "2006-04-09" __copyright__ = "Copyright (c) 2005-2006 %s. All rights reserved." % __author__ __licence__ = "GPL" diff --git a/data/messages.pot b/data/messages.pot index 9fc547bd..36b01336 100644 --- a/data/messages.pot +++ b/data/messages.pot @@ -6,9 +6,9 @@ #, fuzzy msgid "" msgstr "" -"Project-Id-Version: gPodder 0.7+svn20060407\n" +"Project-Id-Version: gPodder 0.7+svn20060408\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2006-04-08 10:32+0200\n" +"POT-Creation-Date: 2006-04-09 18:14+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -26,47 +26,51 @@ msgstr "" msgid "%s is not a valid id" msgstr "" -#: src/gpodder/gpodder.py:70 +#: src/gpodder/gpodder.py:71 msgid "Contributors / patch writers:" msgstr "" -#: src/gpodder/gpodder.py:74 +#: src/gpodder/gpodder.py:75 msgid "See the AUTHORS file for all contributors" msgstr "" -#: src/gpodder/gpodder.py:131 src/gpodder/gpodder.py:146 -#: src/gpodder/gpodder.py:152 +#: src/gpodder/gpodder.py:135 src/gpodder/gpodder.py:150 +#: src/gpodder/gpodder.py:156 msgid "Episode" msgstr "" -#: src/gpodder/gpodder.py:136 +#: src/gpodder/gpodder.py:140 msgid "Size" msgstr "" -#: src/gpodder/gpodder.py:155 +#: src/gpodder/gpodder.py:159 msgid "Speed" msgstr "" -#: src/gpodder/gpodder.py:158 +#: src/gpodder/gpodder.py:162 msgid "Progress" msgstr "" -#: src/gpodder/gpodder.py:182 +#: src/gpodder/gpodder.py:186 msgid "Channel Info" msgstr "" -#: src/gpodder/gpodder.py:199 +#: src/gpodder/gpodder.py:205 #, python-format msgid "" "gPodder development version %s\n" "Use at your own risk, but also enjoy new features :)" msgstr "" -#: src/gpodder/gpodder.py:226 +#: src/gpodder/gpodder.py:220 +msgid "iPod connected. Do you want to sync now?" +msgstr "" + +#: src/gpodder/gpodder.py:249 msgid "No downloaded podcasts found." msgstr "" -#: src/gpodder/gpodder.py:236 +#: src/gpodder/gpodder.py:259 msgid "" "No channels found\n" "\n" @@ -74,42 +78,41 @@ msgid "" "new channel." msgstr "" -#: src/gpodder/gpodder.py:238 +#: src/gpodder/gpodder.py:261 msgid "gPodder message" msgstr "" -#: src/gpodder/gpodder.py:246 +#: src/gpodder/gpodder.py:269 msgid "Do you really want to do this?" msgstr "" -#: src/gpodder/gpodder.py:246 +#: src/gpodder/gpodder.py:269 msgid "gPodder confirmation" msgstr "" -#: src/gpodder/gpodder.py:311 +#: src/gpodder/gpodder.py:334 msgid "" "There has been an error adding the channel.\n" "Maybe the URL is wrong?" msgstr "" -#: src/gpodder/gpodder.py:317 src/gpodder/gpodder.py:454 +#: src/gpodder/gpodder.py:340 src/gpodder/gpodder.py:476 msgid "Fetching channel index..." msgstr "" -#: src/gpodder/gpodder.py:330 +#: src/gpodder/gpodder.py:353 msgid "" "Could not add new channel.\n" "Only http:// and ftp:// URLs supported at the moment." msgstr "" -#: src/gpodder/gpodder.py:341 src/gpodder/gpodder.py:354 -#, python-format +#: src/gpodder/gpodder.py:362 src/gpodder/gpodder.py:373 msgid "" -"Cannot access iPod at %s.\n" -"Make sure your iPod is connected and mounted." +"Cannot access iPod.\n" +"Make sure your iPod is connected." msgstr "" -#: src/gpodder/gpodder.py:384 +#: src/gpodder/gpodder.py:403 msgid "" "Updating feed cache\n" "\n" @@ -117,18 +120,18 @@ msgid "" "updating the feed cache..." msgstr "" -#: src/gpodder/gpodder.py:408 +#: src/gpodder/gpodder.py:427 msgid "Do you really want to truncate the Podcasts playlist on your iPod?" msgstr "" -#: src/gpodder/gpodder.py:447 +#: src/gpodder/gpodder.py:469 msgid "" "Cannot edit this channel.\n" "\n" "No channel found." msgstr "" -#: src/gpodder/gpodder.py:476 +#: src/gpodder/gpodder.py:498 #, python-format msgid "" "Do you really want to remove this channel?\n" @@ -136,35 +139,35 @@ msgid "" " %s" msgstr "" -#: src/gpodder/gpodder.py:483 +#: src/gpodder/gpodder.py:505 msgid "" "Could not delete channel.\n" "Probably no channel is selected." msgstr "" -#: src/gpodder/gpodder.py:491 +#: src/gpodder/gpodder.py:513 msgid "Your channel list is empty. Nothing to export." msgstr "" -#: src/gpodder/gpodder.py:493 +#: src/gpodder/gpodder.py:515 msgid "Export to OPML" msgstr "" -#: src/gpodder/gpodder.py:522 +#: src/gpodder/gpodder.py:544 msgid "translator-credits" msgstr "" -#: src/gpodder/gpodder.py:562 +#: src/gpodder/gpodder.py:584 msgid "You have not selected an episode to download." msgstr "" -#: src/gpodder/gpodder.py:577 +#: src/gpodder/gpodder.py:599 msgid "" "You have already downloaded this episode\n" "or you are currently downloading it." msgstr "" -#: src/gpodder/gpodder.py:602 +#: src/gpodder/gpodder.py:624 #, python-format msgid "" "Do you really want to cancel this download?\n" @@ -172,11 +175,11 @@ msgid "" "%s" msgstr "" -#: src/gpodder/gpodder.py:605 src/gpodder/gpodder.py:642 +#: src/gpodder/gpodder.py:627 src/gpodder/gpodder.py:669 msgid "No episode selected." msgstr "" -#: src/gpodder/gpodder.py:668 +#: src/gpodder/gpodder.py:695 #, python-format msgid "" "Do you really want to remove this episode?\n" @@ -184,21 +187,21 @@ msgid "" "%s" msgstr "" -#: src/gpodder/gpodder.py:678 +#: src/gpodder/gpodder.py:705 msgid "Could not delete downloaded podcast." msgstr "" -#: src/gpodder/gpodder.py:718 src/gpodder/gpodder.py:719 +#: src/gpodder/gpodder.py:745 src/gpodder/gpodder.py:746 #: data/gpodder.glade.h:1 msgid "(unknown)" msgstr "" -#: src/gpodder/gpodder.py:946 +#: src/gpodder/gpodder.py:987 #, python-format msgid "%d of %d" msgstr "" -#: src/gpodder/gpodder.py:989 +#: src/gpodder/gpodder.py:1030 msgid "" "Please do not call gpodder.py directly. Instead, call the gpodder binary." msgstr "" @@ -215,16 +218,21 @@ msgstr "" msgid "gPodder channel list" msgstr "" -#: src/gpodder/libipodsync.py:94 +#: src/gpodder/libipodsync.py:112 msgid "Saving iPod database..." msgstr "" -#: src/gpodder/libipodsync.py:180 +#: src/gpodder/libipodsync.py:201 #, python-format msgid "Complete: %s" msgstr "" -#: src/gpodder/liblocdbwriter.py:49 +#: src/gpodder/libipodsync.py:224 +#, python-format +msgid "%s (to \"%s\")" +msgstr "" + +#: src/gpodder/liblocdbwriter.py:42 msgid "local download database, generated by gPodder" msgstr "" @@ -232,7 +240,7 @@ msgstr "" msgid "gPodder subscription list (exported)" msgstr "" -#: src/gpodder/libpodcasts.py:306 +#: src/gpodder/libpodcasts.py:304 msgid "No LocalDB found or error in existing LocalDB." msgstr "" @@ -241,11 +249,11 @@ msgstr "" msgid "unknown" msgstr "" -#: src/gpodder/libwget.py:291 +#: src/gpodder/libwget.py:292 msgid "Download has been cancelled." msgstr "" -#: src/gpodder/libwget.py:293 +#: src/gpodder/libwget.py:294 #, python-format msgid "Download error. Wget exit code was: %d" msgstr "" @@ -307,42 +315,46 @@ msgid "Download Status" msgstr "" #: data/gpodder.glade.h:16 -msgid "Download to:" +msgid "Download link:" msgstr "" #: data/gpodder.glade.h:17 -msgid "Downloaded Podcasts" +msgid "Download to:" msgstr "" #: data/gpodder.glade.h:18 -msgid "Downloads" +msgid "Downloaded Podcasts" msgstr "" #: data/gpodder.glade.h:19 -msgid "E_xport list..." +msgid "Downloads" msgstr "" #: data/gpodder.glade.h:20 -msgid "Episode Information" +msgid "E_xport list..." msgstr "" #: data/gpodder.glade.h:21 -msgid "FTP Proxy:" +msgid "Episode Information" msgstr "" #: data/gpodder.glade.h:22 -msgid "Feed URL:" +msgid "FTP Proxy:" msgstr "" #: data/gpodder.glade.h:23 -msgid "General" +msgid "Feed URL:" msgstr "" #: data/gpodder.glade.h:24 -msgid "HTTP Proxy:" +msgid "General" msgstr "" #: data/gpodder.glade.h:25 +msgid "HTTP Proxy:" +msgstr "" + +#: data/gpodder.glade.h:26 msgid "" "If you have to use a HTTP or FTP proxy server,\n" "you can use the usual format of the environment variables:\n" @@ -350,123 +362,131 @@ msgid "" "http://username:password@proxy_host:proxy_port/" msgstr "" -#: data/gpodder.glade.h:29 +#: data/gpodder.glade.h:30 msgid "Initializing..." msgstr "" -#: data/gpodder.glade.h:30 +#: data/gpodder.glade.h:31 msgid "No cover available." msgstr "" -#: data/gpodder.glade.h:31 +#: data/gpodder.glade.h:32 msgid "Play selected item" msgstr "" -#: data/gpodder.glade.h:32 +#: data/gpodder.glade.h:33 msgid "Player application:" msgstr "" -#: data/gpodder.glade.h:33 +#: data/gpodder.glade.h:34 msgid "Proxy" msgstr "" -#: data/gpodder.glade.h:34 -msgid "Save downloads in:" -msgstr "" - #: data/gpodder.glade.h:35 -msgid "Show \"gPodder downloads\" link" +msgid "Publication date:" msgstr "" #: data/gpodder.glade.h:36 -msgid "Skip this channel when syncing to the iPod" +msgid "Save downloads in:" msgstr "" #: data/gpodder.glade.h:37 -msgid "Sync to Playlist:" +msgid "Show \"gPodder downloads\" link" msgstr "" #: data/gpodder.glade.h:38 -msgid "Sync to Podcasts playlist" +msgid "Skip this channel when syncing to the iPod" msgstr "" #: data/gpodder.glade.h:39 -msgid "Synchronization" +msgid "Sync to Playlist:" msgstr "" #: data/gpodder.glade.h:40 -msgid "Title:" +msgid "Sync to Podcasts playlist" msgstr "" #: data/gpodder.glade.h:41 -msgid "Use environment variables" +msgid "Synchronization" msgstr "" #: data/gpodder.glade.h:42 -msgid "_About gPodder..." +msgid "Title:" msgstr "" #: data/gpodder.glade.h:43 -msgid "_Add channel..." +msgid "Use environment variables" msgstr "" #: data/gpodder.glade.h:44 -msgid "_Channels" +msgid "Website link:" msgstr "" #: data/gpodder.glade.h:45 -msgid "_Check for Updates" +msgid "_About gPodder..." msgstr "" #: data/gpodder.glade.h:46 -msgid "_Cleanup iPod podcasts" +msgid "_Add channel..." msgstr "" #: data/gpodder.glade.h:47 -msgid "_Close" +msgid "_Channels" msgstr "" #: data/gpodder.glade.h:48 -msgid "_Edit channel..." +msgid "_Check for Updates" msgstr "" #: data/gpodder.glade.h:49 -msgid "_Help" +msgid "_Cleanup iPod podcasts" msgstr "" #: data/gpodder.glade.h:50 -msgid "_Podcasts" +msgid "_Close" msgstr "" #: data/gpodder.glade.h:51 -msgid "_Preferences..." +msgid "_Edit channel..." msgstr "" #: data/gpodder.glade.h:52 -msgid "_Remove channel" +msgid "_Help" msgstr "" #: data/gpodder.glade.h:53 -msgid "_Sync to iPod" +msgid "_Podcasts" msgstr "" #: data/gpodder.glade.h:54 -msgid "gPodder - your podcast catcher." +msgid "_Preferences..." msgstr "" #: data/gpodder.glade.h:55 -msgid "gPodder Channel Editor" +msgid "_Remove channel" msgstr "" #: data/gpodder.glade.h:56 -msgid "gPodder properties" +msgid "_Sync to iPod" msgstr "" #: data/gpodder.glade.h:57 -msgid "iPod" +msgid "gPodder - your podcast catcher." msgstr "" #: data/gpodder.glade.h:58 +msgid "gPodder Channel Editor" +msgstr "" + +#: data/gpodder.glade.h:59 +msgid "gPodder properties" +msgstr "" + +#: data/gpodder.glade.h:60 +msgid "iPod" +msgstr "" + +#: data/gpodder.glade.h:61 msgid "iPod mountpoint:" msgstr "" diff --git a/data/po/de.po b/data/po/de.po index 25ecda58..7d52c7c0 100644 --- a/data/po/de.po +++ b/data/po/de.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: gPodder 0.7-svn\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2006-04-08 10:32+0200\n" -"PO-Revision-Date: 2006-04-08 10:35+0100\n" +"POT-Creation-Date: 2006-04-09 18:14+0200\n" +"PO-Revision-Date: 2006-04-09 18:15+0100\n" "Last-Translator: Thomas Perl \n" "Language-Team: gPodder Team \n" "MIME-Version: 1.0\n" @@ -26,37 +26,37 @@ msgstr "Channel entfernen: %s" msgid "%s is not a valid id" msgstr "%s is keine gültige ID" -#: src/gpodder/gpodder.py:70 +#: src/gpodder/gpodder.py:71 msgid "Contributors / patch writers:" msgstr "Helfer und Patchschreiber:" -#: src/gpodder/gpodder.py:74 +#: src/gpodder/gpodder.py:75 msgid "See the AUTHORS file for all contributors" msgstr "Eine Liste aller Helfer finden Sie in der AUTHORS-Datei" -#: src/gpodder/gpodder.py:131 -#: src/gpodder/gpodder.py:146 -#: src/gpodder/gpodder.py:152 +#: src/gpodder/gpodder.py:135 +#: src/gpodder/gpodder.py:150 +#: src/gpodder/gpodder.py:156 msgid "Episode" msgstr "Episode" -#: src/gpodder/gpodder.py:136 +#: src/gpodder/gpodder.py:140 msgid "Size" msgstr "Größe" -#: src/gpodder/gpodder.py:155 +#: src/gpodder/gpodder.py:159 msgid "Speed" msgstr "Geschwindigkeit" -#: src/gpodder/gpodder.py:158 +#: src/gpodder/gpodder.py:162 msgid "Progress" msgstr "Fortschritt" -#: src/gpodder/gpodder.py:182 +#: src/gpodder/gpodder.py:186 msgid "Channel Info" msgstr "Channel-Informationen" -#: src/gpodder/gpodder.py:199 +#: src/gpodder/gpodder.py:205 #, python-format msgid "" "gPodder development version %s\n" @@ -65,11 +65,15 @@ msgstr "" "gPodder Entwicklungs-Version %s\n" "Benutzung auf eigene Gefahr. Viel Spaß mit neuen Features :)" -#: src/gpodder/gpodder.py:226 +#: src/gpodder/gpodder.py:220 +msgid "iPod connected. Do you want to sync now?" +msgstr "iPod verbunden. Jetzt synchronisieren?" + +#: src/gpodder/gpodder.py:249 msgid "No downloaded podcasts found." msgstr "Keine heruntergeladenen Podcasts gefunden." -#: src/gpodder/gpodder.py:236 +#: src/gpodder/gpodder.py:259 msgid "" "No channels found\n" "\n" @@ -79,19 +83,19 @@ msgstr "" "\n" "Klicken Sie auf Channels > Abbonieren..., um einen neuen Channel zu abbonieren." -#: src/gpodder/gpodder.py:238 +#: src/gpodder/gpodder.py:261 msgid "gPodder message" msgstr "gPodder Nachricht" -#: src/gpodder/gpodder.py:246 +#: src/gpodder/gpodder.py:269 msgid "Do you really want to do this?" msgstr "Willst du das wirklich machen?" -#: src/gpodder/gpodder.py:246 +#: src/gpodder/gpodder.py:269 msgid "gPodder confirmation" msgstr "gPodder Bestätigung" -#: src/gpodder/gpodder.py:311 +#: src/gpodder/gpodder.py:334 msgid "" "There has been an error adding the channel.\n" "Maybe the URL is wrong?" @@ -99,12 +103,12 @@ msgstr "" "Ein Fehler trat beim Hinzufügen des Channels auf.\n" "Vielleicht ist die URL falsch?" -#: src/gpodder/gpodder.py:317 -#: src/gpodder/gpodder.py:454 +#: src/gpodder/gpodder.py:340 +#: src/gpodder/gpodder.py:476 msgid "Fetching channel index..." msgstr "Channel-Index wird heruntergeladen..." -#: src/gpodder/gpodder.py:330 +#: src/gpodder/gpodder.py:353 msgid "" "Could not add new channel.\n" "Only http:// and ftp:// URLs supported at the moment." @@ -112,17 +116,16 @@ msgstr "" "Konnte neuen Channel nicht abbonieren.\n" "Derzeit werden nur http:// und ftp://-URLs unterstützt." -#: src/gpodder/gpodder.py:341 -#: src/gpodder/gpodder.py:354 -#, python-format +#: src/gpodder/gpodder.py:362 +#: src/gpodder/gpodder.py:373 msgid "" -"Cannot access iPod at %s.\n" -"Make sure your iPod is connected and mounted." +"Cannot access iPod.\n" +"Make sure your iPod is connected." msgstr "" -"Kann auf den iPod in %s nicht zugreifen.\n" -"Bitte sicherstellen, dass der iPod angesteckt und eingebunden ist." +"Kann auf den iPod nicht zugreifen.\n" +"Bitte sicherstellen, dass der iPod angesteckt ist." -#: src/gpodder/gpodder.py:384 +#: src/gpodder/gpodder.py:403 msgid "" "Updating feed cache\n" "\n" @@ -134,11 +137,11 @@ msgstr "" "Bitte warten Sie, während gPodder Ihre\n" "Channel-Abonnements aktualisiert..." -#: src/gpodder/gpodder.py:408 +#: src/gpodder/gpodder.py:427 msgid "Do you really want to truncate the Podcasts playlist on your iPod?" msgstr "Wollen Sie wirklich die Podcasts-Liste auf dem iPod leeren?" -#: src/gpodder/gpodder.py:447 +#: src/gpodder/gpodder.py:469 msgid "" "Cannot edit this channel.\n" "\n" @@ -148,7 +151,7 @@ msgstr "" "\n" "Kein Channel gefunden." -#: src/gpodder/gpodder.py:476 +#: src/gpodder/gpodder.py:498 #, python-format msgid "" "Do you really want to remove this channel?\n" @@ -159,7 +162,7 @@ msgstr "" "\n" "%s" -#: src/gpodder/gpodder.py:483 +#: src/gpodder/gpodder.py:505 msgid "" "Could not delete channel.\n" "Probably no channel is selected." @@ -167,23 +170,23 @@ msgstr "" "Konnte Channel nicht entfernen.\n" "Wahrscheinlich ist keiner ausgewählt." -#: src/gpodder/gpodder.py:491 +#: src/gpodder/gpodder.py:513 msgid "Your channel list is empty. Nothing to export." msgstr "Nichts zu exportieren: Sie haben keine Abonnements." -#: src/gpodder/gpodder.py:493 +#: src/gpodder/gpodder.py:515 msgid "Export to OPML" msgstr "Als OPML-Datei exportieren" -#: src/gpodder/gpodder.py:522 +#: src/gpodder/gpodder.py:544 msgid "translator-credits" msgstr "Thomas Perl " -#: src/gpodder/gpodder.py:562 +#: src/gpodder/gpodder.py:584 msgid "You have not selected an episode to download." msgstr "Sie haben keine Episode für den Download ausgewählt." -#: src/gpodder/gpodder.py:577 +#: src/gpodder/gpodder.py:599 msgid "" "You have already downloaded this episode\n" "or you are currently downloading it." @@ -191,7 +194,7 @@ msgstr "" "Sie haben diese Episode bereits heruntergeladen\n" "oder Sie laden sie jetzt gerade herunter." -#: src/gpodder/gpodder.py:602 +#: src/gpodder/gpodder.py:624 #, python-format msgid "" "Do you really want to cancel this download?\n" @@ -202,12 +205,12 @@ msgstr "" "\n" "%s" -#: src/gpodder/gpodder.py:605 -#: src/gpodder/gpodder.py:642 +#: src/gpodder/gpodder.py:627 +#: src/gpodder/gpodder.py:669 msgid "No episode selected." msgstr "Keine Episode ausgewählt." -#: src/gpodder/gpodder.py:668 +#: src/gpodder/gpodder.py:695 #, python-format msgid "" "Do you really want to remove this episode?\n" @@ -218,22 +221,22 @@ msgstr "" "\n" "%s" -#: src/gpodder/gpodder.py:678 +#: src/gpodder/gpodder.py:705 msgid "Could not delete downloaded podcast." msgstr "Konnte den ausgewählten Podcast nicht entfernen." -#: src/gpodder/gpodder.py:718 -#: src/gpodder/gpodder.py:719 +#: src/gpodder/gpodder.py:745 +#: src/gpodder/gpodder.py:746 #: data/gpodder.glade.h:1 msgid "(unknown)" msgstr "(unbekannt)" -#: src/gpodder/gpodder.py:946 +#: src/gpodder/gpodder.py:987 #, python-format msgid "%d of %d" msgstr "%d von %d" -#: src/gpodder/gpodder.py:989 +#: src/gpodder/gpodder.py:1030 msgid "Please do not call gpodder.py directly. Instead, call the gpodder binary." msgstr "Bitte starten Sie gPodder nie direkt über gpodder.py. Rufen Sie stattdessen das \"gpodder\" Programm auf." @@ -249,16 +252,21 @@ msgstr "Bild wird heruntergeladen..." msgid "gPodder channel list" msgstr "gPodder Channel-Editor" -#: src/gpodder/libipodsync.py:94 +#: src/gpodder/libipodsync.py:112 msgid "Saving iPod database..." msgstr "Speichere iPod-Datenbank..." -#: src/gpodder/libipodsync.py:180 +#: src/gpodder/libipodsync.py:201 #, python-format msgid "Complete: %s" msgstr "Fertig: %s" -#: src/gpodder/liblocdbwriter.py:49 +#: src/gpodder/libipodsync.py:224 +#, python-format +msgid "%s (to \"%s\")" +msgstr "%s (nach \"%s\")" + +#: src/gpodder/liblocdbwriter.py:42 msgid "local download database, generated by gPodder" msgstr "lokale Download-Datenbank, generiert von gPodder" @@ -266,7 +274,7 @@ msgstr "lokale Download-Datenbank, generiert von gPodder" msgid "gPodder subscription list (exported)" msgstr "gPodder Abonnement-Liste (exportiert)" -#: src/gpodder/libpodcasts.py:306 +#: src/gpodder/libpodcasts.py:304 msgid "No LocalDB found or error in existing LocalDB." msgstr "Keine Lokale Datenbank gefunden (oder Fehler in existierender Datenbank)." @@ -276,11 +284,11 @@ msgstr "Keine Lokale Datenbank gefunden (oder Fehler in existierender Datenbank) msgid "unknown" msgstr "unbekannt" -#: src/gpodder/libwget.py:291 +#: src/gpodder/libwget.py:292 msgid "Download has been cancelled." msgstr "Der Download wurde abgebrochen." -#: src/gpodder/libwget.py:293 +#: src/gpodder/libwget.py:294 #, python-format msgid "Download error. Wget exit code was: %d" msgstr "Fehler beim Download. Wget's Exit-Status ist: %d" @@ -342,42 +350,46 @@ msgid "Download Status" msgstr "Download-Status" #: data/gpodder.glade.h:16 +msgid "Download link:" +msgstr "Download-Link:" + +#: data/gpodder.glade.h:17 msgid "Download to:" msgstr "Herunterladen nach:" -#: data/gpodder.glade.h:17 +#: data/gpodder.glade.h:18 msgid "Downloaded Podcasts" msgstr "Heruntergeladene Podcasts" -#: data/gpodder.glade.h:18 +#: data/gpodder.glade.h:19 msgid "Downloads" msgstr "Downloads" -#: data/gpodder.glade.h:19 +#: data/gpodder.glade.h:20 msgid "E_xport list..." msgstr "Liste e_xportieren..." -#: data/gpodder.glade.h:20 +#: data/gpodder.glade.h:21 msgid "Episode Information" msgstr "Informationen zur Episode" -#: data/gpodder.glade.h:21 +#: data/gpodder.glade.h:22 msgid "FTP Proxy:" msgstr "FTP-Proxy:" -#: data/gpodder.glade.h:22 +#: data/gpodder.glade.h:23 msgid "Feed URL:" msgstr "Feed-Adresse:" -#: data/gpodder.glade.h:23 +#: data/gpodder.glade.h:24 msgid "General" msgstr "Allgemeines" -#: data/gpodder.glade.h:24 +#: data/gpodder.glade.h:25 msgid "HTTP Proxy:" msgstr "HTTP-Proxy:" -#: data/gpodder.glade.h:25 +#: data/gpodder.glade.h:26 msgid "" "If you have to use a HTTP or FTP proxy server,\n" "you can use the usual format of the environment variables:\n" @@ -389,123 +401,131 @@ msgstr "" "\n" "http://benutzer:passwort@proxy_host:proxy_port/" -#: data/gpodder.glade.h:29 +#: data/gpodder.glade.h:30 msgid "Initializing..." msgstr "Initialisiere..." -#: data/gpodder.glade.h:30 +#: data/gpodder.glade.h:31 msgid "No cover available." msgstr "Kein Cover verfügbar." -#: data/gpodder.glade.h:31 +#: data/gpodder.glade.h:32 msgid "Play selected item" msgstr "Ausgewähltes Element abspielen" -#: data/gpodder.glade.h:32 +#: data/gpodder.glade.h:33 msgid "Player application:" msgstr "Abspielprogramm:" -#: data/gpodder.glade.h:33 +#: data/gpodder.glade.h:34 msgid "Proxy" msgstr "Proxy" -#: data/gpodder.glade.h:34 +#: data/gpodder.glade.h:35 +msgid "Publication date:" +msgstr "Veröffentlichungsdatum:" + +#: data/gpodder.glade.h:36 msgid "Save downloads in:" msgstr "Downloads speichern in:" -#: data/gpodder.glade.h:35 +#: data/gpodder.glade.h:37 msgid "Show \"gPodder downloads\" link" msgstr "\"gPodder Downloads\"-Verknüpfung anzeigen" -#: data/gpodder.glade.h:36 +#: data/gpodder.glade.h:38 msgid "Skip this channel when syncing to the iPod" msgstr "Diesen Channel beim Synchronisieren überspringen" -#: data/gpodder.glade.h:37 +#: data/gpodder.glade.h:39 msgid "Sync to Playlist:" msgstr "Synchronisiere mit Wiedergabeliste:" -#: data/gpodder.glade.h:38 +#: data/gpodder.glade.h:40 msgid "Sync to Podcasts playlist" msgstr "Synchronisiere mit der Podcasts-Liste" -#: data/gpodder.glade.h:39 +#: data/gpodder.glade.h:41 msgid "Synchronization" msgstr "Synchronisierung" -#: data/gpodder.glade.h:40 +#: data/gpodder.glade.h:42 msgid "Title:" msgstr "Titel:" -#: data/gpodder.glade.h:41 +#: data/gpodder.glade.h:43 msgid "Use environment variables" msgstr "Benutze Umgebungsvariablen" -#: data/gpodder.glade.h:42 +#: data/gpodder.glade.h:44 +msgid "Website link:" +msgstr "Webseiten-Adresse:" + +#: data/gpodder.glade.h:45 msgid "_About gPodder..." msgstr "Üb_er gPodder..." -#: data/gpodder.glade.h:43 +#: data/gpodder.glade.h:46 msgid "_Add channel..." msgstr "Ch_annel abbonieren..." -#: data/gpodder.glade.h:44 +#: data/gpodder.glade.h:47 msgid "_Channels" msgstr "_Channels" -#: data/gpodder.glade.h:45 +#: data/gpodder.glade.h:48 msgid "_Check for Updates" msgstr "Na_ch Aktualisierungen suchen" -#: data/gpodder.glade.h:46 +#: data/gpodder.glade.h:49 msgid "_Cleanup iPod podcasts" msgstr "iP_od-Podcasts löschen" -#: data/gpodder.glade.h:47 +#: data/gpodder.glade.h:50 msgid "_Close" msgstr "S_chließen" -#: data/gpodder.glade.h:48 +#: data/gpodder.glade.h:51 msgid "_Edit channel..." msgstr "_Editiere Channel..." -#: data/gpodder.glade.h:49 +#: data/gpodder.glade.h:52 msgid "_Help" msgstr "_Hilfe" -#: data/gpodder.glade.h:50 +#: data/gpodder.glade.h:53 msgid "_Podcasts" msgstr "_Podcasts" -#: data/gpodder.glade.h:51 +#: data/gpodder.glade.h:54 msgid "_Preferences..." msgstr "Ein_s_tellungen..." -#: data/gpodder.glade.h:52 +#: data/gpodder.glade.h:55 msgid "_Remove channel" msgstr "Entfe_rne Channel" -#: data/gpodder.glade.h:53 +#: data/gpodder.glade.h:56 msgid "_Sync to iPod" msgstr "iPod _synchronisieren" -#: data/gpodder.glade.h:54 +#: data/gpodder.glade.h:57 msgid "gPodder - your podcast catcher." msgstr "gPodder - dein podcast catcher." -#: data/gpodder.glade.h:55 +#: data/gpodder.glade.h:58 msgid "gPodder Channel Editor" msgstr "gPodder Channel-Editor" -#: data/gpodder.glade.h:56 +#: data/gpodder.glade.h:59 msgid "gPodder properties" msgstr "gPodder Einstellungen" -#: data/gpodder.glade.h:57 +#: data/gpodder.glade.h:60 msgid "iPod" msgstr "iPod" -#: data/gpodder.glade.h:58 +#: data/gpodder.glade.h:61 msgid "iPod mountpoint:" msgstr "iPod Einhängepunkt:" diff --git a/data/po/fr.po b/data/po/fr.po index 995d03aa..c6a976a4 100644 --- a/data/po/fr.po +++ b/data/po/fr.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: gPodder 0.7-svn\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2006-04-08 10:32+0200\n" +"POT-Creation-Date: 2006-04-09 18:14+0200\n" "PO-Revision-Date: 2006-04-08 00:36+0100\n" "Last-Translator: Alain TAUCH \n" "Language-Team: LANGUAGE \n" @@ -27,36 +27,36 @@ msgstr "supprimer le flux: %s" msgid "%s is not a valid id" msgstr "%s n'est pas un ID valide" -#: src/gpodder/gpodder.py:70 +#: src/gpodder/gpodder.py:71 msgid "Contributors / patch writers:" msgstr "Contributeurs:" -#: src/gpodder/gpodder.py:74 +#: src/gpodder/gpodder.py:75 msgid "See the AUTHORS file for all contributors" msgstr "Voir le fichier AUTHORS pour la liste complète des contributeurs." -#: src/gpodder/gpodder.py:131 src/gpodder/gpodder.py:146 -#: src/gpodder/gpodder.py:152 +#: src/gpodder/gpodder.py:135 src/gpodder/gpodder.py:150 +#: src/gpodder/gpodder.py:156 msgid "Episode" msgstr "Émission" -#: src/gpodder/gpodder.py:136 +#: src/gpodder/gpodder.py:140 msgid "Size" msgstr "Taille" -#: src/gpodder/gpodder.py:155 +#: src/gpodder/gpodder.py:159 msgid "Speed" msgstr "Vitesse" -#: src/gpodder/gpodder.py:158 +#: src/gpodder/gpodder.py:162 msgid "Progress" msgstr "Progression" -#: src/gpodder/gpodder.py:182 +#: src/gpodder/gpodder.py:186 msgid "Channel Info" msgstr "Informations sur le flux RSS" -#: src/gpodder/gpodder.py:199 +#: src/gpodder/gpodder.py:205 #, python-format msgid "" "gPodder development version %s\n" @@ -65,11 +65,15 @@ msgstr "" "Ceci est la version de développement %s de gPodder\n" "Cette version est instable mais comprend de nouvelles fonctionnalités :)" -#: src/gpodder/gpodder.py:226 +#: src/gpodder/gpodder.py:220 +msgid "iPod connected. Do you want to sync now?" +msgstr "" + +#: src/gpodder/gpodder.py:249 msgid "No downloaded podcasts found." msgstr "Aucun podcast n'a été encore téléchargé." -#: src/gpodder/gpodder.py:236 +#: src/gpodder/gpodder.py:259 msgid "" "No channels found\n" "\n" @@ -81,19 +85,19 @@ msgstr "" "Cliquer sur Flux > Ajouter un flux RSS.. pour " "ajouter un nouveau flux RSS." -#: src/gpodder/gpodder.py:238 +#: src/gpodder/gpodder.py:261 msgid "gPodder message" msgstr "Message gPodder" -#: src/gpodder/gpodder.py:246 +#: src/gpodder/gpodder.py:269 msgid "Do you really want to do this?" msgstr "Voulez vous continuer ?" -#: src/gpodder/gpodder.py:246 +#: src/gpodder/gpodder.py:269 msgid "gPodder confirmation" msgstr "Demande de confirmation gpodder" -#: src/gpodder/gpodder.py:311 +#: src/gpodder/gpodder.py:334 msgid "" "There has been an error adding the channel.\n" "Maybe the URL is wrong?" @@ -101,11 +105,11 @@ msgstr "" "L'ajout du flux a echoué.\n" "L'URL est sans doute erronée?" -#: src/gpodder/gpodder.py:317 src/gpodder/gpodder.py:454 +#: src/gpodder/gpodder.py:340 src/gpodder/gpodder.py:476 msgid "Fetching channel index..." msgstr "Récupération de l'index du flux RSS" -#: src/gpodder/gpodder.py:330 +#: src/gpodder/gpodder.py:353 msgid "" "Could not add new channel.\n" "Only http:// and ftp:// URLs supported at the moment." @@ -114,16 +118,16 @@ msgstr "" "Seules les URL http:// et ftp:// sont supportées pour le " "moment." -#: src/gpodder/gpodder.py:341 src/gpodder/gpodder.py:354 -#, python-format +#: src/gpodder/gpodder.py:362 src/gpodder/gpodder.py:373 +#, fuzzy msgid "" -"Cannot access iPod at %s.\n" -"Make sure your iPod is connected and mounted." +"Cannot access iPod.\n" +"Make sure your iPod is connected." msgstr "" "Impossible d'accéder à l'iPod a partir de %s.\n" " Vérifiez que l'iPod est bien connecté et monté." -#: src/gpodder/gpodder.py:384 +#: src/gpodder/gpodder.py:403 msgid "" "Updating feed cache\n" "\n" @@ -135,7 +139,7 @@ msgstr "" "Merci de patienter pendant que gpodder met\n" "à jour le cache des flux RSS..." -#: src/gpodder/gpodder.py:408 +#: src/gpodder/gpodder.py:427 #, fuzzy msgid "Do you really want to truncate the Podcasts playlist on your iPod?" msgstr "" @@ -143,7 +147,7 @@ msgstr "" "\n" "%s" -#: src/gpodder/gpodder.py:447 +#: src/gpodder/gpodder.py:469 msgid "" "Cannot edit this channel.\n" "\n" @@ -153,7 +157,7 @@ msgstr "" "\n" "Flux RSS introuvable." -#: src/gpodder/gpodder.py:476 +#: src/gpodder/gpodder.py:498 #, python-format msgid "" "Do you really want to remove this channel?\n" @@ -164,7 +168,7 @@ msgstr "" "\n" "%s" -#: src/gpodder/gpodder.py:483 +#: src/gpodder/gpodder.py:505 msgid "" "Could not delete channel.\n" "Probably no channel is selected." @@ -172,23 +176,23 @@ msgstr "" "Impossible de supprimer ce flux.\n" "Il n'y a sans doute pas de flux selectionné." -#: src/gpodder/gpodder.py:491 +#: src/gpodder/gpodder.py:513 msgid "Your channel list is empty. Nothing to export." msgstr "Votre liste de flux est vide. Il n'y a rien à exporter." -#: src/gpodder/gpodder.py:493 +#: src/gpodder/gpodder.py:515 msgid "Export to OPML" msgstr "Exporter au format OPML" -#: src/gpodder/gpodder.py:522 +#: src/gpodder/gpodder.py:544 msgid "translator-credits" msgstr "Alain Tauch " -#: src/gpodder/gpodder.py:562 +#: src/gpodder/gpodder.py:584 msgid "You have not selected an episode to download." msgstr "Vous n'avez pas selectionné d'émission à télécharger." -#: src/gpodder/gpodder.py:577 +#: src/gpodder/gpodder.py:599 msgid "" "You have already downloaded this episode\n" "or you are currently downloading it." @@ -196,7 +200,7 @@ msgstr "" "Vous avez déjà téléchargé cette émission\n" "ou elle est en cours de téléchargement." -#: src/gpodder/gpodder.py:602 +#: src/gpodder/gpodder.py:624 #, python-format msgid "" "Do you really want to cancel this download?\n" @@ -207,11 +211,11 @@ msgstr "" "\n" "%s" -#: src/gpodder/gpodder.py:605 src/gpodder/gpodder.py:642 +#: src/gpodder/gpodder.py:627 src/gpodder/gpodder.py:669 msgid "No episode selected." msgstr "Aucune émission sélectionnée." -#: src/gpodder/gpodder.py:668 +#: src/gpodder/gpodder.py:695 #, python-format msgid "" "Do you really want to remove this episode?\n" @@ -222,21 +226,21 @@ msgstr "" "\n" "%s" -#: src/gpodder/gpodder.py:678 +#: src/gpodder/gpodder.py:705 msgid "Could not delete downloaded podcast." msgstr "La suppression du podcast a échoué" -#: src/gpodder/gpodder.py:718 src/gpodder/gpodder.py:719 +#: src/gpodder/gpodder.py:745 src/gpodder/gpodder.py:746 #: data/gpodder.glade.h:1 msgid "(unknown)" msgstr "(inconnu(e))" -#: src/gpodder/gpodder.py:946 +#: src/gpodder/gpodder.py:987 #, python-format msgid "%d of %d" msgstr "%d sur %d" -#: src/gpodder/gpodder.py:989 +#: src/gpodder/gpodder.py:1030 msgid "" "Please do not call gpodder.py directly. Instead, call the gpodder binary." msgstr "" @@ -255,16 +259,21 @@ msgstr "T msgid "gPodder channel list" msgstr "Liste des flux RSS gPodder" -#: src/gpodder/libipodsync.py:94 +#: src/gpodder/libipodsync.py:112 msgid "Saving iPod database..." msgstr "Sauvegarde la base de données de l'iPod..." -#: src/gpodder/libipodsync.py:180 +#: src/gpodder/libipodsync.py:201 #, python-format msgid "Complete: %s" msgstr "Progression: %s" -#: src/gpodder/liblocdbwriter.py:49 +#: src/gpodder/libipodsync.py:224 +#, python-format +msgid "%s (to \"%s\")" +msgstr "" + +#: src/gpodder/liblocdbwriter.py:42 msgid "local download database, generated by gPodder" msgstr "Base de donnée locale, générée par gPodder" @@ -272,7 +281,7 @@ msgstr "Base de donn msgid "gPodder subscription list (exported)" msgstr "Liste des flux RSS de gPodder (export)" -#: src/gpodder/libpodcasts.py:306 +#: src/gpodder/libpodcasts.py:304 msgid "No LocalDB found or error in existing LocalDB." msgstr "Base de donnée introuvable ou corrompue" @@ -281,11 +290,11 @@ msgstr "Base de donn msgid "unknown" msgstr "inconnu(e)" -#: src/gpodder/libwget.py:291 +#: src/gpodder/libwget.py:292 msgid "Download has been cancelled." msgstr "Le téléchargement a été annulé." -#: src/gpodder/libwget.py:293 +#: src/gpodder/libwget.py:294 #, python-format msgid "Download error. Wget exit code was: %d" msgstr "Erreur de téléchargement. Code de retour de wget: %d" @@ -347,42 +356,47 @@ msgid "Download Status" msgstr "Téléchargements en cours" #: data/gpodder.glade.h:16 -msgid "Download to:" +#, fuzzy +msgid "Download link:" msgstr "Enregistrer dans:" #: data/gpodder.glade.h:17 +msgid "Download to:" +msgstr "Enregistrer dans:" + +#: data/gpodder.glade.h:18 msgid "Downloaded Podcasts" msgstr "Podcasts téléchargés" -#: data/gpodder.glade.h:18 +#: data/gpodder.glade.h:19 msgid "Downloads" msgstr "Téléchargements" -#: data/gpodder.glade.h:19 +#: data/gpodder.glade.h:20 msgid "E_xport list..." msgstr "E_xporter la liste..." -#: data/gpodder.glade.h:20 +#: data/gpodder.glade.h:21 msgid "Episode Information" msgstr "Informations sur l'épisode" -#: data/gpodder.glade.h:21 +#: data/gpodder.glade.h:22 msgid "FTP Proxy:" msgstr "Proxy FTP:" -#: data/gpodder.glade.h:22 +#: data/gpodder.glade.h:23 msgid "Feed URL:" msgstr "flux RSS:" -#: data/gpodder.glade.h:23 +#: data/gpodder.glade.h:24 msgid "General" msgstr "Général" -#: data/gpodder.glade.h:24 +#: data/gpodder.glade.h:25 msgid "HTTP Proxy:" msgstr "Proxy HTTP:" -#: data/gpodder.glade.h:25 +#: data/gpodder.glade.h:26 msgid "" "If you have to use a HTTP or FTP proxy server,\n" "you can use the usual format of the environment variables:\n" @@ -394,126 +408,134 @@ msgstr "" "\n" "http://utilisateur:motdepasse@proxy:port" -#: data/gpodder.glade.h:29 +#: data/gpodder.glade.h:30 msgid "Initializing..." msgstr "Initialisation..." -#: data/gpodder.glade.h:30 +#: data/gpodder.glade.h:31 msgid "No cover available." msgstr "Logo indisponible." -#: data/gpodder.glade.h:31 +#: data/gpodder.glade.h:32 msgid "Play selected item" msgstr "Lire la sélection" -#: data/gpodder.glade.h:32 +#: data/gpodder.glade.h:33 msgid "Player application:" msgstr "Application pour la lecture des podcasts:" -#: data/gpodder.glade.h:33 +#: data/gpodder.glade.h:34 msgid "Proxy" msgstr "Proxy" -#: data/gpodder.glade.h:34 +#: data/gpodder.glade.h:35 +msgid "Publication date:" +msgstr "" + +#: data/gpodder.glade.h:36 msgid "Save downloads in:" msgstr "Enregistrer les téléchargements dans:" -#: data/gpodder.glade.h:35 +#: data/gpodder.glade.h:37 msgid "Show \"gPodder downloads\" link" msgstr "Afficher le lien \"Téléchargements gPodder\"" -#: data/gpodder.glade.h:36 +#: data/gpodder.glade.h:38 msgid "Skip this channel when syncing to the iPod" msgstr "" -#: data/gpodder.glade.h:37 +#: data/gpodder.glade.h:39 #, fuzzy msgid "Sync to Playlist:" msgstr "_Synchroniser l'iPod" -#: data/gpodder.glade.h:38 +#: data/gpodder.glade.h:40 msgid "Sync to Podcasts playlist" msgstr "" -#: data/gpodder.glade.h:39 +#: data/gpodder.glade.h:41 msgid "Synchronization" msgstr "Synchronisation" -#: data/gpodder.glade.h:40 +#: data/gpodder.glade.h:42 msgid "Title:" msgstr "Titre:" -#: data/gpodder.glade.h:41 +#: data/gpodder.glade.h:43 msgid "Use environment variables" msgstr "Utiliser les variables d'environnement" -#: data/gpodder.glade.h:42 +#: data/gpodder.glade.h:44 +msgid "Website link:" +msgstr "" + +#: data/gpodder.glade.h:45 msgid "_About gPodder..." msgstr "_A propos de gPodder..." -#: data/gpodder.glade.h:43 +#: data/gpodder.glade.h:46 msgid "_Add channel..." msgstr "_Ajouter un flux RSS..." -#: data/gpodder.glade.h:44 +#: data/gpodder.glade.h:47 msgid "_Channels" msgstr "_Flux" -#: data/gpodder.glade.h:45 +#: data/gpodder.glade.h:48 msgid "_Check for Updates" msgstr "_Mises à jour" -#: data/gpodder.glade.h:46 +#: data/gpodder.glade.h:49 #, fuzzy msgid "_Cleanup iPod podcasts" msgstr "Nettoyage de l'iPod" -#: data/gpodder.glade.h:47 +#: data/gpodder.glade.h:50 msgid "_Close" msgstr "_Quitter" -#: data/gpodder.glade.h:48 +#: data/gpodder.glade.h:51 msgid "_Edit channel..." msgstr "_Modifier le flux RSS" -#: data/gpodder.glade.h:49 +#: data/gpodder.glade.h:52 msgid "_Help" msgstr "_Aide" -#: data/gpodder.glade.h:50 +#: data/gpodder.glade.h:53 msgid "_Podcasts" msgstr "_Podcasts" -#: data/gpodder.glade.h:51 +#: data/gpodder.glade.h:54 msgid "_Preferences..." msgstr "_Préférences" -#: data/gpodder.glade.h:52 +#: data/gpodder.glade.h:55 msgid "_Remove channel" msgstr "_Supprimer le flux RSS" -#: data/gpodder.glade.h:53 +#: data/gpodder.glade.h:56 msgid "_Sync to iPod" msgstr "_Synchroniser l'iPod" -#: data/gpodder.glade.h:54 +#: data/gpodder.glade.h:57 msgid "gPodder - your podcast catcher." msgstr "gPodder - your podcast catcher." -#: data/gpodder.glade.h:55 +#: data/gpodder.glade.h:58 msgid "gPodder Channel Editor" msgstr "Editeur de flux RSS" -#: data/gpodder.glade.h:56 +#: data/gpodder.glade.h:59 msgid "gPodder properties" msgstr "Préférences gPodder" -#: data/gpodder.glade.h:57 +#: data/gpodder.glade.h:60 #, fuzzy msgid "iPod" msgstr "iPod:" -#: data/gpodder.glade.h:58 +#: data/gpodder.glade.h:61 msgid "iPod mountpoint:" msgstr "Point de montage de l'iPod:" diff --git a/doc/man/gpodder.1 b/doc/man/gpodder.1 index e2a4b5d3..fa9707f3 100644 --- a/doc/man/gpodder.1 +++ b/doc/man/gpodder.1 @@ -1,7 +1,7 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.36. -.TH GPODDER "1" "April 2006" "gpodder 0.7+svn20060408 2006-04-08" "User Commands" +.TH GPODDER "1" "April 2006" "gpodder 0.7+svn20060408 2006-04-09" "User Commands" .SH NAME -gpodder \- manual page for gpodder 0.7+svn20060408 2006-04-08 +gpodder \- manual page for gpodder 0.7+svn20060408 2006-04-09 .SH DESCRIPTION usage: gpodder [options] arg1 arg2 .PP @@ -29,8 +29,8 @@ Update channel list, download new podcasts \fB\-u\fR, \fB\-\-update\fR Update channel list and exit .TP -\fB\-aFEEDURL\fR, \fB\-\-add\fR=\fIFEEDURL\fR +\fB\-a\fR FEEDURL, \fB\-\-add\fR=\fIFEEDURL\fR Subscribe to channel from FEEDURL .TP -\fB\-dn\fR, \fB\-\-delete\fR=\fIn\fR +\fB\-d\fR n, \fB\-\-delete\fR=\fIn\fR Delete channel with ID n diff --git a/setup.py b/setup.py index 0daea427..dbd5cf3e 100644 --- a/setup.py +++ b/setup.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python2.4 # # gPodder (a media aggregator / podcast client) diff --git a/src/gpodder/gpodder.py b/src/gpodder/gpodder.py index 63e97136..3c65c30b 100644 --- a/src/gpodder/gpodder.py +++ b/src/gpodder/gpodder.py @@ -59,6 +59,7 @@ from libplayers import UserAppsReader from libipodsync import gPodder_iPodSync from libipodsync import ipod_supported +from libipodsync import iPodManagerSingleton # for isDebugging: import libgpodder @@ -101,6 +102,9 @@ class Gpodder(SimpleGladeApp): # User Apps Reader uar = None + # D-BUSified iPod Manager + ipod_mgr = None + def __init__(self, path="gpodder.glade", root="gPodder", domain=app_name, **kwargs): @@ -191,8 +195,10 @@ class Gpodder(SimpleGladeApp): # disable iPod sync features if not supported if not ipod_supported(): - self.cleanup_ipod.set_sensitive( False) - self.sync_to_ipod.set_sensitive( False) + ipod_functions( False) + else: + self.ipod_mgr = iPodManagerSingleton() + self.ipod_mgr.register( self.ipod_changed_callback) # if we are running a SVN-based version, notify the user :) if app_version.rfind( "svn") != -1: @@ -200,7 +206,24 @@ class Gpodder(SimpleGladeApp): #-- Gpodder.new } #-- Gpodder custom methods { - # Write your own methods here + def ipod_functions( self, enable = True): + self.cleanup_ipod.set_sensitive( enable) + self.sync_to_ipod.set_sensitive( enable) + + def ipod_changed_callback( self, ipod): + if ipod != None: + if libgpodder.isDebugging(): + print '(ipod) iPod attached / modified' + connected = ipod.mount_point != None + self.ipod_functions( connected) + if connected: + if self.showConfirmation( _('iPod connected. Do you want to sync now?')): + self.on_sync_to_ipod_activate( self.gPodder) + else: + if libgpodder.isDebugging(): + print '(ipod) iPod removed / not attached' + self.ipod_functions( False) + def updateComboBox( self): self.channels_model = channelsToModel( self.channels) @@ -334,11 +357,9 @@ class Gpodder(SimpleGladeApp): return self.comboDownloaded.get_model().get_value( iter, 0) def sync_to_ipod_proc( self, sync_win): - gpl = gPodderLib() - gpl.loadConfig() - sync = gPodder_iPodSync( ipod_mount = gpl.ipod_mount, callback_status = sync_win.set_status, callback_progress = sync_win.set_progress, callback_done = sync_win.close) + sync = gPodder_iPodSync( callback_status = sync_win.set_status, callback_progress = sync_win.set_progress, callback_done = sync_win.close) if not sync.open(): - gobject.idle_add( self.showMessage, _('Cannot access iPod at %s.\nMake sure your iPod is connected and mounted.') % gpl.ipod_mount) + gobject.idle_add( self.showMessage, _('Cannot access iPod.\nMake sure your iPod is connected.')) sync.close() return False for channel in self.downloaded_channels: @@ -347,11 +368,9 @@ class Gpodder(SimpleGladeApp): sync.close() def ipod_cleanup_proc( self, sync_win): - gpl = gPodderLib() - gpl.loadConfig() - sync = gPodder_iPodSync( ipod_mount = gpl.ipod_mount, callback_status = sync_win.set_status, callback_progress = sync_win.set_progress, callback_done = sync_win.close) + sync = gPodder_iPodSync( callback_status = sync_win.set_status, callback_progress = sync_win.set_progress, callback_done = sync_win.close) if not sync.open(): - gobject.idle_add( self.showMessage, _('Cannot access iPod at %s.\nMake sure your iPod is connected and mounted.') % gpl.ipod_mount) + gobject.idle_add( self.showMessage, _('Cannot access iPod.\nMake sure your iPod is connected.')) sync.close() return False sync.clean_playlist() @@ -424,6 +443,9 @@ class Gpodder(SimpleGladeApp): self.uar.read() prop = Gpodderproperties() prop.set_uar( self.uar) + #if self.ipod_mgr != None: + # self.ipod_mgr.register( prop.update_mountpoint) + # prop.on_close = lambda: self.ipod_mgr.unregister( prop.update_mountpoint) #-- Gpodder.on_itemPreferences_activate } #-- Gpodder.on_itemAddChannel_activate { @@ -810,9 +832,16 @@ class Gpodderproperties(SimpleGladeApp): self.comboPlayerApp.pack_start( cellrenderer, True) self.comboPlayerApp.add_attribute( cellrenderer, 'markup', 0) # end setup cell renderers + self.on_close = None #-- Gpodderproperties.new } #-- Gpodderproperties custom methods { + def update_mountpoint( self, ipod): + if ipod == None or ipod.mount_point == None: + self.iPodMountpoint.set_text( '') + else: + self.iPodMountpoint.set_text( ipod.mount_point) + def set_uar( self, uar): self.comboPlayerApp.set_model( uar.get_applications_as_model()) # try to activate an item @@ -839,6 +868,8 @@ class Gpodderproperties(SimpleGladeApp): def on_gPodderProperties_destroy(self, widget, *args): if libgpodder.isDebugging(): print "on_gPodderProperties_destroy called with self.%s" % widget.get_name() + if self.on_close != None: + self.on_close() #-- Gpodderproperties.on_gPodderProperties_destroy } #-- Gpodderproperties.on_comboPlayerApp_changed { diff --git a/src/gpodder/libipodsync.py b/src/gpodder/libipodsync.py index 33e2d5d3..1add74b3 100644 --- a/src/gpodder/libipodsync.py +++ b/src/gpodder/libipodsync.py @@ -34,6 +34,10 @@ enable_ipod_functions = True try: import gpod import eyeD3 + import dbus + # the following is taken from hal-device-manager source + if getattr( dbus, 'version', (0,0,0)) >= (0,41,0): + import dbus.glib except: enable_ipod_functions = False @@ -53,6 +57,18 @@ def ipod_supported(): return enable_ipod_functions + +__ipodmanager = None + +def iPodManagerSingleton(): + global __ipodmanager + if __ipodmanager == None: + __ipodmanager = iPodManager() + + return __ipodmanager + + + class gPodder_iPodSync(object): itdb = None ipod_mount = '' # mountpoint for ipod @@ -62,24 +78,26 @@ class gPodder_iPodSync(object): callback_progress = None callback_status = None callback_done = None + ipod_mgr = None - def __init__( self, ipod_mount = '/media/ipod/', callback_progress = None, callback_status = None, callback_done = None): + def __init__( self, callback_progress = None, callback_status = None, callback_done = None): if not ipod_supported(): if libgpodder.isDebugging(): print '(ipodsync) iPod functions not supported. (libgpod + eyed3 needed)' - self.ipod_mount = ipod_mount + self.ipod_mgr = iPodManagerSingleton() + self.ipod_mount = self.ipod_mgr.ipod.mount_point self.callback_progress = callback_progress self.callback_status = callback_status self.callback_done = callback_done - + def open( self): if not ipod_supported(): return False if self.itdb == None: - self.itdb = gpod.itdb_parse( self.ipod_mount, None) + self.itdb = gpod.itdb_parse( str( self.ipod_mount), None) if not self.itdb: return False - self.itdb.mountpoint = self.ipod_mount + self.itdb.mountpoint = str(self.ipod_mount) self.pl_master = gpod.sw_get_playlists( self.itdb)[0] self.pl_podcasts = gpod.itdb_playlist_podcasts( self.itdb) return True @@ -98,6 +116,9 @@ class gPodder_iPodSync(object): if self.callback_done != None: time.sleep(1) gobject.idle_add( self.callback_done) + if self.ipod_mgr != None: + if self.ipod_mgr.ipod != None: + os.system( 'sudo eject %s' % ( self.ipod_mgr.ipod.device )) return True def remove_from_ipod( self, track, playlists): @@ -254,3 +275,139 @@ class gPodder_iPodSync(object): # silently ignore :) pass + +class iPod(object): + __mountpoint = None + + def __init__( self, udi): + self.is_connected = False + self.device = None # /dev/sda + self.children = [] + self.udi = udi + if libgpodder.isDebugging(): + print '(iPod) new with udi: %s' % udi + + def has( self, udi): + return udi in self.children + + def add( self, udi): + if libgpodder.isDebugging(): + print '(iPod) adding: %s' % udi + self.children.append( udi) + + def remove( self, udi): + if libgpodder.isDebugging(): + print '(iPod) removing: %s' % udi + self.children.remove( udi) + + def get_mount_point( self): + return self.__mountpoint + + def set_mount_point( self, mount_point): + if libgpodder.isDebugging(): + print '(iPod) mountpoint: %s' % mount_point + self.__mountpoint = mount_point + if self.__mountpoint[-1] != '/': + self.__mountpoint = self.__mountpoint + '/' + + mount_point = property( fget = get_mount_point, fset = set_mount_point ) + + def blowup( self): + if libgpodder.isDebugging(): + print '(iPod) blown up!' + + +class iPodManager(object): + mgr = 'org.freedesktop.Hal.Manager' + mgr_path = '/org/freedesktop/Hal/Manager' + + service = 'org.freedesktop.Hal' + interface = 'org.freedesktop.Hal.Device' + + ipod_key = 'portable_audio_player.storage_device' + ipod_value = '/org/freedesktop/Hal/devices/storage_model_iPod' + ipod_parent_key = 'info.parent' + + bus = None + + __ipod = None + listeners = [] + + def __init__( self): + self.dbus_connect() + + def dbus_connect( self): + self.bus = dbus.SystemBus() + self.bus.add_signal_receiver( self.device_added, 'DeviceAdded', self.mgr, self.service, self.mgr_path) + self.bus.add_signal_receiver( self.device_removed, 'DeviceRemoved', self.mgr, self.service, self.mgr_path) + + def device_added( self, udi): + if libgpodder.isDebugging(): + print '(iPodManager) device_added: %s' % udi + self.notify_me( udi) + props = self.get_properties( udi) + + # add new iPod if connected + if props.has_key( self.ipod_key): + if props[self.ipod_key] == self.ipod_value: + if libgpodder.isDebugging(): + print '(iPodManager) received device_added' + self.ipod = iPod( udi) + self.ipod.device = props['block.device'] + self.notify_all() + + # iPod-related + if self.ipod != None and props.has_key( self.ipod_parent_key) and props[self.ipod_parent_key] == self.ipod_value: + self.ipod.add( udi) + + def notify_me( self, udi): + callback = lambda *args: self.device_modified( udi, *args) + self.bus.add_signal_receiver( callback, 'PropertyModified', self.interface, self.service, udi) + + def device_removed( self, udi): + if libgpodder.isDebugging(): + print '(iPodManager) device_removed: %s' % udi + # iPod-related + if self.ipod != None and self.ipod.has( udi): + self.ipod.remove( udi) + if self.ipod != None and self.ipod.udi == udi: + if libgpodder.isDebugging(): + print '(iPodManager) received device_removed' + self.ipod.blowup() + self.ipod = None + self.notify_all() + + def device_modified( self, udi, num_changes, list): + props = self.get_properties( udi) + for item in list: + key = item[0] + if self.ipod != None: + if key == 'volume.mount_point': + self.ipod.mount_point = props[key] + self.notify_all() + + def get_properties( self, udi): + object = self.bus.get_object( self.service, udi) + return object.GetAllProperties( dbus_interface = self.interface) + + def get_ipod( self): + return self.__ipod + + def notify_all( self): + for listener in self.listeners: + listener( self.ipod) + + def set_ipod( self, ipod): + self.__ipod = ipod + + ipod = property( fget = get_ipod, fset = set_ipod ) + + def register( self, callback): + if not callback in self.listeners: + self.listeners.append( callback) + callback( self.ipod) + + def unregister( self, callback): + if callback in self.listeners: + self.listeners.remove( callback) +