Do grayscale "pill" instead of theme-based colors (for bad themes)
[gpodder.git] / ChangeLog
blob6a6d08e9cd2b52a69395eb886052eecb946223e6
1 Tue, 04 Dec 2007 23:28:27 +0100 <thp@perli.net>
2 Do grayscale "pill" instead of theme-based colors (for bad themes)
4         * src/gpodder/draw.py: Always draw the "pill" in semi-transparent
5         black/grey shades so it will work for all GTK themes (even Ubuntu's)
7 Mon, 03 Dec 2007 21:35:56 +0100 <thp@perli.net>
8 Update channel navigator when iPod/MP3 player sync has finished
10         * src/gpodder/gui.py: Update channel navigator when iPod sync has
11         finished, so we can update the "played" status in the channel
12         navigator when this status has changed after we've synced ("on sync
13         mark played" option)
15 Mon, 03 Dec 2007 21:24:17 +0100 <thp@perli.net>
16 Add option to mark episodes as played after transfer to device
18         * data/gpodder.glade: Option added to preferences dialog
19         * src/gpodder/config.py: Add option "on_sync_mark_played"; will mark
20         an episode as played when it gets transferred to a device
21         * src/gpodder/gui.py: Glue code for GUI + gpodder.config
22         * src/gpodder/libipodsync.py: On sync, mark episode as played if the
23         user has selected the "on_sync_mark_played" option
24         * TODO: Remove implemented/integrated items
26 Sat, 01 Dec 2007 15:19:29 +0100 <thp@perli.net>
27 Fix a fatal bug with first-run that prevents channel list saving
29         * src/gpodder/util.py: Always use a file's parent directory to get the
30         free disk space and return zero free disk space when the parent
31         directory does not exist
33 Thu, 29 Nov 2007 08:53:36 +0100 <thp@perli.net>
34 Support for itpc:// URLs
36         * src/gpodder/util.py: Add support for adding "itpc://" URLs (these
37         are simply http:// URLs with a different schema, for iTunes)
39 Tue, 27 Nov 2007 22:59:26 +0100 <thp@perli.net>
40 Draw channel stats (unplayed, downloaded) on channel navigator
42         * bin/gpodder: We're in development again, so add "+svn"
43         * src/gpodder/draw.py: Added
44         * src/gpodder/gui.py: Fix import of renamed "channels_to_model";
45         re-assign new column numbers for treeChannels' data model; add
46         cell renderer for pill pixbuf and remove cell renderer for status text
47         * src/gpodder/libpodcasts.py: Add episode_is_new() function to
48         podcastChannel to check if an episode can be considered "new"; use the
49         episode_is_new function in get_new_episodes; add get_episode_stats()
50         after an idea from Paul Rudkin <paul@thegithouse.com>; re-factor
51         channels_to_model and clean out old, unused code and columns
53 Mon, 26 Nov 2007 08:57:04 +0100 <thp@perli.net>
54 gPodder 0.10.2 "Ein schweineschnauzen Sandwich, bitte!" released
56         * bin/gpodder: gPodder 0.10.2 released :)
57         * doc/man/gpodder.1: gPodder 0.10.2 released :)
58         * README: gPodder 0.10.2 released :)
60 Mon, 26 Nov 2007 08:52:49 +0100 <thp@perli.net>
61 Translation updates
63         * data/messages.pot: Refreshed from source
64         * data/po/*.po: Refreshed from messages.pot
65         * data/po/de.po: Updated German translation
67 Sun, 25 Nov 2007 11:50:46 +0100 <thp@perli.net>
68 Make sure there is enough free disk space when saving OPML channel list
70         * src/gpodder/gui.py: Notify user that there's some problem saving the
71         current channel list when save_channels() return False
72         * src/gpodder/libpodcasts.py: Pass-through the return value of
73         gpodder.opml.Exporter.write so calling code knows if saving the
74         channel list was successful or not
75         * src/gpodder/opml.py: Check free disk space before saving OPML
76         channels in Exporter.write; thanks to Jens Thiele <karme@berlios.de>
77         for reporting this bug on the Debian BTS (Closes: Debian Bug #452490)
79 Thu, 22 Nov 2007 21:52:35 +0100 <thp@perli.net>
80 Don't send Referer header when downloading episodes
82         * src/gpodder/download.py: Some podcasts now implement an
83         "anti-bandwidth-theft" code that should provide other websites from
84         not linking to the episodes; as we have sent a Referer header
85         containing the RSS feed URL, this causes problems; Referer header
86         sending is therefore disabled now
88 Sun, 18 Nov 2007 15:33:50 +0100 <thp@perli.net>
89 TODO items from Katy G. B.
91         * TODO: Updated TODO list
93 Sat, 17 Nov 2007 18:38:36 +0100 <thp@perli.net>
94 Backwards-compatibility for PyGTK less than 2.12 (for GtkTooltip)
96         * src/gpodder/gui.py: Do not hook up tooltip handlers when we are
97         using PyGTK less than 2.12 (which introduced the gtk.Tooltip API)
99 Thu, 15 Nov 2007 11:07:42 +0100 <thp@perli.net>
100 Check free disk space before copying files to iPod
102         * src/gpodder/libipodsync.py: Check if the iPod's filesystem has
103         enough free disk space before copying files over to it, as to not
104         corrupt the iTunesDB in certain situations and fail when disk is full;
105         thanks to Nicolas Quienot <niqooo@gmail.com> for the bug report
106         * src/gpodder/util.py: Add get_free_disk_space() function that
107         calculates the free (user-available) disk space on a given path
109 Wed, 14 Nov 2007 21:55:18 +0100 <thp@perli.net>
110 Add informative tooltips to channel navigator
112         * src/gpodder/gui.py: Add tooltips to channel navigator that show a
113         bigger cover image, the title, description, url and used disk space
114         * src/gpodder/libpodcasts.py: Add save_dir_size property to
115         podcastChannel that contains the disk usage of the channel's save_dir;
116         this can be manually updated by calling update_save_dir_size() and
117         will automatically be updated when the GUI code hooks into the
118         channel; also add get_cover_pixbuf() that returns a pixbuf of the
119         cover for a given size or None if there is no valid cover file
121 Wed, 14 Nov 2007 19:19:11 +0100 <thp@perli.net>
122 Slipstream code (enumerate instead of simple position tracking)
123         * src/gpodder/libipodsync.py: Use enumerate() to iterate over a list
124         of episodes instead of keeping track of the position "by hand"
126 Wed, 14 Nov 2007 19:17:51 +0100 <thp@perli.net>
127 Ignore initial window events from GtkWindow in Config
129         * src/gpodder/config.py: Add a flag to config manager to ignore window
130         events until the window has been realized; then, start taking position
131         and size updates
133 Mon, 12 Nov 2007 20:25:39 +0100 <thp@perli.net>
134 Improve caching for HTTP redirects and minor errors; cache clean-up
136         * src/gpodder/cache.py: Cache content when it comes from a HTTP
137         redirect (301, 302, 307); cache feeds even with parsing errors, so we
138         can "fill" our cache and not download on every startup
139         * src/gpodder/libpodcasts.py: Add cache clean-up code after loading
140         channels; this should keep the feedcache.db file smaller for users
141         that like to try out new channels (or have used gPodder for a while)
143 Sun, 11 Nov 2007 14:24:17 +0100 <thp@perli.net>
144 Better file extension guessing for URLs
146         * src/gpodder/util.py: Improve file_extension_from_url() by adding
147         additional checks for known good extensions and recurse into the query
148         string if it looks like an URL; this should fix compatibility problems
149         for feeds with strange URLs; should provide more reliable guessing;
150         thanks to Nicolas Quienot <niqooo@gmail.com> for the bug report
152 Fri, 09 Nov 2007 10:05:36 +0100 <thp@perli.net>
153 Fix format_filesize() usage in episodes selector and podcastItem
155         * src/gpodder/gui.py: Use the correct (config-using) format_filesize()
156         function to generate the total size string in the episode selector
157         * src/gpodder/libpodcasts.py: Use the correct (config-usig
158         format_filesize() function to generate the total size string in
159         podcastItem; thanks to Pieter De Decker <pdedecker@gmail.com> for
160         pointing that out
161         * data/gpodder.glade: Use "Preferences" instead of "Preferences..."
162         which feels a bit better in the GUI
164 Thu, 08 Nov 2007 21:25:19 +0100 <thp@perli.net>
165 Add "gPodder download folder synchronizer" scripts to repository
167         * doc/dev/gdfs/gdfs-check.py: Added
168         * doc/dev/gdfs/gdfs-init.py: Added
169         * doc/dev/gdfs/README: Added
171 Thu, 08 Nov 2007 20:01:13 +0100 <thp@perli.net>
172 The mighty episode selector dialog and some menu re-arrangements
174         * src/gpodder/gui.py: Move the "center_on_widget" keyword-based window
175         positioning code to GladeWidget to be universally usable; update
176         "Device" menu item on startup; new functions: delete_episode_list()
177         and download_episode_list() that both operate on lists of episodes;
178         add code for invoking gPodderEpisodeSelector for deleting old
179         episodes; re-work on_itemDownloadAllNew_activate to use the episode
180         selector instead of hand-crafting a message dialog text; add
181         update_item_device() function that will handle the hiding, showing and
182         renaming of the "Device" menu in the menubar; clean-up
183         gPodderProperties with callback_finished setting (now kwarg-based);
184         new, might, fancy, customizable and uber-sexy gPodderEpisodeSelector
185         that will prove to be useful in some places in our codebase: it
186         basically allows the user to select a subset of episodes from a given
187         list in a quite sophisticated way; new "delete old episodes" menu item
188         added for cleaning up gPodder's downloads
189         * src/gpodder/libpodcasts.py: Add delete_from_disk() convenience
190         method to podcastItem; other convenience properties and functions
191         needed for the new episode selector dialog: pubdate_prop,
192         get_filesize_string(), filesize_prop, get_channel_title(),
193         channel_prop, get_played_string(), played_prop
194         * data/gpodder.glade: new gPodderEpisode dialog; re-structuring of
195         gPodder's main menu to be more usable and more compact; also added the
196         Ctrl+K "Remove old episodes" menu item; also use the correct
197         "multimedia-player" icon name of a not really representative icon
199 Thu, 08 Nov 2007 12:07:30 +0100 <thp@perli.net>
200 Support syncing to FS-based MP3 players without subfolders
202         * data/gpodder.glade: Add checkbox "Create a subfolder for each
203         channel" to preferences dialog and rename some widgets
204         * src/gpodder/config.py: Add boolean "fssync_channel_subfolders"
205         option that defaults to True (create subfolder for each channel)
206         * src/gpodder/gui.py: Hook up config option fssync_channel_subfolders
207         to preferences dialog; do more intelligent widget hiding for the
208         "Player" tab in the preferences dialog (only show relevant widgets)
209         * src/gpodder/libipodsync.py: Only append channel name as subfolder to
210         destination folder name when the "fssync_channel_subfolders" option is
211         True; suggested by Paul Elliot <omahns.home@gmail.com>
213 Thu, 08 Nov 2007 11:28:17 +0100 <thp@perli.net>
214 Fix offline cache behaviour when time is not set
216         * src/gpodder/cache.py: Return cached_content in offline mode when
217         cached_content "is not None" (instead of cached_time "is not None")
219 Tue, 06 Nov 2007 12:37:41 +0100 <thp@perli.net>
220 Process events before connecting Config to gtk windows
222         * data/gpodder.glade: Remove default size for main gPodder window, as
223         this is now handled by the config manager
224         * src/gpodder/config.py: Process GTK events in the event queue before
225         connecting to the "configure-event" signal, so we won't get two
226         configure events for the window for the initial size change
228 Mon, 05 Nov 2007 13:51:26 +0100 <thp@perli.net>
229 Add error reporting when download fails because of an I/O error
231         * src/gpodder/download.py: Catch and handle I/O errors in
232         DownloadThread and format and pass on messages to GUI code when
233         required; thanks to Florian Richter <Florian_Richter@gmx.de> for
234         suggesting this feature after having a full disk
235         * src/gpodder/gui.py: Update tree view when adding a new episode;
236         add new notification() method and pass this method through to
237         DownloadThread, so it can present messages to the user (i.e. errors)
239 Mon, 05 Nov 2007 12:54:35 +0100 <thp@perli.net>
240 Use util.find_command in more places (mplayer detection, ...)
242         * src/gpodder/libgpodder.py: Use util.find_command to detect the
243         existence of the "gnome-btdownload" command and spit out a warning log
244         message when the command is not available
245         * src/gpodder/libipodsync.py: Use util.find_command to check for an
246         installed mplayer binary (instead of relying on os.system("which...")
248 Mon, 05 Nov 2007 01:12:15 +0100 <thp@perli.net>
249 Better command detection for the converter library
251         * src/gpodder/libconverter.py: Detect existence of commands before
252         invoking them for converting files; based on a patch by
253         Nick (nikosapi.org); ConverterCollection is now a dict itself :)
254         * src/gpodder/util.py: Add new find_command() function that will
255         search the system's PATH for a specific executable command
257 Mon, 05 Nov 2007 00:21:39 +0100 <thp@perli.net>
258 Remove extracted cover art when deleting episode files
260         * src/gpodder/util.py: Apply modified version of a patch from
261         Nick (nikosapi.org) that is better suited for deleting cover art that
262         has been extracted with the new eyeD3 cover art extraction code
264 Mon, 05 Nov 2007 00:17:12 +0100 <thp@perli.net>
265 Patch from Nick (nikosapi) to support eyeD3 cover art extraction
267         * src/gpodder/libipodsync.py: Apply modified version of a patch from
268         Nick (nikosapi.org) to utilize eyeD3 for cover art extraction in iPod
269         sync code; remove dependency on PyID3
270         * README: PyID3 is not a dependency anymore, as we can now use eyeD3
271         for the same purpose (cover art extraction)
273 Sat, 03 Nov 2007 14:14:09 +0100 <thp@perli.net>
274 Fix format_filesize() function to be standards-conformant (unit prefixes)
276         * src/gpodder/config.py: Add "use_si_units" configuration option; if
277         True, the user will see SI units (MB, kB, ...); if False (the
278         default); the user will see binary-prefix units (MiB, KiB, ..)
279         * src/gpodder/libgpodder.py: Add pass-through function
280         "format_filesize()" to gPodderLib that combines the
281         util.format_filesize function with the gPodder-specific config option
282         * src/gpodder/util.py: Apply a modified patch from Gerrit Sangel
283         <z0idberg@gmx.de> to add support for SI units and binary prefixes to
284         format_filesize(); this makes the function standards-compliant
285         * src/gpodder/download.py: Updated to use new format_filesize
286         * src/gpodder/gui.py: Updated to use new format_filesize
287         * src/gpodder/libpodcasts.py: Updated to use new format_filesize
289 Fri, 02 Nov 2007 17:28:05 +0100 <thp@perli.net>
290 New Configuration/Settings Manager; massive code clean-ups
292         * src/gpodder/config.py: Added new Configuration Manager that
293         automatically keeps track of saving changed values and is also able to
294         watch GTK widgets for changes; this should simplify our settings
295         management and give us a single place for maintaining settings
296         * src/gpodder/download.py: Access settings from new config manager
297         * src/gpodder/gui.py: Make use of new config manager to connect
298         widgets and settings from the GUI directly to the config manager;
299         remove manual loading and saving of settings; auto-connect as much as
300         possible in the gPodderProperties dialog to get real-time automatic
301         configuration saving; fix the other code to use new config manager
302         * src/gpodder/libgpodder.py: MASSIVE code clean-up; removed lots of
303         old cruft and dead code that has been lying around in libgpodder for
304         some time now; remove configuration code; utilize config manager;
305         unify DownloadHistory+PlaybackHistory in new HistoryStore class;
306         reduce number of import statements
307         * src/gpodder/libipodsync.py: Access settings from new config manager
308         * src/gpodder/libplayers.py: Removed dotdesktop_command()
309         * src/gpodder/libpodcasts.py: Move locking functionality into this
310         module, as locking is only used here; access config from new manager
311         * src/gpodder/services.py: Use config manager to get settings
312         * src/gpodder/util.py: Add format_desktop_command() function, based on
313         the dotdesktop_command() function from libplayers
315 Fri, 02 Nov 2007 07:49:38 +0100 <thp@perli.net>
316 Add ability to open download folder from channel's context menu
318         * src/gpodder/gui.py: Add "Open download folder" menu item to channel
319         navigator context menu
320         * src/gpodder/libgpodder.py: Add open_folder() method that will open
321         the DE's default folder browser via "xdg-open"
323 Thu, 01 Nov 2007 15:29:00 +0100 <thp@perli.net>
324 Limit filename on FS-based sync to 50 characters
326         * src/gpodder/libipodsync.py: Do not allow extremely long file names
327         that could theoretically be generated by using data from RSS feeds;
328         this is needed to make FAT-based drives work with files that would
329         otherwise have file names that are too long
331 Wed, 31 Oct 2007 15:22:32 +0100 <thp@perli.net>
332 Escape RSS-provided strings in Pango markup
334         * src/gpodder/gui.py: Escape strings in Pango markup
335         * bin/gpodder: we're in development again, so "+svn"
337 Sun, 28 Oct 2007 16:27:14 +0100 <thp@perli.net>
338 gPodder 0.10.1 "Nukular, das Wort heißt Nukular" released
340         * bin/gpodder: gPodder 0.10.1 released :)
341         * doc/man/gpodder.1: gPodder 0.10.1 released :)
342         * README: gPodder 0.10.1 released :)
343         * data/messages.pot: Refreshed template from source files
344         * data/po/de.po: Updated German translation for the 0.10.1 release
345         * data/po/*.po: Refreshed translation files from template
347 Sun, 28 Oct 2007 15:25:56 +0100 <thp@perli.net>
348 Add "Save episode to file" handling to episode list context menu
350         * data/gpodder.glade: Use a stock "Save As" button for the "Copy
351         episode to file" button
352         * src/gpodder/gui.py: Add new show_copy_dialog() method to GladeWidget
353         that shows a copy dialog where a user can copy a file to a selected
354         destination (this is used for "Save episode to file"); use
355         show_copy_dialog in "Save As" in gPodderEpisode; add "Save episode to
356         folder" menu item in episode list context menu and use
357         show_copy_dialog to carry out the user interaction
359 Sun, 28 Oct 2007 13:30:40 +0100 <thp@perli.net>
360 Allow "https://" URLs for episode URLs, as we can handle these, too
362         * src/gpodder/util.py: Allow "https://" as a valid URL scheme, as we
363         can handle https URLs, thanks to Aravind Seshadri
364         <aravind@aravind.name> who initially reported this bug
366 Thu, 25 Oct 2007 14:00:01 +0200 <thp@perli.net>
367 Sync videos to the "Video Podcasts" playlist instead of the "Video" menu
369         * src/gpodder/libipodsync.py: Merged patch from Nicolas Quienot
370         <niqooo@gmail.com> to sync videos to the "Video Podcasts" menu instead
371         of the "Videos" menu, as documented on http://ipodlinux.org/ITunesDB
373 Tue, 23 Oct 2007 09:24:52 +0200 <thp@perli.net>a
374 sync_filename in podcastItem; cleanup; hide extra progressbar on transfer
376         * src/gpodder/gui.py: Use podcastItem's sync_filename(); hide the
377         unnecessary second progressbar when only syncing one channel (i.e.
378         when clicking on the "transfer" button in the main window
379         * src/gpodder/libgpodder.py: Remove unneeded lexists import and
380         warning; clean-up
381         * src/gpodder/libipodsync.py: Use podcastItem's sync_filename()
382         * src/gpodder/libpodcasts.py: Add sync_filename() to podcastItem,
383         returns the custom_sync_name or the title of the episode, based on the
384         user's configuration settings for FS-based MP3 player sync
386 Sun, 07 Oct 2007 14:38:31 +0200 <thp@perli.net>
387 Add wishlist items to TODO list from Paul and Wilfred
389         * TODO: New wishlist items, ideas and suggestions
391 Sat, 06 Oct 2007 12:39:57 +0200 <thp@perli.net>
392 Limit download progress status updates to reduce CPU load
394         * src/gpodder/download.py: Limit the amount of status updates the
395         download threads send to the DownloadStatusManager to one per second;
396         this should make gPodder less CPU-intensive with many parallel
397         downloads; thanks to Wilfred van Rooijen for reporting and testing
399 Tue, 02 Oct 2007 17:59:29 +0200 <thp@perli.net>
400 Update channel models (icons) after iPod synchronization
402         * src/gpodder/gui.py: Call update_model() on each channel after an
403         iPod sync, so we can update the played state on the available episodes
404         lists when played state was changed by the iPod sync
406 Sat, 29 Sep 2007 14:12:15 +0200 <thp@perli.net>
407 Fix loading of channel metadata (load auth data and settings)
409         * src/gpodder/libpodcasts.py: Load channel metadata when loading a
410         podcastChannel object from OPML/LocalDB. This fixes a problem with
411         authentication data being not loaded and also fixes a bug when the
412         custom-set channel title was not correctly used throughout the GUI.
413         Thanks to Nick (nikosapi) for reporting and providing a patch
415 Tue, 25 Sep 2007 22:02:19 +0200 <thp@perli.net>
416 Finally remove Desktop symlink code; several compatibility fixes
418         * src/gpodder/download.py: Prevent divide-by-zero errors when
419         calculating download speed
420         * src/gpodder/gui.py: Prevent divide-by-zero errors when calculating
421         percentage done in code for moving the downloaded items folder
422         * src/gpodder/libgpodder.py: Remove the "Symlink on Desktop" code,
423         because it's not GUI-accessible anymore and we didn't use it anyway
424         * src/gpodder/opml.py: Better local filename detection by using
425         os.path.exists() instead of .startswith('/'); this is also good for
426         cross-platform compatibility where parts don't usually start with a
427         forward slash (i.e. Win32)
429 Mon, 24 Sep 2007 00:09:44 +0200 <thp@perli.net>
430 Channel list selection bug fixes
432         * src/gpodder/gui.py: Fix some channel list-related problems and
433         annoyances, based on a patch by Nick (nikosapi)
434         * bin/gpodder: We're in development again, so "+svn"
436 Fri, 21 Sep 2007 02:07:43 +0200 <thp@perli.net>
437 gPodder 0.10.0 "Hier spricht Frank Drebin" released
439         * bin/gpodder: gPodder 0.10.0 released :)
440         * doc/man/gpodder.1: gPodder 0.10.0 released :)
441         * README: gPodder 0.10.0 released :) (and: updated dependencies)
442         * TODO: Updated TODO list (some items are done for 0.10.0 :)
444 Fri, 21 Sep 2007 02:05:10 +0200 <thp@perli.net>
445 Updated translations from Rosetta (Launchpad.net)
447         * data/po/es.po: Spanish translation by Julio Acuña
448         * data/po/pt.po: Portuguese translation by Joel Calado (completed :)
450 Fri, 21 Sep 2007 01:46:38 +0200 <thp@perli.net>
451 Fix problems with path selection in treeChannels
453         * src/gpodder/gui.py: Simple bugfix
455 Fri, 21 Sep 2007 00:32:51 +0200 <thp@perli.net>
456 Center gPodderEpisode on treeAvailable for less mouse hopping
458         * src/gpodder/gui.py: If possible, center the gPodderEpisode dialog
459         window on the treeAvailable, because that makes the position of the
460         opened dialog more predictable and easier to use (as if the
461         gPodderEpisode dialog was "inside" the treeView from which it opened)
463 Fri, 21 Sep 2007 00:07:49 +0200 <thp@perli.net>
464 Don't translate feed format string examples
466         * src/gpodder/gui.py: Don't mark format string examples as
467         translatable
469 Wed, 19 Sep 2007 17:21:09 +0200 <thp@perli.net>
470 Small bugfix for updating treeChannels when its model changes
472         * src/gpodder/gui.py: Bugfix
474 Wed, 19 Sep 2007 16:57:41 +0200 <thp@perli.net>
475 Removed channel combobox, drag'n'drop improvements + new channel cover editor
477         * data/gpodder.glade: Remove comboAvailable in gPodder (main window);
478         add download+clear button in gPodderChannel, rename some items that
479         are now used in code; make the channel navigator non-shrinkable (so
480         it is always visible, because we don't have comboAvailable anymore)
481         * src/gpodder/gui.py: Remove support for the channel combo box,
482         also known as comboAvailable; clean-up DND code and make treeChannels
483         the only DND target in the main window; remove some unnecessary
484         updating of the channel list (calls to updateComboBox);
485         Changes for the gPodderChannel dialog: Don't automatically download
486         channel cover when dialog pops up; add "Download" and "Clear" buttons
487         to the cover editor; add DND support for dropping local files or
488         images from the web browser to the cover editor (for setting custom
489         covers on channels with bad or no cover)
490         * src/gpodder/libgpodder.py: Don't abort get_image_from_url() if the
491         URL is invalid, but the image has already been downloaded (because we
492         read the downloaded image in the code when it exists, without URL)
494 Wed, 19 Sep 2007 14:23:40 +0200 <thp@perli.net>
495 Center feed update dialog on main window; scroll reset in chan.navigator
496         * src/gpodder/gui.py: Reset the current scroll position of the channel
497         navigator when re-loading the channel list; this fixes an annoyance
498         that Alistair Sutton <alistair.sutton@gmail.com> reported when dealing
499         with a HUGE channel list (more than 50 channels); also removed the
500         scroll position reset code from treeAvailable, as we already managed
501         to only edit the model instead of re-loading it every time; added code
502         to really center the feed update dialog on gPodder's main window
504 Tue, 18 Sep 2007 20:15:56 +0200 <thp@perli.net>
505 Replace wget with new gpodder.download module; User-agent support
507         * bin/gpodder: Set "gpodder.user_agent" field on startup; remove check
508         for wget, as this is not needed anymore
509         * src/gpodder/cache.py: Clean-up; remove old logging code; add support
510         for gpodder.user_agent; log info when there is an error in parsing the
511         feed, so the user knows why this feed is not cached
512         * src/gpodder/console.py: Remove DownloadPool, Use new
513         gpodder.download module for carrying out downloads, remove
514         wget_version() tester, as this is not needed anymore =)
515         * src/gpodder/download.py: Added new downloader module that uses
516         urllib and some custom classes and functions to provide the equivalent
517         functionality of the obsolete "libwget", but without the wget
518         dependency and with better accuracy (progress reporting, etc..)
519         * src/gpodder/gui.py: Utilize new gpodder.download module instead of
520         libwget
521         * src/gpodder/__init__.py: Add "user_agent" variable to the gpodder
522         module that holds the value of the "User-agent" header to send to web
523         servers when requesting OPMLs, Feeds or download data
524         * src/gpodder/opml.py: Add support for sending the User-agent header
525         * src/gpodder/services.py: Make the progress column a float column to
526         have smoother progress indicuation; add the "acquired" keyword
527         argument to s_release(); default 'speed' to a translated "Queued"
528         * src/gpodder/libwget.py: Removed
529         * doc/dev/redhat-wget-output.txt: Removed
531 Tue, 18 Sep 2007 02:30:04 +0200 <thp@perli.net>
532 Refreshed pot files and po templates; updated German translation
534         * data/messages.pot: Refreshed from current source
535         * data/po/de.po: Refreshed and updated translation
536         * data/po/*.po: Refreshed from new .pot file
538 Tue, 18 Sep 2007 02:19:19 +0200 <thp@perli.net>
539 Imported updated translations from Rosetta (Launchpad.net)
541         * data/po/it.po: Italian translation updated by FFranci72
542         * data/po/nl.po: Dutch translation updated by Roel Groeneveld
543         * data/po/pt.po: Portuguese translation updated by Joel Calado
545 Tue, 18 Sep 2007 02:14:19 +0200 <thp@perli.net>
546 Offline support for feedcache, faster startup, code simplification
548         * src/gpodder/cache.py: Add support for "offline" keyword argument
549         * src/gpodder/gui.py: Make intelligent use of "offline" keyword
550         argument when passed to load_channels(); simplify code for selecting
551         the active channel in updateComboBox()
552         * src/gpodder/libpodcasts.py: Pass-through of "offline" keyword
553         argument in all relevant function calls
555 Sat, 15 Sep 2007 16:22:28 +0200 <thp@perli.net>
556 New LocalDB using DOM (removes python-xml dependency); channel context menu
558         * bin/gpodder: Don't check for xml.sax package and modules anymore, as
559         the dependency on python-xml has been removed with this release
560         * data/gpodder.glade: Remove the "info" button for the current channel
561         * src/gpodder/gui.py: Remove localdb-related code and adopt code for
562         new LocalDB code; add context menu to channel navigator (edit/delete)
563         * src/gpodder/libipodsync.py: Don't import "liblocaldb" module
564         * src/gpodder/liblocaldb.py: Removed
565         * src/gpodder/liblocdbreader.py: Removed
566         * src/gpodder/liblocdbwriter.py: Removed
567         * src/gpodder/liblogger.py: Add "traceback" keyword argument to the
568         log() function; if "True" and in debugging mode, print traceback
569         * src/gpodder/libpodcasts.py: Merge code from old liblocaldb and
570         liblocdbreader/liblocdbwriter to this module as LocalDBWriter and
571         LocalDBReader; customize podcastChannel to new LocalDB code
572         * src/gpodder/libwget.py: Remove localdb-specific code (now obsolete)
574 Wed, 12 Sep 2007 23:07:23 +0200 <thp@perli.net>
575 Fix a bug when traversing directories with loop symlinks
577         * src/gpodder/util.py: Don't dive into subdirectories that are
578         symbolic links, this is to avoid a situation where looping symlinks
579         result in the function dead-locking in a endless recursive loop,
580         thanks to Bjørn Rasmussen <bjoernr@sensewave.com> for pointing that
581         out and providing the necessary bug report to fix this issue
583 Sun, 09 Sep 2007 18:47:20 +0200 <thp@perli.net>
584 Mark episodes as downloaded/deleted when deleting episodes
586         * src/gpodder/gui.py: Rename "Mark [...] as downloaded" to "Mark [...]
587         as deleted" and mark episodes as downloaded when removing selected
588         episodes that have not been downloaded yet, as suggested by Holger
589         Leskien <holger leskien.com>
590         * src/gpodder/libpodcasts.py: Fix problem when trying to delete
591         episodes that have not been downloaded
593 Sat, 08 Sep 2007 16:45:21 +0200 <thp@perli.net>
594 Support for customized file names in MP3 player sync code
596         * src/gpodder/gui.py: Add supporting code for reading/setting
597         configuration options for the preferences dialog and a help display
598         code that displays a guide on how to write custom sync name strings
599         * src/gpodder/libgpodder.py: New configuration options:
600         custom_sync_name (holds format string) and
601         custom_sync_name_enabled (boolean, if the above string should be used)
602         * src/gpodder/libipodsync.py: Use custom sync name format string and
603         util's object_string_formatter() function to obtain a file name for
604         the synchronized episode (or default to episode.title if disabled)
605         * src/gpodder/libpodcasts.py: Add new property methods to podcastItem:
606         basename (returns the basename of the URL, without extension) and
607         published (returns the pubDate of the episode in YYYYMMDD format)
608         * src/gpodder/util.py: New object_string_formatter() method that
609         replaces {OBJECTNAME.ATTRNAME} substrings in a string with the
610         corresponding values of passed-in keyword argument objects
611         * data/gpodder.glade: Added preferences GUI elements
613 Wed, 05 Sep 2007 10:14:09 +0200 <thp@perli.net>
614 Check for installed python-xml package on startup (hard dependency)
616         * bin/gpodder: Add dependency check for PyXML
618 Sun, 02 Sep 2007 15:01:48 +0200 <thp@perli.net>
619 Fix bug with default window title in gPodder window
621         * src/gpodder/gui.py: Always set gPodder's default_title attribute
623 Sun, 02 Sep 2007 14:33:21 +0200 <thp@perli.net>
624 Updated Russian translation from Vladimir Zemlyakov
626         * data/po/ru.po: Updated
628 Sun, 02 Sep 2007 14:23:17 +0200 <thp@perli.net>
629 More sanitizing hacks for ugly feeds we don't really like
631         * src/gpodder/libpodcasts.py: Negotiate which enclosure to select from
632         multiple enclosures, if there are more than one available; skip
633         episodes with a buggy download URL (i.e. no supported URL scheme)
634         * src/gpodder/util.py: Return "(unknown)" if file size cannot be
635         determined from the string passed to format_filesize(); return "None"
636         in file_type_by_extension() if the extension is an empty string
638 Fri, 31 Aug 2007 23:38:01 +0200 <thp@perli.net>
639 Handle enclosures (or lack thereof) better if fields are missing
641         * src/gpodder/gui.py: Remove refetch_channel_list() function, as this
642         is not called anywhere from the code (uh, how did i miss that?)
643         * src/gpodder/libpodcasts.py: Be more liberal to enclosure tags
644         without length or mime type; ignore episodes without enclosures (it's
645         not len(enclosures) == 0, but the enclosures attribute doesn't even
646         exist on entries without enclosures, so make sure to check for that
648 Fri, 31 Aug 2007 20:03:03 +0200 <thp@perli.net>
649 Use Python's webbrowser module for URL opening; channel dialog clean-up
651         * bin/gpodder: Set version to 0.9.5+svn (this is where we are now)
652         * data/gpodder.glade: Remove "cancel" button from gPodderChannel
653         * src/gpodder/gui.py: Use "webbrowser" module for URL opening instead
654         of relying on "gnome-open" to be available; remove event handler for
655         gPodderChannel's "cancel" button
657 Thu, 30 Aug 2007 21:06:28 +0200 <thp@perli.net>
658 Dependency check for python-feedparser in bin/gpodder
660         * bin/gpodder: Add dependency check and warning (with exit) if
661         python-feedparser is not installed, as python-feedparser now is a
662         dependency of gPodder
664 Thu, 30 Aug 2007 20:51:46 +0200 <thp@perli.net>
665 Support for modifying DownloadHistory and PlaybackHistory in GUI
667         * data/gpodder.glade: Added menu items in gPodder main window
668         * src/gpodder/gui.py: Add menu items to treeAvailable's context menu
669         to toggle/set downloaded and played status on selected episodes
670         * src/gpodder/libgpodder.py: Add del_item() function to
671         DownloadHistory to support removing items from the history list;
672         enhance history_mark_{played,downloaded}() functions for add/delete
674 Thu, 30 Aug 2007 20:46:48 +0200 <thp@perli.net>
675 Improved pubDate parsing; episode delete bugfix
677         * src/gpodder/libpodcasts.py: Let feedparser parse the pubDate field
678         of episodes and use new function in gpodder.util to convert the parsed
679         pubDate to a string; bugfix for remove downloaded episode by URL
680         * src/gpodder/util.py: Add updated_parsed_to_rfc2822() function that
681         converts the "updated_parsed" field from feedparser to a RFC2822
682         string
684 Thu, 30 Aug 2007 12:03:24 +0200 <thp@perli.net>
685 Remove obsolete documentation in doc/dev; cosmetic changes
687         * data/po/Makefile: Upgrade to GPLv3
688         * data/po/README: Mention i18n page on gPodder's website
689         * doc/dev/build-deps-breezy.txt: Removed
690         * doc/dev/debian.txt: Removed
691         * doc/dev/i18n.txt: Removed
692         * doc/dev/porting.txt: Removed
693         * doc/dev/svncl.sed: Upgrade to GPLv3; modify look added and removed
694         files
696 Wed, 29 Aug 2007 20:26:50 +0200 <thp@perli.net>
697 Upgrade to the GNU General Public License, Version 3
699         * bin/gpodder: Upgrade to GPLv3
700         * COPYING: Upgrade to GPLv3
701         * doc/dev/copyright_notice: Upgrade to GPLv3
702         * Makefile: Upgrade to GPLv3
703         * README: Upgrade to GPLv3
704         * setup.py: Upgrade to GPLv3
705         * src/gpodder/*.py: Upgrade to GPLv3 (except for SimpleGladeApp and
706         cache, as these are LGPL or other and do not originate from gPodder)
708 Wed, 29 Aug 2007 19:32:22 +0200 <thp@perli.net>
709 Integration changes, commit and ChangeLog migration
711         * doc/dev/svncl.sed: Use tabs instead of 8 spaces for ChangeLog edit
712         * Makefile: Make $EDITOR edit "ChangeLog" directly
714 Wed, 29 Aug 2007 19:17:36 +0200 <thp@perli.net>
715 Last batch of experimental change merges (up to svn r398)
717         * doc/dev/tepache-howto.txt: Removed
718         * doc/dev/tepache: Removed
719         * src/gpodder/gui.py.orig: Removed
720         * src/gpodder/libwget.py: Send progress = 0.0 on inital status update
721         * src/gpodder/libpodcasts.py: Try to get episode metadata from several
722         different properties of the corresponding feedparser entries; warn
723         user when we couldn't get the episode title and try to get the episode
724         title from the filename of the URL if we still have not found an
725         episode title
726         * src/gpodder/libgpodder.py: Add get_device_name() that returns a
727         "nice" representative string of the currently selected device that can
728         be used to represent the device in the GUI
729         * src/gpodder/util.py: Return "(unknown)" string when bytesize in
730         format_filesize() when the size has a negative value; make
731         get_tree_icon() catch errors and be more corrent with icon creation;
732         add get_first_line() function that extracts the first line of a string
733         * src/gpodder/libipodsync.py: Add "divx" to list of video extensions
734         * src/gpodder/services.py: DownloadStatusManager has a new observer
735         notification: "progress-detail"; add unregister() functionality for
736         observers; add request_progress_detail() function that can be used to
737         force a "progress-detail" notification to be sent out to all relevant
738         observers; remove get_url_by_iter() function as it is not needed
739         anymore
740         * src/gpodder/gui.py: Clean-up after tepache dependency removal; new
741         GladeWidget base class that subclasses SimpleGladeApp and simplifies
742         class creation for our gPodder windows; add context menu to
743         treeAvailable; re-work play_or_download() and make it return a list of
744         boolean indicators on which actions can be performed on the selected
745         items; move show_message() and show_confirmation() to GladeWidget;
746         disable editing of the URL in the channel info dialog, this simplifies
747         code and editing the URL doesn't make so much sense anyway (adding the
748         new url and removing the old does the same and is easier, code-wise);
749         add support for cancelling downloads in the available podcasts view;
750         support live status view and download cancelling in the gPodderEpisode
751         dialog window by hooking up to DownloadStatusManager as observer
752         * src/gpodder/SimpleGladeApp.py: Customize for gPodder (remove usage
753         of weakref for keyword arguments -> properties of new object)
754         * bin/gpodder: We're using a experimental development version now
755         * data/gpodder.glade: Add progress bar and associated buttons to
756         gPodderEpisode dialog
757         * MANIFEST.in: Removed gpodder.py.orig inclusion
758         * Makefile: Removed support for tepache
760 Wed, 29 Aug 2007 19:05:57 +0200 <thp@perli.net>
761 More changes from the experimental branch (up to svn r382)
763         * src/gpodder/liblocdbreader.py: Clean-up
764         * src/gpodder/libwget.py: Use "gpodder.services" instead of accepting
765         a generic download status manager as constructor parameter; remove
766         downloadStatusManager class (moved to gpodder.services)
767         * src/gpodder/console.py: More clean-ups; use get_new_episodes()
768         instead of duplicating code here; simplify the code for wget version
769         detection
770         * src/gpodder/libpodcasts.py: Improve channel/episode generation from
771         feedparser objects (with error handling); utilize download status
772         manager from "gpodder.services" instead of accepting a download status
773         manager as parameter; clean up unneeded functions and rename some
774         functions to make the code more readable; use util.get_tree_icon() for
775         compositing a nice icon; remove the "played" column from the
776         treemodel; add local_filename to treemodel
777         * src/gpodder/liblocdbwriter.py: Clean-up
778         * src/gpodder/libgpodder.py: Clean-up
779         * src/gpodder/util.py: Add torrent_filename() function that tries to 
780         extract the filename of the file a .torrent file contains; add
781         file_extension_from_url() function that returns the file extension in
782         a URL; add file_type_by_extension() that returns the type of a file
783         based on its extension; add get_tree_icon() that loads a named icon
784         and optionally adds a bullet to it (unplayed status indicator)
785         * src/gpodder/libipodsync.py: Clean-up
786         * src/gpodder/services.py: New module that currently contains the
787         improved DownloadStatusManager and a single object that servces as
788         download status manager for all parts of gpodder
789         * src/gpodder/gui.py: Only one column for status/played; use
790         "gpodder.services" for the download status manager; clean-up
791         * src/gpodder/liblocaldb.py: Clean-up
792         * bin/gpodder: Clean-up
793         * data/gpodder.glade: Clean-up; removed "show played column"
794         preference in gPodderProperties dialog
796 Wed, 29 Aug 2007 18:49:37 +0200 <thp@perli.net>
797 First import from experimental branch (up to svn r375)
799         * src/gpodder/librssreader.py: Removed in favor of python-feedparser
800         * src/gpodder/libwget.py: Percentage is now a float, don't set to 0
801         when there has been an error
802         * src/gpodder/console.py: Use {load,save}_channels methods; code
803         cleanup and simplification
804         * src/gpodder/cache.py: Add python-feedcache module from Doug Hellman
805         * src/gpodder/libpodcasts.py: Use opml and feedcache for channel list
806         and RSS reading; use shelve for new ChannelSettings class; clean-up
807         podcastChannel and podcastItem; better TreeModel generator for
808         podcastChannel (try to cache the model, only updates icons, etc...);
809         remove downloadRss method in podcastChannel; move DownloadHistory and
810         Playbackhistory to libgpodder; new load_channels() and save_channels()
811         functions to save/load the channel list to an OPML file
812         * src/gpodder/libgpodder.py: BIG clean-up; remove gPodderChannelWriter
813         and gPodderChannelReader (this is now in libpodcasts as simple
814         functions); add DownloadHistory and PlaybackHistory from libpodcasts; 
815         * src/gpodder/gui.py: Use new functions for channel list
816         loading/saving; only update treemodel for treeAvailable when it's
817         really necessary
818         * src/gpodder/liblocaldb.py: Remove unnecessary functions that have
819         not been used for a while (treemodel-related); use load_channels()
820         instead of gPodderChannelReader
823 Wed, 29 Aug 2007 18:31:16 +0200 <thp@perli.net>
824         * ChangeLog: Older changes can be found on the gPodder website at
825         http://gpodder.berlios.de/releases/0.9.5/ChangeLog