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