saber 0.0.7 → 1.0.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.
- data/.gitignore +1 -0
- data/.travis.yml +4 -0
- data/CHANGELOG.md +3 -0
- data/Gemfile +18 -8
- data/Gemfile.lock +72 -33
- data/Guardfile +4 -0
- data/README.md +192 -52
- data/Rakefile +46 -0
- data/bin/1saber +5 -3
- data/bin/saber +4 -0
- data/bin/saber.bib +3 -0
- data/bin/saber.what +3 -0
- data/extconf.rb +4 -1
- data/lib/saber.rb +7 -13
- data/lib/saber/autofetcher.rb +8 -0
- data/lib/saber/autofetcher/client.rb +66 -0
- data/lib/saber/autofetcher/server.rb +78 -0
- data/lib/saber/cli.rb +65 -26
- data/lib/saber/{downloader.rb → fetcher.rb} +9 -11
- data/lib/saber/mechanize_ext.rb +136 -0
- data/lib/saber/rc.rb +3 -21
- data/lib/saber/task.rb +26 -11
- data/lib/saber/task/base.rb +18 -0
- data/lib/saber/task/clean.rb +18 -0
- data/lib/saber/task/generate.rb +38 -0
- data/lib/saber/task/make.rb +44 -0
- data/lib/saber/task/send.rb +21 -0
- data/lib/saber/task/upload.rb +37 -0
- data/lib/saber/tracker.rb +28 -0
- data/lib/saber/tracker/base.rb +115 -2
- data/lib/saber/tracker/bb.rb +244 -0
- data/lib/saber/tracker/bib.rb +225 -0
- data/lib/saber/tracker/ptp.rb +100 -0
- data/lib/saber/tracker/what.rb +55 -7
- data/lib/saber/ui.rb +65 -22
- data/lib/saber/version.rb +1 -1
- data/rutorrent/init.js +8 -9
- data/rutorrent/plugin.info +1 -1
- data/saber.gemspec +14 -10
- data/spec/data/_saber/.gitkeep +0 -0
- data/spec/saber/downloader_spec.rb +5 -2
- data/spec/saber/task_spec.rb +16 -0
- data/spec/saber/tracker/bib_spec.rb +24 -0
- data/spec/spec_helper.rb +25 -0
- data/templates/_saberrc +36 -0
- data/templates/bb/anime.yml +6 -0
- data/templates/bb/application.yml +7 -0
- data/templates/bb/audiobook.yml +12 -0
- data/templates/bb/comic.yml +7 -0
- data/templates/bb/documentary.yml +26 -0
- data/templates/bb/ebook.yml +8 -0
- data/templates/bb/elearning_video.yml +7 -0
- data/templates/bb/game_console.yml +6 -0
- data/templates/bb/game_pc.yml +6 -0
- data/templates/bb/magazine.yml +6 -0
- data/templates/bb/misc.yml +6 -0
- data/templates/bb/movie.yml +26 -0
- data/templates/bb/music.yml +21 -0
- data/templates/bb/tv.yml +6 -0
- data/templates/bib/application.yml +9 -0
- data/templates/bib/article.yml +18 -0
- data/templates/bib/audiobook.yml +17 -0
- data/templates/bib/comic.yml +22 -0
- data/templates/bib/ebook.yml +20 -0
- data/templates/bib/journal.yml +18 -0
- data/templates/bib/magazine.yml +18 -0
- data/templates/ptp/movie.yml +63 -0
- data/templates/ptp/movie_add.yml +35 -0
- data/templates/what/ebook.yml +6 -0
- data/templates/what/music.yml +2 -0
- data/templates/what/music_add.yml +2 -0
- metadata +182 -26
- data/doc/Development.md +0 -3
- data/lib/saber/client.rb +0 -58
- data/lib/saber/server.rb +0 -70
- data/saber.watchr +0 -23
@@ -0,0 +1,136 @@
|
|
1
|
+
class Mechanize::Form
|
2
|
+
# A Generic api to get value
|
3
|
+
# @see set
|
4
|
+
def get(type, criteial)
|
5
|
+
case type.to_sym
|
6
|
+
when :text, :hidden, :textarea, :keygen
|
7
|
+
(f=field(criteia)) ? f.value : nil
|
8
|
+
when :radiobutton
|
9
|
+
(f=radiobutton(criteia)) ? f.checked? : nil
|
10
|
+
when :checkbox
|
11
|
+
(f=checkbox(criteia)) ? f.checked? : nil
|
12
|
+
when :multi_select_list, :select_list
|
13
|
+
(f=field(criteia)) ? f.value : nil
|
14
|
+
when :multi_select_list_text, :select_list_text
|
15
|
+
(f=field(criteia)) ? f.text_value : nil
|
16
|
+
when :file_upload
|
17
|
+
(f=file_upload(criteia)) ? f.file_name : nil
|
18
|
+
else
|
19
|
+
raise ArgumentError, "the type argument is wrong -- #{type.insepect}"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
# A Generic api to set value
|
24
|
+
#
|
25
|
+
# types: :text, :hidden, :textarea, :keygen, :radiobutton, :checkbox,
|
26
|
+
# :multi_select_list[_text] :select_list[_text] :file_upload
|
27
|
+
#
|
28
|
+
# @param type [Symbol,String]
|
29
|
+
# @param value [Object] use nil to pass the set.
|
30
|
+
#
|
31
|
+
# @example
|
32
|
+
#
|
33
|
+
# set :text, "foo"
|
34
|
+
# set :checkbox, true
|
35
|
+
# set :select_list, "1"
|
36
|
+
# set :select_list_text, "EPUB"
|
37
|
+
#
|
38
|
+
# @see get
|
39
|
+
def set(type, criteia, value)
|
40
|
+
return nil if value.nil?
|
41
|
+
|
42
|
+
case type.to_sym
|
43
|
+
when :text, :hidden, :textarea, :keygen
|
44
|
+
(f=field(criteia)) ? f.value = value : nil
|
45
|
+
when :radiobutton
|
46
|
+
(f=radiobutton(criteia)) ? f.check(value) : nil
|
47
|
+
when :checkbox
|
48
|
+
(f=checkbox(criteia)) ? f.check(value) : nil
|
49
|
+
when :multi_select_list, :select_list
|
50
|
+
(f=field(criteia)) ? f.value = value : nil
|
51
|
+
when :multi_select_list_text, :select_list_text
|
52
|
+
(f=field(criteia)) ? f.text_value = value : nil
|
53
|
+
when :file_upload
|
54
|
+
(f=file_upload(criteia)) ? f.file_name = value : nil
|
55
|
+
else
|
56
|
+
raise ArgumentError, "the type argument is wrong -- #{type.insepect}"
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
class Mechanize::Form::MultiSelectList
|
62
|
+
# Select no options
|
63
|
+
def select_none_with_tagen
|
64
|
+
@text_value = []
|
65
|
+
select_none_without_tagen
|
66
|
+
end
|
67
|
+
alias select_none_without_tagen select_none
|
68
|
+
alias select_none select_none_with_tagen
|
69
|
+
|
70
|
+
# Select all options
|
71
|
+
def select_all_with_tagen
|
72
|
+
@text_value = []
|
73
|
+
select_all_withoutout_tagen
|
74
|
+
end
|
75
|
+
alias select_all_without_tagen select_all
|
76
|
+
alias select_all select_all_with_tagen
|
77
|
+
|
78
|
+
def text_value
|
79
|
+
value = []
|
80
|
+
value.concat @text_value
|
81
|
+
value.concat selected_options.map { |o| o.text }
|
82
|
+
value
|
83
|
+
end
|
84
|
+
|
85
|
+
def text_value=(values)
|
86
|
+
select_none
|
87
|
+
[values].flatten.each do |value|
|
88
|
+
option = options.find { |o| o.text == value }
|
89
|
+
if option.nil?
|
90
|
+
@text_value.push(value)
|
91
|
+
else
|
92
|
+
option.select
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
class Mechanize::Form::SelectList
|
99
|
+
def text_value
|
100
|
+
value = super
|
101
|
+
if value.length > 0
|
102
|
+
value.last
|
103
|
+
elsif @options.length > 0
|
104
|
+
@options.first.value
|
105
|
+
else
|
106
|
+
nil
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
def text_value=(new)
|
111
|
+
if new != new.to_s and new.respond_to? :first
|
112
|
+
super([new.first])
|
113
|
+
else
|
114
|
+
super([new.to_s])
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
class Mechanize::Form::RadioButton
|
120
|
+
# check_with_tagen(nil)
|
121
|
+
# check_with_tagen(true)
|
122
|
+
# check_with_tagen(false)
|
123
|
+
def check_with_tagen(check=true)
|
124
|
+
if check.nil?
|
125
|
+
return
|
126
|
+
elsif check
|
127
|
+
check_without_tagen
|
128
|
+
else
|
129
|
+
uncheck
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
alias check_without_tagen check
|
134
|
+
alias check check_with_tagen
|
135
|
+
end
|
136
|
+
|
data/lib/saber/rc.rb
CHANGED
@@ -1,31 +1,13 @@
|
|
1
1
|
scgi_server = "http://localhost/RPC2"
|
2
2
|
|
3
3
|
p:
|
4
|
-
|
4
|
+
root = Pa.expand("../../..", __FILE__)
|
5
|
+
home = Pa("~/.saber")
|
6
|
+
homerc = Pa("~/.saberrc")
|
5
7
|
|
6
8
|
aria2:
|
7
9
|
rpc = "http://localhost:6800/rpc"
|
8
10
|
|
9
|
-
label = "saber" # default auto-download label.
|
10
11
|
port = 3014
|
11
12
|
token = "641a16655dad688ab681c0279a4369b5"
|
12
13
|
drb_uri = "druby://localhost:3015"
|
13
|
-
|
14
|
-
server:
|
15
|
-
download = Pa("/home/foo/download") # remote download directory.
|
16
|
-
ftp = "ftp://seedbox/download" # download from "#{ftp}/<file>"
|
17
|
-
host = "seedbox"
|
18
|
-
user = "foo"
|
19
|
-
|
20
|
-
xmpp:
|
21
|
-
jid = "foo@jabber.org"
|
22
|
-
password = "y"
|
23
|
-
host = nil
|
24
|
-
port = nil
|
25
|
-
|
26
|
-
client:
|
27
|
-
xmpp:
|
28
|
-
jid = "bar@jabber.org"
|
29
|
-
password = "y"
|
30
|
-
host = nil
|
31
|
-
port = nil
|
data/lib/saber/task.rb
CHANGED
@@ -1,17 +1,32 @@
|
|
1
1
|
module Saber
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
2
|
+
# Usage
|
3
|
+
#
|
4
|
+
# require "saber/task/make"
|
5
|
+
# Saber::Task["make"].invoke
|
6
|
+
#
|
7
|
+
# Define a new task
|
8
|
+
#
|
9
|
+
# class HelloWorld < Task::Base
|
10
|
+
# def invoke(*args, &blk)
|
11
|
+
# p args
|
12
|
+
# end
|
13
|
+
# end
|
14
|
+
#
|
15
|
+
# Task.hello_world(1, 2) -> [1, 2]
|
16
|
+
module Task
|
17
|
+
autoload :Base, "saber/task/base"
|
18
|
+
autoload :Clean, "saber/task/clean"
|
19
|
+
autoload :Make, "saber/task/make"
|
20
|
+
autoload :Upload, "saber/task/upload"
|
21
|
+
|
22
|
+
@@tasks = {}
|
8
23
|
|
9
|
-
|
10
|
-
|
24
|
+
# a list of all tasks
|
25
|
+
mattr_reader :tasks
|
11
26
|
|
12
|
-
|
13
|
-
|
14
|
-
|
27
|
+
class << self
|
28
|
+
def [](name)
|
29
|
+
tasks[name]
|
15
30
|
end
|
16
31
|
end
|
17
32
|
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require "active_support/core_ext/string/inflections"
|
2
|
+
|
3
|
+
module Saber
|
4
|
+
module Task
|
5
|
+
class Base < Thor
|
6
|
+
class << self
|
7
|
+
def inherited(child)
|
8
|
+
Task.tasks[child.name.demodulize.underscore] = child
|
9
|
+
end
|
10
|
+
|
11
|
+
# invoke a task
|
12
|
+
def invoke(*args)
|
13
|
+
new.invoke(*args)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require "retort"
|
2
|
+
Retort::Service.configure { |c| c.url = Saber::Rc.scgi_server }
|
3
|
+
|
4
|
+
module Saber
|
5
|
+
module Task
|
6
|
+
class Clean < Base
|
7
|
+
desc "clean", "clean"
|
8
|
+
def clean
|
9
|
+
disk_files = Pa.ls2(Rc.p.download, absolute: true)
|
10
|
+
bt_files = Retort::Torrent.all.map{|t| Retort::Torrent.action("name", t.info_hash) }.map{|n| Pa.join2(Rc.p.download, n)}
|
11
|
+
|
12
|
+
(disk_files - bt_files).each { |file|
|
13
|
+
Pa.rm_r file, :verbose => true
|
14
|
+
}
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module Saber
|
2
|
+
module Task
|
3
|
+
# Generate meta data file.
|
4
|
+
#
|
5
|
+
# Usage
|
6
|
+
# -----
|
7
|
+
#
|
8
|
+
# Task["generate"].invoke(:generate, ["bib", "ebook", "Hello.epub", isbn])
|
9
|
+
# > generate Hello.epub.yml data file.
|
10
|
+
#
|
11
|
+
class Generate < Base
|
12
|
+
include Thor::Actions
|
13
|
+
|
14
|
+
source_root "#{Rc.p.root}/templates"
|
15
|
+
|
16
|
+
desc "generate", "generate"
|
17
|
+
def generate(tracker_name, type, filename, *args)
|
18
|
+
require "saber/tracker/#{tracker_name}" if !args.empty?
|
19
|
+
template_file = find_in_source_paths("#{tracker_name}/#{type}.yml")
|
20
|
+
dest = "#{filename}.yml"
|
21
|
+
|
22
|
+
if !args.empty? and Tracker[tracker_name].can_populate?(type)
|
23
|
+
populate = {}
|
24
|
+
data = YAML.load_file(template_file)
|
25
|
+
|
26
|
+
tracker = Tracker[tracker_name].new
|
27
|
+
tracker.login
|
28
|
+
populate = tracker.populate(type, *args)
|
29
|
+
data.merge!(populate)
|
30
|
+
|
31
|
+
create_file dest, YAML.dump(data)
|
32
|
+
else
|
33
|
+
copy_file template_file, dest
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require "shellwords"
|
2
|
+
require "tagen/core/kernel/shell"
|
3
|
+
|
4
|
+
module Saber
|
5
|
+
module Task
|
6
|
+
#
|
7
|
+
# Usage
|
8
|
+
# -----
|
9
|
+
#
|
10
|
+
# Task["make"].invoke(:make, ["bib", "a.epub", "b.epub"])
|
11
|
+
# > create a.epub.torrent and send it to local and remote watch directory.
|
12
|
+
# > create b.epub.torrent ..
|
13
|
+
#
|
14
|
+
class Make < Base
|
15
|
+
desc "make", "make"
|
16
|
+
def make(tracker_name, *files)
|
17
|
+
Saber.ui.error! "You need set #{tracker_name}.announce_url in ~/.saberrc first" unless
|
18
|
+
Rc._has_key?("#{tracker_name}.announce_url")
|
19
|
+
|
20
|
+
files.each { |file|
|
21
|
+
torrent_file = "#{file}.torrent"
|
22
|
+
|
23
|
+
if Pa.exists?(torrent_file)
|
24
|
+
if options["force"]
|
25
|
+
Pa.rm torrent_file
|
26
|
+
else
|
27
|
+
Saber.ui.say "Skip make: #{file} (torrent alreay exists. use -f to overwrite it.)"
|
28
|
+
next
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
system "mktorrent -p -a #{Rc[tracker_name].announce_url} #{file.shellescape}", show_cmd: true
|
33
|
+
# cp tororent file to watch directory.
|
34
|
+
Pa.cp_f torrent_file, Rc.p.watch, show_cmd: true if Rc.p._has_key?(:watch)
|
35
|
+
if Rc.p._has_key?(:remote_watch)
|
36
|
+
require "saber/task/send"
|
37
|
+
Task["send"].invoke(:send, [torrent_file, Rc.p.remote_watch])
|
38
|
+
end
|
39
|
+
Saber.ui.say ""
|
40
|
+
}
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require "shellwords"
|
2
|
+
require "tagen/core/kernel/shell"
|
3
|
+
|
4
|
+
module Saber
|
5
|
+
module Task
|
6
|
+
# send files to seedbox.
|
7
|
+
class Send < Base
|
8
|
+
|
9
|
+
desc "send1", "send"
|
10
|
+
# @overload send(*files, dest)
|
11
|
+
def send1(*args)
|
12
|
+
if args.length == 1 then
|
13
|
+
Saber.ui.error! "At least one src for send -- src: nil, dest: #{args[1].inspect}."
|
14
|
+
end
|
15
|
+
|
16
|
+
*files, dest = args
|
17
|
+
system "rsync -Phr #{files.shelljoin} #{Rc.server.user}@#{Rc.server.host}:#{dest}", show_cmd: true
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module Saber
|
2
|
+
module Task
|
3
|
+
# Usage
|
4
|
+
#
|
5
|
+
# Task["upload"].invoke(:upload, ["site", "Hello.epub"]) # make hello.epub.torrent
|
6
|
+
# Task["upload"].invoke(:upload, ["site", "Hello.epub.torrent"])
|
7
|
+
#
|
8
|
+
class Upload < Base
|
9
|
+
desc "upload", "upload"
|
10
|
+
# @param [String] tracker_name
|
11
|
+
# @param [String] file/torrent_file "foo" or "foo.torrent"
|
12
|
+
def upload(tracker_name, *torrent_files)
|
13
|
+
require "saber/tracker/#{tracker_name}"
|
14
|
+
|
15
|
+
torrent_files.map!{|v| Pa.add_ext2(v, ".torrent")}
|
16
|
+
|
17
|
+
ensure_torrent_file(tracker_name, *torrent_files)
|
18
|
+
|
19
|
+
tracker = Tracker[tracker_name].new
|
20
|
+
tracker.login
|
21
|
+
tracker.upload(*torrent_files)
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def ensure_torrent_file(tracker_name, *torrent_files)
|
27
|
+
require "saber/task/make"
|
28
|
+
|
29
|
+
torrent_files.each { |torrent_file|
|
30
|
+
next if Pa.exists?(torrent_file)
|
31
|
+
|
32
|
+
Task["make"].invoke(:make, [tracker_name, Pa.delete_ext2(torrent_file, ".torrent")])
|
33
|
+
}
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require "mechanize"
|
2
|
+
require "saber/mechanize_ext"
|
3
|
+
require "highline/import"
|
4
|
+
require "reverse_markdown"
|
5
|
+
require "json"
|
6
|
+
|
7
|
+
module Saber
|
8
|
+
# Usage
|
9
|
+
#
|
10
|
+
# bib = Tracker["bib"]
|
11
|
+
# bib.login
|
12
|
+
# bib.upload("Hello.epub.torrent")
|
13
|
+
#
|
14
|
+
module Tracker
|
15
|
+
autoload :Base, "saber/tracker/base"
|
16
|
+
autoload :What, "saber/tracker/what"
|
17
|
+
autoload :BIB, "saber/tracker/bib"
|
18
|
+
|
19
|
+
@@trackers = {}
|
20
|
+
mattr_reader :trackers
|
21
|
+
|
22
|
+
class << self
|
23
|
+
def [](name)
|
24
|
+
trackers[name]
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
data/lib/saber/tracker/base.rb
CHANGED
@@ -1,8 +1,121 @@
|
|
1
|
-
require "
|
1
|
+
require "active_support/core_ext/string/inflections"
|
2
2
|
|
3
3
|
module Saber
|
4
|
-
|
4
|
+
module Tracker
|
5
5
|
class Base
|
6
|
+
def self.inherited(child)
|
7
|
+
Tracker.trackers[child.name.demodulize.underscore] = child
|
8
|
+
end
|
9
|
+
|
10
|
+
# implement
|
11
|
+
@@POPULATE_TYPES = []
|
12
|
+
|
13
|
+
def self.can_populate?(type)
|
14
|
+
@@POPULATE_TYPES.include?(type.to_s)
|
15
|
+
end
|
16
|
+
|
17
|
+
# implement
|
18
|
+
@@BASE_URL = ""
|
19
|
+
@@LOGIN_CHECK_PATH = ""
|
20
|
+
|
21
|
+
attr_reader :agent
|
22
|
+
attr_reader :site_name
|
23
|
+
|
24
|
+
def initialize
|
25
|
+
@site_name = self.class.name.demodulize.underscore
|
26
|
+
@agent = Mechanize.new
|
27
|
+
|
28
|
+
@agent.get(@@BASE_URL)
|
29
|
+
end
|
30
|
+
|
31
|
+
def login
|
32
|
+
if login_with_cookie
|
33
|
+
return
|
34
|
+
end
|
35
|
+
|
36
|
+
login_with_username
|
37
|
+
end
|
38
|
+
|
39
|
+
def upload(*torrent_files)
|
40
|
+
files = torrent_files.map{|v| Pa.delete_ext(v, ".torrent")}
|
41
|
+
|
42
|
+
files.each {|file|
|
43
|
+
info = Optimism.require!("./#{file}.yml")
|
44
|
+
|
45
|
+
if do_upload(file, info)
|
46
|
+
Saber.ui.say "Upload Complete: #{file}"
|
47
|
+
else
|
48
|
+
Saber.ui.error "Upload Failed: #{file}"
|
49
|
+
end
|
50
|
+
}
|
51
|
+
end
|
52
|
+
|
53
|
+
# Return data by auto-fill functions provied by site.
|
54
|
+
#
|
55
|
+
# @example
|
56
|
+
#
|
57
|
+
# populate("ebook", isbn)
|
58
|
+
#
|
59
|
+
# @return [Hash]
|
60
|
+
def populate(type, *args)
|
61
|
+
meth = "populate_#{type}"
|
62
|
+
|
63
|
+
if respond_to?(meth) then
|
64
|
+
send meth, *args
|
65
|
+
else
|
66
|
+
raise ArgumentError, "Not support this type -- #{type}"
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
protected
|
71
|
+
|
72
|
+
# Implement
|
73
|
+
#
|
74
|
+
# @return [Boolean] success?
|
75
|
+
def do_upload(file, info)
|
76
|
+
raise NotImplementedError
|
77
|
+
end
|
78
|
+
|
79
|
+
# Implement
|
80
|
+
#
|
81
|
+
# @return [Boolean] success?
|
82
|
+
def do_login_with_username(username)
|
83
|
+
raise NotImplementedError
|
84
|
+
end
|
85
|
+
|
86
|
+
def login_with_cookie
|
87
|
+
if Pa.exists?("#{Rc.p.home}/#{site_name}.cookies") then
|
88
|
+
open("#{Rc.p.home}/#{site_name}.cookies") { |io|
|
89
|
+
agent.cookie_jar.load_cookiestxt(io)
|
90
|
+
}
|
91
|
+
|
92
|
+
ret = agent.get(@@LOGIN_CHECK_PATH)
|
93
|
+
|
94
|
+
if ret.uri.path == @@LOGIN_CHECK_PATH
|
95
|
+
true
|
96
|
+
else
|
97
|
+
Saber.ui.say "Login with cookie failed."
|
98
|
+
false
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
def login_with_username
|
104
|
+
username = Rc._fetch(["#{site_name}.username", "username"], nil)
|
105
|
+
|
106
|
+
Saber.ui.say "Begin to login manually."
|
107
|
+
Saber.ui.say "Username: #{username}" if username
|
108
|
+
loop do
|
109
|
+
if do_login_with_username(username)
|
110
|
+
open("#{Rc.p.home}/#{site_name}.cookies", "w") { |f|
|
111
|
+
agent.cookie_jar.dump_cookiestxt(f)
|
112
|
+
}
|
113
|
+
return true
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
6
117
|
end
|
7
118
|
end
|
8
119
|
end
|
120
|
+
|
121
|
+
# vim: fdn=4
|