プログラマ英語日記

プログラミング学習のまとめなど

音読パッケージの曲順がイマイチなので並び替えるコードを書いた

音読パッケージ、黙読も併用しながら学習してるのですがトラックの並び順が使いづらいことに気づきました。

一つの文章での「遅い速度/通常速度/リピーティング用」が分散しており、切り替えたいときにかなり不便。

しかし手動で並び替えるにはしんどい数(120曲)なのでコードを書いて並び替えさせました。

詳細

このCD音源は40個の文章それぞれに対し、「遅い>通常>リピート用」の3種類が収録されています。

そして収録順が、「遅い1-40、通常1-40、リピート1-40」という順番に収録されています。

これは通し聞きする先行リスニングでは便利です。むしろこの段階はこの順序じゃないとキツイ。。。

しかし、音読セクションに入ると変わります

音読セクションでは、1文章ごとに 「遅い、通常、リピート用」と固まっていたほうが便利です。


表にすると

収録順 欲しい順
1 slow 1 slow
2 slow 1 normal
3 slow 1 repeating
1 normal 2 slow
2 normal 2 normal
3 normal 2 repeating
1 repeating 3 slow
2 repeating 3 normal
3 repeating 3 repeating

こんな感じ。


自分はCDなし音読やリピーティング中も、発音/イントネーションなどの確認のためちょくちょくSlowやNormalを聞くので、それぞれのトラックが分散してると切り替えがめんどくさい のです。

そこでサクっとコードを書いてみました。また、Discが無駄に分かれるのもiTunes上でめんどくさいので、1つにまとめてあります。


コード

短いのではてなに全部はりますw

  • 言語はPython(Python3.6)。
  • iTunes取り込み前提。それ以外は未検証
  • 全楽曲をsrcフォルダ直下に突っ込むことを想定
  • ファイル名までは変更しません
  • 汎用性無視のオレオレコードなので細部は調整してくださいw

実はあまりPythonに触ったことがありません。Python自体の学習を兼ねているので、習熟者からするとイマイチなコードだと思います。練習ということで…

""" re-order track numbers in 音読パッケージ"""

import mutagen
import os
from typing import List

class TagUpdater:
    """core class"""

    @staticmethod
    def update_track_numbers():
        """ update all track numbers in src dir """
        files = TagUpdater._list_files("src")
        sorted_files = TagUpdater._sort_files(files)
        TagUpdater._update_track_tags(sorted_files)

    @staticmethod
    def _sort_files(files: List[str]) -> List[str]:
        """sort files"""
        prefixes = ["One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine"]
        result: List[str] = []
        for prefix in prefixes:
            for i in range(1, 10):
                fname = "Program " + prefix + " " + str(i)
                filtered = filter(lambda s, f=fname: s.find(f) >= 0, files)
                result.extend(filtered)
        return result

    @staticmethod
    def _update_track_tags(files: List[str]):
        """update track number as file order"""
        all_count = len(files)
        fname = files[0]
        for index, fname in enumerate(files):
            print(str(index) + " : " + fname)
            m_file = mutagen.File("src/" + fname)
            m_file.tags["trkn"] = [(index + 1, all_count)]
            m_file.tags["disk"] = [(1, 1)]
            m_file.tags["©alb"] = ["みるみる音読"]
            m_file.tags["©gen"] = ["Spoken & Audio"]
            m_file.save()

    @staticmethod
    def _list_files(dir_path: str) -> List[str]:
        """ list dirs """
        for _, _, files in os.walk(dir_path):
            return files

if __name__ == "__main__":
    TagUpdater.update_track_numbers()

いいですね、Python

こういうときにライブラリが豊富ですし、サクっとかけて便利です。行数が全てではないですが、Javaだと 2,3倍ぐらいの行数になるのではないでしょうか?

同じようにメンドクセーと思ってるプログラマの人はすでに書いてると思うので、たぶん誰の役にもたたないコードでしょうw (非プログラマが使うにはあまりにも説明不足…そこまでする気はない)

語学学習の合間のちょっとした息抜きになりました。Pythonたのしい。