rubyで動画ファイルを作成日のディレクトリに移動する

子供を撮った動画をどこにバックアップするかなーと悩んだ挙句、
s3 → glacierでバックアップすることにしたので、その事前準備の為に
ファイルのディレクトリわけをした際のメモ

## ffmpegをインストール

動画のメタ情報を取得する一番の近道っぽいのでffmpegを導入

```zsh
% brew install ffmpeg
```

## ffmpegで動画のメタデータを表示

```zsh
% ffmpeg -i ***.MOV
```

見た感じmov側のcreation_timeはGMT, mp4にはdate的なものがない。
date → creation_time → ファイルのmtimeの順でディレクトリ分けに利用することにした

```text:mov
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '***.MOV':
  Metadata:
    major_brand     : qt  
    minor_version   : 0
    compatible_brands: qt  
    creation_time   : 2014-06-11 22:17:44
    encoder         : 7.1.1
    encoder-jpn     : 7.1.1
    date            : 2014-06-12T07:17:44+0900
    date-jpn        : 2014-06-12T07:17:44+0900
    location        : ***
    location-jpn    : ***
    model           : iPhone 5s
    model-jpn       : iPhone 5s
    make            : Apple
    make-jpn        : Apple
  Duration: 00:00:18.74, start: 0.000000, bitrate: 16993 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709), 1920x1080, 16912 kb/s, 29.98 fps, 29.97 tbr, 600 tbn, 1200 tbc (default)
    Metadata:
      rotate          : 90
      creation_time   : 2014-06-11 22:17:44
      handler_name    : Core Media Data Handler
    Stream #0:1(und): Audio: aac (mp4a / 0x6134706D), 44100 Hz, mono, fltp, 62 kb/s (default)
    Metadata:
      creation_time   : 2014-06-11 22:17:44
      handler_name    : Core Media Data Handler
```

```text:mp4
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '***.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 1
    compatible_brands: mp41mp42isom
    creation_time   : 2014-06-10 11:17:21
  Duration: 00:00:36.40, start: 0.000023, bitrate: 3014 kb/s
    Stream #0:0(und): Audio: aac (mp4a / 0x6134706D), 44100 Hz, mono, fltp, 63 kb/s (default)
    Metadata:
      creation_time   : 2014-06-10 11:17:21
      handler_name    : Core Media Audio
    Stream #0:1(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709), 720x1280, 2943 kb/s, 29.98 fps, 29.97 tbr, 600 tbn, 1200 tbc (default)
    Metadata:
      creation_time   : 2014-06-10 11:17:21
      handler_name    : Core Media Video
```

## ffmpegと連携する為のgemをインストール

シェルスクリプトで書くのはめんどくさいので、rubyでスクリプトを書くために、
ffmpegと連携するgemをインストール

[ffmpeg対応gem](https://rubygems.org/search?utf8=%E2%9C%93&query=ffmpeg)

どれでもよかったんだけどffmpegのバイナリを実行してるのではなく、
Rubyエクステンションにしているgemを選んでみた。

動画のメタデータが欲しいだけだったので機能的には問題なし

% gem install ffmpeg-video-info

## 動画ファイルのあるディレクトリで以下を実行

とりあえず新規作業なので、ファイルの存在チェックとかその辺はなにもしてない

```rb:irb
require 'ffmpeg_video_info'
require 'time'
require 'fileutils'
Dir.glob(%w(*.avi *.AVI *.mov *.MOV *.mp4 *.MP4 *.3gp)) do |file|
  info = FFmpegVideoInfo.get(file)
  info['metadata'] ||= {}
  creation_at = info['metadata']['date'] || info['metadata']['creation_time'] || File.mtime(file).inspect
  time = Time.parse(creation_at)
  year = time.year
  month = time.month
  day = time.day
  dir = File.join("#{year}", "#{year}-#{format("%02d", month)}", "#{year}-#{format("%02d", month)}-#{format("%02d", day)}")
  unless File.exists?(dir)
    FileUtils.mkdir_p(dir)
  end
  if File.exists?(File.join(dir, file))
    puts "#{File.join(dir, file)} already exists."
    next
  end
  FileUtils.mv(file, dir)
end
```