twitterpunch 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: ba9e98cad4bdd2f862bae14d2748481537a86969
4
+ data.tar.gz: bfeeb93d6c2d9123c116411c341fc7bb7d9570c4
5
+ SHA512:
6
+ metadata.gz: ee6ab95ecaacb496975e50752219257aa21cc540ddbb8c33278da800f60371a0e6978b11741bfd2af624a52b890fcd9c30bb0f8aea863d3c7960230f9f15599e
7
+ data.tar.gz: 13b3444517740d22b3332922a64082d0a604d5e83de7628b2abb5d90c91e47ff6cd6bf4cea64816e46084a100a49c6ad29e30015d825c4945f0245b327593bfa
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2014 Ben Ford <binford2k@gmail.com>
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,110 @@
1
+ Twitterpunch
2
+ ===============
3
+
4
+ Twitterpunch is designed to work with PhotoBooth and OS X Folder Actions.
5
+ When this script is called with the name of an image file, it will post the
6
+ image to Twitter, along with a message randomly chosen from a list and a
7
+ specified hashtag.
8
+
9
+ If you call the script with the --stream argument instead, it will listen
10
+ for tweets to that hashtag and download them to a specified directory. If
11
+ the tweet came from another user, Twitterpunch will speak it aloud.
12
+
13
+ Configuration
14
+ ===========
15
+
16
+ Configure the program via the `~/.twitterpunch.yaml` YAML file. This file should
17
+ look similar to the example below.
18
+
19
+ ---
20
+ :twitter:
21
+ :consumer_key: <consumer key>
22
+ :consumer_secret: <consumer secret>
23
+ :access_token: <access token>
24
+ :access_token_secret: <access secret>
25
+ :messages:
26
+ - Hello there
27
+ - I'm a posting fool
28
+ - minimally viable product
29
+ :hashtag: BestHalloweenPartyEver
30
+ :handle: FassFord
31
+ :photodir: ~/Pictures/twitterpunch/
32
+ :logfile: /Users/ben/.twitterpunch.log
33
+ :sendsound: /System/Library/PrivateFrameworks/ToneLibrary.framework/Versions/A/Resources/AlertTones/tweet_sent.caf
34
+
35
+ A skeleton configuration file, with access tokens from Twitter, can be generated
36
+ by running the program with the `--genconfig` flag.
37
+
38
+ Usage
39
+ ==========
40
+
41
+ ### Using OS X PhotoBooth
42
+
43
+ 1. Start PhotoBooth at least once to generate its library.
44
+ 1. Install the Twitterpunch Folder Action
45
+ * `twitterpunch --install`
46
+ * It may claim that it could not be attached, fear not.
47
+ 1. Profit!
48
+ * _and by that, I mean take some shots with PhotoBooth!_
49
+
50
+ #### Troubleshooting.
51
+
52
+ 1. Make sure the folder action is installed properly
53
+ 1. Use the Finder to navigate to `~/Pictures/`
54
+ 1. Right click on the `Photo Booth Library` icon and choose _Show Package Contents_.
55
+ 1. Right click on the `Pictures` folder and choose `Services > Folder Actions Setup`
56
+ 1. Make sure that the `Twitterpunch` action is attached.
57
+ 1. Install the folder action
58
+ 1. Open the `resources` folder of this gem.
59
+ * Likely to be found in `/Library/Ruby/Gems/2.0.0/gems/twitterpunch-#{version}/resources/`.
60
+ 1. Double click on the `Twitterpunch` folder action and install it.
61
+ * It may claim that it could not be attached, fear not.
62
+
63
+ ### Using something else
64
+
65
+ Configure the program you are using for your photo shoot to call Twitterpunch
66
+ each time it snaps a photo. Pass the name of the new photo as a command line
67
+ argument. Alternatively, you could batch them, as Twitterpunch can accept
68
+ multiple files at once.
69
+
70
+ [ben@ganymede] ~ $ twitterpunch photo.jpg
71
+
72
+ ### Viewing the Twitter stream
73
+
74
+ Currently Twitterpunch doesn't display photos directly. It simply downloads them
75
+ and stuffs them into the configured `:photodir`. Twitterpunch will run on OS X or
76
+ Windows equally well. Simply configure it on the computer that will act as the
77
+ Twitter display and then run in streaming mode. Tweets that come from any other
78
+ user will be spoken aloud.
79
+
80
+ [ben@ganymede] ~ $ twitterpunch --stream
81
+
82
+ There are currently two decent viewing options I am aware of.
83
+
84
+ * Windows background image:
85
+ * Configure the Windows background to randomly cycle through photos in a directory.
86
+ * Hide desktop icons.
87
+ * Hide the taskbar.
88
+ * Disable screensaver and power savings.
89
+ * Drawbacks: You're using Windows and you have to install Ruby & RubyGems manually.
90
+ * OS X screensaver:
91
+ * Choose one of the sexy screensavers and configure it to show photos from the `:photodir`
92
+ * Set screensaver to a super short timeout.
93
+ * Disable power savings.
94
+ * Drawbacks: The screensaver doesn't reload dynamically, so I have to kick it
95
+ and you'll see it reloading each time a new tweet comes in.
96
+
97
+ Limitations
98
+ ===========
99
+
100
+ * It currently requires manual setup for Folder Actions.
101
+ * It currently requires an external viewer, such as a screensaver.
102
+
103
+
104
+ Contact
105
+ =======
106
+
107
+ * Author: Ben Ford
108
+ * Email: binford2k@gmail.com
109
+ * Twitter: @binford2k
110
+ * IRC (Freenode): binford2k
@@ -0,0 +1,82 @@
1
+ #! /usr/bin/env ruby
2
+
3
+ require 'rubygems'
4
+ require 'twitter'
5
+ require 'optparse'
6
+ require "net/http"
7
+ require 'yaml'
8
+
9
+ require 'twitterpunch'
10
+
11
+ configfile = File.expand_path('~/.twitterpunch.yaml')
12
+ config = YAML.load_file(configfile) rescue {}
13
+
14
+ optparse = OptionParser.new { |opts|
15
+ opts.banner = "Usage : twitterpunch [--debug] [--stream] [--install] [--version] [filename]
16
+
17
+ Twitterpunch is designed to work with PhotoBooth and OS X Folder Actions.
18
+ When this script is called with the name of an image file, it will post the
19
+ image to Twitter, along with a randomly chosen message and a hashtag.
20
+
21
+ If you call the script with the --stream argument instead, it will listen
22
+ for tweets to that hashtag and download them to a specified directory. If
23
+ the tweet came from another user, Twitterpunch will speak it aloud.
24
+
25
+ "
26
+
27
+ opts.on("-d", "--debug", "Choose an alternate provisioning backend.") do
28
+ config[:debug] = true
29
+ end
30
+
31
+ opts.on("-s", "--stream", "Stream tweets from the specified hashtag.") do
32
+ config[:action] = :stream
33
+ end
34
+
35
+ opts.on("-g", "--genconfig", "Create a default configuration file.") do
36
+ config[:action] = :configure
37
+ end
38
+
39
+ opts.on("-i", "--install", "Install the Folder Action workflow (OS X only).") do
40
+ config[:action] = :install
41
+ end
42
+
43
+ opts.on("-v", "--version", "Display version information.") do
44
+ puts "Twitterpunch v#{Twitterpunch::VERSION}"
45
+ exit 0
46
+ end
47
+
48
+ opts.separator('')
49
+
50
+ opts.on("-h", "--help", "Displays this help") do
51
+ puts opts
52
+ exit
53
+ end
54
+ }
55
+ optparse.parse!
56
+
57
+ config[:resources] = File.expand_path("#{File.dirname(__FILE__)}/../resources")
58
+ config[:action] = :post if ARGV.size > 0 and config[:action].nil?
59
+
60
+ case config[:action]
61
+ when :stream
62
+ require 'twitterpunch/streamer'
63
+ client = Twitterpunch::Streamer.new(config)
64
+ client.stream
65
+
66
+ when :post
67
+ require 'twitterpunch/poster'
68
+ client = Twitterpunch::Poster.new(config)
69
+ client.post(ARGV)
70
+
71
+ when :configure
72
+ require 'twitterpunch/configuration'
73
+ cfg = Twitterpunch::Configuration.new(configfile).save
74
+ puts "Please edit #{configfile} to configure."
75
+
76
+ when :install
77
+ system('open', "#{config[:resources]}/Twitterpunch.workflow")
78
+
79
+ else
80
+ puts "Run twitterpunch --help for usage."
81
+ exit 1
82
+ end
@@ -0,0 +1,3 @@
1
+ module Twitterpunch
2
+ VERSION = '0.0.1'
3
+ end
@@ -0,0 +1,67 @@
1
+ require 'rubygems'
2
+ require 'oauth'
3
+ require 'yaml'
4
+
5
+ module Twitterpunch
6
+ class Configuration
7
+
8
+ def initialize(file)
9
+ @configfile = file
10
+
11
+ puts "Set up your application at https://twitter.com/apps/"
12
+ puts "then enter your 'Consumer key' and 'Consumer secret':"
13
+
14
+ print "Consumer key: "
15
+ @consumer_key = STDIN.readline.chomp
16
+ print "Consumer secret: "
17
+ @consumer_secret = STDIN.readline.chomp
18
+
19
+ consumer = OAuth::Consumer.new(
20
+ @consumer_key,
21
+ @consumer_secret,
22
+ {
23
+ :site => 'https://api.twitter.com/',
24
+ :scheme => :header,
25
+ })
26
+
27
+ request_token = consumer.get_request_token
28
+
29
+ puts "Visit #{request_token.authorize_url} in your browser to authorize the app"
30
+ # if we're on a Mac, open the page automatically
31
+ system("open #{request_token.authorize_url} 2>/dev/null")
32
+
33
+ print "Please enter the PIN you are given: "
34
+ pin = STDIN.readline.chomp
35
+
36
+ @access_token = request_token.get_access_token(:oauth_verifier => pin)
37
+ end
38
+
39
+ def save
40
+ config = YAML.load_file(@configfile) rescue defaults
41
+
42
+ config[:twitter] = {
43
+ :consumer_key => "#{@consumer_key}",
44
+ :consumer_secret => "#{@consumer_secret}",
45
+ :access_token => "#{@access_token.token}",
46
+ :access_token_secret => "#{@access_token.secret}"
47
+ }
48
+
49
+ File.open(@configfile, 'w') {|f| f.write(config.to_yaml) }
50
+ end
51
+
52
+ def defaults
53
+ {
54
+ :messages => [
55
+ "Hello there",
56
+ "I'm a posting fool",
57
+ "minimally viable product"
58
+ ],
59
+ :hashtag => "BestHalloweenPartyEver",
60
+ :handle => "fassford",
61
+ :photodir => "~/Pictures/twitterpunch/",
62
+ :logfile => '/var/log/twitterpunch',
63
+ :sendsound => "/System/Library/PrivateFrameworks/ToneLibrary.framework/Versions/A/Resources/AlertTones/tweet_sent.caf",
64
+ }
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,34 @@
1
+ require 'rubygems'
2
+ require 'colorize'
3
+ require 'logger'
4
+ require 'fileutils'
5
+
6
+ module Twitterpunch
7
+ class Logger
8
+ def initialize(config)
9
+ @options = config
10
+ @logger = ::Logger.new(config[:logfile])
11
+
12
+ @logger.level = config[:debug] ? ::Logger::DEBUG : ::Logger::INFO
13
+ end
14
+
15
+ def error(message)
16
+ puts message.red
17
+ @logger.error(message)
18
+ end
19
+
20
+ def debug(message)
21
+ return unless @options[:debug]
22
+ puts message.yellow
23
+ @logger.debug(message)
24
+ end
25
+
26
+ def info(message)
27
+ puts message.green unless @options[:quiet]
28
+ end
29
+
30
+ def log(username, message)
31
+ @logger.info(sprintf("%15s: %s", username, message))
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,21 @@
1
+ require 'rubygems'
2
+ require 'twitter'
3
+
4
+ module Twitterpunch
5
+ class Poster
6
+ def initialize(config)
7
+ @config = config
8
+ @client = Twitter::REST::Client.new(config[:twitter])
9
+ end
10
+
11
+ def post(files)
12
+ files.each do |img|
13
+
14
+ message = "#{@config[:messages].sample} ##{@config[:hashtag]}"
15
+ @client.update_with_media(message, File.new(File.expand_path(img)))
16
+
17
+ system("afplay #{@config[:sendsound]}")
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,63 @@
1
+ require 'rubygems'
2
+ require 'yaml'
3
+ require 'twitter'
4
+ require "net/http"
5
+
6
+ require 'twitterpunch/logger'
7
+
8
+ module Twitterpunch
9
+ class Streamer
10
+ def initialize(config)
11
+ @config = config
12
+ @client = Twitter::Streaming::Client.new(config[:twitter])
13
+ @logger = Twitterpunch::Logger.new(config)
14
+ @output = File.expand_path(config[:photodir])
15
+
16
+ FileUtils.mkdir_p(@output) unless File.directory?(@output)
17
+ end
18
+
19
+ def stream
20
+ begin
21
+ @client.filter(:track => @config[:hashtag]) do |tweet|
22
+ if tweet.is_a?(Twitter::Tweet)
23
+ @logger.info(tweet.text)
24
+ @logger.log(tweet.user.screen_name, tweet.text)
25
+
26
+
27
+ unless tweet.user.screen_name == @config[:handle]
28
+ message = "#{tweet.user.name} says #{tweet.text.gsub(/ http\S*/,'').gsub(/#\S*/,'')}"
29
+
30
+ case RUBY_PLATFORM
31
+ when /mingw|cygwin/
32
+ system('cscript', "#{@config[:resources]}/say.vbs", message)
33
+ when /darwin/
34
+ system('say', message)
35
+ end
36
+ end
37
+
38
+ if tweet.media?
39
+ uri = tweet.media.first.media_uri
40
+
41
+ http = Net::HTTP.new(uri.host, uri.port)
42
+ request = Net::HTTP::Get.new(uri.request_uri)
43
+ response = http.request(request)
44
+
45
+ File.open("#{@output}/#{File.basename uri.path}", 'wb') do |file|
46
+ file.write(response.body)
47
+ end
48
+
49
+ # OS X screensaver doesn't reload images dynamically. This kinda sucks.
50
+ if RUBY_PLATFORM =~ /darwin/
51
+ system('osascript', '-e', 'tell application "System Events" to stop current screen saver')
52
+ system('osascript', '-e', 'tell application "System Events" to start current screen saver')
53
+ end
54
+ end
55
+ end
56
+ end
57
+ rescue Interrupt => e
58
+ @logger.error "Exiting: #{e.message}"
59
+ end
60
+ end
61
+
62
+ end
63
+ end
@@ -0,0 +1,8 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+ <plist version="1.0">
4
+ <dict>
5
+ <key>AMFolderAction</key>
6
+ <string>AMAddingFolderItems</string>
7
+ </dict>
8
+ </plist>
@@ -0,0 +1,194 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+ <plist version="1.0">
4
+ <dict>
5
+ <key>AMApplicationBuild</key>
6
+ <string>409</string>
7
+ <key>AMApplicationVersion</key>
8
+ <string>2.5</string>
9
+ <key>AMDocumentVersion</key>
10
+ <string>2</string>
11
+ <key>actions</key>
12
+ <array>
13
+ <dict>
14
+ <key>action</key>
15
+ <dict>
16
+ <key>AMAccepts</key>
17
+ <dict>
18
+ <key>Container</key>
19
+ <string>List</string>
20
+ <key>Optional</key>
21
+ <true/>
22
+ <key>Types</key>
23
+ <array>
24
+ <string>com.apple.cocoa.string</string>
25
+ </array>
26
+ </dict>
27
+ <key>AMActionVersion</key>
28
+ <string>2.0.3</string>
29
+ <key>AMApplication</key>
30
+ <array>
31
+ <string>Automator</string>
32
+ </array>
33
+ <key>AMParameterProperties</key>
34
+ <dict>
35
+ <key>COMMAND_STRING</key>
36
+ <dict/>
37
+ <key>CheckedForUserDefaultShell</key>
38
+ <dict/>
39
+ <key>inputMethod</key>
40
+ <dict/>
41
+ <key>shell</key>
42
+ <dict/>
43
+ <key>source</key>
44
+ <dict/>
45
+ </dict>
46
+ <key>AMProvides</key>
47
+ <dict>
48
+ <key>Container</key>
49
+ <string>List</string>
50
+ <key>Types</key>
51
+ <array>
52
+ <string>com.apple.cocoa.string</string>
53
+ </array>
54
+ </dict>
55
+ <key>ActionBundlePath</key>
56
+ <string>/System/Library/Automator/Run Shell Script.action</string>
57
+ <key>ActionName</key>
58
+ <string>Run Shell Script</string>
59
+ <key>ActionParameters</key>
60
+ <dict>
61
+ <key>COMMAND_STRING</key>
62
+ <string>twitterpunch "$@"
63
+ </string>
64
+ <key>CheckedForUserDefaultShell</key>
65
+ <true/>
66
+ <key>inputMethod</key>
67
+ <integer>1</integer>
68
+ <key>shell</key>
69
+ <string>/bin/bash</string>
70
+ <key>source</key>
71
+ <string></string>
72
+ </dict>
73
+ <key>BundleIdentifier</key>
74
+ <string>com.apple.RunShellScript</string>
75
+ <key>CFBundleVersion</key>
76
+ <string>2.0.3</string>
77
+ <key>CanShowSelectedItemsWhenRun</key>
78
+ <false/>
79
+ <key>CanShowWhenRun</key>
80
+ <true/>
81
+ <key>Category</key>
82
+ <array>
83
+ <string>AMCategoryUtilities</string>
84
+ </array>
85
+ <key>Class Name</key>
86
+ <string>RunShellScriptAction</string>
87
+ <key>InputUUID</key>
88
+ <string>DB163A54-D2F3-40DB-B7F7-9D384EF50448</string>
89
+ <key>Keywords</key>
90
+ <array>
91
+ <string>Shell</string>
92
+ <string>Script</string>
93
+ <string>Command</string>
94
+ <string>Run</string>
95
+ <string>Unix</string>
96
+ </array>
97
+ <key>OutputUUID</key>
98
+ <string>B8E24806-125F-40F8-8545-355BF4B1F0BA</string>
99
+ <key>UUID</key>
100
+ <string>CD6A48B8-845B-4B58-ACB1-DB6A5FDEAAB9</string>
101
+ <key>UnlocalizedApplications</key>
102
+ <array>
103
+ <string>Automator</string>
104
+ </array>
105
+ <key>arguments</key>
106
+ <dict>
107
+ <key>0</key>
108
+ <dict>
109
+ <key>default value</key>
110
+ <integer>0</integer>
111
+ <key>name</key>
112
+ <string>inputMethod</string>
113
+ <key>required</key>
114
+ <string>0</string>
115
+ <key>type</key>
116
+ <string>0</string>
117
+ <key>uuid</key>
118
+ <string>0</string>
119
+ </dict>
120
+ <key>1</key>
121
+ <dict>
122
+ <key>default value</key>
123
+ <string></string>
124
+ <key>name</key>
125
+ <string>source</string>
126
+ <key>required</key>
127
+ <string>0</string>
128
+ <key>type</key>
129
+ <string>0</string>
130
+ <key>uuid</key>
131
+ <string>1</string>
132
+ </dict>
133
+ <key>2</key>
134
+ <dict>
135
+ <key>default value</key>
136
+ <false/>
137
+ <key>name</key>
138
+ <string>CheckedForUserDefaultShell</string>
139
+ <key>required</key>
140
+ <string>0</string>
141
+ <key>type</key>
142
+ <string>0</string>
143
+ <key>uuid</key>
144
+ <string>2</string>
145
+ </dict>
146
+ <key>3</key>
147
+ <dict>
148
+ <key>default value</key>
149
+ <string></string>
150
+ <key>name</key>
151
+ <string>COMMAND_STRING</string>
152
+ <key>required</key>
153
+ <string>0</string>
154
+ <key>type</key>
155
+ <string>0</string>
156
+ <key>uuid</key>
157
+ <string>3</string>
158
+ </dict>
159
+ <key>4</key>
160
+ <dict>
161
+ <key>default value</key>
162
+ <string>/bin/sh</string>
163
+ <key>name</key>
164
+ <string>shell</string>
165
+ <key>required</key>
166
+ <string>0</string>
167
+ <key>type</key>
168
+ <string>0</string>
169
+ <key>uuid</key>
170
+ <string>4</string>
171
+ </dict>
172
+ </dict>
173
+ <key>isViewVisible</key>
174
+ <true/>
175
+ <key>location</key>
176
+ <string>309.000000:253.000000</string>
177
+ <key>nibPath</key>
178
+ <string>/System/Library/Automator/Run Shell Script.action/Contents/Resources/English.lproj/main.nib</string>
179
+ </dict>
180
+ <key>isViewVisible</key>
181
+ <true/>
182
+ </dict>
183
+ </array>
184
+ <key>connectors</key>
185
+ <dict/>
186
+ <key>workflowMetaData</key>
187
+ <dict>
188
+ <key>folderActionFolderPath</key>
189
+ <string>~/Pictures/Photo Booth Library/Pictures</string>
190
+ <key>workflowTypeIdentifier</key>
191
+ <string>com.apple.Automator.folderAction</string>
192
+ </dict>
193
+ </dict>
194
+ </plist>
@@ -0,0 +1,4 @@
1
+ 'say.vbs
2
+ set s = CreateObject("SAPI.SpVoice")
3
+ s.Speak Wscript.Arguments(0), 3
4
+ s.WaitUntilDone(10000)
metadata ADDED
@@ -0,0 +1,146 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: twitterpunch
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Ben Ford
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-10-27 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: twitter
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: oauth
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: colorize
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ description: "Twitterpunch\n===============\n\nTwitterpunch is designed to work with
56
+ PhotoBooth and OS X Folder Actions.\nWhen this script is called with the name of
57
+ an image file, it will post the\nimage to Twitter, along with a message randomly
58
+ chosen from a list and a\nspecified hashtag.\n\nIf you call the script with the
59
+ --stream argument instead, it will listen\nfor tweets to that hashtag and download
60
+ them to a specified directory. If\nthe tweet came from another user, Twitterpunch
61
+ will speak it aloud.\n\nConfiguration\n===========\n\nConfigure the program via
62
+ the `~/.twitterpunch.yaml` YAML file. This file should\nlook similar to the example
63
+ below.\n\n ---\n :twitter:\n :consumer_key: <consumer key>\n :consumer_secret:
64
+ <consumer secret>\n :access_token: <access token>\n :access_token_secret:
65
+ <access secret>\n :messages:\n - Hello there\n - I'm a posting fool\n -
66
+ minimally viable product\n :hashtag: BestHalloweenPartyEver\n :handle: FassFord\n
67
+ \ :photodir: ~/Pictures/twitterpunch/\n :logfile: /Users/ben/.twitterpunch.log\n
68
+ \ :sendsound: /System/Library/PrivateFrameworks/ToneLibrary.framework/Versions/A/Resources/AlertTones/tweet_sent.caf\n\nA
69
+ skeleton configuration file, with access tokens from Twitter, can be generated\nby
70
+ running the program with the `--genconfig` flag.\n\nUsage \n==========\n\n### Using
71
+ OS X PhotoBooth\n\n1. Start PhotoBooth at least once to generate its library.\n1.
72
+ Install the Twitterpunch Folder Action\n * `twitterpunch --install`\n * It
73
+ may claim that it could not be attached, fear not.\n1. Profit!\n * _and by that,
74
+ I mean take some shots with PhotoBooth!_\n\n#### Troubleshooting.\n\n1. Make sure
75
+ the folder action is installed properly\n 1. Use the Finder to navigate to `~/Pictures/`\n
76
+ \ 1. Right click on the `Photo Booth Library` icon and choose _Show Package Contents_.\n
77
+ \ 1. Right click on the `Pictures` folder and choose `Services > Folder Actions
78
+ Setup`\n 1. Make sure that the `Twitterpunch` action is attached.\n1. Install
79
+ the folder action\n 1. Open the `resources` folder of this gem.\n * Likely
80
+ to be found in `/Library/Ruby/Gems/2.0.0/gems/twitterpunch-#{version}/resources/`.\n
81
+ \ 1. Double click on the `Twitterpunch` folder action and install it.\n *
82
+ It may claim that it could not be attached, fear not.\n\n### Using something else\n\nConfigure
83
+ the program you are using for your photo shoot to call Twitterpunch\neach time it
84
+ snaps a photo. Pass the name of the new photo as a command line\nargument. Alternatively,
85
+ you could batch them, as Twitterpunch can accept\nmultiple files at once.\n\n [ben@ganymede]
86
+ ~ $ twitterpunch photo.jpg\n\n### Viewing the Twitter stream\n\nCurrently Twitterpunch
87
+ doesn't display photos directly. It simply downloads them\nand stuffs them into
88
+ the configured `:photodir`. Twitterpunch will run on OS X or\nWindows equally well.
89
+ Simply configure it on the computer that will act as the \nTwitter display and then
90
+ run in streaming mode. Tweets that come from any other\nuser will be spoken aloud.\n\n
91
+ \ [ben@ganymede] ~ $ twitterpunch --stream\n\nThere are currently two decent viewing
92
+ options I am aware of.\n\n* Windows background image:\n * Configure the Windows
93
+ background to randomly cycle through photos in a directory.\n * Hide desktop
94
+ icons.\n * Hide the taskbar.\n * Disable screensaver and power savings.\n
95
+ \ * Drawbacks: You're using Windows and you have to install Ruby & RubyGems manually.\n*
96
+ OS X screensaver:\n * Choose one of the sexy screensavers and configure it to
97
+ show photos from the `:photodir`\n * Set screensaver to a super short timeout.\n
98
+ \ * Disable power savings.\n * Drawbacks: The screensaver doesn't reload dynamically,
99
+ so I have to kick it\n and you'll see it reloading each time a new tweet comes
100
+ in.\n\nLimitations\n===========\n\n* It currently requires manual setup for Folder
101
+ Actions.\n* It currently requires an external viewer, such as a screensaver.\n\n\nContact\n=======\n\n*
102
+ Author: Ben Ford\n* Email: binford2k@gmail.com\n* Twitter: @binford2k\n* IRC (Freenode):
103
+ binford2k\n"
104
+ email: binford2k@gmail.com
105
+ executables:
106
+ - twitterpunch
107
+ extensions: []
108
+ extra_rdoc_files: []
109
+ files:
110
+ - LICENSE
111
+ - README.md
112
+ - bin/twitterpunch
113
+ - lib/twitterpunch.rb
114
+ - lib/twitterpunch/configuration.rb
115
+ - lib/twitterpunch/logger.rb
116
+ - lib/twitterpunch/poster.rb
117
+ - lib/twitterpunch/streamer.rb
118
+ - resources/Twitterpunch.workflow/Contents/Info.plist
119
+ - resources/Twitterpunch.workflow/Contents/QuickLook/Thumbnail.png
120
+ - resources/Twitterpunch.workflow/Contents/document.wflow
121
+ - resources/say.vbs
122
+ homepage: http://binford2k.com
123
+ licenses: []
124
+ metadata: {}
125
+ post_install_message:
126
+ rdoc_options: []
127
+ require_paths:
128
+ - lib
129
+ required_ruby_version: !ruby/object:Gem::Requirement
130
+ requirements:
131
+ - - '>='
132
+ - !ruby/object:Gem::Version
133
+ version: '0'
134
+ required_rubygems_version: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - '>='
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ requirements: []
140
+ rubyforge_project:
141
+ rubygems_version: 2.2.2
142
+ signing_key:
143
+ specification_version: 4
144
+ summary: A simple tool to automate the posting and streaming of PhotoBooth shots over
145
+ Twitter.
146
+ test_files: []