Index: smart/interfaces/text/progress.py
===================================================================
--- smart/interfaces/text/progress.py	(revisão 749)
+++ smart/interfaces/text/progress.py	(cópia de trabalho)
@@ -113,7 +113,7 @@
         if not done:
             speed = data.get("speed")
             if speed:
-                suffix = "(%s - %d%%)\r" % (speed, current)
+                suffix = "(%s - %d%% - ETA %s)\r" % (speed, current, data.get("eta"))
             else:
                 suffix = "(%3d%%)\r" % current
         elif subpercent is None:
Index: smart/interfaces/gtk/progress.py
===================================================================
--- smart/interfaces/gtk/progress.py	(revisão 749)
+++ smart/interfaces/gtk/progress.py	(cópia de trabalho)
@@ -80,6 +80,7 @@
                                             gobject.TYPE_STRING,
                                             gobject.TYPE_STRING,
                                             gobject.TYPE_STRING,
+                                            gobject.TYPE_STRING,
                                             gobject.TYPE_STRING)
             self._treeview = gtk.TreeView(self._treemodel)
             self._treeview.show()
@@ -111,6 +112,12 @@
 
             renderer = gtk.CellRendererText()
             renderer.set_fixed_height_from_font(True)
+            column = gtk.TreeViewColumn(_("ETA"), renderer, text=5)
+            self._etacolumn = column
+            self._treeview.append_column(column)
+
+            renderer = gtk.CellRendererText()
+            renderer.set_fixed_height_from_font(True)
             column = gtk.TreeViewColumn(_("Description"), renderer, text=1)
             column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
             self._treeview.append_column(column)
@@ -160,6 +167,7 @@
             self._currentcolumn.set_visible(False)
             self._totalcolumn.set_visible(False)
             self._speedcolumn.set_visible(False)
+            self._etacolumn.set_visible(False)
 
         thread.start_new_thread(self.tick, ())
 
@@ -211,8 +219,11 @@
             speed = data.get("speed", "")
             if speed:
                 self._speedcolumn.set_visible(True)
-            if current or total or speed:
-                self._treemodel.set(iter, 2, current, 3, total, 4, speed)
+            eta = data.get("eta", "")
+            if eta:
+                self._etacolumn.set_visible(True)
+            if current or total or speed or eta:
+                self._treemodel.set(iter, 2, current, 3, total, 4, speed, 5, eta)
                 subtopic = self._shorturl.get(subtopic)
             self._treemodel.set(iter, 0, subpercent, 1, subtopic)
         else:
Index: smart/fetcher.py
===================================================================
--- smart/fetcher.py	(revisão 749)
+++ smart/fetcher.py	(cópia de trabalho)
@@ -20,7 +20,7 @@
 # along with Smart Package Manager; if not, write to the Free Software
 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 #
-from smart.util.strtools import sizeToStr, speedToStr
+from smart.util.strtools import sizeToStr, speedToStr, secondsToStr
 from smart.media import MediaSet, DeviceMedia
 from smart.uncompress import Uncompressor
 from smart.mirror import MirrorSystem
@@ -67,6 +67,7 @@
         self._activedownloadslock = thread.allocate_lock()
         self._maxactivedownloads = 0
         self.time = 0
+        self._eta = 0
 
     def reset(self):
         self._items.clear()
@@ -261,6 +262,7 @@
                       not item.getInfo("uncomp")):
                     if updatespeed:
                         item.updateSpeed()
+                        item.updateETA()
                     continue
                 localpath = item.getTargetPath()
                 if localpath in uncompchecked:
@@ -512,6 +514,7 @@
                 subdata["current"] = sizeToStr(current)
                 subdata["total"] = sizeToStr(total)
                 subdata["speed"] = speedToStr(self._speed)
+                subdata["eta"] = secondsToStr(self._eta)
                 self._progress.setSub(self._urlobj.original, current, total, 1,
                                       subdata)
                 self._progress.show()
@@ -532,6 +535,13 @@
                 self._speedcurrent = self._current
                 self.progress(self._current, self._total)
 
+    def updateETA(self):
+        if self._status is RUNNING:
+            if (self._speed > 0) and (self._info.get("size") > 0):
+              self._eta = (self._info.get("size") - self._current) / self._speed
+            else:
+              self._eta = None
+
     def setSucceeded(self, targetpath, fetchedsize=0):
         if self._status is not FAILED:
             self._status = SUCCEEDED
Index: smart/util/strtools.py
===================================================================
--- smart/util/strtools.py	(revisão 749)
+++ smart/util/strtools.py	(cópia de trabalho)
@@ -71,6 +71,23 @@
     else:
         return "%.1fMB/s" % (speed/1024000.)
 
+def secondsToStr(time):
+    if not time:
+        return "Unknown"
+    elif time == 0:
+        return "0s"
+    elif time < 1:
+        return "1s"
+    else:
+        minutes, seconds = divmod(time, 60)
+        hours, minutes = divmod(minutes, 60)
+        if hours > 0:
+            return "%02ih%02im%02is" % (hours, minutes, seconds)
+        elif minutes > 0:
+            return "%02im%02is" % (minutes, seconds)
+        else:
+            return "%02is" % seconds
+
 _nulltrans = string.maketrans('', '')
 def isRegEx(s):
     return s.translate(_nulltrans, '^{[*') != s
