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