package extras.urlparsers; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.text.NumberFormat; import java.time.LocalDateTime; import java.util.Locale; import java.util.Scanner; import java.util.regex.Pattern; import bot.Config; import extras.URLTitles; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonElement; import com.google.gson.JsonObject; public class YoutubeParser { public static String find(String s){ String videoid = "none"; if(s.contains("youtu.be")){ videoid = s.split("youtu.be/")[1].split("\\?")[0]; } else{ videoid = s.split(".*/.*/.*v=")[1].split("\\?")[0]; } return findById(videoid); } public static String findById(String s){ String videoid = s; try { URL url = new URL("https://www.googleapis.com/youtube/v3/videos?key=" + Config.getGoogleApiKey() + "&part=snippet,statistics,contentDetails&id=" + videoid); InputStream in = url.openStream(); Scanner scan = new Scanner(in); String jsonstring = ""; while(scan.hasNext()){ jsonstring += scan.next() + " "; } scan.close(); Gson gson = new GsonBuilder().create(); JsonObject json = gson.fromJson(jsonstring, JsonElement.class).getAsJsonObject(); JsonObject items = json.get("items").getAsJsonArray().get(0).getAsJsonObject(); JsonObject snippet = items.get("snippet").getAsJsonObject(); JsonObject contentDetails = items.get("contentDetails").getAsJsonObject(); JsonObject statistics = items.get("statistics").getAsJsonObject(); String title = URLTitles.makeClean(snippet.get("title").getAsString()); String uploader = snippet.get("channelTitle").getAsString(); String views = NumberFormat.getNumberInstance(Locale.US).format(statistics.get("viewCount").getAsInt()); String likes = NumberFormat.getNumberInstance(Locale.US).format(statistics.get("likeCount").getAsInt()); String dislikes = NumberFormat.getNumberInstance(Locale.US).format(statistics.get("dislikeCount").getAsInt()); //String comments = NumberFormat.getNumberInstance(Locale.US).format(statistics.get("commentCount").getAsInt()); String duration = contentDetails.get("duration").getAsString(); String dur; if(Pattern.matches("PT.*D.*H.*M.*S", duration)){ dur = duration.substring(2,duration.length()); String days = dur.split("D")[0]; dur = dur.split("D")[1]; String hours = dur.split("H")[0]; dur = dur.split("H")[1]; String minutes = dur.split("M")[0]; dur = dur.split("M")[1]; String seconds = dur.split("S")[0]; dur = String.format("%02d:%02d:%02d:%02d", Integer.parseInt(days), Integer.parseInt(hours), Integer.parseInt(minutes), Integer.parseInt(seconds)); } else if(Pattern.matches("PT.*H.*M.*S", duration)){ dur = duration.substring(2,duration.length()); String hours = dur.split("H")[0]; dur = dur.split("H")[1]; String minutes = dur.split("M")[0]; dur = dur.split("M")[1]; String seconds = dur.split("S")[0]; dur = String.format("%02d:%02d:%02d", Integer.parseInt(hours), Integer.parseInt(minutes), Integer.parseInt(seconds)); } else if(Pattern.matches("PT.*M.*S", duration)){ dur = duration.substring(2,duration.length()); String minutes = dur.split("M")[0]; dur = dur.split("M")[1]; String seconds = dur.split("S")[0]; dur = String.format("%02d:%02d", Integer.parseInt(minutes), Integer.parseInt(seconds)); } else { dur = duration.substring(2,duration.length()-1) + " seconds"; } duration = dur; LocalDateTime ldt = LocalDateTime.parse(snippet.get("publishedAt").getAsString().split("\\.")[0]); int date = ldt.getDayOfMonth(); String dateString = ""; switch(date){ case 1: dateString = "1st"; break; case 2: dateString = "2nd"; break; case 3: dateString = "3rd"; break; } if(dateString.equals("")) dateString = date + "th"; String uploaded = ldt.getMonth().name().charAt(0) + ldt.getMonth().name().toLowerCase().substring(1) + " " + dateString + " " + ldt.getYear(); double percentlike; if(statistics.get("likeCount").getAsInt() == 0 && statistics.get("dislikeCount").getAsInt() == 0){ percentlike = 0.5; } else if(statistics.get("likeCount").getAsInt() == 0){ percentlike = 0; } else if(statistics.get("dislikeCount").getAsInt() == 0){ percentlike = 1; } else percentlike = statistics.get("likeCount").getAsDouble()/statistics.get("dislikeCount").getAsDouble(); int likeQuartile = (int)Math.ceil(percentlike*10); String likebar = "3"; String ratingchar = "ā†‘"; for(int i = 0; i < 10; i++){ if(i == likeQuartile){ likebar+= "4"; ratingchar = "ā†“"; } likebar+=ratingchar; } likebar += ""; String videoinfo = String.format("%s | Uploader: %s | Duration: %s | Uploaded: %s | Views: %s |3 %sā†‘4 %sā†“ ", title, uploader, duration, uploaded, views, likes, dislikes); return videoinfo; } catch (IOException e) { e.printStackTrace(); } catch(IndexOutOfBoundsException e){ return "" + s + " is not a valid videoid"; } return null; } }