/* * Copyright (c) 2005 Aetrion LLC. */ package com.flickr4java.flickr.people; import com.flickr4java.flickr.FlickrException; import com.flickr4java.flickr.Response; import com.flickr4java.flickr.Transport; import com.flickr4java.flickr.groups.Group; import com.flickr4java.flickr.groups.GroupList; 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 com.flickr4java.flickr.util.XMLUtilities; import org.w3c.dom.Element; import org.w3c.dom.NodeList; import java.awt.Rectangle; import java.util.ArrayList; import java.util.Collection; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; /** * Interface for finding Flickr users. * * @author Anthony Eden * @version $Id: PeopleInterface.java,v 1.28 2010/09/12 20:13:57 x-mago Exp $ */ public class PeopleInterface { public static final String METHOD_FIND_BY_EMAIL = "flickr.people.findByEmail"; public static final String METHOD_FIND_BY_USERNAME = "flickr.people.findByUsername"; public static final String METHOD_GET_INFO = "flickr.people.getInfo"; public static final String METHOD_GET_ONLINE_LIST = "flickr.people.getOnlineList"; public static final String METHOD_GET_PUBLIC_GROUPS = "flickr.people.getPublicGroups"; public static final String METHOD_GET_PUBLIC_PHOTOS = "flickr.people.getPublicPhotos"; public static final String METHOD_GET_UPLOAD_STATUS = "flickr.people.getUploadStatus"; public static final String METHOD_GET_PHOTOS = "flickr.people.getPhotos"; public static final String METHOD_GET_PHOTOS_OF = "flickr.people.getPhotosOf"; public static final String METHOD_GET_GROUPS = "flickr.people.getGroups"; public static final String METHOD_GET_LIMITS = "flickr.people.getLimits"; private final String apiKey; private final String sharedSecret; private final Transport transportAPI; public PeopleInterface(String apiKey, String sharedSecret, Transport transportAPI) { this.apiKey = apiKey; this.sharedSecret = sharedSecret; this.transportAPI = transportAPI; } /** * Find the user by their email address. * * This method does not require authentication. * * @param email * The email address * @return The User * @throws FlickrException */ public User findByEmail(String email) throws FlickrException { Map<String, Object> parameters = new HashMap<String, Object>(); parameters.put("method", METHOD_FIND_BY_EMAIL); parameters.put("find_email", email); Response response = transportAPI.get(transportAPI.getPath(), parameters, apiKey, sharedSecret); if (response.isError()) { throw new FlickrException(response.getErrorCode(), response.getErrorMessage()); } Element userElement = response.getPayload(); User user = new User(); user.setId(userElement.getAttribute("nsid")); user.setUsername(XMLUtilities.getChildValue(userElement, "username")); return user; } /** * Find a User by the username. * * This method does not require authentication. * * @param username * The username * @return The User object * @throws FlickrException */ public User findByUsername(String username) throws FlickrException { Map<String, Object> parameters = new HashMap<String, Object>(); parameters.put("method", METHOD_FIND_BY_USERNAME); parameters.put("username", username); Response response = transportAPI.get(transportAPI.getPath(), parameters, apiKey, sharedSecret); if (response.isError()) { throw new FlickrException(response.getErrorCode(), response.getErrorMessage()); } Element userElement = response.getPayload(); User user = new User(); user.setId(userElement.getAttribute("nsid")); user.setUsername(XMLUtilities.getChildValue(userElement, "username")); return user; } /** * Get info about the specified user. * * This method does not require authentication. * * @param userId * The user ID * @return The User object * @throws FlickrException */ public User getInfo(String userId) throws FlickrException { Map<String, Object> parameters = new HashMap<String, Object>(); parameters.put("method", METHOD_GET_INFO); parameters.put("user_id", userId); Response response = transportAPI.get(transportAPI.getPath(), parameters, apiKey, sharedSecret); if (response.isError()) { throw new FlickrException(response.getErrorCode(), response.getErrorMessage()); } Element userElement = response.getPayload(); User user = new User(); user.setId(userElement.getAttribute("nsid")); user.setAdmin("1".equals(userElement.getAttribute("isadmin"))); user.setPro("1".equals(userElement.getAttribute("ispro"))); user.setIconFarm(userElement.getAttribute("iconfarm")); user.setIconServer(userElement.getAttribute("iconserver")); user.setRevContact("1".equals(userElement.getAttribute("revcontact"))); user.setRevFriend("1".equals(userElement.getAttribute("revfriend"))); user.setRevFamily("1".equals(userElement.getAttribute("revfamily"))); String lPathAlias = userElement.getAttribute("path_alias"); user.setPathAlias(lPathAlias == null || "".equals(lPathAlias) ? null : lPathAlias); user.setUsername(XMLUtilities.getChildValue(userElement, "username")); user.setDescription(XMLUtilities.getChildValue(userElement, "description")); user.setGender(XMLUtilities.getChildValue(userElement, "gender")); user.setIgnored("1".equals(XMLUtilities.getChildValue(userElement, "ignored"))); user.setContact("1".equals(XMLUtilities.getChildValue(userElement, "contact"))); user.setFriend("1".equals(XMLUtilities.getChildValue(userElement, "friend"))); user.setFamily("1".equals(XMLUtilities.getChildValue(userElement, "family"))); user.setRealName(XMLUtilities.getChildValue(userElement, "realname")); user.setLocation(XMLUtilities.getChildValue(userElement, "location")); user.setMbox_sha1sum(XMLUtilities.getChildValue(userElement, "mbox_sha1sum")); user.setPhotosurl(XMLUtilities.getChildValue(userElement, "photosurl")); user.setProfileurl(XMLUtilities.getChildValue(userElement, "profileurl")); user.setMobileurl(XMLUtilities.getChildValue(userElement, "mobileurl")); Element photosElement = XMLUtilities.getChild(userElement, "photos"); user.setPhotosFirstDate(XMLUtilities.getChildValue(photosElement, "firstdate")); user.setPhotosFirstDateTaken(XMLUtilities.getChildValue(photosElement, "firstdatetaken")); user.setPhotosCount(XMLUtilities.getChildValue(photosElement, "count")); NodeList tzNodes = userElement.getElementsByTagName("timezone"); for (int i = 0; i < tzNodes.getLength(); i++) { Element tzElement = (Element) tzNodes.item(i); TimeZone tz = new TimeZone(); user.setTimeZone(tz); tz.setLabel(tzElement.getAttribute("label")); tz.setTimeZoneId(tzElement.getAttribute("timezone_id")); tz.setOffset(tzElement.getAttribute("offset")); } return user; } /** * Get a collection of public groups for the user. * * The groups will contain only the members nsid, name, admin and eighteenplus. If you want the whole group-information, you have to call * {@link com.flickr4java.flickr.groups.GroupsInterface#getInfo(String)}. * * This method does not require authentication. * * @param userId * The user ID * @return The public groups * @throws FlickrException */ public Collection<Group> getPublicGroups(String userId) throws FlickrException { List<Group> groups = new ArrayList<Group>(); Map<String, Object> parameters = new HashMap<String, Object>(); parameters.put("method", METHOD_GET_PUBLIC_GROUPS); parameters.put("user_id", userId); Response response = transportAPI.get(transportAPI.getPath(), parameters, apiKey, sharedSecret); if (response.isError()) { throw new FlickrException(response.getErrorCode(), response.getErrorMessage()); } Element groupsElement = response.getPayload(); NodeList groupNodes = groupsElement.getElementsByTagName("group"); for (int i = 0; i < groupNodes.getLength(); i++) { Element groupElement = (Element) groupNodes.item(i); Group group = new Group(); group.setId(groupElement.getAttribute("nsid")); group.setName(groupElement.getAttribute("name")); group.setAdmin("1".equals(groupElement.getAttribute("admin"))); group.setEighteenPlus(groupElement.getAttribute("eighteenplus").equals("0") ? false : true); groups.add(group); } return groups; } public PhotoList<Photo> getPublicPhotos(String userId, int perPage, int page) throws FlickrException { return getPublicPhotos(userId, Extras.MIN_EXTRAS, perPage, page); } /** * Get a collection of public photos for the specified user ID. * * This method does not require authentication. * * @see com.flickr4java.flickr.photos.Extras * @param userId * The User ID * @param extras * Set of extra-attributes to include (may be null) * @param perPage * The number of photos per page * @param page * The page offset * @return The PhotoList collection * @throws FlickrException */ public PhotoList<Photo> getPublicPhotos(String userId, Set<String> extras, int perPage, int page) throws FlickrException { PhotoList<Photo> photos = new PhotoList<Photo>(); Map<String, Object> parameters = new HashMap<String, Object>(); parameters.put("method", METHOD_GET_PUBLIC_PHOTOS); parameters.put("user_id", userId); if (perPage > 0) { parameters.put("per_page", "" + perPage); } if (page > 0) { parameters.put("page", "" + page); } if (extras != null) { 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 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); photos.add(PhotoUtils.createPhoto(photoElement)); } return photos; } /** * Get upload status for the currently authenticated user. * * Requires authentication with 'read' permission using the new authentication API. * * @return A User object with upload status data fields filled * @throws FlickrException */ public User getUploadStatus() throws FlickrException { Map<String, Object> parameters = new HashMap<String, Object>(); parameters.put("method", METHOD_GET_UPLOAD_STATUS); Response response = transportAPI.get(transportAPI.getPath(), parameters, apiKey, sharedSecret); if (response.isError()) { throw new FlickrException(response.getErrorCode(), response.getErrorMessage()); } Element userElement = response.getPayload(); User user = new User(); user.setId(userElement.getAttribute("id")); user.setPro("1".equals(userElement.getAttribute("ispro"))); user.setUsername(XMLUtilities.getChildValue(userElement, "username")); Element bandwidthElement = XMLUtilities.getChild(userElement, "bandwidth"); user.setBandwidthMax(bandwidthElement.getAttribute("max")); user.setBandwidthUsed(bandwidthElement.getAttribute("used")); user.setIsBandwidthUnlimited("1".equals(bandwidthElement.getAttribute("unlimited"))); Element filesizeElement = XMLUtilities.getChild(userElement, "filesize"); user.setFilesizeMax(filesizeElement.getAttribute("max")); Element setsElement = XMLUtilities.getChild(userElement, "sets"); user.setSetsCreated(setsElement.getAttribute("created")); user.setSetsRemaining(setsElement.getAttribute("remaining")); Element videosElement = XMLUtilities.getChild(userElement, "videos"); user.setVideosUploaded(videosElement.getAttribute("uploaded")); user.setVideosRemaining(videosElement.getAttribute("remaining")); Element videoSizeElement = XMLUtilities.getChild(userElement, "videosize"); user.setVideoSizeMax(videoSizeElement.getAttribute("maxbytes")); return user; } public PhotoList<Photo> getPhotos(String userId, String safeSearch, Date minUploadDate, Date maxUploadDate, Date minTakenDate, Date maxTakenDate, String contentType, String privacyFilter, Set<String> extras, int perPage, int page) throws FlickrException { Map<String, Object> parameters = new HashMap<String, Object>(); parameters.put("method", METHOD_GET_PHOTOS); parameters.put("user_id", userId); if (safeSearch != null) { parameters.put("safe_search", safeSearch); } if (minUploadDate != null) { parameters.put("min_upload_date", minUploadDate); } if (maxUploadDate != null) { parameters.put("max_upload_date", maxUploadDate); } if (minTakenDate != null) { parameters.put("min_taken_date", minTakenDate); } if (maxTakenDate != null) { parameters.put("max_taken_date", maxTakenDate); } if (contentType != null) { parameters.put("content_type", contentType); } if (privacyFilter != null) { parameters.put("privacy_filter", privacyFilter); } if (perPage > 0) { parameters.put("per_page", "" + perPage); } if (page > 0) { parameters.put("page", "" + page); } if (extras != null) { 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 photosElement = response.getPayload(); PhotoList<Photo> photos = new PhotoList<Photo>(); 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); photos.add(PhotoUtils.createPhoto(photoElement)); } return photos; } public PhotoList<Photo> getPhotosOf(String userId, String ownerId, Set<String> extras, int perPage, int page) throws FlickrException { Map<String, Object> parameters = new HashMap<String, Object>(); parameters.put("method", METHOD_GET_PHOTOS_OF); parameters.put("user_id", userId); if (ownerId != null) { parameters.put("owner_id", ownerId); } if (extras != null) { parameters.put(Extras.KEY_EXTRAS, StringUtilities.join(extras, ",")); } if (perPage > 0) { parameters.put("per_page", "" + perPage); } if (page > 0) { parameters.put("page", "" + page); } Response response = transportAPI.get(transportAPI.getPath(), parameters, apiKey, sharedSecret); if (response.isError()) { throw new FlickrException(response.getErrorCode(), response.getErrorMessage()); } Element photosElement = response.getPayload(); PhotoList<Photo> photos = new PhotoList<Photo>(); photos.setPage(photosElement.getAttribute("page")); photos.setPerPage(photosElement.getAttribute("perpage")); NodeList photoNodes = photosElement.getElementsByTagName("photo"); for (int i = 0; i < photoNodes.getLength(); i++) { Element photoElement = (Element) photoNodes.item(i); Photo photo = new Photo(); photo.setId(photoElement.getAttribute("id")); photo.setSecret(photoElement.getAttribute("secret")); User owner = new User(); owner.setId(photoElement.getAttribute("owner")); photo.setOwner(owner); photo.setUrl("https://flickr.com/photos/" + owner.getId() + "/" + photo.getId()); photo.setServer(photoElement.getAttribute("server")); photo.setTitle(photoElement.getAttribute("title")); photo.setPublicFlag("1".equals(photoElement.getAttribute("ispublic"))); photo.setFriendFlag("1".equals(photoElement.getAttribute("isfriend"))); photo.setFamilyFlag("1".equals(photoElement.getAttribute("isfamily"))); photos.add(photo); } return photos; } /** * Add the given person to the photo. Optionally, send in co-ordinates * * @param photoId * @param userId * @param bounds * @throws FlickrException */ public void add(String photoId, String userId, Rectangle bounds) throws FlickrException { // Delegating this to photos.people.PeopleInterface - Naming standard would be to use PeopleInterface but having 2 the same name can cause issues com.flickr4java.flickr.photos.people.PeopleInterface pi = new com.flickr4java.flickr.photos.people.PeopleInterface(apiKey, sharedSecret, transportAPI); pi.add(photoId, userId, bounds); } /** * Delete the person from the photo * * @param photoId * @param userId * @throws FlickrException */ public void delete(String photoId, String userId) throws FlickrException { // Delegating this to photos.people.PeopleInterface - Naming standard would be to use PeopleInterface but having 2 the same name can cause issues com.flickr4java.flickr.photos.people.PeopleInterface pi = new com.flickr4java.flickr.photos.people.PeopleInterface(apiKey, sharedSecret, transportAPI); pi.delete(photoId, userId); } /** * Delete the co-ordinates that the user is shown in * * @param photoId * @param userId * @throws FlickrException */ public void deleteCoords(String photoId, String userId) throws FlickrException { // Delegating this to photos.people.PeopleInterface - Naming standard would be to use PeopleInterface but having 2 the same name can cause issues com.flickr4java.flickr.photos.people.PeopleInterface pi = new com.flickr4java.flickr.photos.people.PeopleInterface(apiKey, sharedSecret, transportAPI); pi.deleteCoords(photoId, userId); } /** * Edit the co-ordinates that the user shows in * * @param photoId * @param userId * @param bounds * @throws FlickrException */ public void editCoords(String photoId, String userId, Rectangle bounds) throws FlickrException { // Delegating this to photos.people.PeopleInterface - Naming standard would be to use PeopleInterface but having 2 the same name can cause issues com.flickr4java.flickr.photos.people.PeopleInterface pi = new com.flickr4java.flickr.photos.people.PeopleInterface(apiKey, sharedSecret, transportAPI); pi.editCoords(photoId, userId, bounds); } /** * Get a list of people in a given photo. * * @param photoId * @throws FlickrException */ public PersonTagList<PersonTag> getList(String photoId) throws FlickrException { // Delegating this to photos.people.PeopleInterface - Naming standard would be to use PeopleInterface but having 2 the same name can cause issues com.flickr4java.flickr.photos.people.PeopleInterface pi = new com.flickr4java.flickr.photos.people.PeopleInterface(apiKey, sharedSecret, transportAPI); return pi.getList(photoId); } /** * * @param userId * @throws FlickrException */ public GroupList<Group> getGroups(String userId) throws FlickrException { GroupList<Group> groupList = new GroupList<Group>(); Map<String, Object> parameters = new HashMap<String, Object>(); parameters.put("method", METHOD_GET_GROUPS); parameters.put("user_id", userId); Response response = transportAPI.get(transportAPI.getPath(), parameters, apiKey, sharedSecret); if (response.isError()) { throw new FlickrException(response.getErrorCode(), response.getErrorMessage()); } Element groupsElement = response.getPayload(); NodeList groupNodes = groupsElement.getElementsByTagName("group"); groupList.setPage(XMLUtilities.getIntAttribute(groupsElement, "page")); groupList.setPages(XMLUtilities.getIntAttribute(groupsElement, "pages")); groupList.setPerPage(XMLUtilities.getIntAttribute(groupsElement, "perpage")); groupList.setTotal(XMLUtilities.getIntAttribute(groupsElement, "total")); for (int i = 0; i < groupNodes.getLength(); i++) { Element groupElement = (Element) groupNodes.item(i); Group group = new Group(); group.setId(groupElement.getAttribute("nsid")); group.setName(groupElement.getAttribute("name")); group.setAdmin("1".equals(groupElement.getAttribute("admin"))); group.setEighteenPlus("1".equals(groupElement.getAttribute("eighteenplus"))); group.setInvitationOnly("1".equals(groupElement.getAttribute("invitation_only"))); groupList.add(group); } return groupList; } /** * Get's the user's current upload limits, User object only contains user_id * * @return Media Limits */ public User getLimits() throws FlickrException { Map<String, Object> parameters = new HashMap<String, Object>(); parameters.put("method", METHOD_GET_LIMITS); Response response = transportAPI.get(transportAPI.getPath(), parameters, apiKey, sharedSecret); if (response.isError()) { throw new FlickrException(response.getErrorCode(), response.getErrorMessage()); } Element userElement = response.getPayload(); User user = new User(); user.setId(userElement.getAttribute("nsid")); NodeList photoNodes = userElement.getElementsByTagName("photos"); for (int i = 0; i < photoNodes.getLength(); i++) { Element plElement = (Element) photoNodes.item(i); PhotoLimits pl = new PhotoLimits(); user.setPhotoLimits(pl); pl.setMaxDisplay(plElement.getAttribute("maxdisplaypx")); pl.setMaxUpload(plElement.getAttribute("maxupload")); } NodeList videoNodes = userElement.getElementsByTagName("videos"); for (int i = 0; i < videoNodes.getLength(); i++) { Element vlElement = (Element) videoNodes.item(i); VideoLimits vl = new VideoLimits(); user.setPhotoLimits(vl); vl.setMaxDuration(vlElement.getAttribute("maxduration")); vl.setMaxUpload(vlElement.getAttribute("maxupload")); } return user; } }