package org.fluxtream.connectors.lastfm; import java.util.ArrayList; import java.util.List; import org.fluxtream.core.ApiData; import org.fluxtream.core.connectors.ObjectType; import org.fluxtream.core.connectors.updaters.UpdateInfo; import org.fluxtream.core.domain.AbstractFacet; import org.fluxtream.core.facets.extractors.AbstractFacetExtractor; import org.fluxtream.core.services.JPADaoService; import net.sf.json.JSONArray; import net.sf.json.JSONObject; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component public class LastFmFacetExtractor extends AbstractFacetExtractor { @Autowired JPADaoService jpaDaoService; public List<AbstractFacet> extractFacets(UpdateInfo updateInfo, ApiData apiData, ObjectType objectType) { List<AbstractFacet> facets = new ArrayList<AbstractFacet>(); try { if (objectType == ObjectType.getObjectType(connector(updateInfo), "recent_track")) { extractLastfmRecentTracks(apiData, facets); } } catch (Throwable t) { t.printStackTrace(); } return facets; } private void extractLastfmRecentTracks(ApiData apiData, List<AbstractFacet> facets) throws Throwable { JSONObject tracksToExtract = apiData.jsonObject .getJSONObject("recenttracks"); JSONArray tracks = new JSONArray(); if (tracksToExtract.containsKey("track")&&tracksToExtract.get("track") instanceof JSONArray) tracks = tracksToExtract.getJSONArray("track"); else if (tracksToExtract.containsKey("track")&&tracksToExtract.get("track") instanceof JSONObject) { JSONObject aTrack = tracksToExtract.getJSONObject("track"); tracks.add(aTrack); } else return; int ntracks = tracks.size(); for (int i = 0; i < ntracks; i++) { LastFmRecentTrackFacet facet = new LastFmRecentTrackFacet(apiData.updateInfo.apiKey.getId()); super.extractCommonFacetData(facet, apiData); JSONObject it = tracks.getJSONObject(i); if (!it.containsKey("artist")) continue; if (!it.getJSONObject("artist").containsKey("#text")) { JSONObject artist = it.getJSONObject("artist"); facet.artist = artist.getString("name"); facet.artist_mbid = artist.getString("mbid"); } else { facet.artist = it.getJSONObject("artist").getString("#text"); } if (!it.containsKey("name")) continue; String name = it.getString("name"); facet.name = name; JSONObject dateObject = it.getJSONObject("date"); if (!dateObject.containsKey("uts")) continue; long uts = dateObject.getLong("uts"); long date = (Long.valueOf(uts)) * 1000; facet.time = date; facet.start = date; facet.end = date; if (it.containsKey("image")) { JSONArray images = it.getJSONArray("image"); if (images != null) { StringBuffer bf = new StringBuffer(); for (int j = 0; j < images.size(); j++) { if (bf.length() != 0) bf.append(","); JSONObject imageObject = images.getJSONObject(j); String size = imageObject.getString("size"); if (size.trim().equalsIgnoreCase("small")) bf.append(imageObject.getString("#text")); } facet.imgUrls = bf.toString(); } } if (it.containsKey("url")) facet.url = it.getString("url"); if (it.containsKey("mbid")) facet.mbid = it.getString("mbid"); LastFmRecentTrackFacet duplicate = jpaDaoService.findOne("lastfm.recent_track.byStartEnd", LastFmRecentTrackFacet.class, apiData.updateInfo.apiKey.getId(), date, date); if (duplicate==null) facets.add(facet); } } }