package youtube; import activity.AWeb.Video; import tools.HttpUtils; import java.net.URLDecoder; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; public class YoutubeScript { // Get query map from the infostr private static Map<String, String> getQueryMap(String query) { String[] params = query.split("&"); Map<String, String> map = new HashMap<String, String>(); for (String param : params) { String[] values = param.split("="); if (values.length > 1) { map.put(values[0], values[1]); } else { map.put(values[0], "NA"); } } return map; } //get the file extension from the type num. public static String getExtension(String type) { if (type.toLowerCase().equals("video/webm")) { return "WEBM"; } if (type.toLowerCase().equals("video/x-flv")) { return "FLV"; } if (type.toLowerCase().equals("video/mp4")) { return "MP4"; } if (type.toLowerCase().equals("video/3gpp")) { return "3GP"; } return "MP4"; } //get quality from that quality string. public static String getQuality(String quality) { if (quality.toLowerCase().equals("small")) { return "174p"; } if (quality.toLowerCase().equals("medium")) { return "360p"; } if (quality.toLowerCase().equals("large")) { return "480p"; } if (quality.toLowerCase().equals("hd720")) { return "720p"; } if (quality.toLowerCase().equals("hd1080")) { return "1080p"; } return "Normal"; } public static ArrayList<Video> extractLinks(String vid) { ArrayList<Video> vids = new ArrayList<Video>(); try { String lInfoStr = HttpUtils.getSource(YoutubeUrlIDs.YOUTUBE_VIDEO_INFORMATION_URL + vid); Map<String, String> lQueryPar = getQueryMap(lInfoStr); if (lQueryPar.containsKey("reason")) { return null; } String lTitle = lQueryPar.get("title"); lTitle = URLDecoder.decode(lTitle, "UTF-8"); lTitle = lTitle.replaceAll("[^a-zA-Z0-9\\s]+", ""); String url_encoded_fmt_stream_map = lQueryPar.get("url_encoded_fmt_stream_map"); url_encoded_fmt_stream_map = URLDecoder.decode(url_encoded_fmt_stream_map, "UTF-8"); String[] lUrls = url_encoded_fmt_stream_map.split(","); for (String u : lUrls) { Map<String, String> lUrlsPars = getQueryMap(u); String lType = lUrlsPars.get("type"); String lQuality = lUrlsPars.get("quality"); lType = URLDecoder.decode(lType, "UTF-8"); lQuality = URLDecoder.decode(lQuality, "UTF-8"); int index = lType.indexOf(";"); if (index >= 0) { lType = lType.substring(0, index); } Video lVid = new Video(); lVid.type = getQuality(lQuality) + "|" + getExtension(lType); //String fileName = lTitle + "." + getExtension(lType); String lUrl = lUrlsPars.get("url") + "&signature=" + lUrlsPars.get("sig"); lUrl = URLDecoder.decode(lUrl, "UTF-8"); lVid.url = lUrl; } } catch (Exception ex) { Logger.getLogger(YoutubeScript.class.getName()).log(Level.SEVERE, null, ex); } finally { } return vids; } }