From 15757d98b5c62d139130f15317fa4faaab9f5e82 Mon Sep 17 00:00:00 2001 From: Jos Vooges | STH Date: Wed, 23 Sep 2026 00:42:48 +0200 Subject: [PATCH] Add MC brand icon to Token Tray tray and Windows installer. Previous builds used an empty placeholder and the default Electron icon. --- apps/token-tray/assets/icon.png | Bin 0 -> 7756 bytes apps/token-tray/assets/icon.svg | 12 +++++++++ apps/token-tray/assets/tray-icon-16.png | Bin 0 -> 570 bytes apps/token-tray/assets/tray-icon-32.png | Bin 0 -> 1050 bytes apps/token-tray/package.json | 4 ++- apps/token-tray/src/main.ts | 34 +++++++++++++++++++++--- 6 files changed, 45 insertions(+), 5 deletions(-) create mode 100644 apps/token-tray/assets/icon.png create mode 100644 apps/token-tray/assets/icon.svg create mode 100644 apps/token-tray/assets/tray-icon-16.png create mode 100644 apps/token-tray/assets/tray-icon-32.png diff --git a/apps/token-tray/assets/icon.png b/apps/token-tray/assets/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..2b138631300fda36ee769a78c00cf1fc9e034de1 GIT binary patch literal 7756 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 E0=nUbApigX literal 0 HcmV?d00001 diff --git a/apps/token-tray/assets/icon.svg b/apps/token-tray/assets/icon.svg new file mode 100644 index 0000000..07f2204 --- /dev/null +++ b/apps/token-tray/assets/icon.svg @@ -0,0 +1,12 @@ + + + + + + + + + + MC + + diff --git a/apps/token-tray/assets/tray-icon-16.png b/apps/token-tray/assets/tray-icon-16.png new file mode 100644 index 0000000000000000000000000000000000000000..d958b7fb8def93a5588410e0d0da8f398f005bd7 GIT binary patch literal 570 zcmV-A0>%A_P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0nbT9K~y+TmD9az z6hRmU@Y(s?yX?Cl0qWdX`xZDF{c4TP!T~v5Clc9k`~&uy1i|W&nN1YElU#}ihTZr5u`}~7;j*?Pf~XWaE=4#%bW$=Al-$=P zm-Vki1ZLN7PeR5yWKtX&5#=!F<`B%xfYZ)Zejd$iD=~!^wlM|)(ba~ufIin=dr8d!gt&13z((*$k*PWc)f*u{hfeAAO~mgKOkCui1^+Uq^mEHK7E1Y!E=WWoj!}>AHSg3cn^JP5!9o-fR*J)vx-R} z8Y7Td3o2`a5(0npB*OC-q4H5MD*6G+z4#Le=2h#1ySI>i-ggT}8Khp|2&3#mIAoOV z1A*C9_GgMRrw)`TgY6Mvv`4tCe-mNcwR3I7fnsaJxNCcV0YP#V!Z07*qo IM6N<$f^stZKmY&$ literal 0 HcmV?d00001 diff --git a/apps/token-tray/assets/tray-icon-32.png b/apps/token-tray/assets/tray-icon-32.png new file mode 100644 index 0000000000000000000000000000000000000000..ac5dc44102032f703d6b11105dbc25a24934bc3b GIT binary patch literal 1050 zcmV+#1m*jQP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D1FuO$K~z{r?U!9> z990y@@6OzNXYR~?W_M#Y+3ZYrXJ=cJ+OL2%O-pI3Eowm!v_AMjrB6Yqf*_Tm6nv0A zSkM~^!QFWHa{KIGxg?A)_6 z|KC05+{;|XrMk+6nl!mRX>zN6ZKrA;+LKFljd7`_xO5<*Dad3NGSOxwvkO#q23QR+X}QnRpPjKSakIJV(a1PAwkcX*H;U5f``m;$lB0KuVQ z#Mgwd@*!k;5dpY#VK70Nh%g3K?q6(xS(%1_3i_4+<_2Ig6DDIMF4S$YNIho!*Mylc z7$e;tpF4oCVf6-3%U8iJ_0`Af5Zr?8hfvE`!}h|)xPG}dwYq&o2e%?RxUCkKv+#2R z5Q=8kefT{D-~NNr)fu?!x7KD9F<^TY6i2U9EPwPg%m{~RaB$m2cK>TAU7kW%1u8dy zWuwBHjcR=TXHwZv4qtxzaX{>bRcjS+aG*W)YtA|mU0SX^{f#egz zNbcH$&X*2BcIL^rWq_WyK7>CqPA~M&PCz&bGU`2k28EO7vFx+&2|$lItJkCa1K^$d z5+ac%P%Ry6y$6~AywhJJ^ZY9aCjs~F&9J%(2qykQdUzlFa}(%2HbO=nyZ55<2atL0 z0Nv}&r`dSk0D6|rnn48PGsx~ch}4tMpg8s$oc;mogPQ>9;TH)&Ul$ahc;ROV6-UpJ z6Y$TB!#g#G-0SZ^#5z#=>P7<~e*Yr~e*yCEenLy{X8NfFO-r~nfVWSgc(Dp@T1Y(n z6v{t>>KwcGA^L#P-LCsV?+GHFg7?uF!e4>ho5vB|@&IC69z=TY%aGZg#=Bbr$RGWf zmY|5I>4DPaX%t6)0(auDx_VLm=5G|<|D2YXo~i0zM-8j{MT1nPfa0aPcO?erz3H!b}PrCY@i-LwPAN1sM~=VP#gzDB$?0O?W| znrqmosctZ#n(mvMOn(8*)?b(B*7%$O+M^|aC4m1cK=Z*wv{kfW6<6GPFwy(EyLJe6 z=}w|+r?iK=ZUdbW37~N}O=KX`IZ91?m4irT>m^as8ep6YRW-R))kKRW?Ww*01&kK} U@-%73(*OVf07*qoM6N<$g70VQB>(^b literal 0 HcmV?d00001 diff --git a/apps/token-tray/package.json b/apps/token-tray/package.json index 7c2f9ee..28e3795 100644 --- a/apps/token-tray/package.json +++ b/apps/token-tray/package.json @@ -1,6 +1,6 @@ { "name": "@media-cluster/token-tray", - "version": "0.1.0", + "version": "0.1.1", "private": true, "description": "Windows system tray helper to refresh Viaplay/F1TV session tokens", "author": "Vonas Media Cluster", @@ -32,12 +32,14 @@ }, "files": [ "dist/**/*", + "assets/**/*", "package.json" ], "extraMetadata": { "main": "dist/main.js" }, "win": { + "icon": "assets/icon.png", "target": [ { "target": "nsis", diff --git a/apps/token-tray/src/main.ts b/apps/token-tray/src/main.ts index bb3a97e..86f4e4e 100644 --- a/apps/token-tray/src/main.ts +++ b/apps/token-tray/src/main.ts @@ -7,6 +7,8 @@ import { nativeImage, shell, } from "electron"; +import fs from "fs"; +import path from "path"; import { configPath, loadConfig, saveConfig, type TrayConfig } from "./config"; import { pingAgent } from "./viaplay"; import { refreshAllSilent, refreshDueSilent } from "./jobs"; @@ -22,6 +24,32 @@ let lastDueCount = 0; const POLL_MS = 10 * 60 * 1000; // elke 10 min: vraag server wie bijna verloopt const WITHIN_MINUTES = 90; // vernieuw als token < 90 min geldig is +function resolveAsset(...parts: string[]): string { + const candidates = [ + path.join(__dirname, "..", "assets", ...parts), + path.join(app.getAppPath(), "assets", ...parts), + path.join(process.resourcesPath, "assets", ...parts), + ]; + for (const p of candidates) { + if (fs.existsSync(p)) return p; + } + return candidates[0]; +} + +function loadTrayImage(): Electron.NativeImage { + for (const name of ["tray-icon-32.png", "tray-icon-16.png", "icon.png"] as const) { + const p = resolveAsset(name); + if (!fs.existsSync(p)) continue; + let img = nativeImage.createFromPath(p); + if (img.isEmpty()) continue; + const { width } = img.getSize(); + // Windows systeemvak: 16–32 px; groter schalen ziet er wazig/onzichtbaar uit + if (width > 32) img = img.resize({ width: 16, height: 16 }); + return img; + } + return nativeImage.createEmpty(); +} + function statusTooltip(): string { const parts = ["Media Cluster Token Tray (auto)"]; if (busy) parts.push("Bezig met stille refresh…"); @@ -237,10 +265,8 @@ async function testConnection() { } function createTray() { - const png = nativeImage.createFromDataURL( - "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAALElEQVQ4T2NkYGD4z0ABYBzVMKoBQw0YNYPRDWBgYGBgZGBg+M8w6gYGBgYGABv0AQX1mVYpAAAAAElFTkSuQmCC" - ); - tray = new Tray(png.isEmpty() ? nativeImage.createEmpty() : png); + const img = loadTrayImage(); + tray = new Tray(img); tray.setToolTip("Media Cluster Token Tray"); rebuildMenu(); tray.on("double-click", () => void runAuto(true));