picasaweb-backup 0.3.1 → 0.4.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/README.md +2 -2
- data/bin/picasaweb-backup +2 -53
- data/lib/picasaweb-backup.rb +107 -47
- data/lib/version.rb +1 -1
- metadata +2 -2
data/README.md
CHANGED
@@ -23,8 +23,8 @@ Options
|
|
23
23
|
--dir DIR optional directory in which the download should be executed
|
24
24
|
-h, --help print this help section
|
25
25
|
```
|
26
|
-
Create an empty folder
|
27
|
-
content:
|
26
|
+
Create an empty folder and place a file called `account.yml` with the following
|
27
|
+
content (make sure you leave a space after the colon):
|
28
28
|
|
29
29
|
```yaml
|
30
30
|
username: YOUR_USERNAME
|
data/bin/picasaweb-backup
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
#! /usr/bin/env ruby
|
2
2
|
require 'rubygems'
|
3
3
|
require 'optparse'
|
4
4
|
require 'picasaweb-backup'
|
@@ -6,7 +6,6 @@ require 'artii'
|
|
6
6
|
require 'colored'
|
7
7
|
|
8
8
|
opts = {}
|
9
|
-
usage =
|
10
9
|
|
11
10
|
opt_parser = OptionParser.new('Backing up your Picasaweb photos') do |opt|
|
12
11
|
artii = Artii::Base.new :font => "small"
|
@@ -34,58 +33,8 @@ cli = Picasaweb::CLI.new opts
|
|
34
33
|
|
35
34
|
begin
|
36
35
|
|
37
|
-
|
38
|
-
verify_account account
|
39
|
-
client = picasa_client account["username"], account["password"]
|
40
|
-
albums = picasa_albums client
|
41
|
-
dir_name = "Albums"
|
36
|
+
cli.start_backup
|
42
37
|
|
43
|
-
if !File.directory? dir_name
|
44
|
-
Dir.mkdir dir_name
|
45
|
-
end
|
46
|
-
|
47
|
-
Dir.chdir dir_name
|
48
|
-
|
49
|
-
albums.each do |album|
|
50
|
-
|
51
|
-
if !File.directory? album[:title]
|
52
|
-
Dir.mkdir album[:title]
|
53
|
-
cli.print "Creating directory for album '#{album[:title]}'"
|
54
|
-
end
|
55
|
-
|
56
|
-
Dir.chdir album[:title] do
|
57
|
-
cli.print "Checking for new files in '#{album[:title]}'"
|
58
|
-
photos = nil
|
59
|
-
until photos
|
60
|
-
begin
|
61
|
-
photos = picasa_photos client, album
|
62
|
-
rescue GData::Client::ServerError
|
63
|
-
"Server error, retrying\n"
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
downloaded_photos = 0
|
68
|
-
photos.each do |photo|
|
69
|
-
if !File.exists? photo[:title]
|
70
|
-
cli.print " ==> #{photo[:title]}"
|
71
|
-
response = nil
|
72
|
-
until response
|
73
|
-
begin
|
74
|
-
response = client.get photo[:url]
|
75
|
-
rescue GData::Client::ServerError
|
76
|
-
"Server error, retrying\n"
|
77
|
-
end
|
78
|
-
end
|
79
|
-
|
80
|
-
File.open(photo[:title], 'w') { |f| f.write response.body }
|
81
|
-
downloaded_photos += 1
|
82
|
-
end
|
83
|
-
end
|
84
|
-
if downloaded_photos == 0
|
85
|
-
cli.print "==> no new photos found"
|
86
|
-
end
|
87
|
-
end
|
88
|
-
end
|
89
38
|
rescue => e
|
90
39
|
cli.print "ERROR: #{e.message}".red
|
91
40
|
cli.print ""
|
data/lib/picasaweb-backup.rb
CHANGED
@@ -12,9 +12,16 @@ require "rubygems"
|
|
12
12
|
require "gdata"
|
13
13
|
require "logger"
|
14
14
|
|
15
|
+
#monkey-patch logger formatting
|
16
|
+
class Logger
|
17
|
+
def format_message(level, time, progname, msg)
|
18
|
+
"#{time.strftime("%Y-%m-%d %H:%M:%S")} #{msg}\n"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
15
22
|
module Picasaweb
|
16
23
|
class CLI
|
17
|
-
|
24
|
+
ALBUM_DIR = "Albums"
|
18
25
|
def initialize opts
|
19
26
|
@opts = opts
|
20
27
|
|
@@ -24,13 +31,13 @@ module Picasaweb
|
|
24
31
|
|
25
32
|
if @opts[:log]
|
26
33
|
@logger = Logger.new "picasaweb-backup.log", shift_age = "monthly"
|
27
|
-
@logger.datetime_format = "%Y-%m-%d %H:%M"
|
28
34
|
end
|
29
35
|
|
30
36
|
if opts[:dir]
|
31
37
|
self.print "Changing working directory to #{opts[:dir]}"
|
32
38
|
end
|
33
39
|
|
40
|
+
@account = File.open("account.yml", 'r') { |f| YAML.load f }
|
34
41
|
end
|
35
42
|
|
36
43
|
def print msg
|
@@ -41,58 +48,111 @@ module Picasaweb
|
|
41
48
|
end
|
42
49
|
end
|
43
50
|
|
44
|
-
|
45
|
-
|
51
|
+
def verify_account account
|
52
|
+
if account["username"].nil?
|
53
|
+
raise "Please add your username to account.yml"
|
54
|
+
elsif account["password"].nil?
|
55
|
+
raise "Please add your password to account.yml"
|
56
|
+
end
|
57
|
+
end
|
46
58
|
|
47
|
-
def
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
end
|
53
|
-
end
|
59
|
+
def picasa_client(username, password)
|
60
|
+
client = GData::Client::Photos.new
|
61
|
+
client.clientlogin(username, password)
|
62
|
+
client
|
63
|
+
end
|
54
64
|
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
client
|
62
|
-
end
|
65
|
+
def ensure_exists dir
|
66
|
+
if !File.directory? dir
|
67
|
+
Dir.mkdir dir
|
68
|
+
self.print "Creating directory '#{dir}'"
|
69
|
+
end
|
70
|
+
end
|
63
71
|
|
64
|
-
# Retrieves all albums for a user.
|
65
|
-
def
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
end
|
72
|
+
# Retrieves all albums for a user.
|
73
|
+
def get_albums(client, user = nil)
|
74
|
+
uri = "http://picasaweb.google.com/data/feed/api/user/#{user || 'default'}"
|
75
|
+
feed = client.get(uri).to_xml
|
76
|
+
albums = []
|
77
|
+
feed.elements.each('entry') do |entry|
|
78
|
+
next unless entry.elements['gphoto:id']
|
79
|
+
albums << { :id => entry.elements['gphoto:id'].text,
|
80
|
+
:user => entry.elements['gphoto:user'].text,
|
81
|
+
:title => entry.elements['title'].text }
|
82
|
+
end
|
83
|
+
albums
|
84
|
+
end
|
85
|
+
|
86
|
+
def download_album client, album
|
87
|
+
Dir.chdir album[:title] do
|
88
|
+
self.print "Checking for new photos in '#{album[:title]}'"
|
89
|
+
photos = nil
|
90
|
+
until photos
|
91
|
+
begin
|
92
|
+
photos = get_photos client, album
|
93
|
+
rescue GData::Client::ServerError
|
94
|
+
"Server error, retrying\n"
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
downloaded_photos = 0
|
99
|
+
photos.each do |photo|
|
100
|
+
if !File.exists? photo[:title]
|
101
|
+
self.print " ==> #{photo[:title]}"
|
102
|
+
response = nil
|
103
|
+
until response
|
104
|
+
begin
|
105
|
+
response = client.get photo[:url]
|
106
|
+
rescue GData::Client::ServerError
|
107
|
+
"Server error, retrying\n"
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
File.open(photo[:title], 'w') { |f| f.write response.body }
|
112
|
+
downloaded_photos += 1
|
113
|
+
end
|
114
|
+
end
|
115
|
+
if downloaded_photos == 0
|
116
|
+
self.print "==> no new photos found"
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
77
120
|
|
78
|
-
# Retrieves all photos from an album.
|
79
|
-
def
|
80
|
-
|
121
|
+
# Retrieves all photos from an album.
|
122
|
+
def get_photos(client, album)
|
123
|
+
uri = "http://picasaweb.google.com/data/feed/api/user/" +
|
81
124
|
"#{album[:user] || 'default'}/albumid/#{album[:id]}?kind=photo&imgmax=d"
|
82
125
|
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
126
|
+
feed = client.get(uri).to_xml
|
127
|
+
photos = []
|
128
|
+
feed.elements.each('entry') do |entry|
|
129
|
+
next unless entry.elements['gphoto:id']
|
130
|
+
next unless entry.elements['media:group']
|
131
|
+
photo = { :id => entry.elements['gphoto:id'].text,
|
132
|
+
:album_id => entry.elements['gphoto:albumid'].text,
|
133
|
+
:title => entry.elements['title'].text }
|
134
|
+
entry.elements['media:group'].elements.each('media:content') do |content|
|
135
|
+
photo[:url] = content.attribute('url').value
|
136
|
+
end
|
137
|
+
photos << photo
|
138
|
+
end
|
139
|
+
photos
|
140
|
+
end
|
141
|
+
|
142
|
+
def start_backup
|
143
|
+
verify_account @account
|
144
|
+
client = picasa_client @account["username"], @account["password"]
|
145
|
+
albums = get_albums client
|
146
|
+
|
147
|
+
ensure_exists ALBUM_DIR
|
148
|
+
Dir.chdir ALBUM_DIR
|
149
|
+
|
150
|
+
albums.each do |album|
|
151
|
+
ensure_exists album[:title]
|
152
|
+
download_album client, album
|
153
|
+
end
|
154
|
+
|
93
155
|
end
|
94
|
-
photos << photo
|
95
156
|
end
|
96
|
-
photos
|
97
157
|
end
|
98
158
|
|
data/lib/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: picasaweb-backup
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
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-
|
12
|
+
date: 2012-08-08 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: gdata_19
|