お茶漬けぶろぐ

音楽ファイルの形式をまとめて変えるスクリプトを書いた

いつもどおり記事タイトルが訳わかんねーな

前回の音楽ファイルの取り扱いを考えるで書いた、tak+cueで保存しているデータをmka(cue+flac+jpeg)みたいな感じで保存し直すスクリプト。

全部Windows batchで書こうとしたんだけど、正直言って触れば触るほど訳わかんなくなって(Windows batch死ね)全然無理だったので、win-bashを使ってWindowsの上でbashなシェルスクリプトとして書いた。

それでも引数処理が面倒だったのと、D&Dで実行出来ないため、シェルスクリプトを呼び出すためのWindows batchを書いたりして大変アレ。まぁ目的は達成出来ているのでおkでしょ。

・make_mka.bat

[powershell title=”make_mka.bat”]
@echo OFF

:LOOP
if "%~dpnx1" == "" goto END
echo Input: %~dpnx1
set in="%~dpnx1"
set sc="%~dp0make_mka.sh"
set pt="%~dp1"
bash %sc% %in% %pt%
echo;
shift
goto LOOP

:END
echo all jobs were completed.
timeout /t -1
[/powershell]

・make_mka.sh

[bash language=”title=”]
in_cue=cat "$1" | nkf -Sw
cd "$2"

echo Generating xml file…
echo \<Tags\>\<Tag\> >temp.xml
echo "$in_cue" | grep DISCID
if [ $?==0 ]; then
echo \<Simple\>\<Name\>DISCID\</Name\>\<String\> >>temp.xml
echo "$in_cue" | grep DISCID | awk ‘{print $3}’ >>temp.xml
echo \</String\>\</Simple\> >>temp.xml
fi
echo "$in_cue" | grep DATE
if [ $?==0 ]; then
echo \<Simple\>\<Name\>DATE\</Name\>\<String\> >>temp.xml
echo "$in_cue" | grep DATE | awk ‘{print $3}’ >>temp.xml
echo \</String\>\</Simple\> >>temp.xml
fi
echo "$in_cue" | grep GENRE
if [ $?==0 ]; then
echo \<Simple\>\<Name\>GENRE\</Name\>\<String\> >>temp.xml
echo "$in_cue" | grep GENRE | awk ‘{print $3}’ >>temp.xml
echo \</String\>\</Simple\> >>temp.xml
fi
echo "$in_cue" | grep TITLE
if [ $?==0 ]; then
echo \<Simple\>\<Name\>TITLE\</Name\>\<String\> >>temp.xml
echo "$in_cue" | grep TITLE | awk ‘NR==1’ | sed -e s/TITLE.\"// -e s/\"// >>temp.xml
echo \</String\>\</Simple\> >>temp.xml
fi
echo \<Simple\>\<Name\>TOTAL_PARTS\</Name\>\<String\> >>temp.xml
echo "$in_cue" | grep -G ‘TRACK.[0-9]+’ | awk ‘END{print $2}’ >>temp.xml
echo \</String\>\</Simple\> >>temp.xml
echo \</Tag\>\</Tags\> >>temp.xml
out_cue=tr -d '\n' &lt; temp.xml
echo "$out_cue" >temp.xml
echo

echo converting from tak to flac…
tak=echo &quot;$1&quot; | sed -e s/cue$/tak/
wav=echo &quot;$1&quot; | sed -e s/cue$/wav/
takc -d "$tak"
flac=echo &quot;$tak&quot; | sed -e s/tak$/flac/
ffmpeg -i "$wav"  "$flac"

echo

echo muxing…
mka=echo $tak | sed -e s/tak$/mka/
path=$(echo "$2")cover.jpg
mkvmerge.exe -o "$mka" "$flac" –attachment-mime-type image/jpeg –attach-file "$path" –chapters "$1" –global-tags temp.xml

echo cleaning…
rm temp.xml
rm "$flac"
rm "$wav"

echo "$1"
[/bash]

細かい動作の流れや仕組みはコードを見てもらうとして、以下コメント。

make_mka.batでは引数が複数あっても(複数D&Dされても)動作しそうに書いてあるけど、これは最初の妄想のままであって、これが実際に動作はしない。あっはっは。アルバムアートのファイル名とかを多少手直しすればいけそうな気もするけど、この状態で手持ちのデータは全部処理しちゃったのでもういっかな。

mkvmergeはcueシートを元にmkaのチャプターを切ってくれる(トラック情報を反映してくれる)っぽいので凄いじゃんと思ったら、アルバムタイトルとか総トラック数とかDISCIDとかを反映してくれなかった。これはどうやらChapterではなくTagという扱いみたい。それらしいxmlを読み込んでやると反映してくれるので、それらしいtemp.xmlを生成する部分が殆どを占めてるね。

sedやawkを使ってcueから情報取り出してるけど、bashでcueシートのパースとかやってる人が見当たらなかったのでてきとうに書いた。

それから、cueシートの読み込み(make_mka.shの1行目)で、cueシートにアルファベット以外が含まれていると文字化けして適切に情報が取り出せなかった(トラックタイトルはChapter扱いなのでmkvmergeがよしなにしてくれていたけど、アルバムタイトルはTag扱いなのでxmlから拾うため)ので、win-bashらへんに含まれていなかったnkfを別に入手して使った。

tak->flacを直接ffmpegでやるとうまくいくデータとうまくいかないデータがあった(原因はよくわかんない)ので、まずtak公式のtakcでtak->wavとデコードしてから、ffmpegでwav->flacしてる。flacへのエンコードも公式のエンコーダ使えばいいじゃんって今思ってる。

全体的に、

・文字のエスケープの区別(パス、ファイル内、ダブルコーテーションやシングルコーテーション、記号)がちゃんと理解出来てない

・sedやawkを使った文字列加工がかなり手探りで汚い(かといって修正する気になる訳じゃない)

取り敢えず書くか~みたいな感じでずっと書いてるので、そろそろ綺麗にする努力とかすればいいじゃんね、といった気持ちではあるけど、面倒なもんは面倒なのさ。後から手を入れる予定も無いから別に糞コードでもいいだろ、みたいな。

< 普段使いのOSをLinuxにするという事について

音楽ファイルの取り扱いを考える >