Skip to content

Commit f06b8b2

Browse files
authored
Add files via upload
1 parent 3666182 commit f06b8b2

File tree

1 file changed

+77
-0
lines changed

1 file changed

+77
-0
lines changed

FileDownloader/FileDownloader.py

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
import re
2+
import sys
3+
import random
4+
import requests
5+
import werkzeug
6+
7+
8+
class Downloader:
9+
def __init__(self, url):
10+
self.url = url
11+
12+
def validate_url(self) -> bool:
13+
response = requests.get(self.url, stream=True)
14+
if response.status_code in range(200, 299):
15+
return True
16+
else:
17+
return False
18+
19+
def headers(self) -> dict:
20+
response = requests.head(self.url)
21+
22+
filename = response.headers.get("Content-Disposition")
23+
filesize = response.headers.get("Content-Length")
24+
filetype = response.headers.get("Content-Type").split(";")[0]
25+
26+
if filename:
27+
parsed_headers = werkzeug.http.parse_options_header(
28+
re.findall("filename=(.+)", filename)[0]
29+
)
30+
31+
for keys in parsed_headers:
32+
if "filename" in keys:
33+
filename = keys["filename"]
34+
return {"filename": filename, "filesize": filesize, "filetype": filetype}
35+
else:
36+
if "image" in filetype:
37+
return {
38+
"filename": "download.jpg",
39+
"filesize": filesize,
40+
"filetype": filetype,
41+
}
42+
else:
43+
return {
44+
"filename": "download.html",
45+
"filesize": filesize,
46+
"filetype": filetype,
47+
}
48+
49+
def get_file_chunks(self, filename: str = None):
50+
file_info = self.headers()
51+
file_name = file_info["filename"]
52+
response = requests.get(self.url, stream=True)
53+
54+
if filename:
55+
file_name = filename
56+
57+
with open(file_name, "wb") as file:
58+
if file_info["filesize"]:
59+
size = int(file_info["filesize"])
60+
current = 0
61+
for chunk in response.iter_content(chunk_size=4096):
62+
current += len(chunk)
63+
downloaded = current / size * 100
64+
file.write(chunk)
65+
else:
66+
file.write(requests.get(self.url, stream=True).content)
67+
68+
return file_name
69+
70+
def save(self, filename: str = None):
71+
if filename:
72+
self.get_file_chunks(filename)
73+
return True
74+
else:
75+
self.get_file_chunks()
76+
return True
77+
return False

0 commit comments

Comments
 (0)