@basmilius/apple-devices 0.9.12 → 0.9.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.mts CHANGED
@@ -91,7 +91,7 @@ declare const STATE_SUBSCRIBE_SYMBOL: unique symbol;
91
91
  declare const STATE_UNSUBSCRIBE_SYMBOL: unique symbol;
92
92
  //#endregion
93
93
  //#region src/airplay/remote.d.ts
94
- declare class export_default$8 {
94
+ declare class export_default$1 {
95
95
  #private;
96
96
  constructor(device: export_default);
97
97
  up(): Promise<void>;
@@ -140,6 +140,7 @@ type EventMap$4 = {
140
140
  readonly clients: [Record<string, Client>];
141
141
  readonly deviceInfo: [Proto.DeviceInfoMessage];
142
142
  readonly deviceInfoUpdate: [Proto.DeviceInfoMessage];
143
+ readonly nowPlayingChanged: [client: Client | null, player: Player | null];
143
144
  readonly originClientProperties: [Proto.OriginClientPropertiesMessage];
144
145
  readonly playerClientProperties: [Proto.PlayerClientPropertiesMessage];
145
146
  readonly removeClient: [Proto.RemoveClientMessage];
@@ -159,7 +160,7 @@ type EventMap$4 = {
159
160
  readonly volumeControlCapabilitiesDidChange: [boolean, Proto.VolumeCapabilities_Enum];
160
161
  readonly volumeDidChange: [number];
161
162
  };
162
- declare class export_default$7 extends EventEmitter<EventMap$4> {
163
+ declare class export_default$2 extends EventEmitter<EventMap$4> {
163
164
  #private;
164
165
  get clients(): Record<string, Client>;
165
166
  get nowPlayingClient(): Client | null;
@@ -195,7 +196,7 @@ declare class export_default$7 extends EventEmitter<EventMap$4> {
195
196
  }
196
197
  //#endregion
197
198
  //#region src/airplay/volume.d.ts
198
- declare class export_default$6 {
199
+ declare class export_default$3 {
199
200
  #private;
200
201
  constructor(device: export_default);
201
202
  down(): Promise<void>;
@@ -215,9 +216,9 @@ declare class export_default extends EventEmitter<EventMap$3> {
215
216
  get discoveryResult(): DiscoveryResult;
216
217
  set discoveryResult(discoveryResult: DiscoveryResult);
217
218
  get isConnected(): boolean;
218
- get remote(): export_default$8;
219
- get state(): export_default$7;
220
- get volume(): export_default$6;
219
+ get remote(): export_default$1;
220
+ get state(): export_default$2;
221
+ get volume(): export_default$3;
221
222
  get timingServer(): TimingServer | undefined;
222
223
  set timingServer(timingServer: TimingServer | undefined);
223
224
  constructor(discoveryResult: DiscoveryResult);
@@ -242,7 +243,7 @@ type EventMap$2 = {
242
243
  disconnected: [unexpected: boolean];
243
244
  power: [AttentionState];
244
245
  };
245
- declare class export_default$2 extends EventEmitter<EventMap$2> {
246
+ declare class export_default$5 extends EventEmitter<EventMap$2> {
246
247
  #private;
247
248
  get [PROTOCOL$1](): Protocol$1;
248
249
  get discoveryResult(): DiscoveryResult;
@@ -275,13 +276,13 @@ type EventMap$1 = {
275
276
  disconnected: [unexpected: boolean];
276
277
  power: [AttentionState];
277
278
  };
278
- declare class export_default$1 extends EventEmitter<EventMap$1> {
279
+ declare class export_default$4 extends EventEmitter<EventMap$1> {
279
280
  #private;
280
281
  get airplay(): export_default;
281
- get companionLink(): export_default$2;
282
- get remote(): export_default$8;
283
- get state(): export_default$7;
284
- get volumeControl(): export_default$6;
282
+ get companionLink(): export_default$5;
283
+ get remote(): export_default$1;
284
+ get state(): export_default$2;
285
+ get volumeControl(): export_default$3;
285
286
  get bundleIdentifier(): string | null;
286
287
  get displayName(): string | null;
287
288
  get isConnected(): boolean;
@@ -323,12 +324,12 @@ type EventMap = {
323
324
  connected: [];
324
325
  disconnected: [unexpected: boolean];
325
326
  };
326
- declare abstract class export_default$5 extends EventEmitter<EventMap> {
327
+ declare abstract class export_default$8 extends EventEmitter<EventMap> {
327
328
  #private;
328
329
  get airplay(): export_default;
329
- get remote(): export_default$8;
330
- get state(): export_default$7;
331
- get volumeControl(): export_default$6;
330
+ get remote(): export_default$1;
331
+ get state(): export_default$2;
332
+ get volumeControl(): export_default$3;
332
333
  get bundleIdentifier(): string | null;
333
334
  get displayName(): string | null;
334
335
  get isConnected(): boolean;
@@ -357,9 +358,9 @@ declare abstract class export_default$5 extends EventEmitter<EventMap> {
357
358
  }
358
359
  //#endregion
359
360
  //#region src/model/homepod.d.ts
360
- declare class export_default$3 extends export_default$5 {}
361
+ declare class export_default$6 extends export_default$8 {}
361
362
  //#endregion
362
363
  //#region src/model/homepod-mini.d.ts
363
- declare class export_default$4 extends export_default$5 {}
364
+ declare class export_default$7 extends export_default$8 {}
364
365
  //#endregion
365
- export { PROTOCOL as AIRPLAY, export_default as AirPlayDevice, export_default$1 as AppleTV, PROTOCOL$1 as COMPANION_LINK, export_default$2 as CompanionLinkDevice, export_default$3 as HomePod, export_default$4 as HomePodMini };
366
+ export { PROTOCOL as AIRPLAY, Client as AirPlayClient, export_default as AirPlayDevice, Player as AirPlayPlayer, export_default$1 as AirPlayRemote, export_default$2 as AirPlayState, export_default$3 as AirPlayVolume, export_default$4 as AppleTV, PROTOCOL$1 as COMPANION_LINK, export_default$5 as CompanionLinkDevice, export_default$6 as HomePod, export_default$7 as HomePodMini };
package/dist/index.mjs CHANGED
@@ -482,6 +482,7 @@ var state_default = class extends EventEmitter {
482
482
  #device;
483
483
  #clients;
484
484
  #nowPlayingClientBundleIdentifier;
485
+ #nowPlayingSnapshot;
485
486
  #outputDeviceUID;
486
487
  #outputDevices = [];
487
488
  #volume;
@@ -561,6 +562,7 @@ var state_default = class extends EventEmitter {
561
562
  clear() {
562
563
  this.#clients = {};
563
564
  this.#nowPlayingClientBundleIdentifier = null;
565
+ this.#nowPlayingSnapshot = null;
564
566
  this.#outputDeviceUID = null;
565
567
  this.#outputDevices = [];
566
568
  this.#volume = 0;
@@ -587,10 +589,12 @@ var state_default = class extends EventEmitter {
587
589
  }
588
590
  onRemoveClient(message) {
589
591
  if (!(message.client.bundleIdentifier in this.#clients)) return;
592
+ const wasActive = this.#nowPlayingClientBundleIdentifier === message.client.bundleIdentifier;
590
593
  delete this.#clients[message.client.bundleIdentifier];
591
- if (this.#nowPlayingClientBundleIdentifier === message.client.bundleIdentifier) this.#nowPlayingClientBundleIdentifier = null;
594
+ if (wasActive) this.#nowPlayingClientBundleIdentifier = null;
592
595
  this.emit("removeClient", message);
593
596
  this.emit("clients", this.#clients);
597
+ if (wasActive) this.#emitNowPlayingChangedIfNeeded();
594
598
  }
595
599
  onSendCommandResult(message) {
596
600
  this.emit("sendCommandResult", message);
@@ -605,6 +609,7 @@ var state_default = class extends EventEmitter {
605
609
  onSetNowPlayingClient(message) {
606
610
  this.#nowPlayingClientBundleIdentifier = message.client?.bundleIdentifier ?? null;
607
611
  this.emit("setNowPlayingClient", message);
612
+ this.#emitNowPlayingChangedIfNeeded();
608
613
  }
609
614
  onSetNowPlayingPlayer(message) {
610
615
  if (message.playerPath?.client?.bundleIdentifier && message.playerPath?.player?.identifier) {
@@ -613,9 +618,11 @@ var state_default = class extends EventEmitter {
613
618
  client.setActivePlayer(message.playerPath.player.identifier);
614
619
  }
615
620
  this.emit("setNowPlayingPlayer", message);
621
+ this.#emitNowPlayingChangedIfNeeded();
616
622
  }
617
623
  onSetState(message) {
618
- const client = this.#client(message.playerPath.client.bundleIdentifier, message.displayName);
624
+ const bundleIdentifier = message.playerPath.client.bundleIdentifier;
625
+ const client = this.#client(bundleIdentifier, message.displayName);
619
626
  const playerIdentifier = message.playerPath?.player?.identifier || "MediaRemote-DefaultPlayer";
620
627
  const player = client.getOrCreatePlayer(playerIdentifier, message.playerPath?.player?.displayName);
621
628
  if (message.nowPlayingInfo) player.setNowPlayingInfo(message.nowPlayingInfo);
@@ -623,13 +630,16 @@ var state_default = class extends EventEmitter {
623
630
  if (message.supportedCommands) player.setSupportedCommands(message.supportedCommands.supportedCommands);
624
631
  if (message.playbackQueue) player.setPlaybackQueue(message.playbackQueue);
625
632
  this.emit("setState", message);
633
+ if (bundleIdentifier === this.#nowPlayingClientBundleIdentifier) this.#emitNowPlayingChangedIfNeeded();
626
634
  }
627
635
  onUpdateContentItem(message) {
628
- const client = this.#client(message.playerPath.client.bundleIdentifier, message.playerPath.client.displayName);
636
+ const bundleIdentifier = message.playerPath.client.bundleIdentifier;
637
+ const client = this.#client(bundleIdentifier, message.playerPath.client.displayName);
629
638
  const playerIdentifier = message.playerPath?.player?.identifier || "MediaRemote-DefaultPlayer";
630
639
  const player = client.getOrCreatePlayer(playerIdentifier, message.playerPath?.player?.displayName);
631
640
  for (const item of message.contentItems) player.updateContentItem(item);
632
641
  this.emit("updateContentItem", message);
642
+ if (bundleIdentifier === this.#nowPlayingClientBundleIdentifier) this.#emitNowPlayingChangedIfNeeded();
633
643
  }
634
644
  onUpdateContentItemArtwork(message) {
635
645
  this.emit("updateContentItemArtwork", message);
@@ -644,6 +654,7 @@ var state_default = class extends EventEmitter {
644
654
  if (client) client.removePlayer(message.playerPath.player.identifier);
645
655
  }
646
656
  this.emit("removePlayer", message);
657
+ if (message.playerPath?.client?.bundleIdentifier === this.#nowPlayingClientBundleIdentifier) this.#emitNowPlayingChangedIfNeeded();
647
658
  }
648
659
  onUpdateClient(message) {
649
660
  this.#client(message.client.bundleIdentifier, message.client.displayName);
@@ -676,6 +687,38 @@ var state_default = class extends EventEmitter {
676
687
  return client;
677
688
  }
678
689
  }
690
+ #createNowPlayingSnapshot() {
691
+ const client = this.nowPlayingClient;
692
+ const player = client?.activePlayer ?? null;
693
+ return {
694
+ bundleIdentifier: client?.bundleIdentifier ?? null,
695
+ playerIdentifier: player?.identifier ?? null,
696
+ playbackState: player?.playbackState ?? Proto.PlaybackState_Enum.Unknown,
697
+ title: player?.title ?? "",
698
+ artist: player?.artist ?? "",
699
+ album: player?.album ?? "",
700
+ genre: player?.genre ?? "",
701
+ duration: player?.duration ?? 0,
702
+ shuffleMode: player?.shuffleMode ?? Proto.ShuffleMode_Enum.Unknown,
703
+ repeatMode: player?.repeatMode ?? Proto.RepeatMode_Enum.Unknown,
704
+ mediaType: player?.mediaType ?? Proto.ContentItemMetadata_MediaType.UnknownMediaType,
705
+ seriesName: player?.seriesName ?? "",
706
+ seasonNumber: player?.seasonNumber ?? 0,
707
+ episodeNumber: player?.episodeNumber ?? 0,
708
+ contentIdentifier: player?.contentIdentifier ?? ""
709
+ };
710
+ }
711
+ #emitNowPlayingChangedIfNeeded() {
712
+ const snapshot = this.#createNowPlayingSnapshot();
713
+ const previous = this.#nowPlayingSnapshot;
714
+ if (previous && this.#snapshotsEqual(previous, snapshot)) return;
715
+ this.#nowPlayingSnapshot = snapshot;
716
+ const client = this.nowPlayingClient;
717
+ this.emit("nowPlayingChanged", client, client?.activePlayer ?? null);
718
+ }
719
+ #snapshotsEqual(a, b) {
720
+ return a.bundleIdentifier === b.bundleIdentifier && a.playerIdentifier === b.playerIdentifier && a.playbackState === b.playbackState && a.title === b.title && a.artist === b.artist && a.album === b.album && a.genre === b.genre && a.duration === b.duration && a.shuffleMode === b.shuffleMode && a.repeatMode === b.repeatMode && a.mediaType === b.mediaType && a.seriesName === b.seriesName && a.seasonNumber === b.seasonNumber && a.episodeNumber === b.episodeNumber && a.contentIdentifier === b.contentIdentifier;
721
+ }
679
722
  };
680
723
 
681
724
  //#endregion
@@ -1311,4 +1354,4 @@ var homepod_default = class extends homepod_base_default {};
1311
1354
  var homepod_mini_default = class extends homepod_base_default {};
1312
1355
 
1313
1356
  //#endregion
1314
- export { PROTOCOL as AIRPLAY, device_default as AirPlayDevice, apple_tv_default as AppleTV, PROTOCOL$1 as COMPANION_LINK, device_default$1 as CompanionLinkDevice, homepod_default as HomePod, homepod_mini_default as HomePodMini };
1357
+ export { PROTOCOL as AIRPLAY, Client as AirPlayClient, device_default as AirPlayDevice, Player as AirPlayPlayer, remote_default as AirPlayRemote, state_default as AirPlayState, volume_default as AirPlayVolume, apple_tv_default as AppleTV, PROTOCOL$1 as COMPANION_LINK, device_default$1 as CompanionLinkDevice, homepod_default as HomePod, homepod_mini_default as HomePodMini };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@basmilius/apple-devices",
3
3
  "description": "Exposes various Apple devices to connect with either AirPlay or Companion Link.",
4
- "version": "0.9.12",
4
+ "version": "0.9.14",
5
5
  "type": "module",
6
6
  "license": "MIT",
7
7
  "author": {
@@ -49,10 +49,10 @@
49
49
  }
50
50
  },
51
51
  "dependencies": {
52
- "@basmilius/apple-airplay": "0.9.12",
53
- "@basmilius/apple-common": "0.9.12",
54
- "@basmilius/apple-companion-link": "0.9.12",
55
- "@basmilius/apple-encoding": "0.9.12"
52
+ "@basmilius/apple-airplay": "0.9.14",
53
+ "@basmilius/apple-common": "0.9.14",
54
+ "@basmilius/apple-companion-link": "0.9.14",
55
+ "@basmilius/apple-encoding": "0.9.14"
56
56
  },
57
57
  "devDependencies": {
58
58
  "@types/bun": "^1.3.9",