@@ -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
329337async function iTunesSearch (
@@ -379,24 +387,31 @@ function findMatchingResult(
379387
380388async 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
423439interface iTunesSearchResponse {
0 commit comments