/*
* 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 de.umass.xml.DomElement;
/**
* Bean for music playlists. Contains the {@link #fetch(String, String) fetch} method and various <code>fetchXXX</code>
* methods to retrieve playlists from the server. Playlists are identified by lastfm:// playlist urls. Valid urls
* include:
* <ul>
* <li><b>Album Playlists:</b> lastfm://playlist/album/{@literal <album_id>}</li>
* <li><b>User Playlists:</b> lastfm://playlist/{@literal <playlist_id>}</li>
* <li><b>Tag Playlists:</b> lastfm://playlist/tag/{@literal <tag_name>}/freetracks</li>
* </ul>
* See <a href="http://www.last.fm/api/playlists">http://www.last.fm/api/playlists</a> for more information about playlists.
*
* @author Janni Kovacs
*/
public class Playlist {
private int id;
private String title;
private String annotation;
private int size;
private String creator;
private Collection<Track> tracks = new ArrayList<Track>();
private Playlist() {
}
public String getCreator() {
return creator;
}
public int getId() {
return id;
}
public int getSize() {
return size;
}
public String getTitle() {
return title;
}
public String getAnnotation() {
return annotation;
}
public Collection<Track> getTracks() {
return tracks;
}
/**
* Fetches an album playlist, which contains the tracks of the specified album.
*
* @param albumId The album id as returned in {@link Album#getInfo(String, String, String) Album.getInfo}.
* @param apiKey A Last.fm API key.
* @return a playlist
*/
public static Playlist fetchAlbumPlaylist(String albumId, String apiKey) {
return fetch("lastfm://playlist/album/" + albumId, apiKey);
}
/**
* Fetches a user-created playlist.
*
* @param playlistId A playlist id.
* @param apiKey A Last.fm API key.
* @return a playlist
*/
public static Playlist fetchUserPlaylist(int playlistId, String apiKey) {
return fetch("lastfm://playlist/" + playlistId, apiKey);
}
/**
* Fetches a playlist of freetracks for a given tag name.
*
* @param tag A tag name.
* @param apiKey A Last.fm API key.
* @return a playlist
*/
public static Playlist fetchTagPlaylist(String tag, String apiKey) {
return fetch("lastfm://playlist/tag/" + tag + "/freetracks", apiKey);
}
/**
* Fetches a playlist using a lastfm playlist url. See the class description for a list of valid
* playlist urls.
*
* @param playlistUrl A valid playlist url.
* @param apiKey A Last.fm API key.
* @return a playlist
*/
public static Playlist fetch(String playlistUrl, String apiKey) {
Result result = Caller.getInstance().call("playlist.fetch", apiKey, "playlistURL", playlistUrl);
return playlistFromElement(result.getContentElement());
}
/**
* Add a track to a Last.fm user's playlist.
*
* @param playlistId The ID of the playlist - this is available in user.getPlaylists
* @param artist The artist name that corresponds to the track to be added.
* @param track The track name to add to the playlist.
* @param session A Session instance.
* @return the result of the operation
*/
public static Result addTrack(int playlistId, String artist, String track, Session session) {
return Caller.getInstance()
.call("playlist.addTrack", session, "playlistID", String.valueOf(playlistId), "artist", artist, "track",
track);
}
/**
* 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 playlistFromElement(result.getContentElement().getChild("playlist"));
}
static Playlist playlistFromElement(DomElement e) {
if (e == null)
return null;
Playlist p = new Playlist();
if (e.hasChild("id"))
p.id = Integer.parseInt(e.getChildText("id"));
p.title = e.getChildText("title");
if (e.hasChild("size"))
p.size = Integer.parseInt(e.getChildText("size"));
p.creator = e.getChildText("creator");
p.annotation = e.getChildText("annotation");
DomElement tl = e.getChild("trackList");
if (tl != null) {
for (DomElement te : tl.getChildren("track")) {
Track t = new Track(te.getChildText("title"), te.getChildText("identifier"),
te.getChildText("creator"));
t.album = te.getChildText("album");
t.duration = Integer.parseInt(te.getChildText("duration")) / 1000;
t.imageUrls.put(ImageSize.LARGE, te.getChildText("image"));
t.imageUrls.put(ImageSize.ORIGINAL, te.getChildText("image"));
t.location = te.getChildText("location");
for (DomElement ext : te.getChildren("extension")) {
if ("http://www.last.fm".equals(ext.getAttribute("application"))) {
for (DomElement child : ext.getChildren()) {
t.lastFmExtensionInfos.put(child.getTagName(), child.getText());
}
}
}
p.tracks.add(t);
}
if (p.size == 0)
p.size = p.tracks.size();
}
return p;
}
}