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