package com.youtube;import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.BufferedReader;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStreamReader;import java.net.URL;import java.net.URLConnection;import java.util.regex.Matcher;import java.util.regex.Pattern;public class DownloadVideo { // Constants private static final String WATCH_URL = "http://www.youtube.com/watch?v="; private static String downloadUrl = "http://www.youtube.com/get_video?video_id="; // Instance members private String video_id = null; private String t = null; public DownloadVideo(String video_id) { this.video_id = video_id; } public void downloadPage() throws IOException { URL u = new URL(WATCH_URL + video_id); URLConnection conn = u.openConnection(); conn.setDoInput(true); conn.setDoOutput(false); conn.connect(); // What we will need for the loop Pattern p = Pattern.compile("\"t\":\\s\"[a-zA-Z\\-_0-9]+\""); Matcher m = null; // Get input reader and read the T string BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream())); String tmp = null; // Don't process the first couple of lines, to make it faster int idx = 0; while (idx < 40) { idx++; in.readLine(); // Don't do anything with the read line } // Real loop that will parse the T variable from the JSON txt while ((tmp = in.readLine().trim()) != null) { if (tmp.contains("\"t\":")) { m = p.matcher(tmp); while (m.find()) { String[] arr = m.group().split("\\s"); // This will parse the T value from the found string this.t = arr[1].split("\"")[1]; break; } break; } } in.close(); } // This is what the download link is going to look like // http://www.youtube.com/get_video?video_id=$VIDEO_ID &t=$T public void downloadVideo(String targetDir) throws IOException { File f = new File(targetDir + video_id); URL u = new URL("http://www.youtube.com/get_video?video_id=" + video_id + "&t=" + t); URLConnection conn = u.openConnection(); conn.setDoInput(true); conn.setDoOutput(false); BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(f)); BufferedInputStream bis = new BufferedInputStream(conn.getInputStream()); int buff = 0; // Read the video into the file while ((buff = bis.read()) != -1) { bos.write(buff); } bos.close(); bis.close(); System.out.println("Done"); }}