forked from MaximeCheramy/pyrex
/
downloads.py
147 lines (119 loc) · 4.39 KB
/
downloads.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
# coding=utf-8
from datetime import date
from PyQt4.QtCore import QFile, QUrl, QObject, QIODevice
from PyQt4.QtNetwork import QFtp
from Share import AnalyseShare
from DefaultHandler import DefaultHandler
import Tools
class Download(QObject):
def __init__(self, file_share, local_path, date):
QObject.__init__(self)
self._file_share = file_share
self._local_path = local_path
self._date = date
self._state = 5
@classmethod
def get_download(cls, file_share, local_path, date):
# TODO DownloadSmb
return DownloadFtp(file_share, local_path, date)
@property
def date(self):
return self._date
@property
def file_share(self):
return self._file_share
@property
def local_path(self):
return self._local_path
def get_progress(self):
p = 100.0 * float(self.read_bytes) / self._file_share.size
read_bytes_str = Tools.convert_size_str(self.read_bytes)
return '%d%% (%s / %s)' % (int(p), read_bytes_str, self._file_share.str_size)
@property
def state(self):
if self._state == 1:
return 'Connexion...'
elif self._state == 2:
return u'En attente'
elif self._state == 3:
return u'Téléchargement'
elif self._state == 4:
return u'Terminé'
elif self._state == 5:
return u'En pause'
elif self._state == 6:
return u'Connexion interrompue'
class DownloadFtp(Download):
def __init__(self, file_share, local_path, date):
Download.__init__(self, file_share, local_path, date)
self.ftp = QFtp(self)
self.ftp.dataTransferProgress.connect(self.update_progress)
self.ftp.done.connect(self.download_finished)
self.ftp.stateChanged.connect(self.state_changed)
self.url = QUrl(self._file_share.url)
self.out_file = QFile(self.local_path)
self.read_bytes = self.out_file.size()
def start_download(self):
self.ftp.connectToHost(self.url.host(), self.url.port(21))
self.ftp.login()
if self.out_file.open(QIODevice.WriteOnly):
self.ftp.get(self.url.path(), self.out_file)
def stop(self):
self.ftp
def state_changed(self, state):
if state == 1 or state == 2:
self._state = 1
def download_finished(self, _):
print "finished !"
def update_progress(self, read_bytes, total_bytes):
self.read_bytes = read_bytes
class AnalyseDownload(object):
def __init__(self):
self.analyse_share = None
self.share = None
self.download = None
self.local_path = None
self.date = None
def open(self, name, attrs):
if name == "share":
self.analyse_share = AnalyseShare()
if self.analyse_share:
self.analyse_share.open(name, attrs)
def close(self, name, buf):
if self.analyse_share:
self.analyse_share.close(name, buf)
if name == "share":
self.share = self.analyse_share.share
self.analyse_share = None
elif name == "download":
self.download = Download.get_download(self.share, self.local_path, self.date)
elif name == "localpath":
self.local_path = buf
elif name == "status":
self.status = buf
elif name == "date":
self.date = date.fromtimestamp(int(buf) / 1000)
class AnalyseDownloads(DefaultHandler):
def __init__(self, callback):
DefaultHandler.__init__(self)
self.downloads = None
self.callback = callback
self.analyse_download = None
def startElement(self, name, attrs):
DefaultHandler.startElement(self, name, attrs)
if name == "downloads":
self.downloads = []
elif name == "download":
self.analyse_download = AnalyseDownload()
if self.analyse_download:
self.analyse_download.open(name, attrs)
def endElement(self, name):
if "download" in self.opened:
self.analyse_download.close(name, self.buf)
if self.analyse_download.download:
self.downloads.append(self.analyse_download.download)
self.analyse_download = None
else:
if name == "downloads":
self.callback(self.downloads)
DefaultHandler.endElement(self, name)