-
Notifications
You must be signed in to change notification settings - Fork 0
/
mediafiredl.py
90 lines (78 loc) · 2.27 KB
/
mediafiredl.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
import os
import re
import shutil
import sys
import tempfile
import requests
import os.path as osp
import six
import tqdm
CHUNK_SIZE = 512 * 1024 # 512KB
def extractDownloadLink(contents):
for line in contents.splitlines():
m = re.search(r'href="((http|https)://download[^"]+)', line)
if m:
return m.groups()[0]
def download(url, output, quiet):
url_origin = url
sess = requests.session()
while True:
res = sess.get(url, stream=True)
if 'Content-Disposition' in res.headers:
# This is the file
break
# Need to redirect with confiramtion
url = extractDownloadLink(res.text)
if url is None:
print('Permission denied: %s' % url_origin, file=sys.stderr)
print(
"Maybe you need to change permission over "
"'Anyone with the link'?",
file=sys.stderr,
)
return
if output is None:
m = re.search(
'filename="(.*)"', res.headers['Content-Disposition']
)
output = m.groups()[0]
# output = osp.basename(url)
output_is_path = isinstance(output, six.string_types)
if not quiet:
print('Downloading...', file=sys.stderr)
print('From:', url_origin, file=sys.stderr)
if output_is_path:
tmp_file = tempfile.mktemp(
suffix=tempfile.template,
prefix=osp.basename(output),
dir=osp.dirname(output),
)
f = open(tmp_file, 'wb')
else:
tmp_file = None
f = output
try:
total = res.headers.get('Content-Length')
if total is not None:
total = int(total)
if not quiet:
pbar = tqdm.tqdm(total=total, unit='B', unit_scale=True)
for chunk in res.iter_content(chunk_size=CHUNK_SIZE):
f.write(chunk)
if not quiet:
pbar.update(len(chunk))
if not quiet:
pbar.close()
if tmp_file:
f.close()
shutil.move(tmp_file, output)
except IOError as e:
print(e, file=sys.stderr)
return
finally:
try:
if tmp_file:
os.remove(tmp_file)
except OSError:
pass
return output