picasa-downloader 0.0.3 → 0.0.4
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/Rakefile +1 -0
- data/TODO.md +4 -1
- data/bin/picasa-downloader +39 -9
- data/features/picasa-downloader.feature +21 -0
- data/features/support/env.rb +22 -0
- data/lib/picasa-downloader/client.rb +30 -10
- data/lib/picasa-downloader/errors.rb +9 -1
- data/lib/picasa-downloader/photo.rb +4 -0
- data/picasa-downloader.gemspec +3 -1
- data/spec/client_spec.rb +3 -3
- metadata +36 -2
data/Rakefile
CHANGED
data/TODO.md
CHANGED
data/bin/picasa-downloader
CHANGED
@@ -6,28 +6,58 @@ require 'gli'
|
|
6
6
|
|
7
7
|
include GLI
|
8
8
|
|
9
|
-
default_download_dir=ENV['HOME'] + '/Picasa-albums'
|
9
|
+
@default_download_dir=ENV['HOME'] + '/Picasa-albums'
|
10
10
|
|
11
11
|
program_desc 'Picasa downloader'
|
12
12
|
|
13
13
|
desc 'Download all albums'
|
14
|
-
long_desc "Download all Picasa albums into #{default_download_dir}"
|
14
|
+
long_desc "Download all Picasa albums into #{@default_download_dir}"
|
15
15
|
command [:all] do |c|
|
16
16
|
c.action do |global_options,options,args|
|
17
|
+
client = authenticate
|
18
|
+
albums = list_albums(client)
|
19
|
+
puts "Downloading #{albums.length} albums into #{@default_download_dir}..."
|
20
|
+
albums.each { |album|
|
21
|
+
download(album, client)
|
22
|
+
}
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
desc 'Download one album'
|
27
|
+
command [:album] do |c|
|
28
|
+
c.action do |global_options,options,args|
|
29
|
+
if args.length == 0
|
30
|
+
raise PicasaDownloader::AlbumNameNotSpecified
|
31
|
+
end
|
32
|
+
album_regex = args[0]
|
33
|
+
client = authenticate
|
34
|
+
albums = list_albums(client)
|
35
|
+
albums_to_download = albums.select { |album|
|
36
|
+
album.title.match(album_regex)
|
37
|
+
}
|
38
|
+
albums_to_download.each { |album|
|
39
|
+
download(album, client)
|
40
|
+
}
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def download(album, client)
|
45
|
+
puts " downloading #{album.title}..."
|
46
|
+
PicasaDownloader::AlbumPersister.
|
47
|
+
new(client, album, @default_download_dir).download
|
48
|
+
end
|
49
|
+
|
50
|
+
def authenticate
|
17
51
|
credentials = PicasaDownloader::EnvCredentials.new
|
18
52
|
raise PicasaDownloader::EnvironmentalCredentialsNotSet unless
|
19
53
|
credentials.is_configured?
|
20
54
|
puts "Authenticating..."
|
21
55
|
client = PicasaDownloader::Client.new(credentials)
|
56
|
+
end
|
57
|
+
|
58
|
+
def list_albums(client)
|
22
59
|
puts "Fetching the album list..."
|
23
60
|
albums = client.list_albums
|
24
|
-
puts "Downloading #{albums.length} albums into #{default_download_dir}..."
|
25
|
-
albums.each { |album|
|
26
|
-
puts " downloading #{album.title}..."
|
27
|
-
PicasaDownloader::AlbumPersister.
|
28
|
-
new(client, album, default_download_dir).download
|
29
|
-
}
|
30
|
-
end
|
31
61
|
end
|
32
62
|
|
33
63
|
exit GLI.run(ARGV)
|
@@ -0,0 +1,21 @@
|
|
1
|
+
Feature: Picasa downloader
|
2
|
+
|
3
|
+
In order to conveniently download my photos from Google Picasa
|
4
|
+
As a geek
|
5
|
+
I want to run picasa-downloader and see photo albums appearing on my local disk
|
6
|
+
|
7
|
+
Scenario: Run picasa-downloader without arguments
|
8
|
+
When I run `picasa-downloader`
|
9
|
+
Then the output should contain:
|
10
|
+
"""
|
11
|
+
Picasa downloader
|
12
|
+
|
13
|
+
usage: picasa-downloader [global options] command [command options]
|
14
|
+
"""
|
15
|
+
|
16
|
+
Scenario: Try downloading single album with insufficient CLI arguments
|
17
|
+
When I run `picasa-downloader album`
|
18
|
+
Then the output should contain:
|
19
|
+
"""
|
20
|
+
error: Album name is not specified.
|
21
|
+
"""
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'bundler'
|
3
|
+
|
4
|
+
Bundler.require
|
5
|
+
|
6
|
+
require 'aruba/cucumber'
|
7
|
+
require 'cucumber/rspec/doubles'
|
8
|
+
|
9
|
+
# Following from 'aruba/cucumber'
|
10
|
+
Before do
|
11
|
+
@__aruba_original_paths = (ENV['PATH'] || '').split(File::PATH_SEPARATOR)
|
12
|
+
ENV['PATH'] = ([File.expand_path('bin')] + @__aruba_original_paths).join(File::PATH_SEPARATOR)
|
13
|
+
end
|
14
|
+
|
15
|
+
After do
|
16
|
+
ENV['PATH'] = @__aruba_original_paths.join(File::PATH_SEPARATOR)
|
17
|
+
end
|
18
|
+
# End of following from 'aruba/cucumber'
|
19
|
+
|
20
|
+
Then /^the file "([^"]*)" should contain:$/ do |file, exact_content|
|
21
|
+
check_file_content(file, exact_content, true)
|
22
|
+
end
|
@@ -19,30 +19,50 @@ module PicasaDownloader
|
|
19
19
|
doc = to_xml(
|
20
20
|
"https://picasaweb.google.com/data/feed/api/user/default/albumid/#{album_id}?imgmax=d")
|
21
21
|
doc.css("entry").map { |e|
|
22
|
+
timestamp = e.css("tags time")
|
23
|
+
timestamp = e.css("timestamp") unless timestamp
|
22
24
|
Photo.new(
|
23
25
|
e.xpath("group/content/@url").to_s,
|
24
26
|
# Google includes the milliseconds in the timestamp:
|
25
|
-
|
27
|
+
timestamp.inner_text.to_i / 1000,
|
26
28
|
e.css("size").inner_text.to_i,
|
27
29
|
e.css("title").first.inner_text)
|
28
30
|
}
|
29
31
|
end
|
30
32
|
|
31
33
|
def download_photo(photo)
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
34
|
+
if photo.has_video?
|
35
|
+
# Downloading videos is not supported yet
|
36
|
+
else
|
37
|
+
with_retry {
|
38
|
+
uri = URI.parse(photo.url)
|
39
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
40
|
+
request = Net::HTTP::Get.new(uri.request_uri)
|
41
|
+
http.use_ssl = true
|
42
|
+
response = http.request(request)
|
43
|
+
raise "Response not ok, was #{response.code}" unless
|
44
|
+
response.code.to_i.between? 200, 299
|
45
|
+
response.body
|
46
|
+
}
|
41
47
|
end
|
42
48
|
end
|
43
49
|
|
44
50
|
private
|
45
51
|
|
52
|
+
def with_retry
|
53
|
+
retries = [3, 5]
|
54
|
+
begin
|
55
|
+
yield
|
56
|
+
rescue Exception
|
57
|
+
if delay = retries.shift
|
58
|
+
sleep delay
|
59
|
+
retry
|
60
|
+
else
|
61
|
+
raise
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
46
66
|
def to_xml(gdata_url)
|
47
67
|
response = @gd.get(gdata_url)
|
48
68
|
xml = response.to_xml.to_s
|
@@ -3,7 +3,15 @@ module PicasaDownloader
|
|
3
3
|
end
|
4
4
|
|
5
5
|
class EnvironmentalCredentialsNotSet < PicasaDownloaderError
|
6
|
-
def initialize(message =
|
6
|
+
def initialize(message =
|
7
|
+
'Cannot authenticate - environmental settings missing. Please set the environmental values PICASA_USERNAME and PICASA_PASSWORD.')
|
8
|
+
super(message)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
class AlbumNameNotSpecified < PicasaDownloaderError
|
13
|
+
def initialize(message =
|
14
|
+
'Album name is not specified.')
|
7
15
|
super(message)
|
8
16
|
end
|
9
17
|
end
|
data/picasa-downloader.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = 'picasa-downloader'
|
3
|
-
s.version = '0.0.
|
3
|
+
s.version = '0.0.4'
|
4
4
|
s.license = 'MIT'
|
5
5
|
s.summary = 'Download your Google Picasa photo albums'
|
6
6
|
s.description =
|
@@ -26,4 +26,6 @@ Gem::Specification.new do |s|
|
|
26
26
|
s.add_development_dependency 'rspec'
|
27
27
|
s.add_development_dependency 'vcr'
|
28
28
|
s.add_development_dependency 'webmock'
|
29
|
+
s.add_development_dependency 'cucumber'
|
30
|
+
s.add_development_dependency 'aruba', '>= 0.4.7'
|
29
31
|
end
|
data/spec/client_spec.rb
CHANGED
@@ -36,13 +36,13 @@ module PicasaDownloader
|
|
36
36
|
|
37
37
|
it "downloads photos photos of an album" do
|
38
38
|
with_cassettes {
|
39
|
-
|
40
|
-
|
39
|
+
albums = @client.list_albums
|
40
|
+
photos = @client.list_photos(albums.first.id)
|
41
41
|
def jpeg?(data)
|
42
42
|
# See http://www.astro.keele.ac.uk/oldusers/rno/Computing/File_magic.html
|
43
43
|
return data[0, 4] == "\xff\xd8\xff\xe0"
|
44
44
|
end
|
45
|
-
bytes = @client.download_photo(
|
45
|
+
bytes = @client.download_photo(photos.first)
|
46
46
|
jpeg?(bytes).should be true
|
47
47
|
}
|
48
48
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: picasa-downloader
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-07-
|
12
|
+
date: 2012-07-22 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: gdata_19
|
@@ -139,6 +139,38 @@ dependencies:
|
|
139
139
|
- - ! '>='
|
140
140
|
- !ruby/object:Gem::Version
|
141
141
|
version: '0'
|
142
|
+
- !ruby/object:Gem::Dependency
|
143
|
+
name: cucumber
|
144
|
+
requirement: !ruby/object:Gem::Requirement
|
145
|
+
none: false
|
146
|
+
requirements:
|
147
|
+
- - ! '>='
|
148
|
+
- !ruby/object:Gem::Version
|
149
|
+
version: '0'
|
150
|
+
type: :development
|
151
|
+
prerelease: false
|
152
|
+
version_requirements: !ruby/object:Gem::Requirement
|
153
|
+
none: false
|
154
|
+
requirements:
|
155
|
+
- - ! '>='
|
156
|
+
- !ruby/object:Gem::Version
|
157
|
+
version: '0'
|
158
|
+
- !ruby/object:Gem::Dependency
|
159
|
+
name: aruba
|
160
|
+
requirement: !ruby/object:Gem::Requirement
|
161
|
+
none: false
|
162
|
+
requirements:
|
163
|
+
- - ! '>='
|
164
|
+
- !ruby/object:Gem::Version
|
165
|
+
version: 0.4.7
|
166
|
+
type: :development
|
167
|
+
prerelease: false
|
168
|
+
version_requirements: !ruby/object:Gem::Requirement
|
169
|
+
none: false
|
170
|
+
requirements:
|
171
|
+
- - ! '>='
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: 0.4.7
|
142
174
|
description: This Gem makes it convenient to download Picasa albums via command-line
|
143
175
|
interface
|
144
176
|
email: lauri.lehmijoki@iki.fi
|
@@ -154,6 +186,8 @@ files:
|
|
154
186
|
- Rakefile
|
155
187
|
- TODO.md
|
156
188
|
- bin/picasa-downloader
|
189
|
+
- features/picasa-downloader.feature
|
190
|
+
- features/support/env.rb
|
157
191
|
- fixtures/cassettes/google-login.yml
|
158
192
|
- fixtures/cassettes/picasa-album.yml
|
159
193
|
- fixtures/cassettes/picasa-albums.yml
|