Skip to content

Commit a8974e2

Browse files
committed
added download module
1 parent 1b188a2 commit a8974e2

1 file changed

Lines changed: 149 additions & 0 deletions

File tree

‎downloader.py‎

Lines changed: 149 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,149 @@
1+
import argparse
2+
import re
3+
import sys
4+
from enum import StrEnum
5+
from pathlib import Path
6+
from re import Pattern
7+
from urllib.parse import urlparse
8+
9+
import requests
10+
11+
12+
class FileType(StrEnum):
13+
JS = "js"
14+
MAP = "map"
15+
AUTO = "auto"
16+
17+
18+
def get_urls_from_file(input_file: str) -> list[str]:
19+
file_path = Path(input_file)
20+
if not file_path.exists():
21+
exit(f"Файл '{file_path.name}' не существует")
22+
23+
return file_path.read_text(encoding="utf-8").splitlines()
24+
25+
26+
def regexp_compile(regexp: str) -> Pattern[str] | None:
27+
try:
28+
return re.compile(regexp)
29+
except re.error:
30+
return None
31+
32+
33+
def urls_filter(urls: list[str], filter_regexp: str) -> list[str]:
34+
_re = regexp_compile(filter_regexp)
35+
if _re is None:
36+
exit("Ошибка в регулярном выражении")
37+
38+
filtered_urls: list[str] = []
39+
for url in urls:
40+
url = url.strip()
41+
if url == "":
42+
continue
43+
44+
if _re.search(url) is None:
45+
continue
46+
47+
if url in filtered_urls:
48+
continue
49+
50+
filtered_urls.append(url)
51+
52+
return filtered_urls
53+
54+
55+
def urls_modify(urls: list[str], file_type: FileType) -> list[str]:
56+
match file_type:
57+
case FileType.MAP:
58+
return urls
59+
case FileType.JS:
60+
return [f"{url}.map" for url in urls]
61+
case FileType.AUTO:
62+
return [f"{url}.map" for url in urls if url.endswith(".js")]
63+
64+
65+
def download_by_url(url: str) -> str | None:
66+
try:
67+
_r = requests.get(url)
68+
except requests.exceptions.RequestException:
69+
return None
70+
71+
content = _r.text
72+
if not content.startswith("{"):
73+
return None
74+
75+
return content
76+
77+
78+
def get_filename_from_url(url: str) -> str:
79+
url_path = urlparse(url).path
80+
return url_path.rsplit("/", 1)[1]
81+
82+
83+
def urls_downloader(urls: list[str], output_folder: str) -> None:
84+
folder_path = Path(output_folder)
85+
if not folder_path.exists():
86+
folder_path.mkdir(parents=True)
87+
88+
for url in urls:
89+
content = download_by_url(url)
90+
if content is None:
91+
print("[ERROR]", f"Произошла ошибка при скачивании файла '{url}'")
92+
continue
93+
94+
filename = get_filename_from_url(url)
95+
96+
save_file_path = folder_path / filename
97+
save_file_path.write_text(content, encoding="utf-8")
98+
print("[INFO]", f"Файл '{url}' успешно сохранён")
99+
100+
101+
def downloader(input_file: str, filter_regexp: str, file_type: FileType, output_folder: str) -> None:
102+
urls = get_urls_from_file(input_file)
103+
urls = urls_filter(urls, filter_regexp)
104+
urls = urls_modify(urls, file_type)
105+
urls_downloader(urls, output_folder)
106+
107+
108+
def main(argv: list[str]) -> None:
109+
parser = argparse.ArgumentParser(description="Source Maps Downloader")
110+
parser.add_argument(
111+
"-I",
112+
"--input",
113+
dest="input_file",
114+
type=str,
115+
required=True,
116+
help="Файл со списком ссылок для скачивания",
117+
)
118+
parser.add_argument(
119+
"-F",
120+
"--filter",
121+
dest="filter_regexp",
122+
type=str,
123+
default="",
124+
help="Регулярное выражение для фильтрации ссылок",
125+
)
126+
parser.add_argument(
127+
"-T",
128+
"--type",
129+
dest="file_type",
130+
type=FileType,
131+
default=FileType.AUTO,
132+
choices=list(FileType),
133+
help="Расширение файла в ссылках",
134+
)
135+
parser.add_argument(
136+
"-O",
137+
"--output",
138+
dest="output_folder",
139+
type=str,
140+
default="maps_files",
141+
help="Путь до папки для сохранения",
142+
)
143+
144+
args = parser.parse_args(argv)
145+
downloader(**vars(args))
146+
147+
148+
if __name__ == "__main__":
149+
main(sys.argv[1::])

0 commit comments

Comments
 (0)