diff options
Diffstat (limited to 'module/network/XDCCRequest.py')
-rw-r--r-- | module/network/XDCCRequest.py | 84 |
1 files changed, 33 insertions, 51 deletions
diff --git a/module/network/XDCCRequest.py b/module/network/XDCCRequest.py index f03798c17..c49f418c4 100644 --- a/module/network/XDCCRequest.py +++ b/module/network/XDCCRequest.py @@ -1,21 +1,5 @@ -#!/usr/bin/env python # -*- coding: utf-8 -*- -""" - 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/>. - - @author: jeix -""" +# @author: jeix import socket import re @@ -28,22 +12,21 @@ from time import time import struct from select import select -from module.plugins.Plugin import Abort +from pyload.plugin.Plugin import Abort -class XDCCRequest(): +class XDCCRequest(object): def __init__(self, timeout=30, proxies={}): - + self.proxies = proxies self.timeout = timeout - + self.filesize = 0 self.recv = 0 self.speed = 0 - + self.abort = False - def createSocket(self): # proxytype = None # proxy = None @@ -60,78 +43,77 @@ class XDCCRequest(): # else: # sock = socket.socket() # return sock - + return socket.socket() - - def download(self, ip, port, filename, irc, progressNotify=None): + + def download(self, ip, port, filename, irc, progress=None): ircbuffer = "" lastUpdate = time() cumRecvLen = 0 - + dccsock = self.createSocket() - + dccsock.settimeout(self.timeout) dccsock.connect((ip, port)) - + if exists(filename): i = 0 nameParts = filename.rpartition(".") while True: newfilename = "%s-%d%s%s" % (nameParts[0], i, nameParts[1], nameParts[2]) i += 1 - + if not exists(newfilename): filename = newfilename break - + fh = open(filename, "wb") - + # recv loop for dcc socket while True: if self.abort: dccsock.close() fh.close() remove(filename) - raise Abort() - + raise Abort + self._keepAlive(irc, ircbuffer) - + data = dccsock.recv(4096) dataLen = len(data) self.recv += dataLen - + cumRecvLen += dataLen - + now = time() timespan = now - lastUpdate - if timespan > 1: + if timespan > 1: self.speed = cumRecvLen / timespan cumRecvLen = 0 lastUpdate = now - - if progressNotify: - progressNotify(self.percent) - - + + if progress: + progress(self.percent) + if not data: break - + fh.write(data) - + # acknowledge data by sending number of recceived bytes dccsock.send(struct.pack('!I', self.recv)) - + dccsock.close() fh.close() - + return filename - - def _keepAlive(self, sock, readbuffer): + + def _keepAlive(self, sock, *readbuffer): fdset = select([sock], [], [], 0) if sock not in fdset[0]: return - + readbuffer += sock.recv(1024) temp = readbuffer.split("\n") readbuffer = temp.pop() @@ -144,7 +126,7 @@ class XDCCRequest(): def abortDownloads(self): self.abort = True - + @property def size(self): return self.filesize |