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