2016-07-20 18 views
0

私はビデオコンテンツのローカルオフライン表示を可能にするアンドロイドアプリを開発中です。HttpURLConnectionを使用してトークンを使用してVimeoビデオファイルを取得する

私はAPIを使ってVimeoからビデオをダウンロードしようとしています。私は、URL自体と関係があり、認証であると考えられる問題にぶつかってきました。

URLはHTTP 302リダイレクトだと言われています。

私はhttps://archive.org/download/Popeye_forPresident/Popeye_forPresident_512kb.mp4のpopeyeビデオでプログラムをテストしており、正常に動作しています。しかし、私がVimeoのリンクを挿入すると、それは接続することさえできません。

実際の接続を実行する方法です。

public String DownloadFile(String fileURL, String fileName) { 
    InputStream in = null; 
    BufferedInputStream inStream = null; 
    FileOutputStream out = null; 
    HttpURLConnection connection = null; 

    try { 
     File FileDir = mContext.getExternalFilesDir(Environment.DIRECTORY_MOVIES); 

     URL url = new URL(fileURL); 

     connection = (HttpURLConnection) url.openConnection(); 
     connection.setRequestMethod("GET"); 
     connection.setDoOutput(true); 
     connection.connect(); 

     //Code stops here with vimeo video but not with popeye video. 

     ... 

     out = new FileOutputStream(new File(FileDir, fileName + ".mp4")); 
     in = connection.getInputStream(); 
     inStream = new BufferedInputStream(in, 1024 * 5); 
     byte[] buffer = new byte[1024 * 5]; 

     int len; 
     while ((len = inStream.read(buffer)) > 0) { 
      out.write(buffer, 0, len); 
     } 

    } 
    ... //catch and finally { flush, close and disconnection} 

    return null; 
} 

これは、URLを設定して実行する非同期タスクです。

class DownloadFileFromURL extends AsyncTask<String, String, String> { 

    ... 

    @Override 
    protected String doInBackground(final String... args) { 

//If it is a normal direct link such as site.com/video.mp4 (the popeye video) 
//Set link to site.com/video.mp4 and save as "args[1]" on disk. 

     if(FilenameUtils.isExtension(args[0], "mp4")){ 
      DownloadFile(args[0], args[1]);    
     } 

//Else if a vimeo link (which it is) 
     else if (args[0].contains("vimeo")){    
      final int pos = Integer.parseInt(args[2]); 

//Use Vimeo API to get the videos from Vimeo.      
       VimeoClient.getInstance().fetchNetworkContent(CHANNELS_VIDEO_URI, new ModelCallback<VideoList>(VideoList.class) { 

       @Override 
       public void success(VideoList videoList) { 

        if (videoList != null && videoList.data != null && !videoList.data.isEmpty()) { 
         Video video = videoList.data.get(pos); 

         ArrayList<VideoFile> videoFiles = video.files; 
         if(videoFiles != null && !videoFiles.isEmpty()) { 
          VideoFile videoFile = videoFiles.get(0); 

//Set link to the link that you retrieve. 
//Example: http://player.vimeo.com/external/175231540.hd.mp4?s=78206f99af10e32354851f6ca62252782b1393fb&profile_id=174&oauth2_token_id=903072961 

          String link = videoFile.link; 
          DownloadFile(link, args[1]); 
         } 
        } 
       } 

       @Override 
       public void failure(VimeoError error) { 
        Toast.makeText(mContext, "Failure in VideoList Reading", Toast.LENGTH_LONG).show(); 
       } 
      }); 
     } 
     return null; 
    } 

    ... 

} 

ただし、リンクhttp://player.vimeo.com/external/175231540.hd.mp4?s=78206f99af10e32354851f6ca62252782b1393fb&profile_id=174&oauth2_token_id=903072961は接続されていません。私はhd.mp4の後にすべてを削除しようとしましたが、ブラウザでそのリンクに行くと、あなたは認証を拒否されたエラーが発生するので、これはうまくいかないと思います。

このリンクに接続し、トークンを使用してHTTP 302リダイレクトからファイルを取得するにはどうすればよいですか。

答えて

0

いくつかのこと...

私はあなたがdoInBackgroundに渡さ位置は、動画のリストを取得するためのネットワーク呼び出し後に同じ位置になると仮定しなければならないとは思いません。新しい動画がそのリストに追加された場合はどうなりますか?

CHANNELS_VIDEO_URIとは何ですか? Vimeo PROメンバーだけがファイルアレイにアクセスでき、自分のビデオにのみアクセスできます。これは、使用しているVimeoネットワーキングライブラリのReadMeに記載されています。これはあなたが所有するビデオのチャンネルですか?

コメントのURLが正しくないように見えます。これはプレーヤーを表し、ビデオファイルではありません。ファイルの配列にはmp4ファイル以外のリンクも含まれている可能性があるので、その点にも注意する必要があります。

各ビデオオブジェクトにはdownloadアレイがあります。これはfilesと似ていますが、実際のビデオリソースへのリンクである必要があります(HLSを取得しない場合があります)。これらは、ビデオの設定でビデオをダウンロードできる場合にのみ使用できます。

+0

です。それは私が信じているリダイレクトHTTPです。それは私がコードのログプリントアウトから直接得ているものです。私はプロのメンバーです。はい、それは自分のチャンネルです。私がやっていることは、vimeoのクライアントにチャンネルを設定してから、vimeoの方法を使ってそのチャンネルの動画をプルしてから、ファイルアレイにアクセスしてください(あなたがプロが必要と言う通り) – NappyXIII

+0

そして、HLS m3u8)ファイルを配列に入れる必要がありますが、私はそれを個別にテストする必要があります。新しいビデオの追加については、ビデオを引っ張る行(Video video = videoList.data.get(pos);)は、選択したグリッドビュー項目のインデックスに基づいて選択するため、問題はありません。このエラーは、グリッドビューにvimeoチャンネルのビデオより多くのインデックスがある場合にのみ発生します。チャンネルに存在しないリスティングでアダプタを更新しない限り、エラーは発生しません。私はおそらく同様にエラー処理のためにコード化することができます。 – NappyXIII

+0

これらのファイルはダウンロードすることはできません。あなたがダウンロードできるファイルを探しているなら、ファイルに似ていますが、ビデオの設定で指定されているように、ダウンロードが許可されているVideoFilesのArrayListであるVideo.downloadを使用します。それらをすべてダウンロード可能としてマークしてください)。 –

関連する問題