ラズパイ:フォルダ内の音楽ファイルをランダムに重複せずに再生する

ラズベリーパイB Raspberry Pi

以前作ったラズパイの「フォルダ内の音楽ファイルをランダム再生する」プログラムを改良して、ランダムに一度全ての曲を並べ替え重複せずに(全ての曲が再生されるまで同じ曲はかからないように)再生するバージョンを作った。プログラムはPython3。

以前のバージョン

ラズパイ:フォルダ内の音楽をランダム再生する
ラズパイを使ってomxplayerでフォルダ内に保存された音楽ファイル(mp3, m4a等)をランダム再生する方法です。 omxplayerがインストールされていない場合は、以下のコマンドでインストールしてください。 sudo apt-ge...

今回は指定したフォルダ内の曲を全てランダムに並べ替えて一旦テキストファイル(playNext.dat)にファイル名リストを保存し、順番に再生する方法をとった。

保存するテキストファイル(playNext.dat)は、こんな感じ。

4,150
08 a Boy ~ずっと忘れない~.m4a
1-01 情熱の薔薇.m4a
03 電光石火.m4a
03 BELOVED.m4a
01 ズル休み.m4a
1-08 とんぼ.m4a
04 セシル.m4a
2-05 大きな古時計.m4a
I only Want To Be With You.mp3
1-11 好き好きダーリン.m4a
 :
 :

先頭行に次の再生番号と全曲数が保存されている。

4,150

一曲再生するたびにこの先頭行の番号がインクリメント(加算)されるようになっている。全曲終了すると再度フォルダ内の曲をランダムに並べ替えてテキストファイルを上書きする仕組み。
上記のテキストファイルイメージだとフォルダ内に150曲あり、次は4曲目の「03 BELOVED.m4a」が再生される、という意味。

ソースコード
playNext.py

# -*- conding: utf-8 -*-

"""
	フォルダ内の音楽ファイルをランダムに再生する

		2019-04-29
		全ての曲が全て再生されるまで、同じ曲が再生されることはないバージョン
		
"""

import os, sys
import random

# 参照ディレクトリ
music_pass = "/home/pi2/music/"
file_pass = "/home/pi2/python/"

# 再生する曲のファイル名
play_no = ""

# シャッフルした曲名を保存しておくファイル
DATA_FILE = "playNext.dat"

# --- フォルダ内の曲を順番を変えてシャッフルしたデータファイルを生成する関数
def new_datafile():
	# データファイルを準備(書き込みモード)
	datafile = open(file_pass + DATA_FILE, "w", encoding="utf-8")
	print("データファイル新規作成")
	
	# フォルダのファイル数取得
	files = os.listdir(music_pass)
	music_count = len(files)
	print("ファイル数: {0}".format(music_count))
	
	# ファイルの先頭行に再生曲の番号とファイル総数を保存
	datafile.write("1,{0}\n".format(str(music_count)))
	
	#シャッフル
	r = random
	r.seed()
	
	for i in range(1000):
		r1 = r.randint(0, music_count - 1)
		r2 = r.randint(0, music_count - 1)
		
		work = files[r1]
		files[r1] = files[r2]
		files[r2] = work
		
	# 音楽ファイル名をデータファイルに書き込む
	for file in files:
		datafile.write(file + "\n")
	
	# データファイルを閉じる
	datafile.close()


# データファイルが存在しないなら新規作成
if not os.path.exists(file_pass + DATA_FILE):
	new_datafile()

# データファイルを読み込む
datafile = open(file_pass + DATA_FILE, "r", encoding="utf-8")
lines = datafile.readlines()
datafile.close()

# フォルダのファイル数取得
music_data = lines[0].split(",")
music_count = int(music_data[0])
music_total = int(music_data[1])
print("再生曲: " + str(music_count))	
print("トータル: " + str(music_total))	

# 再生曲を設定
play_no = lines[music_count].rstrip("\n")	# 末尾の改行を取り除く

# 次の曲へ
music_count += 1
lines[0] = str(music_count) + "," + str(music_total) + "\n"

# データファイル更新
datafile = open(file_pass + DATA_FILE, "w", encoding="utf-8")
datafile.writelines(lines)
datafile.close()

# フォルダの曲を全て再生し終えたらデータファイル再生成
if music_count > music_total:
	new_datafile()

# 曲を再生する
cmd = "omxplayer -o local " + music_pass + "'" + play_no + "'"
print(cmd)
result = os.popen(cmd).readline().strip()


補足

15行目のmusic_pass = “~”は、音楽ファイルが保存されたディレクトリを指定。

16行目のfile_pass = “~”は、Pythonのプログラムを保存したディレクトリを指定。

file_passで指定したのディレクトリに曲をランダムに並べ替えたテキストファイル(playNext.dat)が保存される。

コメント

タイトルとURLをコピーしました