プレイリストのヘビーローテーション設定

以前、MYSQLで作成したプレイリスト が大規模になってきました。基本的には全曲再生したいのですが、短縮バージョンでの再生も可能とする修正を実施しました。

f:id:S_E_Hyphen:20200815142544p:plain

テーブルには 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 を上記のように修正しました。

f:id:S_E_Hyphen:20200815143048p:plain

skip フィールドで設定した通り、3の倍数に相当する曲は再生しないようになりました。

全ての曲を再生する、元の設定に戻すには、 

mysql life_log << _SQL_
 update playlist set skip=false;
_SQL_

としてやればOKです。