neves-ruby_picasa 0.2.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.
- data/History.txt +22 -0
- data/README.txt +79 -0
- data/lib/ruby_picasa/types.rb +315 -0
- data/lib/ruby_picasa.rb +397 -0
- data/spec/ruby_picasa/types_spec.rb +303 -0
- data/spec/ruby_picasa_spec.rb +382 -0
- data/spec/sample/album.atom +141 -0
- data/spec/sample/recent.atom +111 -0
- data/spec/sample/search.atom +99 -0
- data/spec/sample/user.atom +107 -0
- data/spec/spec.opts +2 -0
- data/spec/spec_helper.rb +13 -0
- metadata +76 -0
@@ -0,0 +1,382 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), 'spec_helper')
|
2
|
+
|
3
|
+
class Picasa
|
4
|
+
class << self
|
5
|
+
public :parse_url
|
6
|
+
end
|
7
|
+
public :auth_header, :with_cache, :class_from_xml, :xml_data
|
8
|
+
end
|
9
|
+
|
10
|
+
describe 'Picasa class methods' do
|
11
|
+
it 'should generate an authorization_url' do
|
12
|
+
return_url = 'http://example.com/example?example=ex'
|
13
|
+
url = Picasa.authorization_url(return_url)
|
14
|
+
url.should include(CGI.escape(return_url))
|
15
|
+
url.should match(/session=1/)
|
16
|
+
end
|
17
|
+
|
18
|
+
describe 'token_in_request?' do
|
19
|
+
it 'should be nil if no token' do
|
20
|
+
request = mock('request', :parameters => { })
|
21
|
+
Picasa.token_in_request?(request).should be_nil
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'should not be nil if there is a token' do
|
25
|
+
request = mock('request', :parameters => { 'token' => 'abc' })
|
26
|
+
Picasa.token_in_request?(request).should_not be_nil
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
describe 'token_from_request' do
|
31
|
+
it 'should pluck the token from the request' do
|
32
|
+
request = mock('request', :parameters => { 'token' => 'abc' })
|
33
|
+
Picasa.token_from_request(request).should == 'abc'
|
34
|
+
end
|
35
|
+
it 'should raise if no token is present' do
|
36
|
+
request = mock('request', :parameters => { })
|
37
|
+
lambda do
|
38
|
+
Picasa.token_from_request(request)
|
39
|
+
end.should raise_error(RubyPicasa::PicasaTokenError)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'should authorize a request' do
|
44
|
+
Picasa.expects(:token_from_request).with(:request).returns('abc')
|
45
|
+
picasa = mock('picasa')
|
46
|
+
Picasa.expects(:new).with('abc').returns(picasa)
|
47
|
+
picasa.expects(:authorize_token!).with()
|
48
|
+
Picasa.authorize_request(:request).should == picasa
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'should recognize absolute urls' do
|
52
|
+
Picasa.is_url?('http://something.com').should be_true
|
53
|
+
Picasa.is_url?('https://something.com').should be_true
|
54
|
+
Picasa.is_url?('12323412341').should_not be_true
|
55
|
+
end
|
56
|
+
|
57
|
+
it 'should allow host change' do
|
58
|
+
Picasa.host = 'abc'
|
59
|
+
Picasa.host.should == 'abc'
|
60
|
+
end
|
61
|
+
|
62
|
+
describe 'builders' do
|
63
|
+
it 'should create a public user by an id' do
|
64
|
+
picasa = mock('picasa')
|
65
|
+
Picasa.expects(:new).with(nil).returns(picasa)
|
66
|
+
picasa.expects(:user).with("user_id", {})
|
67
|
+
Picasa.public_user("user_id")
|
68
|
+
end
|
69
|
+
|
70
|
+
it 'should create a public album by an user_id and album_id' do
|
71
|
+
picasa = mock('picasa')
|
72
|
+
Picasa.expects(:new).with(nil).returns(picasa)
|
73
|
+
picasa.expects(:album).with("album_id", {:user_id => "user_id"})
|
74
|
+
Picasa.public_album_by_id("user_id", "album_id")
|
75
|
+
end
|
76
|
+
|
77
|
+
it 'should create a public album by an user_id and album_name' do
|
78
|
+
picasa = mock('picasa')
|
79
|
+
Picasa.expects(:new).with(nil).returns(picasa)
|
80
|
+
picasa.expects(:album_by_name).with("album_name", {:user_id => "user_id"})
|
81
|
+
Picasa.public_album_by_name("user_id", "album_name")
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
describe 'path' do
|
86
|
+
it 'should use parse_url and add options' do
|
87
|
+
Picasa.expects(:parse_url).with({}).returns(['url', {'a' => 'b'}])
|
88
|
+
Picasa.path({}).should ==
|
89
|
+
"url?a=b"
|
90
|
+
end
|
91
|
+
it 'should build the url from user_id and album_id and add options' do
|
92
|
+
hash = { :user_id => '123', :album_id => '321' }
|
93
|
+
Picasa.expects(:parse_url).with(hash).returns([nil, {}])
|
94
|
+
Picasa.path(hash).should ==
|
95
|
+
"/data/feed/api/user/123/albumid/321?kind=photo"
|
96
|
+
end
|
97
|
+
it 'should build the url from user_id and album and add options' do
|
98
|
+
hash = { :user_id => '123', :album => 'album_name' }
|
99
|
+
Picasa.expects(:parse_url).with(hash).returns([nil, {}])
|
100
|
+
Picasa.path(hash).should ==
|
101
|
+
"/data/feed/api/user/123/album/album_name?kind=photo"
|
102
|
+
end
|
103
|
+
it 'should build the url from special user_id all' do
|
104
|
+
hash = { :user_id => 'all' }
|
105
|
+
Picasa.expects(:parse_url).with(hash).returns([nil, {}])
|
106
|
+
Picasa.path(hash).should ==
|
107
|
+
"/data/feed/api/all"
|
108
|
+
end
|
109
|
+
[ :max_results, :start_index, :tag, :q, :kind,
|
110
|
+
:access, :bbox, :l].each do |arg|
|
111
|
+
it "should add #{ arg } to options" do
|
112
|
+
Picasa.path(:url => 'url', arg => '!value').should ==
|
113
|
+
"url?#{ arg.to_s.dasherize }=%21value"
|
114
|
+
end
|
115
|
+
end
|
116
|
+
[ :imgmax, :thumbsize ].each do |arg|
|
117
|
+
it "should raise PicasaError with invalid #{ arg } option" do
|
118
|
+
lambda do
|
119
|
+
Picasa.path(:url => 'url', arg => 'invalid')
|
120
|
+
end.should raise_error(RubyPicasa::PicasaError)
|
121
|
+
end
|
122
|
+
end
|
123
|
+
[ :imgmax, :thumbsize ].each do |arg|
|
124
|
+
it "should add #{ arg } to options" do
|
125
|
+
Picasa.path(:url => 'url', arg => '72').should ==
|
126
|
+
"url?#{ arg.to_s.dasherize }=72"
|
127
|
+
end
|
128
|
+
end
|
129
|
+
it 'should ignore unknown options' do
|
130
|
+
Picasa.path(:url => 'place', :eggs => 'over_easy').should == 'place'
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
describe 'parse_url' do
|
135
|
+
it 'should prefer url' do
|
136
|
+
hash = { :url => 'url', :user_id => 'user_id', :album_id => 'album_id' }
|
137
|
+
Picasa.parse_url(hash).should == ['url', {}]
|
138
|
+
end
|
139
|
+
it 'should next prefer user_id' do
|
140
|
+
Picasa.stubs(:is_url?).returns true
|
141
|
+
hash = { :user_id => 'user_id', :album_id => 'album_id' }
|
142
|
+
Picasa.parse_url(hash).should == ['user_id', {}]
|
143
|
+
end
|
144
|
+
it 'should use album_id' do
|
145
|
+
Picasa.stubs(:is_url?).returns true
|
146
|
+
hash = { :album_id => 'album_id' }
|
147
|
+
Picasa.parse_url(hash).should == ['album_id', {}]
|
148
|
+
end
|
149
|
+
it 'should split up the params' do
|
150
|
+
hash = { :url => 'url?specs=fun%21' }
|
151
|
+
Picasa.parse_url(hash).should == ['url', { 'specs' => 'fun!' }]
|
152
|
+
end
|
153
|
+
it 'should not use non-url user_id or album_id' do
|
154
|
+
hash = { :user_id => 'user_id', :album_id => 'album_id' }
|
155
|
+
Picasa.parse_url(hash).should == [nil, {}]
|
156
|
+
end
|
157
|
+
it 'should handle with no relevant options' do
|
158
|
+
hash = { :saoetu => 'aeu' }
|
159
|
+
Picasa.parse_url(hash).should == [nil, {}]
|
160
|
+
end
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
describe Picasa do
|
165
|
+
def body(text)
|
166
|
+
#open_file('user_feed.atom').read
|
167
|
+
@response.stubs(:body).returns(text)
|
168
|
+
end
|
169
|
+
|
170
|
+
before do
|
171
|
+
@response = mock('response')
|
172
|
+
@response.stubs(:code).returns '200'
|
173
|
+
@http = mock('http')
|
174
|
+
@http.stubs(:get).returns @response
|
175
|
+
Net::HTTP.stubs(:new).returns(@http)
|
176
|
+
@p = Picasa.new 'token'
|
177
|
+
end
|
178
|
+
|
179
|
+
it 'should initialize' do
|
180
|
+
@p.token.should == 'token'
|
181
|
+
end
|
182
|
+
|
183
|
+
it 'should initialize with no token for public access' do
|
184
|
+
picasa = Picasa.new
|
185
|
+
picasa.token.should == nil
|
186
|
+
end
|
187
|
+
|
188
|
+
describe 'authorize_token!' do
|
189
|
+
before do
|
190
|
+
@p.expects(:auth_header).returns('Authorization' => 'etc')
|
191
|
+
@http.expects(:use_ssl=).with true
|
192
|
+
@http.expects(:get).with('/accounts/accounts/AuthSubSessionToken',
|
193
|
+
'Authorization' => 'etc').returns(@response)
|
194
|
+
end
|
195
|
+
|
196
|
+
it 'should set the new token' do
|
197
|
+
body 'Token=hello'
|
198
|
+
@p.authorize_token!
|
199
|
+
@p.token.should == 'hello'
|
200
|
+
end
|
201
|
+
|
202
|
+
it 'should raise if the token is not found' do
|
203
|
+
body 'nothing to see here'
|
204
|
+
lambda do
|
205
|
+
@p.authorize_token!
|
206
|
+
end.should raise_error(RubyPicasa::PicasaTokenError)
|
207
|
+
@p.token.should == 'token'
|
208
|
+
end
|
209
|
+
end
|
210
|
+
|
211
|
+
it 'should get the user' do
|
212
|
+
@p.expects(:get).with(:user_id => nil)
|
213
|
+
@p.user
|
214
|
+
end
|
215
|
+
|
216
|
+
it 'should get an album' do
|
217
|
+
@p.expects(:get).with(:album_id => 'album')
|
218
|
+
@p.album('album')
|
219
|
+
end
|
220
|
+
|
221
|
+
it 'should get an album by its name' do
|
222
|
+
@p.expects(:get).with(:album => 'album_name')
|
223
|
+
@p.album_by_name('album_name')
|
224
|
+
end
|
225
|
+
|
226
|
+
it 'should get a url' do
|
227
|
+
@p.expects(:get).with(:url => 'the url')
|
228
|
+
@p.get_url('the url')
|
229
|
+
end
|
230
|
+
|
231
|
+
describe 'search' do
|
232
|
+
it 'should prefer given options' do
|
233
|
+
@p.expects(:get).with(:q => 'q', :max_results => 20, :user_id => 'me', :kind => 'comments')
|
234
|
+
@p.search('q', :max_results => 20, :user_id => 'me', :kind => 'comments', :q => 'wrong')
|
235
|
+
end
|
236
|
+
it 'should have good defaults' do
|
237
|
+
@p.expects(:get).with(:q => 'q', :max_results => 10, :user_id => 'all', :kind => 'photo')
|
238
|
+
@p.search('q')
|
239
|
+
end
|
240
|
+
end
|
241
|
+
|
242
|
+
it 'should get recent photos' do
|
243
|
+
@p.expects(:get).with(:recent_photos => true, :max_results => 10)
|
244
|
+
@p.recent_photos :max_results => 10
|
245
|
+
end
|
246
|
+
|
247
|
+
describe 'album_by_title' do
|
248
|
+
before do
|
249
|
+
@a1 = mock('a1')
|
250
|
+
@a2 = mock('a2')
|
251
|
+
@a1.stubs(:title).returns('a1')
|
252
|
+
@a2.stubs(:title).returns('a2')
|
253
|
+
albums = [ @a1, @a2 ]
|
254
|
+
user = mock('user', :albums => albums)
|
255
|
+
@p.expects(:user).returns(user)
|
256
|
+
end
|
257
|
+
|
258
|
+
it 'should match the title string' do
|
259
|
+
@a2.expects(:load).with({}).returns :result
|
260
|
+
@p.album_by_title('a2').should == :result
|
261
|
+
end
|
262
|
+
|
263
|
+
it 'should match a regex' do
|
264
|
+
@a1.expects(:load).with({}).returns :result
|
265
|
+
@p.album_by_title(/a\d/).should == :result
|
266
|
+
end
|
267
|
+
|
268
|
+
it 'should return nil' do
|
269
|
+
@p.album_by_title('zzz').should be_nil
|
270
|
+
end
|
271
|
+
end
|
272
|
+
|
273
|
+
describe 'xml' do
|
274
|
+
it 'should return the body with a 200 status' do
|
275
|
+
body 'xml goes here'
|
276
|
+
@p.xml.should == 'xml goes here'
|
277
|
+
end
|
278
|
+
it 'should return nil with a non-200 status' do
|
279
|
+
body 'xml goes here'
|
280
|
+
@response.expects(:code).returns '404'
|
281
|
+
@p.xml.should be_nil
|
282
|
+
end
|
283
|
+
end
|
284
|
+
|
285
|
+
describe 'get' do
|
286
|
+
it 'should call class_from_xml if with_cache yields' do
|
287
|
+
@p.expects(:with_cache).with({}).yields(:xml).returns(:result)
|
288
|
+
@p.expects(:class_from_xml).with(:xml)
|
289
|
+
@p.send(:get).should == :result
|
290
|
+
end
|
291
|
+
|
292
|
+
it 'should do nothing if with_cache does not yield' do
|
293
|
+
@p.expects(:with_cache).with({}) # doesn't yield
|
294
|
+
@p.expects(:class_from_xml).never
|
295
|
+
@p.send(:get).should be_nil
|
296
|
+
end
|
297
|
+
end
|
298
|
+
|
299
|
+
describe 'auth_header' do
|
300
|
+
it 'should build an AuthSub header' do
|
301
|
+
@p.auth_header.should == { "Authorization" => %{AuthSub token="token"} }
|
302
|
+
end
|
303
|
+
|
304
|
+
it 'should do nothing' do
|
305
|
+
p = Picasa.new nil
|
306
|
+
p.auth_header.should == { }
|
307
|
+
end
|
308
|
+
end
|
309
|
+
|
310
|
+
describe 'with_cache' do
|
311
|
+
it 'yields fresh xml' do
|
312
|
+
body 'fresh xml'
|
313
|
+
yielded = false
|
314
|
+
@p.with_cache(:url => 'place') do |xml|
|
315
|
+
yielded = true
|
316
|
+
xml.should == 'fresh xml'
|
317
|
+
end
|
318
|
+
yielded.should be_true
|
319
|
+
end
|
320
|
+
|
321
|
+
it 'yields cached xml' do
|
322
|
+
@p.instance_variable_get('@request_cache')['place'] = 'some xml'
|
323
|
+
yielded = false
|
324
|
+
@p.with_cache(:url => 'place') do |xml|
|
325
|
+
yielded = true
|
326
|
+
xml.should == 'some xml'
|
327
|
+
end
|
328
|
+
yielded.should be_true
|
329
|
+
end
|
330
|
+
end
|
331
|
+
|
332
|
+
describe 'xml_data' do
|
333
|
+
it 'should extract categories from the xml' do
|
334
|
+
xml, feed_schema, entry_schema = @p.xml_data(open_file('album.atom'))
|
335
|
+
xml.should be_an_instance_of(Nokogiri::XML::Element)
|
336
|
+
feed_schema.should == 'http://schemas.google.com/photos/2007#album'
|
337
|
+
entry_schema.should == 'http://schemas.google.com/photos/2007#photo'
|
338
|
+
end
|
339
|
+
|
340
|
+
it 'should handle nil' do
|
341
|
+
xml, feed_schema, entry_schema = @p.xml_data(nil)
|
342
|
+
xml.should be_nil
|
343
|
+
end
|
344
|
+
|
345
|
+
it 'should handle bad xml' do
|
346
|
+
xml, feed_schema, entry_schema = @p.xml_data('<entry>something went wrong')
|
347
|
+
xml.should_not be_nil
|
348
|
+
feed_schema.should be_nil
|
349
|
+
entry_schema.should be_nil
|
350
|
+
end
|
351
|
+
end
|
352
|
+
|
353
|
+
describe 'class_from_xml' do
|
354
|
+
before do
|
355
|
+
@user = 'http://schemas.google.com/photos/2007#user'
|
356
|
+
@album = 'http://schemas.google.com/photos/2007#album'
|
357
|
+
@photo = 'http://schemas.google.com/photos/2007#photo'
|
358
|
+
end
|
359
|
+
|
360
|
+
describe 'valid feed category types' do
|
361
|
+
def to_create(klass, feed, entry)
|
362
|
+
@object = mock('object', :session= => nil)
|
363
|
+
@p.expects(:xml_data).with(:xml).returns([:xml, feed, entry])
|
364
|
+
klass.expects(:new).with(:xml, @p).returns(@object)
|
365
|
+
@p.class_from_xml(:xml)
|
366
|
+
end
|
367
|
+
it('user album') { to_create RubyPicasa::User, @user, @album }
|
368
|
+
it('user photo') { to_create RubyPicasa::RecentPhotos, @user, @photo }
|
369
|
+
it('album nil') { to_create RubyPicasa::Album, @album, nil }
|
370
|
+
it('album photo') { to_create RubyPicasa::Album, @album, @photo }
|
371
|
+
it('photo nil') { to_create RubyPicasa::Photo, @photo, nil }
|
372
|
+
it('photo photo') { to_create RubyPicasa::Search, @photo, @photo }
|
373
|
+
end
|
374
|
+
|
375
|
+
it 'should raise an error for invalid feed category types' do
|
376
|
+
@p.expects(:xml_data).with(:xml).returns([:xml, @album, @user])
|
377
|
+
lambda do
|
378
|
+
@p.class_from_xml(:xml)
|
379
|
+
end.should raise_error(RubyPicasa::PicasaError)
|
380
|
+
end
|
381
|
+
end
|
382
|
+
end
|
@@ -0,0 +1,141 @@
|
|
1
|
+
<?xml version='1.0' encoding='utf-8'?>
|
2
|
+
<feed xmlns='http://www.w3.org/2005/atom'
|
3
|
+
xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/'
|
4
|
+
xmlns:exif='http://schemas.google.com/photos/exif/2007'
|
5
|
+
xmlns:geo='http://www.w3.org/2003/01/geo/wgs84_pos#'
|
6
|
+
xmlns:gml='http://www.opengis.net/gml'
|
7
|
+
xmlns:georss='http://www.georss.org/georss'
|
8
|
+
xmlns:photo='http://www.pheed.com/pheed/'
|
9
|
+
xmlns:media='http://search.yahoo.com/mrss/'
|
10
|
+
xmlns:batch='http://schemas.google.com/gdata/batch'
|
11
|
+
xmlns:gphoto='http://schemas.google.com/photos/2007'>
|
12
|
+
<id>
|
13
|
+
http://picasaweb.google.com/data/feed/api/user/default/albumid/5228155363249705041</id>
|
14
|
+
<updated>2008-08-15T19:01:04.000Z</updated>
|
15
|
+
<category scheme='http://schemas.google.com/g/2005#kind'
|
16
|
+
term='http://schemas.google.com/photos/2007#album' />
|
17
|
+
<title type='text'>lolcats</title>
|
18
|
+
<subtitle type='text'>Hilarious Felines</subtitle>
|
19
|
+
<rights type='text'>public</rights>
|
20
|
+
<icon>
|
21
|
+
http://lh5.ggpht.com/liz/SI4jmlkNUFE/AAAAAAAAAzU/J1V3PUhHEoI/s160-c/Lolcats.jpg</icon>
|
22
|
+
<link rel='http://schemas.google.com/g/2005#feed'
|
23
|
+
type='application/atom+xml'
|
24
|
+
href='http://picasaweb.google.com/data/feed/api/user/liz/albumid/5228155363249705041' />
|
25
|
+
<link rel='http://schemas.google.com/g/2005#post'
|
26
|
+
type='application/atom+xml'
|
27
|
+
href='http://picasaweb.google.com/data/feed/api/user/liz/albumid/5228155363249705041' />
|
28
|
+
<link rel='alternate' type='text/html'
|
29
|
+
href='http://picasaweb.google.com/liz/Lolcats' />
|
30
|
+
<link rel='http://schemas.google.com/photos/2007#slideshow'
|
31
|
+
type='application/x-shockwave-flash'
|
32
|
+
href='http://picasaweb.google.com/s/c/bin/slideshow.swf?host=picasaweb.google.com&RGB=0x000000&feed=http%3A%2F%2Fpicasaweb.google.com%2Fdata%2Ffeed%2Fapi%2Fuser%2Fliz%2Falbumid%2F5228155363249705041%3Falt%3Drss' />
|
33
|
+
<link rel='http://schemas.google.com/photos/2007#report'
|
34
|
+
type='text/html'
|
35
|
+
href='http://picasaweb.google.com/lh/reportAbuse?uname=liz&aid=5228155363249705041' />
|
36
|
+
<link rel='self' type='application/atom+xml'
|
37
|
+
href='http://picasaweb.google.com/data/feed/api/user/liz/albumid/5228155363249705041?start-index=1&max-results=1000' />
|
38
|
+
<author>
|
39
|
+
<name>Liz</name>
|
40
|
+
<uri>http://picasaweb.google.com/liz</uri>
|
41
|
+
</author>
|
42
|
+
<generator version='1.00' uri='http://picasaweb.google.com/'>
|
43
|
+
Picasaweb</generator>
|
44
|
+
<openSearch:totalResults>1</openSearch:totalResults>
|
45
|
+
<openSearch:startIndex>1</openSearch:startIndex>
|
46
|
+
<openSearch:itemsPerPage>1000</openSearch:itemsPerPage>
|
47
|
+
<gphoto:id>5228155363249705041</gphoto:id>
|
48
|
+
<gphoto:name>Lolcats</gphoto:name>
|
49
|
+
<gphoto:location>mountain view, ca</gphoto:location>
|
50
|
+
<gphoto:access>public</gphoto:access>
|
51
|
+
<gphoto:timestamp>1217228400000</gphoto:timestamp>
|
52
|
+
<gphoto:numphotos>1</gphoto:numphotos>
|
53
|
+
<gphoto:numphotosremaining>499</gphoto:numphotosremaining>
|
54
|
+
<gphoto:bytesUsed>23044</gphoto:bytesUsed>
|
55
|
+
<gphoto:user>liz</gphoto:user>
|
56
|
+
<gphoto:nickname>Liz</gphoto:nickname>
|
57
|
+
<gphoto:commentingEnabled>true</gphoto:commentingEnabled>
|
58
|
+
<gphoto:commentCount>0</gphoto:commentCount>
|
59
|
+
<georss:where>
|
60
|
+
<gml:Point>
|
61
|
+
<gml:pos>37.38911780598221 -122.08638668060303</gml:pos>
|
62
|
+
</gml:Point>
|
63
|
+
<gml:Envelope>
|
64
|
+
<gml:lowerCorner>37.38482151758655
|
65
|
+
-122.0958924293518</gml:lowerCorner>
|
66
|
+
<gml:upperCorner>37.39341409437787
|
67
|
+
-122.07688093185425</gml:upperCorner>
|
68
|
+
</gml:Envelope>
|
69
|
+
</georss:where>
|
70
|
+
<gphoto:allowPrints>true</gphoto:allowPrints>
|
71
|
+
<gphoto:allowDownloads>true</gphoto:allowDownloads>
|
72
|
+
<entry>
|
73
|
+
<id>
|
74
|
+
http://picasaweb.google.com/data/entry/api/user/liz/albumid/5228155363249705041/photoid/5234820919508560306</id>
|
75
|
+
<published>2008-08-15T18:58:44.000Z</published>
|
76
|
+
<updated>2008-08-15T19:01:04.000Z</updated>
|
77
|
+
<category scheme='http://schemas.google.com/g/2005#kind'
|
78
|
+
term='http://schemas.google.com/photos/2007#photo' />
|
79
|
+
<title type='text'>invisible_bike.jpg</title>
|
80
|
+
<summary type='text'></summary>
|
81
|
+
<content type='image/jpeg'
|
82
|
+
src='http://lh5.ggpht.com/liz/SKXR5BoXabI/AAAAAAAAAzs/tJQefyM4mFw/invisible_bike.jpg' />
|
83
|
+
<link rel='http://schemas.google.com/g/2005#feed'
|
84
|
+
type='application/atom+xml'
|
85
|
+
href='http://picasaweb.google.com/data/feed/api/user/liz/albumid/5228155363249705041/photoid/5234820919508560306' />
|
86
|
+
<link rel='alternate' type='text/html'
|
87
|
+
href='http://picasaweb.google.com/lh/photo/THdOPB27qGrofntiI91-8w' />
|
88
|
+
<link rel='self' type='application/atom+xml'
|
89
|
+
href='http://picasaweb.google.com/data/entry/api/user/liz/albumid/5228155363249705041/photoid/5234820919508560306' />
|
90
|
+
<link rel='edit' type='application/atom+xml'
|
91
|
+
href='http://picasaweb.google.com/data/entry/api/user/liz/albumid/5228155363249705041/photoid/5234820919508560306/1218826864901001' />
|
92
|
+
<link rel='edit-media' type='image/jpeg'
|
93
|
+
href='http://picasaweb.google.com/data/media/api/user/liz/albumid/5228155363249705041/photoid/5234820919508560306/1218826864901001' />
|
94
|
+
<link rel='media-edit' type='image/jpeg'
|
95
|
+
href='http://picasaweb.google.com/data/media/api/user/liz/albumid/5228155363249705041/photoid/5234820919508560306/1218826864901001' />
|
96
|
+
<link rel='http://schemas.google.com/photos/2007#report'
|
97
|
+
type='text/html'
|
98
|
+
href='http://picasaweb.google.com/lh/reportAbuse?uname=liz&aid=5228155363249705041&iid=5234820919508560306' />
|
99
|
+
<gphoto:id>5234820919508560306</gphoto:id>
|
100
|
+
<gphoto:version>1218826864901001</gphoto:version>
|
101
|
+
<gphoto:position>1.0</gphoto:position>
|
102
|
+
<gphoto:albumid>5228155363249705041</gphoto:albumid>
|
103
|
+
<gphoto:width>410</gphoto:width>
|
104
|
+
<gphoto:height>295</gphoto:height>
|
105
|
+
<gphoto:size>23044</gphoto:size>
|
106
|
+
<gphoto:client></gphoto:client>
|
107
|
+
<gphoto:checksum></gphoto:checksum>
|
108
|
+
<gphoto:timestamp>1218826724000</gphoto:timestamp>
|
109
|
+
<exif:tags>
|
110
|
+
<exif:imageUniqueID>
|
111
|
+
0657130896bace739a44ce90a7d5b451</exif:imageUniqueID>
|
112
|
+
</exif:tags>
|
113
|
+
<gphoto:commentingEnabled>true</gphoto:commentingEnabled>
|
114
|
+
<gphoto:commentCount>1</gphoto:commentCount>
|
115
|
+
<media:group>
|
116
|
+
<media:title type='plain'>invisible_bike.jpg</media:title>
|
117
|
+
<media:description type='plain'></media:description>
|
118
|
+
<media:keywords>invisible, bike</media:keywords>
|
119
|
+
<media:content url='http://lh5.ggpht.com/liz/SKXR5BoXabI/AAAAAAAAAzs/tJQefyM4mFw/invisible_bike.jpg'
|
120
|
+
height='295' width='410' type='image/jpeg' medium='image' />
|
121
|
+
<media:thumbnail url='http://lh5.ggpht.com/liz/SKXR5BoXabI/AAAAAAAAAzs/tJQefyM4mFw/s72/invisible_bike.jpg'
|
122
|
+
height='52' width='72' />
|
123
|
+
<media:thumbnail url='http://lh5.ggpht.com/liz/SKXR5BoXabI/AAAAAAAAAzs/tJQefyM4mFw/s144/invisible_bike.jpg'
|
124
|
+
height='104' width='144' />
|
125
|
+
<media:thumbnail url='http://lh5.ggpht.com/liz/SKXR5BoXabI/AAAAAAAAAzs/tJQefyM4mFw/s288/invisible_bike.jpg'
|
126
|
+
height='208' width='288' />
|
127
|
+
<media:credit>Liz</media:credit>
|
128
|
+
</media:group>
|
129
|
+
<georss:where>
|
130
|
+
<gml:Point>
|
131
|
+
<gml:pos>37.427399548633325 -122.1703290939331</gml:pos>
|
132
|
+
</gml:Point>
|
133
|
+
<gml:Envelope>
|
134
|
+
<gml:lowerCorner>37.42054944692195
|
135
|
+
-122.1825385093689</gml:lowerCorner>
|
136
|
+
<gml:upperCorner>37.4342496503447
|
137
|
+
-122.15811967849731</gml:upperCorner>
|
138
|
+
</gml:Envelope>
|
139
|
+
</georss:where>
|
140
|
+
</entry>
|
141
|
+
</feed>
|
@@ -0,0 +1,111 @@
|
|
1
|
+
<?xml version='1.0' encoding='UTF-8'?>
|
2
|
+
<feed xmlns='http://www.w3.org/2005/Atom'
|
3
|
+
xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/'
|
4
|
+
xmlns:exif='http://schemas.google.com/photos/exif/2007'
|
5
|
+
xmlns:geo='http://www.w3.org/2003/01/geo/wgs84_pos#'
|
6
|
+
xmlns:gml='http://www.opengis.net/gml'
|
7
|
+
xmlns:georss='http://www.georss.org/georss'
|
8
|
+
xmlns:batch='http://schemas.google.com/gdata/batch'
|
9
|
+
xmlns:media='http://search.yahoo.com/mrss/'
|
10
|
+
xmlns:gphoto='http://schemas.google.com/photos/2007'>
|
11
|
+
<id>http://picasaweb.google.com/data/feed/api/user/default</id>
|
12
|
+
<updated>2009-02-24T20:47:35.320Z</updated>
|
13
|
+
<category scheme='http://schemas.google.com/g/2005#kind'
|
14
|
+
term='http://schemas.google.com/photos/2007#user'/>
|
15
|
+
<title type='text'>liz</title>
|
16
|
+
<subtitle type='text'></subtitle>
|
17
|
+
<icon>http://lh4.ggpht.com/_WNllnlKPbiI/AAAA6DflE9g/AAAAAAAAAAA/gDUIEK-RnsA/s64-c/liz.jpg</icon>
|
18
|
+
<link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml'
|
19
|
+
href='http://picasaweb.google.com/data/feed/api/user/liz'/>
|
20
|
+
<link rel='alternate' type='text/html'
|
21
|
+
href='http://picasaweb.google.com/liz'/>
|
22
|
+
<link rel='http://schemas.google.com/photos/2007#slideshow'
|
23
|
+
type='application/x-shockwave-flash'
|
24
|
+
href='http://picasaweb.google.com/s/c/bin/slideshow.swf?host=picasaweb.google.com&RGB=0x000000&feed=http%3A%2F%2Fpicasaweb.google.com%2Fdata%2Ffeed%2Fapi%2Fuser%2Fliz%3Falt%3Drss'/>
|
25
|
+
<link rel='self' type='application/atom+xml'
|
26
|
+
href='http://picasaweb.google.com/data/feed/api/user/liz?start-index=1&max-results=1&kind=photo'/>
|
27
|
+
<link rel='next' type='application/atom+xml'
|
28
|
+
href='http://picasaweb.google.com/data/feed/api/user/liz?start-index=2&max-results=1&kind=photo'/>
|
29
|
+
<author>
|
30
|
+
<name>Liz</name>
|
31
|
+
<uri>http://picasaweb.google.com/liz</uri>
|
32
|
+
</author>
|
33
|
+
<generator version='1.00' uri='http://picasaweb.google.com/'>Picasaweb</generator>
|
34
|
+
<openSearch:totalResults>2346</openSearch:totalResults>
|
35
|
+
<openSearch:startIndex>1</openSearch:startIndex>
|
36
|
+
<openSearch:itemsPerPage>1</openSearch:itemsPerPage>
|
37
|
+
<gphoto:user>liz</gphoto:user>
|
38
|
+
<gphoto:nickname>Liz</gphoto:nickname>
|
39
|
+
<gphoto:thumbnail>http://lh4.ggpht.com/_WNllnlKPbiI/AAAA6DflE9g/AAAAAAAAAAA/gDUIEK-RnsA/s64-c/liz.jpg</gphoto:thumbnail>
|
40
|
+
<gphoto:quotalimit>1073741824</gphoto:quotalimit>
|
41
|
+
<gphoto:quotacurrent>827885946</gphoto:quotacurrent>
|
42
|
+
<gphoto:maxPhotosPerAlbum>500</gphoto:maxPhotosPerAlbum>
|
43
|
+
<entry>
|
44
|
+
<id>http://picasaweb.google.com/data/entry/api/user/liz/albumid/8823482382828282/photoid/83248238423842304234</id>
|
45
|
+
<published>2008-03-14T20:09:49.000Z</published>
|
46
|
+
<updated>2008-11-19T22:16:52.000Z</updated>
|
47
|
+
<category scheme='http://schemas.google.com/g/2005#kind'
|
48
|
+
term='http://schemas.google.com/photos/2007#photo'/>
|
49
|
+
<title type='text'>DSC00868.JPG</title>
|
50
|
+
<summary type='text'>EN 1 Necklace</summary>
|
51
|
+
<content type='image/jpeg'
|
52
|
+
src='http://lh3.ggpht.com/_WNllnlKPbiI/R9rbjUlLiiI/AAAAAAAAABo/pCRfzIt57So/DSC00868.JPG'/>
|
53
|
+
<link rel='http://schemas.google.com/g/2005#feed'
|
54
|
+
type='application/atom+xml'
|
55
|
+
href='http://picasaweb.google.com/data/feed/api/user/liz/albumid/8823482382828282/photoid/83248238423842304234?authkey=504Da7FUvRM'/>
|
56
|
+
<link rel='alternate' type='text/html'
|
57
|
+
href='http://picasaweb.google.com/liz/ByLiz?authkey=504Da7FUvRM#83248238423842304234'/>
|
58
|
+
<link rel='self' type='application/atom+xml'
|
59
|
+
href='http://picasaweb.google.com/data/entry/api/user/liz/albumid/8823482382828282/photoid/83248238423842304234?authkey=504Da7FUvRM'/>
|
60
|
+
<link rel='edit' type='application/atom+xml'
|
61
|
+
href='http://picasaweb.google.com/data/entry/api/user/liz/albumid/8823482382828282/photoid/83248238423842304234/1227133012148000?authkey=504Da7FUvRM'/>
|
62
|
+
<link rel='edit-media' type='image/jpeg'
|
63
|
+
href='http://picasaweb.google.com/data/media/api/user/liz/albumid/8823482382828282/photoid/83248238423842304234/1227133012148000?authkey=504Da7FUvRM'/>
|
64
|
+
<link rel='media-edit' type='image/jpeg'
|
65
|
+
href='http://picasaweb.google.com/data/media/api/user/liz/albumid/8823482382828282/photoid/83248238423842304234/1227133012148000?authkey=504Da7FUvRM'/>
|
66
|
+
<link rel='http://schemas.google.com/photos/2007#report' type='text/html'
|
67
|
+
href='http://picasaweb.google.com/lh/reportAbuse?uname=liz&aid=8823482382828282&iid=83248238423842304234'/>
|
68
|
+
<gphoto:id>83248238423842304234</gphoto:id>
|
69
|
+
<gphoto:version>1227133012148000</gphoto:version>
|
70
|
+
<gphoto:albumid>8823482382828282</gphoto:albumid>
|
71
|
+
<gphoto:access>private</gphoto:access>
|
72
|
+
<gphoto:width>1944</gphoto:width>
|
73
|
+
<gphoto:height>2592</gphoto:height>
|
74
|
+
<gphoto:size>1910900</gphoto:size>
|
75
|
+
<gphoto:client></gphoto:client>
|
76
|
+
<gphoto:checksum></gphoto:checksum>
|
77
|
+
<gphoto:timestamp>1205492888000</gphoto:timestamp>
|
78
|
+
<exif:tags>
|
79
|
+
<exif:fstop>2.8</exif:fstop>
|
80
|
+
<exif:make>SONY</exif:make>
|
81
|
+
<exif:model>DSC-V1</exif:model>
|
82
|
+
<exif:exposure>0.07692308</exif:exposure>
|
83
|
+
<exif:flash>false</exif:flash>
|
84
|
+
<exif:focallength>7.0</exif:focallength>
|
85
|
+
<exif:iso>100</exif:iso>
|
86
|
+
<exif:time>1205492888000</exif:time>
|
87
|
+
<exif:imageUniqueID>904d07a26b986ac95eeef63942f70622</exif:imageUniqueID>
|
88
|
+
</exif:tags>
|
89
|
+
<gphoto:commentingEnabled>true</gphoto:commentingEnabled>
|
90
|
+
<gphoto:commentCount>1</gphoto:commentCount>
|
91
|
+
<media:group>
|
92
|
+
<media:title type='plain'>DSC00868.JPG</media:title>
|
93
|
+
<media:description type='plain'>EN 1 Necklace</media:description>
|
94
|
+
<media:keywords>
|
95
|
+
</media:keywords>
|
96
|
+
<media:content
|
97
|
+
url='http://lh3.ggpht.com/_WNllnlKPbiI/R9rbjUlLiiI/AAAAAAAAABo/pCRfzIt57So/DSC00868.JPG'
|
98
|
+
height='1600' width='1200' type='image/jpeg' medium='image'/>
|
99
|
+
<media:thumbnail
|
100
|
+
url='http://lh3.ggpht.com/_WNllnlKPbiI/R9rbjUlLiiI/AAAAAAAAABo/pCRfzIt57So/s72/DSC00868.JPG'
|
101
|
+
height='72' width='54'/>
|
102
|
+
<media:thumbnail
|
103
|
+
url='http://lh3.ggpht.com/_WNllnlKPbiI/R9rbjUlLiiI/AAAAAAAAABo/pCRfzIt57So/s144/DSC00868.JPG'
|
104
|
+
height='144' width='108'/>
|
105
|
+
<media:thumbnail
|
106
|
+
url='http://lh3.ggpht.com/_WNllnlKPbiI/R9rbjUlLiiI/AAAAAAAAABo/pCRfzIt57So/s288/DSC00868.JPG'
|
107
|
+
height='288' width='216'/>
|
108
|
+
<media:credit>Liz</media:credit>
|
109
|
+
</media:group>
|
110
|
+
</entry>
|
111
|
+
</feed>
|