instapaper_download 1.0.1
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 +29 -0
- data/bin/instapaper_download +38 -0
- data/lib/instapaper_download.rb +144 -0
- data/lib/instapaper_download.rb.back +5 -0
- data/lib/instapaper_download/version.rb +3 -0
- metadata +68 -0
data/README.md
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
# InstapaperDownload
|
2
|
+
|
3
|
+
TODO: Write a gem description
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Add this line to your application's Gemfile:
|
8
|
+
|
9
|
+
gem 'instapaper_download'
|
10
|
+
|
11
|
+
And then execute:
|
12
|
+
|
13
|
+
$ bundle
|
14
|
+
|
15
|
+
Or install it yourself as:
|
16
|
+
|
17
|
+
$ gem install instapaper_download
|
18
|
+
|
19
|
+
## Usage
|
20
|
+
|
21
|
+
TODO: Write usage instructions here
|
22
|
+
|
23
|
+
## Contributing
|
24
|
+
|
25
|
+
1. Fork it
|
26
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
27
|
+
3. Commit your changes (`git commit -am 'Added some feature'`)
|
28
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
29
|
+
5. Create new Pull Request
|
@@ -0,0 +1,38 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'instapaper_download.rb'
|
3
|
+
require 'mechanize'
|
4
|
+
|
5
|
+
config_file = Instapaper::ConfigFile.new
|
6
|
+
|
7
|
+
account = Instapaper::Account.from_config_file(config_file)
|
8
|
+
agent = Mechanize.new
|
9
|
+
agent.user_agent_alias = 'Mac Safari'
|
10
|
+
|
11
|
+
login_page = Instapaper::LoginPage.new(agent)
|
12
|
+
agent = login_page.login(account)
|
13
|
+
if login_page.logged_in?
|
14
|
+
download_page = Instapaper::EpubDownloadPage.new(agent)
|
15
|
+
file = download_page.download
|
16
|
+
if file.respond_to?(:save)
|
17
|
+
file.save(file.filename)
|
18
|
+
instapaper_file = file.filename
|
19
|
+
puts %Q{Saved your epub to "#{instapaper_file}"}
|
20
|
+
else
|
21
|
+
$stderr.puts "Something is broken, I logged in successfully but then I couldn't save the file. Weird, huh?!"
|
22
|
+
exit 1
|
23
|
+
end
|
24
|
+
else
|
25
|
+
error_message = "Could not login, maybe something is wrong with your credentials."
|
26
|
+
error_message += %Q{ You probably want to check that configuration file thingy you have at "#{config_file.path}".} if config_file.exists?
|
27
|
+
$stderr.puts error_message
|
28
|
+
exit 1
|
29
|
+
end
|
30
|
+
|
31
|
+
reader = EbookReader.from_config_file(config_file)
|
32
|
+
if reader.is_mounted?
|
33
|
+
reader.move_to_device(instapaper_file)
|
34
|
+
else
|
35
|
+
error_message = %Q{No reader found at "#{reader.mount_point}".}
|
36
|
+
error_message += %Q{ If you are sure that it is mounted, you probably want to check that configuration file thingy you have at "#{config_file.path}".} if config_file.exists?
|
37
|
+
$stderr.puts error_message
|
38
|
+
end
|
@@ -0,0 +1,144 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'mechanize'
|
3
|
+
require 'yaml'
|
4
|
+
require 'fileutils'
|
5
|
+
|
6
|
+
class Instapaper
|
7
|
+
class ConfigFile
|
8
|
+
|
9
|
+
def initialize(config_file = "~/.instapaper_download")
|
10
|
+
@config_file = File.expand_path(config_file)
|
11
|
+
@config_hash = {}
|
12
|
+
@save_to_file = nil
|
13
|
+
end
|
14
|
+
|
15
|
+
def read_from_file
|
16
|
+
raise "Please make sure that #{@config_file} exists" unless exists?
|
17
|
+
@config_hash = YAML::load_file(@config_file)
|
18
|
+
end
|
19
|
+
|
20
|
+
def create_or_update
|
21
|
+
File.open(@config_file, "w") do |file|
|
22
|
+
file.write(YAML::dump(@config_hash))
|
23
|
+
end
|
24
|
+
puts %Q{Saved configuration to "#{@config_file}"}
|
25
|
+
end
|
26
|
+
|
27
|
+
def exists?
|
28
|
+
File.exists?(@config_file) && File.file?(@config_file)
|
29
|
+
end
|
30
|
+
|
31
|
+
def path
|
32
|
+
@config_file
|
33
|
+
end
|
34
|
+
|
35
|
+
def save_to_file_if_necessary(hash)
|
36
|
+
@config_hash = @config_hash.merge(hash) #Overwrites old values from @config_hash with new values from hash in case of identical keys
|
37
|
+
puts
|
38
|
+
while @save_to_file.nil? do
|
39
|
+
print "Should I hold on to this information for you? Caution: The password is stored in plain text! [y/n] "
|
40
|
+
response = gets.chomp.downcase
|
41
|
+
if response == "y"
|
42
|
+
@save_to_file = true
|
43
|
+
elsif response == "n"
|
44
|
+
@save_to_file = false
|
45
|
+
end
|
46
|
+
end
|
47
|
+
if @save_to_file
|
48
|
+
create_or_update
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
class Account
|
54
|
+
attr_reader :email, :password
|
55
|
+
def initialize(email, password)
|
56
|
+
@email = email
|
57
|
+
@password = password
|
58
|
+
end
|
59
|
+
def self.from_config_file(config_file = ConfigFile.new)
|
60
|
+
config = {}
|
61
|
+
config = config_file.read_from_file if config_file.exists?
|
62
|
+
unless config[:email] and config[:password]
|
63
|
+
print "Please enter instapaper email address: "
|
64
|
+
email = gets.chomp
|
65
|
+
print "Please enter instapaper password: "
|
66
|
+
`stty -echo`
|
67
|
+
password = gets.chomp
|
68
|
+
`stty echo`
|
69
|
+
config[:email] = email
|
70
|
+
config[:password] = password
|
71
|
+
config_file.save_to_file_if_necessary(config)
|
72
|
+
end
|
73
|
+
return Account.new(config[:email], config[:password])
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
class LoginPage
|
78
|
+
def initialize(agent)
|
79
|
+
@agent = agent
|
80
|
+
@url = "http://www.instapaper.com/user/login"
|
81
|
+
@logged_in = false
|
82
|
+
end
|
83
|
+
def login(account)
|
84
|
+
puts "Logging in as #{account.email}"
|
85
|
+
page = @agent.get(@url)
|
86
|
+
login_form = page.forms.first
|
87
|
+
login_form.field_with(:name => "username").value = account.email
|
88
|
+
login_form.field_with(:name => "password").value = account.password
|
89
|
+
page = @agent.submit(login_form)
|
90
|
+
@logged_in = true if page.title == "Logging in..."
|
91
|
+
@agent
|
92
|
+
end
|
93
|
+
def logged_in?
|
94
|
+
@logged_in
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
class EpubDownloadPage
|
99
|
+
def initialize(agent)
|
100
|
+
@agent = agent
|
101
|
+
@url = "http://www.instapaper.com/epub"
|
102
|
+
end
|
103
|
+
def download
|
104
|
+
page = @agent.get(@url)
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
end
|
109
|
+
|
110
|
+
class EbookReader
|
111
|
+
attr_reader :mount_point
|
112
|
+
|
113
|
+
def initialize(path)
|
114
|
+
@mount_point = path
|
115
|
+
end
|
116
|
+
|
117
|
+
def self.from_config_file(config_file = ConfigFile.new)
|
118
|
+
config = {}
|
119
|
+
config = config_file.read_from_file if config_file.exists?
|
120
|
+
unless config[:ebook_reader_path]
|
121
|
+
print "Where is your ebook reader mounted?: "
|
122
|
+
path = gets.chomp
|
123
|
+
config[:ebook_reader_path] = path
|
124
|
+
config_file.save_to_file_if_necessary(config)
|
125
|
+
end
|
126
|
+
return EbookReader.new(config[:ebook_reader_path])
|
127
|
+
end
|
128
|
+
|
129
|
+
def is_mounted?
|
130
|
+
File.exists?(@mount_point) and File.directory?(@mount_point)
|
131
|
+
end
|
132
|
+
|
133
|
+
def move_to_device(file)
|
134
|
+
raise %Q{The ebook reader does not seem to be mounted on "#{@mount_point}"} unless is_mounted?
|
135
|
+
file = File.expand_path(file)
|
136
|
+
@mount_point = File.expand_path(@mount_point)
|
137
|
+
FileUtils.mv(file, @mount_point)
|
138
|
+
puts %Q{Moved "#{file}" to your ebook reader}
|
139
|
+
end
|
140
|
+
|
141
|
+
end
|
142
|
+
|
143
|
+
|
144
|
+
#TODO: Deploy it like: https://github.com/defunkt/cheat
|
metadata
ADDED
@@ -0,0 +1,68 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: instapaper_download
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Sebastian Geiger
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-05-24 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: mechanize
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 2.5.0
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 2.5.0
|
30
|
+
description:
|
31
|
+
email:
|
32
|
+
- sebastian.geiger@gmail.com
|
33
|
+
executables:
|
34
|
+
- instapaper_download
|
35
|
+
extensions: []
|
36
|
+
extra_rdoc_files: []
|
37
|
+
files:
|
38
|
+
- bin/instapaper_download
|
39
|
+
- lib/instapaper_download/version.rb
|
40
|
+
- lib/instapaper_download.rb
|
41
|
+
- lib/instapaper_download.rb.back
|
42
|
+
- README.md
|
43
|
+
homepage: http://sebastiangeiger.github.com/categories/instapaper-download/
|
44
|
+
licenses: []
|
45
|
+
post_install_message:
|
46
|
+
rdoc_options: []
|
47
|
+
require_paths:
|
48
|
+
- lib
|
49
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
56
|
+
none: false
|
57
|
+
requirements:
|
58
|
+
- - ! '>='
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: '0'
|
61
|
+
requirements: []
|
62
|
+
rubyforge_project:
|
63
|
+
rubygems_version: 1.8.24
|
64
|
+
signing_key:
|
65
|
+
specification_version: 3
|
66
|
+
summary: instapaper_download provies a binary that lets you download an epub from
|
67
|
+
instapaper and put it on an ebook reader
|
68
|
+
test_files: []
|