UNPKG

12.2 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// ##### requires nanogp #####
13// ###################################################
14
15
16(function (factory) {
17 "use strict";
18 if (typeof define === 'function' && define.amd) {
19 // AMD. Register as an anonymous module.
20 define(['jquery', 'nanogallery2'], factory);
21 } else if (typeof exports === 'object' && typeof require === 'function') {
22 // Browserify
23 factory(require(['jquery', 'nanogallery2']));
24 } else {
25 // Browser globals
26 factory(jQuery);
27 }
28}(function ($) {
29// ;(function ($) {
30
31 jQuery.nanogallery2.data_google2 = function (instance, fnName){
32 var G=instance; // current nanogallery2 instance
33
34
35 /** @function AlbumGetContent */
36 var AlbumGetContent = function(albumID, fnToCall, fnParam1, fnParam2) {
37
38 var url = '';
39 var kind = 'image';
40 var albumIdx = NGY2Item.GetIdx(G, albumID);
41
42 var maxResults='';
43 if( G.galleryMaxItems.Get() > 0 ) {
44 maxResults = '&max-results=' + G.galleryMaxItems.Get();
45 }
46
47 var gat=''; // global authorization (using the BUILDER)
48 if( typeof ngy2_pwa_at !== 'undefined' ) {
49 gat=ngy2_pwa_at;
50 }
51
52 if( albumID == 0 ) {
53 // RETRIEVE THE LIST OF ALBUMS
54 if( gat != '' ) {
55 // in builder
56 // url += '?alt=json&v=3&kind=album&deprecation-extension=true&thumbsize='+G.picasa.thumbSizes+maxResults+'&rnd=' + (new Date().getTime()) + '&access_token=' + gat;
57 url = 'https://photoslibrary.googleapis.com/v1/albums';
58 }
59 else {
60 // NANOGP2
61 // url=G.O.google2URL + '?nguserid='+G.O.userID+'&alt=json&v=3&kind=album&thumbsize='+G.picasa.thumbSizes+maxResults+'&rnd=' + (new Date().getTime());
62 url = G.O.google2URL + '?nguserid=' + G.O.userID + '&alt=json&v=3&kind=album' + maxResults + '&rnd=' + (new Date().getTime());
63 }
64 kind='album';
65
66 }
67 else {
68 // RETRIEVE THE CONTENT OF ONE ALBUM (=MEDIAS)
69 if( gat != '' ) {
70 // in builder
71 // url += '/albumid/'+albumID+'?alt=json&kind=photo&deprecation-extension=true&thumbsize='+G.picasa.thumbSizes+maxResults+'&imgmax=d&access_token=' + gat;
72 // url += '/albumid/'+albumID+'?alt=json&kind=photo&deprecation-extension=true&thumbsize='+G.picasa.thumbSizes+maxResults+'&imgmax=d&access_token=' + gat;
73 url = 'https://photoslibrary.googleapis.com/v1/mediaItems:search';
74 }
75 else {
76 // nanogp
77 // url = G.O.google2URL + '?nguserid='+G.O.userID+'&ngalbumid='+albumID+'&alt=json&v=3&kind=photo&thumbsize='+G.picasa.thumbSizes+maxResults+'&imgmax=d';
78 url = G.O.google2URL + '?nguserid=' + G.O.userID + '&ngalbumid=' + albumID + '&alt=json&v=3&kind=photo&' + maxResults;
79 }
80 }
81
82 if( G.O.debugMode ) { console.log('Google Photos URL: ' + url); }
83
84 PreloaderDisplay(true);
85 jQuery.ajaxSetup({ cache: false });
86 jQuery.support.cors = true;
87 try {
88 var tId = setTimeout( function() {
89 // workaround to handle JSONP (cross-domain) errors
90 PreloaderDisplay(false);
91 NanoAlert('Could not retrieve AJAX data...');
92 }, 60000 );
93
94 jQuery.getJSON( url + '&callback=?', function(data) {
95
96 if( data.nano_status == 'error' ) {
97 clearTimeout(tId);
98 PreloaderDisplay(false);
99 NanoAlert(G, "Could not retrieve Google data. Error: " + data.nano_message);
100 return;
101 }
102 clearTimeout(tId);
103 PreloaderDisplay(false);
104 GoogleParseData( albumIdx, kind, data );
105 AlbumPostProcess(albumID);
106 if( fnToCall !== null && fnToCall !== undefined) {
107 fnToCall( fnParam1, fnParam2, null );
108 }
109
110 })
111 .fail( function(jqxhr, textStatus, error) {
112 clearTimeout(tId);
113 PreloaderDisplay(false);
114
115 var k=''
116 for(var key in jqxhr) {
117 k+= key + '=' + jqxhr[key] +'<br>';
118 }
119 var err = textStatus + ', ' + error + ' ' + k + '<br><br>URL:'+url;
120 NanoAlert(G, "Could not retrieve Google data. Error: " + err);
121 });
122 }
123 catch(e) {
124 NanoAlert(G, "Could not retrieve Google data. Error: " + e);
125 }
126 }
127
128
129 // -----------
130 // Retrieve items from a Google Photos data stream
131 // items can be images/viedos or albums
132 function GoogleParseData(albumIdx, kind, data) {
133
134 if( G.O.debugMode ) {
135 console.log('Google Photos data:');
136 console.dir(data);
137 }
138 var albumID = G.I[albumIdx].GetID();
139
140 // iterate and parse each item
141 jQuery.each(data, function(i,data){
142
143 if( typeof data === 'object' && data !== null ) { // only objects
144
145 var itemDescription = '';
146 var itemTitle = '';
147 if( kind == 'image') {
148 itemTitle = data.description;
149 }
150 else {
151 itemTitle = data.title;
152 }
153 if( itemTitle == undefined ) {
154 // may happen...
155 itemTitle = '';
156 }
157
158 var itemID = data.id;
159 if( kind == 'album' ) {
160 if( !FilterAlbumName(itemTitle, itemID) || data.coverPhotoBaseUrl == undefined ) {
161 return true;
162 }
163 }
164
165 // create ngy2 item
166 var newItem = NGY2Item.New( G, itemTitle, itemDescription, itemID, albumID, kind, '' );
167
168 var width = 0;
169 var height = 0;
170
171 // set the image src
172 var src = '';
173 if( kind == 'image' ) {
174 src = data.baseUrl;
175 if( !G.O.viewerZoom && G.O.viewerZoom != undefined ) {
176 if( window.screen.width > window.screen.height ) {
177 src += '=w' + window.screen.width;
178 }
179 else {
180 src = s + '=h' + window.screen.height;
181 }
182 }
183 else {
184 // use full resolution image
185 src += '=h' + data.mediaMetadata.height + '-w' + data.mediaMetadata.width;
186
187 // use original image
188 // src += '=d';
189 }
190
191 // image's URL
192 newItem.setMediaURL( src, 'img');
193
194 // image size
195 if( data.mediaMetadata.width !== undefined ) {
196 newItem.imageWidth = parseInt(data.mediaMetadata.width);
197 width = newItem.imageWidth;
198 }
199 if( data.mediaMetadata.height !== undefined ) {
200 newItem.imageHeight=parseInt(data.mediaMetadata.height);
201 height = newItem.imageHeight;
202 }
203
204 // if( data.media$group != null && data.media$group.media$credit != null && data.media$group.media$credit.length > 0 ) {
205 // newItem.author=data.media$group.media$credit[0].$t;
206 // }
207
208 // Photo
209 if( data.mediaMetadata.photo !== undefined ) {
210 // exif data
211 if( data.mediaMetadata.photo.exposureTime != undefined ) {
212 newItem.exif.exposure = data.mediaMetadata.photo.exposureTime;
213 }
214 if( data.mediaMetadata.photo.focalLength != undefined ) {
215 newItem.exif.focallength = data.mediaMetadata.photo.focalLength;
216 }
217 if( data.mediaMetadata.photo.apertureFNumber != undefined ) {
218 newItem.exif.fstop = data.mediaMetadata.photo.apertureFNumber;
219 }
220 if( data.mediaMetadata.photo.isoEquivalent != undefined ) {
221 newItem.exif.iso = data.mediaMetadata.photo.isoEquivalent;
222 }
223 if( data.mediaMetadata.photo.cameraModel != undefined ) {
224 newItem.exif.model = data.mediaMetadata.photo.cameraModel;
225 }
226 }
227
228 // Video
229 if( data.mediaMetadata.video !== undefined ) {
230 if( data.mediaMetadata.video.cameraModel != undefined ) {
231 newItem.exif.model = data.mediaMetadata.video.cameraModel;
232 }
233
234 newItem.downloadURL = data.baseUrl + '=dv'; // set the download URL for the video
235
236 // newItem.mediaKind = 'selfhosted';
237 // newItem.mediaMarkup = '<video controls class="nGY2ViewerMedia"><source src="'+ newItem.src +'" type="video/'+ 'video/mp4' +'" preload="auto">Your browser does not support the video tag (HTML 5).</video>';
238 }
239
240 }
241 else {
242 // newItem.author = data.author[0].name.$t;
243 newItem.numberItems = data.mediaItemsCount;
244 }
245
246 // set the URL of the thumbnails images
247 newItem.thumbs=GoogleThumbSetSizes2('l1', newItem.thumbs, data, kind, height, width );
248 newItem.thumbs=GoogleThumbSetSizes2('lN', newItem.thumbs, data, kind,height ,width );
249
250 // post-process callback
251 var fu = G.O.fnProcessData;
252 if( fu !== null ) {
253 typeof fu == 'function' ? fu(newItem, 'google2', data) : window[fu](newItem, 'google2', data);
254 }
255
256 }
257 });
258
259 G.I[albumIdx].contentIsLoaded = true; // album's content is ready
260 }
261
262 // -----------
263 // Set thumbnail sizes (width and height) and URLs (for all resolutions (xs, sm, me, la, xl) and levels (l1, lN)
264 function GoogleThumbSetSizes2(level, tn, data, kind, height, width ) {
265 var sizes=['xs','sm','me','la','xl'];
266
267 for(var i=0; i<sizes.length; i++ ) {
268
269 // media
270 if( kind == 'image' ) {
271 if( G.tn.settings.width[level][sizes[i]] == 'auto' ) {
272 var ratio1 = width / height;
273 tn.height[level][sizes[i]] = G.tn.settings.getH(level, sizes[i]);
274 tn.width[level][sizes[i]] = G.tn.settings.getH(level, sizes[i]) * ratio1;
275 tn.url[level][sizes[i]] = data.baseUrl + '=h' + G.tn.settings.getH(level, sizes[i]);
276 continue;
277 }
278 if( G.tn.settings.height[level][sizes[i]] == 'auto' ) {
279 var ratio1 = height / width;
280 tn.width[level][sizes[i]] = G.tn.settings.getW(level, sizes[i]);
281 tn.height[level][sizes[i]] = G.tn.settings.getW(level, sizes[i]) * ratio1;
282 tn.url[level][sizes[i]] = data.baseUrl + '=w' + G.tn.settings.getW(level, sizes[i]);
283 continue;
284 }
285
286 tn.height[level][sizes[i]] = G.tn.settings.getH(level, sizes[i]);
287 tn.width[level][sizes[i]] = G.tn.settings.getW(level, sizes[i]);
288 tn.url[level][sizes[i]] = data.baseUrl + '=w' + G.tn.settings.getW(level, sizes[i]);
289
290 }
291
292 // album
293 if( kind == 'album' ) {
294 if( G.tn.settings.width[level][sizes[i]] == 'auto' ) {
295 tn.url[level][sizes[i]]= data.coverPhotoBaseUrl + '=h' + G.tn.settings.getH(level, sizes[i]);
296 continue;
297 }
298 if( G.tn.settings.height[level][sizes[i]] == 'auto' ) {
299 tn.url[level][sizes[i]]= data.coverPhotoBaseUrl + '=w' + G.tn.settings.getW(level, sizes[i]);
300 continue;
301 }
302 var w=G.tn.settings.mosaic[level + 'Factor']['w'][sizes[i]];
303 tn.url[level][sizes[i]]= data.coverPhotoBaseUrl + '=h' + G.tn.settings.getH(level, sizes[i]) + '-w' + G.tn.settings.getW(level, sizes[i]);
304
305 }
306 }
307
308 return tn;
309 }
310
311
312
313 // -----------
314 // Initialization
315 function Init() {
316 }
317
318
319 // shortcuts to NGY2Tools functions (with context)
320 var PreloaderDisplay = NGY2Tools.PreloaderDisplay.bind(G);
321 // var NanoAlert = NGY2Tools.NanoAlert.bind(G);
322 var NanoAlert = NGY2Tools.NanoAlert;
323 var GetImageTitleFromURL = NGY2Tools.GetImageTitleFromURL.bind(G);
324 var FilterAlbumName = NGY2Tools.FilterAlbumName.bind(G);
325 var AlbumPostProcess = NGY2Tools.AlbumPostProcess.bind(G);
326
327 switch( fnName ){
328 case 'AlbumGetContent':
329 var albumID = arguments[2],
330 callback2 = arguments[3],
331 cbParam1 = arguments[4],
332 cbParam2 = arguments[5];
333 AlbumGetContent(albumID, callback2, cbParam1, cbParam2);
334 break;
335 case 'Init':
336 Init();
337 break;
338 case '':
339 break;
340 }
341
342 };
343
344// END GOOGLE DATA SOURCE FOR NANOGALLERY2
345// }( jQuery ));
346}));
347
348
349
350
\No newline at end of file