public
Last active

Improved version of getimg.sh - gets the 'image of the day' from NASA, writes the summary onto the image and sets it as the Gnome wallpaper.

  • Download Gist
getimg.py
Python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128
#!/usr/bin/env python
"""
getimg.py
 
Gets the current image of the day from NASA and sets it as the
background in Gnome. The summary / description text is written
to the image.
 
Requires:
PIL (apt-get install python-imaging or pip install PIL)
feedparser (apt-get install python-feedparser or pip install feedparser)
 
Christian Stefanescu
http://0chris.com
 
Based on the bash script of Jessy Cowan-Sharp - http://jessykate.com
http://blog.quaternio.net/2009/04/13/nasa-image-of-the-day-as-gnome-background/
 
intelli_draw method from:
http://mail.python.org/pipermail/image-sig/2004-December/003064.html
"""
import Image
import ImageDraw
import ImageFont
import urllib
import feedparser
import os
import commands
 
# Configurable settings
DOWNLOAD_FOLDER = '~/.backgrounds/'
FONT_PATH = '/usr/share/fonts/truetype/ubuntu-font-family/Ubuntu-B.ttf'
FONT_SIZE = 20
# how many empty text rows should be inserted to overcome top panel overlap
EMPTY_ROWS = 3
 
# Don't change stuff beyond this point
FEED_URL = 'http://www.nasa.gov/rss/lg_image_of_the_day.rss'
font = ImageFont.truetype(FONT_PATH, FONT_SIZE)
 
 
def get_latest_entry():
"""
Get URL and description of the latest entry in the feed
"""
feed = feedparser.parse(FEED_URL)
return (feed.entries[0].enclosures[0].href, feed.entries[0].summary)
 
 
def download_file(url):
"""
Get the latest NASA image of the day from the feed, returns the name
of the downloaded file.
"""
remote_file = urllib.urlopen(url)
local_name = url.split('/')[-1]
local_path = os.path.expanduser(os.path.join(DOWNLOAD_FOLDER, local_name))
local_file = open(local_path, 'w')
local_file.write(remote_file.read())
remote_file.close()
local_file.close()
return local_path
 
 
def intelli_draw(drawer, text, font, containerWidth):
"""
Figures out how many lines (and at which height in px) are needed to print
the given text with the given font on an image with the given size.
 
Source:
http://mail.python.org/pipermail/image-sig/2004-December/003064.html
"""
words = text.split()
lines = []
lines.append(words)
finished = False
line = 0
while not finished:
thistext = lines[line]
newline = []
innerFinished = False
while not innerFinished:
if drawer.textsize(' '.join(thistext), font)[0] > containerWidth:
newline.insert(0, thistext.pop(-1))
else:
innerFinished = True
if len(newline) > 0:
lines.append(newline)
line = line + 1
else:
finished = True
tmp = []
for i in lines:
tmp.append(' '.join(i))
lines = tmp
(width, height) = drawer.textsize(lines[0], font)
return (lines, width, height)
 
 
def write_description(img_file, text):
"""
Write the given text to the given imagefile and overwrite it.
"""
img = Image.open(img_file)
(img_width, img_height) = img.size
draw = ImageDraw.Draw(img)
lines, tmp, h = intelli_draw(draw, text, font, img_width)
j = EMPTY_ROWS
for i in lines:
draw.text((0, 0 + j * h), i, font=font)
j = j + 1
img.save(open(img_file, 'w'), 'JPEG')
 
 
def set_gnome_wallpaper(file_path):
command = "gconftool-2 --set \
/desktop/gnome/background/picture_filename \
--type string '%s'" % file_path
status, output = commands.getstatusoutput(command)
return status
 
if __name__ == '__main__':
if not os.path.exists(os.path.expanduser(DOWNLOAD_FOLDER)):
os.makedirs(os.path.expanduser(DOWNLOAD_FOLDER))
(url, text) = get_latest_entry()
img_file = download_file(url)
write_description(img_file, text)
status = set_gnome_wallpaper(img_file)

Unfortunately the script doesn't work for me (Ubuntu 10.04). This is what I get:

Traceback (most recent call last):
File "scripts/getimg.py", line 40, in
font = ImageFont.truetype(FONT_PATH, FONT_SIZE)
File "/usr/lib/python2.6/dist-packages/PIL/ImageFont.py", line 218, in truetype
return FreeTypeFont(filename, size, index, encoding)
File "/usr/lib/python2.6/dist-packages/PIL/ImageFont.py", line 134, in init
self.font = core.getfont(file, size, index, encoding)
IOError: cannot open resource

Hi,

the FONT_PATH variable in the script should point to a font you have on your system. Pick one which really exists on your system, probably you can find fonts in /usr/share/fonts assuming you're using some unix-based OS.

@afcuttin: Install ttf-ubuntu-font-family package:
$ sudo apt-get install ttf-ubuntu-font-family

I have a dual monitor setup with twinview (NVidia) and the picture in halfway in between the two screens, so the left half of my first screen is empty (purple-ish) and the right half of my right screen is empty

@kroq-gar78: Have you tried changing the 'Style' setting in the Background preferences screen?

After having installed the Ubuntu font, it worked. However, the size of the images from NASA is always different, so that the caption isn't always in the same place.
I got back to the original script, and added a conky panel on my desktop.

NameError: global name 'drawer' is not defined on Ubuntu 12.04. Is there something I am missing?

Please sign in to comment on this gist.

Something went wrong with that request. Please try again.