xunlei 0.0.8 → 0.0.9
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/README.md +3 -1
- data/bin/xunlei +26 -173
- data/lib/xunlei/configurator.rb +34 -0
- data/lib/xunlei/helpers/cli_helper.rb +121 -0
- data/lib/xunlei/version.rb +1 -1
- data/spec/spec_helper.rb +1 -1
- data/spec/xunlei/helpers/cli_helper_spec.rb +56 -0
- metadata +20 -19
- data/Guardfile +0 -5
- data/spec/xunlei/search_spec.rb +0 -16
data/README.md
CHANGED
@@ -13,6 +13,8 @@ so please make sure you have Google Chrome installed first.
|
|
13
13
|
It can automatically dump task file names and urls as well as browser cookies,
|
14
14
|
so that it can delegate to wget to download files for you.
|
15
15
|
|
16
|
+
Compatible with Ruby version 1.8.7 and 1.9+
|
17
|
+
|
16
18
|
WARNING:
|
17
19
|
it stores your USERNAME and PASSWORD for
|
18
20
|
lixian.vip.xunlei.com as PLAINTEXT at ~/.xunlei/credentials.yml
|
@@ -47,7 +49,7 @@ Add ed2k or magnet link as new task
|
|
47
49
|
Add all ed2k or magnet links on given web page as new tasks
|
48
50
|
|
49
51
|
xunlei add_page http://page_with_a_chunk_load_of_links/
|
50
|
-
|
52
|
+
|
51
53
|
Google for ed2k and magnet links
|
52
54
|
|
53
55
|
xunlei google Repulsion --with 720p
|
data/bin/xunlei
CHANGED
@@ -1,33 +1,18 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
3
|
require "xunlei"
|
4
|
-
# require File.expand_path("lib/xunlei/version.rb")
|
5
|
-
# require File.expand_path("lib/xunlei/engine.rb")
|
6
|
-
# require File.expand_path("lib/xunlei/search.rb")
|
7
|
-
require "yaml"
|
8
4
|
require "commander/import"
|
9
5
|
|
6
|
+
require "xunlei/helpers/cli_helper"
|
7
|
+
include Xunlei::Helper::CLIHelper
|
8
|
+
|
10
9
|
program :name, "Xunlei"
|
11
10
|
program :version, Xunlei::VERSION
|
12
11
|
program :description, "lixian.vip.xunlei.com utility script"
|
13
12
|
|
14
|
-
def filter_files(options = nil)
|
15
|
-
files = []
|
16
|
-
YAML.load_file(xunlei_tasks_path).each do |file|
|
17
|
-
if !options.only.nil?
|
18
|
-
files << file if file[:name] =~ /#{options.only}/i
|
19
|
-
elsif !options.except.nil?
|
20
|
-
files << file unless file[:name] =~ /#{options.except}/i
|
21
|
-
else
|
22
|
-
files << file
|
23
|
-
end
|
24
|
-
end
|
25
|
-
files
|
26
|
-
end
|
27
|
-
|
28
13
|
def execute_dump_action(args, options)
|
29
14
|
options.default :driver => "chrome"
|
30
|
-
|
15
|
+
|
31
16
|
check_for_config_files
|
32
17
|
check_for_chromedriver
|
33
18
|
credentials = YAML.load_file(xunlei_credential_file_path)
|
@@ -51,158 +36,28 @@ def do_dump_cookies(c, &block)
|
|
51
36
|
end
|
52
37
|
end
|
53
38
|
|
54
|
-
def all_downloaded_tasks
|
55
|
-
system("touch #{xunlei_downloaded_tasks_path}")
|
56
|
-
|
57
|
-
YAML.load_file(xunlei_downloaded_tasks_path) || []
|
58
|
-
end
|
59
|
-
|
60
|
-
def xunlei_cookies_path
|
61
|
-
File.join(xunlei_folder_path, "cookies.txt")
|
62
|
-
end
|
63
|
-
|
64
|
-
def xunlei_tasks_path
|
65
|
-
File.join(xunlei_folder_path, "all_tasks.yml")
|
66
|
-
end
|
67
|
-
|
68
|
-
def xunlei_credential_file_path
|
69
|
-
File.join(xunlei_folder_path, "credentials.yml")
|
70
|
-
end
|
71
|
-
|
72
|
-
def xunlei_downloaded_tasks_path
|
73
|
-
File.join(xunlei_folder_path, "downloaded.yml")
|
74
|
-
end
|
75
|
-
|
76
|
-
def xunlei_folder_name
|
77
|
-
"~/.xunlei"
|
78
|
-
end
|
79
|
-
|
80
|
-
def xunlei_folder_path
|
81
|
-
File.expand_path(xunlei_folder_name)
|
82
|
-
end
|
83
|
-
|
84
|
-
def xunlei_folder_exists?
|
85
|
-
Dir.exists?(xunlei_folder_path)
|
86
|
-
end
|
87
|
-
|
88
|
-
def credential_file_exists?
|
89
|
-
File.exists?(xunlei_credential_file_path)
|
90
|
-
end
|
91
|
-
|
92
|
-
def create_xunlei_folder
|
93
|
-
Dir.mkdir(xunlei_folder_path)
|
94
|
-
end
|
95
|
-
|
96
|
-
def ask_for_credentials
|
97
|
-
puts "#{xunlei_credential_file_path} not exists. Now creating one."
|
98
|
-
puts "*** WARNING: your USERNAME and PASSWORD will be stored as PLAINTEXT at #{xunlei_credential_file_path} ***"
|
99
|
-
|
100
|
-
username = ask("Username: ")
|
101
|
-
password = ask("Password: ") { |q| q.echo = "*" }
|
102
|
-
File.open(xunlei_credential_file_path, "w") do |file|
|
103
|
-
file.write({ :username => username, :password => password }.to_yaml)
|
104
|
-
end
|
105
|
-
|
106
|
-
puts "#{xunlei_credential_file_path} successfully created."
|
107
|
-
end
|
108
|
-
|
109
|
-
def check_for_credentials
|
110
|
-
ask_for_credentials unless credential_file_exists?
|
111
|
-
end
|
112
|
-
|
113
|
-
def chromedriver_zip_name
|
114
|
-
"chromedriver_mac.zip"
|
115
|
-
end
|
116
|
-
|
117
|
-
def check_for_chromedriver
|
118
|
-
unless system("which chromedriver > /dev/null 2>&1")
|
119
|
-
puts "chromedriver not found in your PATH"
|
120
|
-
if agree("Would you like me to try download it for you? (yes or no)")
|
121
|
-
if system("wget 'http://chromium.googlecode.com/files/chromedriver_mac_16.0.902.0.zip' -O #{chromedriver_zip_name}")
|
122
|
-
if system("unzip #{chromedriver_zip_name}")
|
123
|
-
puts "moving chromedriver to /usr/local/bin ..."
|
124
|
-
system("mv -v chromedriver /usr/local/bin")
|
125
|
-
|
126
|
-
puts "deleting temporary files..."
|
127
|
-
system("rm -v #{chromedriver_zip_name}")
|
128
|
-
else
|
129
|
-
puts "`unzip` not found in your PATH. Try manually unzip #{chromedriver_zip_name} and move it to /usr/local/bin"
|
130
|
-
exit
|
131
|
-
end
|
132
|
-
end
|
133
|
-
else
|
134
|
-
puts "OK. You can download it manually here: http://code.google.com/p/chromium/downloads"
|
135
|
-
exit
|
136
|
-
end
|
137
|
-
end
|
138
|
-
end
|
139
|
-
|
140
|
-
def check_for_config_files
|
141
|
-
create_xunlei_folder unless xunlei_folder_exists?
|
142
|
-
check_for_credentials
|
143
|
-
end
|
144
|
-
|
145
|
-
def move_to_downloaded_file(task)
|
146
|
-
puts "#{task[:name]} successfully downloaded."
|
147
|
-
|
148
|
-
downloaded = all_downloaded_tasks
|
149
|
-
downloaded << task[:name]
|
150
|
-
File.open(xunlei_downloaded_tasks_path, "w") do |file|
|
151
|
-
file.write(downloaded.to_yaml)
|
152
|
-
end
|
153
|
-
|
154
|
-
all_tasks = YAML.load_file(xunlei_tasks_path)
|
155
|
-
all_tasks.delete(task)
|
156
|
-
File.open(xunlei_tasks_path, "w") do |file|
|
157
|
-
file.write(all_tasks.to_yaml)
|
158
|
-
end
|
159
|
-
end
|
160
|
-
|
161
|
-
def total_size(file_sizes)
|
162
|
-
total_megabytes = 0
|
163
|
-
|
164
|
-
file_sizes.each do |file_size|
|
165
|
-
if file_size =~ /G/
|
166
|
-
total_megabytes += 1000 * file_size.to_f
|
167
|
-
else
|
168
|
-
total_megabytes += file_size.to_f
|
169
|
-
end
|
170
|
-
end
|
171
|
-
|
172
|
-
total_megabytes
|
173
|
-
end
|
174
|
-
|
175
|
-
def show_files(files)
|
176
|
-
files.each do |file|
|
177
|
-
puts "#{file[:size]}\t#{file[:name]}"
|
178
|
-
end
|
179
|
-
|
180
|
-
puts
|
181
|
-
puts "Total: #{files.size} files, #{total_size(files.map { |file| file[:size] })} MB (estimated)"
|
182
|
-
end
|
183
|
-
|
184
39
|
command :dump_tasks do |c|
|
185
40
|
c.syntax= "dump_tasks"
|
186
41
|
c.description = "dump all files to #{xunlei_tasks_path}"
|
187
|
-
|
42
|
+
|
188
43
|
do_dump_cookies(c) do |engine, args|
|
189
44
|
tasks = engine.dump_tasks
|
190
|
-
|
45
|
+
|
191
46
|
current_downloaded_tasks = all_downloaded_tasks & tasks.map { |task| task[:name] }
|
192
47
|
tasks.reject! { |task| current_downloaded_tasks.include?(task[:name]) }
|
193
|
-
|
48
|
+
|
194
49
|
File.open(xunlei_tasks_path, "w") do |file|
|
195
50
|
file.write(tasks.to_yaml)
|
196
51
|
end
|
197
|
-
|
52
|
+
|
198
53
|
puts "Successfully dumped following tasks:"
|
199
54
|
puts
|
200
55
|
show_files(tasks)
|
201
|
-
|
56
|
+
|
202
57
|
puts
|
203
|
-
|
58
|
+
|
204
59
|
unless current_downloaded_tasks.empty?
|
205
|
-
puts "
|
60
|
+
puts "#{current_downloaded_tasks.count} finished downloads: (you should delete them on website)"
|
206
61
|
puts
|
207
62
|
current_downloaded_tasks.each do |task_name|
|
208
63
|
puts task_name
|
@@ -214,7 +69,7 @@ end
|
|
214
69
|
command :add do |c|
|
215
70
|
c.syntax= "add KEYWORD"
|
216
71
|
c.description = "add new task(s)."
|
217
|
-
|
72
|
+
|
218
73
|
do_dump_cookies(c) do |engine, args|
|
219
74
|
engine.add_task(args.first)
|
220
75
|
end
|
@@ -223,7 +78,7 @@ end
|
|
223
78
|
command :dump_cookies do |c|
|
224
79
|
c.syntax = "dump_cookies"
|
225
80
|
c.description = "dump cookies to #{xunlei_cookies_path}"
|
226
|
-
|
81
|
+
|
227
82
|
do_dump_cookies(c)
|
228
83
|
end
|
229
84
|
|
@@ -233,30 +88,28 @@ command :download do |c|
|
|
233
88
|
c.option "--only PATTERN", String, "only download files which names include PATTERN"
|
234
89
|
c.option "--except PATTERN", String, "do not download files which names include PATTERN"
|
235
90
|
c.option "--reverse", "download files in reverse order"
|
236
|
-
|
91
|
+
|
237
92
|
c.action do |args, options|
|
238
93
|
options.default :only => nil, :except => nil
|
239
|
-
|
240
|
-
files = filter_files(options)
|
241
|
-
|
94
|
+
|
95
|
+
files = filter_files(YAML.load_file(xunlei_tasks_path), options)
|
96
|
+
|
242
97
|
files.reverse! if options.reverse
|
243
|
-
|
98
|
+
|
244
99
|
if files.empty?
|
245
100
|
puts "Nothing to do."
|
246
101
|
else
|
247
102
|
puts "\nAbout to download following files:"
|
248
103
|
puts
|
249
|
-
files
|
250
|
-
|
251
|
-
end
|
252
|
-
|
104
|
+
show_files(files)
|
105
|
+
|
253
106
|
if agree("\nConfirm? (yes or no)")
|
254
107
|
files.each do |file|
|
255
108
|
cmd = "wget --load-cookies=#{xunlei_cookies_path} '#{file[:url]}' -c -O \"#{file[:name]}\""
|
256
109
|
if system(cmd)
|
257
|
-
|
110
|
+
mark_as_downloaded(file)
|
258
111
|
else
|
259
|
-
|
112
|
+
raise "Download failed"
|
260
113
|
end
|
261
114
|
end
|
262
115
|
end
|
@@ -267,12 +120,12 @@ end
|
|
267
120
|
command :show do |c|
|
268
121
|
c.syntax = "show"
|
269
122
|
c.description = "show files in #{xunlei_tasks_path}"
|
270
|
-
|
123
|
+
|
271
124
|
c.action do |args, options|
|
272
125
|
options.default :only => nil, :except => nil
|
273
126
|
puts "You have following files in your #{xunlei_tasks_path}:"
|
274
127
|
puts
|
275
|
-
files = filter_files(options)
|
128
|
+
files = filter_files(YAML.load_file(xunlei_tasks_path), options)
|
276
129
|
show_files(files)
|
277
130
|
end
|
278
131
|
end
|
@@ -327,7 +180,7 @@ command :lucky do |c|
|
|
327
180
|
links = search.google_simplecd(args, options)
|
328
181
|
puts
|
329
182
|
puts "#{links.count} links found."
|
330
|
-
|
183
|
+
|
331
184
|
execute_dump_action(args, options) do |engine, args|
|
332
185
|
links.each do |link|
|
333
186
|
engine.add_task(link)
|
@@ -349,7 +202,7 @@ command :add_page do |c|
|
|
349
202
|
links = search.add_page(args.first, options)
|
350
203
|
puts
|
351
204
|
puts "#{links.count} links found."
|
352
|
-
|
205
|
+
|
353
206
|
execute_dump_action(args, options) do |engine, args|
|
354
207
|
links.each do |link|
|
355
208
|
engine.add_task(link)
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module Xunlei
|
2
|
+
module Configurator
|
3
|
+
|
4
|
+
def xunlei_folder_name
|
5
|
+
"~/.xunlei"
|
6
|
+
end
|
7
|
+
|
8
|
+
def xunlei_folder_path
|
9
|
+
File.expand_path(xunlei_folder_name)
|
10
|
+
end
|
11
|
+
|
12
|
+
def xunlei_cookies_path
|
13
|
+
File.join(xunlei_folder_path, "cookies.txt")
|
14
|
+
end
|
15
|
+
|
16
|
+
def xunlei_tasks_path
|
17
|
+
File.join(xunlei_folder_path, "all_tasks.yml")
|
18
|
+
end
|
19
|
+
|
20
|
+
def xunlei_credential_file_path
|
21
|
+
File.join(xunlei_folder_path, "credentials.yml")
|
22
|
+
end
|
23
|
+
|
24
|
+
def xunlei_downloaded_tasks_path
|
25
|
+
File.join(xunlei_folder_path, "downloaded.yml")
|
26
|
+
end
|
27
|
+
|
28
|
+
def chromedriver_zip_name
|
29
|
+
"chromedriver_mac.zip"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
Config = Configurator
|
34
|
+
end
|
@@ -0,0 +1,121 @@
|
|
1
|
+
require "yaml"
|
2
|
+
|
3
|
+
module Xunlei
|
4
|
+
module Helper
|
5
|
+
module CLIHelper
|
6
|
+
require "xunlei/configurator"
|
7
|
+
include ::Xunlei::Config
|
8
|
+
|
9
|
+
def filtered?(file, options)
|
10
|
+
return false unless options
|
11
|
+
return true if !options.only.nil? and !(file[:name] =~ /#{options.only}/i)
|
12
|
+
return true if !options.except.nil? and file[:name] =~ /#{options.except}/i
|
13
|
+
false
|
14
|
+
end
|
15
|
+
|
16
|
+
def filter_files(files, options=nil)
|
17
|
+
files.select{ |file| !filtered?(file, options) }.inject([], :<<)
|
18
|
+
end
|
19
|
+
|
20
|
+
def total_size(file_sizes)
|
21
|
+
file_sizes.inject(0) do |total_megabytes, file_size|
|
22
|
+
if file_size =~ /G/i
|
23
|
+
total_megabytes + 1000 * file_size.to_f
|
24
|
+
elsif file_size =~ /M/i
|
25
|
+
total_megabytes + file_size.to_f
|
26
|
+
else
|
27
|
+
total_megabytes + 1
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def show_files(files)
|
33
|
+
files.each do |file|
|
34
|
+
puts "#{file[:size]}\t#{file[:name]}"
|
35
|
+
end
|
36
|
+
|
37
|
+
puts
|
38
|
+
puts "Total: #{files.size} files, #{total_size(files.map { |file| file[:size] })} MB (estimated)"
|
39
|
+
end
|
40
|
+
|
41
|
+
def mark_as_downloaded(task)
|
42
|
+
puts "#{task[:name]} successfully downloaded."
|
43
|
+
|
44
|
+
downloaded = all_downloaded_tasks
|
45
|
+
downloaded << task[:name]
|
46
|
+
File.open(xunlei_downloaded_tasks_path, "w") do |file|
|
47
|
+
file.write(downloaded.to_yaml)
|
48
|
+
end
|
49
|
+
|
50
|
+
all_tasks = YAML.load_file(xunlei_tasks_path)
|
51
|
+
all_tasks.delete(task)
|
52
|
+
File.open(xunlei_tasks_path, "w") do |file|
|
53
|
+
file.write(all_tasks.to_yaml)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def all_downloaded_tasks
|
58
|
+
system("touch #{xunlei_downloaded_tasks_path}") # touch it in case it's non-existent
|
59
|
+
|
60
|
+
YAML.load_file(xunlei_downloaded_tasks_path) || []
|
61
|
+
end
|
62
|
+
|
63
|
+
def ask_for_credentials
|
64
|
+
puts "#{xunlei_credential_file_path} not exists. Now creating one."
|
65
|
+
puts "*** WARNING: your USERNAME and PASSWORD will be stored as PLAINTEXT at #{xunlei_credential_file_path} ***"
|
66
|
+
|
67
|
+
username = ask("Username: ")
|
68
|
+
password = ask("Password: ") { |q| q.echo = "*" }
|
69
|
+
File.open(xunlei_credential_file_path, "w") do |file|
|
70
|
+
file.write({ :username => username, :password => password }.to_yaml)
|
71
|
+
end
|
72
|
+
|
73
|
+
puts "#{xunlei_credential_file_path} successfully created."
|
74
|
+
end
|
75
|
+
|
76
|
+
def check_for_credentials
|
77
|
+
ask_for_credentials unless credential_file_exists?
|
78
|
+
end
|
79
|
+
|
80
|
+
def create_xunlei_folder
|
81
|
+
Dir.mkdir(xunlei_folder_path)
|
82
|
+
end
|
83
|
+
|
84
|
+
def xunlei_folder_exists?
|
85
|
+
File.directory?(xunlei_folder_path)
|
86
|
+
end
|
87
|
+
|
88
|
+
def credential_file_exists?
|
89
|
+
File.exists?(xunlei_credential_file_path)
|
90
|
+
end
|
91
|
+
|
92
|
+
def check_for_chromedriver
|
93
|
+
unless system("which chromedriver > /dev/null 2>&1")
|
94
|
+
puts "chromedriver not found in your PATH"
|
95
|
+
if agree("Would you like me to try download it for you? (yes or no)")
|
96
|
+
if system("wget 'http://chromium.googlecode.com/files/chromedriver_mac_16.0.902.0.zip' -O #{chromedriver_zip_name}")
|
97
|
+
if system("unzip #{chromedriver_zip_name}")
|
98
|
+
puts "moving chromedriver to /usr/local/bin ..."
|
99
|
+
system("mv -v chromedriver /usr/local/bin")
|
100
|
+
|
101
|
+
puts "deleting temporary files..."
|
102
|
+
system("rm -v #{chromedriver_zip_name}")
|
103
|
+
else
|
104
|
+
puts "`unzip` not found in your PATH. Try manually unzip #{chromedriver_zip_name} and move it to /usr/local/bin"
|
105
|
+
exit
|
106
|
+
end
|
107
|
+
end
|
108
|
+
else
|
109
|
+
puts "OK. You can download it manually here: http://code.google.com/p/chromium/downloads"
|
110
|
+
exit
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
def check_for_config_files
|
116
|
+
create_xunlei_folder unless xunlei_folder_exists?
|
117
|
+
check_for_credentials
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
data/lib/xunlei/version.rb
CHANGED
data/spec/spec_helper.rb
CHANGED
@@ -0,0 +1,56 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
require "ostruct"
|
3
|
+
|
4
|
+
describe Xunlei::Helper::CLIHelper do
|
5
|
+
before(:each) do
|
6
|
+
@main = Class.new
|
7
|
+
@main.class_eval { extend Xunlei::Helper::CLIHelper }
|
8
|
+
|
9
|
+
@options_only = OpenStruct.new :only => "matrix"
|
10
|
+
@options_except = OpenStruct.new :except => "matrix"
|
11
|
+
@options_nil = OpenStruct.new
|
12
|
+
end
|
13
|
+
|
14
|
+
describe "filtered?" do
|
15
|
+
before(:each) do
|
16
|
+
@file = { :name => "MatRiX" }
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should have a filtered? method" do
|
20
|
+
@main.should respond_to(:filtered?)
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should filter correctly" do
|
24
|
+
@main.filtered?(@file, nil).should be_false
|
25
|
+
@main.filtered?(@file, @options_only).should be_false
|
26
|
+
@main.filtered?(@file, @options_except).should be_true
|
27
|
+
@main.filtered?(@file, @options_nil).should be_false
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe "filter_files" do
|
32
|
+
before(:each) do
|
33
|
+
@files = [{:name => "LOTR"}, {:name => "MatRix"}, {:name => "Bourne"}]
|
34
|
+
end
|
35
|
+
it "should have a filter_files method" do
|
36
|
+
@main.should respond_to(:filter_files)
|
37
|
+
end
|
38
|
+
|
39
|
+
it "should filter correctly" do
|
40
|
+
@main.filter_files(@files, @options_only).count.should == 1
|
41
|
+
@main.filter_files(@files, @options_except).count.should == 2
|
42
|
+
@main.filter_files(@files, @options_nil).count.should == 3
|
43
|
+
@main.filter_files(@files, nil).count.should == 3
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
describe "total_size" do
|
48
|
+
it "should have a total_size method" do
|
49
|
+
@main.should respond_to(:total_size)
|
50
|
+
end
|
51
|
+
|
52
|
+
it "should calculate total size correctly" do
|
53
|
+
@main.total_size(%w{1.1G 300M 512K}).should == 1.1 * 1000 + 300 + 1
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: xunlei
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.9
|
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:
|
12
|
+
date: 2012-02-09 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rake
|
16
|
-
requirement: &
|
16
|
+
requirement: &70294552163660 !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: :development
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70294552163660
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: rspec
|
27
|
-
requirement: &
|
27
|
+
requirement: &70294552163200 !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: :development
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70294552163200
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: simplecov
|
38
|
-
requirement: &
|
38
|
+
requirement: &70294552162180 !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: :development
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *70294552162180
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: watir-webdriver
|
49
|
-
requirement: &
|
49
|
+
requirement: &70294552158400 !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: *
|
57
|
+
version_requirements: *70294552158400
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: commander
|
60
|
-
requirement: &
|
60
|
+
requirement: &70294552157820 !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: *
|
68
|
+
version_requirements: *70294552157820
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: nokogiri
|
71
|
-
requirement: &
|
71
|
+
requirement: &70294552157200 !ruby/object:Gem::Requirement
|
72
72
|
none: false
|
73
73
|
requirements:
|
74
74
|
- - ! '>='
|
@@ -76,7 +76,7 @@ dependencies:
|
|
76
76
|
version: '0'
|
77
77
|
type: :runtime
|
78
78
|
prerelease: false
|
79
|
-
version_requirements: *
|
79
|
+
version_requirements: *70294552157200
|
80
80
|
description: A browser script to access lixian.vip.xunlei.com tasks automatically
|
81
81
|
email:
|
82
82
|
- afu@forresty.com
|
@@ -89,17 +89,18 @@ files:
|
|
89
89
|
- .travis.yml
|
90
90
|
- Gemfile
|
91
91
|
- Gemfile.ci
|
92
|
-
- Guardfile
|
93
92
|
- README.md
|
94
93
|
- Rakefile
|
95
94
|
- bin/xunlei
|
96
95
|
- lib/xunlei.rb
|
96
|
+
- lib/xunlei/configurator.rb
|
97
97
|
- lib/xunlei/engine.rb
|
98
|
+
- lib/xunlei/helpers/cli_helper.rb
|
98
99
|
- lib/xunlei/search.rb
|
99
100
|
- lib/xunlei/version.rb
|
100
101
|
- spec/spec_helper.rb
|
101
102
|
- spec/xunlei/engine_spec.rb
|
102
|
-
- spec/xunlei/
|
103
|
+
- spec/xunlei/helpers/cli_helper_spec.rb
|
103
104
|
- xunlei.gemspec
|
104
105
|
homepage: ''
|
105
106
|
licenses: []
|
@@ -115,7 +116,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
115
116
|
version: '0'
|
116
117
|
segments:
|
117
118
|
- 0
|
118
|
-
hash:
|
119
|
+
hash: 2673392163945726222
|
119
120
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
120
121
|
none: false
|
121
122
|
requirements:
|
@@ -124,7 +125,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
124
125
|
version: '0'
|
125
126
|
segments:
|
126
127
|
- 0
|
127
|
-
hash:
|
128
|
+
hash: 2673392163945726222
|
128
129
|
requirements: []
|
129
130
|
rubyforge_project: xunlei
|
130
131
|
rubygems_version: 1.8.11
|
@@ -134,4 +135,4 @@ summary: A browser script to access lixian.vip.xunlei.com tasks automatically
|
|
134
135
|
test_files:
|
135
136
|
- spec/spec_helper.rb
|
136
137
|
- spec/xunlei/engine_spec.rb
|
137
|
-
- spec/xunlei/
|
138
|
+
- spec/xunlei/helpers/cli_helper_spec.rb
|
data/Guardfile
DELETED
data/spec/xunlei/search_spec.rb
DELETED
@@ -1,16 +0,0 @@
|
|
1
|
-
require "spec_helper"
|
2
|
-
|
3
|
-
describe Xunlei::Search do
|
4
|
-
before(:each) do
|
5
|
-
$stdout.stub(:puts)
|
6
|
-
end
|
7
|
-
|
8
|
-
describe "Google" do
|
9
|
-
it "should find some ed2k links" do
|
10
|
-
search = Xunlei::Search.new
|
11
|
-
links = search.google("Repulsion", "720p")
|
12
|
-
|
13
|
-
links.should_not be_empty
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|