Spotifyで主にクラシックの演奏を選ぶ時に、以前聴いたかどうかと、聴いていた時はその時の感想や評価(例: 好き/嫌い)が出れば、二度手間にならなくていい※と思っているのだが、そういう機能はない(再生履歴は出るが、検索が楽ではない)。曲にコメントが記入できるといいのだが、無理だ。それで、少し前から、そういう仕組みを作りたくなって検討している。

※感想は聴くたびに変わる可能性があるが、少なくとも、「フォルテピアノ・古楽器だから駄目(「僕は嫌い」の意)」などという情報があれば「普通の演奏」だと思って掛けることがないから、二度手間にならないことは確実だし、それでフィルタリングできれば、選ぶ手間がかなり減る。こういう機能がマジで欲しいのだ。

主要な機能は以下だ。

  1. Spotifyで新しい(= 過去に再生したことがない)曲を再生したら、その曲の情報と再生日時を記録する。 → 「再生履歴」
  2. 曲の再生中または後に、その曲の再生履歴にコメント(感想)を記録できる。「嫌い」という情報(マーク)も記録できる。
  3. Spotifyで曲を検索し、結果に出た曲に再生履歴があれば、過去の再生日や評価やコメントなどを一緒に表示する。再生ボタンやリンクをクリックすると、Spotifyアプリで再生できる。

実現方法を考えたところ、1は自作のミニプレーヤー(minisp)を改造すればできそうだ。2は再生履歴の管理プログラムを作ることになる。3は、Spotifyの検索プログラムを作る必要がある。基本的には、web版Spotifyのようなイメージだ。そこに再生履歴の情報も合わせて表示する。SpotifyのAPIは公開されているので、面倒ではあるが、作るのは不可能ではない。

更に検討したところ、再生履歴の管理プログラムの再生履歴のデータをどのように格納・管理するかが問題になった。かなり多くの曲を再生し、それらが全部登録されるから、CSVのような普通のファイルでは処理が遅くなったり壊れたりして破綻しそうだ。

最初は、曲ごとに別々のファイルに再生履歴を格納することを考えたのだが、考えているうちに問題(この方式では一つのキー(= ファイル名)でしか高速な検索ができない)に気付いたり、(仕事でもないのに)いちから全部(例: ファイルフォーマット、作成・処理・管理)自分で作るのは馬鹿らしい気がして来た。それで、まずは近い用途の既存のプログラム(音楽などの管理プログラム)を使って手を抜くことを考えた。重要なことは、外部から(GUIでなくコマンドラインで)データの追加・変更ができることと、カスタムフィールドが追加できることだ。

以下に検討した候補の概要と結果を示す。

  • 音楽管理ソフト
    • × gmusicbrowser: 音楽プレーヤー
      • 現在、音楽ファイルの管理と再生に使っており、カスタマイズ(改造)もしている。
      • 曲情報を格納するファイルが一つ(CSVのようなもの)なので、曲数が多くなると破綻する。
      • 将来性が疑問(開発・サポートが終わっている)。
      • Perlで書かれているので改造や保守が大変。
    • Beets: 音楽管理ソフト
      • 試用の結果、使用可能なことが分かった。ただし、若干の細工(ダミーファイルをインポートするなど)が要る。
      • GUIはなく、コマンドラインのみ(webは貧弱)。
      • 拡張性が高い。
      • まだ完成していない感じ。
      • Pythonで書かれているので(以下略)。
  • 汎用コレクション・ライブラリ管理ソフト
    • × GCstar: 汎用コレクション管理ソフト
      • Perlのバージョンの問題か、うまく動作しなかったので却下した。
    • × Data Crow: 汎用メディア管理ソフト
      • コマンドラインでの実行はできなさそうなので却下した。
      • Javaで書かれている。。。
    • × BiblioteQ: 汎用ライブラリ管理ソフト
      • Linux用パッケージが壊れているので却下した。
      • ドキュメントが貧弱。
      • コマンドラインはなさそう。
    • × Tellico: 汎用コレクション管理ソフト
      • コマンドラインでは書籍しか登録できないので却下した。
  • その他
    • × tinyMediaManager: 映画の管理ソフト
      • 既に動画ファイル・DVDなどの管理に使っている。
      • ほぼ動画専用(映画の管理に特化した機能が多い)
      • この用途には若干の細工(ダミーファイルをインポートするなど)が要る。
      • コマンドラインは不明。
      • エントリ追加後の再スキャンが面倒。
    • calibre: 電子書籍管理ソフト
      • 既に電子書籍の管理に使っている。
      • コマンドラインでの操作が可能。
      • 試用の結果、使用可能なことが分かった。
        • ただし、音楽を書籍として扱うのは無理があるのと、ちょっとした問題(GUIが起動していないと、コマンドラインでの登録時に無駄な待ちが生じて遅い)がある。

試行錯誤して、Beetsとcalibreで再生履歴の管理ができそうなことが確認できたのだが、結局、実質的にはそれらの主たる機能でなく、DBの機能を(うまく誤魔化しながら)使っていることに気付いた。DB以外にGUIが使いやすければ便利だが、calibreは音楽は目的外なので最適化できず、BeetsにはGUIはない。

calibreを用いた音楽再生履歴の管理(プロトタイプ)

そこで、だましだまし他用途のアプリを使うのでなく、直接、DBと管理ソフトを使うことを考えた。ただ、(特にコマンドラインで)DBを直接操作するのは面倒な(そんなことが目的じゃないので、やってられない)ので、「ぱぱっ」と使えるものを探した。それほど詳しく調べていないのだが、多くは基本的にはSQLを自分で打ち込んで操作するもの(詳しい人用?)のようだったが、DB Browser for SQLite(以下、DB Browser)だけは簡単に使えそうな感じだったので、試してみた。

すると、確かにすごく簡単にDBを作成・操作できて、すぐに試用・評価が始められた。これはすごく推奨できる(対象者はとても限られるがw)。DBはSQLiteなので、当然、(GUIでなく)コマンドラインでの操作も可能だ。SQLiteはDBのファイルが単一なのが気になるが、DB用に処理を最適化しているはずだから、曲数が多くなっても破綻しないことが期待できる(実際に使用例は多い)。

DB Browser for SQLiteを用いた音楽再生履歴の管理(プロトタイプ)

ただ、calibreのGUIの手軽さは捨て難かった。しかし、この用途では、できればアルバム中の曲をまとめて扱いたい。例えば、感想を曲ごとだけでなく、アルバム全体にも付けられるようにしたい※。それはcalibreではどうしても無理だった(複数の本に共通するコメントが付けられないため)。逆に、DBを使えばできそうな気がした。

※これは、クラシック音楽の楽章(= 各トラック= 上記の「曲」)ごとでなく、曲(全部の楽章)全体に対して感想を書きたいからなのだが、良く考えると、アルバムには複数の曲が入っていることが多いから、アルバム全体に感想を付けるのも最適ではなく、任意の曲をまとめて扱える方がいいようだ。管理や操作が煩雑になりそうだが、DBを使うのであれば、アルバム全体の感想と同様に実現できる。ただ、そこまで凝らなくてもいい気もする。

実際に試してみたら、ちょっと苦労したもののできた。DBの「テーブル」というものを2つ作り、片方には曲(トラック)の、もう片方にはアルバムの情報を格納し、双方を結びつける情報(例: 「アルバムID」)を両方のテーブルに格納しておき、SQLでそれらを統合すればいい。図示するのが難しいが、統合の例として、トラック情報のテーブルアルバム情報のテーブルの中で同じアルバムIDを持つものを同じアルバムとし、同じアルバム中の各曲にアルバムのコメントを追加し、主要な情報だけを出力した場合を以下に示す。

両方のテーブルにアルバムID(図中の"album_id")を格納し、それを用いて同じアルバム中の曲を抽出できる※。アルバムID以外に双方で重複する情報は格納されていない。

※書いていて気付いたのだが、このデータ構造は、ある曲(トラック)が複数のアルバムに含まれることを想定していないので、もう少し検討が要りそうだ。やっぱり、アルバム単位での処理をしないほうが現実的なのかも知れない。

この処理のためのSQLは以下のようになった。

select t.title, a.album_artist, a.album_title, t.disc, t.track,
t.rating, a.album_comment, t.comment
from album a, trk_info_hist t
where t.album_id = a.album_id
order by t.album_id, a.album_title, disc, track;

DB BrowserのGUIは、機能は充分だが見た目や使い勝手は「まあまあ」で、calibreには劣る。が、この画面を使うのは管理とか保守の場合だけ(Spotifyの曲の検索画面は別途作る必要がある)と思われるから、これでいいのかも知れない。ただ、上に書いたように、実際にはアルバム全体のコメントは最適でないとか不要な気もして来たので、もう少し考えてみたい。

→ 考えたところ、以下のようにすれば良さそうだ。

  • 「演奏」ごとに「演奏ID」を割り当てる。
    • 演奏IDは同じ演奏なら同じ値にする。
      • 「同じ演奏」とは、例えばクラシック音楽なら一曲(全部の楽章)である。ポップ音楽の場合は曲ごとに別々にしたり、アルバム全体で一つにすることが考えられる。
  • 演奏IDの値は演奏ごとにユニーク(異なる)であれば何でも良い。
    • 例えば、一組の演奏を構成する曲(トラック)の最初の曲IDとする。
      • 今は、曲IDにはISRCを使おうとしている。
  • トラック情報テーブルで、曲ごとに演奏IDを格納する。
  • 演奏全体に対する感想などは、例えば、以下のいずれかのように格納する。
    • その演奏の最初のトラックに格納することにし、データ抽出時あるいは使用時に、それを演奏全体に対するものとして扱うようにする。: この場合、最初のトラックへの感想と全体への感想の区別ができない。
    • 「演奏テーブル」を作り、そこに演奏全体に対する感想などを格納するようにする。

上記の「演奏テーブル」を作らない場合のようにすればアルバム(または演奏)ごとの管理が不要にできるので、トラック情報テーブルだけで良くなる(「演奏テーブル」を作れば、より「正しく」かつデータ量の点で効率的になるが、管理が煩雑になる)。

なお、効率の点ではDB Browser(とsqlite3コマンド)を使うのが一番良かった。速度もデータサイズも最短・最小だった。ちなみに、calibreもBeetsも、内部ではSQLiteを使用している。calibreはデータサイズが大きく、速度も遅い。

DB BrowserでcalibreのDBを見てみたら、やたらにテーブルが多くて無駄に複雑な気がした。それでデータサイズが大きくなっているようだ。その点ではDB Browserを使うのがいい感じだ。ただ、calibreにもいい点はある(例: 機能が豊富: とはいえ、それが今回の用途には余り有効でない)ので、判断が難しい。

さらっと書いて来たが、題で触れたように、僕はDB(RDB= リレーショナルDB)やSQLが大嫌い・大の苦手で、ずっと避けて来た。というのは、RDBはセンスが悪い(≒ クソ)※と思うことと、SQLの構文がクソ(昔は全部大文字だったし、いつも、「"select"とか"where"とか何なんだ!」って思う)だからだ。仕事で必要な場合は仕方なく使ったが、自分から使おうと思ったことはない。しかし、さすがにDBが必要な・適する用途が出て来たので、使う羽目になりそうだ。

※大昔、RDBは表形式(Excelみたいな感じ)でデータを格納(正確には関連付ける?)することを最初に知った時、どうもおかしい(「は? そんなんでいいの? それが"DB"??」、「古臭い!」)し、分かりにくいと思った。一方、(近頃流行りらしいNoSQL DBの一つの)Key-Value型(あるいは連想配列)のデータ格納方式は分かりやすいから大好きで、昔から愛用していた(自分でも、何度も簡単な仕組みを作った)。だから、今だったらNoSQLなら馴染み易いのかも知れない(でも、実際に調べると訳の分からないことが多そうだ)w

更に全くの余談を書くと、その「大昔」に、いくつかの選択肢があった(確か、他はWordとExcelだったか・・・)中でRDB(製品名は全く分からない: dBase3?)を選ばなかったら、上記のような ほんの基礎的な知識すらなかったので、その時に「今までやったことがないから」選んだのは正解だったと言える。

それから、そもそも、これからSpotifyで新規の曲(演奏)をどのくらい再生するのかも気になっている。もうそれほど多くの新規の曲(演奏)がSpotifyに入らない・再生しないのであれば、手間を掛けて作る価値は少ない。ただ、Spotify用以外にも、自分の感想の記録にはなるから、その点では価値はありそうだ(その時には過去の記録を引っ張り出して転記する作業が必要で、それはそれで大変だし、自動化などできないw)。

  •   0
  •   0

コメントを書く

名前    

メール 

URL