drophunter 0.1.0 → 0.2.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: 4a4e84d5f240794168ac6494204879b9a27332cb
4
- data.tar.gz: eb020b5e45f0c4c1a496fcdeb3ac1e81fa12f1fb
3
+ metadata.gz: a9b3ca7dd5c29382c1d37894b5dacc1de5065a35
4
+ data.tar.gz: 5644b665b3abcff059a014ea00fc0dfc9a436729
5
5
  SHA512:
6
- metadata.gz: 76de144329838ed7c71999ccb6fc2ddda1597f990ab2cc4939bb50723df23b8b4b123400517e0ce8d413ac73ba71699d176320afb0b27630f7f2284ac0149cf8
7
- data.tar.gz: 64aeab5ce228a324072bc850c5e11fdc77e914369935868b15c7aad00b4f35a2c3536066ad51cd7da0e4b16c7891978bfe69150827277058c9bf08f00fdb56f3
6
+ metadata.gz: 91e00cd35089483cf5af170501abdb2d8273867eef91ba8db670bc3b2b3cd007abea5ce2fc27883a032f7f88cfb10b174456fd4de3a728910df5fddeb6a21d5e
7
+ data.tar.gz: b06dd8a1fb2216ab9865a975533159e2cb98fdd7287c45821af90ccbc97eed2b8a65108f41787ba22881a4a8b77b3feeee09dbac55b670dc5590f3b8b1a71a73
data/.gitignore CHANGED
@@ -7,3 +7,5 @@
7
7
  /pkg/
8
8
  /spec/reports/
9
9
  /tmp/
10
+ *.png
11
+ *.gem
@@ -0,0 +1,15 @@
1
+ AllCops:
2
+ Exclude:
3
+ - "*.gemspec"
4
+
5
+ Style/Documentation:
6
+ Enabled: false
7
+
8
+ Style/StringLiterals:
9
+ EnforcedStyle: double_quotes
10
+
11
+ Style/StructInheritance:
12
+ Enabled: false
13
+
14
+ Metrics/LineLength:
15
+ Max: 100
@@ -1,13 +1,5 @@
1
1
  # Contributor Code of Conduct
2
2
 
3
- As contributors and maintainers of this project, we pledge to respect all people who contribute through reporting issues, posting feature requests, updating documentation, submitting pull requests or patches, and other activities.
3
+ This project adheres to No Code of Conduct. We are all adults. We accept anyone's contributions. Nothing else matters.
4
4
 
5
- We are committed to making participation in this project a harassment-free experience for everyone, regardless of level of experience, gender, gender identity and expression, sexual orientation, disability, personal appearance, body size, race, ethnicity, age, or religion.
6
-
7
- Examples of unacceptable behavior by participants include the use of sexual language or imagery, derogatory comments or personal attacks, trolling, public or private harassment, insults, or other unprofessional conduct.
8
-
9
- Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct. Project maintainers who do not follow the Code of Conduct may be removed from the project team.
10
-
11
- Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by opening an issue or contacting one or more of the project maintainers.
12
-
13
- This Code of Conduct is adapted from the [Contributor Covenant](http://contributor-covenant.org), version 1.0.0, available at [http://contributor-covenant.org/version/1/0/0/](http://contributor-covenant.org/version/1/0/0/)
5
+ For more information please visit the [No Code of Conduct](https://github.com/domgetter/NCoC) homepage.
data/Gemfile CHANGED
@@ -1,4 +1,4 @@
1
- source 'https://rubygems.org'
1
+ source "https://rubygems.org"
2
2
 
3
3
  # Specify your gem's dependencies in drophunter.gemspec
4
4
  gemspec
data/README.md CHANGED
@@ -22,7 +22,10 @@ Or install it yourself as:
22
22
 
23
23
  ## Usage
24
24
 
25
- just type `drophunter` in your console
25
+ Type of the following commands in your console:
26
+
27
+ `drophunter` will try all possible IDs (i.e. aaaa, aaab, aaac and so on)
28
+ `drophunter random` will try IDs in random order
26
29
 
27
30
  ## Development
28
31
 
data/Rakefile CHANGED
@@ -3,4 +3,4 @@ require "rspec/core/rake_task"
3
3
 
4
4
  RSpec::Core::RakeTask.new(:spec)
5
5
 
6
- task :default => :spec
6
+ task default: :spec
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- require 'drophunter'
3
+ require "drophunter/worker"
4
4
 
5
- Drophunter::Hunter.run
5
+ Drophunter::Worker.new(ARGV[0]).run
@@ -1,10 +1,11 @@
1
1
  # coding: utf-8
2
- lib = File.expand_path('../lib', __FILE__)
2
+ lib = File.expand_path("../lib", __FILE__)
3
3
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
- require 'drophunter/version'
4
+ require "drophunter/version"
5
5
 
6
6
  Gem::Specification.new do |spec|
7
7
  spec.name = "drophunter"
8
+ spec.description = "Drophunter is a tool which downloads every public image it can find on https://droplr.com."
8
9
  spec.version = Drophunter::VERSION
9
10
  spec.authors = ["Airat Shigapov"]
10
11
  spec.email = ["contact@airatshigapov.com"]
@@ -17,8 +18,9 @@ Gem::Specification.new do |spec|
17
18
  spec.executables = ["drophunter"]
18
19
  spec.require_paths = ["lib"]
19
20
 
20
- spec.add_dependency "nokogiri"
21
+ spec.add_dependency "nokogiri", "~> 1.6"
21
22
  spec.add_development_dependency "bundler", "~> 1.10"
22
23
  spec.add_development_dependency "rake", "~> 10.0"
23
- spec.add_development_dependency "rspec"
24
+ spec.add_development_dependency "rspec", "~> 3.3"
25
+ spec.add_development_dependency "rubocop", "~> 0.31"
24
26
  end
@@ -3,4 +3,4 @@ require "drophunter/version"
3
3
  module Drophunter
4
4
  end
5
5
 
6
- require "drophunter/hunter"
6
+ require "drophunter/runner"
@@ -0,0 +1,23 @@
1
+ module Drophunter
2
+ module FileTypes
3
+ class Image < Struct.new(:content, :id)
4
+ def find_and_save
5
+ if image_element
6
+ puts "#{id} is OK"
7
+
8
+ open("#{id}.png", "wb") do |file|
9
+ file << open(image_element.attr("src")).read
10
+ end
11
+ else
12
+ puts "#{id} is not a Droplr image"
13
+ end
14
+ end
15
+
16
+ private
17
+
18
+ def image_element
19
+ @image_element ||= content.at_css("body.image-drop .image img")
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,31 @@
1
+ module Drophunter
2
+ class Page < Struct.new(:id)
3
+ BASE_URL = "http://d.pr/i/"
4
+
5
+ def save(something)
6
+ puts "Downloading #{url}"
7
+
8
+ begin
9
+ something.new(Nokogiri::HTML(open(url)), id).find_and_save
10
+ rescue *error_messages.keys => error
11
+ puts error_messages[error.class]
12
+ end
13
+ end
14
+
15
+ private
16
+
17
+ def error_messages
18
+ {
19
+ OpenURI::HTTPError => "#{id} doesn't exist on Droplr",
20
+ RuntimeError => "#{id} caused an error (redirect?)",
21
+ SocketError => "#{id} caused an error (redirect with missing page?)",
22
+ Errno::ECONNRESET => "#{id} caused an error (and I have no idea why)",
23
+ Errno::ETIMEDOUT => "#{id} caused an error (timed out)"
24
+ }
25
+ end
26
+
27
+ def url
28
+ BASE_URL + id
29
+ end
30
+ end
31
+ end
@@ -1,3 +1,3 @@
1
1
  module Drophunter
2
- VERSION = "0.1.0"
2
+ VERSION = "0.2.0"
3
3
  end
@@ -0,0 +1,36 @@
1
+ require "open-uri"
2
+ require "nokogiri"
3
+ require "drophunter/page"
4
+ require "drophunter/file_types/image"
5
+
6
+ module Drophunter
7
+ class Worker < Struct.new(:strategy)
8
+ ALLOWED_CHARS = [*"a".."z", *"A".."Z"]
9
+
10
+ def run
11
+ send("#{strategy || :default}_strategy")
12
+ end
13
+
14
+ private
15
+
16
+ def save_file(id)
17
+ Drophunter::Page.new(id).save(Drophunter::FileTypes::Image)
18
+ end
19
+
20
+ def default_strategy
21
+ ALLOWED_CHARS.repeated_permutation(4).each do |id_as_array|
22
+ save_file(id_as_array.join)
23
+ end
24
+ end
25
+
26
+ def random_strategy
27
+ Enumerator.new do |enumerator|
28
+ loop do
29
+ enumerator.yield(4.times.map { ALLOWED_CHARS[Random.rand(0..ALLOWED_CHARS.length)] }.join)
30
+ end
31
+ end.each do |id|
32
+ save_file(id)
33
+ end
34
+ end
35
+ end
36
+ end
metadata CHANGED
@@ -1,29 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: drophunter
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Airat Shigapov
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-10-19 00:00:00.000000000 Z
11
+ date: 2015-12-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: nokogiri
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ">="
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '0'
19
+ version: '1.6'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ">="
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '0'
26
+ version: '1.6'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: bundler
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -56,17 +56,32 @@ dependencies:
56
56
  name: rspec
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - ">="
59
+ - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: '0'
61
+ version: '3.3'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - ">="
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '3.3'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rubocop
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '0.31'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
67
81
  - !ruby/object:Gem::Version
68
- version: '0'
69
- description:
82
+ version: '0.31'
83
+ description: Drophunter is a tool which downloads every public image it can find on
84
+ https://droplr.com.
70
85
  email:
71
86
  - contact@airatshigapov.com
72
87
  executables:
@@ -76,6 +91,7 @@ extra_rdoc_files: []
76
91
  files:
77
92
  - ".gitignore"
78
93
  - ".rspec"
94
+ - ".rubocop.yml"
79
95
  - ".travis.yml"
80
96
  - CODE_OF_CONDUCT.md
81
97
  - Gemfile
@@ -87,9 +103,10 @@ files:
87
103
  - bin/setup
88
104
  - drophunter.gemspec
89
105
  - lib/drophunter.rb
90
- - lib/drophunter/drop.rb
91
- - lib/drophunter/hunter.rb
106
+ - lib/drophunter/file_types/image.rb
107
+ - lib/drophunter/page.rb
92
108
  - lib/drophunter/version.rb
109
+ - lib/drophunter/worker.rb
93
110
  homepage: http://github.com/airatshigapov/drophunter
94
111
  licenses:
95
112
  - MIT
@@ -1,51 +0,0 @@
1
- require "nokogiri"
2
-
3
- module Drophunter
4
- class Drop < Struct.new(:id)
5
- BASE_URL = "http://d.pr/i/"
6
-
7
- def find
8
- url = BASE_URL + id
9
-
10
- puts "Downloading #{url}"
11
-
12
- begin
13
- page = Nokogiri::HTML(open(url))
14
- rescue OpenURI::HTTPError
15
- puts "#{id} doesn't exist on Droplr"
16
- return false
17
- rescue RuntimeError
18
- puts "#{id} caused an error (redirect?)"
19
- return false
20
- rescue SocketError
21
- puts "#{id} caused an error (redirect with missing page?)"
22
- return false
23
- rescue Errno::ECONNRESET
24
- puts "#{id} caused an error (and I have no idea why)"
25
- return false
26
- rescue Errno::ETIMEDOUT
27
- puts "#{id} caused an error (timed out)"
28
- return false
29
- end
30
-
31
- if page.at_css(".image img")
32
- puts "Something like image found for #{id}"
33
-
34
- if img = page.at_css("body.image-drop .image img")
35
- puts "#{id} is OK"
36
- image_url = img.attr("src")
37
- else
38
- puts "#{id} is not a Droplr image"
39
- return false
40
- end
41
- else
42
- puts "#{id} is not an image"
43
- return false
44
- end
45
-
46
- open("#{id}.png", "wb") do |file|
47
- file << open(image_url).read
48
- end
49
- end
50
- end
51
- end
@@ -1,14 +0,0 @@
1
- require 'open-uri'
2
- require "drophunter/drop"
3
-
4
- module Drophunter
5
- class Hunter
6
- ALLOWED_CHARS = [*'a'..'z', *'A'..'Z']
7
-
8
- def self.run
9
- ALLOWED_CHARS.repeated_permutation(4).each do |generated_droplr_id|
10
- Drop.new(generated_droplr_id.join).find
11
- end
12
- end
13
- end
14
- end