Member of The Internet Defense League Últimos cambios
Últimos Cambios
Blog personal: El hilo del laberinto Geocaching

Pausar una descarga, pero mantener la subida

Última Actualización: 29 de noviembre de 2010 - Lunes

A veces el disco duro del P2P está lleno. Cuando el disco se llena durante una descarga, el torrent en cuestión "muere". Deja de descargar (disco lleno), pero también deja de subir lo ya descargado.

Esto es un problema cuando estamos trabajando con trackers BitTorrent con cuota: dejamos de subir lo ya descargado. Además, resulta muy inconveniente no tener un control mínimo del uso del disco duro.

Una posibilidad simple sería poder pausar la descarga de un torrent, manteniendo su subida abierta. De esta forma podemos parar una descarga cuando se nos está llenando el disco, pero seguimos subiendo, mejorando nuestro SR (Share Ratio) aunque no tengamos espacio en disco para descargar el fichero completo.

Para controlar esta funcionalidad usamos el teclado, sobre la visualización "curses". Para ello escribimos el número del torrent que nos interesa modificar, seguido del símbolo "+" o "-". Si pulsamos "-", pausamos el torrent. Si pulsamos "+", reactivamos la descarga.

El parche:

diff -r f1e7ca443756 -r ea59da1098f3 BitTornado/download_bt1.py
--- a/BitTornado/download_bt1.py        Thu May 27 20:12:20 2010 +0200
+++ b/BitTornado/download_bt1.py        Mon Jun 07 17:58:00 2010 +0200
@@ -327,6 +327,8 @@
 
         self.completado = False
 
+        self._download_pause = False
+
         self.info = self.response['info']
 
         if "length" in self.info :
@@ -373,6 +375,11 @@
                              self.picker, self.finflag.isSet)
 
 
+    def download_pause(self, flag) :
+        self._download_pause = flag
+        if self.downloader is not None :
+            self.downloader.pause(flag)
+
     def checkSaveLocation(self, loc):
         if self.info.has_key('length'):
             return path.exists(loc)
@@ -625,6 +632,10 @@
             self._received_data, self.config['snub_time'], self.config['auto_kick'],
             self._kick_peer, self._ban_peer)
         self.downloader.set_download_rate(self.config['max_download_rate'])
+
+        if self._download_pause :
+            self.downloader.pause(True)
+
         self.connecter = Connecter(self._make_upload, self.downloader, self.choker,
                             self.len_pieces, self.upmeasure, self.config,
                             self.ratelimiter, self.rawserver.add_task)
diff -r f1e7ca443756 -r ea59da1098f3 BitTornado/launchmanycore.py
--- a/BitTornado/launchmanycore.py      Thu May 27 20:12:20 2010 +0200
+++ b/BitTornado/launchmanycore.py      Mon Jun 07 17:58:00 2010 +0200
@@ -294,8 +294,10 @@
             else:
                 msg = ''
 
+            d_paused = d.d._download_pause
+
             return (name, status, progress, peers, seeds, seedsmsg, dist,
-                          uprate, dnrate, upamt, dnamt, size, t, msg)
+                          uprate, dnrate, upamt, dnamt, size, t, msg, d_paused, d.d)
 
         stop = self.Output.display(self.ratelimiter.get_upload_rate(),
                 download_rate, request_stats, self.torrent_list)
diff -r f1e7ca443756 -r ea59da1098f3 btlaunchmanycurses.py
--- a/btlaunchmanycurses.py     Thu May 27 20:12:20 2010 +0200
+++ b/btlaunchmanycurses.py     Mon Jun 07 17:58:00 2010 +0200
@@ -103,6 +103,8 @@
         self.messages = []
         self.scroll_pos = 0
         self.scroll_time = 0
+
+        self._number_entered = ""
         
         self.scrwin = scrwin
         signal(SIGWINCH, self.winch_handler)
@@ -211,14 +213,20 @@
                 if self._display_line(''):
                     break
             ( name, status, progress, peers, seeds, seedsmsg, dist,
-              uprate, dnrate, upamt, dnamt, size, t, msg ) = request_stats(data[ii])
+              uprate, dnrate, upamt, dnamt, size, t, msg, d_paused, d) = request_stats(data[ii])
             t = fmttime(t)
             if t:
                 status = t
             name = ljust(name,self.mainwinw-32)
             size = rjust(fmtsize(size),8)
-            uprate = rjust('%s/s' % fmtsize(uprate),10)
-            dnrate = rjust('%s/s' % fmtsize(dnrate),10)
+            if False :
+                uprate = rjust('PAUSED',10)
+            else :
+                uprate = rjust('%s/s' % fmtsize(uprate),10)
+            if d_paused :
+                dnrate = rjust('PAUSED',10)
+            else :
+                dnrate = rjust('%s/s' % fmtsize(dnrate),10)
             line = "%3d %s%s%s%s" % (ii+1, name, size, dnrate, uprate)
             self._display_line(line, True)
             if peers + seeds:
@@ -236,6 +244,21 @@
             return
 
         inchar = self.mainwin.getch()
+
+        if (inchar >= 0) and (inchar < 256) :
+            import string
+            inchar2 = chr(inchar)
+            if inchar2 in string.digits :
+                self._number_entered += inchar2
+            else :
+                 n = int("0"+self._number_entered)
+                 if (n>0) and (n<=len(data)) :
+                    if inchar2 == "+" :
+                         request_stats(data[n-1])[-1].download_pause(False)
+                     elif inchar2 == "-" :
+                         request_stats(data[n-1])[-1].download_pause(True)
+                 self._number_entered = ""
+
         if inchar == 12: # ^L
             self._remake_window()


Historia

  • 29/nov/10: Primera versión de esta página.



Python Zope ©2010 jcea@jcea.es

Más información sobre los OpenBadges

Donación BitCoin: 19niBN42ac2pqDQFx6GJZxry2JQSFvwAfS