サンプルとしては、いかがなものかとも思いましたが(笑)。
YouTubeなどの動画投稿サイトでは、原則として動画はブラウザで視聴します。しかし、投稿されている動画ファイルを自分のパソコンに保存しておけば、いつでも好きなときに見ることができます。そう考える人は、おそらく少なくないでしょう。実は私もそうです。で、自作した保存用のプログラムなどを活用しているのですが、よく考えれば、そうした処理でFileSystemObjectを多用しています。なので、FileSystemObjectのサンプルとして公開します。
多くの動画投稿サイトでは、動画ファイルは拡張子flvのFalsh Video形式です。動画ファイルを自分のパソコンにダウンロードした後で再生するには、当然ですがFalsh Videoファイルを再生できなければなりません。Windowsに付属するWindows Media Playerでは再生できませんので、何か再生できるアプリを用意してください。ちなみに私は、GOM Playerを使っています。非常に素晴らしいフリーソフトです。
YouTubeで動画を再生すると、動画のデータがブラウザのキャッシュに保存されます。このキャッシュが実はflv形式なのですが、一時的に使用されるデータのため、別の動画を再生すると上書きされたり、ブラウザのページを閉じると削除されたりします。しかし、最後まで再生すれば(読み込めば)、一時的にせよ、flvファイルがハードディスクに保存されますので、YouTubeが削除する前に、別のフォルダにコピーしてしまいます。あとは、ファイル名を適当な名前に変えれば、いつでも好きなときに再生することが可能になります。
実際には、UserFormなどで専用のUIを作った方がいいでしょうが、ここでは必要なプロシージャだけご紹介します。また、使用するブラウザはInternet Explorerとします。Google Chromeなどほかのブラウザでは、キャッシュの管理が異なるので、そのままでは使えません。動作確認は、Windows XP+IE 8でやりました。手順は、以下の通りです。
本コンテンツでは、「ダウンロードする」という言い方をしていますが、実際には「ダウンロードする」というより、動画を再生したとき一時的に保存されるキャッシュファイルを捕獲して、別名で保存してしまおう、という方法ですね。
IEのキャッシュファイルは、
C:\Documents and Settings\<ログイン名>\Local Settings\Temporary Internet Files\Content.IE5\
の下に、複数のサブフォルダに分割して保存されます。サブフォルダの名前は「4NONT6EZ」や「LWKS21FD」などランダムな文字列ですし、いくつのサブフォルダが使われるかはわかりません。そこで、まず上記のキャッシュフォルダ内に、どんなサブフォルダが存在するかを調べます。
Sub Sample1() Dim Shell As Object, CashFolder As Object Set Shell = CreateObject("Shell.Application") Set CashFolder = Shell.Namespace(&H20) ''キャッシュフォルダのパスを取得する MsgBox CashFolder.Self.Path & "\Content.IE5" Set CashFolder = Nothing Set Shell = Nothing End Sub
これで、先の
C:\Documents and Settings\<ログイン名>\Local Settings\Temporary Internet Files\Content.IE5\
が取得できます。
続いて、ここにどんなサブフォルダが存在するかを調べます。
Sub Sample2() Dim Shell As Object, CashFolder As Object, FSO As Object, Folder As Object Set FSO = CreateObject("Scripting.FileSystemObject") Set Shell = CreateObject("Shell.Application") Set CashFolder = Shell.Namespace(&H20) ''キャッシュフォルダ内のサブフォルダを取得する For Each Folder In FSO.GetFolder(CashFolder.Self.Path & "\Content.IE5").SubFolders Debug.Print Folder.Path Next Folder Set CashFolder = Nothing Set Shell = Nothing Set FSO = Nothing End Sub
Sample2を実行すると、キャッシュが保存されるサブフォルダのパスが、イミディエイトウィンドウに出力されます。VBEでイミディエイトウィンドウを開くには、Ctrl+Gを押します。
お目当ての動画を再生する前に、それまでキャッシュに保存されている(かもしれない)別のflvファイルを削除しておきましょう。キャッシュに保存されるflvファイルには便宜的な名前が付けられますので、ファイル名から何の動画かを判別するのが難しいからです。そこで、保存したい動画を再生する前に、すべてのflvファイルを削除しておき、再生後に残った1つのflvファイルを別フォルダにコピーします。
Sub Sample3() Dim Shell As Object, CashFolder As Object, FSO As Object Dim Folder As Object, File As Object Set FSO = CreateObject("Scripting.FileSystemObject") Set Shell = CreateObject("Shell.Application") Set CashFolder = Shell.Namespace(&H20) For Each Folder In FSO.GetFolder(CashFolder.Self.Path & "\Content.IE5").SubFolders For Each File In Folder.Files ''キャッシュフォルダ内のflvファイルを削除する If FSO.GetExtensionName(File) = "flv" Then FSO.DeleteFile File End If Next File Next Folder Set CashFolder = Nothing Set Shell = Nothing Set FSO = Nothing End Sub
これで準備完了です。
上記のSample3を実行したら、YouTubeで、保存したい動画を再生します。
最後まで再生しなくても、要するに最後まで読み込めればいいです。よくわからなかったら、最後まで再生しましょう。
再生が終わったら、キャッシュに保存されているflvファイルを別フォルダにコピーします。ここでは、C:\にコピーするものとします。
Sub Sample4() Dim Shell As Object, CashFolder As Object, FSO As Object Dim Folder As Object, File As Object Set FSO = CreateObject("Scripting.FileSystemObject") Set Shell = CreateObject("Shell.Application") Set CashFolder = Shell.Namespace(&H20) For Each Folder In FSO.GetFolder(CashFolder.Self.Path & "\Content.IE5").SubFolders For Each File In Folder.Files ''キャッシュフォルダ内のflvファイルをコピーする If FSO.GetExtensionName(File) = "flv" Then FSO.CopyFile File.Path, "C:\" End If Next File Next Folder Set CashFolder = Nothing Set Shell = Nothing Set FSO = Nothing End Sub
これで、キャッシュのflvファイルを保存できました。
YouTubeなどの動画投稿サイトでは、キャッシュに保存するファイルに便宜的な名前を付けます。そのままでは、せっかく保存したファイルが何の動画かわかりませんし、2つめのファイルをダウンロードしようとすると、ファイル名がバッティングしてしまいます。なので、上記Sample4でコピーするとき、コピー先のファイルに任意の名前を付けておきましょう。
Sub Sample4() Dim Shell As Object, CashFolder As Object, FSO As Object Dim Folder As Object, File As Object, NewName As String NewName = InputBox("新しいファイル名は?") If NewName = "" Then Exit Sub If Right(NewName, 3) <> "flv" Then NewName = NewName & ".flv" NewName = "C:\" & NewName Set FSO = CreateObject("Scripting.FileSystemObject") Set Shell = CreateObject("Shell.Application") Set CashFolder = Shell.Namespace(&H20) For Each Folder In FSO.GetFolder(CashFolder.Self.Path & "\Content.IE5").SubFolders For Each File In Folder.Files ''キャッシュフォルダ内のflvファイルを名前を変えてコピーする If FSO.GetExtensionName(File) = "flv" Then FSO.CopyFile File.Path, NewName End If Next File Next Folder Set CashFolder = Nothing Set Shell = Nothing Set FSO = Nothing End Sub
以上です。
FileSystemObjectのサンプルということですから、思い切り簡素化していますが、この考え方で、YouTubeとFC2動画からダウンロードできています。あとは、それぞれ必要な処理を加えてください。あ、もちろん、Youtubeなど動画配信サイト側の仕様が変更になるなど、この考え方では通用しなくなる場合もあるでしょうから、そのときはまた別の手を考えてください。