以前、MYSQLで作成したプレイリスト が大規模になってきました。基本的には全曲再生したいのですが、短縮バージョンでの再生も可能とする修正を実施しました。
テーブルには skip という名前のboolean型フィールドを追加しました。このフィールドが TRUE(1) となっていた場合、その曲を飛ばして再生するようにします。
#!/bin/bash play_dir="." host=127.0.0.1 DB=life_log table="playlist" # テーブル playlist の存在を確認 exist=`\ mysql -N -h ${host} ${DB} << _SQL_ show tables like "${table}"; _SQL_ ` # 存在しない場合作成する if [ -z ${exist} ] then temp=`mktemp ../XXXX.tmp` ls -1 ${play_dir} |\ awk '{print $1,NR}' > ${temp} mysql -h ${host} ${DB} << _SQL_ create table if not exists ${table} ( id int primary key auto_increment, file text, seq int unique, last_play datetime, skip boolean default false ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /* ファイル名のload */ set character_set_database=utf8; load data local infile "${temp}" into table ${table} fields terminated by " " lines terminated by "\n" (file,seq); _SQL_ rm ${temp} fi # 最新曲のseqを取得する max_seq=\ `mysql -h ${host} -N ${DB} << _SQL_ select max(seq) from ${table}; _SQL_ ` # 最後に再生した曲の${seq}を取得する last_seq=\ `mysql -h ${host} -N ${DB} << _SQL_ select seq from ${table} where last_play= (select max(last_play) from ${table}); _SQL_ ` # 次に再生する曲の${seq}を決定する next_seq=\ `mysql -h ${host} -N ${DB} << _SQL_ select min(seq) from ${table} where !skip and seq>${last_seq}; _SQL_ ` if [ ${next_seq} -eq ${max_seq} ] then next_seq=\ `mysql -h ${host} -N ${DB} << _SQL_ select min(seq) from ${table} where !skip; _SQL_ ` fi #次に再生する曲のファイル名を取得する mp3file=\ `mysql -h ${host} -N ${DB} << _SQL_ select file from ${table} where !skip and seq=${next_seq}; _SQL_ ` echo "next song is " ${mp3file} # ここで mplayer などを用いて ${mp3file} を再生する。 sleep 2 # 最後に再生した曲をデータベース登録する mysql -h ${host} -N ${DB} << _SQL_ update ${table} set last_play=now() where seq="${next_seq}"; _SQL_
以前作成した play.sh を上記のように修正しました。
skip フィールドで設定した通り、3の倍数に相当する曲は再生しないようになりました。
全ての曲を再生する、元の設定に戻すには、
mysql life_log << _SQL_ update playlist set skip=false; _SQL_
としてやればOKです。