YouTubeの動画をダウンロードする


サンプルとしては、いかがなものかとも思いましたが(笑)。

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でやりました。手順は、以下の通りです。

  1. IEのキャッシュフォルダを取得する
  2. キャッシュに保存されているflvファイルをすべて削除する
  3. YouTubeで動画を再生する
  4. 新しく保存されたflvファイルを別フォルダにコピーする
  5. コピーしたflvファイルに新しい名前を付ける

本コンテンツでは、「ダウンロードする」という言い方をしていますが、実際には「ダウンロードする」というより、動画を再生したとき一時的に保存されるキャッシュファイルを捕獲して、別名で保存してしまおう、という方法ですね。

IEのキャッシュフォルダを取得する

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ファイルには便宜的な名前が付けられますので、ファイル名から何の動画かを判別するのが難しいからです。そこで、保存したい動画を再生する前に、すべての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ファイルを別フォルダにコピーする

再生が終わったら、キャッシュに保存されている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ファイルを保存できました。

コピーした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など動画配信サイト側の仕様が変更になるなど、この考え方では通用しなくなる場合もあるでしょうから、そのときはまた別の手を考えてください。