comer_de_tapas 0.1.2 → 0.1.3
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/README.md +2 -0
- data/lib/comer_de_tapas/cli.rb +2 -1
- data/lib/comer_de_tapas/client.rb +43 -21
- data/lib/comer_de_tapas/subscription.rb +2 -2
- data/lib/comer_de_tapas/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: c97e323c1838461bc221ef30b5549c6fb1bc52c8
|
|
4
|
+
data.tar.gz: 02b0a3e9814c081c618d8d2ac2a70a5a5a6a1eeb
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 7812e1ee92b1ef2cbaf6c4897dc2f4ae91c775d474f456750660d63e6ddb817ef2cfaf0708bf0ec2a9f46f7b7ac14d816a5ae537342eeba863dde87b21d8a630
|
|
7
|
+
data.tar.gz: 370a445ca90681db21e53430f416346f7075a77cd2f46610f4ed9007e7e389ed3f9bfef520c8fe7a2dd9d65629839977b368eab3a1e24679bddfb1c3c0134c4f
|
data/README.md
CHANGED
|
@@ -46,6 +46,8 @@ If you want to save all Ruby Tapas episodes in your home folder. Please write it
|
|
|
46
46
|
Usage
|
|
47
47
|
-----
|
|
48
48
|
|
|
49
|
+
After you filled subscription information, you can download episodes via this command:
|
|
50
|
+
|
|
49
51
|
$ comer_de_tapas download
|
|
50
52
|
|
|
51
53
|
Will fetch all episodes, then start to download it.
|
data/lib/comer_de_tapas/cli.rb
CHANGED
|
@@ -16,7 +16,8 @@ module ComerDeTapas
|
|
|
16
16
|
desc 'init', 'Create config folder and files'
|
|
17
17
|
def init
|
|
18
18
|
@client.init!
|
|
19
|
-
say 'Please fill in your subscription info in ~/.rubytapas/.credentials'
|
|
19
|
+
say 'Please fill in your subscription info in ~/.rubytapas/.credentials.'
|
|
20
|
+
say 'When you finished, type `comer_de_tapas download` to download.'
|
|
20
21
|
end
|
|
21
22
|
|
|
22
23
|
# -f, --force, options[:force] => true, otherwise nil.
|
|
@@ -10,7 +10,7 @@ module ComerDeTapas
|
|
|
10
10
|
# $ mkdir -p ~/.rubytapas/
|
|
11
11
|
# $ touch ~/.rubytapas/.credentials
|
|
12
12
|
def init!
|
|
13
|
-
if
|
|
13
|
+
if RUBYTAPAS_DIR.exist? && CREDENTIAL_FILE.exist?
|
|
14
14
|
abort 'Credentials found. type `comer_de_tapas download` to download.'
|
|
15
15
|
end
|
|
16
16
|
create_rubytapas_files!
|
|
@@ -21,17 +21,19 @@ module ComerDeTapas
|
|
|
21
21
|
# Parse it to episode, save episodes data as json to ~/.rubytapas.json
|
|
22
22
|
def fetch_episodes! force=nil
|
|
23
23
|
return puts 'Use cached episode data.' if fresh? && force.nil?
|
|
24
|
+
puts 'Force fetching. Getting latest Ruby Tapas...' if force
|
|
24
25
|
puts 'Fetching episodes...'
|
|
25
|
-
get_feed_with_basic_auth
|
|
26
|
-
|
|
27
|
-
|
|
26
|
+
if get_feed_with_basic_auth
|
|
27
|
+
save_feed_data parse_xml_feed
|
|
28
|
+
puts 'Episodes successfully fetched and saved.'
|
|
29
|
+
end
|
|
28
30
|
end
|
|
29
31
|
|
|
30
32
|
# Create user specified folder: credentials[:save_path]
|
|
31
33
|
def prepare_save_folder!
|
|
32
|
-
return puts "#{save_folder} found." if
|
|
34
|
+
return puts "#{save_folder} found." if save_folder.exist?
|
|
33
35
|
|
|
34
|
-
|
|
36
|
+
save_folder.mkpath
|
|
35
37
|
puts "#{save_folder} created."
|
|
36
38
|
end
|
|
37
39
|
|
|
@@ -42,26 +44,26 @@ module ComerDeTapas
|
|
|
42
44
|
|
|
43
45
|
# Load episodes json from EPISODES_JSON_FILE
|
|
44
46
|
def load_episodes
|
|
45
|
-
@episodes ||= JSON.parse(
|
|
47
|
+
@episodes ||= JSON.parse(EPISODES_JSON_FILE.read)
|
|
46
48
|
end
|
|
47
49
|
|
|
48
50
|
# User spefified folder to save episodes.
|
|
49
51
|
# @return [Pathname]
|
|
50
52
|
def save_folder
|
|
51
|
-
Pathname
|
|
53
|
+
Pathname(credentials[:save_path]).expand_path
|
|
52
54
|
end
|
|
53
55
|
|
|
54
56
|
# Download episode in parallel using Actors
|
|
55
57
|
# Powered by Celluloid::IO
|
|
56
58
|
def download_all_tapas!
|
|
57
59
|
episodes.each do |episode|
|
|
58
|
-
FileUtils.cd(save_folder
|
|
60
|
+
FileUtils.cd(save_folder) do
|
|
59
61
|
episode_title = episode['title']
|
|
60
62
|
puts "Downloading Epsiode #{episode_title}..."
|
|
61
63
|
|
|
62
|
-
episode_folder = save_folder.join(sanitized episode_title)
|
|
64
|
+
episode_folder = save_folder.join(sanitized episode_title)
|
|
63
65
|
|
|
64
|
-
FileUtils.mkdir_p episode_folder unless
|
|
66
|
+
FileUtils.mkdir_p episode_folder unless episode_folder.exist?
|
|
65
67
|
|
|
66
68
|
FileUtils.cd episode_folder do
|
|
67
69
|
fetcher = Fetcher.new
|
|
@@ -89,8 +91,8 @@ module ComerDeTapas
|
|
|
89
91
|
# @param [Array] downloadables
|
|
90
92
|
def download_parallelly! downloadables
|
|
91
93
|
downloadables.compact.each do |file, future|
|
|
92
|
-
response = future.value.to_s
|
|
93
94
|
puts "Downloading #{file}..."
|
|
95
|
+
response = future.value.to_s
|
|
94
96
|
IO.write file, response
|
|
95
97
|
puts "#{file} saved."
|
|
96
98
|
end
|
|
@@ -100,19 +102,30 @@ module ComerDeTapas
|
|
|
100
102
|
# @param [Array] file_and_links
|
|
101
103
|
def find_downloadables file_and_links, fetcher
|
|
102
104
|
file_and_links.map do |file_and_link|
|
|
103
|
-
|
|
105
|
+
file_name = file_and_link['filename']
|
|
106
|
+
|
|
107
|
+
# mp4 less than 3MB considered as unfinished. Redownload it.
|
|
108
|
+
FileUtils.rm file_name if small_mp4? file_name
|
|
109
|
+
|
|
110
|
+
next if File.exist? file_name
|
|
104
111
|
|
|
105
112
|
q, v = file_and_link['link'].split('?').last.split('=')
|
|
106
|
-
[
|
|
113
|
+
[file_name, fetcher.future.fetch(DOWNLOAD_URL, cookie, { q => v })]
|
|
107
114
|
end
|
|
108
115
|
end
|
|
109
116
|
|
|
117
|
+
# Return true if file is a mp4 and its size less than 3MB.
|
|
118
|
+
def small_mp4?(file)
|
|
119
|
+
return false unless File.exist? file
|
|
120
|
+
File.size(file) < 3*1024*1024 && File.extname(file) == '.mp4'
|
|
121
|
+
end
|
|
122
|
+
|
|
110
123
|
# mkdir -p ~/.rubytapas
|
|
111
124
|
# touch ~/.rubytapas/.credentials
|
|
112
125
|
def create_rubytapas_files!
|
|
113
|
-
|
|
126
|
+
RUBYTAPAS_DIR.mkpath
|
|
114
127
|
FileUtils.touch CREDENTIAL_FILE
|
|
115
|
-
|
|
128
|
+
CREDENTIAL_FILE.write credential_template
|
|
116
129
|
end
|
|
117
130
|
|
|
118
131
|
# Use to create empty credential file
|
|
@@ -124,8 +137,16 @@ module ComerDeTapas
|
|
|
124
137
|
# Get raw feed data (XML), RSS
|
|
125
138
|
def get_feed_with_basic_auth
|
|
126
139
|
puts 'Authorizing...'
|
|
127
|
-
|
|
128
|
-
|
|
140
|
+
response = HTTP.auth(:basic, authenticate_params).get(FEED_URL).body.to_s
|
|
141
|
+
|
|
142
|
+
if response.empty?
|
|
143
|
+
abort "Authroized failed. Please check your email & password in #{CREDENTIAL_FILE}"
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
if @feed_xml = response
|
|
147
|
+
puts 'Authroized.'
|
|
148
|
+
return true
|
|
149
|
+
end
|
|
129
150
|
end
|
|
130
151
|
|
|
131
152
|
# Params for basic authentication
|
|
@@ -143,6 +164,7 @@ module ComerDeTapas
|
|
|
143
164
|
# @return [Array<Hash>]
|
|
144
165
|
def parse_xml_feed
|
|
145
166
|
puts 'Parsing Episodes...'
|
|
167
|
+
|
|
146
168
|
require 'nokogiri'
|
|
147
169
|
items = Nokogiri::XML(feed_xml).xpath('//item')
|
|
148
170
|
|
|
@@ -176,7 +198,7 @@ module ComerDeTapas
|
|
|
176
198
|
# Write episodes data to ~/.rubytapas/episodes.json
|
|
177
199
|
def save_feed_data feed
|
|
178
200
|
puts 'Saving episodes data to ~/.rubytapas/episodes.json...'
|
|
179
|
-
|
|
201
|
+
EPISODES_JSON_FILE.write feed.to_json
|
|
180
202
|
puts 'Saved.'
|
|
181
203
|
end
|
|
182
204
|
|
|
@@ -200,8 +222,8 @@ module ComerDeTapas
|
|
|
200
222
|
# If the episodes json was made of 259_200.seconds.ago (3 days)
|
|
201
223
|
# @return [Boolean] true if episodes.json creation time < 3 days
|
|
202
224
|
def fresh?
|
|
203
|
-
return false unless
|
|
204
|
-
Time.now -
|
|
225
|
+
return false unless EPISODES_JSON_FILE.exist?
|
|
226
|
+
Time.now - EPISODES_JSON_FILE.ctime < 259_200
|
|
205
227
|
end
|
|
206
228
|
end
|
|
207
229
|
end
|
|
@@ -3,7 +3,7 @@ module ComerDeTapas
|
|
|
3
3
|
KEYS = %w(email password save_path)
|
|
4
4
|
|
|
5
5
|
def initialize
|
|
6
|
-
abort 'Please run `comer_de_tapas init` first' unless
|
|
6
|
+
abort 'Please run `comer_de_tapas init` first' unless CREDENTIAL_FILE.exist?
|
|
7
7
|
|
|
8
8
|
set_subscription_data if subscription_data_valid?
|
|
9
9
|
end
|
|
@@ -30,7 +30,7 @@ module ComerDeTapas
|
|
|
30
30
|
# 65 is when you have a very short email, password, and save_path.
|
|
31
31
|
# So when you filled in data, probably will > 65.
|
|
32
32
|
if File.size(CREDENTIAL_FILE) < 65
|
|
33
|
-
|
|
33
|
+
abort "Did you fill in your subscription data in #{CREDENTIAL_FILE}?"
|
|
34
34
|
return false
|
|
35
35
|
end
|
|
36
36
|
|