Skip to content

Instantly share code, notes, and snippets.

@TheB1ackSheep
Created September 28, 2014 00:03
Show Gist options
  • Save TheB1ackSheep/d4041cf65a863c6bec80 to your computer and use it in GitHub Desktop.
Save TheB1ackSheep/d4041cf65a863c6bec80 to your computer and use it in GitHub Desktop.
Youtube Fecther
import java.util.ArrayList;
import java.util.List;
/**
*
* @author FALOOK
*/
public class Content {
private String id;
private List<Itag> itags;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public List<Itag> getItags() {
return itags;
}
public Content(String id) {
this.id = id;
}
public void addItag(Itag itag){
if(itags == null)
itags = new ArrayList<>();
itags.add(itag);
}
@Override
public String toString() {
return "Content{" + "id=" + id + ", itags=" + itags + '}';
}
}
import java.net.URLDecoder;
import java.util.HashMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import model.Content;
import model.Itag;
import utils.HTTPHelper;
/**
*
* @author FALOOK
*/
public class Fetcher {
private static HTTPHelper http = new HTTPHelper();
public static void fetchVid(String url) throws Exception {
String info = getInfo(url);
if (info != null) {
String pattern = "adaptive_fmts=(.[^&]*?)&";
Matcher streamMapMatcher = regexMatch(pattern, info);
if (streamMapMatcher.find()) {
String streamMap = URLDecoder.decode(streamMapMatcher.group(1), "UTF-8");
System.out.println(streamMap);
Content content = new Content(getId(url));
for (String str : streamMap.split(",")) {
String itag = "", conUrl = "";
for (String str2 : str.split("&")) {
if (str2.startsWith("itag")) {
itag = str2.split("=")[1];
} else if (str2.startsWith("url")) {
conUrl = URLDecoder.decode(str2.split("=")[1], "UTF-8");
}
}
content.addItag(new Itag(itag, conUrl));
}
} else {
throw new Exception("Cannot get video url");
}
}
}
public static void fetchList(String url) throws Exception {
String info = http.sendGet(url);
if (info != null) {
String pattern = "data-video-id=\"(.[^&]*?)\"";
Matcher streamMapMatcher = regexMatch(pattern, info);
if (streamMapMatcher.find()) {
do {
String streamMap = URLDecoder.decode(streamMapMatcher.group(1), "UTF-8");
fetchVid("http://www.youtube.com/watch?v=" + streamMap);
}while (streamMapMatcher.find());
} else {
throw new Exception("Cannot get video list");
}
}
}
private static String getId(String url) {
Matcher streamMap = regexMatch("v=([^\\&\\?\\/]+)", url);
while (streamMap.find()) {
return streamMap.group(1);
}
return null;
}
private static String getInfo(String url) throws Exception {
String vidId = getId(url);
if (vidId != null) {
String infoUrl = "http://www.youtube.com/get_video_info?&video_id=" + vidId + "&asv=3&el=detailpage&hl=en_US";
return http.sendGet(infoUrl);
}
return null;
}
private static Matcher regexMatch(String pattern, String text) {
Pattern p = Pattern.compile(pattern);
return p.matcher(text);
}
public static void main(String[] args) throws Exception {
Fetcher.fetchVid("http://www.youtube.com/watch?v=Y0qJdShOL_s&list=RDHCZsi4-lePfDk&index=27");
}
}
import java.io.BufferedReader;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
/**
*
* @author FALOOK
*/
public class HTTPHelper{
public String sendGet(String url) throws Exception {
URL obj = new URL(url);
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
if (responseCode == 200) {
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
return response.toString();
} else {
throw new Exception("Cannot sending request url : " + url);
}
}
}
import java.util.HashMap;
/**
*
* @author FALOOK
*/
public class Itag {
private String itag;
private String format;
private String resolutionClass; //240p 1080p
private String flag; //3D
private String url;
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getFlag() {
return flag;
}
public void setFlag(String flag) {
this.flag = flag;
}
public String getItag() {
return itag;
}
public void setItag(String itag) {
this.itag = itag;
}
public String getFormat() {
return format;
}
public void setFormat(String format) {
this.format = format;
}
public String getResolutionClass() {
return resolutionClass;
}
public void setResolutionClass(String resolutionClass) {
this.resolutionClass = resolutionClass;
}
public Itag(String itag, String url) {
switch (itag) {
case "5":
format = "FLV";
resolutionClass = "240p";
flag = "";
break;
case "17":
format = "3GP";
resolutionClass = "144p";
flag = "";
break;
case "18":
format = "MP4";
resolutionClass = "360p";
flag = "";
break;
case "22":
format = "MP4";
resolutionClass = "720p";
flag = "";
break;
case "34":
format = "FLV";
resolutionClass = "360p";
flag = "";
break;
case "35":
format = "FLV";
resolutionClass = "480p";
flag = "";
break;
case "36":
format = "3GP";
resolutionClass = "240p";
flag = "";
break;
case "37":
format = "MP4";
resolutionClass = "1080p";
flag = "";
break;
case "38":
format = "MP4";
resolutionClass = "1080p";
flag = "";
break;
case "43":
format = "WEB";
resolutionClass = "360p";
flag = "";
break;
case "44":
format = "WEB";
resolutionClass = "480p";
flag = "";
break;
case "45":
format = "WEB";
resolutionClass = "720p";
flag = "";
break;
case "46":
format = "WEB";
resolutionClass = "1080p";
flag = "";
break;
case "82":
format = "MP4";
resolutionClass = "360p";
flag = "3D";
break;
case "83":
format = "MP4";
resolutionClass = "480p";
flag = "3D";
break;
case "84":
format = "MP4";
resolutionClass = "720p";
flag = "3D";
break;
case "85":
format = "MP4";
resolutionClass = "1080p";
flag = "3D";
break;
case "100":
format = "WEB";
resolutionClass = "360p";
flag = "3D";
break;
case "101":
format = "WEB";
resolutionClass = "480p";
flag = "3D";
break;
case "102":
format = "WEB";
resolutionClass = "720p";
flag = "3D";
break;
case "133":
format = "MP4";
resolutionClass = "240p";
flag = "VO";
break;
case "134":
format = "MP4";
resolutionClass = "360p";
flag = "VO";
break;
case "135":
format = "MP4";
resolutionClass = "480p";
flag = "VO";
break;
case "136":
format = "MP4";
resolutionClass = "720p";
flag = "VO";
break;
case "137":
format = "MP4";
resolutionClass = "1080p";
flag = "VO";
break;
case "138":
format = "MP4";
resolutionClass = "2160p";
flag = "VO";
break;
case "139":
format = "MP4";
resolutionClass = "Low bitrate";
flag = "AO";
break;
case "140":
format = "MP4";
resolutionClass = "Med bitrate";
flag = "AO";
break;
case "141":
format = "MP4";
resolutionClass = "Hi bitrate";
flag = "AO";
break;
case "160":
format = "MP4";
resolutionClass = "144p";
flag = "VO";
break;
case "171":
format = "WEB";
resolutionClass = "Med bitrate";
flag = "AO";
break;
case "172":
format = "WEB";
resolutionClass = "Hi bitrate";
flag = "AO";
break;
case "242":
format = "WEB";
resolutionClass = "240p";
flag = "VOX";
break;
case "243":
format = "WEB";
resolutionClass = "360p";
flag = "VOX";
break;
case "244":
format = "WEB";
resolutionClass = "480p";
flag = "VOX";
break;
case "245":
format = "WEB";
resolutionClass = "480p";
flag = "VOX";
break;
case "246":
format = "WEB";
resolutionClass = "480p";
flag = "VOX";
break;
case "247":
format = "WEB";
resolutionClass = "720p";
flag = "VOX";
break;
case "248":
format = "WEB";
resolutionClass = "1080p";
flag = "VOX";
break;
case "264":
format = "MP4";
resolutionClass = "1080p";
flag = "VO";
break;
case "271":
format = "WEBM";
resolutionClass = "1440p";
flag = "VO";
break;
case "272":
format = "WEBM";
resolutionClass = "2160p";
flag = "VO";
break;
}
this.url = url;
this.itag = itag;
}
@Override
public String toString() {
return "Itag{" + "itag=" + itag + ", format=" + format + ", resolutionClass=" + resolutionClass + ", flag=" + flag + ", url=" + url + '}';
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment