All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.flickr4java.flickr.photosets.PhotosetsInterface Maven / Gradle / Ivy

There is a newer version: 3.0.9
Show newest version

package com.flickr4java.flickr.photosets;

import com.flickr4java.flickr.Flickr;
import com.flickr4java.flickr.FlickrException;
import com.flickr4java.flickr.Response;
import com.flickr4java.flickr.Transport;
import com.flickr4java.flickr.people.User;
import com.flickr4java.flickr.photos.Extras;
import com.flickr4java.flickr.photos.Photo;
import com.flickr4java.flickr.photos.PhotoContext;
import com.flickr4java.flickr.photos.PhotoList;
import com.flickr4java.flickr.photos.PhotoUtils;
import com.flickr4java.flickr.util.StringUtilities;
import com.flickr4java.flickr.util.XMLUtilities;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * Interface for working with photosets.
 * 
 * @author Anthony Eden
 * @version $Id: PhotosetsInterface.java,v 1.27 2009/11/08 21:58:00 x-mago Exp $
 */
public class PhotosetsInterface {

    private static Logger _log = LoggerFactory.getLogger(PhotosetsInterface.class);

    public static final String METHOD_ADD_PHOTO = "flickr.photosets.addPhoto";

    public static final String METHOD_CREATE = "flickr.photosets.create";

    public static final String METHOD_DELETE = "flickr.photosets.delete";

    public static final String METHOD_EDIT_META = "flickr.photosets.editMeta";

    public static final String METHOD_EDIT_PHOTOS = "flickr.photosets.editPhotos";

    public static final String METHOD_GET_CONTEXT = "flickr.photosets.getContext";

    public static final String METHOD_GET_INFO = "flickr.photosets.getInfo";

    public static final String METHOD_GET_LIST = "flickr.photosets.getList";

    public static final String METHOD_GET_PHOTOS = "flickr.photosets.getPhotos";

    public static final String METHOD_ORDER_SETS = "flickr.photosets.orderSets";

    public static final String METHOD_REMOVE_PHOTO = "flickr.photosets.removePhoto";

    public static final String METHOD_REMOVE_PHOTOS = "flickr.photosets.removePhotos";

    public static final String METHOD_REORDER_PHOTOS = "flickr.photosets.reorderPhotos";

    public static final String METHOD_SET_PRIMARY_PHOTO = "flickr.photosets.setPrimaryPhoto";

    private final String apiKey;

    private final String sharedSecret;

    private final Transport transportAPI;

    public PhotosetsInterface(String apiKey, String sharedSecret, Transport transportAPI) {
        this.apiKey = apiKey;
        this.sharedSecret = sharedSecret;
        this.transportAPI = transportAPI;
    }

    /**
     * Add a photo to the end of the photoset.
     * 

* Note: requires authentication with the new authentication API with 'write' permission. * * @param photosetId * The photoset ID * @param photoId * The photo ID */ public void addPhoto(String photosetId, String photoId) throws FlickrException { Map parameters = new HashMap(); parameters.put("method", METHOD_ADD_PHOTO); parameters.put("photoset_id", photosetId); parameters.put("photo_id", photoId); Response response = transportAPI.post(transportAPI.getPath(), parameters, apiKey, sharedSecret); if (response.isError()) { throw new FlickrException(response.getErrorCode(), response.getErrorMessage()); } } /** * Create a new photoset. * * @param title * The photoset title * @param description * The photoset description * @param primaryPhotoId * The primary photo id * @return The new Photset * @throws FlickrException */ public Photoset create(String title, String description, String primaryPhotoId) throws FlickrException { Map parameters = new HashMap(); parameters.put("method", METHOD_CREATE); parameters.put("title", title); parameters.put("description", description); parameters.put("primary_photo_id", primaryPhotoId); Response response = transportAPI.post(transportAPI.getPath(), parameters, apiKey, sharedSecret); if (response.isError()) { throw new FlickrException(response.getErrorCode(), response.getErrorMessage()); } Element photosetElement = response.getPayload(); Photoset photoset = new Photoset(); photoset.setId(photosetElement.getAttribute("id")); photoset.setUrl(photosetElement.getAttribute("url")); return photoset; } /** * Delete the specified photoset. * * @param photosetId * The photoset ID * @throws FlickrException */ public void delete(String photosetId) throws FlickrException { Map parameters = new HashMap(); parameters.put("method", METHOD_DELETE); parameters.put("photoset_id", photosetId); Response response = transportAPI.post(transportAPI.getPath(), parameters, apiKey, sharedSecret); if (response.isError()) { throw new FlickrException(response.getErrorCode(), response.getErrorMessage()); } } /** * Modify the meta-data for a photoset. * * @param photosetId * The photoset ID * @param title * A new title * @param description * A new description (can be null) * @throws FlickrException */ public void editMeta(String photosetId, String title, String description) throws FlickrException { Map parameters = new HashMap(); parameters.put("method", METHOD_EDIT_META); parameters.put("photoset_id", photosetId); parameters.put("title", title); if (description != null) { parameters.put("description", description); } Response response = transportAPI.post(transportAPI.getPath(), parameters, apiKey, sharedSecret); if (response.isError()) { throw new FlickrException(response.getErrorCode(), response.getErrorMessage()); } } /** * Edit which photos are in the photoset. * * @param photosetId * The photoset ID * @param primaryPhotoId * The primary photo Id * @param photoIds * The photo IDs for the photos in the set * @throws FlickrException */ public void editPhotos(String photosetId, String primaryPhotoId, String[] photoIds) throws FlickrException { Map parameters = new HashMap(); parameters.put("method", METHOD_EDIT_PHOTOS); parameters.put("photoset_id", photosetId); parameters.put("primary_photo_id", primaryPhotoId); parameters.put("photo_ids", StringUtilities.join(photoIds, ",")); Response response = transportAPI.post(transportAPI.getPath(), parameters, apiKey, sharedSecret); if (response.isError()) { throw new FlickrException(response.getErrorCode(), response.getErrorMessage()); } } /** * Get a photo's context in the specified photo set. * * This method does not require authentication. * * @param photoId * The photo ID * @param photosetId * The photoset ID * @return The PhotoContext * @throws FlickrException */ public PhotoContext getContext(String photoId, String photosetId) throws FlickrException { Map parameters = new HashMap(); parameters.put("method", METHOD_GET_CONTEXT); parameters.put("photo_id", photoId); parameters.put("photoset_id", photosetId); Response response = transportAPI.get(transportAPI.getPath(), parameters, apiKey, sharedSecret); if (response.isError()) { throw new FlickrException(response.getErrorCode(), response.getErrorMessage()); } Collection payload = response.getPayloadCollection(); PhotoContext photoContext = new PhotoContext(); for (Element element : payload) { String elementName = element.getTagName(); if (elementName.equals("prevphoto")) { Photo photo = new Photo(); photo.setId(element.getAttribute("id")); photoContext.setPreviousPhoto(photo); } else if (elementName.equals("nextphoto")) { Photo photo = new Photo(); photo.setId(element.getAttribute("id")); photoContext.setNextPhoto(photo); } else if (elementName.equals("count")) { // TODO: process this information } else { _log.warn("unsupported element name: " + elementName); } } return photoContext; } /** * Get the information for a specified photoset. * * This method does not require authentication. * * @param photosetId * The photoset ID * @return The Photoset * @throws FlickrException */ public Photoset getInfo(String photosetId) throws FlickrException { Map parameters = new HashMap(); parameters.put("method", METHOD_GET_INFO); parameters.put("photoset_id", photosetId); Response response = transportAPI.get(transportAPI.getPath(), parameters, apiKey, sharedSecret); if (response.isError()) { throw new FlickrException(response.getErrorCode(), response.getErrorMessage()); } Element photosetElement = response.getPayload(); Photoset photoset = new Photoset(); photoset.setId(photosetElement.getAttribute("id")); User owner = new User(); owner.setId(photosetElement.getAttribute("owner")); photoset.setOwner(owner); Photo primaryPhoto = new Photo(); primaryPhoto.setId(photosetElement.getAttribute("primary")); primaryPhoto.setSecret(photosetElement.getAttribute("secret")); // TODO verify that this is the secret for the photo primaryPhoto.setServer(photosetElement.getAttribute("server")); // TODO verify that this is the server for the photo primaryPhoto.setFarm(photosetElement.getAttribute("farm")); photoset.setPrimaryPhoto(primaryPhoto); // TODO remove secret/server/farm from photoset? // It's rather related to the primaryPhoto, then to the photoset itself. photoset.setSecret(photosetElement.getAttribute("secret")); photoset.setServer(photosetElement.getAttribute("server")); photoset.setFarm(photosetElement.getAttribute("farm")); photoset.setPhotoCount(photosetElement.getAttribute("count_photos")); photoset.setVideoCount(Integer.parseInt(photosetElement.getAttribute("count_videos"))); photoset.setViewCount(Integer.parseInt(photosetElement.getAttribute("count_views"))); photoset.setCommentCount(Integer.parseInt(photosetElement.getAttribute("count_comments"))); photoset.setDateCreate(photosetElement.getAttribute("date_create")); photoset.setDateUpdate(photosetElement.getAttribute("date_update")); photoset.setIsCanComment("1".equals(photosetElement.getAttribute("can_comment"))); photoset.setTitle(XMLUtilities.getChildValue(photosetElement, "title")); photoset.setDescription(XMLUtilities.getChildValue(photosetElement, "description")); photoset.setPrimaryPhoto(primaryPhoto); return photoset; } /** * Get a list of all photosets for the specified user. * * This method does not require authentication. But to get a Photoset into the list, that contains just private photos, the call needs to be authenticated. * * @param userId * The User id * @return The Photosets collection * @throws FlickrException */ public Photosets getList(String userId) throws FlickrException { return getList(userId, 0, 0, null); } /** * Get a list of all photosets for the specified user. * * This method does not require authentication. But to get a Photoset into the list, that contains just private photos, the call needs to be authenticated. * * @param userId * The User id * @param primaryPhotoExtras * A comma-delimited list of extra information to fetch for the primary photo * @return The Photosets collection * @throws FlickrException */ public Photosets getList(String userId, String primaryPhotoExtras) throws FlickrException { return getList(userId, 0, 0, primaryPhotoExtras); } /** * Get a list of all photosets for the specified user. * * This method does not require authentication. But to get a Photoset into the list, that contains just private photos, the call needs to be authenticated. * * @param userId * The User id * @param perPage * The number of photosets per page * @param page * The page offset * @param primaryPhotoExtras * A comma-delimited list of extra information to fetch for the primary photo * @return The Photosets collection * @throws FlickrException */ public Photosets getList(String userId, int perPage, int page, String primaryPhotoExtras) throws FlickrException { Map parameters = new HashMap(); parameters.put("method", METHOD_GET_LIST); if (userId != null) { parameters.put("user_id", userId); } if (perPage > 0) { parameters.put("per_page", String.valueOf(perPage)); } if (page > 0) { parameters.put("page", String.valueOf(page)); } if (primaryPhotoExtras != null) { parameters.put("primary_photo_extras", primaryPhotoExtras); } Response response = transportAPI.get(transportAPI.getPath(), parameters, apiKey, sharedSecret); if (response.isError()) { throw new FlickrException(response.getErrorCode(), response.getErrorMessage()); } Photosets photosetsObject = new Photosets(); Element photosetsElement = response.getPayload(); photosetsObject.setCanCreate(XMLUtilities.getBooleanAttribute(photosetsElement, "cancreate")); photosetsObject.setPage(XMLUtilities.getIntAttribute(photosetsElement, "page")); photosetsObject.setPages(XMLUtilities.getIntAttribute(photosetsElement, "pages")); photosetsObject.setPerPage(XMLUtilities.getIntAttribute(photosetsElement, "perpage")); photosetsObject.setTotal(XMLUtilities.getIntAttribute(photosetsElement, "total")); List photosets = new ArrayList(); NodeList photosetElements = photosetsElement.getElementsByTagName("photoset"); for (int i = 0; i < photosetElements.getLength(); i++) { Element photosetElement = (Element) photosetElements.item(i); Photoset photoset = new Photoset(); photoset.setId(photosetElement.getAttribute("id")); User owner = new User(); owner.setId(photosetElement.getAttribute("owner")); photoset.setOwner(owner); Element primaryPhotoExtrasEl = XMLUtilities.getChild(photosetElement, "primary_photo_extras"); Photo primaryPhoto; if (primaryPhotoExtrasEl != null) { primaryPhoto = PhotoUtils.createPhoto(primaryPhotoExtrasEl); } else { primaryPhoto = new Photo(); } primaryPhoto.setId(photosetElement.getAttribute("primary")); primaryPhoto.setSecret(photosetElement.getAttribute("secret")); // TODO verify that this is the secret for the photo primaryPhoto.setServer(photosetElement.getAttribute("server")); // TODO verify that this is the server for the photo primaryPhoto.setFarm(photosetElement.getAttribute("farm")); photoset.setPrimaryPhoto(primaryPhoto); photoset.setSecret(photosetElement.getAttribute("secret")); photoset.setServer(photosetElement.getAttribute("server")); photoset.setFarm(photosetElement.getAttribute("farm")); photoset.setPhotoCount(photosetElement.getAttribute("photos")); photoset.setVideoCount(Integer.parseInt(photosetElement.getAttribute("videos"))); photoset.setViewCount(Integer.parseInt(photosetElement.getAttribute("count_views"))); photoset.setCommentCount(Integer.parseInt(photosetElement.getAttribute("count_comments"))); photoset.setDateCreate(photosetElement.getAttribute("date_create")); photoset.setDateUpdate(photosetElement.getAttribute("date_update")); photoset.setIsCanComment("1".equals(photosetElement.getAttribute("can_comment"))); photoset.setIsNeedsInterstitial("1".equals(photosetElement.getAttribute("needs_interstitial"))); photoset.setIsVisible("1".equals(photosetElement.getAttribute("visibility_can_see_set"))); photoset.setDescription(XMLUtilities.getChildValue(photosetElement, "description")); photoset.setTitle(XMLUtilities.getChildValue(photosetElement, "title")); photoset.setDescription(XMLUtilities.getChildValue(photosetElement, "description")); photosets.add(photoset); } photosetsObject.setPhotosets(photosets); return photosetsObject; } /** * Convenience method. * * Get the total number of sets belonging to a user * * @param userId * The User id * @return int The number of photosets * @throws FlickrException */ public int getPhotosetCount(String userId) throws FlickrException { Map parameters = new HashMap(); parameters.put("method", METHOD_GET_LIST); if (userId != null) { parameters.put("user_id", userId); } // Request the bare minimum parameters.put("per_page", String.valueOf(1)); parameters.put("page", String.valueOf(1)); Response response = transportAPI.get(transportAPI.getPath(), parameters, apiKey, sharedSecret); if (response.isError()) { throw new FlickrException(response.getErrorCode(), response.getErrorMessage()); } Element photosetsElement = response.getPayload(); return Integer.valueOf(photosetsElement.getAttribute("total")); } /** * Get a collection of Photo objects for the specified Photoset. * * This method does not require authentication. * * @see com.flickr4java.flickr.photos.Extras * @see com.flickr4java.flickr.Flickr#PRIVACY_LEVEL_NO_FILTER * @see com.flickr4java.flickr.Flickr#PRIVACY_LEVEL_PUBLIC * @see com.flickr4java.flickr.Flickr#PRIVACY_LEVEL_FRIENDS * @see com.flickr4java.flickr.Flickr#PRIVACY_LEVEL_FRIENDS_FAMILY * @see com.flickr4java.flickr.Flickr#PRIVACY_LEVEL_FAMILY * @see com.flickr4java.flickr.Flickr#PRIVACY_LEVEL_FRIENDS * @param photosetId * The photoset ID * @param extras * Set of extra-fields * @param privacy_filter * filter value for authenticated calls * @param perPage * The number of photos per page * @param page * The page offset * @return PhotoList The Collection of Photo objects * @throws FlickrException */ public PhotoList getPhotos(String photosetId, Set extras, int privacy_filter, int perPage, int page) throws FlickrException { PhotoList photos = new PhotoList(); Map parameters = new HashMap(); parameters.put("method", METHOD_GET_PHOTOS); parameters.put("photoset_id", photosetId); if (perPage > 0) { parameters.put("per_page", String.valueOf(perPage)); } if (page > 0) { parameters.put("page", String.valueOf(page)); } if (privacy_filter > 0) { parameters.put("privacy_filter", "" + privacy_filter); } if (extras != null && !extras.isEmpty()) { parameters.put(Extras.KEY_EXTRAS, StringUtilities.join(extras, ",")); } Response response = transportAPI.get(transportAPI.getPath(), parameters, apiKey, sharedSecret); if (response.isError()) { throw new FlickrException(response.getErrorCode(), response.getErrorMessage()); } Element photoset = response.getPayload(); NodeList photoElements = photoset.getElementsByTagName("photo"); photos.setPage(photoset.getAttribute("page")); photos.setPages(photoset.getAttribute("pages")); photos.setPerPage(photoset.getAttribute("per_page")); photos.setTotal(photoset.getAttribute("total")); for (int i = 0; i < photoElements.getLength(); i++) { Element photoElement = (Element) photoElements.item(i); photos.add(PhotoUtils.createPhoto(photoElement, photoset)); } return photos; } /** * Convenience method. * * Calls getPhotos() with Extras.MIN_EXTRAS and Flickr.PRIVACY_LEVEL_NO_FILTER. * * This method does not require authentication. * * @see com.flickr4java.flickr.photos.Extras * @see com.flickr4java.flickr.Flickr#PRIVACY_LEVEL_NO_FILTER * @see com.flickr4java.flickr.Flickr#PRIVACY_LEVEL_PUBLIC * @see com.flickr4java.flickr.Flickr#PRIVACY_LEVEL_FRIENDS * @see com.flickr4java.flickr.Flickr#PRIVACY_LEVEL_FRIENDS_FAMILY * @see com.flickr4java.flickr.Flickr#PRIVACY_LEVEL_FAMILY * @see com.flickr4java.flickr.Flickr#PRIVACY_LEVEL_FRIENDS * @param photosetId * The photoset ID * @param perPage * The number of photos per page * @param page * The page offset * @return PhotoList The Collection of Photo objects * @throws FlickrException */ public PhotoList getPhotos(String photosetId, int perPage, int page) throws FlickrException { return getPhotos(photosetId, Extras.MIN_EXTRAS, Flickr.PRIVACY_LEVEL_NO_FILTER, perPage, page); } /** * Set the order in which sets are returned for the user. * * This method requires authentication with 'write' permission. * * @param photosetIds * An array of Ids * @throws FlickrException */ public void orderSets(String[] photosetIds) throws FlickrException { Map parameters = new HashMap(); parameters.put("method", METHOD_ORDER_SETS); ; parameters.put("photoset_ids", StringUtilities.join(photosetIds, ",")); Response response = transportAPI.post(transportAPI.getPath(), parameters, apiKey, sharedSecret); if (response.isError()) { throw new FlickrException(response.getErrorCode(), response.getErrorMessage()); } } /** * Remove a photo from the set. * * @param photosetId * The photoset ID * @param photoId * The photo ID * @throws FlickrException */ public void removePhoto(String photosetId, String photoId) throws FlickrException { Map parameters = new HashMap(); parameters.put("method", METHOD_REMOVE_PHOTO); parameters.put("photoset_id", photosetId); parameters.put("photo_id", photoId); Response response = transportAPI.post(transportAPI.getPath(), parameters, apiKey, sharedSecret); if (response.isError()) { throw new FlickrException(response.getErrorCode(), response.getErrorMessage()); } } /** * Remove a photo from the set. * * @param photosetId * The photoset ID * @param photoIds * The ID's of the photos, in CVS format * @throws FlickrException */ public void removePhotos(String photosetId, String photoIds) throws FlickrException { Map parameters = new HashMap(); parameters.put("method", METHOD_REMOVE_PHOTOS); parameters.put("photoset_id", photosetId); parameters.put("photo_ids", photoIds); Response response = transportAPI.post(transportAPI.getPath(), parameters, apiKey, sharedSecret); if (response.isError()) { throw new FlickrException(response.getErrorCode(), response.getErrorMessage()); } } /** * Remove a photo from the set. * * @param photosetId * The photoset ID * @param photoIds * The ID's of the photos, in CSV format, in the order they need to be in. * @throws FlickrException */ public void reorderPhotos(String photosetId, String photoIds) throws FlickrException { Map parameters = new HashMap(); parameters.put("method", METHOD_REORDER_PHOTOS); parameters.put("photoset_id", photosetId); parameters.put("photo_ids", photoIds); Response response = transportAPI.post(transportAPI.getPath(), parameters, apiKey, sharedSecret); if (response.isError()) { throw new FlickrException(response.getErrorCode(), response.getErrorMessage()); } } /** * Remove a photo from the set. * * @param photosetId * The photoset ID * @param photoId * The photo ID that is being added * @throws FlickrException */ public void setPrimaryPhoto(String photosetId, String photoId) throws FlickrException { Map parameters = new HashMap(); parameters.put("method", METHOD_SET_PRIMARY_PHOTO); parameters.put("photoset_id", photosetId); parameters.put("photo_id", photoId); Response response = transportAPI.post(transportAPI.getPath(), parameters, apiKey, sharedSecret); if (response.isError()) { throw new FlickrException(response.getErrorCode(), response.getErrorMessage()); } } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy