#-*-coding:utf8;-*-
import threading
from threading import Thread
from Queue import Queue
import sys,time,os,socket,glob,urllib2,re,urllib
"""
############################################################
#- File downloader
#- http://www.qpython.club
############################################################
"""
indirme_parca_boyutu= 2 # MB telefonun ramina yazilacak miktar
maxthreads = 30 # Ayni anda calisak indirme yapan dügümler
byt_boyutu=50000 # herbir dügümün indirecegi byte
def yaz1(parametre, time_sleep = 0.001):
for i in parametre:
time.sleep(time_sleep)
sys.stdout.write(i)
sys.stdout.flush()
y='File Downloader'
a='http://www.qpython.club'
b='by oktay811'
des= '#'*60
yaz1(des+'\n\n- '+y+'\n\n- '+a+'\n\n- '+b+'\n\n'+des+'\n',0.001)
def bilgiler(url):
requ=urllib2.Request(url)
resp=urllib2.urlopen(requ, timeout=10)
try:
boyut = resp.headers['content-length']
typefile = resp.headers['Content-Type']
yaz1("\n\nboyut="+str(int(boyut)/int(1024*1024))+"MB"+"\n"+"type="+str(typefile)+"\n")
except: #socket.error:
time.sleep(1)
bilgiler(url)
return boyut
def buildRange(value, numsplits):
global part,toplam
lst = []
for i in range(numsplits):
if i == 0:
lst.append('%s-%s' % (i, int(round(1 + i * value/(numsplits*1.0) + value/(numsplits*1.0)-1, 0))))
else:
lst.append('%s-%s' % (int(round(1 + i * value/(numsplits*1.0),0)), int(round(1 + i * value/(numsplits*1.0) + value/(numsplits*1.0)-1, 0))))
try:
log_list=[line.rstrip() for line in open(str(filename)+".log.txt")]
lst1=[kalan for kalan in lst if not kalan in log_list]
partlar=[i for i in log_list if i.startswith('part')]
part=part+int(partlar.pop(-1).split("part=")[1])+1
toplamlar=[i for i in log_list if i.startswith('toplam')]
toplam=toplam+int(toplamlar.pop(-1).split("toplam=")[1])
yaz1("\n Kaldigi yerden devam edecek",0.02)
return lst1
except:
return lst
def basla3(url, sira):
while True: #threading.activeCount() >= int(2):
ilk,son=sira.get().split("-")
basla(url, ilk, son)
sira.task_done()
def basla(url,ilk,son):
global toplam,f, icerik
aralik=ilk+"-"+son
try:
request = urllib2.Request(url)
request.headers['Range'] = 'bytes={}'.format(str(aralik))
base = urllib2.urlopen(request).read()
icerik.append([ilk,int(son)-int(ilk),base,aralik])
toplam+=int(son)-int(ilk)
print(str(toplam/(1024*1024))+" MB / "+str(boyut/(1024*1024))+" MB ")
except urllib2.URLError, e:
basla(url,ilk,son)
except KeyError, e:
basla(url, ilk, son)
except socket.error, e:
basla(url, ilk, son)
except IndexError, e:
basla(url, ilk, son)
except:
basla(url,ilk,son)
def deste(arr, count):
return [arr[i:i+int(count)] for i in range(0,len(arr),int(count))]
def basla2(liste):
global icerik
f=open(str(filename)+".part"+str(part),"w+b")
logs=open(str(filename)+".log.txt","a")
for i in liste:
sira.put(i)
sira.join()
kay=0
icerik.sort(key=lambda x: int(x[0]))
for i in icerik:
f.seek(int(kay))
f.write(str(i[2]))
logs.write("\n"+str(i[3]))
kay+=int(i[1])+1
logs.write("\npart="+str(part)+"\ntoplam="+str(toplam))
f.close()
logs.close
icerik=[]
parcasayisi=(indirme_parca_boyutu*1024*1024)/byt_boyutu
if parcasayisi==0:
parcasayisi=1
def basla4(url,filename):
global boyut,part,toplam
part=0
toplam=0
print str(filename)
boyut=int(bilgiler(url))
byteparts= buildRange(boyut, (boyut/int(byt_boyutu)))
dosyaparts=deste(byteparts,parcasayisi)
yaz1("\nDosya "+str((int(boyut)/(1024*1024))/indirme_parca_boyutu)+" Parca olarak indirilecek\n")
log=open(str(filename)+".log.txt","a")
log.write("\nBu dosyayi degistirmeyin, indirme kalan parcadan devam edecek. byt_boyutu= "+str(byt_boyutu)+" ve ismini de aynisi yapin.")
log.close()
for i in range(int(maxthreads)):
p=threading.Thread(target=basla3,args=(url,sira,))
p.daemon=True
p.start()
for i in dosyaparts:
print("\n"+str(part)+" nci part indiriliyor")
basla2(i)
part+=1
kaydir=0
yaz1("\nDosya partlari tamam simdi birlestirilecek.",0.02)
listele=glob.glob(str(filename)+".part*")
listele.sort(key=lambda x: int(''.join(filter(str.isdigit, x))))
with open(str(filename), 'w+b') as outfile:
for parca in listele:
size=int(os.path.getsize(parca))
with open(parca,"r+b") as infile:
outfile.seek(int(kaydir))
outfile.write(infile.read(size))
kaydir+=int(size)
print "\n"+str(int(kaydir)/(1024*1024))+" MB / " +str(int(boyut)/(1024*1024))+" MB"
#os.remove(str(parca))
outfile.close()
#os.remove(str(filename)+".log.txt")
yaz1("\nDosya tamalandi",0.02)
def urllistesi():
global url,filename
url_list=[]
link_list=[line.rstrip() for line in open("link.txt")]
for link in link_list:
if len(link.split(",")) > 1 :
url_list.append(link.split(","))
else:
filename=str(re.sub('[^a-zA-Z0-9\n\.]','_', ((urllib.unquote(link).decode('utf8')).split("/")[-1])))
url_list.append([link,filename])
return url_list
icerik=[]
sira=Queue()
url=""
filename=""
gorev=urllistesi()
print str(gorev)
gs=1
bekle=5 #saat 2 ye kac saniye varsa
while True:
if bekle == 0:
for i in gorev:
url=i[0]
filename=i[1]
try:
basla4(url,filename)
except:
hatalar=open("indirme_sirasinda_cikan_hatalar.txt","a")
print "'"+str(url)+"' Bu linki indirirken hata cikti..."
hatalar.write("'"+str(url)+"' Bu linki indirirken hata cikti...\n")
hatalar.close()
yaz1("\n\nDiger indirmeye geciliyor "+str(gs)+"/"+str(len(gorev))+"\n")
gs+=1
else:
sys.stdout.write("indirmenin baslamasina "+ time.strftime('%H:%M:%S', time.gmtime(bekle))+" var.\n")
sys.stdout.flush()
bekle=bekle-1
time.sleep(1)