package io.shockah.skylark.youtube; import com.github.kevinsawicki.http.HttpRequest; import com.google.common.base.Joiner; import io.shockah.json.JSONList; import io.shockah.json.JSONObject; import io.shockah.json.JSONParser; import io.shockah.skylark.UnexpectedException; import io.shockah.skylark.commands.CommandsPlugin; import io.shockah.skylark.plugin.Plugin; import io.shockah.skylark.plugin.PluginManager; import io.shockah.skylark.urlannouncer.URLAnnouncerPlugin; import io.shockah.skylark.util.TimeDuration; public class YouTubePlugin extends Plugin { public static final String SEARCH_URL = "https://www.googleapis.com/youtube/v3/search"; public static final String VIDEOS_URL = "https://www.googleapis.com/youtube/v3/videos"; @Dependency("io.shockah.skylark.commands") protected Plugin commandsOptionalPlugin; @Dependency("io.shockah.skylark.urlannouncer") protected Plugin urlAnnouncerOptionalPlugin; private Object command; private Object urlAnnouncer; public YouTubePlugin(PluginManager manager, Info info) { super(manager, info); } @Override protected void onAllPluginsLoaded() { if (commandsOptionalPlugin != null) { CommandsPlugin commandsPlugin = (CommandsPlugin)commandsOptionalPlugin; YouTubeCommand command = new YouTubeCommand(this); commandsPlugin.addNamedCommand(command); this.command = command; } if (urlAnnouncerOptionalPlugin != null) { URLAnnouncerPlugin urlAnnouncerPlugin = (URLAnnouncerPlugin)urlAnnouncerOptionalPlugin; YouTubeURLAnnouncer urlAnnouncer = new YouTubeURLAnnouncer(this); urlAnnouncerPlugin.addAnnouncer(urlAnnouncer); this.urlAnnouncer = urlAnnouncer; } } @Override protected void onUnload() { if (commandsOptionalPlugin != null) { CommandsPlugin commandsPlugin = (CommandsPlugin)commandsOptionalPlugin; commandsPlugin.removeNamedCommand((YouTubeCommand)command); } if (urlAnnouncerOptionalPlugin != null) { URLAnnouncerPlugin urlAnnouncerPlugin = (URLAnnouncerPlugin)urlAnnouncerOptionalPlugin; urlAnnouncerPlugin.removeAnnouncer((YouTubeURLAnnouncer)urlAnnouncer); } } private int parseResponseDuration(String duration) { if (!duration.startsWith("PT")) throw new IllegalArgumentException(); duration = duration.substring(2); return TimeDuration.parseSeconds(duration); } public Video getVideo(String id) { return getVideos(id)[0]; } public Video[] getVideos(String... ids) { try { JSONObject j = new JSONParser().parseObject(HttpRequest.get(VIDEOS_URL, true, "id", Joiner.on(",").join(ids), "part", "snippet,contentDetails,statistics", "key", getConfig().getString("apiKey") ).body()); JSONList<JSONObject> jItems = j.getList("items").ofObjects(); Video[] results = new Video[jItems.size()]; for (int i = 0; i < jItems.size(); i++) { JSONObject jItem = jItems.get(i); Video video = new Video(); video.id = jItem.getString("id"); JSONObject jSnippet = jItem.getObject("snippet"); video.title = jSnippet.getString("title"); video.channelTitle = jSnippet.getString("channelTitle"); JSONObject jContentDetails = jItem.getObject("contentDetails"); video.durationInSeconds = parseResponseDuration(jContentDetails.getString("duration")); JSONObject jStatistics = jItem.getObject("statistics"); video.views = Long.parseLong(jStatistics.getString("viewCount")); video.likes = Integer.parseInt(jStatistics.getString("likeCount")); video.dislikes = Integer.parseInt(jStatistics.getString("dislikeCount")); results[i] = video; } return results; } catch (Exception e) { throw new UnexpectedException(e); } } public Video search(String query) { return search(query, 1)[0]; } public Video[] search(String query, int maxResults) { try { JSONObject j = new JSONParser().parseObject(HttpRequest.get(SEARCH_URL, true, "type", "video", "part", "id", "q", query, "maxResults", maxResults, "key", getConfig().getString("apiKey") ).body()); JSONList<JSONObject> jItems = j.getList("items").ofObjects(); String[] videoIds = new String[jItems.size()]; for (int i = 0; i < videoIds.length; i++) videoIds[i] = jItems.get(i).getObject("id").getString("videoId"); return getVideos(videoIds); } catch (Exception e) { throw new UnexpectedException(e); } } }