Ejemplo n.º 1
0
  /**
   * Performs the web-service call. If the <code>session</code> parameter is <code>non-null</code>
   * then an authenticated call is made. If it's <code>null</code> then an unauthenticated call is
   * made.<br>
   * The <code>apiKey</code> parameter is always required, even when a valid session is passed to
   * this method.
   *
   * @param method The method to call
   * @param apiKey A Last.fm API key
   * @param params Parameters
   * @param session A Session instance or <code>null</code>
   * @return the result of the operation
   */
  private Result call(String method, String apiKey, Map<String, String> params) {
    params =
        new HashMap<String, String>(params); // create new Map in case params is an immutable Map
    InputStream inputStream = null;

    // try to load from cache
    String cacheEntryName = Cache.createCacheEntryName(method, params);
    if (cache != null) {
      inputStream = getStreamFromCache(cacheEntryName);
    }

    // no entry in cache, load from web
    if (inputStream == null) {
      // fill parameter map with apiKey and session info
      params.put(PARAM_API_KEY, apiKey);
      try {
        HttpURLConnection urlConnection = openPostConnection(method, params);
        inputStream = getInputStreamFromConnection(urlConnection);

        if (inputStream == null) {
          this.lastResult =
              Result.createHttpErrorResult(
                  urlConnection.getResponseCode(), urlConnection.getResponseMessage());
          return lastResult;
        } else {
          if (cache != null) {
            long expires = urlConnection.getHeaderFieldDate("Expires", -1);
            if (expires == -1) {
              expires = cache.findExpirationDate(method, params);
            }
            if (expires != -1) {
              cache.store(
                  cacheEntryName, inputStream, expires); // if data wasn't cached store new result
              inputStream = cache.load(cacheEntryName);
              if (inputStream == null) throw new CallException("Caching/Reloading failed");
            }
          }
        }
      } catch (IOException e) {
        throw new CallException(e);
      }
    }

    try {
      Result result = createResultFromInputStream(inputStream);
      if (!result.isSuccessful()) {
        Log.w(TAG, String.format("API call failed with result: %s%n", result));
        if (cache != null) {
          cache.remove(cacheEntryName);
        }
      }
      this.lastResult = result;
      return result;
    } catch (IOException e) {
      throw new CallException(e);
    } catch (SAXException e) {
      throw new CallException(e);
    }
  }
Ejemplo n.º 2
0
 /**
  * Creates a Last.fm playlist.
  *
  * @param title A title for the playlist
  * @param description A description for the playlist
  * @param session A Session instance
  * @return the result of the operation
  */
 public static Playlist create(String title, String description, Session session) {
   Result result =
       Caller.getInstance()
           .call("playlist.create", session, "title", title, "description", description);
   if (!result.isSuccessful()) return null;
   return ResponseBuilder.buildItem(
       result.getContentElement().getChild("playlist"), Playlist.class);
 }
Ejemplo n.º 3
0
 /**
  * Gets a list of a user's playlists on Last.fm. Note that this method only fetches metadata
  * regarding the user's playlists. If you want to retrieve the list of tracks in a playlist use
  * {@link Playlist#fetch(String, String) Playlist.fetch()}.
  *
  * @param user The last.fm username to fetch the playlists of.
  * @param apiKey A Last.fm API key.
  * @return a list of Playlists
  */
 public static Collection<Playlist> getPlaylists(String user, String apiKey) {
   Result result = Caller.getInstance().call("user.getPlaylists", apiKey, "user", user);
   if (!result.isSuccessful()) return Collections.emptyList();
   Collection<Playlist> playlists = new ArrayList<Playlist>();
   for (DomElement element : result.getContentElement().getChildren("playlist")) {
     playlists.add(Playlist.playlistFromElement(element));
   }
   return playlists;
 }
Ejemplo n.º 4
0
 /**
  * Get a list of valid countries and {@link de.umass.lastfm.Geo.Metro}s for use in the other
  * webservices.
  *
  * @param country Optionally restrict the results to those Metros from a particular country, as
  *     defined by the ISO 3166-1 country names standard
  * @param apiKey A Last.fm API key
  * @return a List of {@link de.umass.lastfm.Geo.Metro}s
  */
 public static Collection<Metro> getMetros(String country, String apiKey) {
   Map<String, String> params = new HashMap<String, String>();
   MapUtilities.nullSafePut(params, "country", country);
   Result result = Caller.getInstance().call("geo.getMetros", apiKey, params);
   if (!result.isSuccessful()) return Collections.emptyList();
   Collection<DomElement> children = result.getContentElement().getChildren("metro");
   Collection<Metro> metros = new ArrayList<Metro>(children.size());
   for (DomElement child : children) {
     metros.add(new Metro(child.getChildText("name"), child.getChildText("country")));
   }
   return metros;
 }
Ejemplo n.º 5
0
 private Result createResultFromInputStream(InputStream inputStream)
     throws SAXException, IOException {
   Document document =
       newDocumentBuilder().parse(new InputSource(new InputStreamReader(inputStream, "UTF-8")));
   Element root = document.getDocumentElement(); // lfm element
   String statusString = root.getAttribute("status");
   Status status = "ok".equals(statusString) ? Status.OK : Status.FAILED;
   if (status == Status.FAILED) {
     Element errorElement = (Element) root.getElementsByTagName("error").item(0);
     int errorCode = Integer.parseInt(errorElement.getAttribute("code"));
     String message = errorElement.getTextContent();
     return Result.createRestErrorResult(errorCode, message);
   } else {
     return Result.createOkResult(document);
   }
 }
Ejemplo n.º 6
0
 static Result createRestErrorResult(int errorCode, String errorMessage) {
   Result r = new Result(errorMessage);
   r.errorCode = errorCode;
   return r;
 }
Ejemplo n.º 7
0
 static Result createHttpErrorResult(int httpErrorCode, String errorMessage) {
   Result r = new Result(errorMessage);
   r.httpErrorCode = httpErrorCode;
   return r;
 }