LoginSignup
0
0

More than 3 years have passed since last update.

Python3でプレイリスト(m8u8ファイル)の読み込み

Posted at

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')
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0