electron-packagerでasar圧縮する時はFlashなどのバイナリファイルを含めてはならない
表題どおりです.electron-packagerでasar圧縮する時にバイナリファイルも圧縮すると,asar内でそのファイルを読み込むことができない.
--asar.unpack
オプションで指定して,圧縮しないようにする必要がある.
なので,
こんな感じ.指定するとアプリ内ファイルのapp.asar
が生成されるディレクトリと同じディレクトリに app.asar.unpacked
というディレクトリができ,そこに指定した圧縮されていないファイルが置かれる.
なので,
https://github.com/tsuwatch/nicomentron/blob/v0.5.0/src/main.js#L24
ディレクトリを指定するときに,app.asar
の部分をapp.asar.unpacked
にしたりして読み込む.
ニコ生のコメントサーバーに接続したりするためのライブラリ作った
ニコ生のコメントサーバに接続したりするためのライブラリをJavaScriptで書きました.npmで利用できます.
ニコ生デスクトップクライアント(GitHub - tsuwatch/nicomentron: Desktop client for ニコニコ生放送(live.nicovideo.jp) made of Electron)を作っていて、その副産物です。とにかくニコ生デスクトップクライアントを作るために作ってるので、ガッと実装していて色々怪しいところもあったり、ドキュメントもまだ書いてないんですが、そのうちちゃんとやります。
現状こんな感じで使える。
import nicolive from 'nicolive-api' nicolive.login('foo@bar.com', 'xxx').then(client => { client.connectLive('lvxxxx').then(manager => { manager.viewer.connection.on('comment', (comment => { console.log(comment.text); })); manager.viewer.connection.on('ejected', () => { console.log('追い出されました'); manager.disconnect(); }); }); client.connectAlert().then(viewer => { viewer.connection.on('handshaked', () => { console.log('handshaked'); }); viewer.connection.on('notify', (info => { console.log(info.contentId); })); }); });
使えるAPI
- 生放送情報取得
- コミュニティ、チャンネル情報取得
- ユーザー情報取得
- ニコ生アラート
コメントサーバーの仕様について
全部屋に接続して、全部屋のコメントを取得します。
ウェブ上にある情報やOSSなどを見てコメントサーバについて少し解説すると(もちろんあってるかかどうかはわからない)、まず、メッセージサーバ群が存在します( https://github.com/tsuwatch/nicolive-api/blob/56d8e36b2800d909dcb5e71cd107b2e0aac5e692/src/MessageServer.js#L2-L23
) こんな感じで、ドメイン名とポート群があり、ここから対象の放送のメッセージサーバを探索します。
getplayerstatus
というAPIが存在するので、そこから自分が接続しているサーバを確認します。メッセージサーバは順番を持っていて、他の部屋のメッセージサーバは、自分が接続したメッセージサーバの前後に存在している。例えば立ち見Aに接続した場合、アリーナサーバは1つ前のドメイン名とポート番号に存在している。接続するにはスレッド番号も必要なので、自分が今接続しているスレッド番号に-1すれば良い。こういう感じで前後のメッセージサーバを探索していける。
スレッド番号は、放送が開始された段階でまとめて部屋分確保されるので、単純にプラスマイナスすれば良い。コミュニティレベルに応じて、そのコミュニティが可能な部屋数の最大までスレッドが確保されている。チャンネルも固定で500人×6部屋の3000人分確保されている。しかし問題なのが、自動増席システムです。チャンネルは、満員になると自動的に席が追加されます(立ち見席と表記される)。この席はもちろん、一番うしろのメッセージサーバの次のメッセージサーバであることはわかるんですが、スレッド番号が特定できません。なぜなら一気に確保していませんし、裏では常に他の放送のスレッドを確保しているからです(おそらく)。
なので、立ち見席には対応できていません。立ち見席に接続した場合は、立ち見席しか取得できないようになっています。世のコメビュはなぜか対応できているやつもあるっぽいんですが、謎です。教えてください。
そういえば、ニコニコ生放送は新配信に移行するようです。新配信では満員という概念がなくなるようで、自動増席がバンバンされるということですね。現状確認したところ、コミュニティレベルに応じてスレッドを一気に確保するというシステムは現状変わっていないようなので、それ以降に自動増席がされるようです。
こんな感じです。みなさん、これで最強のコメントビューアが作れますね。
参考
【7/13更新】新配信番組のタイムシフト画質を改善|ニコニコインフォ
ニコ生の公式とチャンネルのコメントサーバの仕様について | ニコラボ
GitHub - honishi/Hakumai: niconama comment viewer alternative for mac os x.
Electronアプリのファイルサイズ最適化,必要なファイルだけパッケージするやり方
ElectronアプリはchromiumをベースにしていてHello worldするだけでも100M近くのファイルサイズになってしまう. 油断しているとすぐに200Mとかになってしまうので,ファイルサイズをできるだけ小さくすることを普段から心がける必要がある.
心がけた結果のPRがこれ
今までは,
$ NODE_ENV=production ./node_modules/.bin/electron-packager . nicomentron --platform=darwin --arch=x64 --out=packages --overwrite
こうビルドしていた.
こうすると,もちろんだがカレントディレクトリのファイル全てがアプリ内に含まれてしまい,node_modules
や当たり前に不必要なファイルが数多く含まれてしまいこのようになる.
最適化できているかは,アプリ内のここのディレクトリを見れば確認することができる.(asarで圧縮してしまうともちろん見れない
せっかくビルドした結果をapp以下に吐いているのに無関係に全ファイルアプリ内に入ってしまっていることがわかる. 必要なのはビルド結果のapp以下のファイルとpackage.json,その他必要なファイルだけだ.
不必要なファイルで気をつけるべきなのは,自分のアプリで言うとフラッシュプラグインがあり,今後マルチプラットフォーム対応するにあたって各プラットフォームごとのフラッシュプラグインを用意するので,このままだと全てのフラッシュプラグインが入ってしまう
結果以下のようにapp以下をパッケージングするように変更した.パッケージングするにはpackage.json
が必要である.自分のアプリはexternals
でネイティブモジュールを使用しているので,仕方なくnpm install
して,electron-rebuild
も実行するようにしている.もちろん,本来であればnode_modules
も必要ない
$ cp package.json ./app && cp -r plugins ./app && cd ./app && rm -rf node_modules && npm install --production && ../node_modules/.bin/electron-rebuild -m . sqlite3 keytar $ NODE_ENV=production ./node_modules/.bin/electron-packager ./app nicomentron --platform=darwin --arch=x64 --out=packages --overwrite --asar
結果 良さそう