Created
July 18, 2014 21:01
-
-
Save vasnake/5a5034f105328485ea0f to your computer and use it in GitHub Desktop.
Webcam fixer
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python | |
# -*- mode: python; coding: utf-8 -*- | |
# Copyright (c) Valentin Fedulov <vasnake@gmail.com> | |
''' This script intended to fix some webcam software problems. | |
It's job can be described in three points: | |
First step: find latest JPG file in SEARCH_IN folder and subfolders. | |
Next step: copy that file to WRITE_TO destination. | |
Last step: put a timestamp on lower right corner of the WRITE_TO image. | |
Tested on Linux CentOS 6. | |
You may need to install PIL: | |
yum install python-imaging | |
also you'll need FreeSans.ttf (http://ftp.gnu.org/gnu/freefont/), refer to FONT constant. | |
Usage | |
Edit FONT, SEARCH_IN and WRITE_TO constants and call script like: | |
sudo -u ftpsecure python -u /opt/webcamfixer.py | |
or set a crontab job: | |
nano /etc/crontab | |
SHELL=/bin/bash | |
PATH=/sbin:/bin:/usr/sbin:/usr/bin | |
MAILTO=root | |
HOME=/ | |
*/3 * * * * ftpsecure python -u /opt/webcamfixer.py | |
Ftpsecure came from my vsftpd setup, just forget about it. | |
''' | |
from __future__ import print_function | |
import time | |
import os | |
import shutil | |
from PIL import Image, ImageDraw, ImageFont | |
FONT = "/opt/FreeSans.ttf" | |
SEARCH_IN = u'/home/ftpsecure' | |
WRITE_TO = u'/home/ftpsecure/cam_1.jpg' | |
print(u"Clubwindsurf webcam picture fixer. {timestamp}".format(timestamp=time.strftime('%Y-%m-%d %H:%M:%S'))) | |
def main(): | |
fname = findLatestJpg(SEARCH_IN) | |
if fname == WRITE_TO: | |
print(u"File is fresh as it is, quit.") | |
else: | |
statinfo = os.stat(fname) | |
if statinfo.st_size > 0: | |
if copyFile(fname, WRITE_TO): | |
timeInfo = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(statinfo.st_mtime)) | |
addTimeStamp(WRITE_TO, timeInfo) | |
def findLatestJpg(dirName): | |
fileName = u'' | |
listFiles = findFiles(dirName, u'jpg') | |
def getMtime(fn): | |
res = 0 | |
try: | |
statinfo = os.stat(fn) | |
if statinfo.st_size > 0: | |
res = statinfo.st_mtime | |
except: | |
print(u"Problem with {fn}".format(fn=fn)) | |
return res | |
sortedLF = sorted(listFiles, key=getMtime, reverse=True) | |
if sortedLF: | |
fileName = sortedLF[0] | |
return fileName | |
def copyFile(fromName, toName): | |
if fromName and toName: | |
if not fromName.lower() == toName.lower(): | |
print(u"Copy from {fromName} to {toName}".format(fromName=fromName, toName=toName)) | |
shutil.copy(fromName, toName) | |
return True | |
return False | |
def findFiles(scandir, ext): | |
'''Returns list of file names with extension 'ext' | |
recursively finded inside 'scandir' | |
scandir, ext is a unicode strings | |
''' | |
ftype = u'.' + ext.lower() | |
lstFiles = [] | |
for root, dirs, files in os.walk(scandir): | |
for f in files: | |
fn = os.path.join(root, f) | |
if fn.lower().endswith(ftype): | |
lstFiles.append(unicode(fn)) | |
return lstFiles | |
def addTimeStamp(fileName, timeInfo): | |
'''80% of this function code came from | |
http://jepoirrier.org/2008/11/24/short-script-to-add-a-timestamp-on-pictures/ | |
https://github.com/jepoirrier/miscScripts/blob/master/timestampFiles.py | |
''' | |
fontSize = 15 | |
textPadding = 2 | |
boxWidth = 150 | |
boxHeight = 25 | |
im = Image.open(fileName) | |
topLeftWidth = int(im.size[0] - boxWidth) | |
topLeftHeight = int(im.size[1] - boxHeight) | |
imfont = ImageFont.truetype(FONT, fontSize) | |
draw = ImageDraw.Draw(im) | |
draw.rectangle([topLeftWidth, topLeftHeight, im.size[0], im.size[1]], | |
fill="black") | |
draw.text([topLeftWidth + textPadding, topLeftHeight + textPadding], | |
timeInfo, fill="lime", font=imfont) | |
del draw | |
im.save(fileName, 'JPEG', quality=90, optimize=True) | |
if __name__ == "__main__": | |
main() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Replace PIL with Pillow: