twitter_images 0.0.4 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: aa9d6738e520524fa87bebe3509598b51ff6b61c
4
- data.tar.gz: d7021a59087e612655ec50a740ac3d02a559f94f
3
+ metadata.gz: 20dbabd1b8ed7d7b58e062c56e3a1912ee07b250
4
+ data.tar.gz: 8de26899a00b93007b8338a588514fbba231f781
5
5
  SHA512:
6
- metadata.gz: 131398180fdb31450b64b8c1303637ed67b8190272d5e86206458a594c7c5b8222841190d26f0c87412ec8ccb3bcff2b635a48a15b8d10ee9c7ea39d261fd705
7
- data.tar.gz: 552d52a07c0525ae55a54777785383c0823823cf21455f9090d0f16f2e3a1d9b0938b1b19b709355527bb20e1c1d06450c101fb964d0872394066d1a2fd7bf86
6
+ metadata.gz: 62d203269ee201430588c11da10ac95dac38cd514a68ba3e3dd589cff06083d61ec4ff2bc0a3e5b4e46ba324818901f875db37b30e80c1a54c919f4ac2756564
7
+ data.tar.gz: f91bd4f69ce6bd9fb4e8d33fb151d5a2ef29f21b37b363660d5a8b360b3ec1154fe5525718f8f4d02dc8cdb7118501f210d3518e7a2d2e337ae50bb336581f44
@@ -3,4 +3,8 @@
3
3
  $LOAD_PATH.unshift(File.expand_path("../lib", __FILE__))
4
4
  require "twitter_images"
5
5
 
6
- TwitterImages::CLI.new.run
6
+ downloader = TwitterImages::Downloader.new
7
+ requester = TwitterImages::Requester.new(downloader)
8
+ configuration = TwitterImages::Configuration.new(requester)
9
+
10
+ TwitterImages::CLI.new(configuration).run
@@ -4,6 +4,7 @@ require "fileutils"
4
4
  require "json"
5
5
  require "oauth"
6
6
  require "ruby-progressbar"
7
+ require "typhoeus"
7
8
 
8
9
  require "twitter_images/cli"
9
10
  require "twitter_images/configuration"
@@ -1,9 +1,9 @@
1
1
  module TwitterImages
2
2
  class CLI
3
- attr_accessor :configuration
3
+ attr_reader :configuration
4
4
 
5
- def initialize()
6
- @configuration = Configuration.new
5
+ def initialize(configuration)
6
+ @configuration = configuration
7
7
  end
8
8
 
9
9
  def run
@@ -1,11 +1,17 @@
1
1
  module TwitterImages
2
2
  class Configuration
3
- attr_accessor :search, :directory
3
+ attr_reader :requester
4
+ attr_accessor :search, :directory, :amount
5
+
6
+ def initialize(requester)
7
+ @requester = requester
8
+ end
4
9
 
5
10
  def prepare
6
11
  set_directory
7
12
  get_search
8
- Requester.new(@search).start
13
+ get_amount
14
+ start
9
15
  end
10
16
 
11
17
  private
@@ -30,5 +36,15 @@ module TwitterImages
30
36
  @search = gets.chomp.gsub(/\s/, "%20")
31
37
  raise StandardError, "The search string is empty" if @search.empty?
32
38
  end
39
+
40
+ def get_amount
41
+ puts "Please enter the number of images to download: "
42
+ @amount = gets.chomp.to_i
43
+ raise StandardError, "The number is too small" if @amount <= 0
44
+ end
45
+
46
+ def start
47
+ requester.start(@search, @amount)
48
+ end
33
49
  end
34
50
  end
@@ -1,34 +1,34 @@
1
1
  module TwitterImages
2
2
  class Downloader
3
- attr_accessor :response, :output, :images
3
+ attr_accessor :output, :images
4
4
 
5
- def initialize(response)
6
- @response = response
7
- end
8
-
9
- def download
10
- get_output
11
- parse_output
12
- save_images
5
+ def download(all_links)
6
+ save_images(all_links)
13
7
  end
14
8
 
15
9
  private
16
10
 
17
- def get_output
18
- @output = JSON.parse(response.body)
11
+ def write_file(filename, data)
12
+ file = File.new(File.basename(filename), "wb")
13
+ file.write(data)
14
+ file.close
19
15
  end
20
16
 
21
- def parse_output
22
- @images = output.inspect.scan(/https:\/\/pbs.twimg.com\/media\/\w+\.(?:jpg|png|gif)/)
23
- raise StandardError, "Couldn't find any images" unless @images.count > 0
24
- end
17
+ def save_images(all_links)
18
+ progressbar = ProgressBar.create(:total => all_links.count)
19
+ hydra = Typhoeus::Hydra.new
25
20
 
26
- def save_images
27
- progressbar = ProgressBar.create(:total => images.count)
28
- images.each do |src|
29
- File.open(File.basename(src), "wb") { |f| f.write(open(src + ":large").read) }
30
- progressbar.increment
21
+ all_links.each do |src|
22
+ request = Typhoeus::Request.new(src + ":large")
23
+ request.on_complete do |response|
24
+ write_file(src, response.body)
25
+ progressbar.increment
26
+ end
27
+ hydra.queue request
31
28
  end
29
+ hydra.run
30
+ puts "Downloaded #{all_links.count} pictures!"
32
31
  end
33
32
  end
33
+
34
34
  end
@@ -1,31 +1,46 @@
1
1
  module TwitterImages
2
2
  class Requester
3
- attr_accessor :search, :consumer_key, :access_token, :address, :https,
4
- :request, :response
3
+ attr_reader :consumer_key, :access_token, :downloader, :search
4
+ attr_accessor :https, :address, :response, :max_id, :all_links
5
5
 
6
- def initialize(search)
7
- @search = search
6
+ def initialize(downloader)
7
+ @downloader = downloader
8
+ @all_links = []
8
9
  end
9
10
 
10
- def start
11
- set_address
12
- setup_credentials
13
- setup_https
14
- build_request
15
- issue_request
16
- Downloader.new(@response).download
11
+ def start(search, amount)
12
+ check_env
13
+ get_links(search, amount)
14
+ download
15
+ end
16
+
17
+ def get_links(search, amount)
18
+ loop do
19
+ setup_address(search)
20
+ setup_https
21
+ issue_request
22
+ parse_response
23
+ break if all_links.count > amount
24
+ end
25
+ trim_links(amount)
17
26
  end
18
27
 
19
28
  private
20
29
 
21
- def set_address
22
- @address = URI("https://api.twitter.com/1.1/search/tweets.json?q=%23#{search}&mode=photos&count=100")
30
+ def setup_address(search)
31
+ unless @max_id.nil?
32
+ @address = URI("https://api.twitter.com/1.1/search/tweets.json?q=%23#{search}&result_type=recent&count=100&max_id=#{@max_id}")
33
+ else
34
+ @address = URI("https://api.twitter.com/1.1/search/tweets.json?q=%23#{search}&result_type=recent&count=100")
35
+ end
36
+ end
37
+
38
+ def consumer_key
39
+ OAuth::Consumer.new(ENV["CONSUMER_KEY"], ENV["CONSUMER_SECRET"])
23
40
  end
24
41
 
25
- def setup_credentials
26
- check_env
27
- @consumer_key = OAuth::Consumer.new(ENV["CONSUMER_KEY"], ENV["CONSUMER_SECRET"])
28
- @access_token = OAuth::Token.new(ENV["ACCESS_TOKEN"], ENV["ACCESS_SECRET"])
42
+ def access_token
43
+ OAuth::Token.new(ENV["ACCESS_TOKEN"], ENV["ACCESS_SECRET"])
29
44
  end
30
45
 
31
46
  def check_env
@@ -40,22 +55,43 @@ module TwitterImages
40
55
  end
41
56
 
42
57
  def setup_https
43
- # Set up Net::HTTP to use SSL, which is required by Twitter.
44
58
  @https = Net::HTTP.new(address.host, address.port)
45
59
  https.use_ssl = true
46
- https.verify_mode = OpenSSL::SSL::VERIFY_PEER
47
- end
48
-
49
- def build_request
50
- # Build the request and authorize it with OAuth.
51
- @request = Net::HTTP::Get.new(address.request_uri)
52
- request.oauth!(https, consumer_key, access_token)
60
+ https.verify_mode = OpenSSL::SSL::VERIFY_NONE
53
61
  end
54
62
 
55
63
  def issue_request
56
- # Issue the request and return the response.
64
+ request = Net::HTTP::Get.new(address.request_uri)
65
+ request.oauth!(https, consumer_key, access_token)
57
66
  @https.start
58
67
  @response = https.request(request)
59
68
  end
69
+
70
+ def parse_response
71
+ filtered = JSON.parse(@response.body)
72
+ get_max_id(filtered)
73
+ collect_responses(filtered)
74
+ end
75
+
76
+ def get_max_id(filtered)
77
+ ids = []
78
+ filtered["statuses"].each do |tweet|
79
+ ids << tweet["id"]
80
+ end
81
+ @max_id = ids.min - 1
82
+ end
83
+
84
+ def collect_responses(filtered)
85
+ @all_links += filtered.inspect.scan(/https:\/\/pbs.twimg.com\/media\/\w+\.(?:jpg|png|gif)/)
86
+ @all_links.uniq!
87
+ end
88
+
89
+ def trim_links(amount)
90
+ @all_links = @all_links.slice!(0...amount)
91
+ end
92
+
93
+ def download
94
+ downloader.download(@all_links)
95
+ end
60
96
  end
61
97
  end
@@ -1,3 +1,3 @@
1
1
  module TwitterImages
2
- VERSION = "0.0.4"
2
+ VERSION = "0.1.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: twitter_images
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alexey Zabelin
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-01-07 00:00:00.000000000 Z
11
+ date: 2016-01-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: fileutils
@@ -84,6 +84,20 @@ dependencies:
84
84
  - - ">="
85
85
  - !ruby/object:Gem::Version
86
86
  version: 1.7.5
87
+ - !ruby/object:Gem::Dependency
88
+ name: typhoeus
89
+ requirement: !ruby/object:Gem::Requirement
90
+ requirements:
91
+ - - "~>"
92
+ - !ruby/object:Gem::Version
93
+ version: '1.0'
94
+ type: :runtime
95
+ prerelease: false
96
+ version_requirements: !ruby/object:Gem::Requirement
97
+ requirements:
98
+ - - "~>"
99
+ - !ruby/object:Gem::Version
100
+ version: '1.0'
87
101
  - !ruby/object:Gem::Dependency
88
102
  name: bundler
89
103
  requirement: !ruby/object:Gem::Requirement
@@ -154,6 +168,20 @@ dependencies:
154
168
  - - '='
155
169
  - !ruby/object:Gem::Version
156
170
  version: 0.2.2
171
+ - !ruby/object:Gem::Dependency
172
+ name: webmock
173
+ requirement: !ruby/object:Gem::Requirement
174
+ requirements:
175
+ - - '='
176
+ - !ruby/object:Gem::Version
177
+ version: 1.22.6
178
+ type: :development
179
+ prerelease: false
180
+ version_requirements: !ruby/object:Gem::Requirement
181
+ requirements:
182
+ - - '='
183
+ - !ruby/object:Gem::Version
184
+ version: 1.22.6
157
185
  description: |-
158
186
  A CLI tool that downloads the most recent images from twitter based on the search terms provided. Please remember that you need to provide your own
159
187
  consumer key and consumer secret as well as the access token and access token secret. You