UNPKG

14.8 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 ApiKey : "2f0e634b471fdb47446abcb9c5afebdc"
47 };
48
49
50 /** @function AlbumGetContent */
51 var AlbumGetContent = function(albumID, fnToCall, fnParam1, fnParam2) {
52
53 var albumIdx = NGY2Item.GetIdx(G, albumID);
54 var url = '';
55 var kind = 'image';
56 // photos
57 if( G.O.photoset.toUpperCase() == 'NONE' || G.O.album.toUpperCase() == 'NONE' ) {
58 // get photos from full photostream
59 url = Flickr.url() + "?&method=flickr.people.getPublicPhotos&api_key=" + Flickr.ApiKey + "&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";
60 }
61 else
62 if( G.I[albumIdx].GetID() == 0 ) {
63 // retrieve the list of albums
64 url = Flickr.url() + "?&method=flickr.photosets.getList&api_key=" + Flickr.ApiKey + "&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";
65 kind='album';
66 }
67 else {
68 // photos from one specific photoset
69 url = Flickr.url() + "?&method=flickr.photosets.getPhotos&api_key=" + Flickr.ApiKey + "&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";
70 }
71
72 if( G.O.debugMode ) { console.log('Flickr URL: ' + url); }
73
74 PreloaderDisplay(true);
75 jQuery.ajaxSetup({ cache: false });
76 jQuery.support.cors = true;
77
78 var tId = setTimeout( function() {
79 // workaround to handle JSONP (cross-domain) errors
80 PreloaderDisplay(false);
81 NanoAlert(G, 'Could not retrieve AJAX data...');
82 }, 60000 );
83
84 var sourceData=[];
85
86 // Process the downloaded data
87 var FlickrGetDone = function() {
88 clearTimeout(tId);
89 PreloaderDisplay(false);
90
91 if( kind == 'album' ) {
92 FlickrParsePhotoSets(albumIdx, albumID, sourceData);
93 }
94 else {
95 FlickrParsePhotos(albumIdx, albumID, sourceData);
96 }
97
98 AlbumPostProcess(albumID);
99 if( fnToCall !== null && fnToCall !== undefined) {
100 fnToCall( fnParam1, fnParam2, null );
101 }
102 }
103
104 // download one page of data (=500 entries)
105 var FlickrGetOnePage = function( url, page ) {
106 jQuery.getJSON( url + '&page=' + page + '&jsoncallback=?', function(data, status, xhr) {
107
108 var pages=0;
109 if( kind == 'album' ) {
110 if( data.stat !== undefined && data.stat === 'fail' ) {
111 NanoAlert(G, "Could not retrieve Flickr album list: " + data.message + " (code: "+data.code+").");
112 return false;
113 }
114 sourceData=sourceData.concat(data.photosets.photoset);
115 pages=data.photosets.pages;
116 }
117 else {
118 if( G.O.photoset.toUpperCase() == 'NONE' || G.O.album.toUpperCase() == 'NONE' ) {
119 // content of full photoset
120 sourceData=sourceData.concat(data.photos.photo);
121 pages=data.photos.pages;
122 }
123 else {
124 // content of one album
125 if( data.stat !== undefined && data.stat === 'fail' ) {
126 NanoAlert(G, "Could not retrieve Flickr album: " + data.message + " (code: "+data.code+").");
127 return false;
128 }
129 if( G.I[albumIdx].title == '' ) {
130 G.I[albumIdx].title=data.photoset.title;
131 }
132 sourceData=sourceData.concat(data.photoset.photo);
133 pages=data.photoset.pages;
134 }
135
136 }
137
138 if( pages > page ) {
139 FlickrGetOnePage(url, page+1);
140 }
141 else {
142 FlickrGetDone();
143 }
144 })
145 .fail( function(jqxhr, textStatus, error) {
146 clearTimeout(tId);
147 PreloaderDisplay(false);
148 NanoAlert(G, "Could not retrieve Flickr ajax data: " + textStatus + ', ' + error);
149 });
150
151 }
152
153 FlickrGetOnePage(url, 1);
154
155 }
156
157
158
159 // -----------
160 // Retrieve items for one Flickr photoset
161 function FlickrParsePhotos( albumIdx, albumID, source ) {
162
163 if( G.O.debugMode ) {
164 console.log('Flickr parse photos:');
165 console.dir(source);
166 }
167
168 jQuery.each(source, function(i,item){
169
170 var itemID = item.id;
171
172 var imgUrl=item.url_sq; //fallback size
173
174 // get the title
175 var itemTitle = item.title;
176 if( G.O.thumbnailLabel.get('title') != '' ) {
177 itemTitle=GetImageTitleFromURL(imgUrl);
178 }
179
180 // get the description
181 var itemDescription=item.description._content;
182
183 // retrieve the image size with highest available resolution
184 var imgW=75, imgH=75;
185 var start=Flickr.photoAvailableSizesStr.length-1;
186 if( G.O.flickrSkipOriginal ) { start--; }
187 for( var i = start; i>=0 ; i-- ) {
188 if( item['url_'+Flickr.photoAvailableSizesStr[i]] != undefined ) {
189 imgUrl=item['url_'+Flickr.photoAvailableSizesStr[i]];
190 imgW=parseInt(item['width_'+Flickr.photoAvailableSizesStr[i]]);
191 imgH=parseInt(item['height_'+Flickr.photoAvailableSizesStr[i]]);
192 break;
193 }
194 }
195
196 var sizes = {};
197 for( var p in item ) {
198 if( p.indexOf('height_') == 0 || p.indexOf('width_') == 0 || p.indexOf('url_') == 0 ) {
199 sizes[p]=item[p];
200 }
201 }
202
203 // tags
204 var tags = item.tags !== undefined ? item.tags : '';
205
206 // create item
207 var newItem = NGY2Item.New( G, itemTitle, itemDescription, itemID, albumID, 'image', tags );
208
209 // add image
210 newItem.setMediaURL( imgUrl, 'img');
211 newItem.imageWidth = imgW;
212 newItem.imageHeight = imgH;
213
214
215 // add thumbnails
216 var tn = {
217 url: { l1 : { xs:'', sm:'', me:'', la:'', xl:'' }, lN : { xs:'', sm:'', me:'', la:'', xl:'' } },
218 width: { l1 : { xs:0, sm:0, me:0, la:0, xl:0 }, lN : { xs:0, sm:0, me:0, la:0, xl:0 } },
219 height: { l1 : { xs:0, sm:0, me:0, la:0, xl:0 }, lN : { xs:0, sm:0, me:0, la:0, xl:0 } }
220 };
221 tn=FlickrRetrieveImages(tn, item, 'l1' );
222 tn=FlickrRetrieveImages(tn, item, 'lN' );
223 newItem.thumbs=tn;
224
225 // post-process callback
226 var fu = G.O.fnProcessData;
227 if( fu !== null ) {
228 typeof fu == 'function' ? fu(newItem, 'flickr', item) : window[fu](newItem, 'flickr', item);
229 }
230
231
232 });
233 G.I[albumIdx].contentIsLoaded=true;
234
235 }
236
237
238
239 // -----------
240 // Retrieve the list of Flickr photosets
241 function FlickrParsePhotoSets( albumIdx, albumID, source ) {
242
243 if( G.O.debugMode ) {
244 console.log('Flickr parse list of albums:');
245 console.dir(source);
246 }
247
248 jQuery.each(source, function(i,item){
249 //Get the title
250 var itemTitle = item.title._content;
251
252 if( item.visibility_can_see_set == 0 ) { return true; } // skip it
253
254 if( FilterAlbumName(itemTitle, item.id) ) {
255 var itemID=item.id;
256 //Get the description
257 var itemDescription = item.description._content != undefined ? item.description._content : '';
258
259 var sizes = {};
260 for( var p in item.primary_photo_extras) {
261 sizes[p] = item.primary_photo_extras[p];
262 }
263 var tags='';
264 if( item.primary_photo_extras !== undefined ) {
265 if( item.primary_photo_extras.tags !== undefined ) {
266 tags = item.primary_photo_extras.tags;
267 }
268 }
269
270 var newItem = NGY2Item.New( G, itemTitle, itemDescription, itemID, albumID, 'album', tags );
271 newItem.numberItems = item.photos;
272 newItem.thumbSizes = sizes;
273
274 var tn = {
275 url: { l1 : { xs:'', sm:'', me:'', la:'', xl:'' }, lN : { xs:'', sm:'', me:'', la:'', xl:'' } },
276 width: { l1 : { xs:0, sm:0, me:0, la:0, xl:0 }, lN : { xs:0, sm:0, me:0, la:0, xl:0 } },
277 height: { l1 : { xs:0, sm:0, me:0, la:0, xl:0 }, lN : { xs:0, sm:0, me:0, la:0, xl:0 } }
278 };
279 tn = FlickrRetrieveImages(tn, item.primary_photo_extras, 'l1' );
280 tn = FlickrRetrieveImages(tn, item.primary_photo_extras, 'lN' );
281 newItem.thumbs = tn;
282
283 // post-process callback
284 var fu = G.O.fnProcessData;
285 if( fu !== null ) {
286 typeof fu == 'function' ? fu(newItem, 'flickr', item) : window[fu](newItem, 'flickr', item);
287 }
288
289 }
290 });
291
292 G.I[albumIdx].contentIsLoaded=true;
293 }
294
295 function FlickrRetrieveImages(tn, item, level ) {
296
297 var sf=1;
298 if( G.tn.opt[level].crop === true ) {
299 sf=G.O.thumbnailCropScaleFactor;
300 }
301
302
303 var sizes=['xs','sm','me','la','xl'];
304 for( var i=0; i<sizes.length; i++ ) {
305 if( G.tn.settings.width[level][sizes[i]] == 'auto' || G.tn.settings.width[level][sizes[i]] == '' ) {
306 var sdir='height_';
307 var tsize=Math.ceil( G.tn.settings.height[level][sizes[i]] * G.tn.scale * sf * G.tn.settings.mosaic[level+'Factor']['h'][sizes[i]] );
308 var one=FlickrRetrieveOneImage(sdir, tsize, item );
309 tn.url[level][sizes[i]]=one.url;
310 tn.width[level][sizes[i]]=one.width;
311 tn.height[level][sizes[i]]=one.height;
312 }
313 else
314 if( G.tn.settings.height[level][sizes[i]] == 'auto' || G.tn.settings.height[level][sizes[i]] == '' ) {
315 var sdir='width_';
316 var tsize=Math.ceil( G.tn.settings.width[level][sizes[i]] * G.tn.scale * sf * G.tn.settings.mosaic[level+'Factor']['w'][sizes[i]] );
317 var one=FlickrRetrieveOneImage(sdir, tsize, item );
318 tn.url[level][sizes[i]]=one.url;
319 tn.width[level][sizes[i]]=one.width;
320 tn.height[level][sizes[i]]=one.height;
321 }
322 else {
323 var sdir='height_';
324 var tsize=Math.ceil( G.tn.settings.height[level][sizes[i]] * G.tn.scale * sf * G.tn.settings.mosaic[level+'Factor']['h'][sizes[i]] );
325 if( G.tn.settings.width[level][sizes[i]] > G.tn.settings.height[level][sizes[i]] ) {
326 sdir='width_';
327 tsize=Math.ceil( G.tn.settings.width[level][sizes[i]] * G.tn.scale * sf * G.tn.settings.mosaic[level+'Factor']['w'][sizes[i]] );
328 }
329 var one=FlickrRetrieveOneImage(sdir, tsize, item );
330 tn.url[level][sizes[i]]=one.url;
331 tn.width[level][sizes[i]]=one.width;
332 tn.height[level][sizes[i]]=one.height;
333 }
334 }
335 return tn;
336 }
337
338 function FlickrRetrieveOneImage(sdir, tsize, item ) {
339 var one={ url: '', width: 0, height: 0 };
340 var tnIndex=0;
341 for( var j=0; j < Flickr.thumbAvailableSizes.length; j++ ) {
342 var size=item[sdir+Flickr.photoAvailableSizesStr[j]];
343 if( size != undefined ) {
344 tnIndex=j;
345 if( size >= tsize ) {
346 break;
347 }
348 }
349 }
350 var fSize=Flickr.photoAvailableSizesStr[tnIndex];
351 one.url = item['url_'+fSize];
352 one.width = parseInt(item['width_'+fSize]);
353 one.height = parseInt(item['height_'+fSize]);
354 return one;
355 }
356
357
358 /** @function GetHiddenAlbums */
359 var GetHiddenAlbums = function( hiddenAlbums, callback ){
360 // not supported -> doesn't exit in Flickr
361 callback();
362 }
363
364 // -----------
365 // Initialize thumbnail sizes
366 function Init() {
367 return;
368 }
369
370
371 // shortcuts to NGY2Tools functions (with context)
372 var PreloaderDisplay = NGY2Tools.PreloaderDisplay.bind(G);
373 var NanoAlert = NGY2Tools.NanoAlert;
374 var GetImageTitleFromURL = NGY2Tools.GetImageTitleFromURL.bind(G);
375 var FilterAlbumName = NGY2Tools.FilterAlbumName.bind(G);
376 var AlbumPostProcess = NGY2Tools.AlbumPostProcess.bind(G);
377
378 switch( fnName ){
379 case 'GetHiddenAlbums':
380 var hiddenAlbums = arguments[2],
381 callback = arguments[3];
382 GetHiddenAlbums(hiddenAlbums, callback);
383 break;
384 case 'AlbumGetContent':
385 var albumID = arguments[2],
386 callback = arguments[3],
387 cbParam1 = arguments[4],
388 cbParam2 = arguments[5];
389 AlbumGetContent(albumID, callback, cbParam1, cbParam2);
390 break;
391 case 'Init':
392 Init();
393 break;
394 case '':
395 break;
396 }
397
398 };
399
400// END FLICKR DATA SOURCE FOR NANOGALLERY2
401// }( jQuery ));
402}));
403
404
405