Skip to content

Commit bcfc355

Browse files
committed
Adjust reading the config into the new format
1 parent 774b907 commit bcfc355

File tree

3 files changed

+127
-20
lines changed

3 files changed

+127
-20
lines changed

packages/app/app/actions/downloads.ts

Lines changed: 41 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -24,15 +24,15 @@ const changePropertyForItem = ({downloads, uuid, propertyName='status', value}:C
2424

2525
export 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

3232
export 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

6161
export 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

7474
export 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

8787
export 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

102102
export 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

123123
export 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

138138
export 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

147147
export 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

161161
export 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+
}

packages/app/app/actions/favorites.ts

Lines changed: 53 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ export const ADD_FAVORITE_ARTIST = 'ADD_FAVORITE_ARTIST';
1717
export const REMOVE_FAVORITE_ARTIST = 'REMOVE_FAVORITE_ARTIST';
1818

1919
export function readFavorites() {
20-
const favorites = store.get('favorites');
20+
const favorites = getFavoritesBackwardsCompatible();
2121
return {
2222
type: READ_FAVORITES,
2323
payload: favorites
@@ -27,7 +27,7 @@ export function readFavorites() {
2727
export function addFavoriteTrack(track) {
2828
const clonedTrack = flow(safeAddUuid, getTrackItem)(track);
2929

30-
const favorites = store.get('favorites');
30+
const favorites = getFavoritesBackwardsCompatible();
3131
const filteredTracks = favorites.tracks.filter(t => !areTracksEqualByName(t, track));
3232
favorites.tracks = [...filteredTracks, omit(clonedTrack, 'streams')];
3333

@@ -42,15 +42,15 @@ export function addFavoriteTrack(track) {
4242
const bulkAddFavoriteTracksAction = createStandardAction(BULK_ADD_FAVORITE_TRACKS)<Track[]>();
4343

4444
export const bulkAddFavoriteTracks = (tracks: Track[]) => {
45-
const favorites = store.get('favorites');
45+
const favorites = getFavoritesBackwardsCompatible();
4646
favorites.tracks = unionWith(favorites.tracks, tracks, areTracksEqualByName);
4747
store.set('favorites', favorites);
4848

4949
return bulkAddFavoriteTracksAction(favorites);
5050
};
5151

5252
export function removeFavoriteTrack(track) {
53-
const favorites = store.get('favorites');
53+
const favorites = getFavoritesBackwardsCompatible();
5454
favorites.tracks = favorites.tracks.filter(t => !areTracksEqualByName(t, track));
5555

5656
store.set('favorites', favorites);
@@ -62,7 +62,7 @@ export function removeFavoriteTrack(track) {
6262
}
6363

6464
export function addFavoriteAlbum(album) {
65-
const favorites = store.get('favorites');
65+
const favorites = getFavoritesBackwardsCompatible();
6666
favorites.albums = _.concat(favorites.albums, album);
6767
store.set('favorites', favorites);
6868

@@ -73,7 +73,7 @@ export function addFavoriteAlbum(album) {
7373
}
7474

7575
export function removeFavoriteAlbum(album) {
76-
const favorites = store.get('favorites');
76+
const favorites = getFavoritesBackwardsCompatible();
7777
_.remove(favorites.albums, {
7878
artist: album.artist,
7979
title: album.title
@@ -88,7 +88,7 @@ export function removeFavoriteAlbum(album) {
8888

8989
export function addFavoriteArtist(artist) {
9090

91-
const favorites = store.get('favorites');
91+
const favorites = getFavoritesBackwardsCompatible();
9292
const savedArtist = {
9393
id: artist.id,
9494
name: artist.name,
@@ -107,7 +107,7 @@ export function addFavoriteArtist(artist) {
107107
}
108108

109109
export function removeFavoriteArtist(artist) {
110-
const favorites = store.get('favorites');
110+
const favorites = getFavoritesBackwardsCompatible();
111111
_.remove(favorites.artists, {
112112
id: artist.id,
113113
name: artist.name
@@ -119,3 +119,48 @@ export function removeFavoriteArtist(artist) {
119119
payload: favorites
120120
};
121121
}
122+
123+
/**
124+
* Helper function to read the old track format into the new format.
125+
*
126+
* `Track.artist` and `Track.extraArtists` are written into {@link Track.artists}
127+
*/
128+
function getFavoritesBackwardsCompatible() {
129+
const favorites = store.get('favorites');
130+
131+
favorites.tracks?.forEach(track => {
132+
if (track.artists || !track.artist) {
133+
return;
134+
}
135+
136+
if (track.artist) {
137+
track.artists = _.isString(track.artist) ? [track.artist] : [track.artist.name];
138+
}
139+
140+
// Assuming we have `extraArtists` on a track, we must had an `artist` which
141+
// was already saved into `artists`, so this `track.artists` shouldn't be undefined
142+
track.extraArtists?.forEach(artist => {
143+
track.artists.push(artist);
144+
});
145+
});
146+
147+
favorites.albums?.forEach(album => {
148+
album.tracklist?.forEach(track => {
149+
if (track.artists || !track.artist) {
150+
return;
151+
}
152+
153+
if (track.artist) {
154+
track.artists = _.isString(track.artist) ? [track.artist] : [track.artist.name];
155+
}
156+
157+
// Assuming we have `extraArtists` on a track, we must had an `artist` which
158+
// was already saved into `artists`, so this `track.artists` shouldn't be undefined
159+
track.extraArtists?.forEach(artist => {
160+
track.artists.push(artist);
161+
});
162+
});
163+
});
164+
165+
return favorites;
166+
}

packages/app/app/actions/playlists.ts

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ export const loadLocalPlaylists = () => dispatch => {
5555
dispatch(loadLocalPlaylistsAction.request());
5656

5757
try {
58-
const playlists: Playlist[] = store.get('playlists');
58+
const playlists: Playlist[] = getPlaylistsBackwardsCompatible();
5959
dispatch(loadLocalPlaylistsAction.success(isEmpty(playlists) ? [] : playlists));
6060
} catch (error) {
6161
dispatch(loadLocalPlaylistsAction.failure());
@@ -147,7 +147,7 @@ export function addPlaylistFromFile(filePath, t) {
147147
throw new Error('missing tracks or name');
148148
}
149149

150-
let playlists = store.get('playlists') || [];
150+
let playlists = getPlaylistsBackwardsCompatible() || [];
151151
const playlist = PlaylistHelper.formatPlaylistForStorage(name, tracks, v4(), source);
152152

153153
if (!(tracks?.length > 0)) {
@@ -167,3 +167,34 @@ export function addPlaylistFromFile(filePath, t) {
167167
});
168168
};
169169
}
170+
171+
/**
172+
* Helper function to read the old track format into the new format.
173+
*
174+
* `Track.artist` and `Track.extraArtists` are written into {@link Track.artists}
175+
*/
176+
function getPlaylistsBackwardsCompatible(): Playlist[] {
177+
const playlists: Playlist[] = store.get('playlists');
178+
179+
playlists?.forEach(playlist => {
180+
playlist.tracks?.forEach(track => {
181+
// @ts-expect-error For backwards compatibility we're trying to parse an invalid field
182+
if (track.artists || !track.artist) {
183+
// New format already present, do nothing
184+
return;
185+
}
186+
187+
// @ts-expect-error For backwards compatibility we're trying to parse an invalid field
188+
track.artists = _.isString(track.artist) ? [track.artist] : [track.artist.name];
189+
190+
// Assuming we have `extraArtists` on a track, we must had an `artist` which
191+
// was already saved into `artists`, so this `track.artists` shouldn't be undefined
192+
// @ts-expect-error For backwards compatibility we're trying to parse an invalid field
193+
track.extraArtists?.forEach(artist => {
194+
track.artists.push(artist);
195+
});
196+
});
197+
});
198+
199+
return playlists;
200+
}

0 commit comments

Comments
 (0)