Java — Mã Để Tải Xuống Video Từ Youtube Trên Java, Android
--- Bài mới hơn ---
initTypeMap (); gọi trước
class Meta {
public String num;
public String type;
public String ext;
Meta(String num, String ext, String type) {
chúng tôi = num;
chúng tôi = ext;
chúng tôi = type;
}
}
class Video {
public String ext = "";
public String type = "";
public String url = "";
Video(String ext, String type, String url) {
chúng tôi = ext;
chúng tôi = type;
chúng tôi = url;
}
}
throws IOException {
if (ytUrl == null) {
return null;
}
// e.g.
// http://www.youtube.com/watch?v=0RUPACpf8Vs&feature=youtube_gdata_player
int andIdx = ytUrl.indexOf('&');
ytUrl = ytUrl.substring(0, andIdx);
}
// Get the HTML response
/* String userAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:8.0.1)";*/
/* HttpClient client = new DefaultHttpClient();
client.getParams().setParameter(CoreProtocolPNames.USER_AGENT,
userAgent);
HttpGet request = new HttpGet(ytUrl);
HttpResponse response = client.execute(request);*/
String html = "";
HttpsURLConnection c = (HttpsURLConnection) new URL(ytUrl).openConnection();
c.setRequestMethod("GET");
c.setDoOutput(true);
c.connect();
InputStream in = c.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
StringBuilder str = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
str.append(line.replace("\u0026", "&"));
}
in.close();
html = str.toString();
// Parse the HTML response and extract the streaming URIs
if (html.contains("verify-age-thumb")) {
Log.e("Downloader", "YouTube is asking for age verification. We can't handle that sorry.");
return null;
}
if (html.contains("das_captcha")) {
Log.e("Downloader", "Captcha found, please try with different IP address.");
return null;
}
Pattern p = Pattern.compile("stream_map":"(.*?)?"");
// Pattern p = Pattern.compile("/stream_map=(. = matches.get(0).split(",");
for (String ppUrl : urls) {
String url = URLDecoder.decode(ppUrl, "UTF-8");
Log.e("URL","URL : "+url);
Pattern p1 = Pattern.compile("itag=(");
Matcher m1 = p1.matcher(url);
String itag = null;
if (m1.find()) {
itag = m1.group(1);
}
Pattern p2 = Pattern.compile("signature=(.*?)");
Matcher m23 = p23.matcher(url);
if (m23.find()) {
sig = m23.group(1);
}
}
Pattern p3 = Pattern.compile("url=(.*?);
try {
/* Log.e("Downloader","Size of Video : "+videos.size());*/
if (videos != null && !videos.isEmpty()) {
for (Video video : videos)
{
Log.e("Downloader", "ext : " + video.ext);
ext = video.ext.toLowerCase();
fVideos.add(new Video(video.ext,video.type,video.url));
}
}
return fVideos;
}
} catch (Exception e) {
e.printStackTrace();
Log.e("Downloader", "Couldn't get YouTube streaming URL", e);
}
Log.e("Downloader", "Couldn't get stream URI for " + url);
return null;
}
@Override
super.onPostExecute(streamingUrl);
progressDialog.dismiss();
if (streamingUrl != null) {
if (!streamingUrl.isEmpty()) {
//Log.e("Steaming Url", "Value : " + streamingUrl);
for (int i = 0; i < streamingUrl.size(); i++) {
Video fX = streamingUrl.get(i);
Log.e("Founded Video", "URL : " + fX.url);
Log.e("Founded Video", "TYPE : " + fX.type);
Log.e("Founded Video", "EXT : " + fX.ext);
}
//new ProgressBack().execute(new String[1].
Tham chiếu: https://superuser.com/questions/773719/how-do-all-of-these-save-video-from-youtube-service-work/773998#773998
url_encoded_fmt_stream_map // traditional: contains video and audio stream
adaptive_fmts // DASH: contains video or audio stream
Mỗi trong số này là một mảng được phân tách bằng dấu phẩy của cái mà tôi sẽ gọi là “đối tượng luồng”. Mỗi “đối tượng luồng” sẽ chứa các giá trị như thế này
url // direct HTTP link to a video
itag // code specifying the quality
s // signature, security measure to counter downloading
Mỗi URL sẽ được mã hóa, do đó bạn sẽ cần giải mã chúng. Bây giờ là phần khó khăn.
YouTube có ít nhất 3 cấp độ bảo mật cho video của họ
unsecured // as expected, you can download these with just the unencoded URL
s // see below
RTMPE // uses "rtmpe://" protocol, no known method for these
Các video RTMPE thường được sử dụng trên các bộ phim có thời lượng đầy đủ chính thức và được bảo vệ với Loại xác minh SWF 2. Điều này đã có từ năm 2011 và vẫn chưa được thiết kế ngược.
Các loại video “s” là khó nhất thực sự có thể được tải xuống. Bạn sẽ thấy những thứ này trên các video của VEVO và những thứ tương tự. Họ bắt đầu bằng một chữ ký như
AA5D05FA7771AD4868BA4C977C3DEAAC620DE020E.0F421820F42978A1F8EAFCDAC4EF507DB5 Sau đó, chữ ký được xáo trộn với chức năng như thế này
function mo(a) {
a = a.split("");
a = lo.rw(a, 1);
a = lo.rw(a, 32);
a = lo.IC(a, 1);
a = lo.wS(a, 77);
a = lo.IC(a, 3);
a = lo.wS(a, 77);
a = lo.IC(a, 3);
a = lo.wS(a, 44);
return a.join("")
}
Chức năng này là năng động, nó thường thay đổi mỗi ngày. Để làm cho khó khăn hơn, chức năng được lưu trữ tại một URL như
http://s.ytimg.com/yts/jsbin/html5player-en_US-vflycBCEX.js
điều này giới thiệu vấn đề của chính sách Cùng nguồn gốc. Về cơ bản, bạn không thể tải xuống tệp này từ chúng tôi vì chúng là các miền khác nhau. Một cách giải quyết của vấn đề này là CORS. Với CORS, chúng tôi có thể thêm tiêu đề này
Access-Control-Allow-Origin: http://www.youtube.com
và nó sẽ cho phép JavaScript tải xuống từ chúng tôi Tất nhiên họ không làm điều này. Một cách giải quyết cho cách giải quyết này là sử dụng proxy CORS. Đây là một proxy đáp ứng với tiêu đề sau cho tất cả các yêu cầu
Access-Control-Allow-Origin: *
Vì vậy, bây giờ bạn đã ủy quyền tệp JS của mình và sử dụng hàm để xáo trộn chữ ký, bạn có thể sử dụng nó trong chuỗi truy vấn để tải xuống video.
--- Bài cũ hơn ---