概要
TCNetDataPacketArtwork.read() と MultiPacketAssembler が offset 38 の clusterSize を使用してデータクラスタを抽出するが、File (MessageType=204) パケットではこの値が常に0である。結果として空の JPEG データが返される。
再現手順
- TCNASDP認証を有効にして接続
- CDJで曲をロード
requestData(ArtworkData, layer) でアートワークを取得
packet.data.jpeg が空 Buffer (length=0) になる
原因
TCNetDataPacketArtwork.read() (network.ts):
```typescript
const clusterSize = this.buffer.readUInt32LE(38); // File パケットでは常に 0
const end = Math.min(dataStart + clusterSize, this.buffer.length); // → 42
this.data = { jpeg: Buffer.from(this.buffer.slice(dataStart, end)) }; // → 空
```
実際のデータは offset 42 からバッファ末尾まで格納されている。
期待動作
clusterSize が 0 の場合、buffer.length をフォールバックとして使用し、offset 42 からバッファ末尾までをデータとして抽出する。
ワークアラウンド
tcnet-viewer 側で clusterSize === 0 時に buffer.length をフォールバックとして使用。
概要
TCNetDataPacketArtwork.read()とMultiPacketAssemblerが offset 38 のclusterSizeを使用してデータクラスタを抽出するが、File (MessageType=204) パケットではこの値が常に0である。結果として空の JPEG データが返される。再現手順
requestData(ArtworkData, layer)でアートワークを取得packet.data.jpegが空 Buffer (length=0) になる原因
TCNetDataPacketArtwork.read()(network.ts):```typescript
const clusterSize = this.buffer.readUInt32LE(38); // File パケットでは常に 0
const end = Math.min(dataStart + clusterSize, this.buffer.length); // → 42
this.data = { jpeg: Buffer.from(this.buffer.slice(dataStart, end)) }; // → 空
```
実際のデータは offset 42 からバッファ末尾まで格納されている。
期待動作
clusterSizeが 0 の場合、buffer.lengthをフォールバックとして使用し、offset 42 からバッファ末尾までをデータとして抽出する。ワークアラウンド
tcnet-viewer 側で
clusterSize === 0時にbuffer.lengthをフォールバックとして使用。