簡単に言えば今、YouTubeの動画をダウンロードするプログラムを作っているのですが、
・ファイルをどこまでダウンロードしたかプログレスバーに表す
・ファイルのダウンロードを中断させる
この2点がよくわかりません。
前者はファイルサイズをProgressBar1.Max、ダウンロードしたファイルサイズをProgressBar1.Positionにすればいいのはわかるのですが、どのように取得し、どうプログレスバーに追加していけばいいのでしょうか?
後者はほとんどわからないです;;
スレッドを使うとできる、というのは聞いたのですが、どのように使う(スレッドを作り、利用する?)のか、どのように中断させるかわかりません。
WindowsXP SP3 Deplhi6 Personal Indy10
どなたかご教授お願いします。
真琴:「ハルコさん、IdHttpでDownloadする時にProgress表示するには OnWorkイベント使えばイイんじゃない? でも途中で止めるには?」
春子:「中断したければ Disconnectすればいいの、経過の表示はこうネ」
procedure TForm1.IdHTTP1WorkBegin(Sender: TObject; AWorkMode: TWorkMode; AWorkCountMax: Int64);
begin
ProgressBar1.Position := 0;
ProgressBar1.Max := AWorkcountMax;
end;
procedure TForm1.IdHTTP1Work(Sender: TObject; AWorkMode: TWorkMode; AWorkCount: Int64);
begin
if ProgressBar1.Max > 0 then ProgressBar1.Position := AWorkCount;
end;
procedure TForm1.IdHTTP1WorkEnd(Sender: TObject; AWorkMode: TWorkMode);
begin
ProgressBar1.Position := 0;
end;
真琴:「スレッドにしなくても大丈夫?」
春子:「IdAntiFreeze入れておけば、スレッドにしなくてもOK」
真琴:「あれ? これって AWorkCount引数がIntegerじゃないけど?」
春子:「アタシのIndy10.2.0.3ではInt64よ、最近は2GBを超えるファイルもあるから」
真琴:「でも、10.2.0.3って dpkファイルないし、どうやってインストールしたの?」
春子:「10.0.5.2には dpkファイルあるでしょ? それをチョット変えれば出来るのよ」
真琴:「あ、そうなんだ、アタシも10.2.0.3に変えたいなぁ…」
春子:「インストールしなくても、ライブラリパス通して動的生成とかでもイケルよ」
真琴:「やっぱり10.2.0.3をインストールしたい、ねぇハルコさん、どう変えるの?」
春子:「小学生じゃまだ無理よ、マコト、中学生くらいになれば…」
真琴:「え? ナニ言ってるの? ハルコさん、アタシ、いま高校生よ?」
春子:「マコト、ジョウダンは顔だけにしてよネ^^;」
真琴:「そんなぁ〜…ハルコさん、おかしいよ、ドウしちゃたの?」
勝爺:「マコト…、マコト、いつまで寝てんだ、おい、マコト」
真琴:「…ん?な〜んだ夢だったのかぁ…、変な夢…、あ、おじいちゃん、おはよう」
勝爺:「おはようじゃねぇだろぅ、さっさと起きて…、ヒルメシだ、下で待ってるぞ」
真琴:「もうそんな時間? ウン分かった、…あれ? このベッド、なんか大きくなったみたい、それに…部屋もおじいちゃんも大きい」
勝爺:「なに寝ぼけたコト言ってんだ、メシの用意は出来てンだから、顔洗ってこい」
真琴:「は〜い、…ん?洗面台も大きい、…えっ!?アタシが小さくなったの? ナンで? あーっ!鏡の中のアタシの顔、まるで小学生!?」
春子:「こんちわ〜、キャベツとネギが特売だったよ」
勝爺:「おぅ、ハルコ、今日は夕方からバーベキューやるぞ、マコトの1周年記念だ」
春子:「1周年記念? あぁ、そっか、マコトがココに来てからもう一年かぁ…」
勝爺:「そうだよ、速いもんだな時の経つのは、母親の恵子がマコトを置き去りにして東京に帰ったのが一年前の今日」
春子:「あの頃はよく泣いてたけど、今はもう元気一杯よね、で、マコトは?」
勝爺:「寝坊をして、今起こしたトコだよ、最近は母親なんか忘れちまったみてぇだ」
春子:「忘れないよゼッタイ、子供は母親を忘れない、…ハルキだって、きっとそう」
勝爺:「そうか、悪かった、ハルコは別れた子供からの手紙をズット待ってるンだったな」
春子:「ねぇ、アタシもバーべキューに参加していい?」
勝爺:「おぉ、もちろん、マコトも賑やかな方がうれしいだろぅ」
春子:「マコトは2階から降りてこないけど、アタシ、ちょっと見てくるね」
>冗談は顔だけ?さん
ありがとうございます。
おかげさまでダウンロードにあわせてプログレスバーが動作するようになりました。
しかしここで問題が2つ発生しました。
1つ目は、あまりスレと関係ないかもしれませんが、UrlDownloadToFileだとファイルがダウンロードできるのに、IdHTTP.Getだと403エラーが返ってきます。(プログレスバーの動作は他のはっきりしている動画ファイルで調べました)
これは何か記述に問題があるのでしょうか?
2つ目は中断機能が動作しないことです。
ダウンロードしてる途中にButton2を押せません(クリックしてもボタンがへこまず、何も変化しない)
procedure TForm1.Button2Click(Sender: TObject);
begin
IdHTTP1.Disconnect;
end;
IdAntiFreezeを入れたおかげか、固まってはいないようなのですが・・・
Mr.XRAYです.
もしかしたら,既にGoogle等の検索で見ているかも知れませんが,
こんなところが参考にならないでしょうか.
すでにご覧になっていて,分かりにくい等の理由で避けていたらゴメンなさい.
http://mrxray.on.coocan.jp/Delphi/plSamples/772_Indy_HTTPGet.htm
http://mrxray.on.coocan.jp/Delphi/plSamples/773_Indy_FTPGetPut.htm
春子:「おや? マコト、またベッドに入っちゃて、どこか具合悪いの?」
真琴:「あ、ハルコさん、アタシの顔見て、何歳に見える?」
春子:「え? 4月に中学生になったばかりじゃない? でも、その顔はどうみてもまだ小学生かな^^」
真琴:「やっぱり…」
春子:「あれ? ほっぺた赤くて、ハレテルみたいだけど?」
真琴:「そう? さっきから何回もツネッたから、もう痛くて…」
春子:「どうした? マコト、まだ目が覚めないで夢の中のような気分なの?」
真琴:「ねぇ、ハルコさん、チョットほっぺた貸してくれる?」
春子:「ん? やな予感…、ぃや〜よ、もう自分のほっぺたで確めたでしょ?」
真琴:「ダメ? でもコレってホントにホントなの?」
春子:「一体ナンのコト?」
真琴:「信じてくれる? アタシ、起きたら4年前に戻ってたの…、だから、もう一度寝て起きたら元の所に帰れるかもしれないと思って…」
春子:「えぇっ? そんな寝ぼけたコト言ってないで、ホラ起きて、起きて」
勝爺:「遅いぞ、ナニしてたんだマコト、今日はバーベキューやるからな」
真琴:「え? あ、そうなの…」
勝爺:「なんだ?気のない返事して、前から楽しみにしてたンじゃねぇのか?」
春子:「今日のマコトはチョット変なの、だから怒らないでね、マサルさん」
勝爺:「そうか、…ところでハルコ、YouTubeがIndyをアクセス禁止してるらしいな?」
春子:「へぇ〜、マサルさん、そんなコト知ってるなんてどうしたの?」
勝爺:「いやぁ、ちょっと小耳にハサンダだけよ」
春子:「そうなの、Indyを悪者扱いするなんて、とんだ濡れ衣よね」
勝爺:「ん? 濡れ衣なのか?」
春子:「YouTubeのアクセス禁止は Indyに限らないけど、とにかく偽装が必要」
勝爺:「偽装? ヤバイことはするなよ? ハルコ」
春子:「どこかの悪いヤツがIndy使って迷惑ソフト作るから、そのトバッチリ」
勝爺:「よく分かンねぇけど、何を偽装するってンだ?」
春子:「User-Agentよ、アタシの名前使うんだから偽装とは言わないかな^^;」
procedure TForm1.Button1Click(Sender: TObject);
const
YOUTUBE_1 = 'http://www.youtube.com/get_video_info?video_id=%s';
YOUTUBE_2 = 'http://www.youtube.com/get_video?video_id=%s&t=%s';
function GetToken(ps: PChar): string;
var
pT, pH: PChar;
begin
result := '';
pT := StrPos(ps, '&token=');
if pT <> nil then begin
pH := pT+7;
pT := pH+1;
while pT^ <> '&' do inc(pT);
pT^ := #0;
result := pH;
end;
end;
var
ms: TMemoryStream;
VideoID, URL: string;
C: TClass;
begin
VideoID := '-N38Q4mx0Rk'; // YouTube動画のID「BeachBoys広末涼子 始球式」
C := ExceptionClass;
ExceptionClass := EAbort;
ms := TMemoryStream.Create;
try
URL := Format(YOUTUBE_1, [VideoID]);
IdHttp1.Request.UserAgent := 'Gozilla/4.0 (compatible; Maeda Haruko 22)'; // 偽装?
IdHttp1.Get(URL, ms);
URL := Format(YOUTUBE_2, [VideoID, GetToken(ms.Memory)]);
ms.Position := 0;
IdHttp1.HandleRedirects := True;
IdHttp1.Get(URL, ms);
with TFileStream.Create('広末涼子 始球式.flv', fmCreate) do try
ms.Position := 0;
CopyFrom(ms, ms.Size);
finally
Free;
end;
finally
ms.Free;
ExceptionClass := C;
end;
end;
春子:「 あと、IdAntiFreezeが働いてればボタンも押せるハズ…、Mr.XRAYさんのページも参考になるネ」
>Mr.XRAYさん
中断機能がつけられない時に検索を掛けてみたところ、このサイトを見つけ参考にしようと思ったのですが、スレッドを利用する、ということが全くわからず、ここで質問したのです´・ω・
>濡れ衣と偽装?さん
記述の中にある
// 偽装?
の列を追加したら403は返ってこなくなりました。
しかし、今度は「303 see other」が返ってくるようになりました。
Mr.XRAYさんのサイトを見てみると「リクエストに対するレスポンスは別のURLから発見できる」とありますが、これはflvのアドレスの割り出し方に問題があるのでしょうか?
実際自分はそう考え、見る見る動画(http://mm-video.net/)で、自分で作ったプログラムで読み込んだget_video_infoを使ってダウンロードしたところ、正常にダウンロードできました。
なぜでしょう?
中断機能については、ちょっと大き目の動画ファイル(wmv)で試したところ、Button2をクリックしてから5秒くらいしてForm1がフリーズし(プログレスバーが止まり、Labelの部分が真っ白になり、ウィンドウを移動しようとしても移動しない)ダウンロードが終わるとフリーズ状態が直ります。
AntiFreezeを有効にするにはForm1にIdAntiFreezeを入れるだけじゃ駄目なんでしょうか?
panacheさんの書いたコードが分からないと、回答は無理と思うけど。
この上のサンプルコードは実行してみたの?
303エラーはRedirectを有効にしなきゃダメだよ。
>IdHttp1.HandleRedirects := True;
Mr.XRAYです.
>なぜでしょう?
難しいですね.panacheさんがネットの向こう側でどんなコードを書いて実行しているか
見通せる方もいるようですが,多くの場合,
どんなコードか分からないとかなり難しいようです.
「広末涼子のファンじゃないから興味ない」と言わずに,
「真琴」と「春子」の会話もお読みになるといいでしょう.
折角傑作(?)を書いて下さっているようですので.
誤解のないように言っておきますが,「おくりびと」は観ましたが,
私は決して広末涼子さんのファンではありません.
>う〜んさん
>panacheさんの書いたコードが分からないと、回答は無理と思うけど。
そうですよね;;すいませんでした。
IdHttp1.HandleRedirects := True;を入れたらエラーがでなくなりました。
ありがとうございます。
サンプルコードは実行してませんでしたorz
>Mr.XRAYさん
>どんなコードか分からないとかなり難しいようです.
そうですよね;;ホント馬鹿ですいません;;
う〜んさんのおかげでダウンロード時にエラーはでなくなりました。
中断ボタンを押したりした時にフリーズしたのはIdAntiFreeze1.ProcessをOnWorkイベントに入れてないのが原因でした。
無事解決しました。
回答してくれた皆様、ありがとうございました。
ツイート | ![]() |