m8u8ファイルとは
音楽のプレイリストを保存するファイル形式。中身は以下の形式で保存されたテキストファイルです。
ミュージックプレイヤーでプレイリストをエクスポートすると出力される。
m8u8はutf-8、m8uはSJISの文字コードで保存されてることを表す拡張子。
#EXTM3U
#EXTINF:456,約束 【ORT】
F:\music\THE IDOLM@STER\765プロダクション\01_約束 【ORT】.flac
#EXTINF:240,Cherry Colored Love
F:\music\THE IDOLM@STER\ミリオンライブ!\01_Cherry Colored Love.wav
曲の長さや曲名 → 曲のフルパス → 次の曲 ...と改行して記載してある。
#EXTINF:456,約束 【ORT】
→ 456は曲の長さ[秒],曲名
データクラス
class M8U8Info :
lengthTime = 0
name = b""
filepath = b""
ext=""
読み込みクラス
1行目は無視して、偶数行から曲名や長さを設定して、奇数行からフルパスを設定するだけ。
書いた後に思ったが、高階関数でもっとスマートな感じでできると思う。
class M8U8Reader :
def __init__(self, filepath: str, encode='utf_8_sig') :
p_new = pathlib.Path(filepath)
with p_new.open(mode='r', encoding=encode) as f:
self.readData = f.readlines()
def read(self) :
m8u8InfoList = []
for i in range(len(self.readData)) :
if i == 0 :
continue
if i % 2 == 1 :
extinf = self.readData[i].split(',')
m8u8 = M8U8Info()
m8u8.lengthTime = int(extinf[0][8:])
m8u8.name = extinf[1].strip()
m8u8.filepath = os.path.abspath(self.readData[i + 1]).strip()
m8u8.ext = os.path.splitext(m8u8.filepath)[1]
m8u8InfoList.append(m8u8)
return m8u8InfoList
メモ
・私が使ってる外部プレーヤーで出力した場合、BOM付きのUTF-8だったため、以下でエンコードした。
encode='utf_8_sig'
・Windowsのvscodeで日本語出力するメモ
sys.stdin = io.TextIOWrapper(sys.stdin.buffer, encoding='utf-8')
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding='utf-8')