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.
@@ -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&amp;RGB=0x000000&amp;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&amp;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&amp;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&amp;aid=5228155363249705041&amp;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&amp;RGB=0x000000&amp;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&amp;max-results=1&amp;kind=photo'/>
27
+ <link rel='next' type='application/atom+xml'
28
+ href='http://picasaweb.google.com/data/feed/api/user/liz?start-index=2&amp;max-results=1&amp;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&amp;aid=8823482382828282&amp;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>