Don't code late at night, it breaks the sync code ;)
[gpodder.git] / ChangeLog
blobfed8a0a1d2d1ab7f299ecf33131f3188cc296518
1 Sun, 03 Feb 2008 23:02:47 +0100 <thp@perli.net>
2 Don't code late at night, it breaks the sync code ;)
4         * src/gpodder/sync.py: Add brackets because I wrote bad code in the
5         first place (fix video sync for iPods); thanks to Dave Perdue
6         <dave@minusvince.com> for reporting this in our bug tracker
7         (Closes: http://bugs.gpodder.org/show_bug.cgi?id=28)
9 Sat, 02 Feb 2008 11:36:35 +0100 <thp@perli.net>
10 Make feed update display "Loading" titles, only run auto update when minimized
12         * src/gpodder/gui.py: Usability patch from NIkosapi <nikosapi.org>:
13         Make the feed update dialog display "Loading feeds" instead of
14         "Downloading feeds" when its loading the feeds from the local cache;
15         only run the automatic, periodic update when gPodder is minimized,
16         because it would pop up a dialog while gPodder is in use otherwise
18 Sat, 02 Feb 2008 11:33:48 +0100 <thp@perli.net>
19 Pressing Enter in the add channel entry adds the channel
21         * data/gpodder.glade: Usability patch from Nikosapi <nikosapi.org>:
22         Add an action handler to the gladefile, so the user can simply press
23         Enter in the gtk.Entry instead of having to tab to or click on the
24         button for adding a channel
26 Wed, 30 Jan 2008 09:47:21 +0100 <thp@perli.net>
27 Fix another bug in file_modification_datetime
29         * src/gpodder/util.py: Another problem that happens with special
30         iTunesDB settings, thanks to FriedBunny <friedbunny@kulturny.com>
32 Wed, 30 Jan 2008 09:23:19 +0100 <thp@perli.net>
33 Fix a bug in the file size calculation
35         * src/gpodder/util.py: calculate_filesize should deal with "None"
36         passed as filename (now returns zero-size);
37         Fixes: Bug #23 (http://gpodder.thegithouse.com/show_bug.cgi?id=23)
38         Thanks to FriedBunny <friedbunny@kulturny.com> for reporting this
39         issue in our bug tracker
41 Mon, 28 Jan 2008 12:33:13 +0100 <thp@perli.net>
42 Merge new sync code from thp's private branch
44         * bin/gpodder: Add "--sync"/"-s" command-line option to start the
45         device synchronization process from the CLI interface - syncing can
46         now be scripted, baby :) (you still have to configure the sync device
47         via the GUI first, though)
48         * data/gpodder.glade: Simplify gPodderSync dialog and remove some
49         obsolete options from the channel dialog
50         * src/gpodder/console.py: Add code for command-line sync support
51         * src/gpodder/gui.py: Remove obsolete code for libipodsync and import
52         the new "sync" module; simplify Sync<->GUI interface; clean-up
53         gPodderSync dialog code to interface with new sync code; remove some
54         config glue code for the channel properties dialog
55         * src/gpodder/libconverter.py: Make libconverter work even if the
56         percentage callback would fail in certain conditions (try..except)
57         * src/gpodder/libipodsync.py: Removed
58         * src/gpodder/libpodcasts.py: Refactor age_in_days() and
59         get_age_string() to simple calls to utility functions and move the
60         code to gpodder.util
61         * src/gpodder/sync.py: Added new sync module :) Very modular, yesaya!
62         * src/gpodder/util.py: Add file_age_in_days() and file_age_to_string()
63         helper functions that use code from libpodcasts and return the age of
64         a file in the filesystem
66 Thu, 24 Jan 2008 14:51:48 +0100 <thp@perli.net>
67 Fix a bug for show_message and tray_icon/minimized
69         * src/gpodder/gui.py: Fix a bug when messages are shown for
70         non-gPodderMainWindow windows (that don't have tray_icon)
72 Wed, 23 Jan 2008 11:55:35 +0100 <thp@perli.net>
73 Make gpodder.desktop pass desktop-file-validate tests
75         * data/gpodder.desktop: Update "Categories" and remove "Encoding",
76         following the freedesktop.org Desktop Entry specification
78 Wed, 23 Jan 2008 09:06:32 +0100 <thp@perli.net>
79 Do not show notifications when gPodder is minimized
81         * src/gpodder/gui.py: Merge patch from Jérôme Chabod to fix problems
82         with the gPodder window re-appearing after having been minimized;
83         use the notification icon when possible; initially reported by Shane
84         Donohoe
86 Tue, 22 Jan 2008 10:19:46 +0100 <thp@perli.net>
87 Add "releasetest" target to Makefile (automated testing)
89         * Makefile: Add "releasetest" target that can be used to do some
90         automatic testing before releases; thanks to Götz Waschk for giving
91         some hint on "desktop-entry-validate" :)
93 Tue, 22 Jan 2008 10:09:16 +0100 <thp@perli.net>
94 Use Episode Selector for per-channel new episodes
96         * src/gpodder/gui.py: Reorganize code to use the episode selector for
97         both all-channels and per-channel new episodes
98         (Closes: http://gpodder.thegithouse.com/show_bug.cgi?id=14)
100 Tue, 22 Jan 2008 09:42:01 +0100 <thp@perli.net>
101 Fix problem in gpodder.desktop file
103         * bin/gpodder: We're in development again (+svn)
104         * data/gpodder.desktop: Fix problem in .desktop file (Thanks to Götz
105         Waschk for reporting this bug, detected via desktop-entry-validate)
107 Tue, 22 Jan 2008 08:20:33 +0100 <thp@perli.net>
108 gPodder 0.10.4 "Faster Pussycats Kill" released
110         * bin/gpodder: gpodder 0.10.4 released :)
111         * README: gPodder 0.10.4 released :)
112         * doc/man/gpodder.1: gPodder 0.10.4 released :)
113         * data/po/de.po: Updated German translation
114         * data/messages.pot: Updated from source
115         * data/po/*.po: Updated from messages.pot
117 Tue, 22 Jan 2008 08:13:42 +0100 <thp@perli.net>
118 Create Bittorrent download directory on startup
120         * src/gpodder/libgpodder.py: Create Bittorrent download directory on
121         startup, so the first time gPodder preferences are shown, the download
122         folder will exist and now throw an error
124 Mon, 21 Jan 2008 21:41:59 +0100 <thp@perli.net>
125 Updated French translation file with correct encoding
127         * data/po/fr.po: Updated French translation with correct encoding by
128         Jérôme Chabod - thanks!
130 Mon, 21 Jan 2008 10:47:49 +0100 <thp@perli.net>
131 Add support for sending files via Bluetooth
133         * data/gpodder.glade: Add "Bluetooth" configuration page to
134         preferences dialog
135         * src/gpodder/config.py: Add Bluetooth-related configuration options
136         * src/gpodder/gui.py: Add support for sending (and converting) files
137         for bluetooth file transfer; add glue code for preferences dialog and
138         configuration manager
139         * src/gpodder/libgpodder.py: Add "tempdir" variable to gPodderLibClass
140         that specifies a temporary directory to be used (currently only for
141         converting files for bluetooth transfer, might be migrated to a
142         configuration option later)
143         * src/gpodder/util.py: Add discover_bluetooth_devices() function that
144         searches for nearby devices (either via python-bluez or via hcitool,
145         so one of them has to be installed as a dependency); add
146         bluetooth_send_file() convenience function that starts a file transfer
147         via Bluetooth OBEX - uses gnome-obex-send, which has to be installed
148         for Bluetooth file transfer to work
150 Mon, 21 Jan 2008 09:52:09 +0100 <thp@perli.net>
151 Support for different audio/video player selection
153         * data/gpodder.glade: Add video selection to preferences dialog
154         * src/gpodder/config.py: Add "videoplayer" configuration option
155         * src/gpodder/gui.py: Add glue code for configuration and preferences
156         dialog (audio/video player selector)
157         * src/gpodder/libgpodder.py: Add code to migrate from older gPodder
158         configurations (videoplayer is set to "unspecified") to the same value
159         as the currently selected audio player; when "playing" a file,
160         determine the file type and start the right player application
161         * src/gpodder/libplayers.py: Parameterize the UserAppsReader class to
162         accept a mime type (e.g. "video" or "audio") after which to filter
164 Mon, 21 Jan 2008 07:30:38 +0100 <thp@perli.net>
165 Czech translation update: gpodder.desktop
167         * data/gpodder.desktop: Ondrej Vesely <xorwen@gmai.com> added the
168         Czech translation strings to the gpodder.desktop file - thanks
170 Sun, 20 Jan 2008 22:50:13 +0100 <thp@perli.net>
171 Added Czech translation by Ondrej Vesely
173         * data/po/cs.po: Added (partial) Czech translation by Ondrej Vesely
174         <xorwen@gmail.com>; the completed translation will be updated when
175         it's done
176         * setup.py: Add "cs" (Czech) to list of translations
178 Sat, 19 Jan 2008 18:39:54 +0100 <thp@perli.net>
179 Updated Swedish translation from Anders Kvist
181         * data/po/sv.po: Thanks to Anders Kvist, the Swedish translation is
182         now up-to-date again
184 Sat, 19 Jan 2008 13:28:12 +0100 <thp@perli.net>
185 Updated French translation from Jérôme Chabod
187         * data/po/fr.po: Thanks to Jérôme Chabod, the French translation is
188         now up-to-date again
190 Thu, 17 Jan 2008 22:46:21 +0100 <thp@perli.net>
191 Updated Dutch translation from Pieter De Decker
193         * data/po/nl.po: Thanks to Pieter De Decker, the Dutch translation is
194         now up-to-date again
196 Thu, 17 Jan 2008 14:21:49 +0100 <thp@perli.net>
197 Update translation template and translations from source
199         * data/messages.pot: Updated potfile from source code
200         * data/po/*.po: Updated translation templates from potfile
202 Wed, 16 Jan 2008 08:36:12 +0100 <thp@perli.net>
203 Remove the "Ignore" button in tray icon notifications
205         * src/gpodder/trayicon.py: Remove the "ignore" action and button when
206         a download has finished; the "ignore" button is redundant, as the same
207         functionality can be achieved by clicking on the "x" of the bubble
209 Tue, 15 Jan 2008 14:50:13 +0100 <thp@perli.net>
210 Modularize calls to gobject.idle_add (for non-GTK support)
212         * bin/gpodder: Set interface_is_gui to True when running the GUI
213         * src/gpodder/*.py: Use util.idle_add instead of gobject.idle_add
214         * src/gpodder/gui.py: Simplify some idle_add calls, code clean-up
215         * src/gpodder/__init__.py: Add "interface_is_gui" boolean variable
216         that tells us if we are running in GUI or CLI mode (this is needed for
217         util.idle_add to determine if it's going to use the gobject module or
218         not)
219         * src/gpodder/util.py: Add new function idle_add() that acts as a
220         wrapper to gobject.idle_add(); this will only use gobject.idle_add if
221         we are in GUI mode, and will call the callback directly when we are in
222         command-line mode (because we don't have to watch out for threading
223         race conditions there, compared to what GTK+ gives us)
225 Mon, 14 Jan 2008 20:23:02 +0100 <thp@perli.net>
226 Add menu item that links to gPodder's new bug tracker
228         * data/gpodder.glade: Add bug tracker item to help menu
229         * src/gpodder/gui.py: Add code to open a webbrowser with the bug
230         tracker when the bug tracker icon is clicked
232 Mon, 14 Jan 2008 20:04:25 +0100 <thp@perli.net>
233 Add a checkbox to keep episodes when removing channels
235         * src/gpodder/gui.py: Add a checkbox to the confirmation dialog when
236         removing a podcast channel, so the user has the option to remove the
237         podcast feed from gPodder's subscription list, but still keep the
238         downloaded files on the harddisk (via a checkbox in the dialog)
239         (Closes: http://gpodder.thegithouse.com/show_bug.cgi?id=1)
241 Thu, 10 Jan 2008 08:44:00 +0100 <thp@perli.net>
242 Updated Russian translation by Hex
244         * data/po/ru.po: Updated Russian translation by
245         Hex <justin.forest@gmail.com>
247 Wed, 09 Jan 2008 23:43:56 +0100 <thp@perli.net>
248 Merge tray icon and notification patch by Jérôme Chabod
250         * data/gpodder.glade: UI support for tray icon settings and
251         configuration options for auto update feeds (auto update based on a
252         patch by Nick (nikosapi.org)
253         * src/gpodder/config.py: Add configuration options that support the
254         tray icon, notification bubble and automatic update/close functions
255         * src/gpodder/gui.py: Support the tray icon in the GUI; link the
256         configuration options with the preferences dialog; re-work the channel
257         update dialog to be more slipstreamed
258         * src/gpodder/trayicon.py: Added new tray icon module by
259         Jérôme Chabod <jerome.chabod@ifrance.com>; initial idea from old
260         gPodder TODO list by Holger Bauer
262 Wed, 09 Jan 2008 23:09:54 +0100 <thp@perli.net>
263 Updated Swedish translation by Anders Kvist
265         * data/po/sv.po: Swedish translation updated by
266         Anders Kvist <kvistkvist@telia.com>
268 Wed, 09 Jan 2008 11:52:23 +0100 <thp@perli.net>
269 Use os.rename to make channel list saving atomic
271         * src/gpodder/opml.py: Make the saving of the channel list atomic by
272         first saving it to a temporary file and then using os.rename to really
273         move the file in place (this should make the channel list saving very
274         stable and protect against certain bad system conditions where the
275         channel list is emptied); thanks to Jens Thiele <karme@berlios.de> for
276         the suggestion and pointers to improve the channel saving code
278 Sat, 05 Jan 2008 15:34:23 +0100 <thp@perli.net>
279 Make logging in libpodcasts less verbose
281         * src/gpodder/libpodcasts.py: Remove some verbose logging code
283 Wed, 02 Jan 2008 15:39:04 +0100 <thp@perli.net>
284 Migrate from channels.xml (from 0.9.4) to channels.opml if needed
286         * src/gpodder/libgpodder.py: Add code to check if channels.xml exists
287         but channels.opml doesn't and if so, try to convert from channels.xml
288         to channels.opml, so users upgrading from 0.9.4 directly will have
289         their channel list automatically converted;
290         thanks to Tim Michelsen for the bug report and helpful Ubuntu info
292 Tue, 01 Jan 2008 23:32:50 +0100 <thp@perli.net>
293 Add download completion notification support
295         * src/gpodder/download.py: Notify the download status manager when a
296         download has been completed successfully
297         * src/gpodder/services.py: Add download-complete signal to list of
298         possible signals and download_completed() method to be used by
299         downloads to notify the status manager of a successful download
301 Sat, 29 Dec 2007 14:21:51 +0100 <thp@perli.net>
302 Patch the feedparser module to correctly process democracynow.org
304         * src/gpodder/cache.py: Add a patch_feedparser() method that checks of
305         the feedparser module correctly maps the "plain" content-type to the
306         correct "text/plain" content-type and if not, replace the
307         mapContentType method with a fixed one; this should make the audio
308         podcast on democracynow.org working (thanks to Clark Burbidge for the
309         bug report)
311 Sun, 23 Dec 2007 12:20:25 +0100 <thp@perli.net>
312 Better username/password extraction from URLs
314         * src/gpodder/util.py: Improve username and password extraction for
315         authentication URLs; thanks to Nick <me@nikosapi.org> and Shane
316         Donohoe <priestoftime@googlemail.com> for reporting this bug and
317         sending in a patch; this should allow for e-mail address usernames
319 Sat, 22 Dec 2007 11:44:41 +0100 <thp@perli.net>
320 Also delete old episodes that have disappeared from the feed
322         * src/gpodder/gui.py: When deleting old episodes automatically, also
323         delete episodes that have disappeared from the RSS feed and are only
324         available locally; thanks to Pieter De Decker <pdedecker@gmail.com>
325         for the very detailed and helpful bug report :)
327 Thu, 20 Dec 2007 01:33:15 +0100 <thp@perli.net>
328 Stability updates: Feed cache update, old PyCairo versions
330         * src/gpodder/draw.py: Add a workaround for pycairo versions less than
331         1.1.6. Thanks to Chris Arnold for reporting this bug on the
332         gpodder-devel mailing list and taking the time to test the patch and
333         report back and provide useful information for debugging this error
334         * src/gpodder/gui.py: Close the feed cache update dialog even when the
335         user clicks on "cancel" (would have stayed there otherwise)
337 Tue, 18 Dec 2007 10:13:44 +0100 <thp@perli.net>
338 Merge "delete episode after sync" patch from Jérôme Chabod
340         * data/gpodder.glade: Add GUI elements in preferences dialog to select
341         what to do after episode sync (nothing, delete or mark played)
342         * src/gpodder/config.py: Add "on_sync_delete" configuration option
343         * src/gpodder/gui.py: Glue "on_sync_delete" config and GUI together
344         * src/gpodder/libipodsync.py: If the configuration option
345         on_sync_delete is set, remove the episode after successfully copying
346         it to the iPod or MP3 player (the whole patch has been initially done
347         by Jérôme Chabod <jerome.chabod@france.com> with some modifications)
348         * src/gpodder/libpodcasts.py: Make delete_from_disk() a bit more
349         robust, so it doesn't disturb libipodsync's functionality
351 Mon, 17 Dec 2007 16:26:43 +0100 <thp@perli.net>
352 Remove invalid channel cover images when loading fails
354         * src/gpodder/libpodcasts.py: Remove the cover_file of a channel when
355         it cannot be loaded (assume something went wrong when downloading the
356         cover file); re-downloading the cover manually can solve the problem
358 Mon, 17 Dec 2007 15:00:17 +0100 <thp@perli.net>
359 Fix typo in last commit
361         * src/gpodder/libipodsync.py: Fix typo in last commit
363 Mon, 17 Dec 2007 11:21:10 +0100 <thp@perli.net>
364 Modify played handling in iPod sync when "on sync mark played" is active
366         * src/gpodder/libipodsync.py: Don't copy played state from PC to iPod
367         if the on_sync_mark_played option is set
369 Sat, 15 Dec 2007 15:58:23 +0100 <thp@perli.net>
370 Merge patch from Leonid Ponomarev to gdfs
372         * doc/dev/gdfs/gdfs-init.py: Merge patch from Leonid Ponomarev to add
373         support for the system's native encoding, based on the $LANG
374         environment variable. This should add support for episodes and
375         channels with international characters as titles
377 Sat, 15 Dec 2007 15:11:46 +0100 <thp@perli.net>
378 Updated Dutch translation by Pieter De Decker
380         * bin/gpodder: We're in development again: "+svn"
381         * data/po/nl.po: Updated Dutch translation from Pieter De Decker
383 Thu, 13 Dec 2007 08:32:54 +0100 <thp@perli.net>
384 gPodder 0.10.3 "A Stop at Willoughby" released
386         * bin/gpodder: gPodder 0.10.3 released :)
387         * README: gPodder 0.10.3 released :)
388         * doc/man/gpodder.1: gPodder 0.10.3 released :)
389         * data/messages.pot: Updated from source
390         * data/po/de.po: Updated German translation
391         * data/po/*.po: Updated from messages.pot
393 Thu, 13 Dec 2007 08:02:29 +0100 <thp@perli.net>
394 Link the gPodder Documentation Wiki from the help pages
396         * data/gpodder.glade: Help menu: gPodder Homepage (instead of website)
397         and Documentation Wiki (instead of Mailing list)
398         * src/gpodder/gui.py: Open gPodder Wiki instead of mailing list page
400 Wed, 12 Dec 2007 21:39:03 +0100 <thp@perli.net>
401 Remove TODO file from MANIFEST.in
403         * MANIFEST.in: Of course we have to remove non-existing files from the
404         MANIFEST.in file, too.. so TODO is now finally gone :)
406 Wed, 12 Dec 2007 21:30:00 +0100 <thp@perli.net>
407 Manage TODO list on the gPodder Wiki
409         * TODO: Removed; new location: http://gpodderwiki.jottit.com/todo
411 Wed, 12 Dec 2007 20:55:00 +0100 <thp@perli.net>
412 Configuration for "old" episodes; automatically remove old episodes
414         * src/gpodder/config.py: New boolean auto_remove_old_episodes
415         configuration option that defaults to False (remove on startup)
416         * src/gpodder/gui.py: Add code to automatically remove old, unplayed
417         episodes on startup if the specific configuration options have been
418         set; connect config manager to GUI items for the preferences dialog
419         * data/gpodder.glade: Add checkbox for automatically removing old,
420         unplayed episodes from gPodder on startup and a spinbutton to set the
421         amount of days after which an episode is considered "old"
423 Wed, 12 Dec 2007 19:44:15 +0100 <thp@perli.net>
424 Merged episode locking patch from Paul Rudkin
426         * src/gpodder/gui.py: Merged "lock episodes" patch to mark episodes as
427         locked, patch by Paul Rudkin <paul@thegithouse.com>
428         * data/gpodder.glade: Add menu item for toggle locked status
429         * src/gpodder/libgpodder.py: Add "locked" history
430         * src/gpodder/libpodcasts.py: When requesting a status icon, also draw
431         the "Locked" status; is_locked() in podcastItem
432         * src/gpodder/util.py: Added code for drawing a padlock icon on top of
433         another (file type) icon; this is used for the "lock episodes" feature
435 Tue, 11 Dec 2007 22:10:03 +0100 <thp@perli.net>
436 Updated TODO list
438         * TODO: Updated TODO list
440 Mon, 10 Dec 2007 09:42:06 +0100 <thp@perli.net>
441 Move observer code out of DownloadStatusManager into ObservableService
443         * src/gpodder/services.py: Move out all observer-related code like
444         registration, unregistration and notification to a new
445         ObservableService class; subclass ObservableService in
446         DownloadStatusManager; this makes the observer code in
447         DownloadStatusManager re-usable (will be needed for new sync code)
449 Mon, 10 Dec 2007 09:33:26 +0100 <thp@perli.net>
450 Selective iPod episode clean-up; "delete older than X days"
452         * src/gpodder/config.py: Add episode_old_age configuration variable;
453         is an integer, defaults to 7. This is the number of days after which
454         an episode will be considered "old"
455         * src/gpodder/gui.py: iPod cleanup is now done selectively using the
456         episode selector dialog; the code has been split, because we do not
457         yet have an episode selector dialog for FS-based sync; add "Downloaded
458         x days ago" column to "Delete old episodes" dialog and a corresponding
459         button; call the callback even when no episodes are selected in
460         gPodderEpisodeSelector
461         * src/gpodder/libipodsync.py: Class variables of gPodder_iPodSync
462         moved to __init__ to be instance variables (this should fix a bug that
463         crops up now that we can selectively delete episodes); remove_tracks()
464         and clean_playlist() have been modified/added to support new episode
465         selector deletion code
466         * src/gpodder/libpodcasts.py: Move is_played() to podcastItem from
467         podcastChannel (it really belongs to the item; this makes code more
468         readable in other parts of the codebase); add age_in_days(), is_old(),
469         get_age_string() and age_prop to podcastItem
470         * src/gpodder/util.py: New function: file_modification_datetime();
471         returns a datetime.datetime instance of the MTIME (modification
472         timestamp) of the filename given as parameter or None if the filename
473         cannot be determined; this is used for the "old episodes" feature
475 Sun, 09 Dec 2007 16:45:11 +0100 <thp@perli.net>
476 Make has_converter() a bit more intelligent in detecting extensions
478         * src/gpodder/libconverter.py: Convert given extension to lowercase
479         and strip a leading "." from the extension, so calling code can also
480         give the second value of the os.path.splitext() result directly to
481         has_converter()
483 Sun, 09 Dec 2007 13:20:49 +0100 <thp@perli.net>
484 Fix pre-setting code for filechooser buttons; Patch by Paul Rudkin
486         * src/gpodder/config.py: Fix pre-setting code for filechooser-related
487         code; use set_current_folder() instead of set_filename()
488         * src/gpodder/gui.py: Fix pre-setting code for filechooser-related
489         code; thanks to Paul Rudkin <paul@thegithouse.com> for the patch
491 Thu, 06 Dec 2007 09:37:57 +0100 <thp@perli.net>
492 Support for itms:// links (direct links to the Apple iTunes Music Store)
494         * src/gpodder/util.py: Support direct itms:// links by splitting out
495         the iTunes Podcast links parsing routines. This should put us in for
496         some nice iTunes podcast link support that will automagically
497         translate iTunes podcast links to the correct RSS feed URL
499 Thu, 06 Dec 2007 09:29:09 +0100 <thp@perli.net>
500 Support for iTunes Podcast links (http://phobos.apple.com/...)
502         * src/gpodder/util.py: Add support for subscribing to iTunes Podcast
503         links (those with phobos.apple.com); new functions:
504         parse_itunes_xml(), http_get_and_gunzip() and itunes_dicover_rss()
506 Thu, 06 Dec 2007 09:15:57 +0100 <thp@perli.net>
507 Added Galician translation from Teo Ramirez
509         * data/gpodder.desktop: Added Spanish and Galician translations;
510         thanks to Teo Ramirez <teoramirez@gmail.com>
511         * data/messages.pot: Updated from source
512         * data/po/de.po: Updated
513         * data/po/gl.po: Added NEW Galician (gl) translation by Teo Ramirez
514         * data/po/*.po: Updated from source
515         * setup.py: Added Galician (gl) translation by Teo Ramirez
517 Thu, 06 Dec 2007 08:35:12 +0100 <thp@perli.net>
518 Sort channel list (finally ;)
520         * src/gpodder/libpodcasts.py: Sort channels by lowercase title before
521         returning the channel list in load_channels(); this automagically
522         makes gPodder's channel list always sorted :)
523         Thanks to FriedBunny <friedbunny@kulturny.com> for suggesting this and
524         sending in an intial patch that led to this patch =)
525         * TODO: Remove implemented item: Sort channel list
527 Tue, 04 Dec 2007 23:28:27 +0100 <thp@perli.net>
528 Do grayscale "pill" instead of theme-based colors (for bad themes)
530         * src/gpodder/draw.py: Always draw the "pill" in semi-transparent
531         black/grey shades so it will work for all GTK themes (even Ubuntu's)
533 Mon, 03 Dec 2007 21:35:56 +0100 <thp@perli.net>
534 Update channel navigator when iPod/MP3 player sync has finished
536         * src/gpodder/gui.py: Update channel navigator when iPod sync has
537         finished, so we can update the "played" status in the channel
538         navigator when this status has changed after we've synced ("on sync
539         mark played" option)
541 Mon, 03 Dec 2007 21:24:17 +0100 <thp@perli.net>
542 Add option to mark episodes as played after transfer to device
544         * data/gpodder.glade: Option added to preferences dialog
545         * src/gpodder/config.py: Add option "on_sync_mark_played"; will mark
546         an episode as played when it gets transferred to a device
547         * src/gpodder/gui.py: Glue code for GUI + gpodder.config
548         * src/gpodder/libipodsync.py: On sync, mark episode as played if the
549         user has selected the "on_sync_mark_played" option
550         * TODO: Remove implemented/integrated items
552 Sat, 01 Dec 2007 15:19:29 +0100 <thp@perli.net>
553 Fix a fatal bug with first-run that prevents channel list saving
555         * src/gpodder/util.py: Always use a file's parent directory to get the
556         free disk space and return zero free disk space when the parent
557         directory does not exist
559 Thu, 29 Nov 2007 08:53:36 +0100 <thp@perli.net>
560 Support for itpc:// URLs
562         * src/gpodder/util.py: Add support for adding "itpc://" URLs (these
563         are simply http:// URLs with a different schema, for iTunes)
565 Tue, 27 Nov 2007 22:59:26 +0100 <thp@perli.net>
566 Draw channel stats (unplayed, downloaded) on channel navigator
568         * bin/gpodder: We're in development again, so add "+svn"
569         * src/gpodder/draw.py: Added
570         * src/gpodder/gui.py: Fix import of renamed "channels_to_model";
571         re-assign new column numbers for treeChannels' data model; add
572         cell renderer for pill pixbuf and remove cell renderer for status text
573         * src/gpodder/libpodcasts.py: Add episode_is_new() function to
574         podcastChannel to check if an episode can be considered "new"; use the
575         episode_is_new function in get_new_episodes; add get_episode_stats()
576         after an idea from Paul Rudkin <paul@thegithouse.com>; re-factor
577         channels_to_model and clean out old, unused code and columns
579 Mon, 26 Nov 2007 08:57:04 +0100 <thp@perli.net>
580 gPodder 0.10.2 "Ein schweineschnauzen Sandwich, bitte!" released
582         * bin/gpodder: gPodder 0.10.2 released :)
583         * doc/man/gpodder.1: gPodder 0.10.2 released :)
584         * README: gPodder 0.10.2 released :)
586 Mon, 26 Nov 2007 08:52:49 +0100 <thp@perli.net>
587 Translation updates
589         * data/messages.pot: Refreshed from source
590         * data/po/*.po: Refreshed from messages.pot
591         * data/po/de.po: Updated German translation
593 Sun, 25 Nov 2007 11:50:46 +0100 <thp@perli.net>
594 Make sure there is enough free disk space when saving OPML channel list
596         * src/gpodder/gui.py: Notify user that there's some problem saving the
597         current channel list when save_channels() return False
598         * src/gpodder/libpodcasts.py: Pass-through the return value of
599         gpodder.opml.Exporter.write so calling code knows if saving the
600         channel list was successful or not
601         * src/gpodder/opml.py: Check free disk space before saving OPML
602         channels in Exporter.write; thanks to Jens Thiele <karme@berlios.de>
603         for reporting this bug on the Debian BTS (Closes: Debian Bug #452490)
605 Thu, 22 Nov 2007 21:52:35 +0100 <thp@perli.net>
606 Don't send Referer header when downloading episodes
608         * src/gpodder/download.py: Some podcasts now implement an
609         "anti-bandwidth-theft" code that should provide other websites from
610         not linking to the episodes; as we have sent a Referer header
611         containing the RSS feed URL, this causes problems; Referer header
612         sending is therefore disabled now
614 Sun, 18 Nov 2007 15:33:50 +0100 <thp@perli.net>
615 TODO items from Katy G. B.
617         * TODO: Updated TODO list
619 Sat, 17 Nov 2007 18:38:36 +0100 <thp@perli.net>
620 Backwards-compatibility for PyGTK less than 2.12 (for GtkTooltip)
622         * src/gpodder/gui.py: Do not hook up tooltip handlers when we are
623         using PyGTK less than 2.12 (which introduced the gtk.Tooltip API)
625 Thu, 15 Nov 2007 11:07:42 +0100 <thp@perli.net>
626 Check free disk space before copying files to iPod
628         * src/gpodder/libipodsync.py: Check if the iPod's filesystem has
629         enough free disk space before copying files over to it, as to not
630         corrupt the iTunesDB in certain situations and fail when disk is full;
631         thanks to Nicolas Quienot <niqooo@gmail.com> for the bug report
632         * src/gpodder/util.py: Add get_free_disk_space() function that
633         calculates the free (user-available) disk space on a given path
635 Wed, 14 Nov 2007 21:55:18 +0100 <thp@perli.net>
636 Add informative tooltips to channel navigator
638         * src/gpodder/gui.py: Add tooltips to channel navigator that show a
639         bigger cover image, the title, description, url and used disk space
640         * src/gpodder/libpodcasts.py: Add save_dir_size property to
641         podcastChannel that contains the disk usage of the channel's save_dir;
642         this can be manually updated by calling update_save_dir_size() and
643         will automatically be updated when the GUI code hooks into the
644         channel; also add get_cover_pixbuf() that returns a pixbuf of the
645         cover for a given size or None if there is no valid cover file
647 Wed, 14 Nov 2007 19:19:11 +0100 <thp@perli.net>
648 Slipstream code (enumerate instead of simple position tracking)
649         * src/gpodder/libipodsync.py: Use enumerate() to iterate over a list
650         of episodes instead of keeping track of the position "by hand"
652 Wed, 14 Nov 2007 19:17:51 +0100 <thp@perli.net>
653 Ignore initial window events from GtkWindow in Config
655         * src/gpodder/config.py: Add a flag to config manager to ignore window
656         events until the window has been realized; then, start taking position
657         and size updates
659 Mon, 12 Nov 2007 20:25:39 +0100 <thp@perli.net>
660 Improve caching for HTTP redirects and minor errors; cache clean-up
662         * src/gpodder/cache.py: Cache content when it comes from a HTTP
663         redirect (301, 302, 307); cache feeds even with parsing errors, so we
664         can "fill" our cache and not download on every startup
665         * src/gpodder/libpodcasts.py: Add cache clean-up code after loading
666         channels; this should keep the feedcache.db file smaller for users
667         that like to try out new channels (or have used gPodder for a while)
669 Sun, 11 Nov 2007 14:24:17 +0100 <thp@perli.net>
670 Better file extension guessing for URLs
672         * src/gpodder/util.py: Improve file_extension_from_url() by adding
673         additional checks for known good extensions and recurse into the query
674         string if it looks like an URL; this should fix compatibility problems
675         for feeds with strange URLs; should provide more reliable guessing;
676         thanks to Nicolas Quienot <niqooo@gmail.com> for the bug report
678 Fri, 09 Nov 2007 10:05:36 +0100 <thp@perli.net>
679 Fix format_filesize() usage in episodes selector and podcastItem
681         * src/gpodder/gui.py: Use the correct (config-using) format_filesize()
682         function to generate the total size string in the episode selector
683         * src/gpodder/libpodcasts.py: Use the correct (config-usig
684         format_filesize() function to generate the total size string in
685         podcastItem; thanks to Pieter De Decker <pdedecker@gmail.com> for
686         pointing that out
687         * data/gpodder.glade: Use "Preferences" instead of "Preferences..."
688         which feels a bit better in the GUI
690 Thu, 08 Nov 2007 21:25:19 +0100 <thp@perli.net>
691 Add "gPodder download folder synchronizer" scripts to repository
693         * doc/dev/gdfs/gdfs-check.py: Added
694         * doc/dev/gdfs/gdfs-init.py: Added
695         * doc/dev/gdfs/README: Added
697 Thu, 08 Nov 2007 20:01:13 +0100 <thp@perli.net>
698 The mighty episode selector dialog and some menu re-arrangements
700         * src/gpodder/gui.py: Move the "center_on_widget" keyword-based window
701         positioning code to GladeWidget to be universally usable; update
702         "Device" menu item on startup; new functions: delete_episode_list()
703         and download_episode_list() that both operate on lists of episodes;
704         add code for invoking gPodderEpisodeSelector for deleting old
705         episodes; re-work on_itemDownloadAllNew_activate to use the episode
706         selector instead of hand-crafting a message dialog text; add
707         update_item_device() function that will handle the hiding, showing and
708         renaming of the "Device" menu in the menubar; clean-up
709         gPodderProperties with callback_finished setting (now kwarg-based);
710         new, might, fancy, customizable and uber-sexy gPodderEpisodeSelector
711         that will prove to be useful in some places in our codebase: it
712         basically allows the user to select a subset of episodes from a given
713         list in a quite sophisticated way; new "delete old episodes" menu item
714         added for cleaning up gPodder's downloads
715         * src/gpodder/libpodcasts.py: Add delete_from_disk() convenience
716         method to podcastItem; other convenience properties and functions
717         needed for the new episode selector dialog: pubdate_prop,
718         get_filesize_string(), filesize_prop, get_channel_title(),
719         channel_prop, get_played_string(), played_prop
720         * data/gpodder.glade: new gPodderEpisode dialog; re-structuring of
721         gPodder's main menu to be more usable and more compact; also added the
722         Ctrl+K "Remove old episodes" menu item; also use the correct
723         "multimedia-player" icon name of a not really representative icon
725 Thu, 08 Nov 2007 12:07:30 +0100 <thp@perli.net>
726 Support syncing to FS-based MP3 players without subfolders
728         * data/gpodder.glade: Add checkbox "Create a subfolder for each
729         channel" to preferences dialog and rename some widgets
730         * src/gpodder/config.py: Add boolean "fssync_channel_subfolders"
731         option that defaults to True (create subfolder for each channel)
732         * src/gpodder/gui.py: Hook up config option fssync_channel_subfolders
733         to preferences dialog; do more intelligent widget hiding for the
734         "Player" tab in the preferences dialog (only show relevant widgets)
735         * src/gpodder/libipodsync.py: Only append channel name as subfolder to
736         destination folder name when the "fssync_channel_subfolders" option is
737         True; suggested by Paul Elliot <omahns.home@gmail.com>
739 Thu, 08 Nov 2007 11:28:17 +0100 <thp@perli.net>
740 Fix offline cache behaviour when time is not set
742         * src/gpodder/cache.py: Return cached_content in offline mode when
743         cached_content "is not None" (instead of cached_time "is not None")
745 Tue, 06 Nov 2007 12:37:41 +0100 <thp@perli.net>
746 Process events before connecting Config to gtk windows
748         * data/gpodder.glade: Remove default size for main gPodder window, as
749         this is now handled by the config manager
750         * src/gpodder/config.py: Process GTK events in the event queue before
751         connecting to the "configure-event" signal, so we won't get two
752         configure events for the window for the initial size change
754 Mon, 05 Nov 2007 13:51:26 +0100 <thp@perli.net>
755 Add error reporting when download fails because of an I/O error
757         * src/gpodder/download.py: Catch and handle I/O errors in
758         DownloadThread and format and pass on messages to GUI code when
759         required; thanks to Florian Richter <Florian_Richter@gmx.de> for
760         suggesting this feature after having a full disk
761         * src/gpodder/gui.py: Update tree view when adding a new episode;
762         add new notification() method and pass this method through to
763         DownloadThread, so it can present messages to the user (i.e. errors)
765 Mon, 05 Nov 2007 12:54:35 +0100 <thp@perli.net>
766 Use util.find_command in more places (mplayer detection, ...)
768         * src/gpodder/libgpodder.py: Use util.find_command to detect the
769         existence of the "gnome-btdownload" command and spit out a warning log
770         message when the command is not available
771         * src/gpodder/libipodsync.py: Use util.find_command to check for an
772         installed mplayer binary (instead of relying on os.system("which...")
774 Mon, 05 Nov 2007 01:12:15 +0100 <thp@perli.net>
775 Better command detection for the converter library
777         * src/gpodder/libconverter.py: Detect existence of commands before
778         invoking them for converting files; based on a patch by
779         Nick (nikosapi.org); ConverterCollection is now a dict itself :)
780         * src/gpodder/util.py: Add new find_command() function that will
781         search the system's PATH for a specific executable command
783 Mon, 05 Nov 2007 00:21:39 +0100 <thp@perli.net>
784 Remove extracted cover art when deleting episode files
786         * src/gpodder/util.py: Apply modified version of a patch from
787         Nick (nikosapi.org) that is better suited for deleting cover art that
788         has been extracted with the new eyeD3 cover art extraction code
790 Mon, 05 Nov 2007 00:17:12 +0100 <thp@perli.net>
791 Patch from Nick (nikosapi) to support eyeD3 cover art extraction
793         * src/gpodder/libipodsync.py: Apply modified version of a patch from
794         Nick (nikosapi.org) to utilize eyeD3 for cover art extraction in iPod
795         sync code; remove dependency on PyID3
796         * README: PyID3 is not a dependency anymore, as we can now use eyeD3
797         for the same purpose (cover art extraction)
799 Sat, 03 Nov 2007 14:14:09 +0100 <thp@perli.net>
800 Fix format_filesize() function to be standards-conformant (unit prefixes)
802         * src/gpodder/config.py: Add "use_si_units" configuration option; if
803         True, the user will see SI units (MB, kB, ...); if False (the
804         default); the user will see binary-prefix units (MiB, KiB, ..)
805         * src/gpodder/libgpodder.py: Add pass-through function
806         "format_filesize()" to gPodderLib that combines the
807         util.format_filesize function with the gPodder-specific config option
808         * src/gpodder/util.py: Apply a modified patch from Gerrit Sangel
809         <z0idberg@gmx.de> to add support for SI units and binary prefixes to
810         format_filesize(); this makes the function standards-compliant
811         * src/gpodder/download.py: Updated to use new format_filesize
812         * src/gpodder/gui.py: Updated to use new format_filesize
813         * src/gpodder/libpodcasts.py: Updated to use new format_filesize
815 Fri, 02 Nov 2007 17:28:05 +0100 <thp@perli.net>
816 New Configuration/Settings Manager; massive code clean-ups
818         * src/gpodder/config.py: Added new Configuration Manager that
819         automatically keeps track of saving changed values and is also able to
820         watch GTK widgets for changes; this should simplify our settings
821         management and give us a single place for maintaining settings
822         * src/gpodder/download.py: Access settings from new config manager
823         * src/gpodder/gui.py: Make use of new config manager to connect
824         widgets and settings from the GUI directly to the config manager;
825         remove manual loading and saving of settings; auto-connect as much as
826         possible in the gPodderProperties dialog to get real-time automatic
827         configuration saving; fix the other code to use new config manager
828         * src/gpodder/libgpodder.py: MASSIVE code clean-up; removed lots of
829         old cruft and dead code that has been lying around in libgpodder for
830         some time now; remove configuration code; utilize config manager;
831         unify DownloadHistory+PlaybackHistory in new HistoryStore class;
832         reduce number of import statements
833         * src/gpodder/libipodsync.py: Access settings from new config manager
834         * src/gpodder/libplayers.py: Removed dotdesktop_command()
835         * src/gpodder/libpodcasts.py: Move locking functionality into this
836         module, as locking is only used here; access config from new manager
837         * src/gpodder/services.py: Use config manager to get settings
838         * src/gpodder/util.py: Add format_desktop_command() function, based on
839         the dotdesktop_command() function from libplayers
841 Fri, 02 Nov 2007 07:49:38 +0100 <thp@perli.net>
842 Add ability to open download folder from channel's context menu
844         * src/gpodder/gui.py: Add "Open download folder" menu item to channel
845         navigator context menu
846         * src/gpodder/libgpodder.py: Add open_folder() method that will open
847         the DE's default folder browser via "xdg-open"
849 Thu, 01 Nov 2007 15:29:00 +0100 <thp@perli.net>
850 Limit filename on FS-based sync to 50 characters
852         * src/gpodder/libipodsync.py: Do not allow extremely long file names
853         that could theoretically be generated by using data from RSS feeds;
854         this is needed to make FAT-based drives work with files that would
855         otherwise have file names that are too long
857 Wed, 31 Oct 2007 15:22:32 +0100 <thp@perli.net>
858 Escape RSS-provided strings in Pango markup
860         * src/gpodder/gui.py: Escape strings in Pango markup
861         * bin/gpodder: we're in development again, so "+svn"
863 Sun, 28 Oct 2007 16:27:14 +0100 <thp@perli.net>
864 gPodder 0.10.1 "Nukular, das Wort heißt Nukular" released
866         * bin/gpodder: gPodder 0.10.1 released :)
867         * doc/man/gpodder.1: gPodder 0.10.1 released :)
868         * README: gPodder 0.10.1 released :)
869         * data/messages.pot: Refreshed template from source files
870         * data/po/de.po: Updated German translation for the 0.10.1 release
871         * data/po/*.po: Refreshed translation files from template
873 Sun, 28 Oct 2007 15:25:56 +0100 <thp@perli.net>
874 Add "Save episode to file" handling to episode list context menu
876         * data/gpodder.glade: Use a stock "Save As" button for the "Copy
877         episode to file" button
878         * src/gpodder/gui.py: Add new show_copy_dialog() method to GladeWidget
879         that shows a copy dialog where a user can copy a file to a selected
880         destination (this is used for "Save episode to file"); use
881         show_copy_dialog in "Save As" in gPodderEpisode; add "Save episode to
882         folder" menu item in episode list context menu and use
883         show_copy_dialog to carry out the user interaction
885 Sun, 28 Oct 2007 13:30:40 +0100 <thp@perli.net>
886 Allow "https://" URLs for episode URLs, as we can handle these, too
888         * src/gpodder/util.py: Allow "https://" as a valid URL scheme, as we
889         can handle https URLs, thanks to Aravind Seshadri
890         <aravind@aravind.name> who initially reported this bug
892 Thu, 25 Oct 2007 14:00:01 +0200 <thp@perli.net>
893 Sync videos to the "Video Podcasts" playlist instead of the "Video" menu
895         * src/gpodder/libipodsync.py: Merged patch from Nicolas Quienot
896         <niqooo@gmail.com> to sync videos to the "Video Podcasts" menu instead
897         of the "Videos" menu, as documented on http://ipodlinux.org/ITunesDB
899 Tue, 23 Oct 2007 09:24:52 +0200 <thp@perli.net>a
900 sync_filename in podcastItem; cleanup; hide extra progressbar on transfer
902         * src/gpodder/gui.py: Use podcastItem's sync_filename(); hide the
903         unnecessary second progressbar when only syncing one channel (i.e.
904         when clicking on the "transfer" button in the main window
905         * src/gpodder/libgpodder.py: Remove unneeded lexists import and
906         warning; clean-up
907         * src/gpodder/libipodsync.py: Use podcastItem's sync_filename()
908         * src/gpodder/libpodcasts.py: Add sync_filename() to podcastItem,
909         returns the custom_sync_name or the title of the episode, based on the
910         user's configuration settings for FS-based MP3 player sync
912 Sun, 07 Oct 2007 14:38:31 +0200 <thp@perli.net>
913 Add wishlist items to TODO list from Paul and Wilfred
915         * TODO: New wishlist items, ideas and suggestions
917 Sat, 06 Oct 2007 12:39:57 +0200 <thp@perli.net>
918 Limit download progress status updates to reduce CPU load
920         * src/gpodder/download.py: Limit the amount of status updates the
921         download threads send to the DownloadStatusManager to one per second;
922         this should make gPodder less CPU-intensive with many parallel
923         downloads; thanks to Wilfred van Rooijen for reporting and testing
925 Tue, 02 Oct 2007 17:59:29 +0200 <thp@perli.net>
926 Update channel models (icons) after iPod synchronization
928         * src/gpodder/gui.py: Call update_model() on each channel after an
929         iPod sync, so we can update the played state on the available episodes
930         lists when played state was changed by the iPod sync
932 Sat, 29 Sep 2007 14:12:15 +0200 <thp@perli.net>
933 Fix loading of channel metadata (load auth data and settings)
935         * src/gpodder/libpodcasts.py: Load channel metadata when loading a
936         podcastChannel object from OPML/LocalDB. This fixes a problem with
937         authentication data being not loaded and also fixes a bug when the
938         custom-set channel title was not correctly used throughout the GUI.
939         Thanks to Nick (nikosapi) for reporting and providing a patch
941 Tue, 25 Sep 2007 22:02:19 +0200 <thp@perli.net>
942 Finally remove Desktop symlink code; several compatibility fixes
944         * src/gpodder/download.py: Prevent divide-by-zero errors when
945         calculating download speed
946         * src/gpodder/gui.py: Prevent divide-by-zero errors when calculating
947         percentage done in code for moving the downloaded items folder
948         * src/gpodder/libgpodder.py: Remove the "Symlink on Desktop" code,
949         because it's not GUI-accessible anymore and we didn't use it anyway
950         * src/gpodder/opml.py: Better local filename detection by using
951         os.path.exists() instead of .startswith('/'); this is also good for
952         cross-platform compatibility where parts don't usually start with a
953         forward slash (i.e. Win32)
955 Mon, 24 Sep 2007 00:09:44 +0200 <thp@perli.net>
956 Channel list selection bug fixes
958         * src/gpodder/gui.py: Fix some channel list-related problems and
959         annoyances, based on a patch by Nick (nikosapi)
960         * bin/gpodder: We're in development again, so "+svn"
962 Fri, 21 Sep 2007 02:07:43 +0200 <thp@perli.net>
963 gPodder 0.10.0 "Hier spricht Frank Drebin" released
965         * bin/gpodder: gPodder 0.10.0 released :)
966         * doc/man/gpodder.1: gPodder 0.10.0 released :)
967         * README: gPodder 0.10.0 released :) (and: updated dependencies)
968         * TODO: Updated TODO list (some items are done for 0.10.0 :)
970 Fri, 21 Sep 2007 02:05:10 +0200 <thp@perli.net>
971 Updated translations from Rosetta (Launchpad.net)
973         * data/po/es.po: Spanish translation by Julio Acuña
974         * data/po/pt.po: Portuguese translation by Joel Calado (completed :)
976 Fri, 21 Sep 2007 01:46:38 +0200 <thp@perli.net>
977 Fix problems with path selection in treeChannels
979         * src/gpodder/gui.py: Simple bugfix
981 Fri, 21 Sep 2007 00:32:51 +0200 <thp@perli.net>
982 Center gPodderEpisode on treeAvailable for less mouse hopping
984         * src/gpodder/gui.py: If possible, center the gPodderEpisode dialog
985         window on the treeAvailable, because that makes the position of the
986         opened dialog more predictable and easier to use (as if the
987         gPodderEpisode dialog was "inside" the treeView from which it opened)
989 Fri, 21 Sep 2007 00:07:49 +0200 <thp@perli.net>
990 Don't translate feed format string examples
992         * src/gpodder/gui.py: Don't mark format string examples as
993         translatable
995 Wed, 19 Sep 2007 17:21:09 +0200 <thp@perli.net>
996 Small bugfix for updating treeChannels when its model changes
998         * src/gpodder/gui.py: Bugfix
1000 Wed, 19 Sep 2007 16:57:41 +0200 <thp@perli.net>
1001 Removed channel combobox, drag'n'drop improvements + new channel cover editor
1003         * data/gpodder.glade: Remove comboAvailable in gPodder (main window);
1004         add download+clear button in gPodderChannel, rename some items that
1005         are now used in code; make the channel navigator non-shrinkable (so
1006         it is always visible, because we don't have comboAvailable anymore)
1007         * src/gpodder/gui.py: Remove support for the channel combo box,
1008         also known as comboAvailable; clean-up DND code and make treeChannels
1009         the only DND target in the main window; remove some unnecessary
1010         updating of the channel list (calls to updateComboBox);
1011         Changes for the gPodderChannel dialog: Don't automatically download
1012         channel cover when dialog pops up; add "Download" and "Clear" buttons
1013         to the cover editor; add DND support for dropping local files or
1014         images from the web browser to the cover editor (for setting custom
1015         covers on channels with bad or no cover)
1016         * src/gpodder/libgpodder.py: Don't abort get_image_from_url() if the
1017         URL is invalid, but the image has already been downloaded (because we
1018         read the downloaded image in the code when it exists, without URL)
1020 Wed, 19 Sep 2007 14:23:40 +0200 <thp@perli.net>
1021 Center feed update dialog on main window; scroll reset in chan.navigator
1022         * src/gpodder/gui.py: Reset the current scroll position of the channel
1023         navigator when re-loading the channel list; this fixes an annoyance
1024         that Alistair Sutton <alistair.sutton@gmail.com> reported when dealing
1025         with a HUGE channel list (more than 50 channels); also removed the
1026         scroll position reset code from treeAvailable, as we already managed
1027         to only edit the model instead of re-loading it every time; added code
1028         to really center the feed update dialog on gPodder's main window
1030 Tue, 18 Sep 2007 20:15:56 +0200 <thp@perli.net>
1031 Replace wget with new gpodder.download module; User-agent support
1033         * bin/gpodder: Set "gpodder.user_agent" field on startup; remove check
1034         for wget, as this is not needed anymore
1035         * src/gpodder/cache.py: Clean-up; remove old logging code; add support
1036         for gpodder.user_agent; log info when there is an error in parsing the
1037         feed, so the user knows why this feed is not cached
1038         * src/gpodder/console.py: Remove DownloadPool, Use new
1039         gpodder.download module for carrying out downloads, remove
1040         wget_version() tester, as this is not needed anymore =)
1041         * src/gpodder/download.py: Added new downloader module that uses
1042         urllib and some custom classes and functions to provide the equivalent
1043         functionality of the obsolete "libwget", but without the wget
1044         dependency and with better accuracy (progress reporting, etc..)
1045         * src/gpodder/gui.py: Utilize new gpodder.download module instead of
1046         libwget
1047         * src/gpodder/__init__.py: Add "user_agent" variable to the gpodder
1048         module that holds the value of the "User-agent" header to send to web
1049         servers when requesting OPMLs, Feeds or download data
1050         * src/gpodder/opml.py: Add support for sending the User-agent header
1051         * src/gpodder/services.py: Make the progress column a float column to
1052         have smoother progress indicuation; add the "acquired" keyword
1053         argument to s_release(); default 'speed' to a translated "Queued"
1054         * src/gpodder/libwget.py: Removed
1055         * doc/dev/redhat-wget-output.txt: Removed
1057 Tue, 18 Sep 2007 02:30:04 +0200 <thp@perli.net>
1058 Refreshed pot files and po templates; updated German translation
1060         * data/messages.pot: Refreshed from current source
1061         * data/po/de.po: Refreshed and updated translation
1062         * data/po/*.po: Refreshed from new .pot file
1064 Tue, 18 Sep 2007 02:19:19 +0200 <thp@perli.net>
1065 Imported updated translations from Rosetta (Launchpad.net)
1067         * data/po/it.po: Italian translation updated by FFranci72
1068         * data/po/nl.po: Dutch translation updated by Roel Groeneveld
1069         * data/po/pt.po: Portuguese translation updated by Joel Calado
1071 Tue, 18 Sep 2007 02:14:19 +0200 <thp@perli.net>
1072 Offline support for feedcache, faster startup, code simplification
1074         * src/gpodder/cache.py: Add support for "offline" keyword argument
1075         * src/gpodder/gui.py: Make intelligent use of "offline" keyword
1076         argument when passed to load_channels(); simplify code for selecting
1077         the active channel in updateComboBox()
1078         * src/gpodder/libpodcasts.py: Pass-through of "offline" keyword
1079         argument in all relevant function calls
1081 Sat, 15 Sep 2007 16:22:28 +0200 <thp@perli.net>
1082 New LocalDB using DOM (removes python-xml dependency); channel context menu
1084         * bin/gpodder: Don't check for xml.sax package and modules anymore, as
1085         the dependency on python-xml has been removed with this release
1086         * data/gpodder.glade: Remove the "info" button for the current channel
1087         * src/gpodder/gui.py: Remove localdb-related code and adopt code for
1088         new LocalDB code; add context menu to channel navigator (edit/delete)
1089         * src/gpodder/libipodsync.py: Don't import "liblocaldb" module
1090         * src/gpodder/liblocaldb.py: Removed
1091         * src/gpodder/liblocdbreader.py: Removed
1092         * src/gpodder/liblocdbwriter.py: Removed
1093         * src/gpodder/liblogger.py: Add "traceback" keyword argument to the
1094         log() function; if "True" and in debugging mode, print traceback
1095         * src/gpodder/libpodcasts.py: Merge code from old liblocaldb and
1096         liblocdbreader/liblocdbwriter to this module as LocalDBWriter and
1097         LocalDBReader; customize podcastChannel to new LocalDB code
1098         * src/gpodder/libwget.py: Remove localdb-specific code (now obsolete)
1100 Wed, 12 Sep 2007 23:07:23 +0200 <thp@perli.net>
1101 Fix a bug when traversing directories with loop symlinks
1103         * src/gpodder/util.py: Don't dive into subdirectories that are
1104         symbolic links, this is to avoid a situation where looping symlinks
1105         result in the function dead-locking in a endless recursive loop,
1106         thanks to Bjørn Rasmussen <bjoernr@sensewave.com> for pointing that
1107         out and providing the necessary bug report to fix this issue
1109 Sun, 09 Sep 2007 18:47:20 +0200 <thp@perli.net>
1110 Mark episodes as downloaded/deleted when deleting episodes
1112         * src/gpodder/gui.py: Rename "Mark [...] as downloaded" to "Mark [...]
1113         as deleted" and mark episodes as downloaded when removing selected
1114         episodes that have not been downloaded yet, as suggested by Holger
1115         Leskien <holger leskien.com>
1116         * src/gpodder/libpodcasts.py: Fix problem when trying to delete
1117         episodes that have not been downloaded
1119 Sat, 08 Sep 2007 16:45:21 +0200 <thp@perli.net>
1120 Support for customized file names in MP3 player sync code
1122         * src/gpodder/gui.py: Add supporting code for reading/setting
1123         configuration options for the preferences dialog and a help display
1124         code that displays a guide on how to write custom sync name strings
1125         * src/gpodder/libgpodder.py: New configuration options:
1126         custom_sync_name (holds format string) and
1127         custom_sync_name_enabled (boolean, if the above string should be used)
1128         * src/gpodder/libipodsync.py: Use custom sync name format string and
1129         util's object_string_formatter() function to obtain a file name for
1130         the synchronized episode (or default to episode.title if disabled)
1131         * src/gpodder/libpodcasts.py: Add new property methods to podcastItem:
1132         basename (returns the basename of the URL, without extension) and
1133         published (returns the pubDate of the episode in YYYYMMDD format)
1134         * src/gpodder/util.py: New object_string_formatter() method that
1135         replaces {OBJECTNAME.ATTRNAME} substrings in a string with the
1136         corresponding values of passed-in keyword argument objects
1137         * data/gpodder.glade: Added preferences GUI elements
1139 Wed, 05 Sep 2007 10:14:09 +0200 <thp@perli.net>
1140 Check for installed python-xml package on startup (hard dependency)
1142         * bin/gpodder: Add dependency check for PyXML
1144 Sun, 02 Sep 2007 15:01:48 +0200 <thp@perli.net>
1145 Fix bug with default window title in gPodder window
1147         * src/gpodder/gui.py: Always set gPodder's default_title attribute
1149 Sun, 02 Sep 2007 14:33:21 +0200 <thp@perli.net>
1150 Updated Russian translation from Vladimir Zemlyakov
1152         * data/po/ru.po: Updated
1154 Sun, 02 Sep 2007 14:23:17 +0200 <thp@perli.net>
1155 More sanitizing hacks for ugly feeds we don't really like
1157         * src/gpodder/libpodcasts.py: Negotiate which enclosure to select from
1158         multiple enclosures, if there are more than one available; skip
1159         episodes with a buggy download URL (i.e. no supported URL scheme)
1160         * src/gpodder/util.py: Return "(unknown)" if file size cannot be
1161         determined from the string passed to format_filesize(); return "None"
1162         in file_type_by_extension() if the extension is an empty string
1164 Fri, 31 Aug 2007 23:38:01 +0200 <thp@perli.net>
1165 Handle enclosures (or lack thereof) better if fields are missing
1167         * src/gpodder/gui.py: Remove refetch_channel_list() function, as this
1168         is not called anywhere from the code (uh, how did i miss that?)
1169         * src/gpodder/libpodcasts.py: Be more liberal to enclosure tags
1170         without length or mime type; ignore episodes without enclosures (it's
1171         not len(enclosures) == 0, but the enclosures attribute doesn't even
1172         exist on entries without enclosures, so make sure to check for that
1174 Fri, 31 Aug 2007 20:03:03 +0200 <thp@perli.net>
1175 Use Python's webbrowser module for URL opening; channel dialog clean-up
1177         * bin/gpodder: Set version to 0.9.5+svn (this is where we are now)
1178         * data/gpodder.glade: Remove "cancel" button from gPodderChannel
1179         * src/gpodder/gui.py: Use "webbrowser" module for URL opening instead
1180         of relying on "gnome-open" to be available; remove event handler for
1181         gPodderChannel's "cancel" button
1183 Thu, 30 Aug 2007 21:06:28 +0200 <thp@perli.net>
1184 Dependency check for python-feedparser in bin/gpodder
1186         * bin/gpodder: Add dependency check and warning (with exit) if
1187         python-feedparser is not installed, as python-feedparser now is a
1188         dependency of gPodder
1190 Thu, 30 Aug 2007 20:51:46 +0200 <thp@perli.net>
1191 Support for modifying DownloadHistory and PlaybackHistory in GUI
1193         * data/gpodder.glade: Added menu items in gPodder main window
1194         * src/gpodder/gui.py: Add menu items to treeAvailable's context menu
1195         to toggle/set downloaded and played status on selected episodes
1196         * src/gpodder/libgpodder.py: Add del_item() function to
1197         DownloadHistory to support removing items from the history list;
1198         enhance history_mark_{played,downloaded}() functions for add/delete
1200 Thu, 30 Aug 2007 20:46:48 +0200 <thp@perli.net>
1201 Improved pubDate parsing; episode delete bugfix
1203         * src/gpodder/libpodcasts.py: Let feedparser parse the pubDate field
1204         of episodes and use new function in gpodder.util to convert the parsed
1205         pubDate to a string; bugfix for remove downloaded episode by URL
1206         * src/gpodder/util.py: Add updated_parsed_to_rfc2822() function that
1207         converts the "updated_parsed" field from feedparser to a RFC2822
1208         string
1210 Thu, 30 Aug 2007 12:03:24 +0200 <thp@perli.net>
1211 Remove obsolete documentation in doc/dev; cosmetic changes
1213         * data/po/Makefile: Upgrade to GPLv3
1214         * data/po/README: Mention i18n page on gPodder's website
1215         * doc/dev/build-deps-breezy.txt: Removed
1216         * doc/dev/debian.txt: Removed
1217         * doc/dev/i18n.txt: Removed
1218         * doc/dev/porting.txt: Removed
1219         * doc/dev/svncl.sed: Upgrade to GPLv3; modify look added and removed
1220         files
1222 Wed, 29 Aug 2007 20:26:50 +0200 <thp@perli.net>
1223 Upgrade to the GNU General Public License, Version 3
1225         * bin/gpodder: Upgrade to GPLv3
1226         * COPYING: Upgrade to GPLv3
1227         * doc/dev/copyright_notice: Upgrade to GPLv3
1228         * Makefile: Upgrade to GPLv3
1229         * README: Upgrade to GPLv3
1230         * setup.py: Upgrade to GPLv3
1231         * src/gpodder/*.py: Upgrade to GPLv3 (except for SimpleGladeApp and
1232         cache, as these are LGPL or other and do not originate from gPodder)
1234 Wed, 29 Aug 2007 19:32:22 +0200 <thp@perli.net>
1235 Integration changes, commit and ChangeLog migration
1237         * doc/dev/svncl.sed: Use tabs instead of 8 spaces for ChangeLog edit
1238         * Makefile: Make $EDITOR edit "ChangeLog" directly
1240 Wed, 29 Aug 2007 19:17:36 +0200 <thp@perli.net>
1241 Last batch of experimental change merges (up to svn r398)
1243         * doc/dev/tepache-howto.txt: Removed
1244         * doc/dev/tepache: Removed
1245         * src/gpodder/gui.py.orig: Removed
1246         * src/gpodder/libwget.py: Send progress = 0.0 on inital status update
1247         * src/gpodder/libpodcasts.py: Try to get episode metadata from several
1248         different properties of the corresponding feedparser entries; warn
1249         user when we couldn't get the episode title and try to get the episode
1250         title from the filename of the URL if we still have not found an
1251         episode title
1252         * src/gpodder/libgpodder.py: Add get_device_name() that returns a
1253         "nice" representative string of the currently selected device that can
1254         be used to represent the device in the GUI
1255         * src/gpodder/util.py: Return "(unknown)" string when bytesize in
1256         format_filesize() when the size has a negative value; make
1257         get_tree_icon() catch errors and be more corrent with icon creation;
1258         add get_first_line() function that extracts the first line of a string
1259         * src/gpodder/libipodsync.py: Add "divx" to list of video extensions
1260         * src/gpodder/services.py: DownloadStatusManager has a new observer
1261         notification: "progress-detail"; add unregister() functionality for
1262         observers; add request_progress_detail() function that can be used to
1263         force a "progress-detail" notification to be sent out to all relevant
1264         observers; remove get_url_by_iter() function as it is not needed
1265         anymore
1266         * src/gpodder/gui.py: Clean-up after tepache dependency removal; new
1267         GladeWidget base class that subclasses SimpleGladeApp and simplifies
1268         class creation for our gPodder windows; add context menu to
1269         treeAvailable; re-work play_or_download() and make it return a list of
1270         boolean indicators on which actions can be performed on the selected
1271         items; move show_message() and show_confirmation() to GladeWidget;
1272         disable editing of the URL in the channel info dialog, this simplifies
1273         code and editing the URL doesn't make so much sense anyway (adding the
1274         new url and removing the old does the same and is easier, code-wise);
1275         add support for cancelling downloads in the available podcasts view;
1276         support live status view and download cancelling in the gPodderEpisode
1277         dialog window by hooking up to DownloadStatusManager as observer
1278         * src/gpodder/SimpleGladeApp.py: Customize for gPodder (remove usage
1279         of weakref for keyword arguments -> properties of new object)
1280         * bin/gpodder: We're using a experimental development version now
1281         * data/gpodder.glade: Add progress bar and associated buttons to
1282         gPodderEpisode dialog
1283         * MANIFEST.in: Removed gpodder.py.orig inclusion
1284         * Makefile: Removed support for tepache
1286 Wed, 29 Aug 2007 19:05:57 +0200 <thp@perli.net>
1287 More changes from the experimental branch (up to svn r382)
1289         * src/gpodder/liblocdbreader.py: Clean-up
1290         * src/gpodder/libwget.py: Use "gpodder.services" instead of accepting
1291         a generic download status manager as constructor parameter; remove
1292         downloadStatusManager class (moved to gpodder.services)
1293         * src/gpodder/console.py: More clean-ups; use get_new_episodes()
1294         instead of duplicating code here; simplify the code for wget version
1295         detection
1296         * src/gpodder/libpodcasts.py: Improve channel/episode generation from
1297         feedparser objects (with error handling); utilize download status
1298         manager from "gpodder.services" instead of accepting a download status
1299         manager as parameter; clean up unneeded functions and rename some
1300         functions to make the code more readable; use util.get_tree_icon() for
1301         compositing a nice icon; remove the "played" column from the
1302         treemodel; add local_filename to treemodel
1303         * src/gpodder/liblocdbwriter.py: Clean-up
1304         * src/gpodder/libgpodder.py: Clean-up
1305         * src/gpodder/util.py: Add torrent_filename() function that tries to 
1306         extract the filename of the file a .torrent file contains; add
1307         file_extension_from_url() function that returns the file extension in
1308         a URL; add file_type_by_extension() that returns the type of a file
1309         based on its extension; add get_tree_icon() that loads a named icon
1310         and optionally adds a bullet to it (unplayed status indicator)
1311         * src/gpodder/libipodsync.py: Clean-up
1312         * src/gpodder/services.py: New module that currently contains the
1313         improved DownloadStatusManager and a single object that servces as
1314         download status manager for all parts of gpodder
1315         * src/gpodder/gui.py: Only one column for status/played; use
1316         "gpodder.services" for the download status manager; clean-up
1317         * src/gpodder/liblocaldb.py: Clean-up
1318         * bin/gpodder: Clean-up
1319         * data/gpodder.glade: Clean-up; removed "show played column"
1320         preference in gPodderProperties dialog
1322 Wed, 29 Aug 2007 18:49:37 +0200 <thp@perli.net>
1323 First import from experimental branch (up to svn r375)
1325         * src/gpodder/librssreader.py: Removed in favor of python-feedparser
1326         * src/gpodder/libwget.py: Percentage is now a float, don't set to 0
1327         when there has been an error
1328         * src/gpodder/console.py: Use {load,save}_channels methods; code
1329         cleanup and simplification
1330         * src/gpodder/cache.py: Add python-feedcache module from Doug Hellman
1331         * src/gpodder/libpodcasts.py: Use opml and feedcache for channel list
1332         and RSS reading; use shelve for new ChannelSettings class; clean-up
1333         podcastChannel and podcastItem; better TreeModel generator for
1334         podcastChannel (try to cache the model, only updates icons, etc...);
1335         remove downloadRss method in podcastChannel; move DownloadHistory and
1336         Playbackhistory to libgpodder; new load_channels() and save_channels()
1337         functions to save/load the channel list to an OPML file
1338         * src/gpodder/libgpodder.py: BIG clean-up; remove gPodderChannelWriter
1339         and gPodderChannelReader (this is now in libpodcasts as simple
1340         functions); add DownloadHistory and PlaybackHistory from libpodcasts; 
1341         * src/gpodder/gui.py: Use new functions for channel list
1342         loading/saving; only update treemodel for treeAvailable when it's
1343         really necessary
1344         * src/gpodder/liblocaldb.py: Remove unnecessary functions that have
1345         not been used for a while (treemodel-related); use load_channels()
1346         instead of gPodderChannelReader
1349 Wed, 29 Aug 2007 18:31:16 +0200 <thp@perli.net>
1350         * ChangeLog: Older changes can be found on the gPodder website at
1351         http://gpodder.berlios.de/releases/0.9.5/ChangeLog