UNPKG

nanogallery2

Version:

modern photo / video gallery and lightbox

425 lines (351 loc) 15.5 kB
/**! * @preserve nanogallery2 - FLICKR data provider * Homepage: http://nanogallery2.nanostudio.org * Sources: https://github.com/nanostudio-org/nanogallery2 * * License: GPLv3 and commercial licence * */ // ############################################ // ##### nanogallery2 - module for FLICKR ##### // ############################################ (function (factory) { "use strict"; if (typeof define === 'function' && define.amd) { // AMD. Register as an anonymous module. define(['jquery', 'nanogallery2'], factory); } else if (typeof exports === 'object' && typeof require === 'function') { // Browserify factory(require(['jquery', 'nanogallery2'])); } else { // Browser globals factory(jQuery); } }(function ($) { // ;(function ($) { jQuery.nanogallery2.data_flickr = function (instance, fnName){ var G = instance; // current nanogallery2 instance // ### Flickr // Details: http://www.flickr.com/services/api/misc.urls.html var Flickr = { url: function() { // Flickr API Going SSL-Only on June 27th, 2014 return 'https://api.flickr.com/services/rest/'; }, thumbSize:' sq', thumbAvailableSizes : new Array(75, 100, 150, 240, 500, 640), thumbAvailableSizesStr : new Array('sq', 't', 'q', 's', 'm', 'z'), photoSize : '0', photoAvailableSizes : new Array(75, 100, 150, 240, 500, 640, 1024, 1024, 1600, 2048, 10000), photoAvailableSizesStr : new Array('sq', 't', 'q', 's', 'm', 'z', 'b', 'l', 'h', 'k', 'o') }; /** @function AlbumGetContent */ var AlbumGetContent = function(albumID, fnToCall, fnParam1, fnParam2) { if( G.O.flickrAPIKey == '' ) { NanoAlert(G, 'Please set your Flickr API Key (option flickrAPIKey)'); } var albumIdx = NGY2Item.GetIdx(G, albumID); var url = ''; var kind = 'image'; // photos if( G.O.photoset.toUpperCase() == 'NONE' || G.O.album.toUpperCase() == 'NONE' ) { // get photos from full photostream 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"; } else if( G.I[albumIdx].GetID() == 0 ) { // retrieve the list of albums 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"; kind='album'; } else { // photos from one specific photoset 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"; } if( G.O.debugMode ) { console.log('Flickr URL: ' + url); } PreloaderDisplay(true); jQuery.ajaxSetup({ cache: false }); jQuery.support.cors = true; var tId = setTimeout( function() { // workaround to handle JSONP (cross-domain) errors PreloaderDisplay(false); NanoAlert(G, 'Could not retrieve AJAX data...'); }, 60000 ); var sourceData=[]; // Process the downloaded data var FlickrGetDone = function() { clearTimeout(tId); PreloaderDisplay(false); // go through sourceData, and exclude blacklisted tags sourceData = FilterByTags(sourceData, G.O.tagBlockList); if( kind == 'album' ) { FlickrParsePhotoSets(albumIdx, albumID, sourceData); } else { FlickrParsePhotos(albumIdx, albumID, sourceData); } AlbumPostProcess( albumID ); if( fnToCall !== null && fnToCall !== undefined) { fnToCall( fnParam1, fnParam2, null ); } } // download one page of data (=500 entries) var FlickrGetOnePage = function( url, page ) { jQuery.getJSON( url + '&page=' + page + '&jsoncallback=?', function(data, status, xhr) { var pages=0; if( kind == 'album' ) { if( data.stat !== undefined && data.stat === 'fail' ) { NanoAlert(G, "Could not retrieve Flickr album list: " + data.message + " (code: "+data.code+")."); return false; } sourceData=sourceData.concat(data.photosets.photoset); pages=data.photosets.pages; } else { if( G.O.photoset.toUpperCase() == 'NONE' || G.O.album.toUpperCase() == 'NONE' ) { // content of full photoset sourceData=sourceData.concat(data.photos.photo); pages=data.photos.pages; } else { // content of one album if( data.stat !== undefined && data.stat === 'fail' ) { NanoAlert(G, "Could not retrieve Flickr album: " + data.message + " (code: "+data.code+")."); return false; } if( G.I[albumIdx].title == '' ) { G.I[albumIdx].title=data.photoset.title; } sourceData=sourceData.concat(data.photoset.photo); pages=data.photoset.pages; } } if( pages > page ) { FlickrGetOnePage(url, page+1); } else { FlickrGetDone(); } }) .fail( function(jqxhr, textStatus, error) { clearTimeout(tId); PreloaderDisplay(false); NanoAlert(G, "Could not retrieve Flickr ajax data: " + textStatus + ', ' + error); }); } FlickrGetOnePage(url, 1); } // ----------- // Retrieve items for one Flickr photoset function FlickrParsePhotos( albumIdx, albumID, source ) { if( G.O.debugMode ) { console.log('Flickr parse photos:'); console.dir(source); } jQuery.each(source, function(i,item){ var itemID = item.id; var imgUrl=item.url_sq; //fallback size // get the title var itemTitle = item.title; if( G.O.thumbnailLabel.get('title') != '' ) { itemTitle=GetImageTitleFromURL(imgUrl); } // get the description var itemDescription=item.description._content; // retrieve the image size with highest available resolution var imgW=75, imgH=75; var start=Flickr.photoAvailableSizesStr.length-1; if( G.O.flickrSkipOriginal ) { start--; } for( var i = start; i>=0 ; i-- ) { if( item['url_'+Flickr.photoAvailableSizesStr[i]] != undefined ) { imgUrl=item['url_'+Flickr.photoAvailableSizesStr[i]]; imgW=parseInt(item['width_'+Flickr.photoAvailableSizesStr[i]]); imgH=parseInt(item['height_'+Flickr.photoAvailableSizesStr[i]]); break; } } var sizes = {}; for( var p in item ) { if( p.indexOf('height_') == 0 || p.indexOf('width_') == 0 || p.indexOf('url_') == 0 ) { sizes[p]=item[p]; } } // tags var tags = item.tags !== undefined ? item.tags : ''; // create item var newItem = NGY2Item.New( G, itemTitle, itemDescription, itemID, albumID, 'image', tags ); // add image newItem.setMediaURL( imgUrl, 'img'); newItem.imageWidth = imgW; newItem.imageHeight = imgH; // add thumbnails var tn = { url: { l1 : { xs:'', sm:'', me:'', la:'', xl:'' }, lN : { xs:'', sm:'', me:'', la:'', xl:'' } }, width: { l1 : { xs:0, sm:0, me:0, la:0, xl:0 }, lN : { xs:0, sm:0, me:0, la:0, xl:0 } }, height: { l1 : { xs:0, sm:0, me:0, la:0, xl:0 }, lN : { xs:0, sm:0, me:0, la:0, xl:0 } } }; tn = FlickrRetrieveImages(tn, item, 'l1' ); tn = FlickrRetrieveImages(tn, item, 'lN' ); newItem.thumbs=tn; // post-process callback var fu = G.O.fnProcessData; if( fu !== null ) { typeof fu == 'function' ? fu(newItem, 'flickr', item) : window[fu](newItem, 'flickr', item); } }); G.I[albumIdx].contentIsLoaded=true; } // ----------- // Retrieve the list of Flickr photosets function FlickrParsePhotoSets( albumIdx, albumID, source ) { if( G.O.debugMode ) { console.log('Flickr parse list of albums:'); console.dir(source); } jQuery.each(source, function(i,item){ //Get the title var itemTitle = item.title._content; if( item.visibility_can_see_set == 0 ) { return true; } // skip it if( FilterAlbumName(itemTitle, item.id) ) { var itemID=item.id; //Get the description var itemDescription = item.description._content != undefined ? item.description._content : ''; var sizes = {}; for( var p in item.primary_photo_extras) { sizes[p] = item.primary_photo_extras[p]; } var tags=''; if( item.primary_photo_extras !== undefined ) { if( item.primary_photo_extras.tags !== undefined ) { tags = item.primary_photo_extras.tags; } } var newItem = NGY2Item.New( G, itemTitle, itemDescription, itemID, albumID, 'album', tags ); newItem.numberItems = item.photos; newItem.thumbSizes = sizes; var tn = { url: { l1 : { xs:'', sm:'', me:'', la:'', xl:'' }, lN : { xs:'', sm:'', me:'', la:'', xl:'' } }, width: { l1 : { xs:0, sm:0, me:0, la:0, xl:0 }, lN : { xs:0, sm:0, me:0, la:0, xl:0 } }, height: { l1 : { xs:0, sm:0, me:0, la:0, xl:0 }, lN : { xs:0, sm:0, me:0, la:0, xl:0 } } }; tn = FlickrRetrieveImages(tn, item.primary_photo_extras, 'l1' ); tn = FlickrRetrieveImages(tn, item.primary_photo_extras, 'lN' ); newItem.thumbs = tn; // post-process callback var fu = G.O.fnProcessData; if( fu !== null ) { typeof fu == 'function' ? fu(newItem, 'flickr', item) : window[fu](newItem, 'flickr', item); } } }); G.I[albumIdx].contentIsLoaded=true; } function FlickrRetrieveImages(tn, item, level ) { var sf=1; if( G.tn.opt[level].crop === true ) { sf=G.O.thumbnailCropScaleFactor; } var sizes=['xs','sm','me','la','xl']; for( var i=0; i<sizes.length; i++ ) { if( G.tn.settings.width[level][sizes[i]] == 'auto' || G.tn.settings.width[level][sizes[i]] == '' ) { let sdir='height_'; let tsize=Math.ceil( G.tn.settings.height[level][sizes[i]] * G.tn.scale * sf * G.tn.settings.mosaic[level+'Factor']['h'][sizes[i]] ); let one=FlickrRetrieveOneImage(sdir, tsize, item ); tn.url[level][sizes[i]]=one.url; tn.width[level][sizes[i]]=one.width; tn.height[level][sizes[i]]=one.height; } else if( G.tn.settings.height[level][sizes[i]] == 'auto' || G.tn.settings.height[level][sizes[i]] == '' ) { let sdir='width_'; let tsize=Math.ceil( G.tn.settings.width[level][sizes[i]] * G.tn.scale * sf * G.tn.settings.mosaic[level+'Factor']['w'][sizes[i]] ); let one=FlickrRetrieveOneImage(sdir, tsize, item ); tn.url[level][sizes[i]]=one.url; tn.width[level][sizes[i]]=one.width; tn.height[level][sizes[i]]=one.height; } else { let sdir='height_'; let tsize=Math.ceil( G.tn.settings.height[level][sizes[i]] * G.tn.scale * sf * G.tn.settings.mosaic[level+'Factor']['h'][sizes[i]] ); if( G.tn.settings.width[level][sizes[i]] > G.tn.settings.height[level][sizes[i]] ) { sdir='width_'; tsize=Math.ceil( G.tn.settings.width[level][sizes[i]] * G.tn.scale * sf * G.tn.settings.mosaic[level+'Factor']['w'][sizes[i]] ); } let one=FlickrRetrieveOneImage(sdir, tsize, item ); tn.url[level][sizes[i]]=one.url; tn.width[level][sizes[i]]=one.width; tn.height[level][sizes[i]]=one.height; } } return tn; } function FlickrRetrieveOneImage(sdir, tsize, item ) { var one={ url: '', width: 0, height: 0 }; var tnIndex=0; for( var j=0; j < Flickr.thumbAvailableSizes.length; j++ ) { var size=item[sdir+Flickr.photoAvailableSizesStr[j]]; if( size != undefined ) { tnIndex=j; if( size >= tsize ) { break; } } } var fSize=Flickr.photoAvailableSizesStr[tnIndex]; one.url = item['url_'+fSize]; one.width = parseInt(item['width_'+fSize]); one.height = parseInt(item['height_'+fSize]); return one; } var FilterByTags = function(data, tagBlockList) { if( tagBlockList!= '' && data != undefined) { data = data.filter(function (item) { var regex = new RegExp( tagBlockList, "i"); var tagsToTest = [item.tags]; if ( Array.isArray(item.tags) ) { tagsToTest = item.tags; } return ! tagsToTest.some( function (x) { return regex.test(x); } ); }); } return data; }; /** @function GetHiddenAlbums */ // var GetHiddenAlbums = function( hiddenAlbums, callback ){ // not supported -> doesn't exit in Flickr // callback(); // } // ----------- // Initialize thumbnail sizes function Init() { return; } // shortcuts to NGY2Tools functions (with context) var PreloaderDisplay = NGY2Tools.PreloaderDisplay.bind(G); var NanoAlert = NGY2Tools.NanoAlert; var GetImageTitleFromURL = NGY2Tools.GetImageTitleFromURL.bind(G); var FilterAlbumName = NGY2Tools.FilterAlbumName.bind(G); var AlbumPostProcess = NGY2Tools.AlbumPostProcess.bind(G); switch( fnName ){ // case 'GetHiddenAlbums': // var hiddenAlbums = arguments[2], // callback = arguments[3]; // GetHiddenAlbums(hiddenAlbums, callback); // break; case 'AlbumGetContent': var albumID = arguments[2], callback = arguments[3], cbParam1 = arguments[4], cbParam2 = arguments[5]; AlbumGetContent(albumID, callback, cbParam1, cbParam2); break; case 'Init': Init(); break; case '': break; } }; // END FLICKR DATA SOURCE FOR NANOGALLERY2 // }( jQuery )); }));