Add logging to CLI
This commit is contained in:
@@ -30,7 +30,7 @@ loguru = "^0.6.0"
|
|||||||
[tool.poetry.dev-dependencies]
|
[tool.poetry.dev-dependencies]
|
||||||
|
|
||||||
[tool.poetry.scripts]
|
[tool.poetry.scripts]
|
||||||
traps = "traps.cli:cli"
|
traps = "traps.cli:main"
|
||||||
|
|
||||||
[build-system]
|
[build-system]
|
||||||
requires = ["poetry-core>=1.0.0"]
|
requires = ["poetry-core>=1.0.0"]
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
from .cli import cli
|
from .cli import main
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
cli()
|
main()
|
||||||
|
|||||||
12
traps/cli.py
12
traps/cli.py
@@ -26,6 +26,7 @@ def cli(verbose: bool):
|
|||||||
else:
|
else:
|
||||||
loglevel = "INFO"
|
loglevel = "INFO"
|
||||||
|
|
||||||
|
# Remove the default logger if it exists.
|
||||||
try:
|
try:
|
||||||
logger.remove(0)
|
logger.remove(0)
|
||||||
except ValueError:
|
except ValueError:
|
||||||
@@ -35,7 +36,8 @@ def cli(verbose: bool):
|
|||||||
sys.stderr,
|
sys.stderr,
|
||||||
level=loglevel,
|
level=loglevel,
|
||||||
format="<green>{time:YYYY-MM-DD HH:mm:ss}</green> | <level>"
|
format="<green>{time:YYYY-MM-DD HH:mm:ss}</green> | <level>"
|
||||||
"{level: <8}</level> | <level>{message}</level>"
|
"{level: <8}</level> | <level>{message}</level>",
|
||||||
|
filter=lambda record: record["extra"].get("name") == "traps-logger"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@@ -50,9 +52,13 @@ def install(directory: pathlib.Path, amount: int):
|
|||||||
|
|
||||||
@cli.command("version", help="Print version and exit.")
|
@cli.command("version", help="Print version and exit.")
|
||||||
def version():
|
def version():
|
||||||
print(f"traps {traps.__version__}")
|
click.echo(f"{traps.__name__} {traps.__version__}")
|
||||||
sys.exit(0)
|
sys.exit(0)
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
cli.main(windows_expand_args=False)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
cli()
|
main()
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import requests
|
|||||||
from click import BadParameter
|
from click import BadParameter
|
||||||
|
|
||||||
from traps.utils import filename_from_url
|
from traps.utils import filename_from_url
|
||||||
|
from traps.utils import logger
|
||||||
|
|
||||||
__all__ = ["get"]
|
__all__ = ["get"]
|
||||||
API_URL = "https://safebooru.org/index.php"
|
API_URL = "https://safebooru.org/index.php"
|
||||||
@@ -19,6 +20,7 @@ def _fetch_urls(n: int = 1) -> List[str]:
|
|||||||
raise BadParameter("you can't download more than 5000 files at a time")
|
raise BadParameter("you can't download more than 5000 files at a time")
|
||||||
if n < 1:
|
if n < 1:
|
||||||
raise BadParameter("you can't download a negative number of files")
|
raise BadParameter("you can't download a negative number of files")
|
||||||
|
|
||||||
used_offsets = []
|
used_offsets = []
|
||||||
urls = []
|
urls = []
|
||||||
|
|
||||||
@@ -43,6 +45,7 @@ def _fetch_urls(n: int = 1) -> List[str]:
|
|||||||
for _ in range(limit)
|
for _ in range(limit)
|
||||||
]
|
]
|
||||||
|
|
||||||
|
logger.info("Fetching urls")
|
||||||
if n > 100:
|
if n > 100:
|
||||||
with ThreadPoolExecutor(max_workers=16) as p:
|
with ThreadPoolExecutor(max_workers=16) as p:
|
||||||
for i in p.map(lambda _: fetch(100), range(n // 100)):
|
for i in p.map(lambda _: fetch(100), range(n // 100)):
|
||||||
@@ -50,23 +53,35 @@ def _fetch_urls(n: int = 1) -> List[str]:
|
|||||||
n %= 100
|
n %= 100
|
||||||
if n < 100:
|
if n < 100:
|
||||||
urls += fetch(n)
|
urls += fetch(n)
|
||||||
|
logger.info("Done")
|
||||||
return urls
|
return urls
|
||||||
|
|
||||||
|
|
||||||
def _download(directory: Path, url: str) -> None:
|
def _download(directory: Path, url: str) -> None:
|
||||||
|
logger.debug(f"Downloading {url}")
|
||||||
resp = requests.get(url, stream=True)
|
resp = requests.get(url, stream=True)
|
||||||
|
if not resp.ok:
|
||||||
|
logger.warning(f"Couldn't download {url}: HTTP error {resp.status_code}")
|
||||||
|
return
|
||||||
filename = filename_from_url(url)
|
filename = filename_from_url(url)
|
||||||
with open(directory / filename, "wb") as f:
|
with open(directory / filename, "wb") as f:
|
||||||
for part in resp.iter_content(1024):
|
for part in resp.iter_content(1024):
|
||||||
if not part:
|
if not part:
|
||||||
break
|
break
|
||||||
f.write(part)
|
f.write(part)
|
||||||
|
else:
|
||||||
|
logger.success(f"Downloaded {url}")
|
||||||
|
|
||||||
|
|
||||||
def get(directory: Union[str, Path] = "traps", amount: int = 1) -> None:
|
def get(directory: Union[str, Path] = "traps", amount: int = 1) -> None:
|
||||||
if not isinstance(directory, Path):
|
if not isinstance(directory, Path):
|
||||||
directory = Path(directory)
|
directory = Path(directory)
|
||||||
directory.mkdir(exist_ok=True)
|
if not directory.exists():
|
||||||
|
logger.debug(f"Creating {directory.name} directory")
|
||||||
|
directory.mkdir()
|
||||||
|
logger.debug("Done")
|
||||||
urls = _fetch_urls(amount)
|
urls = _fetch_urls(amount)
|
||||||
|
logger.info("Downloading traps")
|
||||||
with ThreadPoolExecutor(max_workers=16) as p:
|
with ThreadPoolExecutor(max_workers=16) as p:
|
||||||
p.map(lambda url: _download(directory, url), urls)
|
p.map(lambda url: _download(directory, url), urls)
|
||||||
|
logger.success(f"Downloaded {amount} traps")
|
||||||
|
|||||||
@@ -1,6 +1,10 @@
|
|||||||
import pathlib
|
import pathlib
|
||||||
import urllib.parse
|
import urllib.parse
|
||||||
|
|
||||||
|
import loguru
|
||||||
|
|
||||||
|
logger = loguru.logger.bind(name="traps-logger")
|
||||||
|
|
||||||
|
|
||||||
def filename_from_url(url: str) -> str:
|
def filename_from_url(url: str) -> str:
|
||||||
path = urllib.parse.urlparse(url).path
|
path = urllib.parse.urlparse(url).path
|
||||||
|
|||||||
Reference in New Issue
Block a user