/*
*-------------------------------------------------------
* (c) 2006 Das Büro am Draht GmbH - All Rights reserved
*-------------------------------------------------------
*/
package com.flickr4java.flickr.interestingness;
import com.flickr4java.flickr.FlickrException;
import com.flickr4java.flickr.Response;
import com.flickr4java.flickr.Transport;
import com.flickr4java.flickr.photos.Extras;
import com.flickr4java.flickr.photos.Photo;
import com.flickr4java.flickr.photos.PhotoList;
import com.flickr4java.flickr.photos.PhotoUtils;
import com.flickr4java.flickr.util.StringUtilities;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/**
*
* @author till
* @version $Id: InterestingnessInterface.java,v 1.9 2009/07/11 20:30:27 x-mago Exp $
*/
public class InterestingnessInterface {
public static final String METHOD_GET_LIST = "flickr.interestingness.getList";
private static final String KEY_METHOD = "method";
private static final String KEY_DATE = "date";
private static final String KEY_EXTRAS = "extras";
private static final String KEY_PER_PAGE = "per_page";
private static final String KEY_PAGE = "page";
private static final ThreadLocal<SimpleDateFormat> DATE_FORMATS = new ThreadLocal<SimpleDateFormat>() {
@Override
protected synchronized SimpleDateFormat initialValue() {
return new SimpleDateFormat("yyyy-MM-dd");
}
};
private final String apiKey;
private final String sharedSecret;
private final Transport transportAPI;
public InterestingnessInterface(String apiKey, String sharedSecret, Transport transportAPI) {
this.apiKey = apiKey;
this.sharedSecret = sharedSecret;
this.transportAPI = transportAPI;
}
/**
* Returns the list of interesting photos for the most recent day or a user-specified date.
*
* This method does not require authentication.
*
* @param date
* @param extras
* A set of Strings controlling the extra information to fetch for each returned record. Currently supported fields are: license, date_upload,
* date_taken, owner_name, icon_server, original_format, last_update, geo. Set to null or an empty set to not specify any extras.
* @param perPage
* The number of photos to show per page
* @param page
* The page offset
* @return PhotoList
* @throws FlickrException
* @see com.flickr4java.flickr.photos.Extras
*/
public PhotoList<Photo> getList(String date, Set<String> extras, int perPage, int page) throws FlickrException {
Map<String, Object> parameters = new HashMap<String, Object>();
PhotoList<Photo> photos = new PhotoList<Photo>();
parameters.put(KEY_METHOD, METHOD_GET_LIST);
if (date != null) {
parameters.put(KEY_DATE, date);
}
if (extras != null) {
parameters.put(KEY_EXTRAS, StringUtilities.join(extras, ","));
}
if (perPage > 0) {
parameters.put(KEY_PER_PAGE, String.valueOf(perPage));
}
if (page > 0) {
parameters.put(KEY_PAGE, String.valueOf(page));
}
Response response = transportAPI.get(transportAPI.getPath(), parameters, apiKey, sharedSecret);
if (response.isError()) {
throw new FlickrException(response.getErrorCode(), response.getErrorMessage());
}
Element photosElement = response.getPayload();
photos.setPage(photosElement.getAttribute("page"));
photos.setPages(photosElement.getAttribute("pages"));
photos.setPerPage(photosElement.getAttribute("perpage"));
photos.setTotal(photosElement.getAttribute("total"));
NodeList photoNodes = photosElement.getElementsByTagName("photo");
for (int i = 0; i < photoNodes.getLength(); i++) {
Element photoElement = (Element) photoNodes.item(i);
Photo photo = PhotoUtils.createPhoto(photoElement);
photos.add(photo);
}
return photos;
}
/**
*
* @param date
* @param extras
* @param perPage
* @param page
* @return PhotoList
* @throws FlickrException
* @see com.flickr4java.flickr.photos.Extras
*/
public PhotoList<Photo> getList(Date date, Set<String> extras, int perPage, int page) throws FlickrException {
String dateString = null;
if (date != null) {
DateFormat df = DATE_FORMATS.get();
dateString = df.format(date);
}
return getList(dateString, extras, perPage, page);
}
/**
* convenience method to get the list of all 500 most recent photos in flickr explore with all known extra attributes.
*
* @return a List of Photos
* @throws FlickrException
*/
public PhotoList<Photo> getList() throws FlickrException {
return getList((String) null, Extras.ALL_EXTRAS, 500, 1);
}
}