私はビデオコンテンツのローカルオフライン表示を可能にするアンドロイドアプリを開発中です。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リダイレクトからファイルを取得するにはどうすればよいですか。
です。それは私が信じているリダイレクトHTTPです。それは私がコードのログプリントアウトから直接得ているものです。私はプロのメンバーです。はい、それは自分のチャンネルです。私がやっていることは、vimeoのクライアントにチャンネルを設定してから、vimeoの方法を使ってそのチャンネルの動画をプルしてから、ファイルアレイにアクセスしてください(あなたがプロが必要と言う通り) – NappyXIII
そして、HLS m3u8)ファイルを配列に入れる必要がありますが、私はそれを個別にテストする必要があります。新しいビデオの追加については、ビデオを引っ張る行(Video video = videoList.data.get(pos);)は、選択したグリッドビュー項目のインデックスに基づいて選択するため、問題はありません。このエラーは、グリッドビューにvimeoチャンネルのビデオより多くのインデックスがある場合にのみ発生します。チャンネルに存在しないリスティングでアダプタを更新しない限り、エラーは発生しません。私はおそらく同様にエラー処理のためにコード化することができます。 – NappyXIII
これらのファイルはダウンロードすることはできません。あなたがダウンロードできるファイルを探しているなら、ファイルに似ていますが、ビデオの設定で指定されているように、ダウンロードが許可されているVideoFilesのArrayListであるVideo.downloadを使用します。それらをすべてダウンロード可能としてマークしてください)。 –