package com.teleca.jamendo.api_impl; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.util.Hashtable; import org.json.JSONArray; import org.json.JSONException; import com.teleca.jamendo.activity.playview.PlayMethod; import com.teleca.jamendo.api.IServerApi; import com.teleca.jamendo.model.Album; import com.teleca.jamendo.model.Artist; import com.teleca.jamendo.model.ErrorMsg; import com.teleca.jamendo.model.License; import com.teleca.jamendo.model.Playlist; import com.teleca.jamendo.model.PlaylistRemote; import com.teleca.jamendo.model.Radio; import com.teleca.jamendo.model.Review; import com.teleca.jamendo.model.Track; import com.teleca.jamendo.other.AlbumFunctions; import com.teleca.jamendo.other.ArtistFunctions; import com.teleca.jamendo.other.LicenseBuilder; import com.teleca.jamendo.other.PlaylistFunctions; import com.teleca.jamendo.other.RSSFunctions; import com.teleca.jamendo.other.RadioFunctions; import com.teleca.jamendo.other.ReviewFunctions; import com.teleca.jamendo.other.TrackFunctions; import com.teleca.jamendo.util.Caller; /** * 实现服务器接口的方法 Jamendo Get2 API implementation, Apache HTTP Client used for web * requests * * @author Lukasz Wisniewski */ public class ServerApiImpl implements IServerApi { private static String GET_API = "http://api.jamendo.com/get2/"; private String doGet(String query) throws ErrorMsg { return Caller.doGet(GET_API + query); } @Override public Album[] getPopularAlbumsWeek() throws JSONException, ErrorMsg { String jsonString = doGet("id+name+url+image+rating+artist_name/album/json/?n=20&order=ratingweek_desc"); if (jsonString == null) return null; JSONArray jsonArrayAlbums = new JSONArray(jsonString); return AlbumFunctions.getAlbums(jsonArrayAlbums); } @Override public Track[] getAlbumTracks(Album album, String encoding) throws JSONException, ErrorMsg { String jsonString = doGet("numalbum+id+name+duration+rating+url+stream/track/json/?album_id=" + album.getId() + "&streamencoding=" + encoding); JSONArray jsonArrayTracks = new JSONArray(jsonString); return TrackFunctions.getTracks(jsonArrayTracks, true); } @Override public Album[] searchForAlbumsByArtist(String artistName) throws JSONException, ErrorMsg { try { artistName = URLEncoder.encode(artistName, "UTF-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); return null; } String jsonString = doGet("id+name+url+image+rating+artist_name/album/json/?order=ratingweek_desc&n=50&searchquery=" + artistName); JSONArray jsonArrayAlbums = new JSONArray(jsonString); return AlbumFunctions.getAlbums(jsonArrayAlbums); } @Override public Album[] searchForAlbumsByTag(String tag) throws JSONException, ErrorMsg { try { tag = URLEncoder.encode(tag, "UTF-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); return null; } String jsonString = doGet("id+name+url+image+rating+artist_name/album/json/?order=ratingweek_desc&tag_idstr=" + tag + "&n=50"); JSONArray jsonArrayAlbums = new JSONArray(jsonString); return AlbumFunctions.getAlbums(jsonArrayAlbums); } @Override public Album[] searchForAlbumsByArtistName(String artistName) throws JSONException, ErrorMsg { try { artistName = URLEncoder.encode(artistName, "UTF-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); return null; } String jsonString = doGet("id+name+url+image+rating+artist_name/album/json/?order=ratingweek_desc&n=50&artist_name=" + artistName); JSONArray jsonArrayAlbums = new JSONArray(jsonString); return AlbumFunctions.getAlbums(jsonArrayAlbums); } @Override public Artist getArtist(String name) throws JSONException, ErrorMsg { try { name = URLEncoder.encode(name, "UTF-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); return null; } String jsonString = doGet("id+idstr+name+url+image+rating+mbgid+mbid+genre/artist/jsonpretty/?name=" + name); JSONArray jsonArrayAlbums = new JSONArray(jsonString); return ArtistFunctions.getArtist(jsonArrayAlbums)[0]; } @Override public int[] getTop100Listened() throws ErrorMsg { String rssString = Caller .doGet("http://www.jamendo.com/en/rss/top-track-week"); return RSSFunctions.getTracksIdFromRss(rssString); } @Override public Album[] getAlbumsByTracksId(int[] id) throws JSONException, ErrorMsg { if (id == null) return null; String id_query = Caller.createStringFromIds(id); String jsonString = doGet("id+name+url+image+rating+artist_name/album/json/?n=" + id.length + "&track_id=" + id_query); JSONArray jsonArrayAlbums = new JSONArray(jsonString); return AlbumFunctions.getAlbums(jsonArrayAlbums); } @Override public Track[] getTracksByTracksId(int[] id, String encoding) throws JSONException, ErrorMsg { if (id == null) return null; String id_query = Caller.createStringFromIds(id); String jsonString = doGet("id+numalbum+name+duration+rating+url+stream/track/json/?streamencoding=" + encoding + "&n=" + id.length + "&id=" + id_query); JSONArray jsonArrayTracks = new JSONArray(jsonString); return TrackFunctions.getTracks(jsonArrayTracks, false); } @Override public Review[] getAlbumReviews(Album album) throws JSONException, ErrorMsg { String jsonString = doGet("id+name+text+rating+lang+user_name+user_image/review/json/?album_id=" + album.getId()); JSONArray jsonReviewAlbums = new JSONArray(jsonString); return ReviewFunctions.getReviews(jsonReviewAlbums); } @Override public PlayMethod getRadioPlaylist(Radio radio, int n, String encoding) throws JSONException, ErrorMsg { String jsonString = doGet("track_id/track/json/radio_track_inradioplaylist/?radio_id=" + radio.getId() + "&nshuffle=" + n * 10 + "&n=" + n); int[] tracks_id = TrackFunctions.getRadioPlaylist(new JSONArray( jsonString)); Album[] albums = getAlbumsByTracksId(tracks_id); Track[] tracks = getTracksByTracksId(tracks_id, encoding); if (albums == null || tracks == null) return null; Hashtable<Integer, Playlist> hashtable = new Hashtable<Integer, Playlist>(); for (int i = 0; i < tracks.length && i < albums.length; i++) { Playlist playlistEntry = new Playlist(); playlistEntry.setAlbum(albums[i]); playlistEntry.setTrack(tracks[i]); hashtable.put(tracks[i].getId(), playlistEntry); } // creating playlist in the correct order PlayMethod playlist = new PlayMethod(); for (int i = 0; i < tracks_id.length && i < albums.length; i++) { playlist.addPlaylistEntry(hashtable.get(tracks_id[i])); } return playlist; } @Override public Radio[] getRadiosByIds(int[] id) throws JSONException, ErrorMsg { String id_query = Caller.createStringFromIds(id); String jsonString = doGet("id+idstr+name+image/radio/json/?id=" + id_query); return RadioFunctions.getRadios(new JSONArray(jsonString)); } @Override public Radio[] getRadiosByIdstr(String idstr) throws JSONException, ErrorMsg { String jsonString = doGet("id+idstr+name+image/radio/json/?idstr=" + idstr); return RadioFunctions.getRadios(new JSONArray(jsonString)); } @Override public PlaylistRemote[] getUserPlaylist(String user) throws JSONException, ErrorMsg { try { user = URLEncoder.encode(user, "UTF-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); return null; } String jsonString = doGet("id+name+url+duration/playlist/json/playlist_user/?order=starred_desc&user_idstr=" + user); return PlaylistFunctions.getPlaylists(new JSONArray(jsonString)); } @Override public PlayMethod getPlaylist(PlaylistRemote playlistRemote) throws JSONException, ErrorMsg { String jsonString = doGet("stream+name+duration+url+id+rating/track/json/?playlist_id=" + playlistRemote.getId()); return TrackFunctions.getPlaylist(new JSONArray(jsonString)); } @Override public String getTrackLyrics(Track track) throws ErrorMsg { String jsonString = doGet("text/track/json/?id=" + track.getId()); JSONArray jsonArray; try { jsonArray = new JSONArray(jsonString); if (jsonArray.length() > 0) return jsonArray.getString(0).replace("\r", ""); else return null; } catch (JSONException e) { return null; } } @Override public License getAlbumLicense(Album album) throws ErrorMsg { String jsonString = doGet("id+url+image/license/json/?album_id=" + album.getId()); JSONArray jsonArray; try { jsonArray = new JSONArray(jsonString); if (jsonArray.length() > 0) return new LicenseBuilder().build(jsonArray.getJSONObject(0)); else return null; } catch (JSONException e) { return null; } } @Override public Album getAlbumById(int id) throws JSONException, ErrorMsg { String jsonString = doGet("id+name+url+image+rating+artist_name/album/json/?id=" + id); JSONArray jsonArrayAlbums = new JSONArray(jsonString); Album[] album = AlbumFunctions.getAlbums(jsonArrayAlbums); if (album != null && album.length > 0) return album[0]; return null; } @Override public Album[] getUserStarredAlbums(String user) throws JSONException, ErrorMsg { try { user = URLEncoder.encode(user, "UTF-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); return null; } String jsonString = doGet("id+name+url+image+rating+artist_name/album/json/album_user_starred/?user_idstr=" + user + "&n=all&order=rating_desc"); JSONArray jsonArrayAlbums = new JSONArray(jsonString); return AlbumFunctions.getAlbums(jsonArrayAlbums); } // TODO private String nameToIdstr(String name); }