tors 0.4.0 → 0.5.0
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.
- checksums.yaml +4 -4
- data/.gitignore +3 -1
- data/README.md +11 -11
- data/lib/tors.rb +51 -41
- data/lib/tors/search.rb +25 -24
- data/lib/tors/version.rb +1 -1
- data/tors.gemspec +1 -0
- metadata +17 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3051833668a39d67c65e1aad241994436241c455
|
4
|
+
data.tar.gz: 8db8f95fe1308068e16d2a811b6daf2d25ba5283
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ecb00262740d37ea438b14ae6dffac0a41ecbb4c4ba6d4fee4326e3674d77685205e104c0f223c2b0a3cbc8dfca02fb5d7a1c8fbdc137ab193e9dae212a1d9ac
|
7
|
+
data.tar.gz: bdf8b6e022adbdaf29069d860d943b6664b4169c7d8c0c5b2033ac74a65c04e5e71de84302c64d3c7af7bf06d2a0fa25febe48f7550c6d2ef1441fd1ef08f0e7
|
data/.gitignore
CHANGED
data/README.md
CHANGED
@@ -43,17 +43,17 @@ Because katcr fastest provider for scrabing currently.
|
|
43
43
|
|
44
44
|
Yep, there is a few provider option.
|
45
45
|
|
46
|
-
| Provider | Status | Problems
|
47
|
-
|
48
|
-
| katcr | ✅ | -
|
46
|
+
| Provider | Status | Problems |
|
47
|
+
|:------------------|:------:|:----------------------------------|
|
48
|
+
| katcr | ✅ | - |
|
49
49
|
| rarbg | ✅ | Slow Connection, Threat defensing |
|
50
|
-
| thepiratebay | ✅ | Only Magnet
|
51
|
-
| extratorrent | ✅ | Slow Connection
|
52
|
-
| 1337x | ✅ | Connection N+1
|
53
|
-
| zooqle | ✅ | Skipping some torrents
|
54
|
-
| zamunda | ✅ | Require authentication
|
55
|
-
| torrentfunk | ☑️
|
56
|
-
| limetorrents | ☑️
|
50
|
+
| thepiratebay | ✅ | Only Magnet |
|
51
|
+
| extratorrent | ✅ | Slow Connection |
|
52
|
+
| 1337x | ✅ | Connection N+1 |
|
53
|
+
| zooqle | ✅ | Skipping some torrents |
|
54
|
+
| zamunda | ✅ | Require authentication |
|
55
|
+
| torrentfunk | ☑️ | 🙈 |
|
56
|
+
| limetorrents | ☑️ | 🙈 |
|
57
57
|
|
58
58
|
Use `-p PROVIDER` flag for scrape another providers.
|
59
59
|
|
@@ -67,7 +67,7 @@ You can use `-a` or `--auto-download` flag for automatically download the best t
|
|
67
67
|
|
68
68
|
You can use `-d TARGET` flag for set destination storage path. Example:
|
69
69
|
|
70
|
-
$ tors -s '
|
70
|
+
$ tors -s 'ubuntu' -d $HOME/Downloads -a
|
71
71
|
|
72
72
|
And you can list all active providers and usage instructions with `-h` or `--help` flag.
|
73
73
|
|
data/lib/tors.rb
CHANGED
@@ -1,59 +1,69 @@
|
|
1
1
|
require 'tors/version'
|
2
2
|
require 'tors/search'
|
3
|
-
require '
|
4
|
-
require 'optparse'
|
3
|
+
require 'slop'
|
5
4
|
|
5
|
+
# Main module for passing options and initializing TorS::Search class
|
6
6
|
module TorS
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
opts.on('-d=d', '--directory=d', 'Destination path for downloaded torrent [DIRECTORY]') do |d|
|
17
|
-
options[:directory] = d
|
18
|
-
end
|
19
|
-
opts.on('-p=p', '--provider=p', 'Provider name [PROVIDER]') do |p|
|
20
|
-
options[:provider] = p
|
21
|
-
end
|
22
|
-
opts.on('-u=u', '--username=u', 'Username for authentication') do |u|
|
23
|
-
options[:username] = u
|
24
|
-
end
|
25
|
-
opts.on('-w=p', '--password=p', 'Password for authentication') do |p|
|
26
|
-
options[:password] = p
|
27
|
-
end
|
28
|
-
opts.on('-l', '--list-providers', 'List providers') do |_l|
|
7
|
+
REQUIRE_AUTH = %w[zamunda].freeze
|
8
|
+
|
9
|
+
opts = Slop.parse do |o|
|
10
|
+
o.banner = 'usage: tors [options] SEARCH_STRING'
|
11
|
+
o.string '-d', '--directory', 'Destination path for downloaded torrent', default: Dir.pwd
|
12
|
+
o.string '-p', '--provider', 'Provider name', default: 'katcr'
|
13
|
+
o.string '-u', '--username', 'Username for authentication'
|
14
|
+
o.string '-w', '--password', 'Password for authentication'
|
15
|
+
o.on '-l', '--list-providers', 'List available providers' do
|
29
16
|
puts '- 1337x'
|
30
17
|
puts '- extratorrent'
|
31
18
|
puts '- katcr'
|
32
19
|
puts '- rarbg'
|
33
20
|
puts '- thepiratebay'
|
34
|
-
puts '- zamunda'
|
21
|
+
puts '- zamunda (requires authentication)'
|
35
22
|
puts '- zooqle'
|
36
|
-
|
37
|
-
end
|
38
|
-
opts.on('-a', '--auto-download', 'Auto download best choice') do
|
39
|
-
options[:auto] = true
|
23
|
+
exit
|
40
24
|
end
|
41
25
|
|
26
|
+
o.bool '-a', '--auto-download', 'Auto download best choice', default: false
|
27
|
+
|
42
28
|
if RUBY_PLATFORM =~ /darwin/
|
43
|
-
|
44
|
-
|
45
|
-
|
29
|
+
o.bool '-o', '--open', 'Open torrent after downloading', default: false
|
30
|
+
end
|
31
|
+
|
32
|
+
o.on '-h', '--help', 'Print help' do
|
33
|
+
puts o
|
34
|
+
exit
|
46
35
|
end
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
36
|
+
|
37
|
+
o.on '-v', '--version', 'Print version' do
|
38
|
+
puts VERSION
|
39
|
+
exit
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
if opts.arguments.empty?
|
44
|
+
puts opts
|
45
|
+
exit
|
46
|
+
end
|
47
|
+
|
48
|
+
if REQUIRE_AUTH.include?(opts['provider'])
|
49
|
+
if opts['username'].nil? || opts['password'].nil?
|
50
|
+
puts "ERROR! Provider #{opts['provider']} requires username and password for authentication".red
|
51
|
+
abort
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
tors = TorS::Search.new(opts.arguments[0]) do |ts|
|
56
|
+
ts.username = opts['username']
|
57
|
+
ts.password = opts['password']
|
58
|
+
ts.from = opts['provider']
|
59
|
+
ts.auto_download = opts.auto_download?
|
60
|
+
ts.directory = opts['directory']
|
61
|
+
|
62
|
+
# We only have this option in Darwin platform and slop throws an exception
|
63
|
+
# for non-defined parameters. That's the reason to check the platform here
|
64
|
+
ts.open_torrent = RUBY_PLATFORM =~ /darwin/ ? opts.open? : false
|
56
65
|
end
|
57
66
|
|
58
67
|
tors.run
|
68
|
+
|
59
69
|
end
|
data/lib/tors/search.rb
CHANGED
@@ -5,13 +5,21 @@ require 'mechanize'
|
|
5
5
|
require 'open-uri'
|
6
6
|
require 'tty-table'
|
7
7
|
require 'tty-prompt'
|
8
|
+
require 'colorize'
|
8
9
|
|
9
10
|
module TorS
|
10
11
|
class Search
|
11
|
-
attr_accessor :
|
12
|
+
attr_accessor :from, :username, :password, :directory, :auto_download, :open_torrent
|
12
13
|
|
13
|
-
|
14
|
-
|
14
|
+
# Initialize class. Only query string is required and the rest of the attributes
|
15
|
+
# are assigned default values.
|
16
|
+
def initialize(query)
|
17
|
+
raise "#{self.class} requires block to initialize" unless block_given?
|
18
|
+
yield self
|
19
|
+
|
20
|
+
@query = query
|
21
|
+
@from ||= 'katcr'
|
22
|
+
@directory ||= Dir.pwd
|
15
23
|
|
16
24
|
yaml = File.expand_path("../../../providers/#{from}.yml", __FILE__)
|
17
25
|
if File.exist? yaml
|
@@ -19,12 +27,6 @@ module TorS
|
|
19
27
|
else
|
20
28
|
list_providers_and_exit
|
21
29
|
end
|
22
|
-
|
23
|
-
if block_given?
|
24
|
-
yield self
|
25
|
-
else
|
26
|
-
raise "#{self.class} requires block to initialize"
|
27
|
-
end
|
28
30
|
end
|
29
31
|
|
30
32
|
def run
|
@@ -36,16 +38,14 @@ module TorS
|
|
36
38
|
@url = URI.encode(@provider['url'].gsub(/%{(\w+)}/, @query ? @query : ''))
|
37
39
|
@page = Nokogiri::HTML(open(@url))
|
38
40
|
|
39
|
-
if @provider['authenticate']
|
40
|
-
authenticate
|
41
|
-
end
|
41
|
+
authenticate if @provider['authenticate']
|
42
42
|
|
43
43
|
if @page.css(@provider['scrape']['selector']).empty?
|
44
44
|
if threat_defence @page
|
45
|
-
puts "
|
45
|
+
puts "Sorry, I think you are banned from #{@from}. There is a threat defense redirection.".red
|
46
46
|
end
|
47
47
|
|
48
|
-
puts
|
48
|
+
puts "Cannot parse the page (#{@url})".red
|
49
49
|
return
|
50
50
|
end
|
51
51
|
|
@@ -98,7 +98,7 @@ module TorS
|
|
98
98
|
table = TTY::Table.new %i[# Category Title Size Seed Leech], @rows
|
99
99
|
puts table.render(:unicode, padding: [0, 1, 0, 1])
|
100
100
|
|
101
|
-
if @
|
101
|
+
if @auto_download
|
102
102
|
download @downloads.find { |v| v[:key] == 1 }
|
103
103
|
else
|
104
104
|
prompt
|
@@ -119,7 +119,7 @@ module TorS
|
|
119
119
|
|
120
120
|
def download(choice)
|
121
121
|
if choice[:url] =~ /^magnet:\?/
|
122
|
-
puts '
|
122
|
+
puts 'Sorry! I cannot download magnet links. Please copy/paste the following link into your torrent client'.red
|
123
123
|
puts choice[:url]
|
124
124
|
else
|
125
125
|
begin
|
@@ -139,9 +139,9 @@ module TorS
|
|
139
139
|
# FIXME: what about HTTP errors? Net::HTTP throws a number of
|
140
140
|
# exceptions. It would be wise to use another HTTP library for this
|
141
141
|
# purpose
|
142
|
-
puts '
|
142
|
+
puts 'There is an error! ' + e.message
|
143
143
|
else
|
144
|
-
puts '
|
144
|
+
puts '✔ Downloaded!'.green
|
145
145
|
|
146
146
|
# Open torrent option is only present in Darwin platform so there is
|
147
147
|
# no need to check the platform here
|
@@ -169,8 +169,8 @@ module TorS
|
|
169
169
|
puts 'Login failed with your credentials!'.red
|
170
170
|
abort
|
171
171
|
end
|
172
|
-
|
173
|
-
puts '✔ Authentication
|
172
|
+
|
173
|
+
puts '✔ Authentication successful'.green
|
174
174
|
end
|
175
175
|
|
176
176
|
def threat_defence(page)
|
@@ -181,7 +181,7 @@ module TorS
|
|
181
181
|
private
|
182
182
|
|
183
183
|
def list_providers_and_exit
|
184
|
-
puts "
|
184
|
+
puts "Provider '#{@from}' does not exist.".red
|
185
185
|
puts "Please choose a valid provider from the following list:\n\n"
|
186
186
|
|
187
187
|
Dir[File.expand_path('providers/*.yml')].each do |f|
|
@@ -193,10 +193,11 @@ module TorS
|
|
193
193
|
|
194
194
|
def check_download_directory
|
195
195
|
ioerr = false
|
196
|
-
ioerr = "
|
197
|
-
ioerr = "
|
196
|
+
ioerr = "Directory #{@directory} not found." unless File.exist?(@directory) || File.directory?(@directory)
|
197
|
+
ioerr = "Directory #{@directory} not writable." unless File.writable? @directory
|
198
|
+
|
198
199
|
if ioerr
|
199
|
-
puts ioerr
|
200
|
+
puts ioerr.red
|
200
201
|
abort 'Exiting'
|
201
202
|
end
|
202
203
|
end
|
data/lib/tors/version.rb
CHANGED
data/tors.gemspec
CHANGED
@@ -28,6 +28,7 @@ Gem::Specification.new do |spec|
|
|
28
28
|
spec.add_dependency 'colorize', '~> 0.8.1'
|
29
29
|
spec.add_dependency 'tty-table', '~> 0.8.0'
|
30
30
|
spec.add_dependency 'tty-prompt', '~> 0.13.1'
|
31
|
+
spec.add_dependency 'slop', '~> 4.5.0'
|
31
32
|
|
32
33
|
spec.add_development_dependency 'bundler', '~> 1.15'
|
33
34
|
spec.add_development_dependency 'rake', '~> 10.0'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tors
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Murat Bastas
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-09-
|
11
|
+
date: 2017-09-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: nokogiri
|
@@ -86,6 +86,20 @@ dependencies:
|
|
86
86
|
- - "~>"
|
87
87
|
- !ruby/object:Gem::Version
|
88
88
|
version: 0.13.1
|
89
|
+
- !ruby/object:Gem::Dependency
|
90
|
+
name: slop
|
91
|
+
requirement: !ruby/object:Gem::Requirement
|
92
|
+
requirements:
|
93
|
+
- - "~>"
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
version: 4.5.0
|
96
|
+
type: :runtime
|
97
|
+
prerelease: false
|
98
|
+
version_requirements: !ruby/object:Gem::Requirement
|
99
|
+
requirements:
|
100
|
+
- - "~>"
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: 4.5.0
|
89
103
|
- !ruby/object:Gem::Dependency
|
90
104
|
name: bundler
|
91
105
|
requirement: !ruby/object:Gem::Requirement
|
@@ -179,7 +193,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
179
193
|
version: '0'
|
180
194
|
requirements: []
|
181
195
|
rubyforge_project:
|
182
|
-
rubygems_version: 2.6.
|
196
|
+
rubygems_version: 2.6.8
|
183
197
|
signing_key:
|
184
198
|
specification_version: 4
|
185
199
|
summary: Yet another torrent searching application for your command line.
|