LoginSignup
9
8

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-06-16

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

ffmpegをインストール

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

% brew install ffmpeg

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

% ffmpeg -i ***.MOV

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

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
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

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

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

% gem install ffmpeg-video-info

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

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

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
9
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
8