root/trunk/uploadr/MacUploadr.app/Contents/Resources/chrome/content/uploadr/api.js

Revision 423, 12.6 kB (checked in by jdecq, 1 year ago)

http://cvs.flickr.com/b2/8371
bind the upload button behavior with the sign-in button behavior

Line 
1 /*
2  * Flickr Uploadr
3  *
4  * Copyright (c) 2007-2008 Yahoo! Inc.  All rights reserved.  This library is
5  * free software; you can redistribute it and/or modify it under the terms of
6  * the GNU General Public License (GPL), version 2 only.  This library is
7  * distributed WITHOUT ANY WARRANTY, whether express or implied. See the GNU
8  * GPL for more details (http://www.gnu.org/licenses/gpl.html)
9  */
10
11 // API wrapped up with a bow
12 var wrap = {
13
14         // Authentication - don't use this directly, use users.login()
15         auth: {
16
17                 checkToken: function(token) {
18                         flickr.auth.checkToken(wrap.auth._checkToken, token);
19                 },
20                 _checkToken: function(rsp) {
21                         if ('object' != typeof rsp || 'ok' != rsp.getAttribute('stat')) {
22                                 users.logout(false);
23                         } else {
24                                 users.token = rsp.getElementsByTagName('token')[0]
25                                         .firstChild.nodeValue;
26                                 var user = rsp.getElementsByTagName('user')[0];
27                                 users.nsid = user.getAttribute('nsid');
28                                 users.username = user.getAttribute('username');
29
30                                 // Complete the login process
31                                 users._login();
32
33                         }
34                         buttons.login.enable();
35                         buttons.upload.disable();
36                 },
37
38                 getFrob: function(fresh) {
39                         flickr.auth.getFrob(wrap.auth._getFrob, fresh);
40                 },
41                 _getFrob: function(rsp, fresh) {
42                         if ('object' != typeof rsp || 'ok' != rsp.getAttribute('stat')) {
43
44                                 // Explain what's going on
45                                 alert(locale.getString('auth.error.text'),
46                                         locale.getString('auth.error.title'));
47
48                                 users.logout(false);
49                         } else {
50                                 users.frob = rsp.getElementsByTagName('frob')[0]
51                                         .firstChild.nodeValue;
52                                 if (!confirm(locale.getString('auth.prompt.text'),
53                                         locale.getString('auth.prompt.title'),
54                                         locale.getString('auth.prompt.ok'),
55                                         locale.getString('auth.prompt.cancel'))) {
56                                         buttons.login.enable();
57                                         buttons.upload.disable();
58                                         return;
59                                 }
60                                 var url = api.start({
61                                         'perms': 'write',
62                                         'frob': users.frob,
63                                 }, null, 'http://' + SITE_HOST + '/services/auth/' +
64                                         (fresh ? 'fresh/' : ''), true);
65                                 document.getElementById('auth_url').value = url;
66                                 pages.go('auth');
67                         }
68                         buttons.login.enable();
69                         buttons.upload.disable();
70                 },
71
72                 getToken: function(frob) {
73                         flickr.auth.getToken(wrap.auth._getToken, frob);
74                 },
75                 _getToken: function(rsp) {
76                         if ('object' != typeof rsp || 'ok' != rsp.getAttribute('stat')) {
77                                 users.logout(false);
78                         } else {
79                                 users.token = rsp.getElementsByTagName('token')[0]
80                                         .firstChild.nodeValue;
81                                 var user = rsp.getElementsByTagName('user')[0];
82                                 users.nsid = user.getAttribute('nsid');
83                                 users.username = user.getAttribute('username');
84
85                                 // Complete the login process
86                                 users._login();
87
88                         }
89                 }
90
91         },
92
93         // Like the auth section, this is used by users.login() and won't
94         // need to be called
95         people: {
96
97                 // Sets up the photostream header
98                 getInfo: function(token, nsid) {
99                         flickr.people.getInfo(wrap.people._getInfo, token, nsid);
100                 },
101                 _getInfo: function(rsp, nsid) {
102                         if ('object' == typeof rsp && 'ok' == rsp.getAttribute('stat')) {
103                                 var p = rsp.getElementsByTagName('person')[0];
104                                 var s = p.getAttribute('iconserver');
105                                 if (0 != parseInt(s)) {
106                                         document.getElementById('buddyicon').src =
107                                                 'http://farm' + p.getAttribute('iconfarm') +
108                                                 '.static.flickr.com/' + s + '/buddyicons/' +
109                                                 nsid + '.jpg';
110                                 } else {
111                                         document.getElementById('buddyicon').src =
112                                                 'http://flickr.com/images/buddyicon.jpg';
113                                 }
114                                 if (1 == parseInt(p.getAttribute('ispro'))) {
115                                         document.getElementById('photostream_pro')
116                                                 .style.display = 'inline';
117                                 } else {
118                                         document.getElementById('photostream_pro')
119                                                 .style.display = 'none';
120                                 }
121                         }
122                 },
123
124                 getUploadStatus: function(token) {
125                         flickr.people.getUploadStatus(wrap.people._getUploadStatus,
126                                 token);
127                 },
128                 _getUploadStatus: function(rsp) {
129                         if ('object' != typeof rsp || 'ok' != rsp.getAttribute('stat')) {
130
131                                 // This can cause infinite looping, so stoppit
132                                 //wrap.people.getUploadStatus();
133
134                         } else {
135                                 var user = rsp.getElementsByTagName('user')[0];
136                                 users.is_pro = 1 == parseInt(user.getAttribute('ispro'));
137                                 var bw = user.getElementsByTagName('bandwidth')[0];
138                                 if (1 == parseInt(bw.getAttribute('unlimited'))) {
139                                         users.bandwidth = null;
140                                 } else {
141                                         users.bandwidth = {
142                                                 total: parseInt(bw.getAttribute('maxkb')),
143                                                 used: parseInt(bw.getAttribute('usedkb')),
144                                                 remaining: parseInt(bw.getAttribute('remainingkb'))
145                                         };
146                                 }
147                                 users.filesize = parseInt(user.getElementsByTagName(
148                                         'filesize')[0].getAttribute('maxkb'));
149                                 var videosize = user.getElementsByTagName('videosize');
150                                 if (videosize.length) {
151                                         users.videosize = parseInt(videosize[0]
152                                                 .getAttribute('maxkb'));
153                                 } else { users.videosize = conf.videosize; }
154                                 var sets = user.getElementsByTagName('sets')[0].getAttribute('remaining');
155                                 if ('lots' == sets) {
156                                         users.sets = -1;
157                                 } else {
158                                         users.sets = parseInt(sets);
159                                 }
160                                 ui.users_updated();
161                                 users.update();
162                         }
163                         buttons.upload.enable();
164                 }
165
166         },
167
168         photos: {
169
170                 upload: {
171
172                         checkTickets: function(token, tickets) {
173                                 block_exit();
174                                 flickr.photos.upload.checkTickets(
175                                         wrap.photos.upload._checkTickets, token, tickets);
176                         },
177                         _checkTickets: function(rsp) {
178                                 var again = false;
179                                 if ('object' == typeof rsp &&
180                                         'ok' == rsp.getAttribute('stat')) {
181                                         upload.tickets_retry = 0;
182                                         var tickets = rsp.getElementsByTagName('uploader')[0]
183                                                 .getElementsByTagName('ticket');
184                                         var ii = tickets.length;
185                                         for (var i = 0; i < ii; ++i) {
186                                                 var ticket_id = tickets[i].getAttribute('id');
187                                                 var complete = parseInt(tickets[i]
188                                                         .getAttribute('complete'));
189                                                 if ('undefined' != typeof upload.tickets[ticket_id]) {
190
191                                                         // Error'd photo
192                                                         if (2 == complete) {
193                                                                 --upload.tickets_count;
194                                                                 upload._sync(false, upload.tickets[ticket_id].id);
195                                                                 delete upload.tickets[ticket_id];
196                                                         }
197
198                                                         // Completed photo
199                                                         else if (1 == complete) {
200                                                                 --upload.tickets_count;
201
202                                                                 // Check this photo against stored timestamps
203                                                                 var imported = parseInt(tickets[i]
204                                                                         .getAttribute('imported'));
205                                                                 if (0 == upload.timestamps.earliest ||
206                                                                         imported < upload.timestamps.earliest) {
207                                                                         upload.timestamps.earliest = imported;
208                                                                 }
209                                                                 if (0 == upload.timestamps.latest ||
210                                                                         imported > upload.timestamps.latest) {
211                                                                         upload.timestamps.latest = imported;
212                                                                 }
213
214                                                                 upload._sync(parseInt(tickets[i]
215                                                                         .getAttribute('photoid')),
216                                                                         upload.tickets[ticket_id].id);
217                                                                 delete upload.tickets[ticket_id];
218                                                         }
219
220                                                         // Incomplete photos need to keep spinning
221                                                         else {
222                                                                 again = true;
223                                                         }
224
225                                                 }
226                                         }
227                                 }
228
229                                 // Error'd checkTickets need to keep spinning
230                                 else {
231                                         again = true;
232                                 }
233
234                                 if (again) {
235
236                                         // Valid response or still have retries remaining
237                                         if ('object' == typeof rsp) {
238                                                 upload._check_tickets();
239                                         } else if (conf.tickets_retry_count >
240                                                 upload.tickets_retry_count) {
241                                                 ++upload.tickets_retry_count;
242                                                 upload._check_tickets();
243                                         }
244
245                                         // Need to call it quits
246                                         else {
247                                                 upload.cancel = true;
248                                                 upload.tickets_count = 0;
249                                                 upload.tickets = {};
250                                                 upload.done();
251                                         }
252
253                                 }
254                                 unblock_exit();
255                         }
256
257                 }
258
259         },
260
261         photosets: {
262
263                 addPhoto: function(token, photoset_id, photo_id){
264                         ++photos.sets_out;
265                         flickr.photosets.addPhoto(wrap.photosets._addPhoto,
266                                 token, photoset_id, photo_id);
267                 },
268                 _addPhoto: function(rsp) {
269                         if ('object' != typeof rsp || 'ok' != rsp.getAttribute('stat')) {
270                                 photos.sets_fail = true;
271                         }
272                         --photos.sets_out;
273                         upload.finalize();
274                 },
275
276                 getList: function(token, nsid) {
277                         flickr.photosets.getList(wrap.photosets._getList, token, nsid);
278                 },
279                 _getList: function(rsp) {
280                         if ('object' == typeof rsp && 'ok' == rsp.getAttribute('stat')) {
281                                 var sets = rsp.getElementsByTagName('photosets')[0]
282                                         .getElementsByTagName('photoset');
283                                 var ii = sets.length;
284                                 var order = [];
285                                 for (var i = 0; i < ii; ++i) {
286                                         order.push({
287                                                 id: sets[i].getAttribute('id'),
288                                                 title: sets[i].getElementsByTagName('title')[0]
289                                                         .firstChild.nodeValue
290                                         });
291                                 }
292
293                                 // We really shouldn't break our own API spec
294                                 //   TODO: Offer a sort toggle
295                                 //*
296                                 order.sort(function(a, b) {
297                                         return a.title.toLowerCase() > b.title.toLowerCase();
298                                 });
299                                 //*/
300
301                                 // Start the map of old indexes to new ones with any
302                                 // created sets
303                                 var sets_map = {};
304                                 var new_sets = [];
305                                 var ii = meta.sets.length;
306                                 for (var i = 0; i < ii; ++i) {
307                                         if (null != meta.sets[i].id) { continue; }
308                                         sets_map[i] = new_sets.length;
309                                         new_sets.push(meta.sets[i]);
310                                 }
311
312                                 // Find each set in the API result in our old list
313                                 var jj = order.length;
314                                 for (var j = 0; j < jj; ++j) {
315                                         for (var i = 0; i < ii; ++i) {
316                                                 if (order[j].id == meta.sets[i].id) {
317                                                         sets_map[i] = new_sets.length;                                                 
318                                                         break;
319                                                 }
320                                         }
321                                         new_sets.push(order[j]);
322                                 }
323
324                                 // Translate photos in the batch to this list
325                                 for each (var p in photos.list) {
326                                         for (var i in p.sets) {
327                                                 p.sets[i] = sets_map[p.sets[i]];
328                                         }
329                                 }
330                                 meta.sets = new_sets;
331
332                                 // Update the lists of available sets
333                                 var ii = meta.sets.length;
334                                 var prefixes = ['single', 'batch'];
335                                 for each (var prefix in prefixes) {
336                                         var ul = document.getElementById(prefix + '_sets_add');
337                                         while (ul.hasChildNodes()) {
338                                                 ul.removeChild(ul.firstChild);
339                                         }
340                                         if (0 == ii && 0 == meta.created_sets) {
341                                                 var li = document.createElementNS(NS_HTML, 'li');
342                                                 li.className = 'sets_none';
343                                                 li.appendChild(document.createTextNode(
344                                                         locale.getString('meta.sets.add.none')));
345                                                 ul.appendChild(li);
346                                         } else {
347                                                 var ii = meta.sets.length;
348                                                 for (var i = 0; i < ii; ++i) {
349                                                         var li = document.createElementNS(NS_HTML, 'li');
350                                                         li.id = prefix + '_sets_add_' + i;
351                                                         li.className = 'sets_plus';
352                                                         li.appendChild(document.createTextNode(
353                                                                 meta.sets[i].title));
354                                                         ul.appendChild(li);
355                                                 }
356                                         }
357                                 }
358
359                                 // Update selected photos
360                                 if (photos.selected.length) {
361                                         var prefix = 1 == photos.selected.length ?
362                                                 'single' : 'batch';
363                                         var li = document.getElementById(prefix + '_sets_added')
364                                                 .getElementsByTagName('li');
365                                         var ii = li.length;
366                                         for (var i = 0; i < ii; ++i) {
367                                                 if ('sets_none' == li[i].className) { continue; }
368                                                 var id = sets_map[parseInt(li[i].id.replace(
369                                                         /^(single|batch)_sets_added_/, ''))];
370                                                 li[i].id = prefix + '_sets_added_' + id;
371                                                 document.getElementById(prefix + '_sets_add_' + id)
372                                                         .className = 'sets_disabled';
373                                         }
374                                 }
375
376                         }
377                         status.clear();
378                 }
379
380         },
381
382         // Preferences are fetched from the site when no stored version can be found
383         prefs: {
384
385                 getContentType: function(token) {
386                         flickr.prefs.getContentType(wrap.prefs._getContentType, token);
387                 },
388                 _getContentType: function(rsp) {
389                         if ('object' == typeof rsp && 'ok' == rsp.getAttribute('stat')) {
390                                 settings.content_type =
391                                         parseInt(rsp.getElementsByTagName('person')[0]
392                                         .getAttribute('content_type'));
393                                 settings.save();
394                                 meta.defaults({content_type: settings.content_type});
395                         }
396                 },
397
398                 getHidden: function(token) {
399                         flickr.prefs.getHidden(wrap.prefs._getHidden, token);
400                 },
401                 _getHidden: function(rsp) {
402                         if ('object' == typeof rsp && 'ok' == rsp.getAttribute('stat')) {
403                                 settings.hidden =
404                                         parseInt(rsp.getElementsByTagName('person')[0]
405                                         .getAttribute('hidden'));
406                                 settings.save();
407                                 meta.defaults({hidden: settings.hidden});
408                         }
409                 },
410
411                 getPrivacy: function(token) {
412                         flickr.prefs.getPrivacy(wrap.prefs._getPrivacy, token);
413                 },
414                 _getPrivacy: function(rsp) {
415                         if ('object' == typeof rsp && 'ok' == rsp.getAttribute('stat')) {
416                                 var privacy =
417                                         parseInt(rsp.getElementsByTagName('person')[0]
418                                         .getAttribute('privacy'));
419                                 settings.is_public = 1 == privacy ? 1 : 0;
420                                 settings.is_friend = 2 == privacy || 4 == privacy ? 1 : 0;
421                                 settings.is_family = 3 == privacy || 4 == privacy ? 1 : 0;
422                                 settings.save();
423                                 meta.defaults({
424                                         is_public: settings.is_public,
425                                         is_friend: settings.is_friend,
426                                         is_family: settings.is_family
427                                 });
428                         }
429                 },
430
431                 getSafetyLevel: function(token) {
432                         flickr.prefs.getSafetyLevel(wrap.prefs._getSafetyLevel, token);
433                 },
434                 _getSafetyLevel: function(rsp) {
435                         if ('object' == typeof rsp && 'ok' == rsp.getAttribute('stat')) {
436                                 settings.safety_level =
437                                         parseInt(rsp.getElementsByTagName('person')[0]
438                                         .getAttribute('safety_level'));
439                                 settings.save();
440                                 meta.defaults({safety_level: settings.safety_level});
441                         }
442                 }
443
444         },
445
446         utils: {
447
448                 logUploadStats: function(token, source, num_photos, upload_time,
449                         bytes, errors) {
450                         flickr.utils.logUploadStats(null, token, source, num_photos,
451                                 upload_time, bytes, errors)
452                 }
453
454         }
455
456 };
Note: See TracBrowser for help on using the browser.