1818from utils import HttpUtil
1919
2020
21- def download (url , filename , headers = HttpUtil .header ):
22- t = DownloadWorkerThread (url , filename , headers = headers )
21+ def download (url , file_name , headers = HttpUtil .header ):
22+ t = DownloadWorkerThread (url , file_name , headers = headers )
2323 t .start ()
2424 return t
2525
@@ -28,15 +28,15 @@ def download(url, filename, headers=HttpUtil.header):
2828class DownloadWorkerThread (threading .Thread ):
2929 thread_count = 5
3030 file_lock = threading .Lock ()
31- fileinfo_lock = threading .Lock ()
31+ file_info_lock = threading .Lock ()
3232
33- def __init__ (self , url , filename , headers = {}, thread_count = 3 ):
33+ def __init__ (self , url , file_name , headers = {}, thread_count = 3 ):
3434 threading .Thread .__init__ (self )
3535 self .content_length = self .get_content_length ()
3636 self .range_manager = self .read_range_file ()
37- self .filename = filename
37+ self .filename = file_name
3838 self .url = url
39- self .fileinfo_name = filename + ".tmp"
39+ self .file_info_name = file_name + ".tmp"
4040 self .headers = headers
4141 self .thread_count = thread_count
4242
@@ -62,23 +62,23 @@ def write_content(self, content, content_range):
6262 f .write (content )
6363 self .file_lock .release ()
6464
65- self .fileinfo_lock .acquire ()
65+ self .file_info_lock .acquire ()
6666 self .range_manager .set_written_range (content_range )
67- self .fileinfo_lock .release ()
67+ self .file_info_lock .release ()
6868
6969 def read_next_range (self ):
70- self .fileinfo_lock .acquire ()
70+ self .file_info_lock .acquire ()
7171 time .sleep (0.1 )
7272 r = self .range_manager .get_unwritten_range ()
73- self .fileinfo_lock .release ()
73+ self .file_info_lock .release ()
7474 return r
7575
7676 def read_range_file (self ):
77- self .fileinfo_lock .acquire ()
77+ self .file_info_lock .acquire ()
7878 manager = None
79- if os .path .exists (self .fileinfo_name ):
80- print ("read filename " , self .fileinfo_name )
81- manager = DownloadWorkerThread .FileInfoManager (self .fileinfo_name , url = self .url )
79+ if os .path .exists (self .file_info_name ):
80+ print ("read filename " , self .file_info_name )
81+ manager = DownloadWorkerThread .FileInfoManager (self .file_info_name , url = self .url )
8282 self .content_length = manager .get_total_length ()
8383 if self .url .strip () == "" :
8484 self .url = manager .url_in_file
@@ -87,9 +87,9 @@ def read_range_file(self):
8787 print ("create filename_info length:" , str (self .content_length ))
8888 with open (self .filename , "wb+" ) as f :
8989 f .seek (self .content_length )
90- manager = DownloadWorkerThread .FileInfoManager (self .fileinfo_name , url = self .url ,
90+ manager = DownloadWorkerThread .FileInfoManager (self .file_info_name , url = self .url ,
9191 filesize = self .content_length )
92- self .fileinfo_lock .release ()
92+ self .file_info_lock .release ()
9393 return manager
9494
9595 def get_content_length (self ):
@@ -106,7 +106,7 @@ def range_worker(self, download_worker):
106106 while True :
107107 content_range = download_worker .read_next_range ()
108108 if content_range == 0 :
109- os .remove (self .fileinfo_name )
109+ os .remove (self .file_info_name )
110110 print (self .filename + " finished" )
111111 break
112112 headers = download_worker .headers
@@ -127,114 +127,116 @@ def range_worker(self, download_worker):
127127 print ("Downloading " + download_worker .url + " error. Now Exit Thread." )
128128 return
129129
130- class FileInfoManager ():
131- url_in_file = ""
132- writing_range = []
133- written_range = []
134- unwritten_range = []
135-
136- def __init__ (self , filename , url = "" , file_size = 0 ):
137- self .filename = filename
138- if not os .path .exists (filename ):
139- with open (filename , "w" ) as f :
140- f .write ("unwritten_range=[(0," + str (file_size ) + ")]\r \n " )
141- f .write ("writing_range=[]\r \n " )
142- f .write ("written_range=[]\r \n " )
143- f .write ("url_in_file=" + url )
144- self .unwritten_range .append ((0 , file_size ))
145- self .url_in_file = url
146- else :
147- with open (filename , "r" ) as f :
148- for l in f .readlines ():
149- typ = l .split ("=" )[0 ]
150- if typ == "writing_range" :
151- typ = "unwritten_range"
152- elif typ == "url_in_file" :
153- if url .strip () == "" :
154- self .url_in_file = l .split ("=" )[1 ]
155- else :
156- self .url_in_file = url
130+
131+ def _concat (intervals , new_interval ):
132+ if len (intervals ) == 0 :
133+ return [new_interval ]
134+ response = [new_interval ]
135+ for interval in intervals :
136+ i = response .pop ()
137+ if interval [0 ] == interval [1 ]:
138+ continue
139+ if i [0 ] > interval [1 ]:
140+ response .append (interval )
141+ response .append (i )
142+ elif i [1 ] < interval [0 ]:
143+ response .append (i )
144+ response .append (interval )
145+ else :
146+ response .append ((min (i [0 ], interval [0 ]), max (i [1 ], interval [1 ])))
147+ return response
148+
149+
150+ class FileInfoManager :
151+ url_in_file = ""
152+ writing_range = []
153+ written_range = []
154+ unwritten_range = []
155+
156+ def __init__ (self , file_name , url = "" , file_size = 0 ):
157+ self .filename = file_name
158+ if not os .path .exists (file_name ):
159+ with open (file_name , "w" ) as f :
160+ f .write ("unwritten_range=[(0," + str (file_size ) + ")]\r \n " )
161+ f .write ("writing_range=[]\r \n " )
162+ f .write ("written_range=[]\r \n " )
163+ f .write ("url_in_file=" + url )
164+ self .unwritten_range .append ((0 , file_size ))
165+ self .url_in_file = url
166+ else :
167+ with open (file_name , "r" ) as f :
168+ for l in f .readlines ():
169+ typ = l .split ("=" )[0 ]
170+ if typ == "writing_range" :
171+ typ = "unwritten_range"
172+ elif typ == "url_in_file" :
173+ if url .strip () == "" :
174+ self .url_in_file = l .split ("=" )[1 ]
175+ else :
176+ self .url_in_file = url
177+ continue
178+ for tup in l .split ("=" )[1 ][1 :- 3 ].split ('),' ):
179+ if tup == "" :
157180 continue
158- for tup in l .split ("=" )[1 ][1 :- 3 ].split ('),' ):
159- if tup == "" :
160- continue
161- if tup .find ("(" ) != 0 :
162- tup = tup [tup .find ("(" ):]
163- if tup .find (")" ) != 0 :
164- tup = tup [:tup .find (")" )]
165- getattr (self , typ ).append ((int (tup .split ("," )[0 ][1 :]), int (tup .split ("," )[1 ])))
166-
167- def get_total_length (self ):
168- if len (self .unwritten_range ) > 0 :
169- return self .unwritten_range [- 1 ][1 ]
170- elif len (self .writing_range ) > 0 :
171- return self .writing_range [- 1 ][1 ]
172- elif len (self .written_range ) > 0 :
173- return self .written_range [- 1 ][1 ]
181+ if tup .find ("(" ) != 0 :
182+ tup = tup [tup .find ("(" ):]
183+ if tup .find (")" ) != 0 :
184+ tup = tup [:tup .find (")" )]
185+ getattr (self , typ ).append ((int (tup .split ("," )[0 ][1 :]), int (tup .split ("," )[1 ])))
186+
187+ def get_total_length (self ):
188+ if len (self .unwritten_range ) > 0 :
189+ return self .unwritten_range [- 1 ][1 ]
190+ elif len (self .writing_range ) > 0 :
191+ return self .writing_range [- 1 ][1 ]
192+ elif len (self .written_range ) > 0 :
193+ return self .written_range [- 1 ][1 ]
194+ return 0
195+
196+ def _save_to_file (self ):
197+ with open (self .filename , "w" ) as f :
198+ f .write ("writing_range=" + str (self .writing_range ) + "\r \n " )
199+ f .write ("unwritten_range=" + str (self .unwritten_range ) + "\r \n " )
200+ f .write ("written_range=" + str (self .written_range ) + "\r \n " )
201+ f .write ("url_in_file=" + self .url_in_file )
202+
203+ def _splice (self , intervals , new_interval ):
204+ if len (intervals ) == 0 :
205+ return []
206+ intervals = _concat (intervals , (0 , 0 ))
207+ response = []
208+ for interval in intervals :
209+ if interval [0 ] == interval [1 ]:
210+ continue
211+ if interval [0 ] > new_interval [1 ]:
212+ response .append (interval )
213+ elif interval [1 ] < new_interval [0 ]:
214+ response .append (interval )
215+ else :
216+ max_range = (min (interval [0 ], new_interval [0 ]), max (interval [1 ], new_interval [1 ]))
217+ if max_range != new_interval :
218+ left = (min (max_range [0 ], new_interval [0 ]), max (max_range [0 ], new_interval [0 ]))
219+ right = (min (max_range [1 ], new_interval [1 ]), max (max_range [1 ], new_interval [1 ]))
220+ if left [0 ] != left [1 ]:
221+ response .append (left )
222+ if right [0 ] != right [1 ]:
223+ response .append (right )
224+ return response
225+
226+ def get_unwritten_range (self , size = 1024 * 1024 ):
227+ if len (self .unwritten_range ) == 0 :
174228 return 0
229+ r = self .unwritten_range [0 ]
230+ r = (r [0 ], min (r [0 ] + size , r [1 ]))
231+ self .unwritten_range = self ._splice (self .unwritten_range , r )
232+ self .writing_range = _concat (self .writing_range , r )
233+ self ._save_to_file ()
234+ return r
175235
176- def _save_to_file (self ):
177- with open (self .filename , "w" ) as f :
178- f .write ("writing_range=" + str (self .writing_range ) + "\r \n " )
179- f .write ("unwritten_range=" + str (self .unwritten_range ) + "\r \n " )
180- f .write ("written_range=" + str (self .written_range ) + "\r \n " )
181- f .write ("url_in_file=" + self .url_in_file )
182-
183- def _splice (self , intervals , new_interval ):
184- if len (intervals ) == 0 :
185- return []
186- intervals = self ._concat (intervals , (0 , 0 ))
187- response = []
188- for interval in intervals :
189- if interval [0 ] == interval [1 ]:
190- continue
191- if interval [0 ] > new_interval [1 ]:
192- response .append (interval )
193- elif interval [1 ] < new_interval [0 ]:
194- response .append (interval )
195- else :
196- max_range = (min (interval [0 ], new_interval [0 ]), max (interval [1 ], new_interval [1 ]))
197- if max_range != new_interval :
198- left = (min (max_range [0 ], new_interval [0 ]), max (max_range [0 ], new_interval [0 ]))
199- right = (min (max_range [1 ], new_interval [1 ]), max (max_range [1 ], new_interval [1 ]))
200- if left [0 ] != left [1 ]:
201- response .append (left )
202- if right [0 ] != right [1 ]:
203- response .append (right )
204- return response
205-
206- def _concat (self , intervals , new_interval ):
207- if len (intervals ) == 0 :
208- return [new_interval ]
209- response = [new_interval ]
210- for interval in intervals :
211- i = response .pop ()
212- if interval [0 ] == interval [1 ]:
213- continue
214- if i [0 ] > interval [1 ]:
215- response .append (interval )
216- response .append (i )
217- elif i [1 ] < interval [0 ]:
218- response .append (i )
219- response .append (interval )
220- else :
221- response .append ((min (i [0 ], interval [0 ]), max (i [1 ], interval [1 ])))
222- return response
223-
224- def get_unwritten_range (self , size = 1024 * 1024 ):
225- if len (self .unwritten_range ) == 0 :
226- return 0
227- r = self .unwritten_range [0 ]
228- r = (r [0 ], min (r [0 ] + size , r [1 ]))
229- self .unwritten_range = self ._splice (self .unwritten_range , r )
230- self .writing_range = self ._concat (self .writing_range , r )
231- self ._save_to_file ()
232- return r
233-
234- def set_written_range (self , content_range ):
235- self .writing_range = self ._splice (self .writing_range , content_range )
236- self .written_range = self ._concat (self .written_range , content_range )
237- self ._save_to_file ()
236+ def set_written_range (self , content_range ):
237+ self .writing_range = self ._splice (self .writing_range , content_range )
238+ self .written_range = _concat (self .written_range , content_range )
239+ self ._save_to_file ()
238240
239241
240242# t = DownloadWorkerThread(r'http://a3.kuaihou.com/ruanjian/ucdnb.zip', 'd:\\ucdnb.zip', header)
0 commit comments