import java.io.File; import java.net.URL; import java.net.URLEncoder; import java.util.Iterator; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.json.JSONArray; import org.json.JSONObject; import org.pircbotx.Channel; import org.pircbotx.Colors; import org.pircbotx.PircBotX; import org.pircbotx.User; import pl.shockah.HTTPQuery; import pl.shockah.StringTools; import pl.shockah.shocky.Data; import pl.shockah.shocky.Module; import pl.shockah.shocky.Utils; import pl.shockah.shocky.interfaces.IAcceptURLs; public class ModuleSpotify extends Module implements IAcceptURLs { private Pattern target = Pattern.compile("^/track/([a-zA-Z0-9]+)$"); @Override public void onEnable(File dir) { Data.config.setNotExists("spotify-otherbot",false); } @Override public boolean shouldAcceptURL(URL u) { if (u == null) return false; if (!u.getProtocol().startsWith("http")) return false; return u.getHost().endsWith("open.spotify.com"); } @Override public void handleURL(PircBotX bot, Channel channel, User sender, List<URL> urls) { if (bot == null || urls == null || urls.isEmpty() || (channel == null && sender == null)) return; if (channel != null && (!isEnabled(channel.getName()) || Data.forChannel(channel).getBoolean("spotify-otherbot"))) return; StringBuilder sb = new StringBuilder(); Iterator<URL> iter = urls.iterator(); while (iter.hasNext()) { URL u = iter.next(); Matcher m = this.target.matcher(u.getPath()); if (!m.find()) continue; String id = m.group(1); CharSequence s = info(id); if (s == null) continue; if (urls.size() > 1) sb.append(id).append(": "); sb.append(s); if (iter.hasNext()) sb.append('\n'); } if (sb.length() == 0) return; String s = StringTools.limitLength(StringTools.formatLines(sb)); if (channel != null) bot.sendMessage(channel, sender.getNick()+": "+s); else if (sender != null) bot.sendMessage(sender, s); } public CharSequence info(String id) { HTTPQuery q = null; try { q = HTTPQuery.create("http://ws.spotify.com/lookup/1/.json?uri=spotify:track:" + URLEncoder.encode(id, "UTF8")); q.connect(true, false); JSONObject jItem = new JSONObject(q.readWhole()).getJSONObject("track"); q.close(); String track = jItem.getString("name"); String released = jItem.getJSONObject("album").getString("released"); JSONArray artistsArray = jItem.getJSONArray("artists"); int length = artistsArray.length(); String[] artists = new String[length]; for(int i = 0; i < length; i++) artists[i] = artistsArray.getJSONObject(i).getString("name"); int duration = (int)jItem.getDouble("length"); StringBuilder sb = new StringBuilder(); sb.append(Colors.BOLD).append(track).append(Colors.BOLD); sb.append(" | length ").append(Colors.BOLD).append(Utils.timeAgo(duration)).append(Colors.BOLD); sb.append(" | released ").append(Colors.BOLD).append(released).append(Colors.BOLD); sb.append(" | by ").append(Colors.BOLD).append(StringTools.implode(artists, ", ")).append(Colors.BOLD); return sb; } catch (Exception e) {e.printStackTrace();} return null; } @Override public String name() { return "spotify"; } }