Home Manual Reference Source Test

src/browser/main/carrier.js

  1. /**
  2. * A class in charge of building the payload expected by the native app
  3. * the payload must be a {@link Payload}
  4. */
  5. class Carrier {
  6. /**
  7. * Generate a new {@link Carrier}
  8. */
  9. constructor () {
  10. /**
  11. *
  12. * @type {Payload}
  13. */
  14. this.last = {};
  15. }
  16.  
  17. /**
  18. * Clear the last payload sent
  19. */
  20. clear () {
  21. this.last = {};
  22. }
  23.  
  24. /**
  25. * Store the last payload sent
  26. * @param {Payload} payload
  27. */
  28. store (payload) {
  29. this.last = payload;
  30. }
  31.  
  32. /**
  33. *
  34. * @param {Playback} playback
  35. * @returns {Payload}
  36. */
  37. payloadFrom (playback) {
  38. return {
  39. PlaybackStatus: playback.getStatus(),
  40. LoopStatus: playback.getLoopStatus(),
  41. Shuffle: playback.isShuffle(),
  42. Volume: playback.getVolume(),
  43. CanGoNext: playback.canGoNext(),
  44. CanGoPrevious: playback.canGoPrevious(),
  45. Identity: playback.getIdentity(),
  46. Rate: playback.getRate(),
  47. Metadata: {
  48. 'mpris:trackid': playback.activePlayer.getId(),
  49. 'mpris:length': playback.activePlayer.getLength(),
  50. 'mpris:artUrl': playback.activePlayer.getCover(),
  51. 'xesam:url': playback.activePlayer.getUrl(),
  52. 'xesam:title': playback.activePlayer.getTitle(),
  53. 'xesam:artist': playback.activePlayer.getArtists(),
  54. }
  55. };
  56. }
  57.  
  58. /**
  59. *
  60. * @param {Payload} payload
  61. * @return {Payload}
  62. */
  63. onlyUpdated (payload) {
  64. let diffs = {
  65. Metadata: {}
  66. };
  67. for (let prop in payload) {
  68. if (prop === 'Metadata') {
  69. let changed = false;
  70. for (let meta in payload.Metadata) {
  71. if (JSON.stringify(payload.Metadata[meta]) !== (this.last.Metadata && JSON.stringify(this.last.Metadata[meta]))) {
  72. changed = true;
  73. }
  74. }
  75. if (changed)
  76. diffs.Metadata = payload.Metadata;
  77. } else if (payload[prop] !== this.last[prop])
  78. diffs[prop] = payload[prop];
  79. }
  80. if (Object.keys(diffs.Metadata).length === 0)
  81. delete diffs.Metadata;
  82. // noinspection JSValidateTypes
  83. return diffs;
  84. }
  85.  
  86. /**
  87. *
  88. * @param {Playback} playback
  89. * @returns {Payload}
  90. */
  91. requestPayload (playback) {
  92. let payload = this.payloadFrom(playback);
  93. let diffs = this.onlyUpdated(payload);
  94. this.store(payload);
  95. return diffs;
  96. }
  97. }