Also delete old episodes that have disappeared from the feed
[gpodder.git] / ChangeLog
blob52a1019188236cf3cd7bfcf186cd13a6915c5183
1 Sat, 22 Dec 2007 11:44:41 +0100 <thp@perli.net>
2 Also delete old episodes that have disappeared from the feed
4         * src/gpodder/gui.py: When deleting old episodes automatically, also
5         delete episodes that have disappeared from the RSS feed and are only
6         available locally; thanks to Pieter De Decker <pdedecker@gmail.com>
7         for the very detailed and helpful bug report :)
9 Thu, 20 Dec 2007 01:33:15 +0100 <thp@perli.net>
10 Stability updates: Feed cache update, old PyCairo versions
12         * src/gpodder/draw.py: Add a workaround for pycairo versions less than
13         1.1.6. Thanks to Chris Arnold for reporting this bug on the
14         gpodder-devel mailing list and taking the time to test the patch and
15         report back and provide useful information for debugging this error
16         * src/gpodder/gui.py: Close the feed cache update dialog even when the
17         user clicks on "cancel" (would have stayed there otherwise)
19 Tue, 18 Dec 2007 10:13:44 +0100 <thp@perli.net>
20 Merge "delete episode after sync" patch from Jérôme Chabod
22         * data/gpodder.glade: Add GUI elements in preferences dialog to select
23         what to do after episode sync (nothing, delete or mark played)
24         * src/gpodder/config.py: Add "on_sync_delete" configuration option
25         * src/gpodder/gui.py: Glue "on_sync_delete" config and GUI together
26         * src/gpodder/libipodsync.py: If the configuration option
27         on_sync_delete is set, remove the episode after successfully copying
28         it to the iPod or MP3 player (the whole patch has been initially done
29         by Jérôme Chabod <jerome.chabod@france.com> with some modifications)
30         * src/gpodder/libpodcasts.py: Make delete_from_disk() a bit more
31         robust, so it doesn't disturb libipodsync's functionality
33 Mon, 17 Dec 2007 16:26:43 +0100 <thp@perli.net>
34 Remove invalid channel cover images when loading fails
36         * src/gpodder/libpodcasts.py: Remove the cover_file of a channel when
37         it cannot be loaded (assume something went wrong when downloading the
38         cover file); re-downloading the cover manually can solve the problem
40 Mon, 17 Dec 2007 15:00:17 +0100 <thp@perli.net>
41 Fix typo in last commit
43         * src/gpodder/libipodsync.py: Fix typo in last commit
45 Mon, 17 Dec 2007 11:21:10 +0100 <thp@perli.net>
46 Modify played handling in iPod sync when "on sync mark played" is active
48         * src/gpodder/libipodsync.py: Don't copy played state from PC to iPod
49         if the on_sync_mark_played option is set
51 Sat, 15 Dec 2007 15:58:23 +0100 <thp@perli.net>
52 Merge patch from Leonid Ponomarev to gdfs
54         * doc/dev/gdfs/gdfs-init.py: Merge patch from Leonid Ponomarev to add
55         support for the system's native encoding, based on the $LANG
56         environment variable. This should add support for episodes and
57         channels with international characters as titles
59 Sat, 15 Dec 2007 15:11:46 +0100 <thp@perli.net>
60 Updated Dutch translation by Pieter De Decker
62         * bin/gpodder: We're in development again: "+svn"
63         * data/po/nl.po: Updated Dutch translation from Pieter De Decker
65 Thu, 13 Dec 2007 08:32:54 +0100 <thp@perli.net>
66 gPodder 0.10.3 "A Stop at Willoughby" released
68         * bin/gpodder: gPodder 0.10.3 released :)
69         * README: gPodder 0.10.3 released :)
70         * doc/man/gpodder.1: gPodder 0.10.3 released :)
71         * data/messages.pot: Updated from source
72         * data/po/de.po: Updated German translation
73         * data/po/*.po: Updated from messages.pot
75 Thu, 13 Dec 2007 08:02:29 +0100 <thp@perli.net>
76 Link the gPodder Documentation Wiki from the help pages
78         * data/gpodder.glade: Help menu: gPodder Homepage (instead of website)
79         and Documentation Wiki (instead of Mailing list)
80         * src/gpodder/gui.py: Open gPodder Wiki instead of mailing list page
82 Wed, 12 Dec 2007 21:39:03 +0100 <thp@perli.net>
83 Remove TODO file from MANIFEST.in
85         * MANIFEST.in: Of course we have to remove non-existing files from the
86         MANIFEST.in file, too.. so TODO is now finally gone :)
88 Wed, 12 Dec 2007 21:30:00 +0100 <thp@perli.net>
89 Manage TODO list on the gPodder Wiki
91         * TODO: Removed; new location: http://gpodderwiki.jottit.com/todo
93 Wed, 12 Dec 2007 20:55:00 +0100 <thp@perli.net>
94 Configuration for "old" episodes; automatically remove old episodes
96         * src/gpodder/config.py: New boolean auto_remove_old_episodes
97         configuration option that defaults to False (remove on startup)
98         * src/gpodder/gui.py: Add code to automatically remove old, unplayed
99         episodes on startup if the specific configuration options have been
100         set; connect config manager to GUI items for the preferences dialog
101         * data/gpodder.glade: Add checkbox for automatically removing old,
102         unplayed episodes from gPodder on startup and a spinbutton to set the
103         amount of days after which an episode is considered "old"
105 Wed, 12 Dec 2007 19:44:15 +0100 <thp@perli.net>
106 Merged episode locking patch from Paul Rudkin
108         * src/gpodder/gui.py: Merged "lock episodes" patch to mark episodes as
109         locked, patch by Paul Rudkin <paul@thegithouse.com>
110         * data/gpodder.glade: Add menu item for toggle locked status
111         * src/gpodder/libgpodder.py: Add "locked" history
112         * src/gpodder/libpodcasts.py: When requesting a status icon, also draw
113         the "Locked" status; is_locked() in podcastItem
114         * src/gpodder/util.py: Added code for drawing a padlock icon on top of
115         another (file type) icon; this is used for the "lock episodes" feature
117 Tue, 11 Dec 2007 22:10:03 +0100 <thp@perli.net>
118 Updated TODO list
120         * TODO: Updated TODO list
122 Mon, 10 Dec 2007 09:42:06 +0100 <thp@perli.net>
123 Move observer code out of DownloadStatusManager into ObservableService
125         * src/gpodder/services.py: Move out all observer-related code like
126         registration, unregistration and notification to a new
127         ObservableService class; subclass ObservableService in
128         DownloadStatusManager; this makes the observer code in
129         DownloadStatusManager re-usable (will be needed for new sync code)
131 Mon, 10 Dec 2007 09:33:26 +0100 <thp@perli.net>
132 Selective iPod episode clean-up; "delete older than X days"
134         * src/gpodder/config.py: Add episode_old_age configuration variable;
135         is an integer, defaults to 7. This is the number of days after which
136         an episode will be considered "old"
137         * src/gpodder/gui.py: iPod cleanup is now done selectively using the
138         episode selector dialog; the code has been split, because we do not
139         yet have an episode selector dialog for FS-based sync; add "Downloaded
140         x days ago" column to "Delete old episodes" dialog and a corresponding
141         button; call the callback even when no episodes are selected in
142         gPodderEpisodeSelector
143         * src/gpodder/libipodsync.py: Class variables of gPodder_iPodSync
144         moved to __init__ to be instance variables (this should fix a bug that
145         crops up now that we can selectively delete episodes); remove_tracks()
146         and clean_playlist() have been modified/added to support new episode
147         selector deletion code
148         * src/gpodder/libpodcasts.py: Move is_played() to podcastItem from
149         podcastChannel (it really belongs to the item; this makes code more
150         readable in other parts of the codebase); add age_in_days(), is_old(),
151         get_age_string() and age_prop to podcastItem
152         * src/gpodder/util.py: New function: file_modification_datetime();
153         returns a datetime.datetime instance of the MTIME (modification
154         timestamp) of the filename given as parameter or None if the filename
155         cannot be determined; this is used for the "old episodes" feature
157 Sun, 09 Dec 2007 16:45:11 +0100 <thp@perli.net>
158 Make has_converter() a bit more intelligent in detecting extensions
160         * src/gpodder/libconverter.py: Convert given extension to lowercase
161         and strip a leading "." from the extension, so calling code can also
162         give the second value of the os.path.splitext() result directly to
163         has_converter()
165 Sun, 09 Dec 2007 13:20:49 +0100 <thp@perli.net>
166 Fix pre-setting code for filechooser buttons; Patch by Paul Rudkin
168         * src/gpodder/config.py: Fix pre-setting code for filechooser-related
169         code; use set_current_folder() instead of set_filename()
170         * src/gpodder/gui.py: Fix pre-setting code for filechooser-related
171         code; thanks to Paul Rudkin <paul@thegithouse.com> for the patch
173 Thu, 06 Dec 2007 09:37:57 +0100 <thp@perli.net>
174 Support for itms:// links (direct links to the Apple iTunes Music Store)
176         * src/gpodder/util.py: Support direct itms:// links by splitting out
177         the iTunes Podcast links parsing routines. This should put us in for
178         some nice iTunes podcast link support that will automagically
179         translate iTunes podcast links to the correct RSS feed URL
181 Thu, 06 Dec 2007 09:29:09 +0100 <thp@perli.net>
182 Support for iTunes Podcast links (http://phobos.apple.com/...)
184         * src/gpodder/util.py: Add support for subscribing to iTunes Podcast
185         links (those with phobos.apple.com); new functions:
186         parse_itunes_xml(), http_get_and_gunzip() and itunes_dicover_rss()
188 Thu, 06 Dec 2007 09:15:57 +0100 <thp@perli.net>
189 Added Galician translation from Teo Ramirez
191         * data/gpodder.desktop: Added Spanish and Galician translations;
192         thanks to Teo Ramirez <teoramirez@gmail.com>
193         * data/messages.pot: Updated from source
194         * data/po/de.po: Updated
195         * data/po/gl.po: Added NEW Galician (gl) translation by Teo Ramirez
196         * data/po/*.po: Updated from source
197         * setup.py: Added Galician (gl) translation by Teo Ramirez
199 Thu, 06 Dec 2007 08:35:12 +0100 <thp@perli.net>
200 Sort channel list (finally ;)
202         * src/gpodder/libpodcasts.py: Sort channels by lowercase title before
203         returning the channel list in load_channels(); this automagically
204         makes gPodder's channel list always sorted :)
205         Thanks to FriedBunny <friedbunny@kulturny.com> for suggesting this and
206         sending in an intial patch that led to this patch =)
207         * TODO: Remove implemented item: Sort channel list
209 Tue, 04 Dec 2007 23:28:27 +0100 <thp@perli.net>
210 Do grayscale "pill" instead of theme-based colors (for bad themes)
212         * src/gpodder/draw.py: Always draw the "pill" in semi-transparent
213         black/grey shades so it will work for all GTK themes (even Ubuntu's)
215 Mon, 03 Dec 2007 21:35:56 +0100 <thp@perli.net>
216 Update channel navigator when iPod/MP3 player sync has finished
218         * src/gpodder/gui.py: Update channel navigator when iPod sync has
219         finished, so we can update the "played" status in the channel
220         navigator when this status has changed after we've synced ("on sync
221         mark played" option)
223 Mon, 03 Dec 2007 21:24:17 +0100 <thp@perli.net>
224 Add option to mark episodes as played after transfer to device
226         * data/gpodder.glade: Option added to preferences dialog
227         * src/gpodder/config.py: Add option "on_sync_mark_played"; will mark
228         an episode as played when it gets transferred to a device
229         * src/gpodder/gui.py: Glue code for GUI + gpodder.config
230         * src/gpodder/libipodsync.py: On sync, mark episode as played if the
231         user has selected the "on_sync_mark_played" option
232         * TODO: Remove implemented/integrated items
234 Sat, 01 Dec 2007 15:19:29 +0100 <thp@perli.net>
235 Fix a fatal bug with first-run that prevents channel list saving
237         * src/gpodder/util.py: Always use a file's parent directory to get the
238         free disk space and return zero free disk space when the parent
239         directory does not exist
241 Thu, 29 Nov 2007 08:53:36 +0100 <thp@perli.net>
242 Support for itpc:// URLs
244         * src/gpodder/util.py: Add support for adding "itpc://" URLs (these
245         are simply http:// URLs with a different schema, for iTunes)
247 Tue, 27 Nov 2007 22:59:26 +0100 <thp@perli.net>
248 Draw channel stats (unplayed, downloaded) on channel navigator
250         * bin/gpodder: We're in development again, so add "+svn"
251         * src/gpodder/draw.py: Added
252         * src/gpodder/gui.py: Fix import of renamed "channels_to_model";
253         re-assign new column numbers for treeChannels' data model; add
254         cell renderer for pill pixbuf and remove cell renderer for status text
255         * src/gpodder/libpodcasts.py: Add episode_is_new() function to
256         podcastChannel to check if an episode can be considered "new"; use the
257         episode_is_new function in get_new_episodes; add get_episode_stats()
258         after an idea from Paul Rudkin <paul@thegithouse.com>; re-factor
259         channels_to_model and clean out old, unused code and columns
261 Mon, 26 Nov 2007 08:57:04 +0100 <thp@perli.net>
262 gPodder 0.10.2 "Ein schweineschnauzen Sandwich, bitte!" released
264         * bin/gpodder: gPodder 0.10.2 released :)
265         * doc/man/gpodder.1: gPodder 0.10.2 released :)
266         * README: gPodder 0.10.2 released :)
268 Mon, 26 Nov 2007 08:52:49 +0100 <thp@perli.net>
269 Translation updates
271         * data/messages.pot: Refreshed from source
272         * data/po/*.po: Refreshed from messages.pot
273         * data/po/de.po: Updated German translation
275 Sun, 25 Nov 2007 11:50:46 +0100 <thp@perli.net>
276 Make sure there is enough free disk space when saving OPML channel list
278         * src/gpodder/gui.py: Notify user that there's some problem saving the
279         current channel list when save_channels() return False
280         * src/gpodder/libpodcasts.py: Pass-through the return value of
281         gpodder.opml.Exporter.write so calling code knows if saving the
282         channel list was successful or not
283         * src/gpodder/opml.py: Check free disk space before saving OPML
284         channels in Exporter.write; thanks to Jens Thiele <karme@berlios.de>
285         for reporting this bug on the Debian BTS (Closes: Debian Bug #452490)
287 Thu, 22 Nov 2007 21:52:35 +0100 <thp@perli.net>
288 Don't send Referer header when downloading episodes
290         * src/gpodder/download.py: Some podcasts now implement an
291         "anti-bandwidth-theft" code that should provide other websites from
292         not linking to the episodes; as we have sent a Referer header
293         containing the RSS feed URL, this causes problems; Referer header
294         sending is therefore disabled now
296 Sun, 18 Nov 2007 15:33:50 +0100 <thp@perli.net>
297 TODO items from Katy G. B.
299         * TODO: Updated TODO list
301 Sat, 17 Nov 2007 18:38:36 +0100 <thp@perli.net>
302 Backwards-compatibility for PyGTK less than 2.12 (for GtkTooltip)
304         * src/gpodder/gui.py: Do not hook up tooltip handlers when we are
305         using PyGTK less than 2.12 (which introduced the gtk.Tooltip API)
307 Thu, 15 Nov 2007 11:07:42 +0100 <thp@perli.net>
308 Check free disk space before copying files to iPod
310         * src/gpodder/libipodsync.py: Check if the iPod's filesystem has
311         enough free disk space before copying files over to it, as to not
312         corrupt the iTunesDB in certain situations and fail when disk is full;
313         thanks to Nicolas Quienot <niqooo@gmail.com> for the bug report
314         * src/gpodder/util.py: Add get_free_disk_space() function that
315         calculates the free (user-available) disk space on a given path
317 Wed, 14 Nov 2007 21:55:18 +0100 <thp@perli.net>
318 Add informative tooltips to channel navigator
320         * src/gpodder/gui.py: Add tooltips to channel navigator that show a
321         bigger cover image, the title, description, url and used disk space
322         * src/gpodder/libpodcasts.py: Add save_dir_size property to
323         podcastChannel that contains the disk usage of the channel's save_dir;
324         this can be manually updated by calling update_save_dir_size() and
325         will automatically be updated when the GUI code hooks into the
326         channel; also add get_cover_pixbuf() that returns a pixbuf of the
327         cover for a given size or None if there is no valid cover file
329 Wed, 14 Nov 2007 19:19:11 +0100 <thp@perli.net>
330 Slipstream code (enumerate instead of simple position tracking)
331         * src/gpodder/libipodsync.py: Use enumerate() to iterate over a list
332         of episodes instead of keeping track of the position "by hand"
334 Wed, 14 Nov 2007 19:17:51 +0100 <thp@perli.net>
335 Ignore initial window events from GtkWindow in Config
337         * src/gpodder/config.py: Add a flag to config manager to ignore window
338         events until the window has been realized; then, start taking position
339         and size updates
341 Mon, 12 Nov 2007 20:25:39 +0100 <thp@perli.net>
342 Improve caching for HTTP redirects and minor errors; cache clean-up
344         * src/gpodder/cache.py: Cache content when it comes from a HTTP
345         redirect (301, 302, 307); cache feeds even with parsing errors, so we
346         can "fill" our cache and not download on every startup
347         * src/gpodder/libpodcasts.py: Add cache clean-up code after loading
348         channels; this should keep the feedcache.db file smaller for users
349         that like to try out new channels (or have used gPodder for a while)
351 Sun, 11 Nov 2007 14:24:17 +0100 <thp@perli.net>
352 Better file extension guessing for URLs
354         * src/gpodder/util.py: Improve file_extension_from_url() by adding
355         additional checks for known good extensions and recurse into the query
356         string if it looks like an URL; this should fix compatibility problems
357         for feeds with strange URLs; should provide more reliable guessing;
358         thanks to Nicolas Quienot <niqooo@gmail.com> for the bug report
360 Fri, 09 Nov 2007 10:05:36 +0100 <thp@perli.net>
361 Fix format_filesize() usage in episodes selector and podcastItem
363         * src/gpodder/gui.py: Use the correct (config-using) format_filesize()
364         function to generate the total size string in the episode selector
365         * src/gpodder/libpodcasts.py: Use the correct (config-usig
366         format_filesize() function to generate the total size string in
367         podcastItem; thanks to Pieter De Decker <pdedecker@gmail.com> for
368         pointing that out
369         * data/gpodder.glade: Use "Preferences" instead of "Preferences..."
370         which feels a bit better in the GUI
372 Thu, 08 Nov 2007 21:25:19 +0100 <thp@perli.net>
373 Add "gPodder download folder synchronizer" scripts to repository
375         * doc/dev/gdfs/gdfs-check.py: Added
376         * doc/dev/gdfs/gdfs-init.py: Added
377         * doc/dev/gdfs/README: Added
379 Thu, 08 Nov 2007 20:01:13 +0100 <thp@perli.net>
380 The mighty episode selector dialog and some menu re-arrangements
382         * src/gpodder/gui.py: Move the "center_on_widget" keyword-based window
383         positioning code to GladeWidget to be universally usable; update
384         "Device" menu item on startup; new functions: delete_episode_list()
385         and download_episode_list() that both operate on lists of episodes;
386         add code for invoking gPodderEpisodeSelector for deleting old
387         episodes; re-work on_itemDownloadAllNew_activate to use the episode
388         selector instead of hand-crafting a message dialog text; add
389         update_item_device() function that will handle the hiding, showing and
390         renaming of the "Device" menu in the menubar; clean-up
391         gPodderProperties with callback_finished setting (now kwarg-based);
392         new, might, fancy, customizable and uber-sexy gPodderEpisodeSelector
393         that will prove to be useful in some places in our codebase: it
394         basically allows the user to select a subset of episodes from a given
395         list in a quite sophisticated way; new "delete old episodes" menu item
396         added for cleaning up gPodder's downloads
397         * src/gpodder/libpodcasts.py: Add delete_from_disk() convenience
398         method to podcastItem; other convenience properties and functions
399         needed for the new episode selector dialog: pubdate_prop,
400         get_filesize_string(), filesize_prop, get_channel_title(),
401         channel_prop, get_played_string(), played_prop
402         * data/gpodder.glade: new gPodderEpisode dialog; re-structuring of
403         gPodder's main menu to be more usable and more compact; also added the
404         Ctrl+K "Remove old episodes" menu item; also use the correct
405         "multimedia-player" icon name of a not really representative icon
407 Thu, 08 Nov 2007 12:07:30 +0100 <thp@perli.net>
408 Support syncing to FS-based MP3 players without subfolders
410         * data/gpodder.glade: Add checkbox "Create a subfolder for each
411         channel" to preferences dialog and rename some widgets
412         * src/gpodder/config.py: Add boolean "fssync_channel_subfolders"
413         option that defaults to True (create subfolder for each channel)
414         * src/gpodder/gui.py: Hook up config option fssync_channel_subfolders
415         to preferences dialog; do more intelligent widget hiding for the
416         "Player" tab in the preferences dialog (only show relevant widgets)
417         * src/gpodder/libipodsync.py: Only append channel name as subfolder to
418         destination folder name when the "fssync_channel_subfolders" option is
419         True; suggested by Paul Elliot <omahns.home@gmail.com>
421 Thu, 08 Nov 2007 11:28:17 +0100 <thp@perli.net>
422 Fix offline cache behaviour when time is not set
424         * src/gpodder/cache.py: Return cached_content in offline mode when
425         cached_content "is not None" (instead of cached_time "is not None")
427 Tue, 06 Nov 2007 12:37:41 +0100 <thp@perli.net>
428 Process events before connecting Config to gtk windows
430         * data/gpodder.glade: Remove default size for main gPodder window, as
431         this is now handled by the config manager
432         * src/gpodder/config.py: Process GTK events in the event queue before
433         connecting to the "configure-event" signal, so we won't get two
434         configure events for the window for the initial size change
436 Mon, 05 Nov 2007 13:51:26 +0100 <thp@perli.net>
437 Add error reporting when download fails because of an I/O error
439         * src/gpodder/download.py: Catch and handle I/O errors in
440         DownloadThread and format and pass on messages to GUI code when
441         required; thanks to Florian Richter <Florian_Richter@gmx.de> for
442         suggesting this feature after having a full disk
443         * src/gpodder/gui.py: Update tree view when adding a new episode;
444         add new notification() method and pass this method through to
445         DownloadThread, so it can present messages to the user (i.e. errors)
447 Mon, 05 Nov 2007 12:54:35 +0100 <thp@perli.net>
448 Use util.find_command in more places (mplayer detection, ...)
450         * src/gpodder/libgpodder.py: Use util.find_command to detect the
451         existence of the "gnome-btdownload" command and spit out a warning log
452         message when the command is not available
453         * src/gpodder/libipodsync.py: Use util.find_command to check for an
454         installed mplayer binary (instead of relying on os.system("which...")
456 Mon, 05 Nov 2007 01:12:15 +0100 <thp@perli.net>
457 Better command detection for the converter library
459         * src/gpodder/libconverter.py: Detect existence of commands before
460         invoking them for converting files; based on a patch by
461         Nick (nikosapi.org); ConverterCollection is now a dict itself :)
462         * src/gpodder/util.py: Add new find_command() function that will
463         search the system's PATH for a specific executable command
465 Mon, 05 Nov 2007 00:21:39 +0100 <thp@perli.net>
466 Remove extracted cover art when deleting episode files
468         * src/gpodder/util.py: Apply modified version of a patch from
469         Nick (nikosapi.org) that is better suited for deleting cover art that
470         has been extracted with the new eyeD3 cover art extraction code
472 Mon, 05 Nov 2007 00:17:12 +0100 <thp@perli.net>
473 Patch from Nick (nikosapi) to support eyeD3 cover art extraction
475         * src/gpodder/libipodsync.py: Apply modified version of a patch from
476         Nick (nikosapi.org) to utilize eyeD3 for cover art extraction in iPod
477         sync code; remove dependency on PyID3
478         * README: PyID3 is not a dependency anymore, as we can now use eyeD3
479         for the same purpose (cover art extraction)
481 Sat, 03 Nov 2007 14:14:09 +0100 <thp@perli.net>
482 Fix format_filesize() function to be standards-conformant (unit prefixes)
484         * src/gpodder/config.py: Add "use_si_units" configuration option; if
485         True, the user will see SI units (MB, kB, ...); if False (the
486         default); the user will see binary-prefix units (MiB, KiB, ..)
487         * src/gpodder/libgpodder.py: Add pass-through function
488         "format_filesize()" to gPodderLib that combines the
489         util.format_filesize function with the gPodder-specific config option
490         * src/gpodder/util.py: Apply a modified patch from Gerrit Sangel
491         <z0idberg@gmx.de> to add support for SI units and binary prefixes to
492         format_filesize(); this makes the function standards-compliant
493         * src/gpodder/download.py: Updated to use new format_filesize
494         * src/gpodder/gui.py: Updated to use new format_filesize
495         * src/gpodder/libpodcasts.py: Updated to use new format_filesize
497 Fri, 02 Nov 2007 17:28:05 +0100 <thp@perli.net>
498 New Configuration/Settings Manager; massive code clean-ups
500         * src/gpodder/config.py: Added new Configuration Manager that
501         automatically keeps track of saving changed values and is also able to
502         watch GTK widgets for changes; this should simplify our settings
503         management and give us a single place for maintaining settings
504         * src/gpodder/download.py: Access settings from new config manager
505         * src/gpodder/gui.py: Make use of new config manager to connect
506         widgets and settings from the GUI directly to the config manager;
507         remove manual loading and saving of settings; auto-connect as much as
508         possible in the gPodderProperties dialog to get real-time automatic
509         configuration saving; fix the other code to use new config manager
510         * src/gpodder/libgpodder.py: MASSIVE code clean-up; removed lots of
511         old cruft and dead code that has been lying around in libgpodder for
512         some time now; remove configuration code; utilize config manager;
513         unify DownloadHistory+PlaybackHistory in new HistoryStore class;
514         reduce number of import statements
515         * src/gpodder/libipodsync.py: Access settings from new config manager
516         * src/gpodder/libplayers.py: Removed dotdesktop_command()
517         * src/gpodder/libpodcasts.py: Move locking functionality into this
518         module, as locking is only used here; access config from new manager
519         * src/gpodder/services.py: Use config manager to get settings
520         * src/gpodder/util.py: Add format_desktop_command() function, based on
521         the dotdesktop_command() function from libplayers
523 Fri, 02 Nov 2007 07:49:38 +0100 <thp@perli.net>
524 Add ability to open download folder from channel's context menu
526         * src/gpodder/gui.py: Add "Open download folder" menu item to channel
527         navigator context menu
528         * src/gpodder/libgpodder.py: Add open_folder() method that will open
529         the DE's default folder browser via "xdg-open"
531 Thu, 01 Nov 2007 15:29:00 +0100 <thp@perli.net>
532 Limit filename on FS-based sync to 50 characters
534         * src/gpodder/libipodsync.py: Do not allow extremely long file names
535         that could theoretically be generated by using data from RSS feeds;
536         this is needed to make FAT-based drives work with files that would
537         otherwise have file names that are too long
539 Wed, 31 Oct 2007 15:22:32 +0100 <thp@perli.net>
540 Escape RSS-provided strings in Pango markup
542         * src/gpodder/gui.py: Escape strings in Pango markup
543         * bin/gpodder: we're in development again, so "+svn"
545 Sun, 28 Oct 2007 16:27:14 +0100 <thp@perli.net>
546 gPodder 0.10.1 "Nukular, das Wort heißt Nukular" released
548         * bin/gpodder: gPodder 0.10.1 released :)
549         * doc/man/gpodder.1: gPodder 0.10.1 released :)
550         * README: gPodder 0.10.1 released :)
551         * data/messages.pot: Refreshed template from source files
552         * data/po/de.po: Updated German translation for the 0.10.1 release
553         * data/po/*.po: Refreshed translation files from template
555 Sun, 28 Oct 2007 15:25:56 +0100 <thp@perli.net>
556 Add "Save episode to file" handling to episode list context menu
558         * data/gpodder.glade: Use a stock "Save As" button for the "Copy
559         episode to file" button
560         * src/gpodder/gui.py: Add new show_copy_dialog() method to GladeWidget
561         that shows a copy dialog where a user can copy a file to a selected
562         destination (this is used for "Save episode to file"); use
563         show_copy_dialog in "Save As" in gPodderEpisode; add "Save episode to
564         folder" menu item in episode list context menu and use
565         show_copy_dialog to carry out the user interaction
567 Sun, 28 Oct 2007 13:30:40 +0100 <thp@perli.net>
568 Allow "https://" URLs for episode URLs, as we can handle these, too
570         * src/gpodder/util.py: Allow "https://" as a valid URL scheme, as we
571         can handle https URLs, thanks to Aravind Seshadri
572         <aravind@aravind.name> who initially reported this bug
574 Thu, 25 Oct 2007 14:00:01 +0200 <thp@perli.net>
575 Sync videos to the "Video Podcasts" playlist instead of the "Video" menu
577         * src/gpodder/libipodsync.py: Merged patch from Nicolas Quienot
578         <niqooo@gmail.com> to sync videos to the "Video Podcasts" menu instead
579         of the "Videos" menu, as documented on http://ipodlinux.org/ITunesDB
581 Tue, 23 Oct 2007 09:24:52 +0200 <thp@perli.net>a
582 sync_filename in podcastItem; cleanup; hide extra progressbar on transfer
584         * src/gpodder/gui.py: Use podcastItem's sync_filename(); hide the
585         unnecessary second progressbar when only syncing one channel (i.e.
586         when clicking on the "transfer" button in the main window
587         * src/gpodder/libgpodder.py: Remove unneeded lexists import and
588         warning; clean-up
589         * src/gpodder/libipodsync.py: Use podcastItem's sync_filename()
590         * src/gpodder/libpodcasts.py: Add sync_filename() to podcastItem,
591         returns the custom_sync_name or the title of the episode, based on the
592         user's configuration settings for FS-based MP3 player sync
594 Sun, 07 Oct 2007 14:38:31 +0200 <thp@perli.net>
595 Add wishlist items to TODO list from Paul and Wilfred
597         * TODO: New wishlist items, ideas and suggestions
599 Sat, 06 Oct 2007 12:39:57 +0200 <thp@perli.net>
600 Limit download progress status updates to reduce CPU load
602         * src/gpodder/download.py: Limit the amount of status updates the
603         download threads send to the DownloadStatusManager to one per second;
604         this should make gPodder less CPU-intensive with many parallel
605         downloads; thanks to Wilfred van Rooijen for reporting and testing
607 Tue, 02 Oct 2007 17:59:29 +0200 <thp@perli.net>
608 Update channel models (icons) after iPod synchronization
610         * src/gpodder/gui.py: Call update_model() on each channel after an
611         iPod sync, so we can update the played state on the available episodes
612         lists when played state was changed by the iPod sync
614 Sat, 29 Sep 2007 14:12:15 +0200 <thp@perli.net>
615 Fix loading of channel metadata (load auth data and settings)
617         * src/gpodder/libpodcasts.py: Load channel metadata when loading a
618         podcastChannel object from OPML/LocalDB. This fixes a problem with
619         authentication data being not loaded and also fixes a bug when the
620         custom-set channel title was not correctly used throughout the GUI.
621         Thanks to Nick (nikosapi) for reporting and providing a patch
623 Tue, 25 Sep 2007 22:02:19 +0200 <thp@perli.net>
624 Finally remove Desktop symlink code; several compatibility fixes
626         * src/gpodder/download.py: Prevent divide-by-zero errors when
627         calculating download speed
628         * src/gpodder/gui.py: Prevent divide-by-zero errors when calculating
629         percentage done in code for moving the downloaded items folder
630         * src/gpodder/libgpodder.py: Remove the "Symlink on Desktop" code,
631         because it's not GUI-accessible anymore and we didn't use it anyway
632         * src/gpodder/opml.py: Better local filename detection by using
633         os.path.exists() instead of .startswith('/'); this is also good for
634         cross-platform compatibility where parts don't usually start with a
635         forward slash (i.e. Win32)
637 Mon, 24 Sep 2007 00:09:44 +0200 <thp@perli.net>
638 Channel list selection bug fixes
640         * src/gpodder/gui.py: Fix some channel list-related problems and
641         annoyances, based on a patch by Nick (nikosapi)
642         * bin/gpodder: We're in development again, so "+svn"
644 Fri, 21 Sep 2007 02:07:43 +0200 <thp@perli.net>
645 gPodder 0.10.0 "Hier spricht Frank Drebin" released
647         * bin/gpodder: gPodder 0.10.0 released :)
648         * doc/man/gpodder.1: gPodder 0.10.0 released :)
649         * README: gPodder 0.10.0 released :) (and: updated dependencies)
650         * TODO: Updated TODO list (some items are done for 0.10.0 :)
652 Fri, 21 Sep 2007 02:05:10 +0200 <thp@perli.net>
653 Updated translations from Rosetta (Launchpad.net)
655         * data/po/es.po: Spanish translation by Julio Acuña
656         * data/po/pt.po: Portuguese translation by Joel Calado (completed :)
658 Fri, 21 Sep 2007 01:46:38 +0200 <thp@perli.net>
659 Fix problems with path selection in treeChannels
661         * src/gpodder/gui.py: Simple bugfix
663 Fri, 21 Sep 2007 00:32:51 +0200 <thp@perli.net>
664 Center gPodderEpisode on treeAvailable for less mouse hopping
666         * src/gpodder/gui.py: If possible, center the gPodderEpisode dialog
667         window on the treeAvailable, because that makes the position of the
668         opened dialog more predictable and easier to use (as if the
669         gPodderEpisode dialog was "inside" the treeView from which it opened)
671 Fri, 21 Sep 2007 00:07:49 +0200 <thp@perli.net>
672 Don't translate feed format string examples
674         * src/gpodder/gui.py: Don't mark format string examples as
675         translatable
677 Wed, 19 Sep 2007 17:21:09 +0200 <thp@perli.net>
678 Small bugfix for updating treeChannels when its model changes
680         * src/gpodder/gui.py: Bugfix
682 Wed, 19 Sep 2007 16:57:41 +0200 <thp@perli.net>
683 Removed channel combobox, drag'n'drop improvements + new channel cover editor
685         * data/gpodder.glade: Remove comboAvailable in gPodder (main window);
686         add download+clear button in gPodderChannel, rename some items that
687         are now used in code; make the channel navigator non-shrinkable (so
688         it is always visible, because we don't have comboAvailable anymore)
689         * src/gpodder/gui.py: Remove support for the channel combo box,
690         also known as comboAvailable; clean-up DND code and make treeChannels
691         the only DND target in the main window; remove some unnecessary
692         updating of the channel list (calls to updateComboBox);
693         Changes for the gPodderChannel dialog: Don't automatically download
694         channel cover when dialog pops up; add "Download" and "Clear" buttons
695         to the cover editor; add DND support for dropping local files or
696         images from the web browser to the cover editor (for setting custom
697         covers on channels with bad or no cover)
698         * src/gpodder/libgpodder.py: Don't abort get_image_from_url() if the
699         URL is invalid, but the image has already been downloaded (because we
700         read the downloaded image in the code when it exists, without URL)
702 Wed, 19 Sep 2007 14:23:40 +0200 <thp@perli.net>
703 Center feed update dialog on main window; scroll reset in chan.navigator
704         * src/gpodder/gui.py: Reset the current scroll position of the channel
705         navigator when re-loading the channel list; this fixes an annoyance
706         that Alistair Sutton <alistair.sutton@gmail.com> reported when dealing
707         with a HUGE channel list (more than 50 channels); also removed the
708         scroll position reset code from treeAvailable, as we already managed
709         to only edit the model instead of re-loading it every time; added code
710         to really center the feed update dialog on gPodder's main window
712 Tue, 18 Sep 2007 20:15:56 +0200 <thp@perli.net>
713 Replace wget with new gpodder.download module; User-agent support
715         * bin/gpodder: Set "gpodder.user_agent" field on startup; remove check
716         for wget, as this is not needed anymore
717         * src/gpodder/cache.py: Clean-up; remove old logging code; add support
718         for gpodder.user_agent; log info when there is an error in parsing the
719         feed, so the user knows why this feed is not cached
720         * src/gpodder/console.py: Remove DownloadPool, Use new
721         gpodder.download module for carrying out downloads, remove
722         wget_version() tester, as this is not needed anymore =)
723         * src/gpodder/download.py: Added new downloader module that uses
724         urllib and some custom classes and functions to provide the equivalent
725         functionality of the obsolete "libwget", but without the wget
726         dependency and with better accuracy (progress reporting, etc..)
727         * src/gpodder/gui.py: Utilize new gpodder.download module instead of
728         libwget
729         * src/gpodder/__init__.py: Add "user_agent" variable to the gpodder
730         module that holds the value of the "User-agent" header to send to web
731         servers when requesting OPMLs, Feeds or download data
732         * src/gpodder/opml.py: Add support for sending the User-agent header
733         * src/gpodder/services.py: Make the progress column a float column to
734         have smoother progress indicuation; add the "acquired" keyword
735         argument to s_release(); default 'speed' to a translated "Queued"
736         * src/gpodder/libwget.py: Removed
737         * doc/dev/redhat-wget-output.txt: Removed
739 Tue, 18 Sep 2007 02:30:04 +0200 <thp@perli.net>
740 Refreshed pot files and po templates; updated German translation
742         * data/messages.pot: Refreshed from current source
743         * data/po/de.po: Refreshed and updated translation
744         * data/po/*.po: Refreshed from new .pot file
746 Tue, 18 Sep 2007 02:19:19 +0200 <thp@perli.net>
747 Imported updated translations from Rosetta (Launchpad.net)
749         * data/po/it.po: Italian translation updated by FFranci72
750         * data/po/nl.po: Dutch translation updated by Roel Groeneveld
751         * data/po/pt.po: Portuguese translation updated by Joel Calado
753 Tue, 18 Sep 2007 02:14:19 +0200 <thp@perli.net>
754 Offline support for feedcache, faster startup, code simplification
756         * src/gpodder/cache.py: Add support for "offline" keyword argument
757         * src/gpodder/gui.py: Make intelligent use of "offline" keyword
758         argument when passed to load_channels(); simplify code for selecting
759         the active channel in updateComboBox()
760         * src/gpodder/libpodcasts.py: Pass-through of "offline" keyword
761         argument in all relevant function calls
763 Sat, 15 Sep 2007 16:22:28 +0200 <thp@perli.net>
764 New LocalDB using DOM (removes python-xml dependency); channel context menu
766         * bin/gpodder: Don't check for xml.sax package and modules anymore, as
767         the dependency on python-xml has been removed with this release
768         * data/gpodder.glade: Remove the "info" button for the current channel
769         * src/gpodder/gui.py: Remove localdb-related code and adopt code for
770         new LocalDB code; add context menu to channel navigator (edit/delete)
771         * src/gpodder/libipodsync.py: Don't import "liblocaldb" module
772         * src/gpodder/liblocaldb.py: Removed
773         * src/gpodder/liblocdbreader.py: Removed
774         * src/gpodder/liblocdbwriter.py: Removed
775         * src/gpodder/liblogger.py: Add "traceback" keyword argument to the
776         log() function; if "True" and in debugging mode, print traceback
777         * src/gpodder/libpodcasts.py: Merge code from old liblocaldb and
778         liblocdbreader/liblocdbwriter to this module as LocalDBWriter and
779         LocalDBReader; customize podcastChannel to new LocalDB code
780         * src/gpodder/libwget.py: Remove localdb-specific code (now obsolete)
782 Wed, 12 Sep 2007 23:07:23 +0200 <thp@perli.net>
783 Fix a bug when traversing directories with loop symlinks
785         * src/gpodder/util.py: Don't dive into subdirectories that are
786         symbolic links, this is to avoid a situation where looping symlinks
787         result in the function dead-locking in a endless recursive loop,
788         thanks to Bjørn Rasmussen <bjoernr@sensewave.com> for pointing that
789         out and providing the necessary bug report to fix this issue
791 Sun, 09 Sep 2007 18:47:20 +0200 <thp@perli.net>
792 Mark episodes as downloaded/deleted when deleting episodes
794         * src/gpodder/gui.py: Rename "Mark [...] as downloaded" to "Mark [...]
795         as deleted" and mark episodes as downloaded when removing selected
796         episodes that have not been downloaded yet, as suggested by Holger
797         Leskien <holger leskien.com>
798         * src/gpodder/libpodcasts.py: Fix problem when trying to delete
799         episodes that have not been downloaded
801 Sat, 08 Sep 2007 16:45:21 +0200 <thp@perli.net>
802 Support for customized file names in MP3 player sync code
804         * src/gpodder/gui.py: Add supporting code for reading/setting
805         configuration options for the preferences dialog and a help display
806         code that displays a guide on how to write custom sync name strings
807         * src/gpodder/libgpodder.py: New configuration options:
808         custom_sync_name (holds format string) and
809         custom_sync_name_enabled (boolean, if the above string should be used)
810         * src/gpodder/libipodsync.py: Use custom sync name format string and
811         util's object_string_formatter() function to obtain a file name for
812         the synchronized episode (or default to episode.title if disabled)
813         * src/gpodder/libpodcasts.py: Add new property methods to podcastItem:
814         basename (returns the basename of the URL, without extension) and
815         published (returns the pubDate of the episode in YYYYMMDD format)
816         * src/gpodder/util.py: New object_string_formatter() method that
817         replaces {OBJECTNAME.ATTRNAME} substrings in a string with the
818         corresponding values of passed-in keyword argument objects
819         * data/gpodder.glade: Added preferences GUI elements
821 Wed, 05 Sep 2007 10:14:09 +0200 <thp@perli.net>
822 Check for installed python-xml package on startup (hard dependency)
824         * bin/gpodder: Add dependency check for PyXML
826 Sun, 02 Sep 2007 15:01:48 +0200 <thp@perli.net>
827 Fix bug with default window title in gPodder window
829         * src/gpodder/gui.py: Always set gPodder's default_title attribute
831 Sun, 02 Sep 2007 14:33:21 +0200 <thp@perli.net>
832 Updated Russian translation from Vladimir Zemlyakov
834         * data/po/ru.po: Updated
836 Sun, 02 Sep 2007 14:23:17 +0200 <thp@perli.net>
837 More sanitizing hacks for ugly feeds we don't really like
839         * src/gpodder/libpodcasts.py: Negotiate which enclosure to select from
840         multiple enclosures, if there are more than one available; skip
841         episodes with a buggy download URL (i.e. no supported URL scheme)
842         * src/gpodder/util.py: Return "(unknown)" if file size cannot be
843         determined from the string passed to format_filesize(); return "None"
844         in file_type_by_extension() if the extension is an empty string
846 Fri, 31 Aug 2007 23:38:01 +0200 <thp@perli.net>
847 Handle enclosures (or lack thereof) better if fields are missing
849         * src/gpodder/gui.py: Remove refetch_channel_list() function, as this
850         is not called anywhere from the code (uh, how did i miss that?)
851         * src/gpodder/libpodcasts.py: Be more liberal to enclosure tags
852         without length or mime type; ignore episodes without enclosures (it's
853         not len(enclosures) == 0, but the enclosures attribute doesn't even
854         exist on entries without enclosures, so make sure to check for that
856 Fri, 31 Aug 2007 20:03:03 +0200 <thp@perli.net>
857 Use Python's webbrowser module for URL opening; channel dialog clean-up
859         * bin/gpodder: Set version to 0.9.5+svn (this is where we are now)
860         * data/gpodder.glade: Remove "cancel" button from gPodderChannel
861         * src/gpodder/gui.py: Use "webbrowser" module for URL opening instead
862         of relying on "gnome-open" to be available; remove event handler for
863         gPodderChannel's "cancel" button
865 Thu, 30 Aug 2007 21:06:28 +0200 <thp@perli.net>
866 Dependency check for python-feedparser in bin/gpodder
868         * bin/gpodder: Add dependency check and warning (with exit) if
869         python-feedparser is not installed, as python-feedparser now is a
870         dependency of gPodder
872 Thu, 30 Aug 2007 20:51:46 +0200 <thp@perli.net>
873 Support for modifying DownloadHistory and PlaybackHistory in GUI
875         * data/gpodder.glade: Added menu items in gPodder main window
876         * src/gpodder/gui.py: Add menu items to treeAvailable's context menu
877         to toggle/set downloaded and played status on selected episodes
878         * src/gpodder/libgpodder.py: Add del_item() function to
879         DownloadHistory to support removing items from the history list;
880         enhance history_mark_{played,downloaded}() functions for add/delete
882 Thu, 30 Aug 2007 20:46:48 +0200 <thp@perli.net>
883 Improved pubDate parsing; episode delete bugfix
885         * src/gpodder/libpodcasts.py: Let feedparser parse the pubDate field
886         of episodes and use new function in gpodder.util to convert the parsed
887         pubDate to a string; bugfix for remove downloaded episode by URL
888         * src/gpodder/util.py: Add updated_parsed_to_rfc2822() function that
889         converts the "updated_parsed" field from feedparser to a RFC2822
890         string
892 Thu, 30 Aug 2007 12:03:24 +0200 <thp@perli.net>
893 Remove obsolete documentation in doc/dev; cosmetic changes
895         * data/po/Makefile: Upgrade to GPLv3
896         * data/po/README: Mention i18n page on gPodder's website
897         * doc/dev/build-deps-breezy.txt: Removed
898         * doc/dev/debian.txt: Removed
899         * doc/dev/i18n.txt: Removed
900         * doc/dev/porting.txt: Removed
901         * doc/dev/svncl.sed: Upgrade to GPLv3; modify look added and removed
902         files
904 Wed, 29 Aug 2007 20:26:50 +0200 <thp@perli.net>
905 Upgrade to the GNU General Public License, Version 3
907         * bin/gpodder: Upgrade to GPLv3
908         * COPYING: Upgrade to GPLv3
909         * doc/dev/copyright_notice: Upgrade to GPLv3
910         * Makefile: Upgrade to GPLv3
911         * README: Upgrade to GPLv3
912         * setup.py: Upgrade to GPLv3
913         * src/gpodder/*.py: Upgrade to GPLv3 (except for SimpleGladeApp and
914         cache, as these are LGPL or other and do not originate from gPodder)
916 Wed, 29 Aug 2007 19:32:22 +0200 <thp@perli.net>
917 Integration changes, commit and ChangeLog migration
919         * doc/dev/svncl.sed: Use tabs instead of 8 spaces for ChangeLog edit
920         * Makefile: Make $EDITOR edit "ChangeLog" directly
922 Wed, 29 Aug 2007 19:17:36 +0200 <thp@perli.net>
923 Last batch of experimental change merges (up to svn r398)
925         * doc/dev/tepache-howto.txt: Removed
926         * doc/dev/tepache: Removed
927         * src/gpodder/gui.py.orig: Removed
928         * src/gpodder/libwget.py: Send progress = 0.0 on inital status update
929         * src/gpodder/libpodcasts.py: Try to get episode metadata from several
930         different properties of the corresponding feedparser entries; warn
931         user when we couldn't get the episode title and try to get the episode
932         title from the filename of the URL if we still have not found an
933         episode title
934         * src/gpodder/libgpodder.py: Add get_device_name() that returns a
935         "nice" representative string of the currently selected device that can
936         be used to represent the device in the GUI
937         * src/gpodder/util.py: Return "(unknown)" string when bytesize in
938         format_filesize() when the size has a negative value; make
939         get_tree_icon() catch errors and be more corrent with icon creation;
940         add get_first_line() function that extracts the first line of a string
941         * src/gpodder/libipodsync.py: Add "divx" to list of video extensions
942         * src/gpodder/services.py: DownloadStatusManager has a new observer
943         notification: "progress-detail"; add unregister() functionality for
944         observers; add request_progress_detail() function that can be used to
945         force a "progress-detail" notification to be sent out to all relevant
946         observers; remove get_url_by_iter() function as it is not needed
947         anymore
948         * src/gpodder/gui.py: Clean-up after tepache dependency removal; new
949         GladeWidget base class that subclasses SimpleGladeApp and simplifies
950         class creation for our gPodder windows; add context menu to
951         treeAvailable; re-work play_or_download() and make it return a list of
952         boolean indicators on which actions can be performed on the selected
953         items; move show_message() and show_confirmation() to GladeWidget;
954         disable editing of the URL in the channel info dialog, this simplifies
955         code and editing the URL doesn't make so much sense anyway (adding the
956         new url and removing the old does the same and is easier, code-wise);
957         add support for cancelling downloads in the available podcasts view;
958         support live status view and download cancelling in the gPodderEpisode
959         dialog window by hooking up to DownloadStatusManager as observer
960         * src/gpodder/SimpleGladeApp.py: Customize for gPodder (remove usage
961         of weakref for keyword arguments -> properties of new object)
962         * bin/gpodder: We're using a experimental development version now
963         * data/gpodder.glade: Add progress bar and associated buttons to
964         gPodderEpisode dialog
965         * MANIFEST.in: Removed gpodder.py.orig inclusion
966         * Makefile: Removed support for tepache
968 Wed, 29 Aug 2007 19:05:57 +0200 <thp@perli.net>
969 More changes from the experimental branch (up to svn r382)
971         * src/gpodder/liblocdbreader.py: Clean-up
972         * src/gpodder/libwget.py: Use "gpodder.services" instead of accepting
973         a generic download status manager as constructor parameter; remove
974         downloadStatusManager class (moved to gpodder.services)
975         * src/gpodder/console.py: More clean-ups; use get_new_episodes()
976         instead of duplicating code here; simplify the code for wget version
977         detection
978         * src/gpodder/libpodcasts.py: Improve channel/episode generation from
979         feedparser objects (with error handling); utilize download status
980         manager from "gpodder.services" instead of accepting a download status
981         manager as parameter; clean up unneeded functions and rename some
982         functions to make the code more readable; use util.get_tree_icon() for
983         compositing a nice icon; remove the "played" column from the
984         treemodel; add local_filename to treemodel
985         * src/gpodder/liblocdbwriter.py: Clean-up
986         * src/gpodder/libgpodder.py: Clean-up
987         * src/gpodder/util.py: Add torrent_filename() function that tries to 
988         extract the filename of the file a .torrent file contains; add
989         file_extension_from_url() function that returns the file extension in
990         a URL; add file_type_by_extension() that returns the type of a file
991         based on its extension; add get_tree_icon() that loads a named icon
992         and optionally adds a bullet to it (unplayed status indicator)
993         * src/gpodder/libipodsync.py: Clean-up
994         * src/gpodder/services.py: New module that currently contains the
995         improved DownloadStatusManager and a single object that servces as
996         download status manager for all parts of gpodder
997         * src/gpodder/gui.py: Only one column for status/played; use
998         "gpodder.services" for the download status manager; clean-up
999         * src/gpodder/liblocaldb.py: Clean-up
1000         * bin/gpodder: Clean-up
1001         * data/gpodder.glade: Clean-up; removed "show played column"
1002         preference in gPodderProperties dialog
1004 Wed, 29 Aug 2007 18:49:37 +0200 <thp@perli.net>
1005 First import from experimental branch (up to svn r375)
1007         * src/gpodder/librssreader.py: Removed in favor of python-feedparser
1008         * src/gpodder/libwget.py: Percentage is now a float, don't set to 0
1009         when there has been an error
1010         * src/gpodder/console.py: Use {load,save}_channels methods; code
1011         cleanup and simplification
1012         * src/gpodder/cache.py: Add python-feedcache module from Doug Hellman
1013         * src/gpodder/libpodcasts.py: Use opml and feedcache for channel list
1014         and RSS reading; use shelve for new ChannelSettings class; clean-up
1015         podcastChannel and podcastItem; better TreeModel generator for
1016         podcastChannel (try to cache the model, only updates icons, etc...);
1017         remove downloadRss method in podcastChannel; move DownloadHistory and
1018         Playbackhistory to libgpodder; new load_channels() and save_channels()
1019         functions to save/load the channel list to an OPML file
1020         * src/gpodder/libgpodder.py: BIG clean-up; remove gPodderChannelWriter
1021         and gPodderChannelReader (this is now in libpodcasts as simple
1022         functions); add DownloadHistory and PlaybackHistory from libpodcasts; 
1023         * src/gpodder/gui.py: Use new functions for channel list
1024         loading/saving; only update treemodel for treeAvailable when it's
1025         really necessary
1026         * src/gpodder/liblocaldb.py: Remove unnecessary functions that have
1027         not been used for a while (treemodel-related); use load_channels()
1028         instead of gPodderChannelReader
1031 Wed, 29 Aug 2007 18:31:16 +0200 <thp@perli.net>
1032         * ChangeLog: Older changes can be found on the gPodder website at
1033         http://gpodder.berlios.de/releases/0.9.5/ChangeLog