音楽ウェブ全体のための一つのインターフェース
音楽のウェブは、多くの独立したサイトにまたがって断片化しています。Bandcamp は FLAC と Creative Commons ライセンスを売り、SoundCloud は誰も他にホストしていないリミックスをストリーミングし、SomaFM はリスナー支援のラジオチャンネル群を運営し、そして多くのコミュニティ運営サイトで、プログレッシブ・ロック、ジャズ、クラシック、メタルのキュレーションされた百科事典が維持されています。各サイトは独自のマークアップ、独自の癖、そして「トラック」とは何かについての独自の考えを持っています。
私たちはその混沌を手なずける、小さく、焦点を絞った、オープンソースの Python クライアント群を維持しています。それらはすべて、精神においては同じことを行います。すなわち、音楽ソースに手を伸ばし、型付きメディアメタデータモデルを返してくれます — 壊れやすい辞書ではなく検証済みのオブジェクトを返すので、あなたのコードの残りの部分は、そのデータがどのサイトから来たのかを一切気にする必要がありません。九つのうち七つは PyPI で公開されており、残り二つは GitHub から直接インストールします。すべてが同じ語彙を話します。
さあ、案内を始めましょう。
ストリーミングとラジオ
py_bandcamp は Bandcamp をスクレイピングします。トラック、アルバム、アーティスト、レーベルを検索し、ジャンルタグで閲覧し、シードから推薦や関連アーティストを取得し、ストリーミング可能な MP3 の URL を抽出します。検索はタイトル、アートワーク、ジャンル、クレジットを伴った型付きの Release オブジェクトを返し、そして — FOSS 志向の人にとって決定的に重要なことに — is_open() チェック付きの SPDX 形式ライセンスフィールドを備えているので、Creative Commons のリリースと全権利留保のものを区別できます。完全忠実度のアルバム変換は、順序付けられたトラックリストをオンデマンドで埋めます。
nuvem_de_som は私たちの SoundCloud クライアントで、この一団のスイス・アーミーナイフです。三つの独立したバックエンド — メタデータが豊富な API バックエンド、依存関係のない HTML スクレイパー、そして yt-dlp バックエンド — が、一つから次へと優雅にフォールバックするオーケストレーターの背後に配置されています。トラックと人を検索し、直接ストリーム URL(プログレッシブまたは HLS)を解決し、トラックやプレイリスト全体をダウンロードし、さらにはコマンドラインから検索・再生するためのターミナルアプリ nds まで備えています。リリースはコーデック、ビットレート、ジャンル、国、SPDX ライセンス、そしてセットの完全なトラックリストとともに返ってきます。
radiosoma は SomaFM の公開チャンネル API をラップします。SomaFM はスペクトルの友好的でオープン API な端にあり、クライアントはそれをクリーンにモデル化します。各チャンネルは一つの作品であり、各ストリームエンコーディング — 130 kbps AAC、256 kbps MP3、64 と 32 kbps HE-AAC — はそのチャンネルの独自の Release になるので、消費者は最適なものを選び、アイデンティティで重複排除できます。最近再生されたトラックのフィードは、何が流れていたかの整然としたスケジュールとして現れます。
tunein は、世界の線形ラジオおよび IPTV 局向けの非公式 TuneIn クライアントです。高速パスは検索ペイロードだけを返し、オプトインの拡充呼び出しはジャンル、言語、国、コールサイン、スローガンを埋めます。TuneIn は局ごとに複数のストリーム URL — 異なるビットレート、ミラー、プロトコル — を返すため、それぞれが独自の Release になり、ここでも消費者が再生時に選べるようにしています。小さな CLI がテーブルまたは JSON 出力を提供します。
pyheartradio は iHeartRadio 公開 API と対話します — キーもアカウントも不要です。局、ポッドキャスト、アーティスト、トラック、プレイリストを検索し、直接オーディオストリーム URL 付きのポッドキャストエピソードを取得し、局とアーティストの検索が並行して実行されるように並列の詳細取得に頼ります。すべてのモデルは、型付きメタデータパイプラインにそのまま差し込むための to_external_ids() と to_signals() ヘルパーを提供します。
音楽百科事典とアーカイブ
この一団の後半は、偉大なコミュニティ・カタログを対象としています。
pyprogarchives(Prog Archives)、pyjazzmusicarchives(Jazz Music Archives) — どちらも PyPI ではなく、それぞれの GitHub リポジトリから直接インストールします — そして pyclassicalarchives(Classical Archives)は、ほぼ同一の形を共有しています。A–Z のインデックスを閲覧し、名前で検索し、経歴、国、そしてメンバー評価のディスコグラフィーを備えたアーティストまたは作曲家の完全なページを取得します。Prog と Jazz Archives は HTML をスクレイピングし、Classical Archives は公開 JSON API をラップして、作曲家のアルバムとともに再帰的に平坦化された作品ツリーを公開します。各モデルは to_external_ids_dict() を介してサイトの安定した正規 id を持ち、これはまさに一つのカタログを別のカタログと相互参照するために必要なものです。
pymetal は Encyclopaedia Metallum、すなわち Metal Archives 向けの私たちのクライアントであり、この組の中で最も野心的なものです。ほとんどのスクレイパーはトラックを (id, title, band, album) に平坦化します。pymetal は、Metal Archives が別々に保持しているものを失うことを拒みます。すなわち、一つのトラックは複数のバンドをクレジットでき(スプリット、コラボレーション)、バンドのラインナップは時間にわたって分割され、一つのトラックは多くのリリースに登場できます(コンピレーション、再発、シングル)。それぞれをアーカイブ id をキーとした第一級のエンティティとしてモデル化するので、再スクレイプは冪等です。エンドポイントの範囲は広く — 高度なバンド/アルバム/曲の検索、スプリットでのバンドごとの帰属を伴う完全なリリースページ、役割の日付範囲を伴い状態で分割されたラインナップ、レビュー、推薦、外部リンク、歌詞 — すべてが JSON をラウンドトリップする Pydantic v2 モデルとして提供されます。
音楽を超えて、tutubo は YouTube と YouTube Music をスクレイピングし、pymal は MyAnimeList をカバーします — 同じ型付きメタデータのパターンをより広いメディアカテゴリに拡張します。すべてが同じ語彙を出力するので、単一の下流の消費者がすべてを一様に扱います。
準拠的で低ボリュームなアクセスのために作られた
これらのクライアントは、公開カタログページのみを、低いリクエスト量で取得し、スクレイピングに先立って各サイトの robots.txt を確認します — その調査ステップがどのように機能するかは robots.txt とサイトマップに関する記事 をご覧ください。この一団全体を通じて HTTP レイヤーはプラガブルです。デフォルトでは、クライアントは本物のブラウザと TLS ハンドシェイクが一致するトランスポート(Chrome の TLS/JA3 と一致する curl_cffi)を使用し、スクリプトによる悪用を狙って調整された検出システムが、行儀の良いクライアントを悪意ある自動化として誤分類しないようにします。Cloudflare の背後にある百科事典は、さらにライブデータのために FlareSolverr インスタンスを経由するか、フォールバックとして Internet Archive の Wayback Machine から読み取ることができます。パースレイヤーは HTML がどのように届くかとは意図的に独立しているので、どのトランスポートを選んでも同じコードが機能します。
クロスソースの音楽カタログ
本当の見返りは、これらを九つの別々のツールとして考えるのをやめたときに起こることです。それらはすべて同じ型付きメタデータ語彙を出力し、すべてが正規の外部 id を公開するので、単一のアーティストを Bandcamp、SoundCloud、ラジオディレクトリ、そして百科事典にわたって扇状に広げ、その結果を一つの一貫したカタログに畳み込むことができます — アイデンティティで重複排除され、ライセンスを意識し、推薦エンジン、メディアサーバー、あるいは研究用データセットに供給する準備が整っています。
これらのクライアントはすべて自由ソフトウェアで、自己ホスト可能で、API キー不要であなた自身のハードウェア上で動作します。あなたが関心を持つソースを選んでください。PyPI にあれば pip install し、GitHub 専用の pyprogarchives と pyjazzmusicarchives であれば pip install git+https://github.com/TigreGotico/<repo> としてください — そして構築を始めてください。
すべてのスクレイパーは私たちの 組み合わせ可能でそのまま差し替えられる requests セッション の上で動作します。ストリーミングとラジオのクライアントは mediavocab スキーマを直接出力し、すべてのクライアントが正規の外部 id を公開するので、音楽メタデータは私たちのクロスソース・インデクサーおよび重複排除メタデータサーバーである media-archivist と統合されます。