favicon.py 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. __package__ = 'archivebox.extractors'
  2. import os
  3. from typing import Optional
  4. from ..index.schema import Link, ArchiveResult, ArchiveOutput
  5. from ..system import chmod_file, run, PIPE
  6. from ..util import enforce_types, domain
  7. from ..config import (
  8. TIMEOUT,
  9. SAVE_FAVICON,
  10. CURL_BINARY,
  11. CURL_VERSION,
  12. CHECK_SSL_VALIDITY,
  13. )
  14. from ..cli.logging import TimedProgress
  15. @enforce_types
  16. def should_save_favicon(link: Link, out_dir: Optional[str]=None) -> bool:
  17. out_dir = out_dir or link.link_dir
  18. if os.path.exists(os.path.join(out_dir, 'favicon.ico')):
  19. return False
  20. return SAVE_FAVICON
  21. @enforce_types
  22. def save_favicon(link: Link, out_dir: Optional[str]=None, timeout: int=TIMEOUT) -> ArchiveResult:
  23. """download site favicon from google's favicon api"""
  24. out_dir = out_dir or link.link_dir
  25. output: ArchiveOutput = 'favicon.ico'
  26. cmd = [
  27. CURL_BINARY,
  28. '--silent',
  29. '--max-time', str(timeout),
  30. '--location',
  31. '--output', str(output),
  32. *([] if CHECK_SSL_VALIDITY else ['--insecure']),
  33. 'https://www.google.com/s2/favicons?domain={}'.format(domain(link.url)),
  34. ]
  35. status = 'succeeded'
  36. timer = TimedProgress(timeout, prefix=' ')
  37. try:
  38. run(cmd, stdout=PIPE, stderr=PIPE, cwd=out_dir, timeout=timeout)
  39. chmod_file(output, cwd=out_dir)
  40. except Exception as err:
  41. status = 'failed'
  42. output = err
  43. finally:
  44. timer.end()
  45. return ArchiveResult(
  46. cmd=cmd,
  47. pwd=out_dir,
  48. cmd_version=CURL_VERSION,
  49. output=output,
  50. status=status,
  51. **timer.stats,
  52. )