以前、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です。