Created
September 28, 2014 00:03
-
-
Save TheB1ackSheep/d4041cf65a863c6bec80 to your computer and use it in GitHub Desktop.
Youtube Fecther
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 + '}'; | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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"); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | |
} | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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