Last active
December 12, 2023 00:42
-
-
Save khlizard/b593bc0328765843201d80a33e33604a to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
=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