UNPKG

12.4 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 nanogp2 #####
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 if (data.description !== undefined ){
149 itemDescription = data.description
150 }
151 if( G.O.thumbnailLabel.get('title') != '' ) {
152 itemTitle = GetImageTitleFromURL( data.filename );
153 }
154 }
155 else {
156 itemTitle = data.title;
157 }
158 if( itemTitle == undefined ) {
159 // may happen...
160 itemTitle = '';
161 }
162
163 var itemID = data.id;
164 if( kind == 'album' ) {
165 if( !FilterAlbumName(itemTitle, itemID) || data.coverPhotoBaseUrl == undefined ) {
166 return true;
167 }
168 }
169
170 // create ngy2 item
171 var newItem = NGY2Item.New( G, itemTitle, itemDescription, itemID, albumID, kind, '' );
172
173 var width = 0;
174 var height = 0;
175
176 // set the image src
177 var src = '';
178 if( kind == 'image' ) {
179 src = data.baseUrl;
180 if( !G.O.viewerZoom && G.O.viewerZoom != undefined ) {
181 if( window.screen.width > window.screen.height ) {
182 src += '=w' + window.screen.width;
183 }
184 else {
185 src = s + '=h' + window.screen.height;
186 }
187 }
188 else {
189 // use full resolution image
190 src += '=h' + data.mediaMetadata.height + '-w' + data.mediaMetadata.width;
191
192 // use original image
193 // src += '=d';
194 }
195
196 // image's URL
197 newItem.setMediaURL( src, 'img');
198
199 // image size
200 if( data.mediaMetadata.width !== undefined ) {
201 newItem.imageWidth = parseInt(data.mediaMetadata.width);
202 width = newItem.imageWidth;
203 }
204 if( data.mediaMetadata.height !== undefined ) {
205 newItem.imageHeight=parseInt(data.mediaMetadata.height);
206 height = newItem.imageHeight;
207 }
208
209 // if( data.media$group != null && data.media$group.media$credit != null && data.media$group.media$credit.length > 0 ) {
210 // newItem.author=data.media$group.media$credit[0].$t;
211 // }
212
213 // Photo
214 if( data.mediaMetadata.photo !== undefined ) {
215 // exif data
216 if( data.mediaMetadata.photo.exposureTime != undefined ) {
217 newItem.exif.exposure = data.mediaMetadata.photo.exposureTime;
218 }
219 if( data.mediaMetadata.photo.focalLength != undefined ) {
220 newItem.exif.focallength = data.mediaMetadata.photo.focalLength;
221 }
222 if( data.mediaMetadata.photo.apertureFNumber != undefined ) {
223 newItem.exif.fstop = data.mediaMetadata.photo.apertureFNumber;
224 }
225 if( data.mediaMetadata.photo.isoEquivalent != undefined ) {
226 newItem.exif.iso = data.mediaMetadata.photo.isoEquivalent;
227 }
228 if( data.mediaMetadata.photo.cameraModel != undefined ) {
229 newItem.exif.model = data.mediaMetadata.photo.cameraModel;
230 }
231 }
232
233 // Video
234 if( data.mediaMetadata.video !== undefined ) {
235 if( data.mediaMetadata.video.cameraModel != undefined ) {
236 newItem.exif.model = data.mediaMetadata.video.cameraModel;
237 }
238
239 newItem.downloadURL = data.baseUrl + '=dv'; // set the download URL for the video
240
241 // newItem.mediaKind = 'selfhosted';
242 // 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>';
243 }
244
245 }
246 else {
247 // newItem.author = data.author[0].name.$t;
248 newItem.numberItems = data.mediaItemsCount;
249 }
250
251 // set the URL of the thumbnails images
252 newItem.thumbs=GoogleThumbSetSizes2('l1', newItem.thumbs, data, kind, height, width );
253 newItem.thumbs=GoogleThumbSetSizes2('lN', newItem.thumbs, data, kind,height ,width );
254
255 // post-process callback
256 var fu = G.O.fnProcessData;
257 if( fu !== null ) {
258 typeof fu == 'function' ? fu(newItem, 'google2', data) : window[fu](newItem, 'google2', data);
259 }
260
261 }
262 });
263
264 G.I[albumIdx].contentIsLoaded = true; // album's content is ready
265 }
266
267 // -----------
268 // Set thumbnail sizes (width and height) and URLs (for all resolutions (xs, sm, me, la, xl) and levels (l1, lN)
269 function GoogleThumbSetSizes2(level, tn, data, kind, height, width ) {
270 var sizes=['xs','sm','me','la','xl'];
271
272 for(var i=0; i<sizes.length; i++ ) {
273
274 // media
275 if( kind == 'image' ) {
276 if( G.tn.settings.width[level][sizes[i]] == 'auto' ) {
277 let ratio1 = width / height;
278 tn.height[level][sizes[i]] = G.tn.settings.getH(level, sizes[i]);
279 tn.width[level][sizes[i]] = G.tn.settings.getH(level, sizes[i]) * ratio1;
280 tn.url[level][sizes[i]] = data.baseUrl + '=h' + G.tn.settings.getH(level, sizes[i]);
281 continue;
282 }
283 if( G.tn.settings.height[level][sizes[i]] == 'auto' ) {
284 let ratio1 = height / width;
285 tn.width[level][sizes[i]] = G.tn.settings.getW(level, sizes[i]);
286 tn.height[level][sizes[i]] = G.tn.settings.getW(level, sizes[i]) * ratio1;
287 tn.url[level][sizes[i]] = data.baseUrl + '=w' + G.tn.settings.getW(level, sizes[i]);
288 continue;
289 }
290
291 tn.height[level][sizes[i]] = G.tn.settings.getH(level, sizes[i]);
292 tn.width[level][sizes[i]] = G.tn.settings.getW(level, sizes[i]);
293 tn.url[level][sizes[i]] = data.baseUrl + '=w' + G.tn.settings.getW(level, sizes[i]);
294
295 }
296
297 // album
298 if( kind == 'album' ) {
299 if( G.tn.settings.width[level][sizes[i]] == 'auto' ) {
300 tn.url[level][sizes[i]]= data.coverPhotoBaseUrl + '=h' + G.tn.settings.getH(level, sizes[i]);
301 continue;
302 }
303 if( G.tn.settings.height[level][sizes[i]] == 'auto' ) {
304 tn.url[level][sizes[i]]= data.coverPhotoBaseUrl + '=w' + G.tn.settings.getW(level, sizes[i]);
305 continue;
306 }
307 // var w = G.tn.settings.mosaic[level + 'Factor']['w'][sizes[i]];
308 tn.url[level][sizes[i]]= data.coverPhotoBaseUrl + '=h' + G.tn.settings.getH(level, sizes[i]) + '-w' + G.tn.settings.getW(level, sizes[i]);
309
310 }
311 }
312
313 return tn;
314 }
315
316
317
318 // -----------
319 // Initialization
320 function Init() {
321 }
322
323
324 // shortcuts to NGY2Tools functions (with context)
325 var PreloaderDisplay = NGY2Tools.PreloaderDisplay.bind(G);
326 // var NanoAlert = NGY2Tools.NanoAlert.bind(G);
327 var NanoAlert = NGY2Tools.NanoAlert;
328 var GetImageTitleFromURL = NGY2Tools.GetImageTitleFromURL.bind(G);
329 var FilterAlbumName = NGY2Tools.FilterAlbumName.bind(G);
330 var AlbumPostProcess = NGY2Tools.AlbumPostProcess.bind(G);
331
332 switch( fnName ){
333 case 'AlbumGetContent':
334 var albumID = arguments[2],
335 callback2 = arguments[3],
336 cbParam1 = arguments[4],
337 cbParam2 = arguments[5];
338 AlbumGetContent(albumID, callback2, cbParam1, cbParam2);
339 break;
340 case 'Init':
341 Init();
342 break;
343 case '':
344 break;
345 }
346
347 };
348
349// END GOOGLE DATA SOURCE FOR NANOGALLERY2
350// }( jQuery ));
351}));
352
353
354
355
\No newline at end of file