Thu, 10 Jul 2008 23:49:12 +0200 <thp@perli.net>
[gpodder.git] / ChangeLog
blob6a356423d70b6a45338e9cacbb6a9fb70d3f6ff2
1 Thu, 10 Jul 2008 23:49:12 +0200 <thp@perli.net>
2 Don't warn the user when timestamp is None
4         * src/gpodder/util.py: Don't warn the user when timestamp is None in
5         gpodder.util.format_date; Thanks to Bernd Schlapsi for reporting this
6         bug (Closes: http://bugs.gpodder.org/show_bug.cgi?id=148)
8 Wed, 09 Jul 2008 12:19:26 +0200 <thp@perli.net>
9 Simply advanced configuration editor, implement usability suggestions
11         * data/gpodder.glade: Implement usability suggestions from
12         http://gpodder.org/files/user_test_2008-05.pdf: Rename "Player" tab in
13         preferences to "Device"; change "Filter:" to "Search for:" in advanced
14         configuration editor
15         * src/gpodder/config.py: Support code for changes in the advanced
16         configuration editor dialog (model)
17         * src/gpodder/gui.py: Modify the advanced configuration editor to have
18         check boxes for boolean values, remove the "Type" column and rename
19         the columns as suggested by the May 2008 user test; use italic font
20         instead of bold for values set to something other than the default
22 Tue, 08 Jul 2008 21:25:24 -0400 <me@nikosapi.org>
23 Merge check free space before syncing patch
25         * src/gpodder/gui.py: Display a dialog box informing the user in the
26         event that there is insufficient free space on their device before
27         syncing begins.
28         * src/gpodder/sync.py: Added Device.tracks_list which is populated by
29         Device.get_all_tracks() when Device.open() is called. 
30         Added Device.episode_on_device(episode)
31         Added Device.get_free_space()
33 Tue, 08 Jul 2008 21:10:48 -0400 <me@nikosapi.org>
34 Small bugfixes
36         * src/gpodder/gui.py: for bluetooth file transfer make sure
37         episode.sync_filename() doesn't contain any troublesome characters
38         eg. some episodes include / in the title
39         * src/gpodder/libpodcasts.py: comment out mimetype logging, it gets
40         annoying after a while...
41         * src/gpodder/util.py: remove "path = os.path.dirname(path)" from
42         get_free_disk_space(path), this prevented the real free disk space
43         from being reported
45 Sun, 06 Jul 2008 23:11:33 +0200 <thp@perli.net>
46 Update book donators list
48         * src/gpodder/gui.py: Add PhilF to list of book donators
50 Sat, 05 Jul 2008 15:23:55 -0400 <me@nikosapi.org>
51 Support episodes without a guid during migration (patch from Justin Forest)
53         * src/gpodder/dbsqlite.py: Don't raise an exception if an episode is
54         missing a guid
55         * src/gpodder/libpodcasts.py: Make sure that episodes from LocalDBReader
56         always contain some kind of guid
58 Fri, 04 Jul 2008 13:25:12 -0400 <me@nikosapi.org>
59         * src/gpodder/gui.py: fix traceback when deleting episodes from device
61 Fri, 04 Jul 2008 18:47:19 +0200 <thp@perli.net>
62 New look for the "pill" pixbuf
64         * src/gpodder/draw.py: Refresh the look of the "pill" pixbuf code, so
65         we have a more visually pleasing status display in the podcast list
67 Thu, 03 Jul 2008 20:09:18 -0400 <me@nikosapi.org>
68 Display message if user tries to sync to iPod without gpod installed
70         * src/gpodder/gui.py: Add an informative self.notification() if the user
71         attempts to sync an iPod without the libgpod python bindings installed
72         * src/gpodder/sync.py: Add sync.gpod_available, Add Device.errors to
73         prevent a crash in the event of an error
75 Thu, 03 Jul 2008 20:26:50 +0200 <thp@perli.net>
76 Update list of book donators
78         * src/gpodder/gui.py: Add Franz Seidl to list of book donators
80 Tue, 01 Jul 2008 22:46:52 -0400 <me@nikosapi.org>
81 Better file extension detection using feed items' mimetypes
83         * src/gpodder/gui.py: Use episode.file_type() instead of 
84         util.file_type_by_extension(util.file_extension_from_url(url))
85         * src/gpodder/libgpodder.py: Use episode.file_type() instead of          
86         util.file_type_by_extension(util.file_extension_from_url(url))
87         * src/gpodder/libpodcasts.py: Add new column to the channel list
88         gtk.ListStore for holding the file extension. Add extension()
89         function to podcastItem which makes use mimetype in the event that
90         filename_from_url()[1] returns None
91         * src/gpodder/util.py: file_extension_from_url is renamed to 
92         filename_from_url and returns (filename, extension)
93         Added extension_from_mimetype(mimetype)
95 Mon, 30 Jun 2008 17:39:36 +0200 <thp@perli.net>
96 Do not update podcast list when closing channel window (patch by Justin Forest)
98         * src/gpodder/gui.py: Do not update podcast list when closing the
99         channel window, saves some CPU cycles. Patch by Justin Forest
100         (Closes: http://bugs.gpodder.org/show_bug.cgi?id=135)
102 Sun, 29 Jun 2008 16:59:30 -0400 <me@nikosapi.org>
103 Merge patch from Justin Forest and Thomas Perl:
104 - Use SQLite instead of cPickle to store all data, including feed summary
105 and entries, download and play history. 
106 - Migration assistant to import the old cPickle files in to the SQLite DB
107         * src/gpodder/cache.py: SQLite-related accomodations 
108         * src/gpodder/console.py: SQLite-related accomodations
109         * src/gpodder/dbsqlite.py: New file, SQLite interface for gPodder
110         * src/gpodder/gui.py: Lots of changes to accomodate the new SQLite
111         DB + new migration assistant code
112         * src/gpodder/libgpodder.py: Added gPodderLib.migrate_to_sqlite().
113         HistoryStore and ChannelSettings are marked as DEPRECATED
114         * src/gpodder/libpodcasts.py: SQLite-related accomodations and new 
115         code for setting/determining episode state
116         * src/gpodder/sync.py: SQLite-related accomodations
117         * src/gpodder/trayicon.py: Use episode.was_downloaded() instead
118         of episode.is_downloaded()
119         * src/gpodder/util.py: SQLite-related accomodations
121 Sun, 29 Jun 2008 16:15:54 +0200 <jerome.chabod@ifrance.com>
122 Fix a bug in shutil when moving the download directory bug (#8)
124         * src/gpodder/libgpodder.py: When the shutil.move() bug is detected 
125         (an NameError is thrown when moving from an ext file sytem to a 
126         fat or ntfs filesystem, see http://bugs.python.org/issue2549), 
127         the error is ignored, then the previous directory is removed 
128         by a system call to "rm"
130 Thu, 19 Jun 2008 10:50:11 +0200 <thp@perli.net>
131 Fix OPML dialog button sensitivity; sensitivity+totals for Episode Selector
133         * src/gpodder/gui.py: Fix the sensitivity setting of the OPML lister
134         when using the "Select All"/"Select None" buttons; add button
135         sensitivity setting code to Episode Selector and add episode count
137 Thu, 19 Jun 2008 09:46:38 +0200 <thp@perli.net>
138 Fix alignment of "pill" pixbuf
140         * src/gpodder/gui.py: Align the "pill" pixbuf all to the right
142 Thu, 19 Jun 2008 09:30:53 +0200 <thp@perli.net>
143 Use as much space as possible for podcast title and description
145         * src/gpodder/gui.py: Hide the "pill" pixbuf cell when we don't have a
146         value to display, so we can show more of the channel title +
147         description
148         * src/gpodder/libpodcasts.py: Add a new boolean value to tell the
149         treeview column if we need to show the "pill" cell or not
151 Tue, 17 Jun 2008 19:41:33 -0400 <me@nikosapi.org>
152 Add 'Select All' and 'Select None' buttons to gPodderOpmlLister
154         * data/gpodder.glade: add 'Select All' and 'Select None' buttons to 
155         the the bottom-left of the gPodderOpmlLister window
156         * src/gpodder/gui.py: add button signal handlers and a function
157         ( select_all(bool) ) to facilitate selecting all or no channels
159 Tue, 17 Jun 2008 14:49:12 +0200 <thp@perli.net>
160 Make handling pubDates a bit safer when reading it externally
162         * src/gpodder/libpodcasts.py: Make handling of pubDates a bit more
163         secure and easier
164         * src/gpodder/gui.py: Add Daniel Ramos to list of donators and bug
165         reporters
167 Sun, 15 Jun 2008 14:44:29 +0200 <thp@perli.net>
168 Merge "Allows user command execution after certain events" from Paul Rudkin
170         * src/gpodder/config.py: Add two new configuration options:
171         cmd_all_downloads_complete and cmd_download_complete
172         * src/gpodder/download.py: Call the user-specific command when a
173         download finishes (if configured)
174         * src/gpodder/gui.py: If all downloads have been completed, execute
175         the user-specific command (if configured)
176         * src/gpodder/libgpodder.py: Add ext_command_thread function that
177         handles calling an external command
178         (Closes: http://bugs.gpodder.org/show_bug.cgi?id=4)
180 Sun, 15 Jun 2008 14:23:40 +0200 <thp@perli.net>
181 Support tooltips for the episode list; improve tooltip appearance
183         * src/gpodder/gui.py: Add tooltips to treeAvailable (episode list);
184         avoid showing tooltips while the context menu of the treeChannels and
185         treeAvailable is open, so the tooltip doesn't appear over the context
186         menu; add Sebastian Krause to list of bug reporters
187         * src/gpodder/util.py: Try to convert some HTML tags to text-only
188         characters (<br> to newline, <li> to a "*", etc..) so the description
189         of an episode is easier to read and looks more structured; also,
190         convert more than two subsequent newlines to maximum two newlines
191         (Closes: http://bugs.gpodder.org/show_bug.cgi?id=126)
193 Sat, 14 Jun 2008 12:29:11 -0400 <me@nikosapi.org>
194         * src/gpodder/libpodcasts.py: make LocalDBReader and LocalDBWriter
195         read/save the episode mimetype attribute in the LocalDB. This 
196         prevents the mimetype attribute from being set to 
197         'application/octet-stream' after a file is downloaded.
199 Sat, 14 Jun 2008 18:50:29 +0200 <thp@perli.net>
200 Improve performance related to pubDate parsing; Download button; update feeds
202         * src/gpodder/gui.py: Notify user when we are building the list of
203         channels instead of staying at "updating [last feed]".; Make the "OK"
204         button of the gPodderEpisodeSelector a "Downlaod" button, because
205         that's what the button does when clicking it - downloading episodes
206         * src/gpodder/libpodcasts.py: pubDate is now an Unix timestamp
207         everywhere and not a string, which has to be parsed quite often; Fix
208         up and improve the creation of the channel list model
209         * src/gpodder/sync.py: Customizations for the new pubDate code
210         * src/gpodder/util.py: Remove updated_parsed_to_rfc2822, because we
211         don't need it anymore with the new pubDate code
213 Sat, 14 Jun 2008 15:56:53 +0200 <thp@perli.net>
214 Make things less verbose and fix a problem with cover art handling
216         * src/gpodder/gui.py: Fix problem when trying to remove a non-existent
217         podcast cover art from the cache; make things less verbose
218         * src/gpodder/*.py: Make things less verbose
220 Sat, 14 Jun 2008 15:16:09 +0200 <thp@perli.net>
221 Detect HTML and OPML content when adding a podcast subscription
223         * src/gpodder/gui.py: Detect HTML and OPML content when adding a
224         podcast feed that is not parseable by feedparser; when the content
225         suggests the file is an OPML file, open the OPML dialog, when it looks
226         like an HTML file, ask the user if she wants to browse the content
227         with the web browser and look for a suitable XML/feed URL
228         (This fixes the first suggestion in the May 2008 Usability Evaluation)
230 Fri, 13 Jun 2008 21:32:57 +0200 <thp@perli.net>
231 Automatically download channel cover file; improve channel cover handling
233         * data/gpodder.glade: Simplify and clean-up the podcast editor dialog,
234         especially with respect to the cover art stuff
235         * src/gpodder/config.py: Add configuration option
236         "podcast_list_icon_size" that determines the pixel size of the cover
237         art displayed in the podcast list
238         * src/gpodder/gui.py: Add cover cache, register with the cover
239         downloader service in the main window, handle messages from the cover
240         downloader (removed and download finished); request covers for
241         channels when refreshing the channel list; make sure drag'n'drop of
242         image files to the channel list works directly and sets the
243         corresponding channel cover; Rework cover download handling and add an
244         open dialog as suggested by the May 2008 Usability Evaluation
245         * src/gpodder/libgpodder.py: Remove old, attic image downloading code
246         from gPodderLib, because it now has its own service class
247         * src/gpodder/libpodcasts.py: Remove unneeded get_cover_pixbuf helper
248         function for podcastChannel; improve channels_to_model to take
249         advantage of the new cover downloader service
250         * src/gpodder/services.py: Add CoverDownloader service that acts as a
251         central hub for all downloading and modifying of channel cover art,
252         including notification of observers (through ObservableService)
253         * src/gpodder/util.py: Add resize_pixbuf_keep_ratio helper function to
254         resize a gtk pixbuf while keeping the aspect radio (with optional
255         caching support through a dictionary parameter)
256         (Closes: http://bugs.gpodder.org/show_bug.cgi?id=88)
258 Fri, 13 Jun 2008 20:10:13 +0200 <thp@perli.net>
259 Fix a bug in the experimental file naming support
261         * src/gpodder/util.py: Fix bug that stopped the experimental file
262         naming patch from working; thanks to Shane Donohoe for reporting
264 Fri, 13 Jun 2008 16:08:16 +0200 <thp@perli.net>
265 Merge patch to add experimental support for "normal" file naming
267         * src/gpodder/config.py: New option "experimental_file_naming" that
268         defaults to False and enables the new (but experimental!) normal file
269         naming mode in which the downloaded podcast episodes get their name
270         not from the md5sum of the download URL, but from the basename of the
271         download URL, which makes filenames more human-readable
272         * src/gpodder/libpodcasts.py: Change local_filename() in podcastItem
273         to decide if we use md5sums or the "new" file naming mode for creating
274         the local file name of an episode
275         * src/gpodder/sync.py: Change usage of the "encoding" detection in
276         gpodder.util (from detect_os_encoding() to simply encoding)
277         * src/gpodder/util.py: Only detect the filename encoding once (at
278         program start) and then make it accessible via a global "encoding"
279         variable in the gpodder.util module; add improvements to
280         file_extension_from_url() to be able to return the complete filename
281         and to support more creative URL schemes as implemented by podcast
282         feed authors (this hopefully makes more feeds work in a proper way)
283         (Closes: http://bugs.gpodder.org/show_bug.cgi?id=57)
285 Fri, 13 Jun 2008 14:27:30 +0200 <thp@perli.net>
286 Merge patch from Justin Forest to speed up pubDate detection
288         * src/gpodder/gui.py: Add Justin Forest to the list of contributors
289         and make sure we clear the pubDate cache in the channel when changing
290         episode downloaded status manually
291         * src/gpodder/libpodcasts.py: Merge patch from Justin Forest to speed
292         up the newest_pubdate_downloaded() function by caching its value
293         instead of re-calculating it on every call
294         (Closes: http://bugs.gpodder.org/show_bug.cgi?id=124)
296 Fri, 13 Jun 2008 09:37:45 +0200 <thp@perli.net>
297 Merge patch from Nick to add support for deleting played files on sync
299         * data/gpodder.glade: Add check button for "Delete episodes on device
300         that have been marked played in gPodder"
301         * src/gpodder/config.py: Add two new config options:
302         "mp3_player_delete_played" and "mp3_player_max_filename_length"
303         * src/gpodder/gui.py: 
304         * src/gpodder/libpodcasts.py: Add "is_deleted()" convenience function
305         for a podcast episode
306         * src/gpodder/sync.py: Clean-up and simplify parts of the code to make
307         it better-structured and avoid code duplication; use the configuration
308         variable for the MAX_FILENAME_LENGTH instead of hard-coding it to 100
309         * src/gpodder/util.py: Split sanitize_filename() into two functions,
310         detect_os_encoding() and sanitize_filename() for better code re-use
311         (Closes: http://bugs.gpodder.org/show_bug.cgi?id=56; code written by
312         Nick (nikosapi) and initial idea by Shane Donohoe, see the bug page)
314 Sun, 08 Jun 2008 20:08:58 +0200 <thp@perli.net>
315 Patch from Jérôme Chabod to fix "minimize on start" bug (#123)
317         * src/gpodder/gui.py: Patch from Jérôme Chabod to fix "minimize on
318         start" bug by moving the minimizing code after the "show window" code
319         (Closes: http://bugs.gpodder.org/show_bug.cgi?id=123)
321 Sun, 08 Jun 2008 20:06:51 +0200 <thp@perli.net>
322 Updated Portuguese translation by João Paulo Pinto Trindade
324         * data/po/pt.po: Updated PT translation by João Paulo Pinto Trindade
326 Thu, 05 Jun 2008 18:16:05 +0200 <thp@perli.net>
327 Improve/fix podcast list tooltips as suggested by the Usability Test
329         * src/gpodder/gui.py: Restructure and redesign the podcast list
330         according to the suggestions in the Usability Test
331         * src/gpodder/libpodcasts.py: Add helping code for the new tooltips
333 Thu, 05 Jun 2008 18:12:20 +0200 <thp@perli.net>
334 New (optional) dependency: PIL (for Rockbox Cover Art)
336         * README: Mention PIL as dependency for Rockbox Cover Art
338 Thu, 05 Jun 2008 18:10:11 +0200 <thp@perli.net>
339 Merge Support for Rockbox Cover Art patch (by David Spreen and Nick)
340         * src/gpodder/config.py: Add configuration options for rockbox cover
341         art, thanks to Nick for providing the patch and integration
342         * src/gpodder/gui.py: Add David Spreen to the list of contributors
343         * src/gpodder/sync.py: Merge patch from David Spreen and Nick to
344         support Rockbox cover art synchronization
346 Sun, 01 Jun 2008 10:17:32 +0200 <thp@perli.net>
347 Merge back changes from the 0.11.3 release branch into trunk
349         * bin/gpodder: Updated for 0.11.3+svn
350         * data/messages.pot: Merged from 0.11.3 release branch
351         * data/po/*.po: Merged from 0.11.3 release branch
352         * doc/man/gpodder.1: Merged from 0.11.3 release branch
353         * README: Merged from 0.11.3 release branch
355 Sun, 25 May 2008 17:17:10 +0200 <thp@perli.net>
356 Fix problem with BitTorrent preferences
358         * src/gpodder/gui.py: Merge bugfix patch by Nick (nikosapi) to make
359         the BitTorrent preferences work correctly
361 Sun, 25 May 2008 17:10:36 +0200 <thp@perli.net>
362 Updated Spanish and Swedish translations
364         * data/po/es.po: Updated Spanish translation by Marcos Hernández
365         * data/po/sv.po: Updated Swedish translation by Anders Kvist
366         * src/gpodder/gui.py: Add Marcos Hernández to list of contributors,
367         because he did the updated Spanish translation
369 Fri, 23 May 2008 21:39:32 +0200 <thp@perli.net>
370 Updated French translation by Jérôme Chabod
372         * data/po/fr.po: Updated French translation by Jérôme Chabod
374 Mon, 19 May 2008 15:12:41 +0200 <thp@perli.net>
375 Updated translations before the release stabilization phase
377         * data/messages.pot: Updated from source
378         * data/po/*.po: Updated from messages.pot
380 Fri, 16 May 2008 10:02:23 +0200 <thp@perli.net>
381 Add option to not hide channel cover and pill when the sidebar gets smaller
383         * src/gpodder/config.py: Add "podcast_sidebar_save_space" option
384         * src/gpodder/gui.py: Don't hide the channel cover and pill in the
385         podcast list when the sidebar gets smaller; idea by Shane Donohoe
387 Wed, 14 May 2008 15:34:25 +0200 <thp@perli.net>
388 Download start performance improvements; fix podcast list handling
390         * data/gpodder.glade: Convert the gPodderAddPodcastDialog from a
391         GtkWindow to a real GtkDialog to make Escape key work and set the URL
392         entry box to activate the "Add" button when Enter is pressed in it
393         * src/gpodder/gui.py: Fix podcast selection in updateComboBox, so the
394         currect podcast is selected when removing/adding podcasts; allow to
395         pass a URL which should be selected after the update; use
396         DownloadStatusManager's new batch mode to speed up starting many
397         downloads at once (very visible speed improvement); adding podcasts
398         has also been improved a bit with the new code
399         * src/gpodder/services.py: Support batch mode (i.e. only notify after
400         all episodes have been added to th download list); this speeds up the
401         UI when multiple episodes are downloaded at once
403 Wed, 14 May 2008 11:59:20 +0200 <thp@perli.net>
404 Updated Russian translation by Vladimir Zemlyakov
406         * data/po/ru.po: Updated Russian translation by Vladimir Zemlyakov
408 Mon, 12 May 2008 11:38:55 +0200 <thp@perli.net>
409 Fix a crasher with ExpatError when trying to parse an invalid itms:// URL
411         * src/gpodder/gui.py: Give an error message when adding a channel that
412         doesn't result in a valid URL being returned
413         * src/gpodder/util.py: Improve handling of itms:// URLs that are not
414         valid iTunes Podcast links, so they don't crash; thanks to Ralph on
415         Launchpad for reporting this bug
416         (Closes: https://bugs.launchpad.net/ubuntu/+source/gpodder/+bug/214113)
418 Mon, 12 May 2008 11:26:43 +0200 <thp@perli.net>
419 Fix race condition in is_download_in_progress()
421         * src/gpodder/services.py: Make sure we behave correctly when items in
422         the download list disappear while we are iterating over the list of
423         downloads when trying to find out if a download is already in progress
424         * src/gpodder/gui.py: Add SPGoetze to list of bug reporters
425         (Closes: https://bugs.launchpad.net/ubuntu/+source/gpodder/+bug/208964)
427 Mon, 12 May 2008 11:04:53 +0200 <thp@perli.net>
428 Fix bugs in the calculate_size utility function
430         * src/gpodder/util.py: Fix problem when accessing files or folders is
431         not possible in calculate_size(); thanks to Scott Wegner for reporting
432         this bug on Launchpad
433         * src/gpodder/gui.py: Add Scott Wegner to list of bug reporters
434         (Closes: https://bugs.launchpad.net/ubuntu/+source/gpodder/+bug/201276)
436 Sun, 11 May 2008 15:00:07 +0200 <thp@perli.net>
437 Update German translation, refresh translations
439         * data/messages.pot: Refreshed from source code
440         * data/po/*.po: Refreshed from messages.pot
441         * data/po/de.po: Refreshed and updated
443 Sat, 10 May 2008 16:45:36 +0200 <thp@perli.net>
444 Make gPodder respect the user's GNOME toolbar style settings
446         * src/gpodder/gui.py: Add Stefan Lohmaier to list of bug reporters
447         * data/gpodder.glade: Remove the preset toolbar style (use user's
448         configured toolbar style) and set the episode-related toolbar buttons
449         to be "important" (so the text is displayed in the mixed mode); thanks
450         to Stefan Lohmaier on gPodder Bugzilla for reporting this bug
451         (Closes: http://bugs.gpodder.org/show_bug.cgi?id=105)
453 Sat, 10 May 2008 13:38:34 +0200 <thp@perli.net>
454 Improve feed cache update speed, thanks to the users at ITT
456         * src/gpodder/cache.py: fetch() now returns an (updated, feed) tuple,
457         where "updated" is a boolean value telling if the feed has been
458         updated since the last run and "feed" is the feedparser feed data; fix
459         a bug where the etag and the last-modified time were never used in a
460         conditional download of not-changed feeds (my fault ;)
461         * src/gpodder/console.py: Sync the feed cache to disk after adding a
462         new podcast to the subscription list
463         * src/gpodder/gui.py: Pass the list of old channels to the
464         load_channels() function call, so we can save some CPU cycles when the
465         feed has not changed and we are allowed to re-use the old, parsed one
466         * src/gpodder/libpodcasts.py: Don't auto-sync the feed cache when
467         getting the podcastChannel for a feed; add podcastChannel.sync_cache()
468         function that saves the feed cache to disk; make it possible to pass a
469         list of old channels to load_channels() and use the old channel
470         objects in case the new one hasn't changed since the last run
471         (see http://www.internettablettalk.com/forums/showpost.php?p=179261&postcount=62)
473 Sat, 10 May 2008 13:33:49 +0200 <thp@perli.net>
474 Fix problem on Maemo when window open sound occurs twice on start
476         * data/gpodder.glade: Don't show gPodder main window initially
477         * src/gpodder/gui.py: Show gPodder main window only after the UI
478         elements have been set up (on Desktop) and don't destroy old main
479         window after re-parenting the vbox to the hildonized window (on Maemo)
481 Sat, 10 May 2008 13:24:19 +0200 <thp@perli.net>
482 Don't change the menu item text for subscription remove and edit
484         * src/gpodder/gui.py: Don't change the text of the subscription menu
485         items when changing the active channel
487 Sat, 10 May 2008 12:37:06 +0200 <thp@perli.net>
488 Show correct icon on Maemo for gPodder
490         * data/maemo/gpodder.desktop: Add Portuguese translation to Maemo's
491         .desktop file; add StartupWMClass=gpodder to the .desktop file for
492         Maemo, so the window manager on Maemo shows the correct icon when
493         gPodder is running instead of the "generic" application icon
495 Mon, 05 May 2008 15:55:02 +0200 <thp@perli.net>
496 Add bug reporter for previous bug to list of contributors
498         * src/gpodder/gui.py: Add Jerry Moss to list of bug reporters
500 Mon, 05 May 2008 15:52:49 +0200 <thp@perli.net>
501 Make sure we have a valid channel on which to call get_new_episodes()
503         * src/gpodder/gui.py: Refactor on_btnDownloadNewer_clicked into the
504         single calling code and remove the callback; this should really fix
505         the problem described in LP bug 217113
506         (Closes: https://bugs.launchpad.net/ubuntu/+source/gpodder/+bug/217113)
508 Fri, 02 May 2008 17:42:54 +0200 <thp@perli.net>
509 Maemo-related changes; allow custom player on Maemo (optional)
511         * data/gpodder.glade: gPodder maemo preferences window should be
512         modal; Add "Ask before closing gPodder" checkbox to Maemo preferences
513         * src/gpodder/config.py: Add option "maemo_allow_custom_player" that
514         allows setting the "player" and "videoplayer" variables to a command
515         that will be called, like on the Desktop version (instead of always
516         opening Nokia's Media Player with all files)
517         * src/gpodder/gui.py: Maemo-specific UI tweaks
518         * src/gpodder/libgpodder.py: Only call Nokia's Mediaplayer when we are
519         on Maemo and when "maemo_allow_custom_player" is set to False
521 Fri, 02 May 2008 17:28:22 +0200 <thp@perli.net>
522 Change "Channel" to "Podcast"; new main menu; URL entry updated; +niceties
524         * data/gpodder.glade: Change "Channel" to "Podcast"; re-structure main
525         menu in gPodder window
526         * src/gpodder/config.py: Add "show_podcast_url_entry" configuration
527         option that controls whether the podcast url entry box is shown in the
528         main window or not; add observer functionality to the configuration
529         manager, so UI elements can "watch" the configuration manager for
530         changes of UI-related configuration options
531         * src/gpodder/console.py: Change "Channel" to "Podcast"
532         * src/gpodder/gui.py: Hildon-specific file open/save dialogs; default
533         "Enter podcast URL..." test for the URL entry box; size-dependent
534         showing and hiding of podcast icon and downloaded count pixmap also
535         for the Desktop version; change "Channel" to "Podcast"; offer
536         first-time users to see a list of example podcasts to subscribe to;
537         dynamic main menu; code supporting the main menu changes; add code for
538         sending the subscription list via e-mail; import from OPML file in
539         addition to import from OPML URL; remove unneeded callbacks (wishlist,
540         select all, ...); optionally set title and hide url entry in the
541         gPodderOpmlLister (OPML import GUI); Add Frank Harper to list of
542         contributors (initial reporter of bug #82)
543         * src/gpodder/libgpodder.py: Add "send_subscriptions" function that
544         sends the user's channels.opml file via E-Mail (using xdg-email);
545         rename "Channel" to "Podcast"
546         (Closes: http://bugs.gpodder.org/show_bug.cgi?id=82)
547         (Closes: http://bugs.gpodder.org/show_bug.cgi?id=103)
549 Fri, 02 May 2008 15:52:31 +0200 <thp@perli.net>
550 Updated Portuguese translation by João Trindade
552         * data/gpodder.desktop: Updated Portuguese translation
553         * data/po/pt.po: Updated Portuguese translation
554         * src/gpodder/gui.py: Add João Trindade to list of contributors
556 Thu, 01 May 2008 11:20:28 +0200 <thp@perli.net>
557 Fix a spelling mistake in the French translation
559         * data/po/fr.po: Fixed French translation from Jérôme Chabod; thanks
560         to drust for pointing out the spelling mistake
561         (Closes: http://bugs.gpodder.org/show_bug.cgi?id=101)
563 Tue, 29 Apr 2008 20:21:45 +0200 <thp@perli.net>
564 Fix problems with resizing the treeview on Maemo
566         * src/gpodder/gui.py: Fix problems with treeview resizing and remove
567         printing the percentage
568         * bin/gpodder: We're in development again, so "+svn"
570 Sat, 26 Apr 2008 08:34:37 +0200 <thp@perli.net>
571 Merge gPodder 0.11.2 release stuff and German translation update
573         * bin/gpodder: Updated version and release date
574         * data/po/de.po: Updated German translation
575         * data/messages.pot: Updated from source code
576         * data/po/*.po: Updated from messages.pot
577         * doc/man/gpodder.1: Updated manpage for release
578         * README: Updated README for release
580 Thu, 24 Apr 2008 19:40:55 +0200 <thp@perli.net>
581 Maemo-specific dialogs and UI improvements
583         * data/gpodder.glade: Maemo-specific "Add Podcast" dialog and
584         Maemo-specific, stripped-down "Preferences" dialog added
585         * src/gpodder/gui.py: Hide channel add UI from main window; make label
586         for update button even shorter; hide cover and pill cells in the
587         channel list if it gets too small; Maemo-specific dialogs for both
588         adding channels and editing preferences
590 Thu, 24 Apr 2008 18:19:02 +0200 <thp@perli.net>
591 Maemo finger-friendly updates; minor UI changes
593         * data/gpodder.glade: Ellipsize the feed update progressbar in the
594         middle instead of the end (to show progress)
595         * src/gpodder/gui.py: Add support for finger-friendly widget (buttons,
596         scroll areas, popup menus, etc..); text is "Loading [...]" when
597         loading feed cache and "Updating [...]" when updating feeds; on Maemo,
598         don't set the tab title to the current episode title; hide the heading
599         in gPodderEpisodeSelector on Maemo (to save screen space); add
600         finger_friendly_widgets class attribute to several gPodder windows;
601         make the tabs in the main window a bit taller, but remove the border
602         around the main window to gain some space on the screen
604 Thu, 24 Apr 2008 15:48:58 +0200 <thp@perli.net>
605 Updated Swedish translation by Anders Kvist
607         * data/po/sv.po: Updated Swedish translation by Anders Kvist
609 Wed, 23 Apr 2008 22:31:42 +0200 <thp@perli.net>
610 Merge patch from Junio C Hamano to fix problems with zero-length in feeds
612         * src/gpodder/gui.py: Update list of contributors/patch writers
613         * src/gpodder/services.py: Patch from Junio C Hamano to fix a problem
614         when a feed has zero length, which would otherwise result in a
615         divide-by-zero error
617 Tue, 22 Apr 2008 21:57:31 +0200 <thp@perli.net>
618 Typo from previous commit
620         * src/gpodder/libpodcasts.py: Fix typo
622 Tue, 22 Apr 2008 21:54:01 +0200 <thp@perli.net>
623 Diverse changes, code clean-ups and other small annoyances
625         * src/gpodder/config.py: Make sure we can load a default set of
626         configuration options, even if we are in CLI mode
627         * src/gpodder/download.py: Don't display a traceback when logging a
628         cancelled download
629         * src/gpodder/gui.py: Add Doug Hellmann to contributors/coders list in
630         the about dialog (Doug Hellmann has done the feed cache code); do not
631         center the gPodderEpisode dialog on the treeAvailable widget (this
632         looks ugly ;)
633         * src/gpodder/libpodcasts.py: Clean up import statements; Make sure we
634         always have icon names, even in CLI mode; Remove "is_music_channel"
635         property of podcastChannel (not needed anymore); 
637 Tue, 22 Apr 2008 21:15:40 +0200 <thp@perli.net>
638 Python code fixup: Compare "None" with "is not" instead of "!="
640         * src/gpodder/config.py: "!= None" => "is not None"
641         * src/gpodder/download.py: "!= None" => "is not None"
642         * src/gpodder/gui.py: "!= None" => "is not None"
643         * src/gpodder/libconverter.py: "!= None" => "is not None"
644         * src/gpodder/libgpodder.py: "!= None" => "is not None"
645         * src/gpodder/libpodcasts.py: "!= None" => "is not None"
646         * src/gpodder/services.py: "!= None" => "is not None"
647         * src/gpodder/util.py: "!= None" => "is not None"
649 Tue, 22 Apr 2008 20:30:28 +0200 <thp@perli.net>
650 Non-modal feed cache updates
652         * data/gpodder.glade: Feed cache update UI changes
653         * src/gpodder/gui.py: Fix problem with maemo window showing all
654         widgets on start; feed cache update changes; update list of
655         contributor (bug reporter for the cancel/skip button feature request
656         * src/gpodder/libpodcasts.py: Support cancelling a running feed cache
657         update by switching to offline mode when the cancel button is pressed
658         in load_channels(); idea by Paul Elliot, Pieter De Decker, Jürgen
659         Schinker and others, see the bug report page for more information
660         (Partly fixes: http://bugs.gpodder.org/show_bug.cgi?id=16)
662 Sat, 19 Apr 2008 20:16:11 +0200 <thp@perli.net>
663 Better tray icon menu item on Maemo-based platforms
665         * src/gpodder/trayicon.py: Better tray icon integration (show/hide
666         gPodder via tray icon) on Maemo
668 Sat, 19 Apr 2008 18:46:30 +0200 <thp@perli.net>
669 Additional fields for the device remove episodes dialog; refactoring
671         * src/gpodder/gui.py: Add "Podcast" and "Released" columns to the
672         episode selector; hide all columns in our "delete from device" episode
673         selector that have all rows set to "None"; make the first text column
674         of the gPodderEpisodeSelector bigger, so the episode selector is
675         easier to read when there are many columns
676         * src/gpodder/libpodcasts.py: Use util.format_date() for
677         cute_pubdate() in podcastItem
678         * src/gpodder/sync.py: Document SyncTrack a bit better, add
679         needed/possible keyword arguments that are used in the UI; default
680         some values to None in case they are not provided; get "released" date
681         from iPod's iTunesDB and get podcast name from MP3 player's sync
682         folder (if this feature has been activated)
683         * src/gpodder/util.py: Add format_date() function that converts a Unix
684         timestamp to a good representation for a date (either Today,
685         Yesterday, a weekday or the locale's appropriate representation); the
686         code has been re-factored from podcastItem's cute_pubdate() function
687         in gpodder.libpodcasts and is now used from there
689 Thu, 17 Apr 2008 17:54:48 +0200 <thp@perli.net>
690 Calculate total percentage based on byte size instead of percentage
692         * src/gpodder/download.py: Make sure we save the right size of a
693         currently in-progress download of an episode
694         * src/gpodder/services.py: Calculate the total percentage for all
695         episodes based on their file size instead of their percentage done;
696         this is especially important when downloading small files mixed with
697         large files; this makes the estimated download time more reliable;
698         thanks to Jérôme Chabod, who has done this patch
699         (Closes: http://bugs.gpodder.org/show_bug.cgi?id=46)
701 Thu, 17 Apr 2008 17:42:31 +0200 <thp@perli.net>
702 Clean up preferences dialog + Move download settings to downloads tab
704         * data/gpodder.glade: UI-related changes to the preferences dialog
705         clean-up and the moving of the download settings to the downloads tab;
706         thanks to Paul Rudking for the download settings to downloads tab
707         patch
708         * src/gpodder/download.py: Better rate limiting, implemented by Paul
709         Rudkin
710         * src/gpodder/gui.py: UI-related changes to the preferences dialog
711         clean-up; the download settings changes are by Paul Rudkin
712         * src/gpodder/services.py: Improve the waiting/locking for the maximum
713         number of simultaneous downloads using a threading.Event
714         (Closes: http://bugs.gpodder.org/show_bug.cgi?id=69)
715         (Closes: http://bugs.gpodder.org/show_bug.cgi?id=83)
717 Tue, 15 Apr 2008 21:01:19 +0200 <thp@perli.net>
718 Updated French translation by Jérôme Chabod
720         * data/po/fr.po: Updated French translation by Jérôme Chabod
722 Tue, 15 Apr 2008 20:57:51 +0200 <thp@perli.net>
723 Merge patch from Jérôme Chabod to really pimp the tray icon tooltip :)
725         * src/gpodder/gui.py: Add some error reporting and change the code a
726         bit to support the new tooltips; thanks to Jérôme Chabod
727         * src/gpodder/trayicon.py: Add support for more elaborate tray icon
728         tooltips; patch by Jérôme Chabod
729         (Closes: http://bugs.gpodder.org/show_bug.cgi?id=97)
731 Mon, 14 Apr 2008 13:51:23 +0200 <thp@perli.net>
732 Add bug reporter to list of contributors
734         * src/gpodder/gui.py: Bug #95 was reported by Tomas Matheson, so add
735         him to the list of contributors
737 Mon, 14 Apr 2008 13:45:34 +0200 <thp@perli.net>
738 Set Close and cancel buttons to the default on most dialogs
740         * data/gpodder.glade: Apply patch from Jerome Chabod that sets the
741         close and cancel buttons on most dialogs of gPodder to the default and
742         give them focus; this makes keyboard navigation possible and should
743         make it easier for keyboard fans to use gPodder UI :) This partially
744         fixes bug #95, but there are still some things to do for this bug.
746 Mon, 14 Apr 2008 13:40:32 +0200 <thp@perli.net>
747 Merge patch from Jerome Chabod to fix Remove podcasts for MP3 players
749         * src/gpodder/gui.py: Add warning message when we can't find a needed
750         attribute; add "Philippe Gouaillier" to list of contributors (bug
751         reporter for this bug)
752         * src/gpodder/sync.py: Add playcount attribute to MP3 player sync code
753         (Closes: http://bugs.gpodder.org/show_bug.cgi?id=96)
755 Mon, 14 Apr 2008 13:37:03 +0200 <thp@perli.net>
756 Updated Russian translation by Leonid Ponomarev
758         * data/po/ru.po: Updated Russian translation by Leonid Ponomarev
760 Mon, 14 Apr 2008 13:33:44 +0200 <thp@perli.net>
761 Merge patch from Jerome Chabod to fix tray icon freeze (bug #55)
763         * src/gpodder/trayicon.py: Merge patch from Jerome Chabod to fix the
764         problem with the tray icon actions reported in bug #55; this is
765         basically attachment #33 with some cosmetic fixes
766         (Closes: http://bugs.gpodder.org/show_bug.cgi?id=55)
768 Sun, 13 Apr 2008 22:27:28 +0200 <thp@perli.net>
769 Updating message files from source code for 0.11.2 freeze
771         * data/messages.pot: Updated from source code
772         * data/po/*.po: Updated from messages.pot
774 Fri, 11 Apr 2008 10:26:50 +0200 <thp@perli.net>
775 Correct "Close" and "Quit" behaviour
777         * data/gpodder.glade: Add a "Close" menu item to the podcasts menu and
778         rename the quit item to "Quit" (from "Close) to make the interface
779         more consistent and to support both Ctrl+W and Ctrl+Q
780         * src/gpodder/gui.py: Correct "Close" and "Quit" behaviour and make
781         Close be the "minimize to tray" function when the tray icon is
782         enabled; when not enabled, "Close" acts the same way as "Quit" (but is
783         left visible, so the Ctrl+W shortcut also works to close gPodder);
784         thanks to Harley Laue for the suggestion and initial patch
785         (Closes: http://bugs.gpodder.org/show_bug.cgi?id=89)
787 Fri, 11 Apr 2008 10:11:33 +0200 <thp@perli.net>
788 Make RSS .torrent feeds from different Torrent sites work
790         * src/gpodder/libpodcasts.py: If an episode doesn't have an enclosure,
791         but its link looks like it's a media/torrent file, we are going do
792         interpret that as the enclosure URL; this makes feeds from different
793         torrent sites work with gPodder; thanks to Josh Gardner
794         <mellowcellofellow@gmail.com> for reporting this bug on Bugzilla
795         (http://bugs.gpodder.org/show_bug.cgi?id=74)
797 Tue, 08 Apr 2008 10:54:01 +0200 <thp@perli.net>
798 Updated Spanish translation
800         * data/po/es.po: Updated Spanish translation from Julio Acuña
802 Mon, 07 Apr 2008 23:06:53 +0200 <thp@perli.net>
803 Makre sure we can re-set the locale after changing it
805         * src/gpodder/util.py: Make sure we can re-set the locale after
806         changing it, and if we cannot, only print a warning, but don't throw
807         the exception outside of the function
809 Mon, 07 Apr 2008 23:05:05 +0200 <thp@perli.net>
810 Add 64x64 icon for Maemo's main menu and install it
812         * data/icons/64/gpodder.png: Added
813         * setup.py: Install the 64x64 icon in share/icons/hicolor
815 Mon, 07 Apr 2008 11:47:12 +0200 <thp@perli.net>
816 Install "pixmaps" icon on Maemo, too
818         * setup.py: Make sure we also install the "/usr/share/pixmaps/"
819         version of the gPodder icon on Maemo (for the task navigator)
821 Mon, 07 Apr 2008 11:24:54 +0200 <thp@perli.net>
822 Fix problems with the tray icon emblems
824         * src/gpodder/trayicon.py: Fix emblem drawing code for non-square
825         icons; use the "refresh" icon for feed updates and "multimedia-player"
826         icon for the iPod/MP3 player sync status emblem
828 Sun, 06 Apr 2008 17:22:11 +0200 <thp@perli.net>
829 Fix install Makefile bug; add donator; fix treeview header height
831         * Makefile: Add "generators" dependency for the "install" target
832         * src/gpodder/gui.py: Add Mark Alford (donator) to contributors list;
833         remove the hard-coded header height offset for the treeview, because
834         we don't need it anymore, because we hide the header (this is a good
835         thing, because we don't need to rely on a theme-specific header
836         height compared to what we did previously - one FIXME less :)
838 Sun, 06 Apr 2008 02:05:34 +0200 <thp@perli.net>
839 Initial upstream support for the Maemo platform (Nokia Internet Tablets)
841         * bin/gpodder: Add "--maemo/-m" option to enable running as a Maemo
842         application (this is only useful on Nokia Internet Tablets or in the
843         Maemo SDK environment); determine interface type and set the correct
844         variables on startup (gpodder.interface)
845         * data/gpodder.glade: Increase the default size of some widgets to
846         better fit the screens on Maemo (it won't do any harm on the "big"
847         Desktop screen
848         * data/icons/26/gpodder.png: Added
849         * data/icons/40/gpodder.png: Added
850         * data/maemo/gpodder.desktop: Added
851         * Makefile: Help2man variable; new "make mtest" target that runs
852         gPodder in Maemo scratchbox (probably useless for all other things);
853         update the command descriptions; don't run the "generators" target
854         from the "install" target; don't run "gen_graphics" from the
855         "generators" target, but make it depend on the 24-pixel logo, which
856         itself depends on the 22-pixel logo; this way, all should work out
857         well when trying to install on systems without ImageMagick installed;
858         remove *.pyo files on "make clean"
859         * setup.py: Support for build targets; use "TARGET=maemo" to enable
860         Maemo-specific installation options and files
861         * src/gpodder/config.py: Increase the WRITE_TO_DISK_TIMEOUT to 60
862         seconds, so we don't unnecessarily stress memory cards (on ITs);
863         modify default path variables on Maemo (/media/mmc2)
864         * src/gpodder/gui.py: Maemo-specific changes; clean-up the main window
865         a bit and make message and confirmation dialogs Hildon-compatible
866         * src/gpodder/__init__.py: Add enums for interface types: CLI, GUI and
867         MAEMO; remove the "interface_is_gui" variable and replace with
868         "interface", which is now used to determine where we are running
869         * src/gpodder/libgpodder.py: Use /media/mmc2/gpodder/ as configuration
870         folder on Maemo; use Nokia's Media player to playback files on Maemo
871         * src/gpodder/libpodcasts.py: Icon name changes (Maemo-specific)
872         * src/gpodder/trayicon.py: Maemo support; swap popup menu on Maemo;
873         Add support for hildon banners instead of pynotify on Maemo
874         * src/gpodder/util.py: Icon name changes (Maemo-specific); use new
875         gpodder.interface variable in idle_add
877 Sat, 05 Apr 2008 21:06:14 +0200 <thp@perli.net>
878 Make i18n help text work in the console help (gpodder --help)
880         * bin/gpodder: Fix a bug that would make the localized help string of
881         the CLI break; thanks to Pavel Mlcoch <pavkamlc@centrum.cz> for
882         reporting this bug on the gPodder bug tracker
883         (Closes: http://bugs.gpodder.org/show_bug.cgi?id=53)
885 Fri, 04 Apr 2008 09:50:35 +0200 <thp@perli.net>
886 Use the correct multimedia-player icon for the transfer main menu item
888         * data/gpodder.glade: Use the multimedia-player icon for the transfer
889         to device menu item (was still gtk-network, forgot to change)
891 Fri, 04 Apr 2008 09:48:25 +0200 <thp@perli.net>
892 Fix gPodder freeze with open notifications on quit
894         * src/gpodder/trayicon.py: Fix a bug when gPodder would freeze when
895         a notification bubble was still open while closing the main
896         application; thanks to Jérôme Chabod for reporting this issue
897         (Closes: http://bugs.gpodder.org/show_bug.cgi?id=55)
899 Fri, 04 Apr 2008 09:46:23 +0200 <thp@perli.net>
900 Increase filename size limitation from 50 to 100 chars in MP3 player sync
902         * src/gpodder/sync.py: Increase the number at which file names are cut
903         down in length to 100 characters and also cut folder names to that
904         length; thanks to Bernd Schlapsi for reporting this bug on the list
906 Sun, 30 Mar 2008 10:48:41 +0200 <thp@perli.net>
907 Make the Quit buttons actually quit when using the tray icon
909         * src/gpodder/gui.py: Patch from Nick L. to make the function of all
910         "Quit" buttons really quit gPodder and only make the window's "X"
911         button act as "minimize to tray" button; Also, update the credits name
913 Sat, 29 Mar 2008 17:13:26 +0100 <thp@perli.net>
914 Project management updates (authors, contributors and copyright)
916         * AUTHORS: Removed (was outdated); content now in gui.py (AboutDialog)
917         * bin/gpodder, data/po/Makefile, doc/dev/copyright_notice, 
918           doc/dev/win32/setup-win32.py, INSTALL, Makefile, README,
919           setup.py: Updated Copyright and old website URL to include 2008, the
920           gPodder team and www.gpodder.org
921         * src/gpodder/*.py: Updated Copyright years
922         * src/gpodder/gui.py: Add list of contributors from AUTHORS file and
923         from the content on the website's news page (please mail me if I
924         forgot to mention you as a contributor, I surely have missed a few);
925         make the AboutDialog's application name "gPodder" (from gpodder) and
926         add an URL hook function to the AboutDialog, so the website is opened
927         in the user's default web browser
929 Sat, 29 Mar 2008 16:30:02 +0100 <thp@perli.net>
930 Report errors in parsing/loading an already-added channel in the navigator
932         * src/gpodder/gui.py: Show the error from feedparser in the channel's
933         tooltip if there has been an error loading the channel
934         * src/gpodder/libpodcasts.py: Make sure we can load a default title
935         when using get_by_url(); save the parse_error variable for each
936         channel (it defaults to None if there is no error); mark the
937         description text for the channel navigator in red color if there has
938         been a parser error and add the parse_error variable to the liststore
939         model
940         * src/gpodder/util.py: Strip whitespace before and after the string in
941         remove_html_tags()
943 Sat, 29 Mar 2008 16:18:59 +0100 <thp@perli.net>
944 Add support for Rockbox' AudioScrobbler logfile to update played status
946         * src/gpodder/config.py: Add "mp3_player_use_scrobbler_log"
947         configuration option (defaulting to False) which controls if we are
948         going to try and find a ".scrobbler.log" file that contains
949         information on which tracks have been played; for this to work, you
950         also have to enable the "Updated tags after download" option
951         * src/gpodder/sync.py: Support for finding the .scrobbler.log file and
952         updating the played status of episodes in the MP3 player sync code
953         * src/gpodder/util.py: Add "find_mount_point()" function that tries to
954         determine the mount point on which the given directory (or file) lies
955         and returns the mount point or "/" if the directory/file resides on
956         the root filesystem.
958         This whole patch has been contributed by Nick <nikosapi.org> - thanks!
960 Sat, 29 Mar 2008 16:16:06 +0100 <thp@perli.net>
961 Merge sv.po translation from 0.11.1 release tarball
963         * data/po/sv.po: It seems like I somehow messed up the translations
964         merge, so here's the correct sv.po translation file, merged from the
965         0.11.1 tarball; thanks to Anders Kvist <kvistkvist@telia.com> for
966         pointing that out :)
968 Sat, 29 Mar 2008 01:20:46 +0100 <thp@perli.net>
969 Make sure we ignore the updated_parsed of a channel if it's None
971         * src/gpodder/libpodcasts.py: Only try to convert the "updated_parsed"
972         field if it's not "None"
973         * src/gpodder/util.py: Make sure we receive a valid 9-tuple when
974         converting dates from updated_parsed; if we receive a None value or
975         some value that isn't "9" in length, return None
976         Thanks to Chris Arnold <carnold@electrichendrix.com> for reporting
977         this bug on the gpodder-devel mailing list
979 Thu, 27 Mar 2008 13:10:58 +0100 <thp@perli.net>
980 This is trunk, so set version to 0.11.1+svn
982         * bin/gpodder: Set version to 0.11.1+svn
984 Thu, 27 Mar 2008 12:57:56 +0100 <thp@perli.net>
985 gPodder 0.11.1 "Attacked by Killer Tomatoes" released
987         * bin/gpodder: gPodder 0.11.1 released :)
988         * README: gPodder 0.11.1 released :)
989         * doc/man/gpodder.1: gPodder 0.11.1 released :)
990         * data/icons/24/gpodder.png: Updated from the dataset
991         * data/messages.pot: Updated from source
992         * data/po/*.po: Updated from messages.pot
993         * data/po/de.po: Updated German translation
995 Thu, 27 Mar 2008 11:52:35 +0100 <thp@perli.net>
996 Use cPickle for dumbshelve - it's compatible and faster
998         * src/gpodder/dumbshelve.py: Improve saving of channel cache and
999         metadata (and basically all that currently depends on dumbshelve) by
1000         using cPickle as a drop-in replacement for pickle
1002 Thu, 27 Mar 2008 11:28:31 +0100 <thp@perli.net>
1003 Fix problem with pickle when there is a feed parsing exception
1005         * src/gpodder/cache.py: When the feedparser returns an exception, this
1006         will be stored as object in bozo_exception. Convert this to a string,
1007         so the pickle module doesn't complain; thanks to VladDrac in #python
1008         on FreeNode for pointing me to the right direction to fix this bug
1010 Mon, 24 Mar 2008 10:42:19 +0100 <thp@perli.net>
1011 Add "3gp" to the list of video file extensions, so we detect these files
1013         * src/gpodder/util.py: Add the .3gp video file extension to the list
1014         of known video file extensions, so we can detect that these are video
1015         files and act accordingly (in the UI and on sync); thanks to Atte
1016         André Jensen for reporting this bug on the gpodder-devel mailing list
1018 Sun, 23 Mar 2008 10:39:24 +0100 <thp@perli.net>
1019 Fix a bug when loading invalid image data (delete cover file then)
1021         * src/gpodder/libgpodder.py: Fix a bug when gPodder is unable to load
1022         an invalid cover image (i.e. when dragging a linked image from the
1023         browser to the gPodder window, the link is sent, not the image)
1025 Sat, 22 Mar 2008 21:08:06 +0100 <thp@perli.net>
1026 Make bluetooth device discover a bit nicer
1028         * src/gpodder/gui.py: Improve bluetooth device discovery button by not
1029         destroying its design when it has been clicked and the label is
1030         modified
1032 Sat, 22 Mar 2008 20:45:27 +0100 <thp@perli.net>
1033 Revert previous insanity (where I selected an awful "Transfer" toolbar icon)
1035         * data/gpodder.glade: I wonder why I selected "gtk-network" as the
1036         icon for the "Transfer" button on gPodder's toolbar. It surely is
1037         irritating and illogical as hell.. Hmm. Anyway - now, there is a nice
1038         "multimedia-player" icon which probably depicts an iPod-like device
1039         if you use a good icon set. This makes much more sense. Go usability!
1041 Sat, 22 Mar 2008 20:41:54 +0100 <thp@perli.net>
1042 Add "Visit website" menu items to channel and episode list; simple chan menu
1044         * src/gpodder/gui.py: Add "Visit website" menu items to the context
1045         menu of both the episode list and the channel navigator; also, make
1046         the channel context menu easier to use by replacing the old
1047         "Edit [Channelname]" and "Remove [Channelname]" items with stock items
1049 Sat, 22 Mar 2008 18:41:30 +0100 <thp@perli.net>
1050 Fix "Podcasts not being marked as new when synced to iPod" (#70)
1052         * src/gpodder/sync.py: Fix bug when podcasts were not marked as new
1053         when synced to iPod and "on_sync_mark_played" was enabled;
1054         Bug URL: http://bugs.gpodder.org/show_bug.cgi?id=70
1055         Thanks to defrex (defrex0 gmail com) for report this bug in Bugzilla
1057 Thu, 20 Mar 2008 11:21:06 +0100 <thp@perli.net>
1058 Delay loading of UserAppsReader and improve libplayers
1060         * src/gpodder/gui.py: Only load UserAppsReader's database three
1061         seconds after gPodder start (because we only need it when the user
1062         opens the preferences dialog, and if she opens it before these three
1063         seconds, the UserAppsReader data is loaded on demand); because we load
1064         the database (and generate the model) before we display the
1065         preferences dialog, the preferences dialog usually comes up faster
1066         than before (except for the situation where it is opened right after
1067         gPodder startup); have only one UserAppsReader for audio/video and not
1068         both (would duplicate the amount of work needed to read desktop
1069         files); cleanup some UserAppsReader-related code in the prefs dialog
1070         * src/gpodder/libplayers.py: Improve the reading code and make it
1071         possible to support multiple mime types per-UserAppsReader (i.e. both
1072         audio and video types are read by a single UAR instance); clean up the
1073         imports for this module and do other related changes to make the code
1074         nicer to read and understand
1076 Thu, 20 Mar 2008 11:18:51 +0100 <thp@perli.net>
1077 Add option to limit the maximum number of episodes per feed
1079         * src/gpodder/config.py: Add "max_episodes_per_feed" configuration
1080         option (int, defaults to 200) that determines the maximum number of
1081         episodes that are parsed per channel/feed; if there are more episodes,
1082         they are ignored. This value can be adjusted via the extended
1083         configuration editor if you need more episodes
1084         * src/gpodder/libpodcasts.py: Add support for the
1085         max_episodes_per_feed configuration option above
1087 Thu, 20 Mar 2008 11:13:16 +0100 <thp@perli.net>
1088 Fix bug with unneeded download directory being created
1090         * src/gpodder/libpodcasts.py: Fix bug when an unneeded download
1091         directory would be created on every gPodder startup
1093 Thu, 20 Mar 2008 11:11:18 +0100 <thp@perli.net>
1094 Only serialize DumbShelve to disk when we have changed/deleted items in it
1096         * src/gpodder/dumbshelve.py: Add a "__dirty" flag to DumbShelve to
1097         know if we have to write the DumbShelve to the disk or if nothing has
1098         changed since the last write (and therefore no need to run the
1099         time-consuming serialization code again); this speeds up initial
1100         loading time and probably also speeds up other parts of the code
1102 Thu, 20 Mar 2008 11:09:27 +0100 <thp@perli.net>
1103 Timestamp and benchmark functions for logger
1105         * src/gpodder/liblogger.py: Add support for timestamping and benchmark
1106         functions to liblogger, so we see the microtime since gPodder startup
1107         and can also use the logging module to benchmark the speed of certain
1108         code parts; this is helpful for our performance patches :)
1110 Thu, 20 Mar 2008 11:07:48 +0100 <thp@perli.net>
1111 Performance-improving patch from Nick (nikosapi) to html entity replacement
1113         * src/gpodder/util.py: Merge patch from Nick (nikosapi.org) to really
1114         improve performance of the HTML tag stripper/entity replacement code
1115         by using regular expressions and some more intelligent code for
1116         converting numeric entities to Unicode characters
1118 Thu, 20 Mar 2008 11:06:32 +0100 <thp@perli.net>
1119 Add demo code for displaying a splash screen
1121         * doc/dev/splash-logo.py: Added testing code that would display a
1122         splash screen (transparent if compositing is enabled); we currently
1123         don't plan to use this code for reasons described on gpodder-devel
1125 Thu, 20 Mar 2008 10:04:14 +0100 <thp@perli.net>
1126 Filter "None" filenames from GtkFileChooser widgets
1128         * src/gpodder/config.py: Make sure we don't receive a "None" filename
1129         from GtkFileChooser widgets when connecting to the config manager
1131 Wed, 19 Mar 2008 18:06:58 +0100 <thp@perli.net>
1132 Change the context menu of the episode list popup menu
1134         * src/gpodder/gui.py: Simplify, re-structure and improve the context
1135         menu of the episode list popup menu (right-click menu); thanks to hex
1136         (justin.forest gmail.com) for suggesting this change and giving
1137         valuable input on gpodder-devel
1139 Wed, 19 Mar 2008 15:45:15 +0100 <thp@perli.net>
1140 Patch from Nikosapi to fix MP3 player sync progress
1142         * src/gpodder/sync.py: Patch from Nick (nikosapi.org) to fix MP3
1143         player sync problems: "Instead of displaying the proper percentage of
1144         the copied file in the FS-based sync dialog, gPodder would initially
1145         report 100% and near the end of the copy it would report percentages
1146         >100%."
1148 Wed, 19 Mar 2008 15:02:10 +0100 <thp@perli.net>
1149 Various Bluetooth-related fixes
1151         * data/gpodder.glade: Use the "bluetooth" icon instead of the (old?)
1152         "stock_bluetooth" icon; in Gnome 2.22, the "bluetooth" icon is nicer,
1153         i.e. more Tango-ish than the "stock_bluetooth" icon
1154         * src/gpodder/gui.py: Fix a logging error; Only show "Send to [...]
1155         via bluetooth"/"Send to bluetooth device" when we have already
1156         downloaded the episodes (won't obviously work otherwise..)
1157         * src/gpodder/util.py: Fix bluetooth_send_file to work with both
1158         bluetooth-sendto and gnome-obex-send (different command line argument
1159         format for both)
1161 Sun, 16 Mar 2008 12:55:49 +0100 <thp@perli.net>
1162 Python-feedparser is a dependency, so mention it in the README
1164         * README: Mention python-feedparser as a dependency in the README
1165         file; thanks to Alain Tauch for pointing this out on the mailing list
1167 Wed, 12 Mar 2008 12:38:19 +0100 <thp@perli.net>
1168 Updated translations for 0.11.1 stabilization period
1170         * data/messages.pot: Updated from source
1171         * data/po/*.po: Updated from messages.pot
1173 Tue, 11 Mar 2008 18:53:25 +0100 <thp@perli.net>
1174 Add option to write gtkpod extended database on sync
1176         * data/gpodder.glade: Add a check box for the new config option
1177         * src/gpodder/config.py: Add ipod_write_gtkpod_extended boolean
1178         configuration variable that controls if we want to write iTunesDB.ext
1179         after synchronization (defaults to False)
1180         * src/gpodder/gui.py: Glue code for UI<->Config manager
1181         * src/gpodder/sync.py: Use libgpod's "gtkpod" module to write the
1182         extended gtkpod database (iTunesDB.ext) to the iPod after sync - this
1183         has to be enabled via an option
1185 Tue, 11 Mar 2008 18:44:19 +0100 <thp@perli.net>
1186 Fix problem with old PyGTK versions when importing gpodder.trayicon
1188         * src/gpodder/gui.py: Apply patch from Bill Barnard
1189         <bill@barnard-engineering.com>, based on a patch from Jérôme Chabod
1190         <jerome.chabod@ifrance.com> that makes sure we can import the tray
1191         icon module. If not, we disable the tray icon functionality
1193 Mon, 10 Mar 2008 16:37:38 +0100 <thp@perli.net>
1194 Add support for creating M3U playlist files in download folders
1196         * src/gpodder/config.py: Add "create_m3u_playlists" boolean
1197         configuration option (default False) that controls if we want to
1198         generate per-channel M3U playlists in our download folders
1199         * src/gpodder/gui.py: Add context menu entry for manually updating an
1200         M3U playlist for the channel navigator (only visible when updating m3u
1201         playlists is enabled
1202         * src/gpodder/libpodcasts.py: Add update_m3u_playlist() function to
1203         podcastChannel and call it when removing and adding downloaded
1204         episodes
1205         * src/gpodder/util.py: Add sanitize_filename() function that tries to
1206         encode a file name in the system's encoding, stripping all chars that
1207         are invalid on FAT32 and other systems (e.g. slash, etc..)
1209 Thu, 06 Mar 2008 17:46:21 +0100 <thp@perli.net>
1210 Be less verbose, consider episodes with length<=100 to have invalid length
1212         * src/gpodder/libpodcasts.py: Remove verbose logging for episode
1213         metadata (seems to work now); consider episodes with a small length
1214         value to have invalid length, i.e. try to find the length of the
1215         episode by looking at the HTTP header; thanks to Bernd
1216         <schlaber@gmail.com> for sending in the feed URL with which this bug
1217         happens (length was 1) during the gPodder workflow survey :)
1219 Tue, 04 Mar 2008 12:15:53 +0100 <thp@perli.net>
1220 Fix KeyError bug in custom_selection_button_clicked (from LP)
1222         * src/gpodder/gui.py: Fix problem with localized strings on the custom
1223         selection buttons, i.e. pass the label to the function directly
1224         instead of relying on the gtk.Button to have the label in the correct
1225         encoding (LP: #192918); thanks to Pavel Mlčoch for reporting this bug
1226         on Launchpad
1228 Tue, 04 Mar 2008 12:05:23 +0100 <thp@perli.net>
1229 Fix AttributeError bug in updateTreeView (from LP)
1231         * src/gpodder/gui.py: Make sure that we have a valid "active_channel"
1232         when updating the tree view (LP: #183667); thanks to red26wings for
1233         reporting this bug on Launchpad
1235 Mon, 03 Mar 2008 23:06:30 +0100 <thp@perli.net>
1236 Add support for changing the URL of a subscribed channel (bug #42)
1238         * data/gpodder.glade: Make the URL entry in the channel dialog
1239         editable
1240         * src/gpodder/gui.py: Add support for changing the URL of a subscribed
1241         channel (i.e. move from the "latest" RSS feed to the "complete" RSS
1242         feed, as is the case with Chaosradio podcasts, for example); ask user
1243         if she really wants to move; handle case where the new URL is wrong
1244         by reverting to old URL; Improve code for moving the download
1245         directory; thanks to Steve Garcia <sgarcia@bak.rr.com> for the bug
1246         report
1248 Mon, 03 Mar 2008 21:14:55 +0100 <thp@perli.net>
1249 Small fix for moving downloads progress bar
1251         * src/gpodder/gui.py: Make sure the value for set_fraction of the
1252         progress bar is in 0.0..1.0
1254 Mon, 03 Mar 2008 20:53:15 +0100 <thp@perli.net>
1255 Add "Go to website" buttons to episode and channel (bug #43)
1257         * data/gpodder.glade: Add "Go to website" buttons to episode and
1258         channel info dialogs
1259         * src/gpodder/gui.py: Add code to open website URL or hide the "Go to
1260         website" button when there is no valid website link for an episode or
1261         channel
1263 Mon, 03 Mar 2008 20:37:02 +0100 <thp@perli.net>
1264 Move webbrowser code to util.open_website; fix URLs to gpodder.org
1266         * src/gpodder/gui.py: Use new gpodder.org URLs; use
1267         util.open_website() instead of directly interfacing with threads and
1268         the "webbrowser" module
1269         * src/gpodder/util.py: New function open_website() that takes care of
1270         opening the system's default web browser and opening the specified URL
1272 Sun, 02 Mar 2008 14:20:56 +0100 <thp@perli.net>
1273 Make "gl" a global-accessible object in libgpodder
1275         * doc/dev/gdfs/gdfs-check.py: Adapt to new structure of gPodderLib
1276         * src/gpodder/*.py: Use "gl" instead of all incarnations of
1277         "gPodderLib()" or "libgpodder.gPodderLib()", and weed out all "gl =
1278         gPodderLib() lines, because it makes the code look unnecessarily
1279         bloated ;)
1280         * src/gpodder/libgpodder.py: Make "gl" a global instance of the
1281         gPodderLib() object, and rename gPodderLibClass to gPodderLib and do
1282         some more cleaning-up
1284 Sun, 02 Mar 2008 14:03:40 +0100 <thp@perli.net>
1285 Move gPodderLib().open_folder to util.gui_open
1287         * src/gpodder/gui.py: Use util.gui_open instead of gl.open_folder
1288         * src/gpodder/libgpodder.py: Remove open_folder (move to gpodder.util)
1289         * src/gpodder/util.py: Add gui_open function that uses xdg_open to
1290         open files and folders with their default application in the GUI
1292 Sun, 02 Mar 2008 13:52:42 +0100 <thp@perli.net>
1293 Pickle-based storage method (dumbshelve); HTTP HEAD requests; buggy feed fixes
1295         * src/gpodder/dumbshelve.py: Added (replacement for "shelve" using
1296         pickle)
1297         * src/gpodder/libgpodder.py: Rename *.db files to *.pickle.db, so we
1298         don't clash with old-style shelve .db files
1299         * src/gpodder/libpodcasts.py: Use dumbshelve as a replacement for
1300         shelve; add EpisodeURLMetainfo that keeps track of metainfo downloaded
1301         via HTTP HEAD requests; make getting episode length and pubDate a bit
1302         more intelligent by trying to find correct values via HTTP HEAD;
1303         improve episode sorting by falling back to episode titles when no
1304         pubDate has been found (or pubDate is equal); 
1305         * src/gpodder/util.py: Add get_episode_info_from_url() function that
1306         tries to find out the length and pubDate of an episode by looking at
1307         the data from the HTTP HEAD; also support HTTP proxys via an optional
1308         "proxy" keyword argument
1310 Wed, 27 Feb 2008 10:44:48 +0100 <thp@perli.net>
1311 Notify user about no new episodes when updating from tray icon
1313         * src/gpodder/gui.py: Patch from Jérôme Chabod
1314         <jerome.chabod@ifrance.com> to notify the user about "no new episodes"
1315         when updating the feed cache manually via the tray icon
1316         (Closes: http://bugs.gpodder.org/show_bug.cgi?id=3)
1317         * src/gpodder/trayicon.py: See above
1319 Wed, 27 Feb 2008 09:52:14 +0100 <thp@perli.net>
1320 Use xdg-open for files that we don't know the file type of
1322         * src/gpodder/libgpodder.py: If the file we want to open/play is not
1323         an audio or video file, we use "xdg-open" to open the file (this is
1324         used for things like PDF files and the like, e.g. in Chaos TV)
1326 Wed, 27 Feb 2008 09:46:55 +0100 <thp@perli.net>
1327 Add Flash Video (flv) and Windows Media Video (wmv) to file detection
1329         * src/gpodder/util.py: Detect *.flv and *.wmv files as video files
1331 Wed, 27 Feb 2008 09:39:42 +0100 <thp@perli.net>
1332 When sending via Bluetooth, always rename/copy the file
1334         * src/gpodder/gui.py: When sending files via Bluetooth, and the file
1335         converter script is not enabled, we are simply copying the file to the
1336         sync_filename of the episode, therefore creating a nice name. We have
1337         to copy the file, because neither gnome-obex-send nor bluetooth-sendto
1338         let us specify the destination filename when sending the file, these
1339         utilities always take the input filename (thanks to Chris
1340         <gpodder@noreply.org.uk> for the bug report)
1341         (Closes: http://bugs.gpodder.org/show_bug.cgi?id=49)
1343 Tue, 26 Feb 2008 16:49:06 +0100 <thp@perli.net>
1344 Python code fixup: Compare "None" with "is" instead of "=="
1346         * doc/dev/daap2rss.py: "== None" => "is None"
1347         * src/gpodder/config.py: "== None" => "is None"
1348         * src/gpodder/gui.py: "== None" => "is None"
1349         * src/gpodder/libgpodder.py: "== None" => "is None"
1350         * src/gpodder/libpodcasts.py: "== None" => "is None"
1352 Tue, 26 Feb 2008 16:30:56 +0100 <thp@perli.net>
1353 Add support for new "bluetooth-sendto" utility
1355         * README: Ask for either "gnome-obex-send" or "bluetooth-sendto",
1356         which are needed for the Bluetooth file transfer
1357         * src/gpodder/util.py: Add support for "bluetooth-sendto" as an
1358         alternative to "gnome-obex-send"; initial bug report and patch by
1359         Leonid Ponomarev (this probably adds bluez-gnome as an optional
1360         dependency if you want bluetooth send support)
1362 Mon, 25 Feb 2008 15:51:16 +0100 <thp@perli.net>
1363 Show more description text in episode list
1365         * src/gpodder/libpodcasts.py: Join all lines and strip unnecessary
1366         data for the episode description that is displayed in the episode list
1367         when descriptions are enabled (suggested by Jérôme Chabod)
1369 Mon, 25 Feb 2008 14:39:15 +0100 <thp@perli.net>
1370 Merge changes from 0.11.0 release after release
1372         * bin/gpodder: Merge changes from 0.11.0
1373         * README: Merge changes from 0.11.0
1375 Sun, 24 Feb 2008 14:52:04 +0100 <thp@perli.net>
1376 Cosmetic changes to the makefile
1378         * Makefile: Cosmetic changes
1380 Sun, 24 Feb 2008 13:55:42 +0100 <thp@perli.net>
1381 Cairo-based progress bar on system tray icon
1383         * src/gpodder/draw.py: Add Cairo-based drawing code for generating a
1384         nice, transparent progress bar icon
1385         * src/gpodder/services.py: Fix a problem with the wrong download done
1386         percentage (i.e. when cancelling downloads instead of finishing them)
1387         * src/gpodder/trayicon.py: Add code to draw the progress bar on the
1388         tray icon; initial idea and most parts of this patch by Jérôme Chabod
1390 Sat, 23 Feb 2008 14:18:53 +0100 <thp@perli.net>
1391 Set the xterm title when running "make test"
1393         * Makefile: Set the xterm title when running "make test"
1395 Wed, 20 Feb 2008 13:38:58 +0100 <thp@perli.net>
1396 Estimated time left and synchronization support for tray icon by Jérôme Chabod
1398         * src/gpodder/gui.py: Send update status information to the tray icon
1399         on update; add glue code for synchronization device and tray icon
1400         * src/gpodder/trayicon.py: Add status and tooltip during device
1401         synchronization; add estimated download time to tooltip during
1402         download; set the correct caption for the synchronization menu item in
1403         the tray icon (and don't add a synchronize menu item when not needed);
1404         some small code-cleanups and fixes
1405         * src/gpodder/util.py: Add format_seconds_to_hour_min_sec() function
1406         that converts a numeric amount of seconds into a human-readable string
1408 Tue, 19 Feb 2008 07:46:28 +0100 <thp@perli.net>
1409 Fix bug with MP3 player synchronization file name encodings
1411         * src/gpodder/sync.py: Apply patch to fix problems with native
1412         language encodings on MP3 player synchronization; thanks to Bernd
1413         Schlapsi for reporting the problem in Bugzilla
1414         (Closes: http://bugs.gpodder.org/show_bug.cgi?id=34)
1416 Mon, 18 Feb 2008 21:17:48 +0100 <thp@perli.net>
1417 Updated French translation for 0.11.0
1419         * data/po/fr.po: Updated French translation by Jérôme Chabod
1421 Sun, 17 Feb 2008 13:50:09 +0100 <thp@perli.net>
1422 Fix calculation of average percentage done
1424         * src/gpodder/services.py: Fix calculation of average percentage done
1425         for downloads, thanks to Jérôme Chabod <jerome.chabod@ifrance.com> for
1426         the patch
1428 Sun, 17 Feb 2008 13:33:38 +0100 <thp@perli.net>
1429 Updated translations for 0.11.0
1431         * data/messages.pot: Refreshed messages.pot from source code
1432         * data/po/de.po: Updated German translation
1433         * data/po/nl.po: Updated Dutch translation by Pieter De Decker
1434         * data/po/ru.po: Updated Russian translation by Leonid Ponomarev
1435         * data/po/cs.po: Updated Czech translation by Ondrej Vesely
1436         * data/po/sv.po: Updated Swedish translation by Anders Kvist
1438 Thu, 07 Feb 2008 22:15:40 +0100 <thp@perli.net>
1439 Hello, new "expert" configuration editor (about:config-like)
1441         * data/gpodder.glade: Add gPodderConfigEditor window and add an
1442         "Advanced..." button to the preferences dialog
1443         * src/gpodder/config.py: Add a gtk.ListStore tree model to the
1444         configuration manager and update it when configuration variables
1445         change; add toggle_flag() and update_field() methods for easy updating
1446         of fields from the new config editor
1447         * src/gpodder/gui.py: Add glue code for opening the advanced
1448         configuration editor from the preferences dialog; add code for the
1449         gPodder configuration editor (including filtering and field updating);
1450         (Closes: http://bugs.gpodder.org/show_bug.cgi?id=10)
1452 Thu, 07 Feb 2008 20:22:08 +0100 <thp@perli.net>
1453 Support buggy OPML feeds, notify user on OPML import
1455         * src/gpodder/gui.py: Notify user when no items were found when trying
1456         to import OPML feeds
1457         * src/gpodder/opml.py: Make the OPML importer a bit more relaxed, and
1458         make it accept "url" instead of "xmlUrl", too (for buggy OPML feeds)
1460 Wed, 06 Feb 2008 17:34:56 +0100 <thp@perli.net>
1461 Fix the track length detection
1463         * src/gpodder/sync.py: Fix the iPod sync track length detection code,
1464         reported by Paul Rudkin <paul@thegithouse.com> and tested by
1465         FriedBunny <friedbunny@kulturny.com>; make default length 3 hours
1466         Closes: http://bugs.gpodder.org/show_bug.cgi?id=29
1468 Wed, 06 Feb 2008 10:59:25 +0100 <thp@perli.net>
1469 NLS encoding support for MP3 player synchronization (from gdfs)
1471         * src/gpodder/sync.py: Add NLS encoding support from Leonid Ponomarev
1472         <leonid.phoenix@gmail.com>; patch modified a bit to better fit the
1473         code and be more verbose, so the user knows how we encode the names
1475 Wed, 06 Feb 2008 10:43:47 +0100 <thp@perli.net>
1476 Hide to systray on exit during download
1478         * src/gpodder/gui.py: Apply patch from Jérôme Chabod
1479         <jerome.chabod@ifrance.com> to fix a bug: When closing gPodder during
1480         a download, and "on_quit_hide" is on, gPodder asks for a confirmation
1481         It should hide gPodder without asking. This patch fix that.
1483 Wed, 06 Feb 2008 10:18:30 +0100 <thp@perli.net>
1484 Usability GUI update (after Rafael Proença's proposal)
1486         * data/gpodder.glade: Add "Ctrl+L" hotkey to Add new channel; add
1487         "View" menu with show/hide Toolbar (Ctrl+T) and show/hide episode
1488         descriptions (Ctrl+D); remove "Update Feeds" button from toolbar and
1489         add Check for updates button below channel navigator; move the add
1490         episodes entry and buttons above the channel navigator; thanks to the
1491         following people who shared their opinions on the mailing list: Rafael
1492         Proença, Paul Rudkin, Ondrej Vesely, Leonid Ponomarev, Shane Donohoe,
1493         Jérôme Chabod, Nick (nikosapi); the GUI mockups and the initial idea
1494         were posted by Rafael Proença
1495         * src/gpodder/config.py: Add "episode_list_descriptions" and
1496         "show_toolbar" configuration options that modify the look of the main
1497         window (both default to "True")
1498         * src/gpodder/gui.py: Show feed description in seperate line (this
1499         feature was suggested by narf@inode.at); make the episode list
1500         treeview widget use the space more efficient; show/hide toolbar and
1501         show/hide episode description GUI glue code
1502         * src/gpodder/libgpodder.py: Add "digits" keyword argument to
1503         format_filesize() (defaults to 2), this is a pass-thru function for
1504         gpodder.util.format_filesize() (see below)
1505         * src/gpodder/libpodcasts.py: Support for small- and large-sized
1506         icons,modify liststore creation code to add description to the title
1507         column
1508         * src/gpodder/util.py: Add "digits" keyword argument to
1509         format_filesize() (defaults to 2), this is used to define the format
1510         of the filesize; add "icon_size" keyword argument (defaults to 32) to
1511         get_tree_icon() and modify the function so that it dynamically
1512         generates the correct icon with the correct sizes
1514 Mon, 04 Feb 2008 11:26:14 +0100 <thp@perli.net>
1515 Apply patchset from Jérôme Chabod to fix tray icon behaviour
1517         * data/gpodder.glade: Change behaviour of the "display tray icon"
1518         checkbox, rename and retitle some configuration options
1519         * src/gpodder/config.py: Rename "download_after_update" to
1520         "auto_download_when_minimized" and rename "disable_notifications" to
1521         "enable_notifications".
1522         * src/gpodder/gui.py: Add glue code for config and GUI, change
1523         behaviour as described in http://bugs.gpodder.org/show_bug.cgi?id=3
1524         * src/gpodder/trayicon.py: Clean-up and fix behaviour as described in
1525         our Bugzilla Bug #3 (see above); thanks to Jérôme Chabod for
1526         implementing all these changes and the patch
1528 Mon, 04 Feb 2008 09:32:56 +0100 <thp@perli.net>
1529 Output pretty-printed OPML when saving channels list
1531         * src/gpodder/opml.py: Patch from Nick (nikosapi.org) to output the
1532         channels.opml file pretty-printed, so it's easier to read and easier
1533         to edit when working on the file outside of gPodder
1535 Sun, 03 Feb 2008 23:02:47 +0100 <thp@perli.net>
1536 Don't code late at night, it breaks the sync code ;)
1538         * src/gpodder/sync.py: Add brackets because I wrote bad code in the
1539         first place (fix video sync for iPods); thanks to Dave Perdue
1540         <dave@minusvince.com> for reporting this in our bug tracker
1541         (Closes: http://bugs.gpodder.org/show_bug.cgi?id=28)
1543 Sat, 02 Feb 2008 11:36:35 +0100 <thp@perli.net>
1544 Make feed update display "Loading" titles, only run auto update when minimized
1546         * src/gpodder/gui.py: Usability patch from NIkosapi <nikosapi.org>:
1547         Make the feed update dialog display "Loading feeds" instead of
1548         "Downloading feeds" when its loading the feeds from the local cache;
1549         only run the automatic, periodic update when gPodder is minimized,
1550         because it would pop up a dialog while gPodder is in use otherwise
1552 Sat, 02 Feb 2008 11:33:48 +0100 <thp@perli.net>
1553 Pressing Enter in the add channel entry adds the channel
1555         * data/gpodder.glade: Usability patch from Nikosapi <nikosapi.org>:
1556         Add an action handler to the gladefile, so the user can simply press
1557         Enter in the gtk.Entry instead of having to tab to or click on the
1558         button for adding a channel
1560 Wed, 30 Jan 2008 09:47:21 +0100 <thp@perli.net>
1561 Fix another bug in file_modification_datetime
1563         * src/gpodder/util.py: Another problem that happens with special
1564         iTunesDB settings, thanks to FriedBunny <friedbunny@kulturny.com>
1566 Wed, 30 Jan 2008 09:23:19 +0100 <thp@perli.net>
1567 Fix a bug in the file size calculation
1569         * src/gpodder/util.py: calculate_filesize should deal with "None"
1570         passed as filename (now returns zero-size);
1571         Fixes: Bug #23 (http://gpodder.thegithouse.com/show_bug.cgi?id=23)
1572         Thanks to FriedBunny <friedbunny@kulturny.com> for reporting this
1573         issue in our bug tracker
1575 Mon, 28 Jan 2008 12:33:13 +0100 <thp@perli.net>
1576 Merge new sync code from thp's private branch
1578         * bin/gpodder: Add "--sync"/"-s" command-line option to start the
1579         device synchronization process from the CLI interface - syncing can
1580         now be scripted, baby :) (you still have to configure the sync device
1581         via the GUI first, though)
1582         * data/gpodder.glade: Simplify gPodderSync dialog and remove some
1583         obsolete options from the channel dialog
1584         * src/gpodder/console.py: Add code for command-line sync support
1585         * src/gpodder/gui.py: Remove obsolete code for libipodsync and import
1586         the new "sync" module; simplify Sync<->GUI interface; clean-up
1587         gPodderSync dialog code to interface with new sync code; remove some
1588         config glue code for the channel properties dialog
1589         * src/gpodder/libconverter.py: Make libconverter work even if the
1590         percentage callback would fail in certain conditions (try..except)
1591         * src/gpodder/libipodsync.py: Removed
1592         * src/gpodder/libpodcasts.py: Refactor age_in_days() and
1593         get_age_string() to simple calls to utility functions and move the
1594         code to gpodder.util
1595         * src/gpodder/sync.py: Added new sync module :) Very modular, yesaya!
1596         * src/gpodder/util.py: Add file_age_in_days() and file_age_to_string()
1597         helper functions that use code from libpodcasts and return the age of
1598         a file in the filesystem
1600 Thu, 24 Jan 2008 14:51:48 +0100 <thp@perli.net>
1601 Fix a bug for show_message and tray_icon/minimized
1603         * src/gpodder/gui.py: Fix a bug when messages are shown for
1604         non-gPodderMainWindow windows (that don't have tray_icon)
1606 Wed, 23 Jan 2008 11:55:35 +0100 <thp@perli.net>
1607 Make gpodder.desktop pass desktop-file-validate tests
1609         * data/gpodder.desktop: Update "Categories" and remove "Encoding",
1610         following the freedesktop.org Desktop Entry specification
1612 Wed, 23 Jan 2008 09:06:32 +0100 <thp@perli.net>
1613 Do not show notifications when gPodder is minimized
1615         * src/gpodder/gui.py: Merge patch from Jérôme Chabod to fix problems
1616         with the gPodder window re-appearing after having been minimized;
1617         use the notification icon when possible; initially reported by Shane
1618         Donohoe
1620 Tue, 22 Jan 2008 10:19:46 +0100 <thp@perli.net>
1621 Add "releasetest" target to Makefile (automated testing)
1623         * Makefile: Add "releasetest" target that can be used to do some
1624         automatic testing before releases; thanks to Götz Waschk for giving
1625         some hint on "desktop-entry-validate" :)
1627 Tue, 22 Jan 2008 10:09:16 +0100 <thp@perli.net>
1628 Use Episode Selector for per-channel new episodes
1630         * src/gpodder/gui.py: Reorganize code to use the episode selector for
1631         both all-channels and per-channel new episodes
1632         (Closes: http://gpodder.thegithouse.com/show_bug.cgi?id=14)
1634 Tue, 22 Jan 2008 09:42:01 +0100 <thp@perli.net>
1635 Fix problem in gpodder.desktop file
1637         * bin/gpodder: We're in development again (+svn)
1638         * data/gpodder.desktop: Fix problem in .desktop file (Thanks to Götz
1639         Waschk for reporting this bug, detected via desktop-entry-validate)
1641 Tue, 22 Jan 2008 08:20:33 +0100 <thp@perli.net>
1642 gPodder 0.10.4 "Faster Pussycats Kill" released
1644         * bin/gpodder: gpodder 0.10.4 released :)
1645         * README: gPodder 0.10.4 released :)
1646         * doc/man/gpodder.1: gPodder 0.10.4 released :)
1647         * data/po/de.po: Updated German translation
1648         * data/messages.pot: Updated from source
1649         * data/po/*.po: Updated from messages.pot
1651 Tue, 22 Jan 2008 08:13:42 +0100 <thp@perli.net>
1652 Create Bittorrent download directory on startup
1654         * src/gpodder/libgpodder.py: Create Bittorrent download directory on
1655         startup, so the first time gPodder preferences are shown, the download
1656         folder will exist and now throw an error
1658 Mon, 21 Jan 2008 21:41:59 +0100 <thp@perli.net>
1659 Updated French translation file with correct encoding
1661         * data/po/fr.po: Updated French translation with correct encoding by
1662         Jérôme Chabod - thanks!
1664 Mon, 21 Jan 2008 10:47:49 +0100 <thp@perli.net>
1665 Add support for sending files via Bluetooth
1667         * data/gpodder.glade: Add "Bluetooth" configuration page to
1668         preferences dialog
1669         * src/gpodder/config.py: Add Bluetooth-related configuration options
1670         * src/gpodder/gui.py: Add support for sending (and converting) files
1671         for bluetooth file transfer; add glue code for preferences dialog and
1672         configuration manager
1673         * src/gpodder/libgpodder.py: Add "tempdir" variable to gPodderLibClass
1674         that specifies a temporary directory to be used (currently only for
1675         converting files for bluetooth transfer, might be migrated to a
1676         configuration option later)
1677         * src/gpodder/util.py: Add discover_bluetooth_devices() function that
1678         searches for nearby devices (either via python-bluez or via hcitool,
1679         so one of them has to be installed as a dependency); add
1680         bluetooth_send_file() convenience function that starts a file transfer
1681         via Bluetooth OBEX - uses gnome-obex-send, which has to be installed
1682         for Bluetooth file transfer to work
1684 Mon, 21 Jan 2008 09:52:09 +0100 <thp@perli.net>
1685 Support for different audio/video player selection
1687         * data/gpodder.glade: Add video selection to preferences dialog
1688         * src/gpodder/config.py: Add "videoplayer" configuration option
1689         * src/gpodder/gui.py: Add glue code for configuration and preferences
1690         dialog (audio/video player selector)
1691         * src/gpodder/libgpodder.py: Add code to migrate from older gPodder
1692         configurations (videoplayer is set to "unspecified") to the same value
1693         as the currently selected audio player; when "playing" a file,
1694         determine the file type and start the right player application
1695         * src/gpodder/libplayers.py: Parameterize the UserAppsReader class to
1696         accept a mime type (e.g. "video" or "audio") after which to filter
1698 Mon, 21 Jan 2008 07:30:38 +0100 <thp@perli.net>
1699 Czech translation update: gpodder.desktop
1701         * data/gpodder.desktop: Ondrej Vesely <xorwen@gmai.com> added the
1702         Czech translation strings to the gpodder.desktop file - thanks
1704 Sun, 20 Jan 2008 22:50:13 +0100 <thp@perli.net>
1705 Added Czech translation by Ondrej Vesely
1707         * data/po/cs.po: Added (partial) Czech translation by Ondrej Vesely
1708         <xorwen@gmail.com>; the completed translation will be updated when
1709         it's done
1710         * setup.py: Add "cs" (Czech) to list of translations
1712 Sat, 19 Jan 2008 18:39:54 +0100 <thp@perli.net>
1713 Updated Swedish translation from Anders Kvist
1715         * data/po/sv.po: Thanks to Anders Kvist, the Swedish translation is
1716         now up-to-date again
1718 Sat, 19 Jan 2008 13:28:12 +0100 <thp@perli.net>
1719 Updated French translation from Jérôme Chabod
1721         * data/po/fr.po: Thanks to Jérôme Chabod, the French translation is
1722         now up-to-date again
1724 Thu, 17 Jan 2008 22:46:21 +0100 <thp@perli.net>
1725 Updated Dutch translation from Pieter De Decker
1727         * data/po/nl.po: Thanks to Pieter De Decker, the Dutch translation is
1728         now up-to-date again
1730 Thu, 17 Jan 2008 14:21:49 +0100 <thp@perli.net>
1731 Update translation template and translations from source
1733         * data/messages.pot: Updated potfile from source code
1734         * data/po/*.po: Updated translation templates from potfile
1736 Wed, 16 Jan 2008 08:36:12 +0100 <thp@perli.net>
1737 Remove the "Ignore" button in tray icon notifications
1739         * src/gpodder/trayicon.py: Remove the "ignore" action and button when
1740         a download has finished; the "ignore" button is redundant, as the same
1741         functionality can be achieved by clicking on the "x" of the bubble
1743 Tue, 15 Jan 2008 14:50:13 +0100 <thp@perli.net>
1744 Modularize calls to gobject.idle_add (for non-GTK support)
1746         * bin/gpodder: Set interface_is_gui to True when running the GUI
1747         * src/gpodder/*.py: Use util.idle_add instead of gobject.idle_add
1748         * src/gpodder/gui.py: Simplify some idle_add calls, code clean-up
1749         * src/gpodder/__init__.py: Add "interface_is_gui" boolean variable
1750         that tells us if we are running in GUI or CLI mode (this is needed for
1751         util.idle_add to determine if it's going to use the gobject module or
1752         not)
1753         * src/gpodder/util.py: Add new function idle_add() that acts as a
1754         wrapper to gobject.idle_add(); this will only use gobject.idle_add if
1755         we are in GUI mode, and will call the callback directly when we are in
1756         command-line mode (because we don't have to watch out for threading
1757         race conditions there, compared to what GTK+ gives us)
1759 Mon, 14 Jan 2008 20:23:02 +0100 <thp@perli.net>
1760 Add menu item that links to gPodder's new bug tracker
1762         * data/gpodder.glade: Add bug tracker item to help menu
1763         * src/gpodder/gui.py: Add code to open a webbrowser with the bug
1764         tracker when the bug tracker icon is clicked
1766 Mon, 14 Jan 2008 20:04:25 +0100 <thp@perli.net>
1767 Add a checkbox to keep episodes when removing channels
1769         * src/gpodder/gui.py: Add a checkbox to the confirmation dialog when
1770         removing a podcast channel, so the user has the option to remove the
1771         podcast feed from gPodder's subscription list, but still keep the
1772         downloaded files on the harddisk (via a checkbox in the dialog)
1773         (Closes: http://gpodder.thegithouse.com/show_bug.cgi?id=1)
1775 Thu, 10 Jan 2008 08:44:00 +0100 <thp@perli.net>
1776 Updated Russian translation by Hex
1778         * data/po/ru.po: Updated Russian translation by
1779         Hex <justin.forest@gmail.com>
1781 Wed, 09 Jan 2008 23:43:56 +0100 <thp@perli.net>
1782 Merge tray icon and notification patch by Jérôme Chabod
1784         * data/gpodder.glade: UI support for tray icon settings and
1785         configuration options for auto update feeds (auto update based on a
1786         patch by Nick (nikosapi.org)
1787         * src/gpodder/config.py: Add configuration options that support the
1788         tray icon, notification bubble and automatic update/close functions
1789         * src/gpodder/gui.py: Support the tray icon in the GUI; link the
1790         configuration options with the preferences dialog; re-work the channel
1791         update dialog to be more slipstreamed
1792         * src/gpodder/trayicon.py: Added new tray icon module by
1793         Jérôme Chabod <jerome.chabod@ifrance.com>; initial idea from old
1794         gPodder TODO list by Holger Bauer
1796 Wed, 09 Jan 2008 23:09:54 +0100 <thp@perli.net>
1797 Updated Swedish translation by Anders Kvist
1799         * data/po/sv.po: Swedish translation updated by
1800         Anders Kvist <kvistkvist@telia.com>
1802 Wed, 09 Jan 2008 11:52:23 +0100 <thp@perli.net>
1803 Use os.rename to make channel list saving atomic
1805         * src/gpodder/opml.py: Make the saving of the channel list atomic by
1806         first saving it to a temporary file and then using os.rename to really
1807         move the file in place (this should make the channel list saving very
1808         stable and protect against certain bad system conditions where the
1809         channel list is emptied); thanks to Jens Thiele <karme@berlios.de> for
1810         the suggestion and pointers to improve the channel saving code
1812 Sat, 05 Jan 2008 15:34:23 +0100 <thp@perli.net>
1813 Make logging in libpodcasts less verbose
1815         * src/gpodder/libpodcasts.py: Remove some verbose logging code
1817 Wed, 02 Jan 2008 15:39:04 +0100 <thp@perli.net>
1818 Migrate from channels.xml (from 0.9.4) to channels.opml if needed
1820         * src/gpodder/libgpodder.py: Add code to check if channels.xml exists
1821         but channels.opml doesn't and if so, try to convert from channels.xml
1822         to channels.opml, so users upgrading from 0.9.4 directly will have
1823         their channel list automatically converted;
1824         thanks to Tim Michelsen for the bug report and helpful Ubuntu info
1826 Tue, 01 Jan 2008 23:32:50 +0100 <thp@perli.net>
1827 Add download completion notification support
1829         * src/gpodder/download.py: Notify the download status manager when a
1830         download has been completed successfully
1831         * src/gpodder/services.py: Add download-complete signal to list of
1832         possible signals and download_completed() method to be used by
1833         downloads to notify the status manager of a successful download
1835 Sat, 29 Dec 2007 14:21:51 +0100 <thp@perli.net>
1836 Patch the feedparser module to correctly process democracynow.org
1838         * src/gpodder/cache.py: Add a patch_feedparser() method that checks of
1839         the feedparser module correctly maps the "plain" content-type to the
1840         correct "text/plain" content-type and if not, replace the
1841         mapContentType method with a fixed one; this should make the audio
1842         podcast on democracynow.org working (thanks to Clark Burbidge for the
1843         bug report)
1845 Sun, 23 Dec 2007 12:20:25 +0100 <thp@perli.net>
1846 Better username/password extraction from URLs
1848         * src/gpodder/util.py: Improve username and password extraction for
1849         authentication URLs; thanks to Nick <me@nikosapi.org> and Shane
1850         Donohoe <priestoftime@googlemail.com> for reporting this bug and
1851         sending in a patch; this should allow for e-mail address usernames
1853 Sat, 22 Dec 2007 11:44:41 +0100 <thp@perli.net>
1854 Also delete old episodes that have disappeared from the feed
1856         * src/gpodder/gui.py: When deleting old episodes automatically, also
1857         delete episodes that have disappeared from the RSS feed and are only
1858         available locally; thanks to Pieter De Decker <pdedecker@gmail.com>
1859         for the very detailed and helpful bug report :)
1861 Thu, 20 Dec 2007 01:33:15 +0100 <thp@perli.net>
1862 Stability updates: Feed cache update, old PyCairo versions
1864         * src/gpodder/draw.py: Add a workaround for pycairo versions less than
1865         1.1.6. Thanks to Chris Arnold for reporting this bug on the
1866         gpodder-devel mailing list and taking the time to test the patch and
1867         report back and provide useful information for debugging this error
1868         * src/gpodder/gui.py: Close the feed cache update dialog even when the
1869         user clicks on "cancel" (would have stayed there otherwise)
1871 Tue, 18 Dec 2007 10:13:44 +0100 <thp@perli.net>
1872 Merge "delete episode after sync" patch from Jérôme Chabod
1874         * data/gpodder.glade: Add GUI elements in preferences dialog to select
1875         what to do after episode sync (nothing, delete or mark played)
1876         * src/gpodder/config.py: Add "on_sync_delete" configuration option
1877         * src/gpodder/gui.py: Glue "on_sync_delete" config and GUI together
1878         * src/gpodder/libipodsync.py: If the configuration option
1879         on_sync_delete is set, remove the episode after successfully copying
1880         it to the iPod or MP3 player (the whole patch has been initially done
1881         by Jérôme Chabod <jerome.chabod@france.com> with some modifications)
1882         * src/gpodder/libpodcasts.py: Make delete_from_disk() a bit more
1883         robust, so it doesn't disturb libipodsync's functionality
1885 Mon, 17 Dec 2007 16:26:43 +0100 <thp@perli.net>
1886 Remove invalid channel cover images when loading fails
1888         * src/gpodder/libpodcasts.py: Remove the cover_file of a channel when
1889         it cannot be loaded (assume something went wrong when downloading the
1890         cover file); re-downloading the cover manually can solve the problem
1892 Mon, 17 Dec 2007 15:00:17 +0100 <thp@perli.net>
1893 Fix typo in last commit
1895         * src/gpodder/libipodsync.py: Fix typo in last commit
1897 Mon, 17 Dec 2007 11:21:10 +0100 <thp@perli.net>
1898 Modify played handling in iPod sync when "on sync mark played" is active
1900         * src/gpodder/libipodsync.py: Don't copy played state from PC to iPod
1901         if the on_sync_mark_played option is set
1903 Sat, 15 Dec 2007 15:58:23 +0100 <thp@perli.net>
1904 Merge patch from Leonid Ponomarev to gdfs
1906         * doc/dev/gdfs/gdfs-init.py: Merge patch from Leonid Ponomarev to add
1907         support for the system's native encoding, based on the $LANG
1908         environment variable. This should add support for episodes and
1909         channels with international characters as titles
1911 Sat, 15 Dec 2007 15:11:46 +0100 <thp@perli.net>
1912 Updated Dutch translation by Pieter De Decker
1914         * bin/gpodder: We're in development again: "+svn"
1915         * data/po/nl.po: Updated Dutch translation from Pieter De Decker
1917 Thu, 13 Dec 2007 08:32:54 +0100 <thp@perli.net>
1918 gPodder 0.10.3 "A Stop at Willoughby" released
1920         * bin/gpodder: gPodder 0.10.3 released :)
1921         * README: gPodder 0.10.3 released :)
1922         * doc/man/gpodder.1: gPodder 0.10.3 released :)
1923         * data/messages.pot: Updated from source
1924         * data/po/de.po: Updated German translation
1925         * data/po/*.po: Updated from messages.pot
1927 Thu, 13 Dec 2007 08:02:29 +0100 <thp@perli.net>
1928 Link the gPodder Documentation Wiki from the help pages
1930         * data/gpodder.glade: Help menu: gPodder Homepage (instead of website)
1931         and Documentation Wiki (instead of Mailing list)
1932         * src/gpodder/gui.py: Open gPodder Wiki instead of mailing list page
1934 Wed, 12 Dec 2007 21:39:03 +0100 <thp@perli.net>
1935 Remove TODO file from MANIFEST.in
1937         * MANIFEST.in: Of course we have to remove non-existing files from the
1938         MANIFEST.in file, too.. so TODO is now finally gone :)
1940 Wed, 12 Dec 2007 21:30:00 +0100 <thp@perli.net>
1941 Manage TODO list on the gPodder Wiki
1943         * TODO: Removed; new location: http://gpodderwiki.jottit.com/todo
1945 Wed, 12 Dec 2007 20:55:00 +0100 <thp@perli.net>
1946 Configuration for "old" episodes; automatically remove old episodes
1948         * src/gpodder/config.py: New boolean auto_remove_old_episodes
1949         configuration option that defaults to False (remove on startup)
1950         * src/gpodder/gui.py: Add code to automatically remove old, unplayed
1951         episodes on startup if the specific configuration options have been
1952         set; connect config manager to GUI items for the preferences dialog
1953         * data/gpodder.glade: Add checkbox for automatically removing old,
1954         unplayed episodes from gPodder on startup and a spinbutton to set the
1955         amount of days after which an episode is considered "old"
1957 Wed, 12 Dec 2007 19:44:15 +0100 <thp@perli.net>
1958 Merged episode locking patch from Paul Rudkin
1960         * src/gpodder/gui.py: Merged "lock episodes" patch to mark episodes as
1961         locked, patch by Paul Rudkin <paul@thegithouse.com>
1962         * data/gpodder.glade: Add menu item for toggle locked status
1963         * src/gpodder/libgpodder.py: Add "locked" history
1964         * src/gpodder/libpodcasts.py: When requesting a status icon, also draw
1965         the "Locked" status; is_locked() in podcastItem
1966         * src/gpodder/util.py: Added code for drawing a padlock icon on top of
1967         another (file type) icon; this is used for the "lock episodes" feature
1969 Tue, 11 Dec 2007 22:10:03 +0100 <thp@perli.net>
1970 Updated TODO list
1972         * TODO: Updated TODO list
1974 Mon, 10 Dec 2007 09:42:06 +0100 <thp@perli.net>
1975 Move observer code out of DownloadStatusManager into ObservableService
1977         * src/gpodder/services.py: Move out all observer-related code like
1978         registration, unregistration and notification to a new
1979         ObservableService class; subclass ObservableService in
1980         DownloadStatusManager; this makes the observer code in
1981         DownloadStatusManager re-usable (will be needed for new sync code)
1983 Mon, 10 Dec 2007 09:33:26 +0100 <thp@perli.net>
1984 Selective iPod episode clean-up; "delete older than X days"
1986         * src/gpodder/config.py: Add episode_old_age configuration variable;
1987         is an integer, defaults to 7. This is the number of days after which
1988         an episode will be considered "old"
1989         * src/gpodder/gui.py: iPod cleanup is now done selectively using the
1990         episode selector dialog; the code has been split, because we do not
1991         yet have an episode selector dialog for FS-based sync; add "Downloaded
1992         x days ago" column to "Delete old episodes" dialog and a corresponding
1993         button; call the callback even when no episodes are selected in
1994         gPodderEpisodeSelector
1995         * src/gpodder/libipodsync.py: Class variables of gPodder_iPodSync
1996         moved to __init__ to be instance variables (this should fix a bug that
1997         crops up now that we can selectively delete episodes); remove_tracks()
1998         and clean_playlist() have been modified/added to support new episode
1999         selector deletion code
2000         * src/gpodder/libpodcasts.py: Move is_played() to podcastItem from
2001         podcastChannel (it really belongs to the item; this makes code more
2002         readable in other parts of the codebase); add age_in_days(), is_old(),
2003         get_age_string() and age_prop to podcastItem
2004         * src/gpodder/util.py: New function: file_modification_datetime();
2005         returns a datetime.datetime instance of the MTIME (modification
2006         timestamp) of the filename given as parameter or None if the filename
2007         cannot be determined; this is used for the "old episodes" feature
2009 Sun, 09 Dec 2007 16:45:11 +0100 <thp@perli.net>
2010 Make has_converter() a bit more intelligent in detecting extensions
2012         * src/gpodder/libconverter.py: Convert given extension to lowercase
2013         and strip a leading "." from the extension, so calling code can also
2014         give the second value of the os.path.splitext() result directly to
2015         has_converter()
2017 Sun, 09 Dec 2007 13:20:49 +0100 <thp@perli.net>
2018 Fix pre-setting code for filechooser buttons; Patch by Paul Rudkin
2020         * src/gpodder/config.py: Fix pre-setting code for filechooser-related
2021         code; use set_current_folder() instead of set_filename()
2022         * src/gpodder/gui.py: Fix pre-setting code for filechooser-related
2023         code; thanks to Paul Rudkin <paul@thegithouse.com> for the patch
2025 Thu, 06 Dec 2007 09:37:57 +0100 <thp@perli.net>
2026 Support for itms:// links (direct links to the Apple iTunes Music Store)
2028         * src/gpodder/util.py: Support direct itms:// links by splitting out
2029         the iTunes Podcast links parsing routines. This should put us in for
2030         some nice iTunes podcast link support that will automagically
2031         translate iTunes podcast links to the correct RSS feed URL
2033 Thu, 06 Dec 2007 09:29:09 +0100 <thp@perli.net>
2034 Support for iTunes Podcast links (http://phobos.apple.com/...)
2036         * src/gpodder/util.py: Add support for subscribing to iTunes Podcast
2037         links (those with phobos.apple.com); new functions:
2038         parse_itunes_xml(), http_get_and_gunzip() and itunes_dicover_rss()
2040 Thu, 06 Dec 2007 09:15:57 +0100 <thp@perli.net>
2041 Added Galician translation from Teo Ramirez
2043         * data/gpodder.desktop: Added Spanish and Galician translations;
2044         thanks to Teo Ramirez <teoramirez@gmail.com>
2045         * data/messages.pot: Updated from source
2046         * data/po/de.po: Updated
2047         * data/po/gl.po: Added NEW Galician (gl) translation by Teo Ramirez
2048         * data/po/*.po: Updated from source
2049         * setup.py: Added Galician (gl) translation by Teo Ramirez
2051 Thu, 06 Dec 2007 08:35:12 +0100 <thp@perli.net>
2052 Sort channel list (finally ;)
2054         * src/gpodder/libpodcasts.py: Sort channels by lowercase title before
2055         returning the channel list in load_channels(); this automagically
2056         makes gPodder's channel list always sorted :)
2057         Thanks to FriedBunny <friedbunny@kulturny.com> for suggesting this and
2058         sending in an intial patch that led to this patch =)
2059         * TODO: Remove implemented item: Sort channel list
2061 Tue, 04 Dec 2007 23:28:27 +0100 <thp@perli.net>
2062 Do grayscale "pill" instead of theme-based colors (for bad themes)
2064         * src/gpodder/draw.py: Always draw the "pill" in semi-transparent
2065         black/grey shades so it will work for all GTK themes (even Ubuntu's)
2067 Mon, 03 Dec 2007 21:35:56 +0100 <thp@perli.net>
2068 Update channel navigator when iPod/MP3 player sync has finished
2070         * src/gpodder/gui.py: Update channel navigator when iPod sync has
2071         finished, so we can update the "played" status in the channel
2072         navigator when this status has changed after we've synced ("on sync
2073         mark played" option)
2075 Mon, 03 Dec 2007 21:24:17 +0100 <thp@perli.net>
2076 Add option to mark episodes as played after transfer to device
2078         * data/gpodder.glade: Option added to preferences dialog
2079         * src/gpodder/config.py: Add option "on_sync_mark_played"; will mark
2080         an episode as played when it gets transferred to a device
2081         * src/gpodder/gui.py: Glue code for GUI + gpodder.config
2082         * src/gpodder/libipodsync.py: On sync, mark episode as played if the
2083         user has selected the "on_sync_mark_played" option
2084         * TODO: Remove implemented/integrated items
2086 Sat, 01 Dec 2007 15:19:29 +0100 <thp@perli.net>
2087 Fix a fatal bug with first-run that prevents channel list saving
2089         * src/gpodder/util.py: Always use a file's parent directory to get the
2090         free disk space and return zero free disk space when the parent
2091         directory does not exist
2093 Thu, 29 Nov 2007 08:53:36 +0100 <thp@perli.net>
2094 Support for itpc:// URLs
2096         * src/gpodder/util.py: Add support for adding "itpc://" URLs (these
2097         are simply http:// URLs with a different schema, for iTunes)
2099 Tue, 27 Nov 2007 22:59:26 +0100 <thp@perli.net>
2100 Draw channel stats (unplayed, downloaded) on channel navigator
2102         * bin/gpodder: We're in development again, so add "+svn"
2103         * src/gpodder/draw.py: Added
2104         * src/gpodder/gui.py: Fix import of renamed "channels_to_model";
2105         re-assign new column numbers for treeChannels' data model; add
2106         cell renderer for pill pixbuf and remove cell renderer for status text
2107         * src/gpodder/libpodcasts.py: Add episode_is_new() function to
2108         podcastChannel to check if an episode can be considered "new"; use the
2109         episode_is_new function in get_new_episodes; add get_episode_stats()
2110         after an idea from Paul Rudkin <paul@thegithouse.com>; re-factor
2111         channels_to_model and clean out old, unused code and columns
2113 Mon, 26 Nov 2007 08:57:04 +0100 <thp@perli.net>
2114 gPodder 0.10.2 "Ein schweineschnauzen Sandwich, bitte!" released
2116         * bin/gpodder: gPodder 0.10.2 released :)
2117         * doc/man/gpodder.1: gPodder 0.10.2 released :)
2118         * README: gPodder 0.10.2 released :)
2120 Mon, 26 Nov 2007 08:52:49 +0100 <thp@perli.net>
2121 Translation updates
2123         * data/messages.pot: Refreshed from source
2124         * data/po/*.po: Refreshed from messages.pot
2125         * data/po/de.po: Updated German translation
2127 Sun, 25 Nov 2007 11:50:46 +0100 <thp@perli.net>
2128 Make sure there is enough free disk space when saving OPML channel list
2130         * src/gpodder/gui.py: Notify user that there's some problem saving the
2131         current channel list when save_channels() return False
2132         * src/gpodder/libpodcasts.py: Pass-through the return value of
2133         gpodder.opml.Exporter.write so calling code knows if saving the
2134         channel list was successful or not
2135         * src/gpodder/opml.py: Check free disk space before saving OPML
2136         channels in Exporter.write; thanks to Jens Thiele <karme@berlios.de>
2137         for reporting this bug on the Debian BTS (Closes: Debian Bug #452490)
2139 Thu, 22 Nov 2007 21:52:35 +0100 <thp@perli.net>
2140 Don't send Referer header when downloading episodes
2142         * src/gpodder/download.py: Some podcasts now implement an
2143         "anti-bandwidth-theft" code that should provide other websites from
2144         not linking to the episodes; as we have sent a Referer header
2145         containing the RSS feed URL, this causes problems; Referer header
2146         sending is therefore disabled now
2148 Sun, 18 Nov 2007 15:33:50 +0100 <thp@perli.net>
2149 TODO items from Katy G. B.
2151         * TODO: Updated TODO list
2153 Sat, 17 Nov 2007 18:38:36 +0100 <thp@perli.net>
2154 Backwards-compatibility for PyGTK less than 2.12 (for GtkTooltip)
2156         * src/gpodder/gui.py: Do not hook up tooltip handlers when we are
2157         using PyGTK less than 2.12 (which introduced the gtk.Tooltip API)
2159 Thu, 15 Nov 2007 11:07:42 +0100 <thp@perli.net>
2160 Check free disk space before copying files to iPod
2162         * src/gpodder/libipodsync.py: Check if the iPod's filesystem has
2163         enough free disk space before copying files over to it, as to not
2164         corrupt the iTunesDB in certain situations and fail when disk is full;
2165         thanks to Nicolas Quienot <niqooo@gmail.com> for the bug report
2166         * src/gpodder/util.py: Add get_free_disk_space() function that
2167         calculates the free (user-available) disk space on a given path
2169 Wed, 14 Nov 2007 21:55:18 +0100 <thp@perli.net>
2170 Add informative tooltips to channel navigator
2172         * src/gpodder/gui.py: Add tooltips to channel navigator that show a
2173         bigger cover image, the title, description, url and used disk space
2174         * src/gpodder/libpodcasts.py: Add save_dir_size property to
2175         podcastChannel that contains the disk usage of the channel's save_dir;
2176         this can be manually updated by calling update_save_dir_size() and
2177         will automatically be updated when the GUI code hooks into the
2178         channel; also add get_cover_pixbuf() that returns a pixbuf of the
2179         cover for a given size or None if there is no valid cover file
2181 Wed, 14 Nov 2007 19:19:11 +0100 <thp@perli.net>
2182 Slipstream code (enumerate instead of simple position tracking)
2183         * src/gpodder/libipodsync.py: Use enumerate() to iterate over a list
2184         of episodes instead of keeping track of the position "by hand"
2186 Wed, 14 Nov 2007 19:17:51 +0100 <thp@perli.net>
2187 Ignore initial window events from GtkWindow in Config
2189         * src/gpodder/config.py: Add a flag to config manager to ignore window
2190         events until the window has been realized; then, start taking position
2191         and size updates
2193 Mon, 12 Nov 2007 20:25:39 +0100 <thp@perli.net>
2194 Improve caching for HTTP redirects and minor errors; cache clean-up
2196         * src/gpodder/cache.py: Cache content when it comes from a HTTP
2197         redirect (301, 302, 307); cache feeds even with parsing errors, so we
2198         can "fill" our cache and not download on every startup
2199         * src/gpodder/libpodcasts.py: Add cache clean-up code after loading
2200         channels; this should keep the feedcache.db file smaller for users
2201         that like to try out new channels (or have used gPodder for a while)
2203 Sun, 11 Nov 2007 14:24:17 +0100 <thp@perli.net>
2204 Better file extension guessing for URLs
2206         * src/gpodder/util.py: Improve file_extension_from_url() by adding
2207         additional checks for known good extensions and recurse into the query
2208         string if it looks like an URL; this should fix compatibility problems
2209         for feeds with strange URLs; should provide more reliable guessing;
2210         thanks to Nicolas Quienot <niqooo@gmail.com> for the bug report
2212 Fri, 09 Nov 2007 10:05:36 +0100 <thp@perli.net>
2213 Fix format_filesize() usage in episodes selector and podcastItem
2215         * src/gpodder/gui.py: Use the correct (config-using) format_filesize()
2216         function to generate the total size string in the episode selector
2217         * src/gpodder/libpodcasts.py: Use the correct (config-usig
2218         format_filesize() function to generate the total size string in
2219         podcastItem; thanks to Pieter De Decker <pdedecker@gmail.com> for
2220         pointing that out
2221         * data/gpodder.glade: Use "Preferences" instead of "Preferences..."
2222         which feels a bit better in the GUI
2224 Thu, 08 Nov 2007 21:25:19 +0100 <thp@perli.net>
2225 Add "gPodder download folder synchronizer" scripts to repository
2227         * doc/dev/gdfs/gdfs-check.py: Added
2228         * doc/dev/gdfs/gdfs-init.py: Added
2229         * doc/dev/gdfs/README: Added
2231 Thu, 08 Nov 2007 20:01:13 +0100 <thp@perli.net>
2232 The mighty episode selector dialog and some menu re-arrangements
2234         * src/gpodder/gui.py: Move the "center_on_widget" keyword-based window
2235         positioning code to GladeWidget to be universally usable; update
2236         "Device" menu item on startup; new functions: delete_episode_list()
2237         and download_episode_list() that both operate on lists of episodes;
2238         add code for invoking gPodderEpisodeSelector for deleting old
2239         episodes; re-work on_itemDownloadAllNew_activate to use the episode
2240         selector instead of hand-crafting a message dialog text; add
2241         update_item_device() function that will handle the hiding, showing and
2242         renaming of the "Device" menu in the menubar; clean-up
2243         gPodderProperties with callback_finished setting (now kwarg-based);
2244         new, might, fancy, customizable and uber-sexy gPodderEpisodeSelector
2245         that will prove to be useful in some places in our codebase: it
2246         basically allows the user to select a subset of episodes from a given
2247         list in a quite sophisticated way; new "delete old episodes" menu item
2248         added for cleaning up gPodder's downloads
2249         * src/gpodder/libpodcasts.py: Add delete_from_disk() convenience
2250         method to podcastItem; other convenience properties and functions
2251         needed for the new episode selector dialog: pubdate_prop,
2252         get_filesize_string(), filesize_prop, get_channel_title(),
2253         channel_prop, get_played_string(), played_prop
2254         * data/gpodder.glade: new gPodderEpisode dialog; re-structuring of
2255         gPodder's main menu to be more usable and more compact; also added the
2256         Ctrl+K "Remove old episodes" menu item; also use the correct
2257         "multimedia-player" icon name of a not really representative icon
2259 Thu, 08 Nov 2007 12:07:30 +0100 <thp@perli.net>
2260 Support syncing to FS-based MP3 players without subfolders
2262         * data/gpodder.glade: Add checkbox "Create a subfolder for each
2263         channel" to preferences dialog and rename some widgets
2264         * src/gpodder/config.py: Add boolean "fssync_channel_subfolders"
2265         option that defaults to True (create subfolder for each channel)
2266         * src/gpodder/gui.py: Hook up config option fssync_channel_subfolders
2267         to preferences dialog; do more intelligent widget hiding for the
2268         "Player" tab in the preferences dialog (only show relevant widgets)
2269         * src/gpodder/libipodsync.py: Only append channel name as subfolder to
2270         destination folder name when the "fssync_channel_subfolders" option is
2271         True; suggested by Paul Elliot <omahns.home@gmail.com>
2273 Thu, 08 Nov 2007 11:28:17 +0100 <thp@perli.net>
2274 Fix offline cache behaviour when time is not set
2276         * src/gpodder/cache.py: Return cached_content in offline mode when
2277         cached_content "is not None" (instead of cached_time "is not None")
2279 Tue, 06 Nov 2007 12:37:41 +0100 <thp@perli.net>
2280 Process events before connecting Config to gtk windows
2282         * data/gpodder.glade: Remove default size for main gPodder window, as
2283         this is now handled by the config manager
2284         * src/gpodder/config.py: Process GTK events in the event queue before
2285         connecting to the "configure-event" signal, so we won't get two
2286         configure events for the window for the initial size change
2288 Mon, 05 Nov 2007 13:51:26 +0100 <thp@perli.net>
2289 Add error reporting when download fails because of an I/O error
2291         * src/gpodder/download.py: Catch and handle I/O errors in
2292         DownloadThread and format and pass on messages to GUI code when
2293         required; thanks to Florian Richter <Florian_Richter@gmx.de> for
2294         suggesting this feature after having a full disk
2295         * src/gpodder/gui.py: Update tree view when adding a new episode;
2296         add new notification() method and pass this method through to
2297         DownloadThread, so it can present messages to the user (i.e. errors)
2299 Mon, 05 Nov 2007 12:54:35 +0100 <thp@perli.net>
2300 Use util.find_command in more places (mplayer detection, ...)
2302         * src/gpodder/libgpodder.py: Use util.find_command to detect the
2303         existence of the "gnome-btdownload" command and spit out a warning log
2304         message when the command is not available
2305         * src/gpodder/libipodsync.py: Use util.find_command to check for an
2306         installed mplayer binary (instead of relying on os.system("which...")
2308 Mon, 05 Nov 2007 01:12:15 +0100 <thp@perli.net>
2309 Better command detection for the converter library
2311         * src/gpodder/libconverter.py: Detect existence of commands before
2312         invoking them for converting files; based on a patch by
2313         Nick (nikosapi.org); ConverterCollection is now a dict itself :)
2314         * src/gpodder/util.py: Add new find_command() function that will
2315         search the system's PATH for a specific executable command
2317 Mon, 05 Nov 2007 00:21:39 +0100 <thp@perli.net>
2318 Remove extracted cover art when deleting episode files
2320         * src/gpodder/util.py: Apply modified version of a patch from
2321         Nick (nikosapi.org) that is better suited for deleting cover art that
2322         has been extracted with the new eyeD3 cover art extraction code
2324 Mon, 05 Nov 2007 00:17:12 +0100 <thp@perli.net>
2325 Patch from Nick (nikosapi) to support eyeD3 cover art extraction
2327         * src/gpodder/libipodsync.py: Apply modified version of a patch from
2328         Nick (nikosapi.org) to utilize eyeD3 for cover art extraction in iPod
2329         sync code; remove dependency on PyID3
2330         * README: PyID3 is not a dependency anymore, as we can now use eyeD3
2331         for the same purpose (cover art extraction)
2333 Sat, 03 Nov 2007 14:14:09 +0100 <thp@perli.net>
2334 Fix format_filesize() function to be standards-conformant (unit prefixes)
2336         * src/gpodder/config.py: Add "use_si_units" configuration option; if
2337         True, the user will see SI units (MB, kB, ...); if False (the
2338         default); the user will see binary-prefix units (MiB, KiB, ..)
2339         * src/gpodder/libgpodder.py: Add pass-through function
2340         "format_filesize()" to gPodderLib that combines the
2341         util.format_filesize function with the gPodder-specific config option
2342         * src/gpodder/util.py: Apply a modified patch from Gerrit Sangel
2343         <z0idberg@gmx.de> to add support for SI units and binary prefixes to
2344         format_filesize(); this makes the function standards-compliant
2345         * src/gpodder/download.py: Updated to use new format_filesize
2346         * src/gpodder/gui.py: Updated to use new format_filesize
2347         * src/gpodder/libpodcasts.py: Updated to use new format_filesize
2349 Fri, 02 Nov 2007 17:28:05 +0100 <thp@perli.net>
2350 New Configuration/Settings Manager; massive code clean-ups
2352         * src/gpodder/config.py: Added new Configuration Manager that
2353         automatically keeps track of saving changed values and is also able to
2354         watch GTK widgets for changes; this should simplify our settings
2355         management and give us a single place for maintaining settings
2356         * src/gpodder/download.py: Access settings from new config manager
2357         * src/gpodder/gui.py: Make use of new config manager to connect
2358         widgets and settings from the GUI directly to the config manager;
2359         remove manual loading and saving of settings; auto-connect as much as
2360         possible in the gPodderProperties dialog to get real-time automatic
2361         configuration saving; fix the other code to use new config manager
2362         * src/gpodder/libgpodder.py: MASSIVE code clean-up; removed lots of
2363         old cruft and dead code that has been lying around in libgpodder for
2364         some time now; remove configuration code; utilize config manager;
2365         unify DownloadHistory+PlaybackHistory in new HistoryStore class;
2366         reduce number of import statements
2367         * src/gpodder/libipodsync.py: Access settings from new config manager
2368         * src/gpodder/libplayers.py: Removed dotdesktop_command()
2369         * src/gpodder/libpodcasts.py: Move locking functionality into this
2370         module, as locking is only used here; access config from new manager
2371         * src/gpodder/services.py: Use config manager to get settings
2372         * src/gpodder/util.py: Add format_desktop_command() function, based on
2373         the dotdesktop_command() function from libplayers
2375 Fri, 02 Nov 2007 07:49:38 +0100 <thp@perli.net>
2376 Add ability to open download folder from channel's context menu
2378         * src/gpodder/gui.py: Add "Open download folder" menu item to channel
2379         navigator context menu
2380         * src/gpodder/libgpodder.py: Add open_folder() method that will open
2381         the DE's default folder browser via "xdg-open"
2383 Thu, 01 Nov 2007 15:29:00 +0100 <thp@perli.net>
2384 Limit filename on FS-based sync to 50 characters
2386         * src/gpodder/libipodsync.py: Do not allow extremely long file names
2387         that could theoretically be generated by using data from RSS feeds;
2388         this is needed to make FAT-based drives work with files that would
2389         otherwise have file names that are too long
2391 Wed, 31 Oct 2007 15:22:32 +0100 <thp@perli.net>
2392 Escape RSS-provided strings in Pango markup
2394         * src/gpodder/gui.py: Escape strings in Pango markup
2395         * bin/gpodder: we're in development again, so "+svn"
2397 Sun, 28 Oct 2007 16:27:14 +0100 <thp@perli.net>
2398 gPodder 0.10.1 "Nukular, das Wort heißt Nukular" released
2400         * bin/gpodder: gPodder 0.10.1 released :)
2401         * doc/man/gpodder.1: gPodder 0.10.1 released :)
2402         * README: gPodder 0.10.1 released :)
2403         * data/messages.pot: Refreshed template from source files
2404         * data/po/de.po: Updated German translation for the 0.10.1 release
2405         * data/po/*.po: Refreshed translation files from template
2407 Sun, 28 Oct 2007 15:25:56 +0100 <thp@perli.net>
2408 Add "Save episode to file" handling to episode list context menu
2410         * data/gpodder.glade: Use a stock "Save As" button for the "Copy
2411         episode to file" button
2412         * src/gpodder/gui.py: Add new show_copy_dialog() method to GladeWidget
2413         that shows a copy dialog where a user can copy a file to a selected
2414         destination (this is used for "Save episode to file"); use
2415         show_copy_dialog in "Save As" in gPodderEpisode; add "Save episode to
2416         folder" menu item in episode list context menu and use
2417         show_copy_dialog to carry out the user interaction
2419 Sun, 28 Oct 2007 13:30:40 +0100 <thp@perli.net>
2420 Allow "https://" URLs for episode URLs, as we can handle these, too
2422         * src/gpodder/util.py: Allow "https://" as a valid URL scheme, as we
2423         can handle https URLs, thanks to Aravind Seshadri
2424         <aravind@aravind.name> who initially reported this bug
2426 Thu, 25 Oct 2007 14:00:01 +0200 <thp@perli.net>
2427 Sync videos to the "Video Podcasts" playlist instead of the "Video" menu
2429         * src/gpodder/libipodsync.py: Merged patch from Nicolas Quienot
2430         <niqooo@gmail.com> to sync videos to the "Video Podcasts" menu instead
2431         of the "Videos" menu, as documented on http://ipodlinux.org/ITunesDB
2433 Tue, 23 Oct 2007 09:24:52 +0200 <thp@perli.net>a
2434 sync_filename in podcastItem; cleanup; hide extra progressbar on transfer
2436         * src/gpodder/gui.py: Use podcastItem's sync_filename(); hide the
2437         unnecessary second progressbar when only syncing one channel (i.e.
2438         when clicking on the "transfer" button in the main window
2439         * src/gpodder/libgpodder.py: Remove unneeded lexists import and
2440         warning; clean-up
2441         * src/gpodder/libipodsync.py: Use podcastItem's sync_filename()
2442         * src/gpodder/libpodcasts.py: Add sync_filename() to podcastItem,
2443         returns the custom_sync_name or the title of the episode, based on the
2444         user's configuration settings for FS-based MP3 player sync
2446 Sun, 07 Oct 2007 14:38:31 +0200 <thp@perli.net>
2447 Add wishlist items to TODO list from Paul and Wilfred
2449         * TODO: New wishlist items, ideas and suggestions
2451 Sat, 06 Oct 2007 12:39:57 +0200 <thp@perli.net>
2452 Limit download progress status updates to reduce CPU load
2454         * src/gpodder/download.py: Limit the amount of status updates the
2455         download threads send to the DownloadStatusManager to one per second;
2456         this should make gPodder less CPU-intensive with many parallel
2457         downloads; thanks to Wilfred van Rooijen for reporting and testing
2459 Tue, 02 Oct 2007 17:59:29 +0200 <thp@perli.net>
2460 Update channel models (icons) after iPod synchronization
2462         * src/gpodder/gui.py: Call update_model() on each channel after an
2463         iPod sync, so we can update the played state on the available episodes
2464         lists when played state was changed by the iPod sync
2466 Sat, 29 Sep 2007 14:12:15 +0200 <thp@perli.net>
2467 Fix loading of channel metadata (load auth data and settings)
2469         * src/gpodder/libpodcasts.py: Load channel metadata when loading a
2470         podcastChannel object from OPML/LocalDB. This fixes a problem with
2471         authentication data being not loaded and also fixes a bug when the
2472         custom-set channel title was not correctly used throughout the GUI.
2473         Thanks to Nick (nikosapi) for reporting and providing a patch
2475 Tue, 25 Sep 2007 22:02:19 +0200 <thp@perli.net>
2476 Finally remove Desktop symlink code; several compatibility fixes
2478         * src/gpodder/download.py: Prevent divide-by-zero errors when
2479         calculating download speed
2480         * src/gpodder/gui.py: Prevent divide-by-zero errors when calculating
2481         percentage done in code for moving the downloaded items folder
2482         * src/gpodder/libgpodder.py: Remove the "Symlink on Desktop" code,
2483         because it's not GUI-accessible anymore and we didn't use it anyway
2484         * src/gpodder/opml.py: Better local filename detection by using
2485         os.path.exists() instead of .startswith('/'); this is also good for
2486         cross-platform compatibility where parts don't usually start with a
2487         forward slash (i.e. Win32)
2489 Mon, 24 Sep 2007 00:09:44 +0200 <thp@perli.net>
2490 Channel list selection bug fixes
2492         * src/gpodder/gui.py: Fix some channel list-related problems and
2493         annoyances, based on a patch by Nick (nikosapi)
2494         * bin/gpodder: We're in development again, so "+svn"
2496 Fri, 21 Sep 2007 02:07:43 +0200 <thp@perli.net>
2497 gPodder 0.10.0 "Hier spricht Frank Drebin" released
2499         * bin/gpodder: gPodder 0.10.0 released :)
2500         * doc/man/gpodder.1: gPodder 0.10.0 released :)
2501         * README: gPodder 0.10.0 released :) (and: updated dependencies)
2502         * TODO: Updated TODO list (some items are done for 0.10.0 :)
2504 Fri, 21 Sep 2007 02:05:10 +0200 <thp@perli.net>
2505 Updated translations from Rosetta (Launchpad.net)
2507         * data/po/es.po: Spanish translation by Julio Acuña
2508         * data/po/pt.po: Portuguese translation by Joel Calado (completed :)
2510 Fri, 21 Sep 2007 01:46:38 +0200 <thp@perli.net>
2511 Fix problems with path selection in treeChannels
2513         * src/gpodder/gui.py: Simple bugfix
2515 Fri, 21 Sep 2007 00:32:51 +0200 <thp@perli.net>
2516 Center gPodderEpisode on treeAvailable for less mouse hopping
2518         * src/gpodder/gui.py: If possible, center the gPodderEpisode dialog
2519         window on the treeAvailable, because that makes the position of the
2520         opened dialog more predictable and easier to use (as if the
2521         gPodderEpisode dialog was "inside" the treeView from which it opened)
2523 Fri, 21 Sep 2007 00:07:49 +0200 <thp@perli.net>
2524 Don't translate feed format string examples
2526         * src/gpodder/gui.py: Don't mark format string examples as
2527         translatable
2529 Wed, 19 Sep 2007 17:21:09 +0200 <thp@perli.net>
2530 Small bugfix for updating treeChannels when its model changes
2532         * src/gpodder/gui.py: Bugfix
2534 Wed, 19 Sep 2007 16:57:41 +0200 <thp@perli.net>
2535 Removed channel combobox, drag'n'drop improvements + new channel cover editor
2537         * data/gpodder.glade: Remove comboAvailable in gPodder (main window);
2538         add download+clear button in gPodderChannel, rename some items that
2539         are now used in code; make the channel navigator non-shrinkable (so
2540         it is always visible, because we don't have comboAvailable anymore)
2541         * src/gpodder/gui.py: Remove support for the channel combo box,
2542         also known as comboAvailable; clean-up DND code and make treeChannels
2543         the only DND target in the main window; remove some unnecessary
2544         updating of the channel list (calls to updateComboBox);
2545         Changes for the gPodderChannel dialog: Don't automatically download
2546         channel cover when dialog pops up; add "Download" and "Clear" buttons
2547         to the cover editor; add DND support for dropping local files or
2548         images from the web browser to the cover editor (for setting custom
2549         covers on channels with bad or no cover)
2550         * src/gpodder/libgpodder.py: Don't abort get_image_from_url() if the
2551         URL is invalid, but the image has already been downloaded (because we
2552         read the downloaded image in the code when it exists, without URL)
2554 Wed, 19 Sep 2007 14:23:40 +0200 <thp@perli.net>
2555 Center feed update dialog on main window; scroll reset in chan.navigator
2556         * src/gpodder/gui.py: Reset the current scroll position of the channel
2557         navigator when re-loading the channel list; this fixes an annoyance
2558         that Alistair Sutton <alistair.sutton@gmail.com> reported when dealing
2559         with a HUGE channel list (more than 50 channels); also removed the
2560         scroll position reset code from treeAvailable, as we already managed
2561         to only edit the model instead of re-loading it every time; added code
2562         to really center the feed update dialog on gPodder's main window
2564 Tue, 18 Sep 2007 20:15:56 +0200 <thp@perli.net>
2565 Replace wget with new gpodder.download module; User-agent support
2567         * bin/gpodder: Set "gpodder.user_agent" field on startup; remove check
2568         for wget, as this is not needed anymore
2569         * src/gpodder/cache.py: Clean-up; remove old logging code; add support
2570         for gpodder.user_agent; log info when there is an error in parsing the
2571         feed, so the user knows why this feed is not cached
2572         * src/gpodder/console.py: Remove DownloadPool, Use new
2573         gpodder.download module for carrying out downloads, remove
2574         wget_version() tester, as this is not needed anymore =)
2575         * src/gpodder/download.py: Added new downloader module that uses
2576         urllib and some custom classes and functions to provide the equivalent
2577         functionality of the obsolete "libwget", but without the wget
2578         dependency and with better accuracy (progress reporting, etc..)
2579         * src/gpodder/gui.py: Utilize new gpodder.download module instead of
2580         libwget
2581         * src/gpodder/__init__.py: Add "user_agent" variable to the gpodder
2582         module that holds the value of the "User-agent" header to send to web
2583         servers when requesting OPMLs, Feeds or download data
2584         * src/gpodder/opml.py: Add support for sending the User-agent header
2585         * src/gpodder/services.py: Make the progress column a float column to
2586         have smoother progress indicuation; add the "acquired" keyword
2587         argument to s_release(); default 'speed' to a translated "Queued"
2588         * src/gpodder/libwget.py: Removed
2589         * doc/dev/redhat-wget-output.txt: Removed
2591 Tue, 18 Sep 2007 02:30:04 +0200 <thp@perli.net>
2592 Refreshed pot files and po templates; updated German translation
2594         * data/messages.pot: Refreshed from current source
2595         * data/po/de.po: Refreshed and updated translation
2596         * data/po/*.po: Refreshed from new .pot file
2598 Tue, 18 Sep 2007 02:19:19 +0200 <thp@perli.net>
2599 Imported updated translations from Rosetta (Launchpad.net)
2601         * data/po/it.po: Italian translation updated by FFranci72
2602         * data/po/nl.po: Dutch translation updated by Roel Groeneveld
2603         * data/po/pt.po: Portuguese translation updated by Joel Calado
2605 Tue, 18 Sep 2007 02:14:19 +0200 <thp@perli.net>
2606 Offline support for feedcache, faster startup, code simplification
2608         * src/gpodder/cache.py: Add support for "offline" keyword argument
2609         * src/gpodder/gui.py: Make intelligent use of "offline" keyword
2610         argument when passed to load_channels(); simplify code for selecting
2611         the active channel in updateComboBox()
2612         * src/gpodder/libpodcasts.py: Pass-through of "offline" keyword
2613         argument in all relevant function calls
2615 Sat, 15 Sep 2007 16:22:28 +0200 <thp@perli.net>
2616 New LocalDB using DOM (removes python-xml dependency); channel context menu
2618         * bin/gpodder: Don't check for xml.sax package and modules anymore, as
2619         the dependency on python-xml has been removed with this release
2620         * data/gpodder.glade: Remove the "info" button for the current channel
2621         * src/gpodder/gui.py: Remove localdb-related code and adopt code for
2622         new LocalDB code; add context menu to channel navigator (edit/delete)
2623         * src/gpodder/libipodsync.py: Don't import "liblocaldb" module
2624         * src/gpodder/liblocaldb.py: Removed
2625         * src/gpodder/liblocdbreader.py: Removed
2626         * src/gpodder/liblocdbwriter.py: Removed
2627         * src/gpodder/liblogger.py: Add "traceback" keyword argument to the
2628         log() function; if "True" and in debugging mode, print traceback
2629         * src/gpodder/libpodcasts.py: Merge code from old liblocaldb and
2630         liblocdbreader/liblocdbwriter to this module as LocalDBWriter and
2631         LocalDBReader; customize podcastChannel to new LocalDB code
2632         * src/gpodder/libwget.py: Remove localdb-specific code (now obsolete)
2634 Wed, 12 Sep 2007 23:07:23 +0200 <thp@perli.net>
2635 Fix a bug when traversing directories with loop symlinks
2637         * src/gpodder/util.py: Don't dive into subdirectories that are
2638         symbolic links, this is to avoid a situation where looping symlinks
2639         result in the function dead-locking in a endless recursive loop,
2640         thanks to Bjørn Rasmussen <bjoernr@sensewave.com> for pointing that
2641         out and providing the necessary bug report to fix this issue
2643 Sun, 09 Sep 2007 18:47:20 +0200 <thp@perli.net>
2644 Mark episodes as downloaded/deleted when deleting episodes
2646         * src/gpodder/gui.py: Rename "Mark [...] as downloaded" to "Mark [...]
2647         as deleted" and mark episodes as downloaded when removing selected
2648         episodes that have not been downloaded yet, as suggested by Holger
2649         Leskien <holger leskien.com>
2650         * src/gpodder/libpodcasts.py: Fix problem when trying to delete
2651         episodes that have not been downloaded
2653 Sat, 08 Sep 2007 16:45:21 +0200 <thp@perli.net>
2654 Support for customized file names in MP3 player sync code
2656         * src/gpodder/gui.py: Add supporting code for reading/setting
2657         configuration options for the preferences dialog and a help display
2658         code that displays a guide on how to write custom sync name strings
2659         * src/gpodder/libgpodder.py: New configuration options:
2660         custom_sync_name (holds format string) and
2661         custom_sync_name_enabled (boolean, if the above string should be used)
2662         * src/gpodder/libipodsync.py: Use custom sync name format string and
2663         util's object_string_formatter() function to obtain a file name for
2664         the synchronized episode (or default to episode.title if disabled)
2665         * src/gpodder/libpodcasts.py: Add new property methods to podcastItem:
2666         basename (returns the basename of the URL, without extension) and
2667         published (returns the pubDate of the episode in YYYYMMDD format)
2668         * src/gpodder/util.py: New object_string_formatter() method that
2669         replaces {OBJECTNAME.ATTRNAME} substrings in a string with the
2670         corresponding values of passed-in keyword argument objects
2671         * data/gpodder.glade: Added preferences GUI elements
2673 Wed, 05 Sep 2007 10:14:09 +0200 <thp@perli.net>
2674 Check for installed python-xml package on startup (hard dependency)
2676         * bin/gpodder: Add dependency check for PyXML
2678 Sun, 02 Sep 2007 15:01:48 +0200 <thp@perli.net>
2679 Fix bug with default window title in gPodder window
2681         * src/gpodder/gui.py: Always set gPodder's default_title attribute
2683 Sun, 02 Sep 2007 14:33:21 +0200 <thp@perli.net>
2684 Updated Russian translation from Vladimir Zemlyakov
2686         * data/po/ru.po: Updated
2688 Sun, 02 Sep 2007 14:23:17 +0200 <thp@perli.net>
2689 More sanitizing hacks for ugly feeds we don't really like
2691         * src/gpodder/libpodcasts.py: Negotiate which enclosure to select from
2692         multiple enclosures, if there are more than one available; skip
2693         episodes with a buggy download URL (i.e. no supported URL scheme)
2694         * src/gpodder/util.py: Return "(unknown)" if file size cannot be
2695         determined from the string passed to format_filesize(); return "None"
2696         in file_type_by_extension() if the extension is an empty string
2698 Fri, 31 Aug 2007 23:38:01 +0200 <thp@perli.net>
2699 Handle enclosures (or lack thereof) better if fields are missing
2701         * src/gpodder/gui.py: Remove refetch_channel_list() function, as this
2702         is not called anywhere from the code (uh, how did i miss that?)
2703         * src/gpodder/libpodcasts.py: Be more liberal to enclosure tags
2704         without length or mime type; ignore episodes without enclosures (it's
2705         not len(enclosures) == 0, but the enclosures attribute doesn't even
2706         exist on entries without enclosures, so make sure to check for that
2708 Fri, 31 Aug 2007 20:03:03 +0200 <thp@perli.net>
2709 Use Python's webbrowser module for URL opening; channel dialog clean-up
2711         * bin/gpodder: Set version to 0.9.5+svn (this is where we are now)
2712         * data/gpodder.glade: Remove "cancel" button from gPodderChannel
2713         * src/gpodder/gui.py: Use "webbrowser" module for URL opening instead
2714         of relying on "gnome-open" to be available; remove event handler for
2715         gPodderChannel's "cancel" button
2717 Thu, 30 Aug 2007 21:06:28 +0200 <thp@perli.net>
2718 Dependency check for python-feedparser in bin/gpodder
2720         * bin/gpodder: Add dependency check and warning (with exit) if
2721         python-feedparser is not installed, as python-feedparser now is a
2722         dependency of gPodder
2724 Thu, 30 Aug 2007 20:51:46 +0200 <thp@perli.net>
2725 Support for modifying DownloadHistory and PlaybackHistory in GUI
2727         * data/gpodder.glade: Added menu items in gPodder main window
2728         * src/gpodder/gui.py: Add menu items to treeAvailable's context menu
2729         to toggle/set downloaded and played status on selected episodes
2730         * src/gpodder/libgpodder.py: Add del_item() function to
2731         DownloadHistory to support removing items from the history list;
2732         enhance history_mark_{played,downloaded}() functions for add/delete
2734 Thu, 30 Aug 2007 20:46:48 +0200 <thp@perli.net>
2735 Improved pubDate parsing; episode delete bugfix
2737         * src/gpodder/libpodcasts.py: Let feedparser parse the pubDate field
2738         of episodes and use new function in gpodder.util to convert the parsed
2739         pubDate to a string; bugfix for remove downloaded episode by URL
2740         * src/gpodder/util.py: Add updated_parsed_to_rfc2822() function that
2741         converts the "updated_parsed" field from feedparser to a RFC2822
2742         string
2744 Thu, 30 Aug 2007 12:03:24 +0200 <thp@perli.net>
2745 Remove obsolete documentation in doc/dev; cosmetic changes
2747         * data/po/Makefile: Upgrade to GPLv3
2748         * data/po/README: Mention i18n page on gPodder's website
2749         * doc/dev/build-deps-breezy.txt: Removed
2750         * doc/dev/debian.txt: Removed
2751         * doc/dev/i18n.txt: Removed
2752         * doc/dev/porting.txt: Removed
2753         * doc/dev/svncl.sed: Upgrade to GPLv3; modify look added and removed
2754         files
2756 Wed, 29 Aug 2007 20:26:50 +0200 <thp@perli.net>
2757 Upgrade to the GNU General Public License, Version 3
2759         * bin/gpodder: Upgrade to GPLv3
2760         * COPYING: Upgrade to GPLv3
2761         * doc/dev/copyright_notice: Upgrade to GPLv3
2762         * Makefile: Upgrade to GPLv3
2763         * README: Upgrade to GPLv3
2764         * setup.py: Upgrade to GPLv3
2765         * src/gpodder/*.py: Upgrade to GPLv3 (except for SimpleGladeApp and
2766         cache, as these are LGPL or other and do not originate from gPodder)
2768 Wed, 29 Aug 2007 19:32:22 +0200 <thp@perli.net>
2769 Integration changes, commit and ChangeLog migration
2771         * doc/dev/svncl.sed: Use tabs instead of 8 spaces for ChangeLog edit
2772         * Makefile: Make $EDITOR edit "ChangeLog" directly
2774 Wed, 29 Aug 2007 19:17:36 +0200 <thp@perli.net>
2775 Last batch of experimental change merges (up to svn r398)
2777         * doc/dev/tepache-howto.txt: Removed
2778         * doc/dev/tepache: Removed
2779         * src/gpodder/gui.py.orig: Removed
2780         * src/gpodder/libwget.py: Send progress = 0.0 on inital status update
2781         * src/gpodder/libpodcasts.py: Try to get episode metadata from several
2782         different properties of the corresponding feedparser entries; warn
2783         user when we couldn't get the episode title and try to get the episode
2784         title from the filename of the URL if we still have not found an
2785         episode title
2786         * src/gpodder/libgpodder.py: Add get_device_name() that returns a
2787         "nice" representative string of the currently selected device that can
2788         be used to represent the device in the GUI
2789         * src/gpodder/util.py: Return "(unknown)" string when bytesize in
2790         format_filesize() when the size has a negative value; make
2791         get_tree_icon() catch errors and be more corrent with icon creation;
2792         add get_first_line() function that extracts the first line of a string
2793         * src/gpodder/libipodsync.py: Add "divx" to list of video extensions
2794         * src/gpodder/services.py: DownloadStatusManager has a new observer
2795         notification: "progress-detail"; add unregister() functionality for
2796         observers; add request_progress_detail() function that can be used to
2797         force a "progress-detail" notification to be sent out to all relevant
2798         observers; remove get_url_by_iter() function as it is not needed
2799         anymore
2800         * src/gpodder/gui.py: Clean-up after tepache dependency removal; new
2801         GladeWidget base class that subclasses SimpleGladeApp and simplifies
2802         class creation for our gPodder windows; add context menu to
2803         treeAvailable; re-work play_or_download() and make it return a list of
2804         boolean indicators on which actions can be performed on the selected
2805         items; move show_message() and show_confirmation() to GladeWidget;
2806         disable editing of the URL in the channel info dialog, this simplifies
2807         code and editing the URL doesn't make so much sense anyway (adding the
2808         new url and removing the old does the same and is easier, code-wise);
2809         add support for cancelling downloads in the available podcasts view;
2810         support live status view and download cancelling in the gPodderEpisode
2811         dialog window by hooking up to DownloadStatusManager as observer
2812         * src/gpodder/SimpleGladeApp.py: Customize for gPodder (remove usage
2813         of weakref for keyword arguments -> properties of new object)
2814         * bin/gpodder: We're using a experimental development version now
2815         * data/gpodder.glade: Add progress bar and associated buttons to
2816         gPodderEpisode dialog
2817         * MANIFEST.in: Removed gpodder.py.orig inclusion
2818         * Makefile: Removed support for tepache
2820 Wed, 29 Aug 2007 19:05:57 +0200 <thp@perli.net>
2821 More changes from the experimental branch (up to svn r382)
2823         * src/gpodder/liblocdbreader.py: Clean-up
2824         * src/gpodder/libwget.py: Use "gpodder.services" instead of accepting
2825         a generic download status manager as constructor parameter; remove
2826         downloadStatusManager class (moved to gpodder.services)
2827         * src/gpodder/console.py: More clean-ups; use get_new_episodes()
2828         instead of duplicating code here; simplify the code for wget version
2829         detection
2830         * src/gpodder/libpodcasts.py: Improve channel/episode generation from
2831         feedparser objects (with error handling); utilize download status
2832         manager from "gpodder.services" instead of accepting a download status
2833         manager as parameter; clean up unneeded functions and rename some
2834         functions to make the code more readable; use util.get_tree_icon() for
2835         compositing a nice icon; remove the "played" column from the
2836         treemodel; add local_filename to treemodel
2837         * src/gpodder/liblocdbwriter.py: Clean-up
2838         * src/gpodder/libgpodder.py: Clean-up
2839         * src/gpodder/util.py: Add torrent_filename() function that tries to 
2840         extract the filename of the file a .torrent file contains; add
2841         file_extension_from_url() function that returns the file extension in
2842         a URL; add file_type_by_extension() that returns the type of a file
2843         based on its extension; add get_tree_icon() that loads a named icon
2844         and optionally adds a bullet to it (unplayed status indicator)
2845         * src/gpodder/libipodsync.py: Clean-up
2846         * src/gpodder/services.py: New module that currently contains the
2847         improved DownloadStatusManager and a single object that servces as
2848         download status manager for all parts of gpodder
2849         * src/gpodder/gui.py: Only one column for status/played; use
2850         "gpodder.services" for the download status manager; clean-up
2851         * src/gpodder/liblocaldb.py: Clean-up
2852         * bin/gpodder: Clean-up
2853         * data/gpodder.glade: Clean-up; removed "show played column"
2854         preference in gPodderProperties dialog
2856 Wed, 29 Aug 2007 18:49:37 +0200 <thp@perli.net>
2857 First import from experimental branch (up to svn r375)
2859         * src/gpodder/librssreader.py: Removed in favor of python-feedparser
2860         * src/gpodder/libwget.py: Percentage is now a float, don't set to 0
2861         when there has been an error
2862         * src/gpodder/console.py: Use {load,save}_channels methods; code
2863         cleanup and simplification
2864         * src/gpodder/cache.py: Add python-feedcache module from Doug Hellman
2865         * src/gpodder/libpodcasts.py: Use opml and feedcache for channel list
2866         and RSS reading; use shelve for new ChannelSettings class; clean-up
2867         podcastChannel and podcastItem; better TreeModel generator for
2868         podcastChannel (try to cache the model, only updates icons, etc...);
2869         remove downloadRss method in podcastChannel; move DownloadHistory and
2870         Playbackhistory to libgpodder; new load_channels() and save_channels()
2871         functions to save/load the channel list to an OPML file
2872         * src/gpodder/libgpodder.py: BIG clean-up; remove gPodderChannelWriter
2873         and gPodderChannelReader (this is now in libpodcasts as simple
2874         functions); add DownloadHistory and PlaybackHistory from libpodcasts; 
2875         * src/gpodder/gui.py: Use new functions for channel list
2876         loading/saving; only update treemodel for treeAvailable when it's
2877         really necessary
2878         * src/gpodder/liblocaldb.py: Remove unnecessary functions that have
2879         not been used for a while (treemodel-related); use load_channels()
2880         instead of gPodderChannelReader
2883 Wed, 29 Aug 2007 18:31:16 +0200 <thp@perli.net>
2884         * ChangeLog: Older changes can be found on the gPodder website at
2885         http://gpodder.berlios.de/releases/0.9.5/ChangeLog