/* * Copyright (c) 2010, the Last.fm Java Project and Committers * All rights reserved. * * Redistribution and use of this software in source and binary forms, with or without modification, are * permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above * copyright notice, this list of conditions and the * following disclaimer. * * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the * following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package de.umass.lastfm; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import de.umass.util.MapUtilities; import de.umass.xml.DomElement; /** * Venue information bean. * * @author Janni Kovacs */ public class Venue extends ImageHolder { static final ItemFactory<Venue> FACTORY = new VenueFactory(); private String name; private String url, website; private String city, country, street, postal, phonenumber; private float latitude, longitude; private String timezone; private String id; private Venue() { } public String getId() { return id; } /** * Returns a last.fm URL to this venue, e.g.: http://www.last.fm/venue/<id>-<venue name> * * @return last.fm url * @see #getWebsite() */ public String getUrl() { return url; } /** * Returns an URL to the actual venue's website. * * @return website url */ public String getWebsite() { return website; } public String getCity() { return city; } public String getCountry() { return country; } public float getLatitude() { return latitude; } public float getLongitude() { return longitude; } public String getName() { return name; } public String getPostal() { return postal; } public String getStreet() { return street; } public String getTimezone() { return timezone; } public String getPhonenumber() { return phonenumber; } /** * Search for a venue by venue name. * * @param venue The venue name you would like to search for * @param apiKey A Last.fm API key * @return a list of venues */ public static Collection<Venue> search(String venue, String apiKey) { return search(venue, null, apiKey); } /** * Search for a venue by venue name. * * @param venue The venue name you would like to search for * @param country Filter your results by country. Expressed as an ISO 3166-2 code * @param apiKey A Last.fm API key * @return a list of venues */ public static Collection<Venue> search(String venue, String country, String apiKey) { Map<String, String> params = new HashMap<String, String>(); params.put("venue", venue); MapUtilities.nullSafePut(params, "country", country); Result result = Caller.getInstance().call("venue.search", apiKey, params); if (!result.isSuccessful()) return Collections.emptyList(); DomElement child = result.getContentElement().getChild("venuematches"); return ResponseBuilder.buildCollection(child, Venue.class); } /** * Get a list of upcoming events at this venue. * * @param venueId The venue id to fetch the events for * @param apiKey A Last.fm API key * @return a list of events * @see #getPastEvents */ public static Collection<Event> getEvents(String venueId, String apiKey) { Result result = Caller.getInstance().call("venue.getEvents", apiKey, "venue", venueId); return ResponseBuilder.buildCollection(result, Event.class); } /** * Get a paginated list of all the events held at this venue in the past. * * @param venueId The id for the venue you would like to fetch event listings for * @param apiKey A Last.fm API key * @return a paginated list of events */ public static PaginatedResult<Event> getPastEvents(String venueId, String apiKey) { return getPastEvents(venueId, 1, apiKey); } /** * Get a paginated list of all the events held at this venue in the past. * * @param venueId The id for the venue you would like to fetch event listings for * @param page The page of results to return * @param apiKey A Last.fm API key * @return a paginated list of events */ public static PaginatedResult<Event> getPastEvents(String venueId, int page, String apiKey) { Result result = Caller.getInstance().call("venue.getPastEvents", apiKey, "venue", venueId, "page", String.valueOf(page)); return ResponseBuilder.buildPaginatedResult(result, Event.class); } private static class VenueFactory implements ItemFactory<Venue> { public Venue createItemFromElement(DomElement element) { Venue venue = new Venue(); venue.id = element.getChildText("id"); venue.name = element.getChildText("name"); venue.url = element.getChildText("url"); venue.phonenumber = element.getChildText("phonenumber"); venue.website = element.getChildText("website"); ImageHolder.loadImages(venue, element); DomElement l = element.getChild("location"); venue.city = l.getChildText("city"); venue.country = l.getChildText("country"); venue.street = l.getChildText("street"); venue.postal = l.getChildText("postalcode"); venue.timezone = l.getChildText("timezone"); DomElement p = l.getChild("geo:point"); if (p.getChildText("geo:lat").length() != 0) { // some venues don't have geo information applied venue.latitude = Float.parseFloat(p.getChildText("geo:lat")); venue.longitude = Float.parseFloat(p.getChildText("geo:long")); } return venue; } } }