Hi,

I have tried to package the new version, since it has been about a year
since the last version was uploaded to unstable (unsure when the new
upstream version was released). 
Nevertheless I have attached a debdiff with the new changes (I am not
quite sure how else it should be done).
I hope this is of some use to update the package.

Kind regards

Roy Jamison
diff -Nru abby-0.4.7/abby.pro abby-0.4.8/abby.pro
--- abby-0.4.7/abby.pro	2009-12-18 10:55:51.000000000 +0000
+++ abby-0.4.8/abby.pro	2010-01-18 16:10:57.000000000 +0000
@@ -1,8 +1,8 @@
 ######################################################################
-# Automatically generated by qmake (2.01a) Thu Dec 10 23:11:48 2009
+# Automatically generated by qmake (2.01a) Sat Jan 16 15:12:02 2010
 ######################################################################
 
-QT+=network xml
+QT+=xml network
 TEMPLATE = app
 TARGET = 
 DEPENDPATH += . rc src
@@ -10,6 +10,7 @@
 
 # Input
 HEADERS += src/aboutdlg.h \
+           src/exportdlg.h \
            src/feededitdlg.h \
            src/feedmgrdlg.h \
            src/formatdlg.h \
@@ -17,10 +18,12 @@
            src/mainwnd.h \
            src/prefsdlg.h \
            src/rssdlg.h \
+           src/rssparser.h \
            src/scan.h \
            src/scandlg.h \
            src/util.h
 FORMS += rc/aboutdlg.ui \
+         rc/exportdlg.ui \
          rc/feededitdlg.ui \
          rc/feedmgrdlg.ui \
          rc/formatdlg.ui \
@@ -29,6 +32,7 @@
          rc/rssdlg.ui \
          rc/scandlg.ui
 SOURCES += src/aboutdlg.cpp \
+           src/exportdlg.cpp \
            src/feededitdlg.cpp \
            src/feedmgrdlg.cpp \
            src/formatdlg.cpp \
@@ -37,6 +41,7 @@
            src/mainwnd.cpp \
            src/prefsdlg.cpp \
            src/rssdlg.cpp \
+           src/rssparser.cpp \
            src/scan.cpp \
            src/scandlg.cpp \
            src/util.cpp
diff -Nru abby-0.4.7/ChangeLog abby-0.4.8/ChangeLog
--- abby-0.4.7/ChangeLog	1970-01-01 01:00:00.000000000 +0100
+++ abby-0.4.8/ChangeLog	2010-01-18 16:10:57.000000000 +0000
@@ -0,0 +1,289 @@
+Version 0.4.8
+(January 18, 2010⁾
+
+  User-visible changes:
+   * Add import/export list items under Edit menu
+   * Replace buggy RSS parser
+     # e.g. feed items appeared in channel titles
+     # fix segfault when fetch is called again
+
+  Developer-visible changes:
+   * Rewrite README
+   * Add src/rssparser(.cpp|.h)
+   * Rename CHANGES -> ChangeLog
+
+
+Version 0.4.7
+(December 18, 2009)
+
+  User-visible changes:
+   * Minimize to system tray (if available)
+     # Preferences: add "Minimize to system tray" checkbox
+   * Feed manager: add select/invert buttons
+   * RSS add support for multiple feeds using treeview
+   * Scan and RSS overhaul:
+     # Add progressbar
+     # Add log view
+     # Add abort functionality
+     # Links can now be dropped to the dialogs
+   * Log now includes (ISO) date/time stamp
+   * Add select all/invert selection buttons to:
+     # RSS dialog
+     # Scan dialog (closes issue #4)
+   * Remove unnecessary whitespace from scanned video titles
+   * Fix scan pattern to terminate at \n if found
+     # Mangled data seen when youtube front page was scanned
+   * Mainwindow: add (drag 'n) drop support (closes issue #3)
+
+  Known issues:
+   * w32: minimize to tray does not hide abby from the taskbar
+
+
+Version 0.4.6.1
+(December 3, 2009)
+
+  User-visible changes:
+   * Fixes version string in about dialog
+   * Adds missing sizegrip to format dialog
+
+
+Version 0.4.6
+(December 2, 2009)
+
+  User-visible changes:
+   * About dialog: change c/clive box title dynamically
+   * Adapt to cclive 0.5.6 changes
+     # --regexp
+       * Update the label
+       * Update editbox tooltip
+       * Remove "find all" checkbox
+     # --substitute
+       * Add label + editbox
+
+
+Version 0.4.5
+(November 21, 2009)
+
+  User-visible changes:
+   * Confirm exit if c/clive is still active
+   * c/clive autodetect, verify buttons (preferences)
+   * Autodetect c/clive from the path (if empty path)
+   * Feed manager:
+     # Allow use of feed names instead of links
+     # Use checkboxes for selection instead
+     # Fix defunct "clear list" button
+     # Remove "paste link" button
+   * Fix segfault when verifying path with non-c/clive commands
+
+  Developer-visible changes:
+   * Move cclive detection logic to src/util.(cpp|h) file
+   * Add NEWS file
+
+
+Version 0.4.4
+(October 5, 2009)
+
+  User-visible changes:
+   * New icons:
+     # File / Quit
+     # Help / About 
+   * Fix: rss/scan: unicode chars should now display OK
+
+
+Version 0.4.3
+(August 29, 2009)
+
+  User-visible changes:
+   * Add: --regexp, --find-all support
+     # New in cclive 0.5.0
+   * Add: --filename-format support
+   * Remove: --title support
+     # No longer supported by cclive as of 0.5.0
+   * Start DL if new link is added after hitting "start dl" on empty list
+   * Show LANG locale setting in about dialog
+   * Fix: filename not shown when download starts
+   * Fix: typo in statustip "scan for video links"
+   * Fix: filename parsing when it contains whitespace
+   * Fix: switching c/clive executables without restarting
+
+  Developer-visible changes:
+   * Rewrite QProcess output parsing
+     # Fixes "filename parsing when it contains whitespace"
+     # Process exit code instead of parsing output
+   * Add INSTALL file
+   * Append --print-fname to clive options
+     # Fixes "filename not shown when download starts"
+     # Bumps clive prerequisite to 2.2.5
+
+
+Version 0.4.2
+(August 1, 2009)
+
+  User-visible changes:
+   * Change:
+     # Abort button to show statustip instead of tooltip
+     # Dynamically changing format dialog based on c/clive --hosts output
+     # Total progressbar: use "%current / %total" instead of "%percentage"
+     # Scan: hide column header
+     # RSS: ditto
+     # Improve c/clive executable checking (1)
+       * Display dialogbox where suitable
+     # Scan: relocate options group
+
+  Developer-visible changes:
+   * Improve c/clive executable checking (1)
+     # Remove excess code and unnecessary checks
+   * Add: support for --exec-run (c/clive 0.4.6+/2.2.3+)
+   * Tweak --hosts support
+     # c/clive 0.4.6+/2.2.3+ print supported formats with --hosts
+     # Bump prerequisites, see README
+   * Cleanup README
+     # Better description
+     # Misc. other tweaks
+   * abby.pro: include "QT += network xml"
+     # See README for the changed build instructions
+
+  Known-issues:
+    * http://youtube.com/rss/user/(username)/videos.rss
+      Links no longer work. Please see README ("Using abby").
+
+
+Version 0.4.1
+(July 11, 2009)
+
+  User-visible changes:
+   * Rollout experimental win32 binaries
+   * Add: Help / Supported hosts
+   * Fix: Preferences: various browse buttons
+   * Tweak:
+     1. Various messagebox texts
+     2. Various status/tool tips
+     3. Scan dialog (+new functions)
+     4. RSS dialog
+   * Enable/disable link list when download begins/ends
+   * Change: Open "Add link" dialog if list is empty and "Download" is clicked
+     1. This previously showed a messagebox telling user to add a link
+
+  Developer-visible changes:
+   * src/scandlg.cpp: Use static messagebox function instead
+
+
+Version 0.4.0
+(July 5, 2009)
+
+  User-visible changes:
+   * Add: Scan feature to scan *any* web pages for video links
+     1. Supports regular Youtube links and embedded ones
+     2. Above means that it can be used to grab videos from Youtube playlists
+     3. Intended to replace clivescan utility (of the clive-utils project)
+   * Add: Edit / Add / Paste (+key shortcut)
+   * Add: Clear list (button +menu item)
+   * Fix: RSS/Scan: Check for URL scheme in input link; insert if missing
+   * Fix: RSS/Scan: Disabling HTTP proxy is now respected
+   * Enable editing links in main window and RSS feed manager (double-click)
+   * Enable/disable misc. widgets at start and end
+   * Use 16x16 for all icons
+   * Update misc. tooltip messages
+
+
+Version 0.3.0
+(June 21, 2009)
+
+FOREWORD
+
+It is now also possible to download multiple videos on one go.
+This was previously limited by design.
+
+We are in the process of merging clive-utils into abby. RSS feed
+parsing (clivefeed) has already been implemented. Video link scan
+(clivescan) should be implemented in abby by 0.4.0.
+
+  User-visible changes:
+   * Add: --format=best support
+   * Add: RSS parsing (obsoletes clivefeed in clive-utils)
+   * Add: Keyboard shortcuts (e.g. add link, start download)
+   * Fix: Tab orders (e.g. main window: paste button)
+   * Change: Multi-link support
+   * Change: Video format selection
+     1. Format dialog for hosts that support multiple video formats
+     2. All other hosts default to "flv"
+   * Change: More responsive UI when closing Preferences while using clive
+     1. invoke (c)clive after closing the preferences only if path was changed
+   * Change: Reflect --format ID changes to match recent (c)clive additions
+   * Remove: Youtube login support
+     1. Until fixed in (c)clive
+   * Remove: Finnish translation
+     1. Reintroduce translations when we are "stable"
+   * Remove: Continue partially downloaded file [box]
+     1. Default to use --continue with all transfers
+     2. Recent changes to Youtube and Google services allow flvs to be cont'd
+
+  Developer-visible changes:
+   * Change: cclive prerequisite -> 0.4.4
+   * Change: clive prerequisite -> 2.2.1
+   * Change: use --format for both (c)clive (reflect cclive changes)
+     1. cclive previously used --download=format
+
+  Known-issues:
+   * Format dialog displays "mp4" for Google when using cclive
+     1. mp4 support has been broken in cclive since 0.4.x
+
+
+Version 0.2.1
+(April 29, 2009)
+
+  User-visible changes:
+   * Add support for --connect-timeout, --connect-timeout-socks
+     ** cclive 0.3.2+
+     ** clive 2.1.11+
+   * Allow use of --limit-rate with clive
+   * Fix: Preferences: cclive/clive: Browse (button)
+
+
+Version 0.2.0
+(April 4, 2009)
+
+  User-visible changes:
+   * Add support for clive 2.1.10+
+     - abby can now be used as a front-end for clive (2.1.10+) as well
+   * Add support for Youtube HD (mp4_hd) format
+     - Added in cclive 0.3.1
+     - Added in clive 2.1.10
+   * Fix tooltips
+     - Typos, missing, etc.
+   * Fix duplicate key shortcuts
+     - English (&File - Video &Format)
+     - Finnish (multiple)
+   * Add paste button next to start button
+   * Change common buttons to use icons instead of text
+   * Change address bar: bind return key to Start button
+   * Change Preferences dialog to open centered and over the main window
+     - Dialog position previously saved and restored
+
+
+Version 0.1.1
+(March 17, 2009)
+
+  User-visible changes:
+   * Improve cclive process output handling and parsing
+   * Add support for new cclive options (0.2.4+)
+     - --title, --title-cclass
+     - --stream-exec, --stream
+   * Add missing statusbar messages for menu items
+   * Add more widget dynamics in Options
+     - "Start streaming at" stays hidden unless cclive was built WITH_PERL=yes
+     - If paths have been defined in Preferences
+        - "Start streaming at" is enabled if "Stream command" is defined
+        - "Run external command" is enabled if "External command" is defined
+     - When URL changes
+       - "Continue partially transferred file" checkbox is enabled/disabled
+       - "Video Format" combobox list is recreated based on URL
+   * Change default window sizes
+   * Change "Save video as" label to checkbox
+   * Clean up widget texts
+
+
+Version 0.1.0
+(March 1, 2009)
+
+  * Initial release
diff -Nru abby-0.4.7/CHANGES abby-0.4.8/CHANGES
--- abby-0.4.7/CHANGES	2009-12-18 10:55:51.000000000 +0000
+++ abby-0.4.8/CHANGES	1970-01-01 01:00:00.000000000 +0100
@@ -1,274 +0,0 @@
-Version 0.4.7
-(December 18, 2009)
-
-  User-visible changes:
-   * Minimize to system tray (if available)
-     # Preferences: add "Minimize to system tray" checkbox
-   * Feed manager: add select/invert buttons
-   * RSS add support for multiple feeds using treeview
-   * Scan and RSS overhaul:
-     # Add progressbar
-     # Add log view
-     # Add abort functionality
-     # Links can now be dropped to the dialogs
-   * Log now includes (ISO) date/time stamp
-   * Add select all/invert selection buttons to:
-     # RSS dialog
-     # Scan dialog (closes issue #4)
-   * Remove unnecessary whitespace from scanned video titles
-   * Fix scan pattern to terminate at \n if found
-     # Mangled data seen when youtube front page was scanned
-   * Mainwindow: add (drag 'n) drop support (closes issue #3)
-
-  Known issues:
-   * w32: minimize to tray does not hide abby from the taskbar
-
-
-Version 0.4.6.1
-(December 3, 2009)
-
-  User-visible changes:
-   * Fixes version string in about dialog
-   * Adds missing sizegrip to format dialog
-
-
-Version 0.4.6
-(December 2, 2009)
-
-  User-visible changes:
-   * About dialog: change c/clive box title dynamically
-   * Adapt to cclive 0.5.6 changes
-     # --regexp
-       * Update the label
-       * Update editbox tooltip
-       * Remove "find all" checkbox
-     # --substitute
-       * Add label + editbox
-
-
-Version 0.4.5
-(November 21, 2009)
-
-  User-visible changes:
-   * Confirm exit if c/clive is still active
-   * c/clive autodetect, verify buttons (preferences)
-   * Autodetect c/clive from the path (if empty path)
-   * Feed manager:
-     # Allow use of feed names instead of links
-     # Use checkboxes for selection instead
-     # Fix defunct "clear list" button
-     # Remove "paste link" button
-   * Fix segfault when verifying path with non-c/clive commands
-
-  Developer-visible changes:
-   * Move cclive detection logic to src/util.(cpp|h) file
-   * Add NEWS file
-
-
-Version 0.4.4
-(October 5, 2009)
-
-  User-visible changes:
-   * New icons:
-     # File / Quit
-     # Help / About 
-   * Fix: rss/scan: unicode chars should now display OK
-
-
-Version 0.4.3
-(August 29, 2009)
-
-  User-visible changes:
-   * Add: --regexp, --find-all support
-     # New in cclive 0.5.0
-   * Add: --filename-format support
-   * Remove: --title support
-     # No longer supported by cclive as of 0.5.0
-   * Start DL if new link is added after hitting "start dl" on empty list
-   * Show LANG locale setting in about dialog
-   * Fix: filename not shown when download starts
-   * Fix: typo in statustip "scan for video links"
-   * Fix: filename parsing when it contains whitespace
-   * Fix: switching c/clive executables without restarting
-
-  Developer-visible changes:
-   * Rewrite QProcess output parsing
-     # Fixes "filename parsing when it contains whitespace"
-     # Process exit code instead of parsing output
-   * Add INSTALL file
-   * Append --print-fname to clive options
-     # Fixes "filename not shown when download starts"
-     # Bumps clive prerequisite to 2.2.5
-
-
-Version 0.4.2
-(August 1, 2009)
-
-  User-visible changes:
-   * Change:
-     # Abort button to show statustip instead of tooltip
-     # Dynamically changing format dialog based on c/clive --hosts output
-     # Total progressbar: use "%current / %total" instead of "%percentage"
-     # Scan: hide column header
-     # RSS: ditto
-     # Improve c/clive executable checking (1)
-       * Display dialogbox where suitable
-     # Scan: relocate options group
-
-  Developer-visible changes:
-   * Improve c/clive executable checking (1)
-     # Remove excess code and unnecessary checks
-   * Add: support for --exec-run (c/clive 0.4.6+/2.2.3+)
-   * Tweak --hosts support
-     # c/clive 0.4.6+/2.2.3+ print supported formats with --hosts
-     # Bump prerequisites, see README
-   * Cleanup README
-     # Better description
-     # Misc. other tweaks
-   * abby.pro: include "QT += network xml"
-     # See README for the changed build instructions
-
-  Known-issues:
-    * http://youtube.com/rss/user/(username)/videos.rss
-      Links no longer work. Please see README ("Using abby").
-
-
-Version 0.4.1
-(July 11, 2009)
-
-  User-visible changes:
-   * Rollout experimental win32 binaries
-   * Add: Help / Supported hosts
-   * Fix: Preferences: various browse buttons
-   * Tweak:
-     1. Various messagebox texts
-     2. Various status/tool tips
-     3. Scan dialog (+new functions)
-     4. RSS dialog
-   * Enable/disable link list when download begins/ends
-   * Change: Open "Add link" dialog if list is empty and "Download" is clicked
-     1. This previously showed a messagebox telling user to add a link
-
-  Developer-visible changes:
-   * src/scandlg.cpp: Use static messagebox function instead
-
-
-Version 0.4.0
-(July 5, 2009)
-
-  User-visible changes:
-   * Add: Scan feature to scan *any* web pages for video links
-     1. Supports regular Youtube links and embedded ones
-     2. Above means that it can be used to grab videos from Youtube playlists
-     3. Intended to replace clivescan utility (of the clive-utils project)
-   * Add: Edit / Add / Paste (+key shortcut)
-   * Add: Clear list (button +menu item)
-   * Fix: RSS/Scan: Check for URL scheme in input link; insert if missing
-   * Fix: RSS/Scan: Disabling HTTP proxy is now respected
-   * Enable editing links in main window and RSS feed manager (double-click)
-   * Enable/disable misc. widgets at start and end
-   * Use 16x16 for all icons
-   * Update misc. tooltip messages
-
-
-Version 0.3.0
-(June 21, 2009)
-
-FOREWORD
-
-It is now also possible to download multiple videos on one go.
-This was previously limited by design.
-
-We are in the process of merging clive-utils into abby. RSS feed
-parsing (clivefeed) has already been implemented. Video link scan
-(clivescan) should be implemented in abby by 0.4.0.
-
-  User-visible changes:
-   * Add: --format=best support
-   * Add: RSS parsing (obsoletes clivefeed in clive-utils)
-   * Add: Keyboard shortcuts (e.g. add link, start download)
-   * Fix: Tab orders (e.g. main window: paste button)
-   * Change: Multi-link support
-   * Change: Video format selection
-     1. Format dialog for hosts that support multiple video formats
-     2. All other hosts default to "flv"
-   * Change: More responsive UI when closing Preferences while using clive
-     1. invoke (c)clive after closing the preferences only if path was changed
-   * Change: Reflect --format ID changes to match recent (c)clive additions
-   * Remove: Youtube login support
-     1. Until fixed in (c)clive
-   * Remove: Finnish translation
-     1. Reintroduce translations when we are "stable"
-   * Remove: Continue partially downloaded file [box]
-     1. Default to use --continue with all transfers
-     2. Recent changes to Youtube and Google services allow flvs to be cont'd
-
-  Developer-visible changes:
-   * Change: cclive prerequisite -> 0.4.4
-   * Change: clive prerequisite -> 2.2.1
-   * Change: use --format for both (c)clive (reflect cclive changes)
-     1. cclive previously used --download=format
-
-  Known-issues:
-   * Format dialog displays "mp4" for Google when using cclive
-     1. mp4 support has been broken in cclive since 0.4.x
-
-
-Version 0.2.1
-(April 29, 2009)
-
-  User-visible changes:
-   * Add support for --connect-timeout, --connect-timeout-socks
-     ** cclive 0.3.2+
-     ** clive 2.1.11+
-   * Allow use of --limit-rate with clive
-   * Fix: Preferences: cclive/clive: Browse (button)
-
-
-Version 0.2.0
-(April 4, 2009)
-
-  User-visible changes:
-   * Add support for clive 2.1.10+
-     - abby can now be used as a front-end for clive (2.1.10+) as well
-   * Add support for Youtube HD (mp4_hd) format
-     - Added in cclive 0.3.1
-     - Added in clive 2.1.10
-   * Fix tooltips
-     - Typos, missing, etc.
-   * Fix duplicate key shortcuts
-     - English (&File - Video &Format)
-     - Finnish (multiple)
-   * Add paste button next to start button
-   * Change common buttons to use icons instead of text
-   * Change address bar: bind return key to Start button
-   * Change Preferences dialog to open centered and over the main window
-     - Dialog position previously saved and restored
-
-
-Version 0.1.1
-(March 17, 2009)
-
-  User-visible changes:
-   * Improve cclive process output handling and parsing
-   * Add support for new cclive options (0.2.4+)
-     - --title, --title-cclass
-     - --stream-exec, --stream
-   * Add missing statusbar messages for menu items
-   * Add more widget dynamics in Options
-     - "Start streaming at" stays hidden unless cclive was built WITH_PERL=yes
-     - If paths have been defined in Preferences
-        - "Start streaming at" is enabled if "Stream command" is defined
-        - "Run external command" is enabled if "External command" is defined
-     - When URL changes
-       - "Continue partially transferred file" checkbox is enabled/disabled
-       - "Video Format" combobox list is recreated based on URL
-   * Change default window sizes
-   * Change "Save video as" label to checkbox
-   * Clean up widget texts
-
-
-Version 0.1.0
-(March 1, 2009)
-
-  * Initial release
diff -Nru abby-0.4.7/debian/changelog abby-0.4.8/debian/changelog
--- abby-0.4.7/debian/changelog	2010-11-11 23:38:26.000000000 +0000
+++ abby-0.4.8/debian/changelog	2010-11-11 23:38:26.000000000 +0000
@@ -1,3 +1,9 @@
+abby (0.4.8-0ubuntu1) natty; urgency=low
+
+  * New upstream release
+
+ -- Roy Jamison <xtee...@googlemail.com>  Thu, 11 Nov 2010 23:32:53 +0000
+
 abby (0.4.7-1) unstable; urgency=low
 
   * New upstream version 
diff -Nru abby-0.4.7/NEWS abby-0.4.8/NEWS
--- abby-0.4.7/NEWS	2009-12-18 10:55:51.000000000 +0000
+++ abby-0.4.8/NEWS	2010-01-18 16:10:57.000000000 +0000
@@ -1,4 +1,11 @@
 
+Version 0.4.8
+-------------
+
+Replaced buggy RSS feed parser. Feeds should be parsed
+properly now. Added import and export URL list functionality.
+
+
 Version 0.4.7
 -------------
 
diff -Nru abby-0.4.7/rc/exportdlg.ui abby-0.4.8/rc/exportdlg.ui
--- abby-0.4.7/rc/exportdlg.ui	1970-01-01 01:00:00.000000000 +0100
+++ abby-0.4.8/rc/exportdlg.ui	2010-01-18 16:10:57.000000000 +0000
@@ -0,0 +1,180 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>ExportDialog</class>
+ <widget class="QDialog" name="ExportDialog">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>400</width>
+    <height>164</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Export</string>
+  </property>
+  <property name="styleSheet">
+   <string/>
+  </property>
+  <property name="sizeGripEnabled">
+   <bool>true</bool>
+  </property>
+  <layout class="QGridLayout" name="gridLayout_3">
+   <item row="0" column="0">
+    <layout class="QHBoxLayout" name="horizontalLayout">
+     <item>
+      <widget class="QLabel" name="label">
+       <property name="text">
+        <string>&amp;File:</string>
+       </property>
+       <property name="buddy">
+        <cstring>fileEdit</cstring>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QLineEdit" name="fileEdit"/>
+     </item>
+     <item>
+      <widget class="QPushButton" name="browseButton">
+       <property name="toolTip">
+        <string>Browse</string>
+       </property>
+       <property name="text">
+        <string/>
+       </property>
+       <property name="icon">
+        <iconset resource="abby.qrc">
+         <normaloff>:/folder-saved-search.png</normaloff>:/folder-saved-search.png</iconset>
+       </property>
+       <property name="iconSize">
+        <size>
+         <width>16</width>
+         <height>16</height>
+        </size>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </item>
+   <item row="1" column="0">
+    <widget class="QGroupBox" name="groupBox">
+     <property name="title">
+      <string>Options</string>
+     </property>
+     <layout class="QGridLayout" name="gridLayout_2">
+      <item row="0" column="0">
+       <layout class="QGridLayout" name="gridLayout">
+        <item row="0" column="0">
+         <widget class="QCheckBox" name="appendBox">
+          <property name="text">
+           <string>&amp;Append to file</string>
+          </property>
+         </widget>
+        </item>
+        <item row="0" column="1">
+         <spacer name="horizontalSpacer">
+          <property name="orientation">
+           <enum>Qt::Horizontal</enum>
+          </property>
+          <property name="sizeHint" stdset="0">
+           <size>
+            <width>40</width>
+            <height>20</height>
+           </size>
+          </property>
+         </spacer>
+        </item>
+       </layout>
+      </item>
+      <item row="1" column="0">
+       <spacer name="verticalSpacer_2">
+        <property name="orientation">
+         <enum>Qt::Vertical</enum>
+        </property>
+        <property name="sizeHint" stdset="0">
+         <size>
+          <width>20</width>
+          <height>40</height>
+         </size>
+        </property>
+       </spacer>
+      </item>
+     </layout>
+    </widget>
+   </item>
+   <item row="2" column="0">
+    <widget class="QDialogButtonBox" name="buttonBox">
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
+     </property>
+     <property name="standardButtons">
+      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+     </property>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <tabstops>
+  <tabstop>fileEdit</tabstop>
+  <tabstop>browseButton</tabstop>
+  <tabstop>appendBox</tabstop>
+  <tabstop>buttonBox</tabstop>
+ </tabstops>
+ <resources>
+  <include location="abby.qrc"/>
+ </resources>
+ <connections>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>accepted()</signal>
+   <receiver>ExportDialog</receiver>
+   <slot>accept()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>227</x>
+     <y>137</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>157</x>
+     <y>163</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>rejected()</signal>
+   <receiver>ExportDialog</receiver>
+   <slot>reject()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>295</x>
+     <y>143</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>286</x>
+     <y>163</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>browseButton</sender>
+   <signal>clicked()</signal>
+   <receiver>ExportDialog</receiver>
+   <slot>onBrowse()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>374</x>
+     <y>23</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>199</x>
+     <y>81</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+ <slots>
+  <slot>onBrowse()</slot>
+ </slots>
+</ui>
diff -Nru abby-0.4.7/rc/mainwnd.ui abby-0.4.8/rc/mainwnd.ui
--- abby-0.4.7/rc/mainwnd.ui	2009-12-18 10:55:51.000000000 +0000
+++ abby-0.4.8/rc/mainwnd.ui	2010-01-18 16:10:57.000000000 +0000
@@ -8,7 +8,7 @@
     <x>0</x>
     <y>0</y>
     <width>545</width>
-    <height>389</height>
+    <height>391</height>
    </rect>
   </property>
   <property name="windowTitle">
@@ -741,6 +741,9 @@
     <addaction name="action_Remove"/>
     <addaction name="action_Clear"/>
     <addaction name="separator"/>
+    <addaction name="action_Import"/>
+    <addaction name="action_Export"/>
+    <addaction name="separator"/>
     <addaction name="action_Preferences"/>
    </widget>
    <widget class="QMenu" name="menuHelp">
@@ -918,6 +921,24 @@
     <string>&amp;Supported hosts...</string>
    </property>
   </action>
+  <action name="action_Import">
+   <property name="icon">
+    <iconset resource="abby.qrc">
+     <normaloff>:/document-open.png</normaloff>:/document-open.png</iconset>
+   </property>
+   <property name="text">
+    <string>Import...</string>
+   </property>
+  </action>
+  <action name="action_Export">
+   <property name="icon">
+    <iconset resource="abby.qrc">
+     <normaloff>:/document-save.png</normaloff>:/document-save.png</iconset>
+   </property>
+   <property name="text">
+    <string>Export...</string>
+   </property>
+  </action>
  </widget>
  <tabstops>
   <tabstop>addButton</tabstop>
@@ -1265,6 +1286,38 @@
     </hint>
    </hints>
   </connection>
+  <connection>
+   <sender>action_Import</sender>
+   <signal>activated()</signal>
+   <receiver>MainWindow</receiver>
+   <slot>onImport()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>-1</x>
+     <y>-1</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>272</x>
+     <y>195</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>action_Export</sender>
+   <signal>activated()</signal>
+   <receiver>MainWindow</receiver>
+   <slot>onExport()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>-1</x>
+     <y>-1</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>272</x>
+     <y>195</y>
+    </hint>
+   </hints>
+  </connection>
  </connections>
  <slots>
   <slot>onStart()</slot>
@@ -1284,5 +1337,7 @@
   <slot>onRemove()</slot>
   <slot>onFormats()</slot>
   <slot>onClear()</slot>
+  <slot>onImport()</slot>
+  <slot>onExport()</slot>
  </slots>
 </ui>
diff -Nru abby-0.4.7/README abby-0.4.8/README
--- abby-0.4.7/README	2009-12-18 10:55:51.000000000 +0000
+++ abby-0.4.8/README	2010-01-18 16:10:57.000000000 +0000
@@ -1,5 +1,3 @@
-U
-
 
 About
 -----
@@ -15,90 +13,127 @@
 Configuration
 -------------
 
-You will need to set the path to either clive(1) or cclive(1) command.
-You can do this by opening the preferences (Edit/Preferences). Note that
-abby will check the path everytime it starts and prompts a notification
-if it cannot run the c/clive command.
+* abby will require path to either cclive or clive command
 
-You can confirm that c/clive was found by opening the about dialog (Help/
-About).
+* The path is detected from the $PATH by default
 
+* If the above fails, you are required to enter it manually by opening
+the program preferences (Edit / Preferences or ctrl-e).
 
-First download
---------------
+* Use the "Verify" button to verify the path to c/clive
 
-Once the path is set to c/clive, you can add a new link to the download
-list by clicking the "plus" button left to the list widget. abby will
-prompt for a video page link. Note that before anything gets added to the
-list, abby verifies the c/clive supports the specified video host.
+* abby uses Qt's QSettings class for storing the program settings
+  - on Linux/FreeBSD these settings are typically found under .config/abby/
+  - the location may vary for each platform, refer to the Qt documentation
 
-Now that you have added a video page link to the list, you can click the
-download button (bottom-right to the list widget). This starts the c/clive
-process. The download progress is presented using the progressbars and
-various labels but you can also view various process details by opening
-the "Log" tab.
 
+The essentials to get started with abby
+---------------------------------------
 
-Feature: RSS
-------------
+If you have not configured abby already, then see the "Configuration"
+section above.
 
-abby can parse RSS feeds. This feature can be accessed by clicking the
-"RSS". Once the dialog is open, you can enter a RSS feed link, for example:
-    http://gdata.youtube.com/feeds/base/users/(username)/uploads?alt=rss
+* You can add video page links by:
 
-You can also append "&orderby=updated" to the URL.
+  - Hitting the "+" button
 
-And hit "Fetch". When the parsed items appear in the list, you can select
-each item to the download list by checking the box before the video title.
-By hitting "OK", each selected item will be added to the download list.
+  - Dropping them onto the window
 
-Note also the tiny button before the "Fetch" button. This opens another
-dialog (Feed manager) that can be used to save your feed links so that you
-can select them later without having to type them again. To re-use a link
-from "Feed manager", select a link from the list and hit "OK".
+  - Pasting them from the system clipboard
 
-Note that this feature is not Youtube specific, although the example link
-above was for Youtube. You can use the RSS parsing feature ultimately with
-any website that provides RSS content containing video page links to the
-c/clive supported websites.
+  - Parsing RSS feeds (covered further below)
 
+  - Scanning video pages (covered further below)
 
-Feature: Scan
--------------
+  - Importing them from files
+
+* Each time a new link is added to the list
+
+  - abby verifies that the c/clive supports the website
+
+  - abby ignores any duplicate links
+
+* Start the download by hitting the download button (or ctrl+d)
+
+
+Parsing RSS feeds
+-----------------
+
+You can access this feature by clicking the button with the RSS icon
+on it or by hitting ctrl+r. Some websites like youtube.com and
+video.google.com provide RSS feeds that can be parsed in abby.
+
+Example:
+  http://gdata.youtube.com/feeds/base/users/communitychannel/uploads?alt=rss
+
+Once the RSS dialog is open, you can add RSS feed links to the top list.
+As with the main window's video page link list (or download list), hit
+the "+" button, paste a link from the clipboard or drop links onto the
+dialog.
+
+It's also worth noting that you can access the "Feed manager" by hitting
+the "Feeds..." button. The manager can be used to save frequently visited
+RSS feeds.
 
-abby can scan for video page links from any URL. This feature can be accessed
-by clicking the button underneath the "RSS" button. The interface is somewhat
-similar to the RSS dialog except that you are presented with the "Fetch video
-title" option box.
-
-Before you can start the scan, you will need to add a link to the "Link:"
-field. This could be, for example, the front-page of Youtube website
-(http://youtube.com).
+Hit "Fetch" to continue. Once the parsing is complete, a list of found
+items are displayed in the bottom list, each feed item under appropriate
+feed channel.
+
+Check each item you want to add to the download list and hit "OK".
+
+
+Scanning for video page links
+-----------------------------
+
+The scan feature originates from the early days of clive and the clivescan
+program. It can be used to scan for "regular" Youtube video page links or
+embedded ones. The found links can then be added to the download list in
+the main window and downloaded.
+
+You can access the scan dialog by hitting either the scan button in the
+main window. Ctrl-s also opens the same dialog.
+
+Once the dialog is open, enter the URL you want to scan for video page
+links. For example: http://youtube.com
 
 If the "Fetch video title" is checked, abby will perform the scan in two
-steps, first it will fetch the content from specified link and parses it for
-video page links, and then visits those links for page title information.
+steps:
 
-Hit the "Scan" button to start the scan process.
+  1) First fetches the content from specified link and scans it for
+     video page links
 
-Once the process has completed, abby adds the detected video page links
-to the list widget from which you can check those items that you wish to
-download. Clicking the "OK" button will then transfer the selected items to
-the download list.
+  2) It then visits (fetches and parses) each found link for the page title
 
-Note that the scan feature currently supports only Youtube links. This means
-that it only recognizes Youtube video page links from the scanned content.
+Hit the "Scan" button to start the scan process. Depending on the "Fetch
+video title" state, abby will either add the parsed video page title or
+the link itself to the list.
 
-And yes, it works with Youtube playlists.
+Once the process is complete, you can check each video from the list
+and hit "OK" to add them to the download list.
 
+To those wondering if you can use this feature to scan Youtube playlists,
+the answer is yes. Note however that you have to scan each page manually
+because abby is currently unable go over the playlist pages automatically.
 
-Notes
------
 
-abby supports keyboard shortcuts. These are visible in the menu. For example,
+Misc. notes
+-----------
+
+* abby supports keyboard shortcuts. These are visible in the menus. For example,
 Alt+A would open the "Add link" dialog.
 
-You can edit list items by double clicking them. This applies to all windows
+* You can edit list items by double clicking them. This applies to all windows
 and dialogs with list widgets.
 
+* You can paste multiple links by separating each link with a newline
+
+* Export saves all of the items in the list to a specified text file.
+Each link is separated with a newline.
+
+* Import parses text files line by line and expects each link to be
+separated with a newline.
+
+* Because c/clive parses input in a similar fashion, you can use the
+exported exported lists with c/clive, e.g.: cclive < exported.list
+
 
diff -Nru abby-0.4.7/src/exportdlg.cpp abby-0.4.8/src/exportdlg.cpp
--- abby-0.4.7/src/exportdlg.cpp	1970-01-01 01:00:00.000000000 +0100
+++ abby-0.4.8/src/exportdlg.cpp	2010-01-18 16:10:57.000000000 +0000
@@ -0,0 +1,40 @@
+/* 
+* Copyright (C) 2009 Toni Gundogdu.
+*
+* This program is free software: you can redistribute it and/or modify
+* it under the terms of the GNU General Public License as published by
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <QDialog>
+#include <QFileDialog>
+
+#include "exportdlg.h"
+
+ExportDialog::ExportDialog(QWidget *parent)
+    : QDialog(parent)
+{
+    setupUi(this);
+}
+
+void
+ExportDialog::onBrowse() {
+    const QString fname =
+        QFileDialog::getSaveFileName(this, tr("Choose file"));
+
+    if (fname.isEmpty())
+        return;
+
+    fileEdit->setText(fname);
+}
+
+
diff -Nru abby-0.4.7/src/exportdlg.h abby-0.4.8/src/exportdlg.h
--- abby-0.4.7/src/exportdlg.h	1970-01-01 01:00:00.000000000 +0100
+++ abby-0.4.8/src/exportdlg.h	2010-01-18 16:10:57.000000000 +0000
@@ -0,0 +1,35 @@
+/* 
+* Copyright (C) 2009 Toni Gundogdu.
+*
+* This program is free software: you can redistribute it and/or modify
+* it under the terms of the GNU General Public License as published by
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef exportdlg_h
+#define exportdlg_h
+
+#include "ui_exportdlg.h"
+
+class QDialog;
+
+class ExportDialog : public QDialog, public Ui::ExportDialog {
+    Q_OBJECT
+public:
+    ExportDialog(QWidget *parent);
+private slots:
+    void onBrowse();
+};
+
+#endif
+
+
diff -Nru abby-0.4.7/src/main.cpp abby-0.4.8/src/main.cpp
--- abby-0.4.7/src/main.cpp	2009-12-18 10:55:51.000000000 +0000
+++ abby-0.4.8/src/main.cpp	2010-01-18 16:10:57.000000000 +0000
@@ -29,7 +29,7 @@
 
     QCoreApplication::setOrganizationName  (APPNAME);
     QCoreApplication::setApplicationName   (APPNAME);
-    QCoreApplication::setApplicationVersion("0.4.7");
+    QCoreApplication::setApplicationVersion("0.4.8");
     QCoreApplication::setOrganizationDomain("abby.googlecode.com");
 
     QSettings settings;
diff -Nru abby-0.4.7/src/mainwnd.cpp abby-0.4.8/src/mainwnd.cpp
--- abby-0.4.7/src/mainwnd.cpp	2009-12-18 10:55:51.000000000 +0000
+++ abby-0.4.8/src/mainwnd.cpp	2010-01-18 16:10:57.000000000 +0000
@@ -33,6 +33,7 @@
 #include "scandlg.h"
 #include "formatdlg.h"
 #include "aboutdlg.h"
+#include "exportdlg.h"
 #include "util.h"
 
 #define critCcliveProcessFailed(parent, msg) \
@@ -895,4 +896,48 @@
     );
 }
 
+void
+MainWindow::onImport() {
+    QString fname =
+        QFileDialog::getOpenFileName(this, tr("Choose file"));
+
+    if (!fname.isEmpty()) {
+
+        QStringList lst;
+        if (!Util::importItems(this, lst, fname))
+            return;
+
+        for (QStringList::const_iterator iter = lst.begin();
+            iter != lst.end();
+            ++iter)
+        {
+            addPageLink(*iter);
+        }
+    }
+}
+
+void
+MainWindow::onExport() {
+
+    if (!linksList->count())
+        return;
+
+    ExportDialog dlg(this);
+    if (dlg.exec() == QDialog::Rejected)
+        return;
+
+    const QString path = dlg.fileEdit->text();
+
+    if (path.isEmpty()) {
+        QMessageBox::critical(
+            this,
+            QCoreApplication::applicationName(),
+            tr("Specify file name for the saved data")
+        );
+        return;
+    }
+
+    Util::exportItems(this, linksList, path, dlg.appendBox->isChecked());
+}
+
 
diff -Nru abby-0.4.7/src/mainwnd.h abby-0.4.8/src/mainwnd.h
--- abby-0.4.7/src/mainwnd.h	2009-12-18 10:55:51.000000000 +0000
+++ abby-0.4.8/src/mainwnd.h	2010-01-18 16:10:57.000000000 +0000
@@ -54,6 +54,8 @@
     void onProcFinished(int exitCode, QProcess::ExitStatus exitStatus);
     void onItemDoubleClicked(QListWidgetItem *item);
     void iconActivated(QSystemTrayIcon::ActivationReason);
+    void onImport();
+    void onExport();
 private:
     QStringMap hosts;
     PreferencesDialog *prefs;
diff -Nru abby-0.4.7/src/rssdlg.cpp abby-0.4.8/src/rssdlg.cpp
--- abby-0.4.7/src/rssdlg.cpp	2009-12-18 10:55:51.000000000 +0000
+++ abby-0.4.8/src/rssdlg.cpp	2010-01-18 16:10:57.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * abby Copyright (C) 2009 Toni Gundogdu.
+ * abby Copyright (C) 2009,2010 Toni Gundogdu.
  * This file is part of abby.
  *
  * abby is free software: you can redistribute it and/or modify
@@ -23,6 +23,7 @@
 #include <QDragEnterEvent>
 
 #include "util.h"
+#include "rssparser.h"
 #include "rssdlg.h"
 #include "feedmgrdlg.h"
 
@@ -127,11 +128,39 @@
     }
 
     if (currentFeed >= 0) {
-        parseRSS(mgr->getData());
+
+        RSSParser rss;
+
+        try {
+            rss.parse( mgr->getData() );
+
+            const RSSFeed *feed = rss.getFeed();
+
+            // Populate the tree.
+
+            QTreeWidgetItem *parent = new QTreeWidgetItem(itemsTree);
+            parent->setText(0, feed->title);
+
+            QLinkedListIterator<RSSItem*> iter(feed->items);
+
+            while (iter.hasNext()) {
+                RSSItem *item = iter.next();
+                QTreeWidgetItem *child = new QTreeWidgetItem(parent);
+                child->setCheckState(0, Qt::Unchecked);
+                child->setText(0, item->title);
+                child->setText(1, item->link);
+            }
+        }
+        catch (const RSSParserException& x) {
+            Util::appendLog(logEdit,
+                QString(tr("XML parsing error: %1: %2"))
+                    .arg(x.lineNumber)
+                    .arg(x.what)
+            );
+        }
 
         if (++currentFeed == expectedFeeds) {
             resetUI();
-            mgr->deleteLater();
             Util::appendLog(logEdit, tr("Done."));
             return;
         }
@@ -153,15 +182,14 @@
     Util::appendLog(logEdit, tr("Fetch ... ")+url);
 }
 
+#ifdef _1_
 void
 RSSDialog::parseRSS(const QString& rss) {
     xml.clear();
 
     QTreeWidgetItem *parent = 0;
     QString feedTitle, lnk, tag, itemTitle;
-#ifdef _1_
     QString pubDate;
-#endif
 
     xml.addData(rss);
 
@@ -191,9 +219,7 @@
 
                 itemTitle.clear();
                 lnk.clear();
-#ifdef _1_
                 pubDate.clear();
-#endif
             }
         }
         else if (xml.isCharacters() && !xml.isWhitespace()) {
@@ -202,10 +228,8 @@
                 itemTitle += tmp;
             else if (tag == "link")
                 lnk += tmp;
-#ifdef _1_
             else if (tag == "pubDate")
                 pubDate += tmp;
-#endif
         }
     }
 
@@ -219,6 +243,7 @@
         );
     }
 }
+#endif
 
 void
 RSSDialog::enableWidgets(const bool state/*=true*/) {
diff -Nru abby-0.4.7/src/rssdlg.h abby-0.4.8/src/rssdlg.h
--- abby-0.4.7/src/rssdlg.h	2009-12-18 10:55:51.000000000 +0000
+++ abby-0.4.8/src/rssdlg.h	2010-01-18 16:10:57.000000000 +0000
@@ -1,5 +1,5 @@
 /*
- * abby Copyright (C) 2009 Toni Gundogdu.
+ * abby Copyright (C) 2009,2010 Toni Gundogdu.
  * This file is part of abby.
  *
  * abby is free software: you can redistribute it and/or modify
@@ -22,8 +22,6 @@
 
 #include "httpmgr.h"
 
-#include <QXmlStreamReader>
-
 class RSSDialog : public QDialog, public Ui::rssDialog {
     Q_OBJECT
 public:
@@ -44,13 +42,11 @@
     void writeSettings();
 private:
     void readSettings();
-    void parseRSS(const QString& rss);
     void enableWidgets(const bool state=true);
     void resetUI();
     void addRSSLink(QString lnk);
 private:
     QPointer<QHttpManager> mgr;
-    QXmlStreamReader xml;
     int currentFeed;
     int expectedFeeds;
 protected:
diff -Nru abby-0.4.7/src/rssparser.cpp abby-0.4.8/src/rssparser.cpp
--- abby-0.4.7/src/rssparser.cpp	1970-01-01 01:00:00.000000000 +0100
+++ abby-0.4.8/src/rssparser.cpp	2010-01-18 16:10:57.000000000 +0000
@@ -0,0 +1,165 @@
+/* 
+* Copyright (C) 2010 Toni Gundogdu.
+*
+* This program is free software: you can redistribute it and/or modify
+* it under the terms of the GNU General Public License as published by
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "rssparser.h"
+
+RSSParser::RSSParser ()
+    : currItem(0), feed(0), is_image(false)
+{
+}
+
+RSSParser::~RSSParser() {
+    if (feed) {
+        while (!feed->items.isEmpty())
+            delete feed->items.takeFirst();
+        delete feed;
+        feed = 0;
+    }
+    currItem = 0;
+}
+
+void
+RSSParser::parse (const QString& data) {
+
+    xml.clear();
+    xml.addData(data);
+
+    feed     = 0;
+    currItem = 0;
+    is_image = false;
+
+    while (!xml.atEnd()) {
+        xml.readNext();
+        if (xml.isStartElement())
+            atStartElement();
+        else if (xml.isEndElement())
+            atEndElement();
+        else if (xml.isCharacters() && !xml.isWhitespace())
+            atChar();
+    }
+    if (xml.error())
+        throw RSSParserException(xml);
+}
+
+#define cmp(what) \
+    (QString::compare(name,what,Qt::CaseInsensitive) == 0)
+
+void
+RSSParser::atStartElement() {
+
+    const QString name = xml.name().toString();
+
+    if (cmp("channel"))
+        feed = new RSSFeed;
+
+    else if (cmp("item") && feed) {
+        currItem = new RSSItem;
+        feed->items << currItem;
+    }
+
+    else if (cmp("image") && feed)
+        is_image = true;
+}
+
+void
+RSSParser::atEndElement() {
+
+    if (!feed) return;
+
+    const QString name = xml.name().toString();
+    const QString tmp = text.simplified();
+
+    if (cmp("item"))
+        currItem = 0;
+
+    else if (cmp("image"))
+        is_image = false;
+
+    else if (cmp("title")) {
+
+        if (currItem)
+            currItem->title = tmp;
+
+        else if (is_image)
+            feed->imageTitle = tmp;
+
+        else
+            feed->title = tmp;
+    }
+
+    else if (cmp("link")) {
+
+        if (currItem)
+            currItem->link = tmp;
+
+        else if (is_image)
+            feed->imageLink = tmp;
+
+        else
+            feed->link = tmp;
+    }
+
+    else if (cmp("description")) {
+
+        if (currItem)
+            currItem->description = tmp;
+
+        else
+            feed->description = tmp;
+    }
+
+    else if (cmp("url") && is_image)
+        feed->imageUrl = tmp;
+
+    else if (cmp("language"))
+        feed->language = tmp;
+
+    else if (cmp("generator"))
+        feed->generator = tmp;
+
+    else if (cmp("copyright"))
+        feed->copyright = tmp;
+
+    else if (cmp("pubDate") && currItem)
+        currItem->pubDate = tmp;
+
+#ifdef _1_
+    else if (cmp("category") && currItem) { }
+#endif
+
+    text.clear();
+}
+
+void
+RSSParser::atChar() {
+    text += xml.text().toString();
+}
+
+RSSParserException::RSSParserException(
+    const QXmlStreamReader& xml)
+{
+    what        = xml.errorString();
+    lineNumber  = xml.lineNumber();
+    errorCode   = xml.error();
+}
+
+const RSSFeed*
+RSSParser::getFeed() const {
+    return feed;
+}
+
+
diff -Nru abby-0.4.7/src/rssparser.h abby-0.4.8/src/rssparser.h
--- abby-0.4.7/src/rssparser.h	1970-01-01 01:00:00.000000000 +0100
+++ abby-0.4.8/src/rssparser.h	2010-01-18 16:10:57.000000000 +0000
@@ -0,0 +1,80 @@
+/* 
+* Copyright (C) 2010 Toni Gundogdu.
+*
+* This program is free software: you can redistribute it and/or modify
+* it under the terms of the GNU General Public License as published by
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef rssparser_h
+#define rssparser_h
+
+#include <QXmlStreamReader>
+#include <QLinkedList>
+#include <QString>
+
+class RSSItem;
+class RSSParserException;
+
+class RSSItem {
+public:
+    QString title;
+    QString link;
+    QString description;
+    QString pubDate;
+};
+
+class RSSFeed {
+public:
+    QString title;
+    QString description;
+    QString link;
+    QString language;
+    QString generator;
+    QString copyright;
+    QString imageUrl;
+    QString imageTitle;
+    QString imageLink;
+    QLinkedList<RSSItem*> items;
+};
+
+class RSSParser {
+public:
+    RSSParser();
+    virtual ~RSSParser();
+public:
+    void parse(const QString& data);
+    const RSSFeed* getFeed() const;
+private:
+    void atStartElement();
+    void atEndElement();
+    void atChar();
+private:
+    QXmlStreamReader xml;
+    RSSItem *currItem;
+    RSSFeed *feed;
+    QString text;
+    bool is_image;
+};
+
+class RSSParserException {
+public:
+    RSSParserException(const QXmlStreamReader& xml);
+public:
+    QString what;
+    qint64 lineNumber;
+    QXmlStreamReader::Error errorCode;
+};
+
+#endif
+
+
diff -Nru abby-0.4.7/src/util.cpp abby-0.4.8/src/util.cpp
--- abby-0.4.7/src/util.cpp	2009-12-18 10:55:51.000000000 +0000
+++ abby-0.4.8/src/util.cpp	2010-01-18 16:10:57.000000000 +0000
@@ -29,6 +29,8 @@
 #include <QClipboard>
 #include <QCoreApplication>
 #include <QApplication>
+#include <QMessageBox>
+#include <QTextStream>
 //#include <QDebug>
 
 #include "util.h"
@@ -314,6 +316,71 @@
         Util::addItem(w, lst[i]);
 }
 
+static void
+msgbox_crit(
+    const QWidget *parent,
+    const QString msg)
+{
+    QMessageBox::critical(
+        const_cast<QWidget*>(parent),
+        QCoreApplication::applicationName(),
+        msg);
+}
+
+bool
+Util::importItems(
+    const QWidget *parent,
+    QStringList& lst,
+    const QString& path)
+{
+    QFile file(path);
+
+    if (!file.open(QFile::ReadOnly | QIODevice::Text)) {
+        msgbox_crit(parent,
+            QString( QObject::tr("File open error %1") ).arg( file.error() ));
+        return false;
+    }
+
+    QTextStream f(&file);
+
+    while (!f.atEnd())
+        lst.append(f.readLine().simplified());
+
+    return !lst.empty();
+}
+
+bool
+Util::exportItems(
+    const QWidget *parent,
+    const QListWidget *w,
+    const QString& path,
+    const bool& append)
+{
+    QFile file(path);
+
+    QFlags<QIODevice::OpenModeFlag> flags =
+        (QFile::WriteOnly | QIODevice::Text);
+
+    flags |=
+        append
+        ? QIODevice::Append
+        : QIODevice::Truncate;
+
+    if (!file.open(flags)) {
+        msgbox_crit(parent,
+            QString( QObject::tr("File open error %1") ).arg( file.error() ));
+        return false;
+    }
+
+    QTextStream out(&file);
+
+    const int size = w->count();
+    for (int i=0; i<size; ++i)
+        out << w->item(i)->text() << "\n";
+
+    return true;
+}
+
 NoCcliveException::NoCcliveException(const QString& errmsg)
     : errmsg(errmsg)
 {
diff -Nru abby-0.4.7/src/util.h abby-0.4.8/src/util.h
--- abby-0.4.7/src/util.h	2009-12-18 10:55:51.000000000 +0000
+++ abby-0.4.8/src/util.h	2010-01-18 16:10:57.000000000 +0000
@@ -54,6 +54,10 @@
     static void removeSelectedItems(const QWidget *parent, const QListWidget *w);
     static void clearItems(const QWidget *parent, const QListWidget *w);
     static void paste(const QListWidget *w);
+    static bool importItems(const QWidget *parent,
+        QStringList& lst, const QString& path);
+    static bool exportItems(const QWidget *parent,
+        const QListWidget *w, const QString& path, const bool& append);
 };
 
 class NoCcliveException {
diff -Nru abby-0.4.7/TODO abby-0.4.8/TODO
--- abby-0.4.7/TODO	2009-12-18 10:55:51.000000000 +0000
+++ abby-0.4.8/TODO	2010-01-18 16:10:57.000000000 +0000
@@ -3,19 +3,25 @@
 
 0.4.x
 -----
-* w32: minimize to tray does not hide abby from taskbar
+
 
 0.5.0
 -----
-* cleanup: remove excess code
-  - common code -> src/util.(cpp|h)
-  - e.g. HTTP redirect code (rss/scan)
+* add support for multi-segment videos (will appear in cclive 0.6.0)
+  - clive is not planned to port these changes from cclive
 
-0.6.0
------
-* integrate with libquvi?
 
-Unspecified
------------
+Postponed: volunteers needed
+----------------------------
+
+This section lists items that will be postponed until a volunteer
+stands up to assist.
+
+* w32: minimize to tray does not hide abby from taskbar
+  - No idea how to fix this
+
 * proper application icon to replace the current "TODO" icon
   - 32x32 or higher (24bit preferably)
+  - There is a reason I'm a programmer
+
+

Reply via email to