astronomy

Resources for Science Olympiad Astronomy

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
  22. 22
  23. 23
  24. 24
  25. 25
  26. 26
  27. 27
  28. 28
  29. 29
  30. 30
  31. 31
  32. 32
  33. 33
  34. 34
  35. 35
  36. 36
  37. 37
  38. 38
  39. 39
  40. 40
  41. 41
  42. 42
  43. 43
  44. 44
  45. 45
  46. 46
  47. 47
  48. 48
  49. 49
  50. 50
  51. 51
  52. 52
  53. 53
  54. 54
  55. 55
#!/usr/bin/env python3

import os
import re
from argparse import ArgumentParser

# PDF conversion backends
import pdfkit
import weasyprint


# CLI arguments
parser = ArgumentParser()
parser.add_argument('--backend', '-b', help = 'change the download backend', default = 'pdfkit', choices = ['pdfkit', 'weasyprint'])
parser.add_argument('--force', '-f', help = 'force download all links', action='store_true')
args = parser.parse_args()


failed = []

for category in os.listdir('Links'):
    print('🔍 Examining: ' + category)
    os.makedirs(category, exist_ok=True)
    
    section = ''
    for link in open(os.path.join('Links', category), 'r').readlines():
        if link[0:2] == '# ':
            section = link[2:-1]
        if link[0] == '#' or link[0] == '\n':
            continue
        
        name = os.path.join(category, section + ' - ' + re.sub(r'(?u)[^-\w.]', '', link[5:]) + '.pdf')
        if not os.path.exists(name) or args.force:
            print('📲 Downloading: ' + link[:-1])
            print('💾 Destination: ' + name)
            
            # Time to print!
            try:
                if args.backend == 'pdfkit':
                    pdfkit.from_url(link, name)
                else:
                    pdf = weasyprint.HTML(link).write_pdf()
                    open(name, 'wb').write(pdf)
            except KeyboardInterrupt:
                print('😭 Exiting')
                exit()
            except Exception as e:
                print('😱 Error when printing')
                print(e)
                failed.append(name)

# Output failed downloads
if len(failed) > 0:
    print(failed)
    print(failed, file=open('failed', 'w'))