動画を撮影日時のフォルダに一括移動する

はじめに

写真を撮影日時のフォルダに一括移動するの動画ファイル版である。

動画と同様にできるのだが、Exifと同様のgemを探すのに苦労する。 webを検索すると、かなり古いgemを使った記事ばかりで、あまり参考にならなかった。

ruby-ffmpegのインストール

使えそうなのが、GitHub – instructure/ruby-ffmpeg: Simple yet powerful ruby ffmpeg wrapper for reading metadata and transcoding movies

困ったことに、これが公式なgemではないので、gem install ffmpeg でインストールできない。

ハマりポイント

無邪気に

gem install ffmpeg

とやると、かなり古い公式のffmpeg gemがインストールされてしまう。 これはバージョンが0.2.5。インストールはされるが使いかたが分からない。

ちなみにインストールされているgemのリストとバージョンを確認するには

gem list

とする。

なお、この古いgemをアンインストールするには

gem uninstall ffmpeg 

とする。

ローカルでgemをビルド・インストール

GitHub – instructure/ruby-ffmpeg: Simple yet powerful ruby ffmpeg wrapper for reading metadata and transcoding moviesからソース(zipにした)をダウンロードする。

zipを展開するとffmpeg.gemspecがあり、これに依存関係がある。この依存関係を満足するように必要なgemをインストールしておく。

rake buildが定義されていないようなので(理解が間違っているかも知れない)

gem build ffmpeg.gemspec

でビルドする。これで ffmpeg-6.1.2.gem が生成される。

ここまで来れば

gem install -l ffmpeg-6.1.2.gem 

でインストールできる。

Rubyプログラム

ようやくRubyのプログラムを書くことができる。

#!/usr/bin/env ruby

require 'ffmpeg'
require 'time'
require 'fileutils'

Dir.glob(%w(*.avi *.AVI *.mov *.MOV *.mp4 *.MP4 *.3gp)).each{|mov_path|
  #mov_path = "IMG_0005.MP4"
  media = FFMPEG::Media.new(mov_path)
  p creation_at = media.metadata[:streams][0][:tags][:creation_time]
  p time = Time.parse(creation_at)
  p dir_name = time.strftime("%Y-%m-%d")
  if !FileTest.exist?(dir_name)
    puts "#{dir_name} does not exsit. Now newly made."
    Dir.mkdir(dir_name)
  end
  FileUtils.mv(mov_path, dir_name)
}

media.metadata[:streams][0]の部分は決め打ちで[0]にしてある(ここが一番分かりづらかった)。 これで良いかどうかは、実際のファイルで確認するほうが良いかも知れない。