From 380189df0568995a5ec724c3e13b32d9384bea8d Mon Sep 17 00:00:00 2001 From: Core <64542347+coredev-uk@users.noreply.github.com> Date: Sun, 31 Jul 2022 23:53:44 +0100 Subject: [PATCH] Artwork caching (sorta) --- src/main/plugins/playbackNotifications.ts | 97 ++++++++++++++--------- 1 file changed, 58 insertions(+), 39 deletions(-) diff --git a/src/main/plugins/playbackNotifications.ts b/src/main/plugins/playbackNotifications.ts index 92df3724..27f06d74 100644 --- a/src/main/plugins/playbackNotifications.ts +++ b/src/main/plugins/playbackNotifications.ts @@ -1,5 +1,6 @@ import fetch from "electron-fetch"; import {nativeImage, Notification} from "electron"; +import NativeImage = Electron.NativeImage; export default class playbackNotifications { @@ -15,6 +16,8 @@ export default class playbackNotifications { private _utils: any; private _notification: Notification | undefined; + private _artworkImage: { [key: string]: NativeImage } = {}; + private _artworkNums: Array = []; /** * Creates playback notification @@ -24,30 +27,28 @@ export default class playbackNotifications { if (this._notification) { this._notification.close(); } - fetch(a.artwork.url.replace('/{w}x{h}bb', '/512x512bb').replace('/2000x2000bb', '/35x35bb')).then(async blob => { - const artworkImage = nativeImage.createFromBuffer(Buffer.from(await blob.arrayBuffer())); - this._notification = new Notification({ - title: a.name, - body: `${a.artistName} — ${a.albumName}`, - silent: true, - icon: artworkImage, - urgency: 'low', - actions: [ - { - 'type': 'button', - 'text': 'Play/Pause' - }, - { - 'type': 'button', - 'text': 'Next' - } - ], - toastXml: ` + + this._notification = new Notification({ + title: a.name, + body: `${a.artistName} — ${a.albumName}`, + silent: true, + icon: this._artworkImage[a.artwork.url], + urgency: 'low', + actions: [ + { + 'type': 'button', + 'text': 'Play/Pause' + }, + { + 'type': 'button', + 'text': 'Next' + } + ], + toastXml: ` ${a.name ?? ''} - ${a.artistName ?? ''} - ${a.albumName ?? '' - } + ${a.artistName ?? ''} - ${a.albumName ?? ''} @@ -55,27 +56,30 @@ export default class playbackNotifications { ` - }); - this._notification.on('click', (event: any) => { - this._utils.getWindow().show() - this._utils.getWindow().focus() - }) - this._notification.on('close', (event: any) => { - this._notification = undefined; - }) - this._notification.on('action', (event: any, action: any) => { - if (action === 'Play/Pause') { - this._utils.playback.playPause() - } else if (action === 'Next') { - this._utils.playback.next() - } - }) - - this._notification.show(); + }); + this._notification.on('click', (event: any) => { + this._utils.getWindow().show() + this._utils.getWindow().focus() }) + + this._notification.on('close', (event: any) => { + this._notification = undefined; + }) + + this._notification.on('action', (event: any, action: any) => { + if (action === 'Play/Pause') { + this._utils.playback.playPause() + } else if (action === 'Next') { + this._utils.playback.next() + } + }) + + this._notification.show(); + } + /******************************************************************************************* * Public Methods * ****************************************************************************************/ @@ -88,7 +92,22 @@ export default class playbackNotifications { console.debug(`[Plugin][${this.name}] Loading Complete.`); utils.getIPCMain().on('playbackNotifications:create', (event: any, a: any) => { - this.createNotification(a); + a.artwork.url = a.artwork.url.replace('/{w}x{h}bb', '/512x512bb').replace('/2000x2000bb', '/35x35bb'); + + if (this._artworkNums.length > 20) { + delete this._artworkImage[this._artworkNums[0]]; + this._artworkNums.shift(); + } + + if (this._artworkImage[a.artwork.url]) { + this.createNotification(a); + } else { + fetch(a.artwork.url).then(async blob => { + this._artworkImage[a.artwork.url] = nativeImage.createFromBuffer(Buffer.from(await blob.arrayBuffer())); + this._artworkNums[this._artworkNums.length] = a.artwork.url; + this.createNotification(a); + }); + } }) }