UNPKG

15.5 kBJavaScriptView Raw
1/**!
2 * @preserve nanogallery2 - FLICKR 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 FLICKR #####
12// ############################################
13
14
15(function (factory) {
16 "use strict";
17 if (typeof define === 'function' && define.amd) {
18 // AMD. Register as an anonymous module.
19 define(['jquery', 'nanogallery2'], factory);
20 } else if (typeof exports === 'object' && typeof require === 'function') {
21 // Browserify
22 factory(require(['jquery', 'nanogallery2']));
23 } else {
24 // Browser globals
25 factory(jQuery);
26 }
27}(function ($) {
28// ;(function ($) {
29
30 jQuery.nanogallery2.data_flickr = function (instance, fnName){
31 var G = instance; // current nanogallery2 instance
32
33 // ### Flickr
34 // Details: http://www.flickr.com/services/api/misc.urls.html
35 var Flickr = {
36 url: function() {
37 // Flickr API Going SSL-Only on June 27th, 2014
38 return 'https://api.flickr.com/services/rest/';
39 },
40 thumbSize:' sq',
41 thumbAvailableSizes : new Array(75, 100, 150, 240, 500, 640),
42 thumbAvailableSizesStr : new Array('sq', 't', 'q', 's', 'm', 'z'),
43 photoSize : '0',
44 photoAvailableSizes : new Array(75, 100, 150, 240, 500, 640, 1024, 1024, 1600, 2048, 10000),
45 photoAvailableSizesStr : new Array('sq', 't', 'q', 's', 'm', 'z', 'b', 'l', 'h', 'k', 'o')
46 };
47
48
49 /** @function AlbumGetContent */
50 var AlbumGetContent = function(albumID, fnToCall, fnParam1, fnParam2) {
51 if( G.O.flickrAPIKey == '' ) {
52 NanoAlert(G, 'Please set your Flickr API Key (option flickrAPIKey)');
53 }
54
55 var albumIdx = NGY2Item.GetIdx(G, albumID);
56 var url = '';
57 var kind = 'image';
58 // photos
59 if( G.O.photoset.toUpperCase() == 'NONE' || G.O.album.toUpperCase() == 'NONE' ) {
60 // get photos from full photostream
61 url = Flickr.url() + "?&method=flickr.people.getPublicPhotos&api_key=" + G.O.flickrAPIKey + "&user_id="+G.O.userID+"&extras=description,views,tags,url_o,url_sq,url_t,url_q,url_s,url_m,url_z,url_b,url_h,url_k&per_page=500&format=json";
62 }
63 else
64 if( G.I[albumIdx].GetID() == 0 ) {
65 // retrieve the list of albums
66 url = Flickr.url() + "?&method=flickr.photosets.getList&api_key=" + G.O.flickrAPIKey + "&user_id="+G.O.userID+"&per_page=500&primary_photo_extras=tags,url_o,url_sq,url_t,url_q,url_s,url_m,url_l,url_z,url_b,url_h,url_k&format=json";
67 kind='album';
68 }
69 else {
70 // photos from one specific photoset
71 url = Flickr.url() + "?&method=flickr.photosets.getPhotos&api_key=" + G.O.flickrAPIKey + "&photoset_id="+G.I[albumIdx].GetID()+"&extras=description,views,tags,url_o,url_sq,url_t,url_q,url_s,url_m,url_l,url_z,url_b,url_h,url_k&format=json";
72 }
73
74 if( G.O.debugMode ) { console.log('Flickr URL: ' + url); }
75
76 PreloaderDisplay(true);
77 jQuery.ajaxSetup({ cache: false });
78 jQuery.support.cors = true;
79
80 var tId = setTimeout( function() {
81 // workaround to handle JSONP (cross-domain) errors
82 PreloaderDisplay(false);
83 NanoAlert(G, 'Could not retrieve AJAX data...');
84 }, 60000 );
85
86 var sourceData=[];
87
88 // Process the downloaded data
89 var FlickrGetDone = function() {
90 clearTimeout(tId);
91 PreloaderDisplay(false);
92
93 // go through sourceData, and exclude blacklisted tags
94 sourceData = FilterByTags(sourceData, G.O.tagBlockList);
95
96 if( kind == 'album' ) {
97 FlickrParsePhotoSets(albumIdx, albumID, sourceData);
98 }
99 else {
100 FlickrParsePhotos(albumIdx, albumID, sourceData);
101 }
102
103 AlbumPostProcess( albumID );
104
105 if( fnToCall !== null && fnToCall !== undefined) {
106 fnToCall( fnParam1, fnParam2, null );
107 }
108 }
109
110 // download one page of data (=500 entries)
111 var FlickrGetOnePage = function( url, page ) {
112 jQuery.getJSON( url + '&page=' + page + '&jsoncallback=?', function(data, status, xhr) {
113
114 var pages=0;
115 if( kind == 'album' ) {
116 if( data.stat !== undefined && data.stat === 'fail' ) {
117 NanoAlert(G, "Could not retrieve Flickr album list: " + data.message + " (code: "+data.code+").");
118 return false;
119 }
120 sourceData=sourceData.concat(data.photosets.photoset);
121 pages=data.photosets.pages;
122 }
123 else {
124 if( G.O.photoset.toUpperCase() == 'NONE' || G.O.album.toUpperCase() == 'NONE' ) {
125 // content of full photoset
126 sourceData=sourceData.concat(data.photos.photo);
127 pages=data.photos.pages;
128 }
129 else {
130 // content of one album
131 if( data.stat !== undefined && data.stat === 'fail' ) {
132 NanoAlert(G, "Could not retrieve Flickr album: " + data.message + " (code: "+data.code+").");
133 return false;
134 }
135 if( G.I[albumIdx].title == '' ) {
136 G.I[albumIdx].title=data.photoset.title;
137 }
138 sourceData=sourceData.concat(data.photoset.photo);
139 pages=data.photoset.pages;
140 }
141
142 }
143
144 if( pages > page ) {
145 FlickrGetOnePage(url, page+1);
146 }
147 else {
148 FlickrGetDone();
149 }
150 })
151 .fail( function(jqxhr, textStatus, error) {
152 clearTimeout(tId);
153 PreloaderDisplay(false);
154 NanoAlert(G, "Could not retrieve Flickr ajax data: " + textStatus + ', ' + error);
155 });
156
157 }
158
159 FlickrGetOnePage(url, 1);
160
161 }
162
163
164
165 // -----------
166 // Retrieve items for one Flickr photoset
167 function FlickrParsePhotos( albumIdx, albumID, source ) {
168
169 if( G.O.debugMode ) {
170 console.log('Flickr parse photos:');
171 console.dir(source);
172 }
173
174 jQuery.each(source, function(i,item){
175
176 var itemID = item.id;
177
178 var imgUrl=item.url_sq; //fallback size
179
180 // get the title
181 var itemTitle = item.title;
182 if( G.O.thumbnailLabel.get('title') != '' ) {
183 itemTitle=GetImageTitleFromURL(imgUrl);
184 }
185
186 // get the description
187 var itemDescription=item.description._content;
188
189 // retrieve the image size with highest available resolution
190 var imgW=75, imgH=75;
191 var start=Flickr.photoAvailableSizesStr.length-1;
192 if( G.O.flickrSkipOriginal ) { start--; }
193 for( var i = start; i>=0 ; i-- ) {
194 if( item['url_'+Flickr.photoAvailableSizesStr[i]] != undefined ) {
195 imgUrl=item['url_'+Flickr.photoAvailableSizesStr[i]];
196 imgW=parseInt(item['width_'+Flickr.photoAvailableSizesStr[i]]);
197 imgH=parseInt(item['height_'+Flickr.photoAvailableSizesStr[i]]);
198 break;
199 }
200 }
201
202 var sizes = {};
203 for( var p in item ) {
204 if( p.indexOf('height_') == 0 || p.indexOf('width_') == 0 || p.indexOf('url_') == 0 ) {
205 sizes[p]=item[p];
206 }
207 }
208
209 // tags
210 var tags = item.tags !== undefined ? item.tags : '';
211
212 // create item
213 var newItem = NGY2Item.New( G, itemTitle, itemDescription, itemID, albumID, 'image', tags );
214
215 // add image
216 newItem.setMediaURL( imgUrl, 'img');
217 newItem.imageWidth = imgW;
218 newItem.imageHeight = imgH;
219
220
221 // add thumbnails
222 var tn = {
223 url: { l1 : { xs:'', sm:'', me:'', la:'', xl:'' }, lN : { xs:'', sm:'', me:'', la:'', xl:'' } },
224 width: { l1 : { xs:0, sm:0, me:0, la:0, xl:0 }, lN : { xs:0, sm:0, me:0, la:0, xl:0 } },
225 height: { l1 : { xs:0, sm:0, me:0, la:0, xl:0 }, lN : { xs:0, sm:0, me:0, la:0, xl:0 } }
226 };
227 tn = FlickrRetrieveImages(tn, item, 'l1' );
228 tn = FlickrRetrieveImages(tn, item, 'lN' );
229 newItem.thumbs=tn;
230
231 // post-process callback
232 var fu = G.O.fnProcessData;
233 if( fu !== null ) {
234 typeof fu == 'function' ? fu(newItem, 'flickr', item) : window[fu](newItem, 'flickr', item);
235 }
236
237
238 });
239 G.I[albumIdx].contentIsLoaded=true;
240
241 }
242
243
244
245 // -----------
246 // Retrieve the list of Flickr photosets
247 function FlickrParsePhotoSets( albumIdx, albumID, source ) {
248
249 if( G.O.debugMode ) {
250 console.log('Flickr parse list of albums:');
251 console.dir(source);
252 }
253
254 jQuery.each(source, function(i,item){
255 //Get the title
256 var itemTitle = item.title._content;
257
258 if( item.visibility_can_see_set == 0 ) { return true; } // skip it
259
260 if( FilterAlbumName(itemTitle, item.id) ) {
261 var itemID=item.id;
262 //Get the description
263 var itemDescription = item.description._content != undefined ? item.description._content : '';
264
265 var sizes = {};
266 for( var p in item.primary_photo_extras) {
267 sizes[p] = item.primary_photo_extras[p];
268 }
269 var tags='';
270 if( item.primary_photo_extras !== undefined ) {
271 if( item.primary_photo_extras.tags !== undefined ) {
272 tags = item.primary_photo_extras.tags;
273 }
274 }
275
276 var newItem = NGY2Item.New( G, itemTitle, itemDescription, itemID, albumID, 'album', tags );
277 newItem.numberItems = item.photos;
278 newItem.thumbSizes = sizes;
279
280 var tn = {
281 url: { l1 : { xs:'', sm:'', me:'', la:'', xl:'' }, lN : { xs:'', sm:'', me:'', la:'', xl:'' } },
282 width: { l1 : { xs:0, sm:0, me:0, la:0, xl:0 }, lN : { xs:0, sm:0, me:0, la:0, xl:0 } },
283 height: { l1 : { xs:0, sm:0, me:0, la:0, xl:0 }, lN : { xs:0, sm:0, me:0, la:0, xl:0 } }
284 };
285 tn = FlickrRetrieveImages(tn, item.primary_photo_extras, 'l1' );
286 tn = FlickrRetrieveImages(tn, item.primary_photo_extras, 'lN' );
287 newItem.thumbs = tn;
288
289 // post-process callback
290 var fu = G.O.fnProcessData;
291 if( fu !== null ) {
292 typeof fu == 'function' ? fu(newItem, 'flickr', item) : window[fu](newItem, 'flickr', item);
293 }
294
295 }
296 });
297
298 G.I[albumIdx].contentIsLoaded=true;
299 }
300
301 function FlickrRetrieveImages(tn, item, level ) {
302
303 var sf=1;
304 if( G.tn.opt[level].crop === true ) {
305 sf=G.O.thumbnailCropScaleFactor;
306 }
307
308
309 var sizes=['xs','sm','me','la','xl'];
310 for( var i=0; i<sizes.length; i++ ) {
311 if( G.tn.settings.width[level][sizes[i]] == 'auto' || G.tn.settings.width[level][sizes[i]] == '' ) {
312 let sdir='height_';
313 let tsize=Math.ceil( G.tn.settings.height[level][sizes[i]] * G.tn.scale * sf * G.tn.settings.mosaic[level+'Factor']['h'][sizes[i]] );
314 let one=FlickrRetrieveOneImage(sdir, tsize, item );
315 tn.url[level][sizes[i]]=one.url;
316 tn.width[level][sizes[i]]=one.width;
317 tn.height[level][sizes[i]]=one.height;
318 }
319 else
320 if( G.tn.settings.height[level][sizes[i]] == 'auto' || G.tn.settings.height[level][sizes[i]] == '' ) {
321 let sdir='width_';
322 let tsize=Math.ceil( G.tn.settings.width[level][sizes[i]] * G.tn.scale * sf * G.tn.settings.mosaic[level+'Factor']['w'][sizes[i]] );
323 let one=FlickrRetrieveOneImage(sdir, tsize, item );
324 tn.url[level][sizes[i]]=one.url;
325 tn.width[level][sizes[i]]=one.width;
326 tn.height[level][sizes[i]]=one.height;
327 }
328 else {
329 let sdir='height_';
330 let tsize=Math.ceil( G.tn.settings.height[level][sizes[i]] * G.tn.scale * sf * G.tn.settings.mosaic[level+'Factor']['h'][sizes[i]] );
331 if( G.tn.settings.width[level][sizes[i]] > G.tn.settings.height[level][sizes[i]] ) {
332 sdir='width_';
333 tsize=Math.ceil( G.tn.settings.width[level][sizes[i]] * G.tn.scale * sf * G.tn.settings.mosaic[level+'Factor']['w'][sizes[i]] );
334 }
335 let one=FlickrRetrieveOneImage(sdir, tsize, item );
336 tn.url[level][sizes[i]]=one.url;
337 tn.width[level][sizes[i]]=one.width;
338 tn.height[level][sizes[i]]=one.height;
339 }
340 }
341 return tn;
342 }
343
344 function FlickrRetrieveOneImage(sdir, tsize, item ) {
345 var one={ url: '', width: 0, height: 0 };
346 var tnIndex=0;
347 for( var j=0; j < Flickr.thumbAvailableSizes.length; j++ ) {
348 var size=item[sdir+Flickr.photoAvailableSizesStr[j]];
349 if( size != undefined ) {
350 tnIndex=j;
351 if( size >= tsize ) {
352 break;
353 }
354 }
355 }
356 var fSize=Flickr.photoAvailableSizesStr[tnIndex];
357 one.url = item['url_'+fSize];
358 one.width = parseInt(item['width_'+fSize]);
359 one.height = parseInt(item['height_'+fSize]);
360 return one;
361 }
362
363 var FilterByTags = function(data, tagBlockList) {
364 if( tagBlockList!= '' && data != undefined) {
365 data = data.filter(function (item) {
366 var regex = new RegExp( tagBlockList, "i");
367 var tagsToTest = [item.tags];
368 if ( Array.isArray(item.tags) ) {
369 tagsToTest = item.tags;
370 }
371 return ! tagsToTest.some( function (x) { return regex.test(x); } );
372 });
373 }
374 return data;
375 };
376
377 /** @function GetHiddenAlbums */
378 // var GetHiddenAlbums = function( hiddenAlbums, callback ){
379 // not supported -> doesn't exit in Flickr
380 // callback();
381 // }
382
383 // -----------
384 // Initialize thumbnail sizes
385 function Init() {
386 return;
387 }
388
389
390 // shortcuts to NGY2Tools functions (with context)
391 var PreloaderDisplay = NGY2Tools.PreloaderDisplay.bind(G);
392 var NanoAlert = NGY2Tools.NanoAlert;
393 var GetImageTitleFromURL = NGY2Tools.GetImageTitleFromURL.bind(G);
394 var FilterAlbumName = NGY2Tools.FilterAlbumName.bind(G);
395 var AlbumPostProcess = NGY2Tools.AlbumPostProcess.bind(G);
396
397 switch( fnName ){
398 // case 'GetHiddenAlbums':
399 // var hiddenAlbums = arguments[2],
400 // callback = arguments[3];
401 // GetHiddenAlbums(hiddenAlbums, callback);
402 // break;
403 case 'AlbumGetContent':
404 var albumID = arguments[2],
405 callback = arguments[3],
406 cbParam1 = arguments[4],
407 cbParam2 = arguments[5];
408 AlbumGetContent(albumID, callback, cbParam1, cbParam2);
409 break;
410 case 'Init':
411 Init();
412 break;
413 case '':
414 break;
415 }
416
417 };
418
419// END FLICKR DATA SOURCE FOR NANOGALLERY2
420// }( jQuery ));
421}));
422
423
424