I'm working on a music APP that displays lyrics and info about songs and also plays songs from a youtube URL.
In my activity, there are some TextViews (for the lyrics/info) and one VideoView (for the youtube link).
I've created a class called YoutubeVideo, that does the following:
VideoView.setVideoURI(Uri.parse(rtsp))
and the video is being played.If you wonder, I use this class like that: new YoutubeVideo(VideoView).setVideo(artist + " " + title);
It works, but I got one problem: It's a 3gp file... Which has really bad quality. How can I get better quality urls? (mp4/flv/ect?)
I managed to write a function that gets a youtube video html code (the html source code) and returns an array with all of the available video links. Then I select a hight quality link, and display it instead of the poor 3gp.
It's not perfect, and there may be some bugs and improvments to make:
protected String[] extractLinks(String result) {
//The title of the downloaded file
String title = "bla bla bla";
// An array of strings that will hold the links (in case of error, it will hold 1 string)
String[] temper = new String[1];
try{
// Extract the "url_encoded_fmt_stream_map" attr from the flash object
Pattern p = Pattern.compile("url_encoded_fmt_stream_map(.*?);");
Matcher m = p.matcher(result);
List<String> matches = new ArrayList<String>();
while(m.find()){
matches.add(m.group().replace("url_encoded_fmt_stream_map=", "").replace(";", ""));
}
String[] streamMap = null;
List<String> links = new ArrayList<String>();
if(matches.get(0) != null && matches.get(0) != ""){
// Split the "url_encoded_fmt_stream_map" into an array of strings that hold the link values
streamMap = matches.get(0).split("%2C");
for (int i = 0; i < streamMap.length; i++){
String url = "";
String sig = "";
//Using regex, we will get the video url.
Pattern p2 = Pattern.compile("url%3D(.*?)%26");
Matcher m2 = p2.matcher(streamMap[i]);
List<String> matches2 = new ArrayList<String>();
while(m2.find()){
// We don't need the "url=...&" part.
matches2.add(m2.group().substring(6, m2.group().length() - 3));
}
url = matches2.get(0);
//Using regex again, we will get the video signature.
p2 = Pattern.compile("sig%3D(.*?)%26");
m2 = p2.matcher(streamMap[i]);
matches2 = new ArrayList<String>();
while(m2.find()){
// We don't need the "sig=...&" part.
matches2.add(m2.group().substring(6, m2.group().length() - 3));
}
sig = matches2.get(0);
//Now lets add a link to our list. Link = url + sig + title.
links.add(URLDecoder.decode(URLDecoder.decode(url + "&signature=", "UTF-8") + sig + "%26title%3D" + URLDecoder.decode(title, "UTF-8"), "UTF-8"));
}
}
else{
links.add("No download Links");
}
//Now lets make temper point to a array that holds the list items (aka links).
temper = links.toArray(new String[links.size()]);
}
catch(Exception ex){
temper[0] = ex.getMessage();
}
// That's it! temper has direct download links from youtube!
return temper;
}
I strongly recommend you to use Official YouTube Api.
Please download the example zip file at link and see FullscreenDemoActivity.java
file. That implemented most of you wanted. just click and show embedded YouTube video in high quality, full screen toggle, and automatically-show-fullscreen-when-rotation.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With