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