Thu, 13 Dec 2007 08:32:54 +0100 gPodder 0.10.3 "A Stop at Willoughby" released * bin/gpodder: gPodder 0.10.3 released :) * README: gPodder 0.10.3 released :) * doc/man/gpodder.1: gPodder 0.10.3 released :) * data/messages.pot: Updated from source * data/po/de.po: Updated German translation * data/po/*.po: Updated from messages.pot Thu, 13 Dec 2007 08:02:29 +0100 Link the gPodder Documentation Wiki from the help pages * data/gpodder.glade: Help menu: gPodder Homepage (instead of website) and Documentation Wiki (instead of Mailing list) * src/gpodder/gui.py: Open gPodder Wiki instead of mailing list page Wed, 12 Dec 2007 21:39:03 +0100 Remove TODO file from MANIFEST.in * MANIFEST.in: Of course we have to remove non-existing files from the MANIFEST.in file, too.. so TODO is now finally gone :) Wed, 12 Dec 2007 21:30:00 +0100 Manage TODO list on the gPodder Wiki * TODO: Removed; new location: http://gpodderwiki.jottit.com/todo Wed, 12 Dec 2007 20:55:00 +0100 Configuration for "old" episodes; automatically remove old episodes * src/gpodder/config.py: New boolean auto_remove_old_episodes configuration option that defaults to False (remove on startup) * src/gpodder/gui.py: Add code to automatically remove old, unplayed episodes on startup if the specific configuration options have been set; connect config manager to GUI items for the preferences dialog * data/gpodder.glade: Add checkbox for automatically removing old, unplayed episodes from gPodder on startup and a spinbutton to set the amount of days after which an episode is considered "old" Wed, 12 Dec 2007 19:44:15 +0100 Merged episode locking patch from Paul Rudkin * src/gpodder/gui.py: Merged "lock episodes" patch to mark episodes as locked, patch by Paul Rudkin * data/gpodder.glade: Add menu item for toggle locked status * src/gpodder/libgpodder.py: Add "locked" history * src/gpodder/libpodcasts.py: When requesting a status icon, also draw the "Locked" status; is_locked() in podcastItem * src/gpodder/util.py: Added code for drawing a padlock icon on top of another (file type) icon; this is used for the "lock episodes" feature Tue, 11 Dec 2007 22:10:03 +0100 Updated TODO list * TODO: Updated TODO list Mon, 10 Dec 2007 09:42:06 +0100 Move observer code out of DownloadStatusManager into ObservableService * src/gpodder/services.py: Move out all observer-related code like registration, unregistration and notification to a new ObservableService class; subclass ObservableService in DownloadStatusManager; this makes the observer code in DownloadStatusManager re-usable (will be needed for new sync code) Mon, 10 Dec 2007 09:33:26 +0100 Selective iPod episode clean-up; "delete older than X days" * src/gpodder/config.py: Add episode_old_age configuration variable; is an integer, defaults to 7. This is the number of days after which an episode will be considered "old" * src/gpodder/gui.py: iPod cleanup is now done selectively using the episode selector dialog; the code has been split, because we do not yet have an episode selector dialog for FS-based sync; add "Downloaded x days ago" column to "Delete old episodes" dialog and a corresponding button; call the callback even when no episodes are selected in gPodderEpisodeSelector * src/gpodder/libipodsync.py: Class variables of gPodder_iPodSync moved to __init__ to be instance variables (this should fix a bug that crops up now that we can selectively delete episodes); remove_tracks() and clean_playlist() have been modified/added to support new episode selector deletion code * src/gpodder/libpodcasts.py: Move is_played() to podcastItem from podcastChannel (it really belongs to the item; this makes code more readable in other parts of the codebase); add age_in_days(), is_old(), get_age_string() and age_prop to podcastItem * src/gpodder/util.py: New function: file_modification_datetime(); returns a datetime.datetime instance of the MTIME (modification timestamp) of the filename given as parameter or None if the filename cannot be determined; this is used for the "old episodes" feature Sun, 09 Dec 2007 16:45:11 +0100 Make has_converter() a bit more intelligent in detecting extensions * src/gpodder/libconverter.py: Convert given extension to lowercase and strip a leading "." from the extension, so calling code can also give the second value of the os.path.splitext() result directly to has_converter() Sun, 09 Dec 2007 13:20:49 +0100 Fix pre-setting code for filechooser buttons; Patch by Paul Rudkin * src/gpodder/config.py: Fix pre-setting code for filechooser-related code; use set_current_folder() instead of set_filename() * src/gpodder/gui.py: Fix pre-setting code for filechooser-related code; thanks to Paul Rudkin for the patch Thu, 06 Dec 2007 09:37:57 +0100 Support for itms:// links (direct links to the Apple iTunes Music Store) * src/gpodder/util.py: Support direct itms:// links by splitting out the iTunes Podcast links parsing routines. This should put us in for some nice iTunes podcast link support that will automagically translate iTunes podcast links to the correct RSS feed URL Thu, 06 Dec 2007 09:29:09 +0100 Support for iTunes Podcast links (http://phobos.apple.com/...) * src/gpodder/util.py: Add support for subscribing to iTunes Podcast links (those with phobos.apple.com); new functions: parse_itunes_xml(), http_get_and_gunzip() and itunes_dicover_rss() Thu, 06 Dec 2007 09:15:57 +0100 Added Galician translation from Teo Ramirez * data/gpodder.desktop: Added Spanish and Galician translations; thanks to Teo Ramirez * data/messages.pot: Updated from source * data/po/de.po: Updated * data/po/gl.po: Added NEW Galician (gl) translation by Teo Ramirez * data/po/*.po: Updated from source * setup.py: Added Galician (gl) translation by Teo Ramirez Thu, 06 Dec 2007 08:35:12 +0100 Sort channel list (finally ;) * src/gpodder/libpodcasts.py: Sort channels by lowercase title before returning the channel list in load_channels(); this automagically makes gPodder's channel list always sorted :) Thanks to FriedBunny for suggesting this and sending in an intial patch that led to this patch =) * TODO: Remove implemented item: Sort channel list Tue, 04 Dec 2007 23:28:27 +0100 Do grayscale "pill" instead of theme-based colors (for bad themes) * src/gpodder/draw.py: Always draw the "pill" in semi-transparent black/grey shades so it will work for all GTK themes (even Ubuntu's) Mon, 03 Dec 2007 21:35:56 +0100 Update channel navigator when iPod/MP3 player sync has finished * src/gpodder/gui.py: Update channel navigator when iPod sync has finished, so we can update the "played" status in the channel navigator when this status has changed after we've synced ("on sync mark played" option) Mon, 03 Dec 2007 21:24:17 +0100 Add option to mark episodes as played after transfer to device * data/gpodder.glade: Option added to preferences dialog * src/gpodder/config.py: Add option "on_sync_mark_played"; will mark an episode as played when it gets transferred to a device * src/gpodder/gui.py: Glue code for GUI + gpodder.config * src/gpodder/libipodsync.py: On sync, mark episode as played if the user has selected the "on_sync_mark_played" option * TODO: Remove implemented/integrated items Sat, 01 Dec 2007 15:19:29 +0100 Fix a fatal bug with first-run that prevents channel list saving * src/gpodder/util.py: Always use a file's parent directory to get the free disk space and return zero free disk space when the parent directory does not exist Thu, 29 Nov 2007 08:53:36 +0100 Support for itpc:// URLs * src/gpodder/util.py: Add support for adding "itpc://" URLs (these are simply http:// URLs with a different schema, for iTunes) Tue, 27 Nov 2007 22:59:26 +0100 Draw channel stats (unplayed, downloaded) on channel navigator * bin/gpodder: We're in development again, so add "+svn" * src/gpodder/draw.py: Added * src/gpodder/gui.py: Fix import of renamed "channels_to_model"; re-assign new column numbers for treeChannels' data model; add cell renderer for pill pixbuf and remove cell renderer for status text * src/gpodder/libpodcasts.py: Add episode_is_new() function to podcastChannel to check if an episode can be considered "new"; use the episode_is_new function in get_new_episodes; add get_episode_stats() after an idea from Paul Rudkin ; re-factor channels_to_model and clean out old, unused code and columns Mon, 26 Nov 2007 08:57:04 +0100 gPodder 0.10.2 "Ein schweineschnauzen Sandwich, bitte!" released * bin/gpodder: gPodder 0.10.2 released :) * doc/man/gpodder.1: gPodder 0.10.2 released :) * README: gPodder 0.10.2 released :) Mon, 26 Nov 2007 08:52:49 +0100 Translation updates * data/messages.pot: Refreshed from source * data/po/*.po: Refreshed from messages.pot * data/po/de.po: Updated German translation Sun, 25 Nov 2007 11:50:46 +0100 Make sure there is enough free disk space when saving OPML channel list * src/gpodder/gui.py: Notify user that there's some problem saving the current channel list when save_channels() return False * src/gpodder/libpodcasts.py: Pass-through the return value of gpodder.opml.Exporter.write so calling code knows if saving the channel list was successful or not * src/gpodder/opml.py: Check free disk space before saving OPML channels in Exporter.write; thanks to Jens Thiele for reporting this bug on the Debian BTS (Closes: Debian Bug #452490) Thu, 22 Nov 2007 21:52:35 +0100 Don't send Referer header when downloading episodes * src/gpodder/download.py: Some podcasts now implement an "anti-bandwidth-theft" code that should provide other websites from not linking to the episodes; as we have sent a Referer header containing the RSS feed URL, this causes problems; Referer header sending is therefore disabled now Sun, 18 Nov 2007 15:33:50 +0100 TODO items from Katy G. B. * TODO: Updated TODO list Sat, 17 Nov 2007 18:38:36 +0100 Backwards-compatibility for PyGTK less than 2.12 (for GtkTooltip) * src/gpodder/gui.py: Do not hook up tooltip handlers when we are using PyGTK less than 2.12 (which introduced the gtk.Tooltip API) Thu, 15 Nov 2007 11:07:42 +0100 Check free disk space before copying files to iPod * src/gpodder/libipodsync.py: Check if the iPod's filesystem has enough free disk space before copying files over to it, as to not corrupt the iTunesDB in certain situations and fail when disk is full; thanks to Nicolas Quienot for the bug report * src/gpodder/util.py: Add get_free_disk_space() function that calculates the free (user-available) disk space on a given path Wed, 14 Nov 2007 21:55:18 +0100 Add informative tooltips to channel navigator * src/gpodder/gui.py: Add tooltips to channel navigator that show a bigger cover image, the title, description, url and used disk space * src/gpodder/libpodcasts.py: Add save_dir_size property to podcastChannel that contains the disk usage of the channel's save_dir; this can be manually updated by calling update_save_dir_size() and will automatically be updated when the GUI code hooks into the channel; also add get_cover_pixbuf() that returns a pixbuf of the cover for a given size or None if there is no valid cover file Wed, 14 Nov 2007 19:19:11 +0100 Slipstream code (enumerate instead of simple position tracking) * src/gpodder/libipodsync.py: Use enumerate() to iterate over a list of episodes instead of keeping track of the position "by hand" Wed, 14 Nov 2007 19:17:51 +0100 Ignore initial window events from GtkWindow in Config * src/gpodder/config.py: Add a flag to config manager to ignore window events until the window has been realized; then, start taking position and size updates Mon, 12 Nov 2007 20:25:39 +0100 Improve caching for HTTP redirects and minor errors; cache clean-up * src/gpodder/cache.py: Cache content when it comes from a HTTP redirect (301, 302, 307); cache feeds even with parsing errors, so we can "fill" our cache and not download on every startup * src/gpodder/libpodcasts.py: Add cache clean-up code after loading channels; this should keep the feedcache.db file smaller for users that like to try out new channels (or have used gPodder for a while) Sun, 11 Nov 2007 14:24:17 +0100 Better file extension guessing for URLs * src/gpodder/util.py: Improve file_extension_from_url() by adding additional checks for known good extensions and recurse into the query string if it looks like an URL; this should fix compatibility problems for feeds with strange URLs; should provide more reliable guessing; thanks to Nicolas Quienot for the bug report Fri, 09 Nov 2007 10:05:36 +0100 Fix format_filesize() usage in episodes selector and podcastItem * src/gpodder/gui.py: Use the correct (config-using) format_filesize() function to generate the total size string in the episode selector * src/gpodder/libpodcasts.py: Use the correct (config-usig format_filesize() function to generate the total size string in podcastItem; thanks to Pieter De Decker for pointing that out * data/gpodder.glade: Use "Preferences" instead of "Preferences..." which feels a bit better in the GUI Thu, 08 Nov 2007 21:25:19 +0100 Add "gPodder download folder synchronizer" scripts to repository * doc/dev/gdfs/gdfs-check.py: Added * doc/dev/gdfs/gdfs-init.py: Added * doc/dev/gdfs/README: Added Thu, 08 Nov 2007 20:01:13 +0100 The mighty episode selector dialog and some menu re-arrangements * src/gpodder/gui.py: Move the "center_on_widget" keyword-based window positioning code to GladeWidget to be universally usable; update "Device" menu item on startup; new functions: delete_episode_list() and download_episode_list() that both operate on lists of episodes; add code for invoking gPodderEpisodeSelector for deleting old episodes; re-work on_itemDownloadAllNew_activate to use the episode selector instead of hand-crafting a message dialog text; add update_item_device() function that will handle the hiding, showing and renaming of the "Device" menu in the menubar; clean-up gPodderProperties with callback_finished setting (now kwarg-based); new, might, fancy, customizable and uber-sexy gPodderEpisodeSelector that will prove to be useful in some places in our codebase: it basically allows the user to select a subset of episodes from a given list in a quite sophisticated way; new "delete old episodes" menu item added for cleaning up gPodder's downloads * src/gpodder/libpodcasts.py: Add delete_from_disk() convenience method to podcastItem; other convenience properties and functions needed for the new episode selector dialog: pubdate_prop, get_filesize_string(), filesize_prop, get_channel_title(), channel_prop, get_played_string(), played_prop * data/gpodder.glade: new gPodderEpisode dialog; re-structuring of gPodder's main menu to be more usable and more compact; also added the Ctrl+K "Remove old episodes" menu item; also use the correct "multimedia-player" icon name of a not really representative icon Thu, 08 Nov 2007 12:07:30 +0100 Support syncing to FS-based MP3 players without subfolders * data/gpodder.glade: Add checkbox "Create a subfolder for each channel" to preferences dialog and rename some widgets * src/gpodder/config.py: Add boolean "fssync_channel_subfolders" option that defaults to True (create subfolder for each channel) * src/gpodder/gui.py: Hook up config option fssync_channel_subfolders to preferences dialog; do more intelligent widget hiding for the "Player" tab in the preferences dialog (only show relevant widgets) * src/gpodder/libipodsync.py: Only append channel name as subfolder to destination folder name when the "fssync_channel_subfolders" option is True; suggested by Paul Elliot Thu, 08 Nov 2007 11:28:17 +0100 Fix offline cache behaviour when time is not set * src/gpodder/cache.py: Return cached_content in offline mode when cached_content "is not None" (instead of cached_time "is not None") Tue, 06 Nov 2007 12:37:41 +0100 Process events before connecting Config to gtk windows * data/gpodder.glade: Remove default size for main gPodder window, as this is now handled by the config manager * src/gpodder/config.py: Process GTK events in the event queue before connecting to the "configure-event" signal, so we won't get two configure events for the window for the initial size change Mon, 05 Nov 2007 13:51:26 +0100 Add error reporting when download fails because of an I/O error * src/gpodder/download.py: Catch and handle I/O errors in DownloadThread and format and pass on messages to GUI code when required; thanks to Florian Richter for suggesting this feature after having a full disk * src/gpodder/gui.py: Update tree view when adding a new episode; add new notification() method and pass this method through to DownloadThread, so it can present messages to the user (i.e. errors) Mon, 05 Nov 2007 12:54:35 +0100 Use util.find_command in more places (mplayer detection, ...) * src/gpodder/libgpodder.py: Use util.find_command to detect the existence of the "gnome-btdownload" command and spit out a warning log message when the command is not available * src/gpodder/libipodsync.py: Use util.find_command to check for an installed mplayer binary (instead of relying on os.system("which...") Mon, 05 Nov 2007 01:12:15 +0100 Better command detection for the converter library * src/gpodder/libconverter.py: Detect existence of commands before invoking them for converting files; based on a patch by Nick (nikosapi.org); ConverterCollection is now a dict itself :) * src/gpodder/util.py: Add new find_command() function that will search the system's PATH for a specific executable command Mon, 05 Nov 2007 00:21:39 +0100 Remove extracted cover art when deleting episode files * src/gpodder/util.py: Apply modified version of a patch from Nick (nikosapi.org) that is better suited for deleting cover art that has been extracted with the new eyeD3 cover art extraction code Mon, 05 Nov 2007 00:17:12 +0100 Patch from Nick (nikosapi) to support eyeD3 cover art extraction * src/gpodder/libipodsync.py: Apply modified version of a patch from Nick (nikosapi.org) to utilize eyeD3 for cover art extraction in iPod sync code; remove dependency on PyID3 * README: PyID3 is not a dependency anymore, as we can now use eyeD3 for the same purpose (cover art extraction) Sat, 03 Nov 2007 14:14:09 +0100 Fix format_filesize() function to be standards-conformant (unit prefixes) * src/gpodder/config.py: Add "use_si_units" configuration option; if True, the user will see SI units (MB, kB, ...); if False (the default); the user will see binary-prefix units (MiB, KiB, ..) * src/gpodder/libgpodder.py: Add pass-through function "format_filesize()" to gPodderLib that combines the util.format_filesize function with the gPodder-specific config option * src/gpodder/util.py: Apply a modified patch from Gerrit Sangel to add support for SI units and binary prefixes to format_filesize(); this makes the function standards-compliant * src/gpodder/download.py: Updated to use new format_filesize * src/gpodder/gui.py: Updated to use new format_filesize * src/gpodder/libpodcasts.py: Updated to use new format_filesize Fri, 02 Nov 2007 17:28:05 +0100 New Configuration/Settings Manager; massive code clean-ups * src/gpodder/config.py: Added new Configuration Manager that automatically keeps track of saving changed values and is also able to watch GTK widgets for changes; this should simplify our settings management and give us a single place for maintaining settings * src/gpodder/download.py: Access settings from new config manager * src/gpodder/gui.py: Make use of new config manager to connect widgets and settings from the GUI directly to the config manager; remove manual loading and saving of settings; auto-connect as much as possible in the gPodderProperties dialog to get real-time automatic configuration saving; fix the other code to use new config manager * src/gpodder/libgpodder.py: MASSIVE code clean-up; removed lots of old cruft and dead code that has been lying around in libgpodder for some time now; remove configuration code; utilize config manager; unify DownloadHistory+PlaybackHistory in new HistoryStore class; reduce number of import statements * src/gpodder/libipodsync.py: Access settings from new config manager * src/gpodder/libplayers.py: Removed dotdesktop_command() * src/gpodder/libpodcasts.py: Move locking functionality into this module, as locking is only used here; access config from new manager * src/gpodder/services.py: Use config manager to get settings * src/gpodder/util.py: Add format_desktop_command() function, based on the dotdesktop_command() function from libplayers Fri, 02 Nov 2007 07:49:38 +0100 Add ability to open download folder from channel's context menu * src/gpodder/gui.py: Add "Open download folder" menu item to channel navigator context menu * src/gpodder/libgpodder.py: Add open_folder() method that will open the DE's default folder browser via "xdg-open" Thu, 01 Nov 2007 15:29:00 +0100 Limit filename on FS-based sync to 50 characters * src/gpodder/libipodsync.py: Do not allow extremely long file names that could theoretically be generated by using data from RSS feeds; this is needed to make FAT-based drives work with files that would otherwise have file names that are too long Wed, 31 Oct 2007 15:22:32 +0100 Escape RSS-provided strings in Pango markup * src/gpodder/gui.py: Escape strings in Pango markup * bin/gpodder: we're in development again, so "+svn" Sun, 28 Oct 2007 16:27:14 +0100 gPodder 0.10.1 "Nukular, das Wort heißt Nukular" released * bin/gpodder: gPodder 0.10.1 released :) * doc/man/gpodder.1: gPodder 0.10.1 released :) * README: gPodder 0.10.1 released :) * data/messages.pot: Refreshed template from source files * data/po/de.po: Updated German translation for the 0.10.1 release * data/po/*.po: Refreshed translation files from template Sun, 28 Oct 2007 15:25:56 +0100 Add "Save episode to file" handling to episode list context menu * data/gpodder.glade: Use a stock "Save As" button for the "Copy episode to file" button * src/gpodder/gui.py: Add new show_copy_dialog() method to GladeWidget that shows a copy dialog where a user can copy a file to a selected destination (this is used for "Save episode to file"); use show_copy_dialog in "Save As" in gPodderEpisode; add "Save episode to folder" menu item in episode list context menu and use show_copy_dialog to carry out the user interaction Sun, 28 Oct 2007 13:30:40 +0100 Allow "https://" URLs for episode URLs, as we can handle these, too * src/gpodder/util.py: Allow "https://" as a valid URL scheme, as we can handle https URLs, thanks to Aravind Seshadri who initially reported this bug Thu, 25 Oct 2007 14:00:01 +0200 Sync videos to the "Video Podcasts" playlist instead of the "Video" menu * src/gpodder/libipodsync.py: Merged patch from Nicolas Quienot to sync videos to the "Video Podcasts" menu instead of the "Videos" menu, as documented on http://ipodlinux.org/ITunesDB Tue, 23 Oct 2007 09:24:52 +0200 a sync_filename in podcastItem; cleanup; hide extra progressbar on transfer * src/gpodder/gui.py: Use podcastItem's sync_filename(); hide the unnecessary second progressbar when only syncing one channel (i.e. when clicking on the "transfer" button in the main window * src/gpodder/libgpodder.py: Remove unneeded lexists import and warning; clean-up * src/gpodder/libipodsync.py: Use podcastItem's sync_filename() * src/gpodder/libpodcasts.py: Add sync_filename() to podcastItem, returns the custom_sync_name or the title of the episode, based on the user's configuration settings for FS-based MP3 player sync Sun, 07 Oct 2007 14:38:31 +0200 Add wishlist items to TODO list from Paul and Wilfred * TODO: New wishlist items, ideas and suggestions Sat, 06 Oct 2007 12:39:57 +0200 Limit download progress status updates to reduce CPU load * src/gpodder/download.py: Limit the amount of status updates the download threads send to the DownloadStatusManager to one per second; this should make gPodder less CPU-intensive with many parallel downloads; thanks to Wilfred van Rooijen for reporting and testing Tue, 02 Oct 2007 17:59:29 +0200 Update channel models (icons) after iPod synchronization * src/gpodder/gui.py: Call update_model() on each channel after an iPod sync, so we can update the played state on the available episodes lists when played state was changed by the iPod sync Sat, 29 Sep 2007 14:12:15 +0200 Fix loading of channel metadata (load auth data and settings) * src/gpodder/libpodcasts.py: Load channel metadata when loading a podcastChannel object from OPML/LocalDB. This fixes a problem with authentication data being not loaded and also fixes a bug when the custom-set channel title was not correctly used throughout the GUI. Thanks to Nick (nikosapi) for reporting and providing a patch Tue, 25 Sep 2007 22:02:19 +0200 Finally remove Desktop symlink code; several compatibility fixes * src/gpodder/download.py: Prevent divide-by-zero errors when calculating download speed * src/gpodder/gui.py: Prevent divide-by-zero errors when calculating percentage done in code for moving the downloaded items folder * src/gpodder/libgpodder.py: Remove the "Symlink on Desktop" code, because it's not GUI-accessible anymore and we didn't use it anyway * src/gpodder/opml.py: Better local filename detection by using os.path.exists() instead of .startswith('/'); this is also good for cross-platform compatibility where parts don't usually start with a forward slash (i.e. Win32) Mon, 24 Sep 2007 00:09:44 +0200 Channel list selection bug fixes * src/gpodder/gui.py: Fix some channel list-related problems and annoyances, based on a patch by Nick (nikosapi) * bin/gpodder: We're in development again, so "+svn" Fri, 21 Sep 2007 02:07:43 +0200 gPodder 0.10.0 "Hier spricht Frank Drebin" released * bin/gpodder: gPodder 0.10.0 released :) * doc/man/gpodder.1: gPodder 0.10.0 released :) * README: gPodder 0.10.0 released :) (and: updated dependencies) * TODO: Updated TODO list (some items are done for 0.10.0 :) Fri, 21 Sep 2007 02:05:10 +0200 Updated translations from Rosetta (Launchpad.net) * data/po/es.po: Spanish translation by Julio Acuña * data/po/pt.po: Portuguese translation by Joel Calado (completed :) Fri, 21 Sep 2007 01:46:38 +0200 Fix problems with path selection in treeChannels * src/gpodder/gui.py: Simple bugfix Fri, 21 Sep 2007 00:32:51 +0200 Center gPodderEpisode on treeAvailable for less mouse hopping * src/gpodder/gui.py: If possible, center the gPodderEpisode dialog window on the treeAvailable, because that makes the position of the opened dialog more predictable and easier to use (as if the gPodderEpisode dialog was "inside" the treeView from which it opened) Fri, 21 Sep 2007 00:07:49 +0200 Don't translate feed format string examples * src/gpodder/gui.py: Don't mark format string examples as translatable Wed, 19 Sep 2007 17:21:09 +0200 Small bugfix for updating treeChannels when its model changes * src/gpodder/gui.py: Bugfix Wed, 19 Sep 2007 16:57:41 +0200 Removed channel combobox, drag'n'drop improvements + new channel cover editor * data/gpodder.glade: Remove comboAvailable in gPodder (main window); add download+clear button in gPodderChannel, rename some items that are now used in code; make the channel navigator non-shrinkable (so it is always visible, because we don't have comboAvailable anymore) * src/gpodder/gui.py: Remove support for the channel combo box, also known as comboAvailable; clean-up DND code and make treeChannels the only DND target in the main window; remove some unnecessary updating of the channel list (calls to updateComboBox); Changes for the gPodderChannel dialog: Don't automatically download channel cover when dialog pops up; add "Download" and "Clear" buttons to the cover editor; add DND support for dropping local files or images from the web browser to the cover editor (for setting custom covers on channels with bad or no cover) * src/gpodder/libgpodder.py: Don't abort get_image_from_url() if the URL is invalid, but the image has already been downloaded (because we read the downloaded image in the code when it exists, without URL) Wed, 19 Sep 2007 14:23:40 +0200 Center feed update dialog on main window; scroll reset in chan.navigator * src/gpodder/gui.py: Reset the current scroll position of the channel navigator when re-loading the channel list; this fixes an annoyance that Alistair Sutton reported when dealing with a HUGE channel list (more than 50 channels); also removed the scroll position reset code from treeAvailable, as we already managed to only edit the model instead of re-loading it every time; added code to really center the feed update dialog on gPodder's main window Tue, 18 Sep 2007 20:15:56 +0200 Replace wget with new gpodder.download module; User-agent support * bin/gpodder: Set "gpodder.user_agent" field on startup; remove check for wget, as this is not needed anymore * src/gpodder/cache.py: Clean-up; remove old logging code; add support for gpodder.user_agent; log info when there is an error in parsing the feed, so the user knows why this feed is not cached * src/gpodder/console.py: Remove DownloadPool, Use new gpodder.download module for carrying out downloads, remove wget_version() tester, as this is not needed anymore =) * src/gpodder/download.py: Added new downloader module that uses urllib and some custom classes and functions to provide the equivalent functionality of the obsolete "libwget", but without the wget dependency and with better accuracy (progress reporting, etc..) * src/gpodder/gui.py: Utilize new gpodder.download module instead of libwget * src/gpodder/__init__.py: Add "user_agent" variable to the gpodder module that holds the value of the "User-agent" header to send to web servers when requesting OPMLs, Feeds or download data * src/gpodder/opml.py: Add support for sending the User-agent header * src/gpodder/services.py: Make the progress column a float column to have smoother progress indicuation; add the "acquired" keyword argument to s_release(); default 'speed' to a translated "Queued" * src/gpodder/libwget.py: Removed * doc/dev/redhat-wget-output.txt: Removed Tue, 18 Sep 2007 02:30:04 +0200 Refreshed pot files and po templates; updated German translation * data/messages.pot: Refreshed from current source * data/po/de.po: Refreshed and updated translation * data/po/*.po: Refreshed from new .pot file Tue, 18 Sep 2007 02:19:19 +0200 Imported updated translations from Rosetta (Launchpad.net) * data/po/it.po: Italian translation updated by FFranci72 * data/po/nl.po: Dutch translation updated by Roel Groeneveld * data/po/pt.po: Portuguese translation updated by Joel Calado Tue, 18 Sep 2007 02:14:19 +0200 Offline support for feedcache, faster startup, code simplification * src/gpodder/cache.py: Add support for "offline" keyword argument * src/gpodder/gui.py: Make intelligent use of "offline" keyword argument when passed to load_channels(); simplify code for selecting the active channel in updateComboBox() * src/gpodder/libpodcasts.py: Pass-through of "offline" keyword argument in all relevant function calls Sat, 15 Sep 2007 16:22:28 +0200 New LocalDB using DOM (removes python-xml dependency); channel context menu * bin/gpodder: Don't check for xml.sax package and modules anymore, as the dependency on python-xml has been removed with this release * data/gpodder.glade: Remove the "info" button for the current channel * src/gpodder/gui.py: Remove localdb-related code and adopt code for new LocalDB code; add context menu to channel navigator (edit/delete) * src/gpodder/libipodsync.py: Don't import "liblocaldb" module * src/gpodder/liblocaldb.py: Removed * src/gpodder/liblocdbreader.py: Removed * src/gpodder/liblocdbwriter.py: Removed * src/gpodder/liblogger.py: Add "traceback" keyword argument to the log() function; if "True" and in debugging mode, print traceback * src/gpodder/libpodcasts.py: Merge code from old liblocaldb and liblocdbreader/liblocdbwriter to this module as LocalDBWriter and LocalDBReader; customize podcastChannel to new LocalDB code * src/gpodder/libwget.py: Remove localdb-specific code (now obsolete) Wed, 12 Sep 2007 23:07:23 +0200 Fix a bug when traversing directories with loop symlinks * src/gpodder/util.py: Don't dive into subdirectories that are symbolic links, this is to avoid a situation where looping symlinks result in the function dead-locking in a endless recursive loop, thanks to Bjørn Rasmussen for pointing that out and providing the necessary bug report to fix this issue Sun, 09 Sep 2007 18:47:20 +0200 Mark episodes as downloaded/deleted when deleting episodes * src/gpodder/gui.py: Rename "Mark [...] as downloaded" to "Mark [...] as deleted" and mark episodes as downloaded when removing selected episodes that have not been downloaded yet, as suggested by Holger Leskien * src/gpodder/libpodcasts.py: Fix problem when trying to delete episodes that have not been downloaded Sat, 08 Sep 2007 16:45:21 +0200 Support for customized file names in MP3 player sync code * src/gpodder/gui.py: Add supporting code for reading/setting configuration options for the preferences dialog and a help display code that displays a guide on how to write custom sync name strings * src/gpodder/libgpodder.py: New configuration options: custom_sync_name (holds format string) and custom_sync_name_enabled (boolean, if the above string should be used) * src/gpodder/libipodsync.py: Use custom sync name format string and util's object_string_formatter() function to obtain a file name for the synchronized episode (or default to episode.title if disabled) * src/gpodder/libpodcasts.py: Add new property methods to podcastItem: basename (returns the basename of the URL, without extension) and published (returns the pubDate of the episode in YYYYMMDD format) * src/gpodder/util.py: New object_string_formatter() method that replaces {OBJECTNAME.ATTRNAME} substrings in a string with the corresponding values of passed-in keyword argument objects * data/gpodder.glade: Added preferences GUI elements Wed, 05 Sep 2007 10:14:09 +0200 Check for installed python-xml package on startup (hard dependency) * bin/gpodder: Add dependency check for PyXML Sun, 02 Sep 2007 15:01:48 +0200 Fix bug with default window title in gPodder window * src/gpodder/gui.py: Always set gPodder's default_title attribute Sun, 02 Sep 2007 14:33:21 +0200 Updated Russian translation from Vladimir Zemlyakov * data/po/ru.po: Updated Sun, 02 Sep 2007 14:23:17 +0200 More sanitizing hacks for ugly feeds we don't really like * src/gpodder/libpodcasts.py: Negotiate which enclosure to select from multiple enclosures, if there are more than one available; skip episodes with a buggy download URL (i.e. no supported URL scheme) * src/gpodder/util.py: Return "(unknown)" if file size cannot be determined from the string passed to format_filesize(); return "None" in file_type_by_extension() if the extension is an empty string Fri, 31 Aug 2007 23:38:01 +0200 Handle enclosures (or lack thereof) better if fields are missing * src/gpodder/gui.py: Remove refetch_channel_list() function, as this is not called anywhere from the code (uh, how did i miss that?) * src/gpodder/libpodcasts.py: Be more liberal to enclosure tags without length or mime type; ignore episodes without enclosures (it's not len(enclosures) == 0, but the enclosures attribute doesn't even exist on entries without enclosures, so make sure to check for that Fri, 31 Aug 2007 20:03:03 +0200 Use Python's webbrowser module for URL opening; channel dialog clean-up * bin/gpodder: Set version to 0.9.5+svn (this is where we are now) * data/gpodder.glade: Remove "cancel" button from gPodderChannel * src/gpodder/gui.py: Use "webbrowser" module for URL opening instead of relying on "gnome-open" to be available; remove event handler for gPodderChannel's "cancel" button Thu, 30 Aug 2007 21:06:28 +0200 Dependency check for python-feedparser in bin/gpodder * bin/gpodder: Add dependency check and warning (with exit) if python-feedparser is not installed, as python-feedparser now is a dependency of gPodder Thu, 30 Aug 2007 20:51:46 +0200 Support for modifying DownloadHistory and PlaybackHistory in GUI * data/gpodder.glade: Added menu items in gPodder main window * src/gpodder/gui.py: Add menu items to treeAvailable's context menu to toggle/set downloaded and played status on selected episodes * src/gpodder/libgpodder.py: Add del_item() function to DownloadHistory to support removing items from the history list; enhance history_mark_{played,downloaded}() functions for add/delete Thu, 30 Aug 2007 20:46:48 +0200 Improved pubDate parsing; episode delete bugfix * src/gpodder/libpodcasts.py: Let feedparser parse the pubDate field of episodes and use new function in gpodder.util to convert the parsed pubDate to a string; bugfix for remove downloaded episode by URL * src/gpodder/util.py: Add updated_parsed_to_rfc2822() function that converts the "updated_parsed" field from feedparser to a RFC2822 string Thu, 30 Aug 2007 12:03:24 +0200 Remove obsolete documentation in doc/dev; cosmetic changes * data/po/Makefile: Upgrade to GPLv3 * data/po/README: Mention i18n page on gPodder's website * doc/dev/build-deps-breezy.txt: Removed * doc/dev/debian.txt: Removed * doc/dev/i18n.txt: Removed * doc/dev/porting.txt: Removed * doc/dev/svncl.sed: Upgrade to GPLv3; modify look added and removed files Wed, 29 Aug 2007 20:26:50 +0200 Upgrade to the GNU General Public License, Version 3 * bin/gpodder: Upgrade to GPLv3 * COPYING: Upgrade to GPLv3 * doc/dev/copyright_notice: Upgrade to GPLv3 * Makefile: Upgrade to GPLv3 * README: Upgrade to GPLv3 * setup.py: Upgrade to GPLv3 * src/gpodder/*.py: Upgrade to GPLv3 (except for SimpleGladeApp and cache, as these are LGPL or other and do not originate from gPodder) Wed, 29 Aug 2007 19:32:22 +0200 Integration changes, commit and ChangeLog migration * doc/dev/svncl.sed: Use tabs instead of 8 spaces for ChangeLog edit * Makefile: Make $EDITOR edit "ChangeLog" directly Wed, 29 Aug 2007 19:17:36 +0200 Last batch of experimental change merges (up to svn r398) * doc/dev/tepache-howto.txt: Removed * doc/dev/tepache: Removed * src/gpodder/gui.py.orig: Removed * src/gpodder/libwget.py: Send progress = 0.0 on inital status update * src/gpodder/libpodcasts.py: Try to get episode metadata from several different properties of the corresponding feedparser entries; warn user when we couldn't get the episode title and try to get the episode title from the filename of the URL if we still have not found an episode title * src/gpodder/libgpodder.py: Add get_device_name() that returns a "nice" representative string of the currently selected device that can be used to represent the device in the GUI * src/gpodder/util.py: Return "(unknown)" string when bytesize in format_filesize() when the size has a negative value; make get_tree_icon() catch errors and be more corrent with icon creation; add get_first_line() function that extracts the first line of a string * src/gpodder/libipodsync.py: Add "divx" to list of video extensions * src/gpodder/services.py: DownloadStatusManager has a new observer notification: "progress-detail"; add unregister() functionality for observers; add request_progress_detail() function that can be used to force a "progress-detail" notification to be sent out to all relevant observers; remove get_url_by_iter() function as it is not needed anymore * src/gpodder/gui.py: Clean-up after tepache dependency removal; new GladeWidget base class that subclasses SimpleGladeApp and simplifies class creation for our gPodder windows; add context menu to treeAvailable; re-work play_or_download() and make it return a list of boolean indicators on which actions can be performed on the selected items; move show_message() and show_confirmation() to GladeWidget; disable editing of the URL in the channel info dialog, this simplifies code and editing the URL doesn't make so much sense anyway (adding the new url and removing the old does the same and is easier, code-wise); add support for cancelling downloads in the available podcasts view; support live status view and download cancelling in the gPodderEpisode dialog window by hooking up to DownloadStatusManager as observer * src/gpodder/SimpleGladeApp.py: Customize for gPodder (remove usage of weakref for keyword arguments -> properties of new object) * bin/gpodder: We're using a experimental development version now * data/gpodder.glade: Add progress bar and associated buttons to gPodderEpisode dialog * MANIFEST.in: Removed gpodder.py.orig inclusion * Makefile: Removed support for tepache Wed, 29 Aug 2007 19:05:57 +0200 More changes from the experimental branch (up to svn r382) * src/gpodder/liblocdbreader.py: Clean-up * src/gpodder/libwget.py: Use "gpodder.services" instead of accepting a generic download status manager as constructor parameter; remove downloadStatusManager class (moved to gpodder.services) * src/gpodder/console.py: More clean-ups; use get_new_episodes() instead of duplicating code here; simplify the code for wget version detection * src/gpodder/libpodcasts.py: Improve channel/episode generation from feedparser objects (with error handling); utilize download status manager from "gpodder.services" instead of accepting a download status manager as parameter; clean up unneeded functions and rename some functions to make the code more readable; use util.get_tree_icon() for compositing a nice icon; remove the "played" column from the treemodel; add local_filename to treemodel * src/gpodder/liblocdbwriter.py: Clean-up * src/gpodder/libgpodder.py: Clean-up * src/gpodder/util.py: Add torrent_filename() function that tries to extract the filename of the file a .torrent file contains; add file_extension_from_url() function that returns the file extension in a URL; add file_type_by_extension() that returns the type of a file based on its extension; add get_tree_icon() that loads a named icon and optionally adds a bullet to it (unplayed status indicator) * src/gpodder/libipodsync.py: Clean-up * src/gpodder/services.py: New module that currently contains the improved DownloadStatusManager and a single object that servces as download status manager for all parts of gpodder * src/gpodder/gui.py: Only one column for status/played; use "gpodder.services" for the download status manager; clean-up * src/gpodder/liblocaldb.py: Clean-up * bin/gpodder: Clean-up * data/gpodder.glade: Clean-up; removed "show played column" preference in gPodderProperties dialog Wed, 29 Aug 2007 18:49:37 +0200 First import from experimental branch (up to svn r375) * src/gpodder/librssreader.py: Removed in favor of python-feedparser * src/gpodder/libwget.py: Percentage is now a float, don't set to 0 when there has been an error * src/gpodder/console.py: Use {load,save}_channels methods; code cleanup and simplification * src/gpodder/cache.py: Add python-feedcache module from Doug Hellman * src/gpodder/libpodcasts.py: Use opml and feedcache for channel list and RSS reading; use shelve for new ChannelSettings class; clean-up podcastChannel and podcastItem; better TreeModel generator for podcastChannel (try to cache the model, only updates icons, etc...); remove downloadRss method in podcastChannel; move DownloadHistory and Playbackhistory to libgpodder; new load_channels() and save_channels() functions to save/load the channel list to an OPML file * src/gpodder/libgpodder.py: BIG clean-up; remove gPodderChannelWriter and gPodderChannelReader (this is now in libpodcasts as simple functions); add DownloadHistory and PlaybackHistory from libpodcasts; * src/gpodder/gui.py: Use new functions for channel list loading/saving; only update treemodel for treeAvailable when it's really necessary * src/gpodder/liblocaldb.py: Remove unnecessary functions that have not been used for a while (treemodel-related); use load_channels() instead of gPodderChannelReader Wed, 29 Aug 2007 18:31:16 +0200 * ChangeLog: Older changes can be found on the gPodder website at http://gpodder.berlios.de/releases/0.9.5/ChangeLog