Skip to content

Commit 1806e07

Browse files
authored
fix(extras): temp upload local art on litterbox (#147)
1 parent cc7b79d commit 1806e07

2 files changed

Lines changed: 29 additions & 13 deletions

File tree

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ Works with local tracks and the Apple Music streaming service.
1212
- Small and (relatively) easy-to-understand script
1313
- Presence is enabled only when music is actually playing
1414
- Apple Music matching
15-
- Local artwork upload on catbox.moe as a fallback
15+
- Local artwork temporary upload on litterbox.catbox.moe as a fallback
1616

1717
<img width="230" height="47" alt="image" src="https://github.com/user-attachments/assets/2e168586-4202-46a3-a2d5-0e4e499ecdc6" />
1818
<img width="296" height="128" alt="image" src="https://github.com/user-attachments/assets/d5c01904-d43e-4f10-990d-2c75ff3acc61" />

music-rpc.ts

Lines changed: 28 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ class AppleMusicDiscordRPC {
1212
Music: "773825528921849856",
1313
};
1414
// Increment after TrackExtras update
15-
static readonly KV_VERSION = 2;
15+
static readonly KV_VERSION = 3;
1616

1717
private startTime!: number;
1818

@@ -177,7 +177,7 @@ class AppleMusicDiscordRPC {
177177
const cacheId = properties.persistentID;
178178
const entry = await this.kv.get<TrackExtras>(["extras", cacheId]);
179179
let extras = entry.value;
180-
if (!extras) {
180+
if (!extras || (extras.expiresAt && extras.expiresAt < Date.now())) {
181181
extras = await fetchTrackExtras(this.appName, properties);
182182
await this.kv.set(["extras", cacheId], extras);
183183
}
@@ -318,12 +318,20 @@ async function fetchTrackExtras(
318318
});
319319
}
320320

321-
return {
322-
artworkUrl: result?.artworkUrl100 ?? await uploadedLocalArtworkUrl(appName),
321+
const extras: TrackExtras = {
322+
artworkUrl: result?.artworkUrl100,
323323
artistViewUrl: result?.artistViewUrl,
324324
collectionViewUrl: result?.collectionViewUrl,
325325
trackViewUrl: result?.trackViewUrl,
326326
};
327+
328+
if (!extras.artworkUrl) {
329+
const uploaded = await uploadedLocalArtworkUrl(appName);
330+
extras.artworkUrl = uploaded?.url;
331+
extras.expiresAt = uploaded?.expiresAt;
332+
}
333+
334+
return extras;
327335
}
328336

329337
async function iTunesSearch(
@@ -379,24 +387,31 @@ function findMatchingResult(
379387

380388
async function uploadedLocalArtworkUrl(
381389
appName: iTunesAppName,
382-
): Promise<string | undefined> {
390+
): Promise<{ url: string; expiresAt: number } | undefined> {
383391
const localArtwork = await getAlbumArtwork(appName);
384-
return localArtwork ? await catboxUpload(localArtwork) : undefined;
392+
return localArtwork ? await litterboxUpload(localArtwork) : undefined;
385393
}
386394

387-
async function catboxUpload(blob: Blob): Promise<string> {
395+
async function litterboxUpload(
396+
blob: Blob,
397+
): Promise<{ url: string; expiresAt: number }> {
388398
const formData = new FormData();
389399
formData.append("reqtype", "fileupload");
400+
formData.append("time", "1h");
390401
formData.append("fileToUpload", blob, "artwork.jpg");
391-
const response = await fetch("https://catbox.moe/user/api.php", {
392-
method: "POST",
393-
body: formData,
394-
});
402+
const response = await fetch(
403+
"https://litterbox.catbox.moe/resources/internals/api.php",
404+
{
405+
method: "POST",
406+
body: formData,
407+
},
408+
);
395409
if (!response.ok) {
396410
throw new Error(`Failed to upload to catbox.moe: ${response.statusText}`);
397411
}
398412
const url = await response.text();
399-
return url.trim();
413+
const expiresAt = Date.now() + 60 * 60 * 1000;
414+
return { url: url.trim(), expiresAt };
400415
}
401416
//#endregion
402417

@@ -418,6 +433,7 @@ interface TrackExtras {
418433
artistViewUrl?: string;
419434
collectionViewUrl?: string;
420435
trackViewUrl?: string;
436+
expiresAt?: number;
421437
}
422438

423439
interface iTunesSearchResponse {

0 commit comments

Comments
 (0)