Fri, 11 Apr 2008 10:11:33 +0200 <thp@perli.net>
[gpodder.git] / ChangeLog
blobc5519c3b2e2de27becf2556bc23b02e14d422b58
1 Fri, 11 Apr 2008 10:11:33 +0200 <thp@perli.net>
2 Make RSS .torrent feeds from different Torrent sites work
4         * src/gpodder/libpodcasts.py: If an episode doesn't have an enclosure,
5         but its link looks like it's a media/torrent file, we are going do
6         interpret that as the enclosure URL; this makes feeds from different
7         torrent sites work with gPodder; thanks to Josh Gardner
8         <mellowcellofellow@gmail.com> for reporting this bug on Bugzilla
9         (http://bugs.gpodder.org/show_bug.cgi?id=74)
11 Tue, 08 Apr 2008 10:54:01 +0200 <thp@perli.net>
12 Updated Spanish translation
14         * data/po/es.po: Updated Spanish translation from Julio Acuña
16 Mon, 07 Apr 2008 23:06:53 +0200 <thp@perli.net>
17 Makre sure we can re-set the locale after changing it
19         * src/gpodder/util.py: Make sure we can re-set the locale after
20         changing it, and if we cannot, only print a warning, but don't throw
21         the exception outside of the function
23 Mon, 07 Apr 2008 23:05:05 +0200 <thp@perli.net>
24 Add 64x64 icon for Maemo's main menu and install it
26         * data/icons/64/gpodder.png: Added
27         * setup.py: Install the 64x64 icon in share/icons/hicolor
29 Mon, 07 Apr 2008 11:47:12 +0200 <thp@perli.net>
30 Install "pixmaps" icon on Maemo, too
32         * setup.py: Make sure we also install the "/usr/share/pixmaps/"
33         version of the gPodder icon on Maemo (for the task navigator)
35 Mon, 07 Apr 2008 11:24:54 +0200 <thp@perli.net>
36 Fix problems with the tray icon emblems
38         * src/gpodder/trayicon.py: Fix emblem drawing code for non-square
39         icons; use the "refresh" icon for feed updates and "multimedia-player"
40         icon for the iPod/MP3 player sync status emblem
42 Sun, 06 Apr 2008 17:22:11 +0200 <thp@perli.net>
43 Fix install Makefile bug; add donator; fix treeview header height
45         * Makefile: Add "generators" dependency for the "install" target
46         * src/gpodder/gui.py: Add Mark Alford (donator) to contributors list;
47         remove the hard-coded header height offset for the treeview, because
48         we don't need it anymore, because we hide the header (this is a good
49         thing, because we don't need to rely on a theme-specific header
50         height compared to what we did previously - one FIXME less :)
52 Sun, 06 Apr 2008 02:05:34 +0200 <thp@perli.net>
53 Initial upstream support for the Maemo platform (Nokia Internet Tablets)
55         * bin/gpodder: Add "--maemo/-m" option to enable running as a Maemo
56         application (this is only useful on Nokia Internet Tablets or in the
57         Maemo SDK environment); determine interface type and set the correct
58         variables on startup (gpodder.interface)
59         * data/gpodder.glade: Increase the default size of some widgets to
60         better fit the screens on Maemo (it won't do any harm on the "big"
61         Desktop screen
62         * data/icons/26/gpodder.png: Added
63         * data/icons/40/gpodder.png: Added
64         * data/maemo/gpodder.desktop: Added
65         * Makefile: Help2man variable; new "make mtest" target that runs
66         gPodder in Maemo scratchbox (probably useless for all other things);
67         update the command descriptions; don't run the "generators" target
68         from the "install" target; don't run "gen_graphics" from the
69         "generators" target, but make it depend on the 24-pixel logo, which
70         itself depends on the 22-pixel logo; this way, all should work out
71         well when trying to install on systems without ImageMagick installed;
72         remove *.pyo files on "make clean"
73         * setup.py: Support for build targets; use "TARGET=maemo" to enable
74         Maemo-specific installation options and files
75         * src/gpodder/config.py: Increase the WRITE_TO_DISK_TIMEOUT to 60
76         seconds, so we don't unnecessarily stress memory cards (on ITs);
77         modify default path variables on Maemo (/media/mmc2)
78         * src/gpodder/gui.py: Maemo-specific changes; clean-up the main window
79         a bit and make message and confirmation dialogs Hildon-compatible
80         * src/gpodder/__init__.py: Add enums for interface types: CLI, GUI and
81         MAEMO; remove the "interface_is_gui" variable and replace with
82         "interface", which is now used to determine where we are running
83         * src/gpodder/libgpodder.py: Use /media/mmc2/gpodder/ as configuration
84         folder on Maemo; use Nokia's Media player to playback files on Maemo
85         * src/gpodder/libpodcasts.py: Icon name changes (Maemo-specific)
86         * src/gpodder/trayicon.py: Maemo support; swap popup menu on Maemo;
87         Add support for hildon banners instead of pynotify on Maemo
88         * src/gpodder/util.py: Icon name changes (Maemo-specific); use new
89         gpodder.interface variable in idle_add
91 Sat, 05 Apr 2008 21:06:14 +0200 <thp@perli.net>
92 Make i18n help text work in the console help (gpodder --help)
94         * bin/gpodder: Fix a bug that would make the localized help string of
95         the CLI break; thanks to Pavel Mlcoch <pavkamlc@centrum.cz> for
96         reporting this bug on the gPodder bug tracker
97         (Closes: http://bugs.gpodder.org/show_bug.cgi?id=53)
99 Fri, 04 Apr 2008 09:50:35 +0200 <thp@perli.net>
100 Use the correct multimedia-player icon for the transfer main menu item
102         * data/gpodder.glade: Use the multimedia-player icon for the transfer
103         to device menu item (was still gtk-network, forgot to change)
105 Fri, 04 Apr 2008 09:48:25 +0200 <thp@perli.net>
106 Fix gPodder freeze with open notifications on quit
108         * src/gpodder/trayicon.py: Fix a bug when gPodder would freeze when
109         a notification bubble was still open while closing the main
110         application; thanks to Jérôme Chabod for reporting this issue
111         (Closes: http://bugs.gpodder.org/show_bug.cgi?id=55)
113 Fri, 04 Apr 2008 09:46:23 +0200 <thp@perli.net>
114 Increase filename size limitation from 50 to 100 chars in MP3 player sync
116         * src/gpodder/sync.py: Increase the number at which file names are cut
117         down in length to 100 characters and also cut folder names to that
118         length; thanks to Bernd Schlapsi for reporting this bug on the list
120 Sun, 30 Mar 2008 10:48:41 +0200 <thp@perli.net>
121 Make the Quit buttons actually quit when using the tray icon
123         * src/gpodder/gui.py: Patch from Nick L. to make the function of all
124         "Quit" buttons really quit gPodder and only make the window's "X"
125         button act as "minimize to tray" button; Also, update the credits name
127 Sat, 29 Mar 2008 17:13:26 +0100 <thp@perli.net>
128 Project management updates (authors, contributors and copyright)
130         * AUTHORS: Removed (was outdated); content now in gui.py (AboutDialog)
131         * bin/gpodder, data/po/Makefile, doc/dev/copyright_notice, 
132           doc/dev/win32/setup-win32.py, INSTALL, Makefile, README,
133           setup.py: Updated Copyright and old website URL to include 2008, the
134           gPodder team and www.gpodder.org
135         * src/gpodder/*.py: Updated Copyright years
136         * src/gpodder/gui.py: Add list of contributors from AUTHORS file and
137         from the content on the website's news page (please mail me if I
138         forgot to mention you as a contributor, I surely have missed a few);
139         make the AboutDialog's application name "gPodder" (from gpodder) and
140         add an URL hook function to the AboutDialog, so the website is opened
141         in the user's default web browser
143 Sat, 29 Mar 2008 16:30:02 +0100 <thp@perli.net>
144 Report errors in parsing/loading an already-added channel in the navigator
146         * src/gpodder/gui.py: Show the error from feedparser in the channel's
147         tooltip if there has been an error loading the channel
148         * src/gpodder/libpodcasts.py: Make sure we can load a default title
149         when using get_by_url(); save the parse_error variable for each
150         channel (it defaults to None if there is no error); mark the
151         description text for the channel navigator in red color if there has
152         been a parser error and add the parse_error variable to the liststore
153         model
154         * src/gpodder/util.py: Strip whitespace before and after the string in
155         remove_html_tags()
157 Sat, 29 Mar 2008 16:18:59 +0100 <thp@perli.net>
158 Add support for Rockbox' AudioScrobbler logfile to update played status
160         * src/gpodder/config.py: Add "mp3_player_use_scrobbler_log"
161         configuration option (defaulting to False) which controls if we are
162         going to try and find a ".scrobbler.log" file that contains
163         information on which tracks have been played; for this to work, you
164         also have to enable the "Updated tags after download" option
165         * src/gpodder/sync.py: Support for finding the .scrobbler.log file and
166         updating the played status of episodes in the MP3 player sync code
167         * src/gpodder/util.py: Add "find_mount_point()" function that tries to
168         determine the mount point on which the given directory (or file) lies
169         and returns the mount point or "/" if the directory/file resides on
170         the root filesystem.
172         This whole patch has been contributed by Nick <nikosapi.org> - thanks!
174 Sat, 29 Mar 2008 16:16:06 +0100 <thp@perli.net>
175 Merge sv.po translation from 0.11.1 release tarball
177         * data/po/sv.po: It seems like I somehow messed up the translations
178         merge, so here's the correct sv.po translation file, merged from the
179         0.11.1 tarball; thanks to Anders Kvist <kvistkvist@telia.com> for
180         pointing that out :)
182 Sat, 29 Mar 2008 01:20:46 +0100 <thp@perli.net>
183 Make sure we ignore the updated_parsed of a channel if it's None
185         * src/gpodder/libpodcasts.py: Only try to convert the "updated_parsed"
186         field if it's not "None"
187         * src/gpodder/util.py: Make sure we receive a valid 9-tuple when
188         converting dates from updated_parsed; if we receive a None value or
189         some value that isn't "9" in length, return None
190         Thanks to Chris Arnold <carnold@electrichendrix.com> for reporting
191         this bug on the gpodder-devel mailing list
193 Thu, 27 Mar 2008 13:10:58 +0100 <thp@perli.net>
194 This is trunk, so set version to 0.11.1+svn
196         * bin/gpodder: Set version to 0.11.1+svn
198 Thu, 27 Mar 2008 12:57:56 +0100 <thp@perli.net>
199 gPodder 0.11.1 "Attacked by Killer Tomatoes" released
201         * bin/gpodder: gPodder 0.11.1 released :)
202         * README: gPodder 0.11.1 released :)
203         * doc/man/gpodder.1: gPodder 0.11.1 released :)
204         * data/icons/24/gpodder.png: Updated from the dataset
205         * data/messages.pot: Updated from source
206         * data/po/*.po: Updated from messages.pot
207         * data/po/de.po: Updated German translation
209 Thu, 27 Mar 2008 11:52:35 +0100 <thp@perli.net>
210 Use cPickle for dumbshelve - it's compatible and faster
212         * src/gpodder/dumbshelve.py: Improve saving of channel cache and
213         metadata (and basically all that currently depends on dumbshelve) by
214         using cPickle as a drop-in replacement for pickle
216 Thu, 27 Mar 2008 11:28:31 +0100 <thp@perli.net>
217 Fix problem with pickle when there is a feed parsing exception
219         * src/gpodder/cache.py: When the feedparser returns an exception, this
220         will be stored as object in bozo_exception. Convert this to a string,
221         so the pickle module doesn't complain; thanks to VladDrac in #python
222         on FreeNode for pointing me to the right direction to fix this bug
224 Mon, 24 Mar 2008 10:42:19 +0100 <thp@perli.net>
225 Add "3gp" to the list of video file extensions, so we detect these files
227         * src/gpodder/util.py: Add the .3gp video file extension to the list
228         of known video file extensions, so we can detect that these are video
229         files and act accordingly (in the UI and on sync); thanks to Atte
230         André Jensen for reporting this bug on the gpodder-devel mailing list
232 Sun, 23 Mar 2008 10:39:24 +0100 <thp@perli.net>
233 Fix a bug when loading invalid image data (delete cover file then)
235         * src/gpodder/libgpodder.py: Fix a bug when gPodder is unable to load
236         an invalid cover image (i.e. when dragging a linked image from the
237         browser to the gPodder window, the link is sent, not the image)
239 Sat, 22 Mar 2008 21:08:06 +0100 <thp@perli.net>
240 Make bluetooth device discover a bit nicer
242         * src/gpodder/gui.py: Improve bluetooth device discovery button by not
243         destroying its design when it has been clicked and the label is
244         modified
246 Sat, 22 Mar 2008 20:45:27 +0100 <thp@perli.net>
247 Revert previous insanity (where I selected an awful "Transfer" toolbar icon)
249         * data/gpodder.glade: I wonder why I selected "gtk-network" as the
250         icon for the "Transfer" button on gPodder's toolbar. It surely is
251         irritating and illogical as hell.. Hmm. Anyway - now, there is a nice
252         "multimedia-player" icon which probably depicts an iPod-like device
253         if you use a good icon set. This makes much more sense. Go usability!
255 Sat, 22 Mar 2008 20:41:54 +0100 <thp@perli.net>
256 Add "Visit website" menu items to channel and episode list; simple chan menu
258         * src/gpodder/gui.py: Add "Visit website" menu items to the context
259         menu of both the episode list and the channel navigator; also, make
260         the channel context menu easier to use by replacing the old
261         "Edit [Channelname]" and "Remove [Channelname]" items with stock items
263 Sat, 22 Mar 2008 18:41:30 +0100 <thp@perli.net>
264 Fix "Podcasts not being marked as new when synced to iPod" (#70)
266         * src/gpodder/sync.py: Fix bug when podcasts were not marked as new
267         when synced to iPod and "on_sync_mark_played" was enabled;
268         Bug URL: http://bugs.gpodder.org/show_bug.cgi?id=70
269         Thanks to defrex (defrex0 gmail com) for report this bug in Bugzilla
271 Thu, 20 Mar 2008 11:21:06 +0100 <thp@perli.net>
272 Delay loading of UserAppsReader and improve libplayers
274         * src/gpodder/gui.py: Only load UserAppsReader's database three
275         seconds after gPodder start (because we only need it when the user
276         opens the preferences dialog, and if she opens it before these three
277         seconds, the UserAppsReader data is loaded on demand); because we load
278         the database (and generate the model) before we display the
279         preferences dialog, the preferences dialog usually comes up faster
280         than before (except for the situation where it is opened right after
281         gPodder startup); have only one UserAppsReader for audio/video and not
282         both (would duplicate the amount of work needed to read desktop
283         files); cleanup some UserAppsReader-related code in the prefs dialog
284         * src/gpodder/libplayers.py: Improve the reading code and make it
285         possible to support multiple mime types per-UserAppsReader (i.e. both
286         audio and video types are read by a single UAR instance); clean up the
287         imports for this module and do other related changes to make the code
288         nicer to read and understand
290 Thu, 20 Mar 2008 11:18:51 +0100 <thp@perli.net>
291 Add option to limit the maximum number of episodes per feed
293         * src/gpodder/config.py: Add "max_episodes_per_feed" configuration
294         option (int, defaults to 200) that determines the maximum number of
295         episodes that are parsed per channel/feed; if there are more episodes,
296         they are ignored. This value can be adjusted via the extended
297         configuration editor if you need more episodes
298         * src/gpodder/libpodcasts.py: Add support for the
299         max_episodes_per_feed configuration option above
301 Thu, 20 Mar 2008 11:13:16 +0100 <thp@perli.net>
302 Fix bug with unneeded download directory being created
304         * src/gpodder/libpodcasts.py: Fix bug when an unneeded download
305         directory would be created on every gPodder startup
307 Thu, 20 Mar 2008 11:11:18 +0100 <thp@perli.net>
308 Only serialize DumbShelve to disk when we have changed/deleted items in it
310         * src/gpodder/dumbshelve.py: Add a "__dirty" flag to DumbShelve to
311         know if we have to write the DumbShelve to the disk or if nothing has
312         changed since the last write (and therefore no need to run the
313         time-consuming serialization code again); this speeds up initial
314         loading time and probably also speeds up other parts of the code
316 Thu, 20 Mar 2008 11:09:27 +0100 <thp@perli.net>
317 Timestamp and benchmark functions for logger
319         * src/gpodder/liblogger.py: Add support for timestamping and benchmark
320         functions to liblogger, so we see the microtime since gPodder startup
321         and can also use the logging module to benchmark the speed of certain
322         code parts; this is helpful for our performance patches :)
324 Thu, 20 Mar 2008 11:07:48 +0100 <thp@perli.net>
325 Performance-improving patch from Nick (nikosapi) to html entity replacement
327         * src/gpodder/util.py: Merge patch from Nick (nikosapi.org) to really
328         improve performance of the HTML tag stripper/entity replacement code
329         by using regular expressions and some more intelligent code for
330         converting numeric entities to Unicode characters
332 Thu, 20 Mar 2008 11:06:32 +0100 <thp@perli.net>
333 Add demo code for displaying a splash screen
335         * doc/dev/splash-logo.py: Added testing code that would display a
336         splash screen (transparent if compositing is enabled); we currently
337         don't plan to use this code for reasons described on gpodder-devel
339 Thu, 20 Mar 2008 10:04:14 +0100 <thp@perli.net>
340 Filter "None" filenames from GtkFileChooser widgets
342         * src/gpodder/config.py: Make sure we don't receive a "None" filename
343         from GtkFileChooser widgets when connecting to the config manager
345 Wed, 19 Mar 2008 18:06:58 +0100 <thp@perli.net>
346 Change the context menu of the episode list popup menu
348         * src/gpodder/gui.py: Simplify, re-structure and improve the context
349         menu of the episode list popup menu (right-click menu); thanks to hex
350         (justin.forest gmail.com) for suggesting this change and giving
351         valuable input on gpodder-devel
353 Wed, 19 Mar 2008 15:45:15 +0100 <thp@perli.net>
354 Patch from Nikosapi to fix MP3 player sync progress
356         * src/gpodder/sync.py: Patch from Nick (nikosapi.org) to fix MP3
357         player sync problems: "Instead of displaying the proper percentage of
358         the copied file in the FS-based sync dialog, gPodder would initially
359         report 100% and near the end of the copy it would report percentages
360         >100%."
362 Wed, 19 Mar 2008 15:02:10 +0100 <thp@perli.net>
363 Various Bluetooth-related fixes
365         * data/gpodder.glade: Use the "bluetooth" icon instead of the (old?)
366         "stock_bluetooth" icon; in Gnome 2.22, the "bluetooth" icon is nicer,
367         i.e. more Tango-ish than the "stock_bluetooth" icon
368         * src/gpodder/gui.py: Fix a logging error; Only show "Send to [...]
369         via bluetooth"/"Send to bluetooth device" when we have already
370         downloaded the episodes (won't obviously work otherwise..)
371         * src/gpodder/util.py: Fix bluetooth_send_file to work with both
372         bluetooth-sendto and gnome-obex-send (different command line argument
373         format for both)
375 Sun, 16 Mar 2008 12:55:49 +0100 <thp@perli.net>
376 Python-feedparser is a dependency, so mention it in the README
378         * README: Mention python-feedparser as a dependency in the README
379         file; thanks to Alain Tauch for pointing this out on the mailing list
381 Wed, 12 Mar 2008 12:38:19 +0100 <thp@perli.net>
382 Updated translations for 0.11.1 stabilization period
384         * data/messages.pot: Updated from source
385         * data/po/*.po: Updated from messages.pot
387 Tue, 11 Mar 2008 18:53:25 +0100 <thp@perli.net>
388 Add option to write gtkpod extended database on sync
390         * data/gpodder.glade: Add a check box for the new config option
391         * src/gpodder/config.py: Add ipod_write_gtkpod_extended boolean
392         configuration variable that controls if we want to write iTunesDB.ext
393         after synchronization (defaults to False)
394         * src/gpodder/gui.py: Glue code for UI<->Config manager
395         * src/gpodder/sync.py: Use libgpod's "gtkpod" module to write the
396         extended gtkpod database (iTunesDB.ext) to the iPod after sync - this
397         has to be enabled via an option
399 Tue, 11 Mar 2008 18:44:19 +0100 <thp@perli.net>
400 Fix problem with old PyGTK versions when importing gpodder.trayicon
402         * src/gpodder/gui.py: Apply patch from Bill Barnard
403         <bill@barnard-engineering.com>, based on a patch from Jérôme Chabod
404         <jerome.chabod@ifrance.com> that makes sure we can import the tray
405         icon module. If not, we disable the tray icon functionality
407 Mon, 10 Mar 2008 16:37:38 +0100 <thp@perli.net>
408 Add support for creating M3U playlist files in download folders
410         * src/gpodder/config.py: Add "create_m3u_playlists" boolean
411         configuration option (default False) that controls if we want to
412         generate per-channel M3U playlists in our download folders
413         * src/gpodder/gui.py: Add context menu entry for manually updating an
414         M3U playlist for the channel navigator (only visible when updating m3u
415         playlists is enabled
416         * src/gpodder/libpodcasts.py: Add update_m3u_playlist() function to
417         podcastChannel and call it when removing and adding downloaded
418         episodes
419         * src/gpodder/util.py: Add sanitize_filename() function that tries to
420         encode a file name in the system's encoding, stripping all chars that
421         are invalid on FAT32 and other systems (e.g. slash, etc..)
423 Thu, 06 Mar 2008 17:46:21 +0100 <thp@perli.net>
424 Be less verbose, consider episodes with length<=100 to have invalid length
426         * src/gpodder/libpodcasts.py: Remove verbose logging for episode
427         metadata (seems to work now); consider episodes with a small length
428         value to have invalid length, i.e. try to find the length of the
429         episode by looking at the HTTP header; thanks to Bernd
430         <schlaber@gmail.com> for sending in the feed URL with which this bug
431         happens (length was 1) during the gPodder workflow survey :)
433 Tue, 04 Mar 2008 12:15:53 +0100 <thp@perli.net>
434 Fix KeyError bug in custom_selection_button_clicked (from LP)
436         * src/gpodder/gui.py: Fix problem with localized strings on the custom
437         selection buttons, i.e. pass the label to the function directly
438         instead of relying on the gtk.Button to have the label in the correct
439         encoding (LP: #192918); thanks to Pavel Mlčoch for reporting this bug
440         on Launchpad
442 Tue, 04 Mar 2008 12:05:23 +0100 <thp@perli.net>
443 Fix AttributeError bug in updateTreeView (from LP)
445         * src/gpodder/gui.py: Make sure that we have a valid "active_channel"
446         when updating the tree view (LP: #183667); thanks to red26wings for
447         reporting this bug on Launchpad
449 Mon, 03 Mar 2008 23:06:30 +0100 <thp@perli.net>
450 Add support for changing the URL of a subscribed channel (bug #42)
452         * data/gpodder.glade: Make the URL entry in the channel dialog
453         editable
454         * src/gpodder/gui.py: Add support for changing the URL of a subscribed
455         channel (i.e. move from the "latest" RSS feed to the "complete" RSS
456         feed, as is the case with Chaosradio podcasts, for example); ask user
457         if she really wants to move; handle case where the new URL is wrong
458         by reverting to old URL; Improve code for moving the download
459         directory; thanks to Steve Garcia <sgarcia@bak.rr.com> for the bug
460         report
462 Mon, 03 Mar 2008 21:14:55 +0100 <thp@perli.net>
463 Small fix for moving downloads progress bar
465         * src/gpodder/gui.py: Make sure the value for set_fraction of the
466         progress bar is in 0.0..1.0
468 Mon, 03 Mar 2008 20:53:15 +0100 <thp@perli.net>
469 Add "Go to website" buttons to episode and channel (bug #43)
471         * data/gpodder.glade: Add "Go to website" buttons to episode and
472         channel info dialogs
473         * src/gpodder/gui.py: Add code to open website URL or hide the "Go to
474         website" button when there is no valid website link for an episode or
475         channel
477 Mon, 03 Mar 2008 20:37:02 +0100 <thp@perli.net>
478 Move webbrowser code to util.open_website; fix URLs to gpodder.org
480         * src/gpodder/gui.py: Use new gpodder.org URLs; use
481         util.open_website() instead of directly interfacing with threads and
482         the "webbrowser" module
483         * src/gpodder/util.py: New function open_website() that takes care of
484         opening the system's default web browser and opening the specified URL
486 Sun, 02 Mar 2008 14:20:56 +0100 <thp@perli.net>
487 Make "gl" a global-accessible object in libgpodder
489         * doc/dev/gdfs/gdfs-check.py: Adapt to new structure of gPodderLib
490         * src/gpodder/*.py: Use "gl" instead of all incarnations of
491         "gPodderLib()" or "libgpodder.gPodderLib()", and weed out all "gl =
492         gPodderLib() lines, because it makes the code look unnecessarily
493         bloated ;)
494         * src/gpodder/libgpodder.py: Make "gl" a global instance of the
495         gPodderLib() object, and rename gPodderLibClass to gPodderLib and do
496         some more cleaning-up
498 Sun, 02 Mar 2008 14:03:40 +0100 <thp@perli.net>
499 Move gPodderLib().open_folder to util.gui_open
501         * src/gpodder/gui.py: Use util.gui_open instead of gl.open_folder
502         * src/gpodder/libgpodder.py: Remove open_folder (move to gpodder.util)
503         * src/gpodder/util.py: Add gui_open function that uses xdg_open to
504         open files and folders with their default application in the GUI
506 Sun, 02 Mar 2008 13:52:42 +0100 <thp@perli.net>
507 Pickle-based storage method (dumbshelve); HTTP HEAD requests; buggy feed fixes
509         * src/gpodder/dumbshelve.py: Added (replacement for "shelve" using
510         pickle)
511         * src/gpodder/libgpodder.py: Rename *.db files to *.pickle.db, so we
512         don't clash with old-style shelve .db files
513         * src/gpodder/libpodcasts.py: Use dumbshelve as a replacement for
514         shelve; add EpisodeURLMetainfo that keeps track of metainfo downloaded
515         via HTTP HEAD requests; make getting episode length and pubDate a bit
516         more intelligent by trying to find correct values via HTTP HEAD;
517         improve episode sorting by falling back to episode titles when no
518         pubDate has been found (or pubDate is equal); 
519         * src/gpodder/util.py: Add get_episode_info_from_url() function that
520         tries to find out the length and pubDate of an episode by looking at
521         the data from the HTTP HEAD; also support HTTP proxys via an optional
522         "proxy" keyword argument
524 Wed, 27 Feb 2008 10:44:48 +0100 <thp@perli.net>
525 Notify user about no new episodes when updating from tray icon
527         * src/gpodder/gui.py: Patch from Jérôme Chabod
528         <jerome.chabod@ifrance.com> to notify the user about "no new episodes"
529         when updating the feed cache manually via the tray icon
530         (Closes: http://bugs.gpodder.org/show_bug.cgi?id=3)
531         * src/gpodder/trayicon.py: See above
533 Wed, 27 Feb 2008 09:52:14 +0100 <thp@perli.net>
534 Use xdg-open for files that we don't know the file type of
536         * src/gpodder/libgpodder.py: If the file we want to open/play is not
537         an audio or video file, we use "xdg-open" to open the file (this is
538         used for things like PDF files and the like, e.g. in Chaos TV)
540 Wed, 27 Feb 2008 09:46:55 +0100 <thp@perli.net>
541 Add Flash Video (flv) and Windows Media Video (wmv) to file detection
543         * src/gpodder/util.py: Detect *.flv and *.wmv files as video files
545 Wed, 27 Feb 2008 09:39:42 +0100 <thp@perli.net>
546 When sending via Bluetooth, always rename/copy the file
548         * src/gpodder/gui.py: When sending files via Bluetooth, and the file
549         converter script is not enabled, we are simply copying the file to the
550         sync_filename of the episode, therefore creating a nice name. We have
551         to copy the file, because neither gnome-obex-send nor bluetooth-sendto
552         let us specify the destination filename when sending the file, these
553         utilities always take the input filename (thanks to Chris
554         <gpodder@noreply.org.uk> for the bug report)
555         (Closes: http://bugs.gpodder.org/show_bug.cgi?id=49)
557 Tue, 26 Feb 2008 16:49:06 +0100 <thp@perli.net>
558 Python code fixup: Compare "None" with "is" instead of "=="
560         * doc/dev/daap2rss.py: "== None" => "is None"
561         * src/gpodder/config.py: "== None" => "is None"
562         * src/gpodder/gui.py: "== None" => "is None"
563         * src/gpodder/libgpodder.py: "== None" => "is None"
564         * src/gpodder/libpodcasts.py: "== None" => "is None"
566 Tue, 26 Feb 2008 16:30:56 +0100 <thp@perli.net>
567 Add support for new "bluetooth-sendto" utility
569         * README: Ask for either "gnome-obex-send" or "bluetooth-sendto",
570         which are needed for the Bluetooth file transfer
571         * src/gpodder/util.py: Add support for "bluetooth-sendto" as an
572         alternative to "gnome-obex-send"; initial bug report and patch by
573         Leonid Ponomarev (this probably adds bluez-gnome as an optional
574         dependency if you want bluetooth send support)
576 Mon, 25 Feb 2008 15:51:16 +0100 <thp@perli.net>
577 Show more description text in episode list
579         * src/gpodder/libpodcasts.py: Join all lines and strip unnecessary
580         data for the episode description that is displayed in the episode list
581         when descriptions are enabled (suggested by Jérôme Chabod)
583 Mon, 25 Feb 2008 14:39:15 +0100 <thp@perli.net>
584 Merge changes from 0.11.0 release after release
586         * bin/gpodder: Merge changes from 0.11.0
587         * README: Merge changes from 0.11.0
589 Sun, 24 Feb 2008 14:52:04 +0100 <thp@perli.net>
590 Cosmetic changes to the makefile
592         * Makefile: Cosmetic changes
594 Sun, 24 Feb 2008 13:55:42 +0100 <thp@perli.net>
595 Cairo-based progress bar on system tray icon
597         * src/gpodder/draw.py: Add Cairo-based drawing code for generating a
598         nice, transparent progress bar icon
599         * src/gpodder/services.py: Fix a problem with the wrong download done
600         percentage (i.e. when cancelling downloads instead of finishing them)
601         * src/gpodder/trayicon.py: Add code to draw the progress bar on the
602         tray icon; initial idea and most parts of this patch by Jérôme Chabod
604 Sat, 23 Feb 2008 14:18:53 +0100 <thp@perli.net>
605 Set the xterm title when running "make test"
607         * Makefile: Set the xterm title when running "make test"
609 Wed, 20 Feb 2008 13:38:58 +0100 <thp@perli.net>
610 Estimated time left and synchronization support for tray icon by Jérôme Chabod
612         * src/gpodder/gui.py: Send update status information to the tray icon
613         on update; add glue code for synchronization device and tray icon
614         * src/gpodder/trayicon.py: Add status and tooltip during device
615         synchronization; add estimated download time to tooltip during
616         download; set the correct caption for the synchronization menu item in
617         the tray icon (and don't add a synchronize menu item when not needed);
618         some small code-cleanups and fixes
619         * src/gpodder/util.py: Add format_seconds_to_hour_min_sec() function
620         that converts a numeric amount of seconds into a human-readable string
622 Tue, 19 Feb 2008 07:46:28 +0100 <thp@perli.net>
623 Fix bug with MP3 player synchronization file name encodings
625         * src/gpodder/sync.py: Apply patch to fix problems with native
626         language encodings on MP3 player synchronization; thanks to Bernd
627         Schlapsi for reporting the problem in Bugzilla
628         (Closes: http://bugs.gpodder.org/show_bug.cgi?id=34)
630 Mon, 18 Feb 2008 21:17:48 +0100 <thp@perli.net>
631 Updated French translation for 0.11.0
633         * data/po/fr.po: Updated French translation by Jérôme Chabod
635 Sun, 17 Feb 2008 13:50:09 +0100 <thp@perli.net>
636 Fix calculation of average percentage done
638         * src/gpodder/services.py: Fix calculation of average percentage done
639         for downloads, thanks to Jérôme Chabod <jerome.chabod@ifrance.com> for
640         the patch
642 Sun, 17 Feb 2008 13:33:38 +0100 <thp@perli.net>
643 Updated translations for 0.11.0
645         * data/messages.pot: Refreshed messages.pot from source code
646         * data/po/de.po: Updated German translation
647         * data/po/nl.po: Updated Dutch translation by Pieter De Decker
648         * data/po/ru.po: Updated Russian translation by Leonid Ponomarev
649         * data/po/cs.po: Updated Czech translation by Ondrej Vesely
650         * data/po/sv.po: Updated Swedish translation by Anders Kvist
652 Thu, 07 Feb 2008 22:15:40 +0100 <thp@perli.net>
653 Hello, new "expert" configuration editor (about:config-like)
655         * data/gpodder.glade: Add gPodderConfigEditor window and add an
656         "Advanced..." button to the preferences dialog
657         * src/gpodder/config.py: Add a gtk.ListStore tree model to the
658         configuration manager and update it when configuration variables
659         change; add toggle_flag() and update_field() methods for easy updating
660         of fields from the new config editor
661         * src/gpodder/gui.py: Add glue code for opening the advanced
662         configuration editor from the preferences dialog; add code for the
663         gPodder configuration editor (including filtering and field updating);
664         (Closes: http://bugs.gpodder.org/show_bug.cgi?id=10)
666 Thu, 07 Feb 2008 20:22:08 +0100 <thp@perli.net>
667 Support buggy OPML feeds, notify user on OPML import
669         * src/gpodder/gui.py: Notify user when no items were found when trying
670         to import OPML feeds
671         * src/gpodder/opml.py: Make the OPML importer a bit more relaxed, and
672         make it accept "url" instead of "xmlUrl", too (for buggy OPML feeds)
674 Wed, 06 Feb 2008 17:34:56 +0100 <thp@perli.net>
675 Fix the track length detection
677         * src/gpodder/sync.py: Fix the iPod sync track length detection code,
678         reported by Paul Rudkin <paul@thegithouse.com> and tested by
679         FriedBunny <friedbunny@kulturny.com>; make default length 3 hours
680         Closes: http://bugs.gpodder.org/show_bug.cgi?id=29
682 Wed, 06 Feb 2008 10:59:25 +0100 <thp@perli.net>
683 NLS encoding support for MP3 player synchronization (from gdfs)
685         * src/gpodder/sync.py: Add NLS encoding support from Leonid Ponomarev
686         <leonid.phoenix@gmail.com>; patch modified a bit to better fit the
687         code and be more verbose, so the user knows how we encode the names
689 Wed, 06 Feb 2008 10:43:47 +0100 <thp@perli.net>
690 Hide to systray on exit during download
692         * src/gpodder/gui.py: Apply patch from Jérôme Chabod
693         <jerome.chabod@ifrance.com> to fix a bug: When closing gPodder during
694         a download, and "on_quit_hide" is on, gPodder asks for a confirmation
695         It should hide gPodder without asking. This patch fix that.
697 Wed, 06 Feb 2008 10:18:30 +0100 <thp@perli.net>
698 Usability GUI update (after Rafael Proença's proposal)
700         * data/gpodder.glade: Add "Ctrl+L" hotkey to Add new channel; add
701         "View" menu with show/hide Toolbar (Ctrl+T) and show/hide episode
702         descriptions (Ctrl+D); remove "Update Feeds" button from toolbar and
703         add Check for updates button below channel navigator; move the add
704         episodes entry and buttons above the channel navigator; thanks to the
705         following people who shared their opinions on the mailing list: Rafael
706         Proença, Paul Rudkin, Ondrej Vesely, Leonid Ponomarev, Shane Donohoe,
707         Jérôme Chabod, Nick (nikosapi); the GUI mockups and the initial idea
708         were posted by Rafael Proença
709         * src/gpodder/config.py: Add "episode_list_descriptions" and
710         "show_toolbar" configuration options that modify the look of the main
711         window (both default to "True")
712         * src/gpodder/gui.py: Show feed description in seperate line (this
713         feature was suggested by narf@inode.at); make the episode list
714         treeview widget use the space more efficient; show/hide toolbar and
715         show/hide episode description GUI glue code
716         * src/gpodder/libgpodder.py: Add "digits" keyword argument to
717         format_filesize() (defaults to 2), this is a pass-thru function for
718         gpodder.util.format_filesize() (see below)
719         * src/gpodder/libpodcasts.py: Support for small- and large-sized
720         icons,modify liststore creation code to add description to the title
721         column
722         * src/gpodder/util.py: Add "digits" keyword argument to
723         format_filesize() (defaults to 2), this is used to define the format
724         of the filesize; add "icon_size" keyword argument (defaults to 32) to
725         get_tree_icon() and modify the function so that it dynamically
726         generates the correct icon with the correct sizes
728 Mon, 04 Feb 2008 11:26:14 +0100 <thp@perli.net>
729 Apply patchset from Jérôme Chabod to fix tray icon behaviour
731         * data/gpodder.glade: Change behaviour of the "display tray icon"
732         checkbox, rename and retitle some configuration options
733         * src/gpodder/config.py: Rename "download_after_update" to
734         "auto_download_when_minimized" and rename "disable_notifications" to
735         "enable_notifications".
736         * src/gpodder/gui.py: Add glue code for config and GUI, change
737         behaviour as described in http://bugs.gpodder.org/show_bug.cgi?id=3
738         * src/gpodder/trayicon.py: Clean-up and fix behaviour as described in
739         our Bugzilla Bug #3 (see above); thanks to Jérôme Chabod for
740         implementing all these changes and the patch
742 Mon, 04 Feb 2008 09:32:56 +0100 <thp@perli.net>
743 Output pretty-printed OPML when saving channels list
745         * src/gpodder/opml.py: Patch from Nick (nikosapi.org) to output the
746         channels.opml file pretty-printed, so it's easier to read and easier
747         to edit when working on the file outside of gPodder
749 Sun, 03 Feb 2008 23:02:47 +0100 <thp@perli.net>
750 Don't code late at night, it breaks the sync code ;)
752         * src/gpodder/sync.py: Add brackets because I wrote bad code in the
753         first place (fix video sync for iPods); thanks to Dave Perdue
754         <dave@minusvince.com> for reporting this in our bug tracker
755         (Closes: http://bugs.gpodder.org/show_bug.cgi?id=28)
757 Sat, 02 Feb 2008 11:36:35 +0100 <thp@perli.net>
758 Make feed update display "Loading" titles, only run auto update when minimized
760         * src/gpodder/gui.py: Usability patch from NIkosapi <nikosapi.org>:
761         Make the feed update dialog display "Loading feeds" instead of
762         "Downloading feeds" when its loading the feeds from the local cache;
763         only run the automatic, periodic update when gPodder is minimized,
764         because it would pop up a dialog while gPodder is in use otherwise
766 Sat, 02 Feb 2008 11:33:48 +0100 <thp@perli.net>
767 Pressing Enter in the add channel entry adds the channel
769         * data/gpodder.glade: Usability patch from Nikosapi <nikosapi.org>:
770         Add an action handler to the gladefile, so the user can simply press
771         Enter in the gtk.Entry instead of having to tab to or click on the
772         button for adding a channel
774 Wed, 30 Jan 2008 09:47:21 +0100 <thp@perli.net>
775 Fix another bug in file_modification_datetime
777         * src/gpodder/util.py: Another problem that happens with special
778         iTunesDB settings, thanks to FriedBunny <friedbunny@kulturny.com>
780 Wed, 30 Jan 2008 09:23:19 +0100 <thp@perli.net>
781 Fix a bug in the file size calculation
783         * src/gpodder/util.py: calculate_filesize should deal with "None"
784         passed as filename (now returns zero-size);
785         Fixes: Bug #23 (http://gpodder.thegithouse.com/show_bug.cgi?id=23)
786         Thanks to FriedBunny <friedbunny@kulturny.com> for reporting this
787         issue in our bug tracker
789 Mon, 28 Jan 2008 12:33:13 +0100 <thp@perli.net>
790 Merge new sync code from thp's private branch
792         * bin/gpodder: Add "--sync"/"-s" command-line option to start the
793         device synchronization process from the CLI interface - syncing can
794         now be scripted, baby :) (you still have to configure the sync device
795         via the GUI first, though)
796         * data/gpodder.glade: Simplify gPodderSync dialog and remove some
797         obsolete options from the channel dialog
798         * src/gpodder/console.py: Add code for command-line sync support
799         * src/gpodder/gui.py: Remove obsolete code for libipodsync and import
800         the new "sync" module; simplify Sync<->GUI interface; clean-up
801         gPodderSync dialog code to interface with new sync code; remove some
802         config glue code for the channel properties dialog
803         * src/gpodder/libconverter.py: Make libconverter work even if the
804         percentage callback would fail in certain conditions (try..except)
805         * src/gpodder/libipodsync.py: Removed
806         * src/gpodder/libpodcasts.py: Refactor age_in_days() and
807         get_age_string() to simple calls to utility functions and move the
808         code to gpodder.util
809         * src/gpodder/sync.py: Added new sync module :) Very modular, yesaya!
810         * src/gpodder/util.py: Add file_age_in_days() and file_age_to_string()
811         helper functions that use code from libpodcasts and return the age of
812         a file in the filesystem
814 Thu, 24 Jan 2008 14:51:48 +0100 <thp@perli.net>
815 Fix a bug for show_message and tray_icon/minimized
817         * src/gpodder/gui.py: Fix a bug when messages are shown for
818         non-gPodderMainWindow windows (that don't have tray_icon)
820 Wed, 23 Jan 2008 11:55:35 +0100 <thp@perli.net>
821 Make gpodder.desktop pass desktop-file-validate tests
823         * data/gpodder.desktop: Update "Categories" and remove "Encoding",
824         following the freedesktop.org Desktop Entry specification
826 Wed, 23 Jan 2008 09:06:32 +0100 <thp@perli.net>
827 Do not show notifications when gPodder is minimized
829         * src/gpodder/gui.py: Merge patch from Jérôme Chabod to fix problems
830         with the gPodder window re-appearing after having been minimized;
831         use the notification icon when possible; initially reported by Shane
832         Donohoe
834 Tue, 22 Jan 2008 10:19:46 +0100 <thp@perli.net>
835 Add "releasetest" target to Makefile (automated testing)
837         * Makefile: Add "releasetest" target that can be used to do some
838         automatic testing before releases; thanks to Götz Waschk for giving
839         some hint on "desktop-entry-validate" :)
841 Tue, 22 Jan 2008 10:09:16 +0100 <thp@perli.net>
842 Use Episode Selector for per-channel new episodes
844         * src/gpodder/gui.py: Reorganize code to use the episode selector for
845         both all-channels and per-channel new episodes
846         (Closes: http://gpodder.thegithouse.com/show_bug.cgi?id=14)
848 Tue, 22 Jan 2008 09:42:01 +0100 <thp@perli.net>
849 Fix problem in gpodder.desktop file
851         * bin/gpodder: We're in development again (+svn)
852         * data/gpodder.desktop: Fix problem in .desktop file (Thanks to Götz
853         Waschk for reporting this bug, detected via desktop-entry-validate)
855 Tue, 22 Jan 2008 08:20:33 +0100 <thp@perli.net>
856 gPodder 0.10.4 "Faster Pussycats Kill" released
858         * bin/gpodder: gpodder 0.10.4 released :)
859         * README: gPodder 0.10.4 released :)
860         * doc/man/gpodder.1: gPodder 0.10.4 released :)
861         * data/po/de.po: Updated German translation
862         * data/messages.pot: Updated from source
863         * data/po/*.po: Updated from messages.pot
865 Tue, 22 Jan 2008 08:13:42 +0100 <thp@perli.net>
866 Create Bittorrent download directory on startup
868         * src/gpodder/libgpodder.py: Create Bittorrent download directory on
869         startup, so the first time gPodder preferences are shown, the download
870         folder will exist and now throw an error
872 Mon, 21 Jan 2008 21:41:59 +0100 <thp@perli.net>
873 Updated French translation file with correct encoding
875         * data/po/fr.po: Updated French translation with correct encoding by
876         Jérôme Chabod - thanks!
878 Mon, 21 Jan 2008 10:47:49 +0100 <thp@perli.net>
879 Add support for sending files via Bluetooth
881         * data/gpodder.glade: Add "Bluetooth" configuration page to
882         preferences dialog
883         * src/gpodder/config.py: Add Bluetooth-related configuration options
884         * src/gpodder/gui.py: Add support for sending (and converting) files
885         for bluetooth file transfer; add glue code for preferences dialog and
886         configuration manager
887         * src/gpodder/libgpodder.py: Add "tempdir" variable to gPodderLibClass
888         that specifies a temporary directory to be used (currently only for
889         converting files for bluetooth transfer, might be migrated to a
890         configuration option later)
891         * src/gpodder/util.py: Add discover_bluetooth_devices() function that
892         searches for nearby devices (either via python-bluez or via hcitool,
893         so one of them has to be installed as a dependency); add
894         bluetooth_send_file() convenience function that starts a file transfer
895         via Bluetooth OBEX - uses gnome-obex-send, which has to be installed
896         for Bluetooth file transfer to work
898 Mon, 21 Jan 2008 09:52:09 +0100 <thp@perli.net>
899 Support for different audio/video player selection
901         * data/gpodder.glade: Add video selection to preferences dialog
902         * src/gpodder/config.py: Add "videoplayer" configuration option
903         * src/gpodder/gui.py: Add glue code for configuration and preferences
904         dialog (audio/video player selector)
905         * src/gpodder/libgpodder.py: Add code to migrate from older gPodder
906         configurations (videoplayer is set to "unspecified") to the same value
907         as the currently selected audio player; when "playing" a file,
908         determine the file type and start the right player application
909         * src/gpodder/libplayers.py: Parameterize the UserAppsReader class to
910         accept a mime type (e.g. "video" or "audio") after which to filter
912 Mon, 21 Jan 2008 07:30:38 +0100 <thp@perli.net>
913 Czech translation update: gpodder.desktop
915         * data/gpodder.desktop: Ondrej Vesely <xorwen@gmai.com> added the
916         Czech translation strings to the gpodder.desktop file - thanks
918 Sun, 20 Jan 2008 22:50:13 +0100 <thp@perli.net>
919 Added Czech translation by Ondrej Vesely
921         * data/po/cs.po: Added (partial) Czech translation by Ondrej Vesely
922         <xorwen@gmail.com>; the completed translation will be updated when
923         it's done
924         * setup.py: Add "cs" (Czech) to list of translations
926 Sat, 19 Jan 2008 18:39:54 +0100 <thp@perli.net>
927 Updated Swedish translation from Anders Kvist
929         * data/po/sv.po: Thanks to Anders Kvist, the Swedish translation is
930         now up-to-date again
932 Sat, 19 Jan 2008 13:28:12 +0100 <thp@perli.net>
933 Updated French translation from Jérôme Chabod
935         * data/po/fr.po: Thanks to Jérôme Chabod, the French translation is
936         now up-to-date again
938 Thu, 17 Jan 2008 22:46:21 +0100 <thp@perli.net>
939 Updated Dutch translation from Pieter De Decker
941         * data/po/nl.po: Thanks to Pieter De Decker, the Dutch translation is
942         now up-to-date again
944 Thu, 17 Jan 2008 14:21:49 +0100 <thp@perli.net>
945 Update translation template and translations from source
947         * data/messages.pot: Updated potfile from source code
948         * data/po/*.po: Updated translation templates from potfile
950 Wed, 16 Jan 2008 08:36:12 +0100 <thp@perli.net>
951 Remove the "Ignore" button in tray icon notifications
953         * src/gpodder/trayicon.py: Remove the "ignore" action and button when
954         a download has finished; the "ignore" button is redundant, as the same
955         functionality can be achieved by clicking on the "x" of the bubble
957 Tue, 15 Jan 2008 14:50:13 +0100 <thp@perli.net>
958 Modularize calls to gobject.idle_add (for non-GTK support)
960         * bin/gpodder: Set interface_is_gui to True when running the GUI
961         * src/gpodder/*.py: Use util.idle_add instead of gobject.idle_add
962         * src/gpodder/gui.py: Simplify some idle_add calls, code clean-up
963         * src/gpodder/__init__.py: Add "interface_is_gui" boolean variable
964         that tells us if we are running in GUI or CLI mode (this is needed for
965         util.idle_add to determine if it's going to use the gobject module or
966         not)
967         * src/gpodder/util.py: Add new function idle_add() that acts as a
968         wrapper to gobject.idle_add(); this will only use gobject.idle_add if
969         we are in GUI mode, and will call the callback directly when we are in
970         command-line mode (because we don't have to watch out for threading
971         race conditions there, compared to what GTK+ gives us)
973 Mon, 14 Jan 2008 20:23:02 +0100 <thp@perli.net>
974 Add menu item that links to gPodder's new bug tracker
976         * data/gpodder.glade: Add bug tracker item to help menu
977         * src/gpodder/gui.py: Add code to open a webbrowser with the bug
978         tracker when the bug tracker icon is clicked
980 Mon, 14 Jan 2008 20:04:25 +0100 <thp@perli.net>
981 Add a checkbox to keep episodes when removing channels
983         * src/gpodder/gui.py: Add a checkbox to the confirmation dialog when
984         removing a podcast channel, so the user has the option to remove the
985         podcast feed from gPodder's subscription list, but still keep the
986         downloaded files on the harddisk (via a checkbox in the dialog)
987         (Closes: http://gpodder.thegithouse.com/show_bug.cgi?id=1)
989 Thu, 10 Jan 2008 08:44:00 +0100 <thp@perli.net>
990 Updated Russian translation by Hex
992         * data/po/ru.po: Updated Russian translation by
993         Hex <justin.forest@gmail.com>
995 Wed, 09 Jan 2008 23:43:56 +0100 <thp@perli.net>
996 Merge tray icon and notification patch by Jérôme Chabod
998         * data/gpodder.glade: UI support for tray icon settings and
999         configuration options for auto update feeds (auto update based on a
1000         patch by Nick (nikosapi.org)
1001         * src/gpodder/config.py: Add configuration options that support the
1002         tray icon, notification bubble and automatic update/close functions
1003         * src/gpodder/gui.py: Support the tray icon in the GUI; link the
1004         configuration options with the preferences dialog; re-work the channel
1005         update dialog to be more slipstreamed
1006         * src/gpodder/trayicon.py: Added new tray icon module by
1007         Jérôme Chabod <jerome.chabod@ifrance.com>; initial idea from old
1008         gPodder TODO list by Holger Bauer
1010 Wed, 09 Jan 2008 23:09:54 +0100 <thp@perli.net>
1011 Updated Swedish translation by Anders Kvist
1013         * data/po/sv.po: Swedish translation updated by
1014         Anders Kvist <kvistkvist@telia.com>
1016 Wed, 09 Jan 2008 11:52:23 +0100 <thp@perli.net>
1017 Use os.rename to make channel list saving atomic
1019         * src/gpodder/opml.py: Make the saving of the channel list atomic by
1020         first saving it to a temporary file and then using os.rename to really
1021         move the file in place (this should make the channel list saving very
1022         stable and protect against certain bad system conditions where the
1023         channel list is emptied); thanks to Jens Thiele <karme@berlios.de> for
1024         the suggestion and pointers to improve the channel saving code
1026 Sat, 05 Jan 2008 15:34:23 +0100 <thp@perli.net>
1027 Make logging in libpodcasts less verbose
1029         * src/gpodder/libpodcasts.py: Remove some verbose logging code
1031 Wed, 02 Jan 2008 15:39:04 +0100 <thp@perli.net>
1032 Migrate from channels.xml (from 0.9.4) to channels.opml if needed
1034         * src/gpodder/libgpodder.py: Add code to check if channels.xml exists
1035         but channels.opml doesn't and if so, try to convert from channels.xml
1036         to channels.opml, so users upgrading from 0.9.4 directly will have
1037         their channel list automatically converted;
1038         thanks to Tim Michelsen for the bug report and helpful Ubuntu info
1040 Tue, 01 Jan 2008 23:32:50 +0100 <thp@perli.net>
1041 Add download completion notification support
1043         * src/gpodder/download.py: Notify the download status manager when a
1044         download has been completed successfully
1045         * src/gpodder/services.py: Add download-complete signal to list of
1046         possible signals and download_completed() method to be used by
1047         downloads to notify the status manager of a successful download
1049 Sat, 29 Dec 2007 14:21:51 +0100 <thp@perli.net>
1050 Patch the feedparser module to correctly process democracynow.org
1052         * src/gpodder/cache.py: Add a patch_feedparser() method that checks of
1053         the feedparser module correctly maps the "plain" content-type to the
1054         correct "text/plain" content-type and if not, replace the
1055         mapContentType method with a fixed one; this should make the audio
1056         podcast on democracynow.org working (thanks to Clark Burbidge for the
1057         bug report)
1059 Sun, 23 Dec 2007 12:20:25 +0100 <thp@perli.net>
1060 Better username/password extraction from URLs
1062         * src/gpodder/util.py: Improve username and password extraction for
1063         authentication URLs; thanks to Nick <me@nikosapi.org> and Shane
1064         Donohoe <priestoftime@googlemail.com> for reporting this bug and
1065         sending in a patch; this should allow for e-mail address usernames
1067 Sat, 22 Dec 2007 11:44:41 +0100 <thp@perli.net>
1068 Also delete old episodes that have disappeared from the feed
1070         * src/gpodder/gui.py: When deleting old episodes automatically, also
1071         delete episodes that have disappeared from the RSS feed and are only
1072         available locally; thanks to Pieter De Decker <pdedecker@gmail.com>
1073         for the very detailed and helpful bug report :)
1075 Thu, 20 Dec 2007 01:33:15 +0100 <thp@perli.net>
1076 Stability updates: Feed cache update, old PyCairo versions
1078         * src/gpodder/draw.py: Add a workaround for pycairo versions less than
1079         1.1.6. Thanks to Chris Arnold for reporting this bug on the
1080         gpodder-devel mailing list and taking the time to test the patch and
1081         report back and provide useful information for debugging this error
1082         * src/gpodder/gui.py: Close the feed cache update dialog even when the
1083         user clicks on "cancel" (would have stayed there otherwise)
1085 Tue, 18 Dec 2007 10:13:44 +0100 <thp@perli.net>
1086 Merge "delete episode after sync" patch from Jérôme Chabod
1088         * data/gpodder.glade: Add GUI elements in preferences dialog to select
1089         what to do after episode sync (nothing, delete or mark played)
1090         * src/gpodder/config.py: Add "on_sync_delete" configuration option
1091         * src/gpodder/gui.py: Glue "on_sync_delete" config and GUI together
1092         * src/gpodder/libipodsync.py: If the configuration option
1093         on_sync_delete is set, remove the episode after successfully copying
1094         it to the iPod or MP3 player (the whole patch has been initially done
1095         by Jérôme Chabod <jerome.chabod@france.com> with some modifications)
1096         * src/gpodder/libpodcasts.py: Make delete_from_disk() a bit more
1097         robust, so it doesn't disturb libipodsync's functionality
1099 Mon, 17 Dec 2007 16:26:43 +0100 <thp@perli.net>
1100 Remove invalid channel cover images when loading fails
1102         * src/gpodder/libpodcasts.py: Remove the cover_file of a channel when
1103         it cannot be loaded (assume something went wrong when downloading the
1104         cover file); re-downloading the cover manually can solve the problem
1106 Mon, 17 Dec 2007 15:00:17 +0100 <thp@perli.net>
1107 Fix typo in last commit
1109         * src/gpodder/libipodsync.py: Fix typo in last commit
1111 Mon, 17 Dec 2007 11:21:10 +0100 <thp@perli.net>
1112 Modify played handling in iPod sync when "on sync mark played" is active
1114         * src/gpodder/libipodsync.py: Don't copy played state from PC to iPod
1115         if the on_sync_mark_played option is set
1117 Sat, 15 Dec 2007 15:58:23 +0100 <thp@perli.net>
1118 Merge patch from Leonid Ponomarev to gdfs
1120         * doc/dev/gdfs/gdfs-init.py: Merge patch from Leonid Ponomarev to add
1121         support for the system's native encoding, based on the $LANG
1122         environment variable. This should add support for episodes and
1123         channels with international characters as titles
1125 Sat, 15 Dec 2007 15:11:46 +0100 <thp@perli.net>
1126 Updated Dutch translation by Pieter De Decker
1128         * bin/gpodder: We're in development again: "+svn"
1129         * data/po/nl.po: Updated Dutch translation from Pieter De Decker
1131 Thu, 13 Dec 2007 08:32:54 +0100 <thp@perli.net>
1132 gPodder 0.10.3 "A Stop at Willoughby" released
1134         * bin/gpodder: gPodder 0.10.3 released :)
1135         * README: gPodder 0.10.3 released :)
1136         * doc/man/gpodder.1: gPodder 0.10.3 released :)
1137         * data/messages.pot: Updated from source
1138         * data/po/de.po: Updated German translation
1139         * data/po/*.po: Updated from messages.pot
1141 Thu, 13 Dec 2007 08:02:29 +0100 <thp@perli.net>
1142 Link the gPodder Documentation Wiki from the help pages
1144         * data/gpodder.glade: Help menu: gPodder Homepage (instead of website)
1145         and Documentation Wiki (instead of Mailing list)
1146         * src/gpodder/gui.py: Open gPodder Wiki instead of mailing list page
1148 Wed, 12 Dec 2007 21:39:03 +0100 <thp@perli.net>
1149 Remove TODO file from MANIFEST.in
1151         * MANIFEST.in: Of course we have to remove non-existing files from the
1152         MANIFEST.in file, too.. so TODO is now finally gone :)
1154 Wed, 12 Dec 2007 21:30:00 +0100 <thp@perli.net>
1155 Manage TODO list on the gPodder Wiki
1157         * TODO: Removed; new location: http://gpodderwiki.jottit.com/todo
1159 Wed, 12 Dec 2007 20:55:00 +0100 <thp@perli.net>
1160 Configuration for "old" episodes; automatically remove old episodes
1162         * src/gpodder/config.py: New boolean auto_remove_old_episodes
1163         configuration option that defaults to False (remove on startup)
1164         * src/gpodder/gui.py: Add code to automatically remove old, unplayed
1165         episodes on startup if the specific configuration options have been
1166         set; connect config manager to GUI items for the preferences dialog
1167         * data/gpodder.glade: Add checkbox for automatically removing old,
1168         unplayed episodes from gPodder on startup and a spinbutton to set the
1169         amount of days after which an episode is considered "old"
1171 Wed, 12 Dec 2007 19:44:15 +0100 <thp@perli.net>
1172 Merged episode locking patch from Paul Rudkin
1174         * src/gpodder/gui.py: Merged "lock episodes" patch to mark episodes as
1175         locked, patch by Paul Rudkin <paul@thegithouse.com>
1176         * data/gpodder.glade: Add menu item for toggle locked status
1177         * src/gpodder/libgpodder.py: Add "locked" history
1178         * src/gpodder/libpodcasts.py: When requesting a status icon, also draw
1179         the "Locked" status; is_locked() in podcastItem
1180         * src/gpodder/util.py: Added code for drawing a padlock icon on top of
1181         another (file type) icon; this is used for the "lock episodes" feature
1183 Tue, 11 Dec 2007 22:10:03 +0100 <thp@perli.net>
1184 Updated TODO list
1186         * TODO: Updated TODO list
1188 Mon, 10 Dec 2007 09:42:06 +0100 <thp@perli.net>
1189 Move observer code out of DownloadStatusManager into ObservableService
1191         * src/gpodder/services.py: Move out all observer-related code like
1192         registration, unregistration and notification to a new
1193         ObservableService class; subclass ObservableService in
1194         DownloadStatusManager; this makes the observer code in
1195         DownloadStatusManager re-usable (will be needed for new sync code)
1197 Mon, 10 Dec 2007 09:33:26 +0100 <thp@perli.net>
1198 Selective iPod episode clean-up; "delete older than X days"
1200         * src/gpodder/config.py: Add episode_old_age configuration variable;
1201         is an integer, defaults to 7. This is the number of days after which
1202         an episode will be considered "old"
1203         * src/gpodder/gui.py: iPod cleanup is now done selectively using the
1204         episode selector dialog; the code has been split, because we do not
1205         yet have an episode selector dialog for FS-based sync; add "Downloaded
1206         x days ago" column to "Delete old episodes" dialog and a corresponding
1207         button; call the callback even when no episodes are selected in
1208         gPodderEpisodeSelector
1209         * src/gpodder/libipodsync.py: Class variables of gPodder_iPodSync
1210         moved to __init__ to be instance variables (this should fix a bug that
1211         crops up now that we can selectively delete episodes); remove_tracks()
1212         and clean_playlist() have been modified/added to support new episode
1213         selector deletion code
1214         * src/gpodder/libpodcasts.py: Move is_played() to podcastItem from
1215         podcastChannel (it really belongs to the item; this makes code more
1216         readable in other parts of the codebase); add age_in_days(), is_old(),
1217         get_age_string() and age_prop to podcastItem
1218         * src/gpodder/util.py: New function: file_modification_datetime();
1219         returns a datetime.datetime instance of the MTIME (modification
1220         timestamp) of the filename given as parameter or None if the filename
1221         cannot be determined; this is used for the "old episodes" feature
1223 Sun, 09 Dec 2007 16:45:11 +0100 <thp@perli.net>
1224 Make has_converter() a bit more intelligent in detecting extensions
1226         * src/gpodder/libconverter.py: Convert given extension to lowercase
1227         and strip a leading "." from the extension, so calling code can also
1228         give the second value of the os.path.splitext() result directly to
1229         has_converter()
1231 Sun, 09 Dec 2007 13:20:49 +0100 <thp@perli.net>
1232 Fix pre-setting code for filechooser buttons; Patch by Paul Rudkin
1234         * src/gpodder/config.py: Fix pre-setting code for filechooser-related
1235         code; use set_current_folder() instead of set_filename()
1236         * src/gpodder/gui.py: Fix pre-setting code for filechooser-related
1237         code; thanks to Paul Rudkin <paul@thegithouse.com> for the patch
1239 Thu, 06 Dec 2007 09:37:57 +0100 <thp@perli.net>
1240 Support for itms:// links (direct links to the Apple iTunes Music Store)
1242         * src/gpodder/util.py: Support direct itms:// links by splitting out
1243         the iTunes Podcast links parsing routines. This should put us in for
1244         some nice iTunes podcast link support that will automagically
1245         translate iTunes podcast links to the correct RSS feed URL
1247 Thu, 06 Dec 2007 09:29:09 +0100 <thp@perli.net>
1248 Support for iTunes Podcast links (http://phobos.apple.com/...)
1250         * src/gpodder/util.py: Add support for subscribing to iTunes Podcast
1251         links (those with phobos.apple.com); new functions:
1252         parse_itunes_xml(), http_get_and_gunzip() and itunes_dicover_rss()
1254 Thu, 06 Dec 2007 09:15:57 +0100 <thp@perli.net>
1255 Added Galician translation from Teo Ramirez
1257         * data/gpodder.desktop: Added Spanish and Galician translations;
1258         thanks to Teo Ramirez <teoramirez@gmail.com>
1259         * data/messages.pot: Updated from source
1260         * data/po/de.po: Updated
1261         * data/po/gl.po: Added NEW Galician (gl) translation by Teo Ramirez
1262         * data/po/*.po: Updated from source
1263         * setup.py: Added Galician (gl) translation by Teo Ramirez
1265 Thu, 06 Dec 2007 08:35:12 +0100 <thp@perli.net>
1266 Sort channel list (finally ;)
1268         * src/gpodder/libpodcasts.py: Sort channels by lowercase title before
1269         returning the channel list in load_channels(); this automagically
1270         makes gPodder's channel list always sorted :)
1271         Thanks to FriedBunny <friedbunny@kulturny.com> for suggesting this and
1272         sending in an intial patch that led to this patch =)
1273         * TODO: Remove implemented item: Sort channel list
1275 Tue, 04 Dec 2007 23:28:27 +0100 <thp@perli.net>
1276 Do grayscale "pill" instead of theme-based colors (for bad themes)
1278         * src/gpodder/draw.py: Always draw the "pill" in semi-transparent
1279         black/grey shades so it will work for all GTK themes (even Ubuntu's)
1281 Mon, 03 Dec 2007 21:35:56 +0100 <thp@perli.net>
1282 Update channel navigator when iPod/MP3 player sync has finished
1284         * src/gpodder/gui.py: Update channel navigator when iPod sync has
1285         finished, so we can update the "played" status in the channel
1286         navigator when this status has changed after we've synced ("on sync
1287         mark played" option)
1289 Mon, 03 Dec 2007 21:24:17 +0100 <thp@perli.net>
1290 Add option to mark episodes as played after transfer to device
1292         * data/gpodder.glade: Option added to preferences dialog
1293         * src/gpodder/config.py: Add option "on_sync_mark_played"; will mark
1294         an episode as played when it gets transferred to a device
1295         * src/gpodder/gui.py: Glue code for GUI + gpodder.config
1296         * src/gpodder/libipodsync.py: On sync, mark episode as played if the
1297         user has selected the "on_sync_mark_played" option
1298         * TODO: Remove implemented/integrated items
1300 Sat, 01 Dec 2007 15:19:29 +0100 <thp@perli.net>
1301 Fix a fatal bug with first-run that prevents channel list saving
1303         * src/gpodder/util.py: Always use a file's parent directory to get the
1304         free disk space and return zero free disk space when the parent
1305         directory does not exist
1307 Thu, 29 Nov 2007 08:53:36 +0100 <thp@perli.net>
1308 Support for itpc:// URLs
1310         * src/gpodder/util.py: Add support for adding "itpc://" URLs (these
1311         are simply http:// URLs with a different schema, for iTunes)
1313 Tue, 27 Nov 2007 22:59:26 +0100 <thp@perli.net>
1314 Draw channel stats (unplayed, downloaded) on channel navigator
1316         * bin/gpodder: We're in development again, so add "+svn"
1317         * src/gpodder/draw.py: Added
1318         * src/gpodder/gui.py: Fix import of renamed "channels_to_model";
1319         re-assign new column numbers for treeChannels' data model; add
1320         cell renderer for pill pixbuf and remove cell renderer for status text
1321         * src/gpodder/libpodcasts.py: Add episode_is_new() function to
1322         podcastChannel to check if an episode can be considered "new"; use the
1323         episode_is_new function in get_new_episodes; add get_episode_stats()
1324         after an idea from Paul Rudkin <paul@thegithouse.com>; re-factor
1325         channels_to_model and clean out old, unused code and columns
1327 Mon, 26 Nov 2007 08:57:04 +0100 <thp@perli.net>
1328 gPodder 0.10.2 "Ein schweineschnauzen Sandwich, bitte!" released
1330         * bin/gpodder: gPodder 0.10.2 released :)
1331         * doc/man/gpodder.1: gPodder 0.10.2 released :)
1332         * README: gPodder 0.10.2 released :)
1334 Mon, 26 Nov 2007 08:52:49 +0100 <thp@perli.net>
1335 Translation updates
1337         * data/messages.pot: Refreshed from source
1338         * data/po/*.po: Refreshed from messages.pot
1339         * data/po/de.po: Updated German translation
1341 Sun, 25 Nov 2007 11:50:46 +0100 <thp@perli.net>
1342 Make sure there is enough free disk space when saving OPML channel list
1344         * src/gpodder/gui.py: Notify user that there's some problem saving the
1345         current channel list when save_channels() return False
1346         * src/gpodder/libpodcasts.py: Pass-through the return value of
1347         gpodder.opml.Exporter.write so calling code knows if saving the
1348         channel list was successful or not
1349         * src/gpodder/opml.py: Check free disk space before saving OPML
1350         channels in Exporter.write; thanks to Jens Thiele <karme@berlios.de>
1351         for reporting this bug on the Debian BTS (Closes: Debian Bug #452490)
1353 Thu, 22 Nov 2007 21:52:35 +0100 <thp@perli.net>
1354 Don't send Referer header when downloading episodes
1356         * src/gpodder/download.py: Some podcasts now implement an
1357         "anti-bandwidth-theft" code that should provide other websites from
1358         not linking to the episodes; as we have sent a Referer header
1359         containing the RSS feed URL, this causes problems; Referer header
1360         sending is therefore disabled now
1362 Sun, 18 Nov 2007 15:33:50 +0100 <thp@perli.net>
1363 TODO items from Katy G. B.
1365         * TODO: Updated TODO list
1367 Sat, 17 Nov 2007 18:38:36 +0100 <thp@perli.net>
1368 Backwards-compatibility for PyGTK less than 2.12 (for GtkTooltip)
1370         * src/gpodder/gui.py: Do not hook up tooltip handlers when we are
1371         using PyGTK less than 2.12 (which introduced the gtk.Tooltip API)
1373 Thu, 15 Nov 2007 11:07:42 +0100 <thp@perli.net>
1374 Check free disk space before copying files to iPod
1376         * src/gpodder/libipodsync.py: Check if the iPod's filesystem has
1377         enough free disk space before copying files over to it, as to not
1378         corrupt the iTunesDB in certain situations and fail when disk is full;
1379         thanks to Nicolas Quienot <niqooo@gmail.com> for the bug report
1380         * src/gpodder/util.py: Add get_free_disk_space() function that
1381         calculates the free (user-available) disk space on a given path
1383 Wed, 14 Nov 2007 21:55:18 +0100 <thp@perli.net>
1384 Add informative tooltips to channel navigator
1386         * src/gpodder/gui.py: Add tooltips to channel navigator that show a
1387         bigger cover image, the title, description, url and used disk space
1388         * src/gpodder/libpodcasts.py: Add save_dir_size property to
1389         podcastChannel that contains the disk usage of the channel's save_dir;
1390         this can be manually updated by calling update_save_dir_size() and
1391         will automatically be updated when the GUI code hooks into the
1392         channel; also add get_cover_pixbuf() that returns a pixbuf of the
1393         cover for a given size or None if there is no valid cover file
1395 Wed, 14 Nov 2007 19:19:11 +0100 <thp@perli.net>
1396 Slipstream code (enumerate instead of simple position tracking)
1397         * src/gpodder/libipodsync.py: Use enumerate() to iterate over a list
1398         of episodes instead of keeping track of the position "by hand"
1400 Wed, 14 Nov 2007 19:17:51 +0100 <thp@perli.net>
1401 Ignore initial window events from GtkWindow in Config
1403         * src/gpodder/config.py: Add a flag to config manager to ignore window
1404         events until the window has been realized; then, start taking position
1405         and size updates
1407 Mon, 12 Nov 2007 20:25:39 +0100 <thp@perli.net>
1408 Improve caching for HTTP redirects and minor errors; cache clean-up
1410         * src/gpodder/cache.py: Cache content when it comes from a HTTP
1411         redirect (301, 302, 307); cache feeds even with parsing errors, so we
1412         can "fill" our cache and not download on every startup
1413         * src/gpodder/libpodcasts.py: Add cache clean-up code after loading
1414         channels; this should keep the feedcache.db file smaller for users
1415         that like to try out new channels (or have used gPodder for a while)
1417 Sun, 11 Nov 2007 14:24:17 +0100 <thp@perli.net>
1418 Better file extension guessing for URLs
1420         * src/gpodder/util.py: Improve file_extension_from_url() by adding
1421         additional checks for known good extensions and recurse into the query
1422         string if it looks like an URL; this should fix compatibility problems
1423         for feeds with strange URLs; should provide more reliable guessing;
1424         thanks to Nicolas Quienot <niqooo@gmail.com> for the bug report
1426 Fri, 09 Nov 2007 10:05:36 +0100 <thp@perli.net>
1427 Fix format_filesize() usage in episodes selector and podcastItem
1429         * src/gpodder/gui.py: Use the correct (config-using) format_filesize()
1430         function to generate the total size string in the episode selector
1431         * src/gpodder/libpodcasts.py: Use the correct (config-usig
1432         format_filesize() function to generate the total size string in
1433         podcastItem; thanks to Pieter De Decker <pdedecker@gmail.com> for
1434         pointing that out
1435         * data/gpodder.glade: Use "Preferences" instead of "Preferences..."
1436         which feels a bit better in the GUI
1438 Thu, 08 Nov 2007 21:25:19 +0100 <thp@perli.net>
1439 Add "gPodder download folder synchronizer" scripts to repository
1441         * doc/dev/gdfs/gdfs-check.py: Added
1442         * doc/dev/gdfs/gdfs-init.py: Added
1443         * doc/dev/gdfs/README: Added
1445 Thu, 08 Nov 2007 20:01:13 +0100 <thp@perli.net>
1446 The mighty episode selector dialog and some menu re-arrangements
1448         * src/gpodder/gui.py: Move the "center_on_widget" keyword-based window
1449         positioning code to GladeWidget to be universally usable; update
1450         "Device" menu item on startup; new functions: delete_episode_list()
1451         and download_episode_list() that both operate on lists of episodes;
1452         add code for invoking gPodderEpisodeSelector for deleting old
1453         episodes; re-work on_itemDownloadAllNew_activate to use the episode
1454         selector instead of hand-crafting a message dialog text; add
1455         update_item_device() function that will handle the hiding, showing and
1456         renaming of the "Device" menu in the menubar; clean-up
1457         gPodderProperties with callback_finished setting (now kwarg-based);
1458         new, might, fancy, customizable and uber-sexy gPodderEpisodeSelector
1459         that will prove to be useful in some places in our codebase: it
1460         basically allows the user to select a subset of episodes from a given
1461         list in a quite sophisticated way; new "delete old episodes" menu item
1462         added for cleaning up gPodder's downloads
1463         * src/gpodder/libpodcasts.py: Add delete_from_disk() convenience
1464         method to podcastItem; other convenience properties and functions
1465         needed for the new episode selector dialog: pubdate_prop,
1466         get_filesize_string(), filesize_prop, get_channel_title(),
1467         channel_prop, get_played_string(), played_prop
1468         * data/gpodder.glade: new gPodderEpisode dialog; re-structuring of
1469         gPodder's main menu to be more usable and more compact; also added the
1470         Ctrl+K "Remove old episodes" menu item; also use the correct
1471         "multimedia-player" icon name of a not really representative icon
1473 Thu, 08 Nov 2007 12:07:30 +0100 <thp@perli.net>
1474 Support syncing to FS-based MP3 players without subfolders
1476         * data/gpodder.glade: Add checkbox "Create a subfolder for each
1477         channel" to preferences dialog and rename some widgets
1478         * src/gpodder/config.py: Add boolean "fssync_channel_subfolders"
1479         option that defaults to True (create subfolder for each channel)
1480         * src/gpodder/gui.py: Hook up config option fssync_channel_subfolders
1481         to preferences dialog; do more intelligent widget hiding for the
1482         "Player" tab in the preferences dialog (only show relevant widgets)
1483         * src/gpodder/libipodsync.py: Only append channel name as subfolder to
1484         destination folder name when the "fssync_channel_subfolders" option is
1485         True; suggested by Paul Elliot <omahns.home@gmail.com>
1487 Thu, 08 Nov 2007 11:28:17 +0100 <thp@perli.net>
1488 Fix offline cache behaviour when time is not set
1490         * src/gpodder/cache.py: Return cached_content in offline mode when
1491         cached_content "is not None" (instead of cached_time "is not None")
1493 Tue, 06 Nov 2007 12:37:41 +0100 <thp@perli.net>
1494 Process events before connecting Config to gtk windows
1496         * data/gpodder.glade: Remove default size for main gPodder window, as
1497         this is now handled by the config manager
1498         * src/gpodder/config.py: Process GTK events in the event queue before
1499         connecting to the "configure-event" signal, so we won't get two
1500         configure events for the window for the initial size change
1502 Mon, 05 Nov 2007 13:51:26 +0100 <thp@perli.net>
1503 Add error reporting when download fails because of an I/O error
1505         * src/gpodder/download.py: Catch and handle I/O errors in
1506         DownloadThread and format and pass on messages to GUI code when
1507         required; thanks to Florian Richter <Florian_Richter@gmx.de> for
1508         suggesting this feature after having a full disk
1509         * src/gpodder/gui.py: Update tree view when adding a new episode;
1510         add new notification() method and pass this method through to
1511         DownloadThread, so it can present messages to the user (i.e. errors)
1513 Mon, 05 Nov 2007 12:54:35 +0100 <thp@perli.net>
1514 Use util.find_command in more places (mplayer detection, ...)
1516         * src/gpodder/libgpodder.py: Use util.find_command to detect the
1517         existence of the "gnome-btdownload" command and spit out a warning log
1518         message when the command is not available
1519         * src/gpodder/libipodsync.py: Use util.find_command to check for an
1520         installed mplayer binary (instead of relying on os.system("which...")
1522 Mon, 05 Nov 2007 01:12:15 +0100 <thp@perli.net>
1523 Better command detection for the converter library
1525         * src/gpodder/libconverter.py: Detect existence of commands before
1526         invoking them for converting files; based on a patch by
1527         Nick (nikosapi.org); ConverterCollection is now a dict itself :)
1528         * src/gpodder/util.py: Add new find_command() function that will
1529         search the system's PATH for a specific executable command
1531 Mon, 05 Nov 2007 00:21:39 +0100 <thp@perli.net>
1532 Remove extracted cover art when deleting episode files
1534         * src/gpodder/util.py: Apply modified version of a patch from
1535         Nick (nikosapi.org) that is better suited for deleting cover art that
1536         has been extracted with the new eyeD3 cover art extraction code
1538 Mon, 05 Nov 2007 00:17:12 +0100 <thp@perli.net>
1539 Patch from Nick (nikosapi) to support eyeD3 cover art extraction
1541         * src/gpodder/libipodsync.py: Apply modified version of a patch from
1542         Nick (nikosapi.org) to utilize eyeD3 for cover art extraction in iPod
1543         sync code; remove dependency on PyID3
1544         * README: PyID3 is not a dependency anymore, as we can now use eyeD3
1545         for the same purpose (cover art extraction)
1547 Sat, 03 Nov 2007 14:14:09 +0100 <thp@perli.net>
1548 Fix format_filesize() function to be standards-conformant (unit prefixes)
1550         * src/gpodder/config.py: Add "use_si_units" configuration option; if
1551         True, the user will see SI units (MB, kB, ...); if False (the
1552         default); the user will see binary-prefix units (MiB, KiB, ..)
1553         * src/gpodder/libgpodder.py: Add pass-through function
1554         "format_filesize()" to gPodderLib that combines the
1555         util.format_filesize function with the gPodder-specific config option
1556         * src/gpodder/util.py: Apply a modified patch from Gerrit Sangel
1557         <z0idberg@gmx.de> to add support for SI units and binary prefixes to
1558         format_filesize(); this makes the function standards-compliant
1559         * src/gpodder/download.py: Updated to use new format_filesize
1560         * src/gpodder/gui.py: Updated to use new format_filesize
1561         * src/gpodder/libpodcasts.py: Updated to use new format_filesize
1563 Fri, 02 Nov 2007 17:28:05 +0100 <thp@perli.net>
1564 New Configuration/Settings Manager; massive code clean-ups
1566         * src/gpodder/config.py: Added new Configuration Manager that
1567         automatically keeps track of saving changed values and is also able to
1568         watch GTK widgets for changes; this should simplify our settings
1569         management and give us a single place for maintaining settings
1570         * src/gpodder/download.py: Access settings from new config manager
1571         * src/gpodder/gui.py: Make use of new config manager to connect
1572         widgets and settings from the GUI directly to the config manager;
1573         remove manual loading and saving of settings; auto-connect as much as
1574         possible in the gPodderProperties dialog to get real-time automatic
1575         configuration saving; fix the other code to use new config manager
1576         * src/gpodder/libgpodder.py: MASSIVE code clean-up; removed lots of
1577         old cruft and dead code that has been lying around in libgpodder for
1578         some time now; remove configuration code; utilize config manager;
1579         unify DownloadHistory+PlaybackHistory in new HistoryStore class;
1580         reduce number of import statements
1581         * src/gpodder/libipodsync.py: Access settings from new config manager
1582         * src/gpodder/libplayers.py: Removed dotdesktop_command()
1583         * src/gpodder/libpodcasts.py: Move locking functionality into this
1584         module, as locking is only used here; access config from new manager
1585         * src/gpodder/services.py: Use config manager to get settings
1586         * src/gpodder/util.py: Add format_desktop_command() function, based on
1587         the dotdesktop_command() function from libplayers
1589 Fri, 02 Nov 2007 07:49:38 +0100 <thp@perli.net>
1590 Add ability to open download folder from channel's context menu
1592         * src/gpodder/gui.py: Add "Open download folder" menu item to channel
1593         navigator context menu
1594         * src/gpodder/libgpodder.py: Add open_folder() method that will open
1595         the DE's default folder browser via "xdg-open"
1597 Thu, 01 Nov 2007 15:29:00 +0100 <thp@perli.net>
1598 Limit filename on FS-based sync to 50 characters
1600         * src/gpodder/libipodsync.py: Do not allow extremely long file names
1601         that could theoretically be generated by using data from RSS feeds;
1602         this is needed to make FAT-based drives work with files that would
1603         otherwise have file names that are too long
1605 Wed, 31 Oct 2007 15:22:32 +0100 <thp@perli.net>
1606 Escape RSS-provided strings in Pango markup
1608         * src/gpodder/gui.py: Escape strings in Pango markup
1609         * bin/gpodder: we're in development again, so "+svn"
1611 Sun, 28 Oct 2007 16:27:14 +0100 <thp@perli.net>
1612 gPodder 0.10.1 "Nukular, das Wort heißt Nukular" released
1614         * bin/gpodder: gPodder 0.10.1 released :)
1615         * doc/man/gpodder.1: gPodder 0.10.1 released :)
1616         * README: gPodder 0.10.1 released :)
1617         * data/messages.pot: Refreshed template from source files
1618         * data/po/de.po: Updated German translation for the 0.10.1 release
1619         * data/po/*.po: Refreshed translation files from template
1621 Sun, 28 Oct 2007 15:25:56 +0100 <thp@perli.net>
1622 Add "Save episode to file" handling to episode list context menu
1624         * data/gpodder.glade: Use a stock "Save As" button for the "Copy
1625         episode to file" button
1626         * src/gpodder/gui.py: Add new show_copy_dialog() method to GladeWidget
1627         that shows a copy dialog where a user can copy a file to a selected
1628         destination (this is used for "Save episode to file"); use
1629         show_copy_dialog in "Save As" in gPodderEpisode; add "Save episode to
1630         folder" menu item in episode list context menu and use
1631         show_copy_dialog to carry out the user interaction
1633 Sun, 28 Oct 2007 13:30:40 +0100 <thp@perli.net>
1634 Allow "https://" URLs for episode URLs, as we can handle these, too
1636         * src/gpodder/util.py: Allow "https://" as a valid URL scheme, as we
1637         can handle https URLs, thanks to Aravind Seshadri
1638         <aravind@aravind.name> who initially reported this bug
1640 Thu, 25 Oct 2007 14:00:01 +0200 <thp@perli.net>
1641 Sync videos to the "Video Podcasts" playlist instead of the "Video" menu
1643         * src/gpodder/libipodsync.py: Merged patch from Nicolas Quienot
1644         <niqooo@gmail.com> to sync videos to the "Video Podcasts" menu instead
1645         of the "Videos" menu, as documented on http://ipodlinux.org/ITunesDB
1647 Tue, 23 Oct 2007 09:24:52 +0200 <thp@perli.net>a
1648 sync_filename in podcastItem; cleanup; hide extra progressbar on transfer
1650         * src/gpodder/gui.py: Use podcastItem's sync_filename(); hide the
1651         unnecessary second progressbar when only syncing one channel (i.e.
1652         when clicking on the "transfer" button in the main window
1653         * src/gpodder/libgpodder.py: Remove unneeded lexists import and
1654         warning; clean-up
1655         * src/gpodder/libipodsync.py: Use podcastItem's sync_filename()
1656         * src/gpodder/libpodcasts.py: Add sync_filename() to podcastItem,
1657         returns the custom_sync_name or the title of the episode, based on the
1658         user's configuration settings for FS-based MP3 player sync
1660 Sun, 07 Oct 2007 14:38:31 +0200 <thp@perli.net>
1661 Add wishlist items to TODO list from Paul and Wilfred
1663         * TODO: New wishlist items, ideas and suggestions
1665 Sat, 06 Oct 2007 12:39:57 +0200 <thp@perli.net>
1666 Limit download progress status updates to reduce CPU load
1668         * src/gpodder/download.py: Limit the amount of status updates the
1669         download threads send to the DownloadStatusManager to one per second;
1670         this should make gPodder less CPU-intensive with many parallel
1671         downloads; thanks to Wilfred van Rooijen for reporting and testing
1673 Tue, 02 Oct 2007 17:59:29 +0200 <thp@perli.net>
1674 Update channel models (icons) after iPod synchronization
1676         * src/gpodder/gui.py: Call update_model() on each channel after an
1677         iPod sync, so we can update the played state on the available episodes
1678         lists when played state was changed by the iPod sync
1680 Sat, 29 Sep 2007 14:12:15 +0200 <thp@perli.net>
1681 Fix loading of channel metadata (load auth data and settings)
1683         * src/gpodder/libpodcasts.py: Load channel metadata when loading a
1684         podcastChannel object from OPML/LocalDB. This fixes a problem with
1685         authentication data being not loaded and also fixes a bug when the
1686         custom-set channel title was not correctly used throughout the GUI.
1687         Thanks to Nick (nikosapi) for reporting and providing a patch
1689 Tue, 25 Sep 2007 22:02:19 +0200 <thp@perli.net>
1690 Finally remove Desktop symlink code; several compatibility fixes
1692         * src/gpodder/download.py: Prevent divide-by-zero errors when
1693         calculating download speed
1694         * src/gpodder/gui.py: Prevent divide-by-zero errors when calculating
1695         percentage done in code for moving the downloaded items folder
1696         * src/gpodder/libgpodder.py: Remove the "Symlink on Desktop" code,
1697         because it's not GUI-accessible anymore and we didn't use it anyway
1698         * src/gpodder/opml.py: Better local filename detection by using
1699         os.path.exists() instead of .startswith('/'); this is also good for
1700         cross-platform compatibility where parts don't usually start with a
1701         forward slash (i.e. Win32)
1703 Mon, 24 Sep 2007 00:09:44 +0200 <thp@perli.net>
1704 Channel list selection bug fixes
1706         * src/gpodder/gui.py: Fix some channel list-related problems and
1707         annoyances, based on a patch by Nick (nikosapi)
1708         * bin/gpodder: We're in development again, so "+svn"
1710 Fri, 21 Sep 2007 02:07:43 +0200 <thp@perli.net>
1711 gPodder 0.10.0 "Hier spricht Frank Drebin" released
1713         * bin/gpodder: gPodder 0.10.0 released :)
1714         * doc/man/gpodder.1: gPodder 0.10.0 released :)
1715         * README: gPodder 0.10.0 released :) (and: updated dependencies)
1716         * TODO: Updated TODO list (some items are done for 0.10.0 :)
1718 Fri, 21 Sep 2007 02:05:10 +0200 <thp@perli.net>
1719 Updated translations from Rosetta (Launchpad.net)
1721         * data/po/es.po: Spanish translation by Julio Acuña
1722         * data/po/pt.po: Portuguese translation by Joel Calado (completed :)
1724 Fri, 21 Sep 2007 01:46:38 +0200 <thp@perli.net>
1725 Fix problems with path selection in treeChannels
1727         * src/gpodder/gui.py: Simple bugfix
1729 Fri, 21 Sep 2007 00:32:51 +0200 <thp@perli.net>
1730 Center gPodderEpisode on treeAvailable for less mouse hopping
1732         * src/gpodder/gui.py: If possible, center the gPodderEpisode dialog
1733         window on the treeAvailable, because that makes the position of the
1734         opened dialog more predictable and easier to use (as if the
1735         gPodderEpisode dialog was "inside" the treeView from which it opened)
1737 Fri, 21 Sep 2007 00:07:49 +0200 <thp@perli.net>
1738 Don't translate feed format string examples
1740         * src/gpodder/gui.py: Don't mark format string examples as
1741         translatable
1743 Wed, 19 Sep 2007 17:21:09 +0200 <thp@perli.net>
1744 Small bugfix for updating treeChannels when its model changes
1746         * src/gpodder/gui.py: Bugfix
1748 Wed, 19 Sep 2007 16:57:41 +0200 <thp@perli.net>
1749 Removed channel combobox, drag'n'drop improvements + new channel cover editor
1751         * data/gpodder.glade: Remove comboAvailable in gPodder (main window);
1752         add download+clear button in gPodderChannel, rename some items that
1753         are now used in code; make the channel navigator non-shrinkable (so
1754         it is always visible, because we don't have comboAvailable anymore)
1755         * src/gpodder/gui.py: Remove support for the channel combo box,
1756         also known as comboAvailable; clean-up DND code and make treeChannels
1757         the only DND target in the main window; remove some unnecessary
1758         updating of the channel list (calls to updateComboBox);
1759         Changes for the gPodderChannel dialog: Don't automatically download
1760         channel cover when dialog pops up; add "Download" and "Clear" buttons
1761         to the cover editor; add DND support for dropping local files or
1762         images from the web browser to the cover editor (for setting custom
1763         covers on channels with bad or no cover)
1764         * src/gpodder/libgpodder.py: Don't abort get_image_from_url() if the
1765         URL is invalid, but the image has already been downloaded (because we
1766         read the downloaded image in the code when it exists, without URL)
1768 Wed, 19 Sep 2007 14:23:40 +0200 <thp@perli.net>
1769 Center feed update dialog on main window; scroll reset in chan.navigator
1770         * src/gpodder/gui.py: Reset the current scroll position of the channel
1771         navigator when re-loading the channel list; this fixes an annoyance
1772         that Alistair Sutton <alistair.sutton@gmail.com> reported when dealing
1773         with a HUGE channel list (more than 50 channels); also removed the
1774         scroll position reset code from treeAvailable, as we already managed
1775         to only edit the model instead of re-loading it every time; added code
1776         to really center the feed update dialog on gPodder's main window
1778 Tue, 18 Sep 2007 20:15:56 +0200 <thp@perli.net>
1779 Replace wget with new gpodder.download module; User-agent support
1781         * bin/gpodder: Set "gpodder.user_agent" field on startup; remove check
1782         for wget, as this is not needed anymore
1783         * src/gpodder/cache.py: Clean-up; remove old logging code; add support
1784         for gpodder.user_agent; log info when there is an error in parsing the
1785         feed, so the user knows why this feed is not cached
1786         * src/gpodder/console.py: Remove DownloadPool, Use new
1787         gpodder.download module for carrying out downloads, remove
1788         wget_version() tester, as this is not needed anymore =)
1789         * src/gpodder/download.py: Added new downloader module that uses
1790         urllib and some custom classes and functions to provide the equivalent
1791         functionality of the obsolete "libwget", but without the wget
1792         dependency and with better accuracy (progress reporting, etc..)
1793         * src/gpodder/gui.py: Utilize new gpodder.download module instead of
1794         libwget
1795         * src/gpodder/__init__.py: Add "user_agent" variable to the gpodder
1796         module that holds the value of the "User-agent" header to send to web
1797         servers when requesting OPMLs, Feeds or download data
1798         * src/gpodder/opml.py: Add support for sending the User-agent header
1799         * src/gpodder/services.py: Make the progress column a float column to
1800         have smoother progress indicuation; add the "acquired" keyword
1801         argument to s_release(); default 'speed' to a translated "Queued"
1802         * src/gpodder/libwget.py: Removed
1803         * doc/dev/redhat-wget-output.txt: Removed
1805 Tue, 18 Sep 2007 02:30:04 +0200 <thp@perli.net>
1806 Refreshed pot files and po templates; updated German translation
1808         * data/messages.pot: Refreshed from current source
1809         * data/po/de.po: Refreshed and updated translation
1810         * data/po/*.po: Refreshed from new .pot file
1812 Tue, 18 Sep 2007 02:19:19 +0200 <thp@perli.net>
1813 Imported updated translations from Rosetta (Launchpad.net)
1815         * data/po/it.po: Italian translation updated by FFranci72
1816         * data/po/nl.po: Dutch translation updated by Roel Groeneveld
1817         * data/po/pt.po: Portuguese translation updated by Joel Calado
1819 Tue, 18 Sep 2007 02:14:19 +0200 <thp@perli.net>
1820 Offline support for feedcache, faster startup, code simplification
1822         * src/gpodder/cache.py: Add support for "offline" keyword argument
1823         * src/gpodder/gui.py: Make intelligent use of "offline" keyword
1824         argument when passed to load_channels(); simplify code for selecting
1825         the active channel in updateComboBox()
1826         * src/gpodder/libpodcasts.py: Pass-through of "offline" keyword
1827         argument in all relevant function calls
1829 Sat, 15 Sep 2007 16:22:28 +0200 <thp@perli.net>
1830 New LocalDB using DOM (removes python-xml dependency); channel context menu
1832         * bin/gpodder: Don't check for xml.sax package and modules anymore, as
1833         the dependency on python-xml has been removed with this release
1834         * data/gpodder.glade: Remove the "info" button for the current channel
1835         * src/gpodder/gui.py: Remove localdb-related code and adopt code for
1836         new LocalDB code; add context menu to channel navigator (edit/delete)
1837         * src/gpodder/libipodsync.py: Don't import "liblocaldb" module
1838         * src/gpodder/liblocaldb.py: Removed
1839         * src/gpodder/liblocdbreader.py: Removed
1840         * src/gpodder/liblocdbwriter.py: Removed
1841         * src/gpodder/liblogger.py: Add "traceback" keyword argument to the
1842         log() function; if "True" and in debugging mode, print traceback
1843         * src/gpodder/libpodcasts.py: Merge code from old liblocaldb and
1844         liblocdbreader/liblocdbwriter to this module as LocalDBWriter and
1845         LocalDBReader; customize podcastChannel to new LocalDB code
1846         * src/gpodder/libwget.py: Remove localdb-specific code (now obsolete)
1848 Wed, 12 Sep 2007 23:07:23 +0200 <thp@perli.net>
1849 Fix a bug when traversing directories with loop symlinks
1851         * src/gpodder/util.py: Don't dive into subdirectories that are
1852         symbolic links, this is to avoid a situation where looping symlinks
1853         result in the function dead-locking in a endless recursive loop,
1854         thanks to Bjørn Rasmussen <bjoernr@sensewave.com> for pointing that
1855         out and providing the necessary bug report to fix this issue
1857 Sun, 09 Sep 2007 18:47:20 +0200 <thp@perli.net>
1858 Mark episodes as downloaded/deleted when deleting episodes
1860         * src/gpodder/gui.py: Rename "Mark [...] as downloaded" to "Mark [...]
1861         as deleted" and mark episodes as downloaded when removing selected
1862         episodes that have not been downloaded yet, as suggested by Holger
1863         Leskien <holger leskien.com>
1864         * src/gpodder/libpodcasts.py: Fix problem when trying to delete
1865         episodes that have not been downloaded
1867 Sat, 08 Sep 2007 16:45:21 +0200 <thp@perli.net>
1868 Support for customized file names in MP3 player sync code
1870         * src/gpodder/gui.py: Add supporting code for reading/setting
1871         configuration options for the preferences dialog and a help display
1872         code that displays a guide on how to write custom sync name strings
1873         * src/gpodder/libgpodder.py: New configuration options:
1874         custom_sync_name (holds format string) and
1875         custom_sync_name_enabled (boolean, if the above string should be used)
1876         * src/gpodder/libipodsync.py: Use custom sync name format string and
1877         util's object_string_formatter() function to obtain a file name for
1878         the synchronized episode (or default to episode.title if disabled)
1879         * src/gpodder/libpodcasts.py: Add new property methods to podcastItem:
1880         basename (returns the basename of the URL, without extension) and
1881         published (returns the pubDate of the episode in YYYYMMDD format)
1882         * src/gpodder/util.py: New object_string_formatter() method that
1883         replaces {OBJECTNAME.ATTRNAME} substrings in a string with the
1884         corresponding values of passed-in keyword argument objects
1885         * data/gpodder.glade: Added preferences GUI elements
1887 Wed, 05 Sep 2007 10:14:09 +0200 <thp@perli.net>
1888 Check for installed python-xml package on startup (hard dependency)
1890         * bin/gpodder: Add dependency check for PyXML
1892 Sun, 02 Sep 2007 15:01:48 +0200 <thp@perli.net>
1893 Fix bug with default window title in gPodder window
1895         * src/gpodder/gui.py: Always set gPodder's default_title attribute
1897 Sun, 02 Sep 2007 14:33:21 +0200 <thp@perli.net>
1898 Updated Russian translation from Vladimir Zemlyakov
1900         * data/po/ru.po: Updated
1902 Sun, 02 Sep 2007 14:23:17 +0200 <thp@perli.net>
1903 More sanitizing hacks for ugly feeds we don't really like
1905         * src/gpodder/libpodcasts.py: Negotiate which enclosure to select from
1906         multiple enclosures, if there are more than one available; skip
1907         episodes with a buggy download URL (i.e. no supported URL scheme)
1908         * src/gpodder/util.py: Return "(unknown)" if file size cannot be
1909         determined from the string passed to format_filesize(); return "None"
1910         in file_type_by_extension() if the extension is an empty string
1912 Fri, 31 Aug 2007 23:38:01 +0200 <thp@perli.net>
1913 Handle enclosures (or lack thereof) better if fields are missing
1915         * src/gpodder/gui.py: Remove refetch_channel_list() function, as this
1916         is not called anywhere from the code (uh, how did i miss that?)
1917         * src/gpodder/libpodcasts.py: Be more liberal to enclosure tags
1918         without length or mime type; ignore episodes without enclosures (it's
1919         not len(enclosures) == 0, but the enclosures attribute doesn't even
1920         exist on entries without enclosures, so make sure to check for that
1922 Fri, 31 Aug 2007 20:03:03 +0200 <thp@perli.net>
1923 Use Python's webbrowser module for URL opening; channel dialog clean-up
1925         * bin/gpodder: Set version to 0.9.5+svn (this is where we are now)
1926         * data/gpodder.glade: Remove "cancel" button from gPodderChannel
1927         * src/gpodder/gui.py: Use "webbrowser" module for URL opening instead
1928         of relying on "gnome-open" to be available; remove event handler for
1929         gPodderChannel's "cancel" button
1931 Thu, 30 Aug 2007 21:06:28 +0200 <thp@perli.net>
1932 Dependency check for python-feedparser in bin/gpodder
1934         * bin/gpodder: Add dependency check and warning (with exit) if
1935         python-feedparser is not installed, as python-feedparser now is a
1936         dependency of gPodder
1938 Thu, 30 Aug 2007 20:51:46 +0200 <thp@perli.net>
1939 Support for modifying DownloadHistory and PlaybackHistory in GUI
1941         * data/gpodder.glade: Added menu items in gPodder main window
1942         * src/gpodder/gui.py: Add menu items to treeAvailable's context menu
1943         to toggle/set downloaded and played status on selected episodes
1944         * src/gpodder/libgpodder.py: Add del_item() function to
1945         DownloadHistory to support removing items from the history list;
1946         enhance history_mark_{played,downloaded}() functions for add/delete
1948 Thu, 30 Aug 2007 20:46:48 +0200 <thp@perli.net>
1949 Improved pubDate parsing; episode delete bugfix
1951         * src/gpodder/libpodcasts.py: Let feedparser parse the pubDate field
1952         of episodes and use new function in gpodder.util to convert the parsed
1953         pubDate to a string; bugfix for remove downloaded episode by URL
1954         * src/gpodder/util.py: Add updated_parsed_to_rfc2822() function that
1955         converts the "updated_parsed" field from feedparser to a RFC2822
1956         string
1958 Thu, 30 Aug 2007 12:03:24 +0200 <thp@perli.net>
1959 Remove obsolete documentation in doc/dev; cosmetic changes
1961         * data/po/Makefile: Upgrade to GPLv3
1962         * data/po/README: Mention i18n page on gPodder's website
1963         * doc/dev/build-deps-breezy.txt: Removed
1964         * doc/dev/debian.txt: Removed
1965         * doc/dev/i18n.txt: Removed
1966         * doc/dev/porting.txt: Removed
1967         * doc/dev/svncl.sed: Upgrade to GPLv3; modify look added and removed
1968         files
1970 Wed, 29 Aug 2007 20:26:50 +0200 <thp@perli.net>
1971 Upgrade to the GNU General Public License, Version 3
1973         * bin/gpodder: Upgrade to GPLv3
1974         * COPYING: Upgrade to GPLv3
1975         * doc/dev/copyright_notice: Upgrade to GPLv3
1976         * Makefile: Upgrade to GPLv3
1977         * README: Upgrade to GPLv3
1978         * setup.py: Upgrade to GPLv3
1979         * src/gpodder/*.py: Upgrade to GPLv3 (except for SimpleGladeApp and
1980         cache, as these are LGPL or other and do not originate from gPodder)
1982 Wed, 29 Aug 2007 19:32:22 +0200 <thp@perli.net>
1983 Integration changes, commit and ChangeLog migration
1985         * doc/dev/svncl.sed: Use tabs instead of 8 spaces for ChangeLog edit
1986         * Makefile: Make $EDITOR edit "ChangeLog" directly
1988 Wed, 29 Aug 2007 19:17:36 +0200 <thp@perli.net>
1989 Last batch of experimental change merges (up to svn r398)
1991         * doc/dev/tepache-howto.txt: Removed
1992         * doc/dev/tepache: Removed
1993         * src/gpodder/gui.py.orig: Removed
1994         * src/gpodder/libwget.py: Send progress = 0.0 on inital status update
1995         * src/gpodder/libpodcasts.py: Try to get episode metadata from several
1996         different properties of the corresponding feedparser entries; warn
1997         user when we couldn't get the episode title and try to get the episode
1998         title from the filename of the URL if we still have not found an
1999         episode title
2000         * src/gpodder/libgpodder.py: Add get_device_name() that returns a
2001         "nice" representative string of the currently selected device that can
2002         be used to represent the device in the GUI
2003         * src/gpodder/util.py: Return "(unknown)" string when bytesize in
2004         format_filesize() when the size has a negative value; make
2005         get_tree_icon() catch errors and be more corrent with icon creation;
2006         add get_first_line() function that extracts the first line of a string
2007         * src/gpodder/libipodsync.py: Add "divx" to list of video extensions
2008         * src/gpodder/services.py: DownloadStatusManager has a new observer
2009         notification: "progress-detail"; add unregister() functionality for
2010         observers; add request_progress_detail() function that can be used to
2011         force a "progress-detail" notification to be sent out to all relevant
2012         observers; remove get_url_by_iter() function as it is not needed
2013         anymore
2014         * src/gpodder/gui.py: Clean-up after tepache dependency removal; new
2015         GladeWidget base class that subclasses SimpleGladeApp and simplifies
2016         class creation for our gPodder windows; add context menu to
2017         treeAvailable; re-work play_or_download() and make it return a list of
2018         boolean indicators on which actions can be performed on the selected
2019         items; move show_message() and show_confirmation() to GladeWidget;
2020         disable editing of the URL in the channel info dialog, this simplifies
2021         code and editing the URL doesn't make so much sense anyway (adding the
2022         new url and removing the old does the same and is easier, code-wise);
2023         add support for cancelling downloads in the available podcasts view;
2024         support live status view and download cancelling in the gPodderEpisode
2025         dialog window by hooking up to DownloadStatusManager as observer
2026         * src/gpodder/SimpleGladeApp.py: Customize for gPodder (remove usage
2027         of weakref for keyword arguments -> properties of new object)
2028         * bin/gpodder: We're using a experimental development version now
2029         * data/gpodder.glade: Add progress bar and associated buttons to
2030         gPodderEpisode dialog
2031         * MANIFEST.in: Removed gpodder.py.orig inclusion
2032         * Makefile: Removed support for tepache
2034 Wed, 29 Aug 2007 19:05:57 +0200 <thp@perli.net>
2035 More changes from the experimental branch (up to svn r382)
2037         * src/gpodder/liblocdbreader.py: Clean-up
2038         * src/gpodder/libwget.py: Use "gpodder.services" instead of accepting
2039         a generic download status manager as constructor parameter; remove
2040         downloadStatusManager class (moved to gpodder.services)
2041         * src/gpodder/console.py: More clean-ups; use get_new_episodes()
2042         instead of duplicating code here; simplify the code for wget version
2043         detection
2044         * src/gpodder/libpodcasts.py: Improve channel/episode generation from
2045         feedparser objects (with error handling); utilize download status
2046         manager from "gpodder.services" instead of accepting a download status
2047         manager as parameter; clean up unneeded functions and rename some
2048         functions to make the code more readable; use util.get_tree_icon() for
2049         compositing a nice icon; remove the "played" column from the
2050         treemodel; add local_filename to treemodel
2051         * src/gpodder/liblocdbwriter.py: Clean-up
2052         * src/gpodder/libgpodder.py: Clean-up
2053         * src/gpodder/util.py: Add torrent_filename() function that tries to 
2054         extract the filename of the file a .torrent file contains; add
2055         file_extension_from_url() function that returns the file extension in
2056         a URL; add file_type_by_extension() that returns the type of a file
2057         based on its extension; add get_tree_icon() that loads a named icon
2058         and optionally adds a bullet to it (unplayed status indicator)
2059         * src/gpodder/libipodsync.py: Clean-up
2060         * src/gpodder/services.py: New module that currently contains the
2061         improved DownloadStatusManager and a single object that servces as
2062         download status manager for all parts of gpodder
2063         * src/gpodder/gui.py: Only one column for status/played; use
2064         "gpodder.services" for the download status manager; clean-up
2065         * src/gpodder/liblocaldb.py: Clean-up
2066         * bin/gpodder: Clean-up
2067         * data/gpodder.glade: Clean-up; removed "show played column"
2068         preference in gPodderProperties dialog
2070 Wed, 29 Aug 2007 18:49:37 +0200 <thp@perli.net>
2071 First import from experimental branch (up to svn r375)
2073         * src/gpodder/librssreader.py: Removed in favor of python-feedparser
2074         * src/gpodder/libwget.py: Percentage is now a float, don't set to 0
2075         when there has been an error
2076         * src/gpodder/console.py: Use {load,save}_channels methods; code
2077         cleanup and simplification
2078         * src/gpodder/cache.py: Add python-feedcache module from Doug Hellman
2079         * src/gpodder/libpodcasts.py: Use opml and feedcache for channel list
2080         and RSS reading; use shelve for new ChannelSettings class; clean-up
2081         podcastChannel and podcastItem; better TreeModel generator for
2082         podcastChannel (try to cache the model, only updates icons, etc...);
2083         remove downloadRss method in podcastChannel; move DownloadHistory and
2084         Playbackhistory to libgpodder; new load_channels() and save_channels()
2085         functions to save/load the channel list to an OPML file
2086         * src/gpodder/libgpodder.py: BIG clean-up; remove gPodderChannelWriter
2087         and gPodderChannelReader (this is now in libpodcasts as simple
2088         functions); add DownloadHistory and PlaybackHistory from libpodcasts; 
2089         * src/gpodder/gui.py: Use new functions for channel list
2090         loading/saving; only update treemodel for treeAvailable when it's
2091         really necessary
2092         * src/gpodder/liblocaldb.py: Remove unnecessary functions that have
2093         not been used for a while (treemodel-related); use load_channels()
2094         instead of gPodderChannelReader
2097 Wed, 29 Aug 2007 18:31:16 +0200 <thp@perli.net>
2098         * ChangeLog: Older changes can be found on the gPodder website at
2099         http://gpodder.berlios.de/releases/0.9.5/ChangeLog