Skip to content

Instantly share code, notes, and snippets.

@vasnake
Created July 18, 2014 21:01
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save vasnake/5a5034f105328485ea0f to your computer and use it in GitHub Desktop.
Save vasnake/5a5034f105328485ea0f to your computer and use it in GitHub Desktop.
Webcam fixer
#!/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()
@vasnake
Copy link
Author

vasnake commented Aug 3, 2014

Replace PIL with Pillow:

yum remove python-imaging
yum install python-devel libjpeg-devel zlib-devel freetype-devel
pip2.6 install pillow

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment