Код для загрузки видео с Youtube на Java, Android

Я создал код для загрузки видео с Youtube, но этот код не работает с Wi-Fi-соединением и работает с мобильным подключением. Где у меня была ошибка?

import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.util.Enumeration; import java.util.Vector; import android.app.Activity; import android.app.ProgressDialog; import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; import android.util.Log; import android.widget.MediaController; import android.widget.VideoView; public class MyActivity extends Activity { private class ReceivingDataFromYoutube extends AsyncTask { private ProgressDialog dialog = new ProgressDialog(MyActivity.this); private String result; protected void onPreExecute() { dialog.setMessage("Downloading..."); dialog.show(); } @Override protected Void doInBackground(String... arg0) { int begin, end; String tmpstr = null; try { URL url=new URL("http://www.youtube.com/watch?v=y12-1miZHLs&nomobile=1"); HttpURLConnection con = (HttpURLConnection) url.openConnection(); con.setRequestMethod("GET"); InputStream stream=con.getInputStream(); InputStreamReader reader=new InputStreamReader(stream); StringBuffer buffer=new StringBuffer(); char[] buf=new char[262144]; int chars_read; while ((chars_read = reader.read(buf, 0, 262144)) != -1) { buffer.append(buf, 0, chars_read); } tmpstr=buffer.toString(); begin = tmpstr.indexOf("url_encoded_fmt_stream_map="); end = tmpstr.indexOf("&", begin + 27); if (end == -1) { end = tmpstr.indexOf("\"", begin + 27); } tmpstr = UtilClass.URLDecode(tmpstr.substring(begin + 27, end)); } catch (MalformedURLException e) { throw new RuntimeException(); } catch (IOException e) { throw new RuntimeException(); } Vector url_encoded_fmt_stream_map = new Vector(); begin = 0; end = tmpstr.indexOf(","); while (end != -1) { url_encoded_fmt_stream_map.addElement(tmpstr.substring(begin, end)); begin = end + 1; end = tmpstr.indexOf(",", begin); } url_encoded_fmt_stream_map.addElement(tmpstr.substring(begin, tmpstr.length())); String result = ""; Enumeration url_encoded_fmt_stream_map_enum = url_encoded_fmt_stream_map.elements(); while (url_encoded_fmt_stream_map_enum.hasMoreElements()) { tmpstr = (String)url_encoded_fmt_stream_map_enum.nextElement(); begin = tmpstr.indexOf("itag="); if (begin != -1) { end = tmpstr.indexOf("&", begin + 5); if (end == -1) { end = tmpstr.length(); } int fmt = Integer.parseInt(tmpstr.substring(begin + 5, end)); if (fmt == 35) { begin = tmpstr.indexOf("url="); if (begin != -1) { end = tmpstr.indexOf("&", begin + 4); if (end == -1) { end = tmpstr.length(); } result = UtilClass.URLDecode(tmpstr.substring(begin + 4, end)); this.result=result; break; } } } } try { URL u = new URL(result); HttpURLConnection c = (HttpURLConnection) u.openConnection(); c.setRequestMethod("GET"); /* c.setRequestProperty("Youtubedl-no-compression", "True"); c.setRequestProperty("User-Agent", "YouTube");*/ c.setDoOutput(true); c.connect(); FileOutputStream f=new FileOutputStream(new File("/sdcard/3.flv")); InputStream in=c.getInputStream(); byte[] buffer=new byte[1024]; int sz = 0; while ( (sz = in.read(buffer)) > 0 ) { f.write(buffer,0, sz); } f.close(); } catch (MalformedURLException e) { new RuntimeException(); } catch (IOException e) { new RuntimeException(); } return null; } protected void onPostExecute(Void unused) { dialog.dismiss(); } } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); new ReceivingDataFromYoutube().execute(); } } 

3 шага:

  1. Проверьте URL-адрес (HTML) YouTube, вы получите ссылку (http% 253A% 252F% 252Fo-o.preferred.telemar-cnf1.v18.lscache6.c.youtube.com% 252Fvideoplayback …) ;

  2. Расшифруйте URL-адрес (удалите коды% 2B,% 25 и т. Д.), Создайте декодер с кодами: http://www.w3schools.com/tags/ref_urlencode.asp и используйте функцию Uri.decode (url) для замены недействительных экранированные октеты;

  3. Используйте код для загрузки streamа:

     URL u = null; InputStream is = null; try { u = new URL(url); is = u.openStream(); HttpURLConnection huc = (HttpURLConnection)u.openConnection(); //to know the size of video int size = huc.getContentLength(); if(huc != null) { String fileName = "FILE.mp4"; String storagePath = Environment.getExternalStorageDirectory().toString(); File f = new File(storagePath,fileName); FileOutputStream fos = new FileOutputStream(f); byte[] buffer = new byte[1024]; int len1 = 0; if(is != null) { while ((len1 = is.read(buffer)) > 0) { fos.write(buffer,0, len1); } } if(fos != null) { fos.close(); } } } catch (MalformedURLException mue) { mue.printStackTrace(); } catch (IOException ioe) { ioe.printStackTrace(); } finally { try { if(is != null) { is.close(); } } catch (IOException ioe) { // just going to ignore this one } } 

Вот и все, большинство вещей, которые вы найдете в Интернете!

СПОСОБ 1 (рекомендуется)

Библиотека YouTubeExtractor

Добавьте в свой файл gradleиента

  allprojects { repositories { maven { url "https://jitpack.io" } } } 

И зависимости

  compile 'com.github.Commit451.YouTubeExtractor:youtubeextractor:2.1.0' 

Добавьте этот небольшой код, и вы сделали. Демо ЗДЕСЬ

 public class MainActivity extends AppCompatActivity { private static final String YOUTUBE_ID = "ea4-5mrpGfE"; private final YouTubeExtractor mExtractor = YouTubeExtractor.create(); private Callback mExtractionCallback = new Callback() { @Override public void onResponse(Call call, Response response) { bindVideoResult(response.body()); } @Override public void onFailure(Call call, Throwable t) { onError(t); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // For android youtube extractor library com.github.Commit451.YouTubeExtractor:youtubeextractor:2.1.0' mExtractor.extract(YOUTUBE_ID).enqueue(mExtractionCallback); } private void onError(Throwable t) { t.printStackTrace(); Toast.makeText(MainActivity.this, "It failed to extract. So sad", Toast.LENGTH_SHORT).show(); } private void bindVideoResult(YouTubeExtractionResult result) { // Here you can get download url link Log.d("OnSuccess", "Got a result with the best url: " + result.getBestAvailableQualityVideoUri()); Toast.makeText(this, "result : " + result.getSd360VideoUri(), Toast.LENGTH_SHORT).show(); } } 

Вы можете получить ссылку на скачивание в bindVideoResult () .

СПОСОБ 2

Использование этой библиотеки android-youtubeExtractor

Добавить в файл gradleиента

 repositories { maven { url "https://jitpack.io" } } compile 'com.github.HaarigerHarald:android-youtubeExtractor:master-SNAPSHOT' 

Вот код для загрузки URL-адреса.

  String youtubeLink = "http://youtube.com/watch?v=xxxx"; YouTubeUriExtractor ytEx = new YouTubeUriExtractor(this) { @Override public void onUrisAvailable(String videoId, String videoTitle, SparseArray ytFiles) { if (ytFiles != null) { int itag = 22; // Here you can get download url String downloadUrl = ytFiles.get(itag).getUrl(); } } }; ytEx.execute(youtubeLink); 
  • SimpleXML выбрасывает XmlPullParserException, unterminited entity ref без причины
  • android.content.res.Resources $ NotFoundException
  • Как получить текущий момент в формате ISO 8601 с датой, часом и минутой?
  • Java: вызов метода внешнего classа в анонимном внутреннем classе
  • == и .equals () не работает в java
  • Как анализировать дату с GMT TimeZone на IST TimeZone и наоборот в android
  • Как получить имя первого дня месяца?
  • Ресурс Android - массив массивов
  • javax.mail.AuthenticationFailedException выбрасывается при отправке электронной почты в java
  • Статические ссылки очищаются - действительно ли Android разгружает classы во время выполнения, если они не используются?
  • java.lang.NoClassDefFoundError: org.slf4j.LoggerFactory
  • Давайте будем гением компьютера.