SHARE
TWEET

get NASA Pictures with getimg.py [Python 3.7] [Windows] v2

DeaD_EyE Aug 8th, 2019 15 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #!/usr/bin/env python3.7
  2. """
  3. getimg.py
  4.  
  5. Gets the current image of the day from NASA and saves this as
  6. current_background.jpg. The summary / description text is written
  7. to the image.
  8.  
  9. Requires:
  10.    PIL             (apt-get install python-imaging or pip install PIL)
  11.    feedparser      (apt-get install python-feedparser or pip install feedparser)
  12.  
  13. Christian Stefanescu
  14. http://0chris.com
  15.  
  16. Based on the bash script of Jessy Cowan-Sharp - http://jessykate.com
  17. http://blog.quaternio.net/2009/04/13/nasa-image-of-the-day-as-gnome-background/
  18.  
  19. intelli_draw method from:
  20. http://mail.python.org/pipermail/image-sig/2004-December/003064.html
  21.  
  22. Made it compatible with Python 3.7
  23. """
  24. from pathlib import Path
  25. from urllib.request import urlopen
  26. import shutil
  27. import os
  28.  
  29. from PIL import (
  30.     Image,
  31.     ImageDraw,
  32.     ImageFont,
  33. )
  34. import feedparser
  35.  
  36.  
  37. # using configparser to save a initial configuration beside the script
  38. # to edit the settings without touching the source code..
  39.  
  40. HOME = Path.home()
  41. DOWNLOAD_FOLDER = HOME / 'backgrounds/'
  42. LINK_PATH = DOWNLOAD_FOLDER / 'current_background.jpg'
  43. # Edit the font Path. FiraCode is a free font for programmers with ligatures
  44. FONT_PATH = r'C:\Users\Admin\AppData\Local\Microsoft\Windows\Fonts\FiraCode-Regular.ttf'
  45. FONT_SIZE = 20
  46. EMPTY_ROWS = 3
  47.  
  48. # Don't change stuff beyond this point
  49. # Updated the rss-feed url
  50. FEED_URL = 'https://www.nasa.gov/rss/dyn/lg_image_of_the_day.rss'
  51. font = ImageFont.truetype(FONT_PATH, FONT_SIZE)
  52.  
  53.  
  54. def get_latest_entry():
  55.     """
  56.    Get URL and description of the latest entry in the feed
  57.    """
  58.     feed = feedparser.parse(FEED_URL)
  59.     return (feed.entries[0].enclosures[0].href, feed.entries[0].summary)
  60.  
  61.  
  62. def download_file(url):
  63.     """
  64.    Get the latest NASA image of the day from the feed, returns the name
  65.    of the downloaded file.
  66.    """
  67.     remote_file = urlopen(url)
  68.     local_name = url.split('/')[-1]
  69.     local_path = DOWNLOAD_FOLDER / local_name
  70.     local_path.write_bytes(remote_file.read())
  71.     remote_file.close()
  72.     return local_path
  73.  
  74.  
  75. def intelli_draw(drawer, text, font, containerWidth):
  76.     """
  77.    Figures out how many lines (and at which height in px) are needed to print
  78.    the given text with the given font on an image with the given size.
  79.  
  80.    Source:
  81.    http://mail.python.org/pipermail/image-sig/2004-December/003064.html
  82.  
  83.    # Todo
  84.    # This function is too complicated
  85.    # Try to remove the nested loops
  86.    """
  87.     words = text.split()
  88.     lines = []
  89.     lines.append(words)
  90.     finished = False
  91.     line = 0
  92.     while not finished:
  93.         thistext = lines[line]
  94.         newline = []
  95.         innerFinished = False
  96.         while not innerFinished:
  97.             if drawer.textsize(' '.join(thistext), font)[0] > containerWidth:
  98.                 newline.insert(0, thistext.pop(-1))
  99.             else:
  100.                 innerFinished = True
  101.         if len(newline) > 0:
  102.             lines.append(newline)
  103.             line = line + 1
  104.         else:
  105.             finished = True
  106.     tmp = []
  107.     for i in lines:
  108.         tmp.append(' '.join(i))
  109.     lines = tmp
  110.     (width, height) = drawer.textsize(lines[0], font)
  111.     return (lines, width, height)
  112.  
  113.  
  114. def write_description(img_path, text):
  115.     """
  116.    Write the given text to the given imagefile and overwrite it.
  117.  
  118.    # choose better variable names
  119.    """
  120.     img = Image.open(img_path)
  121.     (img_width, img_height) = img.size
  122.     draw = ImageDraw.Draw(img)
  123.     lines, tmp, h = intelli_draw(draw, text, font, img_width)
  124.     j = EMPTY_ROWS
  125.     for i in lines:
  126.         draw.text((0, 0 + j * h), i, font=font)
  127.         j = j + 1
  128.     img.save(img_path, 'JPEG')
  129.  
  130.  
  131. if __name__ == '__main__':
  132.     # argparse ?
  133.     if not DOWNLOAD_FOLDER.exists():
  134.         DOWNLOAD_FOLDER.mkdir()
  135.     url, text = get_latest_entry()
  136.     img_path = download_file(url)
  137.     write_description(img_path, text)
  138.     shutil.copy(img_path, LINK_PATH)
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top