Eu queria começar a fazer GitShots, mas no escritório eu tenho uma tela de cinema e quero que minhas fotos usem, se disponível. Este script tratará disso e de outras coisas. Isso me permite manter meus ganchos git extremamente simples, mas ainda têm muita flexibilidade.
post-commit
#!/bin/sh
$HOME/bin/snap_pic
exit 0
Snap_pic Script
! / usr / bin / env ruby
# encoding: UTF-8
require 'shellwords'
require 'optparse'
require 'ostruct'
require 'pathname'
# This uses the 'imagesnap' app (brew install imagesnap)
# and this script is based off of Victor Martinez original: https://coderwall.com/p/xlatfq
# This adds the ability to tell if I am connected to my Cinema Display and if
# so then use that camera for the pic.
#
# Can then use http://www.dayofthenewdan.com/projects/tlassemble/ to create a movie
# tlassemble ~/.gitshots Shots.mov -fps 5
# Can also use FFMPEG, but need to copy the images to a serial format.
# This will take up more disk space to produce, but the end file will be smaller than
# tlassemble
# i=1; for f in ~/.gitshots/*.jpg; do cp -v $f "./images/$(printf '%04d' $i).jpg"; (( i ++ )); done
# ffmpeg -r 5 -i ./images/%04d.jpg -c:v libx264 -r 15 -pix_fmt yuv420p Shots.m4v
# if for some reason your devices are different you can
# list them with `imagesnap -l` see also http://iharder.sourceforge.net/current/macosx/imagesnap/
CAM_CINEMA = 'Display iSight'
CAM_ISIGHT = 'FaceTime HD Camera (Built-in)'
def cinema_display?
display_info = `system_profiler SPDisplaysDataType`
display_info =~ /LED Cinema Display/
end
def take_best_shot file_name, quite=false
device = cinema_display? ? CAM_CINEMA : CAM_ISIGHT
file = Shellwords.escape file_name
puts "Capturing camera image into #{file}" unless quite
system %Q{imagesnap -q -d "#{device}" #{file} &}
end
def get_defaults
{
quite: false,
dir: '~/.gitshots',
file: "#{Time.now.strftime('%Y%m%d-%a-%H%M%S')}.jpg", # 20131218-Wed-131403.jpg
}
end
def main
options = OpenStruct.new(get_defaults())
parser = OptionParser.new do |opts|
opts.banner = "Usage: snap_pic "
opts.on('-f', '--file', "File name or path") do |v|
options.file = v
end
opts.on('-d', '--dir', "Path, ignored if --file is absolute") do |v|
options.dir = v
end
opts.on('-q', '--[no-]quite', "Shhh... I am hunting rabbits") do |v|
options.quite = v
end
end
parser.parse! ARGV
# Ok now combine them
options.dir.gsub! '~', ENV['HOME'] if options.dir =~ /^~/
options.file.gsub! '~', ENV['HOME'] if options.file =~ /^~/
p = Pathname.new options.file
if p.absolute?
options.full_path = p
else
p = Pathname.new(options.dir)
p = p.realpath
raise "Path does not exist: #{p}" unless p.directory?
options.full_path = p.join(options.file)
end
options.full_path = options.full_path.to_s
take_best_shot options.full_path, options.quite
end
main if $0 == __FILE__