tweetlr 0.1.18 → 0.1.19

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.
data/bin/tweetlr CHANGED
@@ -6,59 +6,65 @@ require 'logger'
6
6
  require 'yaml'
7
7
  require 'tweetlr'
8
8
 
9
- begin
10
- config_file = File.join( Dir.pwd, 'config', 'tweetlr.yml')
11
- tid_file = File.join( Dir.pwd ,"tweetlr.tid")
12
- start_at_tweet_id = lambda {
13
- begin
14
- File.open(tid_file, "r") { |io| io.gets.to_i }
15
- rescue Errno::ENOENT => e
16
- $stderr.puts "#{e} - we use the value from the configuration file"
17
- nil
18
- end
19
- }.call
20
- CONFIG = YAML.load_file(config_file)
21
- CONFIG['start_at_tweet_id'] = start_at_tweet_id || CONFIG['start_at_tweet_id'] || CONFIG['twitter_timestamp'] #check the latter for backwards compability
22
-
23
- UPDATE_PERIOD = CONFIG['update_period']
9
+ module Tweetlr
10
+ module Runner
11
+ def self.run
12
+ begin
13
+ config_file = File.join( Dir.pwd, 'config', 'tweetlr.yml')
14
+ tid_file = File.join( Dir.pwd ,"tweetlr.tid")
15
+ start_at_tweet_id = lambda {
16
+ begin
17
+ File.open(tid_file, "r") { |io| io.gets.to_i }
18
+ rescue Errno::ENOENT => e
19
+ $stderr.puts "#{e} - we use the value from the configuration file"
20
+ nil
21
+ end
22
+ }.call
23
+ config = YAML.load_file(config_file)
24
+ config['start_at_tweet_id'] = start_at_tweet_id || config['start_at_tweet_id'] || config['twitter_timestamp'] #check the latter for backwards compability
25
+
26
+ @tweetlr_config = prepare_tweetlr_config config
27
+ rescue SystemCallError
28
+ $stderr.puts "Ooops - looks like there is no ./config/tweetlr.yml found. I'm affraid tweetlr won't work properly until you introduced that configuration file."
29
+ exit(1)
30
+ end
24
31
 
25
- @tweetlr_config = prepare_tweetlr_config CONFIG
26
- rescue SystemCallError
27
- $stderr.puts "Ooops - looks like there is no ./config/tweetlr.yml found. I'm affraid tweetlr won't work properly until you introduced that configuration file."
28
- exit(1)
29
- end
32
+ Daemons.run_proc('tweetlr', :dir_mode => :script, :dir => './', :backtrace => true, :log_output => true) do
33
+ @log = Logger.new(STDOUT)
34
+ @log.info "starting tweetlr daemon..."
35
+ @log.info "creating a new tweetlr instance using this config: #{@tweetlr_config.inspect}"
36
+ EventMachine::run do
37
+ EventMachine::add_periodic_timer( @tweetlr_config[:update_period] ) do
38
+ response = Tweetlr::Core.crawl(@tweetlr_config)
39
+ File.open(tid_file, "w+") { |io| io.write(response[:since_id]) }
40
+ @tweetlr_config.merge! response
41
+ end
42
+ end
43
+ end
44
+ end
30
45
 
31
- Daemons.run_proc('tweetlr', :dir_mode => :script, :dir => './', :backtrace => true, :log_output => true) do
32
- @log = Logger.new(STDOUT)
33
- @log.info "starting tweetlr daemon..."
34
- @log.info "creating a new tweetlr instance using this config: #{@tweetlr_config.inspect}"
35
- EventMachine::run do
36
- EventMachine::add_periodic_timer( UPDATE_PERIOD ) do
37
- response = Tweetlr::Core.crawl(@tweetlr_config)
38
- File.open(tid_file, "w+") { |io| io.write(response[:since_id]) }
39
- @tweetlr_config.merge! response
40
- end
41
- end
46
+ def self.prepare_tweetlr_config(config)
47
+ {
48
+ :tumblr_blog_hostname => config['tumblr_blog_hostname'] || config['group'],
49
+ :tumblr_oauth_api_key => config['tumblr_oauth_api_key'],
50
+ :tumblr_oauth_api_secret => config['tumblr_oauth_api_secret'],
51
+ :tumblr_blog_hostname => config['tumblr_blog_hostname'],
52
+ :tumblr_oauth_access_token_key => config['tumblr_oauth_access_token_key'],
53
+ :tumblr_oauth_access_token_secret => config['tumblr_oauth_access_token_secret'],
54
+ :whitelist => config['whitelist'],
55
+ :shouts => config['shouts'],
56
+ :since_id => config['start_at_tweet_id'] ,
57
+ :terms => config['search_term'],
58
+ :loglevel => config['loglevel'],
59
+ :update_period => config['update_period'],
60
+ :api_endpoint_tumblr => config['api_endpoint_tumblr'],
61
+ :api_endpoint_twitter => config['api_endpoint_twitter'],
62
+ :results_per_page => config['results_per_page'],
63
+ :result_type => config['result_type'],
64
+ :embedly_key => config['embedly_key']
65
+ }
66
+ end
67
+ end
42
68
  end
43
69
 
44
- def prepare_tweetlr_config(config)
45
- {
46
- :tumblr_blog_hostname => config['tumblr_blog_hostname'] || config['group'],
47
- :tumblr_oauth_api_key => config['tumblr_oauth_api_key'],
48
- :tumblr_oauth_api_secret => config['tumblr_oauth_api_secret'],
49
- :tumblr_blog_hostname => config['tumblr_blog_hostname'],
50
- :tumblr_oauth_access_token_key => config['tumblr_oauth_access_token_key'],
51
- :tumblr_oauth_access_token_secret => config['tumblr_oauth_access_token_secret'],
52
- :whitelist => config['whitelist'],
53
- :shouts => config['shouts'],
54
- :since_id => config['start_at_tweet_id'] ,
55
- :terms => config['search_term'],
56
- :loglevel => config['loglevel'],
57
- :update_period => UPDATE_PERIOD,
58
- :api_endpoint_tumblr => config['api_endpoint_tumblr'],
59
- :api_endpoint_twitter => config['api_endpoint_twitter'],
60
- :results_per_page => config['results_per_page'],
61
- :result_type => config['result_type'],
62
- :embedly_key => config['embedly_key']
63
- }
64
- end
70
+ Tweetlr::Runner.run
data/config/tweetlr.yml CHANGED
@@ -1,18 +1,18 @@
1
1
  results_per_page: 100
2
2
  result_type: recent
3
- search_term: 'coffeediary' #find tweets containing any of these terms
3
+ search_term: 'cat+dog+unicorn' #find tweets containing any of these terms
4
4
  start_at_tweet_id: 61847783463854082 # the tweet id to start searching at
5
5
  api_endpoint_twitter: 'http://search.twitter.com/search.json'
6
6
  api_endpoint_tumblr: 'http://www.tumblr.com'
7
- tumblr_oauth_api_key: 'Buq8j3koYLqrZEMmTM4GL32S0guZU2Qvoz8xSvFRumaWuaxAnG'
8
- tumblr_oauth_api_secret: 'EnjBUAjUHo4Qi4d3BPUL5xsdc8qClDqRTLssz8Jzd2sKC7KZaq'
9
- tumblr_oauth_access_token_key: 'MQES8SEqr3JogLyUYzcV68RFfQ0b3ClxbnUihChh8p9UMH3tkM'
10
- tumblr_oauth_access_token_secret: 'FBnrEFW1p9RG7Zh1kztPjPDCbeE229fMPX5VwuzgZqUdD2hXSS'
11
- tumblr_blog_hostname: 'tweetlr-testlr.tumblr.com' #e.g. mysubblog.tumblr.com
12
- embedly_key: '9e6c2bb8372e11e1a92e4040d3dc5c07' #tweetlr uses http://embedly.com for link processing. a free plan containing an api key is available & recommended to use in order to ensure full support
13
- update_period: 10 #check for updates every 300 secs = 5 minutes
7
+ tumblr_oauth_api_key: YOUR APPS TUMBLR API TOKEN
8
+ tumblr_oauth_api_secret: YOUR APPS TUMBLR API SECRET
9
+ tumblr_oauth_access_token_key: YOUR BLOGS OAUTH ACCESS TOKEN KEY
10
+ tumblr_oauth_access_token_secret: YOUR BLOGS OAUTH ACCESS TOKEN SECRE
11
+ tumblr_blog_hostname: YOUR BLOGS HOSTNAME #e.g. myblog.tumblr.com
12
+ embedly_key: '' #tweetlr uses http://embedly.com for link processing. a free plan containing an api key is available & recommended to use in order to ensure full support
13
+ update_period: 300 #check for updates every 300 secs = 5 minutes
14
14
  shouts: 'says' # will be concatenated after the username, before the message: @mr_x says: awesome things on a photo!
15
15
  loglevel: 1 # 0: debug, 1: info (default), 2: warn, 3: error, 5: fatal
16
16
  whitelist: #twitter accounts in that list will have their tweets published immediately. post from others will be saved as drafts. blank list will publish all tweets immediately
17
17
  - whitey_mc_whitelist
18
- - sven_kr
18
+ - sven_kr
data/lib/tweetlr/core.rb CHANGED
@@ -45,8 +45,19 @@ class Tweetlr::Core
45
45
  response = {}
46
46
  response = Tweetlr::Processors::Twitter::lazy_search(twitter_config)
47
47
  if response
48
- tweets = response['results']
49
- if tweets
48
+ process_response response, config, tumblr_config
49
+ # store the highest tweet id
50
+ config[:since_id] = response['max_id']
51
+ else
52
+ log.error "twitter search returned no response. hail the failwhale!"
53
+ end
54
+ log.info "finished tweetlr crawl."
55
+ return config
56
+ end
57
+ private
58
+ def self.process_response(response, config, tumblr_config)
59
+ tweets = response['results']
60
+ if tweets
50
61
  tweets.each do |tweet|
51
62
  tumblr_post = Tweetlr::Combinators::TwitterTumblr::generate_photo_post_from_tweet(tweet, {:whitelist => config[:whitelist], :embedly_key => config[:embedly_key], :group => config[:group]})
52
63
  if tumblr_post.nil? || tumblr_post[:source].nil?
@@ -55,23 +66,17 @@ class Tweetlr::Core
55
66
  log.debug "tumblr post: #{tumblr_post}"
56
67
  res = Tweetlr::Processors::Tumblr.post tumblr_post.merge(tumblr_config)
57
68
  log.debug "tumblr response: #{res}"
58
- if res.code == "201"
69
+ if res && res.code == "201"
59
70
  log.info "tumblr post created (tumblr response: #{res.header} #{res.body}"
60
- else
71
+ elsif res
61
72
  log.warn "tumblr response: #{res.header} #{res.body}"
73
+ else
74
+ log.warn "there was no tumblr post response - most probably due to a missing oauth authorization"
62
75
  end
63
76
  end
64
- end
65
- # store the highest tweet id
66
- config[:since_id] = response['max_id']
67
77
  end
68
- else
69
- log.error "twitter search returned no response. hail the failwhale!"
70
78
  end
71
- log.info "finished tweetlr crawl."
72
- return config
73
79
  end
74
- private
75
80
  def self.prepare_twitter_config(config)
76
81
  {
77
82
  :since_id => config[:since_id] || config[:start_at_tweet_id],
data/lib/tweetlr.rb CHANGED
@@ -2,7 +2,7 @@ require 'tweetlr/log_aware'
2
2
  require 'tweetlr/core'
3
3
 
4
4
  module Tweetlr
5
- VERSION = '0.1.18'
5
+ VERSION = '0.1.19'
6
6
 
7
7
  API_ENDPOINT_TWITTER = 'http://search.twitter.com/search.json'
8
8
  API_ENDPOINT_TUMBLR = 'http://www.tumblr.com'
data/tweetlr.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = "tweetlr"
3
- s.version = "0.1.18"
3
+ s.version = "0.1.19"
4
4
  s.author = "Sven Kraeuter"
5
5
  s.email = "sven.kraeuter@gmail.com"
6
6
  s.homepage = "http://tweetlr.5v3n.com"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tweetlr
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.18
4
+ version: 0.1.19
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-09-29 00:00:00.000000000 Z
12
+ date: 2012-09-30 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: daemons
16
- requirement: &2160420980 !ruby/object:Gem::Requirement
16
+ requirement: &2152354160 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *2160420980
24
+ version_requirements: *2152354160
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: eventmachine
27
- requirement: &2160420140 !ruby/object:Gem::Requirement
27
+ requirement: &2152353320 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0'
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *2160420140
35
+ version_requirements: *2152353320
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: curb
38
- requirement: &2160419680 !ruby/object:Gem::Requirement
38
+ requirement: &2152352860 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '0'
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *2160419680
46
+ version_requirements: *2152352860
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: json
49
- requirement: &2160419220 !ruby/object:Gem::Requirement
49
+ requirement: &2152352400 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: '0'
55
55
  type: :runtime
56
56
  prerelease: false
57
- version_requirements: *2160419220
57
+ version_requirements: *2152352400
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: nokogiri
60
- requirement: &2160418520 !ruby/object:Gem::Requirement
60
+ requirement: &2152351700 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ! '>='
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: '0'
66
66
  type: :runtime
67
67
  prerelease: false
68
- version_requirements: *2160418520
68
+ version_requirements: *2152351700
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: oauth
71
- requirement: &2160417840 !ruby/object:Gem::Requirement
71
+ requirement: &2152351020 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ! '>='
@@ -76,10 +76,10 @@ dependencies:
76
76
  version: '0'
77
77
  type: :runtime
78
78
  prerelease: false
79
- version_requirements: *2160417840
79
+ version_requirements: *2152351020
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: rake
82
- requirement: &2160417320 !ruby/object:Gem::Requirement
82
+ requirement: &2152350500 !ruby/object:Gem::Requirement
83
83
  none: false
84
84
  requirements:
85
85
  - - ! '>='
@@ -87,10 +87,10 @@ dependencies:
87
87
  version: '0'
88
88
  type: :development
89
89
  prerelease: false
90
- version_requirements: *2160417320
90
+ version_requirements: *2152350500
91
91
  - !ruby/object:Gem::Dependency
92
92
  name: rspec
93
- requirement: &2160416900 !ruby/object:Gem::Requirement
93
+ requirement: &2152350080 !ruby/object:Gem::Requirement
94
94
  none: false
95
95
  requirements:
96
96
  - - ! '>='
@@ -98,10 +98,10 @@ dependencies:
98
98
  version: '0'
99
99
  type: :development
100
100
  prerelease: false
101
- version_requirements: *2160416900
101
+ version_requirements: *2152350080
102
102
  - !ruby/object:Gem::Dependency
103
103
  name: rdoc
104
- requirement: &2160416480 !ruby/object:Gem::Requirement
104
+ requirement: &2152349660 !ruby/object:Gem::Requirement
105
105
  none: false
106
106
  requirements:
107
107
  - - ! '>='
@@ -109,7 +109,7 @@ dependencies:
109
109
  version: '0'
110
110
  type: :development
111
111
  prerelease: false
112
- version_requirements: *2160416480
112
+ version_requirements: *2152349660
113
113
  description: tweetlr crawls twitter for a given term, extracts photos out of the collected
114
114
  tweets' short urls and posts the images to tumblr.
115
115
  email: sven.kraeuter@gmail.com