SHOW:
|
|
- or go back to the newest paste.
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) |