エキスパート向け

Jpsonicのスキャンの特徴

Jpsonicのスキャンの特徴に関する記事です。

要点としては「Subsonic APIの設計思想は概ね変えないよ」といったところだと思います。Subsonic API互換とうたいつつ別の動きをするフェイクサーバは少なからずあるのですが、Jpsonicではそのような方向性に舵を切ることはありません。ただ「オリジナルのSubsonicと全く同じ動きをするの?」かといえば、必ずしもそうではありません。

  • レガシーサーバには厳密にいえば「バグや実装不備の結果その動きをしている」といったものもあります。そういった箇所は修正されます。主にレアケースが多いため普通の使い方で使用感に影響することは少ないかもしれませんが
  • ジャンルでアルバムをサマリする辺りの機能は少々珍しい仕様をしています。こういった部分は一般的なジャンル機能を作りましょう、といった修正が今後あるとは思います。そういった場合でもオプションで切り替え式になり旧動作が温存されます

この記事の内容は大きく2つのセクションに分けられます。

Season 1
おもにパーサに関する仕様がまとめられています。一般的な仕様のお話です
Season 2
普通に使う分にはあまり必要のない、内部的なお話、現在進行中の取り組みに関する駄文です。これからどうなる的なお話

Subsonic系サーバのスキャン

Subsonic直系のJavaサーバには以下のような分かりやすい特徴があります。これらはなくならないどころか改善対象でしょう。

  • フォルダとタグが扱える
  • 索引が使用できる
  • データベースとは別に強力な検索エンジンを持っている

メディアサーバに限らず、大規模なブラウジングや検索を行うシステムでは、しばしば「結果の欠落を起こさないこと」が要件に入ります。Subsonicはもともと、多少タグが乱れていてもブラウジングや検索で欠落が起にくいデータ仕様を持っています。Jpsonicでは読み(ソートタグ)のクレンジングや補完機能の追加、検索の日本語対応を行い、バニラSubsonicの弱点である日本語使用時の情報欠落を克服しています。メディアサーバにとってストリーミング機能の次に核となる機能であるためです。

Airsonicの検索はJpsonicの検索を当時の仕様に合わせ英語版に移植したものです。スキャンはJpsonicで再設計されているため、メタ処理に関してはかなり内製化が進んでいるといえます。日本のエンジニアは海外の開発に参加すべきだという論調もありますけれども、それはそれ。リスクヘッジも重要です。

Season 1 : パーサの改善

JpsonicのスキャンはSubsonicとほぼ同じ使い方ですが、細部の仕様の明確化、バージョンアップ、バグ改修が行われています。

一方でSubsonicを特徴づけているいくつかの固有の解析仕様(タグ値に不備があるケースの処理等)には手は加えられていません。Subsonicのデータ仕様は目的に沿った一方式として既に確立されたものと想定し、データのリレーションの仕様等はまずは現状維持、という考え方を基本としています。

ゴールデンスタンダードのSubsonicとしての仕様は概ね維持しつつ、緩やかに補強をしていきましょう、というスタンスです。

Jpsonicのタグ解析の方針

Jpsonicが重視するタグ仕様にはお手本にしている仕様があります。これらに合わせて変更が行われる可能性がありますが、私の好みや気まぐれで何かを追加することはありません。

Jpsonicが重視するタグ仕様
Microsoftや、SONYが出しているWindows向け音楽管理アプリ。
Appleが出しているWindows向け音楽管理アプリ。
大手のネット楽曲販売サービスから購入した楽曲データ(参考程度)。
SONY/Appleのアプリを参考にする理由
  • 日本という商圏で顧客から高い支持を得ているブランドだから。多くのユーザの期待水準になるから
  • PCもスマホも作っていてオールインワンを実現できているブランドだから
  • あらゆるプラットフォームにおいて仕様の一貫性を保つはずだから
  • 系列に音楽配信サービス会社を持っていて楽曲管理に投資している企業のプロダクトだから
  • 両社のタグ仕様は似ているから(あくまで項目単位で比較した場合)
  • SONY製品はGracenoteの新仕様への対応が早いから
オープンソースのソフトウェアを参考にしない理由
  • 過剰なタグ解析の追加はサーバ性能の劣化を招き、多くの使用者にとってデメリットになるおそれがあるから
  • クライアントマシン内の閉じた楽曲管理や、過度な拡張性がコンセプトのソフトの仕様は参考にならないから
  • ここ数十年、一般的なプロプライエタリのプロダクトで扱われる楽曲情報のモデルデザインにほぼ変化がないから
  • 少しずつ移り変わるタグの記法の基準石を定めるなら、ベンダー仕様の方が妥当性が高いから
iTunesは注意が必要

iTunes Windows版の4.1.0.52 (2003) から 12.9.6.3(2019) のMP3のみ検証対象としています。これは救済策であり、積極的にiTunesを推奨しているわけではありません。Appleはハードからソフト、ケーブルに至るまで、ほぼ全てのプロダクトにおいて自社規格を優先します。もちろん楽曲フォーマットやタグ仕様も例外ではありません。トラブルを避けたいのであれば選択肢から外すのが早いです(タグバージョンのコンバートで日本語が破壊される等iTunes内でさえ整合性がとれていない実装が存在する、SafariのようにいつWindowsから撤退するかわからない)。

ネットワークオーディオを構成する要素はたくさんあります(NAS、サーバソフト、PC、スマホ、OS、プレイヤ、ヘッドホン、スピーカ、等々)。大規模ライブラリを長期管理する場合、その中で最もライフサイクルが長いのは音楽ファイルです。他のパーツに比べ、音楽フォーマットやタグの方針転換には手間がかかります。実は最も汎用性に注意べきパーツでもあります。

マスターデータはFLACを、Gracenoteを使用できるMusic Center for PC(あるいはそれに準ずるソフトの併用)で編集を行うのが無難です。若い方はご存じないかもしれませんが、CDはSONYとフィリップスの共同開発、Gracenoteは一時期SONY傘下でした。リーディングカンパニーであるSONYの仕様に合わせれば、長期的には大きく道を踏み外すことはないでしょう。仮に次世代のフォーマットが出ればコンバータが提供される可能性も高いです(過去にその種のパッチが提供されたことはある)。

ちなみに、昨今の高音質のスマホというカテゴリに、残念ながらiPhone は入りにくい状況です。ベンダーロックインを好まないのであればApple仕様を避けるというのも合理的な方法です。

対応フォーマット

設定ページで追加すれば、どのフォーマットでも読み込み可能です。ただし解析が行われるファイル形式は決まっています。

スキャン対象(デフォルト) mp3 ogg oga m4a m4b flac wav wma aif aiff aifc dsf dff ape shn mka opus aac
解析可能 mp3 ogg oga m4a m4b flac wav wma aif aiff aifc dsf dff
レガシーサーバとの違い
  • Jpsonicでは解析可能なファイル形式が増えています
  • レガシーサーバでは、表中の「doubt」を読み込む場合不具合によりエラーが発生します
extension Scan target

(Default)
parsable
Airsonic Jpsonic
mp3 Y Y Y
ogg Y Y Y
oga Y Y
m4a Y Y Y
m4b Y Y Y
flac Y Y Y
wav Y Y Y
wma Y Y Y
aif Y Y
aiff Y Y
ape Y
shn Y
mka Y
opus Y
aac Y Y(doubt)
mpc Y Y(doubt)
mp+ Y(doubt)
ape Y(doubt)
aifc Y
dsf Y
dff Y

マスターデータの対応フォーマットを増やせば幸せになれるかというとそういうものでもありません。マスターデータとして好ましいフォーマットと、プレイヤーに求められる再生可能フォーマットは別のものです。この分野のソフトウェアや機器がサポートするフォーマットのデファクトスタンダードは「可逆Flac/非可逆Mp3」です。今後の追加パーサ候補はOpusやAACあたりにはなりますが必要性は高くありません。AACはしばしばMP3との比較で語られますが、本来の比較対象は今は亡きATRACです(世情を反映して今世紀初頭に乱立したDRMつき非可逆フォーマットのひとつ。不便な上に無意味なためこのカテゴリーはほぼすべてが滅びた。)マスターデータとしては向かないので、どちらかといえば他の形式にコンバートすることをお勧めします。パフォーマンスを考慮しffprove経由の解析は今後もしません。

楽曲フォーマットとは少し離れますが、プレイリストのフォーマットとして今後もCUEシートはサポートされません。ちなみにMusic Center for PCの仕様にも非対応と明記されています。機器互換が取りづらくグローバルな仕様にはなりにくいと思います。

楽曲ファイルのタグマッピング

OSSソフトウェアでは各種タグ仕様に準じた拡張が行われることがあります。独自の拡張を加えられることがOSSの利点とも言えますが、一般的な音楽プレイヤーや音楽機器、他ソフトとの連携も重要な視点です。実際のところ実用レンジは存在します。

対応タグ一覧

Jpsonicではスキャン時に以下のタグが使用され、デーベースに転記されます。また後続処理でカバーアートが利用されます。

タグ名 Subsonic Jpsonic Music Center (SONY) itunes (APPLE)
タイトル
タイトル(読み)
アーティスト
アーティスト(読み)
アルバム
アルバム(読み)
アルバムアーティスト
アルバムアーティスト(読み)
ジャンル
リリース年
作曲者
作曲者(読み)
曲番号
ディスク番号
楽曲ファイルのタグ仕様詳細

基本的にはJAudiotaggerのタグマッピング表と同じになります。ただしドキュメントにはWMA形式の「作曲者の読み」のキーに誤りがあるようです(Jpsonicは実装にあわせているため、以下の表が正解になります)

extension mp3, aif, aiff, aifc, dsf, (wav) m4a, m4b flac, ogg, oga wma
Attribute ID3v22 ID3v23 ID3v24 Mp4 VorbisComment Wma
Title TITLE TIT2 TIT2 ©nam TITLE Title
Title Sort Order TITLE_SORT TSOT TSOT sonm TITLESORT WM/TitleSortOrder
Artist ARTIST TPE1 TPE1 ©ART ARTIST Author
Artist Sort Order ARTIST_SORT TSOP TSOP soar ARTISTSORT WM/ArtistSortOrder
Album ALBUM TALB TALB ©alb ALBUM WM/AlbumTitle
Album Sort Order ALBUM_SORT TSOA TSOA soal ALBUMSORT WM/AlbumSortOrder
Album Artist ALBUM_ARTIST TPE2 TPE2 aART ALBUMARTIST WM/AlbumArtist
Album Artist Sort Order ALBUM_ARTIST_SORT TSO2 TSO2 soaa ALBUMARTISTSORT WM/AlbumArtistSortOrder
Genre GENRE TCON TCON ©gen GENRE WM/Genre
Date YEAR TYER+TDAT TDRC ©day DATE WM/Year
Composer COMPOSER TCOM TCOM ©wrt COMPOSER WM/Composer
Composer Sort Order COMPOSER_SORT TSOC TSOC soco COMPOSERSORT WM/ComposerSortOrder
Track Number TRACK TRCK TRCK trkn TRACKNUMBER WM/TrackNumber
Disc Number DISC_NO TPOS TPOS disk DISCNUMBER WM/PartOfSet
MusicBrainz Track Id MUSICBRAINZ_RECORDING_ID UFID:http://musicbrainz.org UFID:http://musicbrainz.org
—-:com.apple.iTunes:MusicBrainz Track Id
MUSICBRAINZ_TRACKID MusicBrainz/Track Id
MusicBrainz Original Release Id
MUSICBRAINZ_ORIGINAL_RELEASE_ID
TXXX:MusicBrainz Original Album Id
TXXX:MusicBrainz Original Album Id
—-:com.apple.iTunes:MusicBrainz Album Id
MUSICBRAINZ_ORIGINALALBUMID MusicBrainz/Album Id

MusicBrainz IdはAirsonicで追加されましたがJpsonicではこれを利用する予定はありません。YAGNI

一方その頃Gracenoteでは・・・

Gracenoteではしばしばガイドラインが示されます。時期によって内容は異なりますが。現在Gracenoteで必須扱いをされているのは、以下の5項目だけです。

  • アーティスト名
  • アルバム名
  • 楽曲名
  • ジャンル
  • 発売年

Gracenoteの表記法には、タイトルの後に[Disc #]を加えるルール等やキャメルケース必須の項目等、いくつかの追加ルールが示されています。あらゆるデバイスの互換性を考慮しつつ、情報をユーザに認識しやすくさせるための最小ルールになるでしょう。

アーティスト画像は?

アーティスト画像に関する全処理層に設計不備が存在していたためWebページからは外しています。優先度は高くありませんが徐々に修正されています。いつかはWebページにも復活するでしょう。ただし設計上は音楽を管理するための機能と全くの無関係であり、いわゆる「魅力的品質」にあたるものです。コア機能の修正よりも優先されることはありません。UPnPのアーティスト画像は改善が終了しています。

安易な拡張は行われない

iTunesやMusicBrainzのスキーマはとにかく正規化をして情報の解像度を上げる思想です。現状Jpsonicで使用されるタグは概ねSONYよりで、それを超えた余分な部分はカットしています。

色鉛筆で例えると100色セットを使うか12色セットを使うかのような話です。ほとんどの方は12色セットで足りると思います。レアケースのために本当に100色セットの色鉛筆が必要かといいますと。むしろイラストの技術がある方は12色セットで一般人の予想以上のクオリティを出したりもします。おそらく色鉛筆の本数が優劣の決め手になっているわけではないのかと。

Gracenoteのガイドラインは常用する項目を、より少なく想定しているようです。その代わり独特な記法を提示しています。100色セットの色鉛筆を好む方はGracenoteのようなルールに反感を覚えるかもしれません。ですが、Gracenoteが提示しているのは、既存のウェアラブルデバイスやカーオーディオの液晶画面で良好な視認性が確保でき、音声読み上げとの親和性も高められるような最先端の実用仕様だったりします。DBの設計知識のある方は、過度な正規化がデメリットを伴うこともご存じかと思います。Gracenoteのガイドラインは、そういったアンチパターンを避けようとした例としてとらえることもできます。

どちらが賢いという問題ではなく共存も可能ではあります。ただプロダクトの管理コストを考えますと、項目を足すよりも足してしまった後に方針を戻して項目を削る方が遥かに労力がかかります。今後タグ項目は増やさないというわけではありませんが慎重に検討されます。Windowsや、SONYが出しているWindows向け音楽管理アプリが試金石になります。

動画のタグマッピング

今のところffproveの実装次第というところですが、一番多く使われていそうなMP4 version1(QuickTime形式)は問題ありません。今後他のパーサが追加されたとしてもversion1はサポートされるでしょう。

動画ファイルのタグ仕様詳細
fields name space
artist dc:creator/xmpDM:artist
title dc:title
height tiff:ImageLength
width tiff:ImageWidth
album xmpDM:album
album artist xmpDM:albumArtist
composer xmpDM:composer
disc number xmpDM:discNumber
duration xmpDM:duration
genre xmpDM:genre
release date xmpDM:releaseDate
track number xmpDM:trackNumber

これ以外のもの、たとえば読みに関しては、現在検討中です。ffproveのタグ読み込みは強力ですが、互換性の低いフィールドまでffproveに盲従できません。ffproveがどういった仕様を根拠に読んでいるのかまだ完全に裏を取っていません。

読みの補完処理

索引・検索・ソート等の日本語を扱う全機能の精度を同時に底上げするため、内部的に読みのデータが補完される場合があります。この処理により元の音楽ファイルが編集されることはありません。またダーティデータ対策であるため、もし元々のタグデータが完璧である場合、補完処理は一切行われません。

名称に対して読みはひとつという状態をキープする為、場合によってはスキャン中に以下の追加処理が実行されます。

詳細
読みの重複の解消 ライブラリ内すべての人名(アルバム、アーティスト、作曲家)に対応する「読み」をマージする。このときの優先度はファイルの更新日、アルバムアーティスト、アーティスト、作曲者。ユーザの累積修正で意図が反映されやすい順位であり、新たなデータがライブラリに追加された場合、読みは後勝ちで共通化。元データが元々全て統一されていれば何も問題ありません。
読みの欠落の解消 重複の解消後に読みが欠落しているデータが存在する場合(null/そもそもソートタグがない)、他のデータからコピー可能であればコピーする
読みの解析 重複と欠落を解消後にまだ欠落が存在する場合はタグだけで解決不可能なケースであるため、名称が日本語の場合日本語エンジンで読みの解析を行う
一般的な辞書範囲で解析が行われるため、正答率は9割を超える程度です。この精度を上げるため追加辞書を積んだり外部サービスに接続に行くのは、良い設計ではありません。将来的にもJpsonicにその機能が搭載されることはありません。

楽曲管理の世界では、そのような役割は既にCDDBが担っています。Music Center for PCのようにGracenoteから任意でデータを引き直せるアプリを利用するか、(滅多にありませんが)データが引けない場合手動でタグを編集してください。

開発時には「Flacが登場した頃からCDDBを利用してリッピングされたデータ」を5000曲前後ピックアップし想定データとして使用しています。現在はデータの誤入力が比較的減りつつありますが、昔にリッピングしたままの曲をお持ちの方も多いでしょう。こういったデータがそれなりに並んで検索できるという仕様になっています。もちろんどうしても無理な部分は確認してタグ修正が必要になりますが、初動の負担をかなり減らすことができるというメリットがあります。

Season 2 : スキャンフローの改善

v111.6.0からv112.0.0にかけて、スキャンフローの大幅な変更が行われています。ここまで着手が遅れたのは、スキャンの内部で行われる全ての処理をノーバグにし例外設計を書き換える必要があったためです。サービスインしているレガシーサーバの改修はしばしば新規開発と手順が逆になります。

なおこれ以降の文章は、メディアサーバが使えればいい、という方には長文の割に有益な情報ではないかもしれません。プログラミング初級者か、あるいは経験がなくても読んでみようというアグレッシブな方向けの内容になります。

スキャン関連の機能は、バグ修正をしたり新規機能の追加はこれ以上難しくなっているので、ワークフロー設計を見直します、というお話です。ユーザ的にはすぐに恩恵が連想できないので何のことやらかもしれません。ワークフロー設計慣れしていれば、あーこうなってるんなら、これからはあれもできちゃうしこれもできちゃうね、というお話になります。

SubsonicとJpsonicのスキャンフローの違い

少しだけデータベースの話が出てきますが、あまり複雑にならない程度にざっくりとした説明をします。旧来のスキャンは大筋以下のような仕組みになっています。

Subsonicのスキャンフロー
ルートディレクトリ(ミュージックディレクトリ)からfor文でディレクトリ構造を読む再帰処理をしています。この時データベースの登録済みデータと実パスを比較し削除と追加、または以前のスキャン日よりも日付が新しい場合更新します。

APIでいうところのFile Structure、つまりフォルダブラウジングに使用されるレコードはmedia_fileというテーブルに1パス1レコードで格納されます。typeというフィールドがありここにはALBUMやMUDIC、VIDEOといったメディアの種別が登録されます。アーティスト/アルバム/曲はディレクトリの階層数で判定されているわけではありません。ディレクトリの場合、子にスキャン対象のメディアファイルが存在するかどうかで決定されます。メディアファイルを持っていればアルバム。


新規スキャンの場合ディレクトリやファイルに遭遇する度に、File StructureとID3の解析/登録が行われることになります。アルバムの場合、ディレクトリの最初の子ファイルのタグからアルバムアーティストやアルバム名を転用します。

  • 「media_file」にはファイルパス/親パス、種別、タグなど、ライブラリに関するほぼ全ての情報が格納されています
  • 「artist」「album」はID3のタグデータです
  • File StructureとID3は異なるツリー構造を持ちます。File Structureはパス構造、ID3はタグ値のリレーションです

一見つじつまが合いそうですが、旧来の設計には無理がある箇所がいくつかあります。実際SubsonicやAirsonicでは過去にデータグリッチの報告がいくつかありましたが、好ましくない挙動が複合発生している状況の再現は困難だったりもします。「ここ修正したらここが良くなる!」というバグ修正は簡単ですが、設計品質を向上してからでないと潰しにくい問題も多々あります。

過去のスキャンの問題点の例
アルバムで誤解析が発生する場合がある File Structureのアルバム解析時にファイルリストの最初の子を利用しますが、ファイルの順序はプラットフォーム依存です。例えばWindows ServerとUbubtsでは動作が異なります。ディレクトリ内のファイルのいくつかのタグ(アルバムアーティスト、アルバム名、ジャンル、年等)に共通の値が登録されている場合には問題がありませんが、そうでない場合問題になる場合があります
アルバムが更新されない場合がある ファイルシステム上でファイルの日付を更新した際に、その親ディレクトリが連動して変更されるかどうか、というのはプラットフォーム依存です(Linuxではディストリビューション、Windowsサーバもバージョンによって異なる)。パフォーマンス重視のOSではディレクトリの日付とファイルの日付は独立管理である場合があります。この挙動を切り替えることができるOSも存在しますが、クラウドストレージでは不可能です。パス構造の上位から更新日チェックを行うと誤動作するケースが存在します。(この場合touchコマンドを実行してIgnore timestampを有効にするというのがレガシーサーバでの対処方法。つまり既に認識されていて未着の問題)
重複データの処理が曖昧 ID3のツリーはタグ値のリレーションですが、同値のタグがライブラリに散在するケースも考慮する必要があります。レガシーサーバではこれを解決するため、既に登録済みのデータが存在する場合云々という処理が存在します。これに類する処理がいくつかありデータの登録ロジックは非常に見通しが悪いものになっています。データグリッチの報告があっても原因特定の障壁になる、パフォーマンス低下を引き起こす、並列化/部分スキャンの障壁になるなどの問題があります
統計情報の更新が煩雑 アーティスト/アルバム/曲数やジャンルといったいくつかの情報は、スキャン中に共通のカウンタをインクリメントするという方式で計算されています。部分スキャンの障壁になります
部分最適が行いにくい 旧来の実装は「コード量が少なくて済む」「適当に書いてもそれなりに動く」といったメリットがあります。プロトタイプに適していますが、高品質化や長期開発に適していません。異なる特性を持つ処理ブロックごとにソースコードが細分化されていれば、区間計測や部分最適が容易になります。区間計測が容易な場合、同一バージョンを異なるプラットフォーム間で動作比較したり、異なるJDK間で比較したり、特定の処理ブロックを全く別の処理に交換したりといったことがしやすくなります。
その他 なんでここでこんなことしてるの?みたいな処理はいくつかあります。拡張性の低い設計に「問題があれば追記する」という改修が累積されているため

これらを解決するためJpsonicのスキャンフローは大幅に変更されています。要するに処理を細分化し処理ブロックの順序を変え、随時更新と差分更新を分け、重複判定はSQLのフェッチで行い、統計情報はインクリメンタルでなく処理の最後に集約すればよいです。これらを旧来の処理ベースに修正するのはさすがに無理があるので、フロー全体を見直すべきでしょう。

Jpsonicのスキャンフロー

おおまかな流れは以下のように。

  1. ルートディレクトリ(ミュージックディレクトリ)からfor文でディレクトリ構造を読む再帰処理は変わりません。ただし初期段階では、ディレクトリ/動画の仮登録と音楽ファイルのパースのみ行われます
  2. 1が完了したら動画の解析が行われます。音楽と動画のパースを分けるのは負荷が異なるためです。音楽の場合仕様により差異があるもののバイナリ内でのタグの保存位置は決まっています。動画は追記前提構造のためタグ位置が不定であり解析負荷は高めです。また外部コマンド(ffprove)です。速度改善がやや特殊になるため音楽ファイルと分けています
  3. File StructureのデータのClean-up。この工程までにIOを伴うスキャンは完了します。以降SQLガン回しになります
  4. File Structureのアルバム解析。JpsonicとSubsonicでは解析順序が逆転しており、アルバムは子のパースより後です。(この順序だとフェッチにトラックナンバーが使用できる)
  5. 必要であればFile Structureのデータのソートキーを更新。この工程まででFile Structureのデータ更新は完了しています
  6. ID3のアルバムを差分更新
  7. ID3のアーティストを差分更新
  8. 統計情報やジャンルマスターを更新

設定画面 : 高度な設定に解説のあるログオプションを有効にすることで、工程ごとのログを閲覧可能です。

ロック実装の違い

Jpsonicのロック機構はより堅牢な実装に変更されています。

  • スキャンの2重実行はできません。レガシーサーバに存在していた高速アクセスモードは除去されており、専用のスキャンスレッド以外ではスキャンが実行されないようになっています
  • スキャンのロックは内部で他処理と共有されています。同時に取得できるロックはひとつのみです。スキャンの実行中に同時実行すべきでない処理は相互に同時実行できない仕組みになっています。たとえばスキャンの実行中にPodcastのダウンロードが始まることはありません。実装上並列プログラミングが実現可能であっても、ディスクアクセスはシーケンシャルです。IO負荷や整合性を考慮し重要機能は全て直列で実行されます。並列処理設計はそれらの各機能毎に行われます
  • スキャンの実行中に致命的なエラー(ネットワーク断線している場合など)が発生した場合、即座に停止するようになっています。原因はログファイルの最後に記録されているでしょう。この場合ロックは自動解除されません。これは現状保存のための意図的なデッドロックであり、スキャンがエラー停止した後に、後追いで別のスキャンが実行されることを防いでいます。スキャンと同時実行すべきでない機能もすべて使用不可能になります。サーバ再起動をすることで解除が可能です

パフォーマンスに関する考え方

今後順次改善が行われるでしょう。

工程ごとのログを閲覧すると分かりますが、区間測定が非常に容易になっています。Jpsonicは他のSubsonic系サーバと異なり、日本語処理や読みの補正、完全なプラットフォーム互換を実現しています。複雑化する一方、SQL発行数はレガシーサーバよりも少ない傾向にあります。ソースコードを短かくすれば速く動くわけではありません。適切な改善で高速化が可能でしょう。

メタ処理に関しては日本語処理は超絶グローバル対応の一歩手前に近く、英語特化のプロダクトよりも多言語対応型に近くなるという優位点があります。また最近のスマホはハード・ソフト両面でスクリーンリーダが性能向上しているため、メディアサーバ側の機能改善でユーザビリティを向上できます。Jpsonicは他サーバよりも目指しているゴールが高いです。

処理を削って速くするのはイージーですが、安易に難しいことを避け続けると発展が阻害されます。結果的に要件として到達点が低くなり20年前30年前に回帰するのは不毛です。Jpsonicは現在のフル要件のまま速く動かす改善を行う方針です。

パフォーマンス改善は、やみくもに行っても仕方がありません。そのため想定環境としてDS220+が使用される予定です。これに関する記事はまた別の機会に。

  • 全ての改善を同時に行うわけではなく、優先度の高い順に改修が行われて行きます
  • 並列化も部分的に行われて行きます。ブン回すだけが必ずしも最適解ではないので検証が優先されます
  • 工程ごとに個別のリファクタリングを行うような部分最適とは別に、スキャンの一部の処理を全く別のロジックへ交換することが容易になっています。場合によっては並列化より速いです
    • いうまでもなくファイルの走査が最も時間がかかるのですが、その部分を特定ディレクトリのみのスキャンに変更し、後続処理は丸々同じものを再利用するということが既に可能になっています(というよりタグ編集のような機能は本来そのような設計になっている必要があります)。レガシーサーバではそのようなことはできません。内部的に部分スキャンが実装されることは確実ですが、UIを追加すればアップロード機能を改善したりもできるでしょう
    • スキャンのモードを切り替えることによって、更新を行わず、新規追加と削除のみを行うようなロジックを作成することも可能です。効果測定して有効であればそのような機能が追加されるかも知れません。タグ編集を滅多に行わない場合、そちらの方が速い可能性があります

ただしソフトウェア開発では常に正しく動かすことが最優先され、次に検証、次に速度改善という優先度で行われます。まともに動かないものを速くすることに全く意味はありません。

Jpsonic全体で見ると、現状Podcastの機能が非常に弱いです。もともと問題の多い部分でありましたが、近年ではURL直で扱う機会は減りクラウドでの検索が主流になっているため機能全体が陳腐化しています。スキャンの速度改善に関しては、次のバージョンでいくつか並列化オプションが提供されますが、次の次のバージョンからPodcastの全改修が優先される予定です。なぜここまでPodcastの改修が放置され、またサポートするサーバが少ないのか。割と明白で、スキャンを設計できる人でなければPodcastをガチ管理する設計ができないからです。形式上レビューを行っているプロジェクトではそういった人材が複数人必要になります。

逆にPodcastまで改修が終われば、スキャンに関する問題点は大部分がフラットに戻せます。パフォーマンス改善に関して部分最適が以前より容易になったことは確実ですが、それら全てが直近最優先で行われるというわけではない、ということです。ただし並行作業可能なので、三度の飯よりチューニング好きという方はプルリクしてください。

更新履歴

この記事を書き換えたときに以下に追記します。

v112.0.0
設定画面 : 音楽フォルダから「スキャンの仕様」を移動
設定画面 : 音楽フォルダ#拡張子とショートカットから「レガシーサーバとの違い」を移動
設定画面 : 音楽フォルダ#拡張子とショートカットから「タグマッピング」を移動
コメントはまだありません

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

エキスパート向け
MusicBeeとの連携について

MusicBeeと連携し、Jpsonicのクライアントとして利用する方法についてです。