neves-ruby_picasa 0.2.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -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>