@@ -24,15 +24,15 @@ const changePropertyForItem = ({downloads, uuid, propertyName='status', value}:C
2424
2525export const readDownloads = createStandardAction ( DownloadActionTypes . READ_DOWNLOADS ) . map (
2626 ( ) => {
27- const downloads : Download [ ] = store . get ( 'downloads' ) ;
27+ const downloads : Download [ ] = getDownloadsBackwardsCompatible ( ) ;
2828 return { payload : downloads } ;
2929 }
3030) ;
3131
3232export const addToDownloads = createStandardAction ( DownloadActionTypes . ADD_TO_DOWNLOADS ) . map (
3333 ( __ :StreamProvider [ ] , track : Track ) => {
3434 const clonedTrack : TrackItem = safeAddUuid ( getTrackItem ( track ) ) ;
35- let downloads : Download [ ] = store . get ( 'downloads' ) ;
35+ let downloads : Download [ ] = getDownloadsBackwardsCompatible ( ) ;
3636
3737 const existingTrack = downloads . find ( ( { track} ) => {
3838 const { name, artists} = track ;
@@ -60,7 +60,7 @@ export const addToDownloads = createStandardAction(DownloadActionTypes.ADD_TO_DO
6060
6161export const onDownloadStarted = createStandardAction ( DownloadActionTypes . DOWNLOAD_STARTED ) . map (
6262 ( uuid : string ) => {
63- const downloads : Download [ ] = store . get ( 'downloads' ) ;
63+ const downloads : Download [ ] = getDownloadsBackwardsCompatible ( ) ;
6464 const payload = changePropertyForItem ( {
6565 downloads,
6666 uuid,
@@ -73,7 +73,7 @@ export const onDownloadStarted = createStandardAction(DownloadActionTypes.DOWNLO
7373
7474export const onDownloadPause = createStandardAction ( DownloadActionTypes . DOWNLOAD_PAUSED ) . map (
7575 ( uuid : string ) => {
76- const downloads : Download [ ] = store . get ( 'downloads' ) ;
76+ const downloads : Download [ ] = getDownloadsBackwardsCompatible ( ) ;
7777 const payload = changePropertyForItem ( {
7878 downloads,
7979 uuid,
@@ -86,7 +86,7 @@ export const onDownloadPause = createStandardAction(DownloadActionTypes.DOWNLOA
8686
8787export const onDownloadResume = createStandardAction ( DownloadActionTypes . DOWNLOAD_RESUMED ) . map (
8888 ( uuid : string ) => {
89- const downloads : Download [ ] = store . get ( 'downloads' ) ;
89+ const downloads : Download [ ] = getDownloadsBackwardsCompatible ( ) ;
9090 const payload = changePropertyForItem ( {
9191 downloads,
9292 uuid,
@@ -101,7 +101,7 @@ export const onDownloadResume = createStandardAction(DownloadActionTypes.DOWNLOA
101101
102102export const onDownloadProgress = createStandardAction ( DownloadActionTypes . DOWNLOAD_PROGRESS ) . map (
103103 ( uuid : string , progress : number ) => {
104- const downloads = store . get ( 'downloads' ) ;
104+ const downloads = getDownloadsBackwardsCompatible ( ) ;
105105 let payload = changePropertyForItem ( {
106106 downloads,
107107 uuid,
@@ -122,7 +122,7 @@ export const onDownloadProgress = createStandardAction(DownloadActionTypes.DOWNL
122122
123123export const onDownloadError = createStandardAction ( DownloadActionTypes . DOWNLOAD_ERROR ) . map (
124124 ( uuid : string ) => {
125- const downloads : Download [ ] = store . get ( 'downloads' ) ;
125+ const downloads : Download [ ] = getDownloadsBackwardsCompatible ( ) ;
126126 const payload = changePropertyForItem ( {
127127 downloads,
128128 uuid,
@@ -137,7 +137,7 @@ export const onDownloadError = createStandardAction(DownloadActionTypes.DOWNLOAD
137137
138138export const onDownloadRemoved = createStandardAction ( DownloadActionTypes . DOWNLOAD_REMOVED ) . map (
139139 ( uuid : string ) => {
140- const downloads : Download [ ] = store . get ( 'downloads' ) ;
140+ const downloads : Download [ ] = getDownloadsBackwardsCompatible ( ) ;
141141 const filteredTracks = downloads . filter ( item => item . track . uuid !== uuid ) ;
142142 return {
143143 payload : filteredTracks
@@ -146,7 +146,7 @@ export const onDownloadRemoved = createStandardAction(DownloadActionTypes.DOWNLO
146146
147147export const onDownloadFinished = createStandardAction ( DownloadActionTypes . DOWNLOAD_FINISHED ) . map (
148148 ( uuid : string ) => {
149- const downloads : Download [ ] = store . get ( 'downloads' ) ;
149+ const downloads : Download [ ] = getDownloadsBackwardsCompatible ( ) ;
150150 const payload = changePropertyForItem ( {
151151 downloads,
152152 uuid,
@@ -160,7 +160,7 @@ export const onDownloadFinished = createStandardAction(DownloadActionTypes.DOWNL
160160
161161export const clearFinishedDownloads = createStandardAction ( DownloadActionTypes . CLEAR_FINISHED_DOWNLOADS ) . map (
162162 ( ) => {
163- const downloads : Download [ ] = store . get ( 'downloads' ) ;
163+ const downloads : Download [ ] = getDownloadsBackwardsCompatible ( ) ;
164164
165165 const filteredTracks = downloads . filter ( ( item ) =>
166166 item . status !== DownloadStatus . FINISHED && item . status !== DownloadStatus . ERROR
@@ -170,3 +170,34 @@ export const clearFinishedDownloads = createStandardAction(DownloadActionTypes.C
170170 payload : filteredTracks
171171 } ;
172172 } ) ;
173+
174+ /**
175+ * Helper function to read the old track format into the new format.
176+ *
177+ * `Track.artist` and `Track.extraArtists` are written into {@link Track.artists}
178+ */
179+ function getDownloadsBackwardsCompatible ( ) : Download [ ] {
180+ const downloads : Download [ ] = store . get ( 'downloads' ) ;
181+
182+ downloads . forEach ( download => {
183+ // @ts -expect-error For backwards compatibility we're trying to parse an invalid field
184+ if ( download . track . artists || ! download . track . artist ) {
185+ return ;
186+ }
187+
188+ // @ts -expect-error For backwards compatibility we're trying to parse an invalid field
189+ if ( download . track . artist ) {
190+ // @ts -expect-error For backwards compatibility we're trying to parse an invalid field
191+ download . track . artists = _ . isString ( download . track . artist ) ? [ download . track . artist ] : [ download . track . artist . name ] ;
192+ }
193+
194+ // Assuming we have `extraArtists` on a track, we must had an `artist` which
195+ // was already saved into `artists`, so this `track.artists` shouldn't be undefined
196+ // @ts -expect-error For backwards compatibility we're trying to parse an invalid field
197+ download . track . extraArtists ?. forEach ( artist => {
198+ download . track . artists . push ( artist ) ;
199+ } ) ;
200+ } ) ;
201+
202+ return downloads ;
203+ }
0 commit comments