Creating a Better Print Screen
After reading Randall Degges excellent post How I learned to Program, I decided to give creating a screenshot program a try. It's always a bit of work to take a screenshot, upload it to the web and then grab its permanent link. So being a geek, I thought it high time this process was automated!
I tried writing the program in python only, so that there were fewer dependencies, but using the commandline program scrot as the screenshot snapping program added a lot of flexibility to the options for the screenshot.
Without further ado, here are the parts of the program.
Take Screenshot with scrot
I start with a bash script that calls scrot, and passes in my program as a parameter to scrot.
#!/bin/bash /usr/local/bin/scrot '%m-%d-%Y-screenshot.png' -d 5 -u -e \ '/home/bart/projects/screen-upload/screen-upload.py $f'
Next, chmod +x the bash script:
chmod +x screen-upload.bash
Scrot Options explained
- -d 5: Delays the snap for 5 seconds.
- -u: Use the currently focused window.
- -e 'script': Execute the following script after the screenshot is snapped.
- $f: passes in filename to script.
On to the Python Picture Uploading Program
Scrot takes a screenshot after a delay of 5 seconds of the currently active window, it names the file with the current date-screenshot.png, it then passes the filename into my program, "screen-upload.py".
Upload Image to Picasaweb
For uploading the image to Picasaweb, I used the gdata module. Installing it involved the standard: Download the module, extract it and cd into the directory and run
sudo python setup.py install
In version 2 of screen-upload, I will rewrite the authentication to use Oauth2, so that the authentication is more secure, for the alpha version, I am just passing in the users email and password into the gd_client object.
import gdata.photos.service import gdata.media import gdata.geo filename = fname gd_client = gdata.photos.service.PhotosService() gd_client.email = username gd_client.password = passwd gd_client.source = 'screen-upload-1' gd_client.ProgrammaticLogin() print 'uploading', filename album_url = '/data/feed/api/user/%s/albumid/%s' % (username, album_id) photo = gd_client.InsertPhotoSimple(album_url, 'New Photo', 'Uploaded using the API', filename, content_type='image/png')
Copy URL into the Clipboard
Copying the URL to the clipboard is easy as long as you are not too concerned with cross-platform compatibility. I used the gtk module to gain access to the clipboard on Linux systems.
from gtk import Clipboard def clip_store(pic_url): cb = Clipboard() cb.set_text(pic_url) cb.store()
This can be made more cross-platform with a series of try statements that load platform specific libraries.
try: import win32 ... try: from gtk import Clipboard
Setting up the Keyboard Shortcut in Gnome 3.
I had a bit of a bother creating a keyboard shortcut in Gnome. I created a new shortcut in the keyboard settings configuration, but nothing happened.
Long story short: I created a shortcut under "Custom Shortcuts". I called it "Take Screenshot" and I named the script "screen-upload". Then I created a symbolic link to the script in /usr/local/bin.
ln -s ~/projects/screen-upload/screen-upload.bash /usr/local/bin/screen-upload.
This did the trick, now when I press the PrtSc button, a screenshot is taken of the current window, and its uploaded to Picasa and the URL of the image is copied in to my clipboard!