Skip to content

Instantly share code, notes, and snippets.

@khlizard
Last active December 12, 2023 00:42
Show Gist options
  • Save khlizard/b593bc0328765843201d80a33e33604a to your computer and use it in GitHub Desktop.
Save khlizard/b593bc0328765843201d80a33e33604a to your computer and use it in GitHub Desktop.
=begin
## 概要
iTunesでAAC形式のファイル(.m4a)を、ffmpegで再エンコードするスクリプトです
Windows 11 22H2 以降 + Rekordboxで発生する音量バグ対策として作成しました
参考:https://twitter.com/vrctokage/status/1733199629989347811 https://note.com/khlizard/n/n56dd6650f1e5
実行にはRubyとffmpegが必要です
## 設定項目
- target_dir : 対象とするフォルダ
- tmp_dir : テンポラリフォルダ
- threshold_time : 変換対象とする最終更新日の閾値
## 注意点
- このスクリプトは強制的に元ファイルを上書きするので、**必ずバックアップを取ってから実行してください**
- 320kbpsで再エンコードしているためファイルサイズは少し大きくなります
- 終了後にテンポラリフォルダに残っているファイルは変換失敗したものなどですので、ファイル名で検索して元ファイルを確認し、都度どうするか判断してください
- 大半は壊れているファイルです(iTunesのAACファイルは何故かたまに壊れてます…)
- そのため、再生してみて失敗したら削除してiTunesから再ダウンロードし再エンコードすることになると思います
=end
require 'pathname'
# 対象とするフォルダ
target_dir = Pathname '<TARGET_DIR>'
# テンポラリフォルダ
tmp_dir = Pathname '<TMP_DIR>'
# 変換対象とする最終更新日の閾値
# デフォルトは3日前です
threshold_time = Time.now - 60 * 60 * 24 * 3
# 例えば 2023/12/9 19時以前の場合は次のように指定してください
# threshold_time = Time.new(2023, 12, 9, 19, 0, 0)
log_file = Pathname($0).sub_ext('.log')
m4a_files = target_dir.glob('**/*.m4a')
# 複数個同時に動かしたい場合はこちらのコメントを外してください
# m4a_files.shuffle!
replace_files = 0
begin
m4a_files.each do |file_path|
next unless file_path.mtime < threshold_time
next unless file_path.file?
path = Pathname.new(file_path)
dst = tmp_dir.join(path.basename.sub_ext('.tmp.m4a'))
next if dst.exist?
unless system("ffmpeg -y -i \"#{path}\" -vn -ac 2 -b:a 320k -aac_coder twoloop \"#{dst}\"")
puts "Error: Failed to convert #{path}"
next
end
# 変換後のファイルが元ファイルの90%より小さい場合は変換失敗とみなす
next unless path.size * 0.9 < dst.size
begin
dst.rename(path)
replace_files += 1
rescue => e
puts "Error: Failed to rename file #{dst} to #{path} - #{e.message}"
ensure
log_file.open('w') do |f|
f.puts "Replaced #{replace_files} / #{m4a_files.size} files."
end
end
end
rescue Interrupt
puts "Interrupted"
end
puts "\n\nReplaced #{replace_files} / #{m4a_files.size} files."
gets
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment