beatoraja × IPFS

IPFSって何?

詳しく知りたい方はこの辺を読んでください。

IPFS(The InterPlanetary File System)まとめ - Qiita

IPFS入門 : 新たなP2Pハイパーメディア分散プロトコル | POSTD

paper.dropbox.com

よくわからない方は「BitTorrentが色々進化したやつ」ぐらいの認識で良いと思います。

beatorajaで利用するには

ipfsに対応した難易度表をTable URLに追加します。

例として、僕が用意した次の難易度表をTable URLに追加します。

http://lnt.softether.net/insane.html

難易度表読み込みを押した後、バージョン0.6以降のbeatorajaを起動し未所持楽曲を選択することで、左上にダウンロードをしているメッセージが表示されます。

f:id:LNTakeshi:20180502193341p:plain

このメッセージが消えると選曲が行える状態になります。

 

go-ipfsを利用してBMSの共有をする

ipfsを用いることで、今までファイルの提供者が変わる度にURLが変化していましたが、「同じファイルであれば同じIPFS hash」という特徴から、所謂リンク切れが起きないBMSの配布が行なえます。

但し、BitTorrentと同様にファイル提供者が居ないとファイルはダウンロードできません。パブリックゲートウェイに「このIPFS hashのファイルください!」と問い合わせても、持っている人が居なければダウンロードは出来ないし、持っている人が少なければダウンロード速度も相応な速度です。

そこで、まずはipfsを用いて特定のBMSを自分のPC/サーバから共有する方法を紹介します。

初期化,daemonの起動

下準備としてgo-ipfsをダウンロードして ipfs init、ipfs daemonコマンドを実行します。

方法はこの辺りの解説記事を見れば分かると思います。

IPFSの環境構築の手順と基本的なコマンドを学ぶ | block-chain.jp

IPFSを触ってみた

ipfs daemonコマンドが無事に実行できたら、デフォルトでは http://localhost:8080/ にローカルゲートウェイが稼働します。

この時点で、beatorajaで次のように設定することで、自分のPCで動かしているipfs daemonからファイルの取得が出来るようになります。

f:id:LNTakeshi:20180608114052p:plain

また、デフォルトではipfs daemonは10GBまでダウンロードしたファイルをキャッシュするので、自分が直近にダウンロードしたBMSに関しては他者にアップロードが行われるようになります。

特定のファイル/ディレクトリをピン留め

ピン留めをすることで、特定のファイル/ディレクトリをピン留めを外すまでローカルストレージに保存します。

例として、しらいしさんのOdinをピン留めします。

OdinのIPFSは次を参照するとQmUJG4Cbqg1uyqzZL7xd5gM6CNnyVhFed7MLkMDugepXz1であることが分かります。

http://lnt.softether.net/insane.html

そこで、ipfs daemon起動中に

ipfs pin add QmUJG4Cbqg1uyqzZL7xd5gM6CNnyVhFed7MLkMDugepXz1

を実行することでピン留めが行われます。

f:id:LNTakeshi:20180608115704p:plain

これで、ipfs daemon起動中はいつでも対象のファイル/ディレクトリが共有される状態になりました。BMS楽曲を保持するサーバー作りたい人は難易度表からipfs情報読み込んでスクリプト等で上記コマンドをいっぱい実行してあげれば良いかなと思います。

ちなみに、上の発狂難易度表のリンクにある"root ipfs: /ipfs/Qm~~~~"を登録すると、発狂難易度表全楽曲がピン留めされますが、相応のダウンロード時間と容量が必要です。

ファイル/ディレクトリの登録(難易度表/イベント管理者向け)

難易度表/イベント管理者がファイルサーバーを用意するケースが多いと思いますが、これとかオススメです。(容量500GB,帯域幅2TB/月,0.1または1Gbps)で3EUR/月(2年毎払いの場合)で安い!

Time4VPS - Storage VPS - VPS Hosting in Europe

それでは実際にBMSを難易度表などにIPFS hashを登録を行います。

IPFS hashの追加は次のようなコマンドで行えます。

ipfs add -r "F:\insanebms\5\[しらいし] Odin"

このコマンドを実行するとメッセージが流れてきます。

f:id:LNTakeshi:20180608120657p:plain

一番最後にある"added QmUJG4Cbqg1uyqzZL7xd5gM6CNnyVhFed7MLkMDugepXz1"などというメッセージがフォルダのIPFS hashなので、これを難易度表等に登録してあげることで、beatorajaでダウンロードすることが出来るようになります。

差分は差分フォルダ(例:Odin差分)を作り、中身に差分のBMSや追加音源を入れておきます。

これも同様に次のようなコマンドを実行してIPFS hashを登録します。

ipfs add -r "F:\insanebms\15_diff\Odin差分"

このコマンドを実行すると同様に

"added Qmbw6gqQLLHPeSn8Lp3AZ6JCeygTiP5zFkGMUD8qCQMrYh [しらいし] Odin"

と帰ってくるので、これらを難易度表などに登録する作業を行います。

基本的には以下のフォーマットに合わせて書けばOKです。

難易度表の仕様 · exch-bms2/jbmstable-parser Wiki · GitHub

{
"artist": "しらいし",
"level": "15",
"md5": "8d11a7e457b5a344d03e90f8446d825b",
"title": "Odin [グングニル]",
"url": "http://ipfs.io/api/v0/get?arg=QmUJG4Cbqg1uyqzZL7xd5gM6CNnyVhFed7MLkMDugepXz1&archive=true&compress=true",
"url_diff": "http://ipfs.io/api/v0/get?arg=Qmbw6gqQLLHPeSn8Lp3AZ6JCeygTiP5zFkGMUD8qCQMrYh&archive=true&compress=true",
"ipfs_diff": "Qmbw6gqQLLHPeSn8Lp3AZ6JCeygTiP5zFkGMUD8qCQMrYh",
"sha256": "3f5c3d5e72c31e30a4fa56d1a7aaf4f2b27c66ebcf3ce927bd29d01ae6b8f98a",
"ipfs": "QmUJG4Cbqg1uyqzZL7xd5gM6CNnyVhFed7MLkMDugepXz1",
"org_md5": [
"fb1749e571cb4ffa86f18298c4b22510",
"5370a5c43911706ae4bb7898b55b28fb",
"82a4959a5ab9d3c0509dbc4243c87237",
"4aba61fa46780f110362e11d076807c1",
"8d11a7e457b5a344d03e90f8446d825b",
"3c3fb6acfcfe4b0e09122aac41253264",
"ec245ce4a958286d0cb2fda018a61189",
"f4312f06f330ae034dce21c594f85c7d"
]
}

 org_md5が無いと差分の適用が出来ないので、それだけは忘れずに行ってください。同梱の譜面を全部md5計算して配列に突っ込めばOKです。

BMSイベントでも上記のような表を作り、ipfs daemonを動かせば利用できないこともないですが、現状のシステムでは"修正差分"が適用できないので、ご了承ください。(もしJava出来るマンが居たら色々教えて頂けると助かります)

なお、beatorajaでは特定のURLからでしかダウンロードできないようになっているので、「私の難易度表/イベントでも利用したい」という方はTwitter等でご連絡ください。

また、IPFSの情報を僕の作った発狂難易度表から削除して欲しい作者様なども居ればご連絡ください。IPFS hashの情報を削除します。