Mon, 05 May 2008 15:55:02 +0200 <thp@perli.net>
[gpodder/nikosapi.git] / ChangeLog
blob0434d9129cde576606577a1b94734256884c428c
1 Mon, 05 May 2008 15:55:02 +0200 <thp@perli.net>
2 Add bug reporter for previous bug to list of contributors
4         * src/gpodder/gui.py: Add Jerry Moss to list of bug reporters
6 Mon, 05 May 2008 15:52:49 +0200 <thp@perli.net>
7 Make sure we have a valid channel on which to call get_new_episodes()
9         * src/gpodder/gui.py: Refactor on_btnDownloadNewer_clicked into the
10         single calling code and remove the callback; this should really fix
11         the problem described in LP bug 217113
12         (Closes: https://bugs.launchpad.net/ubuntu/+source/gpodder/+bug/217113)
14 Fri, 02 May 2008 17:42:54 +0200 <thp@perli.net>
15 Maemo-related changes; allow custom player on Maemo (optional)
17         * data/gpodder.glade: gPodder maemo preferences window should be
18         modal; Add "Ask before closing gPodder" checkbox to Maemo preferences
19         * src/gpodder/config.py: Add option "maemo_allow_custom_player" that
20         allows setting the "player" and "videoplayer" variables to a command
21         that will be called, like on the Desktop version (instead of always
22         opening Nokia's Media Player with all files)
23         * src/gpodder/gui.py: Maemo-specific UI tweaks
24         * src/gpodder/libgpodder.py: Only call Nokia's Mediaplayer when we are
25         on Maemo and when "maemo_allow_custom_player" is set to False
27 Fri, 02 May 2008 17:28:22 +0200 <thp@perli.net>
28 Change "Channel" to "Podcast"; new main menu; URL entry updated; +niceties
30         * data/gpodder.glade: Change "Channel" to "Podcast"; re-structure main
31         menu in gPodder window
32         * src/gpodder/config.py: Add "show_podcast_url_entry" configuration
33         option that controls whether the podcast url entry box is shown in the
34         main window or not; add observer functionality to the configuration
35         manager, so UI elements can "watch" the configuration manager for
36         changes of UI-related configuration options
37         * src/gpodder/console.py: Change "Channel" to "Podcast"
38         * src/gpodder/gui.py: Hildon-specific file open/save dialogs; default
39         "Enter podcast URL..." test for the URL entry box; size-dependent
40         showing and hiding of podcast icon and downloaded count pixmap also
41         for the Desktop version; change "Channel" to "Podcast"; offer
42         first-time users to see a list of example podcasts to subscribe to;
43         dynamic main menu; code supporting the main menu changes; add code for
44         sending the subscription list via e-mail; import from OPML file in
45         addition to import from OPML URL; remove unneeded callbacks (wishlist,
46         select all, ...); optionally set title and hide url entry in the
47         gPodderOpmlLister (OPML import GUI); Add Frank Harper to list of
48         contributors (initial reporter of bug #82)
49         * src/gpodder/libgpodder.py: Add "send_subscriptions" function that
50         sends the user's channels.opml file via E-Mail (using xdg-email);
51         rename "Channel" to "Podcast"
52         (Closes: http://bugs.gpodder.org/show_bug.cgi?id=82)
53         (Closes: http://bugs.gpodder.org/show_bug.cgi?id=103)
55 Fri, 02 May 2008 15:52:31 +0200 <thp@perli.net>
56 Updated Portuguese translation by João Trindade
58         * data/gpodder.desktop: Updated Portuguese translation
59         * data/po/pt.po: Updated Portuguese translation
60         * src/gpodder/gui.py: Add João Trindade to list of contributors
62 Thu, 01 May 2008 11:20:28 +0200 <thp@perli.net>
63 Fix a spelling mistake in the French translation
65         * data/po/fr.po: Fixed French translation from Jérôme Chabod; thanks
66         to drust for pointing out the spelling mistake
67         (Closes: http://bugs.gpodder.org/show_bug.cgi?id=101)
69 Tue, 29 Apr 2008 20:21:45 +0200 <thp@perli.net>
70 Fix problems with resizing the treeview on Maemo
72         * src/gpodder/gui.py: Fix problems with treeview resizing and remove
73         printing the percentage
74         * bin/gpodder: We're in development again, so "+svn"
76 Sat, 26 Apr 2008 08:34:37 +0200 <thp@perli.net>
77 Merge gPodder 0.11.2 release stuff and German translation update
79         * bin/gpodder: Updated version and release date
80         * data/po/de.po: Updated German translation
81         * data/messages.pot: Updated from source code
82         * data/po/*.po: Updated from messages.pot
83         * doc/man/gpodder.1: Updated manpage for release
84         * README: Updated README for release
86 Thu, 24 Apr 2008 19:40:55 +0200 <thp@perli.net>
87 Maemo-specific dialogs and UI improvements
89         * data/gpodder.glade: Maemo-specific "Add Podcast" dialog and
90         Maemo-specific, stripped-down "Preferences" dialog added
91         * src/gpodder/gui.py: Hide channel add UI from main window; make label
92         for update button even shorter; hide cover and pill cells in the
93         channel list if it gets too small; Maemo-specific dialogs for both
94         adding channels and editing preferences
96 Thu, 24 Apr 2008 18:19:02 +0200 <thp@perli.net>
97 Maemo finger-friendly updates; minor UI changes
99         * data/gpodder.glade: Ellipsize the feed update progressbar in the
100         middle instead of the end (to show progress)
101         * src/gpodder/gui.py: Add support for finger-friendly widget (buttons,
102         scroll areas, popup menus, etc..); text is "Loading [...]" when
103         loading feed cache and "Updating [...]" when updating feeds; on Maemo,
104         don't set the tab title to the current episode title; hide the heading
105         in gPodderEpisodeSelector on Maemo (to save screen space); add
106         finger_friendly_widgets class attribute to several gPodder windows;
107         make the tabs in the main window a bit taller, but remove the border
108         around the main window to gain some space on the screen
110 Thu, 24 Apr 2008 15:48:58 +0200 <thp@perli.net>
111 Updated Swedish translation by Anders Kvist
113         * data/po/sv.po: Updated Swedish translation by Anders Kvist
115 Wed, 23 Apr 2008 22:31:42 +0200 <thp@perli.net>
116 Merge patch from Junio C Hamano to fix problems with zero-length in feeds
118         * src/gpodder/gui.py: Update list of contributors/patch writers
119         * src/gpodder/services.py: Patch from Junio C Hamano to fix a problem
120         when a feed has zero length, which would otherwise result in a
121         divide-by-zero error
123 Tue, 22 Apr 2008 21:57:31 +0200 <thp@perli.net>
124 Typo from previous commit
126         * src/gpodder/libpodcasts.py: Fix typo
128 Tue, 22 Apr 2008 21:54:01 +0200 <thp@perli.net>
129 Diverse changes, code clean-ups and other small annoyances
131         * src/gpodder/config.py: Make sure we can load a default set of
132         configuration options, even if we are in CLI mode
133         * src/gpodder/download.py: Don't display a traceback when logging a
134         cancelled download
135         * src/gpodder/gui.py: Add Doug Hellmann to contributors/coders list in
136         the about dialog (Doug Hellmann has done the feed cache code); do not
137         center the gPodderEpisode dialog on the treeAvailable widget (this
138         looks ugly ;)
139         * src/gpodder/libpodcasts.py: Clean up import statements; Make sure we
140         always have icon names, even in CLI mode; Remove "is_music_channel"
141         property of podcastChannel (not needed anymore); 
143 Tue, 22 Apr 2008 21:15:40 +0200 <thp@perli.net>
144 Python code fixup: Compare "None" with "is not" instead of "!="
146         * src/gpodder/config.py: "!= None" => "is not None"
147         * src/gpodder/download.py: "!= None" => "is not None"
148         * src/gpodder/gui.py: "!= None" => "is not None"
149         * src/gpodder/libconverter.py: "!= None" => "is not None"
150         * src/gpodder/libgpodder.py: "!= None" => "is not None"
151         * src/gpodder/libpodcasts.py: "!= None" => "is not None"
152         * src/gpodder/services.py: "!= None" => "is not None"
153         * src/gpodder/util.py: "!= None" => "is not None"
155 Tue, 22 Apr 2008 20:30:28 +0200 <thp@perli.net>
156 Non-modal feed cache updates
158         * data/gpodder.glade: Feed cache update UI changes
159         * src/gpodder/gui.py: Fix problem with maemo window showing all
160         widgets on start; feed cache update changes; update list of
161         contributor (bug reporter for the cancel/skip button feature request
162         * src/gpodder/libpodcasts.py: Support cancelling a running feed cache
163         update by switching to offline mode when the cancel button is pressed
164         in load_channels(); idea by Paul Elliot, Pieter De Decker, Jürgen
165         Schinker and others, see the bug report page for more information
166         (Partly fixes: http://bugs.gpodder.org/show_bug.cgi?id=16)
168 Sat, 19 Apr 2008 20:16:11 +0200 <thp@perli.net>
169 Better tray icon menu item on Maemo-based platforms
171         * src/gpodder/trayicon.py: Better tray icon integration (show/hide
172         gPodder via tray icon) on Maemo
174 Sat, 19 Apr 2008 18:46:30 +0200 <thp@perli.net>
175 Additional fields for the device remove episodes dialog; refactoring
177         * src/gpodder/gui.py: Add "Podcast" and "Released" columns to the
178         episode selector; hide all columns in our "delete from device" episode
179         selector that have all rows set to "None"; make the first text column
180         of the gPodderEpisodeSelector bigger, so the episode selector is
181         easier to read when there are many columns
182         * src/gpodder/libpodcasts.py: Use util.format_date() for
183         cute_pubdate() in podcastItem
184         * src/gpodder/sync.py: Document SyncTrack a bit better, add
185         needed/possible keyword arguments that are used in the UI; default
186         some values to None in case they are not provided; get "released" date
187         from iPod's iTunesDB and get podcast name from MP3 player's sync
188         folder (if this feature has been activated)
189         * src/gpodder/util.py: Add format_date() function that converts a Unix
190         timestamp to a good representation for a date (either Today,
191         Yesterday, a weekday or the locale's appropriate representation); the
192         code has been re-factored from podcastItem's cute_pubdate() function
193         in gpodder.libpodcasts and is now used from there
195 Thu, 17 Apr 2008 17:54:48 +0200 <thp@perli.net>
196 Calculate total percentage based on byte size instead of percentage
198         * src/gpodder/download.py: Make sure we save the right size of a
199         currently in-progress download of an episode
200         * src/gpodder/services.py: Calculate the total percentage for all
201         episodes based on their file size instead of their percentage done;
202         this is especially important when downloading small files mixed with
203         large files; this makes the estimated download time more reliable;
204         thanks to Jérôme Chabod, who has done this patch
205         (Closes: http://bugs.gpodder.org/show_bug.cgi?id=46)
207 Thu, 17 Apr 2008 17:42:31 +0200 <thp@perli.net>
208 Clean up preferences dialog + Move download settings to downloads tab
210         * data/gpodder.glade: UI-related changes to the preferences dialog
211         clean-up and the moving of the download settings to the downloads tab;
212         thanks to Paul Rudking for the download settings to downloads tab
213         patch
214         * src/gpodder/download.py: Better rate limiting, implemented by Paul
215         Rudkin
216         * src/gpodder/gui.py: UI-related changes to the preferences dialog
217         clean-up; the download settings changes are by Paul Rudkin
218         * src/gpodder/services.py: Improve the waiting/locking for the maximum
219         number of simultaneous downloads using a threading.Event
220         (Closes: http://bugs.gpodder.org/show_bug.cgi?id=69)
221         (Closes: http://bugs.gpodder.org/show_bug.cgi?id=83)
223 Tue, 15 Apr 2008 21:01:19 +0200 <thp@perli.net>
224 Updated French translation by Jérôme Chabod
226         * data/po/fr.po: Updated French translation by Jérôme Chabod
228 Tue, 15 Apr 2008 20:57:51 +0200 <thp@perli.net>
229 Merge patch from Jérôme Chabod to really pimp the tray icon tooltip :)
231         * src/gpodder/gui.py: Add some error reporting and change the code a
232         bit to support the new tooltips; thanks to Jérôme Chabod
233         * src/gpodder/trayicon.py: Add support for more elaborate tray icon
234         tooltips; patch by Jérôme Chabod
235         (Closes: http://bugs.gpodder.org/show_bug.cgi?id=97)
237 Mon, 14 Apr 2008 13:51:23 +0200 <thp@perli.net>
238 Add bug reporter to list of contributors
240         * src/gpodder/gui.py: Bug #95 was reported by Tomas Matheson, so add
241         him to the list of contributors
243 Mon, 14 Apr 2008 13:45:34 +0200 <thp@perli.net>
244 Set Close and cancel buttons to the default on most dialogs
246         * data/gpodder.glade: Apply patch from Jerome Chabod that sets the
247         close and cancel buttons on most dialogs of gPodder to the default and
248         give them focus; this makes keyboard navigation possible and should
249         make it easier for keyboard fans to use gPodder UI :) This partially
250         fixes bug #95, but there are still some things to do for this bug.
252 Mon, 14 Apr 2008 13:40:32 +0200 <thp@perli.net>
253 Merge patch from Jerome Chabod to fix Remove podcasts for MP3 players
255         * src/gpodder/gui.py: Add warning message when we can't find a needed
256         attribute; add "Philippe Gouaillier" to list of contributors (bug
257         reporter for this bug)
258         * src/gpodder/sync.py: Add playcount attribute to MP3 player sync code
259         (Closes: http://bugs.gpodder.org/show_bug.cgi?id=96)
261 Mon, 14 Apr 2008 13:37:03 +0200 <thp@perli.net>
262 Updated Russian translation by Leonid Ponomarev
264         * data/po/ru.po: Updated Russian translation by Leonid Ponomarev
266 Mon, 14 Apr 2008 13:33:44 +0200 <thp@perli.net>
267 Merge patch from Jerome Chabod to fix tray icon freeze (bug #55)
269         * src/gpodder/trayicon.py: Merge patch from Jerome Chabod to fix the
270         problem with the tray icon actions reported in bug #55; this is
271         basically attachment #33 with some cosmetic fixes
272         (Closes: http://bugs.gpodder.org/show_bug.cgi?id=55)
274 Sun, 13 Apr 2008 22:27:28 +0200 <thp@perli.net>
275 Updating message files from source code for 0.11.2 freeze
277         * data/messages.pot: Updated from source code
278         * data/po/*.po: Updated from messages.pot
280 Fri, 11 Apr 2008 10:26:50 +0200 <thp@perli.net>
281 Correct "Close" and "Quit" behaviour
283         * data/gpodder.glade: Add a "Close" menu item to the podcasts menu and
284         rename the quit item to "Quit" (from "Close) to make the interface
285         more consistent and to support both Ctrl+W and Ctrl+Q
286         * src/gpodder/gui.py: Correct "Close" and "Quit" behaviour and make
287         Close be the "minimize to tray" function when the tray icon is
288         enabled; when not enabled, "Close" acts the same way as "Quit" (but is
289         left visible, so the Ctrl+W shortcut also works to close gPodder);
290         thanks to Harley Laue for the suggestion and initial patch
291         (Closes: http://bugs.gpodder.org/show_bug.cgi?id=89)
293 Fri, 11 Apr 2008 10:11:33 +0200 <thp@perli.net>
294 Make RSS .torrent feeds from different Torrent sites work
296         * src/gpodder/libpodcasts.py: If an episode doesn't have an enclosure,
297         but its link looks like it's a media/torrent file, we are going do
298         interpret that as the enclosure URL; this makes feeds from different
299         torrent sites work with gPodder; thanks to Josh Gardner
300         <mellowcellofellow@gmail.com> for reporting this bug on Bugzilla
301         (http://bugs.gpodder.org/show_bug.cgi?id=74)
303 Tue, 08 Apr 2008 10:54:01 +0200 <thp@perli.net>
304 Updated Spanish translation
306         * data/po/es.po: Updated Spanish translation from Julio Acuña
308 Mon, 07 Apr 2008 23:06:53 +0200 <thp@perli.net>
309 Makre sure we can re-set the locale after changing it
311         * src/gpodder/util.py: Make sure we can re-set the locale after
312         changing it, and if we cannot, only print a warning, but don't throw
313         the exception outside of the function
315 Mon, 07 Apr 2008 23:05:05 +0200 <thp@perli.net>
316 Add 64x64 icon for Maemo's main menu and install it
318         * data/icons/64/gpodder.png: Added
319         * setup.py: Install the 64x64 icon in share/icons/hicolor
321 Mon, 07 Apr 2008 11:47:12 +0200 <thp@perli.net>
322 Install "pixmaps" icon on Maemo, too
324         * setup.py: Make sure we also install the "/usr/share/pixmaps/"
325         version of the gPodder icon on Maemo (for the task navigator)
327 Mon, 07 Apr 2008 11:24:54 +0200 <thp@perli.net>
328 Fix problems with the tray icon emblems
330         * src/gpodder/trayicon.py: Fix emblem drawing code for non-square
331         icons; use the "refresh" icon for feed updates and "multimedia-player"
332         icon for the iPod/MP3 player sync status emblem
334 Sun, 06 Apr 2008 17:22:11 +0200 <thp@perli.net>
335 Fix install Makefile bug; add donator; fix treeview header height
337         * Makefile: Add "generators" dependency for the "install" target
338         * src/gpodder/gui.py: Add Mark Alford (donator) to contributors list;
339         remove the hard-coded header height offset for the treeview, because
340         we don't need it anymore, because we hide the header (this is a good
341         thing, because we don't need to rely on a theme-specific header
342         height compared to what we did previously - one FIXME less :)
344 Sun, 06 Apr 2008 02:05:34 +0200 <thp@perli.net>
345 Initial upstream support for the Maemo platform (Nokia Internet Tablets)
347         * bin/gpodder: Add "--maemo/-m" option to enable running as a Maemo
348         application (this is only useful on Nokia Internet Tablets or in the
349         Maemo SDK environment); determine interface type and set the correct
350         variables on startup (gpodder.interface)
351         * data/gpodder.glade: Increase the default size of some widgets to
352         better fit the screens on Maemo (it won't do any harm on the "big"
353         Desktop screen
354         * data/icons/26/gpodder.png: Added
355         * data/icons/40/gpodder.png: Added
356         * data/maemo/gpodder.desktop: Added
357         * Makefile: Help2man variable; new "make mtest" target that runs
358         gPodder in Maemo scratchbox (probably useless for all other things);
359         update the command descriptions; don't run the "generators" target
360         from the "install" target; don't run "gen_graphics" from the
361         "generators" target, but make it depend on the 24-pixel logo, which
362         itself depends on the 22-pixel logo; this way, all should work out
363         well when trying to install on systems without ImageMagick installed;
364         remove *.pyo files on "make clean"
365         * setup.py: Support for build targets; use "TARGET=maemo" to enable
366         Maemo-specific installation options and files
367         * src/gpodder/config.py: Increase the WRITE_TO_DISK_TIMEOUT to 60
368         seconds, so we don't unnecessarily stress memory cards (on ITs);
369         modify default path variables on Maemo (/media/mmc2)
370         * src/gpodder/gui.py: Maemo-specific changes; clean-up the main window
371         a bit and make message and confirmation dialogs Hildon-compatible
372         * src/gpodder/__init__.py: Add enums for interface types: CLI, GUI and
373         MAEMO; remove the "interface_is_gui" variable and replace with
374         "interface", which is now used to determine where we are running
375         * src/gpodder/libgpodder.py: Use /media/mmc2/gpodder/ as configuration
376         folder on Maemo; use Nokia's Media player to playback files on Maemo
377         * src/gpodder/libpodcasts.py: Icon name changes (Maemo-specific)
378         * src/gpodder/trayicon.py: Maemo support; swap popup menu on Maemo;
379         Add support for hildon banners instead of pynotify on Maemo
380         * src/gpodder/util.py: Icon name changes (Maemo-specific); use new
381         gpodder.interface variable in idle_add
383 Sat, 05 Apr 2008 21:06:14 +0200 <thp@perli.net>
384 Make i18n help text work in the console help (gpodder --help)
386         * bin/gpodder: Fix a bug that would make the localized help string of
387         the CLI break; thanks to Pavel Mlcoch <pavkamlc@centrum.cz> for
388         reporting this bug on the gPodder bug tracker
389         (Closes: http://bugs.gpodder.org/show_bug.cgi?id=53)
391 Fri, 04 Apr 2008 09:50:35 +0200 <thp@perli.net>
392 Use the correct multimedia-player icon for the transfer main menu item
394         * data/gpodder.glade: Use the multimedia-player icon for the transfer
395         to device menu item (was still gtk-network, forgot to change)
397 Fri, 04 Apr 2008 09:48:25 +0200 <thp@perli.net>
398 Fix gPodder freeze with open notifications on quit
400         * src/gpodder/trayicon.py: Fix a bug when gPodder would freeze when
401         a notification bubble was still open while closing the main
402         application; thanks to Jérôme Chabod for reporting this issue
403         (Closes: http://bugs.gpodder.org/show_bug.cgi?id=55)
405 Fri, 04 Apr 2008 09:46:23 +0200 <thp@perli.net>
406 Increase filename size limitation from 50 to 100 chars in MP3 player sync
408         * src/gpodder/sync.py: Increase the number at which file names are cut
409         down in length to 100 characters and also cut folder names to that
410         length; thanks to Bernd Schlapsi for reporting this bug on the list
412 Sun, 30 Mar 2008 10:48:41 +0200 <thp@perli.net>
413 Make the Quit buttons actually quit when using the tray icon
415         * src/gpodder/gui.py: Patch from Nick L. to make the function of all
416         "Quit" buttons really quit gPodder and only make the window's "X"
417         button act as "minimize to tray" button; Also, update the credits name
419 Sat, 29 Mar 2008 17:13:26 +0100 <thp@perli.net>
420 Project management updates (authors, contributors and copyright)
422         * AUTHORS: Removed (was outdated); content now in gui.py (AboutDialog)
423         * bin/gpodder, data/po/Makefile, doc/dev/copyright_notice, 
424           doc/dev/win32/setup-win32.py, INSTALL, Makefile, README,
425           setup.py: Updated Copyright and old website URL to include 2008, the
426           gPodder team and www.gpodder.org
427         * src/gpodder/*.py: Updated Copyright years
428         * src/gpodder/gui.py: Add list of contributors from AUTHORS file and
429         from the content on the website's news page (please mail me if I
430         forgot to mention you as a contributor, I surely have missed a few);
431         make the AboutDialog's application name "gPodder" (from gpodder) and
432         add an URL hook function to the AboutDialog, so the website is opened
433         in the user's default web browser
435 Sat, 29 Mar 2008 16:30:02 +0100 <thp@perli.net>
436 Report errors in parsing/loading an already-added channel in the navigator
438         * src/gpodder/gui.py: Show the error from feedparser in the channel's
439         tooltip if there has been an error loading the channel
440         * src/gpodder/libpodcasts.py: Make sure we can load a default title
441         when using get_by_url(); save the parse_error variable for each
442         channel (it defaults to None if there is no error); mark the
443         description text for the channel navigator in red color if there has
444         been a parser error and add the parse_error variable to the liststore
445         model
446         * src/gpodder/util.py: Strip whitespace before and after the string in
447         remove_html_tags()
449 Sat, 29 Mar 2008 16:18:59 +0100 <thp@perli.net>
450 Add support for Rockbox' AudioScrobbler logfile to update played status
452         * src/gpodder/config.py: Add "mp3_player_use_scrobbler_log"
453         configuration option (defaulting to False) which controls if we are
454         going to try and find a ".scrobbler.log" file that contains
455         information on which tracks have been played; for this to work, you
456         also have to enable the "Updated tags after download" option
457         * src/gpodder/sync.py: Support for finding the .scrobbler.log file and
458         updating the played status of episodes in the MP3 player sync code
459         * src/gpodder/util.py: Add "find_mount_point()" function that tries to
460         determine the mount point on which the given directory (or file) lies
461         and returns the mount point or "/" if the directory/file resides on
462         the root filesystem.
464         This whole patch has been contributed by Nick <nikosapi.org> - thanks!
466 Sat, 29 Mar 2008 16:16:06 +0100 <thp@perli.net>
467 Merge sv.po translation from 0.11.1 release tarball
469         * data/po/sv.po: It seems like I somehow messed up the translations
470         merge, so here's the correct sv.po translation file, merged from the
471         0.11.1 tarball; thanks to Anders Kvist <kvistkvist@telia.com> for
472         pointing that out :)
474 Sat, 29 Mar 2008 01:20:46 +0100 <thp@perli.net>
475 Make sure we ignore the updated_parsed of a channel if it's None
477         * src/gpodder/libpodcasts.py: Only try to convert the "updated_parsed"
478         field if it's not "None"
479         * src/gpodder/util.py: Make sure we receive a valid 9-tuple when
480         converting dates from updated_parsed; if we receive a None value or
481         some value that isn't "9" in length, return None
482         Thanks to Chris Arnold <carnold@electrichendrix.com> for reporting
483         this bug on the gpodder-devel mailing list
485 Thu, 27 Mar 2008 13:10:58 +0100 <thp@perli.net>
486 This is trunk, so set version to 0.11.1+svn
488         * bin/gpodder: Set version to 0.11.1+svn
490 Thu, 27 Mar 2008 12:57:56 +0100 <thp@perli.net>
491 gPodder 0.11.1 "Attacked by Killer Tomatoes" released
493         * bin/gpodder: gPodder 0.11.1 released :)
494         * README: gPodder 0.11.1 released :)
495         * doc/man/gpodder.1: gPodder 0.11.1 released :)
496         * data/icons/24/gpodder.png: Updated from the dataset
497         * data/messages.pot: Updated from source
498         * data/po/*.po: Updated from messages.pot
499         * data/po/de.po: Updated German translation
501 Thu, 27 Mar 2008 11:52:35 +0100 <thp@perli.net>
502 Use cPickle for dumbshelve - it's compatible and faster
504         * src/gpodder/dumbshelve.py: Improve saving of channel cache and
505         metadata (and basically all that currently depends on dumbshelve) by
506         using cPickle as a drop-in replacement for pickle
508 Thu, 27 Mar 2008 11:28:31 +0100 <thp@perli.net>
509 Fix problem with pickle when there is a feed parsing exception
511         * src/gpodder/cache.py: When the feedparser returns an exception, this
512         will be stored as object in bozo_exception. Convert this to a string,
513         so the pickle module doesn't complain; thanks to VladDrac in #python
514         on FreeNode for pointing me to the right direction to fix this bug
516 Mon, 24 Mar 2008 10:42:19 +0100 <thp@perli.net>
517 Add "3gp" to the list of video file extensions, so we detect these files
519         * src/gpodder/util.py: Add the .3gp video file extension to the list
520         of known video file extensions, so we can detect that these are video
521         files and act accordingly (in the UI and on sync); thanks to Atte
522         André Jensen for reporting this bug on the gpodder-devel mailing list
524 Sun, 23 Mar 2008 10:39:24 +0100 <thp@perli.net>
525 Fix a bug when loading invalid image data (delete cover file then)
527         * src/gpodder/libgpodder.py: Fix a bug when gPodder is unable to load
528         an invalid cover image (i.e. when dragging a linked image from the
529         browser to the gPodder window, the link is sent, not the image)
531 Sat, 22 Mar 2008 21:08:06 +0100 <thp@perli.net>
532 Make bluetooth device discover a bit nicer
534         * src/gpodder/gui.py: Improve bluetooth device discovery button by not
535         destroying its design when it has been clicked and the label is
536         modified
538 Sat, 22 Mar 2008 20:45:27 +0100 <thp@perli.net>
539 Revert previous insanity (where I selected an awful "Transfer" toolbar icon)
541         * data/gpodder.glade: I wonder why I selected "gtk-network" as the
542         icon for the "Transfer" button on gPodder's toolbar. It surely is
543         irritating and illogical as hell.. Hmm. Anyway - now, there is a nice
544         "multimedia-player" icon which probably depicts an iPod-like device
545         if you use a good icon set. This makes much more sense. Go usability!
547 Sat, 22 Mar 2008 20:41:54 +0100 <thp@perli.net>
548 Add "Visit website" menu items to channel and episode list; simple chan menu
550         * src/gpodder/gui.py: Add "Visit website" menu items to the context
551         menu of both the episode list and the channel navigator; also, make
552         the channel context menu easier to use by replacing the old
553         "Edit [Channelname]" and "Remove [Channelname]" items with stock items
555 Sat, 22 Mar 2008 18:41:30 +0100 <thp@perli.net>
556 Fix "Podcasts not being marked as new when synced to iPod" (#70)
558         * src/gpodder/sync.py: Fix bug when podcasts were not marked as new
559         when synced to iPod and "on_sync_mark_played" was enabled;
560         Bug URL: http://bugs.gpodder.org/show_bug.cgi?id=70
561         Thanks to defrex (defrex0 gmail com) for report this bug in Bugzilla
563 Thu, 20 Mar 2008 11:21:06 +0100 <thp@perli.net>
564 Delay loading of UserAppsReader and improve libplayers
566         * src/gpodder/gui.py: Only load UserAppsReader's database three
567         seconds after gPodder start (because we only need it when the user
568         opens the preferences dialog, and if she opens it before these three
569         seconds, the UserAppsReader data is loaded on demand); because we load
570         the database (and generate the model) before we display the
571         preferences dialog, the preferences dialog usually comes up faster
572         than before (except for the situation where it is opened right after
573         gPodder startup); have only one UserAppsReader for audio/video and not
574         both (would duplicate the amount of work needed to read desktop
575         files); cleanup some UserAppsReader-related code in the prefs dialog
576         * src/gpodder/libplayers.py: Improve the reading code and make it
577         possible to support multiple mime types per-UserAppsReader (i.e. both
578         audio and video types are read by a single UAR instance); clean up the
579         imports for this module and do other related changes to make the code
580         nicer to read and understand
582 Thu, 20 Mar 2008 11:18:51 +0100 <thp@perli.net>
583 Add option to limit the maximum number of episodes per feed
585         * src/gpodder/config.py: Add "max_episodes_per_feed" configuration
586         option (int, defaults to 200) that determines the maximum number of
587         episodes that are parsed per channel/feed; if there are more episodes,
588         they are ignored. This value can be adjusted via the extended
589         configuration editor if you need more episodes
590         * src/gpodder/libpodcasts.py: Add support for the
591         max_episodes_per_feed configuration option above
593 Thu, 20 Mar 2008 11:13:16 +0100 <thp@perli.net>
594 Fix bug with unneeded download directory being created
596         * src/gpodder/libpodcasts.py: Fix bug when an unneeded download
597         directory would be created on every gPodder startup
599 Thu, 20 Mar 2008 11:11:18 +0100 <thp@perli.net>
600 Only serialize DumbShelve to disk when we have changed/deleted items in it
602         * src/gpodder/dumbshelve.py: Add a "__dirty" flag to DumbShelve to
603         know if we have to write the DumbShelve to the disk or if nothing has
604         changed since the last write (and therefore no need to run the
605         time-consuming serialization code again); this speeds up initial
606         loading time and probably also speeds up other parts of the code
608 Thu, 20 Mar 2008 11:09:27 +0100 <thp@perli.net>
609 Timestamp and benchmark functions for logger
611         * src/gpodder/liblogger.py: Add support for timestamping and benchmark
612         functions to liblogger, so we see the microtime since gPodder startup
613         and can also use the logging module to benchmark the speed of certain
614         code parts; this is helpful for our performance patches :)
616 Thu, 20 Mar 2008 11:07:48 +0100 <thp@perli.net>
617 Performance-improving patch from Nick (nikosapi) to html entity replacement
619         * src/gpodder/util.py: Merge patch from Nick (nikosapi.org) to really
620         improve performance of the HTML tag stripper/entity replacement code
621         by using regular expressions and some more intelligent code for
622         converting numeric entities to Unicode characters
624 Thu, 20 Mar 2008 11:06:32 +0100 <thp@perli.net>
625 Add demo code for displaying a splash screen
627         * doc/dev/splash-logo.py: Added testing code that would display a
628         splash screen (transparent if compositing is enabled); we currently
629         don't plan to use this code for reasons described on gpodder-devel
631 Thu, 20 Mar 2008 10:04:14 +0100 <thp@perli.net>
632 Filter "None" filenames from GtkFileChooser widgets
634         * src/gpodder/config.py: Make sure we don't receive a "None" filename
635         from GtkFileChooser widgets when connecting to the config manager
637 Wed, 19 Mar 2008 18:06:58 +0100 <thp@perli.net>
638 Change the context menu of the episode list popup menu
640         * src/gpodder/gui.py: Simplify, re-structure and improve the context
641         menu of the episode list popup menu (right-click menu); thanks to hex
642         (justin.forest gmail.com) for suggesting this change and giving
643         valuable input on gpodder-devel
645 Wed, 19 Mar 2008 15:45:15 +0100 <thp@perli.net>
646 Patch from Nikosapi to fix MP3 player sync progress
648         * src/gpodder/sync.py: Patch from Nick (nikosapi.org) to fix MP3
649         player sync problems: "Instead of displaying the proper percentage of
650         the copied file in the FS-based sync dialog, gPodder would initially
651         report 100% and near the end of the copy it would report percentages
652         >100%."
654 Wed, 19 Mar 2008 15:02:10 +0100 <thp@perli.net>
655 Various Bluetooth-related fixes
657         * data/gpodder.glade: Use the "bluetooth" icon instead of the (old?)
658         "stock_bluetooth" icon; in Gnome 2.22, the "bluetooth" icon is nicer,
659         i.e. more Tango-ish than the "stock_bluetooth" icon
660         * src/gpodder/gui.py: Fix a logging error; Only show "Send to [...]
661         via bluetooth"/"Send to bluetooth device" when we have already
662         downloaded the episodes (won't obviously work otherwise..)
663         * src/gpodder/util.py: Fix bluetooth_send_file to work with both
664         bluetooth-sendto and gnome-obex-send (different command line argument
665         format for both)
667 Sun, 16 Mar 2008 12:55:49 +0100 <thp@perli.net>
668 Python-feedparser is a dependency, so mention it in the README
670         * README: Mention python-feedparser as a dependency in the README
671         file; thanks to Alain Tauch for pointing this out on the mailing list
673 Wed, 12 Mar 2008 12:38:19 +0100 <thp@perli.net>
674 Updated translations for 0.11.1 stabilization period
676         * data/messages.pot: Updated from source
677         * data/po/*.po: Updated from messages.pot
679 Tue, 11 Mar 2008 18:53:25 +0100 <thp@perli.net>
680 Add option to write gtkpod extended database on sync
682         * data/gpodder.glade: Add a check box for the new config option
683         * src/gpodder/config.py: Add ipod_write_gtkpod_extended boolean
684         configuration variable that controls if we want to write iTunesDB.ext
685         after synchronization (defaults to False)
686         * src/gpodder/gui.py: Glue code for UI<->Config manager
687         * src/gpodder/sync.py: Use libgpod's "gtkpod" module to write the
688         extended gtkpod database (iTunesDB.ext) to the iPod after sync - this
689         has to be enabled via an option
691 Tue, 11 Mar 2008 18:44:19 +0100 <thp@perli.net>
692 Fix problem with old PyGTK versions when importing gpodder.trayicon
694         * src/gpodder/gui.py: Apply patch from Bill Barnard
695         <bill@barnard-engineering.com>, based on a patch from Jérôme Chabod
696         <jerome.chabod@ifrance.com> that makes sure we can import the tray
697         icon module. If not, we disable the tray icon functionality
699 Mon, 10 Mar 2008 16:37:38 +0100 <thp@perli.net>
700 Add support for creating M3U playlist files in download folders
702         * src/gpodder/config.py: Add "create_m3u_playlists" boolean
703         configuration option (default False) that controls if we want to
704         generate per-channel M3U playlists in our download folders
705         * src/gpodder/gui.py: Add context menu entry for manually updating an
706         M3U playlist for the channel navigator (only visible when updating m3u
707         playlists is enabled
708         * src/gpodder/libpodcasts.py: Add update_m3u_playlist() function to
709         podcastChannel and call it when removing and adding downloaded
710         episodes
711         * src/gpodder/util.py: Add sanitize_filename() function that tries to
712         encode a file name in the system's encoding, stripping all chars that
713         are invalid on FAT32 and other systems (e.g. slash, etc..)
715 Thu, 06 Mar 2008 17:46:21 +0100 <thp@perli.net>
716 Be less verbose, consider episodes with length<=100 to have invalid length
718         * src/gpodder/libpodcasts.py: Remove verbose logging for episode
719         metadata (seems to work now); consider episodes with a small length
720         value to have invalid length, i.e. try to find the length of the
721         episode by looking at the HTTP header; thanks to Bernd
722         <schlaber@gmail.com> for sending in the feed URL with which this bug
723         happens (length was 1) during the gPodder workflow survey :)
725 Tue, 04 Mar 2008 12:15:53 +0100 <thp@perli.net>
726 Fix KeyError bug in custom_selection_button_clicked (from LP)
728         * src/gpodder/gui.py: Fix problem with localized strings on the custom
729         selection buttons, i.e. pass the label to the function directly
730         instead of relying on the gtk.Button to have the label in the correct
731         encoding (LP: #192918); thanks to Pavel Mlčoch for reporting this bug
732         on Launchpad
734 Tue, 04 Mar 2008 12:05:23 +0100 <thp@perli.net>
735 Fix AttributeError bug in updateTreeView (from LP)
737         * src/gpodder/gui.py: Make sure that we have a valid "active_channel"
738         when updating the tree view (LP: #183667); thanks to red26wings for
739         reporting this bug on Launchpad
741 Mon, 03 Mar 2008 23:06:30 +0100 <thp@perli.net>
742 Add support for changing the URL of a subscribed channel (bug #42)
744         * data/gpodder.glade: Make the URL entry in the channel dialog
745         editable
746         * src/gpodder/gui.py: Add support for changing the URL of a subscribed
747         channel (i.e. move from the "latest" RSS feed to the "complete" RSS
748         feed, as is the case with Chaosradio podcasts, for example); ask user
749         if she really wants to move; handle case where the new URL is wrong
750         by reverting to old URL; Improve code for moving the download
751         directory; thanks to Steve Garcia <sgarcia@bak.rr.com> for the bug
752         report
754 Mon, 03 Mar 2008 21:14:55 +0100 <thp@perli.net>
755 Small fix for moving downloads progress bar
757         * src/gpodder/gui.py: Make sure the value for set_fraction of the
758         progress bar is in 0.0..1.0
760 Mon, 03 Mar 2008 20:53:15 +0100 <thp@perli.net>
761 Add "Go to website" buttons to episode and channel (bug #43)
763         * data/gpodder.glade: Add "Go to website" buttons to episode and
764         channel info dialogs
765         * src/gpodder/gui.py: Add code to open website URL or hide the "Go to
766         website" button when there is no valid website link for an episode or
767         channel
769 Mon, 03 Mar 2008 20:37:02 +0100 <thp@perli.net>
770 Move webbrowser code to util.open_website; fix URLs to gpodder.org
772         * src/gpodder/gui.py: Use new gpodder.org URLs; use
773         util.open_website() instead of directly interfacing with threads and
774         the "webbrowser" module
775         * src/gpodder/util.py: New function open_website() that takes care of
776         opening the system's default web browser and opening the specified URL
778 Sun, 02 Mar 2008 14:20:56 +0100 <thp@perli.net>
779 Make "gl" a global-accessible object in libgpodder
781         * doc/dev/gdfs/gdfs-check.py: Adapt to new structure of gPodderLib
782         * src/gpodder/*.py: Use "gl" instead of all incarnations of
783         "gPodderLib()" or "libgpodder.gPodderLib()", and weed out all "gl =
784         gPodderLib() lines, because it makes the code look unnecessarily
785         bloated ;)
786         * src/gpodder/libgpodder.py: Make "gl" a global instance of the
787         gPodderLib() object, and rename gPodderLibClass to gPodderLib and do
788         some more cleaning-up
790 Sun, 02 Mar 2008 14:03:40 +0100 <thp@perli.net>
791 Move gPodderLib().open_folder to util.gui_open
793         * src/gpodder/gui.py: Use util.gui_open instead of gl.open_folder
794         * src/gpodder/libgpodder.py: Remove open_folder (move to gpodder.util)
795         * src/gpodder/util.py: Add gui_open function that uses xdg_open to
796         open files and folders with their default application in the GUI
798 Sun, 02 Mar 2008 13:52:42 +0100 <thp@perli.net>
799 Pickle-based storage method (dumbshelve); HTTP HEAD requests; buggy feed fixes
801         * src/gpodder/dumbshelve.py: Added (replacement for "shelve" using
802         pickle)
803         * src/gpodder/libgpodder.py: Rename *.db files to *.pickle.db, so we
804         don't clash with old-style shelve .db files
805         * src/gpodder/libpodcasts.py: Use dumbshelve as a replacement for
806         shelve; add EpisodeURLMetainfo that keeps track of metainfo downloaded
807         via HTTP HEAD requests; make getting episode length and pubDate a bit
808         more intelligent by trying to find correct values via HTTP HEAD;
809         improve episode sorting by falling back to episode titles when no
810         pubDate has been found (or pubDate is equal); 
811         * src/gpodder/util.py: Add get_episode_info_from_url() function that
812         tries to find out the length and pubDate of an episode by looking at
813         the data from the HTTP HEAD; also support HTTP proxys via an optional
814         "proxy" keyword argument
816 Wed, 27 Feb 2008 10:44:48 +0100 <thp@perli.net>
817 Notify user about no new episodes when updating from tray icon
819         * src/gpodder/gui.py: Patch from Jérôme Chabod
820         <jerome.chabod@ifrance.com> to notify the user about "no new episodes"
821         when updating the feed cache manually via the tray icon
822         (Closes: http://bugs.gpodder.org/show_bug.cgi?id=3)
823         * src/gpodder/trayicon.py: See above
825 Wed, 27 Feb 2008 09:52:14 +0100 <thp@perli.net>
826 Use xdg-open for files that we don't know the file type of
828         * src/gpodder/libgpodder.py: If the file we want to open/play is not
829         an audio or video file, we use "xdg-open" to open the file (this is
830         used for things like PDF files and the like, e.g. in Chaos TV)
832 Wed, 27 Feb 2008 09:46:55 +0100 <thp@perli.net>
833 Add Flash Video (flv) and Windows Media Video (wmv) to file detection
835         * src/gpodder/util.py: Detect *.flv and *.wmv files as video files
837 Wed, 27 Feb 2008 09:39:42 +0100 <thp@perli.net>
838 When sending via Bluetooth, always rename/copy the file
840         * src/gpodder/gui.py: When sending files via Bluetooth, and the file
841         converter script is not enabled, we are simply copying the file to the
842         sync_filename of the episode, therefore creating a nice name. We have
843         to copy the file, because neither gnome-obex-send nor bluetooth-sendto
844         let us specify the destination filename when sending the file, these
845         utilities always take the input filename (thanks to Chris
846         <gpodder@noreply.org.uk> for the bug report)
847         (Closes: http://bugs.gpodder.org/show_bug.cgi?id=49)
849 Tue, 26 Feb 2008 16:49:06 +0100 <thp@perli.net>
850 Python code fixup: Compare "None" with "is" instead of "=="
852         * doc/dev/daap2rss.py: "== None" => "is None"
853         * src/gpodder/config.py: "== None" => "is None"
854         * src/gpodder/gui.py: "== None" => "is None"
855         * src/gpodder/libgpodder.py: "== None" => "is None"
856         * src/gpodder/libpodcasts.py: "== None" => "is None"
858 Tue, 26 Feb 2008 16:30:56 +0100 <thp@perli.net>
859 Add support for new "bluetooth-sendto" utility
861         * README: Ask for either "gnome-obex-send" or "bluetooth-sendto",
862         which are needed for the Bluetooth file transfer
863         * src/gpodder/util.py: Add support for "bluetooth-sendto" as an
864         alternative to "gnome-obex-send"; initial bug report and patch by
865         Leonid Ponomarev (this probably adds bluez-gnome as an optional
866         dependency if you want bluetooth send support)
868 Mon, 25 Feb 2008 15:51:16 +0100 <thp@perli.net>
869 Show more description text in episode list
871         * src/gpodder/libpodcasts.py: Join all lines and strip unnecessary
872         data for the episode description that is displayed in the episode list
873         when descriptions are enabled (suggested by Jérôme Chabod)
875 Mon, 25 Feb 2008 14:39:15 +0100 <thp@perli.net>
876 Merge changes from 0.11.0 release after release
878         * bin/gpodder: Merge changes from 0.11.0
879         * README: Merge changes from 0.11.0
881 Sun, 24 Feb 2008 14:52:04 +0100 <thp@perli.net>
882 Cosmetic changes to the makefile
884         * Makefile: Cosmetic changes
886 Sun, 24 Feb 2008 13:55:42 +0100 <thp@perli.net>
887 Cairo-based progress bar on system tray icon
889         * src/gpodder/draw.py: Add Cairo-based drawing code for generating a
890         nice, transparent progress bar icon
891         * src/gpodder/services.py: Fix a problem with the wrong download done
892         percentage (i.e. when cancelling downloads instead of finishing them)
893         * src/gpodder/trayicon.py: Add code to draw the progress bar on the
894         tray icon; initial idea and most parts of this patch by Jérôme Chabod
896 Sat, 23 Feb 2008 14:18:53 +0100 <thp@perli.net>
897 Set the xterm title when running "make test"
899         * Makefile: Set the xterm title when running "make test"
901 Wed, 20 Feb 2008 13:38:58 +0100 <thp@perli.net>
902 Estimated time left and synchronization support for tray icon by Jérôme Chabod
904         * src/gpodder/gui.py: Send update status information to the tray icon
905         on update; add glue code for synchronization device and tray icon
906         * src/gpodder/trayicon.py: Add status and tooltip during device
907         synchronization; add estimated download time to tooltip during
908         download; set the correct caption for the synchronization menu item in
909         the tray icon (and don't add a synchronize menu item when not needed);
910         some small code-cleanups and fixes
911         * src/gpodder/util.py: Add format_seconds_to_hour_min_sec() function
912         that converts a numeric amount of seconds into a human-readable string
914 Tue, 19 Feb 2008 07:46:28 +0100 <thp@perli.net>
915 Fix bug with MP3 player synchronization file name encodings
917         * src/gpodder/sync.py: Apply patch to fix problems with native
918         language encodings on MP3 player synchronization; thanks to Bernd
919         Schlapsi for reporting the problem in Bugzilla
920         (Closes: http://bugs.gpodder.org/show_bug.cgi?id=34)
922 Mon, 18 Feb 2008 21:17:48 +0100 <thp@perli.net>
923 Updated French translation for 0.11.0
925         * data/po/fr.po: Updated French translation by Jérôme Chabod
927 Sun, 17 Feb 2008 13:50:09 +0100 <thp@perli.net>
928 Fix calculation of average percentage done
930         * src/gpodder/services.py: Fix calculation of average percentage done
931         for downloads, thanks to Jérôme Chabod <jerome.chabod@ifrance.com> for
932         the patch
934 Sun, 17 Feb 2008 13:33:38 +0100 <thp@perli.net>
935 Updated translations for 0.11.0
937         * data/messages.pot: Refreshed messages.pot from source code
938         * data/po/de.po: Updated German translation
939         * data/po/nl.po: Updated Dutch translation by Pieter De Decker
940         * data/po/ru.po: Updated Russian translation by Leonid Ponomarev
941         * data/po/cs.po: Updated Czech translation by Ondrej Vesely
942         * data/po/sv.po: Updated Swedish translation by Anders Kvist
944 Thu, 07 Feb 2008 22:15:40 +0100 <thp@perli.net>
945 Hello, new "expert" configuration editor (about:config-like)
947         * data/gpodder.glade: Add gPodderConfigEditor window and add an
948         "Advanced..." button to the preferences dialog
949         * src/gpodder/config.py: Add a gtk.ListStore tree model to the
950         configuration manager and update it when configuration variables
951         change; add toggle_flag() and update_field() methods for easy updating
952         of fields from the new config editor
953         * src/gpodder/gui.py: Add glue code for opening the advanced
954         configuration editor from the preferences dialog; add code for the
955         gPodder configuration editor (including filtering and field updating);
956         (Closes: http://bugs.gpodder.org/show_bug.cgi?id=10)
958 Thu, 07 Feb 2008 20:22:08 +0100 <thp@perli.net>
959 Support buggy OPML feeds, notify user on OPML import
961         * src/gpodder/gui.py: Notify user when no items were found when trying
962         to import OPML feeds
963         * src/gpodder/opml.py: Make the OPML importer a bit more relaxed, and
964         make it accept "url" instead of "xmlUrl", too (for buggy OPML feeds)
966 Wed, 06 Feb 2008 17:34:56 +0100 <thp@perli.net>
967 Fix the track length detection
969         * src/gpodder/sync.py: Fix the iPod sync track length detection code,
970         reported by Paul Rudkin <paul@thegithouse.com> and tested by
971         FriedBunny <friedbunny@kulturny.com>; make default length 3 hours
972         Closes: http://bugs.gpodder.org/show_bug.cgi?id=29
974 Wed, 06 Feb 2008 10:59:25 +0100 <thp@perli.net>
975 NLS encoding support for MP3 player synchronization (from gdfs)
977         * src/gpodder/sync.py: Add NLS encoding support from Leonid Ponomarev
978         <leonid.phoenix@gmail.com>; patch modified a bit to better fit the
979         code and be more verbose, so the user knows how we encode the names
981 Wed, 06 Feb 2008 10:43:47 +0100 <thp@perli.net>
982 Hide to systray on exit during download
984         * src/gpodder/gui.py: Apply patch from Jérôme Chabod
985         <jerome.chabod@ifrance.com> to fix a bug: When closing gPodder during
986         a download, and "on_quit_hide" is on, gPodder asks for a confirmation
987         It should hide gPodder without asking. This patch fix that.
989 Wed, 06 Feb 2008 10:18:30 +0100 <thp@perli.net>
990 Usability GUI update (after Rafael Proença's proposal)
992         * data/gpodder.glade: Add "Ctrl+L" hotkey to Add new channel; add
993         "View" menu with show/hide Toolbar (Ctrl+T) and show/hide episode
994         descriptions (Ctrl+D); remove "Update Feeds" button from toolbar and
995         add Check for updates button below channel navigator; move the add
996         episodes entry and buttons above the channel navigator; thanks to the
997         following people who shared their opinions on the mailing list: Rafael
998         Proença, Paul Rudkin, Ondrej Vesely, Leonid Ponomarev, Shane Donohoe,
999         Jérôme Chabod, Nick (nikosapi); the GUI mockups and the initial idea
1000         were posted by Rafael Proença
1001         * src/gpodder/config.py: Add "episode_list_descriptions" and
1002         "show_toolbar" configuration options that modify the look of the main
1003         window (both default to "True")
1004         * src/gpodder/gui.py: Show feed description in seperate line (this
1005         feature was suggested by narf@inode.at); make the episode list
1006         treeview widget use the space more efficient; show/hide toolbar and
1007         show/hide episode description GUI glue code
1008         * src/gpodder/libgpodder.py: Add "digits" keyword argument to
1009         format_filesize() (defaults to 2), this is a pass-thru function for
1010         gpodder.util.format_filesize() (see below)
1011         * src/gpodder/libpodcasts.py: Support for small- and large-sized
1012         icons,modify liststore creation code to add description to the title
1013         column
1014         * src/gpodder/util.py: Add "digits" keyword argument to
1015         format_filesize() (defaults to 2), this is used to define the format
1016         of the filesize; add "icon_size" keyword argument (defaults to 32) to
1017         get_tree_icon() and modify the function so that it dynamically
1018         generates the correct icon with the correct sizes
1020 Mon, 04 Feb 2008 11:26:14 +0100 <thp@perli.net>
1021 Apply patchset from Jérôme Chabod to fix tray icon behaviour
1023         * data/gpodder.glade: Change behaviour of the "display tray icon"
1024         checkbox, rename and retitle some configuration options
1025         * src/gpodder/config.py: Rename "download_after_update" to
1026         "auto_download_when_minimized" and rename "disable_notifications" to
1027         "enable_notifications".
1028         * src/gpodder/gui.py: Add glue code for config and GUI, change
1029         behaviour as described in http://bugs.gpodder.org/show_bug.cgi?id=3
1030         * src/gpodder/trayicon.py: Clean-up and fix behaviour as described in
1031         our Bugzilla Bug #3 (see above); thanks to Jérôme Chabod for
1032         implementing all these changes and the patch
1034 Mon, 04 Feb 2008 09:32:56 +0100 <thp@perli.net>
1035 Output pretty-printed OPML when saving channels list
1037         * src/gpodder/opml.py: Patch from Nick (nikosapi.org) to output the
1038         channels.opml file pretty-printed, so it's easier to read and easier
1039         to edit when working on the file outside of gPodder
1041 Sun, 03 Feb 2008 23:02:47 +0100 <thp@perli.net>
1042 Don't code late at night, it breaks the sync code ;)
1044         * src/gpodder/sync.py: Add brackets because I wrote bad code in the
1045         first place (fix video sync for iPods); thanks to Dave Perdue
1046         <dave@minusvince.com> for reporting this in our bug tracker
1047         (Closes: http://bugs.gpodder.org/show_bug.cgi?id=28)
1049 Sat, 02 Feb 2008 11:36:35 +0100 <thp@perli.net>
1050 Make feed update display "Loading" titles, only run auto update when minimized
1052         * src/gpodder/gui.py: Usability patch from NIkosapi <nikosapi.org>:
1053         Make the feed update dialog display "Loading feeds" instead of
1054         "Downloading feeds" when its loading the feeds from the local cache;
1055         only run the automatic, periodic update when gPodder is minimized,
1056         because it would pop up a dialog while gPodder is in use otherwise
1058 Sat, 02 Feb 2008 11:33:48 +0100 <thp@perli.net>
1059 Pressing Enter in the add channel entry adds the channel
1061         * data/gpodder.glade: Usability patch from Nikosapi <nikosapi.org>:
1062         Add an action handler to the gladefile, so the user can simply press
1063         Enter in the gtk.Entry instead of having to tab to or click on the
1064         button for adding a channel
1066 Wed, 30 Jan 2008 09:47:21 +0100 <thp@perli.net>
1067 Fix another bug in file_modification_datetime
1069         * src/gpodder/util.py: Another problem that happens with special
1070         iTunesDB settings, thanks to FriedBunny <friedbunny@kulturny.com>
1072 Wed, 30 Jan 2008 09:23:19 +0100 <thp@perli.net>
1073 Fix a bug in the file size calculation
1075         * src/gpodder/util.py: calculate_filesize should deal with "None"
1076         passed as filename (now returns zero-size);
1077         Fixes: Bug #23 (http://gpodder.thegithouse.com/show_bug.cgi?id=23)
1078         Thanks to FriedBunny <friedbunny@kulturny.com> for reporting this
1079         issue in our bug tracker
1081 Mon, 28 Jan 2008 12:33:13 +0100 <thp@perli.net>
1082 Merge new sync code from thp's private branch
1084         * bin/gpodder: Add "--sync"/"-s" command-line option to start the
1085         device synchronization process from the CLI interface - syncing can
1086         now be scripted, baby :) (you still have to configure the sync device
1087         via the GUI first, though)
1088         * data/gpodder.glade: Simplify gPodderSync dialog and remove some
1089         obsolete options from the channel dialog
1090         * src/gpodder/console.py: Add code for command-line sync support
1091         * src/gpodder/gui.py: Remove obsolete code for libipodsync and import
1092         the new "sync" module; simplify Sync<->GUI interface; clean-up
1093         gPodderSync dialog code to interface with new sync code; remove some
1094         config glue code for the channel properties dialog
1095         * src/gpodder/libconverter.py: Make libconverter work even if the
1096         percentage callback would fail in certain conditions (try..except)
1097         * src/gpodder/libipodsync.py: Removed
1098         * src/gpodder/libpodcasts.py: Refactor age_in_days() and
1099         get_age_string() to simple calls to utility functions and move the
1100         code to gpodder.util
1101         * src/gpodder/sync.py: Added new sync module :) Very modular, yesaya!
1102         * src/gpodder/util.py: Add file_age_in_days() and file_age_to_string()
1103         helper functions that use code from libpodcasts and return the age of
1104         a file in the filesystem
1106 Thu, 24 Jan 2008 14:51:48 +0100 <thp@perli.net>
1107 Fix a bug for show_message and tray_icon/minimized
1109         * src/gpodder/gui.py: Fix a bug when messages are shown for
1110         non-gPodderMainWindow windows (that don't have tray_icon)
1112 Wed, 23 Jan 2008 11:55:35 +0100 <thp@perli.net>
1113 Make gpodder.desktop pass desktop-file-validate tests
1115         * data/gpodder.desktop: Update "Categories" and remove "Encoding",
1116         following the freedesktop.org Desktop Entry specification
1118 Wed, 23 Jan 2008 09:06:32 +0100 <thp@perli.net>
1119 Do not show notifications when gPodder is minimized
1121         * src/gpodder/gui.py: Merge patch from Jérôme Chabod to fix problems
1122         with the gPodder window re-appearing after having been minimized;
1123         use the notification icon when possible; initially reported by Shane
1124         Donohoe
1126 Tue, 22 Jan 2008 10:19:46 +0100 <thp@perli.net>
1127 Add "releasetest" target to Makefile (automated testing)
1129         * Makefile: Add "releasetest" target that can be used to do some
1130         automatic testing before releases; thanks to Götz Waschk for giving
1131         some hint on "desktop-entry-validate" :)
1133 Tue, 22 Jan 2008 10:09:16 +0100 <thp@perli.net>
1134 Use Episode Selector for per-channel new episodes
1136         * src/gpodder/gui.py: Reorganize code to use the episode selector for
1137         both all-channels and per-channel new episodes
1138         (Closes: http://gpodder.thegithouse.com/show_bug.cgi?id=14)
1140 Tue, 22 Jan 2008 09:42:01 +0100 <thp@perli.net>
1141 Fix problem in gpodder.desktop file
1143         * bin/gpodder: We're in development again (+svn)
1144         * data/gpodder.desktop: Fix problem in .desktop file (Thanks to Götz
1145         Waschk for reporting this bug, detected via desktop-entry-validate)
1147 Tue, 22 Jan 2008 08:20:33 +0100 <thp@perli.net>
1148 gPodder 0.10.4 "Faster Pussycats Kill" released
1150         * bin/gpodder: gpodder 0.10.4 released :)
1151         * README: gPodder 0.10.4 released :)
1152         * doc/man/gpodder.1: gPodder 0.10.4 released :)
1153         * data/po/de.po: Updated German translation
1154         * data/messages.pot: Updated from source
1155         * data/po/*.po: Updated from messages.pot
1157 Tue, 22 Jan 2008 08:13:42 +0100 <thp@perli.net>
1158 Create Bittorrent download directory on startup
1160         * src/gpodder/libgpodder.py: Create Bittorrent download directory on
1161         startup, so the first time gPodder preferences are shown, the download
1162         folder will exist and now throw an error
1164 Mon, 21 Jan 2008 21:41:59 +0100 <thp@perli.net>
1165 Updated French translation file with correct encoding
1167         * data/po/fr.po: Updated French translation with correct encoding by
1168         Jérôme Chabod - thanks!
1170 Mon, 21 Jan 2008 10:47:49 +0100 <thp@perli.net>
1171 Add support for sending files via Bluetooth
1173         * data/gpodder.glade: Add "Bluetooth" configuration page to
1174         preferences dialog
1175         * src/gpodder/config.py: Add Bluetooth-related configuration options
1176         * src/gpodder/gui.py: Add support for sending (and converting) files
1177         for bluetooth file transfer; add glue code for preferences dialog and
1178         configuration manager
1179         * src/gpodder/libgpodder.py: Add "tempdir" variable to gPodderLibClass
1180         that specifies a temporary directory to be used (currently only for
1181         converting files for bluetooth transfer, might be migrated to a
1182         configuration option later)
1183         * src/gpodder/util.py: Add discover_bluetooth_devices() function that
1184         searches for nearby devices (either via python-bluez or via hcitool,
1185         so one of them has to be installed as a dependency); add
1186         bluetooth_send_file() convenience function that starts a file transfer
1187         via Bluetooth OBEX - uses gnome-obex-send, which has to be installed
1188         for Bluetooth file transfer to work
1190 Mon, 21 Jan 2008 09:52:09 +0100 <thp@perli.net>
1191 Support for different audio/video player selection
1193         * data/gpodder.glade: Add video selection to preferences dialog
1194         * src/gpodder/config.py: Add "videoplayer" configuration option
1195         * src/gpodder/gui.py: Add glue code for configuration and preferences
1196         dialog (audio/video player selector)
1197         * src/gpodder/libgpodder.py: Add code to migrate from older gPodder
1198         configurations (videoplayer is set to "unspecified") to the same value
1199         as the currently selected audio player; when "playing" a file,
1200         determine the file type and start the right player application
1201         * src/gpodder/libplayers.py: Parameterize the UserAppsReader class to
1202         accept a mime type (e.g. "video" or "audio") after which to filter
1204 Mon, 21 Jan 2008 07:30:38 +0100 <thp@perli.net>
1205 Czech translation update: gpodder.desktop
1207         * data/gpodder.desktop: Ondrej Vesely <xorwen@gmai.com> added the
1208         Czech translation strings to the gpodder.desktop file - thanks
1210 Sun, 20 Jan 2008 22:50:13 +0100 <thp@perli.net>
1211 Added Czech translation by Ondrej Vesely
1213         * data/po/cs.po: Added (partial) Czech translation by Ondrej Vesely
1214         <xorwen@gmail.com>; the completed translation will be updated when
1215         it's done
1216         * setup.py: Add "cs" (Czech) to list of translations
1218 Sat, 19 Jan 2008 18:39:54 +0100 <thp@perli.net>
1219 Updated Swedish translation from Anders Kvist
1221         * data/po/sv.po: Thanks to Anders Kvist, the Swedish translation is
1222         now up-to-date again
1224 Sat, 19 Jan 2008 13:28:12 +0100 <thp@perli.net>
1225 Updated French translation from Jérôme Chabod
1227         * data/po/fr.po: Thanks to Jérôme Chabod, the French translation is
1228         now up-to-date again
1230 Thu, 17 Jan 2008 22:46:21 +0100 <thp@perli.net>
1231 Updated Dutch translation from Pieter De Decker
1233         * data/po/nl.po: Thanks to Pieter De Decker, the Dutch translation is
1234         now up-to-date again
1236 Thu, 17 Jan 2008 14:21:49 +0100 <thp@perli.net>
1237 Update translation template and translations from source
1239         * data/messages.pot: Updated potfile from source code
1240         * data/po/*.po: Updated translation templates from potfile
1242 Wed, 16 Jan 2008 08:36:12 +0100 <thp@perli.net>
1243 Remove the "Ignore" button in tray icon notifications
1245         * src/gpodder/trayicon.py: Remove the "ignore" action and button when
1246         a download has finished; the "ignore" button is redundant, as the same
1247         functionality can be achieved by clicking on the "x" of the bubble
1249 Tue, 15 Jan 2008 14:50:13 +0100 <thp@perli.net>
1250 Modularize calls to gobject.idle_add (for non-GTK support)
1252         * bin/gpodder: Set interface_is_gui to True when running the GUI
1253         * src/gpodder/*.py: Use util.idle_add instead of gobject.idle_add
1254         * src/gpodder/gui.py: Simplify some idle_add calls, code clean-up
1255         * src/gpodder/__init__.py: Add "interface_is_gui" boolean variable
1256         that tells us if we are running in GUI or CLI mode (this is needed for
1257         util.idle_add to determine if it's going to use the gobject module or
1258         not)
1259         * src/gpodder/util.py: Add new function idle_add() that acts as a
1260         wrapper to gobject.idle_add(); this will only use gobject.idle_add if
1261         we are in GUI mode, and will call the callback directly when we are in
1262         command-line mode (because we don't have to watch out for threading
1263         race conditions there, compared to what GTK+ gives us)
1265 Mon, 14 Jan 2008 20:23:02 +0100 <thp@perli.net>
1266 Add menu item that links to gPodder's new bug tracker
1268         * data/gpodder.glade: Add bug tracker item to help menu
1269         * src/gpodder/gui.py: Add code to open a webbrowser with the bug
1270         tracker when the bug tracker icon is clicked
1272 Mon, 14 Jan 2008 20:04:25 +0100 <thp@perli.net>
1273 Add a checkbox to keep episodes when removing channels
1275         * src/gpodder/gui.py: Add a checkbox to the confirmation dialog when
1276         removing a podcast channel, so the user has the option to remove the
1277         podcast feed from gPodder's subscription list, but still keep the
1278         downloaded files on the harddisk (via a checkbox in the dialog)
1279         (Closes: http://gpodder.thegithouse.com/show_bug.cgi?id=1)
1281 Thu, 10 Jan 2008 08:44:00 +0100 <thp@perli.net>
1282 Updated Russian translation by Hex
1284         * data/po/ru.po: Updated Russian translation by
1285         Hex <justin.forest@gmail.com>
1287 Wed, 09 Jan 2008 23:43:56 +0100 <thp@perli.net>
1288 Merge tray icon and notification patch by Jérôme Chabod
1290         * data/gpodder.glade: UI support for tray icon settings and
1291         configuration options for auto update feeds (auto update based on a
1292         patch by Nick (nikosapi.org)
1293         * src/gpodder/config.py: Add configuration options that support the
1294         tray icon, notification bubble and automatic update/close functions
1295         * src/gpodder/gui.py: Support the tray icon in the GUI; link the
1296         configuration options with the preferences dialog; re-work the channel
1297         update dialog to be more slipstreamed
1298         * src/gpodder/trayicon.py: Added new tray icon module by
1299         Jérôme Chabod <jerome.chabod@ifrance.com>; initial idea from old
1300         gPodder TODO list by Holger Bauer
1302 Wed, 09 Jan 2008 23:09:54 +0100 <thp@perli.net>
1303 Updated Swedish translation by Anders Kvist
1305         * data/po/sv.po: Swedish translation updated by
1306         Anders Kvist <kvistkvist@telia.com>
1308 Wed, 09 Jan 2008 11:52:23 +0100 <thp@perli.net>
1309 Use os.rename to make channel list saving atomic
1311         * src/gpodder/opml.py: Make the saving of the channel list atomic by
1312         first saving it to a temporary file and then using os.rename to really
1313         move the file in place (this should make the channel list saving very
1314         stable and protect against certain bad system conditions where the
1315         channel list is emptied); thanks to Jens Thiele <karme@berlios.de> for
1316         the suggestion and pointers to improve the channel saving code
1318 Sat, 05 Jan 2008 15:34:23 +0100 <thp@perli.net>
1319 Make logging in libpodcasts less verbose
1321         * src/gpodder/libpodcasts.py: Remove some verbose logging code
1323 Wed, 02 Jan 2008 15:39:04 +0100 <thp@perli.net>
1324 Migrate from channels.xml (from 0.9.4) to channels.opml if needed
1326         * src/gpodder/libgpodder.py: Add code to check if channels.xml exists
1327         but channels.opml doesn't and if so, try to convert from channels.xml
1328         to channels.opml, so users upgrading from 0.9.4 directly will have
1329         their channel list automatically converted;
1330         thanks to Tim Michelsen for the bug report and helpful Ubuntu info
1332 Tue, 01 Jan 2008 23:32:50 +0100 <thp@perli.net>
1333 Add download completion notification support
1335         * src/gpodder/download.py: Notify the download status manager when a
1336         download has been completed successfully
1337         * src/gpodder/services.py: Add download-complete signal to list of
1338         possible signals and download_completed() method to be used by
1339         downloads to notify the status manager of a successful download
1341 Sat, 29 Dec 2007 14:21:51 +0100 <thp@perli.net>
1342 Patch the feedparser module to correctly process democracynow.org
1344         * src/gpodder/cache.py: Add a patch_feedparser() method that checks of
1345         the feedparser module correctly maps the "plain" content-type to the
1346         correct "text/plain" content-type and if not, replace the
1347         mapContentType method with a fixed one; this should make the audio
1348         podcast on democracynow.org working (thanks to Clark Burbidge for the
1349         bug report)
1351 Sun, 23 Dec 2007 12:20:25 +0100 <thp@perli.net>
1352 Better username/password extraction from URLs
1354         * src/gpodder/util.py: Improve username and password extraction for
1355         authentication URLs; thanks to Nick <me@nikosapi.org> and Shane
1356         Donohoe <priestoftime@googlemail.com> for reporting this bug and
1357         sending in a patch; this should allow for e-mail address usernames
1359 Sat, 22 Dec 2007 11:44:41 +0100 <thp@perli.net>
1360 Also delete old episodes that have disappeared from the feed
1362         * src/gpodder/gui.py: When deleting old episodes automatically, also
1363         delete episodes that have disappeared from the RSS feed and are only
1364         available locally; thanks to Pieter De Decker <pdedecker@gmail.com>
1365         for the very detailed and helpful bug report :)
1367 Thu, 20 Dec 2007 01:33:15 +0100 <thp@perli.net>
1368 Stability updates: Feed cache update, old PyCairo versions
1370         * src/gpodder/draw.py: Add a workaround for pycairo versions less than
1371         1.1.6. Thanks to Chris Arnold for reporting this bug on the
1372         gpodder-devel mailing list and taking the time to test the patch and
1373         report back and provide useful information for debugging this error
1374         * src/gpodder/gui.py: Close the feed cache update dialog even when the
1375         user clicks on "cancel" (would have stayed there otherwise)
1377 Tue, 18 Dec 2007 10:13:44 +0100 <thp@perli.net>
1378 Merge "delete episode after sync" patch from Jérôme Chabod
1380         * data/gpodder.glade: Add GUI elements in preferences dialog to select
1381         what to do after episode sync (nothing, delete or mark played)
1382         * src/gpodder/config.py: Add "on_sync_delete" configuration option
1383         * src/gpodder/gui.py: Glue "on_sync_delete" config and GUI together
1384         * src/gpodder/libipodsync.py: If the configuration option
1385         on_sync_delete is set, remove the episode after successfully copying
1386         it to the iPod or MP3 player (the whole patch has been initially done
1387         by Jérôme Chabod <jerome.chabod@france.com> with some modifications)
1388         * src/gpodder/libpodcasts.py: Make delete_from_disk() a bit more
1389         robust, so it doesn't disturb libipodsync's functionality
1391 Mon, 17 Dec 2007 16:26:43 +0100 <thp@perli.net>
1392 Remove invalid channel cover images when loading fails
1394         * src/gpodder/libpodcasts.py: Remove the cover_file of a channel when
1395         it cannot be loaded (assume something went wrong when downloading the
1396         cover file); re-downloading the cover manually can solve the problem
1398 Mon, 17 Dec 2007 15:00:17 +0100 <thp@perli.net>
1399 Fix typo in last commit
1401         * src/gpodder/libipodsync.py: Fix typo in last commit
1403 Mon, 17 Dec 2007 11:21:10 +0100 <thp@perli.net>
1404 Modify played handling in iPod sync when "on sync mark played" is active
1406         * src/gpodder/libipodsync.py: Don't copy played state from PC to iPod
1407         if the on_sync_mark_played option is set
1409 Sat, 15 Dec 2007 15:58:23 +0100 <thp@perli.net>
1410 Merge patch from Leonid Ponomarev to gdfs
1412         * doc/dev/gdfs/gdfs-init.py: Merge patch from Leonid Ponomarev to add
1413         support for the system's native encoding, based on the $LANG
1414         environment variable. This should add support for episodes and
1415         channels with international characters as titles
1417 Sat, 15 Dec 2007 15:11:46 +0100 <thp@perli.net>
1418 Updated Dutch translation by Pieter De Decker
1420         * bin/gpodder: We're in development again: "+svn"
1421         * data/po/nl.po: Updated Dutch translation from Pieter De Decker
1423 Thu, 13 Dec 2007 08:32:54 +0100 <thp@perli.net>
1424 gPodder 0.10.3 "A Stop at Willoughby" released
1426         * bin/gpodder: gPodder 0.10.3 released :)
1427         * README: gPodder 0.10.3 released :)
1428         * doc/man/gpodder.1: gPodder 0.10.3 released :)
1429         * data/messages.pot: Updated from source
1430         * data/po/de.po: Updated German translation
1431         * data/po/*.po: Updated from messages.pot
1433 Thu, 13 Dec 2007 08:02:29 +0100 <thp@perli.net>
1434 Link the gPodder Documentation Wiki from the help pages
1436         * data/gpodder.glade: Help menu: gPodder Homepage (instead of website)
1437         and Documentation Wiki (instead of Mailing list)
1438         * src/gpodder/gui.py: Open gPodder Wiki instead of mailing list page
1440 Wed, 12 Dec 2007 21:39:03 +0100 <thp@perli.net>
1441 Remove TODO file from MANIFEST.in
1443         * MANIFEST.in: Of course we have to remove non-existing files from the
1444         MANIFEST.in file, too.. so TODO is now finally gone :)
1446 Wed, 12 Dec 2007 21:30:00 +0100 <thp@perli.net>
1447 Manage TODO list on the gPodder Wiki
1449         * TODO: Removed; new location: http://gpodderwiki.jottit.com/todo
1451 Wed, 12 Dec 2007 20:55:00 +0100 <thp@perli.net>
1452 Configuration for "old" episodes; automatically remove old episodes
1454         * src/gpodder/config.py: New boolean auto_remove_old_episodes
1455         configuration option that defaults to False (remove on startup)
1456         * src/gpodder/gui.py: Add code to automatically remove old, unplayed
1457         episodes on startup if the specific configuration options have been
1458         set; connect config manager to GUI items for the preferences dialog
1459         * data/gpodder.glade: Add checkbox for automatically removing old,
1460         unplayed episodes from gPodder on startup and a spinbutton to set the
1461         amount of days after which an episode is considered "old"
1463 Wed, 12 Dec 2007 19:44:15 +0100 <thp@perli.net>
1464 Merged episode locking patch from Paul Rudkin
1466         * src/gpodder/gui.py: Merged "lock episodes" patch to mark episodes as
1467         locked, patch by Paul Rudkin <paul@thegithouse.com>
1468         * data/gpodder.glade: Add menu item for toggle locked status
1469         * src/gpodder/libgpodder.py: Add "locked" history
1470         * src/gpodder/libpodcasts.py: When requesting a status icon, also draw
1471         the "Locked" status; is_locked() in podcastItem
1472         * src/gpodder/util.py: Added code for drawing a padlock icon on top of
1473         another (file type) icon; this is used for the "lock episodes" feature
1475 Tue, 11 Dec 2007 22:10:03 +0100 <thp@perli.net>
1476 Updated TODO list
1478         * TODO: Updated TODO list
1480 Mon, 10 Dec 2007 09:42:06 +0100 <thp@perli.net>
1481 Move observer code out of DownloadStatusManager into ObservableService
1483         * src/gpodder/services.py: Move out all observer-related code like
1484         registration, unregistration and notification to a new
1485         ObservableService class; subclass ObservableService in
1486         DownloadStatusManager; this makes the observer code in
1487         DownloadStatusManager re-usable (will be needed for new sync code)
1489 Mon, 10 Dec 2007 09:33:26 +0100 <thp@perli.net>
1490 Selective iPod episode clean-up; "delete older than X days"
1492         * src/gpodder/config.py: Add episode_old_age configuration variable;
1493         is an integer, defaults to 7. This is the number of days after which
1494         an episode will be considered "old"
1495         * src/gpodder/gui.py: iPod cleanup is now done selectively using the
1496         episode selector dialog; the code has been split, because we do not
1497         yet have an episode selector dialog for FS-based sync; add "Downloaded
1498         x days ago" column to "Delete old episodes" dialog and a corresponding
1499         button; call the callback even when no episodes are selected in
1500         gPodderEpisodeSelector
1501         * src/gpodder/libipodsync.py: Class variables of gPodder_iPodSync
1502         moved to __init__ to be instance variables (this should fix a bug that
1503         crops up now that we can selectively delete episodes); remove_tracks()
1504         and clean_playlist() have been modified/added to support new episode
1505         selector deletion code
1506         * src/gpodder/libpodcasts.py: Move is_played() to podcastItem from
1507         podcastChannel (it really belongs to the item; this makes code more
1508         readable in other parts of the codebase); add age_in_days(), is_old(),
1509         get_age_string() and age_prop to podcastItem
1510         * src/gpodder/util.py: New function: file_modification_datetime();
1511         returns a datetime.datetime instance of the MTIME (modification
1512         timestamp) of the filename given as parameter or None if the filename
1513         cannot be determined; this is used for the "old episodes" feature
1515 Sun, 09 Dec 2007 16:45:11 +0100 <thp@perli.net>
1516 Make has_converter() a bit more intelligent in detecting extensions
1518         * src/gpodder/libconverter.py: Convert given extension to lowercase
1519         and strip a leading "." from the extension, so calling code can also
1520         give the second value of the os.path.splitext() result directly to
1521         has_converter()
1523 Sun, 09 Dec 2007 13:20:49 +0100 <thp@perli.net>
1524 Fix pre-setting code for filechooser buttons; Patch by Paul Rudkin
1526         * src/gpodder/config.py: Fix pre-setting code for filechooser-related
1527         code; use set_current_folder() instead of set_filename()
1528         * src/gpodder/gui.py: Fix pre-setting code for filechooser-related
1529         code; thanks to Paul Rudkin <paul@thegithouse.com> for the patch
1531 Thu, 06 Dec 2007 09:37:57 +0100 <thp@perli.net>
1532 Support for itms:// links (direct links to the Apple iTunes Music Store)
1534         * src/gpodder/util.py: Support direct itms:// links by splitting out
1535         the iTunes Podcast links parsing routines. This should put us in for
1536         some nice iTunes podcast link support that will automagically
1537         translate iTunes podcast links to the correct RSS feed URL
1539 Thu, 06 Dec 2007 09:29:09 +0100 <thp@perli.net>
1540 Support for iTunes Podcast links (http://phobos.apple.com/...)
1542         * src/gpodder/util.py: Add support for subscribing to iTunes Podcast
1543         links (those with phobos.apple.com); new functions:
1544         parse_itunes_xml(), http_get_and_gunzip() and itunes_dicover_rss()
1546 Thu, 06 Dec 2007 09:15:57 +0100 <thp@perli.net>
1547 Added Galician translation from Teo Ramirez
1549         * data/gpodder.desktop: Added Spanish and Galician translations;
1550         thanks to Teo Ramirez <teoramirez@gmail.com>
1551         * data/messages.pot: Updated from source
1552         * data/po/de.po: Updated
1553         * data/po/gl.po: Added NEW Galician (gl) translation by Teo Ramirez
1554         * data/po/*.po: Updated from source
1555         * setup.py: Added Galician (gl) translation by Teo Ramirez
1557 Thu, 06 Dec 2007 08:35:12 +0100 <thp@perli.net>
1558 Sort channel list (finally ;)
1560         * src/gpodder/libpodcasts.py: Sort channels by lowercase title before
1561         returning the channel list in load_channels(); this automagically
1562         makes gPodder's channel list always sorted :)
1563         Thanks to FriedBunny <friedbunny@kulturny.com> for suggesting this and
1564         sending in an intial patch that led to this patch =)
1565         * TODO: Remove implemented item: Sort channel list
1567 Tue, 04 Dec 2007 23:28:27 +0100 <thp@perli.net>
1568 Do grayscale "pill" instead of theme-based colors (for bad themes)
1570         * src/gpodder/draw.py: Always draw the "pill" in semi-transparent
1571         black/grey shades so it will work for all GTK themes (even Ubuntu's)
1573 Mon, 03 Dec 2007 21:35:56 +0100 <thp@perli.net>
1574 Update channel navigator when iPod/MP3 player sync has finished
1576         * src/gpodder/gui.py: Update channel navigator when iPod sync has
1577         finished, so we can update the "played" status in the channel
1578         navigator when this status has changed after we've synced ("on sync
1579         mark played" option)
1581 Mon, 03 Dec 2007 21:24:17 +0100 <thp@perli.net>
1582 Add option to mark episodes as played after transfer to device
1584         * data/gpodder.glade: Option added to preferences dialog
1585         * src/gpodder/config.py: Add option "on_sync_mark_played"; will mark
1586         an episode as played when it gets transferred to a device
1587         * src/gpodder/gui.py: Glue code for GUI + gpodder.config
1588         * src/gpodder/libipodsync.py: On sync, mark episode as played if the
1589         user has selected the "on_sync_mark_played" option
1590         * TODO: Remove implemented/integrated items
1592 Sat, 01 Dec 2007 15:19:29 +0100 <thp@perli.net>
1593 Fix a fatal bug with first-run that prevents channel list saving
1595         * src/gpodder/util.py: Always use a file's parent directory to get the
1596         free disk space and return zero free disk space when the parent
1597         directory does not exist
1599 Thu, 29 Nov 2007 08:53:36 +0100 <thp@perli.net>
1600 Support for itpc:// URLs
1602         * src/gpodder/util.py: Add support for adding "itpc://" URLs (these
1603         are simply http:// URLs with a different schema, for iTunes)
1605 Tue, 27 Nov 2007 22:59:26 +0100 <thp@perli.net>
1606 Draw channel stats (unplayed, downloaded) on channel navigator
1608         * bin/gpodder: We're in development again, so add "+svn"
1609         * src/gpodder/draw.py: Added
1610         * src/gpodder/gui.py: Fix import of renamed "channels_to_model";
1611         re-assign new column numbers for treeChannels' data model; add
1612         cell renderer for pill pixbuf and remove cell renderer for status text
1613         * src/gpodder/libpodcasts.py: Add episode_is_new() function to
1614         podcastChannel to check if an episode can be considered "new"; use the
1615         episode_is_new function in get_new_episodes; add get_episode_stats()
1616         after an idea from Paul Rudkin <paul@thegithouse.com>; re-factor
1617         channels_to_model and clean out old, unused code and columns
1619 Mon, 26 Nov 2007 08:57:04 +0100 <thp@perli.net>
1620 gPodder 0.10.2 "Ein schweineschnauzen Sandwich, bitte!" released
1622         * bin/gpodder: gPodder 0.10.2 released :)
1623         * doc/man/gpodder.1: gPodder 0.10.2 released :)
1624         * README: gPodder 0.10.2 released :)
1626 Mon, 26 Nov 2007 08:52:49 +0100 <thp@perli.net>
1627 Translation updates
1629         * data/messages.pot: Refreshed from source
1630         * data/po/*.po: Refreshed from messages.pot
1631         * data/po/de.po: Updated German translation
1633 Sun, 25 Nov 2007 11:50:46 +0100 <thp@perli.net>
1634 Make sure there is enough free disk space when saving OPML channel list
1636         * src/gpodder/gui.py: Notify user that there's some problem saving the
1637         current channel list when save_channels() return False
1638         * src/gpodder/libpodcasts.py: Pass-through the return value of
1639         gpodder.opml.Exporter.write so calling code knows if saving the
1640         channel list was successful or not
1641         * src/gpodder/opml.py: Check free disk space before saving OPML
1642         channels in Exporter.write; thanks to Jens Thiele <karme@berlios.de>
1643         for reporting this bug on the Debian BTS (Closes: Debian Bug #452490)
1645 Thu, 22 Nov 2007 21:52:35 +0100 <thp@perli.net>
1646 Don't send Referer header when downloading episodes
1648         * src/gpodder/download.py: Some podcasts now implement an
1649         "anti-bandwidth-theft" code that should provide other websites from
1650         not linking to the episodes; as we have sent a Referer header
1651         containing the RSS feed URL, this causes problems; Referer header
1652         sending is therefore disabled now
1654 Sun, 18 Nov 2007 15:33:50 +0100 <thp@perli.net>
1655 TODO items from Katy G. B.
1657         * TODO: Updated TODO list
1659 Sat, 17 Nov 2007 18:38:36 +0100 <thp@perli.net>
1660 Backwards-compatibility for PyGTK less than 2.12 (for GtkTooltip)
1662         * src/gpodder/gui.py: Do not hook up tooltip handlers when we are
1663         using PyGTK less than 2.12 (which introduced the gtk.Tooltip API)
1665 Thu, 15 Nov 2007 11:07:42 +0100 <thp@perli.net>
1666 Check free disk space before copying files to iPod
1668         * src/gpodder/libipodsync.py: Check if the iPod's filesystem has
1669         enough free disk space before copying files over to it, as to not
1670         corrupt the iTunesDB in certain situations and fail when disk is full;
1671         thanks to Nicolas Quienot <niqooo@gmail.com> for the bug report
1672         * src/gpodder/util.py: Add get_free_disk_space() function that
1673         calculates the free (user-available) disk space on a given path
1675 Wed, 14 Nov 2007 21:55:18 +0100 <thp@perli.net>
1676 Add informative tooltips to channel navigator
1678         * src/gpodder/gui.py: Add tooltips to channel navigator that show a
1679         bigger cover image, the title, description, url and used disk space
1680         * src/gpodder/libpodcasts.py: Add save_dir_size property to
1681         podcastChannel that contains the disk usage of the channel's save_dir;
1682         this can be manually updated by calling update_save_dir_size() and
1683         will automatically be updated when the GUI code hooks into the
1684         channel; also add get_cover_pixbuf() that returns a pixbuf of the
1685         cover for a given size or None if there is no valid cover file
1687 Wed, 14 Nov 2007 19:19:11 +0100 <thp@perli.net>
1688 Slipstream code (enumerate instead of simple position tracking)
1689         * src/gpodder/libipodsync.py: Use enumerate() to iterate over a list
1690         of episodes instead of keeping track of the position "by hand"
1692 Wed, 14 Nov 2007 19:17:51 +0100 <thp@perli.net>
1693 Ignore initial window events from GtkWindow in Config
1695         * src/gpodder/config.py: Add a flag to config manager to ignore window
1696         events until the window has been realized; then, start taking position
1697         and size updates
1699 Mon, 12 Nov 2007 20:25:39 +0100 <thp@perli.net>
1700 Improve caching for HTTP redirects and minor errors; cache clean-up
1702         * src/gpodder/cache.py: Cache content when it comes from a HTTP
1703         redirect (301, 302, 307); cache feeds even with parsing errors, so we
1704         can "fill" our cache and not download on every startup
1705         * src/gpodder/libpodcasts.py: Add cache clean-up code after loading
1706         channels; this should keep the feedcache.db file smaller for users
1707         that like to try out new channels (or have used gPodder for a while)
1709 Sun, 11 Nov 2007 14:24:17 +0100 <thp@perli.net>
1710 Better file extension guessing for URLs
1712         * src/gpodder/util.py: Improve file_extension_from_url() by adding
1713         additional checks for known good extensions and recurse into the query
1714         string if it looks like an URL; this should fix compatibility problems
1715         for feeds with strange URLs; should provide more reliable guessing;
1716         thanks to Nicolas Quienot <niqooo@gmail.com> for the bug report
1718 Fri, 09 Nov 2007 10:05:36 +0100 <thp@perli.net>
1719 Fix format_filesize() usage in episodes selector and podcastItem
1721         * src/gpodder/gui.py: Use the correct (config-using) format_filesize()
1722         function to generate the total size string in the episode selector
1723         * src/gpodder/libpodcasts.py: Use the correct (config-usig
1724         format_filesize() function to generate the total size string in
1725         podcastItem; thanks to Pieter De Decker <pdedecker@gmail.com> for
1726         pointing that out
1727         * data/gpodder.glade: Use "Preferences" instead of "Preferences..."
1728         which feels a bit better in the GUI
1730 Thu, 08 Nov 2007 21:25:19 +0100 <thp@perli.net>
1731 Add "gPodder download folder synchronizer" scripts to repository
1733         * doc/dev/gdfs/gdfs-check.py: Added
1734         * doc/dev/gdfs/gdfs-init.py: Added
1735         * doc/dev/gdfs/README: Added
1737 Thu, 08 Nov 2007 20:01:13 +0100 <thp@perli.net>
1738 The mighty episode selector dialog and some menu re-arrangements
1740         * src/gpodder/gui.py: Move the "center_on_widget" keyword-based window
1741         positioning code to GladeWidget to be universally usable; update
1742         "Device" menu item on startup; new functions: delete_episode_list()
1743         and download_episode_list() that both operate on lists of episodes;
1744         add code for invoking gPodderEpisodeSelector for deleting old
1745         episodes; re-work on_itemDownloadAllNew_activate to use the episode
1746         selector instead of hand-crafting a message dialog text; add
1747         update_item_device() function that will handle the hiding, showing and
1748         renaming of the "Device" menu in the menubar; clean-up
1749         gPodderProperties with callback_finished setting (now kwarg-based);
1750         new, might, fancy, customizable and uber-sexy gPodderEpisodeSelector
1751         that will prove to be useful in some places in our codebase: it
1752         basically allows the user to select a subset of episodes from a given
1753         list in a quite sophisticated way; new "delete old episodes" menu item
1754         added for cleaning up gPodder's downloads
1755         * src/gpodder/libpodcasts.py: Add delete_from_disk() convenience
1756         method to podcastItem; other convenience properties and functions
1757         needed for the new episode selector dialog: pubdate_prop,
1758         get_filesize_string(), filesize_prop, get_channel_title(),
1759         channel_prop, get_played_string(), played_prop
1760         * data/gpodder.glade: new gPodderEpisode dialog; re-structuring of
1761         gPodder's main menu to be more usable and more compact; also added the
1762         Ctrl+K "Remove old episodes" menu item; also use the correct
1763         "multimedia-player" icon name of a not really representative icon
1765 Thu, 08 Nov 2007 12:07:30 +0100 <thp@perli.net>
1766 Support syncing to FS-based MP3 players without subfolders
1768         * data/gpodder.glade: Add checkbox "Create a subfolder for each
1769         channel" to preferences dialog and rename some widgets
1770         * src/gpodder/config.py: Add boolean "fssync_channel_subfolders"
1771         option that defaults to True (create subfolder for each channel)
1772         * src/gpodder/gui.py: Hook up config option fssync_channel_subfolders
1773         to preferences dialog; do more intelligent widget hiding for the
1774         "Player" tab in the preferences dialog (only show relevant widgets)
1775         * src/gpodder/libipodsync.py: Only append channel name as subfolder to
1776         destination folder name when the "fssync_channel_subfolders" option is
1777         True; suggested by Paul Elliot <omahns.home@gmail.com>
1779 Thu, 08 Nov 2007 11:28:17 +0100 <thp@perli.net>
1780 Fix offline cache behaviour when time is not set
1782         * src/gpodder/cache.py: Return cached_content in offline mode when
1783         cached_content "is not None" (instead of cached_time "is not None")
1785 Tue, 06 Nov 2007 12:37:41 +0100 <thp@perli.net>
1786 Process events before connecting Config to gtk windows
1788         * data/gpodder.glade: Remove default size for main gPodder window, as
1789         this is now handled by the config manager
1790         * src/gpodder/config.py: Process GTK events in the event queue before
1791         connecting to the "configure-event" signal, so we won't get two
1792         configure events for the window for the initial size change
1794 Mon, 05 Nov 2007 13:51:26 +0100 <thp@perli.net>
1795 Add error reporting when download fails because of an I/O error
1797         * src/gpodder/download.py: Catch and handle I/O errors in
1798         DownloadThread and format and pass on messages to GUI code when
1799         required; thanks to Florian Richter <Florian_Richter@gmx.de> for
1800         suggesting this feature after having a full disk
1801         * src/gpodder/gui.py: Update tree view when adding a new episode;
1802         add new notification() method and pass this method through to
1803         DownloadThread, so it can present messages to the user (i.e. errors)
1805 Mon, 05 Nov 2007 12:54:35 +0100 <thp@perli.net>
1806 Use util.find_command in more places (mplayer detection, ...)
1808         * src/gpodder/libgpodder.py: Use util.find_command to detect the
1809         existence of the "gnome-btdownload" command and spit out a warning log
1810         message when the command is not available
1811         * src/gpodder/libipodsync.py: Use util.find_command to check for an
1812         installed mplayer binary (instead of relying on os.system("which...")
1814 Mon, 05 Nov 2007 01:12:15 +0100 <thp@perli.net>
1815 Better command detection for the converter library
1817         * src/gpodder/libconverter.py: Detect existence of commands before
1818         invoking them for converting files; based on a patch by
1819         Nick (nikosapi.org); ConverterCollection is now a dict itself :)
1820         * src/gpodder/util.py: Add new find_command() function that will
1821         search the system's PATH for a specific executable command
1823 Mon, 05 Nov 2007 00:21:39 +0100 <thp@perli.net>
1824 Remove extracted cover art when deleting episode files
1826         * src/gpodder/util.py: Apply modified version of a patch from
1827         Nick (nikosapi.org) that is better suited for deleting cover art that
1828         has been extracted with the new eyeD3 cover art extraction code
1830 Mon, 05 Nov 2007 00:17:12 +0100 <thp@perli.net>
1831 Patch from Nick (nikosapi) to support eyeD3 cover art extraction
1833         * src/gpodder/libipodsync.py: Apply modified version of a patch from
1834         Nick (nikosapi.org) to utilize eyeD3 for cover art extraction in iPod
1835         sync code; remove dependency on PyID3
1836         * README: PyID3 is not a dependency anymore, as we can now use eyeD3
1837         for the same purpose (cover art extraction)
1839 Sat, 03 Nov 2007 14:14:09 +0100 <thp@perli.net>
1840 Fix format_filesize() function to be standards-conformant (unit prefixes)
1842         * src/gpodder/config.py: Add "use_si_units" configuration option; if
1843         True, the user will see SI units (MB, kB, ...); if False (the
1844         default); the user will see binary-prefix units (MiB, KiB, ..)
1845         * src/gpodder/libgpodder.py: Add pass-through function
1846         "format_filesize()" to gPodderLib that combines the
1847         util.format_filesize function with the gPodder-specific config option
1848         * src/gpodder/util.py: Apply a modified patch from Gerrit Sangel
1849         <z0idberg@gmx.de> to add support for SI units and binary prefixes to
1850         format_filesize(); this makes the function standards-compliant
1851         * src/gpodder/download.py: Updated to use new format_filesize
1852         * src/gpodder/gui.py: Updated to use new format_filesize
1853         * src/gpodder/libpodcasts.py: Updated to use new format_filesize
1855 Fri, 02 Nov 2007 17:28:05 +0100 <thp@perli.net>
1856 New Configuration/Settings Manager; massive code clean-ups
1858         * src/gpodder/config.py: Added new Configuration Manager that
1859         automatically keeps track of saving changed values and is also able to
1860         watch GTK widgets for changes; this should simplify our settings
1861         management and give us a single place for maintaining settings
1862         * src/gpodder/download.py: Access settings from new config manager
1863         * src/gpodder/gui.py: Make use of new config manager to connect
1864         widgets and settings from the GUI directly to the config manager;
1865         remove manual loading and saving of settings; auto-connect as much as
1866         possible in the gPodderProperties dialog to get real-time automatic
1867         configuration saving; fix the other code to use new config manager
1868         * src/gpodder/libgpodder.py: MASSIVE code clean-up; removed lots of
1869         old cruft and dead code that has been lying around in libgpodder for
1870         some time now; remove configuration code; utilize config manager;
1871         unify DownloadHistory+PlaybackHistory in new HistoryStore class;
1872         reduce number of import statements
1873         * src/gpodder/libipodsync.py: Access settings from new config manager
1874         * src/gpodder/libplayers.py: Removed dotdesktop_command()
1875         * src/gpodder/libpodcasts.py: Move locking functionality into this
1876         module, as locking is only used here; access config from new manager
1877         * src/gpodder/services.py: Use config manager to get settings
1878         * src/gpodder/util.py: Add format_desktop_command() function, based on
1879         the dotdesktop_command() function from libplayers
1881 Fri, 02 Nov 2007 07:49:38 +0100 <thp@perli.net>
1882 Add ability to open download folder from channel's context menu
1884         * src/gpodder/gui.py: Add "Open download folder" menu item to channel
1885         navigator context menu
1886         * src/gpodder/libgpodder.py: Add open_folder() method that will open
1887         the DE's default folder browser via "xdg-open"
1889 Thu, 01 Nov 2007 15:29:00 +0100 <thp@perli.net>
1890 Limit filename on FS-based sync to 50 characters
1892         * src/gpodder/libipodsync.py: Do not allow extremely long file names
1893         that could theoretically be generated by using data from RSS feeds;
1894         this is needed to make FAT-based drives work with files that would
1895         otherwise have file names that are too long
1897 Wed, 31 Oct 2007 15:22:32 +0100 <thp@perli.net>
1898 Escape RSS-provided strings in Pango markup
1900         * src/gpodder/gui.py: Escape strings in Pango markup
1901         * bin/gpodder: we're in development again, so "+svn"
1903 Sun, 28 Oct 2007 16:27:14 +0100 <thp@perli.net>
1904 gPodder 0.10.1 "Nukular, das Wort heißt Nukular" released
1906         * bin/gpodder: gPodder 0.10.1 released :)
1907         * doc/man/gpodder.1: gPodder 0.10.1 released :)
1908         * README: gPodder 0.10.1 released :)
1909         * data/messages.pot: Refreshed template from source files
1910         * data/po/de.po: Updated German translation for the 0.10.1 release
1911         * data/po/*.po: Refreshed translation files from template
1913 Sun, 28 Oct 2007 15:25:56 +0100 <thp@perli.net>
1914 Add "Save episode to file" handling to episode list context menu
1916         * data/gpodder.glade: Use a stock "Save As" button for the "Copy
1917         episode to file" button
1918         * src/gpodder/gui.py: Add new show_copy_dialog() method to GladeWidget
1919         that shows a copy dialog where a user can copy a file to a selected
1920         destination (this is used for "Save episode to file"); use
1921         show_copy_dialog in "Save As" in gPodderEpisode; add "Save episode to
1922         folder" menu item in episode list context menu and use
1923         show_copy_dialog to carry out the user interaction
1925 Sun, 28 Oct 2007 13:30:40 +0100 <thp@perli.net>
1926 Allow "https://" URLs for episode URLs, as we can handle these, too
1928         * src/gpodder/util.py: Allow "https://" as a valid URL scheme, as we
1929         can handle https URLs, thanks to Aravind Seshadri
1930         <aravind@aravind.name> who initially reported this bug
1932 Thu, 25 Oct 2007 14:00:01 +0200 <thp@perli.net>
1933 Sync videos to the "Video Podcasts" playlist instead of the "Video" menu
1935         * src/gpodder/libipodsync.py: Merged patch from Nicolas Quienot
1936         <niqooo@gmail.com> to sync videos to the "Video Podcasts" menu instead
1937         of the "Videos" menu, as documented on http://ipodlinux.org/ITunesDB
1939 Tue, 23 Oct 2007 09:24:52 +0200 <thp@perli.net>a
1940 sync_filename in podcastItem; cleanup; hide extra progressbar on transfer
1942         * src/gpodder/gui.py: Use podcastItem's sync_filename(); hide the
1943         unnecessary second progressbar when only syncing one channel (i.e.
1944         when clicking on the "transfer" button in the main window
1945         * src/gpodder/libgpodder.py: Remove unneeded lexists import and
1946         warning; clean-up
1947         * src/gpodder/libipodsync.py: Use podcastItem's sync_filename()
1948         * src/gpodder/libpodcasts.py: Add sync_filename() to podcastItem,
1949         returns the custom_sync_name or the title of the episode, based on the
1950         user's configuration settings for FS-based MP3 player sync
1952 Sun, 07 Oct 2007 14:38:31 +0200 <thp@perli.net>
1953 Add wishlist items to TODO list from Paul and Wilfred
1955         * TODO: New wishlist items, ideas and suggestions
1957 Sat, 06 Oct 2007 12:39:57 +0200 <thp@perli.net>
1958 Limit download progress status updates to reduce CPU load
1960         * src/gpodder/download.py: Limit the amount of status updates the
1961         download threads send to the DownloadStatusManager to one per second;
1962         this should make gPodder less CPU-intensive with many parallel
1963         downloads; thanks to Wilfred van Rooijen for reporting and testing
1965 Tue, 02 Oct 2007 17:59:29 +0200 <thp@perli.net>
1966 Update channel models (icons) after iPod synchronization
1968         * src/gpodder/gui.py: Call update_model() on each channel after an
1969         iPod sync, so we can update the played state on the available episodes
1970         lists when played state was changed by the iPod sync
1972 Sat, 29 Sep 2007 14:12:15 +0200 <thp@perli.net>
1973 Fix loading of channel metadata (load auth data and settings)
1975         * src/gpodder/libpodcasts.py: Load channel metadata when loading a
1976         podcastChannel object from OPML/LocalDB. This fixes a problem with
1977         authentication data being not loaded and also fixes a bug when the
1978         custom-set channel title was not correctly used throughout the GUI.
1979         Thanks to Nick (nikosapi) for reporting and providing a patch
1981 Tue, 25 Sep 2007 22:02:19 +0200 <thp@perli.net>
1982 Finally remove Desktop symlink code; several compatibility fixes
1984         * src/gpodder/download.py: Prevent divide-by-zero errors when
1985         calculating download speed
1986         * src/gpodder/gui.py: Prevent divide-by-zero errors when calculating
1987         percentage done in code for moving the downloaded items folder
1988         * src/gpodder/libgpodder.py: Remove the "Symlink on Desktop" code,
1989         because it's not GUI-accessible anymore and we didn't use it anyway
1990         * src/gpodder/opml.py: Better local filename detection by using
1991         os.path.exists() instead of .startswith('/'); this is also good for
1992         cross-platform compatibility where parts don't usually start with a
1993         forward slash (i.e. Win32)
1995 Mon, 24 Sep 2007 00:09:44 +0200 <thp@perli.net>
1996 Channel list selection bug fixes
1998         * src/gpodder/gui.py: Fix some channel list-related problems and
1999         annoyances, based on a patch by Nick (nikosapi)
2000         * bin/gpodder: We're in development again, so "+svn"
2002 Fri, 21 Sep 2007 02:07:43 +0200 <thp@perli.net>
2003 gPodder 0.10.0 "Hier spricht Frank Drebin" released
2005         * bin/gpodder: gPodder 0.10.0 released :)
2006         * doc/man/gpodder.1: gPodder 0.10.0 released :)
2007         * README: gPodder 0.10.0 released :) (and: updated dependencies)
2008         * TODO: Updated TODO list (some items are done for 0.10.0 :)
2010 Fri, 21 Sep 2007 02:05:10 +0200 <thp@perli.net>
2011 Updated translations from Rosetta (Launchpad.net)
2013         * data/po/es.po: Spanish translation by Julio Acuña
2014         * data/po/pt.po: Portuguese translation by Joel Calado (completed :)
2016 Fri, 21 Sep 2007 01:46:38 +0200 <thp@perli.net>
2017 Fix problems with path selection in treeChannels
2019         * src/gpodder/gui.py: Simple bugfix
2021 Fri, 21 Sep 2007 00:32:51 +0200 <thp@perli.net>
2022 Center gPodderEpisode on treeAvailable for less mouse hopping
2024         * src/gpodder/gui.py: If possible, center the gPodderEpisode dialog
2025         window on the treeAvailable, because that makes the position of the
2026         opened dialog more predictable and easier to use (as if the
2027         gPodderEpisode dialog was "inside" the treeView from which it opened)
2029 Fri, 21 Sep 2007 00:07:49 +0200 <thp@perli.net>
2030 Don't translate feed format string examples
2032         * src/gpodder/gui.py: Don't mark format string examples as
2033         translatable
2035 Wed, 19 Sep 2007 17:21:09 +0200 <thp@perli.net>
2036 Small bugfix for updating treeChannels when its model changes
2038         * src/gpodder/gui.py: Bugfix
2040 Wed, 19 Sep 2007 16:57:41 +0200 <thp@perli.net>
2041 Removed channel combobox, drag'n'drop improvements + new channel cover editor
2043         * data/gpodder.glade: Remove comboAvailable in gPodder (main window);
2044         add download+clear button in gPodderChannel, rename some items that
2045         are now used in code; make the channel navigator non-shrinkable (so
2046         it is always visible, because we don't have comboAvailable anymore)
2047         * src/gpodder/gui.py: Remove support for the channel combo box,
2048         also known as comboAvailable; clean-up DND code and make treeChannels
2049         the only DND target in the main window; remove some unnecessary
2050         updating of the channel list (calls to updateComboBox);
2051         Changes for the gPodderChannel dialog: Don't automatically download
2052         channel cover when dialog pops up; add "Download" and "Clear" buttons
2053         to the cover editor; add DND support for dropping local files or
2054         images from the web browser to the cover editor (for setting custom
2055         covers on channels with bad or no cover)
2056         * src/gpodder/libgpodder.py: Don't abort get_image_from_url() if the
2057         URL is invalid, but the image has already been downloaded (because we
2058         read the downloaded image in the code when it exists, without URL)
2060 Wed, 19 Sep 2007 14:23:40 +0200 <thp@perli.net>
2061 Center feed update dialog on main window; scroll reset in chan.navigator
2062         * src/gpodder/gui.py: Reset the current scroll position of the channel
2063         navigator when re-loading the channel list; this fixes an annoyance
2064         that Alistair Sutton <alistair.sutton@gmail.com> reported when dealing
2065         with a HUGE channel list (more than 50 channels); also removed the
2066         scroll position reset code from treeAvailable, as we already managed
2067         to only edit the model instead of re-loading it every time; added code
2068         to really center the feed update dialog on gPodder's main window
2070 Tue, 18 Sep 2007 20:15:56 +0200 <thp@perli.net>
2071 Replace wget with new gpodder.download module; User-agent support
2073         * bin/gpodder: Set "gpodder.user_agent" field on startup; remove check
2074         for wget, as this is not needed anymore
2075         * src/gpodder/cache.py: Clean-up; remove old logging code; add support
2076         for gpodder.user_agent; log info when there is an error in parsing the
2077         feed, so the user knows why this feed is not cached
2078         * src/gpodder/console.py: Remove DownloadPool, Use new
2079         gpodder.download module for carrying out downloads, remove
2080         wget_version() tester, as this is not needed anymore =)
2081         * src/gpodder/download.py: Added new downloader module that uses
2082         urllib and some custom classes and functions to provide the equivalent
2083         functionality of the obsolete "libwget", but without the wget
2084         dependency and with better accuracy (progress reporting, etc..)
2085         * src/gpodder/gui.py: Utilize new gpodder.download module instead of
2086         libwget
2087         * src/gpodder/__init__.py: Add "user_agent" variable to the gpodder
2088         module that holds the value of the "User-agent" header to send to web
2089         servers when requesting OPMLs, Feeds or download data
2090         * src/gpodder/opml.py: Add support for sending the User-agent header
2091         * src/gpodder/services.py: Make the progress column a float column to
2092         have smoother progress indicuation; add the "acquired" keyword
2093         argument to s_release(); default 'speed' to a translated "Queued"
2094         * src/gpodder/libwget.py: Removed
2095         * doc/dev/redhat-wget-output.txt: Removed
2097 Tue, 18 Sep 2007 02:30:04 +0200 <thp@perli.net>
2098 Refreshed pot files and po templates; updated German translation
2100         * data/messages.pot: Refreshed from current source
2101         * data/po/de.po: Refreshed and updated translation
2102         * data/po/*.po: Refreshed from new .pot file
2104 Tue, 18 Sep 2007 02:19:19 +0200 <thp@perli.net>
2105 Imported updated translations from Rosetta (Launchpad.net)
2107         * data/po/it.po: Italian translation updated by FFranci72
2108         * data/po/nl.po: Dutch translation updated by Roel Groeneveld
2109         * data/po/pt.po: Portuguese translation updated by Joel Calado
2111 Tue, 18 Sep 2007 02:14:19 +0200 <thp@perli.net>
2112 Offline support for feedcache, faster startup, code simplification
2114         * src/gpodder/cache.py: Add support for "offline" keyword argument
2115         * src/gpodder/gui.py: Make intelligent use of "offline" keyword
2116         argument when passed to load_channels(); simplify code for selecting
2117         the active channel in updateComboBox()
2118         * src/gpodder/libpodcasts.py: Pass-through of "offline" keyword
2119         argument in all relevant function calls
2121 Sat, 15 Sep 2007 16:22:28 +0200 <thp@perli.net>
2122 New LocalDB using DOM (removes python-xml dependency); channel context menu
2124         * bin/gpodder: Don't check for xml.sax package and modules anymore, as
2125         the dependency on python-xml has been removed with this release
2126         * data/gpodder.glade: Remove the "info" button for the current channel
2127         * src/gpodder/gui.py: Remove localdb-related code and adopt code for
2128         new LocalDB code; add context menu to channel navigator (edit/delete)
2129         * src/gpodder/libipodsync.py: Don't import "liblocaldb" module
2130         * src/gpodder/liblocaldb.py: Removed
2131         * src/gpodder/liblocdbreader.py: Removed
2132         * src/gpodder/liblocdbwriter.py: Removed
2133         * src/gpodder/liblogger.py: Add "traceback" keyword argument to the
2134         log() function; if "True" and in debugging mode, print traceback
2135         * src/gpodder/libpodcasts.py: Merge code from old liblocaldb and
2136         liblocdbreader/liblocdbwriter to this module as LocalDBWriter and
2137         LocalDBReader; customize podcastChannel to new LocalDB code
2138         * src/gpodder/libwget.py: Remove localdb-specific code (now obsolete)
2140 Wed, 12 Sep 2007 23:07:23 +0200 <thp@perli.net>
2141 Fix a bug when traversing directories with loop symlinks
2143         * src/gpodder/util.py: Don't dive into subdirectories that are
2144         symbolic links, this is to avoid a situation where looping symlinks
2145         result in the function dead-locking in a endless recursive loop,
2146         thanks to Bjørn Rasmussen <bjoernr@sensewave.com> for pointing that
2147         out and providing the necessary bug report to fix this issue
2149 Sun, 09 Sep 2007 18:47:20 +0200 <thp@perli.net>
2150 Mark episodes as downloaded/deleted when deleting episodes
2152         * src/gpodder/gui.py: Rename "Mark [...] as downloaded" to "Mark [...]
2153         as deleted" and mark episodes as downloaded when removing selected
2154         episodes that have not been downloaded yet, as suggested by Holger
2155         Leskien <holger leskien.com>
2156         * src/gpodder/libpodcasts.py: Fix problem when trying to delete
2157         episodes that have not been downloaded
2159 Sat, 08 Sep 2007 16:45:21 +0200 <thp@perli.net>
2160 Support for customized file names in MP3 player sync code
2162         * src/gpodder/gui.py: Add supporting code for reading/setting
2163         configuration options for the preferences dialog and a help display
2164         code that displays a guide on how to write custom sync name strings
2165         * src/gpodder/libgpodder.py: New configuration options:
2166         custom_sync_name (holds format string) and
2167         custom_sync_name_enabled (boolean, if the above string should be used)
2168         * src/gpodder/libipodsync.py: Use custom sync name format string and
2169         util's object_string_formatter() function to obtain a file name for
2170         the synchronized episode (or default to episode.title if disabled)
2171         * src/gpodder/libpodcasts.py: Add new property methods to podcastItem:
2172         basename (returns the basename of the URL, without extension) and
2173         published (returns the pubDate of the episode in YYYYMMDD format)
2174         * src/gpodder/util.py: New object_string_formatter() method that
2175         replaces {OBJECTNAME.ATTRNAME} substrings in a string with the
2176         corresponding values of passed-in keyword argument objects
2177         * data/gpodder.glade: Added preferences GUI elements
2179 Wed, 05 Sep 2007 10:14:09 +0200 <thp@perli.net>
2180 Check for installed python-xml package on startup (hard dependency)
2182         * bin/gpodder: Add dependency check for PyXML
2184 Sun, 02 Sep 2007 15:01:48 +0200 <thp@perli.net>
2185 Fix bug with default window title in gPodder window
2187         * src/gpodder/gui.py: Always set gPodder's default_title attribute
2189 Sun, 02 Sep 2007 14:33:21 +0200 <thp@perli.net>
2190 Updated Russian translation from Vladimir Zemlyakov
2192         * data/po/ru.po: Updated
2194 Sun, 02 Sep 2007 14:23:17 +0200 <thp@perli.net>
2195 More sanitizing hacks for ugly feeds we don't really like
2197         * src/gpodder/libpodcasts.py: Negotiate which enclosure to select from
2198         multiple enclosures, if there are more than one available; skip
2199         episodes with a buggy download URL (i.e. no supported URL scheme)
2200         * src/gpodder/util.py: Return "(unknown)" if file size cannot be
2201         determined from the string passed to format_filesize(); return "None"
2202         in file_type_by_extension() if the extension is an empty string
2204 Fri, 31 Aug 2007 23:38:01 +0200 <thp@perli.net>
2205 Handle enclosures (or lack thereof) better if fields are missing
2207         * src/gpodder/gui.py: Remove refetch_channel_list() function, as this
2208         is not called anywhere from the code (uh, how did i miss that?)
2209         * src/gpodder/libpodcasts.py: Be more liberal to enclosure tags
2210         without length or mime type; ignore episodes without enclosures (it's
2211         not len(enclosures) == 0, but the enclosures attribute doesn't even
2212         exist on entries without enclosures, so make sure to check for that
2214 Fri, 31 Aug 2007 20:03:03 +0200 <thp@perli.net>
2215 Use Python's webbrowser module for URL opening; channel dialog clean-up
2217         * bin/gpodder: Set version to 0.9.5+svn (this is where we are now)
2218         * data/gpodder.glade: Remove "cancel" button from gPodderChannel
2219         * src/gpodder/gui.py: Use "webbrowser" module for URL opening instead
2220         of relying on "gnome-open" to be available; remove event handler for
2221         gPodderChannel's "cancel" button
2223 Thu, 30 Aug 2007 21:06:28 +0200 <thp@perli.net>
2224 Dependency check for python-feedparser in bin/gpodder
2226         * bin/gpodder: Add dependency check and warning (with exit) if
2227         python-feedparser is not installed, as python-feedparser now is a
2228         dependency of gPodder
2230 Thu, 30 Aug 2007 20:51:46 +0200 <thp@perli.net>
2231 Support for modifying DownloadHistory and PlaybackHistory in GUI
2233         * data/gpodder.glade: Added menu items in gPodder main window
2234         * src/gpodder/gui.py: Add menu items to treeAvailable's context menu
2235         to toggle/set downloaded and played status on selected episodes
2236         * src/gpodder/libgpodder.py: Add del_item() function to
2237         DownloadHistory to support removing items from the history list;
2238         enhance history_mark_{played,downloaded}() functions for add/delete
2240 Thu, 30 Aug 2007 20:46:48 +0200 <thp@perli.net>
2241 Improved pubDate parsing; episode delete bugfix
2243         * src/gpodder/libpodcasts.py: Let feedparser parse the pubDate field
2244         of episodes and use new function in gpodder.util to convert the parsed
2245         pubDate to a string; bugfix for remove downloaded episode by URL
2246         * src/gpodder/util.py: Add updated_parsed_to_rfc2822() function that
2247         converts the "updated_parsed" field from feedparser to a RFC2822
2248         string
2250 Thu, 30 Aug 2007 12:03:24 +0200 <thp@perli.net>
2251 Remove obsolete documentation in doc/dev; cosmetic changes
2253         * data/po/Makefile: Upgrade to GPLv3
2254         * data/po/README: Mention i18n page on gPodder's website
2255         * doc/dev/build-deps-breezy.txt: Removed
2256         * doc/dev/debian.txt: Removed
2257         * doc/dev/i18n.txt: Removed
2258         * doc/dev/porting.txt: Removed
2259         * doc/dev/svncl.sed: Upgrade to GPLv3; modify look added and removed
2260         files
2262 Wed, 29 Aug 2007 20:26:50 +0200 <thp@perli.net>
2263 Upgrade to the GNU General Public License, Version 3
2265         * bin/gpodder: Upgrade to GPLv3
2266         * COPYING: Upgrade to GPLv3
2267         * doc/dev/copyright_notice: Upgrade to GPLv3
2268         * Makefile: Upgrade to GPLv3
2269         * README: Upgrade to GPLv3
2270         * setup.py: Upgrade to GPLv3
2271         * src/gpodder/*.py: Upgrade to GPLv3 (except for SimpleGladeApp and
2272         cache, as these are LGPL or other and do not originate from gPodder)
2274 Wed, 29 Aug 2007 19:32:22 +0200 <thp@perli.net>
2275 Integration changes, commit and ChangeLog migration
2277         * doc/dev/svncl.sed: Use tabs instead of 8 spaces for ChangeLog edit
2278         * Makefile: Make $EDITOR edit "ChangeLog" directly
2280 Wed, 29 Aug 2007 19:17:36 +0200 <thp@perli.net>
2281 Last batch of experimental change merges (up to svn r398)
2283         * doc/dev/tepache-howto.txt: Removed
2284         * doc/dev/tepache: Removed
2285         * src/gpodder/gui.py.orig: Removed
2286         * src/gpodder/libwget.py: Send progress = 0.0 on inital status update
2287         * src/gpodder/libpodcasts.py: Try to get episode metadata from several
2288         different properties of the corresponding feedparser entries; warn
2289         user when we couldn't get the episode title and try to get the episode
2290         title from the filename of the URL if we still have not found an
2291         episode title
2292         * src/gpodder/libgpodder.py: Add get_device_name() that returns a
2293         "nice" representative string of the currently selected device that can
2294         be used to represent the device in the GUI
2295         * src/gpodder/util.py: Return "(unknown)" string when bytesize in
2296         format_filesize() when the size has a negative value; make
2297         get_tree_icon() catch errors and be more corrent with icon creation;
2298         add get_first_line() function that extracts the first line of a string
2299         * src/gpodder/libipodsync.py: Add "divx" to list of video extensions
2300         * src/gpodder/services.py: DownloadStatusManager has a new observer
2301         notification: "progress-detail"; add unregister() functionality for
2302         observers; add request_progress_detail() function that can be used to
2303         force a "progress-detail" notification to be sent out to all relevant
2304         observers; remove get_url_by_iter() function as it is not needed
2305         anymore
2306         * src/gpodder/gui.py: Clean-up after tepache dependency removal; new
2307         GladeWidget base class that subclasses SimpleGladeApp and simplifies
2308         class creation for our gPodder windows; add context menu to
2309         treeAvailable; re-work play_or_download() and make it return a list of
2310         boolean indicators on which actions can be performed on the selected
2311         items; move show_message() and show_confirmation() to GladeWidget;
2312         disable editing of the URL in the channel info dialog, this simplifies
2313         code and editing the URL doesn't make so much sense anyway (adding the
2314         new url and removing the old does the same and is easier, code-wise);
2315         add support for cancelling downloads in the available podcasts view;
2316         support live status view and download cancelling in the gPodderEpisode
2317         dialog window by hooking up to DownloadStatusManager as observer
2318         * src/gpodder/SimpleGladeApp.py: Customize for gPodder (remove usage
2319         of weakref for keyword arguments -> properties of new object)
2320         * bin/gpodder: We're using a experimental development version now
2321         * data/gpodder.glade: Add progress bar and associated buttons to
2322         gPodderEpisode dialog
2323         * MANIFEST.in: Removed gpodder.py.orig inclusion
2324         * Makefile: Removed support for tepache
2326 Wed, 29 Aug 2007 19:05:57 +0200 <thp@perli.net>
2327 More changes from the experimental branch (up to svn r382)
2329         * src/gpodder/liblocdbreader.py: Clean-up
2330         * src/gpodder/libwget.py: Use "gpodder.services" instead of accepting
2331         a generic download status manager as constructor parameter; remove
2332         downloadStatusManager class (moved to gpodder.services)
2333         * src/gpodder/console.py: More clean-ups; use get_new_episodes()
2334         instead of duplicating code here; simplify the code for wget version
2335         detection
2336         * src/gpodder/libpodcasts.py: Improve channel/episode generation from
2337         feedparser objects (with error handling); utilize download status
2338         manager from "gpodder.services" instead of accepting a download status
2339         manager as parameter; clean up unneeded functions and rename some
2340         functions to make the code more readable; use util.get_tree_icon() for
2341         compositing a nice icon; remove the "played" column from the
2342         treemodel; add local_filename to treemodel
2343         * src/gpodder/liblocdbwriter.py: Clean-up
2344         * src/gpodder/libgpodder.py: Clean-up
2345         * src/gpodder/util.py: Add torrent_filename() function that tries to 
2346         extract the filename of the file a .torrent file contains; add
2347         file_extension_from_url() function that returns the file extension in
2348         a URL; add file_type_by_extension() that returns the type of a file
2349         based on its extension; add get_tree_icon() that loads a named icon
2350         and optionally adds a bullet to it (unplayed status indicator)
2351         * src/gpodder/libipodsync.py: Clean-up
2352         * src/gpodder/services.py: New module that currently contains the
2353         improved DownloadStatusManager and a single object that servces as
2354         download status manager for all parts of gpodder
2355         * src/gpodder/gui.py: Only one column for status/played; use
2356         "gpodder.services" for the download status manager; clean-up
2357         * src/gpodder/liblocaldb.py: Clean-up
2358         * bin/gpodder: Clean-up
2359         * data/gpodder.glade: Clean-up; removed "show played column"
2360         preference in gPodderProperties dialog
2362 Wed, 29 Aug 2007 18:49:37 +0200 <thp@perli.net>
2363 First import from experimental branch (up to svn r375)
2365         * src/gpodder/librssreader.py: Removed in favor of python-feedparser
2366         * src/gpodder/libwget.py: Percentage is now a float, don't set to 0
2367         when there has been an error
2368         * src/gpodder/console.py: Use {load,save}_channels methods; code
2369         cleanup and simplification
2370         * src/gpodder/cache.py: Add python-feedcache module from Doug Hellman
2371         * src/gpodder/libpodcasts.py: Use opml and feedcache for channel list
2372         and RSS reading; use shelve for new ChannelSettings class; clean-up
2373         podcastChannel and podcastItem; better TreeModel generator for
2374         podcastChannel (try to cache the model, only updates icons, etc...);
2375         remove downloadRss method in podcastChannel; move DownloadHistory and
2376         Playbackhistory to libgpodder; new load_channels() and save_channels()
2377         functions to save/load the channel list to an OPML file
2378         * src/gpodder/libgpodder.py: BIG clean-up; remove gPodderChannelWriter
2379         and gPodderChannelReader (this is now in libpodcasts as simple
2380         functions); add DownloadHistory and PlaybackHistory from libpodcasts; 
2381         * src/gpodder/gui.py: Use new functions for channel list
2382         loading/saving; only update treemodel for treeAvailable when it's
2383         really necessary
2384         * src/gpodder/liblocaldb.py: Remove unnecessary functions that have
2385         not been used for a while (treemodel-related); use load_channels()
2386         instead of gPodderChannelReader
2389 Wed, 29 Aug 2007 18:31:16 +0200 <thp@perli.net>
2390         * ChangeLog: Older changes can be found on the gPodder website at
2391         http://gpodder.berlios.de/releases/0.9.5/ChangeLog