2011-08-26 6 views
16

Utworzono kod do pobrania wideo z serwisu YouTube, ale ten kod nie działa z połączeniem Wi-Fi i działa z połączeniem mobilnym. Gdzie się pomyliłem?Kod do pobrania wideo z serwisu YouTube na platformie Java, Android

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<String, Void, Void> { 

     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(); 
    } 
} 
+0

Hii, czy możesz podzielić się tym, jak rozwiązać ten problem? Jak pobrać film z youtube? –

+0

@ Денис Нагибин hej możesz u pls powiedzieć, jak to działa, ponieważ chcę teraz jak to działa .. i po prostu skopiuj swój kod, ale daje błąd na "UtilClass". –

+0

co to UtilClass.URLDecode() jest w funkcji ur można wyjaśnić .. i dint go –

Odpowiedz

20

3 kroki:

  1. sprawdzić kod sorce (HTML) z YouTube, dostaniesz link jak ten (http% 253A% 252F% 252Fo-o.preferred.telemar- cnf1.v18.lscache6.c.youtube.com% 252Fvideoplayback ...);

  2. zdekodować URL (usunięcia kodów% 25% 2b, itp), tworzenie dekoder z kodami: http://www.w3schools.com/tags/ref_urlencode.asp i korzystania z funkcji Uri.decode (URL) zastąpić nieprawidłowe uciec oktetów;

  3. użyć kodu, aby pobrać strumień:

    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 
        } 
    } 
    

To wszystko, większość rzeczy będzie można znaleźć w internecie !!!

+0

@ Денис Нагибин proszę dać nam znać, czy to naprawdę działało. – gpuguy

+0

Naprawdę pracował dla mnie @ Денис Нагибин. Mam prywatną aplikację tylko do pobierania filmów z youtube na mój telefon. –

+0

Ta metoda już nie działa. Czy możesz go obejrzeć i zaktualizować? –

10

METODA 1(Recommended)

Biblioteka YouTubeExtractor

Dodaj do pliku Gradle

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

i zależności

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

Dodaj ten mały kod i gotowe. Demo HERE

public class MainActivity extends AppCompatActivity { 

    private static final String YOUTUBE_ID = "ea4-5mrpGfE"; 

    private final YouTubeExtractor mExtractor = YouTubeExtractor.create(); 


    private Callback<YouTubeExtractionResult> mExtractionCallback = new Callback<YouTubeExtractionResult>() { 
     @Override 
     public void onResponse(Call<YouTubeExtractionResult> call, Response<YouTubeExtractionResult> response) { 
      bindVideoResult(response.body()); 
     } 

     @Override 
     public void onFailure(Call<YouTubeExtractionResult> 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(); 
    } 
} 

Możesz otrzymać link do pobrania w bindVideoResult() metody.

METODA 2

Korzystanie z tej biblioteki android-youtubeExtractor

Dodaj do Gradle plik

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

compile 'com.github.HaarigerHarald:android-youtubeExtractor:master-SNAPSHOT' 

Oto kod dla uzyskania URL pobierania.

 String youtubeLink = "http://youtube.com/watch?v=xxxx"; 

    YouTubeUriExtractor ytEx = new YouTubeUriExtractor(this) { 
     @Override 
     public void onUrisAvailable(String videoId, String videoTitle, SparseArray<YtFile> ytFiles) { 
      if (ytFiles != null) { 
       int itag = 22; 
// Here you can get download url 
       String downloadUrl = ytFiles.get(itag).getUrl(); 
      } 
     } 
    }; 

    ytEx.execute(youtubeLink); 
+0

@ tried 1 method? otrzymałem wynik .. ale jak pobrać wideo? – altu

+0

Jeśli masz link do pobrania, możesz pobrać plik wideo w taki sam sposób, jak obraz PDF do pobrania itp. Nawet możesz użyć menedżera pobierania, ponieważ jest to dość proste. –

+0

To jest super i działa w 100%. Teraz mogę pobrać dowolny film z youtube. Dziękuję bro, jesteś naprawdę świetny –