UNPKG

19 kBJavaScriptView Raw
1/**!
2 * @preserve nanogallery2 - GOOGLE PHOTOS data provider
3 * Homepage: http://nanogallery2.nanostudio.org
4 * Sources: https://github.com/nanostudio-org/nanogallery2
5 *
6 * License: GPLv3 and commercial licence
7 *
8*/
9
10// ###################################################
11// ##### nanogallery2 - module for GOOGLE PHOTOS #####
12// ###################################################
13
14
15;(function ($) {
16
17 jQuery.nanogallery2.data_google = function (instance, fnName){
18 var G=instance; // current nanogallery2 instance
19
20 // ### Picasa/Google+
21 // square format : 32, 48, 64, 72, 104, 144, 150, 160 (cropped)
22 // details: https://developers.google.com/picasa-web/docs/2.0/reference
23 Google = {
24 url: function() {
25 // return ( G.O.picasaUseUrlCrossDomain ? 'https://photos.googleapis.com/data/feed/api/' : 'https://picasaweb.google.com/data/feed/api/');
26 return ( 'https://photos.googleapis.com/data/feed/api/' );
27 },
28 thumbSize: 64,
29 thumbAvailableSizes : new Array(32, 48, 64, 72, 94, 104, 110, 128, 144, 150, 160, 200, 220, 288, 320, 400, 512, 576, 640, 720, 800, 912, 1024, 1152, 1280, 1440, 1600),
30 thumbAvailableSizesCropped : ' 32 48 64 72 104 144 150 160 '
31 };
32
33
34 /** @function AlbumGetContent */
35 var AlbumGetContent = function(albumID, fnToCall, fnParam1, fnParam2) {
36
37 var url= Google.url() + 'user/'+G.O.userID;
38 var kind= 'image';
39 var albumIdx=NGY2Item.GetIdx(G, albumID);
40
41 var maxResults='';
42 if( G.galleryMaxItems.Get() > 0 ) {
43 maxResults='&max-results='+G.galleryMaxItems.Get();
44 }
45
46 if( G.I[albumIdx].GetID() == 0 ) {
47 // retrieve the list of albums
48 // url += '?alt=json&kind=album&thumbsize='+G.picasa.thumbSizes+maxResults+'&rnd=' + (new Date().getTime());
49 url += '?alt=json&v=3&kind=album&thumbsize='+G.picasa.thumbSizes+maxResults+'&rnd=' + (new Date().getTime());
50 kind='album';
51 }
52 else {
53 // retrieve the content of one album (=photos)
54 var auth='';
55 if( G.I[albumIdx].authkey != '' ) {
56 // private album
57 auth=G.I[albumIdx].authkey;
58 }
59 url += '/albumid/'+albumID+'?alt=json&kind=photo&thumbsize='+G.picasa.thumbSizes+maxResults+auth+'&imgmax=d';
60 }
61
62 PreloaderDisplay(true);
63
64 jQuery.ajaxSetup({ cache: false });
65 jQuery.support.cors = true;
66 try {
67
68 var tId = setTimeout( function() {
69 // workaround to handle JSONP (cross-domain) errors
70 PreloaderDisplay(false);
71 NanoAlert('Could not retrieve AJAX data...');
72 }, 60000 );
73
74 var GI_getJSONfinished = function(data){
75 clearTimeout(tId);
76 PreloaderDisplay(false);
77
78 GoogleParseData( albumIdx, kind, data );
79 AlbumPostProcess(albumID);
80 if( fnToCall !== null && fnToCall !== undefined) {
81 fnToCall( fnParam1, fnParam2, null );
82 }
83 };
84
85 var gi_data_loaded = null;
86 // load more than 1000 data -> contributor: Giovanni Chiodi
87
88 var GI_loadJSON = function(url,start_index){
89
90 jQuery.getJSON(url+"&start-index="+start_index, 'callback=?', function(data) {
91 if (gi_data_loaded===null){
92 gi_data_loaded = data;
93 }else{
94 gi_data_loaded.feed.entry=gi_data_loaded.feed.entry.concat(data.feed.entry);
95 }
96
97 if (data.feed.openSearch$startIndex.$t+data.feed.openSearch$itemsPerPage.$t>=data.feed.openSearch$totalResults.$t){
98 //ok finito
99 GI_getJSONfinished(gi_data_loaded);
100 }else{
101 //ce ne sono ancora da caricare
102 //altra chiamata per il rimanente
103 GI_loadJSON(url,data.feed.openSearch$startIndex.$t+data.feed.openSearch$itemsPerPage.$t);
104 }
105 })
106 .fail( function(jqxhr, textStatus, error) {
107 clearTimeout(tId);
108 PreloaderDisplay(false);
109
110 //alertObject(jqxhr);
111 var k=''
112 for(var key in jqxhr) {
113 k+= key + '=' + jqxhr[key] +'<br>';
114 }
115 var err = textStatus + ', ' + error + ' ' + k + '<br><br>URL:'+url;
116 NanoAlert(G, "Could not retrieve Google data. Error: " + err);
117
118 });
119
120 };
121
122 GI_loadJSON(url,1);
123 }
124 catch(e) {
125 NanoAlert(G, "Could not retrieve Google data. Error: " + e);
126 }
127 }
128
129
130 // -----------
131 // Retrieve items from a Google+ (ex Picasa) data stream
132 // items can be images or albums
133 function GoogleParseData(albumIdx, kind, data) {
134 var albumID=G.I[albumIdx].GetID();
135
136 if( G.I[albumIdx].title == '' ) {
137 // set title of the album (=> root level not loaded at this time)
138 G.I[albumIdx].title=data.feed.title.$t;
139 }
140
141 // iterate and parse each item
142 jQuery.each(data.feed.entry, function(i,data){
143
144 //Get the title
145 var imgUrl=data.media$group.media$content[0].url;
146 var itemTitle = data.title.$t;
147
148 //Get the description
149 var filename='';
150 var itemDescription = data.media$group.media$description.$t;
151 if( kind == 'image') {
152 // if image, the title contains the image filename -> replace with content of description
153 filename=itemTitle;
154 if( itemDescription != '' ) {
155 itemTitle=itemDescription;
156 itemDescription='';
157 }
158 if( G.O.thumbnailLabel.get('title') != '' ) {
159 // use filename for the title (extract from URL)
160 itemTitle=GetImageTitleFromURL(unescape(unescape(unescape(unescape(imgUrl)))));
161 }
162 }
163
164 var itemID = data.gphoto$id.$t;
165 if( !(kind == 'album' && !FilterAlbumName(itemTitle, itemID)) ) {
166
167 var newItem=NGY2Item.New( G, itemTitle, itemDescription, itemID, albumID, kind, '' );
168 // set the image src
169 if( kind == 'image' ) {
170 var src='';
171 src=imgUrl;
172 if( !G.O.viewerZoom && G.O.viewerZoom != undefined ) {
173 var s=imgUrl.substring(0, imgUrl.lastIndexOf('/'));
174 s=s.substring(0, s.lastIndexOf('/')) + '/';
175 if( window.screen.width > window.screen.height ) {
176 src=s+'w'+window.screen.width+'/'+filename;
177 }
178 else {
179 src=s+'h'+window.screen.height+'/'+filename;
180 }
181 }
182 newItem.src=src; // image's URL
183
184 // image size
185 newItem.imageWidth=parseInt(data.gphoto$width.$t);
186 newItem.imageHeight=parseInt(data.gphoto$height.$t);
187
188 if( data.media$group != null && data.media$group.media$credit != null && data.media$group.media$credit.length > 0 ) {
189 newItem.author=data.media$group.media$credit[0].$t;
190 }
191
192
193 // exif data
194 if( data.exif$tags.exif$exposure != undefined ) {
195 newItem.exif.exposure= data.exif$tags.exif$exposure.$t;
196 }
197 if( data.exif$tags.exif$flash != undefined ) {
198 if( data.exif$tags.exif$flash.$t == 'true' ) {
199 newItem.exif.flash= 'flash';
200 }
201 }
202 if( data.exif$tags.exif$focallength != undefined ) {
203 newItem.exif.focallength= data.exif$tags.exif$focallength.$t;
204 }
205 if( data.exif$tags.exif$fstop != undefined ) {
206 newItem.exif.fstop= data.exif$tags.exif$fstop.$t;
207 }
208 if( data.exif$tags.exif$iso != undefined ) {
209 newItem.exif.iso= data.exif$tags.exif$iso.$t;
210 }
211 if( data.exif$tags.exif$model != undefined ) {
212 newItem.exif.model= data.exif$tags.exif$model.$t;
213 }
214
215 // geo location
216 if( data.gphoto$location != undefined ) {
217 newItem.exif.location= data.gphoto$location;
218 }
219
220 }
221 else {
222 newItem.author=data.author[0].name.$t;
223 newItem.numberItems=data.gphoto$numphotos.$t;
224 }
225
226 // set the URL of the thumbnails images
227 newItem.thumbs=GoogleThumbSetSizes('l1', 0, newItem.thumbs, data, kind );
228 newItem.thumbs=GoogleThumbSetSizes('lN', 5, newItem.thumbs, data, kind );
229
230 if( typeof G.O.fnProcessData == 'function' ) {
231 G.O.fnProcessData(newItem, 'google', data);
232 }
233 }
234 });
235
236 G.I[albumIdx].contentIsLoaded=true; // album's content is ready
237 }
238
239
240
241 /** @function GetHiddenAlbums */
242 var GetHiddenAlbums = function( hiddenAlbums, callback ){
243 var lstAlbums = [].concat( hiddenAlbums );
244 for( var i=0; i< lstAlbums.length; i++ ) {
245 AlbumAuthkeyGetInfoQueue(lstAlbums[i], callback);
246 }
247 // dequeue sequentially
248 jQuery(document).dequeue('GoogleAlbumWithAuthkey');
249 }
250
251 // Google+ - retrieves private album
252 // The first image is used as the cover image (=album thumbnail)
253 function AlbumAuthkeyGetInfoQueue( albumIDwithAuthkey, callback ) {
254 jQuery(document).queue('GoogleAlbumWithAuthkey', function() {
255
256 var p=albumIDwithAuthkey.indexOf('&authkey=');
257 if( p == -1 ) {
258 p=albumIDwithAuthkey.indexOf('?authkey=');
259 }
260 var albumID=albumIDwithAuthkey.substring(0,p);
261
262 var opt=albumIDwithAuthkey.substring(p);
263 if( opt.indexOf('Gv1sRg') == -1 ) {
264 opt='&authkey=Gv1sRg'+opt.substring(9);
265 }
266 var url = Google.url() + 'user/'+G.O.userID+'/albumid/'+albumID+'?alt=json&kind=photo'+opt+'&max-results=1&thumbsize='+G.picasa.thumbSizes+'&imgmax=d';
267
268 PreloaderDisplay(true);
269
270 jQuery.ajaxSetup({ cache: false });
271 jQuery.support.cors = true;
272
273 var tId = setTimeout( function() {
274 // workaround to handle JSONP (cross-domain) errors
275 PreloaderDisplay(false);
276 NanoAlert(G, 'Could not retrieve AJAX data...');
277 }, 60000 );
278 jQuery.getJSON(url, function(data, status, xhr) {
279 clearTimeout(tId);
280 PreloaderDisplay(false);
281
282 var albumTitle=data.feed.title.$t;
283 var source = data.feed.entry[0];
284
285 var newItem=NGY2Item.New( G, albumTitle, '', albumID, '0', 'album', '' );
286
287 newItem.authkey=opt;
288
289 //Get and set the URLs of the thumbnail
290 newItem.thumbs=GoogleThumbSetSizes('l1', 0, newItem.thumbs, source, 'album' );
291 newItem.thumbs=GoogleThumbSetSizes('lN', 5, newItem.thumbs, source, 'album' );
292
293 if( typeof G.O.fnProcessData == 'function' ) {
294 G.O.fnProcessData(newItem, 'google', source);
295 }
296// G.I[1].contentIsLoaded=true;
297 newItem.numberItems=data.feed.gphoto$numphotos.$t;
298
299 // dequeue to process the next google+/picasa private album
300 if( jQuery(document).queue('GoogleAlbumWithAuthkey').length > 0 ) {
301 jQuery(document).dequeue('GoogleAlbumWithAuthkey');
302 }
303 else {
304 callback();
305 }
306
307 })
308 .fail( function(jqxhr, textStatus, error) {
309 clearTimeout(tId);
310 PreloaderDisplay(false);
311 NanoAlert(G, "Could not retrieve ajax data (google): " + textStatus + ', ' + error);
312 jQuery(document).dequeue('GoogleAlbumWithAuthkey');
313 });
314 });
315
316 }
317
318 // -----------
319 // Set thumbnail sizes (width and height) and URLs (for all resolutions (xs, sm, me, la, xl) and levels (l1, lN)
320 function GoogleThumbSetSizes(level, startI, tn, data, kind ) {
321 var sizes=['xs','sm','me','la','xl'];
322
323 for(var i=0; i<sizes.length; i++ ) {
324 tn.url[level][sizes[i]]=data.media$group.media$thumbnail[startI+i].url;
325 if( kind == 'image' ) {
326 tn.width[level][sizes[i]]=data.media$group.media$thumbnail[startI+i].width;
327 tn.height[level][sizes[i]]=data.media$group.media$thumbnail[startI+i].height;
328
329 var gw=data.media$group.media$thumbnail[startI+i].width;
330 var gh=data.media$group.media$thumbnail[startI+i].height;
331 if( G.tn.settings.width[level][sizes[i]] == 'auto' ) {
332 if( gh < G.tn.settings.height[level][sizes[i]] ) {
333 // calculate new h/w and change URL
334 var ratio=gw/gh;
335 tn.width[level][sizes[i]]=gw*ratio;
336 tn.height[level][sizes[i]]=gh*ratio;
337 var url=tn.url[level][sizes[i]].substring(0, tn.url[level][sizes[i]].lastIndexOf('/'));
338 url=url.substring(0, url.lastIndexOf('/')) + '/';
339 tn.url[level][sizes[i]]=url+'h'+G.tn.settings.height[level][sizes[i]]+'/';
340 }
341 }
342 if( G.tn.settings.height[level][sizes[i]] == 'auto' ) {
343 if( gw < G.tn.settings.width[level][sizes[i]] ) {
344 // calculate new h/w and change URL
345 var ratio=gh/gw;
346 tn.height[level][sizes[i]]=gh*ratio;
347 tn.width[level][sizes[i]]=gw*ratio;
348 var url=tn.url[level][sizes[i]].substring(0, tn.url[level][sizes[i]].lastIndexOf('/'));
349 url=url.substring(0, url.lastIndexOf('/')) + '/';
350 tn.url[level][sizes[i]]=url+'w'+G.tn.settings.width[level][sizes[i]]+'/';
351 }
352 }
353 }
354 else {
355 // albums
356 // the Google API returns incorrect height/width values
357 if( G.tn.settings.width[level][sizes[i]] != 'auto' ) {
358// tn.width[level][sizes[i]]=data.media$group.media$thumbnail[startI+i].width;
359 }
360 else {
361 var url=tn.url[level][sizes[i]].substring(0, tn.url[level][sizes[i]].lastIndexOf('/'));
362 url=url.substring(0, url.lastIndexOf('/')) + '/';
363 tn.url[level][sizes[i]]=url+'h'+G.tn.settings.height[level][sizes[i]]+'/';
364 }
365
366 if( G.tn.settings.height[level][sizes[i]] != 'auto' ) {
367// tn.height[level][sizes[i]]=data.media$group.media$thumbnail[startI+i].height;
368 }
369 else {
370 var url=tn.url[level][sizes[i]].substring(0, tn.url[level][sizes[i]].lastIndexOf('/'));
371 url=url.substring(0, url.lastIndexOf('/')) + '/';
372 tn.url[level][sizes[i]]=url+'w'+G.tn.settings.width[level][sizes[i]]+'/';
373 }
374 }
375 }
376 return tn;
377 }
378
379
380 // -----------
381 // Initialize thumbnail sizes
382 function Init() {
383 G.picasa = {
384 // cache value in instance to avoid regeneration on each need
385 thumbSizes:''
386 };
387
388 var sfL1=1;
389 if( G.thumbnailCrop.l1 === true ) {
390 sfL1=G.O.thumbnailCropScaleFactor;
391 }
392 var sfLN=1;
393 if( G.thumbnailCrop.lN === true ) {
394 sfLN=G.O.thumbnailCropScaleFactor;
395 }
396
397 G.picasa.thumbSizes=GoogleAddOneThumbSize(G.picasa.thumbSizes, G.tn.settings.width.l1.xs*sfL1, G.tn.settings.height.l1.xs*sfL1, G.tn.settings.width.l1.xsc, G.tn.settings.height.l1.xsc );
398 G.picasa.thumbSizes=GoogleAddOneThumbSize(G.picasa.thumbSizes, G.tn.settings.width.l1.sm*sfL1, G.tn.settings.height.l1.sm*sfL1, G.tn.settings.width.l1.smc, G.tn.settings.height.l1.smc );
399 G.picasa.thumbSizes=GoogleAddOneThumbSize(G.picasa.thumbSizes, G.tn.settings.width.l1.me*sfL1, G.tn.settings.height.l1.me*sfL1, G.tn.settings.width.l1.mec, G.tn.settings.height.l1.mec );
400 G.picasa.thumbSizes=GoogleAddOneThumbSize(G.picasa.thumbSizes, G.tn.settings.width.l1.la*sfL1, G.tn.settings.height.l1.la*sfL1, G.tn.settings.width.l1.lac, G.tn.settings.height.l1.lac );
401 G.picasa.thumbSizes=GoogleAddOneThumbSize(G.picasa.thumbSizes, G.tn.settings.width.l1.xl*sfL1, G.tn.settings.height.l1.xl*sfL1, G.tn.settings.width.l1.xlc, G.tn.settings.height.l1.xlc );
402 G.picasa.thumbSizes=GoogleAddOneThumbSize(G.picasa.thumbSizes, G.tn.settings.width.lN.xs*sfLN, G.tn.settings.height.lN.xs*sfLN, G.tn.settings.width.lN.xsc, G.tn.settings.height.lN.xsc );
403 G.picasa.thumbSizes=GoogleAddOneThumbSize(G.picasa.thumbSizes, G.tn.settings.width.lN.sm*sfLN, G.tn.settings.height.lN.sm*sfLN, G.tn.settings.width.lN.smc, G.tn.settings.height.lN.smc );
404 G.picasa.thumbSizes=GoogleAddOneThumbSize(G.picasa.thumbSizes, G.tn.settings.width.lN.me*sfLN, G.tn.settings.height.lN.me*sfLN, G.tn.settings.width.lN.mec, G.tn.settings.height.lN.mec );
405 G.picasa.thumbSizes=GoogleAddOneThumbSize(G.picasa.thumbSizes, G.tn.settings.width.lN.la*sfLN, G.tn.settings.height.lN.la*sfLN, G.tn.settings.width.lN.lac, G.tn.settings.height.lN.lac );
406 G.picasa.thumbSizes=GoogleAddOneThumbSize(G.picasa.thumbSizes, G.tn.settings.width.lN.xl*sfLN, G.tn.settings.height.lN.xl*sfLN, G.tn.settings.width.lN.xlc, G.tn.settings.height.lN.xlc );
407 }
408
409 function GoogleAddOneThumbSize(thumbSizes, v1, v2, c1, c2 ) {
410 var v = Math.ceil( v2 * G.tn.scale ) + c2;
411 // if( v1 == 'auto' ) {
412 if( isNaN(v1) ) {
413 v = Math.ceil( v2 * G.tn.scale ) + c2;
414 }
415 // else if( v2 == 'auto' ) {
416 else if( isNaN(v2) ) {
417 v = Math.ceil( v1 * G.tn.scale ) + c1;
418 }
419 else if( v1 > v2 ) {
420 v = Math.ceil( v1 * G.tn.scale ) + c1;
421 }
422
423 if( thumbSizes.length > 0 ) {
424 thumbSizes += ',';
425 }
426 thumbSizes += v;
427 return thumbSizes;
428 }
429
430
431 // shortcuts to NGY2Tools functions (with context)
432 var PreloaderDisplay = NGY2Tools.PreloaderDisplay.bind(G);
433 // var NanoAlert = NGY2Tools.NanoAlert.bind(G);
434 var NanoAlert = NGY2Tools.NanoAlert;
435 var GetImageTitleFromURL = NGY2Tools.GetImageTitleFromURL.bind(G);
436 var FilterAlbumName = NGY2Tools.FilterAlbumName.bind(G);
437 var AlbumPostProcess = NGY2Tools.AlbumPostProcess.bind(G);
438
439 switch( fnName ){
440 case 'GetHiddenAlbums':
441 var hiddenAlbums = arguments[2],
442 callback = arguments[3];
443 GetHiddenAlbums(hiddenAlbums, callback);
444 break;
445 case 'AlbumGetContent':
446 var albumID = arguments[2],
447 callback = arguments[3],
448 cbParam1 = arguments[4],
449 cbParam2 = arguments[5];
450 AlbumGetContent(albumID, callback, cbParam1, cbParam2);
451 break;
452 case 'Init':
453 Init();
454 break;
455 case '':
456 break;
457 case '':
458 break;
459 }
460
461 };
462
463// END GOOGLE DATA SOURCE FOR NANOGALLERY2
464}( jQuery ));
465
466
467
468
469
\No newline at end of file