From d9fb9195f9bef70c785796ab48c6ae4dcf99eb49 Mon Sep 17 00:00:00 2001 From: aj Date: Thu, 23 May 2019 14:39:19 +0100 Subject: [PATCH] added get artist top tracks --- .../java/sarsoo/fmframework/fm/FmNetwork.java | 74 ++++++++++++++++--- .../sarsoo/fmframework/fm/FmUserNetwork.java | 3 +- .../sarsoo/fmframework/fm/FmNetworkTest.java | 13 ++++ 3 files changed, 79 insertions(+), 11 deletions(-) diff --git a/src/main/java/sarsoo/fmframework/fm/FmNetwork.java b/src/main/java/sarsoo/fmframework/fm/FmNetwork.java index 4af4350..011a167 100644 --- a/src/main/java/sarsoo/fmframework/fm/FmNetwork.java +++ b/src/main/java/sarsoo/fmframework/fm/FmNetwork.java @@ -13,9 +13,11 @@ import sarsoo.fmframework.music.FMObj; import sarsoo.fmframework.music.Track; import sarsoo.fmframework.music.Track.TrackBuilder; import sarsoo.fmframework.music.Wiki; +import sarsoo.fmframework.util.FMObjList; import java.util.HashMap; +import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; @@ -240,11 +242,19 @@ public class FmNetwork { JSONObject obj = makeGetRequest("track.getinfo", parameters); + return parseTrack(obj.getJSONObject("track"), artist); + + } + + protected Track parseTrack(JSONObject trackJson, Artist artist) { + + Log log = Logger.getLog(); + String nameIn; try { - JSONObject trackJson = obj.getJSONObject("track"); +// JSONObject trackJson = obj.getJSONObject("track"); nameIn = trackJson.getString("name"); @@ -253,32 +263,33 @@ public class FmNetwork { try { builder.setMbid(trackJson.getString("mbid")); } catch (JSONException e) { - log.logInfo(new InfoEntry("getTrack").addArg("no mbid for").addArg(nameIn).addArg(e.getMessage())); + log.logInfo(new InfoEntry("parseTrack").addArg("no mbid for").addArg(nameIn).addArg(e.getMessage())); } try { builder.setUrl(trackJson.getString("url")); } catch (JSONException e) { - log.logInfo(new InfoEntry("getTrack").addArg("no url for").addArg(nameIn).addArg(e.getMessage())); + log.logInfo(new InfoEntry("parseTrack").addArg("no url for").addArg(nameIn).addArg(e.getMessage())); } try { builder.setListeners(trackJson.getInt("listeners")); } catch (JSONException e) { - log.logInfo(new InfoEntry("getTrack").addArg("no listeners for").addArg(nameIn).addArg(e.getMessage())); + log.logInfo( + new InfoEntry("parseTrack").addArg("no listeners for").addArg(nameIn).addArg(e.getMessage())); } try { builder.setPlayCount(trackJson.getInt("playcount")); } catch (JSONException e) { log.logInfo( - new InfoEntry("getTrack").addArg("no play count for").addArg(nameIn).addArg(e.getMessage())); + new InfoEntry("parseTrack").addArg("no play count for").addArg(nameIn).addArg(e.getMessage())); } try { builder.setUserPlayCount(trackJson.getInt("userplaycount")); } catch (JSONException e) { - log.logInfo(new InfoEntry("getTrack").addArg("no user play count for").addArg(nameIn) + log.logInfo(new InfoEntry("parseTrack").addArg("no user play count for").addArg(nameIn) .addArg(e.getMessage())); } @@ -291,18 +302,63 @@ public class FmNetwork { builder.setWiki(wiki); } catch (JSONException e) { - log.logInfo(new InfoEntry("getTrack").addArg("no wiki for").addArg(nameIn).addArg(e.getMessage())); + log.logInfo(new InfoEntry("parseTrack").addArg("no wiki for").addArg(nameIn).addArg(e.getMessage())); } return builder.build(); } catch (JSONException e) { - log.logInfo(new InfoEntry("getTrack").addArg("track name not found").addArg(e.getMessage())); + log.logInfo(new InfoEntry("parseTrack").addArg("track name not found").addArg(e.getMessage())); } return null; } + public FMObjList getArtistTopTracks(Artist artist, int number) { + + Logger.getLog() + .log(new LogEntry("getArtistTopTracks").addArg(artist.getName()).addArg(Integer.toString(number))); + + int limit = 50; + + int pages = 0; + + System.out.println(number / limit); + if ((double) number % (double) limit != 0) { + pages = (number / limit) + 1; + } else { + pages = number / limit; + } + + FMObjList tracks = new FMObjList(); + int counter; + for (counter = 0; counter < pages; counter++) { + + HashMap parameters = new HashMap(); + + parameters.put("artist", artist.getName()); + parameters.put("limit", Integer.toString(limit)); + parameters.put("page", Integer.toString(counter + 1)); + + JSONObject obj = makeGetRequest("artist.gettoptracks", parameters); + + JSONArray tracksJson = obj.getJSONObject("toptracks").getJSONArray("track"); + + for (int i = 0; i < tracksJson.length(); i++) { + JSONObject json = (JSONObject) tracksJson.get(i); + + if (tracks.size() < number) { + + tracks.add(parseTrack(json, artist)); + + } + + } + } + + return tracks; + } + /** * Exchanges album object for stat-updated album from Last.FM * @@ -378,7 +434,7 @@ public class FmNetwork { try { request = Unirest.get("https://ws.audioscrobbler.com/2.0/").header("Accept", "application/json") .header("User-Agent", "fmframework"); - + parameters.put("method", method); parameters.put("api_key", key); parameters.put("format", "json"); diff --git a/src/main/java/sarsoo/fmframework/fm/FmUserNetwork.java b/src/main/java/sarsoo/fmframework/fm/FmUserNetwork.java index ee37a87..e8cb8bd 100644 --- a/src/main/java/sarsoo/fmframework/fm/FmUserNetwork.java +++ b/src/main/java/sarsoo/fmframework/fm/FmUserNetwork.java @@ -300,8 +300,7 @@ public class FmUserNetwork extends FmNetwork { if (tracks.size() < number) { Artist artist = new ArtistBuilder(json.getJSONObject("artist").getString("name")).build(); - Track track = new TrackBuilder(json.getString("name"), artist) - .setUserPlayCount(json.getInt("playcount")).build(); + Track track = parseTrack(json, artist); tracks.add(track); diff --git a/src/test/java/sarsoo/fmframework/fm/FmNetworkTest.java b/src/test/java/sarsoo/fmframework/fm/FmNetworkTest.java index c9e1624..0fef9cd 100644 --- a/src/test/java/sarsoo/fmframework/fm/FmNetworkTest.java +++ b/src/test/java/sarsoo/fmframework/fm/FmNetworkTest.java @@ -5,7 +5,9 @@ import static org.junit.Assert.*; import sarsoo.fmframework.music.Album; import sarsoo.fmframework.music.Artist; +import sarsoo.fmframework.music.Artist.ArtistBuilder; import sarsoo.fmframework.net.Key; +import sarsoo.fmframework.util.FMObjList; public class FmNetworkTest { @@ -44,5 +46,16 @@ public class FmNetworkTest { assertTrue(true); } + + @Test + public void testArtistTopTracks() { + FmNetwork network = new FmNetwork(Key.getKey()); + + FMObjList list = network.getArtistTopTracks(new ArtistBuilder("kendrick lamar").build(), 10); + + list.stream().forEach(System.out::println); + + assertTrue(true); + } }